@easbot/agent 0.2.23 → 0.2.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/assets/txt/tool/gateway-channel.txt +51 -12
  2. package/dist/chunks/acp-STZJ75XV.mjs +16 -0
  3. package/dist/chunks/adapter-loader-BLTYHARQ.mjs +1 -0
  4. package/dist/chunks/agent-4EMYYWV6.mjs +1 -0
  5. package/dist/chunks/agent-FF52NW42.mjs +1 -0
  6. package/dist/chunks/app-CGZZFC54.mjs +1 -0
  7. package/dist/chunks/auth-2I7U24YF.mjs +1 -0
  8. package/dist/chunks/bootstrap-GVMMOFUK.mjs +1 -0
  9. package/dist/chunks/build-program-43NDEGM2.mjs +11 -0
  10. package/dist/chunks/bus-PFFRRCH3.mjs +1 -0
  11. package/dist/chunks/chunk-2RSIOAZV.mjs +1 -0
  12. package/dist/chunks/chunk-AAJAKVQY.mjs +3 -0
  13. package/dist/chunks/chunk-ARCMKYQI.mjs +2 -0
  14. package/dist/chunks/chunk-CJTCCLW4.mjs +1 -0
  15. package/dist/chunks/chunk-CQVEAYYW.mjs +1 -0
  16. package/dist/chunks/chunk-CVTJJBGW.mjs +1 -0
  17. package/dist/chunks/chunk-DEZT7DOH.mjs +1 -0
  18. package/dist/chunks/chunk-EEWP2VV6.mjs +27 -0
  19. package/dist/chunks/chunk-FXOUIXIL.mjs +1 -0
  20. package/dist/chunks/chunk-GMEJX6PC.mjs +2 -0
  21. package/dist/chunks/chunk-I6MBTO75.mjs +2 -0
  22. package/dist/chunks/chunk-I7A5JGO5.mjs +2 -0
  23. package/dist/chunks/chunk-IHHFG47N.mjs +1 -0
  24. package/dist/chunks/chunk-KLJ7PPSA.mjs +2 -0
  25. package/dist/chunks/chunk-KY3H2HGJ.mjs +1056 -0
  26. package/dist/chunks/chunk-LAHYVX5K.mjs +1 -0
  27. package/dist/chunks/chunk-LFNGHYRC.mjs +1 -0
  28. package/dist/chunks/chunk-LFYBZHOI.mjs +2 -0
  29. package/dist/chunks/chunk-M3K32WJV.mjs +1 -0
  30. package/dist/chunks/chunk-QJ6QTASU.mjs +1 -0
  31. package/dist/chunks/chunk-TYD2M4SP.mjs +7 -0
  32. package/dist/chunks/chunk-VII7JKGB.mjs +1 -0
  33. package/dist/chunks/chunk-WN2HAJBB.mjs +59 -0
  34. package/dist/chunks/chunk-X6ISXWBN.mjs +1 -0
  35. package/dist/chunks/chunk-XPF2LJT2.mjs +1 -0
  36. package/dist/chunks/chunk-ZBRXNYEM.mjs +1 -0
  37. package/dist/chunks/command-H77IO5J2.mjs +1 -0
  38. package/dist/chunks/compaction-LQXOGRP7.mjs +1 -0
  39. package/dist/chunks/config-J54DTNPX.mjs +1 -0
  40. package/dist/chunks/confirm-dialog-AGHMTHWU.mjs +1 -0
  41. package/dist/chunks/copilot-I52DJYYX.mjs +2 -0
  42. package/dist/chunks/debug-55VJ74IW.mjs +3 -0
  43. package/dist/chunks/event-A4SSIBOT.mjs +1 -0
  44. package/dist/chunks/export-BGH24SO2.mjs +1 -0
  45. package/dist/chunks/file-KEMX6XWX.mjs +1 -0
  46. package/dist/chunks/gateway-45LKZAQS.mjs +16 -0
  47. package/dist/chunks/gateway-loader-6P6BTWQP.mjs +1 -0
  48. package/dist/chunks/generate-QMA5OAOD.mjs +2 -0
  49. package/dist/chunks/github-EJCNXJ6F.mjs +33 -0
  50. package/dist/chunks/global-KAF6JHVQ.mjs +1 -0
  51. package/dist/chunks/import-4TX5SVFQ.mjs +2 -0
  52. package/dist/chunks/input-validation-FWKKVCYC.mjs +1 -0
  53. package/dist/chunks/installation-CGMLIGLA.mjs +1 -0
  54. package/dist/chunks/instance-YUOFE3Q3.mjs +1 -0
  55. package/dist/chunks/is-tui-mode-TFK352KK.mjs +1 -0
  56. package/dist/chunks/loader-YOPK5OTL.mjs +1 -0
  57. package/dist/chunks/loader-ZTWTX2GS.mjs +1 -0
  58. package/dist/chunks/lsp-YNF5BCPV.mjs +1 -0
  59. package/dist/chunks/markdown-Z6UXVBNP.mjs +1 -0
  60. package/dist/chunks/mcp-BGU4XS34.mjs +1 -0
  61. package/dist/chunks/models-TN65RCBA.mjs +1 -0
  62. package/dist/chunks/models-snapshot-XTWYGG3T.mjs +2 -0
  63. package/dist/chunks/pr-XD7C7PDJ.mjs +3 -0
  64. package/dist/chunks/preferences-3HCTNG2J.mjs +1 -0
  65. package/dist/chunks/project-HH3IL3QQ.mjs +1 -0
  66. package/dist/chunks/prompt-W7772MHB.mjs +1 -0
  67. package/dist/chunks/provider-ULN4YD2M.mjs +1 -0
  68. package/dist/chunks/registry-TL5F5F7C.mjs +1 -0
  69. package/dist/chunks/revert-TZSK52JS.mjs +1 -0
  70. package/dist/chunks/ripgrep-E3GWWA2V.mjs +1 -0
  71. package/dist/chunks/run-KL5CA5M6.mjs +22 -0
  72. package/dist/chunks/scheduler-SCM4SRS2.mjs +1 -0
  73. package/dist/chunks/server-Z6BORWAL.mjs +1 -0
  74. package/dist/chunks/session-BHXYW2JD.mjs +1 -0
  75. package/dist/chunks/session-PMZOQPFQ.mjs +1 -0
  76. package/dist/chunks/session-REKMEA3V.mjs +1 -0
  77. package/dist/chunks/settings-panel-BWCVKC4G.mjs +1 -0
  78. package/dist/chunks/share-JFZ3O2BX.mjs +1 -0
  79. package/dist/chunks/snapshot-V23GRQBM.mjs +1 -0
  80. package/dist/chunks/stats-MILDLIZD.mjs +1 -0
  81. package/dist/chunks/storage-DKQ7S6QX.mjs +1 -0
  82. package/dist/chunks/tui-HU55FGHV.mjs +1 -0
  83. package/dist/chunks/tui-YGASP4NS.mjs +1 -0
  84. package/dist/chunks/types-GCXI5X7B.mjs +1 -0
  85. package/dist/chunks/types-WN4LZEB5.mjs +1 -0
  86. package/dist/chunks/update-IOQCRELU.mjs +2 -0
  87. package/dist/cli.mjs +9 -1235
  88. package/package.json +14 -24
  89. package/dist/cli.cjs +0 -1236
  90. package/dist/cli.d.cts +0 -1
  91. package/dist/index.cjs +0 -1345
  92. package/dist/index.d.cts +0 -34569
  93. package/dist/index.d.ts +0 -34569
  94. package/dist/index.mjs +0 -1345
@@ -0,0 +1,1056 @@
1
+ import {a as a$4,b,c as c$1}from'./chunk-ZBRXNYEM.mjs';import {f,e as e$1,c as c$3}from'./chunk-CVTJJBGW.mjs';import {b as b$5,a as a$c}from'./chunk-IHHFG47N.mjs';import {b as b$2,a as a$b,c as c$2}from'./chunk-DEZT7DOH.mjs';import {a as a$a}from'./chunk-AAJAKVQY.mjs';import {a as a$9}from'./chunk-ARCMKYQI.mjs';import {a as a$8}from'./chunk-EEWP2VV6.mjs';import {a as a$3,b as b$4}from'./chunk-GMEJX6PC.mjs';import {a as a$2,b as b$3}from'./chunk-KLJ7PPSA.mjs';import {a as a$5}from'./chunk-CJTCCLW4.mjs';import {a as a$6}from'./chunk-I7A5JGO5.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-I6MBTO75.mjs';import {e,h,g,i,f as f$1,o,m,r,q,l,n,p}from'./chunk-2RSIOAZV.mjs';import {a as a$7,b as b$1,c,d}from'./chunk-X6ISXWBN.mjs';import z$1,{z}from'zod';import {PKG,Filesystem,Archive,$,NamedError,lazy,fn as fn$1,Identifier,whichSync,Shell,Wildcard,lazyAsync,loadTextFile,parseModelId,abortAfterAny,Fetch,iife,formatLocalISOCompact,git,AsyncQueue,defer,Slug,Context,PackageRegistry,proxied,withTimeout,Ignore,Token,createPkgShell,SessionTitle,Glob,TruncateContent,work,shell,createServer as createServer$1,loadTextFileAsync}from'@easbot/utils';import*as Ot from'fs/promises';import Ot__default,{realpath,mkdir,access,readFile,writeFile,unlink,readdir,copyFile,stat,rm}from'fs/promises';import*as ke from'path';import ke__default,{join,sep}from'path';import {Decimal}from'decimal.js';import {convertToModelMessages,APICallError,LoadAPIKeyError,tool,jsonSchema,streamText,wrapLanguageModel,streamObject,generateObject,NoSuchModelError,asSchema,dynamicTool}from'ai';import Mc from'os';import {mergeDeep,mapValues,pipe,values,sortBy,splitWhen,unique,clone,filter,map,fromEntries,pickBy,omit}from'remeda';import tu,{createReadStream,existsSync,constants,readFileSync}from'fs';import {parse as parse$1,printParseErrorCode,modify,applyEdits}from'jsonc-parser';import {pathToFileURL,fileURLToPath}from'url';import {EventEmitter}from'events';import {createMessageConnection,StreamMessageReader,StreamMessageWriter}from'vscode-jsonrpc/node.js';import {createServer,STATUS_CODES}from'http';import gb from'fuzzysort';import {createEasbotClient}from'@easbot/sdk';import {resolver,describeRoute,validator,openAPIRouteHandler,generateSpecs}from'hono-openapi';import {Hono}from'hono';import {cors}from'hono/cors';import {stream,streamSSE}from'hono/streaming';import {proxy}from'hono/proxy';import {basicAuth}from'hono/basic-auth';import {compress}from'hono/compress';import {createTwoFilesPatch,diffLines,structuredPatch,formatPatch,applyPatch}from'diff';import {Status,MCPClient,initLog as initLog$3}from'@easbot/mcp';import {connect}from'net';import xI from'open';import {HookEvent}from'@easbot/plugin';export{HookEvent as Fa}from'@easbot/plugin';import {initLog,createMemorySystem}from'@easbot/memory';import {initLog as initLog$1,createNoteKnowledge}from'@easbot/note';import {initLog as initLog$2,createCodebase}from'@easbot/codebase';import'@easbot/types';import {LRUCache}from'lru-cache';import {createInterface}from'readline';import {createHash}from'crypto';import {createRequire}from'module';import {glob}from'glob';import {ulid}from'ulid';import {ndJsonStream,AgentSideConnection,RequestError}from'@agentclientprotocol/sdk';import {WebSocketServer}from'ws';import pk from'bash-parser';import CP from'turndown';import {parse}from'node-html-parser';import*as $P from'node-pty';import {GatewayClient}from'@easbot/gateway';import {zodToJsonSchema}from'zod-to-json-schema';import {HTTPException}from'hono/http-exception';import xR from'bonjour-service';import {serve}from'@hono/node-server';import {spawn}from'child_process';import u_ from'zod/v4';var _o;(re=>{let t=a.create({service:"lsp.server"}),e=process.platform==="win32"?"cmd":void 0;function n(X,H=[],F){let ne=H.length>0?`${X} ${H.join(" ")}`:X,V=process.platform==="win32"?{...F,windowsHide:true}:F;return Shell.spawn(e,ne,V)}function o(X,H){let F=process.platform==="win32"?{...H,windowsHide:true}:H;return Shell.spawn(e,X.join(" "),F)}function s(X,H=[],F){return PKG.spawn([X,...H],F)}async function r(X,H){let F=process.platform==="win32"?{...H,windowsHide:true}:H;return Shell.run(e,X,F)}let i=async X=>Ot__default.stat(X).then(()=>true).catch(()=>false),c=(X,H)=>async F=>{if(H){let J=Filesystem.up({targets:H,start:ke__default.dirname(F),stop:A.directory}),oe=await J.next();if(await J.return(void 0),oe.value)return}let ne=Filesystem.up({targets:X,start:ke__default.dirname(F),stop:A.directory}),V=await ne.next();return await ne.return(void 0),V.value?ke__default.dirname(V.value):A.directory};re.ServerInitTimeout={bash:3e4,json:3e4,yaml:3e4,dockerfile:3e4,terraform:6e4,lua:6e4,zls:6e4,nixd:6e4,deno:6e4,biome:6e4,oxlint:6e4,gopls:9e4,eslint:9e4,ruby_lsp:9e4,pyright:9e4,ty:9e4,elixir_ls:9e4,prisma:9e4,dart:9e4,ocaml_lsp:9e4,svelte:9e4,astro:9e4,gleam:9e4,tinymist:9e4,clojure_lsp:9e4,intelephense:9e4,typescript:18e4,vue:18e4,rust:18e4,clangd:18e4,csharp:18e4,fsharp:18e4,sourcekit_lsp:18e4,kotlin_ls:18e4,texlab:18e4,jdtls:3e5,haskell_language_server:3e5};function l(X){if(X in re.ServerInitTimeout)return re.ServerInitTimeout[X];let H=X.replace(/\s+/g,"_");if(H in re.ServerInitTimeout)return re.ServerInitTimeout[H];let F=X.split(/\s+/).pop();return F&&F in re.ServerInitTimeout?re.ServerInitTimeout[F]:a$2.EASBOT_LSP_INIT_TIMEOUT}re.getServerInitTimeout=l,re.Deno={id:"deno",initTimeout:re.ServerInitTimeout.deno,root:async X=>{let H=Filesystem.up({targets:["deno.json","deno.jsonc"],start:ke__default.dirname(X),stop:A.directory}),F=await H.next();if(await H.return(void 0),!!F.value)return ke__default.dirname(F.value)},extensions:[".ts",".tsx",".js",".jsx",".mjs"],async spawn(X){let H=await PKG.which("deno");if(!H){t.info("deno not found, please install deno first");return}return {process:n(H,["lsp"],{cwd:X,stderr:"ignore"})}}};let m=[{name:"@vtsls/language-server",command:"vtsls",description:"Standalone version of VSCode TypeScript extension, full features, better performance"},{name:"typescript-language-server",command:"typescript-language-server",description:"Traditional implementation based on tsserver"}];re.Typescript={id:"typescript",root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"],["deno.json","deno.jsonc"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"],initTimeout:re.ServerInitTimeout.typescript,async spawn(X){t.info("typescript server spawn",{PATH:process.env.PATH});let H=null,F;for(let J of m){if(t.info(`trying to find ${J.name}...`),H=await PKG.which(J.command),H){t.info(`${J.name} found`,{binary:H}),F=J;break}let oe=await PKG.resolve(J.name,A.directory).catch(()=>{});if(oe){H=oe,t.info(`${J.name} resolved`,{binary:H}),F=J;break}}if(!H||!F){let J=m.map(oe=>`npm install -g ${oe.name}`).join(" \u6216 ");t.error(`typescript LSP server not found, please install: ${J}`);return}t.info(`typescript server starting with ${F.name}`,{binary:H});let ne=F.command==="vtsls"?["--stdio"]:["--stdio"];return {process:n(H,ne,{cwd:X,env:{...process.env},stderr:"ignore"})}}},re.Vue={id:"vue",initTimeout:re.ServerInitTimeout.vue,extensions:[".vue"],root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(X){let H=await PKG.which("vue-language-server"),F=[];if(!H){let J=ke__default.join(a$1.Path.bin,"node_modules","@vue","language-server","bin","vue-language-server.js");if(!await PKG.file(J).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let ae=await PKG.which();if(!ae)return;await n(ae,["install","@vue/language-server"],{cwd:a$1.Path.bin,env:{...process.env},stdout:"pipe",stderr:"pipe"}).exited;}let oe=await PKG.which();if(!oe)return;H=oe,F.push("run",J);}if(!H)return;let ne=await PKG.which();return ne?{process:n(ne,F,{cwd:X}),initialization:{}}:void 0}},re.ESLint={id:"eslint",initTimeout:re.ServerInitTimeout.eslint,root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".vue"],async spawn(X){if(!await PKG.resolve("eslint",A.directory).catch(()=>{}))return;t.info("spawning eslint server");let F=ke__default.join(a$1.Path.bin,"vscode-eslint","server","out","eslintServer.js");if(!await PKG.file(F).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading and building VS Code ESLint server");let J=await fetch("https://github.com/microsoft/vscode-eslint/archive/refs/heads/main.zip");if(!J.ok)return;let oe=ke__default.join(a$1.Path.bin,"vscode-eslint.zip");if(await PKG.write(oe,J),!await Archive.extractZip(oe,a$1.Path.bin).then(()=>true).catch(Ie=>(t.error("Failed to extract vscode-eslint archive",{error:Ie}),false)))return;await Ot__default.rm(oe,{force:true});let me=ke__default.join(a$1.Path.bin,"vscode-eslint-main"),pe=ke__default.join(a$1.Path.bin,"vscode-eslint");await Ot__default.stat(pe).catch(()=>{})&&(t.info("removing old eslint installation",{path:pe}),await Ot__default.rm(pe,{force:true,recursive:true})),await Ot__default.rename(me,pe);let He=process.platform==="win32"?"npm.cmd":"npm";await $`${He} install`.cwd(pe).quiet(),await $`${He} run compile`.cwd(pe).quiet(),t.info("installed VS Code ESLint server",{serverPath:F});}let ne=await PKG.which();return ne?{process:n(ne,[F,"--stdio"],{cwd:X,env:{...process.env},stderr:"ignore"})}:void 0}},re.Oxlint={id:"oxlint",initTimeout:re.ServerInitTimeout.oxlint,root:c([".oxlintrc.json","package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock","package.json"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".vue",".astro",".svelte"],async spawn(X){let H=process.platform==="win32"?".cmd":"",F=ke__default.join("node_modules",".bin","oxc_language_server"+H),ne=ke__default.join("node_modules",".bin","oxlint"+H),V=async ae=>{let me=ke__default.join(X,ae);if(await PKG.file(me).exists())return me;let pe=Filesystem.up({targets:[ae],start:X,stop:A.worktree}),xe=await pe.next();if(await pe.return(void 0),xe.value)return xe.value},J=await V(ne);if(!J){let ae=await PKG.which("oxlint");ae&&(J=ae);}if(J){let ae=n(J,["--help"],{stdout:"pipe"});if(await ae.exited,(await PKG.nodeReadableStreamToText(ae.stdout)).includes("--lsp"))return {process:n(J,["--lsp"],{cwd:X,stderr:"ignore"})}}let oe=await V(F);if(!oe){let ae=await PKG.which("oxc_language_server");ae&&(oe=ae);}if(oe)return {process:n(oe,[],{cwd:X,stderr:"ignore"})};t.info("oxlint not found, please install oxlint");}},re.Biome={id:"biome",initTimeout:re.ServerInitTimeout.biome,root:c(["biome.json","biome.jsonc","package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),extensions:[".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts",".json",".jsonc",".vue",".astro",".svelte",".css",".graphql",".gql",".html"],async spawn(X){let H=process.platform==="win32",F=ke__default.join(X,"node_modules",".bin",H?"biome.cmd":"biome");if(await PKG.file(F).exists())return {process:n(F,["lsp-proxy","--stdio"],{cwd:X,env:process.env,stderr:"ignore"})};let ne=await PKG.which("biome");if(ne)return {process:n(ne,["lsp-proxy","--stdio"],{cwd:X,env:process.env,stderr:"ignore"})};if(H){let ae=await PKG.which("biome.cmd");if(ae)return {process:n(ae,["lsp-proxy","--stdio"],{cwd:X,env:process.env,stderr:"ignore"})}}let V=ke__default.join(a$1.Path.bin,"node_modules","@biomejs","biome","bin","biome");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD){t.info("Biome LSP download disabled by flag");return}t.info("Installing @biomejs/biome...");let ae=await PKG.which();if(!ae){t.warn("Package manager not found");return}try{await n(ae,["install","@biomejs/biome"],{cwd:a$1.Path.bin,env:process.env,stdout:"pipe",stderr:"pipe",stdin:"pipe"}).exited,t.info("Biome installed successfully");}catch(me){t.error("Failed to install biome",{error:me});return}}let J=await PKG.which();return J?{process:n(J,["run",V,"lsp-proxy","--stdio"],{cwd:X,env:process.env,timeout:false,stderr:"ignore"})}:void 0}},re.Gopls={id:"gopls",initTimeout:re.ServerInitTimeout.gopls,root:async X=>{let H=await c(["go.work"])(X);return H||c(["go.mod","go.sum"])(X)},extensions:[".go"],async spawn(X){let H=await PKG.which("gopls",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(!await PKG.which("go")||a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("installing gopls");let ne=await r("go install golang.org/x/tools/gopls@latest",{env:{...process.env,GOBIN:a$1.Path.bin}});if(ne.code!==0){t.error("Failed to install gopls",{stderr:ne.stderr});return}H=ke__default.join(a$1.Path.bin,"gopls"+(process.platform==="win32"?".exe":"")),t.info("installed gopls",{bin:H});}if(H)return {process:n(H)}}},re.Rubocop={id:"ruby-lsp",initTimeout:re.ServerInitTimeout.ruby_lsp,root:c(["Gemfile"]),extensions:[".rb",".rake",".gemspec",".ru"],async spawn(X){let H=await PKG.which("rubocop",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){let F=await PKG.which("ruby"),ne=await PKG.which("gem");if(!F||!ne){t.info("Ruby not found, please install Ruby first");return}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("installing rubocop");let V=await r(`gem install rubocop --bindir "${a$1.Path.bin}"`);if(V.code!==0){t.error("Failed to install rubocop",{stderr:V.stderr});return}H=ke__default.join(a$1.Path.bin,"rubocop"+(process.platform==="win32"?".exe":"")),t.info("installed rubocop",{bin:H});}if(H)return {process:n(H,["--lsp"],{cwd:X,stderr:"ignore"})}}},re.Ty={id:"ty",initTimeout:re.ServerInitTimeout.ty,extensions:[".py",".pyi"],root:c(["pyproject.toml","ty.toml","setup.py","setup.cfg","requirements.txt","Pipfile","pyrightconfig.json"]),async spawn(X){if(!a$2.EASBOT_LSP_TY)return;let H=await PKG.which("ty"),F={},ne=[process.env.VIRTUAL_ENV,ke__default.join(X,".venv"),ke__default.join(X,"venv")].filter(J=>J!==void 0);for(let J of ne){let ae=process.platform==="win32"?ke__default.join(J,"Scripts","python.exe"):ke__default.join(J,"bin","python");if(await PKG.file(ae).exists()){F.pythonPath=ae;break}}if(!H)for(let J of ne){let ae=process.platform==="win32"?ke__default.join(J,"Scripts","ty.exe"):ke__default.join(J,"bin","ty");if(await PKG.file(ae).exists()){H=ae;break}}if(!H){t.error("ty not found, please install ty first");return}return {process:n(H,["server"],{cwd:X,stderr:"ignore"}),initialization:F}}},re.Pyright={id:"pyright",initTimeout:re.ServerInitTimeout.pyright,extensions:[".py",".pyi"],root:c(["pyproject.toml","setup.py","setup.cfg","requirements.txt","Pipfile","pyrightconfig.json"]),async spawn(X){let H=await PKG.which("pyright-langserver"),F=[];if(!H){let oe=ke__default.join(a$1.Path.bin,"node_modules","pyright","dist","pyright-langserver.js");if(!await PKG.file(oe).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let me=await PKG.which();if(!me)return;await r(`${me} install pyright`,{cwd:a$1.Path.bin,env:{...process.env}});}let ae=await PKG.which();if(!ae)return;H=ae,F.push("run",oe);}F.push("--stdio");let ne={},V=[process.env.VIRTUAL_ENV,ke__default.join(X,".venv"),ke__default.join(X,"venv")].filter(oe=>oe!==void 0);for(let oe of V){let me=process.platform==="win32"?ke__default.join(oe,"Scripts","python.exe"):ke__default.join(oe,"bin","python");if(await PKG.file(me).exists()){ne.pythonPath=me;break}}return H?{process:n(H,F,{cwd:X,env:{...process.env},stderr:"ignore"}),initialization:ne}:void 0}},re.ElixirLS={id:"elixir-ls",initTimeout:re.ServerInitTimeout.elixir_ls,extensions:[".ex",".exs"],root:c(["mix.exs","mix.lock"]),async spawn(X){let H=await PKG.which("elixir-ls");if(!H){let F=ke__default.join(a$1.Path.bin,"elixir-ls");if(H=ke__default.join(a$1.Path.bin,"elixir-ls-master","release",process.platform==="win32"?"language_server.bat":"language_server.sh"),!await PKG.file(H).exists()){if(!await PKG.which("elixir")){t.error("elixir is required to run elixir-ls");return}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading elixir-ls from GitHub releases");let V=await fetch("https://github.com/elixir-lsp/elixir-ls/archive/refs/heads/master.zip");if(!V.ok)return;let J=ke__default.join(a$1.Path.bin,"elixir-ls.zip");if(await PKG.write(J,V),!await Archive.extractZip(J,a$1.Path.bin).then(()=>true).catch(ae=>(t.error("Failed to extract elixir-ls archive",{error:ae}),false)))return;await Ot__default.rm(J,{force:true,recursive:true}),await $`mix deps.get && mix compile && mix elixir_ls.release2 -o release`.quiet().cwd(ke__default.join(a$1.Path.bin,"elixir-ls-master")).env({MIX_ENV:"prod",...process.env}),t.info("installed elixir-ls",{path:F});}}if(H)return {process:n(H)}}},re.Zls={id:"zls",initTimeout:re.ServerInitTimeout.zls,extensions:[".zig",".zon"],root:c(["build.zig"]),async spawn(X){let H=await PKG.which("zls",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(!await PKG.which("zig")){t.error("Zig is required to use zls. Please install Zig first.");return}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading zls from GitHub releases");let ne=await fetch("https://api.github.com/repos/zigtools/zls/releases/latest");if(!ne.ok){t.error("Failed to fetch zls release info");return}let V=await ne.json(),J=process.platform,oe=process.arch,ae="",me=oe;oe==="arm64"?me="aarch64":oe==="x64"?me="x86_64":oe==="ia32"&&(me="x86");let pe=J;J==="darwin"?pe="macos":J==="win32"&&(pe="windows");let xe=J==="win32"?"zip":"tar.xz";if(ae=`zls-${me}-${pe}.${xe}`,!["zls-x86_64-linux.tar.xz","zls-x86_64-macos.tar.xz","zls-x86_64-windows.zip","zls-aarch64-linux.tar.xz","zls-aarch64-macos.tar.xz","zls-aarch64-windows.zip","zls-x86-linux.tar.xz","zls-x86-windows.zip"].includes(ae)){t.error(`Platform ${J} and architecture ${oe} is not supported by zls`);return}let Ie=V.assets.find(Ae=>Ae.name===ae);if(!Ie){t.error(`Could not find asset ${ae} in latest zls release`);return}let we=Ie.browser_download_url,ie=await fetch(we);if(!ie.ok){t.error("Failed to download zls");return}let De=ke__default.join(a$1.Path.bin,ae);if(await PKG.write(De,ie),xe==="zip"){if(!await Archive.extractZip(De,a$1.Path.bin).then(()=>true).catch(Ft=>(t.error("Failed to extract zls archive",{error:Ft}),false)))return}else await $`tar -xf ${De}`.cwd(a$1.Path.bin).quiet().nothrow();if(await Ot__default.rm(De,{force:true}),H=ke__default.join(a$1.Path.bin,"zls"+(J==="win32"?".exe":"")),!await PKG.file(H).exists()){t.error("Failed to extract zls binary");return}J!=="win32"&&await $`chmod +x ${H}`.quiet().nothrow(),t.info("installed zls",{bin:H});}return {process:n(H,[],{cwd:X,stderr:"ignore"})}}},re.CSharp={id:"csharp",initTimeout:re.ServerInitTimeout.csharp,root:c([".slnx",".sln",".csproj","global.json"]),extensions:[".cs"],async spawn(X){let H=await PKG.which("csharp-ls",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(!await PKG.which("dotnet")){t.error(".NET SDK is required to install csharp-ls");return}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("installing csharp-ls via dotnet tool");let ne=await r(`dotnet tool install csharp-ls --tool-path "${a$1.Path.bin}"`);if(ne.code!==0){t.error("Failed to install csharp-ls",{stderr:ne.stderr});return}H=ke__default.join(a$1.Path.bin,"csharp-ls"+(process.platform==="win32"?".exe":"")),t.info("installed csharp-ls",{bin:H});}return {process:n(H,[],{cwd:X,stderr:"ignore"})}}},re.FSharp={id:"fsharp",initTimeout:re.ServerInitTimeout.fsharp,root:c([".slnx",".sln",".fsproj","global.json"]),extensions:[".fs",".fsi",".fsx",".fsscript"],async spawn(X){let H=await PKG.which("fsautocomplete",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(!await PKG.which("dotnet")){t.error(".NET SDK is required to install fsautocomplete");return}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("installing fsautocomplete via dotnet tool");let ne=await r(`dotnet tool install fsautocomplete --tool-path "${a$1.Path.bin}"`);if(ne.code!==0){t.error("Failed to install fsautocomplete",{stderr:ne.stderr});return}H=ke__default.join(a$1.Path.bin,"fsautocomplete"+(process.platform==="win32"?".exe":"")),t.info("installed fsautocomplete",{bin:H});}if(H)return {process:n(H,[],{cwd:X,stderr:"ignore"})}}},re.SourceKit={id:"sourcekit-lsp",initTimeout:re.ServerInitTimeout.sourcekit_lsp,extensions:[".swift",".objc","objcpp"],root:c(["Package.swift","*.xcodeproj","*.xcworkspace"]),async spawn(X){let H=await PKG.which("sourcekit-lsp");if(H)return {process:n(H,[],{cwd:X,stderr:"ignore"})};if(!await PKG.which("xcrun"))return;let ne=await $`xcrun --find sourcekit-lsp`.quiet().nothrow();if(ne.exitCode!==0)return;let V=await ne.text();if(V)return {process:n(V.trim(),[],{cwd:X,stderr:"ignore"})}}},re.RustAnalyzer={id:"rust",initTimeout:re.ServerInitTimeout.rust,root:async X=>{let H=await c(["Cargo.toml","Cargo.lock"])(X);if(H===void 0)return;let F=H;for(;F!==ke__default.dirname(F);){let ne=ke__default.join(F,"Cargo.toml");try{if((await PKG.file(ne).text()).includes("[workspace]"))return F}catch{}let V=ke__default.dirname(F);if(V===F||(F=V,!F.startsWith(A.worktree)))break}return H},extensions:[".rs"],async spawn(X){let H=await PKG.which("rust-analyzer");if(!H){t.info("rust-analyzer not found in path, please install it");return}return {process:s(H,[],{cwd:X,stderr:"ignore"})}}},re.Clangd={id:"clangd",initTimeout:re.ServerInitTimeout.clangd,root:c(["compile_commands.json","compile_flags.txt",".clangd","CMakeLists.txt","Makefile"]),extensions:[".c",".cpp",".cc",".cxx",".c++",".h",".hpp",".hh",".hxx",".h++"],async spawn(X){let H=["--background-index","--clang-tidy"],F=await PKG.which("clangd");if(F)return {process:s(F,H,{cwd:X,stderr:"ignore"})};let ne=process.platform==="win32"?".exe":"",V=ke__default.join(a$1.Path.bin,"clangd"+ne);if(await PKG.file(V).exists())return {process:s(V,H,{cwd:X,stderr:"ignore"})};let J=await Ot__default.readdir(a$1.Path.bin,{withFileTypes:true}).catch(()=>[]);for(let kt of J){if(!kt.isDirectory()||!kt.name.startsWith("clangd_"))continue;let vr=ke__default.join(a$1.Path.bin,kt.name,"bin","clangd"+ne);if(await PKG.file(vr).exists())return {process:s(vr,H,{cwd:X,stderr:"ignore"})}}if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading clangd from GitHub releases");let oe=await fetch("https://api.github.com/repos/clangd/clangd/releases/latest");if(!oe.ok){t.error("Failed to fetch clangd release info");return}let ae=await oe.json(),me=ae.tag_name;if(!me){t.error("clangd release did not include a tag name");return}let pe=process.platform,He={darwin:"mac",linux:"linux",win32:"windows"}[pe];if(!He){t.error(`Platform ${pe} is not supported by clangd auto-download`);return}let Ie=ae.assets??[],we=kt=>!kt.name||!kt.browser_download_url||!kt.name.includes(He)?false:kt.name.includes(me),ie=Ie.find(kt=>we(kt)&&kt.name?.endsWith(".zip"))??Ie.find(kt=>we(kt)&&kt.name?.endsWith(".tar.xz"))??Ie.find(kt=>we(kt));if(!ie?.name||!ie.browser_download_url){t.error("clangd could not match release asset",{tag:me,platform:pe});return}let De=ie.name,Ae=await fetch(ie.browser_download_url);if(!Ae.ok){t.error("Failed to download clangd");return}let Ft=ke__default.join(a$1.Path.bin,De),Ln=await Ae.arrayBuffer();if(Ln.byteLength===0){t.error("Failed to write clangd archive");return}await PKG.write(Ft,Buffer.from(Ln));let Jn=De.endsWith(".zip"),Nn=De.endsWith(".tar.xz");if(!Jn&&!Nn){t.error("clangd encountered unsupported asset",{asset:De});return}if(Jn&&!await Archive.extractZip(Ft,a$1.Path.bin).then(()=>true).catch(vr=>(t.error("Failed to extract clangd archive",{error:vr}),false)))return;Nn&&await $`tar -xf ${Ft}`.cwd(a$1.Path.bin).quiet().nothrow(),await Ot__default.rm(Ft,{force:true});let Qt=ke__default.join(a$1.Path.bin,"clangd_"+me,"bin","clangd"+ne);if(!await PKG.file(Qt).exists()){t.error("Failed to extract clangd binary");return}return pe!=="win32"&&await $`chmod +x ${Qt}`.quiet().nothrow(),await Ot__default.unlink(ke__default.join(a$1.Path.bin,"clangd")).catch(()=>{}),await Ot__default.symlink(Qt,ke__default.join(a$1.Path.bin,"clangd")).catch(()=>{}),t.info("installed clangd",{bin:Qt}),{process:n(Qt,H,{cwd:X,stderr:"ignore"})}}},re.Svelte={id:"svelte",initTimeout:re.ServerInitTimeout.svelte,extensions:[".svelte"],root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(X){let H=await PKG.which("svelteserver"),F=[];if(!H){let V=ke__default.join(a$1.Path.bin,"node_modules","svelte-language-server","bin","server.js");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let oe=await PKG.which();if(!oe)return;await r(`${oe} install svelte-language-server`,{cwd:a$1.Path.bin,env:{...process.env}});}let J=await PKG.which();if(!J)return;H=J,F.push("run",V);}return H?(F.push("--stdio"),{process:n(H,F,{cwd:X,env:{...process.env},stderr:"ignore"}),initialization:{}}):void 0}},re.Astro={id:"astro",initTimeout:re.ServerInitTimeout.astro,extensions:[".astro"],root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(X){let H=await PKG.resolve("typescript/lib/tsserver.js",A.directory).catch(()=>{});if(!H){t.info("typescript not found, required for Astro language server");return}let F=ke__default.dirname(H),ne=await PKG.which("astro-ls"),V=[];if(!ne){let oe=ke__default.join(a$1.Path.bin,"node_modules","@astrojs","language-server","bin","nodeServer.js");if(!await PKG.file(oe).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let me=await PKG.which();if(!me)return;await r(`${me} install @astrojs/language-server`,{cwd:a$1.Path.bin,env:{...process.env}});}let ae=await PKG.which();if(!ae)return;ne=ae,V.push("run",oe);}return ne?(V.push("--stdio"),{process:n(ne,V,{cwd:X,env:{...process.env},stderr:"ignore"}),initialization:{typescript:{tsdk:F}}}):void 0}},re.JDTLS={id:"jdtls",initTimeout:re.ServerInitTimeout.jdtls,root:c(["pom.xml","build.gradle","build.gradle.kts",".project",".classpath"]),extensions:[".java"],async spawn(X){let H=await PKG.which("java");if(!H){t.error("Java 21 or newer is required to run the JDTLS. Please install it first.");return}let F=await $`java -version`.quiet().nothrow(),ne=(()=>{let we=/"(\d+)\.\d+\.\d+"/.exec(F.stderr?.toString()??"");return we?.[1]?parseInt(we[1],10):void 0})();if(ne==null||ne<21){t.error("JDTLS requires at least Java 21.");return}let V=ke__default.join(a$1.Path.bin,"jdtls"),J=ke__default.join(V,"plugins");if(!await i(J)){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("Downloading JDTLS LSP server."),await Ot__default.mkdir(V,{recursive:true});let we="https://www.eclipse.org/downloads/download.php?file=/jdtls/snapshots/jdt-language-server-latest.tar.gz",ie="release.tar.gz";t.info("Downloading JDTLS archive",{url:we,dest:V});let De=await $`curl -L -o ${ie} '${we}'`.cwd(V).quiet().nothrow();if(De.exitCode!==0){t.error("Failed to download JDTLS",{exitCode:De.exitCode,stderr:De.stderr.toString()});return}t.info("Extracting JDTLS archive");let Ae=await $`tar -xzf ${ie}`.cwd(V).quiet().nothrow();if(Ae.exitCode!==0){t.error("Failed to extract JDTLS",{exitCode:Ae.exitCode,stderr:Ae.stderr.toString()});return}await Ot__default.rm(ke__default.join(V,ie),{force:true}),t.info("JDTLS download and extraction completed");}let me=(await $`ls org.eclipse.equinox.launcher_*.jar`.cwd(J).quiet().nothrow()).stdout?.toString().trim();if(!me){t.error(`Failed to find JDTLS launcher jar in ${J}.`);return}let pe=ke__default.join(J,me);if(!await i(pe)){t.error(`Failed to locate the JDTLS launcher module in the installed directory: ${V}.`);return}let xe=ke__default.join(V,(()=>{switch(process.platform){case "darwin":return "config_mac";case "linux":return "config_linux";case "win32":return "config_win";default:return "config_linux"}})()),He=await Ot__default.mkdtemp(ke__default.join(Mc.tmpdir(),"easbot-jdtls-data"));return {process:o([H,"-jar",pe,"-configuration",xe,"-data",He,"-Declipse.application=org.eclipse.jdt.ls.core.id1","-Dosgi.bundles.defaultStartLevel=4","-Declipse.product=org.eclipse.jdt.ls.core.product","-Dlog.level=ALL","--add-modules=ALL-SYSTEM","--add-opens=java.base/java.util=ALL-UNNAMED","--add-opens=java.base/java.lang=ALL-UNNAMED"],{cwd:X})}}},re.KotlinLS={id:"kotlin-ls",initTimeout:re.ServerInitTimeout.kotlin_ls,extensions:[".kt",".kts"],root:async X=>{let H=await c(["settings.gradle.kts","settings.gradle"])(X);if(H)return H;let F=await c(["gradlew","gradlew.bat"])(X);if(F)return F;let ne=await c(["build.gradle.kts","build.gradle"])(X);return ne||c(["pom.xml"])(X)},async spawn(X){let H=ke__default.join(a$1.Path.bin,"kotlin-ls"),F=process.platform==="win32"?ke__default.join(H,"kotlin-lsp.cmd"):ke__default.join(H,"kotlin-lsp.sh");if(!await PKG.file(F).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("Downloading Kotlin Language Server from GitHub.");let V=await fetch("https://api.github.com/repos/Kotlin/kotlin-lsp/releases/latest");if(!V.ok){t.error("Failed to fetch kotlin-lsp release info");return}let oe=(await V.json()).name?.replace(/^v/,"");if(!oe){t.error("Could not determine Kotlin LSP version from release");return}let ae=process.platform,me=process.arch,pe=me;me==="arm64"?pe="aarch64":me==="x64"&&(pe="x64");let xe=ae;ae==="darwin"?xe="mac":ae==="linux"?xe="linux":ae==="win32"&&(xe="win");let He=["mac-x64","mac-aarch64","linux-x64","linux-aarch64","win-x64","win-aarch64"],Ie=`${xe}-${pe}`;if(!He.includes(Ie)){t.error(`Platform ${ae}/${me} is not supported by Kotlin LSP`);return}let we=`kotlin-lsp-${oe}-${xe}-${pe}.zip`,ie=`https://download-cdn.jetbrains.com/kotlin-lsp/${oe}/${we}`;await Ot__default.mkdir(H,{recursive:true});let De=ke__default.join(H,"kotlin-ls.zip");if(await $`curl -L -o '${De}' '${ie}'`.quiet().nothrow(),!await Archive.extractZip(De,H).then(()=>true).catch(Ft=>(t.error("Failed to extract Kotlin LS archive",{error:Ft}),false)))return;await Ot__default.rm(De,{force:true}),process.platform!=="win32"&&await $`chmod +x ${F}`.quiet().nothrow(),t.info("Installed Kotlin Language Server",{path:F});}if(!await PKG.file(F).exists()){t.error(`Failed to locate the Kotlin LS launcher script in the installed directory: ${H}.`);return}return {process:n(F,["--stdio"],{cwd:X,stderr:"ignore"})}}},re.YamlLS={id:"yaml-ls",initTimeout:re.ServerInitTimeout.yaml,extensions:[".yaml",".yml"],root:c(["package-lock.json","bun.lockb","bun.lock","pnpm-lock.yaml","yarn.lock"]),async spawn(X){let H=await PKG.which("yaml-language-server"),F=[];if(!H){let V=ke__default.join(a$1.Path.bin,"node_modules","yaml-language-server","out","server","src","server.js");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let ae=await PKG.which();if(!ae)return;await r(`${ae} install yaml-language-server`,{cwd:a$1.Path.bin,env:{...process.env}});}let oe=await PKG.which();if(!oe)return;H=oe,F.push("run",V);}return H?(F.push("--stdio"),{process:n(H,F,{cwd:X,env:{...process.env},stderr:"ignore"})}):void 0}},re.LuaLS={id:"lua-ls",initTimeout:re.ServerInitTimeout.lua,root:c([".luarc.json",".luarc.jsonc",".luacheckrc",".stylua.toml","stylua.toml","selene.toml","selene.yml"]),extensions:[".lua"],async spawn(X){let H=await PKG.which("lua-language-server",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading lua-language-server from GitHub releases");let F=await fetch("https://api.github.com/repos/LuaLS/lua-language-server/releases/latest");if(!F.ok){t.error("Failed to fetch lua-language-server release info");return}let ne=await F.json(),V=process.platform,J=process.arch,oe="",ae=J;J==="arm64"?ae="arm64":J==="x64"?ae="x64":J==="ia32"&&(ae="ia32");let me=V;V==="darwin"?me="darwin":V==="linux"?me="linux":V==="win32"&&(me="win32");let pe=V==="win32"?"zip":"tar.gz";oe=`lua-language-server-${ne.tag_name}-${me}-${ae}.${pe}`;let xe=["darwin-arm64.tar.gz","darwin-x64.tar.gz","linux-x64.tar.gz","linux-arm64.tar.gz","win32-x64.zip","win32-ia32.zip"],He=`${me}-${ae}.${pe}`;if(!xe.includes(He)){t.error(`Platform ${V} and architecture ${J} is not supported by lua-language-server`);return}let Ie=ne.assets.find(Ln=>Ln.name===oe);if(!Ie){t.error(`Could not find asset ${oe} in latest lua-language-server release`);return}let we=Ie.browser_download_url,ie=await fetch(we);if(!ie.ok){t.error("Failed to download lua-language-server");return}let De=ke__default.join(a$1.Path.bin,oe);await PKG.write(De,ie);let Ae=ke__default.join(a$1.Path.bin,`lua-language-server-${ae}-${me}`);if(await Ot__default.stat(Ae).catch(()=>{})&&await Ot__default.rm(Ae,{force:true,recursive:true}),await Ot__default.mkdir(Ae,{recursive:true}),pe==="zip"){if(!await Archive.extractZip(De,Ae).then(()=>true).catch(Jn=>(t.error("Failed to extract lua-language-server archive",{error:Jn}),false)))return}else if(!await $`tar -xzf ${De} -C ${Ae}`.quiet().then(()=>true).catch(Jn=>(t.error("Failed to extract lua-language-server archive",{error:Jn}),false)))return;if(await Ot__default.rm(De,{force:true}),H=ke__default.join(Ae,"bin","lua-language-server"+(V==="win32"?".exe":"")),!await PKG.file(H).exists()){t.error("Failed to extract lua-language-server binary");return}if(V!=="win32"&&!await $`chmod +x ${H}`.quiet().catch(Jn=>{t.error("Failed to set executable permission for lua-language-server binary",{error:Jn});}))return;t.info("installed lua-language-server",{bin:H});}return {process:n(H,[],{cwd:X,stderr:"ignore"})}}},re.PHPIntelephense={id:"php intelephense",initTimeout:re.ServerInitTimeout.intelephense,extensions:[".php"],root:c(["composer.json","composer.lock",".php-version"]),async spawn(X){let H=await PKG.which("intelephense"),F=[];if(!H){let V=ke__default.join(a$1.Path.bin,"node_modules","intelephense","lib","intelephense.js");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let oe=await PKG.which();if(!oe)return;await r(`${oe} install intelephense`,{cwd:a$1.Path.bin,env:{...process.env}});}let J=await PKG.which();if(!J)return;H=J,F.push("run",V);}return H?(F.push("--stdio"),{process:n(H,F,{cwd:X,env:{...process.env}}),initialization:{telemetry:{enabled:false}}}):void 0}},re.Prisma={id:"prisma",initTimeout:re.ServerInitTimeout.prisma,extensions:[".prisma"],root:c(["schema.prisma","prisma/schema.prisma","prisma"],["package.json"]),async spawn(X){let H=await PKG.which("prisma");if(!H){t.info("prisma not found, please install prisma");return}return {process:n(H,["language-server"],{cwd:X,stderr:"ignore"})}}},re.Dart={id:"dart",initTimeout:re.ServerInitTimeout.dart,extensions:[".dart"],root:c(["pubspec.yaml","analysis_options.yaml"]),async spawn(X){let H=await PKG.which("dart");if(!H){t.info("dart not found, please install dart first");return}return {process:s(H,["language-server","--lsp"],{cwd:X,stderr:"ignore"})}}},re.Ocaml={id:"ocaml-lsp",initTimeout:re.ServerInitTimeout.ocaml_lsp,extensions:[".ml",".mli"],root:c(["dune-project","dune-workspace",".merlin","opam"]),async spawn(X){let H=await PKG.which("ocamllsp");if(!H){t.info("ocamllsp not found, please install ocaml-lsp-server");return}return {process:s(H,[],{cwd:X,stderr:"ignore"})}}},re.BashLS={id:"bash",initTimeout:re.ServerInitTimeout.bash,extensions:[".sh",".bash",".zsh",".ksh"],root:async()=>A.directory,async spawn(X){let H=await PKG.which("bash-language-server"),F=[];if(!H){let V=ke__default.join(a$1.Path.bin,"node_modules","bash-language-server","out","cli.js");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let oe=await PKG.which();if(!oe)return;await r(`${oe} install bash-language-server`,{cwd:a$1.Path.bin,env:{...process.env}});}let J=await PKG.which();if(!J)return;H=J,F.push("run",V);}return H?(F.push("start"),{process:n(H,F,{cwd:X,env:{...process.env}})}):void 0}},re.TerraformLS={id:"terraform",initTimeout:re.ServerInitTimeout.terraform,extensions:[".tf",".tfvars"],root:c([".terraform.lock.hcl","terraform.tfstate","*.tf"]),async spawn(X){let H=await PKG.which("terraform-ls",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading terraform-ls from GitHub releases");let F=await fetch("https://api.github.com/repos/hashicorp/terraform-ls/releases/latest");if(!F.ok){t.error("Failed to fetch terraform-ls release info");return}let ne=await F.json(),V=ne.tag_name?.replace("v","");if(!V){t.error("terraform-ls release did not include a version tag");return}let J=process.platform,ae=process.arch==="arm64"?"arm64":"amd64",pe=`terraform-ls_${V}_${J==="win32"?"windows":J}_${ae}.zip`,He=(ne.assets??[]).find(De=>De.name===pe);if(!He?.browser_download_url){t.error(`Could not find asset ${pe} in terraform-ls release`);return}let Ie=await fetch(He.browser_download_url);if(!Ie.ok){t.error("Failed to download terraform-ls");return}let we=ke__default.join(a$1.Path.bin,pe);if(await PKG.write(we,Ie),!await Archive.extractZip(we,a$1.Path.bin).then(()=>true).catch(De=>(t.error("Failed to extract terraform-ls archive",{error:De}),false)))return;if(await Ot__default.rm(we,{force:true}),H=ke__default.join(a$1.Path.bin,"terraform-ls"+(J==="win32"?".exe":"")),!await PKG.file(H).exists()){t.error("Failed to extract terraform-ls binary");return}J!=="win32"&&await $`chmod +x ${H}`.quiet().nothrow(),t.info("installed terraform-ls",{bin:H});}return {process:s(H,["serve"],{cwd:X,stderr:"ignore"}),initialization:{experimentalFeatures:{prefillRequiredFields:true,validateOnSave:true}}}}},re.TexLab={id:"texlab",initTimeout:re.ServerInitTimeout.texlab,extensions:[".tex",".bib"],root:c([".latexmkrc","latexmkrc",".texlabroot","texlabroot"]),async spawn(X){let H=await PKG.which("texlab",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading texlab from GitHub releases");let F=await fetch("https://api.github.com/repos/latex-lsp/texlab/releases/latest");if(!F.ok){t.error("Failed to fetch texlab release info");return}let ne=await F.json();if(!ne.tag_name?.replace("v","")){t.error("texlab release did not include a version tag");return}let J=process.platform,ae=process.arch==="arm64"?"aarch64":"x86_64",me=J==="darwin"?"macos":J==="win32"?"windows":"linux",pe=J==="win32"?"zip":"tar.gz",xe=`texlab-${ae}-${me}.${pe}`,Ie=(ne.assets??[]).find(De=>De.name===xe);if(!Ie?.browser_download_url){t.error(`Could not find asset ${xe} in texlab release`);return}let we=await fetch(Ie.browser_download_url);if(!we.ok){t.error("Failed to download texlab");return}let ie=ke__default.join(a$1.Path.bin,xe);if(await PKG.write(ie,we),pe==="zip"&&!await Archive.extractZip(ie,a$1.Path.bin).then(()=>true).catch(Ae=>(t.error("Failed to extract texlab archive",{error:Ae}),false)))return;if(pe==="tar.gz"&&await $`tar -xzf ${ie}`.cwd(a$1.Path.bin).quiet().nothrow(),await Ot__default.rm(ie,{force:true}),H=ke__default.join(a$1.Path.bin,"texlab"+(J==="win32"?".exe":"")),!await PKG.file(H).exists()){t.error("Failed to extract texlab binary");return}J!=="win32"&&await $`chmod +x ${H}`.quiet().nothrow(),t.info("installed texlab",{bin:H});}return {process:s(H,[],{cwd:X,stderr:"ignore"})}}},re.DockerfileLS={id:"dockerfile",initTimeout:re.ServerInitTimeout.dockerfile,extensions:[".dockerfile","Dockerfile"],root:async()=>A.directory,async spawn(X){let H=await PKG.which("docker-langserver"),F=[];if(!H){let V=ke__default.join(a$1.Path.bin,"node_modules","dockerfile-language-server-nodejs","lib","server.js");if(!await PKG.file(V).exists()){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;let oe=await PKG.which();if(!oe)return;await r(`${oe} install dockerfile-language-server-nodejs`,{cwd:a$1.Path.bin,env:{...process.env}});}let J=await PKG.which();if(!J)return;H=J,F.push("run",V);}return H?(F.push("--stdio"),{process:n(H,F,{cwd:X,env:{...process.env}})}):void 0}},re.Gleam={id:"gleam",initTimeout:re.ServerInitTimeout.gleam,extensions:[".gleam"],root:c(["gleam.toml"]),async spawn(X){let H=await PKG.which("gleam");if(!H){t.info("gleam not found, please install gleam first");return}return {process:s(H,["lsp"],{cwd:X,stderr:"ignore"})}}},re.Clojure={id:"clojure-lsp",initTimeout:re.ServerInitTimeout.clojure_lsp,extensions:[".clj",".cljs",".cljc",".edn"],root:c(["deps.edn","project.clj","shadow-cljs.edn","bb.edn","build.boot"]),async spawn(X){let H=await PKG.which("clojure-lsp");if(!H&&process.platform==="win32"&&(H=await PKG.which("clojure-lsp.exe")),!H){t.info("clojure-lsp not found, please install clojure-lsp first");return}return {process:s(H,["listen"],{cwd:X,stderr:"ignore"})}}},re.Nixd={id:"nixd",initTimeout:re.ServerInitTimeout.nixd,extensions:[".nix"],root:async X=>{let H=await c(["flake.nix"])(X);return H&&H!==A.directory?H:A.worktree&&A.worktree!==A.directory?A.worktree:A.directory},async spawn(X){let H=await PKG.which("nixd");if(!H){t.info("nixd not found, please install nixd first");return}return {process:s(H,[],{cwd:X,env:{...process.env},stderr:"ignore"})}}},re.Tinymist={id:"tinymist",initTimeout:re.ServerInitTimeout.tinymist,extensions:[".typ",".typc"],root:c(["typst.toml"]),async spawn(X){let H=await PKG.which("tinymist",{PATH:process.env.PATH+ke__default.delimiter+a$1.Path.bin});if(!H){if(a$2.EASBOT_DISABLE_LSP_DOWNLOAD)return;t.info("downloading tinymist from GitHub releases");let F=await fetch("https://api.github.com/repos/Myriad-Dreamin/tinymist/releases/latest");if(!F.ok){t.error("Failed to fetch tinymist release info");return}let ne=await F.json(),V=process.platform,oe=process.arch==="arm64"?"aarch64":"x86_64",ae,me;V==="darwin"?(ae="apple-darwin",me="tar.gz"):V==="win32"?(ae="pc-windows-msvc",me="zip"):(ae="unknown-linux-gnu",me="tar.gz");let pe=`tinymist-${oe}-${ae}.${me}`,He=(ne.assets??[]).find(ie=>ie.name===pe);if(!He?.browser_download_url){t.error(`Could not find asset ${pe} in tinymist release`);return}let Ie=await fetch(He.browser_download_url);if(!Ie.ok){t.error("Failed to download tinymist");return}let we=ke__default.join(a$1.Path.bin,pe);if(await PKG.write(we,Ie),me==="zip"){if(!await Archive.extractZip(we,a$1.Path.bin).then(()=>true).catch(De=>(t.error("Failed to extract tinymist archive",{error:De}),false)))return}else await $`tar -xzf ${we} --strip-components=1`.cwd(a$1.Path.bin).quiet().nothrow();if(await Ot__default.rm(we,{force:true}),H=ke__default.join(a$1.Path.bin,"tinymist"+(V==="win32"?".exe":"")),!await PKG.file(H).exists()){t.error("Failed to extract tinymist binary");return}V!=="win32"&&await $`chmod +x ${H}`.quiet().nothrow(),t.info("installed tinymist",{bin:H});}return {process:s(H,[],{cwd:X,stderr:"ignore"})}}},re.HLS={id:"haskell-language-server",initTimeout:re.ServerInitTimeout.haskell_language_server,extensions:[".hs",".lhs"],root:c(["stack.yaml","cabal.project","hie.yaml","*.cabal"]),async spawn(X){let H=await PKG.which("haskell-language-server-wrapper");if(!H){t.info("haskell-language-server-wrapper not found, please install haskell-language-server");return}return {process:s(H,["--lsp"],{cwd:X,stderr:"ignore"})}}};})(_o||(_o={}));var Ns=(s=>(s.STDIO="stdio",s.LOCAL="local",s.HTTP="http",s.WS="websocket",s))(Ns||{});function xm(t){return t==="local"?"stdio":t}var Im=z.object({command:z.string(),args:z.array(z.string())}),vm=z.object({baseUrl:z.string().url(),timeout:z.number().positive().default(3e4)}).strict(),Sm=z.object({url:z.string().url(),timeout:z.number().positive().default(3e4),batchSize:z.number().positive().default(10),batchInterval:z.number().positive().default(50),heartbeatInterval:z.number().positive().default(3e4)}),Ub=z.object({stdio:Im.optional(),http:vm.optional(),ws:Sm.optional()});function zb(t){if(!t||t.trim()==="")return false;let e=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$/;return !(t.startsWith("-")||t.endsWith("-")||!e.test(t))}var Bb=z.object({id:z.string().min(1),options:z.record(z.string(),z.unknown()).optional()}),Hb=z.object({agent:z.string().optional(),model:Bb.optional()}),Cm=z.object({directory:z.string().default(process.cwd()),enabled:z.boolean().default(true),channel:z.preprocess(xm,z.nativeEnum(Ns)).default("websocket"),port:z.number().int().min(1).max(65535).default(3e3),hostname:z.string().min(1).default("localhost"),timeout:z.number().positive().default(3e4),agentId:z.string().optional(),stdio:Im.optional(),http:vm.optional(),ws:Sm.optional(),agent:Hb.optional()}).refine(t=>!!zb(t.hostname),{message:"Invalid hostname format",path:["hostname"]}),qb=z.object({id:z.string().min(1),name:z.string().min(1),type:z.enum(["easbot","pi","custom"]),agentId:z.string().optional(),channels:z.array(z.preprocess(xm,z.nativeEnum(Ns))).min(1),connection:Ub,autoConnect:z.boolean().default(false),priority:z.number().int().nonnegative().default(0)}),km=z.object({clients:z.array(qb).min(1),defaultClientId:z.string().optional()});z.object({server:Cm});z.object({clients:km});var Ed=z.object({server:Cm,clients:km.optional()}),Pm={enabled:true,directory:process.cwd(),channel:"websocket",port:3e3,hostname:"localhost",timeout:3e4};var Td=z$1.object({model:z$1.string().optional().describe("Embedding model, defaults to config embedding model"),batchSize:z$1.number().int().positive().optional().describe("Batch size for embedding operations"),dimensions:z$1.number().int().positive().optional().describe("Embedding dimensions (optional, auto-detect)")}).optional(),Dd=z$1.object({maxResults:z$1.number().int().positive().optional().describe("Max search results"),minScore:z$1.number().min(0).max(1).optional().describe("Min score threshold (default: 0.3)"),hybrid:z$1.object({enabled:z$1.boolean().optional().describe("Enable hybrid search"),vectorWeight:z$1.number().min(0).max(1).optional().describe("Vector search weight (default: 0.7)"),textWeight:z$1.number().min(0).max(1).optional().describe("FTS text search weight (default: 0.3)")}).optional().describe("Hybrid search configuration")}).optional().describe("Search configuration"),Em=z$1.object({ignorePatterns:z$1.array(z$1.string()).optional().describe("File patterns to ignore"),batchSize:z$1.number().int().positive().optional().describe("Batch size for indexing"),incremental:z$1.boolean().optional().describe("Enable incremental indexing")}).optional(),Tm=z$1.object({onBoot:z$1.boolean().optional().describe("Sync on boot"),onSearch:z$1.boolean().optional().describe("Sync on search"),onSessionStart:z$1.boolean().optional().describe("Sync on session start"),intervalMs:z$1.number().int().positive().optional().describe("Sync interval in milliseconds")}).optional().describe("Sync configuration"),Ad=z$1.object({dictPath:z$1.array(z$1.string()).optional().describe("Custom dictionary paths")}).optional().describe("Tokenizer configuration"),Gb=z$1.object({model:z$1.string().optional().describe("Rerank model, defaults to config rerank_model"),topK:z$1.number().int().positive().optional().describe("Number of candidates for reranking")}).optional().describe("Rerank configuration"),Dm=z$1.object({model:z$1.string().optional().describe("Graph LLM model, defaults to config graph_model"),entityExtractionPrompt:z$1.string().optional().describe("Entity extraction prompt template"),relationExtractionPrompt:z$1.string().optional().describe("Relation extraction prompt template")}).optional().describe("Graph LLM configuration for entity and relation extraction"),sc=z$1.object({enabled:z$1.boolean().optional().describe("Enable codebase knowledge base"),database:z$1.string().optional().describe("Codebase database path"),embedding:Td,search:Dd,indexer:Em,tokenizer:Ad,sync:Tm,parser:z$1.object({languages:z$1.array(z$1.string()).optional().describe("Supported languages"),lazyLoad:z$1.boolean().optional().describe("Lazy load parsers")}).optional().describe("Code parser configuration")}).optional().describe("Codebase knowledge base configuration"),rc=z$1.object({enabled:z$1.boolean().optional().describe("Enable memory knowledge base"),workspaceDir:z$1.string().optional().describe("Memory workspace directory (contains MEMORY.md, active/, archive/)"),sessionsDir:z$1.string().optional().describe("Sessions directory for extracting historical long-term memory"),database:z$1.string().optional().describe("Memory database path"),embedding:Td,graph:Dm,search:Dd,tokenizer:Ad,archiveDays:z$1.number().int().positive().optional().describe("Days before archiving memories (default: 30)"),shortTermMaxRounds:z$1.number().int().positive().optional().describe("Max rounds for short-term memory (default: 20)")}).optional().describe("Memory knowledge base configuration"),ic=z$1.object({enabled:z$1.boolean().optional().describe("Enable note knowledge base"),database:z$1.string().optional().describe("Note database path"),search:Dd,indexer:Em,tokenizer:Ad,sync:Tm,embedding:Td,graph:Dm,rerank:Gb,extraPaths:z$1.array(z$1.string()).optional().describe("Extra search paths (extended directories)"),sources:z$1.array(z$1.enum(["docs"])).optional().describe("Source types"),chunkSize:z$1.number().int().positive().optional().describe("Chunk size"),chunkOverlap:z$1.number().int().min(0).optional().describe("Chunk overlap size")}).optional().describe("Note knowledge base configuration"),Fn=a.create({service:"knowledge-loader"});async function kr(){try{let e=(await he.get())?.note;if(!e){Fn.debug("No note config found in Config.Info");return}let n=ic.safeParse(e);if(n.success)return Fn.debug("Note config loaded"),n.data;Fn.warn("Invalid note config",{issues:n.error.issues});return}catch(t){Fn.error("Failed to load note config",{error:t});return}}async function Pr(){try{let e=(await he.get())?.codebase;if(!e){Fn.debug("No codebase config found in Config.Info");return}let n=sc.safeParse(e);if(n.success)return Fn.debug("Codebase config loaded"),n.data;Fn.warn("Invalid codebase config",{issues:n.error.issues});return}catch(t){Fn.error("Failed to load codebase config",{error:t});return}}async function Er(){try{let t=await he.get();Fn.debug("loadMemory() configState.memory",{memoryConfig:t?.memory});let e=t?.memory;if(!e){Fn.debug("No memory config found in Config.Info");return}let n=rc.safeParse(e);if(n.success)return Fn.debug("Memory config loaded",{data:n.data}),n.data;Fn.warn("Invalid memory config",{issues:n.error.issues});return}catch(t){Fn.error("Failed to load memory config",{error:t});return}}async function Rd(){let t={},[e,n,o]=await Promise.all([kr(),Pr(),Er()]);return e&&(t.note=e),n&&(t.codebase=n),o&&(t.memory=o),Fn.debug("Knowledge configs loaded",{types:Object.keys(t),count:Object.keys(t).length}),t}var Am="easbot-oauth-dummy-key",et;(l=>{l.Oauth=z$1.object({type:z$1.literal("oauth"),refresh:z$1.string(),access:z$1.string(),expires:z$1.number(),accountId:z$1.string().optional(),enterpriseUrl:z$1.string().optional()}).meta({ref:"OAuth"}),l.Api=z$1.object({type:z$1.literal("api"),key:z$1.string()}).meta({ref:"ApiAuth"}),l.WellKnown=z$1.object({type:z$1.literal("wellknown"),key:z$1.string(),token:z$1.string()}).meta({ref:"WellKnownAuth"}),l.Info=z$1.discriminatedUnion("type",[l.Oauth,l.Api,l.WellKnown]).meta({ref:"Auth"});let s=ke__default.join(a$1.Path.data,"auth.json");async function r(f){return (await i())[f]}l.get=r;async function i(){let m=await PKG.file(s).json().catch(()=>({}));return Object.entries(m).reduce((a,[p,d])=>{let h=l.Info.safeParse(d);return h.success&&(a[p]=h.data),a},{})}l.all=i;async function c(f,m){let a=await i();await PKG.write(s,JSON.stringify({...a,[f]:m},null,2));}l.set=c;async function u(f){let m=await i();delete m[f],await PKG.write(s,JSON.stringify(m,null,2));}l.remove=u;})(et||(et={}));function wo(t,e){let n=mergeDeep(t,e);return t.plugin&&e.plugin&&(n.plugin=Array.from(new Set([...t.plugin,...e.plugin]))),t.instructions&&e.instructions&&(n.instructions=Array.from(new Set([...t.instructions,...e.instructions]))),n}var Md=a.create({service:"config"});async function nw(t){try{return await Ot__default.access(t,constants.W_OK),!0}catch{return false}}async function _i(t){if(!await nw(t))return Md.debug("config dir is not writable, skipping dependency install",{dir:t}),false;let n=ke__default.join(t,"node_modules");if(!existsSync(n))return true;let o=ke__default.join(t,"package.json"),s=PKG.file(o);if(!await s.exists())return true;let u=((await s.json().catch(()=>null))?.dependencies??{})["@easbot/plugin"];if(!u)return true;let l=b$3.isLocal()?"latest":b$3.getVersion();return l==="latest"?await PackageRegistry.isOutdated("@easbot/plugin",u,t)?(Md.info("Cached version is outdated, proceeding with install",{pkg:"@easbot/plugin",cachedVersion:u}),true):false:u!==l}async function Mi(t){let e=ke__default.join(t,"package.json"),n=b$3.isLocal()?"*":b$3.getVersion(),o=await PKG.file(e).json().catch(()=>({}));o.dependencies={...o.dependencies,"@easbot/plugin":n},await PKG.write(e,JSON.stringify(o,null,2)),await new Promise(l=>setTimeout(l,3e3));let s=ke__default.join(t,".gitignore");await PKG.file(s).exists()||await PKG.write(s,["node_modules","package.json","package-lock.json","pnpm-lock.yaml","bun.lock",".gitignore"].join(`
2
+ `));let i=await PKG.packageManager();if(!i){Md.debug("No package manager found, skipping install");return}let c=proxied()?" --no-cache":"",u=process.platform==="win32"?"cmd":void 0;await Shell.run(u,`${i.name} install${c}`,{cwd:t}).catch(()=>{});}var jd=a.create({service:"config"}),Ho=NamedError.create("ConfigJsonError",z$1.object({path:z$1.string(),message:z$1.string().optional()})),xo=NamedError.create("ConfigInvalidError",z$1.object({path:z$1.string(),issues:z$1.custom().optional(),message:z$1.string().optional()}));async function Io(t){jd.info("loading",{path:t});let e=await PKG.file(t).text().catch(n=>{if(n.code!=="ENOENT")throw new Ho({path:t},{cause:n})});return e?Dr(e,t):{}}async function Dr(t,e){let n=t;t=t.replace(/\{env:([^}]+)\}/g,(c,u)=>process.env[u]||"");let o=t.match(/\{file:[^}]+\}/g);if(o){let c=ke__default.dirname(e),u=t.split(`
3
+ `);for(let l of o){let f=u.findIndex(h=>h.includes(l)),m=u[f];if(f!==-1&&m?.trim().startsWith("//"))continue;let a=l.replace(/^\{file:/,"").replace(/\}$/,"");a.startsWith("~/")&&(a=ke__default.join(Mc.homedir(),a.slice(2)));let p=ke__default.isAbsolute(a)?a:ke__default.resolve(c,a),d=(await PKG.file(p).text().catch(h=>{let w=`bad file reference: "${l}"`;throw h.code==="ENOENT"?new xo({path:e,message:w+` ${p} does not exist`},{cause:h}):new xo({path:e,message:w},{cause:h})})).trim();t=t.replace(l,()=>JSON.stringify(d).slice(1,-1));}}let s=[],r=parse$1(t,s,{allowTrailingComma:true});if(s.length>0){let c=t.split(`
4
+ `),u=s.map(l=>{let f=t.substring(0,l.offset).split(`
5
+ `),m=f.length,a=f[f.length-1]?.length??1,p=c[m-1],d=`${printParseErrorCode(l.error)} at line ${m}, column ${a}`;return p?`${d}
6
+ Line ${m}: ${p}
7
+ ${"".padStart(a+9)}^`:d}).join(`
8
+ `);throw new Ho({path:e,message:`
9
+ --- JSONC Input ---
10
+ ${t}
11
+ --- Errors ---
12
+ ${u}
13
+ --- End ---`})}let i=Rr.safeParse(r);if(i.success){if(!i.data.$schema){i.data.$schema="https://easbot.cn/config.json";let u=n.replace(/^\s*\{/,`{
14
+ "$schema": "https://easbot.cn/config.json",`);await PKG.write(e,u).catch(()=>{});}let c=i.data;if(c.plugin)for(let u=0;u<c.plugin.length;u++){let l=c.plugin[u];if(l)try{c.plugin[u]=import.meta.resolve(l,e);}catch{}}return c}throw jd.error("Configuration validation failed",{path:e,issues:i.error.issues}),new xo({path:e,issues:i.error.issues})}function Ar(t,e){let n=[],o=parse$1(t,n,{allowTrailingComma:true});if(n.length>0){let r=t.split(`
15
+ `),i=n.map(c=>{let u=t.substring(0,c.offset).split(`
16
+ `),l=u.length,f=u[u.length-1]?.length??1,m=r[l-1],a=`${printParseErrorCode(c.error)} at line ${l}, column ${f}`;return m?`${a}
17
+ Line ${l}: ${m}
18
+ ${"".padStart(f+9)}^`:a}).join(`
19
+ `);throw new Ho({path:e,message:`
20
+ --- JSONC Input ---
21
+ ${t}
22
+ --- Errors ---
23
+ ${i}
24
+ --- End ---`})}let s=Rr.safeParse(o);if(s.success)return s.data;throw jd.error("Configuration validation failed",{path:e,issues:s.error.issues}),new xo({path:e,issues:s.error.issues})}var cw=a.create({service:"config"});function lw(t,e){for(let n of e){let o=t.indexOf(n);if(o!==-1)return t.slice(o+n.length)}}function dw(t){let e=ke__default.extname(t);return e.length>0?t.slice(0,-e.length):t}var uw=new PKG.Glob("{agent,agents}/**/*.md");async function Oi(t){let{Agent:e}=await import('./types-WN4LZEB5.mjs'),n={};for await(let o of uw.scan({absolute:true,followSymlinks:true,dot:true,cwd:t})){let s=await a$a.parse(o).catch(async f=>{let m=a$a.FrontmatterError.isInstance(f)?f.data.message:`Failed to parse agent ${o}`,{Session:a}=await import('./session-BHXYW2JD.mjs');await ue.publish(a.Event.Error,{error:new NamedError.Unknown({message:m}).toObject()}),cw.error("failed to load agent",{agent:o,err:f});});if(!s)continue;let i=lw(o,["/.easbot/agent/","/.easbot/agents/","/agent/","/agents/"])??ke__default.basename(o),u={name:dw(i),...s.data,prompt:s.content.trim()},l=e.safeParse(u);if(l.success){n[u.name]=l.data;continue}throw new xo({path:o,issues:l.error.issues},{cause:l.error})}return n}var gw=a.create({service:"config"});function hw(t,e){for(let n of e){let o=t.indexOf(n);if(o!==-1)return t.slice(o+n.length)}}function yw(t){let e=ke__default.extname(t);return e.length>0?t.slice(0,-e.length):t}var bw=new PKG.Glob("{command,commands}/**/*.md");async function ji(t){let{Command:e}=await import('./types-WN4LZEB5.mjs'),n={};for await(let o of bw.scan({absolute:true,followSymlinks:true,dot:true,cwd:t})){let s=await a$a.parse(o).catch(async f=>{let m=a$a.FrontmatterError.isInstance(f)?f.data.message:`Failed to parse command ${o}`,{Session:a}=await import('./session-BHXYW2JD.mjs');await ue.publish(a.Event.Error,{error:new NamedError.Unknown({message:m}).toObject()}),gw.error("failed to load command",{command:o,err:f});});if(!s)continue;let i=hw(o,["/.easbot/command/","/.easbot/commands/","/command/","/commands/"])??ke__default.basename(o),u={name:yw(i),...s.data,template:s.content.trim()},l=e.safeParse(u);if(l.success){n[u.name]=l.data;continue}throw new xo({path:o,issues:l.error.issues},{cause:l.error})}return n}var Sw=new PKG.Glob("{plugin,plugins}/*.{ts,js}");async function Li(t){let e=[];for await(let n of Sw.scan({absolute:true,followSymlinks:true,dot:true,cwd:t}))e.push(pathToFileURL(n).href);return e}function lc(t){if(t.startsWith("file://"))return ke__default.parse(new URL(t).pathname).name;let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function Ni(t){let e=new Set,n=[];for(let o of t.toReversed()){let s=lc(o);e.has(s)||(e.add(s),n.push(o));}return n.toReversed()}var _r=a.create({service:"config"}),Lm=process.env.EASBOT_TEST_MANAGED_CONFIG_DIR||Rw();function Rw(){switch(process.platform){case "darwin":return "/Library/Application Support/easbot";case "win32":return ke__default.join(process.env.ProgramData||"C:\\ProgramData","easbot");default:return "/etc/easbot"}}var Nd;function _w(){return Nd||(Nd=A.state(async()=>{let t=await et.all(),e={};for(let[s,r]of Object.entries(t))if(r.type==="wellknown"){process.env[r.key]=r.token,_r.debug("fetching remote config",{url:`${s}/.well-known/easbot`});let i=await Fetch.get(`${s}/.well-known/easbot`);if(!i.ok)throw new Error(`failed to fetch remote config from ${s}: ${i.status}`);let u=i.data.config??{};u.$schema||(u.$schema="https://easbot.cn/config.json"),e=wo(e,await Dr(JSON.stringify(u),`${s}/.well-known/easbot`)),_r.debug("loaded remote config from well-known",{url:s});}if(e=wo(e,await Ui()),!a$2.EASBOT_DISABLE_PROJECT_CONFIG)for(let s of ["easbot.json"]){let r=await Filesystem.findUp(s,A.directory,A.worktree);for(let i of r.toReversed())e=wo(e,await Io(i));}a$2.EASBOT_CONFIG&&(e=wo(e,await Io(a$2.EASBOT_CONFIG)),_r.debug("loaded custom config",{path:a$2.EASBOT_CONFIG})),e.agent=e.agent||{},e.plugin=e.plugin||[];let n=[a$1.Path.config,...a$2.EASBOT_DISABLE_PROJECT_CONFIG?[]:await Array.fromAsync(Filesystem.up({targets:[".easbot"],start:A.directory,stop:A.worktree})),...await Array.fromAsync(Filesystem.up({targets:[".easbot"],start:a$1.Path.home,stop:a$1.Path.home}))];a$2.EASBOT_CONFIG_DIR&&(n.push(a$2.EASBOT_CONFIG_DIR),_r.debug("loading config from EASBOT_CONFIG_DIR",{path:a$2.EASBOT_CONFIG_DIR}));let o=[];for(let s of unique(n)){if(s.endsWith(".easbot")||s===a$2.EASBOT_CONFIG_DIR)for(let r of ["easbot.json"])_r.debug(`loading config from ${ke__default.join(s,r)}`),e=wo(e,await Io(ke__default.join(s,r))),e.agent??(e.agent={}),e.plugin??(e.plugin=[]);o.push(iife(async()=>{await _i(s)&&await Mi(s);})),e.command=mergeDeep(e.command??{},await ji(s)),e.agent=mergeDeep(e.agent,await Oi(s)),e.plugin.push(...await Li(s));}if(a$2.EASBOT_CONFIG_CONTENT&&(e=wo(e,JSON.parse(a$2.EASBOT_CONFIG_CONTENT)),_r.debug("loaded custom config from EASBOT_CONFIG_CONTENT")),existsSync(Lm))for(let s of ["easbot.json"])e=wo(e,await Io(ke__default.join(Lm,s)));if(a$2.EASBOT_PERMISSION&&(e.permission=mergeDeep(e.permission??{},JSON.parse(a$2.EASBOT_PERMISSION))),e.tools){await import('./types-WN4LZEB5.mjs');let r={};for(let[i,c]of Object.entries(e.tools)){let u=c?"allow":"deny";if(i==="write"||i==="edit"||i==="patch"||i==="multiedit"){r.edit=u;continue}r[i]=u;}e.permission=mergeDeep(r,e.permission??{});}if(e.username||(e.username=Mc.userInfo().username),e.autoshare===true&&!e.share&&(e.share="auto"),!e.keybinds){let{Info:s}=await import('./types-WN4LZEB5.mjs');e.keybinds=s.shape.keybinds.parse({});}return a$2.EASBOT_DISABLE_AUTOCOMPACT&&(e.compaction={...e.compaction,auto:false}),a$2.EASBOT_DISABLE_PRUNE&&(e.compaction={...e.compaction,prune:{enabled:false}}),e.plugin=Ni(e.plugin??[]),{config:e,directories:n,deps:o}})),Nd}function Mr(){return _w()()}async function $d(){let t=await Mr().then(e=>e.deps);await Promise.all(t);}async function qo(){return Mr().then(t=>t.config)}async function Fd(){return Mr().then(t=>t.directories)}var Ui=lazy(async()=>{let t={},{pipe:e}=await import('remeda');return t=e({},mergeDeep(await Io(ke__default.join(a$1.Path.config,"easbot.json")))),t});async function Ud(){return Ui()}var Ow=z$1.object({enabled:z$1.boolean().optional(),timeThresholdMs:z$1.number().int().nonnegative().optional(),keepRecentTools:z$1.number().int().positive().optional(),tokenThreshold:z$1.number().int().nonnegative().optional(),protectedTools:z$1.array(z$1.string()).optional()}),jw=z$1.object({enabled:z$1.boolean().optional(),ttlMs:z$1.number().int().positive().optional(),maxSizeBytes:z$1.number().int().positive().optional(),maxEntries:z$1.number().int().positive().optional(),persist:z$1.boolean().optional()}),zd=z$1.object({auto:z$1.boolean().optional(),prune:Ow.optional(),reserved:z$1.number().int().min(0).optional(),backup:jw.optional()}),$m=a.create({service:"compaction-loader"}),Fm={enabled:true,timeThresholdMs:3e5,keepRecentTools:3,tokenThreshold:5e3,protectedTools:["skill"]},Um={enabled:true,ttlMs:3e5,maxSizeBytes:25*1024*1024,maxEntries:100,persist:false},zm={auto:true};async function zi(){try{let e=(await qo())?.compaction??{},n={prune:mergeDeep(Fm,e.prune??{}),backup:mergeDeep(Um,e.backup??{}),auto:e.auto??zm.auto,reserved:e.reserved};return $m.debug("compaction config loaded",{auto:n.auto,pruneEnabled:n?.prune?.enabled,backupEnabled:n?.backup?.enabled}),n}catch(t){return $m.warn("failed to load compaction config, using defaults",{error:String(t)}),{prune:Fm,backup:Um,auto:zm.auto}}}async function Bd(){return zi()}async function Lw(){return (await Bd()).auto!==false}async function Nw(){return (await Bd())?.prune?.enabled!==false}async function $w(){return (await Bd())?.backup?.enabled!==false}var zw=z$1.enum(e),Bw=z$1.enum(h),Hw=z$1.enum(["read","write"]),qw=z$1.object({name:z$1.string(),description:z$1.string().optional(),type:z$1.enum(["system","extension"]).default("extension"),scope:Bw.default("all"),priority:z$1.number().int().default(1e3),owner:z$1.array(z$1.string()).optional(),share:z$1.array(z$1.string()).optional(),permission:Hw.default("read"),dynamic:z$1.boolean().optional()}),Gw=z$1.record(z$1.string(),z$1.array(z$1.string())),Ww=z$1.object({maxEntries:z$1.number().int().positive().optional(),maxBytes:z$1.number().int().positive().optional(),timestampCheck:z$1.boolean().optional()}),Vw=z$1.object({charsPerToken:z$1.number().positive().optional()}),Hd=z$1.object({mode:zw.optional(),fileCache:Ww.optional(),tokenEstimation:Vw.optional(),maxTokens:z$1.number().int().nonnegative().optional(),searchMaxResults:z$1.number().int().positive().optional(),files:z$1.record(z$1.string(),qw).optional(),contextFiles:Gw.optional()}),Bm=a.create({service:"context-loader"}),Kw={maxEntries:100,maxBytes:25*1024*1024,timestampCheck:true},Jw={charsPerToken:4},Hm={mode:"general",maxTokens:2e3,searchMaxResults:3};function Yw(){return Kw}function Qw(){return Jw}async function Bi(){try{let e=(await qo()).context??{},n=mergeDeep(Hm,e);return Bm.debug("loaded context config",{context:n}),n}catch(t){return Bm.warn("failed to load context config from config, using defaults",{error:String(t)}),Hm}}var qm=a.create({service:"subagent-loader"}),dc=z$1.enum(["ephemeral","persistent"]).meta({ref:"SubAgentRunMode"}),qd=z$1.enum(["stdio","http","websocket","cli"]).meta({ref:"SubAgentTransportType"}),Gd=z$1.object({modelID:z$1.string().describe("Model ID"),providerID:z$1.string().describe("Provider ID")}).strict().meta({ref:"SubAgentModel"}),Wd=z$1.object({name:z$1.string().describe("Unique name for this agent"),role:z$1.string().describe("Agent role type (e.g., researcher, planner, coder, executor)"),transport:qd.describe("Transport type for communication"),runMode:dc.describe("Run mode: ephemeral or persistent"),uri:z$1.string().optional().describe("Connection URI for HTTP/WebSocket transport"),command:z$1.string().optional().describe("Command to execute for StdIO/CLI transport"),args:z$1.string().array().optional().describe("Command line arguments"),env:z$1.record(z$1.string(),z$1.string()).optional().describe("Environment variables to pass to subprocess"),timeout:z$1.number().int().positive().optional().describe("Timeout in milliseconds"),maxConcurrent:z$1.number().int().positive().optional().describe("Maximum concurrent instances"),cwd:z$1.string().optional().describe("Working directory for subprocess"),mcpServers:z$1.string().array().optional().describe("MCP server list to pass to subprocess"),agentConfig:z$1.object({model:Gd.optional().describe("Model configuration"),system:z$1.string().optional().describe("System prompt"),tools:z$1.record(z$1.string(),z$1.boolean()).optional().describe("Tools to enable")}).strict().optional().describe("Agent-specific configuration")}).strict().meta({ref:"SubAgentConfig"}),uc=z$1.object({enabled:z$1.boolean().optional().default(true).describe("Enable SubAgent system"),defaultRunMode:dc.optional().default("ephemeral").describe("Default run mode"),timeout:z$1.number().int().positive().optional().default(12e4).describe("Global timeout in milliseconds"),maxConcurrent:z$1.number().int().positive().optional().default(5).describe("Maximum concurrent agents"),agents:z$1.array(Wd).optional().default([]).describe("List of SubAgent configurations")}).strict().meta({ref:"SubAgentConfigSchema"}),Gm={enabled:true,defaultRunMode:"ephemeral",timeout:3e5,maxConcurrent:5,agents:[{name:"gateway",role:"gateway",transport:"stdio",runMode:"persistent",command:"easbot",args:["acp","--channel","stdio"],timeout:1800*1e3,env:{EASBOT_RUN_MODE:"persistent"}},{name:"task_general",role:"executor",transport:"stdio",runMode:"ephemeral",command:"easbot",args:["acp","--channel","stdio"],timeout:1800*1e3,env:{EASBOT_RUN_MODE:"ephemeral"}}]};async function Or(){try{let e=(await qo())?.subagent??{},{agents:n,...o}=Gm;e.agents=n.concat(e?.agents??[]);let s=mergeDeep(o,e);return qm.debug("subagent config loaded",{enabled:s.enabled,agentCount:s.agents.length}),s}catch(t){return qm.warn("failed to load subagent config, using defaults",{error:String(t)}),Gm}}async function ex(){return Or()}var Fs=z$1.string().meta({$ref:"https://models.dev/model-schema.json#/$defs/Model"}),pc=z$1.object({type:z$1.literal("local").describe("Type of MCP server connection"),command:z$1.string().describe("Command to run the MCP server"),args:z$1.string().array().optional().describe("Arguments to pass to the command"),env:z$1.record(z$1.string(),z$1.string()).optional().describe("Environment variables to set when running the MCP server"),enabled:z$1.boolean().optional().describe("Enable or disable the MCP server on startup"),timeout:z$1.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified."),description:z$1.string().optional().describe("Description of the MCP server"),scope:z$1.enum(h).optional().default(g.All).describe("Context mode scope for the MCP server: all/general/coder. Defaults to all.")}).strict().meta({ref:"McpLocalConfig"}),mc=z$1.object({clientId:z$1.string().optional().describe("OAuth client ID. If not provided, dynamic client registration (RFC 7591) will be attempted."),clientSecret:z$1.string().optional().describe("OAuth client secret (if required by the authorization server)"),scope:z$1.string().optional().describe("OAuth scopes to request during authorization")}).strict().meta({ref:"McpOAuthConfig"}),fc=z$1.object({type:z$1.literal("remote").describe("Type of MCP server connection"),url:z$1.string().describe("URL of the remote MCP server"),enabled:z$1.boolean().optional().describe("Enable or disable the MCP server on startup"),headers:z$1.record(z$1.string(),z$1.string()).optional().describe("Headers to send with the request"),oauth:z$1.union([mc,z$1.literal(false)]).optional().describe("OAuth authentication configuration for the MCP server. Set to false to disable OAuth auto-detection."),timeout:z$1.number().int().positive().optional().describe("Timeout in ms for MCP server requests. Defaults to 5000 (5 seconds) if not specified."),description:z$1.string().optional().describe("Description of the MCP server"),scope:z$1.enum([g.All,g.General,g.Coder]).optional().default(g.All).describe("Context mode scope for the MCP server: all/general/coder. Defaults to all.")}).strict().meta({ref:"McpRemoteConfig"}),gc=z$1.discriminatedUnion("type",[pc,fc]),po=z$1.enum(["ask","allow","deny"]).meta({ref:"PermissionActionConfig"}),hc=z$1.record(z$1.string(),po).meta({ref:"PermissionObjectConfig"}),wt=z$1.union([po,hc]).meta({ref:"PermissionRuleConfig"}),nx=t=>typeof t=="object"&&t!==null&&!Array.isArray(t)?{__originalKeys:Object.keys(t),...t}:t,ox=t=>{if(typeof t=="string")return {"*":t};let e=t,{__originalKeys:n,...o}=e;if(!n)return o;let s={};for(let r of n)r in o&&(s[r]=o[r]);return s},Hi=z$1.preprocess(nx,z$1.object({__originalKeys:z$1.string().array().optional(),read:wt.optional(),edit:wt.optional(),glob:wt.optional(),grep:wt.optional(),list:wt.optional(),bash:wt.optional(),task:wt.optional(),external_directory:wt.optional(),todo:po.optional(),question:po.optional(),webfetch:po.optional(),websearch:po.optional(),codesearch:po.optional(),lsp:wt.optional(),doom_loop:po.optional(),skill:wt.optional(),pty_session:wt.optional(),pty_manage:wt.optional(),write:wt.optional(),multiedit:wt.optional(),note:wt.optional(),memory:wt.optional(),codebase:wt.optional(),agent_client_chat:wt.optional(),gateway_channel:wt.optional(),apply_patch:wt.optional(),batch:wt.optional(),plan:wt.optional()}).catchall(wt).or(po)).transform(ox).meta({ref:"PermissionConfig"}),yc=z$1.object({template:z$1.string(),description:z$1.string().optional(),agent:z$1.string().optional(),model:Fs.optional(),subtask:z$1.boolean().optional(),scope:z$1.enum(h).optional().describe("Context mode scope")}),bc=z$1.object({paths:z$1.array(z$1.string()).optional().describe("Additional paths to skill folders"),urls:z$1.array(z$1.string()).optional().describe("URLs to fetch skills from (e.g., https://example.com/.well-known/skills/)")}),vo=z$1.object({model:Fs.optional(),variant:z$1.string().optional().describe("Default model variant for this agent (applies only when using the agent's configured model)."),temperature:z$1.number().optional(),top_p:z$1.number().optional(),prompt:z$1.string().optional(),tools:z$1.record(z$1.string(),z$1.boolean()).optional().describe("@deprecated Use 'permission' field instead"),disable:z$1.boolean().optional(),description:z$1.string().optional().describe("Description of when to use the agent"),mode:z$1.enum(["subagent","primary","all"]).optional(),hidden:z$1.boolean().optional().describe("Hide this subagent from the @ autocomplete menu (default: false, only applies to mode: subagent)"),options:z$1.record(z$1.string(),z$1.any()).optional(),color:z$1.union([z$1.string().regex(/^#[0-9a-fA-F]{6}$/,"Invalid hex color format"),z$1.enum(["primary","secondary","accent","success","warning","error","info"])]).optional().describe("Hex color code (e.g., #FF5733) or theme color (e.g., primary)"),steps:z$1.number().int().positive().optional().describe("Maximum number of agentic iterations before forcing text-only response"),maxSteps:z$1.number().int().positive().optional().describe("@deprecated Use 'steps' field instead."),permission:Hi.optional()}).catchall(z$1.any()).transform((t,e)=>{let n=new Set(["name","model","variant","prompt","description","temperature","top_p","mode","hidden","color","steps","maxSteps","options","permission","disable","tools"]),o={...t.options};for(let[i,c]of Object.entries(t))n.has(i)||(o[i]=c);let s={};for(let[i,c]of Object.entries(t.tools??{})){let u=c?"allow":"deny";i==="write"||i==="edit"||i==="patch"||i==="multiedit"?s.edit=u:s[i]=u;}Object.assign(s,t.permission);let r=t.steps??t.maxSteps;return {...t,options:o,permission:s,steps:r}}).meta({ref:"AgentConfig"}),wc=z$1.object({leader:z$1.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),app_exit:z$1.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"),editor_open:z$1.string().optional().default("<leader>e").describe("Open external editor"),theme_list:z$1.string().optional().default("<leader>t").describe("List available themes"),sidebar_toggle:z$1.string().optional().default("<leader>b").describe("Toggle sidebar"),scrollbar_toggle:z$1.string().optional().default("none").describe("Toggle session scrollbar"),username_toggle:z$1.string().optional().default("none").describe("Toggle username visibility"),status_view:z$1.string().optional().default("<leader>s").describe("View status"),session_export:z$1.string().optional().default("<leader>x").describe("Export session to editor"),session_new:z$1.string().optional().default("<leader>n").describe("Create a new session"),session_list:z$1.string().optional().default("<leader>l").describe("List all sessions"),session_timeline:z$1.string().optional().default("<leader>g").describe("Show session timeline"),session_fork:z$1.string().optional().default("none").describe("Fork session from message"),session_rename:z$1.string().optional().default("ctrl+r").describe("Rename session"),session_delete:z$1.string().optional().default("ctrl+d").describe("Delete session"),stash_delete:z$1.string().optional().default("ctrl+d").describe("Delete stash entry"),model_provider_list:z$1.string().optional().default("ctrl+a").describe("Open provider list from model dialog"),model_favorite_toggle:z$1.string().optional().default("ctrl+f").describe("Toggle model favorite status"),session_share:z$1.string().optional().default("none").describe("Share current session"),session_unshare:z$1.string().optional().default("none").describe("Unshare current session"),session_interrupt:z$1.string().optional().default("escape").describe("Interrupt current session"),session_compact:z$1.string().optional().default("<leader>c").describe("Compact the session"),messages_page_up:z$1.string().optional().default("pageup,ctrl+alt+b").describe("Scroll messages up by one page"),messages_page_down:z$1.string().optional().default("pagedown,ctrl+alt+f").describe("Scroll messages down by one page"),messages_line_up:z$1.string().optional().default("ctrl+alt+y").describe("Scroll messages up by one line"),messages_line_down:z$1.string().optional().default("ctrl+alt+e").describe("Scroll messages down by one line"),messages_half_page_up:z$1.string().optional().default("ctrl+alt+u").describe("Scroll messages up by half page"),messages_half_page_down:z$1.string().optional().default("ctrl+alt+d").describe("Scroll messages down by half page"),messages_first:z$1.string().optional().default("ctrl+g,home").describe("Navigate to first message"),messages_last:z$1.string().optional().default("ctrl+alt+g,end").describe("Navigate to last message"),messages_next:z$1.string().optional().default("none").describe("Navigate to next message"),messages_previous:z$1.string().optional().default("none").describe("Navigate to previous message"),messages_last_user:z$1.string().optional().default("none").describe("Navigate to last user message"),messages_copy:z$1.string().optional().default("<leader>y").describe("Copy message"),messages_undo:z$1.string().optional().default("<leader>u").describe("Undo message"),messages_redo:z$1.string().optional().default("<leader>r").describe("Redo message"),messages_toggle_conceal:z$1.string().optional().default("<leader>h").describe("Toggle code block concealment in messages"),tool_details:z$1.string().optional().default("none").describe("Toggle tool details visibility"),model_list:z$1.string().optional().default("<leader>m").describe("List available models"),model_cycle_recent:z$1.string().optional().default("f2").describe("Next recently used model"),model_cycle_recent_reverse:z$1.string().optional().default("shift+f2").describe("Previous recently used model"),model_cycle_favorite:z$1.string().optional().default("none").describe("Next favorite model"),model_cycle_favorite_reverse:z$1.string().optional().default("none").describe("Previous favorite model"),command_list:z$1.string().optional().default("ctrl+p").describe("List available commands"),agent_list:z$1.string().optional().default("<leader>a").describe("List agents"),agent_cycle:z$1.string().optional().default("tab").describe("Next agent"),agent_cycle_reverse:z$1.string().optional().default("shift+tab").describe("Previous agent"),variant_cycle:z$1.string().optional().default("ctrl+t").describe("Cycle model variants"),input_clear:z$1.string().optional().default("ctrl+c").describe("Clear input field"),input_paste:z$1.string().optional().default("ctrl+v").describe("Paste from clipboard"),input_submit:z$1.string().optional().default("return").describe("Submit input"),input_newline:z$1.string().optional().default("shift+return,ctrl+return,alt+return,ctrl+j").describe("Insert newline in input"),input_move_left:z$1.string().optional().default("left,ctrl+b").describe("Move cursor left in input"),input_move_right:z$1.string().optional().default("right,ctrl+f").describe("Move cursor right in input"),input_move_up:z$1.string().optional().default("up").describe("Move cursor up in input"),input_move_down:z$1.string().optional().default("down").describe("Move cursor down in input"),input_select_left:z$1.string().optional().default("shift+left").describe("Select left in input"),input_select_right:z$1.string().optional().default("shift+right").describe("Select right in input"),input_select_up:z$1.string().optional().default("shift+up").describe("Select up in input"),input_select_down:z$1.string().optional().default("shift+down").describe("Select down in input"),input_line_home:z$1.string().optional().default("ctrl+a").describe("Move to start of line in input"),input_line_end:z$1.string().optional().default("ctrl+e").describe("Move to end of line in input"),input_select_line_home:z$1.string().optional().default("ctrl+shift+a").describe("Select to start of line in input"),input_select_line_end:z$1.string().optional().default("ctrl+shift+e").describe("Select to end of line in input"),input_visual_line_home:z$1.string().optional().default("alt+a").describe("Move to start of visual line in input"),input_visual_line_end:z$1.string().optional().default("alt+e").describe("Move to end of visual line in input"),input_select_visual_line_home:z$1.string().optional().default("alt+shift+a").describe("Select to start of visual line in input"),input_select_visual_line_end:z$1.string().optional().default("alt+shift+e").describe("Select to end of visual line in input"),input_buffer_home:z$1.string().optional().default("home").describe("Move to start of buffer in input"),input_buffer_end:z$1.string().optional().default("end").describe("Move to end of buffer in input"),input_select_buffer_home:z$1.string().optional().default("shift+home").describe("Select to start of buffer in input"),input_select_buffer_end:z$1.string().optional().default("shift+end").describe("Select to end of buffer in input"),input_delete_line:z$1.string().optional().default("ctrl+shift+d").describe("Delete line in input"),input_delete_to_line_end:z$1.string().optional().default("ctrl+k").describe("Delete to end of line in input"),input_delete_to_line_start:z$1.string().optional().default("ctrl+u").describe("Delete to start of line in input"),input_backspace:z$1.string().optional().default("backspace,shift+backspace").describe("Backspace in input"),input_delete:z$1.string().optional().default("ctrl+d,delete,shift+delete").describe("Delete character in input"),input_undo:z$1.string().optional().default("ctrl+-,super+z").describe("Undo in input"),input_redo:z$1.string().optional().default("ctrl+.,super+shift+z").describe("Redo in input"),input_word_forward:z$1.string().optional().default("alt+f,alt+right,ctrl+right").describe("Move word forward in input"),input_word_backward:z$1.string().optional().default("alt+b,alt+left,ctrl+left").describe("Move word backward in input"),input_select_word_forward:z$1.string().optional().default("alt+shift+f,alt+shift+right").describe("Select word forward in input"),input_select_word_backward:z$1.string().optional().default("alt+shift+b,alt+shift+left").describe("Select word backward in input"),input_delete_word_forward:z$1.string().optional().default("alt+d,alt+delete,ctrl+delete").describe("Delete word forward in input"),input_delete_word_backward:z$1.string().optional().default("ctrl+w,ctrl+backspace,alt+backspace").describe("Delete word backward in input"),history_previous:z$1.string().optional().default("up").describe("Previous history item"),history_next:z$1.string().optional().default("down").describe("Next history item"),session_child_cycle:z$1.string().optional().default("<leader>right").describe("Next child session"),session_child_cycle_reverse:z$1.string().optional().default("<leader>left").describe("Previous child session"),session_parent:z$1.string().optional().default("<leader>up").describe("Go to parent session"),terminal_suspend:z$1.string().optional().default("ctrl+z").describe("Suspend terminal"),terminal_title_toggle:z$1.string().optional().default("none").describe("Toggle terminal title"),tips_toggle:z$1.string().optional().default("<leader>h").describe("Toggle tips on home screen"),display_thinking:z$1.string().optional().default("none").describe("Toggle thinking blocks visibility")}).strict().meta({ref:"KeybindsConfig"}),xc=z$1.object({scroll_speed:z$1.number().min(.001).optional().describe("TUI scroll speed"),scroll_acceleration:z$1.object({enabled:z$1.boolean().describe("Enable scroll acceleration")}).optional().describe("Scroll acceleration settings"),diff_style:z$1.enum(["auto","stacked"]).optional().describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column")}),Ic=z$1.object({port:z$1.number().int().positive().optional().describe("Port to listen on"),hostname:z$1.string().optional().describe("Hostname to listen on"),mdns:z$1.boolean().optional().describe("Enable mDNS service discovery"),mdnsDomain:z$1.string().optional().describe("Custom domain name for mDNS service (default: easbot.local)"),cors:z$1.array(z$1.string()).optional().describe("Additional domains to allow for CORS")}).strict().meta({ref:"ServerConfig"}),vc=z$1.enum(["auto","stretch"]).meta({ref:"LayoutConfig"}),Sc=a$3.Provider.partial().extend({whitelist:z$1.array(z$1.string()).optional(),blacklist:z$1.array(z$1.string()).optional(),models:z$1.record(z$1.string(),a$3.Model.partial().extend({variants:z$1.record(z$1.string(),z$1.object({disabled:z$1.boolean().optional().describe("Disable this variant for the model")}).catchall(z$1.any())).optional().describe("Variant-specific configuration")})).optional(),options:z$1.object({apiKey:z$1.string().optional(),baseURL:z$1.string().optional(),enterpriseUrl:z$1.string().optional().describe("GitHub Enterprise URL for copilot authentication"),setCacheKey:z$1.boolean().optional().describe("Enable promptCacheKey for this provider (default false)"),timeout:z$1.union([z$1.number().int().positive().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout."),z$1.literal(false).describe("Disable timeout for this provider entirely.")]).optional().describe("Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.")}).catchall(z$1.any()).optional()}).strict().meta({ref:"ProviderConfig"}),Rr=z$1.object({$schema:z$1.string().optional().describe("JSON schema reference for configuration validation"),theme:z$1.string().optional().describe("Theme name to use for the interface"),keybinds:wc.optional().describe("Custom keybind configurations"),logLevel:a.Level.optional().describe("Log level"),tui:xc.optional().describe("TUI specific settings"),server:Ic.optional().describe("Server configuration for easbot serve and web commands"),command:z$1.record(z$1.string(),yc).optional().describe("Command configuration, see https://easbot.cn/docs/commands"),skills:bc.optional().describe("Additional skill folder paths"),watcher:z$1.object({ignore:z$1.array(z$1.string()).optional()}).optional(),plugin:z$1.string().array().optional(),snapshot:z$1.boolean().optional(),share:z$1.enum(["manual","auto","disabled"]).optional().describe("Control sharing behavior:'manual' allows manual sharing via commands, 'auto' enables automatic sharing, 'disabled' disables all sharing"),autoshare:z$1.boolean().optional().describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"),autoupdate:z$1.union([z$1.boolean(),z$1.literal("notify")]).optional().describe("Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications"),disabled_providers:z$1.array(z$1.string()).optional().describe("Disable providers that are loaded automatically"),enabled_providers:z$1.array(z$1.string()).optional().describe("When set, ONLY these providers will be enabled. All other providers will be ignored"),model:Fs.describe("Model to use in the format of provider/model, eg anthropic/claude-2").optional(),small_model:Fs.describe("Small model to use for tasks like title generation in the format of provider/model").optional(),default_agent:z$1.string().optional().describe("Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid."),username:z$1.string().optional().describe("Custom username to display in conversations instead of system username"),agent:z$1.object({plan:vo.optional(),build:vo.optional(),general:vo.optional(),explore:vo.optional(),title:vo.optional(),summary:vo.optional(),compaction:vo.optional()}).catchall(vo).optional().describe("Agent configuration, see https://easbot.cn/docs/agents"),provider:z$1.record(z$1.string(),Sc).optional().describe("Custom provider configurations and model overrides"),mcp:z$1.record(z$1.string(),z$1.union([gc,z$1.object({enabled:z$1.boolean()}).strict()])).optional().describe("MCP (Model Context Protocol) server configurations"),acp:Ed.optional(),gateway:a$4.optional().describe("Gateway configuration for multi-channel communication"),subagent:uc.optional().describe("SubAgent system configuration"),formatter:z$1.union([z$1.literal(false),z$1.record(z$1.string(),z$1.object({disabled:z$1.boolean().optional(),command:z$1.array(z$1.string()).optional(),environment:z$1.record(z$1.string(),z$1.string()).optional(),extensions:z$1.array(z$1.string()).optional()}))]).optional(),lsp:z$1.union([z$1.literal(false),z$1.record(z$1.string(),z$1.union([z$1.object({disabled:z$1.literal(true)}),z$1.object({command:z$1.array(z$1.string()),extensions:z$1.array(z$1.string()).optional(),disabled:z$1.boolean().optional(),env:z$1.record(z$1.string(),z$1.string()).optional(),initialization:z$1.record(z$1.string(),z$1.any()).optional()})]))]).optional().refine(t=>{if(!t||typeof t=="boolean")return true;let e=new Set(Object.values(_o).filter(n=>"id"in n&&"extensions"in n&&"spawn"in n).map(n=>n.id));return Object.entries(t).every(([n,o])=>o.disabled||e.has(n)?true:!!o.extensions)},{error:"For custom LSP servers, 'extensions' array is required."}),instructions:z$1.array(z$1.string()).optional().describe("Additional instruction files or patterns to include"),layout:vc.optional().describe("@deprecated Always uses stretch layout."),permission:Hi.optional(),tools:z$1.record(z$1.string(),z$1.boolean()).optional(),enterprise:z$1.object({url:z$1.string().optional().describe("Enterprise URL")}).optional(),compaction:zd.optional(),context:Hd.optional(),embedding_model:z$1.string().optional().describe("Embedding model, defaults to easbot-local/bge-base-zh-v1.5"),graph_model:z$1.string().optional().describe("Graph model for entity and relation extraction, defaults to easbot-local/qwen2.5-7b-instruct"),rerank_model:z$1.string().optional().describe("Rerank model for search result reranking, defaults to easbot-local/qwen2.5-7b-instruct"),codebase:sc.optional(),memory:rc.optional(),note:ic.optional(),local:z$1.string().optional(),timezone:z$1.string().optional(),experimental:z$1.object({disable_paste_summary:z$1.boolean().optional(),batch_tool:z$1.boolean().optional().describe("Enable the batch tool"),openTelemetry:z$1.boolean().optional().describe("Enable OpenTelemetry spans for AI SDK calls (using the 'experimental_telemetry' flag)"),primary_tools:z$1.array(z$1.string()).optional().describe("Tools that should only be available to primary agents."),continue_loop_on_deny:z$1.boolean().optional().describe("Continue the agent loop when a tool call is denied"),mcp_timeout:z$1.number().int().positive().optional().describe("Timeout in milliseconds for model context protocol (MCP) requests")}).optional()}).strict().meta({ref:"Config"});var yt=new EventEmitter;function lx(){let t=["easbot.json"].map(e=>ke__default.join(a$1.Path.config,e));for(let e of t)if(existsSync(e))return e;return t[0]}function dx(t){return !!t&&typeof t=="object"&&!Array.isArray(t)}function Km(t,e,n=[]){if(!dx(e)){let o=modify(t,n,e,{formattingOptions:{insertSpaces:true,tabSize:2}});return applyEdits(t,o)}return Object.entries(e).reduce((o,[s,r])=>r===void 0?o:Km(o,r,[...n,s]),t)}async function Vd(t){let e=ke__default.join(A.directory,"config.json"),n=await Io(e);await PKG.write(e,JSON.stringify(mergeDeep(n,t),null,2)),await A.dispose();}async function Kd(t){let{global:e}=await import('./loader-YOPK5OTL.mjs'),n=lx();if(!n)throw new Ho({path:"global",message:"Could not determine global config file path"});let o=await PKG.file(n).text().catch(r=>{if(r.code==="ENOENT")return "{}";throw new Ho({path:n},{cause:r})}),s=await(async()=>{if(!n.endsWith(".jsonc")){let c=Ar(o,n),u=mergeDeep(c,t);return await PKG.write(n,JSON.stringify(u,null,2)),u}let r=Km(o,t),i=Ar(r,n);return await PKG.write(n,r),i})();return e.reset(),A.disposeAll().catch(()=>{}).finally(()=>{yt.emit("event",{directory:"global",payload:{type:a$b.Disposed.type,properties:{}}});}),s}var jr=a.create({service:"adapter-loader"});async function qi(){try{let e=(await he.get())?.acp;if(!e){jr.debug("No ACP config found in Config.Info");return}let o={server:Jm(e.server),clients:e.clients};return jr.info("ACP config loaded",{config:o}),o}catch(t){jr.error("Failed to load ACP config",{error:t});return}}async function kc(){let t=await qi();return t?.server?t.server:Jm(Pm)}async function px(){return (await qi())?.clients}function Jm(t){let e={...t};if(process.env.ACP_CHANNEL){let n=process.env.ACP_CHANNEL.toLowerCase();["stdio","http","websocket"].includes(n)?e.channel=n:jr.warn("Invalid ACP_CHANNEL environment variable",{value:process.env.ACP_CHANNEL});}if(process.env.ACP_PORT){let n=parseInt(process.env.ACP_PORT,10);!Number.isNaN(n)&&n>0&&n<=65535?e.port=n:jr.warn("Invalid ACP_PORT environment variable",{value:process.env.ACP_PORT});}if(process.env.ACP_HOSTNAME&&(e.hostname=process.env.ACP_HOSTNAME),process.env.ACP_TIMEOUT){let n=parseInt(process.env.ACP_TIMEOUT,10);!Number.isNaN(n)&&n>0?e.timeout=n:jr.warn("Invalid ACP_TIMEOUT environment variable",{value:process.env.ACP_TIMEOUT});}return process.env.ACP_ENABLED&&(e.enabled=process.env.ACP_ENABLED.toLowerCase()==="true"),process.env.ACP_AGENT_ID&&(e.agentId=process.env.ACP_AGENT_ID),e}async function Jd(){return (await kc()).agent}async function mx(){return (await Jd())?.model}async function fx(){return (await Jd())?.agent}var yx=NamedError.create("ConfigDirectoryTypoError",z$1.object({path:z$1.string(),dir:z$1.string(),suggestion:z$1.string()})),bx=yx,he;(F=>(F.ModelId=Fs,F.McpLocal=pc,F.McpOAuth=mc,F.McpRemote=fc,F.Mcp=gc,F.PermissionAction=po,F.PermissionObject=hc,F.PermissionRule=wt,F.Permission=Hi,F.Command=yc,F.Skills=bc,F.Agent=vo,F.Keybinds=wc,F.TUI=xc,F.Server=Ic,F.Layout=vc,F.Provider=Sc,F.Info=Rr,F.mergeConfigConcatArrays=wo,F.needsInstall=_i,F.installDependencies=Mi,F.loadFile=Io,F.load=Dr,F.parseConfig=Ar,F.JsonError=Ho,F.InvalidError=xo,F.loadAgent=Oi,F.loadCommand=ji,F.loadPlugin=Li,F.getPluginName=lc,F.deduplicatePlugins=Ni,F.loadNote=kr,F.loadCodebase=Pr,F.loadMemory=Er,F.loadKnowledge=Rd,F.update=Vd,F.updateGlobal=Kd,F.state=Mr,F.waitForDependencies=$d,F.get=qo,F.directories=Fd,F.global=Ui,F.getGlobal=Ud,F.loadACPConfig=qi,F.getACPServerConfig=kc,F.loadCompaction=zi,F.loadContextConfig=Bi,F.loadGatewayConfig=b,F.loadSubAgentConfig=Or,F.ConfigDirectoryTypoError=bx))(he||(he={}));var Ym={".abap":"abap",".bat":"bat",".bib":"bibtex",".bibtex":"bibtex",".clj":"clojure",".cljs":"clojure",".cljc":"clojure",".edn":"clojure",".coffee":"coffeescript",".c":"c",".cpp":"cpp",".cxx":"cpp",".cc":"cpp",".c++":"cpp",".cs":"csharp",".css":"css",".d":"d",".pas":"pascal",".pascal":"pascal",".diff":"diff",".patch":"diff",".dart":"dart",".dockerfile":"dockerfile",".ex":"elixir",".exs":"elixir",".erl":"erlang",".ets":"typescript",".hrl":"erlang",".fs":"fsharp",".fsi":"fsharp",".fsx":"fsharp",".fsscript":"fsharp",".gitcommit":"git-commit",".gitrebase":"git-rebase",".go":"go",".groovy":"groovy",".gleam":"gleam",".hbs":"handlebars",".handlebars":"handlebars",".hs":"haskell",".lhs":"haskell",".html":"html",".htm":"html",".ini":"ini",".java":"java",".js":"javascript",".kt":"kotlin",".kts":"kotlin",".jsx":"javascriptreact",".json":"json",".tex":"latex",".latex":"latex",".less":"less",".lua":"lua",".makefile":"makefile",makefile:"makefile",".md":"markdown",".markdown":"markdown",".m":"objective-c",".mm":"objective-cpp",".pl":"perl",".pm":"perl",".pm6":"perl6",".php":"php",".ps1":"powershell",".psm1":"powershell",".pug":"jade",".jade":"jade",".py":"python",".r":"r",".cshtml":"razor",".razor":"razor",".rb":"ruby",".rake":"ruby",".gemspec":"ruby",".ru":"ruby",".erb":"erb",".html.erb":"erb",".js.erb":"erb",".css.erb":"erb",".json.erb":"erb",".rs":"rust",".scss":"scss",".sass":"sass",".scala":"scala",".shader":"shaderlab",".sh":"shellscript",".bash":"shellscript",".zsh":"shellscript",".ksh":"shellscript",".sql":"sql",".svelte":"svelte",".swift":"swift",".ts":"typescript",".tsx":"typescriptreact",".mts":"typescript",".cts":"typescript",".mtsx":"typescriptreact",".ctsx":"typescriptreact",".xml":"xml",".xsl":"xsl",".yaml":"yaml",".yml":"yaml",".mjs":"javascript",".cjs":"javascript",".vue":"vue",".zig":"zig",".zon":"zig",".astro":"astro",".ml":"ocaml",".mli":"ocaml",".tf":"terraform",".tfvars":"terraform-vars",".hcl":"hcl",".nix":"nix",".typ":"typst",".typc":"typst"};var Cx=150;a$2.EASBOT_LSP_INIT_TIMEOUT;var Qm=a$2.EASBOT_LSP_DIAGNOSTICS_TIMEOUT,kx=1,Px=2,Ex=2,Ec;(d=>{let t=a.create({service:"lsp.client"}),e=new Map;function n(h){return e.get(h)}d.getActiveClient=n;function o(h){return e.has(h)}d.hasActiveClient=o;function s(h){e.delete(h);}d.removeActiveClient=s,d.InitializeError=NamedError.create("LSPInitializeError",z$1.object({serverID:z$1.string()})),d.Event={Diagnostics:a$5.define("lsp.client.diagnostics",z$1.object({serverID:z$1.string(),path:z$1.string()}))};function c(h){if(!h)return;let w=h.textDocumentSync;return typeof w=="number"?w:w?.change}async function u(h,w){let g=h.server.capabilities;if(!g)return;let b=pathToFileURL(h.root+"/").href,v=3e4,k=async()=>{if(g.workspace?.symbolProvider===void 0)try{await withTimeout(w.sendRequest("workspace/symbol",{query:""}),v),g.workspace=g.workspace||{},g.workspace.symbolProvider=!0,t.debug("probed workspaceSymbol capability",{serverID:h.serverID});}catch(x){let I=x instanceof Error?x.message:String(x);(I.includes("methodNotFound")||I.includes("not found")||I.includes("undefined method"))&&(g.workspace=g.workspace||{},g.workspace.symbolProvider=false,t.debug("probed workspaceSymbol capability: not supported",{serverID:h.serverID}));}},S=async()=>{if(g.implementationProvider===void 0)try{await withTimeout(w.sendRequest("textDocument/implementation",{textDocument:{uri:b},position:{line:0,character:0}}),v),g.implementationProvider=!0,t.debug("probed implementation capability",{serverID:h.serverID});}catch(x){let I=x instanceof Error?x.message:String(x);(I.includes("methodNotFound")||I.includes("not found")||I.includes("undefined method"))&&(g.implementationProvider=false,t.debug("probed implementation capability: not supported",{serverID:h.serverID}));}},y=async()=>{if(g.callHierarchyProvider===void 0)try{await withTimeout(w.sendRequest("textDocument/prepareCallHierarchy",{textDocument:{uri:b},position:{line:0,character:0}}),v),g.callHierarchyProvider=!0,t.debug("probed callHierarchy capability",{serverID:h.serverID});}catch(x){let I=x instanceof Error?x.message:String(x);(I.includes("methodNotFound")||I.includes("not found")||I.includes("undefined method"))&&(g.callHierarchyProvider=false,t.debug("probed callHierarchy capability: not supported",{serverID:h.serverID}));}};setTimeout(()=>{k().catch(()=>{}),S().catch(()=>{}),y().catch(()=>{});},100);}function l(h){let w=h.split(/\r\n|\r|\n/);return {line:w.length-1,character:w.at(-1)?.length??0}}function f(h){let w=new Set;return h.filter(g=>{let b=JSON.stringify({code:g.code,severity:g.severity,message:g.message,source:g.source,range:g.range});return w.has(b)?false:(w.add(b),true)})}function m(h,w){return w?w.split(".").reduce((b,v)=>{if(!(!b||typeof b!="object"||!(v in b)))return b[v]},h)??null:h??null}function a$1(h){return h==="typescript"}async function p(h){let w=t.clone().tag("serverID",h.serverID);w.info("starting client");let g=`${h.serverID}:${h.root}`;if(e.has(g)){let N=e.get(g);if(N.createdAt>Date.now()-5e3)return w.warn("duplicate LSP client detected, reusing existing client",{clientKey:g}),N;w.info("removing stale LSP client",{clientKey:g});try{await N.shutdown();}catch{}e.delete(g);}let b=h.initTimeout??_o.getServerInitTimeout(h.serverID),v=createMessageConnection(new StreamMessageReader(h.server.process.stdout),new StreamMessageWriter(h.server.process.stdin));h.server.process.stderr?.on("data",N=>{let K=N.toString().trim();K&&w.debug("server stderr",{text:K.slice(0,1e3)});});let k=new Map,S=new Map,y=new Map,x=N=>f([...k.get(N)??[],...S.get(N)??[]]),I=(N,K)=>{k.set(N,K),ue.publish(d.Event.Diagnostics,{path:N,serverID:h.serverID});};v.onNotification("textDocument/publishDiagnostics",N=>{let K=Filesystem.normalize(fileURLToPath(N.uri));if(K){if(w.info("textDocument/publishDiagnostics",{path:K,count:N.diagnostics.length,version:N.version}),y.set(K,{at:Date.now(),version:typeof N.version=="number"?N.version:void 0}),a$1(h.serverID)&&!k.has(K)){k.set(K,N.diagnostics);return}I(K,N.diagnostics);}}),v.onRequest("window/workDoneProgress/create",N=>(w.info("window/workDoneProgress/create",N),null)),v.onRequest("workspace/configuration",async N=>(N.items??[]).map(te=>m(h.server.initialization,te.section))),v.onRequest("client/registerCapability",async()=>{}),v.onRequest("client/unregisterCapability",async()=>{}),v.onRequest("workspace/workspaceFolders",async()=>[{name:"workspace",uri:pathToFileURL(h.root).href}]),v.onRequest("workspace/diagnostic/refresh",async()=>null),v.listen(),w.info("sending initialize",{timeout:b});let P=await withTimeout(v.sendRequest("initialize",{rootUri:pathToFileURL(h.root).href,processId:h.server.process.pid,workspaceFolders:[{name:"workspace",uri:pathToFileURL(h.root).href}],initializationOptions:{...h.server.initialization},capabilities:{window:{workDoneProgress:true},workspace:{configuration:true,didChangeWatchedFiles:{dynamicRegistration:true},diagnostics:{refreshSupport:false}},textDocument:{synchronization:{didOpen:true,didChange:true},publishDiagnostics:{versionSupport:false}}}}),b).catch(N=>{throw w.error("initialize error",{error:N,timeout:b}),new d.InitializeError({serverID:h.serverID},{cause:N})}),T=c(P.capabilities);h.server.capabilities=P.capabilities,u(h,v).catch(()=>{}),await v.sendNotification("initialized",{}),h.server.initialization&&await v.sendNotification("workspace/didChangeConfiguration",{settings:h.server.initialization});let M={},j={root:h.root,get serverID(){return h.serverID},get connection(){return v},get capabilities(){return h.server.capabilities},notify:{async open(N){N.path=ke__default.isAbsolute(N.path)?N.path:ke__default.resolve(A.directory,N.path);let K=await Filesystem.readText(N.path),te=ke__default.extname(N.path),U=Ym[te]??"plaintext",_=M[N.path];if(_!==void 0){w.info("workspace/didChangeWatchedFiles",N),await v.sendNotification("workspace/didChangeWatchedFiles",{changes:[{uri:pathToFileURL(N.path).href,type:Px}]});let D=_.version+1;return M[N.path]={version:D,text:K},w.info("textDocument/didChange",{path:N.path,version:D}),await v.sendNotification("textDocument/didChange",{textDocument:{uri:pathToFileURL(N.path).href,version:D},contentChanges:T===Ex?[{range:{start:{line:0,character:0},end:l(_.text)},text:K}]:[{text:K}]}),D}return w.info("workspace/didChangeWatchedFiles",N),await v.sendNotification("workspace/didChangeWatchedFiles",{changes:[{uri:pathToFileURL(N.path).href,type:kx}]}),w.info("textDocument/didOpen",N),k.delete(N.path),S.delete(N.path),await v.sendNotification("textDocument/didOpen",{textDocument:{uri:pathToFileURL(N.path).href,languageId:U,version:0,text:K}}),M[N.path]={version:0,text:K},0}},get diagnostics(){let N=new Map;for(let K of new Set([...k.keys(),...S.keys()]))N.set(K,x(K));return N},async waitForDiagnostics(N){let K=Filesystem.normalize(ke__default.isAbsolute(N.path)?N.path:ke__default.resolve(A.directory,N.path));w.info("waiting for diagnostics",{path:K,timeout:Qm});let te,U;return await withTimeout(new Promise(_=>{te=ue.subscribe(d.Event.Diagnostics,D=>{D.properties.path===K&&D.properties.serverID===j.serverID&&(U&&clearTimeout(U),U=setTimeout(()=>{w.info("got diagnostics",{path:K}),te?.(),_();},Cx));});}),Qm).catch(()=>{}).finally(()=>{U&&clearTimeout(U),te?.();})},async shutdown(){w.info("shutting down"),v.end(),v.dispose(),h.server.process.kill(),e.delete(g),w.info("shutdown");},clientKey:g,createdAt:Date.now()};return e.set(g,j),w.info("initialized"),j}d.create=p;})(Ec||(Ec={}));var Xm=3,Ax=1e3,Ve;(O=>{let t=a.create({service:"lsp"});O.Event={Updated:a$5.define("lsp.updated",z$1.object({}))},O.Range=z$1.object({start:z$1.object({line:z$1.number(),character:z$1.number()}),end:z$1.object({line:z$1.number(),character:z$1.number()})}).meta({ref:"Range"}),O.LspSymbol=z$1.object({name:z$1.string(),kind:z$1.number(),location:z$1.object({uri:z$1.string(),range:O.Range})}).meta({ref:"LspSymbol"}),O.DocumentSymbol=z$1.object({name:z$1.string(),detail:z$1.string().optional(),kind:z$1.number(),range:O.Range,selectionRange:O.Range}).meta({ref:"DocumentSymbol"});let r=C=>{a$2.EASBOT_LSP_TY?C.pyright&&(t.info("LSP server pyright is disabled because EASBOT_LSP_TY is enabled"),delete C.pyright):C.ty&&delete C.ty;},i;async function c(){let C=[],E={},R=await he.get();if(R.lsp===false)return t.info("all LSPs are disabled"),{servers:E,clients:C,broken:new Set,spawning:new Map};for(let L of Object.values(_o))"id"in L&&"extensions"in L&&"spawn"in L&&(E[L.id]=L);r(E);for(let[L,q]of Object.entries(R.lsp??{})){let Q=E[L];if(q.disabled){t.info(`LSP server ${L} is disabled`),delete E[L];continue}E[L]={...Q,id:L,root:Q?.root??(async()=>A.directory),extensions:q.extensions??Q?.extensions??[],initTimeout:Q?.initTimeout??_o.getServerInitTimeout(L),spawn:async Z=>({process:PKG.spawn([q.command[0],...q.command.slice(1)],{cwd:Z,env:{...process.env,...q.env}}),initialization:q.initialization})};}return t.info("enabled LSP servers",{serverIds:Object.values(E).map(L=>L.id).join(", ")}),{servers:E,clients:C,broken:new Set,spawning:new Map}}async function u(C){await Promise.all(C.clients.map(E=>E.shutdown()));}function l(){return i||(i=A.state(c,u)),i}function f(){return l()()}async function m(){return f()}O.init=m;async function a$1(C){if(!a$2.EASBOT_LSP_TOOL||!C)return false;let{Session:E}=await import('./session-PMZOQPFQ.mjs'),R=await E.getContextMode(C);return !(R&&R!=="coder")}O.isAvailable=a$1,O.Status=z$1.object({id:z$1.string(),name:z$1.string(),root:z$1.string(),status:z$1.union([z$1.literal("connected"),z$1.literal("error")])}).meta({ref:"LSPStatus"});async function d(){return f().then(C=>{let E=[];for(let R of C.clients)E.push({id:R.serverID,name:C.servers[R.serverID]?.id??"unknown",root:ke__default.posix.relative(A.directory,R.root),status:"connected"});return E})}O.status=d;async function h(C,E){try{let R=await w(E);if(R.length===0)return !1;let L=R[0]?.capabilities;if(!L)return !1;switch(C){case "workspaceSymbol":return !!L.workspace?.symbolProvider;case "callHierarchy":return !!L.callHierarchyProvider;case "implementation":return !!L.implementationProvider;default:return !1}}catch{return false}}O.hasCapability=h;async function w(C){let E=await f(),R=ke__default.parse(C).ext||C,L=[],q=new Map;async function Q(Z,se,le){let de;try{de=await Z.spawn(se);}catch(X){E.broken.add(le),t.error(`Failed to spawn LSP server ${Z.id}`,{error:X,root:se});return}if(!de){E.broken.add(le),t.warn(`LSP server ${Z.id} spawn returned undefined`,{root:se});return}de.initTimeout=Z.initTimeout??_o.getServerInitTimeout(Z.id),t.info("spawned lsp server",{serverID:Z.id,initTimeout:de.initTimeout,root:se}),de.process.exited.catch(X=>{let H=X instanceof Error?X.message:String(X),F=X instanceof Error?X.stack:void 0;t.error("LSP process exited with error",{serverID:Z.id,root:se,error:H,stack:F});let ne=E.clients.findIndex(J=>J.root===se&&J.serverID===Z.id);ne!==-1&&(E.clients.splice(ne,1),t.info("removed disconnected LSP client",{serverID:Z.id,root:se}));let V=q.get(le)??0;V<Xm?(q.set(le,V+1),t.info(`LSP server ${Z.id} will restart (attempt ${V+1}/${Xm})`,{serverID:Z.id,root:se}),setTimeout(async()=>{if(!E.broken.has(le)){let J=await Q(Z,se,le);J&&(L.push(J),await ue.publish(O.Event.Updated,{}));}},Ax)):(t.error(`LSP server ${Z.id} exceeded max restart attempts, marking as broken`,{serverID:Z.id,root:se}),E.broken.add(le),q.delete(le));});let be;try{be=await Ec.create({serverID:Z.id,server:de,root:se,initTimeout:Z.initTimeout});}catch(X){E.broken.add(le),t.error(`Failed to initialize LSP client ${Z.id}`,{error:X,root:se}),de.process.kill();return}let re=E.clients.find(X=>X.root===se&&X.serverID===Z.id);return re?(de.process.kill(),re):(q.delete(le),E.clients.push(be),be)}for(let Z of Object.values(E.servers)){if(Z.extensions.length>0&&!Z.extensions.includes(R))continue;let se=await Z.root(C);if(!se||E.broken.has(se+Z.id))continue;let le=E.clients.find(X=>X.root===se&&X.serverID===Z.id);if(le){L.push(le);continue}let de=E.spawning.get(se+Z.id);if(de){let X=await de;if(!X)continue;L.push(X);continue}let be=Q(Z,se,se+Z.id);E.spawning.set(se+Z.id,be),await be.finally(()=>{E.spawning.get(se+Z.id)===be&&E.spawning.delete(se+Z.id);});let re=await be;re&&(L.push(re),await ue.publish(O.Event.Updated,{}));}return L}O.getClients=w;async function g(C){let E=await f(),R=ke__default.parse(C).ext||C;for(let L of Object.values(E.servers)){if(L.extensions.length>0&&!L.extensions.includes(R))continue;let q=await L.root(C);if(q&&!E.broken.has(q+L.id))return true}return false}O.hasClients=g;async function b(C,E){t.info("touching file",{file:C});let R=await w(C);await Promise.all(R.map(async L=>{let q=E?L.waitForDiagnostics({path:C}):Promise.resolve();return await L.notify.open({path:C}),q})).catch(L=>{t.error("failed to touch file",{err:L,file:C});});}O.touchFile=b;async function v(){let C={};for(let E of await U(async R=>R.diagnostics))for(let[R,L]of E.entries()){let q=C[R]||[];q.push(...L),C[R]=q;}return C}O.diagnostics=v;async function k(C){let E=await w(C),R=Filesystem.normalize(C),L=[];for(let q of E){let Q=q.diagnostics.get(R);Q&&L.push(...Q);}return L}O.getFileDiagnostics=k;async function S(C){return _(C.file,E=>E.connection.sendRequest("textDocument/hover",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(()=>null))}O.hover=S;let y;(ie=>(ie[ie.File=1]="File",ie[ie.Module=2]="Module",ie[ie.Namespace=3]="Namespace",ie[ie.Package=4]="Package",ie[ie.Class=5]="Class",ie[ie.Method=6]="Method",ie[ie.Property=7]="Property",ie[ie.Field=8]="Field",ie[ie.Constructor=9]="Constructor",ie[ie.Enum=10]="Enum",ie[ie.Interface=11]="Interface",ie[ie.Function=12]="Function",ie[ie.Variable=13]="Variable",ie[ie.Constant=14]="Constant",ie[ie.String=15]="String",ie[ie.Number=16]="Number",ie[ie.Boolean=17]="Boolean",ie[ie.Array=18]="Array",ie[ie.Object=19]="Object",ie[ie.Key=20]="Key",ie[ie.Null=21]="Null",ie[ie.EnumMember=22]="EnumMember",ie[ie.Struct=23]="Struct",ie[ie.Event=24]="Event",ie[ie.Operator=25]="Operator",ie[ie.TypeParameter=26]="TypeParameter"))(y||(y={}));let x=[5,12,6,11,13,14,23,10];async function I(C,E){let R=E??await A.directory+"/package.json",L=await w(R);if(L.length===0)throw new Error("No LSP client available");let q=L[0]?.capabilities;if(q&&!q.workspace?.symbolProvider)throw new Error("LSP server does not support workspaceSymbol");return _(R,Q=>Q.connection.sendRequest("workspace/symbol",{query:C}).then(Z=>!Z||!Array.isArray(Z)?[]:Z.filter(se=>x.includes(se.kind))).then(Z=>Z.slice(0,10)).catch(Z=>(t.debug("workspaceSymbol request failed",{error:Z}),[]))).then(Q=>Q.flat())}O.workspaceSymbol=I;async function P(C){let E=pathToFileURL(C.file).href;return _(C.file,R=>R.connection.sendRequest("textDocument/documentSymbol",{textDocument:{uri:E}}).catch(()=>[])).then(R=>R.flat()).then(R=>R.filter(Boolean))}O.documentSymbol=P;async function T(C){return _(C.file,E=>E.connection.sendRequest("textDocument/definition",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(()=>null)).then(E=>E.flat().filter(Boolean))}O.definition=T;async function M(C){return _(C.file,E=>E.connection.sendRequest("textDocument/references",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character},context:{includeDeclaration:true}}).catch(()=>[])).then(E=>E.flat().filter(Boolean))}O.references=M;async function j(C){let E=await w(C.file);if(E.length>0){let R=E[0]?.capabilities;if(R&&!R.implementationProvider)throw new Error("LSP server does not support implementation")}return _(C.file,R=>R.connection.sendRequest("textDocument/implementation",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(()=>null)).then(R=>R.flat().filter(Boolean))}O.implementation=j;async function N(C){let E=await w(C.file);if(E.length>0){let R=E[0]?.capabilities;if(R&&!R.callHierarchyProvider)throw new Error("LSP server does not support callHierarchy")}return _(C.file,R=>R.connection.sendRequest("textDocument/prepareCallHierarchy",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(()=>[])).then(R=>R.flat().filter(Boolean))}O.prepareCallHierarchy=N;async function K(C){let E=await w(C.file);if(E.length>0){let R=E[0]?.capabilities;if(R&&!R.callHierarchyProvider)throw new Error("LSP server does not support callHierarchy")}return _(C.file,async R=>{try{let L=await R.connection.sendRequest("textDocument/prepareCallHierarchy",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(Q=>(t.debug("prepareCallHierarchy failed",{error:Q}),[]));return L?.length===0?[]:await R.connection.sendRequest("callHierarchy/incomingCalls",{item:L[0]}).catch(Q=>(t.debug("callHierarchy/incomingCalls failed",{error:Q}),[]))}catch(L){return t.debug("incomingCalls error",{error:L,file:C.file,line:C.line,character:C.character}),[]}}).then(R=>R.flat().filter(Boolean))}O.incomingCalls=K;async function te(C){let E=await w(C.file);if(E.length>0){let R=E[0]?.capabilities;if(R&&!R.callHierarchyProvider)throw new Error("LSP server does not support callHierarchy")}return _(C.file,async R=>{try{let L=await R.connection.sendRequest("textDocument/prepareCallHierarchy",{textDocument:{uri:pathToFileURL(C.file).href},position:{line:C.line,character:C.character}}).catch(Q=>(t.debug("prepareCallHierarchy failed",{error:Q}),[]));return L?.length===0?[]:await R.connection.sendRequest("callHierarchy/outgoingCalls",{item:L[0]}).catch(Q=>(t.debug("callHierarchy/outgoingCalls failed",{error:Q}),[]))}catch(L){return t.debug("outgoingCalls error",{error:L,file:C.file,line:C.line,character:C.character}),[]}}).then(R=>R.flat().filter(Boolean))}O.outgoingCalls=te;async function U(C){let E=await f().then(L=>L.clients);return (await Promise.allSettled(E.map(L=>C(L)))).filter(L=>L.status==="fulfilled").map(L=>L.value)}async function _(C,E){try{let R=await w(C);await Promise.all(R.map(q=>q.notify.open({path:C})));let L=R.map(q=>E(q));return await Promise.all(L)}catch(R){return t.error("LSP run failed",{file:C,error:R}),[]}}(E=>{function C(R){let q={1:"ERROR",2:"WARN",3:"INFO",4:"HINT"}[R.severity||1],Q=R.range.start.line+1,Z=R.range.start.character+1;return `${q} [${Q}:${Z}] ${R.message}`}E.pretty=C;})(O.Diagnostic||(O.Diagnostic={}));})(Ve||(Ve={}));var xt;(p=>{let t=a.create({service:"snapshot"}),e="7.days";async function n(){try{let{Scheduler:d}=await import('./scheduler-SCM4SRS2.mjs');await d.createCommand({id:"cmd_snapshot-cleanup",name:"snapshot-cleanup",cron:"0 * * * *",command:"cleanup",arguments:"snapshot",recurring:!0,durable:!0});}catch(d){t.error("Failed to register cleanup task",{error:d});}}p.init=n;async function o(){if(A.project.vcs!=="git"||(await he.get()).snapshot===false)return;let h=a$2();if(!await Ot__default.stat(h).then(()=>true).catch(()=>false))return;let g=await $`git --git-dir ${h} --work-tree ${A.worktree} gc --prune=${e}`.quiet().cwd(A.directory).nothrow();if(g.exitCode!==0){t.warn("cleanup failed",{exitCode:g.exitCode,stderr:g.stderr.toString(),stdout:g.stdout.toString()});return}t.info("cleanup",{prune:e});}p.cleanup=o;async function s(){if(A.project.vcs!=="git"||(await he.get()).snapshot===false)return;let h=a$2();await Ot__default.mkdir(h,{recursive:true})&&(await $`git init`.env({...process.env,GIT_DIR:h,GIT_WORK_TREE:A.worktree}).quiet().nothrow(),await $`git --git-dir ${h} config core.autocrlf false`.quiet().nothrow(),t.info("initialized")),await $`git --git-dir ${h} --work-tree ${A.worktree} add .`.quiet().cwd(A.directory).nothrow();let w=await $`git --git-dir ${h} --work-tree ${A.worktree} write-tree`.quiet().cwd(A.directory).nothrow().text();return t.info("tracking",{hash:w,cwd:A.directory,git:h}),w.trim()}p.track=s,p.Patch=z$1.object({hash:z$1.string(),files:z$1.string().array()});async function i(d){let h=a$2();await $`git --git-dir ${h} --work-tree ${A.worktree} add .`.quiet().cwd(A.directory).nothrow();let w=await $`git -c core.autocrlf=false -c core.quotepath=false --git-dir ${h} --work-tree ${A.worktree} diff --no-ext-diff --name-only ${d} -- .`.quiet().cwd(A.directory).nothrow();if(w.exitCode!==0)return t.warn("failed to get diff",{hash:d,exitCode:w.exitCode}),{hash:d,files:[]};let g=w.text();return {hash:d,files:g.trim().split(`
25
+ `).map(b=>b.trim()).filter(Boolean).map(b=>ke__default.join(A.worktree,b))}}p.patch=i;async function c(d){t.info("restore",{commit:d});let h=a$2(),w=await $`git --git-dir ${h} --work-tree ${A.worktree} read-tree ${d} && git --git-dir ${h} --work-tree ${A.worktree} checkout-index -a -f`.quiet().cwd(A.worktree).nothrow();w.exitCode!==0&&t.error("failed to restore snapshot",{snapshot:d,exitCode:w.exitCode,stderr:w.stderr.toString(),stdout:w.stdout.toString()});}p.restore=c;async function u(d){let h=new Set,w=a$2();for(let g of d)for(let b of g.files){if(h.has(b))continue;if(t.info("reverting",{file:b,hash:g.hash}),(await $`git --git-dir ${w} --work-tree ${A.worktree} checkout ${g.hash} -- ${b}`.quiet().cwd(A.worktree).nothrow()).exitCode!==0){let k=ke__default.posix.relative(A.worktree,b),S=await $`git --git-dir ${w} --work-tree ${A.worktree} ls-tree ${g.hash} -- ${k}`.quiet().cwd(A.worktree).nothrow();S.exitCode===0&&S.text().trim()?t.info("file existed in snapshot but checkout failed, keeping",{file:b}):(t.info("file did not exist in snapshot, deleting",{file:b}),await Ot__default.unlink(b).catch(()=>{}));}h.add(b);}}p.revert=u;async function l(d){let h=a$2();await $`git --git-dir ${h} --work-tree ${A.worktree} add .`.quiet().cwd(A.directory).nothrow();let w=await $`git -c core.autocrlf=false -c core.quotepath=false --git-dir ${h} --work-tree ${A.worktree} diff --no-ext-diff ${d} -- .`.quiet().cwd(A.worktree).nothrow();return w.exitCode!==0?(t.warn("failed to get diff",{hash:d,exitCode:w.exitCode,stderr:w.stderr.toString(),stdout:w.stdout.toString()}),""):w.text().trim()}p.diff=l,p.FileDiff=z$1.object({file:z$1.string(),before:z$1.string(),after:z$1.string(),additions:z$1.number(),deletions:z$1.number(),status:z$1.enum(["added","deleted","modified"]).optional()}).meta({ref:"FileDiff"});async function m(d,h){let w=a$2(),g=[],b=new Map,v=await $`git -c core.autocrlf=false -c core.quotepath=false --git-dir ${w} --work-tree ${A.worktree} diff --no-ext-diff --name-status --no-renames ${d} ${h} -- .`.quiet().cwd(A.directory).nothrow().text();for(let S of v.trim().split(`
26
+ `)){if(!S)continue;let[y,x]=S.split(" ");if(!y||!x)continue;let I=y.startsWith("A")?"added":y.startsWith("D")?"deleted":"modified";b.set(x,I);}let k=await $`git -c core.autocrlf=false -c core.quotepath=false --git-dir ${w} --work-tree ${A.worktree} diff --no-ext-diff --no-renames --numstat ${d} ${h} -- .`.quiet().cwd(A.directory).nothrow().lines();for(let S of k){if(!S)continue;let y=S.split(" ");if(y.length<3)continue;let[x,I,P]=y;if(!x||!I||!P)continue;let T=x==="-"&&I==="-",M=T?"":await $`git -c core.autocrlf=false --git-dir ${w} --work-tree ${A.worktree} show ${d}:${P}`.quiet().nothrow().text(),j=T?"":await $`git -c core.autocrlf=false --git-dir ${w} --work-tree ${A.worktree} show ${h}:${P}`.quiet().nothrow().text(),N=T?0:parseInt(x,10),K=T?0:parseInt(I,10);g.push({file:P,before:M,after:j,additions:Number.isFinite(N)?N:0,deletions:Number.isFinite(K)?K:0,status:b.get(P)??"modified"});}return g}p.diffFull=m;function a$2(){let d=A.project;return ke__default.join(a$1.Path.data,"snapshot",d.id)}})(xt||(xt={}));var Ki;(u=>{let t=[/prompt is too long/i,/input is too long for requested model/i,/exceeds the context window/i,/input token count.*exceeds the maximum/i,/maximum prompt length is \d+/i,/reduce the length of the messages/i,/maximum context length is \d+ tokens/i,/exceeds the limit of \d+/i,/exceeds the available context size/i,/greater than the context length/i,/context window exceeds limit/i,/exceeded model token limit/i,/context[_ ]length[_ ]exceeded/i,/request entity too large/i,/context length is only \d+ tokens/i,/input length.*exceeds.*context length/i,/prompt too long; exceeded (?:max )?context length/i,/too large for model with \d+ maximum context length/i,/model_context_window_exceeded/i];function e(l){let f=l.statusCode;return f&&f===404||l.isRetryable}function n(l){return t.some(f=>f.test(l))?true:/^4(00|13)\s*(status code)?\s*\(no body\)/i.test(l)}function o(l,f){return l.includes("github-copilot")&&f.statusCode===403?"Please reauthenticate with the copilot provider to ensure your credentials work properly with EasBot.":f.message}function s(l,f){return iife(()=>{let m=f.message;if(m===""){if(f.responseBody)return f.responseBody;if(f.statusCode){let p=STATUS_CODES[f.statusCode];if(p)return p}return "Unknown error"}let a=o(l,f);if(a!==m)return a;if(!f.responseBody||f.statusCode&&m!==STATUS_CODES[f.statusCode])return m;try{let p=JSON.parse(f.responseBody),d=p.message||p.error||p.error?.message;if(d&&typeof d=="string")return `${m}: ${d}`}catch{}return `${m}: ${f.responseBody}`}).trim()}function r(l){if(typeof l=="string")try{let f=JSON.parse(l);return f&&typeof f=="object"?f:void 0}catch{return}if(typeof l=="object"&&l!==null)return l}function i(l){let f=r(l),m=typeof f?.message=="string"?r(f.message)??f:f;if(!m)return;let a=JSON.stringify(m);if(m.type==="error")switch(m?.error?.code){case "context_length_exceeded":return {type:"context_overflow",message:"Input exceeds context window of this model",responseBody:a};case "insufficient_quota":return {type:"api_error",message:"Quota exceeded. Check your plan and billing details.",isRetryable:false,responseBody:a};case "usage_not_included":return {type:"api_error",message:"To use Codex with your ChatGPT plan, upgrade to Plus: https://chatgpt.com/explore/plus.",isRetryable:false,responseBody:a};case "invalid_prompt":return {type:"api_error",message:typeof m?.error?.message=="string"?m?.error?.message:"Invalid prompt.",isRetryable:false,responseBody:a};case "server_error":return {type:"api_error",message:typeof m?.error?.message=="string"?m?.error?.message:"Server error.",isRetryable:true,responseBody:a}}}u.parseStreamError=i;function c(l){let f=s(l.providerID,l.error),m=r(l.error.responseBody);if(n(f)||l.error.statusCode===413||m?.error?.code==="context_length_exceeded")return {type:"context_overflow",message:f,responseBody:l.error.responseBody};let a=l.error.url?{url:l.error.url}:void 0;return {type:"api_error",message:f,statusCode:l.error.statusCode,isRetryable:l.providerID.startsWith("openai")?e(l.error):l.error.isRetryable,responseHeaders:l.error.responseHeaders,responseBody:l.error.responseBody,metadata:a}}u.parseAPICallError=c;})(Ki||(Ki={}));var ve;(F=>{function t(ne){return ne.startsWith("image/")||ne==="application/pdf"}F.isMedia=t,F.OutputLengthError=NamedError.create("MessageOutputLengthError",z$1.object({})),F.AbortedError=NamedError.create("MessageAbortedError",z$1.object({message:z$1.string()})),F.StructuredOutputError=NamedError.create("StructuredOutputError",z$1.object({message:z$1.string(),retries:z$1.number()})),F.AuthError=NamedError.create("ProviderAuthError",z$1.object({providerID:z$1.string(),message:z$1.string()})),F.APIError=NamedError.create("APIError",z$1.object({message:z$1.string(),statusCode:z$1.number().optional(),isRetryable:z$1.boolean(),responseHeaders:z$1.record(z$1.string(),z$1.string()).optional(),responseBody:z$1.string().optional(),metadata:z$1.record(z$1.string(),z$1.string()).optional()})),F.ContextOverflowError=NamedError.create("ContextOverflowError",z$1.object({message:z$1.string(),responseBody:z$1.string().optional()})),F.OutputFormatText=z$1.object({type:z$1.literal("text")}).meta({ref:"OutputFormatText"}),F.OutputFormatJsonSchema=z$1.object({type:z$1.literal("json_schema"),schema:z$1.record(z$1.string(),z$1.any()).meta({ref:"JSONSchema"}),retryCount:z$1.number().int().min(0).default(2)}).meta({ref:"OutputFormatJsonSchema"}),F.Format=z$1.discriminatedUnion("type",[F.OutputFormatText,F.OutputFormatJsonSchema]).meta({ref:"OutputFormat"});let f=z$1.object({id:z$1.string(),sessionID:z$1.string(),messageID:z$1.string()});F.SnapshotPart=f.extend({type:z$1.literal("snapshot"),snapshot:z$1.string()}).meta({ref:"SnapshotPart"}),F.PatchPart=f.extend({type:z$1.literal("patch"),hash:z$1.string(),files:z$1.string().array()}).meta({ref:"PatchPart"}),F.TextPart=f.extend({type:z$1.literal("text"),text:z$1.string(),synthetic:z$1.boolean().optional(),ignored:z$1.boolean().optional(),time:z$1.object({start:z$1.number(),end:z$1.number().optional()}).optional(),metadata:z$1.record(z$1.string(),z$1.any()).optional()}).meta({ref:"TextPart"}),F.ReasoningPart=f.extend({type:z$1.literal("reasoning"),text:z$1.string(),metadata:z$1.record(z$1.string(),z$1.any()).optional(),time:z$1.object({start:z$1.number(),end:z$1.number().optional()})}).meta({ref:"ReasoningPart"});let h=z$1.object({text:z$1.object({value:z$1.string(),start:z$1.number().int(),end:z$1.number().int()}).meta({ref:"FilePartSourceText"})});F.FileSource=h.extend({type:z$1.literal("file"),path:z$1.string()}).meta({ref:"FileSource"}),F.SymbolSource=h.extend({type:z$1.literal("symbol"),path:z$1.string(),range:Ve.Range,name:z$1.string(),kind:z$1.number().int()}).meta({ref:"SymbolSource"}),F.ResourceSource=h.extend({type:z$1.literal("resource"),clientName:z$1.string(),uri:z$1.string()}).meta({ref:"ResourceSource"}),F.FilePartSource=z$1.discriminatedUnion("type",[F.FileSource,F.SymbolSource,F.ResourceSource]).meta({ref:"FilePartSource"}),F.FilePart=f.extend({type:z$1.literal("file"),mime:z$1.string(),filename:z$1.string().optional(),url:z$1.string(),source:F.FilePartSource.optional()}).meta({ref:"FilePart"}),F.AgentPart=f.extend({type:z$1.literal("agent"),name:z$1.string(),source:z$1.object({value:z$1.string(),start:z$1.number().int(),end:z$1.number().int()}).optional()}).meta({ref:"AgentPart"}),F.CompactionPart=f.extend({type:z$1.literal("compaction"),auto:z$1.boolean(),overflow:z$1.boolean().optional()}).meta({ref:"CompactionPart"}),F.MemoryPart=f.extend({type:z$1.literal("memory"),status:z$1.enum(["pending","processing","completed","failed","skipped"]),time:z$1.object({start:z$1.number(),end:z$1.number().optional()}),result:z$1.string().optional(),error:z$1.string().optional(),reason:z$1.string().optional()}).meta({ref:"MemoryPart"}),F.SubtaskPart=f.extend({type:z$1.literal("subtask"),taskId:z$1.string().describe("Task unique identifier"),prompt:z$1.string(),description:z$1.string(),agent:z$1.string(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),command:z$1.string().optional()}).meta({ref:"SubtaskPart"}),F.SubtaskResultPart=f.extend({type:z$1.literal("subtask-result"),taskId:z$1.string().describe("Task unique identifier"),source:z$1.enum(["tool","scheduler","cli","api","agent-client"]).describe("Task source"),agent:z$1.string().describe("Agent name"),status:z$1.enum(["pending","running","completed","error"]).describe("Task status"),result:z$1.string().optional().describe("Task result content"),error:z$1.string().optional().describe("Error message if failed"),duration:z$1.number().optional().describe("Duration in milliseconds"),time:z$1.object({start:z$1.number().describe("Start timestamp"),end:z$1.number().optional().describe("End timestamp")}).optional().describe("Task time"),rounds:z$1.object({current:z$1.number(),max:z$1.number()}).optional().describe("Interaction rounds"),thinking:z$1.string().optional().describe("Thinking content"),tools:z$1.array(z$1.object({name:z$1.string(),status:z$1.string(),input:z$1.record(z$1.string(),z$1.unknown()).optional(),output:z$1.string().optional()})).optional().describe("Tool calls during task"),attachments:z$1.array(z$1.lazy(()=>F.FilePart)).optional().describe("Result attachments"),metadata:z$1.record(z$1.string(),z$1.unknown()).optional().describe("Source-specific metadata")}).meta({ref:"SubtaskResultPart"});function T(ne){let V=[];if(V.push("=== SubAgent Result ==="),V.push(`Task ID: ${ne.taskId}`),V.push(`Source: ${ne.source}`),V.push(`Agent: ${ne.agent}`),V.push(`Status: ${ne.status}`),ne.duration&&V.push(`Duration: ${ne.duration}ms`),ne.rounds&&V.push(`Rounds: ${ne.rounds.current}/${ne.rounds.max}`),ne.time&&(V.push(`Start(Local): ${formatLocalISOCompact(new Date(ne.time.start))}`),ne.time.end&&V.push(`End(Local): ${formatLocalISOCompact(new Date(ne.time.end))}`)),ne.metadata&&Object.keys(ne.metadata).length>0){V.push("");for(let[J,oe]of Object.entries(ne.metadata))V.push(`${J}: ${oe}`);}if(ne.thinking&&V.push("","<think>",ne.thinking,"</think>"),(ne?.tools?.length??0)>0){V.push("","<tool_calls>");for(let J of ne?.tools??[])V.push(`- ${J.name}: ${String(J.input)}`);V.push("</tool_calls>");}return V.push(""),ne.status==="error"?V.push("Error:",ne.error??"Unknown error"):V.push("Result:",ne.result??""),V.push("=================="),V.join(`
27
+ `)}F.formatSubtaskResultPart=T,F.RetryPart=f.extend({type:z$1.literal("retry"),attempt:z$1.number(),error:F.APIError.Schema,time:z$1.object({created:z$1.number()})}).meta({ref:"RetryPart"}),F.StepStartPart=f.extend({type:z$1.literal("step-start"),snapshot:z$1.string().optional()}).meta({ref:"StepStartPart"}),F.StepFinishPart=f.extend({type:z$1.literal("step-finish"),reason:z$1.string(),snapshot:z$1.string().optional(),cost:z$1.number(),tokens:z$1.object({total:z$1.number().optional(),input:z$1.number(),output:z$1.number(),reasoning:z$1.number(),cache:z$1.object({read:z$1.number(),write:z$1.number()})})}).meta({ref:"StepFinishPart"}),F.ToolStatePending=z$1.object({status:z$1.literal("pending"),input:z$1.record(z$1.string(),z$1.any()),raw:z$1.string()}).meta({ref:"ToolStatePending"}),F.ToolStateRunning=z$1.object({status:z$1.literal("running"),input:z$1.record(z$1.string(),z$1.any()),title:z$1.string().optional(),metadata:z$1.record(z$1.string(),z$1.any()).optional(),time:z$1.object({start:z$1.number()})}).meta({ref:"ToolStateRunning"}),F.ToolStateCompleted=z$1.object({status:z$1.literal("completed"),input:z$1.record(z$1.string(),z$1.any()),output:z$1.string(),title:z$1.string(),metadata:z$1.record(z$1.string(),z$1.any()),time:z$1.object({start:z$1.number(),end:z$1.number(),compacted:z$1.number().optional()}),attachments:F.FilePart.array().optional()}).meta({ref:"ToolStateCompleted"}),F.ToolStateError=z$1.object({status:z$1.literal("error"),input:z$1.record(z$1.string(),z$1.any()),error:z$1.string(),metadata:z$1.record(z$1.string(),z$1.any()).optional(),time:z$1.object({start:z$1.number(),end:z$1.number()})}).meta({ref:"ToolStateError"}),F.ToolState=z$1.discriminatedUnion("status",[F.ToolStatePending,F.ToolStateRunning,F.ToolStateCompleted,F.ToolStateError]).meta({ref:"ToolState"}),F.ToolPart=f.extend({type:z$1.literal("tool"),callID:z$1.string(),tool:z$1.string(),state:F.ToolState,metadata:z$1.record(z$1.string(),z$1.any()).optional()}).meta({ref:"ToolPart"});let C=z$1.object({id:z$1.string(),sessionID:z$1.string()});F.User=C.extend({role:z$1.literal("user"),time:z$1.object({created:z$1.number()}),format:F.Format.optional(),summary:z$1.object({title:z$1.string().optional(),body:z$1.string().optional(),diffs:xt.FileDiff.array()}).optional(),agent:z$1.string(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}),system:z$1.string().optional(),tools:z$1.record(z$1.string(),z$1.boolean()).optional(),variant:z$1.string().optional()}).meta({ref:"UserMessage"}),F.Part=z$1.discriminatedUnion("type",[F.TextPart,F.SubtaskPart,F.ReasoningPart,F.FilePart,F.ToolPart,F.StepStartPart,F.StepFinishPart,F.SnapshotPart,F.PatchPart,F.AgentPart,F.SubtaskResultPart,F.RetryPart,F.CompactionPart,F.MemoryPart]).meta({ref:"Part"}),F.Assistant=C.extend({role:z$1.literal("assistant"),time:z$1.object({created:z$1.number(),completed:z$1.number().optional()}),error:z$1.discriminatedUnion("name",[F.AuthError.Schema,NamedError.Unknown.Schema,F.OutputLengthError.Schema,F.AbortedError.Schema,F.StructuredOutputError.Schema,F.ContextOverflowError.Schema,F.APIError.Schema]).optional(),parentID:z$1.string(),modelID:z$1.string(),providerID:z$1.string(),mode:z$1.string(),agent:z$1.string(),path:z$1.object({cwd:z$1.string(),root:z$1.string()}),summary:z$1.boolean().optional(),cost:z$1.number(),tokens:z$1.object({total:z$1.number().optional(),input:z$1.number(),output:z$1.number(),reasoning:z$1.number(),cache:z$1.object({read:z$1.number(),write:z$1.number()})}),structured:z$1.any().optional(),variant:z$1.string().optional(),finish:z$1.string().optional()}).meta({ref:"AssistantMessage"}),F.Info=z$1.discriminatedUnion("role",[F.User,F.Assistant]).meta({ref:"Message"}),F.Event={Updated:a$5.define("message.updated",z$1.object({info:F.Info})),Removed:a$5.define("message.removed",z$1.object({sessionID:z$1.string(),messageID:z$1.string()})),PartUpdated:a$5.define("message.part.updated",z$1.object({part:F.Part,delta:z$1.string().optional(),time:z$1.number()})),PartRemoved:a$5.define("message.part.removed",z$1.object({sessionID:z$1.string(),messageID:z$1.string(),partID:z$1.string()}))},F.WithParts=z$1.object({info:F.Info,parts:z$1.array(F.Part)});async function se(ne,V,J){let oe=new Set,ae=(()=>{if(V.api.npm==="@ai-sdk/anthropic"||V.api.npm==="@ai-sdk/openai"||V.api.npm==="@ai-sdk/amazon-bedrock"||V.api.npm==="@ai-sdk/google-vertex/anthropic")return true;if(V.api.npm==="@ai-sdk/google"){let Ie=V.api.id.toLowerCase();return Ie.includes("gemini-3")&&!Ie.includes("gemini-2")}return false})(),me=Ie=>{if(typeof Ie=="string")return {type:"text",value:Ie};if(typeof Ie=="object"){let we=Ie,ie=(we.attachments??[]).filter(Ae=>Ae.url.startsWith("data:")&&Ae.url.includes(","));return {type:"content",value:[{type:"text",text:we.text??we.output??"[Tool result content missing]"},...ie.map(Ae=>({type:"media",mediaType:Ae.mime,data:iife(()=>{let Ft=Ae.url.indexOf(",");return Ft===-1?Ae.url:Ae.url.slice(Ft+1)})}))]}}return {type:"json",value:Ie}},pe=[];for(let Ie of ne)if(Ie.parts.length!==0){if(Ie.info.role==="user"){let we={id:Ie.info.id,role:"user",parts:[]};pe.push(we);for(let ie of Ie.parts)ie.type==="text"&&!ie.ignored&&we.parts.push({type:"text",text:ie.text}),ie.type==="file"&&ie.mime!=="text/plain"&&ie.mime!=="application/x-directory"&&(J?.stripMedia&&t(ie.mime)?we.parts.push({type:"text",text:`[Attached ${ie.mime}: ${ie.filename??"file"}]`}):we.parts.push({type:"file",url:ie.url,mediaType:ie.mime,filename:ie.filename})),ie.type==="compaction"&&we.parts.push({type:"text",text:"What did we do so far?"}),ie.type==="subtask"&&we.parts.push({type:"text",text:"The following tool was executed by user"}),ie.type==="subtask-result"&&we.parts.push({type:"text",text:F.formatSubtaskResultPart(ie)});}if(Ie.info.role==="assistant"){let we=`${V.providerID}/${V.id}`!=`${Ie.info.providerID}/${Ie.info.modelID}`,ie=[];if(Ie.info.error&&!(F.AbortedError.isInstance(Ie.info.error)&&Ie.parts.some(Ae=>Ae.type!=="step-start"&&Ae.type!=="reasoning")))continue;let De={id:Ie.info.id,role:"assistant",parts:[]};for(let Ae of Ie.parts){if(Ae.type==="text"&&De.parts.push({type:"text",text:Ae.text,...we?{}:{providerMetadata:Ae.metadata}}),Ae.type==="step-start"&&De.parts.push({type:"step-start"}),Ae.type==="tool"){if(oe.add(Ae.tool),Ae.state.status==="completed"){let Ft=Ae.state.time.compacted?"[Old tool result content cleared]":Ae.state.output??"[Tool result content missing]",Ln=Ae.state.time.compacted||J?.stripMedia?[]:Ae.state.attachments??[],Jn=Za=>Za.mime.startsWith("image/")||Za.mime==="application/pdf",Nn=Ln.filter(Jn),Qt=Ln.filter(Za=>!Jn(Za));!ae&&Nn.length>0&&ie.push(...Nn);let kt=ae?Ln:Qt,vr=kt.length>0?{text:Ft,attachments:kt}:Ft;De.parts.push({type:"tool-"+Ae.tool,state:"output-available",toolCallId:Ae.callID,input:Ae.state.input,output:vr,...we?{}:{callProviderMetadata:Ae.metadata}});}Ae.state.status==="error"&&De.parts.push({type:"tool-"+Ae.tool,state:"output-error",toolCallId:Ae.callID,input:Ae.state.input,errorText:Ae.state.error,...we?{}:{callProviderMetadata:Ae.metadata}}),(Ae.state.status==="pending"||Ae.state.status==="running")&&De.parts.push({type:"tool-"+Ae.tool,state:"output-error",toolCallId:Ae.callID,input:Ae.state.input,errorText:"[Tool execution was interrupted]",...we?{}:{callProviderMetadata:Ae.metadata}});}Ae.type==="reasoning"&&De.parts.push({type:"reasoning",text:Ae.text,...we?{}:{providerMetadata:Ae.metadata}});}De.parts.length>0&&(pe.push(De),ie.length>0&&pe.push({id:Identifier.ascending("message"),role:"user",parts:[{type:"text",text:"Attached image(s) from tool result:"},...ie.map(Ae=>({type:"file",url:Ae.url,mediaType:Ae.mime,providerMetadata:void 0}))]}));}}let xe=Object.fromEntries(Array.from(oe).map(Ie=>[Ie,{toModelOutput:me}])),He=pe.filter(Ie=>Ie.parts.some(we=>we.type!=="step-start"));return await convertToModelMessages(He,{tools:xe})}F.toModelMessages=se,F.stream=fn$1(Identifier.schema("session"),async function*(ne){let V=await Array.fromAsync(await a$6.list(["message",ne]));for(let J=V.length-1;J>=0;J--){let oe=V[J]?.[2];oe&&(yield await(0, F.get)({sessionID:ne,messageID:oe}));}}),F.parts=fn$1(Identifier.schema("message"),async ne=>{let V=[];for(let J of await a$6.list(["part",ne])){let oe=await a$6.read(J);V.push(oe);}return V.sort((J,oe)=>J.id>oe.id?1:-1),V}),F.get=fn$1(z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message")}),async ne=>({info:await a$6.read(["message",ne.sessionID,ne.messageID]),parts:await(0, F.parts)(ne.messageID)}));async function re(ne){let V=[],J=new Set;for await(let oe of ne){if(V.push(oe),oe.info.role==="user"&&J.has(oe.info.id)&&oe.parts.some(ae=>ae.type==="compaction"))break;oe.info.role==="assistant"&&oe.info.summary&&oe.info.finish&&J.add(oe.info.parentID);}return V.reverse(),V}F.filterCompacted=re;async function X(ne,V){let J=await re((0, F.stream)(ne)),oe=J;V?.maxMessages&&V.maxMessages>0&&(oe=J.slice(-V.maxMessages));let ae,me,pe,xe,He;for(let Ie=oe.length-1;Ie>=0;Ie--){let we=oe[Ie];if(we&&(!ae&&we.info.role==="user"&&(ae=we.info,me=we),!pe&&we.info.role==="assistant"&&(pe=we.info),!xe&&we.info.role==="assistant"&&we.info.finish&&(xe=we),V?.filterByText!==false&&!He&&we.info.role==="assistant"&&we.parts.some(ie=>ie.type==="text")&&(He=we),ae&&He&&xe))break}return {lastUser:ae,lastUserMessage:me,lastAssistant:pe,lastFinished:xe,lastAssistantWithText:He}}F.getLastMessages=X;function H(ne,V){switch(true){case(ne instanceof DOMException&&ne.name==="AbortError"):return new F.AbortedError({message:ne.message},{cause:ne}).toObject();case F.OutputLengthError.isInstance(ne):return ne;case LoadAPIKeyError.isInstance(ne):{let J=ne;return new F.AuthError({providerID:V.providerID,message:J.message},{cause:J}).toObject()}case ne?.code==="ECONNRESET":{let J=ne;return new F.APIError({message:"Connection reset by server",isRetryable:true,metadata:{code:J.code??"",syscall:J.syscall??"",message:J.message??""}},{cause:J}).toObject()}case(ne instanceof Error&&ne.code==="ZlibError"):{let J=ne;return V.aborted?new F.AbortedError({message:J.message},{cause:J}).toObject():new F.APIError({message:"Response decompression failed",isRetryable:true,metadata:{code:J.code,message:J.message}},{cause:J}).toObject()}case APICallError.isInstance(ne):{let J=Ki.parseAPICallError({providerID:V.providerID,error:ne});return J.type==="context_overflow"?new F.ContextOverflowError({message:J.message,responseBody:J.responseBody},{cause:ne}).toObject():new F.APIError({message:J.message,statusCode:J.statusCode,isRetryable:J.isRetryable,responseHeaders:J.responseHeaders,responseBody:J.responseBody,metadata:J.metadata},{cause:ne}).toObject()}default:{let J=ne;try{let oe=Ki.parseStreamError(J);if(oe)return oe.type==="context_overflow"?new F.ContextOverflowError({message:oe.message,responseBody:oe.responseBody},{cause:J}).toObject():new F.APIError({message:oe.message,isRetryable:oe.isRetryable,responseBody:oe.responseBody},{cause:J}).toObject()}catch{}return new NamedError.Unknown({message:String(J)},{cause:J}).toObject()}}}F.fromError=H;})(ve||(ve={}));var It;(S=>{let t=a.create({service:"file"});S.Info=z$1.object({path:z$1.string(),added:z$1.number().int(),removed:z$1.number().int(),status:z$1.enum(["added","deleted","modified"])}).meta({ref:"File"}),S.Node=z$1.object({name:z$1.string(),path:z$1.string(),absolute:z$1.string(),type:z$1.enum(["file","directory"]),ignored:z$1.boolean()}).meta({ref:"FileNode"}),S.Content=z$1.object({type:z$1.enum(["text","binary"]),content:z$1.string(),diff:z$1.string().optional(),patch:z$1.object({oldFileName:z$1.string(),newFileName:z$1.string(),oldHeader:z$1.string().optional(),newHeader:z$1.string().optional(),hunks:z$1.array(z$1.object({oldStart:z$1.number(),oldLines:z$1.number(),newStart:z$1.number(),newLines:z$1.number(),lines:z$1.array(z$1.string())})),index:z$1.string().optional()}).optional(),encoding:z$1.literal("base64").optional(),mimeType:z$1.string().optional()}).meta({ref:"FileContent"});let s=new Set(["exe","dll","pdb","bin","so","dylib","o","a","lib","wav","mp3","ogg","oga","ogv","ogx","flac","aac","wma","m4a","weba","mp4","avi","mov","wmv","flv","webm","mkv","zip","tar","gz","gzip","bz","bz2","bzip","bzip2","7z","rar","xz","lz","z","pdf","doc","docx","ppt","pptx","xls","xlsx","dmg","iso","img","vmdk","ttf","otf","woff","woff2","eot","sqlite","db","mdb","apk","ipa","aab","xapk","app","pkg","deb","rpm","snap","flatpak","appimage","msi","msp","jar","war","ear","class","kotlin_module","dex","vdex","odex","oat","art","wasm","wat","bc","ll","s","ko","sys","drv","efi","rom","com","bat","cmd","ps1","sh","bash","zsh","fish"]),r=new Set(["png","jpg","jpeg","gif","bmp","webp","ico","tif","tiff","svg","svgz","avif","apng","jxl","heic","heif","raw","cr2","nef","arw","dng","orf","raf","pef","x3f"]);function i(y){let x=Filesystem.extname(y).toLowerCase().slice(1);return r.has(x)}function c$1(y){let x=Filesystem.extname(y).toLowerCase().slice(1);return {png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",bmp:"image/bmp",webp:"image/webp",ico:"image/x-icon",tif:"image/tiff",tiff:"image/tiff",svg:"image/svg+xml",svgz:"image/svg+xml",avif:"image/avif",apng:"image/apng",jxl:"image/jxl",heic:"image/heic",heif:"image/heif"}[x]||"image/"+x}function u(y){let x=Filesystem.extname(y).toLowerCase().slice(1);return s.has(x)}function l(y){return y.startsWith("image/")}async function f(y){let x=y.type?.toLowerCase();if(t.info("shouldEncode",{type:x}),!x||x.startsWith("text/")||x.includes("charset="))return false;let P=x.split("/",2)[0];return !!["image","audio","video","font","model","multipart"].includes(P)}S.Event={Edited:a$5.define("file.edited",z$1.object({file:z$1.string()}))};async function a$2(){let y={files:[],dirs:[]},x=false,I=A.directory===a$1.Path.home&&A.project.id==="global",P=async T=>{if(A.directory===ke__default.parse(A.directory).root)return;if(x=true,I){let j=new Set,N=new Set;process.platform==="darwin"&&N.add("Library"),process.platform==="win32"&&N.add("AppData");let K=new Set(["node_modules","dist","build","target","vendor"]),te=D=>D.startsWith(".")||N.has(D),U=D=>D.startsWith(".")||K.has(D),_=await tu.promises.readdir(A.directory,{withFileTypes:true}).catch(()=>[]);for(let D of _){if(!D.isDirectory()||te(D.name))continue;j.add(D.name+"/");let O=Filesystem.join(A.directory,D.name),C=await tu.promises.readdir(O,{withFileTypes:true}).catch(()=>[]);for(let E of C)E.isDirectory()&&(U(E.name)||j.add(D.name+"/"+E.name+"/"));}T.dirs=Array.from(j).toSorted(),y=T,x=false;return}let M=new Set;for await(let j of a$9.files({cwd:A.directory})){T.files.push(j);let N=j;for(;;){let K=ke__default.posix.dirname(N);if(K==="."||K===N)break;N=K,!M.has(K)&&(M.add(K),T.dirs.push(K+"/"));}}y=T,x=false;};return await P(y),{async files(){return x||await P({files:[],dirs:[]}),y}}}let p;function d$1(){return p||(p=A.state(a$2)),p}function h(){return d$1()()}function w(){h();}S.init=w;async function g(){if(A.project.vcs!=="git")return [];let x=await $`git -c core.quotepath=false diff --numstat HEAD`.cwd(A.directory).quiet().nothrow().text(),I=[];if(x.trim()){let M=x.trim().split(`
28
+ `);for(let j of M){let N=j.split(" "),K=N[2];K&&I.push({path:K,added:N[0]==="-"?0:parseInt(N[0]||"0",10),removed:N[1]==="-"?0:parseInt(N[1]||"0",10),status:"modified"});}}let P=await $`git -c core.quotepath=false ls-files --others --exclude-standard`.cwd(A.directory).quiet().nothrow().text();if(P.trim()){let M=P.trim().split(`
29
+ `);for(let j of M)try{let K=(await PKG.file(Filesystem.join(A.directory,j)).text()).split(`
30
+ `).length;I.push({path:j,added:K,removed:0,status:"added"});}catch{}}let T=await $`git -c core.quotepath=false diff --name-only --diff-filter=D HEAD`.cwd(A.directory).quiet().nothrow().text();if(T.trim()){let M=T.trim().split(`
31
+ `);for(let j of M)I.push({path:j,added:0,removed:0,status:"deleted"});}return I.map(M=>({...M,path:ke__default.posix.relative(A.directory,M.path)}))}S.status=g;async function b(y){var K=[];try{let x=c(K,t.time("read",{file:y}));let I=A.project;let P=Filesystem.join(A.directory,y);if(!A.containsPath(P))throw new Error("Access denied: path escapes project directory");if(i(y)){let D=PKG.file(P);if(await D.exists()){let O=await D.arrayBuffer().catch(()=>new ArrayBuffer(0)),C=Buffer.from(O).toString("base64"),E=c$1(y);return {type:"text",content:C,mimeType:E,encoding:"base64"}}return {type:"text",content:""}}if(u(y))return {type:"binary",content:""};let T=PKG.file(P);if(!await T.exists())return {type:"text",content:""};let M=await f(T);let j=T.type||"application/octet-stream";if(M&&!l(j))return {type:"binary",content:"",mimeType:j};if(M){let D=await T.bytes().catch(()=>new Uint8Array(0));return {type:"text",content:Buffer.from(D).toString("base64"),mimeType:j,encoding:"base64"}}let N=await T.text().catch(()=>"").then(D=>D.trim());if(I.vcs==="git"){let D=await $`git diff ${y}`.cwd(A.directory).quiet().nothrow().text();if(D.trim()||(D=await $`git diff --staged ${y}`.cwd(A.directory).quiet().nothrow().text()),D.trim()){let O=await $`git show HEAD:${y}`.cwd(A.directory).quiet().nothrow().text(),C=structuredPatch(y,y,O,N,"old","new",{context:1/0,ignoreWhitespace:!0}),E=formatPatch(C);return {type:"text",content:N,patch:{oldFileName:C.oldFileName??y,newFileName:C.newFileName??y,oldHeader:C.oldHeader,newHeader:C.newHeader,hunks:C.hunks,index:C.index},diff:E}}}return {type:"text",content:N}}catch(te){var U=te,_=true;}finally{d(K,U,_);}}S.read=b;async function v(y){let x=[".git",".DS_Store"],I=A.project,P=j=>false;if(I.vcs==="git"){let j=Ignore.create(),N=PKG.file(Filesystem.join(A.worktree,".gitignore"));await N.exists()&&j.add((await N.text()).split(`
32
+ `));let K=PKG.file(Filesystem.join(A.worktree,".ignore"));await K.exists()&&j.add((await K.text()).split(`
33
+ `)),P=j.createFilter();}let T=y?Filesystem.join(A.directory,y):A.directory;if(!A.containsPath(T))throw new Error("Access denied: path escapes project directory");let M=[];for(let j of await tu.promises.readdir(T,{withFileTypes:true}).catch(()=>[])){if(x.includes(j.name))continue;let N=Filesystem.join(T,j.name),K=ke__default.posix.relative(A.directory,N),te=j.isDirectory()?"directory":"file";M.push({name:j.name,path:K,absolute:N,type:te,ignored:P(te==="directory"?K+"/":K)});}return M.sort((j,N)=>j.type!==N.type?j.type==="directory"?-1:1:j.name.localeCompare(N.name))}S.list=v;async function k(y){let x=y.query.trim(),I=y.limit??100,P=y.type??(y.dirs===false?"file":"all");t.info("search",{query:x,kind:P});let T=await(await h()).files(),M=D=>D.replaceAll("\\","/").replace(/\/+$/,"").split("/").some(C=>C.startsWith(".")&&C.length>1),j=x.startsWith(".")||x.includes("/."),N=D=>{if(j)return D;let O=[],C=[];for(let E of D){let R=M(E);R&&C.push(E),R||O.push(E);}return [...O,...C]};if(!x)return P==="file"?T.files.slice(0,I):N(T.dirs.toSorted()).slice(0,I);let K=P==="file"?T.files:P==="directory"?T.dirs:[...T.files,...T.dirs],te=P==="directory"&&!j?I*20:I,U=gb.go(x,K,{limit:te}).map(D=>D.target),_=P==="directory"?N(U).slice(0,I):U;return t.info("search",{query:x,kind:P,results:_.length}),_}S.search=k;})(It||(It={}));var ou={};a$7(ou,{biome:()=>qx,clang:()=>Wx,dart:()=>Zx,gleam:()=>oI,gofmt:()=>Ux,htmlbeautifier:()=>Xx,ktlint:()=>Vx,latexindent:()=>nI,mix:()=>zx,nixfmt:()=>rI,ocamlformat:()=>eI,ormolu:()=>cI,oxfmt:()=>Hx,pint:()=>aI,prettier:()=>Bx,rlang:()=>Kx,rubocop:()=>Yx,ruff:()=>nf,rustfmt:()=>iI,shfmt:()=>sI,standardrb:()=>Qx,terraform:()=>tI,uvformat:()=>Jx,zig:()=>Gx});var Ux={name:"gofmt",command:["gofmt","-w","$FILE"],extensions:[".go"],async enabled(){return await PKG.which("gofmt")!==null}},zx={name:"mix",command:["mix","format","$FILE"],extensions:[".ex",".exs",".eex",".heex",".leex",".neex",".sface"],async enabled(){return await PKG.which("mix")!==null}},Bx={name:"prettier",command:[whichSync(),"x","prettier","--write","$FILE"],environment:{},extensions:[".js",".jsx",".mjs",".cjs",".ts",".tsx",".mts",".cts",".html",".htm",".css",".scss",".sass",".less",".vue",".svelte",".json",".jsonc",".yaml",".yml",".toml",".xml",".md",".mdx",".graphql",".gql"],async enabled(){let t=await Filesystem.findUp("package.json",A.directory,A.worktree);for(let e of t){let n=await PKG.file(e).json();if(n.dependencies?.prettier||n.devDependencies?.prettier)return true}return false}},Hx={name:"oxfmt",command:[whichSync(),"x","oxfmt","$FILE"],environment:{},extensions:[".js",".jsx",".mjs",".cjs",".ts",".tsx",".mts",".cts"],async enabled(){if(!a$2.EASBOT_OXFMT)return false;let t=await Filesystem.findUp("package.json",A.directory,A.worktree);for(let e of t){let n=await PKG.file(e).json();if(n.dependencies?.oxfmt||n.devDependencies?.oxfmt)return true}return false}},qx={name:"biome",command:[whichSync(),"x","@biomejs/biome","check","--write","$FILE"],environment:{},extensions:[".js",".jsx",".mjs",".cjs",".ts",".tsx",".mts",".cts",".html",".htm",".css",".scss",".sass",".less",".vue",".svelte",".json",".jsonc",".yaml",".yml",".toml",".xml",".md",".mdx",".graphql",".gql"],async enabled(){let t=["biome.json","biome.jsonc"];for(let e of t)if((await Filesystem.findUp(e,A.directory,A.worktree)).length>0)return true;return false}},Gx={name:"zig",command:["zig","fmt","$FILE"],extensions:[".zig",".zon"],async enabled(){return await PKG.which("zig")!==null}},Wx={name:"clang-format",command:["clang-format","-i","$FILE"],extensions:[".c",".cc",".cpp",".cxx",".c++",".h",".hh",".hpp",".hxx",".h++",".ino",".C",".H"],async enabled(){return (await Filesystem.findUp(".clang-format",A.directory,A.worktree)).length>0}},Vx={name:"ktlint",command:["ktlint","-F","$FILE"],extensions:[".kt",".kts"],async enabled(){return await PKG.which("ktlint")!==null}},nf={name:"ruff",command:["ruff","format","$FILE"],extensions:[".py",".pyi"],async enabled(){if(!await PKG.which("ruff"))return false;let t=["pyproject.toml","ruff.toml",".ruff.toml"];for(let n of t){let o=await Filesystem.findUp(n,A.directory,A.worktree);if(o.length>0)if(n==="pyproject.toml"){if((await PKG.file(o[0]).text()).includes("[tool.ruff]"))return true}else return true}let e=["requirements.txt","pyproject.toml","Pipfile"];for(let n of e){let o=await Filesystem.findUp(n,A.directory,A.worktree);if(o.length>0&&(await PKG.file(o[0]).text()).includes("ruff"))return true}return false}},Kx={name:"air",command:["air","format","$FILE"],extensions:[".R"],async enabled(){if(await PKG.which("air")==null)return false;try{let e=process.platform==="win32"?"cmd":void 0,n=Shell.spawn(e,"air --help",{stdout:"pipe",stderr:"pipe"});await n.exited;let s=(await PKG.nodeReadableStreamToText(n.stdout)).split(`
34
+ `)[0];if(!s)return !1;let r=s.includes("R language"),i=s.includes("formatter");return r&&i}catch{return false}}},Jx={name:"uv",command:["uv","format","--","$FILE"],extensions:[".py",".pyi"],async enabled(){if(await nf.enabled())return false;if(await PKG.which("uv")!==null){let t=process.platform==="win32"?"cmd":void 0;return await Shell.spawn(t,"uv format --help",{stderr:"pipe",stdout:"pipe"}).exited===0}return false}},Yx={name:"rubocop",command:["rubocop","--autocorrect","$FILE"],extensions:[".rb",".rake",".gemspec",".ru"],async enabled(){return await PKG.which("rubocop")!==null}},Qx={name:"standardrb",command:["standardrb","--fix","$FILE"],extensions:[".rb",".rake",".gemspec",".ru"],async enabled(){return await PKG.which("standardrb")!==null}},Xx={name:"htmlbeautifier",command:["htmlbeautifier","$FILE"],extensions:[".erb",".html.erb"],async enabled(){return await PKG.which("htmlbeautifier")!==null}},Zx={name:"dart",command:["dart","format","$FILE"],extensions:[".dart"],async enabled(){return await PKG.which("dart")!==null}},eI={name:"ocamlformat",command:["ocamlformat","-i","$FILE"],extensions:[".ml",".mli"],async enabled(){return await PKG.which("ocamlformat")?(await Filesystem.findUp(".ocamlformat",A.directory,A.worktree)).length>0:false}},tI={name:"terraform",command:["terraform","fmt","$FILE"],extensions:[".tf",".tfvars"],async enabled(){return await PKG.which("terraform")!==null}},nI={name:"latexindent",command:["latexindent","-w","-s","$FILE"],extensions:[".tex"],async enabled(){return await PKG.which("latexindent")!==null}},oI={name:"gleam",command:["gleam","format","$FILE"],extensions:[".gleam"],async enabled(){return await PKG.which("gleam")!==null}},sI={name:"shfmt",command:["shfmt","-w","$FILE"],extensions:[".sh",".bash"],async enabled(){return await PKG.which("shfmt")!==null}},rI={name:"nixfmt",command:["nixfmt","$FILE"],extensions:[".nix"],async enabled(){return await PKG.which("nixfmt")!==null}},iI={name:"rustfmt",command:["rustfmt","$FILE"],extensions:[".rs"],async enabled(){return await PKG.which("rustfmt")!==null}},aI={name:"pint",command:["./vendor/bin/pint","$FILE"],extensions:[".php"],async enabled(){let t=await Filesystem.findUp("composer.json",A.directory,A.worktree);for(let e of t){let n=await PKG.file(e).json();if(n.require?.["laravel/pint"]||n["require-dev"]?.["laravel/pint"])return true}return false}},cI={name:"ormolu",command:["ormolu","-i","$FILE"],extensions:[".hs"],async enabled(){return await PKG.which("ormolu")!==null}};var Us;(f=>{let t=a.create({service:"format"});f.Status=z$1.object({name:z$1.string(),extensions:z$1.string().array(),enabled:z$1.boolean()}).meta({ref:"FormatterStatus"});async function n(){let m={},a=await he.get(),p={};if(a.formatter===false)return t.info("all formatters are disabled"),{enabled:m,formatters:p};for(let d of Object.values(ou))p[d.name]=d;for(let[d,h]of Object.entries(a.formatter??{})){if(h.disabled){delete p[d];continue}let w=mergeDeep(p[d]??{},{name:d,enabled:async()=>true,command:[],extensions:[],...h});w.command.length!==0&&(p[d]=w);}return {enabled:m,formatters:p}}let o;function s(){return o||(o=A.state(n)),o}async function r(){return s()()}async function i(m){let a=await r(),p=a.enabled[m.name];return p===void 0&&(p=await m.enabled(),a.enabled[m.name]=p),p}async function c(m){let a=await r().then(d=>d.formatters),p=[];for(let d of Object.values(a))t.debug("checking",{name:d.name,ext:m}),d.extensions.includes(m)&&await i(d)&&(t.debug("enabled",{name:d.name,ext:m}),p.push(d));return p}async function u(){let m=await r(),a=[];for(let p of Object.values(m.formatters)){let d=await i(p);a.push({name:p.name,extensions:p.extensions,enabled:d});}return a}f.status=u;function l(){t.debug("init"),ue.subscribe(It.Event.Edited,async m=>{let a=m.properties.file;t.debug("formatting",{file:a});let p=ke__default.extname(a);for(let d of await c(p)){t.debug("running",{command:d.command});try{let h=d.command.map(g=>g.replace("$FILE",a)),w=await PKG.run(h,{cwd:A.directory,env:{...process.env,...d.environment},stdout:"ignore",stderr:"pipe"});w.code!==0&&t.error("format failed",{command:h,exitCode:w.code,stderr:w.stderr});}catch(h){t.error("failed to format file",{error:h,command:d.command,...d.environment,file:a});}}});}f.init=l;})(Us||(Us={}));var zn;(g=>{g.Tokens=z$1.object({accessToken:z$1.string(),refreshToken:z$1.string().optional(),expiresAt:z$1.number().optional(),scope:z$1.string().optional()}),g.ClientInfo=z$1.object({clientId:z$1.string(),clientSecret:z$1.string().optional(),clientIdIssuedAt:z$1.number().optional(),clientSecretExpiresAt:z$1.number().optional()}),g.Entry=z$1.object({tokens:g.Tokens.optional(),clientInfo:g.ClientInfo.optional(),codeVerifier:z$1.string().optional(),oauthState:z$1.string().optional(),serverUrl:z$1.string().optional()});let o=ke__default.join(a$1.Path.data,"mcp-auth.json");async function s(b){return (await i())[b]}g.get=s;async function r(b,v){let k=await s(b);if(k&&k.serverUrl&&k.serverUrl===v)return k}g.getForUrl=r;async function i(){return PKG.file(o).json().catch(()=>({}))}g.all=i;async function c(b,v,k){PKG.file(o);let y=await i();k&&(v.serverUrl=k),await PKG.write(o,JSON.stringify({...y,[b]:v},null,2));}g.set=c;async function u(b){PKG.file(o);let k=await i();delete k[b],await PKG.write(o,JSON.stringify(k,null,2));}g.remove=u;async function l(b,v,k){let S=await s(b)??{};S.tokens=v,await c(b,S,k);}g.updateTokens=l;async function f(b,v,k){let S=await s(b)??{};S.clientInfo=v,await c(b,S,k);}g.updateClientInfo=f;async function m(b,v){let k=await s(b)??{};k.codeVerifier=v,await c(b,k);}g.updateCodeVerifier=m;async function a(b){let v=await s(b);v&&(delete v.codeVerifier,await c(b,v));}g.clearCodeVerifier=a;async function p(b,v){let k=await s(b)??{};k.oauthState=v,await c(b,k);}g.updateOAuthState=p;async function d(b){return (await s(b))?.oauthState}g.getOAuthState=d;async function h(b){let v=await s(b);v&&(delete v.oauthState,await c(b,v));}g.clearOAuthState=h;async function w(b){let v=await s(b);return v?.tokens?v.tokens.expiresAt?v.tokens.expiresAt<Date.now()/1e3:false:null}g.isTokenExpired=w;})(zn||(zn={}));a.create({service:"mcp.oauth"});var Nr=19876,of="/mcp/oauth/callback";var $r=a.create({service:"mcp.oauth-callback"}),gI=`<!DOCTYPE html>
35
+ <html>
36
+ <head>
37
+ <title>EasBot - Authorization Successful</title>
38
+ <style>
39
+ body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
40
+ .container { text-align: center; padding: 2rem; }
41
+ h1 { color: #4ade80; margin-bottom: 1rem; }
42
+ p { color: #aaa; }
43
+ </style>
44
+ </head>
45
+ <body>
46
+ <div class="container">
47
+ <h1>Authorization Successful</h1>
48
+ <p>You can close this window and return to EasBot.</p>
49
+ </div>
50
+ <script>setTimeout(() => window.close(), 2000);</script>
51
+ </body>
52
+ </html>`,Ac=t=>`<!DOCTYPE html>
53
+ <html>
54
+ <head>
55
+ <title>EasBot - Authorization Failed</title>
56
+ <style>
57
+ body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background: #1a1a2e; color: #eee; }
58
+ .container { text-align: center; padding: 2rem; }
59
+ h1 { color: #f87171; margin-bottom: 1rem; }
60
+ p { color: #aaa; }
61
+ .error { color: #fca5a5; font-family: monospace; margin-top: 1rem; padding: 1rem; background: rgba(248,113,113,0.1); border-radius: 0.5rem; }
62
+ </style>
63
+ </head>
64
+ <body>
65
+ <div class="container">
66
+ <h1>Authorization Failed</h1>
67
+ <p>An error occurred during authorization.</p>
68
+ <div class="error">${t}</div>
69
+ </div>
70
+ </body>
71
+ </html>`,Fr;(l=>{let t,e=new Map,n=300*1e3;async function o(){if(t)return;if(await i()){$r.info("oauth callback server already running on another instance",{port:Nr});return}t=createServer((m,a)=>{let p=new URL(m.url||"",`http://localhost:${Nr}`);if(p.pathname!==of){a.writeHead(404,{"Content-Type":"text/plain"}),a.end("Not found");return}let d=p.searchParams.get("code"),h=p.searchParams.get("state"),w=p.searchParams.get("error"),g=p.searchParams.get("error_description");if($r.info("received oauth callback",{hasCode:!!d,state:h,error:w}),!h){let v="Missing required state parameter - potential CSRF attack";$r.error("oauth callback missing state parameter",{url:p.toString()}),a.writeHead(400,{"Content-Type":"text/html"}),a.end(Ac(v));return}if(w){let v=g||w;if(e.has(h)){let k=e.get(h);clearTimeout(k.timeout),e.delete(h),k.reject(new Error(v));}a.writeHead(200,{"Content-Type":"text/html"}),a.end(Ac(v));return}if(!d){a.writeHead(400,{"Content-Type":"text/html"}),a.end(Ac("No authorization code provided"));return}if(!e.has(h)){let v="Invalid or expired state parameter - potential CSRF attack";$r.error("oauth callback with invalid state",{state:h,pendingStates:Array.from(e.keys())}),a.writeHead(400,{"Content-Type":"text/html"}),a.end(Ac(v));return}let b=e.get(h);clearTimeout(b.timeout),e.delete(h),b.resolve(d),a.writeHead(200,{"Content-Type":"text/html"}),a.end(gI);}).listen(Nr),$r.info("oauth callback server started",{port:Nr});}l.ensureRunning=o;function s(f){return new Promise((m,a)=>{let p=setTimeout(()=>{e.has(f)&&(e.delete(f),a(new Error("OAuth callback timeout - authorization took too long")));},n);e.set(f,{resolve:m,reject:a,timeout:p});})}l.waitForCallback=s;function r(f){let m=e.get(f);m&&(clearTimeout(m.timeout),e.delete(f),m.reject(new Error("Authorization cancelled")));}l.cancelPending=r;async function i(){return new Promise(f=>{let m=connect({host:"127.0.0.1",port:Nr});m.on("connect",()=>{m.end(),f(true);}),m.on("error",()=>{f(false);});})}l.isPortInUse=i;async function c(){t&&(t.close(),t=void 0,$r.info("oauth callback server stopped"));for(let[,f]of e)clearTimeout(f.timeout),f.reject(new Error("OAuth callback server stopped"));e.clear();}l.stop=c;function u(){return t!==void 0}l.isRunning=u;})(Fr||(Fr={}));var ze;(O=>{let t=a.create({service:"mcp"}),e=3e4;O.ToolsChanged=a$5.define("mcp.tools.changed",z$1.object({server:z$1.string()})),O.BrowserOpenFailed=a$5.define("mcp.browser.open.failed",z$1.object({mcpName:z$1.string(),url:z$1.string()})),O.Failed=NamedError.create("MCPFailed",z$1.object({name:z$1.string()}));function r(C){return typeof C=="object"&&C!==null&&"type"in C}async function i(){let E=(await he.get()).mcp??{},R={},L={};return await Promise.all(Object.entries(E).map(async([q,Q])=>{if(!r(Q)){t.error("Ignoring MCP config entry without type",{key:q});return}if(Q.enabled===false)return;let Z=await p(q,Q).catch(()=>{});Z&&(R[q]=Z),L[q]={name:q,config:Q,scope:Q.scope};})),{clients:R,configInfo:L}}let c;function u(){return c||(c=A.state(i,async C=>{await initLog$3({logDir:a$1.Path.log,logFile:"mcp.log",level:a.getLevel(),print:false}),await Promise.all(Object.values(C.clients).map(E=>E.disconnect().catch(R=>{t.error("Failed to close MCP client",{error:R});}))),M.clear();})),c}async function l(){return u()()}function f(C){return C?C.status:{status:"disconnected"}}async function m(C,E){let R=await E.listPrompts().catch(q=>(t.error("failed to get prompts",{clientName:C,error:q.message}),[])),L={};for(let q of R){let Q=C.replace(/[^a-zA-Z0-9_-]/g,"_"),Z=q.name.replace(/[^a-zA-Z0-9_-]/g,"_"),se=Q+":"+Z;L[se]={...q,client:C};}return L}async function a$2(C,E){let R=await E.listResources().catch(q=>(t.error("failed to get resources",{clientName:C,error:q.message}),[])),L={};for(let q of R){let Q=C.replace(/[^a-zA-Z0-9_-]/g,"_"),Z=q.name.replace(/[^a-zA-Z0-9_-]/g,"_"),se=Q+":"+Z;L[se]={...q,client:C};}return L}async function p(C,E){if(E.enabled===false){t.info("mcp server disabled",{key:C});return}t.info("found",{key:C,type:E.type});let R=new MCPClient;if(E.type==="remote"){let q=E.oauth===false,Q=typeof E.oauth=="object"?E.oauth:void 0,Z={type:"remote",url:E.url,headers:E.headers,oauth:q?false:Q,timeout:E.timeout},se=E.timeout??e;try{await su(R.connect(C,Z),se),R.setToolListChangedHandler(async()=>{t.info("tools list changed notification received",{server:C}),await ue.publish(O.ToolsChanged,{server:C});}),t.info("connected",{key:C});}catch(le){R.isAuthRequired()?(M.set(C,R),ue.publish(b$2.ToastShow,{title:"MCP Authentication Required",message:`Server "${C}" requires authentication. Run: easbot mcp auth ${C}`,variant:"warning",duration:8e3}).catch(de=>t.debug("failed to show toast",{error:de}))):R.isClientRegistrationRequired()?ue.publish(b$2.ToastShow,{title:"MCP Authentication Required",message:`Server "${C}" requires a pre-registered client ID. Add clientId to your config.`,variant:"warning",duration:8e3}).catch(de=>t.debug("failed to show toast",{error:de})):t.error("remote mcp connection failed",{key:C,error:le instanceof Error?le.message:String(le)});}}if(E.type==="local"){if(!E.command){t.error("MCP command is empty",{key:C});return}let q={type:"local",command:[E.command,...E.args??[]],cwd:A.directory,environment:E.env,timeout:E.timeout},Q=E.timeout??e;try{await su(R.connect(C,q),Q),R.setToolListChangedHandler(async()=>{t.info("tools list changed notification received",{server:C}),await ue.publish(O.ToolsChanged,{server:C});}),t.info("local mcp connected",{key:C});}catch(Z){t.error("local mcp startup failed",{key:C,command:E.command,args:E.args,cwd:A.directory,error:Z instanceof Error?Z.message:String(Z)});}}if(R.status.status!=="connected")return R;let L=await su(Promise.resolve(R.listTools()).then(q=>({tools:Object.values(q).map(Q=>Q)})),E.timeout??e).catch(q=>{t.error("failed to get tools from client",{key:C,error:q});});if(!L){await R.disconnect().catch(q=>{t.error("Failed to close MCP client",{error:q});});return}return t.info("create() successfully created client",{key:C,toolCount:L.tools.length}),R}async function d(C,E){let R=await l(),L=await p(C,E);if(!L)return {status:await h()};let q=R.clients[C];return q&&await q.disconnect().catch(Q=>{t.error("Failed to close existing MCP client",{name:C,error:Q});}),R.clients[C]=L,{status:await h()}}O.add=d;async function h(){let C=await l(),R=(await he.get()).mcp??{},L={};for(let[q,Q]of Object.entries(R)){if(!r(Q))continue;let Z=C.clients[q];Q.enabled===false?L[q]={status:"disabled"}:L[q]=f(Z);}return L}O.status=h;async function w(){return l().then(C=>C.clients)}O.clients=w;async function g(){return l().then(C=>C.configInfo)}O.configInfo=g;async function b(C){return (await g())[C]}O.getConfig=b;async function v(C){let L=((await he.get()).mcp??{})[C];if(!L){t.error("MCP config not found",{name:C});return}if(!r(L)){t.error("Ignoring MCP connect request for config without type",{name:C});return}let q=await p(C,L),Q=await l();if(q){let Z=Q.clients[C];Z&&await Z.disconnect().catch(se=>{t.error("Failed to close existing MCP client",{name:C,error:se});}),Q.clients[C]=q;}}O.connect=v;async function k(C){let E=await l(),R=E.clients[C];R&&(await R.disconnect().catch(L=>{t.error("Failed to close MCP client",{name:C,error:L});}),delete E.clients[C]);}O.disconnect=k;async function S(){let C={},E=await he.get(),R=await w(),L=E.experimental?.mcp_timeout;for(let[q,Q]of Object.entries(R)){if(Q.status.status!=="connected")continue;let Z=await Q.listTools().catch(se=>(t.error("failed to get tools",{clientName:q,error:se.message}),{}));for(let[se,le]of Object.entries(Z)){let de=le,be=q.replace(/[^a-zA-Z0-9_-]/g,"_"),re=se.replace(/[^a-zA-Z0-9_-]/g,"_"),X=be+"_"+re;C[X]=await y(de,Q,L);}}return C}O.tools=S;async function y(C,E,R){let L=C.inputSchema,q={...L,type:"object",properties:L.properties??{},additionalProperties:false};return dynamicTool({description:C.description??"",inputSchema:jsonSchema(q),execute:async Q=>{let Z=await E.callTool(C.name,Q||{},R);return {content:Z.content.map(se=>se.type==="text"?{type:"text",text:se.text??""}:se.type==="image"?{type:"image",data:se.data??"",mimeType:se.mimeType}:se.type==="resource"&&se.resource?{type:"resource",resource:se.resource}:{type:"text",text:String(se)}),metadata:Z.metadata}}})}async function x(){let C=await w(),E=await g(),R=[];for(let[L,q]of Object.entries(C)){if(q.status.status!=="connected")continue;let Q=await m(L,q),se=E[L]?.scope??"all";for(let[le,de]of Object.entries(Q))R.push([le,{...de,scope:se}]);}return Object.fromEntries(R)}O.prompts=x;async function I(){let C=await w();return Object.fromEntries((await Promise.all(Object.entries(C).map(async([R,L])=>L.status.status!=="connected"?[]:Object.entries(await a$2(R,L))))).flat())}O.resources=I;async function P(C,E,R){let q=(await w())[C];if(!q){t.warn("client not found for prompt",{clientName:C});return}return q.getPrompt(E,R).catch(Q=>{t.error("failed to get prompt from MCP server",{clientName:C,promptName:E,error:Q.message});})}O.getPrompt=P;async function T(C,E){let L=(await w())[C];if(!L){t.warn("client not found for resource",{clientName:C});return}return L.readResource(E).catch(q=>{t.error("failed to read resource from MCP server",{clientName:C,resourceUri:E,error:q.message});})}O.readResource=T;let M=new Map;async function j(C){let R=(await he.get()).mcp?.[C];if(!R)throw new Error(`MCP server not found: ${C}`);if(!r(R))throw new Error(`MCP server ${C} is disabled or missing configuration`);if(R.type!=="remote")throw new Error(`MCP server ${C} is not a remote server`);if(R.oauth===false)throw new Error(`MCP server ${C} has OAuth explicitly disabled`);await Fr.ensureRunning();let L=Array.from(crypto.getRandomValues(new Uint8Array(32))).map(Z=>Z.toString(16).padStart(2,"0")).join("");await zn.updateOAuthState(C,L);let q=typeof R.oauth=="object"?R.oauth:void 0,Q=new MCPClient;try{return await Q.connect(C,{type:"remote",url:R.url,headers:R.headers,oauth:q,timeout:R.timeout}),{authorizationUrl:""}}catch(Z){if(Q.isAuthRequired())return M.set(C,Q),{authorizationUrl:Q.getAuthorizationUrl()};throw Z}}O.startAuth=j;async function N(C){let{authorizationUrl:E}=await j(C);if(!E){let se=(await l()).clients[C];return f(se)}let R=await zn.getOAuthState(C);if(!R)throw new Error("OAuth state not found");t.info("opening browser for oauth",{mcpName:C,url:E,state:R});let L=Fr.waitForCallback(R);try{let Z=await xI(E);await new Promise((se,le)=>{let de=setTimeout(()=>se(),500);Z.on("error",be=>{clearTimeout(de),le(be);}),Z.on("exit",be=>{be!==null&&be!==0&&(clearTimeout(de),le(new Error(`Browser open failed with exit code ${be}`)));});});}catch(Z){t.warn("failed to open browser, user must open URL manually",{mcpName:C,error:Z}),await ue.publish(O.BrowserOpenFailed,{mcpName:C,url:E});}let q=await L;if(await zn.getOAuthState(C)!==R)throw await zn.clearOAuthState(C),new Error("OAuth state mismatch");return await zn.clearOAuthState(C),K(C,q)}O.authenticate=N;async function K(C,E){let R=M.get(C);if(!R)throw new Error(`No pending OAuth flow for MCP server: ${C}`);try{await R.finishAuth(E),await zn.clearCodeVerifier(C);let q=(await he.get()).mcp?.[C];if(!q||!r(q))throw new Error(`MCP server not found: ${C}`);M.delete(C),await d(C,q);let Q=await l();return f(Q.clients[C])}catch(L){return t.error("failed to finish oauth",{mcpName:C,error:L}),{status:"failed",error:L instanceof Error?L.message:String(L)}}}O.finishAuth=K;async function te(C){await zn.remove(C),Fr.cancelPending(C),M.delete(C),await zn.clearOAuthState(C),t.info("removed oauth credentials",{mcpName:C});}O.removeAuth=te;async function U(C){let R=(await he.get()).mcp?.[C];return !R||!r(R)?false:R.type==="remote"&&R.oauth!==false}O.supportsOAuth=U;async function _(C){return !!(await zn.get(C))?.tokens}O.hasStoredTokens=_;async function D(C){return await _(C)?await zn.isTokenExpired(C)?"expired":"authenticated":"not_authenticated"}O.getAuthStatus=D;})(ze||(ze={}));function su(t,e){return new Promise((n,o)=>{let s=setTimeout(()=>o(new Error(`Operation timed out after ${e}ms`)),e);t.then(r=>{clearTimeout(s),n(r);}).catch(r=>{clearTimeout(s),o(r);});})}var Ps={};a$7(Ps,{create:()=>zC,createAgent:()=>qg,getAgent:()=>kl,getDefaultAgent:()=>FC,list:()=>UC,listAgents:()=>Hg});var Me;(x=>{let t=a.create({service:"permission"});function e(I){return I.startsWith("~/")?Mc.homedir()+I.slice(1):I==="~"?Mc.homedir():I.startsWith("$HOME/")?Mc.homedir()+I.slice(5):I.startsWith("$HOME")?Mc.homedir()+I.slice(5):I}x.Action=z$1.enum(["allow","deny","ask"]).meta({ref:"PermissionAction"}),x.Rule=z$1.object({permission:z$1.string(),pattern:z$1.string(),action:x.Action}).meta({ref:"PermissionRule"}),x.Ruleset=x.Rule.array().meta({ref:"PermissionRuleset"});function r(I){let P=[];for(let[T,M]of Object.entries(I)){if(typeof M=="string"){P.push({permission:T,action:M,pattern:"*"});continue}P.push(...Object.entries(M).map(([j,N])=>({permission:T,pattern:e(j),action:N})));}return P}x.fromConfig=r;function i(...I){return I.flat()}x.merge=i,x.Request=z$1.object({id:Identifier.schema("permission"),sessionID:Identifier.schema("session"),permission:z$1.string(),patterns:z$1.string().array(),metadata:z$1.record(z$1.string(),z$1.any()),always:z$1.string().array(),tool:z$1.object({messageID:z$1.string(),callID:z$1.string()}).optional()}).meta({ref:"PermissionRequest"}),x.Reply=z$1.enum(["once","always","reject"]),x.Approval=z$1.object({projectID:z$1.string(),patterns:z$1.string().array()}),x.Event={Asked:a$5.define("permission.asked",x.Request),Replied:a$5.define("permission.replied",z$1.object({sessionID:z$1.string(),requestID:z$1.string(),reply:x.Reply}))};let m;function a$1(){return m||(m=A.state(async()=>{let I=A.project.id,P=await a$6.read(["permission",I]).catch(()=>[]);return {pending:{},approved:P}})),m}function p(){return a$1()()}x.ask=fn$1(x.Request.partial({id:true}).extend({ruleset:x.Ruleset}),async I=>{let P=await p(),{ruleset:T,...M}=I;for(let j of M.patterns??[]){let N=w(M.permission,j,T,P.approved);if(t.info("evaluated",{permission:M.permission,pattern:j,action:N}),N.action==="deny")throw new S(T.filter(K=>Wildcard.match(M.permission,K.permission)));if(N.action==="ask"){let K=I.id??Identifier.ascending("permission");return new Promise((te,U)=>{let _={id:K,...M};P.pending[K]={info:_,resolve:te,reject:U},ue.publish(x.Event.Asked,_);})}}}),x.reply=fn$1(z$1.object({requestID:Identifier.schema("permission"),reply:x.Reply,message:z$1.string().optional()}),async I=>{let P=await p(),T=P.pending[I.requestID];if(T){if(delete P.pending[I.requestID],await ue.publish(x.Event.Replied,{sessionID:T.info.sessionID,requestID:T.info.id,reply:I.reply}),I.reply==="reject"){T.reject(I.message?new k(I.message):new v);let M=T.info.sessionID;for(let[j,N]of Object.entries(P.pending))N.info.sessionID===M&&(delete P.pending[j],await ue.publish(x.Event.Replied,{sessionID:N.info.sessionID,requestID:N.info.id,reply:"reject"}),N.reject(new v));return}if(I.reply==="once"){T.resolve();return}if(I.reply==="always"){for(let j of T.info.always)P.approved.push({permission:T.info.permission,pattern:j,action:"allow"});T.resolve();let M=T.info.sessionID;for(let[j,N]of Object.entries(P.pending))N.info.sessionID!==M||!N.info.patterns.every(te=>w(N.info.permission,te,P.approved).action==="allow")||(delete P.pending[j],await ue.publish(x.Event.Replied,{sessionID:N.info.sessionID,requestID:N.info.id,reply:"always"}),N.resolve());return}}});function w(I,P,...T){let M=i(...T);return t.info("evaluate",{permission:I,pattern:P,ruleset:M}),M.findLast(N=>Wildcard.match(I,N.permission)&&Wildcard.match(P,N.pattern))??{action:"ask",permission:I,pattern:"*"}}x.evaluate=w;let g=["edit","write","patch","multiedit"];function b(I,P){let T=new Set;for(let M of I){let j=g.includes(M)?"edit":M,N=P.findLast(K=>Wildcard.match(j,K.permission));N&&N.pattern==="*"&&N.action==="deny"&&T.add(M);}return T}x.disabled=b;class v extends Error{constructor(){super("The user rejected permission to use this specific tool call.");}}x.RejectedError=v;class k extends Error{constructor(P){super(`The user rejected permission to use this specific tool call with the following feedback: ${P}`);}}x.CorrectedError=k;class S extends Error{constructor(T){super(`The user has specified a rule which prevents you from using this specific tool call. Here are some of the relevant rules ${JSON.stringify(T)}`);b$1(this,"ruleset",T);}}x.DeniedError=S;async function y(){return p().then(I=>Object.values(I.pending).map(P=>P.info))}x.list=y;})(Me||(Me={}));var Ke;(m=>{let t=a.create({service:"tool-truncation"});m.MAX_LINES=500,m.MAX_BYTES=50*1024,m.DIR=ke__default.join(a$1.Path.data,"tool-output"),m.GLOB=ke__default.join(m.DIR,"*");let r=10080*60*1e3;async function i(){try{let{Scheduler:a}=await import('./scheduler-SCM4SRS2.mjs');await a.createCommand({id:"cmd_tool-truncation-cleanup",name:"truncation-cleanup",cron:"0 * * * *",command:"cleanup",arguments:"truncation",recurring:!0,durable:!0});}catch(a){t.error("Failed to register cleanup task",{error:a});}}m.init=i;async function c(){let a=Identifier.timestamp(Identifier.create("tool",false,Date.now()-r)),d=(await Ot__default.readdir(m.DIR).catch(()=>[])).filter(h=>h.startsWith("tool_"));for(let h of d)Identifier.timestamp(h)>=a||await Ot__default.unlink(ke__default.join(m.DIR,h)).catch(()=>{});}m.cleanup=c;function u(a){return a?.permission?Me.evaluate("task","*",a.permission).action!=="deny":false}async function l(a,p={},d){let h=p.maxLines??m.MAX_LINES,w=p.maxBytes??m.MAX_BYTES,g=p.direction??"head",b=a.split(`
72
+ `),v=Buffer.byteLength(a,"utf-8");if(b.length<=h&&v<=w)return {content:a,truncated:false};let k=[],S=0,y=0;if(g==="head")for(S=0;S<b.length&&S<h;S++){let U=b[S];if(!U)continue;let _=Buffer.byteLength(U,"utf-8")+(S>0?1:0);if(y+_>w){break}k.push(U),y+=_;}else for(S=b.length-1;S>=0&&k.length<h;S--){let U=b[S];if(!U)continue;let _=Buffer.byteLength(U,"utf-8")+(k.length>0?1:0);if(y+_>w){break}k.unshift(U),y+=_;}let I=b.length-k.length,P=v-y,T=k.join(`
73
+ `),M=Identifier.ascending("tool"),j=ke__default.join(m.DIR,M);await Ot__default.mkdir(m.DIR,{recursive:true}).catch(()=>{}),await Ot__default.writeFile(j,a,"utf-8");let N=u(d)?`The tool call succeeded but the output was truncated. Full output saved to: ${j}
74
+ Use the Task tool to have explore agent process this file with Grep and Read (with offset/limit). Do NOT read the full file yourself - delegate to save context.`:`The tool call succeeded but the output was truncated. Full output saved to: ${j}
75
+ Use Grep to search the full content or Read with offset/limit to view specific sections.`,K=`${I}/${b.length} lines (${P}/${v} bytes) truncated`;return {content:g==="head"?`${T}
76
+
77
+ ...${K}...
78
+
79
+ ${N}`:`...${K}...
80
+
81
+ ${N}
82
+
83
+ ${T}`,truncated:true,outputPath:j}}m.output=l;function f(a,p){if(!a.truncated)return "";let{outputPath:d}=a;return u(p)?`The tool call succeeded but the output was truncated. Full output saved to: ${d}
84
+ Use the Task tool to have explore agent process this file (with Grep and Read tools). Do NOT read the full file yourself - delegate to save context.`:`The tool call succeeded but the output was truncated. Full output saved to: ${d}
85
+ Use Grep to search the full content, or use Read tool with offset/limit parameters to view specific sections.`}m.formatHint=f;})(Ke||(Ke={}));a.create({service:"provider-transform"});function vI(t){if(t.startsWith("image/"))return "image";if(t.startsWith("audio/"))return "audio";if(t.startsWith("video/"))return "video";if(t==="application/pdf")return "pdf"}var vt;(b=>{b.OUTPUT_TOKEN_MAX=a$2.EASBOT_OUTPUT_TOKEN_MAX||32e3;function e(v){switch(v){case "@ai-sdk/github-copilot":return "copilot";case "@ai-sdk/openai":case "@ai-sdk/azure":return "openai";case "@ai-sdk/amazon-bedrock":return "bedrock";case "@ai-sdk/anthropic":case "@ai-sdk/google-vertex/anthropic":return "anthropic";case "@ai-sdk/google-vertex":case "@ai-sdk/google":return "google";case "@ai-sdk/gateway":return "gateway";case "@openrouter/ai-sdk-provider":return "openrouter";case "@easbot/ollama-sdk":return "ollama";case "@easbot/local-model-sdk":return "easbot-local"}}function n(v,k,S){if(k.api.npm==="@ai-sdk/anthropic"&&(v=v.map(y=>{if(typeof y.content=="string")return y.content===""?void 0:y;if(!Array.isArray(y.content))return y;let x=y.content.filter(I=>I.type==="text"||I.type==="reasoning"?I.text!=="":true);if(x.length!==0)return {...y,content:x}}).filter(y=>y!==void 0&&y.content!=="")),k.api.id.includes("claude"))return v.map(y=>((y.role==="assistant"||y.role==="tool")&&Array.isArray(y.content)&&(y.content=y.content.map(x=>(x.type==="tool-call"||x.type==="tool-result")&&"toolCallId"in x?{...x,toolCallId:x.toolCallId.replace(/[^a-zA-Z0-9_-]/g,"_")}:x)),y));if(k.providerID==="mistral"||k.api.id.toLowerCase().includes("mistral")||k.api.id.toLocaleLowerCase().includes("devstral")){let y=[];for(let x=0;x<v.length;x++){let I=v[x];if(!I)continue;let P=v[x+1];(I.role==="assistant"||I.role==="tool")&&Array.isArray(I.content)&&(I.content=I.content.map(T=>{if((T.type==="tool-call"||T.type==="tool-result")&&"toolCallId"in T){let M=T.toolCallId.replace(/[^a-zA-Z0-9]/g,"").substring(0,9).padEnd(9,"0");return {...T,toolCallId:M}}return T})),y.push(I),I.role==="tool"&&P?.role==="user"&&y.push({role:"assistant",content:[{type:"text",text:"Done."}]});}return y}if(typeof k.capabilities.interleaved=="object"&&k.capabilities.interleaved.field){let y=k.capabilities.interleaved.field;return v.map(x=>{if(x.role==="assistant"&&Array.isArray(x.content)){let P=x.content.filter(M=>M.type==="reasoning").map(M=>M.text).join(""),T=x.content.filter(M=>M.type!=="reasoning");return P?{...x,content:T,providerOptions:{...x.providerOptions,openaiCompatible:{...x.providerOptions?.openaiCompatible,[y]:P}}}:{...x,content:T}}return x})}return v}function o(v,k){let S=v.filter(I=>I.role==="system").slice(0,2),y=v.filter(I=>I.role!=="system").slice(-2),x={anthropic:{cacheControl:{type:"ephemeral"}},openrouter:{cacheControl:{type:"ephemeral"}},bedrock:{cachePoint:{type:"default"}},openaiCompatible:{cache_control:{type:"ephemeral"}},copilot:{copilot_cache_control:{type:"ephemeral"}}};for(let I of unique([...S,...y])){if(!(k==="anthropic"||k.includes("bedrock"))&&Array.isArray(I.content)&&I.content.length>0){let M=I.content[I.content.length-1];if(M&&typeof M=="object"){M.providerOptions=mergeDeep(M.providerOptions??{},x);continue}}I.providerOptions=mergeDeep(I.providerOptions??{},x);}return v}function s(v,k){return v.map(S=>{if(S.role!=="user"||!Array.isArray(S.content))return S;let y=S.content.map(x=>{if(x.type!=="file"&&x.type!=="image")return x;if(x.type==="image"){let j=x.image.toString();if(j.startsWith("data:")){let N=j.match(/^data:([^;]+);base64,(.*)$/);if(N&&(!N[2]||N[2].length===0))return {type:"text",text:"ERROR: Image file is empty or corrupted. Please provide a valid image."}}}let I=x.type==="image"?x.image?.toString()?.split(";")?.[0]?.replace("data:",""):x.mediaType,P=x.type==="file"?x.filename:void 0,T=vI(I??"");return !T||k.capabilities.input[T]?x:{type:"text",text:`ERROR: Cannot read ${P?`"${P}"`:T} (this model does not support ${T} input). Inform the user.`}});return {...S,content:y}})}function r(v,k,S){v=s(v,k),v=n(v,k),(k.providerID==="anthropic"||k.api.id.includes("anthropic")||k.api.id.includes("claude")||k.id.includes("anthropic")||k.id.includes("claude")||k.api.npm==="@ai-sdk/anthropic")&&(v=o(v,k.providerID));let y=e(k.api.npm);if(y&&y!==k.providerID&&k.api.npm!=="@ai-sdk/azure"){let x=I=>{if(!I||!(k.providerID in I))return I;let P={...I};return P[y]=P[k.providerID],delete P[k.providerID],P};v=v.map(I=>Array.isArray(I.content)?{...I,providerOptions:x(I.providerOptions),content:I.content.map(P=>({...P,providerOptions:x(P.providerOptions)}))}:{...I,providerOptions:x(I.providerOptions)});}return v}b.message=r;function i(v){let k=v.id.toLowerCase();if(k.includes("qwen"))return .55;if(!k.includes("claude")){if(k.includes("gemini")||k.includes("glm-4.6")||k.includes("glm-4.7")||k.includes("minimax-m2"))return 1;if(k.includes("kimi-k2"))return k.includes("thinking")||k.includes("k2.")||k.includes("k2p")?1:.6}}b.temperature=i;function c(v){let k=v.id.toLowerCase();if(k.includes("qwen"))return 1;if(k.includes("minimax-m2")||k.includes("kimi-k2.5")||k.includes("kimi-k2p5")||k.includes("gemini"))return .95}b.topP=c;function u(v){let k=v.id.toLowerCase();if(k.includes("minimax-m2"))return k.includes("m2.1")?40:20;if(k.includes("gemini"))return 64}b.topK=u;let l=["low","medium","high"],f=["none","minimal",...l,"xhigh"];function m(v){if(!v.capabilities.reasoning)return {};let k=v.id.toLowerCase();if(k.includes("deepseek")||k.includes("minimax")||k.includes("glm")||k.includes("mistral")||k.includes("kimi")||k.includes("k2p5"))return {};if(k.includes("grok")&&k.includes("grok-3-mini"))return v.api.npm==="@openrouter/ai-sdk-provider"?{low:{reasoning:{effort:"low"}},high:{reasoning:{effort:"high"}}}:{low:{reasoningEffort:"low"},high:{reasoningEffort:"high"}};if(k.includes("grok"))return {};switch(v.api.npm){case "@openrouter/ai-sdk-provider":return !v.id.includes("gpt")&&!v.id.includes("gemini-3")?{}:Object.fromEntries(f.map(S=>[S,{reasoning:{effort:S}}]));case "@ai-sdk/gateway":return Object.fromEntries(f.map(S=>[S,{reasoningEffort:S}]));case "@ai-sdk/github-copilot":{if(v.id.includes("gemini"))return {};if(v.id.includes("claude"))return {thinking:{thinking_budget:4e3}};let S=iife(()=>k.includes("5.1-codex-max")||k.includes("5.2")||k.includes("5.3")?[...l,"xhigh"]:l);return Object.fromEntries(S.map(y=>[y,{reasoningEffort:y,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/cerebras":case "@ai-sdk/togetherai":case "@ai-sdk/xai":case "@ai-sdk/deepinfra":case "@ai-sdk/openai-compatible":return Object.fromEntries(l.map(S=>[S,{reasoningEffort:S}]));case "@ai-sdk/azure":{if(k==="o1-mini")return {};let S=["low","medium","high"];return (k.includes("gpt-5-")||k==="gpt-5")&&S.unshift("minimal"),Object.fromEntries(S.map(y=>[y,{reasoningEffort:y,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/openai":{if(k==="gpt-5-pro")return {};let S=iife(()=>{if(k.includes("codex"))return k.includes("5.2")||k.includes("5.3")?[...l,"xhigh"]:l;let y=[...l];return (k.includes("gpt-5-")||k==="gpt-5")&&y.unshift("minimal"),v.release_date>="2025-11-13"&&y.unshift("none"),v.release_date>="2025-12-04"&&y.push("xhigh"),y});return Object.fromEntries(S.map(y=>[y,{reasoningEffort:y,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}case "@ai-sdk/anthropic":case "@ai-sdk/google-vertex/anthropic":return {high:{thinking:{type:"enabled",budgetTokens:Math.min(16e3,Math.floor(v.limit.output/2-1))}},max:{thinking:{type:"enabled",budgetTokens:Math.min(31999,v.limit.output-1)}}};case "@ai-sdk/amazon-bedrock":return v.api.id.includes("anthropic")?{high:{reasoningConfig:{type:"enabled",budgetTokens:16e3}},max:{reasoningConfig:{type:"enabled",budgetTokens:31999}}}:Object.fromEntries(l.map(S=>[S,{reasoningConfig:{type:"enabled",maxReasoningEffort:S}}]));case "@ai-sdk/google-vertex":case "@ai-sdk/google":return k.includes("2.5")?{high:{thinkingConfig:{includeThoughts:true,thinkingBudget:16e3}},max:{thinkingConfig:{includeThoughts:true,thinkingBudget:24576}}}:Object.fromEntries(["low","high"].map(S=>[S,{includeThoughts:true,thinkingLevel:S}]));case "@ai-sdk/mistral":return {};case "@ai-sdk/cohere":return {};case "@ai-sdk/groq":{let S=["none",...l];return Object.fromEntries(S.map(y=>[y,{includeThoughts:true,thinkingLevel:y}]))}case "@ai-sdk/perplexity":return {};case "@mymediset/sap-ai-provider":case "@jerome-benoit/sap-ai-provider-v2":return v.api.id.includes("anthropic")?{high:{thinking:{type:"enabled",budgetTokens:16e3}},max:{thinking:{type:"enabled",budgetTokens:31999}}}:Object.fromEntries(l.map(S=>[S,{reasoningEffort:S}]))}return {}}b.variants=m;function a(v){let k={};(v.model.providerID==="openai"||v.model.api.npm==="@ai-sdk/openai"||v.model.api.npm==="@ai-sdk/github-copilot")&&(k.store=false),v.model.api.npm==="@openrouter/ai-sdk-provider"&&(k.usage={include:true},v.model.api.id.includes("gemini-3")&&(k.reasoning={effort:"high"})),(v.model.providerID==="baseten"||v.model.providerID==="easbot"&&["kimi-k2-thinking","glm-4.6"].includes(v.model.api.id))&&(k.chat_template_args={enable_thinking:true}),["zai","zhipuai"].includes(v.model.providerID)&&v.model.api.npm==="@ai-sdk/openai-compatible"&&(k.thinking={type:"enabled",clear_thinking:false}),(v.model.providerID==="openai"||v.providerOptions?.setCacheKey)&&(k.promptCacheKey=v.sessionID),(v.model.api.npm==="@ai-sdk/google"||v.model.api.npm==="@ai-sdk/google-vertex")&&(k.thinkingConfig={includeThoughts:true},v.model.api.id.includes("gemini-3")&&(k.thinkingConfig.thinkingLevel="high"));let S=v.model.api.id.toLowerCase();return (v.model.api.npm==="@ai-sdk/anthropic"||v.model.api.npm==="@ai-sdk/google-vertex/anthropic")&&(S.includes("k2p5")||S.includes("kimi-k2.5")||S.includes("kimi-k2p5"))&&(k.thinking={type:"enabled",budgetTokens:Math.min(16e3,Math.floor(v.model.limit.output/2-1))}),v.model.providerID==="alibaba-cn"&&v.model.capabilities.reasoning&&v.model.api.npm==="@ai-sdk/openai-compatible"&&!S.includes("kimi-k2-thinking")&&(k.enable_thinking=true),v.model.api.id.includes("gpt-5")&&!v.model.api.id.includes("gpt-5-chat")&&(v.model.api.id.includes("gpt-5-pro")||(k.reasoningEffort="medium",k.reasoningSummary="auto"),v.model.api.id.includes("gpt-5.")&&!v.model.api.id.includes("codex")&&!v.model.api.id.includes("-chat")&&v.model.providerID!=="azure"&&(k.textVerbosity="low"),v.model.providerID.startsWith("easbot")&&(k.promptCacheKey=v.sessionID,k.include=["reasoning.encrypted_content"],k.reasoningSummary="auto")),v.model.providerID==="venice"&&(k.promptCacheKey=v.sessionID),k}b.options=a;function p(v){return v.providerID==="openai"||v.api.npm==="@ai-sdk/openai"||v.api.npm==="@ai-sdk/github-copilot"?v.api.id.includes("gpt-5")?v.api.id.includes("5.")?{store:false,reasoningEffort:"low"}:{store:false,reasoningEffort:"minimal"}:{store:false}:v.providerID==="google"?v.api.id.includes("gemini-3")?{thinkingConfig:{thinkingLevel:"minimal"}}:{thinkingConfig:{thinkingBudget:0}}:v.providerID==="openrouter"?v.api.id.includes("google")?{reasoning:{enabled:false}}:{reasoningEffort:"minimal"}:{}}b.smallOptions=p;let d={amazon:"bedrock"};function h(v,k){if(v.api.npm==="@ai-sdk/gateway"){let y=v.api.id.indexOf("/"),x=y>0?v.api.id.slice(0,y):void 0,I=x?d[x]??x:void 0,P=k.gateway,T=Object.fromEntries(Object.entries(k).filter(([N])=>N!=="gateway")),M=Object.keys(T).length>0,j={};return P!==void 0&&(j.gateway=P),M&&(I?j[I]=T:P&&typeof P=="object"&&!Array.isArray(P)?j.gateway={...P,...T}:j.gateway=T),j}return {[e(v.api.npm)??v.providerID]:k}}b.providerOptions=h;function w(v){return Math.min(v.limit.output,b.OUTPUT_TOKEN_MAX)||b.OUTPUT_TOKEN_MAX}b.maxOutputTokens=w;function g(v,k){if(v.providerID==="google"||v.api.id.includes("gemini")){let S=y=>{if(y===null||typeof y!="object")return y;if(Array.isArray(y))return y.map(S);let x={};for(let[I,P]of Object.entries(y))I==="enum"&&Array.isArray(P)?(x[I]=P.map(T=>String(T)),(x.type==="integer"||x.type==="number")&&(x.type="string")):typeof P=="object"&&P!==null?x[I]=S(P):x[I]=P;return x.type==="object"&&x.properties&&Array.isArray(x.required)&&(x.required=x.required.filter(I=>I in x.properties)),x.type==="array"&&(x.items==null&&(x.items={}),typeof x.items=="object"&&!Array.isArray(x.items)&&!x.items.type&&(x.items.type="string")),x.type&&x.type!=="object"&&(delete x.properties,delete x.required),x};k=S(k);}return k}b.schema=g;})(vt||(vt={}));function nn(t,e){let n=typeof t=="string"?t:"anonymous",o=typeof t=="string"?e:t,{init:s}=o,r=s instanceof Function?s:()=>s;return {name:n,init:r}}var Xi=a.create({service:"forked-agent"}),Ur;(n=>{async function t(o){let{source:s,title:r,agent:i,parts:c,model:u,system:l,tools:f,syncMessages:m,metadata:a}=o,p=await ee.fork({sessionID:s});try{let d=await qe.lastUserMessage(s),h=i??d?.agent??await Ue.defaultAgent(),w;if(u?.providerID&&u.modelID?w={providerID:u.providerID,modelID:u.modelID}:w=(await Ue.get(h))?.model,!u){let{Provider:k}=await import('./provider-ULN4YD2M.mjs');w=d?.model??await k.defaultModel();}Xi.debug("forked started and session created",{sessionID:p.id,source:s,title:r,agent:h,model:w}),await qe.prompt({sessionID:p.id,system:l,tools:f,agent:h,model:w,parts:c}),Xi.debug("forked agent prompt sent",{sessionID:p.id,agent:h});let g=await ve.getLastMessages(p.id,{filterByText:!0}),b="";g.lastAssistantWithText&&(b=g.lastAssistantWithText.parts.filter(k=>k.type==="text").map(k=>k.text).join(""));let v={title:r,output:b,metadata:{...a,sessionID:p.id,source:s,agent:h},userMessage:g.lastUser,assistantMessage:g.lastAssistant};if(m&&g.lastUser&&g.lastFinished){let k=await e(p.id,s,g,h);v.userMessage=k.userMessage,v.assistantMessage=k.assistantMessage;}return Xi.debug("forked agent completed",{sessionID:p.id,source:s,title:r,agent:h,contentLength:b.length,hasText:b.length>0,lastUser:g.lastUser?.id,lastAssistant:g.lastAssistant?.id,lastFinished:g.lastFinished?.info?.id}),v}finally{await ee.remove(p.id),Xi.debug("forked session removed",{sessionID:p.id});}}n.run=t;async function e(o,s,r,i){if(!r.lastUser||!r.lastFinished)throw new Error("Messages not found in forked session");let c=i??r.lastUser.agent??await Ue.defaultAgent(),u=Identifier.ascending("message"),l={...r.lastUser,id:u,agent:c,sessionID:s};await ee.updateMessage(l);for(let a of r.lastUserMessage.parts)await ee.updatePart({...a,id:Identifier.ascending("part"),messageID:u,sessionID:s});let f=Identifier.ascending("message"),m={...r.lastFinished.info,id:f,parentID:u,agent:c,sessionID:s};await ee.updateMessage(m);for(let a of r.lastFinished.parts)await ee.updatePart({...a,id:Identifier.ascending("part"),messageID:f,sessionID:s});return Xi.debug("messages synced",{fromSessionID:o,toSessionID:s,userMessageID:u,assistantMessageID:f}),{userMessage:l,assistantMessage:m}}n.syncMessagesToParent=e;})(Ur||(Ur={}));var Dn;(m=>{let t=a.create({service:"knowledge.memory"}),e;async function n(a){let p=await he.get(),d=a?.embedding?.model||p.embedding_model||"easbot-local/bge-base-zh-v1.5",{provider:h,model:w}=parseModelId(d),g=h||"easbot-local",b=w||"bge-base-zh-v1.5",v=await Ce.getEmbedding(g,b),k=a?.graph?.model||p.graph_model,S,y;if(k){let{provider:I,model:P}=parseModelId(k);S=I||"easbot-local",y=P||k;}else {let I=await Ce.defaultModel();S=I.providerID,y=I.modelID;}let x;try{let I=await Ce.getModel(S,y);x=await Ce.getLanguage(I);}catch(I){t.error("memory loadModels graphLlm failed",{graphProvider:S,graphModel:y,error:String(I)});}return t.debug("memory loadModels result",{embeddingLlm:!!v,graphLlm:!!x,graphModelId:k}),{embeddingLlm:v,graphLlm:x}}function o(){return e||(e=A.state(async()=>{let a$1=await Er();if(t.info("Memory.init() cfg",{cfg:a$1,enabled:a$1?.enabled}),!a$1||a$1.enabled===false)return t.debug("memory knowledge base disabled",{reason:a$1?"enabled is false":"cfg is undefined"}),{system:null,config:null,rootDir:"",initialized:true};let{Global:p}=await import('./global-KAF6JHVQ.mjs'),d=A.directory,h=Filesystem.normalize(a$1?.workspaceDir?ke__default.isAbsolute(a$1.workspaceDir)?a$1.workspaceDir:ke__default.resolve(d,a$1.workspaceDir):ke__default.join(d,".easbot","memory")),w=Filesystem.normalize(a$1?.database?ke__default.isAbsolute(a$1.database)?a$1.database:ke__default.resolve(d,a$1.database):ke__default.join(A.worktree,".easbot","db","memory.db")),{embeddingLlm:g,graphLlm:b}=await n(a$1);await initLog({logDir:p.Path.log,logFile:"memory.log",level:a.getLevel(),print:false});let v=await createMemorySystem({workspaceDir:h,database:{path:w,walMode:true},sessionsDir:a$1?.sessionsDir,archiveDays:a$1?.archiveDays,shortTermMaxRounds:a$1?.shortTermMaxRounds,search:{maxResults:a$1?.search?.maxResults??5,minScore:a$1?.search?.minScore??.1,hybrid:{enabled:a$1?.search?.hybrid?.enabled??true,vectorWeight:a$1?.search?.hybrid?.vectorWeight??.7,textWeight:a$1?.search?.hybrid?.textWeight??.3}},embeddingLlm:g,graphLlm:b});return t.debug("memory system initialized",{memoryRootDir:h,dbPath:w}),{system:v,config:a$1??null,rootDir:h,initialized:true}},async a=>{a.system&&await a?.system?.close().catch(()=>{});})),e}function s(){return o()()}m.state=s;async function r(){return (await s()).system}m.get=r;async function i(){return (await s()).rootDir}m.rootDir=i;async function c(){return (await s()).system!==null}m.isEnabled=c;async function u(){return (await s()).config}m.config=u;async function l(){return (await s()).initialized}m.isInitialized=l;async function f(){(await r())?.sync().catch(p=>t.warn("memory sync failed",{error:String(p)}));}m.sync=f;})(Dn||(Dn={}));var on;(p=>{let t=a.create({service:"knowledge.note"}),e;async function n(d){let h=await he.get(),w=d?.embedding?.model||h.embedding_model||"easbot-local/bge-base-zh-v1.5",{provider:g,model:b}=parseModelId(w),v=g||"easbot-local",k=b||"bge-base-zh-v1.5",S=await Ce.getEmbedding(v,k),y=d?.graph?.model??h.graph_model,x,I;if(y){let{provider:K,model:te}=parseModelId(y);x=K||"easbot-local",I=te||y;}else {let K=await Ce.defaultModel();x=K.providerID,I=K.modelID;}let P;try{let K=await Ce.getModel(x,I);P=await Ce.getLanguage(K);}catch(K){t.error("note loadModels graphLlm failed",{graphProvider:x,graphModel:I,error:String(K)});}let T=d?.rerank?.model||h.rerank_model,M,j;if(T){let{provider:K,model:te}=parseModelId(T);M=K||"easbot-local",j=te||T;}else {let K=await Ce.defaultModel();M="easbot-local",j=`rerank-${K.providerID}/${K.modelID}`;}let N;try{N=await Ce.getRerank(M,j);}catch(K){t.error("note loadModels rerankLlm failed",{rerankProvider:M,rerankModel:j,error:String(K)});}return t.debug("loadModels result",{embeddingLoaded:S?"yes":"no",graphLlmLoaded:P?"yes":"no",graphModelId:y,rerankLlmLoaded:N?"yes":"no"}),{embeddingLlm:S,graphLlm:P,rerankLlm:N}}function o(){return e||(e=A.state(async()=>{let d=await kr();if(!d||d.enabled===false)return t.debug("note knowledge base disabled or not configured"),{kb:null,config:null,rootDir:"",sources:[],initialized:true};let{Global:h}=await import('./global-KAF6JHVQ.mjs'),w=A.worktree??A.directory,g=Filesystem.normalize(ke__default.join(w,".easbot","knowledge")),b=Filesystem.normalize(d.database?ke__default.isAbsolute(d.database)?d.database:ke__default.resolve(w,d.database):ke__default.join(A.worktree,".easbot","db","note.db")),{embeddingLlm:v,graphLlm:k,rerankLlm:S}=await n(d),y=(d?.sources?.length??0)>0?d.sources:["docs","tasks"];for(let P of y??[]){let T=Filesystem.normalize(ke__default.join(g,P));await Filesystem.exists(T)||(await Filesystem.mkdir(T),t.debug("created source directory",{sourceDir:T}));}let x={workspaceDir:g,vectorDims:d.embedding?.dimensions??1,embeddingLlm:v,graphLlm:k,rerankLlm:S,search:{maxResults:d.search?.maxResults??3,minScore:d.search?.minScore??0,hybrid:{enabled:d.search?.hybrid?.enabled??true,vectorWeight:d.search?.hybrid?.vectorWeight??0,textWeight:d.search?.hybrid?.textWeight??1}},indexer:{batchSize:20,ignorePatterns:[...Glob.DEFAULT_IGNORE_PATTERNS,...d.indexer?.ignorePatterns??[],...(await Glob.parseGitignore(ke__default.join(A.worktree,".gitignore"))).filter(P=>!P.includes(".easbot"))],incremental:d.indexer?.incremental??true},sync:d.sync,sources:y};b&&(x.database={path:b,walMode:true}),await initLog$1({logDir:h.Path.log,logFile:"note.log",level:a.getLevel(),print:false});let I=await createNoteKnowledge(x);return d.sync?.onBoot&&await I.sync().catch(P=>t.warn("note sync on boot failed",{error:String(P)})),t.info("note knowledge base initialized",{noteRootDir:g,dbPath:b}),{kb:I,config:d??null,rootDir:g,sources:y??[],initialized:true}},async d=>{d.kb&&await d?.kb?.close().catch(()=>{});})),e}function s(){return o()()}p.state=s;async function r(){return (await s()).kb}p.get=r;async function i(){return (await s()).rootDir}p.rootDir=i;async function c(){return (await s()).sources}p.sources=c;async function u(){return (await s()).kb!==null}p.isEnabled=u;async function l(){return (await s()).config}p.config=l;async function f(){return (await s()).initialized}p.isInitialized=f;async function m(){let d=await r();d&&d.sync().catch(h=>t.warn("note sync failed",{error:String(h)}));}p.sync=m;async function a$1(){let d=await r();if(!d)return null;let h=d.getStatus();return {dbPath:h.dbPath,documentsCount:h.documentsCount,chunksCount:h.chunksCount,nodesCount:h.nodesCount,edgesCount:h.edgesCount,vectorDims:0,vectorSearchAvailable:h.embeddingLlmAvailable,llmAvailable:h.graphLlmAvailable,healthy:h.healthy}}p.status=a$1;})(on||(on={}));var Go;(p=>{let t=a.create({service:"knowledge.codebase"}),e;async function n(d){let h=await he.get(),w=d?.embedding?.model||h.embedding_model||"easbot-local/bge-base-zh-v1.5",{provider:g,model:b}=parseModelId(w),v=g||"easbot-local",k=b||"bge-base-zh-v1.5";try{return await Ce.getEmbedding(v,k)}catch(S){return t.warn("failed to load embedding model, using easbot-local/bge-base-zh-v1.5",{error:S}),Ce.getEmbedding("easbot-local","bge-base-zh-v1.5")}}function o(){return e||(e=A.state(async()=>{let d=await Pr();if(!d||d.enabled===false)return t.debug("codebase knowledge base disabled or not configured"),{codebase:null,config:null,rootDir:"",initialized:true};let{Global:h}=await import('./global-KAF6JHVQ.mjs'),w=Filesystem.normalize(A.worktree??A.directory),g=Filesystem.normalize(d.database?ke__default.isAbsolute(d.database)?d.database:ke__default.resolve(w,d.database):ke__default.join(A.worktree,".easbot","db","codebase.db")),b=await n(d);await initLog$2({logDir:h.Path.log,logFile:"codebase.log",level:a.getLevel(),print:false});let v=await createCodebase({workspaceDir:w,database:{path:g,walMode:true},search:d.search?{maxResults:d.search.maxResults??3,minScore:d.search.minScore??.1,hybrid:{enabled:d.search.hybrid?.enabled??true,vectorWeight:d.search.hybrid?.vectorWeight??.7,textWeight:d.search.hybrid?.textWeight??.3}}:void 0,parser:d.parser?{languages:d.parser.languages,lazyLoad:d.parser.lazyLoad}:void 0,indexer:{batchSize:d.indexer?.batchSize??50,ignorePatterns:[...Glob.DEFAULT_IGNORE_PATTERNS,...d.indexer?.ignorePatterns??[],...(await Glob.parseGitignore(ke__default.join(A.worktree,".gitignore"))).filter(k=>!k.includes(".easbot"))],incremental:d.indexer?.incremental??true},sync:d.sync,embeddingLlm:b});return d.sync?.onBoot&&await v.sync().catch(k=>t.warn("codebase sync on boot failed",{error:String(k)})),t.info("codebase knowledge base initialized",{workspaceDir:w,dbPath:g}),{codebase:v,config:d,rootDir:w,initialized:true}},async d=>{d.codebase&&await d?.codebase?.close().catch(()=>{});})),e}function s(){return o()()}p.state=s;async function r(){return (await s()).codebase}p.get=r;async function i(){return (await s()).rootDir}p.rootDir=i;async function c(){return (await s()).codebase!==null}p.isEnabled=c;async function u(){return (await s()).config}p.config=u;async function l(){return (await s()).initialized}p.isInitialized=l;async function f(){let d=await r();d&&d.sync().catch(h=>t.warn("codebase sync failed",{error:String(h)}));}p.sync=f;async function m(){let d=await r();return d?d.getStatus():null}p.status=m;async function a$1(){let d=await r();if(!d)return {healthy:false,issues:["Codebase knowledge base is not enabled"]};let h=await d.healthCheck();return {healthy:h.healthy,issues:h.issues}}p.healthCheck=a$1;})(Go||(Go={}));var fs=a.create({service:"hook.builtin.memory"}),gf=2e3,iu=new Map;function hf(t,e){return `${t}:${e??"default"}`}async function MI(t,e,n){let o=[];if(e){let r=e.parts.filter(i=>i.type==="text").map(i=>i.text).join("");r&&o.push({role:"user",content:r});}let s=await ve.get({sessionID:t,messageID:n});if(s){let r=s.parts.filter(i=>i.type==="text").map(i=>i.text).join("");r&&o.push({role:"assistant",content:r});}return o}async function OI(t){if(t.length===0)return "";let e=`### Our Conversation
86
+
87
+ `;for(let n of t.slice(-4)){let o=Token.estimate(n.content),s=n.content,r=false;if(o>gf){s=n.content.slice(-8e3),r=true;}r?e+=`**${n.role==="user"?"User":"Me"}**: ${s}
88
+
89
+ [Content truncated from ${o} tokens]
90
+
91
+ `:e+=`**${n.role==="user"?"User":"Me"}**: ${s||"(empty)"}
92
+
93
+ `;}return e}function jI(){return `### My Reflection
94
+
95
+ After reading this conversation, I ask myself:
96
+
97
+ **Mistakes & Corrections:**
98
+ - Did I make any mistakes the user corrected?
99
+ - What errors should I avoid next time?
100
+ - Is there a pattern I keep getting wrong?
101
+
102
+ **Better Approaches:**
103
+ - Was there a smarter way to solve this?
104
+ - What approach would be more efficient?
105
+ - Any workflow improvements I discovered?
106
+
107
+ **Knowledge & Context:**
108
+ - What new insights did I gain?
109
+ - What preferences did the user show?
110
+ - What context is important for future work?
111
+
112
+ **Evolution:**
113
+ - How can I do better next time?
114
+ - What should I remember to improve my effectiveness?
115
+
116
+ If nothing special happened, don't save anything.
117
+
118
+ Importance 1-10, skip 1-3`}var au=nn("memory",{async init(){return await Dn.isEnabled()?{isEnabled:()=>true,handlers:[{name:HookEvent.StepStart,handler:(e,n)=>{let o=e;if(!o.userMessageID)return {modified:false,input:e};let s=hf(o.sessionID,o.userMessageID);return iu.set(s,{startTime:Date.now()}),fs.debug("step start recorded",{key:s}),{modified:false,input:e}}},{name:HookEvent.StepFinish,handler:async(e,n)=>{let o=e;if(!o.userMessageID)return fs.debug("step.finish: no userMessageID, skip"),{modified:false,input:e};let s=hf(o.sessionID,o.userMessageID);fs.debug("step.finish: memory extract started",{convKey:s,finishReason:o.finishReason,messageID:o.messageID});let r=await ve.get({sessionID:o.sessionID,messageID:o.userMessageID});if(r?.parts.some(d=>d.type==="memory"))return fs.debug("step.finish: skip memory extract, already processing"),{modified:false,input:e};let i=Identifier.ascending("part"),c=Date.now(),u={id:i,sessionID:o.sessionID,messageID:o.userMessageID,type:"memory",status:"processing",time:{start:c}};await ee.updatePart(u);let l=iu.get(s);iu.delete(s);let f="";l&&(f=`Step Duration: ${((Date.now()-l.startTime)/1e3).toFixed(1)}s`);let m=await MI(o.sessionID,r,o.messageID);if(!m.some(d=>d.role==="assistant"&&d.content))return fs.debug("step.finish: skip memory extract, no assistant text content",{convKey:s,finishReason:o.finishReason,messageID:o.messageID}),await ee.updatePart({...u,status:"skipped",time:{start:c,end:Date.now()},reason:`No assistant text content (finish: ${o.finishReason})`}),{modified:false,input:e};let p=`## Conversation Reflection
119
+
120
+ Local Time: ${formatLocalISOCompact(new Date)}
121
+ Finish Reason: ${o.finishReason}
122
+ ${f?`${f}
123
+ `:""}${o.tokens?`Tokens Used: ${o.tokens.total??0}
124
+ `:""}}
125
+
126
+ ${await OI(m)}
127
+
128
+ ${jI()}`;return Ur.run({source:o.sessionID,title:"memory-extract",agent:"memory",syncMessages:false,parts:[{type:"memory",status:"processing",time:{start:c}},{type:"text",text:p}]}).then(async d=>{fs.debug("memory extract completed",{outputLength:d.output.length}),await ee.updatePart({...u,status:"completed",time:{start:c,end:Date.now()},result:d.output});}).catch(async d=>{fs.error("memory extract failed",{error:d.message}),await ee.updatePart({...u,status:"failed",time:{start:c,end:Date.now()},error:d.message});}),{modified:false,input:e}}}]}:(fs.debug("memory hook disabled, skipping"),{isEnabled:()=>false,handlers:[]})}});var Hr;(c=>{c.RETRY_INITIAL_DELAY=2e3,c.RETRY_BACKOFF_FACTOR=2,c.RETRY_MAX_DELAY_NO_HEADERS=3e4,c.RETRY_MAX_DELAY=2147483647;async function s(u,l){return new Promise((f,m)=>{let a=()=>{clearTimeout(p),m(new DOMException("Aborted","AbortError"));},p=setTimeout(()=>{l.removeEventListener("abort",a),f();},Math.min(u,2147483647));l.addEventListener("abort",a,{once:true});})}c.sleep=s;function r(u,l){if(l){let f=l.data.responseHeaders;if(f){let m=f["retry-after-ms"];if(m){let p=Number.parseFloat(m);if(!Number.isNaN(p))return p}let a=f["retry-after"];if(a){let p=Number.parseFloat(a);if(!Number.isNaN(p))return Math.ceil(p*1e3);let d=Date.parse(a)-Date.now();if(!Number.isNaN(d)&&d>0)return Math.ceil(d)}return 2e3*2**(u-1)}}return Math.min(2e3*2**(u-1),3e4)}c.delay=r;function i(u){if(ve.ContextOverflowError.isInstance(u))return;let l=u;if(ve.APIError.isInstance(l)){let p=l;return p.data.isRetryable?p.data.responseBody?.includes("FreeUsageLimitError")?"Free usage exceeded, add credits https://easbot.cn/zen":p.data.message.includes("Overloaded")?"Provider is overloaded":p.data.message:void 0}let m=l?.data,a=iife(()=>{try{return typeof m?.message=="string"?JSON.parse(m.message):m?JSON.parse(String(m.message)):void 0}catch{return}});try{if(!a||typeof a!="object")return;let p=typeof a.code=="string"?a.code:"";return a.type==="error"&&a.error?.type==="too_many_requests"?"Too Many Requests":p.includes("exhausted")||p.includes("unavailable")?"Provider is overloaded":a.type==="error"&&a.error?.code?.includes("rate_limit")?"Rate Limited":JSON.stringify(a)}catch{return}}c.retryable=i;})(Hr||(Hr={}));var Ut;(u=>{u.Info=z$1.union([z$1.object({type:z$1.literal("idle")}),z$1.object({type:z$1.literal("retry"),attempt:z$1.number(),message:z$1.string(),next:z$1.number()}),z$1.object({type:z$1.literal("busy")})]).meta({ref:"SessionStatus"}),u.Event={Status:a$5.define("session.status",z$1.object({sessionID:z$1.string(),status:u.Info}))};let n;function o(){return n||(n=A.state(async()=>({}))),n}function s(){return o()()}async function r(l){return (await s())[l]??{type:"idle"}}u.get=r;async function i(){return s()}u.list=i;async function c(l,f){if(await ue.publish(u.Event.Status,{sessionID:l,status:f}),f.type==="idle"){let a=await s();delete a[l];return}let m=await s();m[l]=f;}u.set=c;})(Ut||(Ut={}));var gs;(s=>{let t=a.create({service:"llm"});s.OUTPUT_TOKEN_MAX=vt.OUTPUT_TOKEN_MAX;async function n(r){let i=t.clone().tag("providerID",r.model.providerID).tag("modelID",r.model.id).tag("sessionID",r.sessionID).tag("small",(r.small??false).toString()).tag("agent",r.agent.name).tag("mode",r.agent.mode);i.info("stream",{modelID:r.model.id,providerID:r.model.providerID});let[c,u,l,f]=await Promise.all([Ce.getLanguage(r.model),he.get(),Ce.getProvider(r.model.providerID),et.get(r.model.providerID)]),m=l?.id==="openai"&&f?.type==="oauth",a=[r.system.filter(T=>T).join(`
129
+ `)],p=a[0];if(a.length>2&&a[0]===p){let T=a.slice(1);a.length=0,a.push(p,T.join(`
130
+ `));}let d=!r.small&&r.model.variants&&r.user.variant?r.model.variants[r.user.variant]:{},h=r.small?vt.smallOptions(r.model):vt.options({model:r.model,sessionID:r.sessionID,providerOptions:l?.options??{}}),w=pipe(h,mergeDeep(r.model.options??{}),mergeDeep(r.agent.options??{}),mergeDeep(d??{}));m&&(w.instructions=a.join(`
131
+ `));let g=await je.triggerEvent(HookEvent.LlmParams,{sessionID:r.sessionID,agent:r.agent.name,model:r.model,provider:l,message:r.user}),b=Object.assign({temperature:r.model.capabilities.temperature?r.agent.temperature??vt.temperature(r.model):void 0,topP:r.agent.topP??vt.topP(r.model),topK:vt.topK(r.model),options:w},g.output??{}),k=(await je.triggerEvent(HookEvent.LlmHeaders,{sessionID:r.sessionID,agent:r.agent.name,model:r.model,provider:l,message:r.user})).output?.headers??{},S=m||l?.id?.includes("github-copilot")?void 0:vt.maxOutputTokens(r.model),y=r.tools;(l?.options?.litellmProxy===true||r.model.providerID.toLowerCase().includes("litellm")||r.model.api.id.toLowerCase().includes("litellm")||r.model.providerID.includes("github-copilot"))&&Object.keys(y).length===0&&o(r.messages)&&(y._noop=tool({description:"Do not call this tool. It exists only for API compatibility and must never be invoked.",inputSchema:jsonSchema({type:"object",properties:{reason:{type:"string",description:"Unused"}}}),execute:async()=>({output:"",title:"",metadata:{}})}));let I=[...a.map(T=>({role:"system",content:T??""}))],P=streamText({onError(T){i.error("stream error",{error:T});},async experimental_repairToolCall(T){let M=T.toolCall.toolName.toLowerCase();return M!==T.toolCall.toolName&&y[M]?{...T.toolCall,toolName:M}:{...T.toolCall,input:JSON.stringify({tool:T.toolCall.toolName,error:T.error.message}),toolName:"invalid"}},temperature:b.temperature,topP:b.topP,topK:b.topK,providerOptions:vt.providerOptions(r.model,b.options??{}),activeTools:Object.keys(y).filter(T=>T!=="invalid"),tools:y,maxOutputTokens:S,abortSignal:r.abort,headers:{...r.model.providerID.startsWith("easbot")?{"x-easbot-project":A.project.id,"x-easbot-session":r.sessionID,"x-easbot-request":r.user.id,"x-easbot-client":a$2.EASBOT_CLIENT}:r.model.providerID!=="anthropic"?{"User-Agent":`easbot/${b$3.getVersion()}`}:void 0,...r.model.headers,...k},maxRetries:r.retries??0,system:I,messages:r.messages,model:wrapLanguageModel({model:c,middleware:[{specificationVersion:"v3",async transformParams(T){if(T.type==="stream"){let M=T.params.prompt;M&&Array.isArray(M)&&(T.params.prompt=vt.message(M,r.model,w));}return T.params}}]}),experimental_telemetry:{isEnabled:u.experimental?.openTelemetry,metadata:{userId:u.username??"unknown",sessionId:r.sessionID}}});return i.debug("streamText returned",{hasFullStream:!!P.fullStream,fullStreamType:typeof P.fullStream,resultKeys:Object.keys(P),baseStreamType:typeof P.baseStream,hasBaseStream:!!P.baseStream,textStreamType:typeof P.textStream,hasTextStream:!!P.textStream}),P}s.stream=n;function o(r){for(let i of r)if(Array.isArray(i.content)){for(let c of i.content)if(c.type==="tool-call"||c.type==="tool-result")return true}return false}s.hasToolCalls=o;})(gs||(gs={}));var sn=a.create({service:"compaction.cache"}),wf=100,xf=25*1024*1024,If=300*1e3,yf="cache.json",WI={maxEntries:wf,maxSizeBytes:xf,ttlMs:If,persist:false};function uu(t){return join(a$1.Path.cache,"compaction",t)}var Fc=class{constructor(e){b$1(this,"cache");b$1(this,"config");b$1(this,"hits",0);b$1(this,"misses",0);this.config={maxEntries:e?.maxEntries??wf,maxSizeBytes:e?.maxSizeBytes??xf,ttlMs:e?.ttlMs??If,persist:e?.persist??false,sessionID:e?.sessionID},this.cache=new LRUCache({max:this.config.maxEntries,maxSize:this.config.maxSizeBytes,sizeCalculation:n=>{let o=n.value,s=typeof o=="string"?o:o==null?"":typeof o=="object"?JSON.stringify(o):String(o);return Math.max(1,Buffer.byteLength(s,"utf8"))},ttl:this.config.ttlMs,updateAgeOnGet:true,updateAgeOnHas:true}),sn.debug("compaction cache initialized",{maxEntries:this.config.maxEntries,maxSizeBytes:this.config.maxSizeBytes,ttlMs:this.config.ttlMs});}get(e){let n=this.cache.get(e);if(n!==void 0)return this.hits++,sn.debug("cache hit",{key:e,hits:this.hits,misses:this.misses}),n.value;this.misses++,sn.debug("cache miss",{key:e,hits:this.hits,misses:this.misses});}set(e,n){let o={value:n,timestamp:Date.now()};return this.cache.set(e,o),sn.debug("cache set",{key:e,size:this.cache.size}),this}has(e){return this.cache.has(e)}delete(e){return this.cache.delete(e)}clear(){this.cache.clear(),this.hits=0,this.misses=0,sn.debug("cache cleared");}getStats(){let e=this.hits+this.misses;return {size:this.cache.size,calculatedSize:this.cache.calculatedSize??0,maxEntries:this.config.maxEntries,maxSizeBytes:this.config.maxSizeBytes,hits:this.hits,misses:this.misses,hitRate:e>0?this.hits/e:0}}keys(){return Array.from(this.cache.keys())}entries(){return Array.from(this.cache.entries())}async persistToFile(){if(!this.config.persist||!this.config.sessionID){sn.debug("persist skipped: persistence disabled or no sessionID");return}let e=uu(this.config.sessionID),n=join(e,yf),o={entries:this.entries(),stats:this.getStats(),timestamp:Date.now()};try{await mkdir(e,{recursive:!0}),await writeFile(n,JSON.stringify(o),"utf-8"),sn.info("cache persisted",{path:n,entries:o.entries.length});}catch(s){throw sn.error("cache persist failed",{error:String(s)}),s}}async restoreFromFile(){if(!this.config.persist||!this.config.sessionID){sn.debug("restore skipped: persistence disabled or no sessionID");return}let e=uu(this.config.sessionID),n=join(e,yf);try{let o=await readFile(n,"utf-8"),s=JSON.parse(o);if(s.entries&&Array.isArray(s.entries))for(let[r,i]of s.entries)Date.now()-i.timestamp<this.config.ttlMs&&this.cache.set(r,i);sn.info("cache restored",{path:n,entries:this.cache.size});}catch(o){sn.warn("cache restore failed, starting fresh",{error:String(o)});}}dump(){return {entries:this.entries(),stats:this.getStats()}}load(e){for(let[n,o]of e.entries)Date.now()-o.timestamp<this.config.ttlMs&&this.cache.set(n,o);sn.debug("cache loaded",{entries:this.cache.size});}};function VI(t){return new Fc(t)}async function KI(t){let e=uu(t);try{await rm(e,{recursive:!0,force:!0}),sn.info("session cache cleared",{sessionID:t,path:e});}catch(n){sn.warn("failed to clear session cache",{sessionID:t,error:String(n)});}}function JI(){ue.subscribe(ee.Event.Deleted,async t=>{sn.debug("session.deleted event received",{sessionID:t.properties.info.id}),await KI(t.properties.info.id);}),sn.info("cache events subscribed");}var pu=class{constructor(e){b$1(this,"cache");b$1(this,"config");let n={ttlMs:3e5,maxSizeBytes:26214400,maxEntries:100,persist:false};this.config={...n,...e},this.cache=new LRUCache({max:this.config.maxEntries,maxSize:this.config.maxSizeBytes,sizeCalculation:o=>Buffer.byteLength(o.originalOutput,"utf8")+Buffer.byteLength(JSON.stringify(o.metadata),"utf8"),ttl:this.config.ttlMs,updateAgeOnGet:true}),sn.debug("compaction backup cache initialized",{ttlMs:this.config.ttlMs,maxSizeBytes:this.config.maxSizeBytes,maxEntries:this.config.maxEntries});}getKey(e,n){return `${e}:${n}`}async backup(e){let n=this.getKey(e.sessionID,e.partID);this.cache.set(n,e),sn.debug("backup created",{sessionID:e.sessionID,partID:e.partID});}get(e,n){let o=this.getKey(e,n);return this.cache.get(o)}has(e,n){let o=this.getKey(e,n);return this.cache.has(o)}delete(e,n){let o=this.getKey(e,n);return this.cache.delete(o)}clearSession(e){let n=`${e}:`;for(let o of this.cache.keys())o.startsWith(n)&&this.cache.delete(o);sn.debug("session backups cleared",{sessionID:e});}clear(){this.cache.clear();}size(){return this.cache.size}getStats(){return {size:this.cache.size,calculatedSize:this.cache.calculatedSize??0}}},lu;function hs(){return lu||(lu=new pu),lu}var ea={async backup(t){await hs().backup(t);},get(t,e){return hs().get(t,e)},has(t,e){return hs().has(t,e)},delete(t,e){return hs().delete(t,e)},clearSession(t){hs().clearSession(t);},clear(){hs().clear();},size(){return hs().size()},getStats(){return hs().getStats()}};var zt;(h=>{let t=a.create({service:"question"});h.Option=z$1.object({label:z$1.string().describe("Display text (1-5 words, concise)"),description:z$1.string().describe("Explanation of choice")}).meta({ref:"QuestionOption"}),h.Info=z$1.object({question:z$1.string().describe("Complete question"),header:z$1.string().describe("Very short label (max 30 chars)"),options:z$1.array(h.Option).describe("Available choices"),multiple:z$1.boolean().optional().describe("Allow selecting multiple choices"),custom:z$1.boolean().optional().describe("Allow typing a custom answer (default: true)")}).meta({ref:"QuestionInfo"}),h.Request=z$1.object({id:Identifier.schema("question"),sessionID:Identifier.schema("session"),questions:z$1.array(h.Info).describe("Questions to ask"),tool:z$1.object({messageID:z$1.string(),callID:z$1.string()}).optional()}).meta({ref:"QuestionRequest"}),h.Answer=z$1.array(z$1.string()).meta({ref:"QuestionAnswer"}),h.Reply=z$1.object({answers:z$1.array(h.Answer).describe("User answers in order of questions (each answer is an array of selected labels)")}),h.Event={Asked:a$5.define("question.asked",h.Request),Replied:a$5.define("question.replied",z$1.object({sessionID:z$1.string(),requestID:z$1.string(),answers:z$1.array(h.Answer)})),Rejected:a$5.define("question.rejected",z$1.object({sessionID:z$1.string(),requestID:z$1.string()}))};let c;function u(){return c||(c=A.state(async()=>({pending:{}}))),c}function l(){return u()()}async function f(w){let g=await l(),b=Identifier.ascending("question");return t.info("asking",{id:b,questions:w.questions.length}),new Promise((v,k)=>{let S={id:b,sessionID:w.sessionID,questions:w.questions,tool:w.tool};g.pending[b]={info:S,resolve:v,reject:k},ue.publish(h.Event.Asked,S);})}h.ask=f;async function m(w){let g=await l(),b=g.pending[w.requestID];if(!b){t.warn("reply for unknown request",{requestID:w.requestID});return}delete g.pending[w.requestID],t.info("replied",{requestID:w.requestID,answers:w.answers}),await ue.publish(h.Event.Replied,{sessionID:b.info.sessionID,requestID:b.info.id,answers:w.answers}),b.resolve(w.answers);}h.reply=m;async function a$1(w){let g=await l(),b=g.pending[w];if(!b){t.warn("reject for unknown request",{requestID:w});return}delete g.pending[w],t.info("rejected",{requestID:w}),await ue.publish(h.Event.Rejected,{sessionID:b.info.sessionID,requestID:b.info.id}),b.reject(new p);}h.reject=a$1;class p extends Error{constructor(){super("The user dismissed this question");}}h.RejectedError=p;async function d(){return l().then(w=>Object.values(w.pending).map(g=>g.info))}h.list=d;})(zt||(zt={}));var Gr;(o=>{let e=a.create({service:"session.processor"});function n(s){let r={},i=false,c=0,u=false;s.mode??"general";return {get message(){return s.assistantMessage},partFromToolCall(m){return r[m]},async process(m){u=false;let a=(await he.get()).experimental?.continue_loop_on_deny!==true;for(;;){try{let d,h={},w=await gs.stream(m);for await(let g of w.fullStream){switch(s.abort.throwIfAborted(),g.type){case "start":await Ut.set(s.sessionID,{type:"busy"});break;case "reasoning-start":if(g.id in h)continue;h[g.id]={id:Identifier.ascending("part"),messageID:s.assistantMessage.id,sessionID:s.assistantMessage.sessionID,type:"reasoning",text:"",time:{start:Date.now()},metadata:g.providerMetadata},await ee.updatePart(h[g.id]);break;case "reasoning-delta":if(g.id in h){let b=h[g.id];if(!b){e.warn("reasoning-delta: part not found in map",{id:g.id});break}let v=g.delta||g.text||"";b.text+=v,g.providerMetadata&&(b.metadata=g.providerMetadata),b.text&&await ee.updatePart({part:b,delta:v});}break;case "reasoning-end":if(g.id in h){let b=h[g.id];if(!b){e.warn("reasoning-end: part not found in map",{id:g.id});break}b.text=b.text.trimEnd(),b.time={...b.time,end:Date.now()},g.providerMetadata&&(b.metadata=g.providerMetadata),await ee.updatePart(b),delete h[g.id];}break;case "tool-input-start":{let b=await ee.updatePart({id:r[g.id]?.id??Identifier.ascending("part"),messageID:s.assistantMessage.id,sessionID:s.assistantMessage.sessionID,type:"tool",tool:g.toolName,callID:g.id,state:{status:"pending",input:{},raw:""}});r[g.id]=b;break}case "tool-input-delta":break;case "tool-input-end":break;case "tool-call":{let b=r[g.toolCallId];if(b){let v=await ee.updatePart({...b,tool:g.toolName,state:{status:"running",input:g.input,time:{start:Date.now()}},metadata:g.providerMetadata});r[g.toolCallId]=v;let S=(await ve.parts(s.assistantMessage.id)).slice(-3);if(S.length===3&&S.every(y=>y.type==="tool"&&y.tool===g.toolName&&y.state.status!=="pending"&&JSON.stringify(y.state.input)===JSON.stringify(g.input))){let y=await Ue.get(s.assistantMessage.agent);if(!y)break;await Me.ask({permission:"doom_loop",patterns:[g.toolName],sessionID:s.assistantMessage.sessionID,metadata:{tool:g.toolName,input:g.input},always:[g.toolName],ruleset:y.permission});}}break}case "tool-result":{let b=r[g.toolCallId];if(b&&b.state.status==="running"){let v;g.output.attachments&&g.output.attachments.length>0&&(v=g.output.attachments.map(k=>({...k,id:k.id??Identifier.ascending("part"),sessionID:k.sessionID??b.sessionID,messageID:k.messageID??b.messageID}))),await ee.updatePart({...b,state:{status:"completed",input:g.input??b.state.input,output:g.output.output,metadata:g.output.metadata,title:g.output.title,time:{start:b.state.time.start,end:Date.now()},attachments:v}}),delete r[g.toolCallId];}break}case "tool-error":{let b=r[g.toolCallId];b&&b.state.status==="running"&&(await ee.updatePart({...b,state:{status:"error",input:g.input??b.state.input,error:g.error instanceof Error?g.error.message:String(g.error),time:{start:b.state.time.start,end:Date.now()}}}),(g.error instanceof Me.RejectedError||g.error instanceof zt.RejectedError)&&(i=a),delete r[g.toolCallId]);break}case "error":throw g.error;case "start-step":await je.triggerEvent(HookEvent.StepStart,{sessionID:s.sessionID,userMessageID:s.assistantMessage.parentID,messageID:s.assistantMessage.id,model:s.model},{sessionID:s.sessionID,model:s.model?.id}),await ee.updatePart({id:Identifier.ascending("part"),messageID:s.assistantMessage.id,sessionID:s.sessionID,type:"step-start"});break;case "finish-step":{let b=ee.getUsage({model:s.model,usage:g.usage,metadata:g.providerMetadata});s.assistantMessage.finish=g.finishReason,s.assistantMessage.cost+=b.cost,s.assistantMessage.tokens=b.tokens,await ee.updatePart({id:Identifier.ascending("part"),reason:g.finishReason,messageID:s.assistantMessage.id,sessionID:s.assistantMessage.sessionID,type:"step-finish",tokens:b.tokens,cost:b.cost}),await ee.updateMessage(s.assistantMessage),await je.triggerEvent(HookEvent.StepFinish,{sessionID:s.sessionID,userMessageID:s.assistantMessage.parentID,messageID:s.assistantMessage.id,model:s.model,finishReason:g.finishReason},{sessionID:s.sessionID,model:s.model?.id}),!s.assistantMessage.summary&&await mn.isOverflow({tokens:b.tokens,model:s.model})&&(u=!0);break}case "text-start":d={id:Identifier.ascending("part"),messageID:s.assistantMessage.id,sessionID:s.assistantMessage.sessionID,type:"text",text:"",time:{start:Date.now()},metadata:g.providerMetadata},await ee.updatePart(d);break;case "text-delta":if(d){let b=g.delta||g.text||"";d.text+=b,g.providerMetadata&&(d.metadata=g.providerMetadata),d.text&&await ee.updatePart({part:d,delta:b});}else e.warn("text-delta: no currentText available");break;case "text-end":d?.time?(d.text=d.text.trimEnd(),await je.triggerEvent(HookEvent.TextComplete,{sessionID:s.sessionID,messageID:s.assistantMessage.id,partID:d.id},{sessionID:s.sessionID}),d.time={start:d.time.start??Date.now(),end:Date.now()},g.providerMetadata&&(d.metadata=g.providerMetadata),await ee.updatePart(d)):e.warn("text-end: no currentText available or time not set"),d=void 0;break;case "finish":break;default:e.info("unhandled",{...g});continue}if(u)break}}catch(d){let h=d?.message??String(d);e.error("process",{error:h});let w=ve.fromError(d,{providerID:s.model.providerID,aborted:s.abort.aborted});if(ve.ContextOverflowError.isInstance(w))u=true,ue.publish(ee.Event.Error,{sessionID:s.sessionID,error:w});else {let g=Hr.retryable(w);if(g!==void 0){c++;let b=Hr.delay(c,ve.APIError.isInstance(w)?w:void 0);await Ut.set(s.sessionID,{type:"retry",attempt:c,message:g,next:Date.now()+b}),await Hr.sleep(b,s.abort).catch(()=>{});continue}s.assistantMessage.error=w,await ue.publish(ee.Event.Error,{sessionID:s.assistantMessage.sessionID,error:s.assistantMessage.error}),await Ut.set(s.sessionID,{type:"idle"});}}let p=await ve.parts(s.assistantMessage.id);for(let d of p)d.type==="tool"&&d.state.status!=="completed"&&d.state.status!=="error"&&await ee.updatePart({...d,state:{...d.state,status:"error",error:"Tool execution aborted",time:{start:Date.now(),end:Date.now()}}});return s.assistantMessage.time.completed=Date.now(),await ee.updateMessage(s.assistantMessage),u?"compact":i||s.assistantMessage.error?"stop":"continue"}}}}o.create=n;})(Gr||(Gr={}));var vf=`Provide a detailed summary of the conversation above that will help continue the work.
132
+
133
+ Focus on information that would be helpful for continuing the conversation, including what was accomplished, what is being worked on, and what comes next.`;function YI(t){return `<compaction_summary>
134
+ ${t}
135
+ </compaction_summary>`}function Sf(t,e){let n=[YI(t)];return n.push("Continue if you have next steps, or stop and ask for clarification if you are unsure how to proceed."),e?.customInstructions&&n.push(e.customInstructions),n.join(`
136
+
137
+ `)}var St=a.create({service:"compaction"}),mn;(_=>{_.COMPACTION_BUFFER=2e4,_.AUTOCOMPACT_BUFFER_TOKENS=13e3,_.WARNING_THRESHOLD_BUFFER_TOKENS=2e4,_.MANUAL_COMPACT_BUFFER_TOKENS=3e3,_.PRUNE_MINIMUM=2e4,_.PRUNE_PROTECT=4e4,_.MAX_COMPACTION_FAILURES=3,_.PRUNE_PROTECTED_TOOLS=["skill"],_.BLOCKING_LIMIT_THRESHOLD=1e3,_.COMPACTION_WINDOW_MS=6e4,_.COMPACTION_WINDOW_THRESHOLD=3;let m;function a(){return m||(m=A.state(async()=>({config:await zi(),consecutiveFailures:new Map,compactionAttempts:new Map,initialized:true}))),m}async function p(){return a()()}async function d(){return (await p()).config}_.getConfig=d;async function h(D){let O=await p(),C=Date.now(),E=O.compactionAttempts.get(D);if(E){let R=C-E.firstAttemptTime;if(R<6e4){if(E.count>=3)return St.warn("compaction skipped: time window circuit breaker open",{sessionID:D,attempts:E.count,elapsed:R,windowMs:6e4,threshold:3}),await ue.publish(_.Event.CircuitBreakerOpened,{sessionID:D,consecutiveFailures:E.count,maxFailures:3}),true;E.count++;}else E.count=1,E.firstAttemptTime=C;}else O.compactionAttempts.set(D,{count:1,firstAttemptTime:C});return false}async function w(D){(await p()).compactionAttempts.delete(D);}_.resetTimeWindowAttempts=w;async function g(D){return (await p()).consecutiveFailures.get(D)??0}async function b(D){let O=await p(),E=(O.consecutiveFailures.get(D)??0)+1;return O.consecutiveFailures.set(D,E),E}async function v(D){(await p()).consecutiveFailures.set(D,0);}_.resetSessionFailures=v;function k(D){if(a$2.EASBOT_AUTO_COMPACT_WINDOW)return a$2.EASBOT_AUTO_COMPACT_WINDOW;let O=vt.maxOutputTokens(D),C=Math.min(O,2e4),E=D.limit.context??0,L=(E>0?E:Ce.DEFAULT_CONTEXT_LIMIT)-C;return Math.max(L,5e4)}_.getEffectiveContextWindowSize=k;function S(D,O){let C=k(O),E=Math.max(0,(C-D)/C*100),R=C-2e4,L=C-13e3;a$2.EASBOT_AUTOCOMPACT_PCT_OVERRIDE&&(L=C*(1-a$2.EASBOT_AUTOCOMPACT_PCT_OVERRIDE/100));let q=C-1e3;return a$2.EASBOT_BLOCKING_LIMIT_OVERRIDE&&(q=a$2.EASBOT_BLOCKING_LIMIT_OVERRIDE),{percentLeft:E,isAboveWarningThreshold:D>=R,isAboveAutoCompactThreshold:D>=L,isAtBlockingLimit:D>=q}}_.calculateTokenUsageState=S;async function y(D){if(a$2.EASBOT_DISABLE_COMPACT||a$2.EASBOT_DISABLE_AUTO_COMPACT)return false;let O=await d();if(O.auto===false)return false;let C=D.model.limit.context??0,E=C>0?C:Ce.DEFAULT_CONTEXT_LIMIT;if(E===0)return false;let R=vt.maxOutputTokens(D.model),L=O.reserved??Math.min(2e4,R),q=D.model.limit.input?D.model.limit.input-L:E-L,Q=Math.max(q,5e4);if(a$2.EASBOT_AUTOCOMPACT_PCT_OVERRIDE)return D.tokens?Token.total(D.tokens)>=Q*(1-a$2.EASBOT_AUTOCOMPACT_PCT_OVERRIDE/100):false;if(D.tokens)return Token.total(D.tokens)>=Q;if(!D.sessionID)return false;let Z=await ee.messages({sessionID:D.sessionID});for(let se=Z.length-1;se>=0;se--){let le=Z[se];if(le&&le.info.role==="assistant"&&!le.info.summary)return Token.total(le.info.tokens)>=q}return false}_.isOverflow=y;async function x(D){let O=await d(),C=O.prune;if(C?.enabled===false)return St.debug("prune skipped: config.compaction.prune.enabled is false"),{prunedCount:0,prunedTokens:0,success:true};let E=C?.timeThresholdMs??3e5,R=C?.keepRecentTools??3,L=C?.tokenThreshold??5e3,q=C?.protectedTools??_.PRUNE_PROTECTED_TOOLS,Q=O?.backup?.enabled!==false;St.debug("pruning started",{sessionID:D.sessionID,timeThresholdMs:E,keepRecentTools:R,tokenThreshold:L,backupEnabled:Q});let Z=await ee.messages({sessionID:D.sessionID}),se=Date.now(),le=0,de=0,be=0,re=[],X=[],H=0;e:for(let ne=Z.length-1;ne>=0;ne--){let V=Z[ne];if(V&&(V.info.role==="user"&&H++,!(H<2))){if(V.info.role==="assistant"&&V.info.summary)break;for(let J=V.parts.length-1;J>=0;J--){let oe=V.parts[J];if(oe&&oe.type==="tool"&&oe.state.status==="completed"){if(q.includes(oe.tool))continue;if(oe.state.time.compacted)break e;let me=se-(oe.state.time.end??0)>E;if(X.length<R){X.push(oe.id);continue}if(!me)continue;let pe=Token.estimate(oe.state.output??"");le+=pe,le>4e4&&(de+=pe,re.push(oe));}}}}St.debug("pruning analysis",{totalToolTokens:le,prunedTokens:de,toPruneCount:re.length,timeThresholdMs:E});let F=de>L;if(F&&re.length>0){let ne=D.reason??"prune";for(let V of re)V.type==="tool"&&V.state.status==="completed"&&(Q&&V.state.output&&(await ea.backup({sessionID:D.sessionID,messageID:V.messageID,partID:V.id,tool:V.tool,originalOutput:V.state.output,metadata:{input:V.state.input??{},title:V.state.title,attachments:V.state.attachments},compactedAt:se,reason:ne}),be++),V.state.time.compacted=se,await ee.updatePart(V));St.debug("pruning completed",{count:re.length,tokens:de,backups:be});}else St.debug("pruning skipped: insufficient benefit",{prunedTokens:de,minimum:L});return {prunedCount:re.length,prunedTokens:de,success:F,backups:be}}_.prune=x;async function I(D){St.debug("restore started",D);let O=await ee.messages({sessionID:D.sessionID}),C=0,E=0;for(let R of O)if(!(D.messageID&&R.info.id!==D.messageID))for(let L of R.parts){if(D.partID&&L.id!==D.partID||L.type!=="tool"||L.state.status!=="completed"||!L.state.time.compacted)continue;let q=ea.get(D.sessionID,L.id);if(!q){St.warn("restore skipped: no backup found",{partID:L.id});continue}L.state.output=q.originalOutput,L.state.time.compacted=void 0,await ee.updatePart(L),C++,E+=Token.estimate(q.originalOutput),St.debug("restore completed",{partID:L.id,tokens:Token.estimate(q.originalOutput)});}return St.info("restore completed",{restoredCount:C,restoredTokens:E}),{restoredCount:C,restoredTokens:E,success:true}}_.restore=I;function P(){return ea}_.getBackupCache=P;function T(D){ea.clearSession(D);}_.clearBackups=T;async function M(D){let O=await g(D.sessionID);if(O>=3)return St.warn("compaction skipped: circuit breaker open (failures)",{sessionID:D.sessionID,consecutiveFailures:O,maxFailures:3}),await ue.publish(_.Event.CircuitBreakerOpened,{sessionID:D.sessionID,consecutiveFailures:O,maxFailures:3}),await qe.cancel(D.sessionID),"stop";if(await h(D.sessionID))return await qe.cancel(D.sessionID),"stop";St.debug("compaction started",{sessionID:D.sessionID,auto:D.auto});let C=D.messages.findLast(le=>le.info.id===D.parentID).info,E=await Ue.get("compaction");if(!E)return St.error("compaction agent not found"),"stop";let R=E.model?await Ce.getModel(E.model.providerID,E.model.modelID):await Ce.getModel(C.model.providerID,C.model.modelID),L=await ee.updateMessage({id:Identifier.ascending("message"),role:"assistant",parentID:D.parentID,sessionID:D.sessionID,mode:"compaction",agent:"compaction",variant:C.variant,summary:true,path:{cwd:A.directory,root:A.worktree},cost:0,tokens:{output:0,input:0,reasoning:0,cache:{read:0,write:0}},modelID:R.id,providerID:R.providerID,time:{created:Date.now()}}),q=Gr.create({assistantMessage:L,sessionID:D.sessionID,model:R,abort:D.abort}),Q=[],Z;try{let le=await je.triggerEvent(HookEvent.SessionCompacting,{sessionID:D.sessionID,auto:D.auto});if(le.success&&le.output){let de=le.output;de.context&&Q.push(...de.context),de.prompt&&(Z=de.prompt);}}catch(le){St.warn("session.compacting hook error, using default",{error:String(le)});}let se=Z??[vf,...Q].join(`
138
+
139
+ `);try{if(await q.process({user:C,agent:E,abort:D.abort,sessionID:D.sessionID,tools:{},system:E.prompt?[E.prompt]:[],messages:[...await ve.toModelMessages(D.messages.filter(de=>!de.parts.some(be=>be.type==="compaction")),R),{role:"user",content:[{type:"text",text:se}]}],model:R})==="continue"&&D.auto){let be=(await ve.parts(L.id)).find(H=>H.type==="text")?.text??"",re=Sf(be,{continuePrompt:!0}),X=await ee.updateMessage({id:Identifier.ascending("message"),role:"user",sessionID:D.sessionID,time:{created:Date.now()},agent:C.agent,model:C.model});await ee.updatePart({id:Identifier.ascending("part"),messageID:X.id,sessionID:D.sessionID,type:"text",synthetic:!0,text:re,time:{start:Date.now(),end:Date.now()}});}return q.message.error?(St.error("compaction failed: processor error",{error:q.message.error}),await b(D.sessionID),"stop"):(await ue.publish(_.Event.Compacted,{sessionID:D.sessionID}),St.debug("compaction completed successfully",{sessionID:D.sessionID}),await v(D.sessionID),"continue")}catch(le){let de=await b(D.sessionID);throw St.error("compaction failed",{sessionID:D.sessionID,error:String(le),consecutiveFailures:de,maxFailures:3}),le}}_.compactConversation=M;async function j(D){if(a$2.EASBOT_DISABLE_COMPACT||a$2.EASBOT_DISABLE_AUTO_COMPACT)return St.debug("auto compact skipped: disabled by flag"),"not_needed";if((await d()).auto===false)return St.debug("auto compact skipped: config.compaction.auto is false"),"not_needed";if(!await y({sessionID:D.sessionID,model:D.model,tokens:D.tokens}))return St.debug("no overflow detected, skipping auto compact"),"not_needed";St.debug("auto compact triggered",{sessionID:D.sessionID});let E=await ve.filterCompacted(ve.stream(D.sessionID));if(E.length===0)return St.debug("auto compact skipped: no uncompacted messages",{sessionID:D.sessionID}),"not_needed";let R=E.findLast(Z=>Z?.info.role==="user"&&!Z.parts.some(se=>se.type==="compaction"));if(!R)return St.error("no user message found for compaction"),"not_needed";let L=new AbortController,q=D.sessionID?Object.assign(L.signal,{sessionID:D.sessionID}):L.signal,Q=await M({sessionID:D.sessionID,parentID:R.info.id,messages:E,abort:q,auto:true});return await _.prune({sessionID:D.sessionID}),Q==="continue"?(St.debug("auto compact succeeded",{sessionID:D.sessionID}),"compacted"):"not_needed"}_.autoCompactIfNeeded=j;async function N(D){await v(D),St.debug("circuit breaker reset",{sessionID:D});}_.resetCircuitBreaker=N;async function K(D){return g(D)}_.getConsecutiveFailures=K,_.Event={Compacted:a$5.define("session.compacted",z$1.object({sessionID:z$1.string()})),CircuitBreakerOpened:a$5.define("session.compaction.circuit_breaker_opened",z$1.object({sessionID:z$1.string(),consecutiveFailures:z$1.number(),maxFailures:z$1.number()}))},_.create=fn$1(z$1.object({sessionID:Identifier.schema("session"),agent:z$1.string().optional(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),auto:z$1.boolean()}),async D=>{let{sessionID:O,model:C,agent:E="compaction",auto:R=false}=D,L;C?.providerID&&C.modelID?L={providerID:C.providerID,modelID:C.modelID}:L=(await Ue.get(E))?.model??await qe.lastModel(O);let q=await ee.updateMessage({id:Identifier.ascending("message"),role:"user",model:L,sessionID:O,agent:E,time:{created:Date.now()}});await ee.updatePart({id:Identifier.ascending("part"),messageID:q.id,sessionID:q.sessionID,type:"compaction",auto:R}),St.debug("compaction task created",{sessionID:O,auto:R});});})(mn||(mn={}));var kf=a.create({service:"hook.builtin.compaction"}),fu=nn("compaction",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.SessionStart,handler:async(t,e)=>{let n=t;return kf.debug("session.start hook triggered, resetting compaction failure counter",{sessionID:n.sessionID,agent:n.agent}),await mn.resetSessionFailures(n.sessionID),{modified:false,input:t}}},{name:HookEvent.StepFinish,handler:async(t,e)=>{let n=t;return kf.debug("step.finish hook triggered, resetting compaction failure counter",{sessionID:n.sessionID,agent:n.agent,finishReason:n.finishReason}),await mn.resetSessionFailures(n.sessionID),{modified:false,input:t}}}]}}});var Bs=a.create({service:"hook.builtin.coder"}),gu=new Map,hu=nn("coder",{async init(){return {scope:g.Coder,isEnabled:()=>true,handlers:[{name:HookEvent.StepStart,handler:async(t,e)=>{let n=t;try{Bs.debug("coder.step-start hook triggered",{sessionID:n.sessionID,messageID:n.messageID});let o=await xt.track();gu.set(n.sessionID,o);let r=(await ve.parts(n.messageID)).find(i=>i.type==="step-start");r&&o&&await ee.updatePart({...r,snapshot:o}),Bs.debug("coder.step-start hook completed",{sessionID:n.sessionID,hasSnapshot:!!o});}catch(o){Bs.error("coder.step-start hook error",{sessionID:n.sessionID,error:String(o)});}return {modified:false,input:t}}},{name:HookEvent.StepFinish,handler:async(t,e)=>{let n=t;try{Bs.debug("coder.step-finish hook triggered",{sessionID:n.sessionID,messageID:n.messageID,finishReason:n.finishReason});let o=gu.get(n.sessionID);if(o){let r=(await ve.parts(n.messageID)).find(c=>c.type==="step-finish");r&&await ee.updatePart({...r,snapshot:o});let i=await xt.patch(o);i.files.length>0&&(await ee.updatePart({id:Identifier.ascending("part"),messageID:n.messageID,sessionID:n.sessionID,type:"patch",hash:i.hash,files:i.files}),Bs.debug("coder.step-finish patch generated",{sessionID:n.sessionID,hash:i.hash,fileCount:i.files.length})),gu.delete(n.sessionID);}Bs.debug("coder.step-finish hook completed",{sessionID:n.sessionID});}catch(o){Bs.error("coder.step-finish hook error",{sessionID:n.sessionID,error:String(o)});}return {modified:false,input:t}}}]}}});var zc=a.create({service:"hook.builtin.gateway"});nn("gateway",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.GatewayMessageReceive,handler:async(t,e)=>{let n=t;return zc.info("gateway message received",{messageId:n.messageId,sessionId:n.sessionId,type:n.type,platform:n.channel?.platform}),{modified:false,input:t}}},{name:HookEvent.GatewayMessageProcess,handler:async(t,e)=>{let n=t;return zc.info("gateway message processing",{messageId:n.messageId,sessionId:n.sessionId,backendSessionId:n.backendSessionId,processorId:n.processorId,processType:n.processType,agent:n.agent}),{modified:false,input:t}}},{name:HookEvent.GatewayMessageComplete,handler:async(t,e)=>{let n=t;return zc.info("gateway message completed",{messageId:n.messageId,sessionId:n.sessionId,backendSessionId:n.backendSessionId,status:n.status,error:n.error}),{modified:false,input:t}}},{name:HookEvent.GatewayMessageSend,handler:async(t,e)=>{let n=t;return zc.info("gateway message sent",{messageId:n.messageId,sessionId:n.sessionId,type:n.type,platform:n.channel.platform,proactive:n.proactive,replyTo:n.replyToMessageId}),{modified:false,input:t}}}]}}});var yu=a.create({service:"hook.executor.prompt"}),Hs=class Hs{constructor(){b$1(this,"type","prompt");}static getInstance(){return Hs._instance||(Hs._instance=new Hs),Hs._instance}canExecute(e){return e?.type==="prompt"}async execute(e,n,o){let s=Date.now(),r=e.runMode??"session";try{return yu.debug("Execute Prompt Hook",{partsCount:e.parts?.length,model:e.model,runMode:r,context:o?.sessionID}),r==="fork"?await this.executeInFork(e,n,o,s):await this.executeInSession(e,n,o,s)}catch(i){return yu.error("Prompt Hook execution failed",{error:i?.message,stack:i?.stack}),{success:false,modified:false,error:i?.message??String(i),duration:Date.now()-s}}}async executeInSession(e,n,o,s){let r=s??Date.now(),i=o?.sessionID??"",c=Identifier.ascending("message"),l=(await qe.prompt({messageID:c,sessionID:i,model:e.model,system:e.system,parts:e.parts})).parts.findLast(f=>f.type==="text")?.text??"";return {success:true,modified:n.modified,input:n.input,output:l,duration:Date.now()-r}}async executeInFork(e,n,o,s){let r=s??Date.now(),i=o?.sessionID??"";if(!i)return {success:false,modified:false,error:"Fork mode requires sessionID in context",duration:Date.now()-r};yu.debug("Fork session for Prompt Hook",{sourceSessionID:i});let c=await ee.fork({sessionID:i});try{let u=Identifier.ascending("message"),f=(await qe.prompt({messageID:u,sessionID:c.id,model:e.model,system:e.system,agent:o?.agent,parts:e.parts})).parts.findLast(m=>m.type==="text")?.text??"";return {success:!0,modified:n.modified,input:n.input,output:f,duration:Date.now()-r}}finally{await ee.remove(c.id);}}};b$1(Hs,"_instance");var ta=Hs;var Df=a.create({service:"hook.builtin.heartbeat"});var bu=nn("heartbeat.builtin",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.HeartbeatTrigger,handler:async(t,e)=>{let n=t;return Df.info("Heartbeat trigger event received",{timestamp:n.timestamp,name:n.name}),{modified:false,input:t}}},{name:HookEvent.HeartbeatComplete,handler:(t,e)=>{let n=t;return Df.info("Heartbeat complete event received",{timestamp:n.timestamp,duration:n.duration}),{modified:false,input:t}}}]}}});var qs=class qs{constructor(){b$1(this,"type","function");}static getInstance(){return qs._instance||(qs._instance=new qs),qs._instance}canExecute(e){return e?.type==="function"}async execute(e,n,o){try{let s=e.handler,r=await s(n.input,o??{});return {success:!0,modified:r.modified,input:r.input}}catch(s){return {success:false,modified:false,error:s instanceof Error?s.message:String(s)}}}};b$1(qs,"_instance");var Bc=qs;var Af=a.create({service:"hook.executor.command"}),Gs=class Gs{constructor(){b$1(this,"type","command");}static getInstance(){return Gs._instance||(Gs._instance=new Gs),Gs._instance}canExecute(e){return e?.type==="command"}async execute(e,n,o){let s=Date.now();try{Af.debug("Execute Command Hook",{command:e.command,context:o});let i=await createPkgShell({cwd:o?.cwd,env:{...process.env,...n.input}})`${e.command}`.nothrow();return i.exitCode===0?{success:!0,modified:n.modified,input:n.input,stdout:i.text(),stderr:i.stderr.toString(),duration:Date.now()-s}:{success:!1,modified:n.modified,input:n.input,stdout:i.text(),stderr:i.stderr.toString(),exitCode:i.exitCode,duration:Date.now()-s}}catch(r){return Af.error("Command Hook execution failed",{error:r?.message}),{success:false,modified:false,error:r?.message??String(r),duration:Date.now()-s}}}};b$1(Gs,"_instance");var Hc=Gs;var Rf=a.create({service:"hook.executor.http"}),Ws=class Ws{constructor(){b$1(this,"type","http");}static getInstance(){return Ws._instance||(Ws._instance=new Ws),Ws._instance}canExecute(e){return e?.type==="http"}async execute(e,n,o){let s=Date.now(),r=e.timeout??3e4,i=e.method??"GET";try{Rf.debug("Execute HTTP Hook",{url:e.url,method:i,context:o});let c={"Content-Type":"application/json",...e.headers};if(e.allowedEnvVars&&e.allowedEnvVars.length>0)for(let p of e.allowedEnvVars)process.env[p]&&(c[p]=process.env[p]);let u=new AbortController,l=setTimeout(()=>u.abort(),r),f=await Fetch.request(e.url,{method:i,headers:c,body:i!=="GET"?JSON.stringify(n.input):void 0,responseType:"text",signal:u.signal});clearTimeout(l);let m=f.data,a;try{a=JSON.parse(m);}catch{a=m;}return {success:f.ok,modified:n.modified,input:n.input,output:a,stdout:m,exitCode:f.ok?0:f.status,duration:Date.now()-s}}catch(c){return Rf.error("HTTP Hook execution failed",{error:c?.message}),{success:false,modified:false,error:c?.message??String(c),duration:Date.now()-s}}}};b$1(Ws,"_instance");var qc=Ws;var Gc=a.create({service:"message-event-collector"}),ys={includeThinking:false,includeToolDetails:false,includeToolOutput:false,includeSteps:false};var Wo=class{constructor(e=ys){b$1(this,"filterConfig",e);b$1(this,"events",[]);b$1(this,"isComplete",false);b$1(this,"hasTextEnd",false);b$1(this,"hasStepFinish",false);b$1(this,"error","");b$1(this,"sessionStatus","idle");b$1(this,"sessionId","");b$1(this,"messageId","");Gc.debug("MessageEventCollector created",{filterConfig:e});}addEvent(e){if(!this.shouldIncludeEvent(e)){this.checkCompletion(e);return}this.events.push(e),this.checkCompletion(e);}shouldIncludeEvent(e){if(e.type!=="part.updated")return true;let n=e.properties.part;return n?!(n.type==="reasoning"&&!this.filterConfig.includeThinking||n.type==="tool"&&n.state?.status==="running"&&!this.filterConfig.includeToolDetails||(n.type==="step-start"||n.type==="step-finish")&&!this.filterConfig.includeSteps):true}checkCompletion(e){if(e.properties.sessionID&&(this.sessionId=e.properties.sessionID),e.properties.info?.id&&(this.sessionId=e.properties.info.id),e.type==="part.updated"){let n=e.properties.part;n&&n.type==="text"&&n.time?.end&&(this.hasTextEnd=true,n.messageID&&(this.messageId=n.messageID));}if(e.type==="session.status"){let n=e.properties.status?.type;(n==="idle"||n==="busy"||n==="error")&&(this.sessionStatus=n);}if(e.type==="session.error"&&(this.sessionStatus="error",e.properties.error?.data?.message&&(this.error=e.properties.error.data.message)),e.type==="part.updated"){let n=e.properties.part;n?.type==="step-finish"&&(this.hasStepFinish=true,n.messageID&&(this.messageId=n.messageID));}}checkComplete(){return this.isComplete=!!this.error||this.hasTextEnd&&this.hasStepFinish,Gc.debug("MessageEventCollector.checkComplete",{isComplete:this.isComplete,hasError:!!this.error,hasTextEnd:this.hasTextEnd,hasStepFinish:this.hasStepFinish}),this.isComplete}assembleMessage(){let e=this.events.filter(c=>c.type==="part.updated"&&c.properties.part?.type==="text"&&c.properties.part?.time?.end).map(c=>c.properties.part.text??"").join(""),n;if(this.filterConfig.includeThinking){let c=this.events.filter(u=>u.type==="part.updated"&&u.properties.part?.type==="reasoning"&&u.properties.part?.time?.end).map(u=>{let l=u.properties.part.text??"";return l=l.replace("[REDACTED]","").trim(),l}).filter(u=>u.length>0).join("");c&&(n=c);}let o;if(this.filterConfig.includeToolDetails){let c=this.events.filter(u=>u.type==="part.updated"&&u.properties.part?.type==="tool"&&(u.properties.part?.state?.status==="completed"||u.properties.part?.state?.status==="error"));c.length>0&&(o=c.map(u=>{let l=u.properties.part,f=l.state;return {name:l.tool,status:f.status,output:this.filterConfig.includeToolOutput?f.output:void 0,error:f.error}}));}let r=this.events.find(c=>c.type==="part.updated"&&c.properties.part?.type==="step-finish")?.properties.part?.tokens,i={role:"assistant",text:e,thinking:n,tools:o,metadata:{sessionId:this.sessionId,messageId:this.messageId,timestamp:Date.now(),tokens:r?{input:r.input,output:r.output,total:r.input+r.output+r.reasoning}:void 0,error:this.error||void 0}};return Gc.debug("Message assembled",{textLength:e.length,thinkingLength:n?.length??0,toolsCount:o?.length??0,isComplete:this.isComplete,includeThinking:this.filterConfig.includeThinking,includeToolDetails:this.filterConfig.includeToolDetails,includeToolOutput:this.filterConfig.includeToolOutput}),i}reset(){this.events=[],this.isComplete=false,this.hasTextEnd=false,this.hasStepFinish=false,this.error="",this.sessionStatus="idle",this.sessionId="",this.messageId="",Gc.debug("MessageEventCollector.reset",{hasTextEnd:false,hasStepFinish:false});}};var lt=a.create({service:"stdio-subscriber"}),xu=1800*1e3,wu=null,Kr=class{constructor(){b$1(this,"connected",false);b$1(this,"subscribed",false);b$1(this,"process",null);b$1(this,"abortController",null);b$1(this,"readline",null);b$1(this,"collector",null);b$1(this,"onMessageCallback",null);b$1(this,"onErrorCallback",null);b$1(this,"config",null);b$1(this,"filterConfig",null);b$1(this,"buffer","");b$1(this,"requestId",1);b$1(this,"pendingRequests",new Map);lt.info("StdioSubscriber created");}async connect(e){if(lt.debug("StdioSubscriber.connect called",{sessionId:e.sessionId}),this.connected&&this.process){lt.debug("StdioSubscriber: already connected, reusing existing process");return}this.config=e,this.process&&await this.stopProcess();let n,o;if(e.baseUrl.startsWith("stdio://"))n=new URL(e.baseUrl).hostname||"easbot",o=["acp","--channel","stdio"];else if(e.baseUrl.startsWith("easbot")){let r=e.baseUrl.split(" ");n=r[0],o=r.slice(1);}else n="node",o=["dist/cli.mjs","acp","--channel","stdio"];lt.info("StdioSubscriber: spawning subprocess",{command:n,args:o});let s={...process.env,ACP_CHANNEL:"stdio",LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8",...e.env};process.platform==="win32"&&(s.LC_CTYPE="en_US.UTF-8"),e.configContent&&(s.EASBOT_CONFIG_CONTENT=e.configContent),s.PATH||(s.PATH=process.env.PATH||"");try{this.abortController=new AbortController;let r=process.platform==="win32"?"cmd":void 0;if(this.process=Shell.spawn(r,`${n} ${o.join(" ")}`,{stdout:"pipe",stderr:"pipe",stdin:"pipe",env:s,cwd:process.cwd(),signal:this.abortController.signal,timeout:e.timeout??xu}),!this.process.stdout||!this.process.stdin)throw new Error("Failed to create stdio pipes");this.readline=createInterface({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",i=>{this.handleStdoutLine(i);}),this.process.stderr?.on("data",()=>{}),this.process.exited.then(i=>{lt.info("Subprocess exited",{code:i,sessionId:this.config?.sessionId}),this.connected=!1,this.subscribed&&this.onErrorCallback?.(new Error(`Subprocess exited with code ${i}`));}).catch(i=>{lt.debug("Subprocess exited with error (ignored)",{error:String(i),sessionId:this.config?.sessionId}),this.connected=!1;}),this.connected=!0,lt.info("StdioSubscriber: subprocess started",{sessionId:e.sessionId});}catch(r){throw lt.error("StdioSubscriber: failed to start subprocess",{error:r instanceof Error?r.message:String(r)}),await this.stopProcess(),r}}async subscribe(e,n,o){if(!this.connected||!this.config||!this.process)throw new Error("StdioSubscriber not connected. Call connect() first.");return this.subscribed?(lt.debug("StdioSubscriber: already subscribed, reusing"),()=>this.unsubscribe()):(lt.debug("StdioSubscriber.subscribe called",{sessionId:this.config.sessionId}),this.filterConfig=e,this.onMessageCallback=n,this.onErrorCallback=o??null,this.collector=new Wo(e),await this.initializeSession(),this.subscribed=true,()=>this.unsubscribe())}async initializeSession(){if(!this.process?.stdin||!this.config)throw new Error("Process not running");await new Promise(n=>{setTimeout(n,200);}),lt.debug("StdioSubscriber: sending initialize",{sessionId:this.config.sessionId}),await this.sendRequest("initialize",{protocolVersion:1}),lt.debug("StdioSubscriber: sending session.new",{sessionId:this.config.sessionId});let e=await this.sendRequest("session.new");e.sessionId&&(this.config.sessionId=e.sessionId),lt.debug("StdioSubscriber: sending session.subscribe",{sessionId:this.config.sessionId}),await this.sendRequest("session.subscribe",{sessionId:this.config.sessionId}),lt.info("StdioSubscriber: session initialized",{sessionId:this.config.sessionId});}async sendRequest(e,n,o=6e4){if(!this.process?.stdin)throw new Error("Process not running");let s=this.requestId++,r={jsonrpc:"2.0",id:s,method:e,params:n};return new Promise((i,c)=>{let u=setTimeout(()=>{this.pendingRequests.delete(s),c(new Error(`Request timeout: ${e}`));},o);this.pendingRequests.set(s,{resolve:f=>{clearTimeout(u),f.error?c(new Error(f.error.message)):i(f.result);},reject:c});let l=JSON.stringify(r);this.process.stdin.write(`${l}
140
+ `),lt.debug("StdioSubscriber: sent request",{method:e,id:s,sessionId:this.config?.sessionId});})}handleStdoutLine(e){if(e.trim())try{let n=JSON.parse(e);if(n.id!==void 0&&n.id!==null){let o=this.pendingRequests.get(n.id);if(o){this.pendingRequests.delete(n.id),o.resolve(n);return}}n.method==="event.notification"&&n.params?this.handleEventNotification(n.params):n.error&&(lt.error("StdioSubscriber: received error",{error:n.error}),this.onErrorCallback?.(new Error(n.error.message||"Unknown error")));}catch{}}handleEventNotification(e){if(!(!this.collector||!this.onMessageCallback)&&(this.collector.addEvent(e),this.collector.checkComplete())){let n=this.collector.assembleMessage();lt.debug("StdioSubscriber: message complete",{sessionId:this.config?.sessionId,hasText:!!n.text}),this.onMessageCallback(n),this.collector.reset();}}async send(e){if(!this.process?.stdin||!this.connected||!this.config)throw new Error("StdioSubscriber not connected");lt.debug("StdioSubscriber: sending session.prompt",{sessionId:this.config.sessionId}),await this.sendRequest("session.prompt",{sessionId:this.config.sessionId,parts:[{type:"text",text:e}]}),lt.debug("StdioSubscriber: prompt sent",{sessionId:this.config.sessionId});}async status(){if(!this.connected||!this.process)throw new Error("StdioSubscriber not connected");return lt.debug("StdioSubscriber: sending status"),this.sendRequest("status")}async interrupt(){if(!this.connected||!this.config||!this.process)throw new Error("StdioSubscriber not connected");lt.debug("StdioSubscriber: sending session.interrupt",{sessionId:this.config.sessionId}),await this.sendRequest("session.interrupt",{sessionId:this.config.sessionId}),lt.debug("StdioSubscriber: interrupt sent",{sessionId:this.config.sessionId});}async unsubscribe(){if(!this.connected||!this.config||!this.process)throw new Error("StdioSubscriber not connected");lt.debug("StdioSubscriber: sending session.unsubscribe",{sessionId:this.config.sessionId}),await this.sendRequest("session.unsubscribe",{sessionId:this.config.sessionId}),lt.debug("StdioSubscriber: unsubscribe sent",{sessionId:this.config.sessionId}),this.subscribed=false;}async releaseSubscription(){if(!this.connected||!this.config||!this.process)throw new Error("StdioSubscriber not connected");lt.debug("StdioSubscriber: sending session.releaseSubscription",{sessionId:this.config.sessionId}),await this.sendRequest("session.releaseSubscription",{sessionId:this.config.sessionId}),lt.debug("StdioSubscriber: releaseSubscription sent",{sessionId:this.config.sessionId});}async subscriptions(){if(!this.connected||!this.process)throw new Error("StdioSubscriber not connected");return lt.debug("StdioSubscriber: sending subscriptions"),this.sendRequest("subscriptions")}async disconnect(){lt.debug("StdioSubscriber.disconnect called",{sessionId:this.config?.sessionId}),this.subscribed=false,this.connected=false,await this.stopProcess(),this.collector=null,this.onMessageCallback=null,this.onErrorCallback=null;}async stopProcess(){if(this.readline){try{this.readline.close();}catch{}this.readline=null;}if(this.abortController&&(this.abortController.abort(),this.abortController=null),this.process){let e=this.process;this.process=null;let n=setTimeout(()=>{try{e.kill("SIGKILL");}catch{}},3e3);try{await e.exited;}catch{try{e.kill("SIGKILL");}catch{}await e.exited.catch(()=>{});}clearTimeout(n);}this.pendingRequests.clear(),this.buffer="";}close(){lt.debug("StdioSubscriber.close called",{sessionId:this.config?.sessionId}),this.disconnect();}getSessionId(){return this.config?.sessionId??null}};function na(){return wu||(wu=new Kr),wu}function _f(t,e){let n=btoa(String.fromCharCode(...t));return `data:${e??"application/octet-stream"};base64,${n}`}function Mf(t,e){let n=[];if(e&&n.push(`<system-reminder>
141
+ ${e}
142
+ </system-reminder>`),t)for(let o of t)switch(o.type){case "text":o.text&&n.push(`<text>
143
+ ${o.text}
144
+ </text>`);break;case "image":{let s="";typeof o.image=="string"?s=o.image:o.image instanceof URL?s=o.image.toString():o.image instanceof Uint8Array&&(s=_f(o.image,o.mime)),n.push(`<image mime="${o.mime??"image/png"}">
145
+ ${s}
146
+ </image>`);break}case "file":{let s="";typeof o.data=="string"?s=o.data:o.data instanceof URL?s=o.data.toString():o.data instanceof Uint8Array&&(s=_f(o.data,o.mime)),n.push(`<file mime="${o.mime??"application/octet-stream"}">
147
+ ${s}
148
+ </file>`);break}}return n.join(`
149
+ `)}var Zn=a.create({service:"subagent.stdio"}),Wc=class{constructor(e=false){b$1(this,"isEphemeral",e);b$1(this,"subscriber");b$1(this,"config",null);b$1(this,"sessionId",null);b$1(this,"_isRunning",false);b$1(this,"pendingResolve",null);b$1(this,"pendingReject",null);b$1(this,"completionPromise",null);b$1(this,"unsubscribeFn",null);this.subscriber=e?new Kr:na();}async start(e){this.config=e;let n=e.command??"easbot",o=e.args??["acp","--channel","stdio"],s=e.cwd??process.cwd();Zn.debug("StdIOAgentHandler.start",{command:n,args:o,cwd:s,name:e.name,isEphemeral:this.isEphemeral});let r=e.timeout??(this.isEphemeral?300*1e3:xu);try{let i=`${n} ${o.join(" ")}`;await this.subscriber.connect({baseUrl:i,sessionId:"",env:e.env,timeout:r}),this._isRunning=!0,Zn.info("StdIOAgentHandler started",{name:e.name,command:n,args:o,timeout:r});}catch(i){throw Zn.error("StdIOAgentHandler.start failed",{name:e.name,error:String(i)}),i}}async stop(){if(Zn.debug("StdIOAgentHandler.stop",{sessionId:this.sessionId,name:this.config?.name}),this.unsubscribeFn){try{await this.subscriber.releaseSubscription();}catch{}try{await this.subscriber.unsubscribe();}catch{}this.unsubscribeFn=null;}try{await this.subscriber.disconnect();}catch{}this.sessionId=null,this._isRunning=false,this.reset();}async execute(e){if(!this._isRunning||!this.config)throw new Error("Agent not running");Zn.debug("StdIOAgentHandler.execute",{title:e.title,agent:e.agent,partsCount:e.parts?.length??1}),this.reset(),this.completionPromise=new Promise((n,o)=>{this.pendingResolve=n,this.pendingReject=o;});try{this.unsubscribeFn=await this.subscriber.subscribe(ys,r=>this.handleMessage(r),r=>{Zn.error("StdIO subscription error",{error:r.message}),this.pendingReject&&this.pendingReject(r);}),this.sessionId=await this.createSession(),Zn.debug("StdIOAgentHandler: session created",{sessionId:this.sessionId});let n=Mf(e.parts,e.system);await this.subscriber.send(n);let o=await this.completionPromise;return Zn.debug("StdIOAgentHandler.execute completed",{title:e.title,hasText:!!o.text,textLength:o.text?.length??0,toolsCount:o.tools?.length??0,isEphemeral:this.isEphemeral}),{title:e.title,output:o.text??"",metadata:{sessionId:this.sessionId,agent:e.agent,messageId:o.metadata?.messageId,tokens:o.metadata?.tokens,error:o.metadata?.error}}}catch(n){throw Zn.error("StdIOAgentHandler.execute failed",{title:e.title,error:String(n),isEphemeral:this.isEphemeral}),n}finally{if(this.isEphemeral){Zn.debug("StdIOAgentHandler: ephemeral mode, cleaning up subprocess",{sessionId:this.sessionId});try{await this.stop();}catch(n){Zn.warn("Failed to stop ephemeral agent",{error:String(n)});}}}}async interrupt(){this.sessionId&&(Zn.debug("StdIOAgentHandler.interrupt",{sessionId:this.sessionId}),await this.subscriber.interrupt());}isRunning(){return this._isRunning}async createSession(){return this.subscriber.getSessionId()??`local_${Date.now()}`}handleMessage(e){Zn.debug("StdIOAgentHandler.handleMessage",{role:e.role,hasText:!!e.text,textLength:e.text?.length??0,hasTools:!!e.tools,toolsCount:e.tools?.length??0}),this.pendingResolve&&(this.pendingResolve(e),this.pendingResolve=null,this.pendingReject=null);}reset(){this.pendingResolve=null,this.pendingReject=null,this.completionPromise=null;}};function jo(t){return t.startsWith("ws://")||t.startsWith("wss://")?t:t.startsWith("https://")?t.replace("https://","wss://"):t.startsWith("http://")?t.replace("http://","ws://"):`ws://${t}`}function Iu(t){let e=t;e.startsWith("wss://")?e=e.replace("wss://","https://"):e.startsWith("ws://")?e=e.replace("ws://","http://"):!e.startsWith("http://")&&!e.startsWith("https://")&&(e=`http://${e}`);try{let n=new URL(e);return `${n.protocol}//${n.host}`}catch{let n=e.match(/^(https?:\/\/[^/]+)/);return n?n[1]:e}}var fn=a.create({service:"agent-service-registry"}),sv="agent-services.json",Jc=class{constructor(e){b$1(this,"storagePath");b$1(this,"gatewayUrl");b$1(this,"services",new Map);b$1(this,"loaded",false);this.storagePath=e?.storagePath??ke__default.join(A.directory,".easbot",sv),this.gatewayUrl=e?.gatewayUrl,fn.info("Agent service registry created",{storagePath:this.storagePath,gatewayUrl:this.gatewayUrl});}async load(){this.loaded||(await this.loadFromLocalConfig(),await this.loadFromClientsConfig(),this.gatewayUrl&&await this.loadFromGateway(),this.loaded=true,fn.info("Agent services loaded",{count:this.services.size}));}async loadFromClientsConfig(){try{let e=await this.getClientsConfig();if(!e?.clients||e.clients.length===0){fn.debug("No clients config found");return}for(let n of e.clients){let o=this.extractBaseUrl(n);if(!o){fn.warn("Failed to extract baseUrl from client config",{clientId:n.id});continue}let s=`clients:${n.id}`;if(this.services.has(s)){fn.debug("Service already exists from local config, skipping",{serviceId:s});continue}let r=n.agentId??n.id;this.services.set(s,{id:s,name:n.name,baseUrl:o,agentId:r,capabilities:n.channels??[],status:"unknown",metadata:{type:n.type,channels:n.channels,autoConnect:n.autoConnect,priority:n.priority},updatedAt:Date.now()});}fn.debug("Loaded services from clients config",{count:e.clients.length});}catch(e){fn.warn("Failed to load clients config",{error:String(e)});}}extractBaseUrl(e){if(e.connection?.http?.baseUrl)return e.connection.http.baseUrl;if(e.connection?.ws?.url)return e.connection.ws.url;if(e.connection?.stdio)return "stdio://local"}async getClientsConfig(){let{getACPClientsConfig:e}=await import('./adapter-loader-BLTYHARQ.mjs');return e()}async loadFromLocalConfig(){try{if(!await Ot__default.access(this.storagePath).then(()=>!0,()=>!1)){fn.debug("Local config file not found",{path:this.storagePath});return}let n=await Ot__default.readFile(this.storagePath,"utf-8"),o=JSON.parse(n);if(o.services)for(let s of o.services)this.services.set(s.id,{id:s.id,name:s.name,baseUrl:s.baseUrl,agentId:s.agentId,capabilities:s.capabilities??[],status:s.status??"unknown",metadata:s.metadata,updatedAt:Date.now()});fn.debug("Loaded services from local config",{count:o.services?.length??0});}catch(e){fn.warn("Failed to load local config",{error:String(e)});}}async loadFromGateway(){fn.debug("Gateway service discovery not implemented yet",{gatewayUrl:this.gatewayUrl});}async listServices(e){await this.load();let n=Array.from(this.services.values());return e?.status&&(n=n.filter(o=>o.status===e.status)),e?.capability&&(n=n.filter(o=>o.capabilities.includes(e.capability))),n}async getService(e){return await this.load(),this.services.get(e)}async getServiceByUrl(e){await this.load();for(let n of this.services.values())if(n.baseUrl===e)return n}async registerService(e){await this.load();let n={...e,updatedAt:Date.now()};this.services.set(e.id,n),await this.save(),fn.info("Service registered",{serviceId:e.id,name:e.name});}async unregisterService(e){await this.load(),this.services.delete(e)&&(await this.save(),fn.info("Service unregistered",{serviceId:e}));}async updateServiceStatus(e,n){await this.load();let o=this.services.get(e);o&&(o.status=n,o.updatedAt=Date.now(),await this.save(),fn.debug("Service status updated",{serviceId:e,status:n}));}async save(){try{let e={version:1,services:Array.from(this.services.values()).map(n=>({id:n.id,name:n.name,baseUrl:n.baseUrl,agentId:n.agentId,capabilities:n.capabilities,status:n.status,metadata:n.metadata}))};await Ot__default.mkdir(ke__default.dirname(this.storagePath),{recursive:!0}),await Ot__default.writeFile(this.storagePath,JSON.stringify(e,null,2),"utf-8"),fn.debug("Services saved",{count:this.services.size});}catch(e){fn.error("Failed to save services",{error:String(e)});}}async refresh(){this.loaded=false,this.services.clear(),await this.load(),fn.info("Services refreshed",{count:this.services.size});}},Kc=null;async function Jr(t){return Kc||(Kc=new Jc(t),await Kc.load()),Kc}var Qe=a.create({service:"websocket-subscriber"}),Yc=class{constructor(){b$1(this,"ws",null);b$1(this,"baseUrl","");b$1(this,"collectors",new Map);b$1(this,"callbacks",new Map);b$1(this,"reconnectAttempts",0);b$1(this,"maxReconnectAttempts",3);b$1(this,"reconnectDelayMs",1e3);Qe.info("WebSocketSubscriber created");}async connect(e){let n=e||await this.getConfigWebSocketUrl();if(!n)throw new Error("No WebSocket URL provided and no config URL found");if(this.ws&&this.baseUrl===n&&this.ws.readyState===WebSocket.OPEN){Qe.debug("WebSocket already connected",{wsUrl:n,readyState:this.ws.readyState});return}return this.ws&&(this.ws.close(),this.ws=null),this.baseUrl=n,new Promise((o,s)=>{try{this.ws=new WebSocket(n),this.ws.onopen=()=>{Qe.info("WebSocket connected",{wsUrl:n}),this.reconnectAttempts=0,o();},this.ws.onmessage=r=>{try{let i=JSON.parse(r.data);this.handleMessage(i);}catch(i){Qe.warn("Failed to parse WebSocket message",{error:String(i)});}},this.ws.onerror=r=>{Qe.error("WebSocket error",{error:String(r)}),s(new Error("WebSocket connection error"));},this.ws.onclose=()=>{Qe.info("WebSocket closed",{wsUrl:e}),this.handleReconnect();};}catch(r){Qe.error("Failed to create WebSocket",{error:String(r)}),s(r);}})}async getConfigWebSocketUrl(){try{let e=process.env.EASBOT_WS_URL;if(e)return e;let o=(await he.get())?.acp;if(o){let s=o.clients?.clients?.find(r=>r.type==="easbot"&&r.channels?.includes("websocket"))?.connection?.ws?.url;if(s)return s;if(o.server?.ws?.url)return o.server.ws.url}return ""}catch{return ""}}async subscribe(e,n,o){if(Qe.debug("subscribe: preparing to subscribe",{sessionId:e,readyState:this.ws?.readyState}),!this.ws||this.ws.readyState!==WebSocket.OPEN)throw Qe.error("subscribe: WebSocket not connected",{readyState:this.ws?.readyState}),new Error("WebSocket not connected");this.collectors.set(e,new Wo(n)),this.callbacks.set(e,o),Qe.debug("subscribe: collector and callback registered",{sessionId:e,collectorCount:this.collectors.size,callbackCount:this.callbacks.size});let s=JSON.stringify({type:"subscribe",sessionId:e});return Qe.debug("subscribe: sending subscribe message",{sessionId:e,message:s}),this.ws.send(s),Qe.info("Subscribed to session",{sessionId:e}),()=>{Qe.debug("subscribe: unsubscribe called",{sessionId:e}),this.removeSubscription(e);}}removeSubscription(e){if(this.collectors.delete(e),this.callbacks.delete(e),this.ws&&this.ws.readyState===WebSocket.OPEN){let n=JSON.stringify({type:"unsubscribe",sessionId:e});this.ws.send(n);}Qe.info("Subscription removed from session",{sessionId:e});}handleMessage(e){if(Qe.debug("handleMessage: received",{type:e.type,hasPayload:!!e.payload,sessionSubscriptions:Array.from(this.collectors.keys())}),(e.type==="message"||e.type==="event")&&e.payload){let n=e.payload,o=this.extractSessionId(n);Qe.debug("handleMessage: processing event",{sessionId:o,eventType:n.type,collectorExists:this.collectors.has(o)});let s=this.collectors.get(o);if(s&&(s.addEvent(n),s.checkComplete())){let r=s.assembleMessage();Qe.debug("handleMessage: checkComplete true, triggering callback",{sessionId:o,hasText:!!r.text,textLength:r.text?.length??0});let i=this.callbacks.get(o);i&&i(r),s.reset(),Qe.debug("handleMessage: collector reset, waiting for next message",{sessionId:o});}}}extractSessionId(e){return e.properties.sessionID||e.properties.info?.id||""}handleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){Qe.warn("Max reconnect attempts reached",{attempts:this.reconnectAttempts});return}this.reconnectAttempts++;let e=this.reconnectDelayMs*this.reconnectAttempts,n=new Map(this.collectors),o=new Map(this.callbacks);Qe.info("Attempting reconnect",{attempt:this.reconnectAttempts,delayMs:e,existingSubscriptions:n.size}),setTimeout(async()=>{try{await this.connect(this.baseUrl),Qe.info("Reconnected, restoring subscriptions",{subscriptionCount:n.size});for(let[s,r]of n){let i=o.get(s);if(i&&this.ws&&this.ws.readyState===WebSocket.OPEN){let c=JSON.stringify({type:"subscribe",sessionId:s});this.ws.send(c),this.collectors.set(s,r),this.callbacks.set(s,i),Qe.debug("Subscription restored",{sessionId:s});}}}catch(s){Qe.error("Reconnect failed",{error:String(s)});}},e);}async send(e,n){let o=n||Array.from(this.collectors.keys())[0];if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");if(!o)throw new Error("No session ID available");Qe.debug("WebSocketSubscriber.send called",{sessionId:o});let s=JSON.stringify({type:"prompt",sessionId:o,parts:[{type:"text",text:e}]});this.ws.send(s),Qe.debug("WebSocketSubscriber.send completed",{sessionId:o});}async status(e){let n=e||Array.from(this.collectors.keys())[0];if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");if(!n)throw new Error("No session ID available");return Qe.debug("WebSocketSubscriber.status called",{sessionId:n}),new Promise((o,s)=>{if(!this.ws){s(new Error("WebSocket not connected"));return}let r=JSON.stringify({type:"status",sessionId:n}),i=setTimeout(()=>{s(new Error("Status request timeout"));},5e3),c=u=>{try{let l=JSON.parse(u.data);l.type==="statusResponse"&&l.sessionId===n&&(clearTimeout(i),this.ws?.removeEventListener("message",c),o(l));}catch{}};this.ws.addEventListener("message",c),this.ws.send(r);})}async interrupt(e){let n=e||Array.from(this.collectors.keys())[0];if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");if(!n)throw new Error("No session ID available");Qe.debug("WebSocketSubscriber.interrupt called",{sessionId:n});let o=JSON.stringify({type:"interrupt",sessionId:n});this.ws.send(o),Qe.debug("WebSocketSubscriber.interrupt completed",{sessionId:n});}async unsubscribe(e){let n=e||Array.from(this.collectors.keys())[0];if(!n){Qe.debug("WebSocketSubscriber.unsubscribe: no session to unsubscribe");return}if(Qe.debug("WebSocketSubscriber.unsubscribe called",{sessionId:n}),this.collectors.delete(n),this.callbacks.delete(n),this.ws&&this.ws.readyState===WebSocket.OPEN){let o=JSON.stringify({type:"unsubscribe",sessionId:n});this.ws.send(o);}Qe.debug("WebSocketSubscriber.unsubscribe completed",{sessionId:n});}async releaseSubscription(e){let n=e||Array.from(this.collectors.keys())[0];if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");if(!n){Qe.debug("WebSocketSubscriber.releaseSubscription: no session to release");return}Qe.debug("WebSocketSubscriber.releaseSubscription called",{sessionId:n});let o=JSON.stringify({type:"releaseSubscription",sessionId:n});this.ws.send(o),Qe.debug("WebSocketSubscriber.releaseSubscription completed",{sessionId:n});}async subscriptions(){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");return Qe.debug("WebSocketSubscriber.subscriptions called"),new Promise((e,n)=>{if(!this.ws){n(new Error("WebSocket not connected"));return}let o=JSON.stringify({type:"subscriptions"}),s=setTimeout(()=>{n(new Error("Subscriptions request timeout"));},5e3),r=i=>{try{let c=JSON.parse(i.data);c.type==="subscriptionsResponse"&&(clearTimeout(s),this.ws?.removeEventListener("message",r),e(c));}catch{}};this.ws.addEventListener("message",r),this.ws.send(o);})}async close(){this.ws&&(this.ws.close(),this.ws=null),this.collectors.clear(),this.callbacks.clear(),this.baseUrl="",Qe.info("WebSocketSubscriber closed");}get isConnected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}},vu=null;function Su(){return vu||(vu=new Yc),vu}function iv(t){return t.startsWith("ws://")||t.startsWith("wss://")?"websocket":t.startsWith("stdio://")?"stdio":"http"}function av(t,e){return e!=="websocket"?t:Iu(t)}async function bs(t,e,n,o){if(t==="stdio")throw new Error("stdio channel requires dedicated transport and is not supported by fetch client");let s=await fetch(new URL(n,av(e,t)).toString(),o);if(!s.ok)throw new Error(`Remote request failed: ${s.status} ${s.statusText}`);return s.json()}var ws;(u=>{async function t(l){let f=l.channel??iv(l.baseUrl),m=l.sessionId;if(!m){let a=await bs(f,l.baseUrl,"/session",{method:"POST",body:JSON.stringify({title:"agent_client_chat"}),headers:{"Content-Type":"application/json"}});m=a.data?.id||a.id;}if(!m)throw new Error("Failed to create remote session");return {baseUrl:l.baseUrl,sessionID:m,channel:f}}u.connect=t;async function e(l,f,m){let{sessionID:a,parts:p}=m;if(f==="websocket"){let d=jo(l);await new Promise((h,w)=>{try{let g=new WebSocket(d),b=()=>{try{let k=JSON.stringify({type:"message",sessionId:a,payload:{parts:p}});g.send(k),setTimeout(()=>{g.close(),h();},50);}catch(k){w(k);}},v=()=>w(new Error("WebSocket error"));g.onopen=b,g.onerror=v;}catch(g){w(g);}});return}await bs(f,l,`/session/${a}/prompt`,{method:"POST",body:JSON.stringify({parts:p}),headers:{"Content-Type":"application/json"}});}u.send=e;async function n(l,f,m){if(f==="websocket"){let a=jo(l);await new Promise((p,d)=>{try{let h=new WebSocket(a),w=()=>{try{let b=JSON.stringify({type:"interrupt",sessionId:m});h.send(b),setTimeout(()=>{h.close(),p();},50);}catch(b){d(b);}},g=()=>d(new Error("WebSocket error"));h.onopen=w,h.onerror=g;}catch(h){d(h);}});return}if(f==="stdio"){let a={jsonrpc:"2.0",method:"session.interrupt",params:{sessionId:m}};process.stdout.write(`${JSON.stringify(a)}
150
+ `);return}await bs(f,l,`/session/${m}/interrupt`,{method:"POST",headers:{"Content-Type":"application/json"}});}u.interrupt=n;async function o(l,f){return await bs(f,l,"/initialize",{method:"POST",body:JSON.stringify({protocolVersion:1,clientCapabilities:{}}),headers:{"Content-Type":"application/json"}})}u.capabilities=o;async function s(l,f,m){if(f==="websocket"){let a=jo(l);return new Promise((p,d)=>{try{let h=new WebSocket(a),w=()=>{let v=JSON.stringify({type:"status",sessionId:m});h.send(v);},g=()=>d(new Error("WebSocket error")),b=v=>{try{let k=JSON.parse(v.data);k.type==="statusResponse"&&k.sessionId===m&&(h.close(),p(k));}catch{}};h.onopen=w,h.onerror=g,h.onmessage=b;}catch(h){d(h);}})}if(f==="stdio"){let a={jsonrpc:"2.0",method:"status",params:{sessionId:m}};return process.stdout.write(`${JSON.stringify(a)}
151
+ `),Promise.resolve({})}return bs(f,l,`/session/${m}`)}u.status=s;async function r(l,f,m){if(f==="websocket"){let a=jo(l);await new Promise((p,d)=>{try{let h=new WebSocket(a),w=()=>{let g=JSON.stringify({type:"unsubscribe",sessionId:m});h.send(g),setTimeout(()=>{h.close(),p();},50);};h.onopen=w,h.onerror=()=>d(new Error("WebSocket error"));}catch(h){d(h);}});return}if(f==="stdio"){let a={jsonrpc:"2.0",method:"session.unsubscribe",params:{sessionId:m}};process.stdout.write(`${JSON.stringify(a)}
152
+ `);return}await bs(f,l,`/session/${m}/subscription`,{method:"DELETE",headers:{"Content-Type":"application/json"}});}u.unsubscribe=r;async function i(l,f,m){if(f==="websocket"){let a=jo(l);await new Promise((p,d)=>{try{let h=new WebSocket(a),w=()=>{let g=JSON.stringify({type:"releaseSubscription",sessionId:m});h.send(g),setTimeout(()=>{h.close(),p();},50);};h.onopen=w,h.onerror=()=>d(new Error("WebSocket error"));}catch(h){d(h);}});return}if(f==="stdio"){let a={jsonrpc:"2.0",method:"session.releaseSubscription",params:{sessionId:m}};process.stdout.write(`${JSON.stringify(a)}
153
+ `);return}await bs(f,l,`/session/${m}/subscription`,{method:"DELETE",headers:{"Content-Type":"application/json"}});}u.releaseSubscription=i;async function c(l,f){if(f==="websocket"){let m=jo(l);return new Promise((a,p)=>{try{let d=new WebSocket(m),h=()=>{d.send(JSON.stringify({type:"subscriptions"}));},w=g=>{try{let b=JSON.parse(g.data);b.type==="subscriptionsResponse"&&(d.close(),a(b));}catch{}};d.onopen=h,d.onmessage=w,d.onerror=()=>p(new Error("WebSocket error"));}catch(d){p(d);}})}if(f==="stdio"){let m={jsonrpc:"2.0",method:"subscriptions",params:{}};return process.stdout.write(`${JSON.stringify(m)}
154
+ `),Promise.resolve({})}return bs(f,l,"/subscriptions")}u.subscriptions=c;})(ws||(ws={}));var Lt=a.create({service:"http-subscriber"}),Cu=null;function jf(){return Cu||(Cu=new ku),Cu}var ku=class{constructor(){b$1(this,"config",null);b$1(this,"filterConfig",null);b$1(this,"collector",null);b$1(this,"onMessageCallback",null);b$1(this,"onErrorCallback",null);b$1(this,"abortController",null);b$1(this,"reader",null);b$1(this,"response",null);b$1(this,"active",false);b$1(this,"readingStarted",false);Lt.info("HTTPSubscriber created");}async subscribe(e,n,o,s){return Lt.debug("HTTPSubscriber.subscribe",{sessionId:e.sessionId}),this.config=e,this.filterConfig=n,this.collector=new Wo(n),this.onMessageCallback=o,this.onErrorCallback=s??null,await this.connect(),()=>this.close()}async connect(){if(!this.config)throw new Error("HTTPSubscriber not configured");await this.disconnect(),this.abortController=new AbortController,this.active=true,this.readingStarted=false;let e=`${this.config.baseUrl}/session/${this.config.sessionId}/events`;if(Lt.debug("HTTPSubscriber.connect: establishing SSE connection",{sessionId:this.config.sessionId,sseUrl:e}),this.response=await fetch(e,{headers:{Accept:"text/event-stream"},signal:this.abortController.signal}),!this.response.ok)throw new Error(`SSE connection failed: ${this.response.status}`);if(this.reader=this.response.body?.getReader()??null,!this.reader)throw new Error("SSE stream not available");Lt.info("HTTPSubscriber: SSE connected, starting readLoop",{sessionId:this.config.sessionId}),this.readLoop();let n=5e3,o=Date.now();await new Promise(s=>{let r=setInterval(()=>{let i=Date.now()-o;this.readingStarted?(clearInterval(r),Lt.debug("HTTPSubscriber.connect: readLoop started",{sessionId:this.config?.sessionId,elapsedMs:i}),s()):i>n&&(clearInterval(r),Lt.warn("HTTPSubscriber.connect: timeout waiting for readLoop",{sessionId:this.config?.sessionId,elapsedMs:i}),s());},10);this.abortController?.signal.addEventListener("abort",()=>{clearInterval(r),s();});});}async disconnect(){if(this.active=false,this.reader){try{await this.reader.cancel();}catch{}this.reader=null;}if(this.response?.body){try{this.response.body.cancel();}catch{}this.response=null;}this.abortController&&(this.abortController.abort(),this.abortController=null);}async readLoop(){Lt.debug("HTTPSubscriber.readLoop: starting",{sessionId:this.config?.sessionId});let e=new TextDecoder,n="";if(this.readingStarted=true,!this.reader||!this.collector||!this.onMessageCallback){Lt.warn("HTTPSubscriber.readLoop: missing components",{hasReader:!!this.reader,hasCollector:!!this.collector,hasCallback:!!this.onMessageCallback});return}for(Lt.debug("HTTPSubscriber.readLoop: entering main loop",{sessionId:this.config?.sessionId,active:this.active});this.active&&!this.abortController?.signal.aborted;)try{let{done:o,value:s}=await this.reader.read();if(o){Lt.debug("HTTPSubscriber: SSE stream done",{sessionId:this.config?.sessionId,active:this.active}),this.active=!1;break}let r=e.decode(s,{stream:!0});if(Lt.debug("HTTPSubscriber: received chunk",{sessionId:this.config?.sessionId,chunkLength:r.length}),n+=r,n=this.processChunk(n),this.collector.checkComplete()){let i=this.collector.assembleMessage();Lt.info("HTTPSubscriber: checkComplete TRUE, triggering callback",{sessionId:this.config?.sessionId,hasText:!!i.text,textLength:i.text?.length??0}),this.onMessageCallback(i),Lt.debug("HTTPSubscriber: calling reset after callback"),this.collector.reset();}}catch(o){o.name==="AbortError"?Lt.debug("HTTPSubscriber.readLoop: aborted",{sessionId:this.config?.sessionId}):(Lt.error("HTTPSubscriber.readLoop: error",{sessionId:this.config?.sessionId,error:o instanceof Error?o.message:String(o)}),this.onErrorCallback?.(o instanceof Error?o:new Error(String(o))));break}Lt.debug("HTTPSubscriber.readLoop: exited",{sessionId:this.config?.sessionId});}processChunk(e){if(!e||!this.collector)return e;let n=e.split(`
155
+ `),o=n.pop()||"";for(let s of n){if(!this.active)break;if(s.startsWith("data: ")){let r=s.slice(6).trim();if(!r)continue;try{let i=JSON.parse(r);Lt.debug("HTTPSubscriber.processChunk: event received",{sessionId:this.config?.sessionId,eventType:i.type,partType:i.properties?.part?.type}),this.collector.addEvent(i);}catch{}}}return o}async send(e){if(!this.config)throw new Error("HTTPSubscriber not configured");Lt.info("HTTPSubscriber.send: starting",{sessionId:this.config.sessionId,active:this.active,hasReader:!!this.reader,promptLength:e.length}),(!this.active||!this.reader)&&(Lt.warn("HTTPSubscriber.send: SSE not connected, reconnecting...",{sessionId:this.config.sessionId}),await this.connect()),Lt.debug("HTTPSubscriber.send: sending message",{sessionId:this.config.sessionId});let n=await fetch(`${this.config.baseUrl}/session/${this.config.sessionId}/prompt`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parts:[{type:"text",text:e}]})});if(!n.ok)throw new Error(`HTTP send failed: ${n.status}`);Lt.info("HTTPSubscriber.send: completed",{sessionId:this.config.sessionId});}async status(){if(!this.config)throw new Error("HTTPSubscriber not configured");let e=await fetch(`${this.config.baseUrl}/session/${this.config.sessionId}`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`HTTP status check failed: ${e.status}`);return e.json()}async interrupt(){if(!this.config)throw new Error("HTTPSubscriber not configured");Lt.debug("HTTPSubscriber.interrupt called",{sessionId:this.config.sessionId});let e=await fetch(`${this.config.baseUrl}/session/${this.config.sessionId}/interrupt`,{method:"POST",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`HTTP interrupt failed: ${e.status}`)}async unsubscribe(){this.config&&await fetch(`${this.config.baseUrl}/session/${this.config.sessionId}/subscription`,{method:"DELETE",headers:{"Content-Type":"application/json"}});}async releaseSubscription(){await this.unsubscribe();}async subscriptions(){if(!this.config)throw new Error("HTTPSubscriber not configured");let e=await fetch(`${this.config.baseUrl}/subscriptions`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!e.ok)throw new Error(`HTTP subscriptions check failed: ${e.status}`);return e.json()}close(){Lt.debug("HTTPSubscriber.close called",{sessionId:this.config?.sessionId}),this.disconnect();}};var eo=a.create({service:"connection-registry"});var Vo=class t{constructor(e){b$1(this,"storagePath");b$1(this,"defaultHistoryScope");b$1(this,"defaultHistoryWindowSize");b$1(this,"defaultDegradePolicy");b$1(this,"agentIndex",new Map);b$1(this,"serviceIndex",new Map);b$1(this,"connections",new Map);this.storagePath=e?.storagePath??".easbot/client-connections.json",this.defaultHistoryScope=e?.defaultHistoryScope??"session",this.defaultHistoryWindowSize=e?.defaultHistoryWindowSize??10,this.defaultDegradePolicy=e?.defaultDegradePolicy??"streaming_first",eo.info("connection registry created",{storagePath:this.storagePath,defaultHistoryScope:this.defaultHistoryScope});}static async create(e){let n=new t(e);return await n.load(),n}connect(e,n,o,s,r){let i=this.agentIndex.get(n);if(i)for(let f of i){let m=this.connections.get(f);if(m&&m.baseUrl===e&&m.status!=="closed")return s&&m.sessionId!==s&&(m.sessionId=s,m.sessionSequence=m.sessionSequence??[],m.sessionSequence.includes(s)||m.sessionSequence.push(s)),r&&(m.localSessionId=r),m.updatedAt=Date.now(),eo.debug("reused existing connection",{connectionId:f,localAgentId:n,baseUrl:e}),{connectionId:m.connectionId,sessionId:m.sessionId,localAgentId:m.localAgentId,remoteAgentId:m.remoteAgentId,baseUrl:m.baseUrl}}let c=this.generateConnectionId(),u=s??`session-${this.generateShortId()}`,l={localAgentId:n,remoteAgentId:o,connectionId:c,sessionId:u,...r?{localSessionId:r}:{},baseUrl:e,historyScope:this.defaultHistoryScope,historyWindowSize:this.defaultHistoryWindowSize,degradePolicy:this.defaultDegradePolicy,updatedAt:Date.now(),status:"active"};return this.connections.set(c,l),this.agentIndex.has(n)||this.agentIndex.set(n,new Set),this.agentIndex.get(n).add(c),this.serviceIndex.has(e)||this.serviceIndex.set(e,new Set),this.serviceIndex.get(e).add(c),this.save().catch(f=>{eo.warn("failed to persist connections",{error:String(f)});}),eo.debug("new connection created",{connectionId:c,localAgentId:n,remoteAgentId:o,baseUrl:e}),{connectionId:c,sessionId:u,localAgentId:n,remoteAgentId:o,baseUrl:e}}resolve(e,n=false){let o=this.connections.get(e);if(o)return o;let s=this.agentIndex.get(e);if(s&&s.size>0)for(let r of s){let i=this.connections.get(r);if(i&&i.status!=="closed")return i}for(let r of this.connections.values())if(r.status!=="closed"&&(r.sessionId===e||r.localSessionId===e))return r;if(n){let c=this.connect("http://localhost","system-local","system-remote",e);return this.connections.get(c.connectionId)}}closeConnection(e){let n=this.connections.get(e);if(!n)return;this.connections.delete(e);let o=this.agentIndex.get(n.localAgentId);o&&(o.delete(e),o.size===0&&this.agentIndex.delete(n.localAgentId));let s=this.serviceIndex.get(n.baseUrl);s&&(s.delete(e),s.size===0&&this.serviceIndex.delete(n.baseUrl)),eo.info("connection closed and removed",{connectionId:e,localAgentId:n.localAgentId,remoteAgentId:n.remoteAgentId}),this.save().catch(r=>{eo.warn("failed to persist connections",{error:String(r)});});}markDegraded(e,n){let o=this.connections.get(e);o&&(o.status="degraded",o.updatedAt=Date.now(),eo.debug("connection marked degraded",{connectionId:e,reason:n}),this.save().catch(s=>{eo.warn("failed to persist connections",{error:String(s)});}));}getConnectionsByPeer(e){let n=this.agentIndex.get(e);return n?Array.from(n).map(o=>this.connections.get(o)).filter(o=>o!==void 0&&o.status!=="closed"):[]}getConnectionsByService(e){let n=this.serviceIndex.get(e);return n?Array.from(n).map(o=>this.connections.get(o)).filter(o=>o!==void 0&&o.status!=="closed"):[]}getAllActiveConnections(){return Array.from(this.connections.values()).filter(e=>e.status!=="closed")}updateLastSeenMessageId(e,n){let o=this.connections.get(e);o&&(o.lastSeenMessageId=n,o.updatedAt=Date.now());}generateConnectionId(){return `conn-${this.generateShortId()}`}generateShortId(){return createHash("sha256").update(`${Date.now()}-${Math.random()}`).digest("hex").substring(0,8)}async save(){try{let e={version:1,connections:Array.from(this.connections.values()),agentIndex:Array.from(this.agentIndex.entries()).map(([o,s])=>({localAgentId:o,connectionIds:Array.from(s)})),serviceIndex:Array.from(this.serviceIndex.entries()).map(([o,s])=>({baseUrl:o,connectionIds:Array.from(s)})),savedAt:Date.now()},n=ke__default.dirname(this.storagePath);await Ot__default.mkdir(n,{recursive:!0}),await Ot__default.writeFile(this.storagePath,JSON.stringify(e,null,2),"utf-8"),eo.debug("connections saved",{count:this.connections.size,path:this.storagePath});}catch(e){throw eo.error("failed to save connections",{error:String(e)}),e}}async load(){try{if(!await Ot__default.access(this.storagePath).then(()=>!0,()=>!1))return;let n=await Ot__default.readFile(this.storagePath,"utf-8"),o=JSON.parse(n);if(o.connections)for(let s of o.connections)this.connections.set(s.connectionId,s);if(o.agentIndex)for(let s of o.agentIndex)this.agentIndex.set(s.localAgentId,new Set(s.connectionIds));if(o.serviceIndex)for(let s of o.serviceIndex)this.serviceIndex.set(s.baseUrl,new Set(s.connectionIds));eo.info("connections loaded",{count:this.connections.size,path:this.storagePath});}catch(e){eo.warn("failed to load connections",{error:String(e)});}}async close(){await this.save(),this.connections.clear(),this.agentIndex.clear(),this.serviceIndex.clear(),eo.info("connection registry closed");}};var Ko=a.create({service:"session-router"});var Yr=class extends Error{constructor(n,o,s){super(o);b$1(this,"code",n);b$1(this,"context",s);this.name="RoutingError";}},Pu=class t{static create(){return new t}constructor(){Ko.info("session router created");}route(e){if(!this.isValidContext(e))return {success:false,error:"routing context is empty or invalid"};try{return e.connectionId?this.routeByConnectionId(e.connectionId):e.localAgentId&&e.baseUrl?this.routeByPeerAndBaseUrl(e.localAgentId,e.baseUrl):e.baseUrl&&e.sessionId?this.routeByBaseUrlAndSessionId(e.baseUrl,e.sessionId):{success:!1,error:"insufficient routing parameters: need connectionId, or localAgentId+baseUrl, or baseUrl+sessionId"}}catch(n){let o=n instanceof Error?n.message:String(n);return Ko.error("routing failed",{context:e,error:o}),{success:false,error:o}}}routeOrThrow(e){let n=this.route(e);if(!n.success)throw new Yr(this.getErrorCode(n.error),n.error??"routing failed",e);if(!n.connectionId)throw new Yr("NOT_FOUND","connection not found",e);let o=this.getConnectionState(n.connectionId);if(!o)throw new Yr("NOT_FOUND","connection state not found",e);if(o.status==="closed")throw new Yr("CONNECTION_CLOSED","connection is closed",e);return o}registerConnection(e){return !e.connectionId||!e.localAgentId||!e.remoteAgentId||!e.baseUrl||!e.sessionId?{success:false,error:"invalid connection state: missing required fields"}:(Ko.debug("connection registered",{connectionId:e.connectionId,localAgentId:e.localAgentId,remoteAgentId:e.remoteAgentId,baseUrl:e.baseUrl}),{success:true,connectionId:e.connectionId,sessionId:e.sessionId,localAgentId:e.localAgentId,remoteAgentId:e.remoteAgentId,baseUrl:e.baseUrl})}unregisterConnection(e){let n=this.getConnectionState(e);return n?(Ko.debug("connection unregistered",{connectionId:e,localAgentId:n.localAgentId,remoteAgentId:n.remoteAgentId,baseUrl:n.baseUrl}),true):(Ko.debug("connection not found for unregister",{connectionId:e}),false)}isValidContext(e){return !!(e.connectionId||e.remoteAgentId||e.baseUrl||e.sessionId)}routeByConnectionId(e){let n=this.getConnectionState(e);return n?n.status==="closed"?{success:false,error:`connection is closed: ${e}`}:{success:true,connectionId:n.connectionId,sessionId:n.sessionId,localAgentId:n.localAgentId,remoteAgentId:n.remoteAgentId,baseUrl:n.baseUrl}:{success:false,error:`connection not found: ${e}`}}routeByPeerAndBaseUrl(e,n){let s=this.getConnectionsByPeer(e).filter(i=>i.baseUrl===n&&i.status!=="closed");if(s.length===0)return {success:false,error:`no connection found for localAgentId=${e}, baseUrl=${n}`};if(s.length>1)return {success:false,error:`ambiguous route: multiple connections found for localAgentId=${e}, baseUrl=${n}`};let r=s[0];return {success:true,connectionId:r.connectionId,sessionId:r.sessionId,localAgentId:r.localAgentId,remoteAgentId:r.remoteAgentId,baseUrl:r.baseUrl}}routeByBaseUrlAndSessionId(e,n){let s=this.getConnectionsByService(e).filter(i=>i.sessionId===n&&i.status!=="closed");if(s.length===0)return {success:false,error:`no connection found for baseUrl=${e}, sessionId=${n}`};if(s.length>1)return {success:false,error:`ambiguous route: multiple connections found for baseUrl=${e}, sessionId=${n}`};let r=s[0];return {success:true,connectionId:r.connectionId,sessionId:r.sessionId,localAgentId:r.localAgentId,remoteAgentId:r.remoteAgentId,baseUrl:r.baseUrl}}getConnectionState(e){Ko.warn("getConnectionState not implemented, returning undefined",{connectionId:e});}getConnectionsByPeer(e){return Ko.warn("getConnectionsByPeer not implemented, returning empty array",{agentId:e}),[]}getConnectionsByService(e){return Ko.warn("getConnectionsByService not implemented, returning empty array",{baseUrl:e}),[]}getErrorCode(e){return e?e.includes("empty")||e.includes("invalid")?"EMPTY_CONTEXT":e.includes("ambiguous")?"AMBIGUOUS_ROUTE":e.includes("not found")?"NOT_FOUND":e.includes("closed")?"CONNECTION_CLOSED":e.includes("insufficient")||e.includes("missing")?"MISSING_REQUIRED_PARAMS":"NOT_FOUND":"NOT_FOUND"}},Xc=class t extends Pu{constructor(n){super();b$1(this,"registry");this.registry=n,Ko.info("registry session router created");}static fromRegistry(n){return new t(n)}getConnectionState(n){return this.registry.resolve(n)}getConnectionsByPeer(n){return this.registry.getConnectionsByPeer(n)}getConnectionsByService(n){return this.registry.getConnectionsByService(n)}};a.create({service:"history-selector"});var Rt=a.create({service:"duplex-executor"}),Zc=class t{constructor(e){b$1(this,"registry");b$1(this,"degradationConfig");b$1(this,"degradationState");b$1(this,"messageQueue",new Map);b$1(this,"subscriptions",new Map);b$1(this,"pendingExchanges",new Map);b$1(this,"streamingConnections",new Map);b$1(this,"pollingTimer",null);b$1(this,"healthCheckTimer",null);b$1(this,"agent",null);b$1(this,"unsubscribeMessageUpdated",null);b$1(this,"unsubscribePartUpdated",null);this.registry=e.registry,this.degradationConfig={policy:e.degradation?.policy??"streaming_first",healthCheckInterval:e.degradation?.healthCheckInterval??3e4,consecutiveFailureThreshold:e.degradation?.consecutiveFailureThreshold??3,recoveryCheckInterval:e.degradation?.recoveryCheckInterval??6e4},this.degradationState={mode:"streaming",info:null,consecutiveFailures:0,lastCheckTime:Date.now(),recoveryChecking:false},this.startHealthCheck(),Rt.info("duplex executor created",{policy:this.degradationConfig.policy});}static create(e){return new t(e)}async send(e,n,o){let s=this.registry.resolve(e);if(!s)throw new Error(`Connection not found: ${e}`);if(s.status==="closed")throw new Error(`Connection is closed: ${e}`);let r={...n,id:this.generateMessageId(),timestamp:Date.now()};return this.degradationState.mode==="streaming"&&s.status==="active"?this.sendViaStreaming(s,r,o):this.sendViaPolling(s,r,o)}async receive(e,n){let o=this.registry.resolve(e);if(!o)throw new Error(`Connection not found: ${e}`);return this.degradationState.mode==="streaming"&&o.status==="active"?this.receiveViaStreaming(o,n):this.receiveViaPolling(o,n)}async exchange(e,n,o){let s=o?.timeout??3e4,r=o?.retries??1,i=o?.retryInterval??1e3,c=null;for(let u=0;u<=r;u++)try{let l=this.generateMessageId(),f={...n,id:l,timestamp:Date.now(),type:"request"};return await Promise.race([this.waitForResponse(e,l,s),new Promise((a,p)=>setTimeout(()=>p(new Error(`Exchange timeout: ${s}ms`)),s))])}catch(l){c=l,u<r&&await this.sleep(i);}throw c}subscribe(e,n){let o=this.generateMessageId(),s={eventType:n.eventType,callback:n.callback,once:n.once??false,createdAt:Date.now()};return this.subscriptions.has(e)||this.subscriptions.set(e,[]),this.subscriptions.get(e).push(s),Rt.debug("subscription created",{connectionId:e,subscriptionId:o,eventType:n.eventType}),o}unsubscribe(e,n){let o=this.subscriptions.get(e);if(!o)return;let s=o.findIndex(r=>r.eventType===n);s!==-1&&o.splice(s,1),Rt.debug("subscription removed",{connectionId:e,subscriptionId:n});}getDegradationStatus(){return this.degradationState.info}forceDegrade(e){this.degrade("manual",e);}forceRecover(){this.recover();}setAgent(e){this.agent=e,this.startBusSubscription(),Rt.info("Agent set for duplex executor");}startBusSubscription(){if(!this.agent){Rt.warn("Cannot start Bus subscription: agent not set");return}this.unsubscribeMessageUpdated=ue.subscribe(ve.Event.Updated,async e=>{let n=e.properties.info;n?.sessionID&&(Rt.debug("Executor received message update",{sessionId:n.sessionID,messageId:n.id}),this.notifySubscribers("message:updated",{id:n.id,type:"event",role:"assistant",content:JSON.stringify(n),timestamp:Date.now(),metadata:{sessionId:n.sessionID,event:"message:updated"}}));}),this.unsubscribePartUpdated=ue.subscribe(ve.Event.PartUpdated,async e=>{let n=e.properties.part;n?.sessionID&&(Rt.debug("Executor receives part update",{sessionId:n.sessionID,messageId:n.messageID,partId:n.id}),this.notifySubscribers("part:updated",{id:n.id,type:"event",role:"assistant",content:JSON.stringify(n),timestamp:Date.now(),metadata:{sessionId:n.sessionID,messageId:n.messageID,event:"part:updated"}}));}),Rt.info("Bus event subscriptions started");}notifySubscribers(e,n){for(let[o,s]of this.subscriptions)for(let r of s)if(r.eventType===e||r.eventType==="*")try{r.callback(n);}catch(i){Rt.error("Error in subscription callback",{connectionId:o,eventType:e,error:i instanceof Error?i.message:String(i)});}}async processWithAgent(e,n){if(!this.agent)throw new Error("Agent not set in duplex executor");if(this.registry.resolve(e)||(Rt.warn("Session not found in registry, creating new connection",{sessionId:e}),this.registry.connect("http://localhost","system-local","system-remote",e)),Rt.debug("Processing message with agent",{sessionId:e}),typeof n!="object"||n===null||!("parts"in n))throw new Error("Invalid message format: expected SessionPrompt.PromptInput");let s=await this.agent.processMessage(e,n);return Rt.debug("Message processed by agent",{sessionId:e}),s}async close(){this.unsubscribeMessageUpdated&&(this.unsubscribeMessageUpdated(),this.unsubscribeMessageUpdated=null),this.unsubscribePartUpdated&&(this.unsubscribePartUpdated(),this.unsubscribePartUpdated=null),this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),this.healthCheckTimer&&(clearInterval(this.healthCheckTimer),this.healthCheckTimer=null);for(let[e,n]of this.streamingConnections)n.abortController.abort();this.streamingConnections.clear(),this.messageQueue.clear(),this.subscriptions.clear();for(let[e,n]of this.pendingExchanges)clearTimeout(n.timeout),n.reject(new Error("Executor closed"));this.pendingExchanges.clear(),Rt.info("duplex executor closed");}async sendViaStreaming(e,n,o){try{let s=`${e.baseUrl}/api/messages`,r=new AbortController,i=o?.timeout?setTimeout(()=>r.abort(),o.timeout):null,c=await Fetch.post(s,n,{headers:{"Content-Type":"application/json","X-Connection-Id":e.connectionId,"X-Session-Id":e.sessionId},signal:r.signal});if(i&&clearTimeout(i),!c.ok)throw new Error(`HTTP ${c.status}: ${c.statusText}`);return this.degradationState.consecutiveFailures=0,Rt.debug("message sent via streaming",{connectionId:e.connectionId,messageId:n.id}),n.id}catch(s){throw this.degradationState.consecutiveFailures++,this.degradationState.consecutiveFailures>=this.degradationConfig.consecutiveFailureThreshold&&this.degrade("streaming_failure",String(s)),s}}async sendViaPolling(e,n,o){return this.messageQueue.has(e.connectionId)||this.messageQueue.set(e.connectionId,[]),this.messageQueue.get(e.connectionId).push(n),Rt.debug("message queued for polling",{connectionId:e.connectionId,messageId:n.id,queueSize:this.messageQueue.get(e.connectionId).length}),n.id}async receiveViaStreaming(e,n){try{let o=new URL(`${e.baseUrl}/api/messages`);n?.sinceMessageId&&o.searchParams.set("since",n.sinceMessageId),n?.limit&&o.searchParams.set("limit",String(n.limit));let s=new AbortController,r=n?.timeout?setTimeout(()=>s.abort(),n.timeout):null,i=await Fetch.get(o.toString(),{headers:{"X-Connection-Id":e.connectionId,"X-Session-Id":e.sessionId},signal:s.signal});if(r&&clearTimeout(r),!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);let c=i.data;if(c.length>0){let u=c[c.length-1];this.registry.updateLastSeenMessageId(e.connectionId,u.id);}return this.degradationState.consecutiveFailures=0,Rt.debug("messages received via streaming",{connectionId:e.connectionId,count:c.length}),c}catch(o){throw this.degradationState.consecutiveFailures++,this.degradationState.consecutiveFailures>=this.degradationConfig.consecutiveFailureThreshold&&this.degrade("streaming_failure",String(o)),o}}async receiveViaPolling(e,n){let o=this.messageQueue.get(e.connectionId)??[],s;if(n?.sinceMessageId){let i=o.findIndex(c=>c.id===n.sinceMessageId);s=i>=0?o.slice(i+1):o;}else s=[...o];n?.limit&&s.length>n.limit&&(s=s.slice(0,n.limit));let r=new Set(s.map(i=>i.id));return this.messageQueue.set(e.connectionId,o.filter(i=>!r.has(i.id))),Rt.debug("messages received via polling",{connectionId:e.connectionId,count:s.length}),s}waitForResponse(e,n,o){return new Promise((s,r)=>{let i=setTimeout(()=>{this.pendingExchanges.delete(n),r(new Error(`Response timeout for correlationId: ${n}`));},o);this.pendingExchanges.set(n,{resolve:s,reject:r,timeout:i}),this.send(e,{type:"request",role:"user",content:"",correlationId:n},{timeout:o}).catch(c=>{clearTimeout(i),this.pendingExchanges.delete(n),r(c);});})}handleMessage(e,n){if(n.type==="response"&&n.correlationId){let s=this.pendingExchanges.get(n.correlationId);if(s){clearTimeout(s.timeout),s.resolve(n),this.pendingExchanges.delete(n.correlationId);return}}let o=this.subscriptions.get(e);if(o){for(let s of o)if(s.eventType===n.type||s.eventType==="*"){try{s.callback(n);}catch(r){Rt.warn("subscription callback error",{connectionId:e,error:String(r)});}if(s.once){let r=o.indexOf(s);r!==-1&&o.splice(r,1);}}}}degrade(e,n){if(this.degradationState.mode!=="polling"){this.degradationState.mode="polling",this.degradationState.info={mode:"polling",reason:`${e}: ${n}`,timestamp:Date.now()};for(let[o,s]of this.streamingConnections)s.abortController.abort();this.streamingConnections.clear(),this.startPolling(),Rt.warn("degraded to polling mode",{reason:this.degradationState.info.reason});}}recover(){this.degradationState.mode!=="streaming"&&(this.degradationState.mode="streaming",this.degradationState.info=null,this.degradationState.consecutiveFailures=0,this.stopPolling(),Rt.info("recovered to streaming mode"));}startPolling(){if(this.pollingTimer)return;let e=1e3;this.pollingTimer=setInterval(()=>{this.pollAllConnections();},e),Rt.debug("polling started",{interval:e});}stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),Rt.debug("polling stopped");}async pollAllConnections(){let e=this.registry.getAllActiveConnections();for(let n of e)try{let o=await this.receiveViaPolling(n,{limit:10});for(let s of o)this.handleMessage(n.connectionId,s);}catch(o){Rt.warn("polling error",{connectionId:n.connectionId,error:String(o)});}}startHealthCheck(){this.healthCheckTimer=setInterval(()=>{this.checkStreamingHealth();},this.degradationConfig.healthCheckInterval),Rt.debug("health check started",{interval:this.degradationConfig.healthCheckInterval});}async checkStreamingHealth(){if(this.degradationState.mode==="polling"){if(this.degradationState.recoveryChecking)return;this.degradationState.recoveryChecking=true,setTimeout(()=>{this.degradationState.recoveryChecking=false;let e=this.registry.getAllActiveConnections();if(e.length>0){let n={id:this.generateMessageId(),type:"request",role:"user",content:"",timestamp:Date.now()};this.sendViaStreaming(e[0],n,{timeout:5e3}).then(()=>{this.recover();}).catch(()=>{});}},this.degradationConfig.recoveryCheckInterval);}}generateMessageId(){return `msg-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}sleep(e){return new Promise(n=>setTimeout(n,e))}};var el;(r=>{let t=new Set(["node_modules","bower_components",".pnpm-store","vendor",".npm","dist","build","out",".next","target","bin","obj",".git",".svn",".hg",".vscode",".idea",".turbo",".output","desktop",".sst",".cache",".webkit-cache","__pycache__",".pytest_cache","mypy_cache",".history",".gradle"]),e=["**/*.swp","**/*.swo","**/*.pyc","**/.DS_Store","**/Thumbs.db","**/logs/**","**/tmp/**","**/temp/**","**/*.log","**/coverage/**","**/.nyc_output/**"],n=e.map(i=>new PKG.Glob(i));r.PATTERNS=[...e,...t];function s(i,c){for(let f of c?.whitelist||[])if(f.match(i))return false;let u=i.split(sep);for(let f=0;f<u.length;f++){let m=u[f];if(m&&t.has(m))return true}let l=c?.extra||[];for(let f of [...n,...l])if(f.match(i))return true;return false}r.match=s;})(el||(el={}));createRequire(import.meta.url);var Ff=1e4,to;(m=>{let t=a.create({service:"file.watcher"});m.Event={Updated:a$5.define("file.watcher.updated",z$1.object({file:z$1.string(),event:z$1.union([z$1.literal("add"),z$1.literal("change"),z$1.literal("unlink")])}))};function n(){let a=process.platform==="linux"?`-${EASBOT_LIBC||"glibc"}`:"";return `@parcel/watcher-${process.platform}-${process.arch}${a}`}async function o(a){try{let p=process.env.EASBOT_CACHE_PATH||ke__default.join(".easbot","cache");return !!await PKG.resolve(a,void 0,{extraPaths:[p]})}catch{return false}}async function s(a,p){t.info("Installing Parcel watcher binding",{binding:a,version:p});let d=process.env.EASBOT_CACHE_PATH||ke__default.join(".easbot","cache");return await Shell.install(a,p,d)}let r=lazyAsync(async()=>{try{let a=n(),p=await o(a),d;if(p){let b=process.env.EASBOT_CACHE_PATH||ke__default.join(".easbot","cache");d=ke__default.join(b,"node_modules",a);}else {let b="latest";t.info("Parcel watcher binding not found, attempting to install",{binding:a}),d=await s(a,b);}t.info("Loading Parcel watcher binding",{binding:a,modulePath:d});let{createWrapper:h}=await import('@parcel/watcher/wrapper.js'),g=createRequire(ke__default.join(d,"package.json"))(a);return h(g)}catch(a){t.error("failed to load watcher binding",{error:a});return}});async function i(){if(A.project.vcs!=="git")return {};t.info("init");let a=await he.get(),p=(()=>{if(process.platform==="win32")return "windows";if(process.platform==="darwin")return "fs-events";if(process.platform==="linux")return "inotify"})();if(!p)return t.error("watcher backend not supported",{platform:process.platform}),{};t.info("watcher backend",{platform:process.platform,backend:p});let d=await r();if(!d)return {};let h=A.directory,w=(S,y)=>{A.provide({directory:h,init:void 0,fn:()=>ue.publish(m.Event.Updated,{file:S,event:y})});},g=(S,y)=>{if(!S)for(let x of y){let I=x;I.type==="create"&&w(I.path,"add"),I.type==="update"&&w(I.path,"change"),I.type==="delete"&&w(I.path,"unlink");}},b=[],v=a.watcher?.ignore??[];if(a$2.EASBOT_FILEWATCHER){let S=d.subscribe(A.directory,g,{ignore:[...el.PATTERNS,...v],backend:p}),y=await withTimeout(S,Ff).catch(x=>{t.error("failed to subscribe to Instance.directory",{error:x}),S.then(I=>I.unsubscribe()).catch(()=>{});});y&&b.push(y);}let k=await $`git rev-parse --git-dir`.quiet().nothrow().cwd(A.worktree).text().then(S=>Filesystem.resolve(Filesystem.join(A.worktree,S.trim()))).catch(()=>{});if(k&&!v.includes(".git")&&!v.includes(k)){let y=(await readdir(k).catch(()=>[])).filter(P=>P!=="HEAD"),x=d.subscribe(k,g,{ignore:y,backend:p}),I=await withTimeout(x,Ff).catch(P=>{t.error("failed to subscribe to vcsDir",{error:P}),x.then(T=>T.unsubscribe()).catch(()=>{});});I&&b.push(I);}return {subs:b}}let c;function u(){return c||(c=A.state(i,async a=>{a.subs&&await Promise.all(a.subs.map(p=>p?.unsubscribe()));})),c}async function l(){return u()()}function f(){a$2.EASBOT_FILEWATCHER&&l();}m.init=f;})(to||(to={}));var tl;(s=>{let t=a.create({service:"skill-discovery"});function e(){return ke__default.join(a$1.Path.cache,"skills")}s.dir=e;async function n(r,i){try{return await access(i),!0}catch{}try{let c=await Fetch.get(r);return c.ok?(await writeFile(i,String(c.data)),!0):(t.error("failed to download",{url:r,status:c.status}),!1)}catch(c){return t.error("failed to download",{url:r,err:c}),false}}async function o(r){let i=[],c=r.endsWith("/")?r:`${r}/`,u=new URL("index.json",c).href,l=e(),f=c.slice(0,-1);t.info("fetching index",{url:u});try{let m=await Fetch.get(u);if(!m.ok)return t.error("failed to fetch index",{url:u,status:m.status}),i;let a=m.data;if(!a?.skills||!Array.isArray(a.skills))return t.warn("invalid index format",{url:u}),i;let p=a.skills.filter(d=>!d?.name||!Array.isArray(d.files)?(t.warn("invalid skill entry",{url:u,skill:d}),!1):!0);await Promise.all(p.map(async d=>{let h=ke__default.join(l,d.name);await Promise.all(d.files.map(async g=>{let b=new URL(g,`${f}/${d.name}/`).href,v=ke__default.join(h,g);await mkdir(ke__default.dirname(v),{recursive:!0}),await n(b,v);}));let w=ke__default.join(h,"SKILL.md");try{await access(w),i.push(h);}catch{}}));}catch(m){t.error("failed to fetch index",{url:u,err:m});}return i}s.pull=o;})(tl||(tl={}));var rn;(w=>{let t=a.create({service:"skill"});w.Info=z$1.object({name:z$1.string(),description:z$1.string(),location:z$1.string(),content:z$1.string(),scope:z$1.enum(h).optional().describe("Context mode scope")}),w.InvalidError=NamedError.create("SkillInvalidError",z$1.object({path:z$1.string(),message:z$1.string().optional(),issues:z$1.custom().optional()})),w.NameMismatchError=NamedError.create("SkillNameMismatchError",z$1.object({message:z$1.string(),path:z$1.string(),expected:z$1.string(),actual:z$1.string()}));let s=[".agents"],r="skills/**/SKILL.md",i$1="skills/**/SKILL.md",c="**/SKILL.md",u;function l(){return u||(u=A.state(async()=>{let g={},b=new Set,v=async y=>{let x=await a$a.parse(y).catch(P=>{let T=a$a.FrontmatterError.isInstance(P)?P.data.message:`Failed to parse skill ${y}`;ue.publish(ee.Event.Error,{error:new NamedError.Unknown({message:T}).toObject()}),t.error("failed to load skill",{skill:y,err:P});});if(!x)return;let I=w.Info.pick({name:true,description:true}).safeParse(x.data);I.success&&(g[I.data.name]&&t.warn("duplicate skill name",{name:I.data.name,existing:g[I.data.name]?.location,duplicate:y}),b.add(ke__default.dirname(y)),g[I.data.name]={name:I.data.name,description:I.data.description,location:y,content:x.content,scope:x.data.scope});},k=async(y,x)=>glob(r,{cwd:y,absolute:true,nodir:true,follow:true,dot:true}).then(I=>Promise.all(I.map(v))).catch(I=>{t.error(`failed to scan ${x} skills`,{dir:y,error:I});});if(!a$2.EASBOT_DISABLE_EXTERNAL_SKILLS){for(let y of s){let x=ke__default.join(a$1.Path.home,y);await Filesystem.isDir(x)&&await k(x,"global");}for await(let y of Filesystem.up({targets:s,start:A.directory,stop:A.worktree}))await k(y,"project");}for(let y of await he.directories()){let x=await glob(i$1,{cwd:y,absolute:true,nodir:true,follow:true});for(let I of x)await v(I);}let S=await he.get();for(let y of S.skills?.paths??[]){let x=y.startsWith("~/")?ke__default.join(Mc.homedir(),y.slice(2)):y,I=ke__default.isAbsolute(x)?x:ke__default.join(A.directory,x);if(!await Filesystem.isDir(I)){t.warn("skill path not found",{path:I});continue}let P=await glob(c,{cwd:I,absolute:true,nodir:true,follow:true});for(let T of P)await v(T);}for(let y of S.skills?.urls??[]){let x=await tl.pull(y);for(let I of x){b.add(I);let P=await glob(c,{cwd:I,absolute:true,nodir:true,follow:true});for(let T of P)await v(T);}}return {skills:g,dirs:Array.from(b)}})),u}function f(){return l()()}w.state=f;async function m(g){return f().then(b=>b.skills[g])}w.get=m;async function a$3(){return f().then(g=>Object.values(g.skills))}w.all=a$3;async function p(){return f().then(g=>g.dirs)}w.dirs=p;async function d(g,b=i){let v=await f();return Object.values(v.skills).toSorted((S,y)=>S.name.localeCompare(y.name)).filter(S=>{if(g&&Me.evaluate("skill",S.name,g.permission).action==="deny")return false;if(b){let y=S.scope??i;if(y!=="all"&&y!==b)return false}return true})}w.available=d;function h$1(g,b){if(g.length===0)return "No skills are currently available.";let v=g.toSorted((k,S)=>k.name.localeCompare(S.name));return b.verbose?["<available_skills>",...v.flatMap(k=>[" <skill>",` <name>${k.name}</name>`,` <description>${k.description}</description>`,` <location>${pathToFileURL(k.location).href}</location>`," </skill>"]),"</available_skills>"].join(`
156
+ `):["## Available Skills","Skills provide specialized instructions and workflows for specific tasks.","Use the skill tool to load a skill when a task matches its description.","",...v.map(k=>[`- **${k.name}**: ${k.description}`,` - Location: ${pathToFileURL(k.location).href}`].join(`
157
+ `))].join(`
158
+ `)}w.format=h$1;})(rn||(rn={}));var Iv=loadTextFile("./init.txt",import.meta.url),Du=f("init",{description:"create/update AGENTS.md",source:"command",commandType:"prompt",subtask:false,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=Iv(),o=e$1(n,t);return {title:"Initialize",metadata:{sessionID:e.sessionID},output:o,parts:[{type:"text",text:o}],success:true}},init:async()=>({})});var Sv=loadTextFile("./review.txt",import.meta.url),Au=f("review",{description:"review changes [commit|branch|pr], defaults to uncommitted",source:"command",commandType:"prompt",subtask:true,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=Sv(),o=e$1(n,t);return {title:"Code Review",metadata:{sessionID:e.sessionID},output:o,parts:[{type:"text",text:o}],success:true}},init:async()=>({})});var kv=loadTextFile("./vuln.txt",import.meta.url),Ru=f("vuln",{description:"analyze code for security vulnerabilities",source:"command",commandType:"prompt",subtask:true,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=kv(),o=e$1(n,t);return {title:"Security Vulnerability Analysis",metadata:{sessionID:e.sessionID},output:o,parts:[{type:"text",text:o}],success:true}},init:async()=>({})});var Ev=loadTextFile("./arch.txt",import.meta.url),_u=f("arch",{description:"review code architecture and design patterns",source:"command",commandType:"prompt",subtask:true,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=Ev(),o=e$1(n,t);return {title:"Architecture Review",metadata:{sessionID:e.sessionID},output:o,parts:[{type:"text",text:o}],success:true}},init:async()=>({})});var Tv="Never use question tool (question)",Mu=f("btw",{description:"ask a side question without interrupting current task",source:"command",commandType:"local",agent:"btw",subtask:false,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let{Provider:n}=await import('./provider-ULN4YD2M.mjs');if(!e.model)throw new Error("BTW command requires model");let o=n.parseModel(e.model),s=typeof t=="string"?t:JSON.stringify(t),r=await Ur.run({source:e.sessionID,title:"BTW Response",agent:e.agent,model:{providerID:o.providerID,modelID:o.modelID},parts:[{type:"text",text:s}],system:Tv,syncMessages:false});return {title:r.title,metadata:{userMessage:r.userMessage,assistantMessage:r.assistantMessage,sessionID:e.sessionID},output:r.output,success:true}},init:async()=>({})});function Av(t){return typeof t=="string"?t:JSON.stringify(t)}var Ou=f("shell",{description:"execute shell command locally",source:"command",commandType:"local",subtask:false,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=Av(t).trim();if(!n)return {title:"Shell Command",metadata:{sessionID:e.sessionID},output:"No command provided",success:true};try{let o=await Shell.run(void 0,n,{cwd:A.directory});if(o.code!==0){let r=o.stderr||o.stdout||`Exit code: ${o.code}`;throw new Error(`Command failed (${o.code}): ${r}`)}let s=o.stdout||o.stderr;return {title:"Shell Command",metadata:{sessionID:e.sessionID,command:n},output:s||"(empty output)",success:!0}}catch(o){return {title:"Shell Command",metadata:{sessionID:e.sessionID,command:n,error:o instanceof Error?o.message:String(o)},output:`Error: ${o instanceof Error?o.message:String(o)}`,success:false}}},init:async()=>({})});var ia=a.create({service:"scheduler.task-store"}),_v="scheduler",Mv="tasks.json",Gf=1,Ge;(x=>{let t={heartbeats:[],scheduled:[],commands:[],version:Gf},e=false;function n(){return ke__default.join(a$1.Path.data,_v)}function o(){let I=n();return ke__default.join(I,Mv)}async function s(){let I=n();await Filesystem.exists(I)||await mkdir(I,{recursive:true});}async function r(){let I=o();if(!await Filesystem.exists(I)){ia.debug("Task store file not found, using empty store");return}try{let P=await Filesystem.readText(I),T=JSON.parse(P);t.heartbeats=Array.isArray(T.heartbeats)?T.heartbeats:[],t.scheduled=Array.isArray(T.scheduled)?T.scheduled:[],t.commands=Array.isArray(T.commands)?T.commands:[],t.version=typeof T.version=="number"?T.version:Gf,ia.info("Task store loaded",{heartbeats:t.heartbeats.length,scheduled:t.scheduled.length,commands:t.commands.length});}catch(P){ia.error("Failed to load task store",{error:P});}}async function i(){if(!e)return;await s();let I=o();try{let P=JSON.stringify(t,null,2);await Filesystem.write(I,P),e=!1,ia.debug("Task store saved");}catch(P){throw ia.error("Failed to save task store",{error:P}),P}}async function c(){await r();}x.init=c;async function u(){return [...t.heartbeats]}x.getHeartbeats=u;async function l(){return [...t.scheduled]}x.getScheduled=l;async function f(I){return t.heartbeats.find(P=>P.id===I)}x.getHeartbeat=f;async function m(I){return t.scheduled.find(P=>P.id===I)}x.getScheduledTask=m;async function a(I){let P=t.heartbeats.findIndex(T=>T.id===I.id);P>=0?t.heartbeats[P]=I:t.heartbeats.push(I),e=true,await i();}x.saveHeartbeat=a;async function p(I){let P=t.scheduled.findIndex(T=>T.id===I.id);P>=0?t.scheduled[P]=I:t.scheduled.push(I),e=true,await i();}x.saveScheduled=p;async function d(I){t.heartbeats=t.heartbeats.filter(P=>P.id!==I),e=true,await i();}x.deleteHeartbeat=d;async function h(I){t.scheduled=t.scheduled.filter(P=>P.id!==I),e=true,await i();}x.deleteScheduled=h;async function w(I,P){let T=t.heartbeats.findIndex(N=>N.id===I);if(T<0)throw new Error(`Heartbeat task not found: ${I}`);let M=t.heartbeats[T],j={id:I,name:P.name??M.name,cron:P.cron??M.cron,type:"heartbeat",enabled:P.enabled??M.enabled,parts:P.parts??M.parts,config:P.config??M.config,recurring:true,createdAt:M.createdAt,updatedAt:Date.now(),lastFiredAt:P.lastFiredAt??M.lastFiredAt,nextFireAt:P.nextFireAt??M.nextFireAt};t.heartbeats[T]=j,e=true,await i();}x.updateHeartbeat=w;async function g(I,P){let T=t.scheduled.findIndex(N=>N.id===I);if(T<0)throw new Error(`Scheduled task not found: ${I}`);let M=t.scheduled[T],j={id:I,name:P.name??M.name,cron:P.cron??M.cron,type:"scheduled",enabled:P.enabled??M.enabled,parts:P.parts??M.parts,agentType:P.agentType??M.agentType,transport:P.transport??M.transport,agentConfig:P.agentConfig??M.agentConfig,recurring:P.recurring??M.recurring,durable:P.durable??M.durable,permanent:P.permanent??M.permanent,createdAt:M.createdAt,updatedAt:Date.now(),lastFiredAt:P.lastFiredAt??M.lastFiredAt,nextFireAt:P.nextFireAt??M.nextFireAt};t.scheduled[T]=j,e=true,await i();}x.updateScheduled=g;async function b(){return [...t.commands]}x.getCommands=b;async function v(I){return t.commands.find(P=>P.id===I)}x.getCommand=v;async function k(I){let P=t.commands.findIndex(T=>T.id===I.id);P>=0?t.commands[P]=I:t.commands.push(I),e=true,await i();}x.saveCommand=k;async function S(I){t.commands=t.commands.filter(P=>P.id!==I),e=true,await i();}x.deleteCommand=S;async function y(I,P){let T=t.commands.findIndex(N=>N.id===I);if(T<0)throw new Error(`Command task not found: ${I}`);let M=t.commands[T],j={id:I,name:P.name??M.name,cron:P.cron??M.cron,type:"command",enabled:P.enabled??M.enabled,config:P.config??M.config,recurring:P.recurring??M.recurring,durable:P.durable??M.durable,createdAt:M.createdAt,updatedAt:Date.now(),lastFiredAt:P.lastFiredAt??M.lastFiredAt,nextFireAt:P.nextFireAt??M.nextFireAt};t.commands[T]=j,e=true,await i();}x.updateCommand=y;})(Ge||(Ge={}));var ju;(h=>{async function t(){return Ge.getHeartbeats()}h.getHeartbeats=t;async function e(){return Ge.getScheduled()}h.getScheduled=e;async function n(w){return Ge.getHeartbeat(w)}h.getHeartbeat=n;async function o(w){return Ge.getScheduledTask(w)}h.getScheduledTask=o;async function s(w){return Ge.saveHeartbeat(w)}h.saveHeartbeat=s;async function r(w){return Ge.saveScheduled(w)}h.saveScheduled=r;async function i(w){return Ge.deleteHeartbeat(w)}h.deleteHeartbeat=i;async function c(w){return Ge.deleteScheduled(w)}h.deleteScheduled=c;async function u(w,g){return Ge.updateHeartbeat(w,g)}h.updateHeartbeat=u;async function l(w,g){return Ge.updateScheduled(w,g)}h.updateScheduled=l;async function f(){return Ge.getCommands()}h.getCommands=f;async function m(w){return Ge.getCommand(w)}h.getCommand=m;async function a(w){return Ge.saveCommand(w)}h.saveCommand=a;async function p(w){return Ge.deleteCommand(w)}h.deleteCommand=p;async function d(w,g){return Ge.updateCommand(w,g)}h.updateCommand=d;})(ju||(ju={}));function aa(t,e,n){if(t==="*"){let r=[];for(let i=e;i<=n;i++)r.push(i);return r}let o=new Set,s=t.split(",");for(let r of s)if(r.includes("/")){let[i,c]=r.split("/"),u=Wf(i??"*",e,n),l=parseInt(c??"1",10);for(let f=0;f<u.length;f+=l)f<u.length&&o.add(u[f]);}else if(r.includes("-")){let i=Wf(r,e,n);for(let c of i)o.add(c);}else {let i=parseInt(r,10);!Number.isNaN(i)&&i>=e&&i<=n&&o.add(i);}return Array.from(o).sort((r,i)=>r-i)}function Wf(t,e,n){if(t==="*"){let u=[];for(let l=e;l<=n;l++)u.push(l);return u}let[o,s]=t.split("-"),r=o?parseInt(o,10):e,i=s?parseInt(s,10):n,c=[];for(let u=r;u<=i;u++)u>=e&&u<=n&&c.push(u);return c}function Xr(t){if(!t||typeof t!="string")return null;let n=t.trim().split(/\s+/);if(n.length!==5)return null;try{let[o,s,r,i,c]=n;return {minutes:aa(o??"*",0,59),hours:aa(s??"*",0,23),days:aa(r??"*",1,31),months:aa(i??"*",1,12),weekdays:aa(c??"*",0,6)}}catch{return null}}function xs(t){return Xr(t)!==null}function sl(t,e=new Date){let n=new Date(e);n.setSeconds(0,0);for(let o=0;o<366*24*60;o++){n.setMinutes(n.getMinutes()+1);let s=n.getMinutes(),r=n.getHours(),i=n.getDate(),c=n.getMonth()+1,u=n.getDay();if(t.minutes.includes(s)&&t.hours.includes(r)&&t.days.includes(i)&&t.months.includes(c)&&t.weekdays.includes(u))return new Date(n)}return new Date(n.getTime()+1440*60*1e3*366)}function Ov(t){let e=(n,o,s)=>{if(n.length===s-o+1)return "*";if(n.length===1)return n[0].toString();let r=[...n],i=[],c=r[0],u=r[0];for(let l=1;l<r.length;l++)r[l]!==u+1&&(i.push(c===u?`${c}`:`${c}-${u}`),c=r[l]),u=r[l];return i.push(c===u?`${c}`:`${c}-${u}`),i.join(",")};return [e(t.minutes,0,59),e(t.hours,0,23),e(t.days,1,31),e(t.months,1,12),e(t.weekdays,0,6)].join(" ")}function jv(t){if(!Xr(t))return null;let n=t.trim().split(/\s+/);return n.length!==5?null:{minute:n[0]??"",hour:n[1]??"",day:n[2]??"",month:n[3]??"",weekday:n[4]??""}}function Vf(t){let e=jv(t);if(!e)return "Invalid cron expression";let n=[];if(e.minute==="*")n.push("every minute");else if(e.minute.startsWith("*/")){let o=e.minute.slice(2);n.push(`every ${o} minutes`);}else n.push(`at minute ${e.minute}`);if(e.hour!=="*")if(e.hour.startsWith("*/")){let o=e.hour.slice(2);n.push(`every ${o} hours`);}else n.push(`at hour ${e.hour}`);if(e.day!=="*"&&n.push(`on day ${e.day}`),e.month!=="*"){let o=["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],s=parseInt(e.month,10);!Number.isNaN(s)&&s>=1&&s<=12&&n.push(`in ${o[s]}`);}if(e.weekday!=="*"){let o=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],s=parseInt(e.weekday,10);!Number.isNaN(s)&&s>=0&&s<=6&&n.push(`on ${o[s]}`);}return n.join(" ")}var $v=loadTextFile("./heartbeat.txt",import.meta.url),Fv=loadTextFile("./scheduled.txt",import.meta.url),eg=$v(),tg=Fv(),Qf=a.create({service:"scheduler.history"}),Uv=/\{\{([A-Z_]+)\}/g,Nu;(s=>{function t(r,i){return r.replace(Uv,(c,u)=>e(u,i)??c)}s.render=t;function e(r,i){switch(r){case "TASK_ID":return i.taskId;case "TASK_NAME":return i.taskName;case "TASK_TYPE":return i.taskType;case "SESSION":return i.session;case "AGENT":return i.agent;case "MODEL":return i.model;case "TIME":return new Date().toISOString();case "TIME_LOCAL":return new Date().toLocaleString();case "TIMESTAMP":return String(Date.now());default:return}}s.resolveVariable=e;function n(r){let i={taskId:r.id,taskName:r.name,taskType:"heartbeat",session:r.session,agent:r.agent,model:r.model,timestamp:Date.now()};return s.render(eg,i)}s.buildHeartbeatPrompt=n;function o(r,i){let c={taskId:r.id,taskName:r.name,taskType:"scheduled",agent:r.agentType,model:r.model,timestamp:Date.now()};return `${s.render(tg,c)}
159
+
160
+ ## User Request
161
+
162
+ ${i}`}s.buildScheduledPrompt=o;})(Nu||(Nu={}));var zv="scheduler/history",Xf=100;function al(){return ke__default.join(a$1.Path.data,zv)}function Lu(t){let e=al(),n=t.replace(/[^a-zA-Z0-9_-]/g,"_");return ke__default.join(e,`${n}.json`)}async function Zr(t){try{return await access(t),!0}catch{return false}}async function Bv(){let t=al();await Zr(t)||await mkdir(t,{recursive:true});}var cl;(i=>{async function t(c){await Bv();let u=Lu(c.taskId),l=[];if(await Zr(u))try{let m=await readFile(u,"utf-8");l=JSON.parse(m);}catch{l=[];}l.unshift(c),l.length>Xf&&(l=l.slice(0,Xf)),await writeFile(u,JSON.stringify(l,null,2)),Qf.debug("Task history record added",{taskId:c.taskId,success:c.success});}i.add=t;async function e(c,u){let l=Lu(c);if(!await Zr(l))return [];try{let m=await readFile(l,"utf-8"),a=JSON.parse(m);return u?a.slice(0,u):a}catch{return []}}i.get=e;async function n(c){let u=Lu(c);await Zr(u)&&await unlink(u);}i.clear=n;async function o(c){let u=al(),l=0,f=c?Date.now()-c:Date.now()-720*60*60*1e3;if(!await Zr(u))return 0;let a=await readdir(u);for(let p of a){if(!p.endsWith(".json"))continue;let d=ke__default.join(u,p);try{let h=await readFile(d,"utf-8"),w=JSON.parse(h),g=w.filter(b=>b.endTime>f);g.length!==w.length&&(g.length===0?await unlink(d):await writeFile(d,JSON.stringify(g,null,2)),l+=w.length-g.length);}catch{}}return Qf.info("Task history pruned",{prunedCount:l}),l}i.prune=o;async function s(){let c=al(),u=0,l=0;if(!await Zr(c))return {totalTasks:0,totalRecords:0,successRate:0};let m=await readdir(c);for(let a of m){if(!a.endsWith(".json"))continue;let p=ke__default.join(c,a);try{let d=await readFile(p,"utf-8"),h=JSON.parse(d);u+=h.length,l+=h.filter(w=>w.success).length;}catch{}}return {totalTasks:m.filter(a=>a.endsWith(".json")).length,totalRecords:u,successRate:u>0?l/u:0}}i.getStats=s;async function r(c){return (await e(c,1))[0]}i.getLastResult=r;})(cl||(cl={}));function Hv(){let t=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return `hist_${t}_${e}`}async function Is(t,e,n,o){let s={id:Hv(),taskId:t,taskType:e,startTime:n,endTime:Date.now(),success:o.success,output:o.output,error:o.error};await cl.add(s);}var dt=a.create({service:"scheduler"});function Jo(t,e){let n=Xr(t);return n?sl(n,new Date(e??Date.now())).getTime():0}var vn;(te=>{let t;function e(){return t||(t=A.state(async()=>(await Ge.init(),{status:"stopped",timers:new Map,listeners:new Map,initialized:true}),async _=>{if(_){for(let D of _.timers.values())clearTimeout(D);_.timers.clear(),_.listeners.clear();}})),t}function n(){return e()()}te.state=n;async function o(){return (await n()).status}te.getStatus=o;async function s(){return (await n()).initialized}te.isInitialized=s;async function r(){let U=await n();if(U.status==="running"){dt.warn("Scheduler already running");return}dt.info("Starting scheduler"),U.status="running";let _=await Ge.getHeartbeats();for(let C of _)C.enabled&&P(U,C);let D=await Ge.getScheduled();for(let C of D)C.enabled&&T(U,C);let O=await Ge.getCommands();for(let C of O)C.enabled&&N(U,C);dt.info("Scheduler started",{heartbeats:_.length,scheduled:D.length,commands:O.length});}te.start=r;async function i(){let U=await n();if(U.status==="running"){dt.info("Stopping scheduler");for(let _ of U.timers.values())clearTimeout(_);U.timers.clear(),U.status="stopped",dt.info("Scheduler stopped");}}te.stop=i;function c(U,_){return n().then(D=>{D.listeners.has(U)||D.listeners.set(U,new Set),D.listeners.get(U).add(_);}),()=>{n().then(D=>{D.listeners.get(U)?.delete(_);});}}te.onTaskComplete=c;async function u(U){if(!xs(U.cron))throw new Error(`Invalid cron expression: ${U.cron}`);let D={id:U.id??Identifier.ascending("heartbeat"),name:U.name,cron:U.cron,type:"heartbeat",enabled:true,parts:U.parts,config:{session:U.session,mode:U.mode??"session",agentId:U.agentId,transport:U.transport,agentConfig:U.agentConfig},recurring:true,createdAt:Date.now(),updatedAt:Date.now(),nextFireAt:Jo(U.cron,Date.now())};await Ge.saveHeartbeat(D);let O=await n();return O.status==="running"&&D.enabled&&P(O,D),dt.info("Heartbeat task created",{id:D.id,name:D.name}),D}te.createHeartbeat=u;async function l(U){if(!xs(U.cron))throw new Error(`Invalid cron expression: ${U.cron}`);let _=U.id??Identifier.ascending("task"),D=Date.now(),O={id:_,name:U.name,cron:U.cron,type:"scheduled",enabled:true,parts:U.parts,agentType:U.agentType??"default",transport:U.transport??"stdio",agentConfig:U.agentConfig,recurring:U.recurring??true,durable:U.durable??true,createdAt:D,updatedAt:D,nextFireAt:Jo(U.cron,D)};await Ge.saveScheduled(O);let C=await n();return C.status==="running"&&O.enabled&&T(C,O),dt.info("Scheduled task created",{id:O.id,name:O.name}),O}te.createScheduled=l;async function f(U){if(!xs(U.cron))throw new Error(`Invalid cron expression: ${U.cron}`);let _=U.id??Identifier.ascending("command"),D=Date.now(),O={id:_,name:U.name,cron:U.cron,type:"command",enabled:true,config:{command:U.command,arguments:U.arguments,session:U.session,durable:U.durable},recurring:U.recurring??true,durable:U.durable??true,createdAt:D,updatedAt:D,nextFireAt:Jo(U.cron,D)};await Ge.saveCommand(O);let C=await n();return C.status==="running"&&O.enabled&&N(C,O),dt.info("Command task created",{id:O.id,name:O.name,command:O.config.command}),O}te.createCommand=f;async function m(){return Ge.getHeartbeats()}te.listHeartbeats=m;async function a(){return Ge.getScheduled()}te.listScheduled=a;async function p(){return Ge.getCommands()}te.listCommands=p;async function d(U){return Ge.getHeartbeat(U)}te.getHeartbeat=d;async function h(U){return Ge.getScheduledTask(U)}te.getScheduled=h;async function w(U){let _=await n();I(_,U),await Ge.deleteHeartbeat(U),dt.info("Heartbeat task deleted",{id:U});}te.deleteHeartbeat=w;async function g(U){let _=await n();I(_,U),await Ge.deleteScheduled(U),dt.info("Scheduled task deleted",{id:U});}te.deleteScheduled=g;async function b(U){let _=await Ge.getHeartbeat(U);if(!_)throw new Error(`Heartbeat task not found: ${U}`);await Ge.updateHeartbeat(U,{enabled:true});let D=await n();P(D,{..._,enabled:true}),dt.info("Heartbeat task enabled",{id:U});}te.enableHeartbeat=b;async function v(U){let _=await n();I(_,U),await Ge.updateHeartbeat(U,{enabled:false}),dt.info("Heartbeat task disabled",{id:U});}te.disableHeartbeat=v;async function k(U){let _=await Ge.getScheduledTask(U);if(!_)throw new Error(`Scheduled task not found: ${U}`);await Ge.updateScheduled(U,{enabled:true});let D=await n();T(D,{..._,enabled:true}),dt.info("Scheduled task enabled",{id:U});}te.enableScheduled=k;async function S(U){let _=await n();I(_,U),await Ge.updateScheduled(U,{enabled:false}),dt.info("Scheduled task disabled",{id:U});}te.disableScheduled=S;async function y(U){let _=await Ge.getHeartbeat(U);if(!_)throw new Error(`Heartbeat task not found: ${U}`);return M(_)}te.triggerHeartbeat=y;async function x(U){let _=await Ge.getScheduledTask(U);if(!_)throw new Error(`Scheduled task not found: ${U}`);return j(_)}te.triggerScheduled=x;function I(U,_){let D=U.timers.get(_);D&&(clearTimeout(D),U.timers.delete(_));}function P(U,_){I(U,_.id);let D=(_.nextFireAt??Jo(_.cron))-Date.now(),O=Math.max(0,D);dt.info("Scheduling heartbeat",{id:_.id,nextFireAt:_.nextFireAt,delay:O});let C=setTimeout(async()=>{try{let E=await M(_),R=U.listeners.get(_.id);if(R)for(let L of R)try{L(E);}catch(q){dt.error("Task listener error",{taskId:_.id,error:q});}if(_.enabled&&_.recurring){let L=Jo(_.cron);await Ge.updateHeartbeat(_.id,{lastFiredAt:Date.now(),nextFireAt:L});let q=await Ge.getHeartbeat(_.id);q&&P(U,{...q,nextFireAt:L});}}catch(E){dt.error("Heartbeat execution failed",{id:_.id,error:E});}},O);C.unref(),U.timers.set(_.id,C);}function T(U,_){I(U,_.id);let D=(_.nextFireAt??Jo(_.cron))-Date.now(),O=Math.max(0,D);dt.info("Scheduling task",{id:_.id,nextFireAt:_.nextFireAt,delay:O});let C=setTimeout(async()=>{try{let E=await j(_),R=U.listeners.get(_.id);if(R)for(let L of R)try{L(E);}catch(q){dt.error("Task listener error",{taskId:_.id,error:q});}if(_.enabled&&(_.recurring??!0)){let L=Jo(_.cron);await Ge.updateScheduled(_.id,{lastFiredAt:Date.now(),nextFireAt:L});let q=await Ge.getScheduledTask(_.id);q&&T(U,{...q,nextFireAt:L});}}catch(E){dt.error("Scheduled task execution failed",{id:_.id,error:E});}},O);C.unref(),U.timers.set(_.id,C);}async function M(U){let _=Date.now(),D={type:"heartbeat",parts:U.parts,system:U.config.agentConfig?.system,config:{session:U.config.session,mode:U.config.mode,agent:U.config.agentId,model:U.config.agentConfig?.model,tools:U.config.agentConfig?.tools}},O={sessionID:U.config.session,agent:U.config.agentId,model:U.config.agentConfig?.model},C={taskId:U.id,taskName:U.name,sessionID:U.config.session,mode:U.config.mode,definition:D,context:O};try{dt.info("Executing heartbeat",{id:U.id,mode:U.config.mode});let L=(await je.triggerEvent(HookEvent.HeartbeatTrigger,C,O)).output?.execution;if(!L)throw new Error(`No heartbeat hook handled event: ${HookEvent.HeartbeatTrigger}`);return await Is(U.id,"heartbeat",_,L),await je.triggerEvent(HookEvent.HeartbeatComplete,{taskId:U.id,taskName:U.name,success:L.success,output:L.output,error:L.error,duration:Date.now()-_},O),{taskId:U.id,success:L.success,output:L.output,error:L.error,executedAt:_,duration:Date.now()-_}}catch(E){dt.error("Heartbeat execution error",{id:U.id,error:E});let R={success:false,error:E instanceof Error?E.message:String(E)};return await Is(U.id,"heartbeat",_,R),await je.triggerEvent(HookEvent.HeartbeatComplete,{taskId:U.id,taskName:U.name,success:false,error:E instanceof Error?E.message:String(E),duration:Date.now()-_},O),{taskId:U.id,success:false,error:E instanceof Error?E.message:String(E),executedAt:_,duration:Date.now()-_}}}async function j(U){let _=Date.now(),D={type:"scheduler",parts:U.parts,system:U.agentConfig?.system,config:{agentType:U.agentType,transport:U.transport,model:U.agentConfig?.model,tools:U.agentConfig?.tools}},O={agent:U.agentType,model:U.agentConfig?.model},C={taskId:U.id,taskName:U.name,agentType:U.agentType,transport:U.transport,definition:D,context:O};try{dt.info("Executing scheduled task",{id:U.id,agentType:U.agentType});let L=(await je.triggerEvent(HookEvent.ScheduledTaskTrigger,C,O)).output?.execution;if(!L)throw new Error(`No scheduler hook handled event: ${HookEvent.ScheduledTaskTrigger}`);return await Is(U.id,"scheduled",_,L),await je.triggerEvent(HookEvent.ScheduledTaskComplete,{taskId:U.id,taskName:U.name,success:L.success,output:L.output,error:L.error,duration:Date.now()-_},O),{taskId:U.id,success:L.success,output:L.output,error:L.error,executedAt:_,duration:Date.now()-_}}catch(E){dt.error("Scheduled task execution error",{id:U.id,error:E});let R={success:false,error:E instanceof Error?E.message:String(E)};return await Is(U.id,"scheduled",_,R),await je.triggerEvent(HookEvent.ScheduledTaskComplete,{taskId:U.id,taskName:U.name,success:false,error:E instanceof Error?E.message:String(E),duration:Date.now()-_},O),{taskId:U.id,success:false,error:E instanceof Error?E.message:String(E),executedAt:_,duration:Date.now()-_}}}function N(U,_){I(U,_.id);let D=(_.nextFireAt??Jo(_.cron))-Date.now(),O=Math.max(0,D);dt.info("Scheduling command task",{id:_.id,nextFireAt:_.nextFireAt,delay:O});let C=setTimeout(async()=>{try{let E=await K(_),R=U.listeners.get(_.id);if(R)for(let L of R)try{L(E);}catch(q){dt.error("Task listener error",{taskId:_.id,error:q});}if(_.enabled&&(_.recurring??!0)){let L=Jo(_.cron);await Ge.updateCommand(_.id,{lastFiredAt:Date.now(),nextFireAt:L});let q=await Ge.getCommand(_.id);q&&N(U,{...q,nextFireAt:L});}}catch(E){dt.error("Command task execution failed",{id:_.id,error:E});}},O);C.unref(),U.timers.set(_.id,C);}async function K(U){let _=Date.now();dt.info("Executing command task",{id:U.id,command:U.config.command});try{let D=await qe.command({sessionID:U.config.session??"scheduler",command:U.config.command,arguments:U.config.arguments??""}),O={success:!D.error,output:D.output,error:D.error};return await Is(U.id,"command",_,O),{taskId:U.id,success:O.success,output:O.output,error:O.error,executedAt:_,duration:Date.now()-_}}catch(D){dt.error("Command task execution error",{id:U.id,error:D});let O={success:false,error:D instanceof Error?D.message:String(D)};return await Is(U.id,"command",_,O),{taskId:U.id,success:false,error:D instanceof Error?D.message:String(D),executedAt:_,duration:Date.now()-_}}}})(vn||(vn={}));function qv(t){let e={};if(typeof t=="string"){let n=t.trim().split(/\s+/);n.length>0&&(e.subcommand=n[0],e.name=n[1]);for(let o=2;o<n.length;o++){let s=n[o];s==="--cron"&&o+1<n.length?e.cron=n[++o]:s==="--type"&&o+1<n.length?e.type=n[++o]:s==="--session"&&o+1<n.length?e.session=n[++o]:s==="--mode"&&o+1<n.length?e.mode=n[++o]:s==="--prompt"&&o+1<n.length?e.prompt=n[++o]:s==="--agent-type"&&o+1<n.length?e.agentType=n[++o]:s==="--transport"&&o+1<n.length?e.transport=n[++o]:s==="--recurring"?e.recurring=true:s==="--durable"&&(e.durable=true);}}return e}function ng(t,e){let n=["Tasks:"];if(t.length>0){n.push(`
163
+ Heartbeats:`),n.push("ID | Name | Cron | Session | Mode | Enabled"),n.push("------------------|---------------|---------------|---------|---------|--------");for(let o of t)n.push(`${o.id.padEnd(17)}| ${o.name.padEnd(12)}| ${o.cron.padEnd(12)}| ${o.config.session.padEnd(7)}| ${o.config.mode.padEnd(7)}| ${o.enabled}`);}else n.push(`
164
+ Heartbeats: (none)`);if(e.length>0){n.push(`
165
+ Scheduled:`),n.push("ID | Name | Cron | Agent Type | Recurring | Durable"),n.push("------------------|---------------|---------------|------------|-----------|--------");for(let o of e)n.push(`${o.id.padEnd(17)}| ${o.name.padEnd(12)}| ${o.cron.padEnd(12)}| ${(o.agentType||"default").padEnd(11)}| ${(o.recurring?"yes":"no").padEnd(7)}| ${o.durable?"yes":"no"}`);}else n.push(`
166
+ Scheduled: (none)`);return n.join(`
167
+ `)}var Fu=f("loop",{description:"Create and manage scheduled tasks and heartbeats",source:"command",commandType:"local",subtask:false,hints:["{{ARGUMENTS}}"],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=qv(t);if(!n.subcommand)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:ei(),success:true,parts:[{type:"text",text:ei()}]};switch(n.subcommand){case "create":return Gv(n,e);case "list":return Wv(e);case "delete":return Vv(n,e);case "enable":return Kv(n,e);case "disable":return Jv(n,e);case "trigger":return Yv(n,e);case "help":return {title:"Loop Command Help",metadata:{sessionID:e.sessionID},output:ei(),success:true,parts:[{type:"text",text:ei()}]};default:return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Unknown subcommand: ${n.subcommand}
168
+
169
+ ${ei()}`,success:true,parts:[{type:"text",text:ei()}]}}},init:async()=>({})});async function Gv(t,e){if(!t.name)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Task name is required
170
+
171
+ Usage: /loop create <name> --cron <expression> [options]`,success:false,parts:[{type:"text",text:"Error: Task name is required"}]};if(!t.cron)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Cron expression is required
172
+
173
+ Usage: /loop create <name> --cron <expression> [options]`,success:false,parts:[{type:"text",text:"Error: Cron expression is required"}]};if(!xs(t.cron))return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Invalid cron expression: ${t.cron}`,success:false,parts:[{type:"text",text:`Error: Invalid cron expression: ${t.cron}`}]};if((t.type??"heartbeat")==="heartbeat"){if(!t.session)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Session is required for heartbeat tasks
174
+
175
+ Usage: /loop create <name> --cron <expression> --session <session-name> --type heartbeat`,success:false,parts:[{type:"text",text:"Error: Session is required for heartbeat tasks"}]};try{let o=await vn.createHeartbeat({name:t.name,cron:t.cron,session:t.session,mode:t.mode,agentId:t.agentType,transport:t.transport,parts:[{type:"text",text:t.prompt??`Heartbeat: ${t.name}`}]});return {title:"Heartbeat Created",metadata:{sessionID:e.sessionID},output:`Heartbeat task created successfully!
176
+
177
+ ID: ${o.id}
178
+ Name: ${o.name}
179
+ Cron: ${o.cron}
180
+ Session: ${o.config.session}
181
+ Mode: ${o.config.mode}
182
+ Next Fire: ${new Date(o.nextFireAt).toLocaleString()}`,success:!0,parts:[{type:"text",text:`Heartbeat task created: ${o.id}`}]}}catch(o){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error creating heartbeat: ${o instanceof Error?o.message:String(o)}`,success:false,parts:[{type:"text",text:`Error: ${o instanceof Error?o.message:String(o)}`}]}}}if(!t.prompt)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Prompt is required for scheduled tasks
183
+
184
+ Usage: /loop create <name> --cron <expression> --prompt <text> --type scheduled`,success:false,parts:[{type:"text",text:"Error: Prompt is required for scheduled tasks"}]};try{let o=await vn.createScheduled({name:t.name,cron:t.cron,parts:[{type:"text",text:t.prompt}],agentType:t.agentType??"default",transport:t.transport??"stdio",recurring:t.recurring??!0,durable:t.durable??!0});return {title:"Scheduled Task Created",metadata:{sessionID:e.sessionID},output:`Scheduled task created successfully!
185
+
186
+ ID: ${o.id}
187
+ Name: ${o.name}
188
+ Cron: ${o.cron}
189
+ Agent Type: ${o.agentType}
190
+ Recurring: ${o.recurring}
191
+ Next Fire: ${new Date(o.nextFireAt).toLocaleString()}`,success:!0,parts:[{type:"text",text:`Scheduled task created: ${o.id}`}]}}catch(o){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error creating scheduled task: ${o instanceof Error?o.message:String(o)}`,success:false,parts:[{type:"text",text:`Error: ${o instanceof Error?o.message:String(o)}`}]}}}async function Wv(t){try{let e=await vn.listHeartbeats(),n=await vn.listScheduled();return {title:"Task List",metadata:{sessionID:t.sessionID},output:ng(e,n),success:!0,parts:[{type:"text",text:ng(e,n)}]}}catch(e){return {title:"Loop Command",metadata:{sessionID:t.sessionID},output:`Error listing tasks: ${e instanceof Error?e.message:String(e)}`,success:false,parts:[{type:"text",text:`Error: ${e instanceof Error?e.message:String(e)}`}]}}}async function Vv(t,e){if(!t.name)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Task ID is required
192
+
193
+ Usage: /loop delete <id>`,success:false,parts:[{type:"text",text:"Error: Task ID is required"}]};try{return await vn.deleteHeartbeat(t.name).catch(()=>vn.deleteScheduled(t.name)),{title:"Task Deleted",metadata:{sessionID:e.sessionID},output:`Task deleted: ${t.name}`,success:!0,parts:[{type:"text",text:`Task deleted: ${t.name}`}]}}catch(n){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error deleting task: ${n instanceof Error?n.message:String(n)}`,success:false,parts:[{type:"text",text:`Error: ${n instanceof Error?n.message:String(n)}`}]}}}async function Kv(t,e){if(!t.name)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Task ID is required
194
+
195
+ Usage: /loop enable <id>`,success:false,parts:[{type:"text",text:"Error: Task ID is required"}]};try{return await vn.enableHeartbeat(t.name).catch(()=>vn.enableScheduled(t.name)),{title:"Task Enabled",metadata:{sessionID:e.sessionID},output:`Task enabled: ${t.name}`,success:!0,parts:[{type:"text",text:`Task enabled: ${t.name}`}]}}catch(n){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error enabling task: ${n instanceof Error?n.message:String(n)}`,success:false,parts:[{type:"text",text:`Error: ${n instanceof Error?n.message:String(n)}`}]}}}async function Jv(t,e){if(!t.name)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Task ID is required
196
+
197
+ Usage: /loop disable <id>`,success:false,parts:[{type:"text",text:"Error: Task ID is required"}]};try{return await vn.disableHeartbeat(t.name).catch(()=>vn.disableScheduled(t.name)),{title:"Task Disabled",metadata:{sessionID:e.sessionID},output:`Task disabled: ${t.name}`,success:!0,parts:[{type:"text",text:`Task disabled: ${t.name}`}]}}catch(n){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error disabling task: ${n instanceof Error?n.message:String(n)}`,success:false,parts:[{type:"text",text:`Error: ${n instanceof Error?n.message:String(n)}`}]}}}async function Yv(t,e){if(!t.name)return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error: Task ID is required
198
+
199
+ Usage: /loop trigger <id>`,success:false,parts:[{type:"text",text:"Error: Task ID is required"}]};try{let n=await vn.triggerHeartbeat(t.name).catch(()=>vn.triggerScheduled(t.name));return {title:"Task Triggered",metadata:{sessionID:e.sessionID},output:n.success?`Task triggered successfully!
200
+
201
+ Output: ${n.output||"(no output)"}`:`Task failed: ${n.error}`,success:n.success,parts:[{type:"text",text:n.success?`Task executed: ${n.output||"(no output)"}`:`Task failed: ${n.error}`}]}}catch(n){return {title:"Loop Command",metadata:{sessionID:e.sessionID},output:`Error triggering task: ${n instanceof Error?n.message:String(n)}`,success:false,parts:[{type:"text",text:`Error: ${n instanceof Error?n.message:String(n)}`}]}}}function ei(){return `Loop Command - Create and manage scheduled tasks and heartbeats
202
+
203
+ Usage:
204
+ /loop <subcommand> [options]
205
+
206
+ Subcommands:
207
+ create <name> --cron <expression> [options]
208
+ Create a scheduled task or heartbeat
209
+
210
+ list
211
+ List all tasks
212
+
213
+ delete <id>
214
+ Delete a task
215
+
216
+ enable <id>
217
+ Enable a task
218
+
219
+ disable <id>
220
+ Disable a task
221
+
222
+ trigger <id>
223
+ Manually trigger a task
224
+
225
+ help
226
+ Show this help message
227
+
228
+ Options:
229
+ --cron <expr> Cron expression (required)
230
+ --type <type> Task type: heartbeat (default) | scheduled
231
+ --session <name> Session name (heartbeat required)
232
+ --mode <mode> Mode: session (default) | fork
233
+ --prompt <text> Prompt (scheduled required)
234
+ --agent-type <type> Agent type (default: default)
235
+ --transport <type> Transport: stdio (default) | http | websocket | cli
236
+ --recurring Recurring execution
237
+ --durable Persistent storage
238
+
239
+ Cron Expression Format:
240
+ \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 minute (0-59)
241
+ \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 hour (0-23)
242
+ \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 day (1-31)
243
+ \u2502 \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 month (1-12)
244
+ \u2502 \u2502 \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 weekday (0-6, 0=Sun)
245
+ \u2502 \u2502 \u2502 \u2502 \u2502
246
+ * * * * *
247
+
248
+ Examples:
249
+ /loop create main-heartbeat --cron "*/5 * * * *" --session main --type heartbeat
250
+ /loop create hourly-sync --cron "0 * * * *" --prompt "Sync data" --type scheduled
251
+ /loop list
252
+ /loop delete hb_xxx
253
+ /loop enable st_xxx
254
+ /loop trigger hb_xxx
255
+ `}var Uu=f("cleanup",{description:"Internal cleanup command for truncating old files",source:"command",commandType:"local",subtask:false,hidden:true,hints:[],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=[],o=[];if(typeof t=="string"&&t.includes("truncation"))try{await Ke.cleanup(),n.push("Truncation cleanup completed");}catch(r){o.push(`Truncation cleanup failed: ${r instanceof Error?r.message:String(r)}`);}if(typeof t=="string"&&t.includes("snapshot"))try{await xt.cleanup(),n.push("Snapshot cleanup completed");}catch(r){o.push(`Snapshot cleanup failed: ${r instanceof Error?r.message:String(r)}`);}if(typeof t=="string"&&t.includes("all")){try{await Ke.cleanup(),n.push("Truncation cleanup completed");}catch(r){o.push(`Truncation cleanup failed: ${r instanceof Error?r.message:String(r)}`);}try{await xt.cleanup(),n.push("Snapshot cleanup completed");}catch(r){o.push(`Snapshot cleanup failed: ${r instanceof Error?r.message:String(r)}`);}}if(typeof t=="object"&&t!==null){let r=t;if(r.type==="truncation"||r.target==="truncation")try{await Ke.cleanup(),n.push("Truncation cleanup completed");}catch(i){o.push(`Truncation cleanup failed: ${i instanceof Error?i.message:String(i)}`);}if(r.type==="snapshot"||r.target==="snapshot")try{await xt.cleanup(),n.push("Snapshot cleanup completed");}catch(i){o.push(`Snapshot cleanup failed: ${i instanceof Error?i.message:String(i)}`);}if(!r.type&&!r.target){try{await Ke.cleanup(),n.push("Truncation cleanup completed");}catch(i){o.push(`Truncation cleanup failed: ${i instanceof Error?i.message:String(i)}`);}try{await xt.cleanup(),n.push("Snapshot cleanup completed");}catch(i){o.push(`Snapshot cleanup failed: ${i instanceof Error?i.message:String(i)}`);}}}let s=[...n,...o].join(`
256
+ `);return {title:"Cleanup Command",metadata:{sessionID:e.sessionID,success:o.length===0,cleaned:n.length,errors:o.length},output:s,success:o.length===0,parts:[{type:"text",text:s}]}},init:async()=>({})});async function Qv(t){let e,n;switch(t){case "note":e=await on.isEnabled(),n=()=>on.sync();break;case "codebase":e=await Go.isEnabled(),n=()=>Go.sync();break;case "memory":e=await Dn.isEnabled(),n=()=>Dn.sync();break}return e?(n().catch(o=>{console.error(`${t} sync failed:`,o);}),{target:t,started:true,message:`${t} sync started`}):{target:t,started:false,message:`${t} not enabled`}}function Xv(t){return typeof t!="string"?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>["note","codebase","memory"].includes(e))}var zu=f("sync",{description:"Sync knowledge bases (note, codebase, memory)",source:"command",commandType:"local",subtask:false,hidden:false,hints:[],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=Xv(t),o=n.length>0?n:["note","codebase","memory"],s=await Promise.all(o.map(l=>Qv(l))),r=s.filter(l=>l.started),i=s.filter(l=>!l.started),c=[];r.length>0&&c.push(`\u2713 Started: ${r.map(l=>l.target).join(", ")}`),i.length>0&&c.push(`\u2298 Skipped: ${i.map(l=>l.target).join(", ")}`);let u=c.join(`
257
+ `);return {title:"Knowledge Base Sync",metadata:{sessionID:e.sessionID,success:i.length===0,started:r.length,skipped:i.length},output:u,success:i.length===0,parts:[{type:"text",text:u}]}},init:async()=>({})});var iS=["BOOT.md","IDENTITY.md","SOUL.md","USER.md","AGENTS.md","TOOLS.md","CONTEXT.md","CODER.md"];function og(){let t=new Date,e=t.getFullYear(),n=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0");return `${e}-${n}-${o}`}async function sg(t){try{return await access(t,constants.F_OK),!0}catch{return false}}async function aS(t,e,n){let o={backedUpFiles:[],cleanedOldBackups:0},s=og(),r=join(e,s);await mkdir(r,{recursive:true});for(let i of iS){let c=join(t,i),u=join(r,i);await sg(c)&&(await copyFile(c,u),o.backedUpFiles.push(i));}if(n>0){let i=new Date;i.setDate(i.getDate()-n);try{let c=await readdir(e);for(let u of c){if(u===s)continue;let l=join(e,u),f=await stat(l);f.isDirectory()&&f.mtime<i&&(await rm(l,{recursive:!0,force:!0}),o.cleanedOldBackups++);}}catch{}}return o}var Bu=f("backup",{description:"Backup agent configuration files to Global.Path.data/backup/yyyy-mm-dd/",source:"command",commandType:"local",subtask:false,hidden:true,hints:[],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let n=[],o=[],s=".easbot",r=30;if(typeof t=="string"){let c=t.split(" ");for(let u of c)if(u.startsWith("config-path=")){let l=u.split("=")[1];l&&(s=l);}else if(u.startsWith("retention-days=")){let l=u.split("=")[1];l&&(r=parseInt(l,10)||30);}}else if(typeof t=="object"&&t!==null){let c=t;s=c.configPath||s,r=c.retentionDays||r;}try{await a$1.init();let c=join(a$1.Path.data,"backup");if(!await sg(s))n.push(`Config directory not found: ${s}`);else {let l=await aS(s,c,r);n.push(`Backup completed to: ${join(c,og())}`),n.push(`Backed up files: ${l.backedUpFiles.length}`),l.backedUpFiles.length>0&&n.push(`Files: ${l.backedUpFiles.join(", ")}`),l.cleanedOldBackups>0&&n.push(`Cleaned old backups: ${l.cleanedOldBackups}`);}}catch(c){o.push(`Backup failed: ${c instanceof Error?c.message:String(c)}`);}let i=[...n,...o].join(`
258
+ `);return {title:"Backup Command",metadata:{sessionID:e.sessionID,success:o.length===0,backedUpFiles:n.filter(c=>c.includes("Backed up files:")).length,errors:o.length},output:i,success:o.length===0,parts:[{type:"text",text:i}]}},init:async()=>({})});var rg=a.create({service:"command-abort"});function Hu(t,e,n,o={}){let s={title:"Abort",metadata:{sessionID:t,...o},output:n,parts:[{type:"text",text:n}],success:e};return e?s:{...s,error:n}}var qu=f("abort",{description:"Abort the currently running agent task",source:"command",commandType:"local",subtask:false,hidden:false,hints:[],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let{sessionID:n}=e;rg.debug("Abort command executed",{sessionID:n});try{return (await Ut.get(n))?.type!=="busy"?Hu(n,!0,"\u2298 No active task to abort",{aborted:!1,reason:"no_active_task"}):(await un.abortSession(n),Hu(n,!0,`\u2713 Abort signal sent
259
+
260
+ The agent will stop after completing its current action.`,{aborted:!0}))}catch(o){let s=o instanceof Error?o.message:String(o);return rg.error("Failed to abort session",{sessionID:n,error:s}),Hu(n,false,`\u2298 Failed to abort: ${s}`,{error:s})}},init:async()=>({})});var un={};a$7(un,{abort:()=>xS,abortSession:()=>dg,create:()=>bS,createSession:()=>cg,deleteSession:()=>cS,fork:()=>wS,forkSession:()=>lg,formatSessionJSON:()=>gS,formatSessionTable:()=>fS,get:()=>yS,getSession:()=>ag,getSessionChildren:()=>dS,getSessionContextMode:()=>pS,getSessionStatus:()=>vS,initSession:()=>uS,list:()=>hS,listSessionStatuses:()=>SS,listSessions:()=>ig,setSessionContextMode:()=>mS,summarize:()=>IS,summarizeSession:()=>ll,updateSession:()=>lS});async function ig(t){let e=[];for await(let o of ee.list())!o.parentID&&(!t?.directory||o.directory===t.directory)&&e.push(o);e.sort((o,s)=>s.time.updated-o.time.updated);let n=t?.limit;return !n||n<=0?e:e.slice(0,n)}async function ag(t){return ee.get(t)}async function cg(t){return ee.create(t)}async function lg(t,e){return ee.fork({sessionID:t,messageID:e})}async function cS(t){await ee.remove(t);}async function dg(t){let{SessionPrompt:e}=await import('./prompt-W7772MHB.mjs');await e.cancel(t);}async function ll(t){let[{SessionPrompt:e},{Compaction:n},{SessionRevert:o}]=await Promise.all([import('./prompt-W7772MHB.mjs'),import('./compaction-LQXOGRP7.mjs'),import('./revert-TZSK52JS.mjs')]),s=t.sessionId,r=await ee.get(s);if(!r)throw new Error("session not found");await o.cleanup(r);let i;return t.providerID&&t.modelID&&(i={providerID:t.providerID,modelID:t.modelID}),await n.create({sessionID:s,model:i,agent:t.agent??"compaction",auto:t.auto??false}),await e.loop({sessionID:s}),true}async function lS(t,e){let n=await ee.get(t);if(!n)throw new Error("session not found");e.title&&(n.title=e.title),e.time?.archived&&(n.time.archived=e.time.archived);let{Storage:o}=await import('./storage-DKQ7S6QX.mjs'),{Instance:s}=await import('./instance-YUOFE3Q3.mjs');return await o.write(["session",s.project.id,t],n),n}async function dS(t){return ee.children(t)}async function uS(t){return true}async function pS(t){return ee.getContextMode(t)}async function mS(t,e){await ee.setContextMode(t,e);}function fS(t,e=20,n=25){let o=[],s=Math.max(e,...t.map(c=>c.id.length)),r=Math.max(n,...t.map(c=>c.title.length)),i=`Session ID${" ".repeat(s-10)} Title${" ".repeat(r-5)} Updated`;o.push(i),o.push("\u2500".repeat(i.length));for(let c of t){let u=c.title.length>r?c.title.slice(0,r-3)+"...":c.title,l=new Date(c.time.updated).toLocaleString(),f=`${c.id.padEnd(s)} ${u.padEnd(r)} ${l}`;o.push(f);}return o.join(`
261
+ `)}function gS(t){let e=t.map(n=>({id:n.id,title:n.title,updated:n.time.updated,created:n.time.created,projectId:n.projectID,directory:n.directory}));return JSON.stringify(e,null,2)}var hS=ig,yS=ag,bS=cg,wS=lg,xS=dg,IS=ll;async function vS(t){return Ut.get(t)}async function SS(){return Ut.list()}var ug=a.create({service:"command-compact"});function pg(t,e,n,o={}){let s={title:"Compact",metadata:{sessionID:t,...o},output:n,parts:[{type:"text",text:n}],success:e};return e?s:{...s,error:n}}var Gu=f("compact",{description:"Compact context by summarizing old messages",source:"command",commandType:"local",agent:"compaction",subtask:false,hidden:false,hints:[],isEnabled:()=>Promise.resolve(true),execute:async(t,e)=>{let{sessionID:n}=e;ug.debug("Compact command executed",{sessionID:n});try{return await ll({sessionId:n,agent:"compaction"}),pg(n,!0,`\u2713 Context compaction started
262
+
263
+ Summarization is running in the background.`)}catch(o){let s=o instanceof Error?o.message:String(o);return ug.error("Failed to start compact",{sessionID:n,error:s}),pg(n,false,`\u2298 Failed to start compaction: ${s}`,{error:s})}},init:async()=>({})});var mg=[Du,Au,Ru,_u,Mu,Ou,Fu,Uu,zu,Bu,qu,Gu];var hg=a.create({service:"command.registry"}),gn;(b=>{b.Info=z$1.object({name:z$1.string(),description:z$1.string().optional(),agent:z$1.string().optional(),model:z$1.string().optional(),source:z$1.enum(["command","mcp","skill"]).optional(),subtask:z$1.boolean().optional(),hints:z$1.array(z$1.string()).optional(),commandType:z$1.enum(["prompt","local"]).optional(),isHidden:z$1.boolean().optional(),isEnabled:z$1.any().optional(),execute:z$1.any()}).meta({ref:"Command"}),b.Default={INIT:"init",REVIEW:"review",BTW:"btw"},b.Event={Executed:a$5.define("command.executed",z$1.object({name:z$1.string(),sessionID:Identifier.schema("session"),arguments:z$1.union([z$1.string(),z$1.record(z$1.string(),z$1.unknown())]),messageID:Identifier.schema("message")}))},b.define=f;let s,r;async function i(v){let k={};return v.init&&await v.init(k),{name:v.name,description:v.description,agent:v.agent,model:v.model,source:v.source,subtask:v.subtask,hints:v.hints,commandType:v.commandType,isEnabled:v.isEnabled,scope:v.scope??"all",execute:v.execute}}async function c(v){let{glob:k}=await import('glob'),S={};if(!await Filesystem.isDir(v))return S;let y=await k("*.md",{cwd:v,absolute:true,nodir:true,follow:false,dot:false});for(let x of y)try{let{ConfigMarkdown:I}=await import('./markdown-Z6UXVBNP.mjs'),P=await I.parse(x),{CommandMetadataSchema:T}=await import('@easbot/plugin'),M=T.parse(P.data),j=c$3(M,P.content,"command");S[j.name]=j;}catch(I){hg.error("Failed to load command file",{file:x,error:I});}return S}function u(){return s||(s=A.state(async()=>{let v=await he.get(),k={};for(let S of mg){let y=await i(S);k[S.name]=y;}for(let[S,y]of Object.entries(v.command??{})){let x=typeof y.template=="string"?y.template:"";k[S]={name:S,agent:y.agent,model:y.model,scope:y.scope??"all",description:y.description,source:"command",subtask:y.subtask,hints:/\{\{ARGUMENTS\}\}/i.test(x)?["{{ARGUMENTS}}"]:[],commandType:"prompt",isEnabled:()=>true,execute:async(I,P)=>{let{replaceTemplateVars:T}=await import('./command-H77IO5J2.mjs'),M=T(x,I);return {title:S,metadata:{sessionID:P.sessionID},output:M,success:true,parts:[{type:"text",text:M}]}}};}for(let[S,y]of Object.entries(await ze.prompts()))k[S]={name:S,source:"mcp",scope:y.scope??"all",description:y.description,commandType:"prompt",hints:y.arguments?.map((x,I)=>`$${I+1}`)??[],isEnabled:()=>true,execute:async x=>{if(typeof x=="string"){let M=(x.match(/(?:\[Image\s+\d+\]|"[^"]*"|'[^']*'|[^\s"']+)/gi)??[]).map(te=>te.replace(/^["']|["']$/g,"")),j=y.arguments?Object.fromEntries(y.arguments.map((te,U)=>[te.name,M[U]??""])):{},K=(await ze.getPrompt(y.client,y.name,j))?.messages.map(te=>te.content.type==="text"?te.content.text:"").join(`
264
+ `)||"";return {title:S,metadata:{},output:K,success:true,parts:[{type:"text",text:K}]}}let P=(await ze.getPrompt(y.client,y.name,x))?.messages.map(T=>T.content.type==="text"?T.content.text:"").join(`
265
+ `)||"";return {title:S,metadata:{},output:P,success:true,parts:[{type:"text",text:P}]}}};for(let S of await rn.all())k[S.name]={name:S.name,description:S.description,source:"skill",commandType:"prompt",hints:[],scope:S.scope??"all",isEnabled:()=>true,execute:async(y,x)=>({title:S.name,metadata:{sessionID:x.sessionID},output:S.content,success:true,parts:[{type:"text",text:S.content}]})};if(r)for(let[S,y]of Object.entries(r))k[S]=y;for await(let S of Filesystem.up({targets:[".easbot/commands"],start:A.directory,stop:A.worktree})){let y=await c(S);for(let[x,I]of Object.entries(y))k[x]||(k[x]=I);}return k})),s}async function l(){return u()()}b.state=l;async function f$1(){return l()}b.all=f$1;async function m(v){return l().then(k=>k[v])}b.get=m;async function a(v){let k=await l(),S=v??"general",y=[];for(let x of Object.values(k)){let I=x.scope??"all";I!=="all"&&I!==S||x.isEnabled&&!await x.isEnabled()||y.push(x);}return y}b.list=a;async function p(v,k){r||(r=await l()),r[v]=k,h();}b.register=p;async function d(v){return r?.[v]?(delete r[v],h(),true):false}b.unregister=d;function h(){s=void 0;}async function w(){r=void 0,h(),await l();}b.refresh=w;async function g(){await l(),hg.debug("command registry initialized");}b.init=g;})(gn||(gn={}));var Wu=gn;var yg=a.create({service:"vcs"}),Vs;(u=>{u.Event={BranchUpdated:a$5.define("vcs.branch.updated",z$1.object({branch:z$1.string().optional()}))},u.Info=z$1.object({branch:z$1.string()}).meta({ref:"VcsInfo"});async function n(){return $`git rev-parse --abbrev-ref HEAD`.quiet().nothrow().cwd(A.worktree).text().then(l=>l.trim()).catch(()=>{})}let o;function s(){return o||(o=A.state(async()=>{if(A.project.vcs!=="git")return {branch:async()=>{},unsubscribe:void 0};let l=await n();yg.info("initialized",{branch:l});let f=ue.subscribe(to.Event.Updated,async m=>{if(m.properties.file.endsWith("HEAD"))return;let a=await n();a!==l&&(yg.info("branch changed",{from:l,to:a}),l=a,await ue.publish(u.Event.BranchUpdated,{branch:a}));});return {branch:async()=>l,unsubscribe:f}},async l=>{l.unsubscribe?.();})),o}function r(){return s()()}async function i(){return r()}u.init=i;async function c(){return await r().then(l=>l.branch())}u.branch=c;})(Vs||(Vs={}));var ul;(f=>{let t=a.create({service:"share-next"});async function e(){return he.get().then(m=>m.enterprise?.url??"https://api.easbot.cn")}f.url=e;let n=process.env.EASBOT_DISABLE_SHARE==="true"||process.env.EASBOT_DISABLE_SHARE==="1";async function o(){n||(ue.subscribe(ee.Event.Updated,async m=>{await c(m.properties.info.id,[{type:"session",data:m.properties.info}]);}),ue.subscribe(ve.Event.Updated,async m=>{await c(m.properties.info.sessionID,[{type:"message",data:m.properties.info}]),m.properties.info.role==="user"&&await c(m.properties.info.sessionID,[{type:"model",data:[await Ce.getModel(m.properties.info.model.providerID,m.properties.info.model.modelID).then(a=>a)]}]);}),ue.subscribe(ve.Event.PartUpdated,async m=>{await c(m.properties.part.sessionID,[{type:"part",data:m.properties.part}]);}),ue.subscribe(ee.Event.Diff,async m=>{await c(m.properties.sessionID,[{type:"session_diff",data:m.properties.diff}]);}));}f.init=o;async function s(m){if(n)return {id:"",url:"",secret:""};t.info("creating share",{sessionID:m});let p=(await Fetch.post(`${await e()}/api/share`,{sessionID:m})).data;return await a$6.write(["session_share",m],p),await l(m),p}f.create=s;function r(m){return a$6.read(["session_share",m])}let i=new Map;async function c(m,a){if(n)return;let p=i.get(m);if(p){for(let w of a)p.data.set("id"in w?w.id:ulid(),w);return}let d=new Map;for(let w of a)d.set("id"in w?w.id:ulid(),w);let h=setTimeout(async()=>{let w=i.get(m);if(!w)return;i.delete(m);let g=await r(m).catch(()=>{});g&&await Fetch.post(`${await e()}/api/share/${g.id}/sync`,{secret:g.secret,data:Array.from(w.data.values())});},1e3);i.set(m,{timeout:h,data:d});}async function u(m){if(n)return;t.info("removing share",{sessionID:m});let a=await r(m);a&&(await Fetch.del(`${await e()}/api/share/${a.id}`,{secret:a.secret}),await a$6.remove(["session_share",m]));}f.remove=u;async function l(m){t.info("full sync",{sessionID:m});let a=await ee.get(m),p=await ee.diff(m),d=await Array.fromAsync(ve.stream(m)),h=await Promise.all(d.filter(w=>w.info.role==="user").map(w=>w.info.model).map(w=>Ce.getModel(w.providerID,w.modelID).then(g=>g)));await c(m,[{type:"session",data:a},...d.map(w=>({type:"message",data:w.info})),...d.flatMap(w=>w.parts.map(g=>({type:"part",data:g}))),{type:"session_diff",data:p},{type:"model",data:h}]);}})(ul||(ul={}));var kS=a$5.define("command.executed",z$1.object({name:z$1.string(),sessionID:z$1.string(),arguments:z$1.union([z$1.string(),z$1.record(z$1.string(),z$1.unknown())]),messageID:z$1.string().optional()})),wg=false;async function Ks(){if(wg){a.Default.debug("InstanceBootstrap already executed, skipping");return}wg=true,a.Default.info("bootstrapping",{directory:A.directory}),await Ss.init(),await ul.init(),Us.init(),await Ve.init(),to.init(),It.init(),await Vs.init(),await xt.init(),await Ke.init(),ue.subscribe(kS,async t=>{t.properties.name===Wu.Default.INIT&&await Kt.setInitialized(A.project.id);});}z.object({agentId:z.string(),agentType:z.string(),directory:z.string(),timestamp:z.number()});z.object({agentId:z.string(),reason:z.enum(["normal","error","timeout"]),timestamp:z.number()});z.object({sessionId:z.string(),messageType:z.enum(["text","tool_call","tool_result"]),content:z.any(),timestamp:z.number()});z.object({agentId:z.string(),error:z.string(),context:z.record(z.string(),z.any()).optional(),timestamp:z.number()});z.object({agentId:z.string(),status:z.enum(["idle","busy","error"]),timestamp:z.number()});var Rn=a.create({service:"local-event-bus"}),ca=class{constructor(){b$1(this,"subscriptions",new Map);b$1(this,"wildcardSubscriptions",new Set);b$1(this,"destroyed",false);}subscribe(e,n){if(this.destroyed)return Rn.warn("Cannot subscribe to destroyed LocalEventBus"),()=>{};let o=this.subscriptions.get(e)??new Set;return o.add(n),this.subscriptions.set(e,o),Rn.debug("Subscribed to event",{eventType:e}),()=>{o.delete(n),o.size===0&&this.subscriptions.delete(e),Rn.debug("Unsubscribed from event",{eventType:e});}}subscribeAll(e){return this.destroyed?(Rn.warn("Cannot subscribe to destroyed LocalEventBus"),()=>{}):(this.wildcardSubscriptions.add(e),Rn.debug("Subscribed to all events"),()=>{this.wildcardSubscriptions.delete(e),Rn.debug("Unsubscribed from all events");})}async publish(e){if(this.destroyed){Rn.warn("Cannot publish to destroyed LocalEventBus",{type:e.type});return}Rn.debug("Publishing event",{type:e.type});let n=[],o=this.subscriptions.get(e.type);if(o&&n.push(...o),n.push(...this.wildcardSubscriptions),n.length===0){Rn.debug("No subscribers for event",{type:e.type});return}let s=await Promise.allSettled(n.map(async c=>{try{await c(e);}catch(u){throw Rn.error("Event callback error",{type:e.type,error:u instanceof Error?u.message:String(u)}),u}})),r=s.filter(c=>c.status==="fulfilled").length,i=s.filter(c=>c.status==="rejected").length;i>0?Rn.warn("Event callbacks completed with errors",{type:e.type,fulfilled:r,rejected:i}):Rn.debug("Event callbacks completed",{type:e.type,count:r});}publishSync(e){if(this.destroyed)return;let n=[],o=this.subscriptions.get(e.type);o&&n.push(...o),n.push(...this.wildcardSubscriptions);for(let s of n)Promise.resolve().then(()=>s(e)).catch(r=>{Rn.error("Event callback error (sync)",{type:e.type,error:r instanceof Error?r.message:String(r)});});}subscriberCount(e){return e?this.subscriptions.get(e)?.size??0:this.wildcardSubscriptions.size}totalSubscribers(){let e=this.wildcardSubscriptions.size;for(let n of this.subscriptions.values())e+=n.size;return e}hasSubscribers(e){return e?(this.subscriptions.get(e)?.size??0)>0||this.wildcardSubscriptions.size>0:this.totalSubscribers()>0}clear(){this.subscriptions.clear(),this.wildcardSubscriptions.clear(),Rn.debug("All subscriptions cleared");}destroy(){this.clear(),this.destroyed=true,Rn.info("LocalEventBus destroyed");}isDestroyed(){return this.destroyed}};var no;(s=>{s.Info=z$1.object({content:z$1.string().describe("Brief description of the task"),status:z$1.string().describe("Current status of the task: pending, in_progress, completed, cancelled"),priority:z$1.string().describe("Priority level of the task: high, medium, low"),id:z$1.string().describe("Unique identifier for the todo item")}).meta({ref:"Todo"}),s.Event={Updated:a$5.define("todo.updated",z$1.object({sessionID:z$1.string(),todos:z$1.array(s.Info)}))};async function n(r){await a$6.write(["todo",r.sessionID],r.todos),await ue.publish(s.Event.Updated,r);}s.update=n;async function o(r){return a$6.read(["todo",r]).then(i=>i||[]).catch(()=>[])}s.get=o;})(no||(no={}));z.object({agentId:z.string(),agentType:z.string(),directory:z.string(),timestamp:z.number()});z.object({agentId:z.string(),reason:z.enum(["normal","error","timeout"]),timestamp:z.number()});z.object({agentId:z.string(),status:z.enum(["idle","busy","error"]),timestamp:z.number()});z.object({agentId:z.string(),error:z.string(),context:z.record(z.string(),z.any()).optional(),timestamp:z.number()});z.object({sessionId:z.string(),update:z.record(z.string(),z.any()),timestamp:z.number()});z.object({requestId:z.string(),sessionId:z.string(),permission:z.string(),tool:z.object({callID:z.string().optional()}).optional(),metadata:z.record(z.string(),z.any()).optional(),timestamp:z.number()});z.object({sessionId:z.string(),timestamp:z.number()});z.object({sessionId:z.string(),inputTokens:z.number(),outputTokens:z.number(),totalTokens:z.number(),model:z.string(),timestamp:z.number()});z.object({sessionId:z.string(),messageId:z.string(),messageType:z.enum(["text","tool_call","tool_result","system"]),content:z.any(),timestamp:z.number()});z.object({sessionId:z.string(),messageId:z.string(),messageType:z.enum(["text","tool_call","tool_result","system"]),response:z.any(),duration:z.number(),timestamp:z.number()});z.object({sessionId:z.string(),messageId:z.string(),toolName:z.string(),input:z.record(z.string(),z.any()),output:z.any().optional(),status:z.enum(["started","completed","failed"]),error:z.string().optional(),duration:z.number().optional(),timestamp:z.number()});z.object({sessionId:z.string().optional(),errorType:z.enum(["connection","timeout","validation","runtime","unknown"]),code:z.string().optional(),message:z.string(),stack:z.string().optional(),context:z.record(z.string(),z.any()).optional(),timestamp:z.number()});z.object({sessionId:z.string(),previousState:z.enum(["idle","active","paused","terminated"]),newState:z.enum(["idle","active","paused","terminated"]),reason:z.string().optional(),timestamp:z.number()});var _n=a.create({service:"sdk-event-bridge"}),la=class{constructor(e,n,o){b$1(this,"sdk");b$1(this,"localEventBus");b$1(this,"abortController",null);b$1(this,"started",false);b$1(this,"acceptSession");this.sdk=e,this.localEventBus=n,this.acceptSession=o;}async pushEvent(e,n){this.acceptSession&&!this.acceptSession(e)||await this.localEventBus?.publish({type:"sdk.session_update",properties:{sessionId:e,update:n,timestamp:Date.now()}});}async start(){if(this.started){_n.warn("SdkEventBridge already started");return}this.started=true,this.abortController=new AbortController,_n.info("Starting SDK event bridge"),this.runEventLoop().catch(e=>{this.abortController?.signal.aborted||(_n.error("Event loop failed",{error:e instanceof Error?e.message:String(e)}),this.localEventBus?.publish({type:"agent.error",properties:{agentId:"sdk-event-bridge",error:e instanceof Error?e.message:String(e),context:{source:"event_loop"},timestamp:Date.now()}}));});}async stop(){this.started&&(_n.info("Stopping SDK event bridge"),this.started=false,this.abortController?.abort(),this.abortController=null,_n.info("SDK event bridge stopped"));}isStarted(){return this.started}async runEventLoop(){for(;;){if(this.abortController?.signal.aborted){_n.debug("Event loop aborted");return}try{let e=this.abortController?.signal;if(!e)return;let n=await this.sdk.global.event({signal:e});for await(let o of n.stream){if(this.abortController?.signal.aborted)return;let s=o?.payload;s&&await this.handleEvent(s).catch(r=>{_n.error("Failed to handle event",{error:r instanceof Error?r.message:String(r),type:s.type});});}}catch(e){if(this.abortController?.signal.aborted)return;_n.error("Event stream error, reconnecting...",{error:e instanceof Error?e.message:String(e)}),await new Promise(n=>setTimeout(n,1e3));}}}async handleEvent(e){switch(_n.debug("Handling event",{type:e.type}),e.type){case "permission.asked":await this.handlePermissionAsked(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;default:_n.debug("Unknown event type, ignoring",{type:e.type});}}async handleSessionDeleted(e){let{sessionID:n}=e;this.acceptSession&&!this.acceptSession(n)||(_n.info("Publishing session deleted event to LocalEventBus",{sessionID:n}),await this.localEventBus?.publish({type:"sdk.session_deleted",properties:{sessionId:n,timestamp:Date.now()}}));}async handlePermissionAsked(e){let{id:n,sessionID:o,permission:s,tool:r,metadata:i}=e;this.acceptSession&&!this.acceptSession(o)||(_n.info("Publishing permission request to LocalEventBus",{id:n,sessionID:o,permission:s}),await this.localEventBus?.publish({type:"sdk.permission_request",properties:{requestId:n,sessionId:o,permission:s,tool:r,metadata:i,timestamp:Date.now()}}));}async handleMessagePartUpdated(e){let{part:n,delta:o}=e;if(this.acceptSession&&!this.acceptSession(n.sessionID))return;_n.debug("Handling message part update",{type:n.type,sessionID:n.sessionID,messageID:n.messageID});let s=await this.sdk.session.message({sessionID:n.sessionID,messageID:n.messageID},{throwOnError:true}).then(r=>r.data).catch(r=>{_n.error("unexpected error when fetching message",{error:r});});!s||s.info.role!=="assistant"||(n.type==="tool"?await this.handleToolPart(n):n.type==="text"?await this.handleTextPart(n,o):n.type==="reasoning"?await this.handleReasoningPart(n,o):n.type==="step-start"?await this.handleStepStartPart(n):n.type==="step-finish"&&await this.handleStepFinishPart(n));}async handleToolPart(e){let{sessionID:n,callID:o,tool:s,state:r}=e,i=ES(s);switch(r.status){case "pending":{let c={sessionUpdate:"tool_call",toolCallId:o,title:s,kind:i,status:"pending",locations:[],rawInput:{}};await this.pushEvent(n,c);break}case "running":{let c={sessionUpdate:"tool_call_update",toolCallId:o,status:"in_progress",kind:i,title:s,locations:TS(s,r.input),rawInput:r.input};await this.pushEvent(n,c);break}case "completed":{let c=[{type:"content",content:{type:"text",text:r.output}}];if(i==="edit"){let l=r.input,f=l.filePath??"",m=l.oldString??"",a=l.newString??l.content??"";c.push({type:"diff",path:f,oldText:m,newText:a});}if(s==="todo"){let l=DS(r.output);if(l&&r.input.operation==="write"){let f={sessionUpdate:"plan",entries:l.map(m=>({priority:"medium",status:m.status==="cancelled"?"completed":m.status,content:m.content}))};await this.pushEvent(n,f);}}let u={sessionUpdate:"tool_call_update",toolCallId:o,status:"completed",kind:i,content:c,title:r.title??s,rawInput:r.input,rawOutput:{output:r.output,metadata:r.metadata}};await this.pushEvent(n,u);break}case "error":{let c={sessionUpdate:"tool_call_update",toolCallId:o,status:"failed",kind:i,title:s,rawInput:r.input,content:[{type:"content",content:{type:"text",text:r.error}}],rawOutput:{error:r.error}};await this.pushEvent(n,c);break}}}async handleTextPart(e,n){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;if(!s)return;let r={sessionUpdate:"agent_message_chunk",content:{type:"text",text:s},messageID:e.messageID,time:e.time};await this.pushEvent(e.sessionID,r);}async handleStepStartPart(e){let n={sessionUpdate:"step_start",messageID:e.messageID};await this.pushEvent(e.sessionID,n);}async handleStepFinishPart(e){let n={sessionUpdate:"step_finish",messageID:e.messageID};e.tokens&&(n.tokens=e.tokens),e.cost&&(n.cost=e.cost),await this.pushEvent(e.sessionID,n);}async handleReasoningPart(e,n){if(!("time"in e&&e.time&&typeof e.time=="object"&&"end"in e.time&&!!e.time.end))return;let s=e.text;if(!s)return;let r={sessionUpdate:"agent_thought_chunk",content:{type:"text",text:s},messageID:e.messageID,time:e.time};await this.pushEvent(e.sessionID,r);}async handleSessionStatus(e){let{sessionID:n,status:o}=e,s={sessionUpdate:"status_update",status:o};await this.localEventBus?.publish({type:"sdk.session_update",properties:{sessionId:n,update:s,timestamp:Date.now()}}),_n.debug("Session status update sent",{sessionID:n,status:o.type});}};function ES(t){switch(t.toLowerCase()){case "bash":return "execute";case "webfetch":return "fetch";case "edit":case "patch":case "write":return "edit";case "grep":case "glob":case "context7_resolve_library_id":case "context7_get_library_docs":return "search";case "list":case "read":return "read";default:return "other"}}function TS(t,e){if(!e)return [];switch(t.toLowerCase()){case "read":case "edit":case "write":return e.filePath?[{path:e.filePath}]:[];case "glob":case "grep":return e.path?[{path:e.path}]:[];case "bash":return [];case "list":return e.path?[{path:e.path}]:[];default:return []}}function DS(t){try{let e=JSON.parse(t),n=z.array(no.Info).safeParse(e);return n.success?n.data:null}catch{return null}}var Xe=a.create({service:"acp-event-bridge"}),OS={Info:z.object({id:z.string(),content:z.string(),status:z.enum(["in_progress","pending","completed","cancelled"]),priority:z.enum(["high","medium","low"])})},pa=class{constructor(e,n,o){b$1(this,"sdk");b$1(this,"connection");b$1(this,"localEventBus");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,"questionQueues",new Map);b$1(this,"questionOptions",[{optionId:"reject",kind:"reject_once",name:"Reject"}]);b$1(this,"acpService");this.sdk=e,this.connection=n,this.localEventBus=o;}setService(e){this.acpService=e;}async start(){if(this.started){Xe.warn("AcpEventBridge already started");return}this.started=true,this.abortController=new AbortController,Xe.info("starting ACP event bridge"),this.runEventSubscription().catch(e=>{this.abortController?.signal.aborted||Xe.error("event subscription failed",{error:e});}),this.subscribeLocalEvents();}subscribeLocalEvents(){this.localEventBus&&this.localEventBus.subscribe("agent.status",e=>{let n=e.properties;this.handleAgentStatus(n).catch(o=>{Xe.error("failed to handle agent status event",{error:o,agentId:n.agentId,status:n.status});});});}async handleAgentStatus(e){let{agentId:n,status:o}=e;if(Xe.debug("Publishing agent status update to ACP",{agentId:n,status:o}),!this.connection){Xe.warn("No connection available to publish agent status");return}try{await this.connection.extNotification("session/status_update",{sessionId:n,status:{type:o}}),Xe.debug("Agent status published to ACP",{agentId:n,status:o});}catch(s){Xe.error("Failed to publish agent status to ACP",{agentId:n,status:o,error:s});}}async stop(){this.started&&(Xe.info("stopping ACP event bridge"),this.started=false,this.abortController?.abort(),this.abortController=null,this.permissionQueues.clear(),this.questionQueues.clear(),Xe.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 n of e.stream){if(this.abortController?.signal.aborted)return;let o=n?.payload;o&&await this.handleEvent(o).catch(s=>{Xe.error("failed to handle event",{error:s,type:o.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:n,status:o}=e;Xe.debug("Handling session status event in ACP bridge",{sessionID:n,status:o}),await this.localEventBus?.publish({type:"sdk.session_update",properties:{sessionId:n,update:{sessionUpdate:"status_update",status:o},timestamp:Date.now()}});}async handleSessionDeleted(e){let{sessionID:n}=e;if(Xe.info("Handling session deleted event in ACP bridge",{sessionID:n}),await this.localEventBus?.publish({type:"sdk.session_deleted",properties:{sessionId:n,timestamp:Date.now()}}),!this.connection){Xe.warn("No connection available to notify session deletion");return}try{await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:"[System] Session has been deleted by the backend. This session is no longer available."}}}),Xe.debug("Session deletion notified to client",{sessionID:n});}catch(o){Xe.error("Failed to notify session deletion to client",{sessionID:n,error:o});}}async handlePermissionAsked(e){let{id:n,sessionID:o,permission:s,tool:r,metadata:i}=e,u=(this.permissionQueues.get(o)??Promise.resolve()).then(async()=>{let l=i?.directory??"",f=s==="external_directory"&&i?.tool?Ku(i.tool):Ku(s),m=s==="external_directory"&&i?.tool?Ju(i.tool,i):Ju(s,i),a=await this.connection.requestPermission({sessionId:o,toolCall:{toolCallId:r?.callID??n,status:"pending",title:s,rawInput:i,kind:f,locations:m},options:this.permissionOptions}).catch(async p=>{Xe.error("failed to request permission from ACP",{error:p,permissionID:n,sessionID:o}),await this.sdk.permission.reply({requestID:n,reply:"reject",directory:l});});if(a){if(a.outcome.outcome!=="selected"){await this.sdk.permission.reply({requestID:n,reply:"reject",directory:l});return}if(a.outcome.optionId!=="reject"&&s==="edit"){let p=i?.filepath??i?.filePath??"",d=i?.diff??"";if(p&&d){let h=PKG.file(p),w=await h.exists()?await h.text():"",g=jS(w,d);g&&this.connection.writeTextFile({sessionId:o,path:p,content:g});}}await this.sdk.permission.reply({requestID:n,reply:a.outcome.optionId,directory:l});}}).catch(l=>{Xe.error("failed to handle permission",{error:l,permissionID:n});}).finally(()=>{this.permissionQueues.get(o)===u&&this.permissionQueues.delete(o);});this.permissionQueues.set(o,u);}async handleQuestionAsked(e){let{id:n,sessionID:o,questions:s}=e;Xe.debug("Handling question asked in ACP bridge",{requestID:n,sessionID:o,questionCount:s.length}),this.acpService?.registerPendingQuestion({...e,id:n});let i=(this.questionQueues.get(o)??Promise.resolve()).then(async()=>{try{await this.sendQuestionUpdate(n,o,s),Xe.debug("Question update sent to ACP client",{requestID:n,sessionID:o});}catch(c){Xe.error("Failed to send question update",{error:c,requestID:n,sessionID:o});}}).catch(c=>{Xe.error("Failed to handle question",{error:c,requestID:n});}).finally(()=>{this.questionQueues.get(o)===i&&this.questionQueues.delete(o);});this.questionQueues.set(o,i);}async sendQuestionUpdate(e,n,o){if(!this.connection){Xe.warn("No connection available to send question update");return}if(o.length===0){Xe.warn("No questions to send");return}let s=o[0],r=`[Question 1/${o.length}] ${s.header}
266
+ ${s.question}`;s.options&&s.options.length>0&&(r+=`
267
+ Options:`,s.options.forEach((i,c)=>{r+=`
268
+ ${c+1}. ${i.label}`,i.description&&(r+=` - ${i.description}`);})),s.multiple&&(r+=`
269
+ (Select multiple)`),s.custom!==false&&(r+=`
270
+ (Custom answer allowed)`),await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"agent_message_chunk",messageId:Identifier.ascending("part"),content:{type:"text",text:`Waiting for user to answer...
271
+ ${r}`}}}),Xe.debug("Question sent to ACP client, waiting for user input");}async handleMessagePartUpdated(e){let{part:n}=e;Xe.debug("message part updated",{event:e});let o=await this.sdk.session.message({sessionID:n.sessionID,messageID:n.messageID},{throwOnError:true}).then(s=>s.data).catch(s=>{Xe.error("unexpected error when fetching message",{error:s});});!o||o.info.role!=="assistant"||(n.type==="tool"?await this.handleToolPart(n):n.type==="text"?await this.handleTextPart(n,e.delta):n.type==="reasoning"?await this.handleReasoningPart(n,e.delta):n.type==="step-start"?await this.handleStepStartPart(n):n.type==="step-finish"&&await this.handleStepFinishPart(n));}async handleToolPart(e){let{sessionID:n,callID:o,tool:s,state:r}=e,i=Ku(s);switch(r.status){case "pending":if(s==="question"){Xe.debug("Skipping question tool pending update for ACP client");return}await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"tool_call",toolCallId:o,title:s,kind:i,status:"pending",locations:[],rawInput:{}}}).catch(c=>{Xe.error("failed to send tool pending to ACP",{error:c});});return;case "running":if(s==="question"){Xe.debug("Skipping question tool running update for ACP client");return}await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"tool_call_update",toolCallId:o,status:"in_progress",kind:i,title:s,locations:Ju(s,r.input),rawInput:r.input}}).catch(c=>{Xe.error("failed to send tool in_progress to ACP",{error:c});});return;case "completed":{let c=[{type:"content",content:{type:"text",text:r.output}}];if(i==="edit"){let u=r.input,l=u.filePath??u.filepath??"",f=u.oldString??"",m=u.newString??u.content??"";c.push({type:"diff",path:l,oldText:f,newText:m});}if(s==="todo"){let u=OS.Info.array().safeParse(JSON.parse(r.output));u.success&&r.input.operation==="write"&&await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"plan",entries:u.data.map(l=>{let f=l.status==="cancelled"?"completed":l.status;return {priority:l.priority,status:f,content:l.content}})}}).catch(l=>{Xe.error("failed to send session update for todo",{error:l});});}await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"tool_call_update",toolCallId:o,status:"completed",kind:i,content:c,title:r.title??s,rawInput:r.input,rawOutput:{output:r.output,metadata:r.metadata}}}).catch(u=>{Xe.error("failed to send tool completed to ACP",{error:u});});return}case "error":await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"tool_call_update",toolCallId:o,status:"failed",kind:i,title:s,rawInput:r.input,content:[{type:"content",content:{type:"text",text:r.error}}],rawOutput:{error:r.error}}}).catch(c=>{Xe.error("failed to send tool error to ACP",{error:c});});return}}async handleTextPart(e,n){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(r=>{Xe.error("failed to send text to ACP",{error:r});});}async handleReasoningPart(e,n){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(r=>{Xe.error("failed to send reasoning to ACP",{error:r});});}async handleStepStartPart(e){}async handleStepFinishPart(e){}};function Ku(t){switch(t.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 Ju(t,e){if(!e)return [];switch(t.toLowerCase()){case "read":case "edit":case "write":case "patch":case "lsp":{let o=e.filePath??e.filepath??"";return o?[{path:o}]:[]}case "glob":case "grep":return e.path?[{path:e.path}]:[];case "list":return e.path?[{path:e.path}]:[];case "bash":case "shell":{let o=e.cwd??"";return o?[{path:o}]:[]}case "external_directory":{let o=e.tool?.toLowerCase(),s=e.filepath??"",r=e.realPath??"",i=e.parentDir??"";if(o==="read"||o==="edit"||o==="write"||o==="patch"||o==="lsp")return r?[{path:r}]:s?[{path:s}]:[];if(o==="list"||o==="glob"||o==="grep"){let u=r??s,l=u?ke__default.posix.dirname(u):i;return l?[{path:l}]:[]}let c=r??s;return c?[{path:c}]:i?[{path:i}]:[]}default:return []}}function jS(t,e){try{let n=applyPatch(t,e);return n===!1?null:n}catch{return null}}a.create({service:"event-subscription-manager"});var pl=class{constructor(){b$1(this,"log",a.create({service:"event-subscription-manager"}));b$1(this,"subscriptions",new Map);}subscribe(e,n){return this.subscriptions.has(e)||this.subscriptions.set(e,new Set),this.subscriptions.get(e).add(n),this.log.debug("Event subscription added",{eventType:e}),()=>{this.unsubscribe(e,n);}}unsubscribe(e,n){let o=this.subscriptions.get(e);o&&(o.delete(n),o.size===0&&this.subscriptions.delete(e),this.log.debug("Event subscription removed",{eventType:e}));}unsubscribeAll(){this.subscriptions.clear(),this.log.debug("All event subscriptions removed");}async publish(e,n){this.log.debug("Publishing event",{eventType:e});let o=[],s=this.subscriptions.get(e);s&&o.push(...s);let r=this.subscriptions.get("*");r&&o.push(...r),await Promise.all(o.map(async i=>{try{await i(n);}catch(c){this.log.error("Event callback failed",{error:c instanceof Error?c.message:String(c),eventType:e});}})),this.log.debug("Event published",{eventType:e,callbackCount:o.length});}getSubscriptionCount(e){if(e)return this.subscriptions.get(e)?.size??0;let n=0;for(let o of this.subscriptions.values())n+=o.size;return n}getSubscribedEventTypes(){return Array.from(this.subscriptions.keys())}};a.create({service:"event-subscription-flow"});var Js=a.create({service:"acp-session-manager"}),ma=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,n,o,s){let i={id:e,cwd:n,mcpServers:o,createdAt:new Date,model:s,pendingQuestions:new Map};return Js.info("creating_session",{state:i}),this.sessions.set(e,i),i}async load(e,n,o,s){let r=await this.sdk.session.get({sessionID:e,directory:n},{throwOnError:true}).then(u=>u.data),i=s,c={id:e,cwd:n,mcpServers:o,createdAt:new Date(r.time.created),model:i,pendingQuestions:new Map};return Js.info("loading_session",{state:c}),this.sessions.set(e,c),c}get(e){let n=this.sessions.get(e);if(!n)throw Js.error("session not found",{sessionId:e}),RequestError.invalidParams(JSON.stringify({error:`Session not found: ${e}`}));return n}getModel(e){return this.get(e).model}registerPendingQuestion(e,n){this.get(e).pendingQuestions.set(n.id,n),Js.info("Question registered in session",{sessionId:e,requestID:n.id,questionCount:n.questions.length});}getPendingQuestion(e,n){return this.tryGet(e)?.pendingQuestions.get(n)}getPendingQuestionsForSession(e){let n=this.tryGet(e);return n?Array.from(n.pendingQuestions.values()):[]}removePendingQuestion(e,n){let o=this.tryGet(e);o&&(o.pendingQuestions.delete(n),Js.debug("Question removed from session",{sessionId:e,requestID:n}));}clearPendingQuestions(e){let n=this.tryGet(e);n&&(n.pendingQuestions.clear(),Js.debug("All pending questions cleared",{sessionId:e}));}setModel(e,n){let o=this.get(e);return o.model=n,this.sessions.set(e,o),o}getVariant(e){return this.get(e).variant}setVariant(e,n){let o=this.get(e);return o.variant=n,this.sessions.set(e,o),o}setMode(e,n){let o=this.get(e);return o.modeId=n,this.sessions.set(e,o),o}setContextMode(e,n){let o=this.get(e);return o.contextMode=n,this.sessions.set(e,o),o}setAgent(e,n){let o=this.get(e);return o.agent=n,this.sessions.set(e,o),o}close(e){return this.clearPendingQuestions(e),this.sessions.delete(e)}dispose(){this.sessions.clear(),Js.debug("all sessions cleared");}resolveConnectionState(e){}};var Ne=a.create({service:"acp-service"}),fa=class{constructor(e,n){b$1(this,"eventBus");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,"duplexExecutor",null);b$1(this,"sessionManager");b$1(this,"executorInitialized",false);b$1(this,"status","initializing");this.connection=e,this.config=n,this.sdk=n.acp.sdk,this.serviceMode=n.serviceMode,this.eventBus=new pl,this.sessionManager=new ma(this.sdk),n.connectionRegistry&&(this.connectionRegistry=n.connectionRegistry),n.sessionRouter&&(this.sessionRouter=n.sessionRouter),n.duplexExecutor&&(this.duplexExecutor=n.duplexExecutor),Ne.info("ACPService instance created",{channel:n.channel.type,hasConnection:!!e,hasProvidedRegistry:!!n.connectionRegistry,hasProvidedRouter:!!n.sessionRouter,hasProvidedExecutor:!!n.duplexExecutor});}async initializeExecutor(){if(this.executorInitialized){Ne.warn("Executor components already initialized");return}this.connectionRegistry||(this.connectionRegistry=await Vo.create(),Ne.debug("ConnectionRegistry created")),this.sessionRouter||(this.sessionRouter=Xc.fromRegistry({resolve:e=>this.connectionRegistry.resolve(e),getConnectionsByPeer:e=>this.connectionRegistry.getConnectionsByPeer(e),getConnectionsByService:e=>this.connectionRegistry.getConnectionsByService(e)}),Ne.debug("SessionRouter created")),this.duplexExecutor||(this.duplexExecutor=Zc.create({registry:this.connectionRegistry,degradation:this.config.degradation}),Ne.debug("DuplexExecutor created")),this.executorInitialized=true,Ne.info("Executor components initialized",{degradationPolicy:this.config.degradation?.policy??"streaming_first"});}setStatus(e,n="agent"){let o=this.status;if(o===e)return;this.status=e,Ne.info("Agent status changed",{oldStatus:o,newStatus:e,agentId:n});let s=BS(e);this.eventBus.publish("agent.status",{type:"agent.status",properties:{agentId:n,status:s,timestamp:Date.now()}});}getStatus(){return this.status}authenticate(e){return Promise.resolve(void 0)}async newSession(e){Ne.info("ACP newSession requested",{cwd:e.cwd});let n=e.cwd,s=(await this.sdk.model.default())?.data,i=(await this.sdk.session.create({directory:e.cwd})).data?.id;if(!i)throw new Error("Failed to create session: no session ID returned");let c=await this.sessionManager.create(i,n,e.mcpServers,s),u=await this.buildSessionStateResponse(c.id,n);return {sessionId:c.id,...u,_meta:{}}}async loadSession(e){Ne.info("ACP loadSession requested",{sessionId:e.sessionId});let n=e.cwd,s=(await this.sdk.model.default())?.data;return await this.sessionManager.load(e.sessionId,n,e.mcpServers,s),{...await this.buildSessionStateResponse(e.sessionId,n),_meta:{}}}async prompt(e){let n=e.sessionId,o=this.sessionManager.get(n),s=o.cwd,i=o.model??(await this.sdk.model.default())?.data,c=o.agent??(await this.sdk.agent.default({directory:s}))?.data?.name??"build";await this.sendAvailableCommandsUpdate(n,s),Ne.debug("prompt entering, checking for question answers",{sessionID:n,promptParts:e.prompt.length});let u=await this.handleQuestionAnswers(n,e.prompt);if(u.handled&&!u.continueFlow)return Ne.debug("Question answer processed, waiting for more answers",{sessionID:n,requestID:u.requestID}),{stopReason:"end_turn",_meta:{}};let l=[];for(let p of e.prompt)switch(p.type){case "text":{let d=p.annotations?.audience,h=d?.length===1&&d[0]==="assistant",w=d?.length===1&&d[0]==="user";l.push({type:"text",text:p.text,...h&&{synthetic:true},...w&&{ignored:true}});break}case "image":{let d=this.parseUri(p.uri??""),h=d.type==="file"?d.filename:"image";p.data?l.push({type:"file",url:`data:${p.mimeType};base64,${p.data}`,filename:h,mime:p.mimeType}):p.uri?.startsWith("http:")&&l.push({type:"file",url:p.uri,filename:h,mime:p.mimeType});break}case "resource_link":{let d=this.parseUri(p.uri);p.name&&d.type==="file"&&(d.filename=p.name),l.push(d);break}case "resource":{let d=p.resource;if("text"in d&&d.text)l.push({type:"text",text:d.text});else if("blob"in d&&d.blob&&d.mimeType){let h=this.parseUri(d.uri??""),w=h.type==="file"?h.filename:"file";l.push({type:"file",url:`data:${d.mimeType};base64,${d.blob}`,filename:w,mime:d.mimeType});}break}}Ne.info("prompt parts",{sessionID:n,parts:l});let f=(()=>{let p=l.filter(w=>w.type==="text").map(w=>w.text).join("").trim();if(!p.startsWith("/"))return;let[d,...h]=p.slice(1).split(/\s+/);return {name:d,args:h.join(" ").trim()}})(),m=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(!f){let d=(await this.sdk.session.prompt({sessionID:n,model:{providerID:i.providerID,modelID:i.modelID},parts:l,agent:c,directory:s,variant:o.variant,contextMode:o.contextMode})).data?.info;return await this.sendUsageUpdate(n,s),{stopReason:"end_turn",usage:d?m(d):void 0,_meta:{}}}let a=await this.sdk.command.list({directory:s},{throwOnError:true}).then(p=>p.data?.find(d=>d.name===f.name));if(a){let p=await gn.get(f.name),d=await qe.command({sessionID:n,agent:c,model:i.providerID+"/"+i.modelID,arguments:f.args,command:a.name});if(await this.sendUsageUpdate(n,s),p?.commandType==="local"&&this.connection){let h=d.success?d.output:`[Error] ${d.error??"Command execution failed"}`;await this.connection.sessionUpdate({sessionId:n,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:h}}});}return {stopReason:"end_turn",usage:d.info?m({tokens:{input:d.info.tokens.input,output:d.info.tokens.output,reasoning:d.info.tokens.reasoning,cache:d.info.tokens.cache}}):void 0,_meta:{}}}switch(f.name){case "compact":if(!i.providerID||!i.modelID)throw new Error("Model providerID and modelID are required for compact command");await this.sdk.session.summarize({sessionID:n,directory:s,providerID:i.providerID,modelID:i.modelID},{throwOnError:true});break}return await this.sendUsageUpdate(n,s),{stopReason:"end_turn",_meta:{}}}async cancel(e){let o=this.sessionManager.tryGet(e.sessionId)?.cwd??"";try{this.sdk&&await this.sdk.session.abort({sessionID:e.sessionId,directory:o}).then(s=>{this.sessionManager.clearPendingQuestions(e.sessionId);}).catch(s=>{Ne.warn("SDK abort failed",{sessionId:e.sessionId,error:String(s)});}),Ne.info("Session cancelled",{sessionId:e.sessionId});}catch(s){throw Ne.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 n=e.slice(7),o=n.split("/").pop()||n;return {type:"file",url:e,filename:o,mime:"text/plain"}}if(e.startsWith("zed://")){let o=new URL(e).searchParams.get("path");if(o){let s=o.split("/").pop()||o;return {type:"file",url:pathToFileURL(o).href,filename:s,mime:"text/plain"}}}return {type:"text",text:e}}catch{return {type:"text",text:e}}}async sendUsageUpdate(e,n){if(!this.sdk||!this.connection)return;let o=await this.sdk.session.messages({sessionID:e,directory:n},{throwOnError:true}).then(l=>l.data).catch(l=>{Ne.error("failed to fetch messages for usage update",{error:l});});if(!o)return;let s=o.filter(l=>l.info.role==="assistant"),r=s[s.length-1];if(!r)return;let i=r.info,c=await this.getContextLimit(i.providerID,i.modelID,n);if(!c)return;let u=i.tokens.input+(i.tokens.cache?.read??0);await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"usage_update",used:u,size:c}});}async sendAvailableCommandsUpdate(e,n){if(this.sdk&&this.connection)try{let s=(await this.sdk.command.list({directory:n},{throwOnError:!0})).data?.map(r=>({name:r.name,description:r.description??""}))??[];await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"available_commands_update",availableCommands:s}});}catch(o){Ne.error("failed to send available commands update",{error:o});}}async sendConfigOptionUpdate(e,n,o){if(this.connection)try{let r=(o??await this.buildSessionStateResponse(e,n)).configOptions;if(!r||r.length===0)return;await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"config_option_update",configOptions:r}});}catch(s){Ne.error("failed to send config_option_update to ACP client",{sessionId:e,error:s});}}async sendCurrentModeUpdate(e,n){if(this.connection)try{await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"current_mode_update",currentModeId:n}});}catch(o){Ne.error("failed to send current_mode_update to ACP client",{sessionId:e,modeId:n,error:o});}}async getContextLimit(e,n,o){return this.sdk?(await this.sdk.config.providers({directory:o}).then(c=>c.data?.providers??[]).catch(c=>(Ne.error("failed to get providers for context limit",{error:c}),[]))).find(c=>c.id===e)?.models[n]?.limit.context??2e5:null}async unstable_forkSession(e){Ne.info("ACP forkSession requested",{sessionId:e.sessionId});let n=e.cwd,o=e.mcpServers??[],r=(await this.sdk.model.default())?.data,i=await this.sdk.session.fork({sessionID:e.sessionId,directory:n},{throwOnError:true}).then(f=>f.data);if(!i)throw new Error("Fork session returned no data");let c=i.id;await this.sessionManager.load(c,n,o,r);let l=await this.buildSessionStateResponse(c,n);return Ne.info("fork_session",{sessionId:c,mcpServers:o.length}),{sessionId:c,...l,_meta:{}}}async resumeSession(e){Ne.info("ACP resumeSession requested",{sessionId:e.sessionId});let n=e.cwd,o=e.sessionId,s=e.mcpServers??[],i=(await this.sdk.model.default())?.data;await this.sessionManager.load(o,n,s,i);let u=await this.buildSessionStateResponse(o,n);return Ne.info("resume_session",{sessionId:o,mcpServers:s.length}),{...u,_meta:{}}}async listSessions(e){let n=e.cursor?Number(e.cursor):void 0,o=100,r=(await this.sdk.session.list({directory:e.cwd??void 0,roots:true},{throwOnError:true}).then(m=>m.data??[])).toSorted((m,a)=>a.time.updated-m.time.updated),c=(n?r.filter(m=>m.time.updated<n):r).slice(0,o),u=c.map(m=>({sessionId:m.id,cwd:m.directory,title:m.title??`Session ${m.id}`,updatedAt:new Date(m.time.updated).toISOString()})),l=c[c.length-1],f=c.length===o&&l?String(l.time.updated):void 0;return {sessions:u,nextCursor:f}}async setSessionMode(e){Ne.info("ACP setSessionMode requested",{sessionId:e.sessionId,modeId:e.modeId}),this.sessionManager.setMode(e.sessionId,e.modeId);let n=this.sessionManager.get(e.sessionId);return await this.sendCurrentModeUpdate(e.sessionId,e.modeId),await this.sendConfigOptionUpdate(e.sessionId,n.cwd),{_meta:{}}}async setSessionConfigOption(e$1){if(Ne.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 r=this.parseModelSelection(s);this.sessionManager.setModel(e$1.sessionId,r.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 n=this.sessionManager.get(e$1.sessionId),o=await this.buildSessionStateResponse(e$1.sessionId,n.cwd);return await this.sendConfigOptionUpdate(e$1.sessionId,n.cwd,o),{_meta:{},configOptions:o.configOptions??[]}}async unstable_setSessionModel(e){Ne.info("ACP setSessionModel requested",{sessionId:e.sessionId,modelId:e.modelId});let n=this.sessionManager.get(e.sessionId),o=this.parseModelSelection(e.modelId);return this.sessionManager.setModel(e.sessionId,o.model),o.variant&&this.sessionManager.setVariant(e.sessionId,o.variant),await this.sendConfigOptionUpdate(e.sessionId,n.cwd),{_meta:{}}}async closeSession(e){return Ne.info("ACP closeSession requested",{sessionId:e.sessionId}),await this.cancel({sessionId:e.sessionId}),this.sessionManager.close(e.sessionId),{_meta:{}}}async buildSessionStateResponse(e$1,n){let o=this.sessionManager.tryGet(e$1),s=o?.model??(await this.sdk.model.default())?.data,r=s?.providerID&&s?.modelID?`${s.providerID}/${s.modelID}`:void 0,i=[];try{i=(await this.sdk.config.providers({directory:n}).then(p=>p.data?.providers??[])).flatMap(p=>{let d=p.models??{};return Object.keys(d).map(h=>({modelId:`${p.id}/${h}`,name:`${p.id}/${h}`}))});}catch(a){Ne.warn("failed to build available models for session state",{sessionId:e$1,error:a instanceof Error?a.message:String(a)});}r&&!i.some(a=>a.modelId===r)&&(i=[{modelId:r,name:r},...i]);let c=[];try{c=((await this.sdk.app.agents({directory:n})).data??[]).filter(d=>d.hidden!==!0&&d.mode!=="subagent").map(d=>({id:d.name,name:d.name,description:d.description}));}catch(a){Ne.warn("failed to build available agents for session state",{sessionId:e$1,error:a instanceof Error?a.message:String(a)});}let u=o?.modeId,l=o?.variant??"low",f=o?.contextMode??f$1,m=o?.agent??"build";return await this.sendAvailableCommandsUpdate(e$1,n),{models:r?{currentModelId:r,availableModels:i}:void 0,modes:u?{currentModeId:u,availableModes:[{id:u,name:u}]}:void 0,configOptions:[{id:"model",name:"Model",category:"model",type:"select",currentValue:r??"",options:i.map(a=>({value:a.modelId,name:a.name,description:a.description??null}))},{id:"agent",name:"Agent",category:"agent",type:"select",currentValue:m,options:c.map(a=>({value:a.id,name:a.name,description:a.description??null}))},{id:"thought_level",name:"Thought Level",category:"thought_level",type:"select",currentValue:l,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:f,options:e.map(a=>({value:a,name:a.charAt(0).toUpperCase()+a.slice(1)}))}]}}parseModelSelection(e){let{provider:n,model:o}=parseModelId(e);return n&&o?{model:{providerID:n,modelID:o}}:{model:{providerID:"unknown",modelID:e}}}subscribeEvents(e){return this.eventBus.subscribe("*",e)}setConnection(e){this.connection=e,Ne.info("ACPService connection updated");}getConnection(){return this.connection}abortConnection(){this.connection&&Ne.debug("Connection aborted");}closeConnection(){this.connection&&Ne.debug("Connection closed");}getConnectionRegistry(){return this.connectionRegistry}getSessionRouter(){return this.sessionRouter}getDuplexExecutor(){return this.duplexExecutor}async sendMessage(e,n,o){if(!this.duplexExecutor)throw new Error("DuplexExecutor not initialized. Call initializeExecutor() first.");return this.duplexExecutor.send(e,n,o)}async receiveMessages(e,n){if(!this.duplexExecutor)throw new Error("DuplexExecutor not initialized. Call initializeExecutor() first.");return this.duplexExecutor.receive(e,n)}async exchangeMessage(e,n,o){if(!this.duplexExecutor)throw new Error("DuplexExecutor not initialized. Call initializeExecutor() first.");return this.duplexExecutor.exchange(e,n,o)}subscribeExecutorEvent(e,n,o){if(!this.duplexExecutor)throw new Error("DuplexExecutor not initialized. Call initializeExecutor() first.");return this.duplexExecutor.subscribe(e,{eventType:n,callback:o})}unsubscribeExecutorEvent(e,n){this.duplexExecutor&&this.duplexExecutor.unsubscribe(e,n);}getDegradationStatus(){return this.duplexExecutor?.getDegradationStatus()??null}forceDegrade(e){this.duplexExecutor&&(this.duplexExecutor.forceDegrade(e),Ne.warn("Forced degradation",{reason:e}));}forceRecover(){this.duplexExecutor&&(this.duplexExecutor.forceRecover(),Ne.info("Forced recovery to streaming mode"));}createConnection(e,n,o,s){if(!this.connectionRegistry)throw new Error("ConnectionRegistry not initialized. Call initializeExecutor() first.");if(!n||!o)throw new Error("localAgentId and remoteAgentId are required");return this.connectionRegistry.connect(e,n,o,s)}async routeToConnection(e){if(!this.sessionRouter)throw new Error("SessionRouter not initialized. Call initializeExecutor() first.");return this.sessionRouter.route(e)}registerPendingQuestion(e){let n={...e,currentQuestionIndex:0,collectedAnswers:[]};this.sessionManager.registerPendingQuestion(e.sessionID,n);}parseQuestionAnswer(e){let n=/\[QUESTION_ANSWER:([^\]]+)\]\s*answer:\s*(.+)/i,o=e.match(n);if(!o?.[1]||!o[2])return Ne.debug("parseQuestionAnswer: no match",{textLength:e.length,textPreview:e.substring(0,100)}),null;let s=o[1].trim(),r=o[2].trim();return Ne.debug("parseQuestionAnswer: success",{requestID:s,answerLength:r.length}),{requestID:s,answer:r}}async handleQuestionAnswers(e,n){Ne.info("handleQuestionAnswers called",{sessionID:e,promptLength:n.length});let o=this.sessionManager.getPendingQuestionsForSession(e);if(o.length===0)return Ne.debug("No pending questions, continue normal flow",{sessionID:e}),{handled:false,continueFlow:true};let s=o[0],r=s.questions.length,i=s.currentQuestionIndex;if(i>=r){Ne.debug("All questions already answered, submitting to backend",{sessionID:e,requestID:s.id});try{if(await this.sdk.question.reply({requestID:s.id,answers:s.collectedAnswers}),this.sessionManager.removePendingQuestion(e,s.id),Ne.debug("Question answer submitted successfully",{sessionID:e,requestID:s.id}),this.connection){let a=`question-${s.id}`;await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"tool_call_update",toolCallId:a,status:"completed",kind:"other",title:"Question",content:[{type:"content",content:{type:"text",text:`Answered ${r} question(s)`}}],rawInput:{questions:s.questions},rawOutput:{answers:s.collectedAnswers}}});}return {handled:!0,requestID:s.id,answers:s.collectedAnswers,continueFlow:!0}}catch(a){let p=a instanceof Error?a.message:String(a);return Ne.error("Failed to submit question answer",{sessionID:e,requestID:s.id,error:p}),{handled:false,continueFlow:true}}}let c=n.filter(a=>a.type==="text").map(a=>a.text).join(`
272
+ `);Ne.debug("promptText extracted",{sessionID:e,promptTextLength:c.length,promptText:c.substring(0,200)});let u=this.parseQuestionAnswer(c);if(!u){let a=s.questions[i];return Ne.debug("No question answer found in prompt, prompting client",{sessionID:e,currentIndex:i,totalQuestions:r}),this.connection&&await this.sendNextQuestion(e,s.id,a,i+1,r),{handled:true,continueFlow:false}}Ne.info("Question answer found",{sessionID:e,requestID:u.requestID,answer:u.answer});let{requestID:l,answer:f}=u;if(l!==s.id)return Ne.warn("Request ID mismatch",{expected:s.id,got:l}),{handled:false,continueFlow:true};s.collectedAnswers.push([f]),s.currentQuestionIndex++;let m=s.currentQuestionIndex;if(m<r){let a=s.questions[m];return Ne.info("Sending next question to client",{sessionID:e,requestID:l,nextIndex:m,totalQuestions:r}),this.connection&&await this.sendNextQuestion(e,l,a,m+1,r),{handled:true,requestID:l,answers:s.collectedAnswers,continueFlow:false}}Ne.info("All questions answered, submitting to backend",{sessionID:e,requestID:l,totalAnswers:s.collectedAnswers.length});try{return await this.sdk.question.reply({requestID:l,answers:s.collectedAnswers}),this.sessionManager.removePendingQuestion(e,l),Ne.debug("Question answer submitted successfully, tool will return result automatically",{requestID:l,sessionID:e}),{handled:!0,requestID:l,answers:s.collectedAnswers,continueFlow:!0}}catch(a){let p=a instanceof Error?a.message:String(a);return Ne.error("Failed to submit question answer",{requestID:l,error:p}),{handled:false,continueFlow:true}}}async sendNextQuestion(e,n,o,s,r){if(!this.connection)return;let i=`[Question ${s}/${r}] ${o.header}
273
+ ${o.question}`;o.options&&o.options.length>0&&(i+=`
274
+ Options:`,o.options.forEach((c,u)=>{i+=`
275
+ ${u+1}. ${c.label}`,c.description&&(i+=` - ${c.description}`);})),o.multiple&&(i+=`
276
+ (Select multiple)`),o.custom!==false&&(i+=`
277
+ (Custom answer allowed)`),await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"agent_message_chunk",messageId:Identifier.ascending("part"),content:{type:"text",text:`
278
+ ${i}`}}});}async dispose(){Ne.info("Disposing ACPService"),this.eventBus.unsubscribeAll(),this.sessionManager&&(this.sessionManager.dispose?.(),Ne.debug("SessionManager disposed")),this.duplexExecutor&&(await this.duplexExecutor.close(),this.duplexExecutor=null,Ne.debug("DuplexExecutor closed")),this.connectionRegistry&&(await this.connectionRegistry.close(),this.connectionRegistry=null,Ne.debug("ConnectionRegistry closed")),this.sessionRouter=null,this.executorInitialized=false,Ne.info("ACPService disposed");}};function BS(t){switch(t){case "initializing":case "ready":case "stopped":return "idle";case "running":return "busy";case "error":return "error"}}var hn={HTTP:"http",STDIO:"stdio",LOCAL:"local",WEBSOCKET:"websocket"},ni=class t extends Error{constructor(n,o=[]){super(n);b$1(this,"conflictingModes");this.name="ServiceModeConflictError",this.conflictingModes=o,Object.setPrototypeOf(this,t.prototype);}getConflictingModesDescription(){return this.conflictingModes.length===0?"No modes specified":this.conflictingModes.join(", ")}};function HS(t){let e=[];return t.channel&&e.push(t.channel),e}function xg(t){let e=HS(t);if(e.length===0)throw new ni("No service mode specified. Please specify exactly one of: http, stdio, websocket",[]);if(e.length>1)throw new ni(`Multiple service modes specified: ${e.join(", ")}. Please specify exactly one mode.`,e)}var Ig={channel:hn.WEBSOCKET,port:3e3,hostname:"localhost",timeout:3e4,historyScope:"session",historyWindowSize:10,degradePolicy:"streaming_first",sessionExpireMs:300*1e3};var Mn=a.create({service:"acp-server-config"}),Ys="EAS_";function vg(t){return !(!t||t.trim()===""||t.startsWith("-")||t.endsWith("-")||!/^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?$/.test(t))}function Sg(t){return Number.isInteger(t)&&t>=1&&t<=65535}function Cg(t){return Number.isFinite(t)&&t>0}function kg(t){let e={...Ig,...t};try{xg(e);}catch(n){throw n instanceof ni&&Mn.error("Invalid service mode configuration",{message:n.message,conflictingModes:n.conflictingModes}),n}if(e.port!==void 0&&!Sg(e.port)){let n=new Error(`Invalid port number: ${e.port}. Must be between 1 and 65535`);throw Mn.error("Invalid port configuration",{port:e.port}),n}if(e.hostname!==void 0&&!vg(e.hostname)){let n=new Error(`Invalid hostname: ${e.hostname}`);throw Mn.error("Invalid hostname configuration",{hostname:e.hostname}),n}if(e.timeout!==void 0&&!Cg(e.timeout)){let n=new Error(`Invalid timeout: ${e.timeout}. Must be a positive number`);throw Mn.error("Invalid timeout configuration",{timeout:e.timeout}),n}if(e.channel===hn.STDIO&&e.stdio&&(!e.stdio.command||e.stdio.command.trim()==="")){let n=new Error("STDIO command is required");throw Mn.error("Invalid stdio configuration",{command:e.stdio.command}),n}return Mn.debug("ACPServer config loaded",{channel:e.channel,port:e.port,hostname:e.hostname}),e}function qS(){let t={},e=process.env[`${Ys}ACP_CHANNEL`];if(e){let u=e.toLowerCase();Object.values(hn).includes(u)?t.channel=u:Mn.warn("Invalid EAS_ACP_CHANNEL environment variable",{value:e});}let n=process.env[`${Ys}ACP_PORT`];if(n){let u=parseInt(n,10);Sg(u)?t.port=u:Mn.warn("Invalid EAS_ACP_PORT environment variable",{value:n});}let o=process.env[`${Ys}ACP_HOSTNAME`];o&&(vg(o)?t.hostname=o:Mn.warn("Invalid EAS_ACP_HOSTNAME environment variable",{value:o}));let s=process.env[`${Ys}ACP_TIMEOUT`];if(s){let u=parseInt(s,10);Cg(u)?t.timeout=u:Mn.warn("Invalid EAS_ACP_TIMEOUT environment variable",{value:s});}let r=process.env[`${Ys}ACP_HISTORY_SCOPE`];r&&(["session","peer","global"].includes(r)?t.historyScope=r:Mn.warn("Invalid EAS_ACP_HISTORY_SCOPE environment variable",{value:r}));let i=process.env[`${Ys}ACP_HISTORY_WINDOW_SIZE`];if(i){let u=parseInt(i,10);Number.isInteger(u)&&u>0?t.historyWindowSize=u:Mn.warn("Invalid EAS_ACP_HISTORY_WINDOW_SIZE environment variable",{value:i});}let c=process.env[`${Ys}ACP_DEGRADE_POLICY`];return c&&(["polling_only","streaming_first"].includes(c)?t.degradePolicy=c:Mn.warn("Invalid EAS_ACP_DEGRADE_POLICY environment variable",{value:c})),Mn.debug("Config loaded from environment",{config:t}),t}function Pg(t){let e=qS(),n={...e,...t};return Mn.info("ACPServer config with environment overrides",{original:{channel:e.channel,port:e.port,hostname:e.hostname},overrides:t,final:{channel:n.channel,port:n.port,hostname:n.hostname}}),n}function oi(t){if(t.type==="agent.status"){let e=t.properties;return {type:"session.status",properties:{sessionID:e.agentId,status:{type:e.status}}}}return t.type==="agent.error"?{type:"session.status",properties:{sessionID:t.properties.agentId,status:{type:"error"}}}:t.type==="agent.started"?{type:"session.status",properties:{sessionID:t.properties.agentId,status:{type:"started"}}}:t.type==="agent.stopped"?{type:"session.status",properties:{sessionID:t.properties.agentId,status:{type:"stopped"}}}:null}function si(t,e){let n=e?.sessionUpdate;if(n==="agent_message_chunk"){let o=e?.content,s=e?.messageID,r=e?.time;return {type:"part.updated",properties:{sessionID:t,part:{type:"text",text:o?.text??"",...s?{messageID:s}:{},...r?{time:r}:{}}}}}if(n==="agent_thought_chunk"){let o=e?.content,s=e?.messageID,r=e?.time;return {type:"part.updated",properties:{sessionID:t,part:{type:"reasoning",text:o?.text??"",...s?{messageID:s}:{},...r?{time:r}:{}}}}}if(n==="tool_call"||n==="tool_call_update"){let o=e?.toolCallId,s=e?.title,r=e?.status,i=e?.kind,c=e?.rawOutput,u=e?.content;return {type:"part.updated",properties:{sessionID:t,part:{type:"tool",messageID:o,tool:s??i??"unknown",state:{status:r==="in_progress"?"running":r==="completed"?"completed":r==="failed"?"error":"running",output:c??u}}}}}if(n==="step_start"){let o=e?.messageID;return {type:"part.updated",properties:{sessionID:t,part:{type:"step-start",...o?{messageID:o}:{}}}}}if(n==="step_finish"){let o=e?.messageID,s=e?.tokens;return {type:"part.updated",properties:{sessionID:t,part:{type:"step-finish",...o?{messageID:o}:{},...s?{tokens:s}:{}}}}}if(n==="status_update"){let o=e?.status;if(o?.type)return {type:"session.status",properties:{sessionID:t,status:o}}}return null}var So=a.create({service:"stdio-server"}),Yu=false;function ml(t){if(!Yu)try{process.stdout.write(t)||process.stdout.once("drain",()=>{});}catch(e){let n=e;(n.code==="EPIPE"||n.code==="EIO")&&(Yu=true,So.info("stdout pipe broken, stopping writes"));}}process.stdout.on("error",t=>{(t.code==="EPIPE"||t.code==="EIO")&&(Yu=true,So.info("stdout pipe broken"));});async function Eg(t,e){if(So.info("Starting stdio server",{channel:e.channel}),e.channel!==hn.STDIO)throw new Error("Invalid channel type for stdio server");let n=new Map,o=new Set,s=async l=>{let f=l.method??"",m=l.params??{};if(f==="initialize"){let a=m.protocolVersion??1;return t.initialize({protocolVersion:a,clientCapabilities:{}})}if(f==="session.new"||f==="newSession")return {sessionId:(await t.newSession({cwd:process.cwd(),mcpServers:[]})).sessionId};if(f==="session.prompt"){let a=String(m.sessionID??m.sessionId??""),p=Array.isArray(m.parts)?m.parts.filter(h=>h?.type==="text").map(h=>({type:"text",text:h.text??""})):[];if(p.length===0||p.every(h=>!h.text.trim()))throw new Error("No prompt provided");return {success:true,result:await t.processMessage(a,{sessionID:a,parts:p})}}if(f==="session.subscribe"){let a=String(m.sessionID??m.sessionId??"");if(!a)throw new Error("sessionId is required for session.subscribe");return o.add(a),{subscribed:true,sessionId:a}}if(f==="session.unsubscribe"){let a=String(m.sessionID??m.sessionId??"");if(!a)throw new Error("sessionId is required for session.unsubscribe");return o.delete(a),{subscribed:false,sessionId:a}}if(f==="session.interrupt"){let a=String(m.sessionID??m.sessionId??"");if(!a)throw new Error("sessionId is required for session.interrupt");So.info("Interrupt requested via STDIO",{sessionId:a});try{return await t.cancel({sessionId:a}),{success:!0,message:"Session interrupted"}}catch(p){throw So.error("Failed to interrupt session",{sessionId:a,error:p instanceof Error?p.message:String(p)}),p}}if(f==="session.releaseSubscription"){let a=String(m.sessionID??m.sessionId??"");if(!a)throw new Error("sessionId is required for session.releaseSubscription");return So.info("Release subscription requested via STDIO",{sessionId:a}),c(a),{success:true,message:"Session subscription and resources released",sessionId:a}}if(f==="status")return {status:"running",channel:"stdio",timestamp:Date.now(),uptime:process.uptime(),sessions:n.size};if(f==="subscriptions")return {sessions:Object.fromEntries(n.entries())};throw new Error(`Method not found: ${f}`)},r=l=>{let f=l.toString().split(`
279
+ `).map(m=>m.trim()).filter(Boolean);for(let m of f){let a;try{a=JSON.parse(m);}catch{continue}a.method&&a.id!==void 0&&a.id!==null&&s(a).then(p=>{let d={jsonrpc:"2.0",id:a.id,result:p};ml(`${JSON.stringify(d)}
280
+ `);}).catch(p=>{let d={jsonrpc:"2.0",id:a.id,error:{code:-32601,message:p instanceof Error?p.message:String(p)}};ml(`${JSON.stringify(d)}
281
+ `);});}},i=t.subscribeLocalEvents(l=>{if(l.type==="sdk.session_update"){let m=l.properties,a=si(m.sessionId,m.update);if(a){if(n.set(m.sessionId,(n.get(m.sessionId)??0)+1),o.size>0&&!o.has(m.sessionId))return;let p={jsonrpc:"2.0",method:"event.notification",params:{...a,sessionID:m.sessionId,timestamp:Date.now()}};ml(`${JSON.stringify(p)}
282
+ `),m.update?.sessionUpdate==="status_update"&&m.update?.status?.type==="idle"&&So.info("Session idle via status_update",{sessionId:m.sessionId});}return}let f=oi(l);if(f){let m=f.properties.sessionID;if(m&&(n.set(m,(n.get(m)??0)+1),o.size>0&&!o.has(m)))return;let a={jsonrpc:"2.0",method:"event.notification",params:{type:l.type,properties:l.properties,timestamp:Date.now()}};ml(`${JSON.stringify(a)}
283
+ `);}}),c=l=>{n.delete(l),o.delete(l),So.info("Session resources released",{sessionId:l});};process.stdin.on("data",r);let u={type:"stdio",process:null,stop:async()=>{i(),process.stdin.removeAllListeners("data"),So.info("Stdio server stopped");},healthCheck:async()=>process.stdin.readable&&process.stdout.writable};return So.info("Stdio server started",{mode:"stdio",latency:"<10ms"}),{server:u,stop:async()=>{i(),process.stdin.removeAllListeners("data"),So.info("Stdio server stopped");}}}var Bn=a.create({service:"http-server"});async function Tg(t,e){if(Bn.info("Starting HTTP server",{port:e.port,hostname:e.hostname}),e.channel!==hn.HTTP)throw new Error("Invalid channel type for HTTP server");let n=new Map,o=new Map,s=new Map,r=e.sessionExpireMs??300*1e3,i=g=>{s.set(g,Date.now());},u=setInterval(()=>{let g=Date.now(),b=[];for(let[v,k]of s.entries())g-k>r&&b.push(v);for(let v of b)Bn.info("Session expired due to inactivity, releasing resources",{sessionId:v,lastActivity:s.get(v),expireMs:r}),a(v),s.delete(v);b.length>0&&Bn.debug("Cleaned up expired sessions",{count:b.length,remainingActive:s.size});},3e4),l=(g,b)=>{let v=n.get(g);if(!v)return false;let k=b?.properties?.sessionID;if(typeof k=="string"&&k&&k!==v.sessionId)return false;try{let S=`data: ${JSON.stringify(b)}
284
+
285
+ `;return v.controller.enqueue(new TextEncoder().encode(S)),v.lastHeartbeat=Date.now(),!0}catch(S){return Bn.warn("Failed to push to SSE connection",{connectionId:g,error:S instanceof Error?S.message:String(S)}),false}},f=(g,b)=>{i(g);let v=o.get(g);if(!(!v||v.size===0))for(let k of v){let S=n.get(k);if(!S||S.sessionId!==g)continue;l(k,b)||(n.delete(k),v.delete(k));}},m=t.subscribeLocalEvents(g=>{if(g.type==="sdk.session_update"){let v=g.properties,k=si(v.sessionId,v.update);k&&(f(v.sessionId,k),v.update?.sessionUpdate==="status_update"&&v.update?.status?.type==="idle"&&(Bn.debug("Session idle, updating activity time (will expire if no activity)",{sessionId:v.sessionId}),i(v.sessionId)));return}let b=oi(g);b?.properties.sessionID&&f(b.properties.sessionID,b);}),a=g=>{let b=o.get(g);if(b){for(let v of b){let k=n.get(v);if(k){try{k.controller.close();}catch{}n.delete(v);}}o.delete(g),Bn.info("Session resources released",{sessionId:g,connectionCount:b.size});}},p=(g,b)=>new ReadableStream({start:v=>{let k={id:b,controller:v,sessionId:g,createdAt:Date.now(),lastHeartbeat:Date.now()};n.set(b,k),o.has(g)||o.set(g,new Set),o.get(g).add(b),Bn.info("SSE client connected",{connectionId:b,sessionId:g});let S=`data: ${JSON.stringify({type:"connected",connectionId:b,sessionId:g})}
286
+
287
+ `;v.enqueue(new TextEncoder().encode(S));},cancel:()=>{let v=n.get(b);if(v){n.delete(b);let k=o.get(v.sessionId);k&&(k.delete(b),k.size===0&&o.delete(v.sessionId)),Bn.info("SSE client disconnected",{connectionId:b,sessionId:v.sessionId});}}}),d=setInterval(()=>{let g=Date.now(),b=3e5;for(let[v,k]of n.entries())if(g-k.lastHeartbeat>b){Bn.warn("SSE connection timeout, closing",{connectionId:v});try{k.controller.close();}catch{}n.delete(v);let S=o.get(k.sessionId);S&&S.delete(v);}else try{k.controller.enqueue(new TextEncoder().encode(`: heartbeat
288
+
289
+ `)),k.lastHeartbeat=g;}catch{}},1e4),h=[{method:"get",path:"/health",handler:g=>g.json({status:"healthy",channel:"http",sseConnections:n.size,timestamp:Date.now()})},{method:"post",path:"/session",handler:async g=>{let v=(await g.req.json().catch(()=>({})))?.title??"New Session",k=await t.newSession({cwd:process.cwd(),mcpServers:[]});return g.json({data:{id:k.sessionId},title:v})}},{method:"post",path:"/session/:sessionId/prompt",handler:async g=>{let b=g.req.param("sessionId"),v=await g.req.json().catch(()=>({})),k=Array.isArray(v?.parts)?v.parts:[];if(!k.filter(x=>x?.type==="text").map(x=>x.text??"").join(`
290
+ `).trim())return g.json({error:"No prompt provided"},400);if(!b)return g.json({error:"No sessionId provided"},400);let y=await t.processMessage(b,{sessionID:b,parts:k});return g.status(202),g.json({success:true,result:y})}},{method:"get",path:"/session/:sessionId/events",handler:g=>{let b=g.req.param("sessionId");if(!b)return g.json({error:"No sessionId provided"},400);let v=`sse_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;g.header("Content-Type","text/event-stream"),g.header("Cache-Control","no-cache"),g.header("Connection","keep-alive"),g.header("X-Accel-Buffering","no");let k=p(b,v);return new Response(k,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no"}})}},{method:"post",path:"/initialize",handler:async g=>{let v=(await g.req.json().catch(()=>({})))?.protocolVersion??1,k=await t.initialize({protocolVersion:v,clientCapabilities:{}});return g.json(k)}},{method:"get",path:"/status",handler:g=>g.json({status:"running",channel:"http",port:e.port,hostname:e.hostname,uptime:process.uptime(),sse:{connections:n.size,sessions:o.size}})},{method:"get",path:"/subscriptions",handler:g=>g.json({sseConnections:n.size,sessions:Object.fromEntries(Array.from(o.entries()).map(([b,v])=>[b,v.size]))})},{method:"delete",path:"/session/:sessionId/subscription",handler:g=>{let b=g.req.param("sessionId");return b?(a(b),g.json({success:true,message:"Session subscription released",sessionId:b})):g.json({error:"No sessionId provided"},400)}},{method:"post",path:"/session/:sessionId/interrupt",handler:async g=>{let b=g.req.param("sessionId");if(!b)return g.json({error:"No sessionId provided"},400);Bn.info("Interrupt requested",{sessionId:b});try{return await t.cancel({sessionId:b}),g.json({success:!0,message:"Session interrupted"})}catch(v){return Bn.error("Failed to interrupt session",{sessionId:b,error:v instanceof Error?v.message:String(v)}),g.json({success:false,error:v instanceof Error?v.message:"Unknown error"},500)}}}],w=createServer$1({port:e.port,hostname:e.hostname,routes:h,timeout:e.timeout,cors:true});return Bn.info("HTTP server started",{url:`http://${e.hostname}:${e.port}`}),{server:w,stop:async()=>{Bn.info("Stopping HTTP server"),clearInterval(d),clearInterval(u),m();for(let g of n.values())try{g.controller.close();}catch{}n.clear(),o.clear(),s.clear(),await w.stop(),Bn.info("HTTP server stopped");}}}var an=a.create({service:"websocket-server"});function KS(t){try{let e=new URL(t),n=e.hostname,o=parseInt(e.port,10);if(n&&!Number.isNaN(o)&&o>0&&o<=65535)return {port:o,hostname:n}}catch{}}async function Ag(t,e){let n=e.ws?KS(e.ws.url):void 0,o=n?.port??e.port??3e3,s=n?.hostname??e.hostname??"localhost",r=e.ws?.url?(()=>{try{return new URL(e.ws.url).pathname||"/"}catch{return "/"}})():"/";if(an.info("Starting WebSocket server",{port:o,hostname:s,wsUrl:e.ws?.url,fallback:!n&&e.ws?"using default port/hostname":void 0}),e.channel!==hn.WEBSOCKET)throw new Error("Invalid channel type for WebSocket server");let i=new Map,c=new Map,u=new Map,l=new Map,f=e.sessionExpireMs??300*1e3,m=k=>{l.set(k,Date.now());},p=setInterval(()=>{let k=Date.now(),S=[];for(let[y,x]of l.entries())k-x>f&&S.push(y);for(let y of S)an.info("Session expired due to inactivity, releasing resources",{sessionId:y,lastActivity:l.get(y),expireMs:f}),w(y),l.delete(y);S.length>0&&an.debug("Cleaned up expired sessions",{count:S.length,remainingActive:l.size});},3e4),d=(k,S)=>{m(k);let y=u.get(k);if(!y||y.size===0){an.debug("No clients subscribed to session",{sessionId:k});return}let x=S?.properties?.sessionID;if(typeof x=="string"&&x&&x!==k)return;let I=JSON.stringify({type:"event",sessionId:k,payload:S});for(let P of y){let T=c.get(P);T&&T.ws.readyState===T.ws.OPEN&&T.subscribedSessions.has(k)&&(T.ws.send(I),an.debug("Event pushed to client",{clientId:P,sessionId:k,eventType:S.type}));}},h=t.subscribeLocalEvents(k=>{if(k.type==="sdk.session_update"){let y=k.properties,x=si(y.sessionId,y.update);x&&(d(y.sessionId,x),y.update?.sessionUpdate==="status_update"&&y.update?.status?.type==="idle"&&(an.debug("Session idle, updating activity time (will expire if no activity)",{sessionId:y.sessionId}),m(y.sessionId)));return}let S=oi(k);S?.properties.sessionID&&d(S.properties.sessionID,S);}),w=k=>{let S=u.get(k);if(S){let y=JSON.stringify({type:"session_closed",sessionId:k,message:"Session resources released due to expiration or explicit release"});for(let x of S){let I=c.get(x);I&&I.ws.readyState===I.ws.OPEN&&I.ws.send(y);}for(let x of S){let I=c.get(x);I&&I.subscribedSessions.delete(k);}u.delete(k),an.info("Session resources released",{sessionId:k,clientCount:S.size});}},g={onOpen:(k,S)=>{let y=`ws_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;i.set(y,S),c.set(y,{clientId:y,ws:S,subscribedSessions:new Set,subscribedEventTypes:new Set}),an.info("WebSocket client connected",{clientId:y}),S.send(JSON.stringify({type:"connected",clientId:y}));},onMessage:async(k,S)=>{try{let y=JSON.parse(k.data.toString());if(y.type==="ping"){S.send(JSON.stringify({type:"pong"}));return}if(y.type==="initialize"){let x=y.payload?.protocolVersion??1,I=await t.initialize({protocolVersion:x,clientCapabilities:{}});S.send(JSON.stringify({type:"initialize_response",result:I}));return}if(y.type==="subscribe"&&y.sessionId){let x=Dg(S,i);if(!x){S.send(JSON.stringify({type:"error",message:"Client not found"}));return}let I=c.get(x);I&&(I.subscribedSessions.add(y.sessionId),u.has(y.sessionId)||u.set(y.sessionId,new Set),u.get(y.sessionId).add(x),m(y.sessionId),an.info("Client subscribed to session",{clientId:x,sessionId:y.sessionId}),S.send(JSON.stringify({type:"subscribed",sessionId:y.sessionId,message:"Successfully subscribed to session events"})));return}if(y.type==="unsubscribe"&&y.sessionId){let x=Dg(S,i);if(!x)return;let I=c.get(x);if(I){I.subscribedSessions.delete(y.sessionId);let P=u.get(y.sessionId);P&&(P.delete(x),P.size===0&&u.delete(y.sessionId)),an.info("Client unsubscribed from session",{clientId:x,sessionId:y.sessionId}),S.send(JSON.stringify({type:"unsubscribed",sessionId:y.sessionId}));}return}if(y.type==="message"&&y.sessionId&&y.payload){let x=y.payload,I=Array.isArray(x?.parts)?x.parts.filter(T=>T?.type==="text").map(T=>({type:"text",text:T.text??""})):x?.parts?[{type:"text",text:JSON.stringify(y.payload)}]:[],P=await t.processMessage(y.sessionId,{sessionID:y.sessionId,parts:I});S.send(JSON.stringify({type:"response",sessionId:y.sessionId,result:P}));return}if(y.type==="interrupt"&&y.sessionId){an.info("Interrupt requested via WebSocket",{sessionId:y.sessionId});try{await t.cancel({sessionId:y.sessionId}),S.send(JSON.stringify({type:"interrupted",sessionId:y.sessionId,success:!0}));}catch(x){an.error("Failed to interrupt session",{sessionId:y.sessionId,error:x instanceof Error?x.message:String(x)}),S.send(JSON.stringify({type:"interrupted",sessionId:y.sessionId,success:!1,error:x instanceof Error?x.message:"Unknown error"}));}return}if(y.type==="releaseSubscription"&&y.sessionId){an.info("Release subscription requested via WebSocket",{sessionId:y.sessionId}),w(y.sessionId),S.send(JSON.stringify({type:"subscriptionReleased",sessionId:y.sessionId,message:"Session subscription and resources released"}));return}}catch(y){an.error("Error processing WebSocket message",{error:y.message}),S.send(JSON.stringify({type:"error",message:y.message}));}},onClose:(k,S)=>{for(let[y,x]of i.entries())if(x===S){i.delete(y);let I=c.get(y);if(I){for(let P of I.subscribedSessions){let T=u.get(P);T&&(T.delete(y),T.size===0&&u.delete(P));}c.delete(y);}an.info("WebSocket client disconnected",{clientId:y});break}},onError:(k,S)=>{an.error("WebSocket error",{error:k.type});}},b=createServer$1({port:o,hostname:s,routes:[{method:"get",path:"/health",handler:k=>k.json({status:"healthy",channel:"websocket",clients:i.size,subscriptions:u.size,timestamp:Date.now()})},{method:"post",path:"/initialize",handler:async k=>{let y=(await k.req.json().catch(()=>({})))?.protocolVersion??1,x=await t.initialize({protocolVersion:y,clientCapabilities:{}});return k.json(x)}},{method:"post",path:"/session",handler:async k=>{let y=(await k.req.json().catch(()=>({})))?.title??"New Session",x=await t.newSession({cwd:process.cwd(),mcpServers:[]});return k.json({data:{id:x.sessionId},title:y})}},{method:"post",path:"/session/:sessionId/prompt",handler:async k=>{let S=k.req.param("sessionId"),x=(await k.req.json().catch(()=>({})))?.parts,I=Array.isArray(x)?x.filter(T=>T?.type==="text").map(T=>({type:"text",text:T.text??""})):[];if(I.length===0||I.every(T=>!T.text.trim()))return k.json({error:"No prompt provided"},400);if(!S)return k.json({error:"No sessionId provided"},400);let P=await t.processMessage(S,{sessionID:S,parts:I});return k.status(202),k.json({success:true,result:P})}},{method:"get",path:"/status",handler:k=>k.json({status:"running",channel:"websocket",port:e.port,hostname:e.hostname,clients:i.size,subscriptions:u.size,uptime:process.uptime()})},{method:"get",path:"/subscriptions",handler:k=>k.json({clients:i.size,sessions:Object.fromEntries(Array.from(u.entries()).map(([S,y])=>[S,y.size]))})}],timeout:e.timeout,cors:true}),v=b.raw;if(v){let k=new WebSocketServer({noServer:true});v.on("upgrade",(S,y,x)=>{try{let P=new URL(S.url||"/",`http://${S.headers.host}`).pathname;(P===r||r==="/"&&(P==="/"||P===""))&&k.handleUpgrade(S,y,x,T=>{g.onOpen?.({type:"open"},T),T.on("message",M=>{g.onMessage?.({data:M},T);}),T.on("close",(M,j)=>{g.onClose?.({code:M,reason:j},T);}),T.on("error",M=>{g.onError?.({type:"error",message:M.message},T);});});}catch{}});}return an.info("WebSocket server started",{url:e.ws?.url||`ws://${s}:${o}`,path:r}),{server:b,stop:async()=>{an.info("Stopping WebSocket server"),clearInterval(p),h(),i.forEach(k=>{k.close(1e3,"Server shutting down");}),i.clear(),c.clear(),u.clear(),l.clear(),await b.stop(),an.info("WebSocket server stopped");}}}function Dg(t,e){for(let[n,o]of e.entries())if(o===t)return n;return null}var fl=a.create({service:"acp-server"});async function Rg(t,e){let n=Pg(kg(e||{}));fl.info("Starting ACPServer",{channel:n.channel,port:n.port,hostname:n.hostname});let o,s;switch(n.channel){case hn.STDIO:({server:o,stop:s}=await Eg(t,n));break;case hn.HTTP:({server:o,stop:s}=await Tg(t,n));break;case hn.WEBSOCKET:({server:o,stop:s}=await Ag(t,n));break;default:throw new Error(`Unsupported service mode: ${n.channel}`)}let r={type:n.channel,server:o,agent:t,stop:async()=>{fl.info("Stopping ACPServer",{type:n.channel}),await s();},healthCheck:async()=>{if(typeof o=="object"&&o!==null&&"healthCheck"in o){let i=o.healthCheck;if(typeof i=="function")return i()}return true}};return fl.info("ACPServer started successfully",{type:r.type,url:JS(n)}),r}function JS(t){switch(t.channel){case hn.STDIO:return "stdio://process";case hn.HTTP:return `http://${t.hostname}:${t.port}`;case hn.WEBSOCKET:return `ws://${t.hostname}:${t.port}`;default:return "unknown://"}}async function YS(t){await Promise.all(t.map(async e=>{try{await e.stop();}catch(n){fl.error("Error stopping server",{type:e.type,error:String(n)});}}));}async function _g(t){await YS([t]);}var ot=a.create({service:"easbot-agent"}),ga=class t extends fa{constructor(n,o){super(n,o);b$1(this,"localEventBus");b$1(this,"sdkEventBridge",null);b$1(this,"acpEventBridge",null);b$1(this,"enableSdkEventBridge");b$1(this,"eventHandlers",new Map);b$1(this,"eventDispatchers",new Map);b$1(this,"server",null);b$1(this,"isAgentInitialized",false);b$1(this,"handlersRegistered",false);this.localEventBus=new ca,this.enableSdkEventBridge=o.enableSdkEventBridge??true,ot.info("EasBotAgent instance created",{serviceMode:this.serviceMode,enableSdkEventBridge:this.enableSdkEventBridge});}static async create(n){ot.info("creating EasBotAgent",{serviceMode:n.serviceMode});let o=n.serviceMode==="local",s=new t(void 0,n),r=s.getDuplexExecutor();if(r&&r.setAgent(s),o&&n.localStream){let{stream:i}=n.localStream,c={initialize:async l=>s.initialize(l),newSession:async l=>s.newSession(l),loadSession:async l=>s.loadSession(l),prompt:async l=>s.prompt(l),cancel:async l=>s.cancel(l),authenticate:async l=>s.authenticate(l),setSessionMode:async l=>s.setSessionMode(l),setSessionConfigOption:async l=>s.setSessionConfigOption(l),unstable_setSessionModel:async l=>s.unstable_setSessionModel(l),listSessions:async l=>s.listSessions(l),unstable_forkSession:async l=>s.unstable_forkSession(l),resumeSession:async l=>s.resumeSession(l),closeSession:async l=>s.closeSession(l)},u=new AgentSideConnection(()=>c,i);s.setConnection(u);}return ot.info("EasBotAgent created successfully",{serviceMode:n.serviceMode,hasConnection:o&&!!n.localStream}),s}async initialize(n){return ot.info("ACP initialize requested",{protocolVersion:n.protocolVersion}),this.isAgentInitialized||await this.initializeAgent(),{protocolVersion:n.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){ot.warn("EasBotAgent already initialized");return}ot.info("initializing EasBotAgent internals");try{await this.initializeExecutor();let n=this.config;n.channel?.type==="local"?await this.initializeAcpEventBridge():this.enableSdkEventBridge&&await this.initializeSdkEventBridge(),(n.eventSubscription?.autoSubscribe??!0)&&this.registerDefaultEventHandlers();let r=n.eventSubscription?.handlers;if(r)for(let[i,c]of Object.entries(r))c&&this.registerEventHandler(i,c);this.isAgentInitialized=!0,this.setStatus("ready"),ot.info("EasBotAgent internals initialized successfully");}catch(n){throw this.setStatus("error"),ot.error("failed to initialize EasBotAgent",{error:String(n)}),n}}async start(){if(this.status==="running"){ot.warn("EasBotAgent already running");return}this.isAgentInitialized||await this.initializeAgent();let n=this.config;n.acpServerConfig&&!this.server&&(this.server=await Rg(this,n.acpServerConfig)),this.setStatus("running"),ot.info("EasBotAgent started");}async stop(){if(this.status==="stopped"){ot.warn("EasBotAgent already stopped");return}ot.info("stopping EasBotAgent");try{this.server&&(await _g(this.server),this.server=null),this.sdkEventBridge&&(await this.sdkEventBridge.stop(),this.sdkEventBridge=null),this.acpEventBridge&&(await this.acpEventBridge.stop(),this.acpEventBridge=null),this.unregisterAllEventHandlers(),this.localEventBus.destroy(),await this.dispose(),this.setStatus("stopped"),this.isAgentInitialized=!1,ot.info("EasBotAgent stopped successfully");}catch(n){throw this.setStatus("error"),ot.error("error stopping EasBotAgent",{error:String(n)}),n}}getLocalEventBus(){return this.localEventBus}subscribeLocalEvents(n){return this.localEventBus.subscribeAll(n)}async publishLocalEvent(n){await this.localEventBus.publish(n);}async initializeSdkEventBridge(){if(this.sdkEventBridge){ot.warn("SDK event bridge already initialized");return}let n=this.config.acp?.sdk;if(!n){ot.warn("Cannot initialize SDK event bridge: missing SDK client");return}let o=s=>{let r=!!this.sessionManager.tryGet(s),i=!!this.connectionRegistry?.resolve(s);return r||i};this.sdkEventBridge=new la(n,this.localEventBus,o),await this.sdkEventBridge.start(),ot.info("SDK event bridge initialized");}async initializeAcpEventBridge(){if(this.acpEventBridge){ot.warn("ACP event bridge already initialized");return}let o=this.config.acp?.sdk,s=this.getConnection();if(!o)throw ot.error("Cannot initialize ACP event bridge: missing SDK client"),new Error("SDK client is required for ACP event bridge");if(!s)throw ot.error("Cannot initialize ACP event bridge: missing ACP connection"),new Error("ACP connection is required for ACP event bridge");this.acpEventBridge=new pa(o,s,this.localEventBus),this.acpEventBridge.setService(this),await this.acpEventBridge.start(),ot.info("ACP event bridge initialized");}async processMessage(n,o){ot.debug("Processing message",{sessionId:n,messageType:typeof o});let s=await this.config.acp.sdk.session.prompt(o);return ot.debug("Message processed",{sessionId:n}),s.data}getServiceMode(){return this.serviceMode}getServerInstance(){return this.server}registerEventHandler(n,o){let s=this.eventHandlers.get(n)??[];return s.push(o),this.eventHandlers.set(n,s),this.ensureEventDispatcher(n),ot.debug("event handler registered",{eventType:n}),()=>{this.unregisterEventHandler(n,o);}}unregisterEventHandler(n,o){let s=this.eventHandlers.get(n);if(s){let r=s.indexOf(o);r!==-1&&s.splice(r,1),s.length===0&&(this.eventHandlers.delete(n),this.removeEventDispatcher(n));}ot.debug("event handler unregistered",{eventType:n});}async publishEvent(n){let o={type:"agent.status",properties:{agentId:"easbot-agent",status:"busy",timestamp:Date.now()}};await this.localEventBus.publish(o),ot.debug("Event published",{type:n.type});}registerDefaultEventHandlers(){let n=["usage_update","message_start","message_end","tool_use"];for(let o of n)this.ensureEventDispatcher(o);this.subscribeLocalEvents(async o=>{if(o.type==="sdk.session_deleted"){let r=o.properties.sessionId;ot.info("Handling SDK session deleted",{sessionId:r}),this.sessionManager.tryGet(r)&&(this.sessionManager.close(r),ot.debug("Cleaned up session from sessionManager",{sessionId:r}));}}),this.handlersRegistered=true,ot.debug("default event handlers registered",{events:n});}async handleAgentEvent(n){let o=[...this.eventHandlers.get(n.type)??[]];for(let s of o)try{await s(n);}catch(r){ot.error("event handler error",{eventType:n.type,error:String(r)});}}unregisterAllEventHandlers(){this.eventHandlers.clear(),this.eventDispatchers.clear(),this.handlersRegistered=false,ot.debug("all event handlers unregistered");}ensureEventDispatcher(n){if(this.eventDispatchers.has(n))return;let o=async s=>{await this.handleAgentEvent(s);};this.eventDispatchers.set(n,o),ot.debug("Event dispatcher ensured",{eventType:n});}removeEventDispatcher(n){this.eventDispatchers.get(n)&&(this.eventDispatchers.delete(n),ot.debug("Event dispatcher removed",{eventType:n}));}};var Qs=class t extends Error{constructor(n,o,s){super(n);b$1(this,"type");b$1(this,"stage");b$1(this,"cause");this.type="AdapterEnvironmentInitializationError",this.stage=o,this.cause=s,Error.captureStackTrace&&Error.captureStackTrace(this,t);}},ri=a.create({service:"adapter.bootstrap"}),Qu;function ZS(){return Qu||(Qu=A.state(async()=>({initialized:false,initPromise:null,instancePromise:null,handlersInstalled:false,directory:".easbot",sdk:null,activeChannel:null,agent:null,executor:null,acpConnection:null,connectionRegistry:null}),async t=>{let e=t.agent;e&&await e.stop().catch(()=>{});let n=t.executor;n&&await n.close().catch(()=>{}),t.executor=null,t.agent=null,t.sdk=null,t.acpConnection=null,t.connectionRegistry=null;})),Qu}async function Hn(){return ZS()()}function Mg(t){let e=["ECONNRESET","EPIPE","ETIMEDOUT","ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","ENETUNREACH"],n=t.code;return e.includes(n??"")}function eC(t){t.handlersInstalled||(process.on("unhandledRejection",e=>{let n=e instanceof Error?e:new Error(String(e));Mg(n)||ri.error("unhandled promise rejection",{error:n.message,stack:n.stack});}),process.on("uncaughtException",e=>{Mg(e)||(ri.error("uncaught exception",{error:e.message,stack:e.stack}),process.exit(1));}),t.handlersInstalled=true);}async function tC(t){return t.instancePromise||(t.instancePromise=A.provide({directory:t.directory,init:Ks,fn:async()=>{ri.debug("instance bootstrap completed");}}).then(()=>{})),t.instancePromise}async function nC(){try{await A.dispose(),ri.debug("instance disposed");}catch(t){ri.warn("failed to dispose instance",{error:t instanceof Error?t.message:String(t)});}}var Xu;(w=>{function t(g,b){return g.sdk||(g.sdk=gl({directory:b})),g.sdk}function e(g){switch(g){case "http":return "http";case "stdio":return "stdio";case "local":return "local";case "websocket":return "websocket";default:return "stdio"}}async function n(g){let b=await Hn();if(b.initialized)return;if(b.initPromise)return b.initPromise;let v={directory:g?.directory??".easbot",initModels:g?.initModels??true,printLogs:g?.printLogs??false,logLevel:g?.logLevel??"INFO",channel:g?.channel??"stdio"};if(b.directory=v.directory,t(b,b.directory),b.activeChannel&&b.activeChannel!==v.channel)throw new Error(`Adapter already initialized with channel ${b.activeChannel}, cannot re-init with ${v.channel}`);return b.activeChannel=v.channel,b.initPromise=(async()=>{try{await a$1.init();}catch(k){throw new Qs("Failed to initialize global directories","global",k instanceof Error?k:void 0)}try{await a.init({logDir:a$1.Path.log,print:v.printLogs,level:v.logLevel});}catch(k){throw new Qs("Failed to initialize log infrastructure","log",k instanceof Error?k:void 0)}if(v.initModels)try{b$4();}catch(k){throw new Qs("Failed to initialize models refresh","models",k instanceof Error?k:void 0)}try{eC(b);}catch(k){throw new Qs("Failed to install unhandled exception handlers","handlers",k instanceof Error?k:void 0)}try{await tC(b);}catch(k){throw new Qs("Failed to initialize instance","instance",k instanceof Error?k:void 0)}b.initialized=true;})(),b.initPromise}w.init=n;async function o(){let g=await Hn();g.initialized&&(g.agent&&(await g.agent.stop().catch(()=>{}),g.agent=null),g.executor&&(await g.executor.close().catch(()=>{}),g.executor=null),await nC(),await a.close(),g.initialized=false,g.initPromise=null,g.instancePromise=null,g.activeChannel=null,g.sdk=null,g.agent=null,g.executor=null,g.acpConnection=null);}w.destroy=o;async function s(){return (await Hn()).initialized}w.isInitialized=s;async function r(g){let b=await Hn();b.agent=g;}w.setAgent=r;async function i(){return (await Hn()).agent}w.getAgent=i;async function c(){return (await Hn()).executor}w.getExecutor=c;async function u(){let b=(await Hn()).agent?.getServerInstance();return b||null}w.getServer=u;async function l(){return (await Hn()).sdk}w.getSDK=l;async function f(){return (await Hn()).connectionRegistry}w.getConnectionRegistry=f;async function m(){return (await Hn()).acpConnection}w.getACPConnection=m;async function a$2(g){let b=await Hn();b.connectionRegistry=g;}w.setConnectionRegistry=a$2;async function p(){let g=await Hn(),b=!!g.agent?.getServerInstance();return {initialized:g.initialized,directory:g.directory,activeChannel:g.activeChannel,hasSDK:!!g.sdk,hasAgent:!!g.agent,hasExecutor:!!g.executor,hasACPConnection:!!g.acpConnection,hasServer:b}}w.getState=p;async function d(g){await n({channel:g.channel,directory:g.directory});let b=await Hn(),v=t(b,b.directory);if(g.channel==="local")return h({directory:g.directory});if(b.agent?.getServerInstance()&&b.activeChannel&&b.activeChannel!==g.channel)throw new Error(`ACP service already started with channel ${b.activeChannel}, cannot switch to ${g.channel}`);if(b.agent&&b.executor){let P=b.agent.getServerInstance();if(P)return {sdk:v,agent:b.agent,executor:b.executor,server:P}}let S=await Vo.create(),y=await ga.create({serviceMode:e(g.channel),connectionRegistry:S,acp:{sdk:v},acpServerConfig:g,channel:{type:g.channel,timeout:g.timeout},eventSubscription:{autoSubscribe:true}});await y.start();let x=y.getServerInstance();if(!x)throw new Error("ACP server failed to start");let I=y.getDuplexExecutor();if(!I)throw new Error("Failed to get duplex executor from agent");return b.agent=y,b.executor=I,b.activeChannel=g.channel,b.connectionRegistry=S,{sdk:v,agent:y,executor:I,server:x}}w.ensureACPService=d;async function h(g){await n({channel:"local",directory:g.directory});let b=await Hn(),v=t(b,b.directory);if(b.agent&&b.executor)return {sdk:v,agent:b.agent,executor:b.executor};let k=new WritableStream({write(T){return new Promise((M,j)=>{try{process.stdout.write(T)?M():process.stdout.once("drain",M);}catch(N){let K=N;K.code==="EPIPE"||K.code==="EIO"?j(new Error("stdout pipe broken")):j(N);}})}}),S=new ReadableStream({start(T){process.stdin.on("data",M=>{T.enqueue(new Uint8Array(M));}),process.stdin.on("end",()=>T.close()),process.stdin.on("error",M=>T.error(M));}}),y=ndJsonStream(k,S),x=await Vo.create(),I=await ga.create({serviceMode:"local",connectionRegistry:x,acp:{sdk:v},channel:{type:"local",timeout:6e4},eventSubscription:{autoSubscribe:true},localStream:{stream:y}});b.acpConnection=I.getConnection()??null,await I.start();let P=I.getDuplexExecutor();if(!P)throw new Error("Failed to get duplex executor from agent");return b.agent=I,b.executor=P,b.activeChannel="local",b.connectionRegistry=x,ri.info("Local ACP service started, waiting for client..."),process.stdin.resume(),{sdk:v,agent:I,executor:P}}w.ensureACPServiceLocal=h;})(Xu||(Xu={}));var Zu=Xu;var en=a.create({service:"agent-client-api"}),hl=null;async function Lo(t){en.debug("getRegistry called",{directory:t});let e=await Zu.getConnectionRegistry();return e?(en.debug("getRegistry: got registry from AdapterBootstrap"),e):hl?(en.debug("getRegistry: got registry from localRegistry"),hl):(hl=await Vo.create(),hl)}function oC(t){return t==="stdio"||t==="http"||t==="websocket"?t:"http"}var _t;(g=>{async function t(b,v){en.debug("connect called",{args:b,context:v});let k=await Lo(v.directory),S=await Ee(()=>Qo.getConfig(),"AGENT_CLIENT_CONFIG_ERROR",v||{directory:A.directory}).catch(()=>{}),y=S?.acp?.server?.agentId,x=b.agentId;x||(x=(await(await Jr()).getServiceByUrl(b.baseUrl))?.agentId);let I;if(b.baseUrl.startsWith("ws://")||b.baseUrl.startsWith("wss://")?I="websocket":b.baseUrl.startsWith("http://")||b.baseUrl.startsWith("https://")?I="http":I=oC(S?.acp?.server?.channel),en.debug("connect resolved",{baseUrl:b.baseUrl,resolvedChannel:I,localAgentId:y,remoteAgentId:x}),y){let te=k.getConnectionsByPeer(y).find(U=>U.baseUrl===b.baseUrl);if(te){if(en.debug("connect: found existing connection by agent"),te.channel&&te.channel!==I)throw new Error(`Channel mismatch for agent ${y}: ${te.channel} != ${I}`);return {reused:true,...te,channel:te.channel??I}}}let P=k.getConnectionsByService(b.baseUrl);if(P.length>0){let te=P[0];if(en.debug("connect: found existing connection by service",{existing:te}),te.channel&&te.channel!==I)throw new Error(`Channel mismatch for service ${b.baseUrl}: ${te.channel} != ${I}`);return {reused:true,connectionId:te.connectionId,sessionId:te.sessionId,remoteAgentId:te.remoteAgentId,baseUrl:te.baseUrl,channel:te.channel??I}}let T=y??"local-unknown",M=x??`remote-${Buffer.from(b.baseUrl).toString("base64").slice(0,16)}`;en.debug("connect: using effective agent IDs",{effectiveLocalAgentId:T,effectiveRemoteAgentId:M});let j;if(I==="stdio"){let te=await Ee(()=>Zu.getAgent(),"AGENT_CLIENT_GET_AGENT_ERROR",v).catch(()=>{});if(!te)throw new Error("EasBotAgent not initialized for stdio channel; cannot create session automatically.");let U=await te.newSession({cwd:process.cwd(),mcpServers:[]});j={baseUrl:b.baseUrl,sessionID:U.sessionId,channel:I};}else {en.debug("connect: calling AgentClientService.connect",{baseUrl:b.baseUrl,channel:I});try{j=await ws.connect({baseUrl:b.baseUrl,sessionId:void 0,channel:I}),en.debug("connect: AgentClientService.connect succeeded",{remote:j});}catch(te){throw en.error("connect: AgentClientService.connect failed",{error:te.message,stack:te.stack}),te}}en.debug("connect: creating connection in registry",{baseUrl:j.baseUrl,localAgentId:T,remoteAgentId:M,sessionId:j.sessionID});let N=k.connect(j.baseUrl,T,M,j.sessionID,b.sessionId),K=k.resolve(N.connectionId);return K&&(K.channel=j.channel??I),en.debug("connect: completed",{result:N}),{created:true,connectionId:N.connectionId,sessionId:N.sessionId,remoteAgentId:N.remoteAgentId,baseUrl:N.baseUrl,channel:j.channel??I}}g.connect=t;async function e(b,v){return (await Lo(v.directory)).getConnectionsByPeer(b.agentId??"").filter(S=>!b.baseUrl||S.baseUrl===b.baseUrl)}g.list=e;async function n(b,v,k){let y=(await Lo(k.directory)).resolve(b);if(!y)throw new Error("Connection not found");let x=y.channel??"http";en.debug("send: using remote sessionId",{connectionId:b,sessionId:y.sessionId,channel:x,baseUrl:y.baseUrl,partsCount:v.parts?.length??0}),await ws.send(y.baseUrl,x,v),y.updatedAt=Date.now();}g.send=n;async function o(b,v){let S=(await Lo(v.directory)).resolve(b);if(!S)throw new Error("Connection not found");let y=S.channel??"http";return ws.capabilities(S.baseUrl,y)}g.capabilities=o;async function s(b,v){(await Lo(v.directory)).closeConnection(b);}g.close=s;async function r(b,v){let S=(await Lo(v.directory)).resolve(b);return S?{connectionId:S.connectionId,remoteAgentId:S.remoteAgentId,baseUrl:S.baseUrl,sessionId:S.sessionId,status:S.status,updatedAt:S.updatedAt}:{connectionId:b,status:"unknown"}}g.status=r;async function i(b){let v=await Lo(b.directory);return {config:(await Ee(()=>Qo.getConfig(),"AGENT_CLIENT_CONFIG_ERROR",b).catch(()=>{}))?.acp,managedConnections:v.getAllActiveConnections().length}}g.config=i;async function c(b){return (await Jr()).listServices(b)}g.listServices=c;async function u(b){return (await Jr()).getService(b)}g.getService=u;async function l(b){return (await Jr()).registerService(b)}g.registerService=l;async function f(b,v,k,S){let x=(await Lo(k.directory)).resolve(b);if(!x)throw new Error("Connection not found");let I={...ys,...S},P=x.channel??"http";switch(P){case "websocket":return m(x,I,v);case "http":return a(x,I,v);case "stdio":return p(x,I,v);default:throw new Error(`Unsupported channel type: ${P}`)}}g.subscribe=f;async function m(b,v,k){en.debug("subscribeViaWebSocket: connecting",{baseUrl:b.baseUrl,sessionId:b.sessionId,connectionId:b.connectionId});let S=Su(),y=jo(b.baseUrl);return en.debug("subscribeViaWebSocket: WebSocket URL resolved",{wsUrl:y}),await S.connect(y),en.debug("subscribeViaWebSocket: connected, subscribing to session",{sessionId:b.sessionId}),S.subscribe(b.sessionId,v,k)}async function a(b,v,k,S){return jf().subscribe({baseUrl:b.baseUrl,sessionId:b.sessionId},v,k,S)}async function p(b,v,k,S,y){let x=na();await x.connect({baseUrl:b.baseUrl,sessionId:b.sessionId});let I=await x.subscribe(v,k,S);return ()=>{I(),x.disconnect();}}async function d(b,v){let S=(await Lo(v.directory)).resolve(b);if(!S)throw new Error("Connection not found");let y=S.channel??"http";await ws.interrupt(S.baseUrl,y,S.sessionId),en.debug("Interrupt sent via AgentClientService",{connectionId:b,sessionId:S.sessionId});}g.interrupt=d;async function h(b,v,k,S,y){return await n(b,v,S),f(b,k,S,y)}g.exchangeSubscribe=h;async function w(b,v){let S=(await Lo(v.directory)).resolve(b);if(!S){en.warn("Connection not found for releaseSubscription",{connectionId:b});return}let{baseUrl:y,channel:x,sessionId:I}=S,P=x??"http";await ws.releaseSubscription(y,P,I),en.debug("Subscription released via AgentClientService",{connectionId:b,sessionId:I});}g.releaseSubscription=w;})(_t||(_t={}));var ep=a.create({service:"api"}),yl=class extends Error{constructor(n,o,s){super(n);b$1(this,"code",o);b$1(this,"details",s);this.name="ApiError";}};async function Ee(t,e,n){try{n&&ep.debug(`API call started: ${JSON.stringify(n)}`,{errorCode:e});let o=await A.provide({directory:n?.directory??A.directory,init:void 0,fn:t});return n&&ep.debug(`API call completed: ${JSON.stringify(n)}`,{errorCode:e}),o}catch(o){let s=o instanceof Error?o.message:String(o),r=o instanceof Error?o.name:"Error",i=o instanceof Error?o.stack:void 0;throw ep.error(`API call failed: ${n||e}`,{errorCode:e,errorName:r,error:s,stack:i}),o instanceof yl?o:new yl(s,e,o)}}var Xo=a.create({service:"subagent.remote"}),bl=class{constructor(){b$1(this,"connectionId",null);b$1(this,"config",null);b$1(this,"_isRunning",false);b$1(this,"pendingResolve",null);b$1(this,"pendingReject",null);b$1(this,"unsubscribeFn",null);b$1(this,"responseText","");b$1(this,"toolCalls",[]);b$1(this,"completionPromise",null);}async start(e){if(this.config=e,!e.uri)throw new Error("Remote agent URI is required");Xo.debug("RemoteAgentHandler.start",{uri:e.uri,name:e.name});let n=await _t.connect({baseUrl:e.uri},{directory:e.cwd??process.cwd()});this.connectionId=n.connectionId,this._isRunning=true,Xo.info("Remote agent connected",{connectionId:this.connectionId,uri:e.uri,name:e.name});}async stop(){if(Xo.debug("RemoteAgentHandler.stop",{connectionId:this.connectionId}),this.unsubscribeFn&&(this.unsubscribeFn(),this.unsubscribeFn=null),this.connectionId){try{await _t.close(this.connectionId,{directory:this.config?.cwd??process.cwd()});}catch(e){Xo.warn("Error closing connection",{error:String(e)});}this.connectionId=null;}this._isRunning=false,this.reset();}async execute(e){if(!this.connectionId)throw new Error("Remote agent not connected");let n={directory:this.config?.cwd??process.cwd()};Xo.debug("RemoteAgentHandler.execute",{title:e.title,agent:e.agent,partsCount:e.parts?.length??1}),this.reset(),this.completionPromise=new Promise((o,s)=>{this.pendingResolve=o,this.pendingReject=s;});try{this.unsubscribeFn=await _t.exchangeSubscribe(this.connectionId,{sessionID:"",parts:e.parts??[{type:"text",text:e.title}]},s=>this.handleMessage(s),n);let o=await this.completionPromise;return Xo.debug("RemoteAgentHandler.execute completed",{title:e.title,hasText:!!o.text,textLength:o.text?.length??0,toolsCount:o.tools?.length??0}),{title:e.title,output:o.text??"",metadata:{connectionId:this.connectionId,agent:e.agent,sessionId:o.metadata?.sessionId,messageId:o.metadata?.messageId,tokens:o.metadata?.tokens,error:o.metadata?.error}}}catch(o){throw Xo.error("RemoteAgentHandler.execute failed",{title:e.title,error:String(o)}),o}finally{this.unsubscribeFn=null;}}async interrupt(){this.connectionId&&(Xo.debug("RemoteAgentHandler.interrupt",{connectionId:this.connectionId}),await _t.interrupt(this.connectionId,{directory:this.config?.cwd??process.cwd()}));}isRunning(){return this._isRunning}handleMessage(e){Xo.debug("RemoteAgentHandler.handleMessage",{role:e.role,hasText:!!e.text,textLength:e.text?.length??0,hasTools:!!e.tools,toolsCount:e.tools?.length??0}),this.responseText=e.text??"",this.toolCalls=e.tools??[],this.pendingResolve&&(this.pendingResolve(e),this.pendingResolve=null,this.pendingReject=null);}reset(){this.responseText="",this.toolCalls=[],this.pendingResolve=null,this.pendingReject=null,this.completionPromise=null;}};var wl=a.create({service:"subagent.cli"}),xl=class{constructor(){b$1(this,"process",null);b$1(this,"config",null);b$1(this,"_isRunning",false);b$1(this,"abortController",null);}async start(e){this.config=e,this._isRunning=true,wl.debug("CLIAgentHandler.start",{command:e.command});}async stop(){if(this.abortController&&this.abortController.abort(),this.process){let e=this.process;this.process=null,this.abortController=null;let n=setTimeout(()=>{try{e.kill("SIGKILL");}catch{}},3e3);try{await e.exited;}catch{try{e.kill("SIGKILL");}catch{}await e.exited.catch(()=>{});}clearTimeout(n);}this._isRunning=false;}async execute(e){if(!this.config?.command)throw new Error("CLI command not configured");wl.debug("CLIAgentHandler.execute",{title:e.title,command:this.config.command});let n=this.buildArgs(e),o=this.config.command,s=this.config.cwd,r=this.config.env,i=this.config.timeout??3e5,c={...process.env,...r};this.abortController=new AbortController;let u=process.platform==="win32"?"cmd":void 0;this.process=Shell.spawn(u,`${o} ${n.join(" ")}`,{cwd:s,env:c,stdout:"pipe",stderr:"pipe",stdin:"null",timeout:i,signal:this.abortController.signal});let l="",f="";this.process.stdout?.on("data",a=>{l+=a.toString("utf-8");}),this.process.stderr?.on("data",a=>{f+=a.toString("utf-8");});let m=this.process;this.process=null;try{let a=await m.exited;if(a===0)return {title:e.title,output:l.trim(),metadata:{command:o,args:n,exitCode:a}};throw wl.error("CLI exited with error",{code:a,stderr:f}),new Error(`CLI exited with code ${a}: ${f}`)}catch(a){let p=a;throw wl.error("CLI process error",{error:p.message}),a}finally{if(m){try{m.kill("SIGKILL");}catch{}m.exited.catch(()=>{});}}}async interrupt(){this.abortController&&this.abortController.abort();}isRunning(){return this._isRunning}buildArgs(e){let n=[...this.config?.args??[]],o=e.parts?.filter(s=>s.type==="text").map(s=>s.text).join(`
291
+ `)??e.title;return n.push("--prompt",o),n}};var Xs=a.create({service:"subagent.registry"}),Il=class{constructor(e){b$1(this,"instances",new Map);b$1(this,"handlers",new Map);b$1(this,"config");b$1(this,"agentCounts",new Map);this.config=e;}async spawn(e){let n=Identifier.ascending("subagent"),o={id:n,config:e,status:"starting",createdAt:Date.now(),lastActiveAt:Date.now()},s=this.createHandler(e);this.handlers.set(n,s),this.instances.set(n,o);try{return await s.start(e),o.status="idle",this.agentCounts.set(e.name,(this.agentCounts.get(e.name)??0)+1),Xs.info("Agent spawned",{id:n,name:e.name,status:o.status}),o}catch(r){throw o.status="error",o.error=String(r),this.handlers.delete(n),this.instances.delete(n),Xs.error("Failed to spawn agent, cleaned up",{id:n,name:e.name,error:String(r)}),r}}createHandler(e){let n=e.runMode==="ephemeral";switch(e.transport){case "stdio":return new Wc(n);case "http":case "websocket":return new bl;case "cli":return new xl;default:throw new Error(`Unknown transport type: ${e.transport}`)}}async acquire(e){let n=this.findIdleInstance(e.name);if(!n){let s=this.agentCounts.get(e.name)??0,r=e.maxConcurrent??this.config.maxConcurrent;s<r?n=await this.spawn(e):(Xs.debug("Max concurrent reached, waiting for idle instance",{name:e.name,currentCount:s,maxConcurrent:r}),n=await this.waitForIdleInstance(e.name));}n.status="running",n.lastActiveAt=Date.now();let o=this.handlers.get(n.id);if(!o)throw new Error(`Handler not found for instance: ${n.id}`);return {instance:n,execute:async s=>{n.status="busy";try{let r=await o.execute(s);return n.status="idle",n.lastActiveAt=Date.now(),r}catch(r){throw n.status="error",r}},interrupt:()=>o.interrupt()}}async release(e,n){n==="ephemeral"?await this.terminate(e.id):(e.status="idle",Xs.debug("Agent released to pool",{id:e.id,name:e.config.name}));}async terminate(e){let n=this.handlers.get(e),o=this.instances.get(e);if(this.handlers.delete(e),n)try{await n.stop();}catch(s){Xs.warn("Error stopping agent",{id:e,error:String(s)});}if(o){let s=this.agentCounts.get(o.config.name)??0;s>0&&this.agentCounts.set(o.config.name,s-1),o.status="stopped",this.instances.delete(e);}Xs.info("Agent terminated",{id:e});}async shutdownAll(){let e=Array.from(this.instances.keys());await Promise.all(e.map(n=>this.terminate(n))),Xs.info("All agents shut down",{count:e.length});}list(){return Array.from(this.instances.values())}get(e){return this.instances.get(e)}findIdleInstance(e){for(let n of this.instances.values())if(n.config.name===e&&n.status==="idle")return n}async waitForIdleInstance(e,n=6e4){let o=Date.now();for(;Date.now()-o<n;){let s=this.findIdleInstance(e);if(s)return s;await new Promise(r=>setTimeout(r,1e3));}throw new Error(`Timeout waiting for idle ${e} agent`)}};var Sn=a.create({service:"subagent"});function Og(t,e){return e?{...t,...e}:t}var Zs;(g=>{let t,e;function n(){return t||(t=A.state(async()=>{try{let b=await o();if(!b.enabled)return Sn.debug("SubAgent system disabled"),{registry:null,config:b,initialized:!0};let v=new Il(b),k=b.agents.filter(S=>S.runMode==="persistent");for(let S of k)try{await v.spawn(S),Sn.info("Persistent agent spawned",{name:S.name});}catch(y){Sn.error("Failed to spawn persistent agent",{name:S.name,error:String(y)});}return Sn.info("SubAgent system initialized",{totalAgents:b.agents.length,persistentAgents:k.length}),{registry:v,config:b,initialized:!0}}catch(b){return e=b instanceof Error?b:new Error(String(b)),Sn.error("SubAgent system initialization failed, continuing without SubAgent",{error:e.message}),{registry:null,config:{enabled:false,defaultRunMode:"ephemeral",timeout:3e5,maxConcurrent:5,agents:[]},initialized:false,initError:e}}},async b=>{b?.registry&&await b.registry.shutdownAll();})),t}async function o(){let b=await Or();if(!b.enabled)return {enabled:false,defaultRunMode:"ephemeral",timeout:3e5,maxConcurrent:5,agents:[]};let k=b.defaultRunMode==="persistent"?"persistent":"ephemeral",S=b.timeout,y=b.maxConcurrent,x=b.agents.map(I=>({...I,transport:I.transport,runMode:I.runMode}));return {enabled:true,defaultRunMode:k,timeout:S,maxConcurrent:y,agents:x}}function s(){return n()()}g.state=s;async function r(){return (await s()).config?.enabled??false}g.isEnabled=r;async function i(){return (await s()).initialized}g.isInitialized=i;function c(){return e}g.getInitError=c;async function u(b){let v=await s();if(!v.config?.enabled)throw new Error("SubAgent system is disabled");let k=v.config.agents.find(x=>x.name===b.agent);if(!k)throw new Error(`Unknown agent: ${b.agent}`);let S=Og(k,b.config);if(Sn.debug("SubAgent.run started",{title:b.title,agent:b.agent,runMode:S.runMode,transport:S.transport}),!v.registry)throw new Error("SubAgent registry not initialized");let y=await v.registry.acquire(S);try{let x=await y.execute(b);return Sn.debug("SubAgent.run completed",{title:b.title,agent:b.agent,outputLength:x.output.length}),x}catch(x){if(Sn.error("SubAgent.run failed",{title:b.title,agent:b.agent,runMode:S.runMode,error:String(x)}),S.runMode==="persistent"){Sn.warn("Persistent agent failed, terminating instance",{id:y.instance.id,name:b.agent});try{await v.registry.terminate(y.instance.id);}catch(I){Sn.warn("Failed to terminate persistent agent",{id:y.instance.id,error:String(I)});}}throw x}finally{if(S.runMode==="ephemeral")try{await v.registry.release(y.instance,"ephemeral");}catch(x){Sn.warn("Failed to release ephemeral agent",{id:y.instance.id,error:String(x)});}}}g.run=u;async function l(b,v){let k=await s();if(!k.config?.enabled)throw new Error("SubAgent system is disabled");let S=k.config.agents.find(P=>P.name===b.agent);if(!S)throw new Error(`Unknown agent: ${b.agent}`);let y=Og(S,b.config);if(Sn.debug("SubAgent.runAsync started",{title:b.title,agent:b.agent,runMode:y.runMode,transport:y.transport}),!k.registry)throw new Error("SubAgent registry not initialized");let x=k.registry,I=await x.acquire(y);return I.execute(b).then(async P=>{Sn.debug("SubAgent.runAsync completed, triggering callback",{title:b.title,agent:b.agent,outputLength:P.output.length});try{await v(P);}finally{await x.release(I.instance,y.runMode);}}).catch(async P=>{Sn.error("SubAgent.runAsync failed",{title:b.title,agent:b.agent,error:String(P)});try{await v({title:b.title,output:`Error: ${P}`,metadata:{error:String(P)}});}finally{await x.release(I.instance,y.runMode);}}),I.instance.id}g.runAsync=l;async function f(){return (await s()).registry?.list()??[]}g.list=f;async function m(b){return (await s()).registry?.get(b)}g.get=m;async function a(b){let v=await s();v.registry&&await v.registry.terminate(b);}g.close=a;async function p(){let b=await s();b.registry&&await b.registry.shutdownAll();}g.closeAll=p;async function d(b){let v=await s();if(v.registry){let k=v.registry.get(b);k&&await(await v.registry.acquire(k.config)).interrupt();}}g.interrupt=d;async function h(b){let v=await s();v.config&&(v.config.agents.push(b),Sn.info("Agent registered",{name:b.name}));}g.register=h;async function w(b){let v=await s();if(v.config){let k=v.config.agents.findIndex(S=>S.name===b);k!==-1&&(v.config.agents.splice(k,1),Sn.info("Agent unregistered",{name:b}));}}g.unregister=w;})(Zs||(Zs={}));var jg=a.create({service:"hook.executor.agent"}),er=class er{constructor(){b$1(this,"type","agent");}static getInstance(){return er._instance||(er._instance=new er),er._instance}canExecute(e){return !e||typeof e!="object"?false:e.type==="agent"}async execute(e,n,o){let s=Date.now();try{jg.debug("Execute Agent Hook",{type:e.type,timeout:e.timeout,context:o?.sessionID});let r=await Zs.run({source:o?.sessionID??"",title:this.extractTitle(e.parts),agent:"default",system:e.system,parts:e.parts,model:e.model?{modelID:e.model,providerID:"default"}:void 0,syncMessages:!1});return {success:!0,modified:n.modified,input:n.input,output:r.output,duration:Date.now()-s}}catch(r){return jg.error("Agent Hook execution failed",{error:r?.message,stack:r?.stack}),{success:false,modified:false,error:r?.message??String(r),duration:Date.now()-s}}}extractTitle(e){if(!e||e.length===0)return "Agent Task";let n=e.find(o=>typeof o=="object"&&o!==null&&o.type==="text");return n&&typeof n.text=="string"?n.text.slice(0,50):"Agent Task"}};b$1(er,"_instance");var ha=er;var ks=class ks{constructor(){b$1(this,"executors",[]);}static getInstance(){return ks._instance||(ks._instance=new ks,ks._instance.registerDefaultExecutors()),ks._instance}registerDefaultExecutors(){this.register(Bc.getInstance()),this.register(Hc.getInstance()),this.register(ta.getInstance()),this.register(qc.getInstance()),this.register(ha.getInstance());}register(e){this.executors.push(e);}getExecutor(e){return this.executors.find(n=>n.canExecute(e))}async execute(e,n,o){let s=this.getExecutor(e);return s?s.execute(e,n,o):{success:false,modified:false,error:`No executor found for hook type: ${e.type}`}}};b$1(ks,"_instance");var ya=ks;var Ng=a.create({service:"hook.builtin.scheduler"});var tp=nn("scheduler.builtin",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.ScheduledTaskTrigger,handler:async(t,e)=>{let n=t;return Ng.info("Scheduled task trigger event received",{taskID:n.taskID,taskName:n.taskName,timestamp:n.timestamp}),{modified:false,input:t}}},{name:HookEvent.ScheduledTaskComplete,handler:(t,e)=>{let n=t;return Ng.info("Scheduled task complete event received",{taskID:n.taskID,timestamp:n.timestamp,success:n.success}),{modified:false,input:t}}}]}}});var Fg=a.create({service:"hook.builtin.context"}),np=nn("context.builtin",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.ContextBuildBefore,handler:(t,e)=>{let n=t;return Fg.debug("context.build.before hook triggered",{sessionID:n.sessionID,mode:n.mode}),{modified:false,input:t}}},{name:HookEvent.ContextBuildAfter,handler:(t,e)=>{let n=t;return Fg.debug("context.build.after hook triggered",{sessionID:n.context.metadata.sessionID}),{modified:false,input:t}}}]}}});var op=class extends Error{constructor(n,o){super(`Too many concurrent tasks: ${n} running, limit is ${o}`);b$1(this,"running");b$1(this,"limit");this.name="TaskConcurrencyError",this.running=n,this.limit=o;}},Bt;(k=>{let t=a.create({service:"task"});k.MAX_CONCURRENT_TASKS=5;async function n(S){let y=await o(S);if(y>=k.MAX_CONCURRENT_TASKS)throw new op(y,k.MAX_CONCURRENT_TASKS)}async function o(S){return (await w(S)).filter(x=>x.status==="running").length}k.getRunningCount=o;let s;async function r(){return Filesystem.normalize(ke__default.join(a$1.Path.data,"task"))}async function i(S){let y=await r();return Filesystem.normalize(ke__default.join(y,`${S}.json`))}async function c(S){let y=await i(S);try{let x=await Filesystem.readText(y);return x?JSON.parse(x):[]}catch{return []}}async function u(S,y){let x=await i(S);try{await Filesystem.write(x,JSON.stringify(y,null,2)),t.debug("Session tasks saved",{sessionId:S,count:y.length});}catch(I){t.error("Failed to save session tasks",{sessionId:S,error:String(I)});}}async function l(){let S=await r(),y=new Map;try{let x=await readdir(S);for(let I of x){if(!I.endsWith(".json"))continue;let P=I.replace(".json",""),T=await c(P);for(let M of T)y.set(M.taskId,M);}}catch(x){t.debug("Task directory not found or empty",{error:String(x)});}return y}function f(){return s||(s=A.state(async()=>{let S=await l();return t.debug("Task state initialized",{taskCount:S.size}),{tasks:S,initialized:true}},async()=>{})),s}function m(){return f()()}k.state=m;async function a$2(S){return (await m()).tasks.get(S)}k.get=a$2;async function p(S){await n(S.sessionId);let y=await m(),x=Date.now(),I={taskId:S.taskId,sessionId:S.sessionId,description:S.description,prompt:S.prompt,agentType:S.agentType,source:S.source||"tool",status:"pending",createdAt:x,updatedAt:x,metadata:S.metadata};y.tasks.set(S.taskId,I);let P=await c(S.sessionId);return P.push(I),await u(S.sessionId,P),t.debug("Task created",{taskId:S.taskId,sessionId:S.sessionId}),I}k.create=p;async function d(S,y){let x=await m(),I=x.tasks.get(S);if(!I){t.warn("Task not found for update",{taskId:S});return}y.status!==void 0&&(I.status=y.status),y.result!==void 0&&(I.result=y.result),y.error!==void 0&&(I.error=y.error),y.duration!==void 0&&(I.duration=y.duration),y.metadata!==void 0&&(I.metadata={...I.metadata,...y.metadata}),I.updatedAt=Date.now(),x.tasks.set(S,I);let P=await c(I.sessionId),T=P.findIndex(M=>M.taskId===S);T>=0?P[T]=I:P.push(I),await u(I.sessionId,P),t.debug("Task updated",{taskId:S,status:I.status});}k.update=d;async function h(S){let y=await m(),x=y.tasks.get(S);if(!x){t.warn("Task not found for remove",{taskId:S});return}let I=x.sessionId;y.tasks.delete(S);let T=(await c(I)).filter(M=>M.taskId!==S);await u(I,T),t.debug("Task removed",{taskId:S,sessionId:I});}k.remove=h;async function w(S){return c(S)}k.list=w;async function g(S){return (await w(S)).filter(x=>x.status==="running"||x.status==="pending")}k.active=g;async function b(S){let y=await w(S);return {total:y.length,pending:y.filter(x=>x.status==="pending").length,running:y.filter(x=>x.status==="running").length,completed:y.filter(x=>x.status==="completed").length,error:y.filter(x=>x.status==="error").length}}k.stats=b;async function v(S=10080*60*1e3){let y=await m(),x=Date.now(),I=0;for(let[P,T]of y.tasks)(T.status==="completed"||T.status==="error")&&x-T.updatedAt>S&&(y.tasks.delete(P),I++);if(I>0){let P=new Map;for(let T of y.tasks.values()){let M=P.get(T.sessionId)||[];M.push(T),P.set(T.sessionId,M);}for(let[T,M]of P)await u(T,M);t.debug("Cleaned up old tasks",{count:I});}return I}k.cleanup=v;})(Bt||(Bt={}));var Cn=a.create({service:"hook.builtin.task"});async function aC(t){try{return (await Ut.get(t)).type==="idle"}catch{return false}}async function cC(t){let{taskId:e,duration:n,error:o}=t;t.source==="scheduler"&&Cn.debug("Scheduled task completed",{taskId:e,duration:n,success:!o});}async function lC(t){let{taskId:e,error:n}=t;t.source==="cli"&&(n?Cn.error("CLI task error",{taskId:e,error:n}):Cn.debug("CLI task completed",{taskId:e}));}async function dC(t){let{taskId:e,result:n,error:o}=t;t.source==="api"&&Cn.debug("API task event",{taskId:e,hasError:!!o,hasResult:!!n});}var uC={tool:async()=>Cn.debug("Tool task completed"),scheduler:cC,cli:lC,api:dC};async function pC(t){try{await Bt.create({taskId:t.taskId,sessionId:t.sessionId,description:t.description||"",prompt:t.prompt||"",agentType:t.agentType||"unknown",source:t.source,metadata:{agentType:t.agentType}});}catch(e){Cn.error("Failed to create task",{taskId:t.taskId,error:String(e)});return}Cn.debug("Task created (pending)",{taskId:t.taskId,sessionId:t.sessionId,source:t.source,agentType:t.agentType});}async function mC(t){await Bt.update(t.taskId,{status:"running"}),Cn.debug("Task running",{taskId:t.taskId,sessionId:t.sessionId});}async function fC(t){if(!await Bt.get(t.taskId)){Cn.warn("Task progress for unknown task",{taskId:t.taskId});return}Cn.debug("Task progress",{taskId:t.taskId,step:t.step,totalSteps:t.totalSteps});}async function gC(t){let e=await Bt.get(t.taskId);if(!e){Cn.warn("Task complete for unknown task",{taskId:t.taskId});return}await Bt.update(t.taskId,{status:t.error?"error":"completed",result:t.result,error:t.error,duration:t.duration,metadata:t.metadata}),Cn.debug("Task completed (persisted)",{taskId:t.taskId,sessionId:e.sessionId,source:t.source,duration:t.duration,hasError:!!t.error}),await uC[t.source](t),e.sessionId&&t.source==="tool"&&(t.result||t.error?await hC(e,t):Cn.debug("Task completed without result, skip injection",{taskId:t.taskId,sessionId:e.sessionId}));}async function hC(t,e){if(t?.sessionId)try{let n=await aC(t.sessionId);await qe.prompt({sessionID:t.sessionId,parts:[{type:"subtask-result",taskId:t.taskId,source:t.source,agent:e.agentType??t.agentType,status:e.error?"error":"completed",result:e.result,error:e.error,duration:e.duration,time:{start:t.createdAt,end:Date.now()},metadata:e.metadata}],noReply:!n}),n?Cn.debug("Injected result to parent session (agent idle, will trigger LLM)",{taskId:t.taskId,sessionId:t.sessionId}):Cn.debug("Injected result to parent session (agent busy, queued for next turn)",{taskId:t.taskId,sessionId:t.sessionId});}catch(n){Cn.error("Failed to inject result to parent session",{taskId:t.taskId,sessionId:t.sessionId,error:n instanceof Error?n.message:String(n)});}}var sp=nn("task.builtin",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.TaskStart,handler:async t=>(await pC(t),{modified:false,input:t})},{name:HookEvent.TaskRunning,handler:async t=>(await mC(t),{modified:false,input:t})},{name:HookEvent.TaskProgress,handler:async t=>(await fC(t),{modified:false,input:t})},{name:HookEvent.TaskComplete,handler:async t=>(await gC(t),{modified:false,input:t})}]}}});var Cl=a.create({service:"hook.builtin.loop"});async function yC(t,e){let n=await ve.getLastMessages(t);return !n.lastUser||n.lastUser.id===e?false:n.lastFinished?n.lastFinished.info.role==="assistant"&&n.lastFinished.info.parentID!==n.lastUser.id?(Cl.debug("Latest assistant message does not respond to latest user message, should continue loop",{lastUserId:n.lastUser.id,assistantParentId:n.lastFinished.info.parentID}),true):false:(Cl.debug("Found new user message without assistant response, should continue loop",{lastUserId:n.lastUser.id,expectedParentId:n.lastUser.id}),true)}var rp=nn("loop.builtin",{async init(){return {isEnabled:()=>true,handlers:[{name:HookEvent.LoopStart,handler:async t=>{let e=t;return Cl.debug("Loop started",{sessionID:e.sessionID,step:e.step}),{modified:false,input:t}}},{name:HookEvent.LoopEnd,handler:async t=>{let e=t;return e.result==="stop"&&await yC(e.sessionID,e.lastUserId)?(Cl.debug("Loop should continue for pending messages"),{modified:true,input:{...e,result:"continue"}}):{modified:false,input:t}}}]}}});var Bg=a.create({service:"hook.matcher"}),tr=class tr{static getInstance(){return tr._instance||(tr._instance=new tr),tr._instance}match(e,n,o){return e.event!==n?{matched:false}:e.matcher&&!this.evaluateCondition(e.matcher,o)?(Bg.debug("Hook matcher condition not met",{matcher:e.matcher,context:o}),{matched:false}):{matched:true}}matchHook(e,n,o){return !("if"in e)||!e.if?true:this.evaluateCondition(e.if,o)}getHookName(e){switch(e.type){case "function":return "function";case "command":return e.command.split(" ")[0]||"command";case "prompt":return "prompt";case "http":try{return new URL(e.url).hostname}catch{return "http"}case "agent":return "agent";default:return "unknown"}}evaluateCondition(e,n){try{let o={...process.env,SESSION_ID:n?.sessionID,AGENT:n?.agent,MODEL:n?.model,CWD:n?.cwd};for(let[i,c]of Object.entries(n??{}))typeof c=="string"&&(o[i.toUpperCase()]=c);let s=e.replace(/\$\{(\w+)\}/g,(i,c)=>{let u=o[c];return typeof u=="string"?`"${u.replace(/"/g,'\\"')}"`:"undefined"});return !!new Function(`return ${s}`)()}catch(o){return Bg.error("Failed to evaluate condition",{condition:e,error:o?.message}),false}}};b$1(tr,"_instance");var ba=tr;var Co=a.create({service:"hook.registry"}),ip=[au,fu,hu,bu,tp,np,sp,rp],je;(f=>{let t;function e(){return t||(t=A.state(async()=>({matchers:[],executorRegistry:ya.getInstance(),hookMatcher:ba.getInstance()}),async()=>{Co.debug("hook registry cleanup");})),t}function n(){return e()()}f.state=n;function o(){return [...ip]}f.all=o;async function s(){Co.debug("HookRegistry.init starting",{builtinCount:ip.length});let m=await n(),a=[];for(let p of ip){let d=await p.init();if(d.isEnabled){let h=d.isEnabled();if(h instanceof Promise){if(!await h)continue}else if(!h)continue}for(let h of d.handlers){let w=await r({event:h.name,scope:d.scope,hooks:[{type:"function",handler:h.handler}],hookName:p.name});a.push(w),Co.debug("hook entry registered",{hook:p.name,hookName:h.name,scope:d.scope});}}return Co.debug("HookRegistry.init completed",{registeredCount:a.length,totalMatchers:m.matchers.length}),a}f.init=s;async function r(m){let a={...m,scope:m.scope,hookName:m.hookName};return (await n()).matchers.push(a),Co.debug("hook matcher registered",{event:m.event,hookCount:m.hooks.length,scope:m.scope,hookName:m.hookName}),()=>{n().then(d=>{let h=d.matchers.indexOf(a);h>-1&&(d.matchers.splice(h,1),Co.debug("hook matcher unregistered",{event:m.event}));});}}f.registerMatcher=r;async function i(m){try{let p=await ee.get(m);if(p.contextMode)return p.contextMode}catch{}return (await he.get()).context?.mode??g.General}async function c(m,a,p){let d=await n(),h=Date.now(),w={success:true,output:a,modified:false,aborted:false,details:[],errors:[],duration:0},g$1=p?.sessionID,b=g$1?await i(g$1):g.General,v=d.matchers.filter(y=>{if(!d.hookMatcher.match(y,m,p).matched)return false;let x=y.scope??g.All;return x!==g.All&&x!==b?(Co.debug("hook scope filtered",{event:m,hookName:y.hookName,matcherScope:x,currentMode:b}),false):true}),k=[];for(let y of v)for(let x=0;x<y.hooks.length;x++){let I=y.hooks[x];I&&d.hookMatcher.matchHook(I,a,p)&&k.push({hook:I,hookIndex:x});}let S=a;for(let y=0;y<k.length;y++){if(p?.abort?.aborted){w.aborted=true,w.errors.push({index:y,hookName:"system",error:String(p.abort.reason??"Aborted")}),Co.debug("Hook chain aborted",{reason:p.abort.reason,stoppedAt:y});break}let x=k[y];if(!x)continue;let{hook:I}=x,P={index:y,hookType:I.type,hookName:`${m}:${d.hookMatcher.getHookName(I)}`,matched:true,skipped:false,success:false,modified:false,duration:0},T=Date.now();try{let M={modified:!1,input:S},j=await d.executorRegistry.execute(I,M,p);if(p?.abort?.aborted){w.aborted=!0,w.errors.push({index:y,hookName:P.hookName,error:String(p.abort.reason??"Aborted by hook")}),Co.debug("Hook triggered abort",{hook:P.hookName,reason:p.abort.reason});break}j.modified&&j.input!==void 0&&(S=j.input,P.modified=!0,w.modified=!0),P.success=j.success!==!1,P.output=j.output,P.duration=Date.now()-T,w.details.push(P);}catch(M){let j=M;if(j?.name==="AbortError"){w.aborted=true,w.errors.push({index:y,hookName:P.hookName,error:String(p?.abort?.reason??"Aborted")});break}w.errors.push({index:y,hookName:P.hookName,error:j?.message??String(M),stack:j?.stack}),Co.error("Hook execution error",{hook:P.hookName,error:j?.message,stack:j?.stack}),P.duration=Date.now()-T,w.details.push(P);}}return w.output=S,w.duration=Date.now()-h,w.success=w.errors.length===0&&!w.aborted,w}f.triggerEvent=c;async function u(){t=void 0,Co.debug("cleared all hooks");}f.clear=u;async function l(){return (await n()).matchers.length}f.matcherCount=l;})(je||(je={}));var xC=loadTextFile("./generate.txt",import.meta.url),IC=xC(),vC=loadTextFile("./prompt/compaction.txt",import.meta.url),SC=vC(),CC=loadTextFile("./prompt/explore.txt",import.meta.url),kC=CC(),PC=loadTextFile("./prompt/summary.txt",import.meta.url),EC=PC(),TC=loadTextFile("./prompt/title.txt",import.meta.url),DC=TC(),AC=loadTextFile("./prompt/btw.txt",import.meta.url),RC=AC(),_C=loadTextFile("./prompt/memory.txt",import.meta.url),MC=_C(),Ue;(l=>{l.Info=z$1.object({name:z$1.string(),description:z$1.string().optional(),mode:z$1.enum(["subagent","primary","all"]),native:z$1.boolean().optional(),hidden:z$1.boolean().optional(),topP:z$1.number().optional(),temperature:z$1.number().optional(),color:z$1.string().optional(),permission:z$1.lazy(()=>Me.Ruleset),scope:z$1.enum(h).optional(),model:z$1.object({modelID:z$1.string(),providerID:z$1.string()}).optional(),variant:z$1.string().optional(),prompt:z$1.string().optional(),options:z$1.record(z$1.string(),z$1.any()),steps:z$1.number().int().positive().optional()}).meta({ref:"Agent"});async function e(){let f=await he.get(),m=await rn.dirs(),a=Me.fromConfig({"*":"allow",doom_loop:"ask",external_directory:{"*":"ask",[Ke.GLOB]:"allow",...Object.fromEntries(m.map(h=>[ke__default.join(h,"*"),"allow"]))},question:"deny",plan:"deny",read:{"*":"allow","*.env":"ask","*.env.*":"ask","*.env.example":"allow"}}),p=Me.fromConfig(f.permission??{}),d={build:{name:"build",description:"The default agent. Executes tools based on configured permissions.",options:{},permission:Me.merge(a,Me.fromConfig({question:"allow",plan:"allow"}),p),mode:"primary",native:true},plan:{name:"plan",description:"Plan mode. Disallows all edit tools.",options:{},permission:Me.merge(a,Me.fromConfig({question:"allow",plan_exit:"allow",external_directory:{[ke__default.join(a$1.Path.data,"plans","*")]:"allow"},edit:{"*":"deny",[ke__default.posix.join(".easbot","plans","*.md")]:"allow",[ke__default.posix.relative(A.worktree,ke__default.posix.join(a$1.Path.data,ke__default.posix.join("plans","*.md")))]:"allow"}}),p),mode:"primary",native:true},general:{name:"general",description:"General-purpose agent for researching complex questions and executing multi-step tasks. Use this agent to execute multiple units of work in parallel.",permission:Me.merge(a,Me.fromConfig({todo:"deny"}),p),options:{},mode:"subagent",native:true},explore:{name:"explore",permission:Me.merge(a,Me.fromConfig({"*":"deny",grep:"allow",glob:"allow",list:"allow",bash:"allow",webfetch:"allow",websearch:"allow",codesearch:"allow",read:"allow",external_directory:{[Ke.GLOB]:"allow"}}),p),description:'Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. "src/components/**/*.tsx"), search code for keywords (eg. "API endpoints"), or answer questions about the codebase (eg. "how do API endpoints work?"). When calling this agent, specify the desired thoroughness level: "quick" for basic searches, "medium" for moderate exploration, or "very thorough" for comprehensive analysis across multiple locations and naming conventions.',prompt:kC,options:{},mode:"subagent",native:true},compaction:{name:"compaction",mode:"primary",native:true,hidden:true,prompt:SC,permission:Me.merge(a,Me.fromConfig({"*":"deny"}),p),options:{}},title:{name:"title",mode:"primary",options:{},native:true,hidden:true,temperature:.5,permission:Me.merge(a,Me.fromConfig({"*":"deny"}),p),prompt:DC},summary:{name:"summary",mode:"primary",options:{},native:true,hidden:true,permission:Me.merge(a,Me.fromConfig({"*":"deny"}),p),prompt:EC},btw:{name:"btw",description:"Act like a professional in the relevant domain",mode:"primary",options:{},native:true,permission:Me.merge(a,Me.fromConfig({"*":"deny",grep:"allow",glob:"allow",list:"allow",bash:"allow",webfetch:"allow",websearch:"allow",codesearch:"allow",read:"allow",question:"allow",plan:"allow",external_directory:{[Ke.GLOB]:"allow"}}),p),prompt:RC},memory:{name:"memory",mode:"primary",options:{},native:true,hidden:true,permission:Me.merge(a,Me.fromConfig({"*":"deny",memory:"allow",read:{"*":"allow","*.env":"deny","*.env.*":"deny","*.env.example":"allow"},list:"allow",glob:"allow",grep:"allow",webfetch:"allow",websearch:"allow",external_directory:{[Ke.GLOB]:"allow",...Object.fromEntries(m.map(h=>[ke__default.join(h,"*"),"allow"]))}}),p),prompt:MC}};for(let[h,w]of Object.entries(f.agent??{})){if(w.disable){delete d[h];continue}let g=d[h];if(g||(g=d[h]={name:h,mode:"all",permission:Me.merge(a,p),options:{},native:false}),w.model){let b=Ce.parseModel(w.model);g.model={providerID:b.providerID,modelID:b.modelID};}g.variant=w.variant??g.variant,g.prompt=w.prompt??g.prompt,g.description=w.description??g.description,g.temperature=w.temperature??g.temperature,g.topP=w.top_p??g.topP,g.mode=w.mode??g.mode,g.color=w.color??g.color,g.hidden=w.hidden??g.hidden,g.name=w.name??g.name,g.steps=w.steps??g.steps,g.options=mergeDeep(g.options,w.options??{}),g.permission=Me.merge(g.permission,Me.fromConfig(w.permission??{}));}for(let h in d){if(!Object.hasOwn(d,h))continue;let w=d[h];!w||w.permission.some(b=>b.permission!=="external_directory"||b.action!=="deny"?false:b.pattern===Ke.GLOB)||!d[h]||(d[h].permission=Me.merge(d[h].permission,Me.fromConfig({external_directory:{[Ke.GLOB]:"allow"}})));}return d}let n;function o(){return n||(n=A.state(e)),n}function s(){return o()()}async function r(f){return (await s())[f]}l.get=r;async function i(f){let m=await he.get(),a=f??"general";return pipe(await s(),values(),sortBy([d=>m.default_agent?d.name===m.default_agent:d.name==="build","desc"])).filter(d=>{let h=d.scope??"all";return !(h!=="all"&&h!==a)})}l.list=i;async function c(){let f=await he.get(),m=await s();if(f.default_agent){let p=m[f.default_agent];if(!p)throw new Error(`default agent "${f.default_agent}" not found`);if(p.mode==="subagent")throw new Error(`default agent "${f.default_agent}" is a subagent`);if(p.hidden===true)throw new Error(`default agent "${f.default_agent}" is hidden`);return p.name}let a=Object.values(m).find(p=>p.mode!=="subagent"&&p.hidden!==true);if(!a)throw new Error("no primary visible agent found");return a.name}l.defaultAgent=c;async function u(f){let m=await he.get(),a=f.model??await Ce.defaultModel(),p=await Ce.getModel(a.providerID,a.modelID),d=await Ce.getLanguage(p),h=[IC];await je.triggerEvent(HookEvent.SystemTransform,{model:p});let w=await i(),g={experimental_telemetry:{isEnabled:m.experimental?.openTelemetry,metadata:{userId:m.username??"unknown"}},temperature:.3,messages:[...h.map(v=>({role:"system",content:v})),{role:"user",content:`Create an agent configuration based on this request: "${f.description}".
292
+
293
+ IMPORTANT: The following identifiers already exist and must NOT be used: ${w.map(v=>v.name).join(", ")}
294
+ Return ONLY the JSON object, no other text, do not wrap in backticks`}],model:d,schema:z$1.object({identifier:z$1.string(),whenToUse:z$1.string(),systemPrompt:z$1.string()})};if(a.providerID==="openai"&&(await et.get(a.providerID))?.type==="oauth"){let v=streamObject({...g,providerOptions:vt.providerOptions(p,{instructions:h.join(`
295
+ `),store:false}),onError:()=>{}});for await(let k of v.fullStream)if(k.type==="error")throw k.error;return v.object}return (await generateObject(g)).object}l.generate=u;})(Ue||(Ue={}));var oo=a.create({service:"agent-cli-api-agent"});async function Hg(){try{oo.info("Get agent list");let e=(await Ue.list()).map(n=>{let o=n.model,s;if(o&&typeof o=="string"){let{provider:r,model:i}=parseModelId(o);r&&i&&(s={providerID:r,modelID:i});}return {...n,model:s}});return oo.info("Get agent list successful",{count:e.length}),e}catch(t){throw oo.error("Failed to get agent list",{error:t}),t}}async function kl(t){try{t=t?.trim()??await Ue.defaultAgent(),oo.info("Get agent details",{agentName:t});let e=await Ue.get(t);return e?(oo.info("Get agent details successful",{agentName:t}),e):(oo.warn("Agent does not exist",{agentName:t}),null)}catch(e){throw oo.error("Failed to get agent details",{agentName:t,error:e}),e}}async function FC(){try{oo.info("Get default agent");let t=await Ue.defaultAgent(),e=await kl(t);if(!e)throw new Error(`Default agent "${t}" not found`);return oo.info("Get default agent successful",{agentName:t}),e}catch(t){throw oo.error("Failed to get default agent",{error:t}),t}}var UC=Hg;async function qg(t){try{if(oo.info("Creating agent",{name:t.name,mode:t.mode}),!t.name||t.name.trim()==="")throw new Error("Agent name is required");let e=["subagent","primary","all"],n=t.mode||"primary";if(!e.includes(n))throw new Error(`Invalid agent mode: ${t.mode}. Valid modes are: ${e.join(", ")}`);if(await kl(t.name))throw new Error(`Agent "${t.name}" already exists`);let s={mode:n};t.description&&(s.description=t.description),t.prompt&&(s.prompt=t.prompt),t.model&&(s.model=`${t.model.providerID}/${t.model.modelID}`),t.temperature!==void 0&&(s.temperature=t.temperature),t.topP!==void 0&&(s.top_p=t.topP),t.color&&(s.color=t.color),t.hidden!==void 0&&(s.hidden=t.hidden),t.variant&&(s.variant=t.variant),t.steps!==void 0&&(s.steps=t.steps),t.permission&&(s.permission=t.permission),t.options&&(s.options=t.options);let{Config:r}=await import('./config-J54DTNPX.mjs');await r.update({agent:{[t.name]:s}}),oo.info("Agent created successfully",{name:t.name});let i=await kl(t.name);if(!i)throw new Error(`Failed to retrieve created agent "${t.name}"`);return i}catch(e){throw oo.error("Failed to create agent",{name:t.name,error:e}),e}}var zC=qg;var wa={};a$7(wa,{formatModels:()=>VC,getDefaultModel:()=>BC,listModels:()=>qC,listProviders:()=>HC,parseModel:()=>WC,refreshModels:()=>GC});async function BC(){try{let t=await Ce.defaultModel();return t?`${t.providerID}/${t.modelID}`:void 0}catch{return}}async function HC(){return Ce.list()}async function qC(t){let e=await Ce.list();if(t){let n=e[t];if(!n)throw new Error(`Provider not found: ${t}`);return {[t]:n}}return e}async function GC(){await a$3.refresh();}function WC(t){let e=Ce.parseModel(t);if(e?.providerID)return {providerID:e.providerID,modelID:e.modelID}}function VC(t,e=false){let n=[],o=Object.keys(t).sort((s,r)=>{let i=s.startsWith("opencode"),c=r.startsWith("opencode");return i&&!c?-1:!i&&c?1:s.localeCompare(r)});for(let s of o){let r=t[s];if(!r?.models)continue;let i=Object.entries(r.models).sort(([c],[u])=>c.localeCompare(u));for(let[c,u]of i)n.push(`${s}/${c}`),e&&u&&n.push(JSON.stringify(u,null,2));}return n.join(`
296
+ `)}var sr={};a$7(sr,{command:()=>tk,deleteMessage:()=>YC,deletePart:()=>XC,getMessage:()=>JC,list:()=>KC,listMessages:()=>Wg,send:()=>ek,updateMessage:()=>QC,updatePart:()=>ZC});var ii=a.create({service:"agent-cli-api-message"});async function Wg(t,e){ii.debug(a$8("message.history.start"),{sessionId:t});let n=await ee.messages({sessionID:t,limit:e});return ii.debug(a$8("message.history.success"),{sessionId:t,count:n.length}),n}var KC=Wg;async function JC(t,e){return await ve.get({sessionID:t,messageID:e})}async function YC(t,e){return ee.removeMessage({sessionID:t,messageID:e})}async function QC(t){return ee.updateMessage(t)}async function XC(t,e,n){return ee.removePart({sessionID:t,messageID:e,partID:n})}async function ZC(t){return ee.updatePart(t)}async function ek(t){ii.debug(a$8("message.send.start"),{sessionId:t.sessionId});let e=[{type:"text",text:t.text}];if(t.files&&t.files.length>0)for(let o of t.files)e.push({type:"file",url:o.url,filename:o.filename,mime:o.mime});t.subAgent&&e.push({type:"agent",name:t.subAgent});let n=await qe.prompt({sessionID:t.sessionId,messageID:Identifier.ascending("message"),agent:t.agent,model:t.model,variant:t.variant,noReply:t.noReply,contextMode:t.contextMode,parts:e});return ii.debug(a$8("message.send.success"),{sessionId:t.sessionId,messageId:n.info.id}),n}async function tk(t){ii.debug(a$8("message.command.start"),{sessionId:t.sessionId,command:t.command});let e=await qe.command({sessionID:t.sessionId,messageID:t.messageID||Identifier.ascending("message"),command:t.command,arguments:t.arguments||"",agent:t.agent,model:t.model,variant:t.variant,contextMode:t.contextMode,parts:t.parts});return ii.debug(a$8("message.command.success"),{sessionId:t.sessionId,command:t.command,title:e.title}),e}var Le;(e=>{function t(n,o){return {id:n,isEnabled:typeof o=="function"?void 0:o.isEnabled,scope:typeof o=="function"?void 0:o.scope,init:async s=>{let r=typeof o=="function"?await o(s):o,i=r.execute;return r.execute=async(c,u)=>{try{r.parameters.parse(c);}catch(m){throw m instanceof z$1.ZodError&&r.formatValidationError?new Error(r.formatValidationError(m),{cause:m}):new Error(`The ${n} tool was called with invalid arguments: ${m instanceof Error?m.message:String(m)}.
297
+ Please rewrite the input so it satisfies the expected schema.`,{cause:m})}let l=await i(c,u);if(l.metadata?.truncated===true)return l;let f=await Ke.output(l.output,{},s?.agent);return {...l,output:f.content,metadata:{...l.metadata||{},truncated:f.truncated,...f.truncated&&{outputPath:f.outputPath}}}},{description:r.description,parameters:r.parameters,execute:r.execute,formatValidationError:r.formatValidationError}}}}e.define=t;})(Le||(Le={}));var cp=new Set(["powershell","pwsh"]),lp=new Set(["cmd"]);function sk(t){return t==="pwsh"?"pwsh":t==="powershell"?"powershell":t==="cmd"?"cmd":t==="bash"?"bash":t==="zsh"?"zsh":t}function ap(t){return cp.has(t)?`Brief description of this command (5-10 words). Examples:
298
+ Input: Get-ChildItem -LiteralPath "."
299
+ Output: Lists current directory
300
+
301
+ Input: git status
302
+ Output: Shows working tree status
303
+
304
+ Input: npm install
305
+ Output: Installs package dependencies
306
+
307
+ Input: New-Item -ItemType Directory -Path "tmp"
308
+ Output: Creates directory tmp`:lp.has(t)?`Brief description of this command (5-10 words). Examples:
309
+ Input: dir
310
+ Output: Lists current directory
311
+
312
+ Input: if exist "package.json" type "package.json"
313
+ Output: Prints package.json when it exists
314
+
315
+ Input: mkdir tmp
316
+ Output: Creates directory tmp`:`Brief description of this command (5-10 words). Examples:
317
+ Input: ls
318
+ Output: Lists files in current directory
319
+
320
+ Input: git status
321
+ Output: Shows working tree status
322
+
323
+ Input: npm install
324
+ Output: Installs package dependencies
325
+
326
+ Input: mkdir foo
327
+ Output: Creates directory 'foo'`}function rk(t){return t==="pwsh"?'# PowerShell (7+) shell notes\n- This cross-platform shell supports pipeline chain operators (`&&` and `||`).\n- Use double quotes for interpolated strings (`"Hello $name"`), single quotes for verbatim strings.\n- Prefer full cmdlet names like `Get-ChildItem`, `Set-Content`, `Remove-Item`, and `New-Item` over aliases.\n- Use `$(...)` for subexpressions. Use `@(...)` for array expressions.\n- To call a native executable whose path contains spaces, use the call operator: `& "path/to/exe" args`.\n- Escape special characters with the PowerShell backtick character.':t==="powershell"?'# Windows PowerShell (5.1) shell notes\n- Use `cmd1; if ($?) { cmd2 }` to chain dependent commands.\n- Use double quotes for interpolated strings (`"Hello $name"`), single quotes for verbatim strings.\n- Prefer full cmdlet names like `Get-ChildItem`, `Set-Content`, `Remove-Item`, and `New-Item` over aliases.\n- Use `$(...)` for subexpressions. Use `@(...)` for array expressions.\n- To call a native executable whose path contains spaces, use the call operator: `& "path/to/exe" args`.\n- Escape special characters with the PowerShell backtick character.':""}function ik(t){return t==="powershell"?"If the commands depend on each other and must run sequentially, avoid '&&' in this shell because Windows PowerShell (5.1) does not support it. Use PowerShell conditionals such as `cmd1; if ($?) { cmd2 }` when later commands must depend on earlier success.":cp.has(t)?"If the commands depend on each other and must run sequentially, use '&&' to chain them together (e.g., `git add . && git commit -m \"message\" && git push`). For instance, if one operation must complete before another starts (like mkdir before cp, Write before bash for git operations, or git add before git commit), run these operations sequentially instead.":lp.has(t)?"If the commands depend on each other and must run sequentially, use `&&` to chain them together (e.g., `mkdir out && dir out`). For instance, if one operation must complete before another starts, run these operations sequentially instead.":"If the commands depend on each other and must run sequentially, use '&&' to chain them together (e.g., `git add . && git commit -m \"message\" && git push`). For instance, if one operation must complete before another starts (like mkdir before cp, Write before bash for git operations, or git add before git commit), run these operations sequentially instead."}function ak(t,e){return `Before executing the command, please follow these steps:
328
+
329
+ 1. Directory Verification:
330
+ - If the command will create new directories or files, first use \`ls\` to verify the parent directory exists and is the correct location
331
+ - For example, before running "mkdir foo/bar", first use \`ls foo\` to check that "foo" exists and is the intended parent directory
332
+
333
+ 2. Command Execution:
334
+ - Always quote file paths that contain spaces with double quotes (e.g., rm "path with spaces/file.txt")
335
+ - Examples of proper quoting:
336
+ - mkdir "/Users/name/My Documents" (correct)
337
+ - mkdir /Users/name/My Documents (incorrect - will fail)
338
+ - python "/path/with spaces/script.py" (correct)
339
+ - python /path/with spaces/script.py (incorrect - will fail)
340
+ - After ensuring proper quoting, execute the command.
341
+ - Capture the output of the command.
342
+
343
+ Usage notes:
344
+ - The command argument is required.
345
+ - You can specify an optional timeout in milliseconds. If not specified, commands will time out after 120000ms (2 minutes).
346
+ - Provide a brief description of what this command does (5-10 words).
347
+ - If the output exceeds ${e.maxLines} lines or ${e.maxBytes} bytes, it will be truncated and the full output will be written to a file. You can use Read with offset/limit to read specific sections or Grep to search the full content. Because of this, you do NOT need to use \`head\`, \`tail\`, or other truncation commands to limit output - just run the command directly.
348
+
349
+ - Avoid using Bash with the \`find\`, \`grep\`, \`cat\`, \`head\`, \`tail\`, \`sed\`, \`awk\`, or \`echo\` commands, unless explicitly instructed or when these commands are truly necessary for the task. Instead, always prefer using the dedicated tools for these commands:
350
+ - File search: Use Glob (NOT find or ls)
351
+ - Content search: Use Grep (NOT grep or rg)
352
+ - Read files: Use Read (NOT cat/head/tail)
353
+ - Edit files: Use Edit (NOT sed/awk)
354
+ - Write files: Use Write (NOT echo >/cat <<EOF)
355
+ - Communication: Output text directly (NOT echo/printf)
356
+ - When issuing multiple commands:
357
+ - If the commands are independent and can run in parallel, make multiple Bash tool calls in a single message. For example, if you need to run "git status" and "git diff", send a single message with two Bash tool calls in parallel.
358
+ - ${t}
359
+ - Use ';' only when you need to run commands sequentially but don't care if earlier commands fail
360
+ - DO NOT use newlines to separate commands (newlines are ok in quoted strings)
361
+ - AVOID using \`cd <directory> && <command>\`. Use the \`workdir\` parameter to change directories instead.
362
+ <good-example>
363
+ Use workdir="/foo/bar" with command: pytest tests
364
+ </good-example>
365
+ <bad-example>
366
+ cd /foo/bar && pytest tests
367
+ </bad-example>`}function ck(t,e,n){let o=process.platform==="win32"?"\\":"/";return `${rk(t)}
368
+
369
+ Before executing the command, please follow these steps:
370
+
371
+ 1. Directory Verification:
372
+ - If the command will create new directories or files, first use \`Test-Path -LiteralPath <parent>\` to verify the parent directory exists and is the correct location
373
+ - For example, before creating \`foo${o}bar\`, first use \`Test-Path -LiteralPath "foo"\` to check that \`foo\` exists and is the intended parent directory
374
+
375
+ 2. Command Execution:
376
+ - Always quote file paths that contain spaces with double quotes (e.g., Remove-Item -LiteralPath "path with spaces${o}file.txt")
377
+ - Examples of proper quoting:
378
+ - New-Item -ItemType Directory -Path "My Documents" (correct)
379
+ - New-Item -ItemType Directory -Path My Documents (incorrect - path is split)
380
+ - & "path with spaces${o}script.ps1" (correct)
381
+ - path with spaces${o}script.ps1 (incorrect - path is split and not invoked)
382
+ - After ensuring proper quoting, execute the command.
383
+ - Capture the output of the command.
384
+
385
+ Usage notes:
386
+ - The command argument is required.
387
+ - You can specify an optional timeout in milliseconds. If not specified, commands will time out after 120000ms (2 minutes).
388
+ - Provide a brief description of what this command does (5-10 words).
389
+ - If the output exceeds ${n.maxLines} lines or ${n.maxBytes} bytes, it will be truncated and the full output will be written to a file. You can use Read with offset/limit to read specific sections or Grep to search the full content. Because of this, you do NOT need to use \`Select-Object -First\`, \`Select-Object -Last\`, or other truncation commands to limit output - just run the command directly.
390
+
391
+ - Avoid using Shell with PowerShell file/content cmdlets unless explicitly instructed or when these cmdlets are truly necessary for the task. Instead, always prefer using the dedicated tools for these commands:
392
+ - File search: Use Glob (NOT Get-ChildItem)
393
+ - Content search: Use Grep (NOT Select-String)
394
+ - Read files: Use Read (NOT Get-Content)
395
+ - Edit files: Use Edit (NOT Set-Content)
396
+ - Write files: Use Write (NOT Set-Content/Out-File or here-strings)
397
+ - Communication: Output text directly (NOT Write-Output/Write-Host)
398
+ - When issuing multiple commands:
399
+ - If the commands are independent and can run in parallel, make multiple Shell tool calls in a single message. For example, if you need to run "git status" and "git diff", send a single message with two Shell tool calls in parallel.
400
+ - ${e}
401
+ - Use ';' only when you need to run commands sequentially but don't care if earlier commands fail
402
+ - DO NOT use newlines to separate commands (newlines are ok in quoted strings)
403
+ - AVOID changing directories inside the command. Use the \`workdir\` parameter to change directories instead.
404
+ <good-example>
405
+ Use workdir="project${o}subdir" with command: pytest tests
406
+ </good-example>
407
+ <bad-example>
408
+ ${t==="powershell"?`Set-Location -LiteralPath "project${o}subdir"; if ($?) { pytest tests }`:`Set-Location -LiteralPath "project${o}subdir" && pytest tests`}
409
+ </bad-example>`}function lk(t,e){return `# cmd.exe shell notes
410
+ - Use double quotes for paths with spaces.
411
+ - Use %VAR% for environment variables.
412
+ - Use \`if exist\` for existence checks.
413
+ - Use \`call\` when invoking batch files from another batch-style command.
414
+
415
+ Before executing the command, please follow these steps:
416
+
417
+ 1. Directory Verification:
418
+ - If the command will create new directories or files, first use \`if exist\` to verify the parent directory exists and is the correct location
419
+ - For example, before creating \`foo\\bar\`, first use \`if exist "foo\\" dir "foo"\` to check that \`foo\` exists and is the intended parent directory
420
+
421
+ 2. Command Execution:
422
+ - Always quote file paths that contain spaces with double quotes (e.g., del "path with spaces\\file.txt")
423
+ - Examples of proper quoting:
424
+ - mkdir "My Documents" (correct)
425
+ - mkdir My Documents (incorrect - path is split)
426
+ - call "path with spaces\\script.bat" (correct)
427
+ - path with spaces\\script.bat (incorrect - path is split and not invoked correctly)
428
+ - After ensuring proper quoting, execute the command.
429
+ - Capture the output of the command.
430
+
431
+ Usage notes:
432
+ - The command argument is required.
433
+ - You can specify an optional timeout in milliseconds. If not specified, commands will time out after 120000ms (2 minutes).
434
+ - Provide a brief description of what this command does (5-10 words).
435
+ - If the output exceeds ${e.maxLines} lines or ${e.maxBytes} bytes, it will be truncated and the full output will be written to a file. You can use Read with offset/limit to read specific sections or Grep to search the full content. Because of this, you do NOT need to use \`more\` or other pagination commands to limit output - just run the command directly.
436
+
437
+ - Avoid using Shell with cmd.exe file/content commands unless explicitly instructed or when these commands are truly necessary for the task. Instead, always prefer using the dedicated tools for these commands:
438
+ - File search: Use Glob (NOT dir /s)
439
+ - Content search: Use Grep (NOT findstr)
440
+ - Read files: Use Read (NOT type)
441
+ - Edit files: Use Edit (NOT copy)
442
+ - Write files: Use Write (NOT echo > file)
443
+ - Communication: Output text directly (NOT echo)
444
+ - When issuing multiple commands:
445
+ - If the commands are independent and can run in parallel, make multiple Shell tool calls in a single message. For example, if you need to run "dir" and "where cmd", send a single message with two Shell tool calls in parallel.
446
+ - ${t}
447
+ - Use '&' only when you need to run commands sequentially but don't care if earlier commands fail
448
+ - DO NOT use newlines to separate commands (newlines are ok in quoted strings)
449
+ - AVOID changing directories inside the command. Use the \`workdir\` parameter to change directories instead.
450
+ <good-example>
451
+ Use workdir="project\\subdir" with command: dir
452
+ </good-example>
453
+ <bad-example>
454
+ cd /d "project\\subdir" && dir
455
+ </bad-example>`}function dk(t,e){let n=cp.has(t),o=lp.has(t),s=sk(t),r=ik(t);return o?{intro:`Executes a given ${s} command with optional timeout, ensuring proper handling and security measures.`,workdirSection:"All commands run in {{directory}} by default. Use the `workdir` parameter if you need to run a command in a different directory. AVOID using `cd <directory> && <command>` patterns - use `workdir` instead.",commandSection:lk(r,e),gitSection:`# Committing changes with git
456
+
457
+ Only create commits when requested by the user. If unclear, ask first. When the user asks you to create a new git commit, follow these steps carefully:
458
+
459
+ Git Safety Protocol:
460
+ - NEVER update the git config
461
+ - NEVER run destructive/irreversible git commands (like push --force, hard reset, etc) unless the user explicitly requests them
462
+ - NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless the user explicitly requests it
463
+ - NEVER run force push to main/master, warn the user if they request it
464
+ - Avoid git commit --amend. ONLY use --amend when ALL conditions are met:
465
+ (1) User explicitly requested amend, OR commit SUCCEEDED but pre-commit hook auto-modified files that need including
466
+ (2) HEAD commit was created by you in this conversation (verify: git log -1 --format='%an %ae')
467
+ (3) Commit has NOT been pushed to remote (verify: git status shows "Your branch is ahead")
468
+ - CRITICAL: If commit FAILED or was REJECTED by hook, NEVER amend - fix the issue and create a NEW commit
469
+ - CRITICAL: If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)
470
+ - NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
471
+
472
+ 1. You can call multiple tools in a single response. When multiple independent pieces of information are requested and all commands are likely to succeed, run the following bash commands in parallel:
473
+ - Run \`git status\` to see all untracked files
474
+ - Run \`git diff\` to see both staged and unstaged changes that will be committed
475
+ - Run \`git log --oneline -10\` to see recent commit messages
476
+
477
+ 2. Analyze all staged changes and draft a commit message:
478
+ - Summarize the nature of the changes
479
+ - Draft a concise (1-2 sentences) commit message
480
+ - Do not commit files that likely contain secrets (.env, etc.)
481
+
482
+ 3. Create the commit using a temporary body file so cmd.exe quoting stays simple:
483
+ \`(
484
+ echo ## Summary
485
+ echo ^<1-3 bullet points^>
486
+ ) ^> pr-body.txt
487
+ gh pr create --title "the pr title" --body-file pr-body.txt\`
488
+
489
+ 4. If the commit fails due to pre-commit hook, fix the issue and create a NEW commit (see amend rules above)
490
+
491
+ # Creating pull requests
492
+
493
+ Use the gh command via the Shell tool for ALL GitHub-related tasks including PRs and issues. Create PR using a temporary body file so cmd.exe quoting stays simple.`,createPrSection:`IMPORTANT: When creating a PR with gh, use a temporary body file for correct cmd.exe quoting:
494
+ \`(
495
+ echo ## Summary
496
+ echo - ^<1-3 bullet points^>
497
+ ) ^> pr-body.txt
498
+ gh pr create --title "the pr title" --body-file pr-body.txt\``,parameterDescription:ap(t)}:n?{intro:`Executes a given ${s} command with optional timeout, ensuring proper handling and security measures.`,workdirSection:"All commands run in {{directory}} by default. Use the `workdir` parameter if you need to run a command in a different directory. AVOID using `cd <directory> && <command>` patterns - use `workdir` instead.",commandSection:ck(t,r,e),gitSection:`# Committing changes with git
499
+
500
+ Only create commits when requested by the user. If unclear, ask first. When the user asks you to create a new git commit, follow these steps carefully:
501
+
502
+ Git Safety Protocol:
503
+ - NEVER update the git config
504
+ - NEVER run destructive/irreversible git commands (like push --force, hard reset, etc) unless the user explicitly requests them
505
+ - NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless the user explicitly requests it
506
+ - NEVER run force push to main/master, warn the user if they request it
507
+ - Avoid git commit --amend. ONLY use --amend when ALL conditions are met:
508
+ (1) User explicitly requested amend, OR commit SUCCEEDED but pre-commit hook auto-modified files that need including
509
+ (2) HEAD commit was created by you in this conversation (verify: git log -1 --format='%an %ae')
510
+ (3) Commit has NOT been pushed to remote (verify: git status shows "Your branch is ahead")
511
+ - CRITICAL: If commit FAILED or was REJECTED by hook, NEVER amend - fix the issue and create a NEW commit
512
+ - CRITICAL: If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)
513
+ - NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
514
+
515
+ 1. Run these commands in parallel:
516
+ - Run \`git status\` to see all untracked files
517
+ - Run \`git diff\` to see both staged and unstaged changes
518
+ - Run \`git log --oneline -10\` to see recent commit messages
519
+
520
+ 2. Analyze all staged changes and draft a commit message
521
+
522
+ 3. Create the commit:
523
+ - Add relevant untracked files to the staging area
524
+ - Create the commit with a message
525
+ - Run git status after the commit completes
526
+
527
+ 4. If the commit fails due to pre-commit hook, fix the issue and create a NEW commit (see amend rules above)
528
+
529
+ # Creating pull requests
530
+
531
+ Use the gh command via the Shell tool for ALL GitHub-related tasks. Create PR using gh pr create with a PowerShell here-string to pass the body correctly:
532
+ \`\`\`powershell
533
+ gh pr create --title "the pr title" --body @'
534
+ ## Summary
535
+ - <1-3 bullet points>
536
+ '@
537
+ \`\`\``,createPrSection:`IMPORTANT: When creating a PR with gh, use a PowerShell here-string for correct body formatting:
538
+ \`gh pr create --title "the pr title" --body @'
539
+ ## Summary
540
+ - <1-3 bullet points>
541
+ '@`,parameterDescription:ap(t)}:{intro:`Executes a given ${s} command in a persistent shell session with optional timeout, ensuring proper handling and security measures.`,workdirSection:"All commands run in {{directory}} by default. Use the `workdir` parameter if you need to run a command in a different directory. AVOID using `cd <directory> && <command>` patterns - use `workdir` instead.",commandSection:ak(r,e),gitSection:`# Committing changes with git
542
+
543
+ Only create commits when requested by the user. If unclear, ask first. When the user asks you to create a new git commit, follow these steps carefully:
544
+
545
+ Git Safety Protocol:
546
+ - NEVER update the git config
547
+ - NEVER run destructive/irreversible git commands (like push --force, hard reset, etc) unless the user explicitly requests them
548
+ - NEVER skip hooks (--no-verify, --no-gpg-sign, etc) unless the user explicitly requests it
549
+ - NEVER run force push to main/master, warn the user if they request it
550
+ - Avoid git commit --amend. ONLY use --amend when ALL conditions are met:
551
+ (1) User explicitly requested amend, OR commit SUCCEEDED but pre-commit hook auto-modified files that need including
552
+ (2) HEAD commit was created by you in this conversation (verify: git log -1 --format='%an %ae')
553
+ (3) Commit has NOT been pushed to remote (verify: git status shows "Your branch is ahead")
554
+ - CRITICAL: If commit FAILED or was REJECTED by hook, NEVER amend - fix the issue and create a NEW commit
555
+ - CRITICAL: If you already pushed to remote, NEVER amend unless user explicitly requests it (requires force push)
556
+ - NEVER commit changes unless the user explicitly asks you to. It is VERY IMPORTANT to only commit when explicitly asked, otherwise the user will feel that you are being too proactive.
557
+
558
+ 1. Run these commands in parallel:
559
+ - Run \`git status\` to see all untracked files
560
+ - Run \`git diff\` to see both staged and unstaged changes
561
+ - Run \`git log --oneline -10\` to see recent commit messages
562
+
563
+ 2. Analyze all staged changes and draft a commit message
564
+
565
+ 3. Create the commit:
566
+ - Add relevant untracked files to the staging area
567
+ - Create the commit with a message
568
+ - Run git status after the commit completes
569
+
570
+ 4. If the commit fails due to pre-commit hook, fix the issue and create a NEW commit (see amend rules above)
571
+
572
+ # Creating pull requests
573
+
574
+ Use the gh command via the Shell tool for ALL GitHub-related tasks including PRs and issues. Use gh pr create with the format below. Use a HEREDOC to pass the body:
575
+ \`\`\`bash
576
+ gh pr create --title "the pr title" --body "$(cat <<'EOF'
577
+ ## Summary
578
+ <1-3 bullet points>
579
+ EOF
580
+ )"
581
+ \`\`\``,createPrSection:`IMPORTANT: When creating a PR with gh, use a HEREDOC to pass the body:
582
+ \`gh pr create --title "the pr title" --body "$(cat <<'EOF'
583
+ ## Summary
584
+ <1-3 bullet points>
585
+ EOF
586
+ )"\``,parameterDescription:ap(t)}}function Vg(t){let e={maxLines:Ke.MAX_LINES,maxBytes:Ke.MAX_BYTES},n=Shell.name(t),o=dk(n,e);return {description:`${o.intro}
587
+
588
+ ${o.workdirSection}
589
+
590
+ ${o.commandSection}
591
+
592
+ ${o.gitSection}
593
+
594
+ ${o.createPrSection}`,parameterDescription:o.parameterDescription}}var Pl=3e4,fk=a$2.EASBOT_BASH_DEFAULT_TIMEOUT_MS||120*1e3,El=a.create({service:"bash-tool"});function gk(t){let e=[];function n(o){if(o){if(o.type==="Command"){let s=o.name?.text||"",r=[],i=o.text||"";if(o.suffix)for(let c of o.suffix)c.text&&r.push(c.text);s&&e.push({command:s,args:r,fullText:i});}if(o.commands)for(let s of o.commands)n(s);o.left&&n(o.left),o.right&&n(o.right),o.then&&n(o.then),o.else&&n(o.else);}}return n(t),e}var Jg=Le.define("bash",async()=>{let t=Shell.acceptable()??"/bin/bash";El.info("bash tool using shell",{shell:t});let{description:e,parameterDescription:n}=Vg(t);return {description:e.replaceAll("{{directory}}",A.directory).replaceAll("{{maxLines}}",String(Ke.MAX_LINES)).replaceAll("{{maxBytes}}",String(Ke.MAX_BYTES)),parameters:z$1.object({command:z$1.string().describe("The command to execute"),timeout:z$1.number().describe("Optional timeout in milliseconds").optional(),workdir:z$1.string().describe(`The working directory to run the command in. Defaults to ${A.directory}. Use this instead of 'cd' commands.`).optional(),description:z$1.string().describe(n)}),async execute(o,s){let r=o.workdir||A.directory;if(o.timeout!==void 0&&o.timeout<0)throw new Error(`Invalid timeout value: ${o.timeout}. Timeout must be a positive number.`);let i=o.timeout??fk,c;try{c=pk(o.command);}catch(w){El.warn("Failed to parse command, requesting full bash permission",{command:o.command,error:w instanceof Error?w.message:String(w)}),await s.ask({permission:"bash",patterns:[o.command],always:[],metadata:{unparseable:true,reason:"Command syntax too complex to analyze"}}),c=null;}if(c){let w=new Set;A.containsPath(r)||w.add(r);let g=new Set,b=new Set,v=gk(c);for(let{command:k,args:S,fullText:y}of v){if(["cd","rm","cp","mv","mkdir","touch","chmod","chown","cat"].includes(k))for(let x of S){if(x.startsWith("-")||k==="chmod"&&x.startsWith("+"))continue;let I=await realpath(ke__default.resolve(r,x)).catch(()=>null);if(El.info("resolved path",{arg:x,resolved:I}),I){let P=process.platform==="win32"&&I.match(/^\/[a-z]\//)?I.replace(/^\/([a-z])\//,(T,M)=>`${M.toUpperCase()}:\\`).replace(/\//g,"\\"):I;if(!A.containsPath(P)){let T=await Filesystem.isDir(P)?P:Filesystem.dirname(P);w.add(T);}}}k&&k!=="cd"&&(g.add(y),b.add(`${k} *`));}if(w.size>0){let k=Array.from(w).map(S=>Filesystem.join(S,"*"));await s.ask({permission:"external_directory",patterns:k,always:k,metadata:{}});}g.size>0&&await s.ask({permission:"bash",patterns:Array.from(g),always:Array.from(b),metadata:{}});}El.info("Executing bash command",{command:o.command,cwd:r,shell:t});let l=(await je.triggerEvent(HookEvent.ShellEnv,{cwd:r})).output?.env??{},f=Shell.spawn(t,o.command,{cwd:r,env:{...process.env,...l},stdin:"null",stdout:"pipe",stderr:"pipe",signal:s.abort}),m="";s.metadata({metadata:{output:"",description:o.description}});let a=w=>{m+=w.toString("utf-8"),s.metadata({metadata:{output:m.length>Pl?m.slice(0,Pl)+`
595
+
596
+ ...`:m,description:o.description}});};f.stdout.on("data",a),f.stderr.on("data",a);let p=false,d=false,h=setTimeout(()=>{p=true,f.kill();},i+100);try{let w=await f.exited;clearTimeout(h),f.stdout.destroy(),f.stderr.destroy(),s.abort.aborted&&(d=!0);let g=[];return p&&g.push(`bash tool terminated command after exceeding timeout ${i} ms`),d&&g.push("User aborted the command"),g.length>0&&(m+=`
597
+
598
+ <bash_metadata>
599
+ `+g.join(`
600
+ `)+`
601
+ </bash_metadata>`),{title:o.description,metadata:{output:m.length>Pl?m.slice(0,Pl)+`
602
+
603
+ ...`:m,exit:w,description:o.description},output:m}}catch(w){throw clearTimeout(h),w}}}});var qn;(u=>{let t=a.create({service:"file.time"}),e;function n(){return e||(e=A.state(()=>({read:{},locks:new Map}))),e}function o(){return n()()}u.state=o;function s(l,f){t.info("read",{sessionID:l,file:f});let{read:m}=o();m[l]=m[l]||{},m[l][f]=new Date;}u.read=s;function r(l,f){return o().read[l]?.[f]}u.get=r;async function i(l,f){let m=o(),a=m.locks.get(l)??Promise.resolve(),p=()=>{},d=new Promise(w=>{p=w;}),h=a.then(()=>d);m.locks.set(l,h),await a;try{return await f()}finally{p(),m.locks.get(l)===h&&m.locks.delete(l);}}u.withLock=i;async function c(l,f){if(a$2.EASBOT_DISABLE_FILETIME_CHECK===true)return;let m=r(l,f);if(!m)throw new Error(`You must read file ${f} before overwriting it. Use the Read tool first`);let a=await PKG.file(f).stat();if(a.mtime.getTime()>m.getTime())throw new Error(`File ${f} has been modified since it was last read.
604
+ Last modification: ${a.mtime.toISOString()}
605
+ Last read: ${m.toISOString()}
606
+
607
+ Please read the file again before modifying it.`)}u.assert=c;})(qn||(qn={}));async function yn(t,e,n){if(!e||n?.bypass)return;let o=Filesystem.normalize(ke__default.isAbsolute(e)?e:ke__default.resolve(A.directory,e)),s=await yk(o),r=s??o;if(A.containsPath(r))return;let c=(n?.kind??"file")==="directory"?o:ke__default.posix.dirname(o),u=ke__default.posix.join(c,"*");await t.ask({permission:"external_directory",patterns:[u],always:[u],metadata:{filepath:o,realPath:s??void 0,parentDir:c,tool:n?.tool??"read"}});}async function yk(t){try{let e=await Ot.realpath(t);return Filesystem.normalize(e)}catch{return}}var ai=class t extends Error{constructor(n,o,s){let r=o||`Operation '${n}' was aborted`;super(r);b$1(this,"name","AbortError");b$1(this,"operation");b$1(this,"cause");this.operation=n,this.cause=s,Object.setPrototypeOf(this,t.prototype);}static isAbortError(n){return n instanceof t}};var Nt;(o=>{function t(s,r){if(s?.aborted)throw new ai(r,`Operation '${r}' was aborted`)}o.check=t;function e(s,r){let i=new AbortController,{signal:c}=i,u=setTimeout(()=>{i.abort(new Error(`Operation timed out after ${s}ms`));},s);if(r){let l=()=>{clearTimeout(u),i.abort(r.reason);};r.aborted?(clearTimeout(u),i.abort(r.reason)):(r.addEventListener("abort",l,{once:true}),c.addEventListener("abort",()=>{clearTimeout(u),r.removeEventListener("abort",l);},{once:true}));}else c.addEventListener("abort",()=>clearTimeout(u),{once:true});return {signal:c,controller:i}}o.withTimeout=e;async function n(s,r,i){if(t(r,s),!r)return await i(void 0);let c=new Promise((u,l)=>{if(r.aborted)l(new ai(s,`Operation '${s}' was aborted`,r.reason));else {let f=()=>{l(new ai(s,`Operation '${s}' was aborted`,r.reason));};r.addEventListener("abort",f,{once:true});}});return await Promise.race([i(r),c])}o.wrap=n;})(Nt||(Nt={}));var xk=loadTextFile("./edit.txt",import.meta.url),Ik=xk(),mp=20;function Dl(t){return t.replaceAll(`\r
608
+ `,`
609
+ `)}var Al=Le.define("edit",{description:Ik,parameters:z$1.object({filePath:z$1.string().describe("The absolute path to the file to modify"),oldString:z$1.string().describe("The text to replace"),newString:z$1.string().describe("The text to replace it with (must be different from oldString)"),replaceAll:z$1.boolean().optional().describe("Replace all occurrences of oldString (default false)")}),async execute(t,e){if(Nt.check(e.abort,"edit"),!t.filePath)throw new Error("filePath is required");if(t.oldString===t.newString)throw new Error("No changes to apply: oldString and newString are identical.");let n=Filesystem.normalize(ke.isAbsolute(t.filePath)?t.filePath:Filesystem.join(A.directory,t.filePath));await yn(e,n,{tool:"edit"});let o="",s="",r="";await qn.withLock(n,async()=>{if(t.oldString===""){let f=await PKG.file(n).exists();r=t.newString,o=Zo(createTwoFilesPatch(n,n,s,r)),await e.ask({permission:"edit",patterns:[ke.posix.relative(A.worktree,n)],always:["*"],metadata:{filepath:n,diff:o}}),Nt.check(e.abort,"edit"),await PKG.write(n,t.newString),await ue.publish(It.Event.Edited,{file:n}),await ue.publish(to.Event.Updated,{file:n,event:f?"change":"add"}),qn.read(e.sessionID,n);return}let l=await Ot.stat(n).catch(()=>null);if(!l)throw new Error(`File ${n} not found`);if(l.isDirectory())throw new Error(`Path is a directory, not a file: ${n}`);await qn.assert(e.sessionID,n),s=await Ot.readFile(n,"utf-8"),r=_k(s,t.oldString,t.newString,t.replaceAll),o=Zo(createTwoFilesPatch(n,n,Dl(s),Dl(r))),await e.ask({permission:"edit",patterns:[ke.posix.relative(A.worktree,n)],always:["*"],metadata:{filepath:n,diff:o}}),Nt.check(e.abort,"edit"),await Ot.writeFile(n,r),await ue.publish(It.Event.Edited,{file:n}),await ue.publish(to.Event.Updated,{file:n,event:"change"}),r=await Ot.readFile(n,"utf-8"),o=Zo(createTwoFilesPatch(n,n,Dl(s),Dl(r))),qn.read(e.sessionID,n);});let i={file:n,before:s,after:r,additions:0,deletions:0};for(let l of diffLines(s,r))l.added&&(i.additions+=l.count||0),l.removed&&(i.deletions+=l.count||0);e.metadata({metadata:{diff:o,filediff:i,diagnostics:{}}});let c="Edit applied successfully.";Nt.check(e.abort,"edit");let u=[];if(await Ve.isAvailable(e.sessionID)){await Ve.touchFile(n,true);let l=await Ve.getFileDiagnostics(n);u.push(...l);let f=l.filter(m=>m.severity===1);if(f.length>0){let m=f.slice(0,mp),a=f.length>mp?`
610
+ ... and ${f.length-mp} more`:"",p=m.map(d=>Ve.Diagnostic.pretty(d));c+=`
611
+
612
+ LSP errors detected in this file, please fix:
613
+ <diagnostics file="${n}">
614
+ ${p.join(`
615
+ `)}${a}
616
+ </diagnostics>`;}}return {metadata:{filepath:n,diagnostics:{[Filesystem.normalize(n)]:u},diff:o,filediff:i},title:`${ke.posix.relative(A.worktree,n)}`,output:c}}}),Zg=0,vk=.3;function eh(t,e){if(t===""||e==="")return Math.max(t.length,e.length);let n=Array.from({length:t.length+1},(o,s)=>Array.from({length:e.length+1},(r,i)=>s===0?i:i===0?s:0));for(let o=1;o<=t.length;o++)for(let s=1;s<=e.length;s++){let r=t[o-1]===e[s-1]?0:1,i=n[o],c=n[o-1];i[s]=Math.min((c[s]??0)+1,(i[s-1]??0)+1,(c[s-1]??0)+r);}return n[t.length]?.[e.length]??0}var Sk=function*(t,e){yield e;},Ck=function*(t,e){let n=t.split(`
617
+ `),o=e.split(`
618
+ `);o[o.length-1]===""&&o.pop();for(let s=0;s<=n.length-o.length;s++){let r=true;for(let i=0;i<o.length;i++){let c=n[s+i],u=o[i];if(c===void 0||u===void 0){r=false;break}let l=c.trim(),f=u.trim();if(l!==f){r=false;break}}if(r){let i=0;for(let u=0;u<s;u++){let l=n[u];l!==void 0&&(i+=l.length+1);}let c=i;for(let u=0;u<o.length;u++){let l=n[s+u];l!==void 0&&(c+=l.length,u<o.length-1&&(c+=1));}yield t.substring(i,c);}}},kk=function*(t,e){let n=t.split(`
619
+ `),o=e.split(`
620
+ `);if(o.length<3)return;o[o.length-1]===""&&o.pop();let s=o[0]?.trim()??"",r=o[o.length-1]?.trim()??"",i=o.length,c=[];for(let f=0;f<n.length;f++){let m=n[f];if(m!==void 0&&m.trim()===s)for(let a=f+2;a<n.length;a++){let p=n[a];if(p!==void 0&&p.trim()===r){c.push({startLine:f,endLine:a});break}}}if(c.length===0)return;if(c.length===1&&c[0]){let{startLine:f,endLine:m}=c[0],a=m-f+1,p=0,d=Math.min(i-2,a-2);if(d>0)for(let h=1;h<i-1&&h<a-1;h++){let w=n[f+h],g=o[h];if(!w||!g)continue;let b=w.trim(),v=g.trim(),k=Math.max(b.length,v.length);if(k===0)continue;let S=eh(b,v);if(p+=(1-S/k)/d,p>=Zg)break}else p=1;if(p>=Zg){let h=0;for(let g=0;g<f;g++){let b=n[g];b!==void 0&&(h+=b.length+1);}let w=h;for(let g=f;g<=m;g++){let b=n[g];b!==void 0&&(w+=b.length,g<m&&(w+=1));}yield t.substring(h,w);}return}let u=null,l=-1;for(let f of c){let{startLine:m,endLine:a}=f,p=a-m+1,d=0,h=Math.min(i-2,p-2);if(h>0){for(let w=1;w<i-1&&w<p-1;w++){let g=n[m+w],b=o[w];if(!g||!b)continue;let v=g.trim(),k=b.trim(),S=Math.max(v.length,k.length);if(S===0)continue;let y=eh(v,k);d+=1-y/S;}d/=h;}else d=1;d>l&&(l=d,u=f);}if(l>=vk&&u){let{startLine:f,endLine:m}=u,a=0;for(let d=0;d<f;d++){let h=n[d];h&&(a+=h.length+1);}let p=a;for(let d=f;d<=m;d++){let h=n[d];h&&(p+=h.length,d<m&&(p+=1));}yield t.substring(a,p);}},Pk=function*(t,e){let n=i=>i.replace(/\s+/g," ").trim(),o=n(e),s=t.split(`
621
+ `);for(let i=0;i<s.length;i++){let c=s[i];if(n(c)===o)yield c;else if(n(c).includes(o)){let l=e.trim().split(/\s+/);if(l.length>0&&l[0]){let f=l.map(m=>m.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("\\s+");try{let m=new RegExp(f),a=c.match(m);a?.[0]&&(yield a[0]);}catch{}}}}let r=e.split(`
622
+ `);if(r.length>1)for(let i=0;i<=s.length-r.length;i++){let c=s.slice(i,i+r.length);n(c.join(`
623
+ `))===o&&(yield c.join(`
624
+ `));}},Ek=function*(t,e){let n=i=>{let c=i.split(`
625
+ `),u=c.filter(f=>f.trim().length>0);if(u.length===0)return i;let l=Math.min(...u.map(f=>f.match(/^(\s*)/)?.[1]?.length??0));return c.map(f=>f.trim().length===0?f:f.slice(l)).join(`
626
+ `)},o=n(e),s=t.split(`
627
+ `),r=e.split(`
628
+ `);for(let i=0;i<=s.length-r.length;i++){let c=s.slice(i,i+r.length).join(`
629
+ `);n(c)===o&&(yield c);}},Tk=function*(t,e){let n=i=>i.replace(/\\(n|t|r|'|"|`|\\|\n|\$)/g,(c,u)=>{switch(u){case "n":return `
630
+ `;case "t":return " ";case "r":return "\r";case "'":return "'";case '"':return '"';case "`":return "`";case "\\":return "\\";case `
631
+ `:return `
632
+ `;case "$":return "$";default:return c}}),o=n(e);t.includes(o)&&(yield o);let s=t.split(`
633
+ `),r=o.split(`
634
+ `);for(let i=0;i<=s.length-r.length;i++){let c=s.slice(i,i+r.length).join(`
635
+ `);n(c)===o&&(yield c);}},Dk=function*(t,e){let n=0;for(;;){let o=t.indexOf(e,n);if(o===-1)break;yield e,n=o+e.length;}},Ak=function*(t,e){let n=e.trim();if(n===e)return;t.includes(n)&&(yield n);let o=t.split(`
636
+ `),s=e.split(`
637
+ `);for(let r=0;r<=o.length-s.length;r++){let i=o.slice(r,r+s.length).join(`
638
+ `);i.trim()===n&&(yield i);}},Rk=function*(t,e){let n=e.split(`
639
+ `);if(n.length<3)return;n[n.length-1]===""&&n.pop();let o=t.split(`
640
+ `),s=n[0]?.trim(),r=n[n.length-1]?.trim();if(!(!s||!r))for(let i=0;i<o.length;i++){let c=o[i];if(!(!c||c.trim()!==s))for(let u=i+2;u<o.length;u++){let l=o[u];if(!l||l.trim()!==r)continue;let f=o.slice(i,u+1),m=f.join(`
641
+ `);if(f.length===n.length){let a=0,p=0;for(let d=1;d<f.length-1;d++){let h=f[d],w=n[d];if(!h||!w)continue;let g=h.trim(),b=w.trim();(g.length>0||b.length>0)&&(p++,g===b&&a++);}if(p===0||a/p>=.5){yield m;break}}break}}};function Zo(t){let e=t.split(`
642
+ `),n=e.filter(r=>(r.startsWith("+")||r.startsWith("-")||r.startsWith(" "))&&!r.startsWith("---")&&!r.startsWith("+++"));if(n.length===0)return t;let o=1/0;for(let r of n){let i=r.slice(1);if(i.trim().length>0){let c=i.match(/^(\s*)/);c?.[1]&&(o=Math.min(o,c[1].length));}}return o===1/0||o===0?t:e.map(r=>{let i=r[0];if(!i)return r;if((r.startsWith("+")||r.startsWith("-")||r.startsWith(" "))&&!r.startsWith("---")&&!r.startsWith("+++")){let c=r.slice(1);return i+c.slice(o)}return r}).join(`
643
+ `)}function _k(t,e,n,o=false){if(e===n)throw new Error("No changes to apply: oldString and newString are identical.");let s=true;for(let r of [Sk,Ck,kk,Pk,Ek,Tk,Ak,Rk,Dk])for(let i of r(t,e)){let c=t.indexOf(i);if(c===-1)continue;if(s=false,o)return t.replaceAll(i,n);let u=t.lastIndexOf(i);if(c===u)return t.substring(0,c)+n+t.substring(c+i.length)}throw s?new Error("Could not find oldString in the file. It must match exactly, including whitespace, indentation, and line endings."):new Error("Found multiple matches for oldString. Provide more surrounding context to make the match unique.")}var jk=loadTextFile("./glob.txt",import.meta.url),Lk=jk(),nh=Le.define("glob",{description:Lk,parameters:z$1.object({pattern:z$1.string().describe("The glob pattern to match files against"),path:z$1.string().optional().describe('The directory to search in. If not specified, the current working directory will be used. IMPORTANT: Omit this field to use the default directory. DO NOT enter "undefined" or "null" - simply omit it for the default behavior. Must be a valid directory path if provided.'),limit:z$1.number().optional().default(100).describe("Maximum number of results to return (default: 100)")}),async execute(t,e){await e.ask({permission:"glob",patterns:[t.pattern],always:["*"],metadata:{pattern:t.pattern,path:t.path}});let n=t.path??A.directory;n=Filesystem.normalize(ke__default.isAbsolute(n)?n:ke__default.resolve(A.directory,n)),await yn(e,n,{kind:"directory",tool:"glob"});let o=t.limit??100,s=[],r=false;for await(let c of a$9.files({cwd:n,glob:[t.pattern],signal:e.abort})){if(s.length>=o){r=true;break}let u=Filesystem.join(n,c),l=await PKG.file(u).stat().then(f=>f.mtime.getTime()).catch(()=>0);s.push({path:u,mtime:l});}s.sort((c,u)=>u.mtime-c.mtime);let i=[];return s.length===0&&i.push("No files found"),s.length>0&&(i.push(...s.map(c=>c.path)),r&&(i.push(""),i.push(`[${o} results limit reached. Use limit=${o*2} for more, or refine pattern]`))),{title:ke__default.posix.relative(A.worktree,n),metadata:{pattern:t.pattern,path:n,count:s.length,truncated:r,resultLimitReached:r?o:void 0},output:i.join(`
644
+ `)}}});var Uk=loadTextFile("./grep.txt",import.meta.url),zk=Uk(),rh=2e3,ah=Le.define("grep",{description:zk,parameters:z$1.object({pattern:z$1.string().describe("The regex pattern to search for in file contents"),path:z$1.string().optional().describe("The directory to search in. Defaults to the current working directory."),include:z$1.string().optional().describe('File pattern to include in the search (e.g. "*.js", "*.{ts,tsx}")')}),async execute(t,e){if(!t.pattern)throw new Error("pattern is required");await e.ask({permission:"grep",patterns:[t.pattern],always:["*"],metadata:{pattern:t.pattern,path:t.path,include:t.include}});let n=t.path??A.directory;n=Filesystem.normalize(ke__default.isAbsolute(n)?n:ke__default.resolve(A.directory,n)),await yn(e,n,{kind:"directory",tool:"grep"});let o=await a$9.filepath(),s=100,r=["--json","--line-number","--color=never","--hidden","--no-messages","--regexp",t.pattern];t.include&&r.push("--glob",t.include),r.push(n);let i=PKG.spawn([o,...r],{stdin:"null",stdout:"pipe",stderr:"pipe"}),c=createInterface({input:i.stdout}),u="",l=0,f=false,m=[];i.stderr?.on("data",g=>{u+=g.toString("utf-8");}),c.on("line",g=>{if(!g.trim()||l>=s)return;let b;try{b=JSON.parse(g);}catch{return}if(b.type==="match"){let v=Filesystem.toUnixPath(b.data?.path?.text),k=b.data?.line_number,S=b.data?.lines?.text;v&&typeof k=="number"&&S&&Ot.stat(v).then(y=>{l++,m.push({path:v,lineNum:k,lineText:S.replace(/\r?\n$/,""),modTime:y.mtime.getTime()}),l>=s&&(f=true,i.kill()||i.kill("SIGTERM"));}).catch(()=>{});}});let a=await i.exited;if(m.length===0){if(a!==0&&a!==1&&a!==2){let g=u.trim()||`ripgrep exited with code ${a}`;throw new Error(g)}return {title:t.pattern,metadata:{matches:0,truncated:false},output:"No files found"}}m.sort((g,b)=>b.modTime-g.modTime);let p=f,d=[`Found ${m.length} matches`],h="";for(let g of m){h!==g.path&&(h!==""&&d.push(""),h=g.path,d.push(`${g.path}:`));let b=g.lineText.length>rh?g.lineText.substring(0,rh)+"...":g.lineText;d.push(` Line ${g.lineNum}: ${b}`);}return p&&(d.push(""),d.push("(Results are truncated. Consider using a more specific path or pattern.)")),a===2&&(d.push(""),d.push("(Some paths were inaccessible and skipped)")),{title:t.pattern,metadata:{pattern:t.pattern,path:n,matches:m.length,truncated:p},output:d.join(`
645
+ `)}}});var Hk=loadTextFile("./batch.txt",import.meta.url),qk=Hk(),gp=new Set(["batch"]),Gk=new Set(["invalid","patch",...gp]),ch=Le.define("batch",async()=>{let t=await he.get();return {isEnabled:async()=>t.experimental?.batch_tool===true,description:qk,parameters:z$1.object({tool_calls:z$1.array(z$1.object({tool:z$1.string().describe("The name of the tool to execute"),parameters:z$1.object({}).loose().describe("Parameters for the tool")})).min(1,"Provide at least one tool call").describe("Array of tool calls to execute in parallel")}),formatValidationError(e){return `Invalid parameters for tool 'batch':
646
+ ${e.issues.map(o=>` - ${o.path.length>0?o.path.join("."):"root"}: ${o.message}`).join(`
647
+ `)}
648
+
649
+ Expected payload format:
650
+ [{"tool": "tool_name", "parameters": {...}}, {...}]`},async execute(e,n){let{Session:o}=await import('./session-BHXYW2JD.mjs'),{Identifier:s}=await import('@easbot/utils'),r=e.tool_calls.slice(0,25),i=e.tool_calls.slice(25),{ToolRegistry:c}=await import('./registry-TL5F5F7C.mjs'),u=await c.tools({modelID:"",providerID:""}),l=new Map(u.map(w=>[w.id,w])),f=async w=>{let g=Date.now(),b=s.ascending("part");try{if(gp.has(w.tool))throw new Error(`Tool '${w.tool}' is not allowed in batch. Disallowed tools: ${Array.from(gp).join(", ")}`);let v=l.get(w.tool);if(!v){let x=Array.from(l.keys()).filter(I=>!Gk.has(I));throw new Error(`Tool '${w.tool}' not in registry. External tools (MCP, environment) cannot be batched - call them directly. Available tools: ${x.join(", ")}`)}let k=v.parameters.parse(w.parameters);await o.updatePart({id:b,messageID:n.messageID,sessionID:n.sessionID,type:"tool",tool:w.tool,callID:b,state:{status:"running",input:w.parameters,time:{start:g}}});let S=await v.execute(k,{...n,callID:b}),y;return S.attachments&&S.attachments.length>0&&(y=S.attachments.map(x=>({...x,id:x.id??s.ascending("part"),sessionID:x.sessionID??n.sessionID,messageID:x.messageID??n.messageID}))),await o.updatePart({id:b,messageID:n.messageID,sessionID:n.sessionID,type:"tool",tool:w.tool,callID:b,state:{status:"completed",input:w.parameters,output:S.output,title:S.title,metadata:S.metadata,attachments:y,time:{start:g,end:Date.now()}}}),{success:!0,tool:w.tool,result:S}}catch(v){return await o.updatePart({id:b,messageID:n.messageID,sessionID:n.sessionID,type:"tool",tool:w.tool,callID:b,state:{status:"error",input:w.parameters,error:v instanceof Error?v.message:String(v),time:{start:g,end:Date.now()}}}),{success:false,tool:w.tool,error:v}}},m=await Promise.all(r.map(w=>f(w))),a=Date.now();for(let w of i){let g=s.ascending("part");await o.updatePart({id:g,messageID:n.messageID,sessionID:n.sessionID,type:"tool",tool:w.tool,callID:g,state:{status:"error",input:w.parameters,error:"Maximum of 25 tools allowed in batch",time:{start:a,end:a}}}),m.push({success:false,tool:w.tool,error:new Error("Maximum of 25 tools allowed in batch")});}let p=m.filter(w=>w.success).length,d=m.length-p,h=d>0?`Executed ${p}/${m.length} tools successfully. ${d} failed.`:`All ${p} tools executed successfully.
651
+
652
+ Keep using the batch tool for optimal performance in your next response!`;return {title:`Batch execution (${p}/${m.length} successful)`,output:h,attachments:m.filter(w=>w.success).flatMap(w=>w.result.attachments??[]),metadata:{totalCalls:m.length,successful:p,failed:d,tools:e.tool_calls.map(w=>w.tool),details:m.map(w=>({tool:w.tool,success:w.success}))}}}}});var Kk=a.create({service:"instruction"}),lh=["AGENTS.md"];function Jk(){let t=[];return a$2.EASBOT_CONFIG_DIR&&t.push(ke__default.join(a$2.EASBOT_CONFIG_DIR,"AGENTS.md")),t.push(ke__default.join(a$1.Path.config,"AGENTS.md")),t}async function Yk(t){return a$2.EASBOT_DISABLE_PROJECT_CONFIG?a$2.EASBOT_CONFIG_DIR?Filesystem.globUp(t,a$2.EASBOT_CONFIG_DIR,a$2.EASBOT_CONFIG_DIR).catch(()=>[]):(Kk.warn(`Skipping relative instruction "${t}" - no EASBOT_CONFIG_DIR set while project config is disabled`),[]):Filesystem.globUp(t,A.directory,A.worktree).catch(()=>[])}var ir;(m=>{let t;function e(){return t||(t=A.state(async()=>({claims:new Map}))),t}function n(){return e()()}async function o(a,p){let h=(await n()).claims.get(a);return h?h.has(p):false}async function s(a,p){let d=await n(),h=d.claims.get(a);h||(h=new Set,d.claims.set(a,h)),h.add(p);}async function r(a){(await n()).claims.delete(a);}m.clear=r;async function i(){let a=await he.get(),p=new Set;if(!a$2.EASBOT_DISABLE_PROJECT_CONFIG)for(let d of lh){let h=await Filesystem.findUp(d,A.directory,A.worktree);if(h.length>0){h.forEach(w=>{p.add(ke__default.resolve(w));});break}}for(let d of Jk())try{await Ot__default.access(d),p.add(ke__default.resolve(d));break}catch{}if(a.instructions)for(let d of a.instructions){if(d.startsWith("https://")||d.startsWith("http://"))continue;d.startsWith("~/")&&(d=ke__default.join(Mc.homedir(),d.slice(2))),(ke__default.isAbsolute(d)?await glob(ke__default.basename(d),{cwd:ke__default.dirname(d),absolute:true,nodir:true,follow:false,dot:false}):await Yk(d)).forEach(w=>{p.add(ke__default.resolve(w));});}return p}m.systemPaths=i;async function c(){let a=await he.get(),p=await i(),d=Array.from(p).map(async g=>{let b=await Ot__default.readFile(g,"utf-8").catch(()=>"");return {path:g,content:b}}),h=[];if(a.instructions)for(let g of a.instructions)(g.startsWith("https://")||g.startsWith("http://"))&&h.push(g);let w=h.map(g=>fetch(g,{signal:AbortSignal.timeout(5e3)}).then(b=>b.ok?b.text():"").catch(()=>"").then(b=>b?"Instructions from: "+g+`
653
+ `+b:""));return Promise.all([...d,...w]).then(g=>g.filter(Boolean))}m.system=c;function u(a){let p=new Set;for(let d of a)for(let h of d.parts)if(h.type==="tool"&&h.tool==="read"&&h.state.status==="completed"){if(h.state.time.compacted)continue;let w=h.state.metadata?.loaded;if(!w||!Array.isArray(w))continue;for(let g of w)typeof g=="string"&&p.add(g);}return p}m.loaded=u;async function l(a){for(let p of lh){let d=ke__default.resolve(ke__default.join(a,p));try{return await Ot__default.access(d),d}catch{}}}m.find=l;async function f(a,p,d){let h=await i(),w=u(a),g=[],b=ke__default.resolve(p),v=ke__default.dirname(b),k=ke__default.resolve(A.directory);for(;v.startsWith(k)&&v!==k;){let S=await l(v);if(S&&S!==b&&!h.has(S)&&!w.has(S)&&!o(d,S)){await s(d,S);let y=await Ot__default.readFile(S,"utf-8").catch(()=>{});y&&g.push({filepath:S,content:"Instructions from: "+S+`
654
+ `+y});}v=ke__default.dirname(v);}return g}m.resolve=f;})(ir||(ir={}));var eP=loadTextFile("./read.txt",import.meta.url),tP=eP(),dh=2e3,yp=2e3,nP=`... (line truncated to ${yp} chars)`,uh=50*1024,oP=`${uh/1024} KB`,jl=Le.define("read",{description:tP,parameters:z$1.object({filePath:z$1.string().describe("The absolute path to the file or directory to read"),offset:z$1.coerce.number().describe("The line number to start reading from (1-indexed)").optional(),limit:z$1.coerce.number().describe("The maximum number of lines to read (defaults to 2000)").optional()}),async execute(t,e){if(t.offset!==void 0&&t.offset<1)throw new Error("offset must be greater than or equal to 1");let n=Filesystem.normalize(ke.isAbsolute(t.filePath)?t.filePath:ke.resolve(A.directory,t.filePath)),o=ke.posix.relative(A.worktree,n),s=Filesystem.stat(n);if(await yn(e,n,{bypass:!!e.extra?.bypassCwdCheck,kind:s?.isDirectory()?"directory":"file",tool:"read"}),await e.ask({permission:"read",patterns:[ke.posix.relative(A.worktree,n)],always:["*"],metadata:{}}),!s){let M=Filesystem.dirname(n),j=Filesystem.basename(n),N=await Ot.readdir(M).then(K=>K.filter(te=>te.toLowerCase().includes(j.toLowerCase())||j.toLowerCase().includes(te.toLowerCase())).map(te=>Filesystem.join(M,te)).slice(0,3)).catch(()=>[]);throw N.length>0?new Error(`File not found: ${n}
655
+
656
+ Did you mean one of these?
657
+ ${N.join(`
658
+ `)}`):new Error(`File not found: ${n}`)}if(s.isDirectory()){let M=await Ot.readdir(n,{withFileTypes:true}),j=await Promise.all(M.map(async O=>O.isDirectory()||O.isSymbolicLink()&&(await Ot.stat(Filesystem.join(n,O.name)).catch(()=>{}))?.isDirectory()?O.name+"/":O.name));j.sort((O,C)=>O.localeCompare(C));let N=t.limit??dh,K=t.offset??1,te=K-1,U=j.slice(te,te+N),_=te+U.length<j.length,D=[`<path>${n}</path>`,"<type>directory</type>","<entries>",U.join(`
659
+ `),_?`
660
+ (Showing ${U.length} of ${j.length} entries. Use 'offset' parameter to read beyond entry ${K+U.length})`:`
661
+ (${j.length} entries)`,"</entries>"].join(`
662
+ `);return {title:o,output:D,metadata:{preview:U.slice(0,20).join(`
663
+ `),truncated:_,loaded:[]}}}let r=await ir.resolve(e.messages,n,e.messageID),i=Filesystem.mimeType(n),c=i?.startsWith("image/")&&i!=="image/svg+xml"&&i!=="image/vnd.fastbidsheet";if(c||i==="application/pdf"){let M=`${c?"Image":"PDF"} read successfully`;return {title:o,output:M,metadata:{preview:M,truncated:false,loaded:r.map(j=>j.filepath)},attachments:[{type:"file",mime:i??"application/octet-stream",url:`data:${i??"application/octet-stream"};base64,${Buffer.from(await Filesystem.readBytes(n)).toString("base64")}`}]}}if(await sP(n,Number(s.size)))throw new Error(`Cannot read binary file: ${n}`);let f=createReadStream(n,{encoding:"utf8"}),m=createInterface({input:f,crlfDelay:1/0}),a=t.limit??dh,p=t.offset??1,d=p-1,h=[],w=0,g=0,b=false,v=false;try{for await(let M of m){if(g+=1,g<=d)continue;if(h.length>=a){v=!0;continue}let j=M.length>yp?M.substring(0,yp)+nP:M,N=Buffer.byteLength(j,"utf-8")+(h.length>0?1:0);if(w+N>uh){b=!0,v=!0;break}h.push(j),w+=N;}}finally{m.close(),f.destroy();}if(g<p&&!(g===0&&p===1))throw new Error(`Offset ${p} is out of range for this file (${g} lines)`);let k=h.map((M,j)=>`${j+p}: ${M}`),S=h.slice(0,20).join(`
664
+ `),y=[`<path>${n}</path>`,"<type>file</type>","<content>"].join(`
665
+ `);y+=k.join(`
666
+ `);let x=g,I=p+h.length-1,P=I+1,T=v||b;return b?y+=`
667
+
668
+ (Output capped at ${oP}. Showing lines ${p}-${I}. Use offset=${P} to continue.)`:v?y+=`
669
+
670
+ (Showing lines ${p}-${I} of ${x}. Use offset=${P} to continue.)`:y+=`
671
+
672
+ (End of file - total ${x} lines)`,y+=`
673
+ </content>`,await Ve.isAvailable(e.sessionID)&&await Ve.touchFile(n,false),qn.read(e.sessionID,n),r.length>0&&(y+=`
674
+
675
+ <system-reminder>
676
+ ${r.map(M=>M.content).join(`
677
+
678
+ `)}
679
+ </system-reminder>`),{title:o,output:y,metadata:{filepath:n,preview:S,truncated:T,loaded:r.map(M=>M.filepath)}}}});async function sP(t,e){switch(Filesystem.extname(t).toLowerCase()){case ".zip":case ".tar":case ".gz":case ".exe":case ".dll":case ".so":case ".class":case ".jar":case ".war":case ".7z":case ".doc":case ".docx":case ".xls":case ".xlsx":case ".ppt":case ".pptx":case ".odt":case ".ods":case ".odp":case ".bin":case ".dat":case ".obj":case ".o":case ".a":case ".lib":case ".wasm":case ".pyc":case ".pyo":return true;}if(e===0)return false;let o=await Ot.open(t,"r");try{let s=Math.min(4096,e),r=Buffer.alloc(s),i=await o.read(r,0,s,0);if(i.bytesRead===0)return !1;let c=0;for(let u=0;u<i.bytesRead;u++){let l=r[u];if(l!==void 0){if(l===0)return !0;(l<9||l>13&&l<32)&&c++;}}return c/i.bytesRead>.3}finally{await o.close();}}a.create({service:"task-tool"});var aP=loadTextFile("./task.txt",import.meta.url),cP=aP(),Sa={create:z$1.object({operation:z$1.literal("create").describe("Create a new async subtask"),description:z$1.string().describe("Task description, brief summary of task goal"),prompt:z$1.string().describe("Task prompt, detailed description of work to execute"),subagent_type:z$1.string().describe("Agent type, specifies the Agent role for executing the task")}),query:z$1.object({operation:z$1.literal("query").describe("Query task status or list"),taskId:z$1.string().optional().describe("Task ID, omit to list all tasks")}),continue:z$1.object({operation:z$1.literal("continue").describe("Continue executing a task"),taskId:z$1.string().describe("Task ID, the task to continue executing")}),delete:z$1.object({operation:z$1.literal("delete").describe("Delete task record"),taskId:z$1.string().describe("Task ID, the task to delete")}),agents:z$1.object({operation:z$1.literal("agents").describe("Get list of available Agent types")})},lP=z$1.discriminatedUnion("operation",[Sa.create,Sa.query,Sa.continue,Sa.delete,Sa.agents]),Ca=Le.define("task",{description:cP,parameters:lP,formatValidationError(t){return `Task tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){if(t.operation==="create")return dP(t,e);if(t.operation==="query")return uP(t,e);if(t.operation==="continue")return pP(t,e);if(t.operation==="delete")return mP(t);if(t.operation==="agents")return gP();throw new Error(`Unknown operation: ${t.operation}`)}});async function dP(t,e){if(!e.messageID)throw new Error("messageID is required");if((await ve.get({sessionID:e.sessionID,messageID:e.messageID}))?.info.role!=="assistant")throw new Error("Not an assistant message");let o=await Bt.getRunningCount(e.sessionID);if(o>=Bt.MAX_CONCURRENT_TASKS)throw new Error(`Too many concurrent tasks: ${o} running, max is ${Bt.MAX_CONCURRENT_TASKS}`);e.extra?.bypassAgentCheck||await e.ask({permission:"task",patterns:[t.subagent_type],always:["*"],metadata:{description:t.description,subagent_type:t.subagent_type}});let s=Identifier.ascending("task"),r=Date.now();await je.triggerEvent(HookEvent.TaskStart,{taskId:s,sessionId:e.sessionID,source:"tool",agentType:t.subagent_type,description:t.description,prompt:t.prompt}),e.metadata({title:t.description,metadata:{taskId:s}});let i=[{type:"text",text:t.prompt}],c=await Ue.get(t.subagent_type);return Zs.runAsync({source:e.sessionID,title:t.description,agent:"task_general",system:c?.prompt??"",parts:i,config:{runMode:"ephemeral",transport:"stdio"}},async u=>{let l=Date.now()-r;await je.triggerEvent(HookEvent.TaskComplete,{taskId:s,sessionId:e.sessionID,source:"tool",result:u.output,duration:l,agentType:t.subagent_type,metadata:{...u.metadata,tool:"task",title:t.description}});}),await je.triggerEvent(HookEvent.TaskRunning,{taskId:s,sessionId:e.sessionID,source:"tool"}),{output:`taskId: ${s}
680
+
681
+ Task started, results will be injected when complete`,title:t.description,metadata:{operation:"create",taskId:s}}}async function uP(t,e){if(t.taskId){let s=await Bt.get(t.taskId);if(!s)return {output:`<task>
682
+ Task not found: ${t.taskId}
683
+ </task>`,title:"Task Query",metadata:{operation:"query",found:false,taskId:t.taskId}};let r=[`<task taskId="${s.taskId}" status="${s.status}">`];return s.description&&r.push(` description: ${s.description}`),s.agentType&&r.push(` agent: ${s.agentType}`),s.result&&r.push(` result: ${s.result}`),s.error&&r.push(` error: ${s.error}`),s.duration&&r.push(` duration: ${s.duration}ms`),r.push(` created: ${new Date(s.createdAt).toISOString()}`),r.push(` updated: ${new Date(s.updatedAt).toISOString()}`),r.push("</task>"),{output:r.join(`
684
+ `),title:`Task: ${s.description}`,metadata:{operation:"query",found:true,taskId:t.taskId,status:s.status}}}let n=await Bt.list(e.sessionID);if(n.length===0)return {output:`<tasks>
685
+ No tasks found
686
+ </tasks>`,title:"Task Query",metadata:{operation:"query",total:0}};let o=[`<tasks total="${n.length}">`];for(let s of n)o.push(`[task_id="${s.taskId}"]`),o.push(` status: ${s.status}`),s.description&&o.push(` description: ${s.description}`),s.agentType&&o.push(` agent: ${s.agentType}`),o.push("");return o.push("</tasks>"),{output:o.join(`
687
+ `),title:`Tasks: ${n.length}`,metadata:{operation:"query",total:n.length}}}async function pP(t,e){let n=await Bt.get(t.taskId);if(!n)return {output:`<task>
688
+ Task not found: ${t.taskId}
689
+ </task>`,title:"Task Continue",metadata:{operation:"continue",found:false,taskId:t.taskId}};if(n.status==="completed"||n.status==="running")return {output:`<task>
690
+ Task ${t.taskId} is already ${n.status}. Cannot restart.
691
+ </task>`,title:"Task Continue",metadata:{operation:"continue",taskId:t.taskId,status:n.status}};await Bt.update(t.taskId,{status:"running"});let o=Date.now();e.metadata({title:n.description,metadata:{taskId:t.taskId}});let s=[{type:"text",text:n.prompt}],r=await Ue.get(n.agentType);return Zs.runAsync({source:e.sessionID,title:n.description,agent:"task_general",system:r?.prompt??"",parts:s,config:{runMode:"ephemeral",transport:"stdio"}},async i=>{let c=Date.now()-o;await Bt.update(t.taskId,{status:"completed",result:i.output,duration:c}),await je.triggerEvent(HookEvent.TaskComplete,{taskId:t.taskId,sessionId:e.sessionID,source:"tool",result:i.output,duration:c,agentType:n.agentType});}),{output:`taskId: ${t.taskId}
692
+
693
+ Task continued, results will be injected when complete`,title:n.description,metadata:{operation:"continue",taskId:t.taskId}}}async function mP(t,e){return await Bt.get(t.taskId)?(await Bt.remove(t.taskId),{output:`<task>
694
+ Task ${t.taskId} deleted successfully.
695
+ </task>`,title:"Task Delete",metadata:{operation:"delete",found:true,taskId:t.taskId}}):{output:`<task>
696
+ Task not found: ${t.taskId}
697
+ </task>`,title:"Task Delete",metadata:{operation:"delete",found:false,taskId:t.taskId}}}async function fP(){return (await Ue.list()).filter(e=>e.hidden!==true).map(e=>({name:e.name,description:e.description}))}async function gP(){let t=await fP(),e=[`<agents total="${t.length}">`];for(let n of t)e.push(`- ${n.name}: ${n.description??"No description"}`);return e.push("</agents>"),{output:e.join(`
698
+ `),title:`Agents: ${t.length}`,metadata:{operation:"agents",total:t.length}}}var yP=loadTextFile("./todo.txt",import.meta.url),bP=yP(),ph={write:z$1.object({operation:z$1.literal("write").describe("Write or update TODO list"),todos:z$1.union([z$1.array(no.Info),z$1.string()]).describe("The updated todo list")}),read:z$1.object({operation:z$1.literal("read").describe("Read current TODO list")})},wP=z$1.discriminatedUnion("operation",[ph.write,ph.read]),mh=Le.define("todo",{description:bP,parameters:wP,formatValidationError(t){return `Todo tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){if(Nt.check(e.abort,"todo"),t.operation==="write")return xP(t,e);if(t.operation==="read")return IP(t,e);throw new Error(`Unknown operation: ${t.operation}`)}});async function xP(t,e){await e.ask({permission:"todo",patterns:["*"],always:["*"],metadata:{}});let n=[];if(typeof t.todos=="string")try{n=JSON.parse(t.todos);}catch{throw new Error("Invalid todos format: expected JSON array or array")}else n=t.todos;await no.update({sessionID:e.sessionID,todos:n});let o=n.filter(s=>s.status!=="completed").length;return {title:`${o} todos`,output:JSON.stringify(n,null,2),metadata:{operation:"write",total:n.length,active:o,todos:n}}}async function IP(t,e){await e.ask({permission:"todo",patterns:["*"],always:["*"],metadata:{}});let n=await no.get(e.sessionID),o=n.filter(s=>s.status!=="completed").length;return {title:`${o} todos`,metadata:{operation:"read",total:n.length,active:o,todos:n},output:JSON.stringify(n,null,2)}}var PP=loadTextFile("./webfetch.txt",import.meta.url),EP=PP(),gh=5*1024*1024,hh=2*1024*1024,TP=30*1e3,DP=120*1e3,yh=Le.define("webfetch",{description:EP,parameters:z$1.object({url:z$1.string().describe("The URL to fetch content from"),format:z$1.enum(["text","markdown","html"]).default("markdown").describe("The format to return the content in (text, markdown, or html). Defaults to markdown."),timeout:z$1.number().describe("Optional timeout in seconds (max 120)").optional()}),formatValidationError(t){return `WebFetch tool validation error:
699
+ ${t.issues.map(n=>n.path.includes("format")?`Invalid format parameter: "${"received"in n?n.received:"unknown"}". Must be one of: "text", "markdown", or "html". Defaults to "markdown" if not specified.`:n.path.includes("url")?`Invalid URL: ${n.message}. URL must start with http:// or https://.`:n.path.includes("timeout")?`Invalid timeout: ${n.message}. Timeout must be a number (max 120 seconds).`:n.message).join(`
700
+ `)}`},async execute(t,e){if(!t.url.startsWith("http://")&&!t.url.startsWith("https://"))throw new Error("URL must start with http:// or https://");await e.ask({permission:"webfetch",patterns:[t.url],always:["*"],metadata:{url:t.url,format:t.format,timeout:t.timeout}});let n=Math.min((t.timeout??TP/1e3)*1e3,DP),{signal:o,clearTimeout:s}=abortAfterAny(n,e.abort),r="*/*";switch(t.format){case "markdown":r="text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1";break;case "text":r="text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1";break;case "html":r="text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1";break;default:r="text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8";}let i={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",Accept:r,"Accept-Language":"en-US,en;q=0.9"},c;try{let g=await Fetch.get(t.url,{signal:o,headers:i,responseType:"arrayBuffer"});c={ok:g.ok,status:g.status,statusText:g.statusText,headers:g.headers,arrayBuffer:async()=>Promise.resolve(g.data)};}catch(g){if(s(),g instanceof Error){if(g.name==="AbortError")throw new Error(`Request timed out after ${n/1e3} seconds. Try increasing the timeout parameter.`);if(g.message.includes("fetch failed"))throw new Error(`Failed to fetch URL: ${t.url}. The server may be unreachable or blocking requests. Original error: ${g.message}`)}throw g}let u=c.status===403&&c.headers.get("cf-mitigated")==="challenge"?await(async()=>{let g=await Fetch.get(t.url,{signal:o,headers:{...i,"User-Agent":"easbot"},responseType:"arrayBuffer"});return {ok:g.ok,status:g.status,statusText:g.statusText,headers:g.headers,arrayBuffer:async()=>Promise.resolve(g.data)}})():c;if(s(),!u.ok){let g=u.statusText||"Unknown error";throw new Error(`Request failed with status ${u.status} (${g}). The server may be blocking requests or the URL may be incorrect.`)}let l=u.headers.get("content-length");if(l&&parseInt(l,10)>gh)throw new Error("Response too large (exceeds 5MB limit)");let f=await u.arrayBuffer();if(f.byteLength>gh)throw new Error("Response too large (exceeds 5MB limit)");let m=u.headers.get("content-type")||"",a=m.split(";")[0]?.trim().toLowerCase()||"",p=`${t.url} (${m})`;if(a.startsWith("image/")&&a!=="image/svg+xml"&&a!=="image/vnd.fastbidsheet"){if(f.byteLength>hh)return {title:p,output:`Image fetched successfully but too large to display (${(f.byteLength/1024/1024).toFixed(2)}MB, max ${hh/1024/1024}MB). Image URL: ${t.url}`,metadata:{size:f.byteLength,mime:a,url:t.url}};try{let g=Buffer.from(f).toString("base64");return {title:p,output:`Image fetched successfully (${(f.byteLength/1024).toFixed(2)}KB)`,metadata:{size:f.byteLength,mime:a,url:t.url},attachments:[{type:"file",mime:a,url:`data:${a};base64,${g}`}]}}catch(g){return {title:p,output:`Image fetched but failed to convert to base64: ${g instanceof Error?g.message:"Unknown error"}. Image URL: ${t.url}`,metadata:{size:f.byteLength,mime:a,url:t.url}}}}let h=new TextDecoder().decode(f),w=f.byteLength;switch(t.format){case "markdown":return m.includes("text/html")?{output:RP(h),title:p,metadata:{size:w,mime:a,url:t.url}}:{output:h,title:p,metadata:{size:w,mime:a,url:t.url}};case "text":return m.includes("text/html")?{output:await AP(h),title:p,metadata:{size:w,mime:a,url:t.url}}:{output:h,title:p,metadata:{size:w,mime:a,url:t.url}};case "html":return {output:h,title:p,metadata:{size:w,mime:a,url:t.url}};default:return {output:h,title:p,metadata:{size:w,mime:a,url:t.url}}}}});async function AP(t){try{let e=parse(t),n=["script","style","noscript","iframe","object","embed","svg","head"];for(let r of n){let i=e.querySelectorAll(r);for(let c of i)c.remove();}let o=e.querySelector("body"),s=o?o.textContent||o.text||"":e.textContent||e.text||"";return s=s.replace(/<[^>]+>/g," "),s=s.replace(/\s+/g," ").trim(),s}catch{let n=t.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,"").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"").replace(/<noscript\b[^<]*(?:(?!<\/noscript>)<[^<]*)*<\/noscript>/gi,"").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"");return n=n.replace(/<[^>]+>/g," "),n=n.replace(/\s+/g," ").trim(),n}}function RP(t){let e=new CP({headingStyle:"atx",hr:"---",bulletListMarker:"-",codeBlockStyle:"fenced",emDelimiter:"*"});return e.remove(["script","style","meta","link"]),e.turndown(t)}var OP=loadTextFile("./write.txt",import.meta.url),jP=OP(),xp=20;var wh=Le.define("write",{description:jP,parameters:z$1.object({content:z$1.string().describe("The content to write to the file"),filePath:z$1.string().describe("The absolute path to the file to write (must be absolute, not relative)")}),async execute(t,e){Nt.check(e.abort,"write");let n=Filesystem.normalize(ke.isAbsolute(t.filePath)?t.filePath:Filesystem.join(A.directory,t.filePath));await yn(e,n,{tool:"write"});let o=PKG.file(n),s=await o.exists(),r=s?await o.text():"";s&&await qn.assert(e.sessionID,n);let i=Zo(createTwoFilesPatch(n,n,r,t.content));await e.ask({permission:"edit",patterns:[ke.posix.relative(A.worktree,n)],always:["*"],metadata:{filepath:n,diff:i}}),Nt.check(e.abort,"write"),await PKG.write(n,t.content),await ue.publish(It.Event.Edited,{file:n}),await ue.publish(to.Event.Updated,{file:n,event:s?"change":"add"}),qn.read(e.sessionID,n);let c="Wrote file successfully.";Nt.check(e.abort,"write");let u=[];if(await Ve.isAvailable(e.sessionID)){await Ve.touchFile(n,true);let l=await Ve.getFileDiagnostics(n);u.push(...l);let f=l.filter(m=>m.severity===1);if(f.length>0){let m=f.slice(0,xp),a=f.length>xp?`
701
+ ... and ${f.length-xp} more`:"",p=m.map(d=>Ve.Diagnostic.pretty(d));c+=`
702
+
703
+ LSP errors detected in this file, please fix:
704
+ <diagnostics file="${n}">
705
+ ${p.join(`
706
+ `)}${a}
707
+ </diagnostics>`;}}return {title:ke.posix.relative(A.worktree,n),metadata:{diagnostics:{[Filesystem.normalize(n)]:u},filepath:n,exists:s},output:c}}});var xh=Le.define("invalid",{description:"Do not use",parameters:z$1.object({tool:z$1.string(),error:z$1.string()}),async execute(t){return {title:"Invalid Tool",output:`The arguments provided to the tool are invalid: ${t.error}`,metadata:{}}}});var Sh=Le.define("skill",async()=>{let t=["Load a specialized skill that provides domain-specific instructions and workflows.","","When you recognize that a task matches one of the available skills, use this tool to load the full skill instructions.","","The skill will inject detailed instructions, workflows, and access to bundled resources (scripts, references, templates) into the conversation context.","",'Tool output includes a `<skill_content name="...">` block with the loaded content.'].join(`
708
+ `),e=z$1.object({name:z$1.string().describe("The name of the skill to load")});return {description:t,parameters:e,async execute(n,o){let s=await ee.getContextMode(o.sessionID),r=await Ue.get(o.agent),i=await rn.available(r,s),c=await rn.get(n.name);if(!c){let p=i.length>0?i.map(d=>d.name).join(", "):"none";throw new Error(`Skill "${n.name}" not found. Available skills: ${p}`)}if(!i.some(p=>p.name===n.name)){let p=i.length>0?i.map(d=>d.name).join(", "):"none";throw new Error(`Skill "${n.name}" is not available. Available skills: ${p}`)}await o.ask({permission:"skill",patterns:[n.name],always:[n.name],metadata:{}});let l=ke__default.posix.dirname(c.location),f=pathToFileURL(l).href,m=10,a=await iife(async()=>{let p=[];for await(let d of a$9.files({cwd:l,follow:false,hidden:true,signal:o.abort}))if(!d.includes("SKILL.md")&&(p.push(ke__default.posix.join(l,d)),p.length>=m))break;return p}).then(p=>p.map(d=>`<file>${d}</file>`).join(`
709
+ `));return {title:`Loaded skill: ${c.name}`,output:[`<skill_content name="${c.name}">`,`# Skill: ${c.name}`,"",c.content.trim(),"",`Base directory for this skill: ${f}`,"Relative paths in this skill (e.g., scripts/, references/) are relative to this base directory.","If you need to load references or scripts files, use the Read tool with paths relative to this base directory.","Note: file list is sampled.","","<skill_files>",a,"</skill_files>","</skill_content>"].join(`
710
+ `),metadata:{name:c.name,dir:l}}}}});var rt;(I=>{let t=a.create({service:"pty"}),e=1024*1024*2,n=64*1024,o=new TextEncoder,s=P=>{let T=JSON.stringify({cursor:P}),M=o.encode(T),j=new Uint8Array(M.length+1);return j[0]=0,j.set(M,1),j},r=lazy(async()=>$P);I.Info=z$1.object({id:Identifier.schema("pty"),title:z$1.string(),command:z$1.string(),args:z$1.array(z$1.string()),cwd:z$1.string(),status:z$1.enum(["running","exited"]),pid:z$1.number()}).meta({ref:"Pty"}),I.CreateInput=z$1.object({command:z$1.string().optional(),args:z$1.array(z$1.string()).optional(),cwd:z$1.string().optional(),title:z$1.string().optional(),env:z$1.record(z$1.string(),z$1.string()).optional(),persistent:z$1.boolean().optional().default(true)}),I.UpdateInput=z$1.object({title:z$1.string().optional(),size:z$1.object({rows:z$1.number(),cols:z$1.number()}).optional()}),I.Event={Created:a$5.define("pty.created",z$1.object({info:I.Info})),Updated:a$5.define("pty.updated",z$1.object({info:I.Info})),Exited:a$5.define("pty.exited",z$1.object({id:Identifier.schema("pty"),exitCode:z$1.number()})),Deleted:a$5.define("pty.deleted",z$1.object({id:Identifier.schema("pty")}))};let f;function m(){return f||(f=A.state(()=>new Map,async P=>{for(let T of P.values()){try{T.process.kill();}catch{}for(let M of T.subscribers)M.close();}P.clear();})),f}function a$1(){return m()()}let p=new Map;async function d(){let P=a$1();return Array.from(P.values()).map(T=>T.info)}I.list=d;async function h(P){return a$1().get(P)?.info}I.get=h;async function w(P){let T=Identifier.create("pty",false),M=P.persistent??true,j=process.platform==="win32"?"cmd":Shell.acceptable(),N=P.command||j,K=P.args||[],te=P.cwd||A.directory,_=(await je.triggerEvent(HookEvent.ShellEnv,{cwd:te})).output?.env??{},D={...process.env,...P.env,..._,TERM:"xterm-256color",EASBOT_TERMINAL:"1"};process.platform==="win32"&&(D.LANG="en_US.UTF-8",D.LC_ALL="en_US.UTF-8",D.LC_CTYPE="en_US.UTF-8");let O=N;if(process.platform==="win32"){let{PKG:le}=await import('@easbot/utils'),de=await le.which(O);if(de)t.debug("resolved command path",{original:O,resolved:de});else {t.warn("command not found in PATH, trying PKG.which() fallback",{command:O});let be=O?.toLowerCase(),re=null;if(be==="cmd.exe"||be==="cmd"?re="cmd":be==="powershell.exe"||be==="powershell"?re="powershell":be==="pwsh.exe"||be==="pwsh"?re="pwsh":be==="wsl.exe"||be==="wsl"?re="wsl":re=Shell.acceptable(be)??"",re){let X=await le.which(re);X?(t.debug("found command via PKG.which()",{original:O,resolved:X})):(t.warn("command not found, using original",{command:O}),O);}else t.warn("unknown command type, using original",{command:O});}}let E=N??"",R=[...K];E.endsWith("sh")&&R.push("-l"),t.debug("creating PTY session",{id:T,cmd:E,args:R,cwd:te,platform:process.platform});let L=await r(),q;try{q=L.spawn(E,R,{name:"xterm-256color",cwd:te,env:D}),t.debug("PTY process spawned successfully",{id:T,pid:q.pid});}catch(le){let de=le instanceof Error?le.message:String(le);t.error("Failed to spawn PTY process",{command:E,args:R,cwd:te,platform:process.platform,error:de,stack:le instanceof Error?le.stack:void 0});let be="";throw de.includes("ENOENT")||de.includes("not found")?be=`
711
+
712
+ \u{1F4A1} Hint: The command "${E}" was not found. Please ensure:
713
+ - The command is installed and available in PATH
714
+ - On Windows, use full path like "cmd.exe" or "powershell.exe"
715
+ - On Unix, use full path like "/bin/bash" or "/usr/bin/ssh"`:de.includes("permission")&&(be=`
716
+
717
+ \u{1F4A1} Hint: Permission denied. Please check file permissions.`),new Error(`Failed to create PTY session: ${de}${be}`)}let Q={id:T,title:P.title||`Terminal ${T.slice(-4)}`,command:N,args:R,cwd:te,status:"running",pid:q.pid},Z={info:Q,process:q,buffer:"",bufferCursor:0,cursor:0,subscribers:new Set};return a$1().set(T,Z),q.onData(le=>{Z.cursor+=le.length;for(let be of Z.subscribers){if(be.readyState!==1){Z.subscribers.delete(be);continue}be.send(le);}if(Z.buffer+=le,Z.buffer.length<=e)return;let de=Z.buffer.length-e;Z.buffer=Z.buffer.slice(de),Z.bufferCursor+=de;}),q.onExit(async({exitCode:le})=>{t.debug("session exited",{id:T,exitCode:le,persistent:M}),Z.info.status="exited";for(let de of Z.subscribers)de.close();Z.subscribers.clear(),await ue.publish(I.Event.Exited,{id:T,exitCode:le}),M?t.debug("persistent session, keeping for reconnection",{id:T,exitCode:le}):(t.debug("non-persistent session, deleting",{id:T,exitCode:le}),p.set(T,le),a$1().delete(T));}),await ue.publish(I.Event.Created,{info:Q}),Q}I.create=w;async function g(P,T){let j=a$1().get(P);if(!j)throw new Error(`Session ${P} not found`);if(T.title&&(j.info.title=T.title),(T?.size?.cols??0)>0&&(T?.size?.rows??0)>0){if(j.info.status==="exited")throw new Error(`Session ${P} has exited (PID: ${j.info.pid}). Cannot resize. Use 'remove' to delete and create a new session.`);j.process.resize(T?.size?.cols??0,T?.size?.rows??0);}return await ue.publish(I.Event.Updated,{info:j.info}),j.info}I.update=g;async function b(P){let T=a$1(),M=T.get(P);if(!M)throw new Error(`Session ${P} not found`);t.debug("removing session",{id:P,pid:M.info.pid,status:M.info.status});try{M.process.kill();}catch{}for(let j of M.subscribers)j.close();T.delete(P),p.delete(P),await ue.publish(I.Event.Deleted,{id:P});}I.remove=b;async function v(P,T,M){let N=a$1().get(P);if(!N)throw new Error(`Session ${P} not found`);if(N.info.status==="exited")throw t.warn("cannot resize exited session",{id:P}),new Error(`Session ${P} has exited (PID: ${N.info.pid}). Use 'remove' to delete it and create a new session.`);N.process.resize(T,M);}I.resize=v;async function k(P,T){let j=a$1().get(P);if(!j)throw new Error(`Session ${P} not found`);if(j.info.status==="exited")throw t.warn("cannot write to exited session",{id:P}),new Error(`Session ${P} has exited (PID: ${j.info.pid}). Use 'remove' to delete it and create a new session.`);j.process.write(T);}I.write=k;async function S(P,T,M){let N=a$1().get(P);if(!N)return t.warn("cannot connect to non-existent session",{id:P}),T.close(),{onMessage:()=>{},onClose:()=>{}};t.debug("client connected to session",{id:P,status:N.info.status});let K=N.bufferCursor,te=N.cursor,U=M===-1?te:typeof M=="number"&&Number.isSafeInteger(M)?Math.max(0,M):0,_=(()=>{if(!N.buffer||U>=te)return "";let D=Math.max(0,U-K);return D>=N.buffer.length?"":N.buffer.slice(D)})();if(_)try{for(let D=0;D<_.length;D+=n)T.send(_.slice(D,D+n));}catch{T.close();return}try{T.send(s(te));}catch{T.close();return}return N.subscribers.add(T),{onMessage:D=>{N.process.write(String(D));},onClose:()=>{t.debug("client disconnected from session",{id:P}),N.subscribers.delete(T);}}}I.connect=S;async function y(P){let M=a$1().get(P);if(M)return {buffer:M.buffer,cursor:M.cursor,bufferCursor:M.bufferCursor}}I.getBuffer=y;async function x(P,T){let j=a$1().get(P);if(!j){let te=p.get(P);if(te!==void 0)return t.debug("subscribing to exited session",{id:P,exitCode:te}),T.onExit&&T.onExit(te),()=>{};throw t.warn("session not found for subscription",{id:P}),new Error(`Session ${P} not found`)}let N={readyState:1,send:te=>{typeof te=="string"&&T.onData&&T.onData(te);},close:()=>{}};j.subscribers.add(N);let K;return T.onExit&&(K=ue.subscribe(I.Event.Exited,te=>{te.properties.id===P&&T.onExit&&T.onExit(te.properties.exitCode);})),()=>{j.subscribers.delete(N),K&&K();}}I.subscribe=x;})(rt||(rt={}));var UP=loadTextFile("./pty_session.txt",import.meta.url),zP=loadTextFile("./pty_manage.txt",import.meta.url),BP=UP(),HP=zP(),kh=a.create({service:"tool.pty"}),li={BUFFER_SIZE_LIMIT:8*1024,MAX_LINES:200,DEFAULT_COLS:120,DEFAULT_ROWS:30},qP=z$1.object({action:z$1.enum(["list","get","resize","write","close"]).describe("Management action to perform"),sessionId:z$1.string().optional().describe("Session ID for get/resize/write/close actions"),cols:z$1.number().optional().describe("New columns for resize action"),rows:z$1.number().optional().describe("New rows for resize action"),data:z$1.string().optional().describe("Data to write to session")}),Eh=Le.define("pty_manage",{description:HP,parameters:qP,async execute(t,e){if(await e.ask({permission:"pty_manage",patterns:[t.action],always:["*"],metadata:{action:t.action,sessionId:t.sessionId}}),e.abort.aborted)throw new Error("Operation aborted");switch(t.action){case "list":{let n=await rt.list(),o=n.length===0?"No active PTY sessions":`Active PTY Sessions (${n.length}):
718
+ ${n.map(s=>`- ${s.id}: ${s.title} (PID: ${s.pid}, Status: ${s.status})`).join(`
719
+ `)}`;return {title:"PTY Sessions",metadata:{action:"list",sessionCount:n.length,sessions:n.map(s=>({id:s.id,title:s.title,command:s.command,pid:s.pid,status:s.status}))},output:o}}case "get":{if(!t.sessionId)throw new Error("sessionId is required for get action");let n=await rt.get(t.sessionId);if(!n)return {title:"Session Not Found",metadata:{action:"get",found:false,sessionCount:0,sessions:[]},output:`No session found with ID: ${t.sessionId}`};let o=await rt.getBuffer(t.sessionId),s=o?.buffer||"";return {title:`Session ${t.sessionId}`,metadata:{action:"get",found:true,sessionCount:1,sessions:[{id:n.id,title:n.title,command:n.command,pid:n.pid,status:n.status}],session:{id:n.id,title:n.title,command:n.command,cwd:n.cwd,pid:n.pid,status:n.status},bufferSize:s.length,cursor:o?.cursor,bufferCursor:o?.bufferCursor},output:`Session Details:
720
+ ID: ${n.id}
721
+ Title: ${n.title}
722
+ Command: ${n.command}
723
+ PID: ${n.pid}
724
+ Status: ${n.status}
725
+ CWD: ${n.cwd}
726
+
727
+ Output Buffer (${s.length} characters):
728
+ ${s||"(no output yet)"}`}}case "resize":{if(!t.sessionId||t.cols===void 0||t.rows===void 0)throw new Error("sessionId, cols, and rows are required for resize action");return await rt.resize(t.sessionId,t.cols,t.rows),{title:"Session Resized",metadata:{action:"resize",sessionId:t.sessionId,cols:t.cols,rows:t.rows,sessionCount:1,sessions:[]},output:`Session ${t.sessionId} resized to ${t.cols}x${t.rows}`}}case "write":{if(!t.sessionId||t.data===void 0)throw new Error("sessionId and data are required for write action");let n=process.platform==="win32"?t.data.replace(/\n/g,`\r
729
+ `):t.data;return await rt.write(t.sessionId,n),{title:"Data Written",metadata:{action:"write",sessionId:t.sessionId,dataLength:n.length,sessionCount:1,sessions:[]},output:`Wrote ${n.length} characters to session ${t.sessionId}`}}case "close":{if(!t.sessionId)throw new Error("sessionId is required for close action");return await rt.remove(t.sessionId),{title:"Session Closed",metadata:{action:"close",sessionId:t.sessionId,sessionCount:0,sessions:[]},output:`Session ${t.sessionId} closed successfully`}}default:throw new Error(`Unsupported action: ${t.action}`)}}}),Th=Le.define("pty_session",{description:BP,parameters:z$1.object({command:z$1.string().describe("Initial command to run in session"),args:z$1.array(z$1.string()).optional().describe("Command arguments"),cwd:z$1.string().optional().describe("Working directory (defaults to project directory)"),env:z$1.record(z$1.string(),z$1.string()).optional().describe("Environment variables"),sessionName:z$1.string().optional().describe("Session name for identification"),cols:z$1.number().min(10).max(500).optional().default(li.DEFAULT_COLS).describe("Terminal columns (default: 120)"),rows:z$1.number().min(5).max(200).optional().default(li.DEFAULT_ROWS).describe("Terminal rows (default: 30)"),truncateMode:z$1.enum(["head","tail"]).optional().default("tail").describe("Truncation mode: head (keep beginning) or tail (keep end, default for PTY sessions)"),persistent:z$1.boolean().optional().default(true).describe("Keep session running after initial command completes (default: true, for SSH/long-running connections)")}),async execute(t,e){let n=t.command,o=t.args||[];await e.ask({permission:"pty_session",patterns:[t.command],always:[`${t.command} *`],metadata:{command:t.command,args:t.args,cwd:t.cwd||A.directory,sessionName:t.sessionName}});let s=t.cwd||A.directory,r=t.cols??li.DEFAULT_COLS,i=t.rows??li.DEFAULT_ROWS;try{if(e.abort.aborted)throw new Error("Operation aborted");let c=await rt.create({command:n,args:o,cwd:s,env:t.env,title:t.sessionName||`Interactive Session: ${t.command}`,persistent:t.persistent??!0});return r&&i&&await rt.resize(c.id,r,i),kh.info("PTY session created successfully",{sessionId:c.id,command:c.command,pid:c.pid,status:c.status}),{title:`PTY Session Created: ${t.sessionName||t.command}`,metadata:{sessionId:c.id,sessionName:t.sessionName||c.title,command:c.command,pid:c.pid,status:c.status,truncateMode:t.truncateMode,persistent:t.persistent,websocketSupport:!0},output:`PTY session created successfully.
730
+
731
+ Session ID: ${c.id}
732
+ Session Name: ${t.sessionName||c.title}
733
+ Command: ${c.command}
734
+ PID: ${c.pid}
735
+ Status: ${c.status}
736
+ Output Limit: ${li.BUFFER_SIZE_LIMIT/1024}KB / ${li.MAX_LINES} lines
737
+ Truncate Mode: ${t.truncateMode||"tail"} (${t.truncateMode==="head"?"keeps beginning of output":"keeps latest output for interactive use"})
738
+
739
+ \u26A0\uFE0F IMPORTANT: This session will run in the background until explicitly closed.
740
+ Use pty_manage tool to interact with this session:
741
+ - Send input: pty_manage { "action": "write", "sessionId": "${c.id}", "data": "your command\\n" }
742
+ - Check status: pty_manage { "action": "get", "sessionId": "${c.id}" }
743
+ - Close session: pty_manage { "action": "close", "sessionId": "${c.id}" }
744
+
745
+ \u26A0\uFE0F RESOURCE WARNING: Remember to close unused sessions to prevent resource exhaustion!`}}catch(c){let u=c instanceof Error?c.message:String(c),l=c instanceof Error?c.stack:void 0;throw kh.error("PTY session creation failed",{command:t.command,args:t.args,cwd:s,error:u,stack:l}),new Error(`Failed to create PTY session: ${u}`)}}});var KP=loadTextFile("./websearch.txt",import.meta.url),JP=KP(),vp={BASE_URL:"https://mcp.exa.ai",ENDPOINTS:{SEARCH:"/mcp"},DEFAULT_NUM_RESULTS:8},Dh=Le.define("websearch",async()=>({get description(){return JP.replace("{{year}}",new Date().getFullYear().toString())},parameters:z$1.object({query:z$1.string().describe("Websearch query"),numResults:z$1.number().optional().describe("Number of search results to return (default: 8)"),livecrawl:z$1.enum(["fallback","preferred"]).optional().describe("Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')"),type:z$1.enum(["auto","fast","deep"]).optional().describe("Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search"),contextMaxCharacters:z$1.number().optional().describe("Maximum characters for context string optimized for LLMs (default: 10000)")}),async execute(t,e){await e.ask({permission:"websearch",patterns:[t.query],always:["*"],metadata:{query:t.query,numResults:t.numResults,livecrawl:t.livecrawl,type:t.type,contextMaxCharacters:t.contextMaxCharacters}});let n={jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"web_search_exa",arguments:{query:t.query,type:t.type||"auto",numResults:t.numResults||vp.DEFAULT_NUM_RESULTS,livecrawl:t.livecrawl||"fallback",contextMaxCharacters:t.contextMaxCharacters}}},{signal:o,clearTimeout:s}=abortAfterAny(25e3,e.abort);try{let r={accept:"application/json, text/event-stream","content-type":"application/json"},i=await Fetch.post(`${vp.BASE_URL}${vp.ENDPOINTS.SEARCH}`,n,{headers:r,responseType:"text",signal:o});if(s(),!i.ok)throw new Error(`Search error (${i.status}): ${i.data||"Unknown error"}`);let u=i.data.split(`
746
+ `);for(let l of u)if(l.startsWith("data: ")){let f=JSON.parse(l.substring(6));if(f.result?.content&&f.result.content.length>0){let m=f.result.content[0]?.text;if(m)return {output:m,title:`Web search: ${t.query}`,metadata:{query:t.query}}}}return {output:"No search results found. Please try a different query.",title:`Web search: ${t.query}`,metadata:{query:t.query}}}catch(r){throw s(),r instanceof Error&&r.name==="AbortError"?new Error("Search request timed out"):r}}}));var ZP=loadTextFile("./codesearch.txt",import.meta.url),eE=ZP(),Ah={BASE_URL:"https://mcp.exa.ai",ENDPOINTS:{CONTEXT:"/mcp"}},Rh=Le.define("codesearch",{scope:g.Coder,description:eE,parameters:z$1.object({query:z$1.string().describe("Search query to find relevant context for APIs, Libraries, and SDKs. For example, 'React useState hook examples', 'Python pandas dataframe filtering', 'Express.js middleware', 'Next js partial prerendering configuration'"),tokensNum:z$1.number().min(1e3).max(5e4).default(5e3).describe("Number of tokens to return (1000-50000). Default is 5000 tokens. Adjust this value based on how much context you need - use lower values for focused queries and higher values for comprehensive documentation.")}),async execute(t,e){await e.ask({permission:"codesearch",patterns:[t.query],always:["*"],metadata:{query:t.query,tokensNum:t.tokensNum}});let n={jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"get_code_context_exa",arguments:{query:t.query,tokensNum:t.tokensNum||5e3}}},{signal:o,clearTimeout:s}=abortAfterAny(3e4,e.abort);try{let r={accept:"application/json, text/event-stream","content-type":"application/json"},i=await Fetch.post(`${Ah.BASE_URL}${Ah.ENDPOINTS.CONTEXT}`,n,{headers:r,responseType:"text",signal:o});if(s(),!i.ok)throw new Error(`Code search error (${i.status}): ${i.data||"Unknown error"}`);let u=i.data.split(`
747
+ `);for(let l of u)if(l.startsWith("data: ")){let f=JSON.parse(l.substring(6));if(f.result?.content&&f.result.content.length>0){let m=f.result.content[0]?.text;if(m)return {output:m,title:`Code search: ${t.query}`,metadata:{}}}}return {output:"No code snippets or documentation found. Please try a different query, be more specific about the library or programming concept, or check the spelling of framework names.",title:`Code search: ${t.query}`,metadata:{}}}catch(r){throw s(),r instanceof Error&&r.name==="AbortError"?new Error("Code search request timed out"):r}}});var Cp=a.create({service:"note-tool"}),nE=loadTextFile("./note.txt",import.meta.url),oE=nE(),sE=10,rE=800,_h=30,Mh=1500,iE=10,aE=500,cE=z$1.discriminatedUnion("operation",[z$1.object({operation:z$1.literal("search"),query:z$1.string().optional().describe("Search query for note content"),maxResults:z$1.number().optional().default(10).describe("Maximum number of results to return"),minScore:z$1.coerce.number().optional().describe("Minimum score threshold (default 0.3, higher = more precise)")}),z$1.object({operation:z$1.literal("queryEdges"),nodeId:z$1.number().describe("Node ID to query relations"),maxDepth:z$1.coerce.number().optional().default(2).describe("Maximum depth of relations to query (default 2)")})]);async function lE(t,e){if(t.length===0)return `<note_context>
748
+ No note context found.
749
+ </note_context>`;let n=[];n.push(`<note_context total="${t.length}">`);for(let o=0;o<t.length;o++){let s=t[o],r=await Ke.output(s.snippet,{maxLines:sE,maxBytes:rE,contentType:"list",toolName:"note_snippet"},e);if(n.push(`[${o+1}]`),n.push(` document: ${s.document.path}`),n.push(` lines: ${s.chunk.startLine}-${s.chunk.endLine}`),n.push(` score: ${s.score.toFixed(4)}`),n.push(` source: ${s.source}`),n.push(` snippet: ${r.content}`),r.truncated&&n.push(` (snippet: ${r.outputPath})`),s.nodes&&s.nodes.length>0){let i=s.nodes.map(u=>{let l=[` - node: id=${u.id} type=${u.type} name=${u.name}`];if(u.edges&&u.edges.length>0)for(let f of u.edges){let m=f.source===u.id?"out":"in";f.targetNode?l.push(` \u2192 [${m}] ${f.relation} \u2192 ${f.targetNode.type}:${f.targetNode.name} (id=${f.target})`):l.push(` \u2192 [${m}] ${f.relation} \u2192 id=${f.target} (node not found)`);}return l.join(`
750
+ `)}).join(`
751
+ `),c=await Ke.output(i,{maxLines:_h,maxBytes:Mh,contentType:"list",toolName:"note_nodes"},e);n.push(` nodes (${s.nodes.length}):`),n.push(c.content),c.truncated&&n.push(` (nodes: ${c.outputPath})`);}n.push("");}return n.push("</note_context>"),n.join(`
752
+ `)}var Oh=Le.define("note",{description:oE,parameters:cE,async execute(t,e){if(!e.extra?.directory)throw new Error("Directory context is required in ctx.extra.directory");let n={directory:e.extra.directory},o=await on.config(),s=n.directory;Cp.debug("note tool execute",{operation:t.operation,...t.operation==="search"&&{query:t.query},directory:s,noteConfigLoaded:!!o,noteConfig:o?{search:o.search,sync:o.sync}:null}),await e.ask({permission:"note",patterns:[t.operation],always:["*"],metadata:{operation:t.operation,...t.operation==="search"&&{query:t.query},...t.operation==="queryEdges"&&{nodeId:t.nodeId},workspaceDir:s,noteConfigLoaded:!!o}});let r=await on.get();if(!r)return Cp.warn("note kb not available"),{output:`<note_context>
753
+ Note knowledge base is not enabled or not properly configured.
754
+ </note_context>`,title:`Note: ${t.operation}`,metadata:{available:false,count:0,enabled:false}};if(t.operation==="search"){let i=o?.search?.minScore??.3,c=t.minScore!==void 0&&t.minScore!==null?Number(t.minScore):i,u=o?.search?.maxResults??10;Cp.debug("note search params",{query:t.query,minScore:c,defaultMinScore:i,maxResults:t.maxResults??u,noteMinScore:o?.search?.minScore}),o?.sync?.onSearch&&r.sync().catch(()=>{});let l=await r.search(t.query??"",{maxResults:t.maxResults??u,minScore:c,includeEdges:true,enableEmbedding:true,enableFts:true});return {output:await lE(l,e.extra?.agent),title:`Note search: ${t.query??""}`,metadata:{available:true,operation:"search",total:l.length,query:t.query,enabled:true}}}if(t.operation==="queryEdges"){let i=typeof t.nodeId=="string"?parseInt(t.nodeId,10):t.nodeId,c=await r.queryNodes({ids:[i]});if(!c||c.length===0)return {output:`<note_queryEdges>
755
+ Node with id ${t.nodeId} not found.
756
+ </note_queryEdges>`,title:`Note queryEdges: ${t.nodeId}`,metadata:{available:true,operation:"queryEdges",nodeId:t.nodeId,enabled:true,total:0}};let u=c[0],l=typeof t.maxDepth=="string"?parseInt(t.maxDepth,10):t.maxDepth??2,f=Math.min(l||2,3),m=await r.queryNeighbors(i,{limit:20,maxDepth:f}),a=20,p=m.edges.slice(0,a),d=m.nodes.map(v=>`[id=${v.id}] type=${v.type} name=${v.name}`).join(`
757
+ `),h=await Ke.output(d,{maxLines:_h,maxBytes:Mh,contentType:"list",toolName:"note_neighbors"},e.extra?.agent),w=p.map(v=>{let k=v.source===i?"out":"in";return v.targetNode?` \u2192 [${k}] ${v.relation} \u2192 ${v.targetNode.type}:${v.targetNode.name} (id=${v.target})`:` \u2192 [${k}] ${v.relation} \u2192 id=${v.target} (node not found)`}).join(`
758
+ `);if(m.edges.length>a){let v=m.edges.length-a,k=p.length>0?`
759
+ `:"";w=w+k+` ... and ${v} more relations`;}let g=await Ke.output(w,{maxLines:iE,maxBytes:aE,contentType:"list",toolName:"note_edges"},e.extra?.agent),b=[];return b.push(`<note_queryEdges node_id="${t.nodeId}" name="${u.name}" type="${u.type}">`),b.push(`neighbors (${m.nodes.length}):`),b.push(h.content),h.truncated&&b.push(` (neighbors: ${h.outputPath})`),b.push(""),b.push(`relations (${m.edges.length}):`),b.push(g.content),g.truncated&&b.push(` (relations: ${g.outputPath})`),b.push("</note_queryEdges>"),{output:b.join(`
760
+ `),title:`Note queryEdges: ${t.nodeId}`,metadata:{available:true,operation:"queryEdges",nodeId:t.nodeId,enabled:true,total:m.nodes.length}}}throw new Error(`Unknown operation: ${t.operation}`)}});var pE=loadTextFile("./memory.txt",import.meta.url),mE=pE()||"Access and manage memory system for agent operations",fE=10,gE=800,hE=30,yE=1500;async function bE(t,e){if(t.length===0)return `<memory_context>
761
+ No memories found.
762
+ </memory_context>`;let n=[];n.push(`<memory_context total="${t.length}">`);for(let o=0;o<t.length;o++){let s=t[o],r=new Date(s.createdAt),i=formatLocalISOCompact(r),c=Intl.DateTimeFormat().resolvedOptions().timeZone,u=await Ke.output(s.snippet,{maxLines:fE,maxBytes:gE,contentType:"list",toolName:"memory_snippet"},e);if(n.push(`[${o+1}]`),n.push(` id: ${s.memoryId}`),n.push(` [${s.category}] importance=${s.importance}`),n.push(` score: ${s.score.toFixed(4)}`),n.push(` created: ${i} (${c})`),n.push(` agent: ${s.agentId}`),n.push(` source: ${s.source}`),n.push(` snippet: ${u.content}`),u.truncated&&n.push(` (snippet: ${u.outputPath})`),s.filePath){let l=Filesystem.normalize(s.filePath);n.push(` file: ${l}`);}if(s.nodes&&s.nodes.length>0){let l=s.nodes.map(m=>{let a=[` - node: id=${m.id} type=${m.type} name=${m.name}`];if(m.edges&&m.edges.length>0)for(let p of m.edges){let d=p.source===m.id?"out":"in";p.targetNode?a.push(` \u2192 [${d}] ${p.relation} \u2192 ${p.targetNode.type}:${p.targetNode.name} (id=${p.target})`):a.push(` \u2192 [${d}] ${p.relation} \u2192 id=${p.target} (node not found)`);}return a.join(`
763
+ `)}).join(`
764
+ `),f=await Ke.output(l,{maxLines:hE,maxBytes:yE,contentType:"list",toolName:"memory_nodes"},e);n.push(` nodes (${s.nodes.length}):`),n.push(f.content),f.truncated&&n.push(` (nodes: ${f.outputPath})`);}n.push("");}return n.push("</memory_context>"),n.join(`
765
+ `)}function jh(t){if(t?.trim())return t.split(",").map(e=>e.trim()).filter(Boolean)}function Lh(t){if(t)try{let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e.toISOString()}catch{return}}var kp=z$1.enum(["user_preference","task_context","technical_fact","decision","relationship","reminder","error_pattern","workflow","exploration_finding","experience_summary","tool_usage","skill_creation","test","other"]),wE=z$1.discriminatedUnion("operation",[z$1.object({operation:z$1.literal("remember"),content:z$1.string().describe("Memory content to store"),category:kp.describe("Memory category"),importance:z$1.coerce.number().min(1).max(10).describe("Importance score 1-10"),tags:z$1.string().optional().describe('Optional tags, comma-separated (e.g. "typescript, testing, api")')}),z$1.object({operation:z$1.literal("recall"),query:z$1.string().describe("Search query"),maxResults:z$1.coerce.number().optional().default(10).describe("Maximum number of results to return (default 10)"),minScore:z$1.coerce.number().optional().describe("Minimum score threshold (default 0.3, higher = more precise)"),category:kp.optional().describe("Filter by memory category"),fromTime:z$1.string().optional().describe('Start time filter in local time (e.g. "2024-01-01 00:00:00" without timezone suffix), will be converted to UTC internally'),toTime:z$1.string().optional().describe('End time filter in local time (e.g. "2024-12-31 23:59:59" without timezone suffix), will be converted to UTC internally')}),z$1.object({operation:z$1.literal("queryEdges"),nodeId:z$1.coerce.number().describe("Node ID to query relations"),maxDepth:z$1.coerce.number().optional().default(2).describe("Maximum depth of relations to query (default 2)")}),z$1.object({operation:z$1.literal("forget"),memoryId:z$1.string().describe("Memory ID to delete")}),z$1.object({operation:z$1.literal("update"),memoryId:z$1.string().describe("Memory ID to update"),content:z$1.string().optional().describe("Updated memory content"),importance:z$1.coerce.number().min(1).max(10).optional().describe("Updated importance score 1-10"),tags:z$1.string().optional().describe('Updated tags, comma-separated (e.g. "typescript, testing, api")')}),z$1.object({operation:z$1.literal("list"),maxResults:z$1.coerce.number().min(1).max(100).optional().default(20).describe("Maximum number of memories to list (default 20, max 100)"),category:kp.optional().describe("Filter by memory category"),fromTime:z$1.string().optional().describe('Start time filter in local time (e.g. "2024-01-01 00:00:00")'),toTime:z$1.string().optional().describe('End time filter in local time (e.g. "2024-12-31 23:59:59")')})]),$h=Le.define("memory",{description:mE,parameters:wE,formatValidationError(t){return `Memory tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){let n=e.extra?.directory??"unknown";await e.ask({permission:"memory",patterns:t.operation==="recall"?[t.query]:["*"],always:["*"],metadata:{operation:t.operation,workspaceDir:n}});let o=await Dn.get();if(!o)return {output:`<memory_context>
766
+ Memory system is not enabled or not properly configured.
767
+ </memory_context>`,title:`Memory: ${t.operation}`,metadata:{enabled:false,operation:t.operation,truncated:false}};let s=e.protocolMetadata?.agentId??e.agent;if(t.operation==="remember"){if(!t.category||t.importance==null)throw new Error("remember requires category and importance");let r;if(e.messageID){let c=await ve.get({sessionID:e.sessionID,messageID:e.messageID});c?.info.role==="assistant"&&(r=c.info.parentID);}let i=await o.remember({agentId:s,content:t.content,category:t.category,importance:t.importance,source:"session_self_write",tags:jh(t.tags),sessionId:e.sessionID,msgId:e.messageID,parentMsgId:r});return {output:`<memory_result>
768
+ Memory saved successfully.
769
+ id: ${i.id}
770
+ category: ${i.category}
771
+ importance: ${i.importance}
772
+ </memory_result>`,title:"Memory saved",metadata:{operation:"remember",enabled:true,memoryId:i.id,category:i.category,importance:i.importance,truncated:false}}}if(t.operation==="recall"){let i=(await Dn.config())?.search?.minScore??.3,c=await o.query(t.query,{agentId:s,maxResults:t.maxResults??10,minScore:t.minScore??i,category:t.category,fromTime:Lh(t.fromTime),toTime:Lh(t.toTime)}),u=e.extra?.agent;return {output:await bE(c,u),title:`Memory recall: ${t.query}`,metadata:{operation:"recall",enabled:true,total:c.length,query:t.query}}}if(t.operation==="queryEdges"){if(t.nodeId===void 0)throw new Error("nodeId is required for queryEdges operation");let r=typeof t.nodeId=="string"?parseInt(t.nodeId,10):t.nodeId,i=typeof t.maxDepth=="string"?parseInt(t.maxDepth,10):t.maxDepth??2,c=Math.min(i||2,3),u=await o.queryEdgesByNodeId(r,{maxDepth:c});if(!u.node)return {output:`<memory_queryEdges node_id="${t.nodeId}">
773
+ Node ${t.nodeId} not found.
774
+ </memory_queryEdges>`,title:`Memory queryEdges: ${t.nodeId}`,metadata:{operation:"queryEdges",nodeId:t.nodeId,enabled:true,total:0}};let l=[];l.push(`<memory_queryEdges node_id="${t.nodeId}" name="${u.node.name}" type="${u.node.type}">`),l.push(`neighbors (${u.nodes.length}):`);for(let a of u.nodes)l.push(` [id=${a.id}] type=${a.type} name=${a.name}`);let f=20,m=u.edges.slice(0,f);l.push(`relations (${u.edges.length}):`);for(let a of m){let p=a.source===r?"out":"in";a.targetNode?l.push(` \u2192 [${p}] ${a.relation} \u2192 ${a.targetNode.type}:${a.targetNode.name} (id=${a.target})`):l.push(` \u2192 [${p}] ${a.relation} \u2192 id=${a.target} (node not found)`);}return u.edges.length>f&&l.push(` ... and ${u.edges.length-f} more relations`),l.push("</memory_queryEdges>"),{output:l.join(`
775
+ `),title:`Memory queryEdges: ${t.nodeId}`,metadata:{operation:"queryEdges",nodeId:t.nodeId,enabled:true,total:u.edges.length}}}if(t.operation==="forget")try{return await o.forget(s,t.memoryId),{output:`<memory_result>
776
+ Memory ${t.memoryId} deleted successfully.
777
+ </memory_result>`,title:"Memory deleted",metadata:{operation:"forget",enabled:!0,memoryId:t.memoryId,truncated:!1}}}catch(r){if(r?.message?.includes("not found")||r?.name==="MemoryNotFoundError")return {output:`<memory_result>
778
+ Memory ${t.memoryId} not found or already deleted.
779
+ </memory_result>`,title:"Memory forget",metadata:{operation:"forget",enabled:true,memoryId:t.memoryId,truncated:false}};throw r}if(t.operation==="update")try{let r=await o.update(s,t.memoryId,{content:t.content,importance:t.importance,tags:jh(t.tags)});return {output:`<memory_result>
780
+ Memory ${r.id} updated successfully.
781
+ category: ${r.category}
782
+ importance: ${r.importance}
783
+ </memory_result>`,title:"Memory updated",metadata:{operation:"update",enabled:!0,memoryId:r.id,category:r.category,truncated:!1}}}catch(r){if(r?.name==="MemoryNotFoundError")return {output:`<memory_result>
784
+ Memory ${t.memoryId} not found. Please use 'list' to see available memory IDs.
785
+ </memory_result>`,title:"Memory update failed",metadata:{operation:"update",enabled:true,memoryId:t.memoryId,truncated:false}};throw r}if(t.operation==="list"){let r=await o.queryForSummary(s,{limit:t.maxResults??20,category:t.category,fromTime:t.fromTime,toTime:t.toTime});if(r.length===0)return {output:`<memory_context>
786
+ No memories found${t.category||t.fromTime||t.toTime?" with given filters":""}.
787
+ </memory_context>`,title:"Memory list",metadata:{operation:"list",enabled:true,total:0,truncated:false}};let i=[];i.push(`<memory_context total="${r.length}">`);for(let c=0;c<r.length;c++){let u=r[c],l=new Date(u.createdAt),f=formatLocalISOCompact(l);i.push(`[${c+1}] id=${u.id} [${u.category}] importance=${u.importance} created=${f}`),i.push(` ${u.content.slice(0,100)}${u.content.length>100?"...":""}`),u.tags&&u.tags.length>0&&i.push(` tags: ${u.tags.join(", ")}`);}return i.push("</memory_context>"),{output:i.join(`
788
+ `),title:`Memory list (${r.length})`,metadata:{operation:"list",enabled:true,total:r.length,truncated:false}}}throw new Error(`Unknown operation: ${t.operation}`)}});var IE=loadTextFile("./codebase.txt",import.meta.url),vE=IE()||"Access and analyze codebase knowledge graph for agent operations",SE=10,CE=1e3,Fl=20,Ul=2e3,kE=z$1.discriminatedUnion("operation",[z$1.object({operation:z$1.literal("search"),query:z$1.string().optional().describe("Search query for codebase content"),maxResults:z$1.number().optional().default(10).describe("Maximum number of results to return"),astType:z$1.string().optional().describe("Filter by AST type (e.g., class_declaration, function_declaration)"),language:z$1.string().optional().describe("Filter by programming language"),minScore:z$1.coerce.number().optional().describe("Minimum score threshold (default 0.3, higher = more precise)")}),z$1.object({operation:z$1.literal("queryEdges"),nodeId:z$1.string().describe("Node ID to query relations"),direction:z$1.enum(["in","out","both"]).optional().default("both").describe("Edge direction: in (incoming), out (outgoing), both"),maxDepth:z$1.coerce.number().optional().default(2).describe("Maximum depth of relations to query (default 2)")})]);async function PE(t,e){if(t.length===0)return `<codebase_context>
789
+ No codebase results found.
790
+ </codebase_context>`;let n=[];n.push(`<codebase_context total="${t.length}">`);for(let o=0;o<t.length;o++){let s=t[o],r=await Ke.output(s.text,{maxLines:SE,maxBytes:CE,contentType:"output",toolName:"codebase_code"},e),i=s.edges?.map(u=>` \u2192 ${u.relation} \u2192 node:${u.target}`).join(`
791
+ `)||"";s.edges&&s.edges.length>0?await Ke.output(i,{maxLines:Fl,maxBytes:Ul,contentType:"list",toolName:"codebase_edges"},e):null;if(n.push(`[${o+1}]`),n.push(` node id=${s.id}`),n.push(` type: ${s.ast_type}`),n.push(` language: ${s.language}`),n.push(` name: ${s.name}`),n.push(` location: ${s.file_path}:${s.start_line}`),n.push(` code: ${r.content.replace(/\s+/g," ")}`),s.edges&&s.edges.length>0){let u=new Map(t.map(m=>[m.id,m])),l=s.edges.map(m=>{let a=m.source===s.id?"out":"in",p=u.get(m.target),d=p?.ast_type||"unknown",h=p?.name||String(m.target);return ` \u2192 [${a}] ${m.relation} \u2192 target=${d}:${h} (id=${m.target})`}).join(`
792
+ `),f=await Ke.output(l,{maxLines:Fl,maxBytes:Ul,contentType:"list",toolName:"codebase_edges"},e);n.push(` edges (${s.edges.length}):`),n.push(f.content);}n.push("");}return n.push("</codebase_context>"),n.join(`
793
+ `)}var Fh=Le.define("codebase",{scope:g.Coder,description:vE,parameters:kE,formatValidationError(t){return `Codebase tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){if(!e.extra?.directory)throw new Error("Directory context is required in ctx.extra.directory");await e.ask({permission:"codebase",patterns:[t.operation==="search"?t.query??"*":"*"],always:["*"],metadata:{operation:t.operation,...t.operation==="search"&&{query:t.query},...t.operation==="queryEdges"&&{nodeId:t.nodeId},workspaceDir:e.extra.directory}});let n=await Go.get();if(!n)return {output:`<codebase_context>
794
+ Codebase knowledge base is not enabled or not properly configured.
795
+ </codebase_context>`,title:`Codebase ${t.operation}`,metadata:{count:0,enabled:false,operation:t.operation}};if(t.operation==="search"){let s=(await Go.config())?.search?.minScore??.3,r=await n.search(t.query??"",{maxResults:t.maxResults??10,enableEmbedding:true,enableFts:true,astType:t.astType,minScore:t.minScore??s,language:t.language,includeEdges:true}),i=await PE(r,e.extra?.agent);return r.length===0&&t.astType&&(i+=`
796
+
797
+ <i>Tip: astType filter was applied but returned no results. Try without astType or use different astType value.</i>`),{output:i,title:`Codebase search: ${t.query??""}`,metadata:{count:r.length,query:t.query,enabled:true,operation:"search",astType:t.astType,language:t.language}}}if(t.operation==="queryEdges"){let o={in:"incoming",out:"outgoing",both:"both"},s=String(t.nodeId),r=await n.getNode(s),i=Math.min(t.maxDepth??2,3),{nodes:c,edges:u}=await n.queryNeighbors(s,{limit:50,maxDepth:i,direction:o[t.direction??"both"]});if((!u||u.length===0)&&!r)return {output:`<codebase_queryEdges node_id="${t.nodeId}">
798
+ Node ${t.nodeId} not found or has no relations.
799
+ </codebase_queryEdges>`,title:`Codebase queryEdges: ${t.nodeId}`,metadata:{count:0,nodeId:t.nodeId,direction:t.direction,enabled:true,operation:"queryEdges"}};let l=[];if(l.push(`<codebase_queryEdges node_id="${s}" name="${r?.name}" type="${r?.ast_type}" language="${r?.language}" location="${r?.file_path}:${r?.start_line}" direction="${t.direction??"both"}">`),l.push(`neighbors (${c.length}):`),c.length>0){let a=c.map(d=>`[id=${d.id}] type=${d.ast_type} name=${d.name} location=${d.file_path}:${d.start_line}`).join(`
800
+ `),p=await Ke.output(a,{maxLines:Fl,maxBytes:Ul,contentType:"list",toolName:"codebase_neighbors"},e.extra?.agent);l.push(p.content);}l.push(""),l.push(`relations (${u.length}):`);let f=20,m=u.slice(0,f);if(u.length>0){let a=new Map(c.map(w=>[w.id,w])),p=[];for(let w of m){let g=w.source===s?"out":"in",b=a.get(w.target),v=b?.ast_type||"unknown",k=b?.name||String(w.target);p.push(` \u2192 [${g}] ${w.relation} \u2192 target=${v}:${k} (id=${w.target})`);}u.length>f&&p.push(` ... and ${u.length-f} more relations`);let d=p.join(`
801
+ `),h=await Ke.output(d,{maxLines:Fl,maxBytes:Ul,contentType:"list",toolName:"codebase_edges"},e.extra?.agent);l.push(h.content);}return l.push("</codebase_queryEdges>"),{output:l.join(`
802
+ `),title:`Codebase queryEdges: ${s}`,metadata:{count:u.length,nodeId:s,direction:t.direction,enabled:true,operation:"queryEdges"}}}throw new Error(`Unknown operation: ${t.operation}`)}});var AE=loadTextFile("./lsp.txt",import.meta.url),RE=AE(),_E=200,ME=5*1024,OE=["goToDefinition","findReferences","hover","documentSymbol","workspaceSymbol","goToImplementation","prepareCallHierarchy","incomingCalls","outgoingCalls"],Uh=Le.define("lsp",{scope:g.Coder,isEnabled:()=>a$2.EASBOT_LSP_TOOL,description:RE,parameters:z$1.object({operation:z$1.enum(OE).describe("The LSP operation to perform"),filePath:z$1.string().describe("The absolute or relative path to the file"),line:z$1.number().int().min(1).describe("The line number (1-based, as shown in editors)"),character:z$1.number().int().min(1).describe("The character offset (1-based, as shown in editors)"),query:z$1.string().optional().describe("Search query for workspaceSymbol. Empty string requests all symbols.")}),formatValidationError(t){return `LSP tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},execute:async(t,e)=>{Nt.check(e.abort,"lsp");let n=Filesystem.normalize(ke__default.isAbsolute(t.filePath)?t.filePath:ke__default.join(A.directory,t.filePath));await yn(e,n,{tool:"lsp"});let o=t.operation==="workspaceSymbol"?{operation:t.operation}:t.operation==="documentSymbol"?{operation:t.operation,filePath:n}:{operation:t.operation,filePath:n,line:t.line,character:t.character};await e.ask({permission:"lsp",patterns:["*"],always:["*"],metadata:o});let s={file:n,line:t.line-1,character:t.character-1},r=ke__default.posix.relative(A.worktree,n),i=t.operation==="workspaceSymbol"?"":t.operation==="documentSymbol"?r:`${r}:${t.line}:${t.character}`,c=i?`${t.operation} ${i}`:t.operation;if(!await Ot__default.access(n).then(()=>true).catch(()=>false))throw new Error(`File not found: ${n}`);if(!await Ve.hasClients(n))throw new Error("No LSP server available for this file type.");await Ve.touchFile(n,true);let f=await Nt.wrap("lsp",e.abort,async()=>{switch(t.operation){case "goToDefinition":return Ve.definition(s);case "findReferences":return Ve.references(s);case "hover":return Ve.hover(s);case "documentSymbol":return Ve.documentSymbol({file:n});case "workspaceSymbol":return Ve.workspaceSymbol(t.query??"");case "goToImplementation":return Ve.implementation(s);case "prepareCallHierarchy":return Ve.prepareCallHierarchy(s);case "incomingCalls":return Ve.incomingCalls(s);case "outgoingCalls":return Ve.outgoingCalls(s)}}),m=f.length===0?`No results found for ${t.operation}`:JSON.stringify(f,null,2),a=await Ke.output(m,{maxLines:_E,maxBytes:ME,contentType:"output",toolName:"lsp"});return {title:c,metadata:{filepath:n,truncated:a.truncated,...a.truncated&&{outputPath:a.outputPath}},output:a.content}}});var LE=loadTextFile("./plan.txt",import.meta.url),NE=LE();async function Hh(t){for await(let e of ve.stream(t))if(e.info.role==="user"&&e.info.model)return e.info.model;return Ce.defaultModel()}var zh={enter:z$1.object({operation:z$1.literal("enter").describe("Enter plan mode for research and planning")}),exit:z$1.object({operation:z$1.literal("exit").describe("Exit plan mode and switch to build mode")})},$E=z$1.discriminatedUnion("operation",[zh.enter,zh.exit]),qh=Le.define("plan",{description:NE,parameters:$E,formatValidationError(t){return `Plan tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){if(t.operation==="enter")return FE(e);if(t.operation==="exit")return UE(e);throw new Error(`Unknown operation: ${t.operation}`)}});async function FE(t){let e=await ee.get(t.sessionID),n=ke__default.posix.relative(A.worktree,ee.plan(e));if((await zt.ask({sessionID:t.sessionID,questions:[{question:`Would you like to switch to the plan agent and create a plan saved to ${n}?`,header:"Plan Mode",custom:false,options:[{label:"Yes",description:"Switch to plan agent for research and planning"},{label:"No",description:"Stay with build agent to continue making changes"}]}],tool:t.callID?{messageID:t.messageID,callID:t.callID}:void 0}))[0]?.[0]==="No")throw new zt.RejectedError;let r=await Hh(t.sessionID),i={providerID:r.providerID||"unknown",modelID:r.modelID},c={id:Identifier.ascending("message"),sessionID:t.sessionID,role:"user",time:{created:Date.now()},agent:"plan",model:i};return await ee.updateMessage(c),await ee.updatePart({id:Identifier.ascending("part"),messageID:c.id,sessionID:t.sessionID,type:"text",text:"User has requested to enter plan mode. Switch to plan mode and begin planning.",synthetic:true}),{title:"Switching to plan agent",output:`User confirmed to switch to plan mode. A new message has been created to switch you to plan mode. The plan file will be at ${n}. Begin planning.`,metadata:{operation:"enter"}}}async function UE(t){let e=await ee.get(t.sessionID),n=ke__default.posix.relative(A.worktree,ee.plan(e));if((await zt.ask({sessionID:t.sessionID,questions:[{question:`Plan at ${n} is complete. Would you like to switch to the build agent and start implementing?`,header:"Build Agent",custom:false,options:[{label:"Yes",description:"Switch to build agent and start implementing the plan"},{label:"No",description:"Stay with plan agent to continue refining the plan"}]}],tool:t.callID?{messageID:t.messageID,callID:t.callID}:void 0}))[0]?.[0]==="No")throw new zt.RejectedError;let r=await Hh(t.sessionID),i={providerID:r.providerID||"unknown",modelID:r.modelID},c={id:Identifier.ascending("message"),sessionID:t.sessionID,role:"user",time:{created:Date.now()},agent:"build",model:i};return await ee.updateMessage(c),await ee.updatePart({id:Identifier.ascending("part"),messageID:c.id,sessionID:t.sessionID,type:"text",text:`The plan at ${n} has been approved, you can now edit files. Execute the plan`,synthetic:true}),{title:"Switching to build agent",output:"User approved switching to build agent. Wait for further instructions.",metadata:{operation:"exit"}}}var Ea;(S=>{let t=a.create({service:"patch"});S.PatchSchema=z$1.object({patchText:z$1.string().describe("The full patch text that describes all changes to be made")});(T=>(T.ParseError="ParseError",T.IoError="IoError",T.ComputeReplacements="ComputeReplacements",T.ImplicitInvocation="ImplicitInvocation"))(S.ApplyPatchError||(S.ApplyPatchError={}));(T=>(T.Body="Body",T.ShellParseError="ShellParseError",T.PatchParseError="PatchParseError",T.NotApplyPatch="NotApplyPatch"))(S.MaybeApplyPatch||(S.MaybeApplyPatch={}));(T=>(T.Body="Body",T.ShellParseError="ShellParseError",T.CorrectnessError="CorrectnessError",T.NotApplyPatch="NotApplyPatch"))(S.MaybeApplyPatchVerified||(S.MaybeApplyPatchVerified={}));function r(y,x){let I=y[x];if(!I)return null;let P=T=>{let M=T.indexOf(":");if(M!==-1)return T.substring(M+1).trim()||void 0};if(I.startsWith("*** Add File:")){let T=P(I);return T?{filePath:T,nextIdx:x+1}:null}if(I.startsWith("*** Delete File:")){let T=P(I);return T?{filePath:T,nextIdx:x+1}:null}if(I.startsWith("*** Update File:")){let T=P(I),M,j=x+1;if(j<y.length&&y[j]?.startsWith("*** Move to:")){let N=y[j];N&&(M=P(N)),j++;}return T?{filePath:T,movePath:M,nextIdx:j}:null}return null}function i(y,x){let I=[],P=x;for(;P<y.length&&!y[P]?.startsWith("***");){let T=y[P];if(!T){P++;continue}if(T.startsWith("@@")){let M=T.indexOf("@@",2),j=M!==-1?T.substring(M+2).trim():"";P++;let N=[],K=[],te=false;for(;P<y.length&&!y[P]?.startsWith("@@")&&!y[P]?.startsWith("***");){let U=y[P];if(!U){P++;continue}if(U==="*** End of File"){te=true,P++;break}if(U.startsWith(" ")){let _=U.substring(1);N.push(_),K.push(_);}else U.startsWith("-")?N.push(U.substring(1)):U.startsWith("+")&&K.push(U.substring(1));P++;}I.push({old_lines:N,new_lines:K,change_context:j||void 0,is_end_of_file:te||void 0});}else P++;}return {chunks:I,nextIdx:P}}function c(y,x){let I="",P=x;for(;P<y.length&&!y[P]?.startsWith("***");){let T=y[P];if(!T){P++;continue}T.startsWith("+")&&(I+=T.substring(1)+`
803
+ `),P++;}return I.endsWith(`
804
+ `)&&(I=I.slice(0,-1)),{content:I,nextIdx:P}}function u(y){let x=y.match(/^(?:cat\s+)?<<['"]?(\w+)['"]?\s*\n([\s\S]*?)\n\1\s*$/);return x?.[2]?x[2]:y}function l(y){let I=u(y.trim()).split(`
805
+ `),P=[],T=0,M="*** Begin Patch",j="*** End Patch",N=I.findIndex(te=>te.trim()===M),K=I.findIndex(te=>te.trim()===j);if(N===-1||K===-1||N>=K)throw new Error("Invalid patch format: missing Begin/End markers");for(T=N+1;T<K;){let te=r(I,T);if(!te){T++;continue}if(I[T]?.startsWith("*** Add File:")){let{content:U,nextIdx:_}=c(I,te.nextIdx);P.push({type:"add",path:te.filePath,contents:U}),T=_;}else if(I[T]?.startsWith("*** Delete File:"))P.push({type:"delete",path:te.filePath}),T=te.nextIdx;else if(I[T]?.startsWith("*** Update File:")){let{chunks:U,nextIdx:_}=i(I,te.nextIdx);P.push({type:"update",path:te.filePath,move_path:te.movePath,chunks:U}),T=_;}else T++;}return {hunks:P}}S.parsePatch=l;function f(y){let x=["apply_patch","applypatch"];if(y.length===2&&x.includes(y[0]))try{let I=y[1];if(!I)return {type:"PatchParseError",error:new Error("Missing patch argument")};let{hunks:P}=l(I);return {type:"Body",args:{patch:I,hunks:P}}}catch(I){return {type:"PatchParseError",error:I}}if(y.length===3&&y[0]==="bash"&&y[1]==="-lc"){let I=y[2];if(!I)return {type:"NotApplyPatch"};let P=I.match(/apply_patch\s*<<['"](\w+)['"]\s*\n([\s\S]*?)\n\1/);if(P?.[2]){let T=P[2];try{let{hunks:M}=l(T);return {type:"Body",args:{patch:T,hunks:M}}}catch(M){return {type:"PatchParseError",error:M}}}}return {type:"NotApplyPatch"}}S.maybeParseApplyPatch=f;function m(y,x){let I;try{I=readFileSync(y,"utf-8");}catch(K){throw new Error(`Failed to read file ${y}: ${K}`)}let P=I.split(`
806
+ `);P.length>0&&P[P.length-1]===""&&P.pop();let T=a$1(P,y,x),M=p(P,T);(M.length===0||M[M.length-1]!=="")&&M.push("");let j=M.join(`
807
+ `);return {unified_diff:g(I,j),content:j}}S.deriveNewContentsFromChunks=m;function a$1(y,x,I){let P=[],T=0;for(let M of I){if(M.change_context){let te=w(y,[M.change_context],T);if(te===-1)throw new Error(`Failed to find context '${M.change_context}' in ${x}`);T=te+1;}if(M.old_lines.length===0){let te=y.length>0&&y[y.length-1]===""?y.length-1:y.length;P.push([te,0,M.new_lines]);continue}let j=M.old_lines,N=M.new_lines,K=w(y,j,T,M.is_end_of_file);if(K===-1&&j.length>0&&j[j.length-1]===""&&(j=j.slice(0,-1),N.length>0&&N[N.length-1]===""&&(N=N.slice(0,-1)),K=w(y,j,T,M.is_end_of_file)),K!==-1){let te=[K,j.length,N];P.push(te),T=K+j.length;}else throw new Error(`Failed to find expected lines in ${x}:
808
+ ${M.old_lines.join(`
809
+ `)}`)}return P.sort((M,j)=>M[0]-j[0]),P}function p(y,x){let I=[...y];for(let P=x.length-1;P>=0;P--){let T=x[P];if(!T)continue;let[M,j,N]=T;I.splice(M,j);for(let K=0;K<N.length;K++){let te=N[K];te!==void 0&&I.splice(M+K,0,te);}}return I}function d(y){return y.replace(/[\u2018\u2019\u201A\u201B]/g,"'").replace(/[\u201C\u201D\u201E\u201F]/g,'"').replace(/[\u2010\u2011\u2012\u2013\u2014\u2015]/g,"-").replace(/\u2026/g,"...").replace(/\u00A0/g," ")}function h(y,x,I,P,T){if(T){let M=y.length-x.length;if(M>=I){let j=true;for(let N=0;N<x.length;N++){let K=y[M+N],te=x[N];if(!K||!te||!P(K,te)){j=false;break}}if(j)return M}}for(let M=I;M<=y.length-x.length;M++){let j=true;for(let N=0;N<x.length;N++){let K=y[M+N],te=x[N];if(!K||!te||!P(K,te)){j=false;break}}if(j)return M}return -1}function w(y,x,I,P=false){if(x.length===0)return -1;let T=h(y,x,I,(K,te)=>K===te,P);if(T!==-1)return T;let M=h(y,x,I,(K,te)=>K.trimEnd()===te.trimEnd(),P);if(M!==-1)return M;let j=h(y,x,I,(K,te)=>K.trim()===te.trim(),P);return j!==-1?j:h(y,x,I,(K,te)=>d(K.trim())===d(te.trim()),P)}function g(y,x){let I=y.split(`
810
+ `),P=x.split(`
811
+ `),T=`@@ -1 +1 @@
812
+ `,M=Math.max(I.length,P.length),j=false;for(let N=0;N<M;N++){let K=I[N]||"",te=P[N]||"";K!==te?(K&&(T+=`-${K}
813
+ `),te&&(T+=`+${te}
814
+ `),j=true):K&&(T+=` ${K}
815
+ `);}return j?T:""}async function b(y){if(y.length===0)throw new Error("No files were modified.");let x=[],I=[],P=[];for(let T of y)switch(T.type){case "add":{let M=ke.dirname(T.path);M!=="."&&M!=="/"&&await Ot.mkdir(M,{recursive:true}),await Ot.writeFile(T.path,T.contents,"utf-8"),x.push(T.path),t.info(`Added file: ${T.path}`);break}case "delete":await Ot.unlink(T.path),P.push(T.path),t.info(`Deleted file: ${T.path}`);break;case "update":{let M=m(T.path,T.chunks);if(T.move_path){let j=ke.dirname(T.move_path);j!=="."&&j!=="/"&&await Ot.mkdir(j,{recursive:true}),await Ot.writeFile(T.move_path,M.content,"utf-8"),await Ot.unlink(T.path),I.push(T.move_path),t.info(`Moved file: ${T.path} -> ${T.move_path}`);}else await Ot.writeFile(T.path,M.content,"utf-8"),I.push(T.path),t.info(`Updated file: ${T.path}`);break}}return {added:x,modified:I,deleted:P}}S.applyHunksToFiles=b;async function v(y){let{hunks:x}=l(y);return b(x)}S.applyPatch=v;async function k(y,x){if(y.length===1){let P=y[0];if(!P)return {type:"NotApplyPatch"};try{return l(P),{type:"CorrectnessError",error:new Error("ImplicitInvocation")}}catch{}}let I=f(y);switch(I.type){case "Body":{let{args:P}=I,T=P.workdir?ke.resolve(x,P.workdir):x,M=new Map;for(let j of P.hunks){let N=ke.resolve(T,j.type==="update"&&j.move_path?j.move_path:j.path);switch(j.type){case "add":M.set(N,{type:"add",content:j.contents});break;case "delete":{let K=ke.resolve(T,j.path);try{let te=await Ot.readFile(K,"utf-8");M.set(N,{type:"delete",content:te});}catch{return {type:"CorrectnessError",error:new Error(`Failed to read file for deletion: ${K}`)}}break}case "update":{let K=ke.resolve(T,j.path);try{let te=m(K,j.chunks);M.set(N,{type:"update",unified_diff:te.unified_diff,move_path:j.move_path?ke.resolve(T,j.move_path):void 0,new_content:te.content});}catch(te){return {type:"CorrectnessError",error:te}}break}}}return {type:"Body",action:{changes:M,patch:P.patch,cwd:T}}}case "PatchParseError":return {type:"CorrectnessError",error:I.error};case "NotApplyPatch":return {type:"NotApplyPatch"}}}S.maybeParseApplyPatchVerified=k;})(Ea||(Ea={}));var HE=loadTextFile("./apply_patch.txt",import.meta.url),qE=HE(),GE=z$1.object({patchText:z$1.string().describe("The full patch text that describes all changes to be made")}),Kh=Le.define("apply_patch",{scope:g.Coder,description:qE,parameters:GE,async execute(t,e){if(Nt.check(e.abort,"apply_patch"),!t.patchText)throw new Error("patchText is required");let n;try{n=Ea.parsePatch(t.patchText).hunks;}catch(a){throw new Error(`apply_patch verification failed: ${a}`)}if(n.length===0)throw t.patchText.replace(/\r\n/g,`
816
+ `).replace(/\r/g,`
817
+ `).trim()===`*** Begin Patch
818
+ *** End Patch`?new Error("patch rejected: empty patch"):new Error("apply_patch verification failed: no hunks found");let o=[],s="";for(let a of n){let p=Filesystem.normalize(ke.resolve(A.directory,a.path));switch(await yn(e,p,{tool:"patch"}),a.type){case "add":{let h=a.contents.length===0||a.contents.endsWith(`
819
+ `)?a.contents:`${a.contents}
820
+ `,w=Zo(createTwoFilesPatch(p,p,"",h)),g=0,b=0;for(let v of diffLines("",h))v.added&&(g+=v.count||0),v.removed&&(b+=v.count||0);o.push({filePath:p,oldContent:"",newContent:h,type:"add",diff:w,additions:g,deletions:b}),s+=w+`
821
+ `;break}case "update":{let d=await Ot.stat(p).catch(()=>null);if(!d||d.isDirectory())throw new Error(`apply_patch verification failed: Failed to read file to update: ${p}`);let h=await Ot.readFile(p,"utf-8"),w=h;try{w=Ea.deriveNewContentsFromChunks(p,a.chunks).content;}catch(S){throw new Error(`apply_patch verification failed: ${S}`)}let g=Zo(createTwoFilesPatch(p,p,h,w)),b=0,v=0;for(let S of diffLines(h,w))S.added&&(b+=S.count||0),S.removed&&(v+=S.count||0);let k=a.move_path?Filesystem.normalize(ke.resolve(A.directory,a.move_path)):void 0;await yn(e,k,{tool:"patch"}),o.push({filePath:p,oldContent:h,newContent:w,type:a.move_path?"move":"update",movePath:k,diff:g,additions:b,deletions:v}),s+=g+`
822
+ `;break}case "delete":{let d=await Ot.stat(p).catch(()=>null);if(!d||d.isDirectory())throw new Error(`apply_patch verification failed: File not found: ${p}`);let h=await Ot.readFile(p,"utf-8"),w=Zo(createTwoFilesPatch(p,p,h,"")),g=h.split(`
823
+ `).length;o.push({filePath:p,oldContent:h,newContent:"",type:"delete",diff:w,additions:0,deletions:g}),s+=w+`
824
+ `;break}}}let r=o.map(a=>({filePath:a.filePath,relativePath:ke.posix.relative(A.worktree,a.movePath??a.filePath),type:a.type,diff:a.diff,before:a.oldContent,after:a.newContent,additions:a.additions,deletions:a.deletions,movePath:a.movePath})),i=o.map(a=>ke.posix.relative(A.worktree,a.filePath));await e.ask({permission:"edit",patterns:i,always:["*"],metadata:{filepath:i.join(", "),diff:s,files:r}}),Nt.check(e.abort,"apply_patch");let c=[];for(let a of o){let p=a.type==="delete"?void 0:a.movePath??a.filePath;switch(a.type){case "add":await Ot.mkdir(ke.posix.dirname(a.filePath),{recursive:true}),await Ot.writeFile(a.filePath,a.newContent,"utf-8"),c.push({file:a.filePath,event:"add"});break;case "update":await Ot.writeFile(a.filePath,a.newContent,"utf-8"),c.push({file:a.filePath,event:"change"});break;case "move":a.movePath&&(await Ot.mkdir(ke.posix.dirname(a.movePath),{recursive:true}),await Ot.writeFile(a.movePath,a.newContent,"utf-8"),await Ot.unlink(a.filePath),c.push({file:a.filePath,event:"unlink"}),c.push({file:a.movePath,event:"add"}));break;case "delete":await Ot.unlink(a.filePath),c.push({file:a.filePath,event:"unlink"});break}p&&await ue.publish(It.Event.Edited,{file:p});}for(let a of c)await ue.publish(to.Event.Updated,a);Nt.check(e.abort,"apply_patch");for(let a of o){if(a.type==="delete")continue;let p=a.movePath??a.filePath;await Ve.touchFile(p,true);}let u=await Ve.diagnostics(),f=`Success. Updated the following files:
825
+ ${o.map(a=>{if(a.type==="add")return `A ${ke.posix.relative(A.worktree,a.filePath)}`;if(a.type==="delete")return `D ${ke.posix.relative(A.worktree,a.filePath)}`;let p=a.movePath??a.filePath;return `M ${ke.posix.relative(A.worktree,p)}`}).join(`
826
+ `)}`,m=20;for(let a of o){if(a.type==="delete")continue;let p=a.movePath??a.filePath,d=Filesystem.normalize(p),w=(u[d]??[]).filter(g=>g.severity===1);if(w.length>0){let g=w.slice(0,m),b=w.length>m?`
827
+ ... and ${w.length-m} more`:"";f+=`
828
+
829
+ LSP errors detected in ${ke.posix.relative(A.worktree,p)}, please fix:
830
+ <diagnostics file="${p}">
831
+ ${g.map(Ve.Diagnostic.pretty).join(`
832
+ `)}${b}
833
+ </diagnostics>`;}}return {title:f,metadata:{diff:s,files:r,diagnostics:u},output:f}}});var VE=loadTextFile("./multiedit.txt",import.meta.url),KE=VE(),YE=z$1.object({edits:z$1.array(z$1.object({filePath:z$1.string().describe("The absolute path to the file to modify"),oldString:z$1.string().describe("The text to replace"),newString:z$1.string().describe("The text to replace it with (must be different from oldString)"),replaceAll:z$1.boolean().optional().describe("Replace all occurrences of oldString (default false)")})).min(1).describe("Array of edit operations to perform sequentially"),continueOnError:z$1.boolean().optional().default(false).describe("Continue processing remaining edits if one fails (default false)")});function QE(t){return "filePath"in t&&"edits"in t?(console.warn('[multiedit] Deprecated parameter format detected. The top-level "filePath" field is no longer needed. Please update to new format where each edit contains its own filePath.'),{edits:t.edits.map(n=>({filePath:n.filePath||t.filePath,oldString:n.oldString,newString:n.newString,replaceAll:n.replaceAll})),continueOnError:t.continueOnError??false}):t}var Jh=Le.define("multiedit",{description:KE,parameters:YE,async execute(t,e){let n=QE(t);Nt.check(e.abort,"multiedit");let o=await Al.init(),s=[],r=[],i=new Map;for(let a of n.edits)i.has(a.filePath)||i.set(a.filePath,[]),i.get(a.filePath).push(a);for(let[a,p]of i.entries()){Nt.check(e.abort,"multiedit");try{for(let d of p){let h=await o.execute({filePath:d.filePath,oldString:d.oldString,newString:d.newString,replaceAll:d.replaceAll},e);s.push({success:!0,filePath:d.filePath,result:h});}}catch(d){if(r.push({filePath:a,error:d}),s.push({success:false,filePath:a,error:d}),!n.continueOnError)throw d}}let c=s.filter(a=>a.success).length,u=s.filter(a=>!a.success).length,l=n.edits.length,f=s.filter(a=>a.success).at(-1),m="";if(u===0?m=`Successfully applied ${l} edit(s) across ${i.size} file(s)`:c===0?m=`Failed to apply all ${l} edit(s)`:m=`Applied ${c}/${l} edit(s) successfully, ${u} failed`,r.length>0){m+=`
834
+
835
+ Errors:
836
+ `;for(let{filePath:a,error:p}of r)m+=`- ${ke__default.posix.relative(A.worktree,a)}: ${p.message}
837
+ `;}return f?.result&&(m+=`
838
+
839
+ Last successful edit:
840
+ `,m+=f.result.output),{title:`Multiedit: ${c}/${l} successful`,metadata:{totalEdits:l,successCount:c,failureCount:u,filesModified:i.size,files:s.map(a=>({success:a.success,filePath:a.filePath,metadata:a.result?.metadata,error:a.error?.message}))},output:m}}});var ZE=loadTextFile("./ls.txt",import.meta.url),eT=ZE(),tT=["node_modules/","__pycache__/",".git/","dist/","build/","target/","vendor/","bin/","obj/",".idea/",".vscode/",".zig-cache/","zig-out/",".coverage/","coverage/","tmp/","temp/",".cache/","logs/",".venv/","venv/","env/"],nT=100,Bl=Le.define("list",{description:eT,parameters:z$1.object({path:z$1.string().default(".").optional().describe("The directory to list (default: current directory"),ignore:z$1.array(z$1.string()).default([]).optional().describe("List of glob patterns to ignore"),limit:z$1.number().default(100).optional().describe("Maximum number of entries to return (default: 100")}),execute:async(t,e)=>{let n=Filesystem.normalize(ke.isAbsolute(t.path||".")?t.path||".":ke.resolve(A.directory,t.path||"."));await yn(e,n,{kind:"directory",tool:"list"}),await e.ask({permission:"list",patterns:[ke.posix.relative(A.worktree,n)],always:["*"],metadata:{path:n}});let o=t.limit??nT,s="/",r=tT.map(a=>`!${a}*`).concat(t.ignore?.map(a=>`!${a}`)||[]),i=[],c=false;for await(let a of a$9.files({cwd:n,glob:r,signal:e.abort})){if(i.length>=o){c=true;break}i.push(Filesystem.toUnixPath(a));}let u=new Set,l=new Map;for(let a of i){let p=ke.posix.dirname(a),d=p==="."?[]:p.split(s);for(let h=0;h<=d.length;h++){let w=h===0?".":d.slice(0,h).join(s);u.add(w);}l.has(p)||l.set(p,[]),l.get(p).push(ke.posix.basename(a));}let f=(a,p)=>{let d=" ".repeat(p),h="";p>0&&(h+=`${d}${ke.posix.basename(a)}/
841
+ `);let w=" ".repeat(p+1),g=Array.from(u).filter(v=>ke.posix.dirname(v)===a&&v!==a).sort();for(let v of g)h+=f(v,p+1);let b=l.get(a)||[];for(let v of b.sort())h+=`${w}${v}
842
+ `;return h},m=`${n}/
843
+ `+f(".",0);return c&&(m+=`
844
+ [${o} entries limit reached, Use limit=${o*2} for more]`),{title:ke.posix.relative(A.worktree,n),metadata:{path:n,count:i.length,truncated:c},output:m}}});var ns=a.create({service:"agent-client-chat"}),sT=loadTextFile("./agent-client-chat.txt",import.meta.url),rT=10,lr=new Map,Qh=Le.define("agent_client_chat",{description:sT(),parameters:z$1.object({operation:z$1.enum(["connect","list","discover","capabilities","send","close","status","config","interrupt"]).default("connect").describe("Operation: connect | list | discover | capabilities | send | status | config | interrupt | close"),baseUrl:z$1.string().optional().describe("Target easbot service base URL (required for connect, e.g. http://localhost:3000)"),connectionId:z$1.string().optional().describe("Local connection id (required for remote ops: capabilities/send/interrupt/close/status; auto-resolved from baseUrl if not provided)"),prompt:z$1.string().optional().describe("Message to send (required for send operation)")}),formatValidationError(t){return `Agent client chat tool validation error: ${t.issues.map(n=>n.message).join("; ")}`},async execute(t,e){let n=t.operation??"connect",o=new Set(["connect","capabilities","send","interrupt"]);if(!e.extra?.directory)throw new Error("Directory context is required in ctx.extra.directory");let s={directory:e.extra.directory};if(o.has(n)&&t.baseUrl&&await e.ask({permission:"agent_client",patterns:[t.baseUrl],always:["*"],metadata:{operation:n,baseUrl:t.baseUrl}}),n==="config"){let[r,i]=await Promise.all([_t.config(s),_t.list({},s)]);return {title:"Agent client config",metadata:{count:0},output:JSON.stringify({config:r,managedConnections:i.length},null,2)}}if(n==="list"){let r=await _t.list({baseUrl:t.baseUrl},s);return {title:"Connection List",metadata:{count:r.length},output:JSON.stringify(r,null,2)}}if(n==="connect"){if(!t.baseUrl)throw new Error("baseUrl required for connect");let r=await _t.connect({baseUrl:t.baseUrl},s);return {title:"Connection connected",metadata:{count:0},output:JSON.stringify(r,null,2)}}if(n==="discover"){let r=await _t.listServices();return {title:"Discoverable Services",metadata:{count:r.length},output:JSON.stringify(r,null,2)}}if(!t.connectionId){let i=(await _t.list({baseUrl:t.baseUrl},s)).at(0);if(i)t.connectionId=i.connectionId;else throw new Error("No active connection found. Please connect first or provide connectionId.")}if(!t.connectionId)throw new Error("connectionId is required");if(n==="close"){await _t.interrupt(t.connectionId,s);let r=lr.get(t.connectionId);return r&&(r.unsubscribe?.(),lr.delete(t.connectionId)),await _t.close(t.connectionId,s),{title:"Connection closed",metadata:{count:0},output:JSON.stringify({success:true,connectionId:t.connectionId},null,2)}}if(n==="interrupt"){await _t.interrupt(t.connectionId,s);let r=lr.get(t.connectionId);return r&&(r.unsubscribe?.(),lr.delete(t.connectionId)),{title:"Session Interrupted",metadata:{count:0},output:JSON.stringify({success:true,connectionId:t.connectionId,message:"Remote session interrupted and local state cleaned up"},null,2)}}if(n==="capabilities"){let r=await _t.capabilities(t.connectionId,s);return {title:"Remote Agent Capabilities",metadata:{count:r.authMethods?.length??0},output:JSON.stringify(r,null,2)}}if(n==="status"){let r=await _t.status(t.connectionId,s);return {title:"Connection Status",metadata:{count:0},output:JSON.stringify(r,null,2)}}if(n==="send"){if(!t.prompt)throw new Error("prompt required");let r=t.connectionId,i=lr.get(r);if(i){if(i.currentRound>=i.maxRounds)return {title:"Round Limit Exceeded",metadata:{count:0},output:JSON.stringify({success:false,error:`Round limit reached (${i.maxRounds})`},null,2)};if(i.hasPendingResponse){let l=i.currentRound+1;return {title:"Waiting for Remote Response",metadata:{count:0,completedRounds:i.currentRound,pendingRound:l,maxRounds:i.maxRounds},output:JSON.stringify({success:false,status:"waiting",completedRounds:i.currentRound,pendingRound:l,maxRounds:i.maxRounds,note:`Round ${l} pending - waiting for remote agent response. Please do NOT send again, the remote response will be injected automatically.`},null,2)}}}else {let l=await _t.status(r,s);i={connectionId:r,sessionId:l.sessionId??"",localSessionId:e.sessionID,baseUrl:l.baseUrl??t.baseUrl??"",remoteAgentId:l.remoteAgentId,originalPrompt:t.prompt,currentRound:0,maxRounds:rT,hasPendingResponse:false,startedAt:Date.now()},ns.info("Establishing subscription for Agent-to-Agent interaction",{connectionId:r,sessionID:e.sessionID,remoteSessionId:l.sessionId});let f=await _t.subscribe(r,async m=>{if(ns.info("Subscription callback triggered",{connectionId:r,sessionID:e.sessionID,isComplete:!m.metadata,hasText:!!m.text,textLength:m.text?.length??0,hasThinking:!!m.thinking,toolsCount:m.tools?.length??0,hasSessionId:!!m.metadata?.sessionId,msgMetadata:m.metadata}),m.metadata?.sessionId){i.currentRound++,i.hasPendingResponse=false,ns.info("Remote response received, building prompt for local LLM",{connectionId:r,currentRound:i.currentRound,textPreview:m.text?.substring(0,100)??"",error:m.metadata.error});let a=(await Ut.get(e.sessionID)).type==="idle";if(await qe.prompt({sessionID:e.sessionID,parts:[{type:"subtask-result",taskId:i.connectionId,source:"agent-client",agent:"remote-agent",status:m.metadata.error?"error":"completed",result:m.text??"",error:m.metadata.error,rounds:{current:i.currentRound,max:i.maxRounds},thinking:m.thinking,tools:await Promise.all((m.tools??[]).map(async p=>{let d=typeof p.output=="string"?p.output:"",h=await Ke.output(d,{contentType:"output",toolName:p.name});return {name:p.name,status:p.status,output:h.content||void 0}})),metadata:{originalPrompt:i.originalPrompt,remoteAgentId:i.remoteAgentId,baseUrl:i.baseUrl,remoteSessionId:m.metadata.sessionId,connectionId:i.connectionId,tool:"agent_client_chat"},time:{start:i.startedAt,end:Date.now()}}],noReply:!a}),ns.info("Round completed, keeping connection alive for next round",{connectionId:r,currentRound:i.currentRound,remainingRounds:i.maxRounds-i.currentRound}),i.currentRound>=i.maxRounds){ns.info("Max rounds reached, closing connection",{connectionId:r,currentRound:i.currentRound,maxRounds:i.maxRounds});try{await _t.releaseSubscription(r,s);}catch(p){ns.warn("Failed to release server subscription",{connectionId:r,error:p instanceof Error?p.message:String(p)});}lr.delete(r);}}},s,{includeThinking:false,includeToolDetails:false,includeToolOutput:false,includeSteps:true});i.unsubscribe=f,lr.set(r,i);}let c=await qe.resolvePromptParts(t.prompt);await qe.prompt({sessionID:e.sessionID,parts:c,noReply:true}),ns.debug("Sending message to remote agent",{connectionId:r,sessionID:e.sessionID,currentRound:i.currentRound,promptLength:t.prompt.length,promptPreview:t.prompt.substring(0,200)}),i.hasPendingResponse=true;try{await _t.send(r,{sessionID:i.sessionId,parts:[{type:"text",text:`${t.prompt}
845
+
846
+ [async] Agent Client message`}]},s);}catch(l){throw i.hasPendingResponse=false,l}ns.debug("Message sent successfully, waiting for subscription callback",{connectionId:r,sessionID:e.sessionID,currentRound:i.currentRound,pendingRound:i.currentRound+1});let u=i.currentRound+1;return ns.debug("Tool execute returning, subscription should trigger callback on remote response",{connectionId:r,pendingRound:u,maxRounds:i.maxRounds}),{title:"Message Sent",metadata:{count:0,connectionId:r,completedRounds:i.currentRound,pendingRound:u,maxRounds:i.maxRounds},output:JSON.stringify({success:true,connectionId:r,completedRounds:i.currentRound,pendingRound:u,maxRounds:i.maxRounds,note:`Round ${u} pending (waiting for response)`},null,2)}}throw new Error(`Unknown operation: ${n}`)}});var Hl=a.create({service:"tool:gateway-channel"}),cT=loadTextFile("./gateway-channel.txt",import.meta.url),lT=cT(),Aa=null;async function dT(){if(Aa)return Aa;try{let t=await c$1(),e=t.path||"/",n=`ws://${t.hostname}:${t.port}${e}`;return Aa=new GatewayClient({url:n,type:"api"}),await Aa.connect(),Hl.info("gateway client connected",{url:n}),Aa}catch(t){return Hl.error("failed to connect to gateway",{error:String(t)}),null}}var uT=z$1.discriminatedUnion("operation",[z$1.object({operation:z$1.literal("list")}),z$1.object({operation:z$1.literal("channels")}),z$1.object({operation:z$1.literal("sessions"),limit:z$1.number().optional(),offset:z$1.number().optional()}),z$1.object({operation:z$1.literal("contacts"),platform:z$1.string().describe("Platform to list contacts (e.g., telegram, discord)"),limit:z$1.number().optional(),offset:z$1.number().optional()}),z$1.object({operation:z$1.literal("send"),channelId:z$1.string().optional(),userId:z$1.string().optional(),contactUid:z$1.string().optional(),sessionId:z$1.string().optional(),content:z$1.string(),messageType:z$1.enum(["text","image","file"]).default("text")})]),Zh=Le.define("gateway_channel",async()=>({description:lT,parameters:uT,async execute(t,e){let n=await dT();if(!n)return {title:"Gateway Not Available",metadata:{available:false},output:"**Error**: Cannot connect to Gateway server"};if(t.operation==="list"){let o=await n.getStatus();return {title:"Gateway Status",metadata:{connections:o.connections,sessions:o.sessions,subscriptions:o.subscriptions},output:`## Gateway Status
847
+
848
+ - **Status**: ${o.status}
849
+ - **Connections**: ${o.connections}
850
+ - **Sessions**: ${o.sessions}
851
+ - **Subscriptions**: ${o.subscriptions}
852
+ - **Uptime**: ${pT(o.uptime)}
853
+ - **Version**: ${o.version}`}}if(t.operation==="channels"){let o=await n.listChannels();if(o.channels.length===0)return {title:"Channels",metadata:{count:0},output:"**No channels connected**"};let s=["## Connected Channels"];for(let r of o.channels)s.push(`### ${r.name} (${r.platform})`),s.push(`- ID: ${r.id}`),r.version&&s.push(`- Version: ${r.version}`);return {title:"Channels",metadata:{count:o.channels.length},output:s.join(`
854
+ `)}}if(t.operation==="sessions"){let o=t.limit??50,s=t.offset??0,r=await n.listSessions({limit:o,offset:s});if(r.sessions.length===0)return {title:"Sessions",metadata:{count:0},output:"**No active sessions**"};let i=[`## Active Sessions (${r.total})`];for(let c of r.sessions)i.push(`### ${c.id}`),c.platform&&i.push(`- **Platform**: ${c.platform}`),c.channelId&&i.push(`- **Channel**: ${c.channelId}`),i.push(`- **State**: ${c.state}`),i.push(`- **Last Active**: ${Xh(c.lastActiveAt)}`);return r.hasMore&&i.push(`
855
+ *Showing ${r.sessions.length} of ${r.total}*`),{title:"Sessions",metadata:{count:r.sessions.length,total:r.total},output:i.join(`
856
+ `)}}if(t.operation==="contacts"){let o=t.platform,s=t.limit??50,r=t.offset??0,i=await n.listContacts(o,{limit:s,offset:r});if(i.contacts.length===0)return {title:"Contacts",metadata:{count:0},output:`**No contacts found on ${o}**`};let c=[`## Contacts on ${o} (${i.total})`];for(let u of i.contacts){let l=u.profile.displayName||u.profile.username||u.stableId;c.push(`### ${l}`),u.profile.username&&c.push(`- **@**: ${u.profile.username}`),c.push(`- **UID**: ${u.uid}`),c.push(`- **Last Seen**: ${Xh(u.lastSeenAt)}`);}return i.hasMore&&c.push(`
857
+ *Showing ${i.contacts.length} of ${i.total}*`),{title:"Contacts",metadata:{count:i.contacts.length,total:i.total,platform:o},output:c.join(`
858
+ `)}}if(t.operation==="send"){if(!t.content)return {title:"Send Message",metadata:{success:false},output:"**Error**: content is required"};let o,s,r;if(t.sessionId){r=t.sessionId;let u=await n.getSession(t.sessionId);u&&u.platform&&(s=u.platform);}if(t.contactUid){let[u,l]=t.contactUid.split(":");u&&l&&(s=u,o=l);}else t.userId&&(o=t.userId);let i=t.messageType==="text"?[{type:"text",text:t.content}]:t.messageType==="image"?[{type:"image",image:t.content}]:[{type:"file",data:t.content}],c={id:`msg_${Date.now()}_${Math.random().toString(36).slice(2,9)}`,sessionId:r??t.sessionId??e.sessionID,type:"output",content:i,metadata:{channel:{platform:s??"telegram",channelId:t.channelId??"default",...o?{userId:o,chatId:o}:{}},timestamp:Date.now()},timestamp:Date.now()};try{return await n.send(c),Hl.info("message sent to channel",{messageId:c.id,userId:o}),{title:"Message Sent",metadata:{success:!0,messageId:c.id},output:`## Message Sent
859
+
860
+ - **Message ID**: ${c.id}
861
+ - **Platform**: ${s||"telegram"}${o?`
862
+ - **User ID**: ${o}`:""}${t.sessionId?`
863
+ - **Session**: ${t.sessionId}`:""}
864
+ - **Content**: ${t.content.length>100?t.content.slice(0,100)+"...":t.content}`}}catch(u){return Hl.error("failed to send message",{error:String(u)}),{title:"Send Failed",metadata:{success:false},output:`**Error**: Failed to send message - ${u instanceof Error?u.message:String(u)}`}}}return {title:"Unknown Operation",metadata:{success:false},output:"**Error**: Unknown operation"}}}));function pT(t){let e=Math.floor(t/1e3),n=Math.floor(e/60),o=Math.floor(n/60),s=Math.floor(o/24);return s>0?`${s}d ${o%24}h ${n%60}m`:o>0?`${o}h ${n%60}m`:n>0?`${n}m ${e%60}s`:`${e}s`}function Xh(t){let e=new Date(t),o=new Date().getTime()-e.getTime();return o<6e4?"just now":o<36e5?`${Math.floor(o/6e4)}m ago`:o<864e5?`${Math.floor(o/36e5)}h ago`:e.toISOString().replace("T"," ").slice(0,19)}var fT=loadTextFile("./question.txt",import.meta.url),gT=fT(),ty=Le.define("question",{isEnabled:()=>["app","cli","desktop"].includes(a$2.EASBOT_CLIENT)||a$2.EASBOT_ENABLE_QUESTION_TOOL,description:gT,parameters:z$1.object({questions:z$1.array(zt.Info).describe("Questions to ask")}),async execute(t,e){let n=await zt.ask({sessionID:e.sessionID,questions:t.questions,tool:e.callID?{messageID:e.messageID,callID:e.callID}:void 0});function o(r){return !r||r.length===0?"Unanswered":r.join(", ")}let s=t.questions.map((r,i)=>`"${r.question}"="${o(n[i])}"`).join(", ");return {title:`Asked ${t.questions.length} question${t.questions.length>1?"s":""}`,output:`User has answered your questions: ${s}. You can now continue with the user's answers in mind.`,metadata:{answers:n}}}});var ny=a.create({service:"tool.registry"}),hT=[xh,ty,Jg,Th,Eh,jl,nh,Bl,ah,Al,wh,Jh,Ca,yh,mh,Dh,Rh,Oh,$h,Fh,Qh,Zh,Sh,Kh,Uh,ch,qh],ro;(p=>{let t,e;async function n(){let d={},{Filesystem:h}=await import('@easbot/utils'),{glob:w}=await import('glob');for await(let g of h.up({targets:[".easbot/tools"],start:A.directory,stop:A.worktree})){if(!await h.isDir(g))continue;let b=await w("*.{ts,js}",{cwd:g,absolute:true,nodir:true,follow:false,dot:false});for(let v of b)try{let k=h.extname(v),S=h.basename(v,k),{pathToFileURL:y}=await import('url'),x=await import(y(v).href);for(let[I,P]of Object.entries(x)){let T=I==="default"?S:`${S}_${I}`;d[T]={...P,id:T,source:"custom"};}}catch(k){ny.error("Failed to load tool file",{file:v,error:k});}}return d}function o(){return t||(t=A.state(async()=>{let d={};for(let w of hT)w.isEnabled&&!await w.isEnabled()||(d[w.id]={...w,source:"builtin"});let h=await n();for(let[w,g]of Object.entries(h))d[w]||(d[w]=g);if(e)for(let[w,g]of Object.entries(e))d[w]=g;return d})),t}async function s(){return o()()}p.state=s;async function r(){return s().then(d=>Object.values(d))}p.all=r;async function i(){return s().then(d=>Object.keys(d))}p.ids=i;async function c(d,h){let w=await r();return (await Promise.all(w.map(async b=>{let k=(await je.triggerEvent(HookEvent.ToolDefinition,b)).output;if(k.isEnabled&&!await k.isEnabled())return null;let S=await k.init({agent:h});return {id:k.id,init:k.init,scope:k.scope,isEnabled:k.isEnabled,...S}}))).filter(b=>b!==null)}p.tools=c;async function u(d){e||(e={}),e[d.id]={...d,source:"plugin"},f();}p.register=u;async function l(d){return e?.[d]?(delete e[d],f(),true):false}p.unregister=l;function f(){t=void 0;}async function m(){e=void 0,f(),await s();}p.refresh=m;async function a(){await s(),ny.debug("tool registry initialized");}p.init=a;})(ro||(ro={}));a.create({service:"agent-cli-api-tool"});var Qo={};a$7(Qo,{getConfig:()=>bT,getConfigDirectories:()=>vT,getGlobalConfig:()=>wT,updateConfig:()=>xT,updateGlobalConfig:()=>IT,waitForConfigDependencies:()=>ST});async function bT(){return he.get()}async function wT(){return he.getGlobal()}async function xT(t){return await he.update(t),he.get()}async function IT(t){return await he.updateGlobal(t),he.getGlobal()}async function vT(){return he.directories()}async function ST(){await he.waitForDependencies();}var ql={};a$7(ql,{getProvider:()=>kT,listAllProviders:()=>CT,listProviders:()=>oy});var $o=a.create({service:"agent-cli-api-provider"});async function oy(){try{$o.info("List providers");let t=await Ce.list(),e=Object.values(t);return $o.info("List providers success",{count:e.length}),e}catch(t){throw $o.error("List providers failed",{error:t}),t}}async function CT(){try{$o.info("List all available providers");let t=await a$3.get(),e=Object.values(t).map(n=>Ce.fromModelsDevProvider(n));return $o.info("List all available providers success",{count:e.length}),e}catch(t){throw $o.error("List all available providers failed",{error:t}),t}}async function kT(t){try{$o.info("Get provider details",{providerId:t});let n=(await oy()).find(o=>o.id===t);return n?($o.info("Get provider details success",{providerId:t}),n):($o.warn("Provider not found",{providerId:t}),null)}catch(e){throw $o.error("Get provider details failed",{providerId:t,error:e}),e}}var Gl={};a$7(Gl,{list:()=>PT,listCommands:()=>sy});async function sy(t){return (await gn.list(t)).map(o=>({name:o.name,description:o.description,source:o.source,subtask:o.subtask,hints:o.hints??[],agent:o.agent,model:o.model}))}var PT=sy;var io={};a$7(io,{add:()=>DT,addMcpServer:()=>VT,authCallback:()=>qT,authenticate:()=>$T,clients:()=>GT,connect:()=>AT,disconnect:()=>RT,finishAuth:()=>FT,getAuthStatus:()=>HT,getMcpServerInfo:()=>JT,getPrompt:()=>jT,hasStoredTokens:()=>BT,list:()=>TT,listMcpServers:()=>WT,prompts:()=>MT,readResource:()=>LT,removeAuth:()=>UT,removeMcpServer:()=>KT,resources:()=>OT,startAuth:()=>NT,status:()=>ET,supportsOAuth:()=>zT,tools:()=>_T});async function ET(){return ze.status()}async function TT(){return ze.status()}async function DT(t,e){await ze.add(t,e);return ze.status()}async function AT(t){await ze.connect(t);return ze.status()}async function RT(t){await ze.disconnect(t);return ze.status()}async function _T(){return ze.tools()}async function MT(){return ze.prompts()}async function OT(){return ze.resources()}async function jT(t,e,n){return ze.getPrompt(t,e,n)}async function LT(t,e){return ze.readResource(t,e)}async function NT(t){return ze.startAuth(t)}async function $T(t){return ze.authenticate(t)}async function FT(t,e){return ze.finishAuth(t,e)}async function UT(t){return ze.removeAuth(t)}async function zT(t){return ze.supportsOAuth(t)}async function BT(t){return ze.hasStoredTokens(t)}async function HT(t){return ze.getAuthStatus(t)}async function qT(t,e){return ze.finishAuth(t,e)}async function GT(){return ze.clients()}async function WT(){let e=(await he.get()).mcp??{};return Object.entries(e).map(([n,o])=>({name:n,...o}))}async function VT(t){let{name:e,...n}=t;return await he.update({mcp:{[e]:n}}),{name:e,...n}}async function KT(t){await he.update({mcp:{[t]:void 0}});}async function JT(t){let n=(await he.get()).mcp?.[t];return n?{name:t,...n}:null}var Wl={};a$7(Wl,{getLspStatus:()=>ry,status:()=>YT});var Dp=a.create({service:"agent-cli-api-lsp"});async function ry(){try{Dp.info("Get LSP status");let t=await Ve.status();return Dp.info("Get LSP status successful",{count:t.length}),t}catch(t){throw Dp.error("Failed to get LSP status",{error:t}),t}}var YT=ry;var os={};a$7(os,{publish:()=>QT,subscribe:()=>tD,subscribeAll:()=>eD,subscribeMessage:()=>oD,subscribeSession:()=>nD});var Gn=a.create({service:"agent-cli-api-events"});async function QT(t){try{Gn.info("Publish event",{eventType:t.type});let e=a$5.define(t.type,z$1.record(z$1.string(),z$1.any()));await ue.publish(e,t.properties??{});}catch(e){throw Gn.error("Publish event failed",{eventType:t.type,error:e}),e}}function iy(t){if(typeof t!="object"||t===null)return false;let e=t;return typeof e.sessionID=="string"||typeof e.sessionId=="string"}function XT(t){if(!iy(t))return false;let e=t;return typeof e.messageID=="string"||typeof e.messageId=="string"}function ay(t){if(iy(t))return t.sessionID||t.sessionId}function ZT(t){if(XT(t))return t.messageID||t.messageId}async function eD(t){try{Gn.info("Subscribe all events");let e=await ue.subscribeAll(t);return Gn.info("Subscribe all events success"),e}catch(e){throw Gn.error("Subscribe all events failed",{error:e}),e}}async function tD(t,e){try{Gn.info("Subscribe event",{eventType:t});let n=await ue.subscribeAll(o=>{o.type===t&&e(o);});return Gn.info("Subscribe event success",{eventType:t}),n}catch(n){throw Gn.error("Subscribe event failed",{eventType:t,error:n}),n}}async function nD(t,e){try{Gn.info("Subscribe session events",{sessionId:t});let n=await ue.subscribeAll(o=>{ay(o.properties)===t&&e(o);});return Gn.info("Subscribe session events success",{sessionId:t}),n}catch(n){throw Gn.error("Subscribe session events failed",{sessionId:t,error:n}),n}}async function oD(t,e,n){try{Gn.info("Subscribe message events",{sessionId:t,messageId:e});let o=await ue.subscribeAll(s=>{let r=ay(s.properties),i=ZT(s.properties);r===t&&(e===void 0||i===e)&&n(s);});return Gn.info("Subscribe message events success",{sessionId:t,messageId:e}),o}catch(o){throw Gn.error("Subscribe message events failed",{sessionId:t,messageId:e,error:o}),o}}var Vl={};a$7(Vl,{all:()=>sD});function sD(){return rn.all()}var Ra={};a$7(Ra,{remove:()=>iD,set:()=>rD});async function rD(t,e){return et.set(t,e)}async function iD(t){return et.remove(t)}var dr={};a$7(dr,{current:()=>lD,initGit:()=>dD,list:()=>cD,update:()=>uD});async function cD(){return Kt.list()}async function lD(){return A.project}async function dD(t){let e=t.directory||A.directory,n=await git(["init"],{cwd:e});if(n.exitCode!==0)throw new Error(`Git init failed: ${await n.text()}`);return A.project}async function uD(t,e){return A.project}var ss={};a$7(ss,{connect:()=>bD,create:()=>fD,get:()=>mD,list:()=>pD,remove:()=>hD,resize:()=>yD,update:()=>gD});async function pD(){return rt.list()}async function mD(t){return rt.get(t)}async function fD(t){return rt.create(t)}async function gD(t,e){return rt.update(t,e)}async function hD(t){return rt.remove(t)}async function yD(t,e,n){return rt.resize(t,e,n)}async function bD(t){return rt.get(t)}var cy;(e=>{async function t(){return []}e.list=t;})(cy||(cy={}));var pi={};a$7(pi,{list:()=>xD,listQuestions:()=>ly,reject:()=>vD,rejectQuestion:()=>uy,reply:()=>ID,replyQuestion:()=>dy});async function ly(){return zt.list()}async function dy(t){return await zt.reply(t),true}async function uy(t){return await zt.reject(t.requestID),true}var xD=ly,ID=dy,vD=uy;var ur={};a$7(ur,{list:()=>SD,read:()=>CD,search:()=>PD,status:()=>kD});async function SD(t){return It.list(t.path)}async function CD(t){return It.read(t.path)}async function kD(){return It.status()}async function PD(t){return It.search(t)}var Kl={};a$7(Kl,{dispose:()=>ED});async function ED(){return A.dispose()}var mi={};a$7(mi,{list:()=>TD,listPermissions:()=>py,reply:()=>DD,replyPermission:()=>my,respond:()=>AD,respondPermission:()=>fy});async function py(){return Me.list()}async function my(t){return await Me.reply(t),true}async function fy(t){return await Me.reply({requestID:t.permissionID,reply:t.response}),true}var TD=py,DD=my,AD=fy;var nd={};a$7(nd,{getContext:()=>yA,getProtocolMetadata:()=>bA});var gy=a.create({service:"context-workspace"}),_p=".easbot",_D="protocol.json",hy=1;function MD(t){return ke__default.join(t,_D)}async function Mp(t){try{let e=await Ot__default.readFile(t,"utf-8"),n=JSON.parse(e);return {version:hy,bootstrapSeededAt:n.bootstrapSeededAt,setupCompletedAt:n.setupCompletedAt,metadata:n.metadata}}catch{return {version:hy}}}async function _a(t){return t?ke__default.join(t,_p):ke__default.join(A.directory,_p)}async function Jl(t){let e=t?await _a(t):await _a(),n=MD(e);gy.debug("isSetupCompleted checking",{workspace:t,easbotDir:e,statePath:n});let o=await Mp(n),s=typeof o.setupCompletedAt=="string"&&o.setupCompletedAt.trim().length>0;return gy.debug("isSetupCompleted result",{statePath:n,setupCompletedAt:o.setupCompletedAt,completed:s}),s}var pn=a.create({service:"context-instructions"});async function jD(t){let e=[{name:"memory",description:"Use this tool to store, retrieve, update, and delete persistent memories across agent sessions. Memory enables learning from interactions, remembering user preferences, and building long-term knowledge",condition:async()=>Dn.isEnabled()},{name:"note",description:"Use this tool to search and retrieve information from the local note/document knowledge base. It returns document paths, line ranges, snippets, and related graph nodes",condition:async()=>on.isEnabled()}],n=["| Tool | Description |","|------|-------------|"];for(let o of e)await o.condition()&&n.push(`| \`${o.name}\` | ${o.description} |`);return n.join(`
865
+ `)}async function LD(t){let e=["| Directory | Description |","|-------------|-------------|"],n=[{path:async()=>on.rootDir(),description:"Knowledge base root directory",condition:async()=>on.isEnabled()},{path:async()=>`${await on.rootDir()}/tasks`,description:"Task files - each task in separate folder (task_plan.md, progress.md, findings.md)",condition:async()=>on.isEnabled()},{path:async()=>`${await on.rootDir()}/docs`,description:"Documentation - categorized by topic as needed",condition:async()=>on.isEnabled()}];for(let o of n)if(o.condition?await o.condition():true){let r=await o.path();e.push(`| \`${r}/\` | ${o.description} |`);}return e.join(`
866
+ `)}async function Op(t,e){let n=t;if(n.includes("{{tools}}"))try{n=n.replace("{{tools}}",await jD(e));}catch(s){pn.warn("failed to render {{tools}} placeholder",{error:String(s)}),n=n.replace("{{tools}}","");}if(n.includes("{{directories}}"))try{n=n.replace("{{directories}}",await LD(e));}catch(s){pn.warn("failed to render {{directories}} placeholder",{error:String(s)}),n=n.replace("{{directories}}","");}n=n.replace(/\{\{#if\s+(\w+)\}\}([\s\S]*?)\{\{\/if\}\}/g,(s,r,i)=>{let c=e[r];return c!=null&&c!==0&&c!==""?i:""}),n=n.replace(/\{\{#each\s+(\w+)\}\}([\s\S]*?)\{\{\/each\}\}/g,(s,r,i)=>{let c=e[r];return !Array.isArray(c)||c.length===0?"":c.map(u=>{let l=i;return typeof u=="object"&&u!==null&&Object.entries(u).forEach(([f,m])=>{l=l.replace(new RegExp(`\\{\\{${f}\\}\\}`,"g"),String(m));}),l}).join("")});let o={};return e.metadata&&Object.entries(e.metadata).forEach(([s,r])=>{o[s]=r;}),Object.entries(e).forEach(([s,r])=>{s==="metadata"||s==="tools"||s==="directories"||s==="files"||(o[s]=r);}),Object.keys(o).length>0&&(n=a$a.replaceVariables(n,o)),n}function ND(t){let e=`| File | Priority | Description | Scope | Type | Permission | Location | Status |
867
+ |------|----------|-------------|-------|------|------------|----------|--------|`,n=t.map(o=>`| ${o.name} | ${o.priority} | ${o.description} | ${o.scope} | ${o.type} | ${o.permission} | ${o.location} | ${o.status} |`).join(`
868
+ `);return `${e}
869
+ ${n}`}function Po(t){if(t)return typeof t=="string"?t:String(t)}function jp(t){if(t!=null){if(typeof t=="number")return t;if(typeof t=="string"){let e=Number.parseInt(t,10);if(!Number.isNaN(e))return e}}}function by(t){if(t!=null){if(typeof t=="boolean")return t;if(typeof t=="string")return t.toLowerCase()==="true"}}function Ql(t){if(t){if(Array.isArray(t))return t.map(e=>String(e));if(typeof t=="string")try{let e=JSON.parse(t);if(Array.isArray(e))return e.map(n=>String(n))}catch{return t.split(",").map(e=>e.trim())}}}function wy(t,e){return t.scope===i?true:t.scope===e}function $D(t,e){return !t.owner||t.owner.length===0?true:e?!!(t.owner.includes(e)||t.share?.includes(e)):false}async function FD(t,e,n){if(await Filesystem.isDir(t))try{let o=await Ot__default.readdir(t,{withFileTypes:!0});for(let s of o){if(!s.isFile()||!s.name.endsWith(".md"))continue;let r=s.name;if(!l.includes(r)||e.has(r))continue;let i=ke__default.join(t,r),c=await Xl(i,n);c&&e.set(r,c);}}catch(o){pn.warn("failed to scan builtin system files",{dir:t,error:String(o)});}}async function UD(t,e,n$1){for(let[o,s]of Object.entries(n))if(!n$1.has(o))for await(let r of Filesystem.up({targets:[s],start:t,stop:A.worktree})){let i=await Xl(r,e);if(i){n$1.set(o,i);break}}}async function zD(t,e,n){let o=ke__default.join(t,"rules"),s=new Map;if(!await Filesystem.isDir(o))return s;try{let r=await Ot__default.readdir(o,{withFileTypes:!0});for(let i of r){if(!i.isFile()||!i.name.endsWith(".md")||e.has(i.name))continue;let c=ke__default.join(o,i.name),u=await Xl(c,n);u&&s.set(i.name,u);}}catch(r){pn.warn("failed to scan rules directory",{dir:o,error:String(r)});}return s}async function BD(t,e,n,o){let s=new Map,r=await he.get(),i$1=r.context?.files,c=r.context?.contextFiles;if(!c)return s;let u=c[e]||c[i]||[];if(u.length===0||!await Filesystem.isDir(t))return s;try{let l=await Ot__default.readdir(t,{withFileTypes:!0});for(let f of u){if(s.has(f))continue;let m=l.find(h=>h.isFile()&&h.name===f);if(!m)continue;let a=ke__default.join(t,m.name),p=await Xl(a,o);if(!p)continue;let d=xy(f,i$1,p.frontmatter);wy(d,e)&&$D(d,n)&&s.set(f,{...p,config:d});}}catch(l){pn.warn("failed to load context files",{root:t,error:String(l)});}return s}function xy(t,e,n){let o=p[t],s=e?.[t];return {name:t,type:Po(n?.type)??s?.type??o?.type??"system",scope:Po(n?.scope)??s?.scope??o?.scope??"all",priority:jp(n?.priority)??s?.priority??o?.priority??q,owner:Ql(n?.owner)??s?.owner??o?.owner,share:Ql(n?.share)??s?.share??o?.share,permission:Po(n?.permission)??s?.permission??o?.permission??"read",description:Po(n?.description)??s?.description??o?.description,dynamic:by(n?.dynamic)??s?.dynamic??o?.dynamic}}function Yl(t,e,n,o,s,r=false){let i=n.permission==="write"?"writable":"readonly",c=`<file path="${o}" priority="${s}" mode="${i}">
870
+ ${e}
871
+ </file>`;return {name:t,content:c,priority:s,dynamic:r,location:o,permission:n.permission,owner:n.owner,share:n.share}}async function HD(t,e){try{if(await Jl(t))return pn.debug("workspace already initialized, skipping builtin bootstrap"),null;let o=null,s="",r=await rn.get("eas-agent-evolution");if(r){let u=ke__default.join(ke__default.dirname(r.location),"assets","BOOTSTRAP.md");try{o=await Ot__default.readFile(u,"utf-8"),s=u;}catch{}}if(!o){let u=m.replace(".md","");o=await loadTextFileAsync(`./template/${u}.txt`,import.meta.url)(),o&&(s=`context/template/${u}.txt`);}if(!o)return pn.debug("builtin bootstrap template not found"),null;let i=await Op(o,e).catch(u=>(pn.warn("renderTemplate failed for bootstrap, using raw content",{error:String(u)}),o)),c=p[m]??{name:m,type:"system",scope:"all",priority:20};return pn.debug("loaded builtin bootstrap template",{location:s}),Yl(m,i,c,`<builtin:${s}>`,c.priority??20,!1)}catch(n){return pn.warn("failed to load builtin bootstrap",{error:String(n)}),null}}function qD(t,e,n$1=false){let o$1=[],s=(r,i$1)=>{let c=i$1?.frontmatter||{},u=p[r],l=Po(c.scope)||u?.scope||i;l!==i&&l!==e||n$1&&!o.includes(r)||o$1.push({name:r,priority:jp(c.priority)||u?.priority||q,description:Po(c.description)||u?.description||"",scope:l,type:Po(c.type)||u?.type||"system",permission:Po(c.permission)||u?.permission||"read",location:i$1?.location||"",status:i$1?"\u2705":"\u274C"});};for(let r of l)s(r,t.get(r));for(let r of Object.keys(n))s(r,t.get(r));for(let[r,i]of t)p[r]||s(r,i);return o$1.sort((r,i)=>r.priority-i.priority),o$1}async function GD(t,e){let n={};try{let s=`${await _a(t)}/protocol.json`,r=await Mp(s);n.metadata=r.metadata;}catch(o){pn.debug("failed to read protocol for render context",{error:String(o)});}return n}async function Xl(t,e){let n=e??{};try{let o=await a$a.parse(t);return {content:await Op(o.content,n).catch(r=>(pn.warn("renderTemplate failed on parsed content, using raw",{filePath:t,error:String(r)}),o.content)),frontmatter:o.data,location:t}}catch(o){if(o.code==="ENOENT")return null;try{let s=await Ot__default.readFile(t,"utf-8");return pn.warn("failed to parse frontmatter, using raw content",{filePath:t,error:String(o)}),{content:await Op(s,n).catch(i=>(pn.warn("renderTemplate failed on raw content, using as-is",{filePath:t,error:String(i)}),s)),frontmatter:{},location:t}}catch(s){return pn.warn("failed to load template file",{filePath:t,error:String(s)}),null}}}async function WD(t){let e=t.mode??f$1,n=t.workspaceDir??A.directory,o$1=t.agent?.mode==="subagent",s=t.agent?.name,r$1=[],i=new Set,c=new Map,u=await GD(n),l=t.protocolInitialized??await Jl(n);if(pn.debug("loadTemplatesForMode: initialization status",{workspaceDir:n,isInitialized:l,protocolInitializedProvided:t.protocolInitialized!==void 0}),l){for await(let f of Filesystem.up({targets:[".easbot"],start:n,stop:A.worktree}))await FD(f,c,u);await UD(n,u,c);for(let[f,m]of c){if(i.has(f)||o$1&&!o.includes(f))continue;let a=xy(f,void 0,m.frontmatter);if(!wy(a,e))continue;let p=a.priority??q,d=f==="HEARTBEAT.md"||a.dynamic===true;r$1.push(Yl(f,m.content,a,m.location,p,d)),i.add(f);}}else {let f=await HD(n,u);f&&(r$1.push(f),i.add(m));}for await(let f of Filesystem.up({targets:[".easbot"],start:n,stop:A.worktree})){let m=await zD(f,i,u);for(let[p,d]of m){if(i.has(p))continue;let h={scope:Po(d.frontmatter?.scope)??"all",priority:jp(d.frontmatter?.priority)??r,permission:Po(d.frontmatter?.permission)??"read",dynamic:by(d.frontmatter?.dynamic)??true,owner:Ql(d.frontmatter?.owner),share:Ql(d.frontmatter?.share),description:Po(d.frontmatter?.description)};r$1.push(Yl(p,d.content,h,d.location,h.priority,h.dynamic)),i.add(p);}let a=await BD(f,e,s,u);for(let[p,d]of a)i.has(p)||(r$1.push(Yl(p,d.content,d.config,d.location,d.config.priority??q)),i.add(p));}if(u.files=qD(c,e,o$1),u.files&&u.files.length>0)try{let f=ND(u.files);for(let m of r$1)m.content.includes("{{files}}")&&(m.content=m.content.replace("{{files}}",f));}catch(f){pn.warn("failed to render {{files}} placeholder",{error:String(f)});}return r$1.sort((f,m)=>f.priority-m.priority),pn.debug("templates loaded from filesystem",{mode:e,workspaceDir:n,agentMode:t.agent?.mode,isInitialized:l,sectionCount:r$1.length,sections:r$1.map(f=>({name:f.name,priority:f.priority,location:f.location,dynamic:f.dynamic}))}),r$1}var yy=new Map;async function Iy(t){let e=t.mode??f$1,n=t.workspaceDir??A.directory,s=t.agent?.mode==="subagent"?t.agent.name:"primary",r=n?`template:${e}:${s}:${n}`:`template:${e}:${s}`,i=yy.get(r);if(i)return i;let u={sections:await WD(t),mode:e,loadedAt:Date.now()};return yy.set(r,u),u}async function Lp(t){return (await Iy(t)).sections}var Ds=a.create({service:"file-cache"}),vy=25*1024*1024,Sy=100,$p=class{constructor(e=Sy,n=vy){b$1(this,"cache");b$1(this,"maxEntries");b$1(this,"maxSizeBytes");b$1(this,"currentSizeBytes");this.cache=new Map,this.maxEntries=e,this.maxSizeBytes=n,this.currentSizeBytes=0;}get(e){let n=this.cache.get(e);return n!==void 0&&(this.cache.delete(e),this.cache.set(e,n)),n}set(e,n){for(this.cache.has(e)&&(this.cache.delete(e),this.currentSizeBytes-=this.estimateSize(n));this.cache.size>=this.maxEntries||this.currentSizeBytes>=this.maxSizeBytes;){let o=this.cache.keys().next().value;if(o!==void 0){let s=this.cache.get(o);s!==void 0&&(this.currentSizeBytes-=this.estimateSize(s)),this.cache.delete(o),Ds.debug("cache entry evicted",{key:o});}else break}this.cache.set(e,n),this.currentSizeBytes+=this.estimateSize(n);}has(e){return this.cache.has(e)}delete(e){let n=this.cache.get(e);return n!==void 0&&(this.currentSizeBytes-=this.estimateSize(n)),this.cache.delete(e)}clear(){this.cache.clear(),this.currentSizeBytes=0;}get size(){return this.cache.size}get sizeBytes(){return this.currentSizeBytes}estimateSize(e){return typeof e=="string"?e.length*2:100}keys(){return this.cache.keys()}values(){return this.cache.values()}entries(){return this.cache.entries()}},Zl=class{constructor(e=Sy,n=vy){b$1(this,"maxEntries",e);b$1(this,"maxSizeBytes",n);b$1(this,"cache");this.cache=new $p(this.maxEntries,this.maxSizeBytes),Ds.debug("file state cache created",{maxEntries:this.maxEntries,maxSizeBytes:this.maxSizeBytes});}async readFile(e,n){try{let o=await Ot__default.stat(e),s=o.mtimeMs,r=this.cache.get(e);if(r&&r.timestamp===s&&r.offset===n?.offset&&r.limit===n?.limit)return Ds.debug("cache hit",{filePath:e}),r.content;let i;if(n?.offset!==void 0||n?.limit!==void 0){let l=(await Ot__default.readFile(e,"utf-8")).split(`
872
+ `),f=n.offset??0,m=n.limit?f+n.limit:l.length;i=l.slice(f,m).join(`
873
+ `);}else i=await Ot__default.readFile(e,"utf-8");let c={content:i,timestamp:s,lineCount:i.split(`
874
+ `).length,size:o.size,offset:n?.offset,limit:n?.limit};return this.cache.set(e,c),Ds.debug("cache miss, file read",{filePath:e,size:o.size}),i}catch(o){if(o.code==="ENOENT"){this.cache.delete(e);return}throw o}}getState(e){return this.cache.get(e)}async detectChanges(){let e=[];for(let[n,o]of this.cache.entries())try{let s=await Ot__default.stat(n);if(s.mtimeMs!==o.timestamp){let r=await Ot__default.readFile(n,"utf-8");e.push({path:n,oldContent:o.content,newContent:r,oldMtime:o.timestamp,newMtime:s.mtimeMs}),this.cache.set(n,{...o,content:r,timestamp:s.mtimeMs});}}catch(s){s.code==="ENOENT"&&(e.push({path:n,oldContent:o.content,newContent:"",oldMtime:o.timestamp,newMtime:0}),this.cache.delete(n));}return e.length>0&&Ds.info("file changes detected",{count:e.length}),e}invalidate(e){this.cache.delete(e),Ds.debug("cache invalidated",{filePath:e});}invalidateAll(){this.cache.clear(),Ds.info("all cache invalidated");}has(e){return this.cache.has(e)}clear(){this.cache.clear(),Ds.info("cache cleared");}get size(){return this.cache.size}get sizeBytes(){return this.cache.sizeBytes}getFilePaths(){return Array.from(this.cache.keys())}},Np=null;function hi(t,e){return Np||(Np=new Zl(t,e)),Np}var yi=a.create({service:"static-prompt"}),pr;(m=>{let t;function e$1(){return t||(t=A.state(()=>({promptCache:new Map,fileCache:hi()}))),t}function n(){return e$1()()}function o(a,p,d){return [a.agent.name,a.model.id,p,d??"primary"].join("|")}function s(a,p,d){return `${a.agent.name}/${a.model.id}/${p}/${d??"primary"}`}function r(a,p,d){let h=n(),w=d?.mode,g=s(a,p,w),b=h.promptCache.get(g);return b&&b.configHash===o(a,p,w)?(yi.debug("static prompt cache hit",{cacheKey:g}),b.sections):null}m.getCached=r;function i(a,p,d,h){let w=n(),g=h?.mode,b=s(a,p,g),v={sections:d,configHash:o(a,p,g),builtAt:Date.now()};w.promptCache.set(b,v),yi.debug("static prompt cached",{cacheKey:b,length:d.length});}m.setCache=i;async function c(a){let p=a.mode??f$1,d=r(a,p,a.agent);if(d)return d;yi.debug("buildStaticPrompt: building",{agentName:a.agent.name,modelId:a.model.api?.id??a.model.id,mode:p,agentMode:a.agent.mode,workspaceDir:a.workspaceDir,protocolInitialized:a.protocolInitialized});let h=await Lp(a);return i(a,p,h,a.agent),yi.debug("static prompt built",{length:h.length}),h}m.buildStaticPrompt=c;function u(a,p){let d=n();if(a&&p){for(let h of e){let w=`${a}/${p}/${h}`;d.promptCache.delete(w);}yi.debug("static prompt cache entries invalidated",{agentName:a,modelId:p});}else d.promptCache.clear(),yi.debug("all static prompt cache invalidated");}m.invalidateCache=u;function l(){let a=n(),p=Date.now(),d=[];for(let[h,w]of a.promptCache.entries())d.push({key:h,age:p-w.builtAt});return {size:a.promptCache.size,entries:d}}m.getCacheStats=l;function f(){return n().fileCache}m.getFileCache=f;})(pr||(pr={}));var ja;(f=>{let t=a.create({service:"summary"}),e=loadTextFile("./memory-summary.txt",import.meta.url),n=loadTextFile("./knowledge-summary.txt",import.meta.url);async function r(m,a,p,d,h){return streamText({model:m,system:a,prompt:p,maxOutputTokens:d,abortSignal:h}).text}async function i(m){let a=await Ce.defaultModel(),p=m??await Ce.getModel(a.providerID??"default",a.modelID??"default");return Ce.getLanguage(p)}function c(m){return m.map(a=>{let p=[` - node: id=${a.id} type=${a.type} name=${a.name}`];if(a.edges&&a.edges.length>0)for(let d of a.edges){let h=d.targetId!==void 0?` (id=${d.targetId})`:"";p.push(` \u2192 [${d.direction}] ${d.relation} \u2192 target=${d.targetType}:${d.targetName}${h}`);}return p.join(`
875
+ `)}).join(`
876
+ `)}async function u(m,a){let{query:p,chunks:d,model:h,maxLength:w}=m;if(d.length===0)return "";let g=await i(h),b=n()??"Synthesize the following document chunks into a concise summary relevant to the query. Order by Priority descending.",v=d.map((y,x)=>{let I=y.startLine!=null?`#L${y.startLine}-L${y.endLine??y.startLine}`:"",P=y.score??0,T=`[Chunk ${x+1}] Priority: ${P.toFixed(3)}
877
+ Source: [${y.path}](./${y.path}${I})
878
+ ${y.content}`;return !y.nodes||y.nodes.length===0?T:`${T}
879
+ Graph Nodes:
880
+ ${c(y.nodes)}`}).join(`
881
+
882
+ `),k=`[Query]
883
+ ${p}
884
+
885
+ [Knowledge Chunks]
886
+ ${v}`;t.debug("note summary started",{query:p,chunkCount:d.length});let S=await r(g,b,k,w??1e3,a);return t.debug("note summary completed",{summaryLength:S.length}),S.trim()}f.summarizeNote=u;async function l(m,a){let{query:p,facts:d,model:h,maxLength:w}=m;if(d.length===0)return "";let g=await i(h),b=e()??"Synthesize the following memory facts into a concise summary relevant to the query. Order by Priority descending.",v=d.map((y,x)=>{let I=y.score??0,P=`[Fact ${x+1}] Priority: ${I.toFixed(3)}
887
+ Category: ${y.category} | Importance: ${y.importance} | Source: ${y.source}
888
+ ${y.content}`;if(!y.nodes||y.nodes.length===0)return P;let T=y.nodes.map(M=>{let j=[` - node: id=${M.id} type=${M.type} name=${M.name}`];if(M.edges&&M.edges.length>0)for(let N of M.edges){let K=N.direction??(N.source===M.id?"out":"in");j.push(` \u2192 [${K}] ${N.relation} \u2192 target=${N.targetNode?.type??"node"}:${N.targetNode?.name??`id=${N.target}`} (id=${N.target})`);}return j.join(`
889
+ `)}).join(`
890
+ `);return `${P}
891
+ Graph Nodes:
892
+ ${T}`}).join(`
893
+
894
+ `),k=`[Query]
895
+ ${p}
896
+
897
+ [Memory Facts]
898
+ ${v}`;t.debug("memory summary started",{query:p,factCount:d.length});let S=await r(g,b,k,w??1e3,a);return t.debug("memory summary completed",{summaryLength:S.length}),S.trim()}f.summarizeMemoryFacts=l;})(ja||(ja={}));a.create({service:"context-token"});function As(t){return t?Token.estimate(t):0}var Fp=800,La=a.create({service:"dynamic-prompt"}),Na;(u=>{async function t(l){let f=[],{mode:m}=l,a=l.useLLMSummary??true,p=l.maxTokens??Fp;if(l.memoryResults&&l.memoryResults.length>0){let d=await e(l.query??"",l.memoryResults,a,p);d&&f.push(d);}if(l.knowledgeResults&&l.knowledgeResults.length>0){let d=await n(l.query??"",l.knowledgeResults,a,p);d&&f.push(d);}if(l.fileChanges&&l.fileChanges.length>0){let d=r(l.fileChanges);f.push(d);}if((l.includeTodos??true)&&l.sessionID)try{let d=await no.get(l.sessionID),h=o(d);f.push(h);}catch(d){La.warn("failed to load todos for dynamic prompt",{error:String(d)});}if((l.includeTaskAgents??true)&&l.sessionID)try{let d=await Bt.list(l.sessionID),h=s(d);h&&f.push(h);}catch(d){La.warn("failed to load task agents for dynamic prompt",{error:String(d)});}if(m==="coder"&&l.includeCoderContext){let d=i();f.push(...d);}return La.debug("dynamic prompt built",{mode:m,parts:f.length,memoryCount:l.memoryResults?.length??0,knowledgeCount:l.knowledgeResults?.length??0,fileChangesCount:l.fileChanges?.length??0,useLLMSummary:a}),f}u.build=t;async function e(l,f,m,a=Fp){if(f.length===0)return `<memory>
899
+ ## Memory Summary
900
+
901
+ No memory found.
902
+ </memory>`;if(m)try{return `<memory>
903
+ ## Memory Summary
904
+
905
+ ${await ja.summarizeMemoryFacts({query:l,facts:f.map(w=>({content:w.snippet,category:w.category,importance:w.importance,source:w.source,score:w.score,createdAt:w.createdAt,nodes:w.nodes?.map(g=>({id:g.id,name:g.name,type:g.type,edges:g.edges?.map(b=>({source:b.source,target:b.target,relation:b.relation,direction:b.source===g.id?"out":"in",targetNode:b.targetNode?{name:b.targetNode.name,type:b.targetNode.type}:void 0}))}))})),maxLength:a})}
906
+ </memory>`}catch(h){La.warn("memory LLM summary failed, falling back to basic format",{error:String(h)});}let p=["<memory>","## Memory Search Results","",`Query: ${l||"(no query)"}`,""],d=Math.floor(a/f.length);for(let h=0;h<f.length;h++){let w=f[h],g=new Date(w.createdAt).getTime(),b=(Date.now()-g)/864e5,v=Math.exp(-0.1*b),k=(w.importance-1)/9,S=.35*w.score+.35*v+.3*k;if(p.push(`[${h+1}] Priority: ${S.toFixed(3)}`),p.push(`Category: ${w.category} | Importance: ${w.importance} | Source: ${w.source}`),w.nodes&&w.nodes.length>0){let x=[];for(let M of w.nodes){let j=M.edges&&M.edges.length>0?M.edges.map(N=>` --[${N.source===M.id?"out":"in"}] ${N.relation}--> ${N.targetNode?.name??`node:${N.target}`} (${N.targetNode?.type??"node"})`).join(`
907
+ `):" (no relations)";x.push(` Node: ${M.name} (${M.type})
908
+ ${j}`);}let I=x.join(`
909
+ `),P=Math.floor(d*4*.5),T=c(I,P);p.push(`Graph Nodes:
910
+ ${T}`);}let y=Math.max(0,d-As(p.join(`
911
+ `)));if(y>30){let x=Math.floor(y*4),I=c(w.snippet,x);p.push(I);}p.push("");}return p.push("</memory>"),p.join(`
912
+ `)}u.buildMemorySummary=e;async function n(l,f,m,a=Fp){if(f.length===0)return `<note>
913
+ ## Knowledge Summary
914
+
915
+ No knowledge found.
916
+ </note>`;if(m)try{return `<note>
917
+ ## Knowledge Summary
918
+
919
+ ${await ja.summarizeNote({query:l,chunks:f.map(w=>({path:w.chunk.path,content:w.chunk.content,startLine:w.chunk.startLine,endLine:w.chunk.endLine,score:w.score,updatedAt:w.document.updatedAt,nodes:w.nodes?.map(g=>({id:g.id,name:g.name,type:g.type,properties:g.properties,edges:g.edges?.map(b=>{let v=b.source===g.id?"out":"in",k=w.nodes?.find(S=>S.id===b.target);return {direction:v,relation:b.relation,targetId:b.target,targetName:k?.name??String(b.target),targetType:k?.type??"node"}})}))})),maxLength:a})}
920
+ </note>`}catch(h){La.warn("knowledge LLM summary failed, falling back to basic format",{error:String(h)});}let p=["<note>","## Knowledge Search Results","",`Query: ${l||"(no query)"}`,""],d=Math.floor(a/f.length);for(let h=0;h<f.length;h++){let w=f[h],g=w.chunk.startLine!=null?`#L${w.chunk.startLine}-L${w.chunk.endLine??w.chunk.startLine}`:"",b=.7*(w.score??0);if(p.push(`[${h+1}] Priority: ${b.toFixed(3)}`),p.push(`Source: [${w.chunk.path}](./${w.chunk.path}${g})`),w.nodes&&w.nodes.length>0){let k=[];for(let I of w.nodes){let P=I.edges&&I.edges.length>0?I.edges.map(T=>` --[${T.source===I.id?"out":"in"}] ${T.relation}--> node:${T.target} (node)`).join(`
921
+ `):" (no relations)";k.push(` Node: ${I.name} (${I.type})
922
+ ${P}`);}let S=k.join(`
923
+ `),y=Math.floor(d*4*.5),x=c(S,y);p.push(`Graph Nodes:
924
+ ${x}`);}let v=Math.max(0,d-As(p.join(`
925
+ `)));if(v>20){let k=Math.floor(v*4),S=c(w.chunk.content,k);p.push(S);}p.push("");}return p.push("</note>"),p.join(`
926
+ `)}u.buildKnowledgeSummary=n;function o(l){let f=["<todo>","## Todo List",""];if(!l||l.length===0)return f.push("No todo items. Use the todo tool to add tasks."),f.push("</todo>"),f.join(`
927
+ `);f.push("The following tasks need to be tracked:","");let m=l.filter(p=>p.status==="pending"),a=l.filter(p=>p.status==="in_progress");if(a.length>0){f.push("### In Progress");for(let p of a){let d=p.priority?` [${p.priority.toUpperCase()}]`:"";f.push(`- [ ] ${p.content}${d}`);}f.push("");}if(m.length>0){f.push("### Pending");for(let p of m){let d=p.priority?` [${p.priority.toUpperCase()}]`:"";f.push(`- [ ] ${p.content}${d}`);}f.push("");}return f.push("</todo>"),f.join(`
928
+ `)}u.buildTodosSummary=o;function s(l){let f=["<tasks>","## Agent Tasks",""];if(!l||l.length===0)return f.push("No running tasks."),f.push("</tasks>"),f.join(`
929
+ `);let m=l.filter(d=>d.status==="running"),a=l.filter(d=>d.status==="pending"),p=l.filter(d=>d.status==="error");if(m.length===0&&a.length===0&&p.length===0)return f.push("No active tasks."),f.push("</tasks>"),f.join(`
930
+ `);if(f.push("Active tasks (pending/running):",""),m.length>0){f.push("### Running");for(let d of m)f.push(`- [ ] ${d.description} \`[${d.agentType}]\` \`${d.taskId}\``);f.push("");}if(a.length>0){f.push("### Pending");for(let d of a)f.push(`- [ ] ${d.description} \`[${d.agentType}]\` \`${d.taskId}\``);f.push("");}if(p.length>0){f.push("### Failed");for(let d of p)f.push(`- [ ] ${d.description} \`[${d.agentType}]\` \`${d.taskId}\` - ${d.error||"unknown error"}`);f.push("");}return f.push("</tasks>"),f.join(`
931
+ `)}u.buildTaskAgentSummary=s;function r(l){if(l.length===0)return "";let f=["<changes>","## Recently Changed Files","The following files have been modified since your last check:",""];for(let m of l)f.push(`- ${m.path}`),m.newMtime===0?f.push(" Status: deleted"):f.push(` Modified: ${new Date(m.newMtime).toISOString()}`);return f.push(""),f.push("Consider reading these files if relevant to the current task."),f.push("</changes>"),f.join(`
932
+ `)}u.buildFileChangesSummary=r;function i(l){return []}u.buildCoderContext=i;function c(l,f){if(l.length<=f)return l;let a=l.slice(0,f).lastIndexOf(`
933
+ `),p=a>f*.8?a:f;return l.slice(0,p).trimEnd()+`
934
+ [...truncated...]`}})(Na||(Na={}));var YD=loadTextFile("./prompt/anthropic.txt",import.meta.url)(),QD=loadTextFile("./prompt/default.txt",import.meta.url)(),XD=loadTextFile("./prompt/beast.txt",import.meta.url)(),ZD=loadTextFile("./prompt/gemini.txt",import.meta.url)(),eA=loadTextFile("./prompt/codex.txt",import.meta.url)(),tA=loadTextFile("./prompt/gpt.txt",import.meta.url)(),nA=loadTextFile("./prompt/trinity.txt",import.meta.url)(),oA=loadTextFile("./prompt/kimi.txt",import.meta.url)(),sA=loadTextFile("./prompt/qwen.txt",import.meta.url)(),rA=loadTextFile("./prompt/glm.txt",import.meta.url)(),iA=loadTextFile("./prompt/minimax.txt",import.meta.url)();function Up(t){let e=t.model.id.toLowerCase(),n=t.protocolMetadata;return e.includes("gpt-4")||e.includes("o1")||e.includes("o3")?[a$a.replaceVariables(XD,n)]:e.includes("gpt")?e.includes("codex")?[a$a.replaceVariables(eA,n)]:[tA]:e.includes("gemini-")?[a$a.replaceVariables(ZD,n)]:e.includes("claude")?[a$a.replaceVariables(YD,n)]:e.includes("trinity")?[a$a.replaceVariables(nA,n)]:e.includes("kimi")?[a$a.replaceVariables(oA,n)]:e.includes("qwen")?[a$a.replaceVariables(sA,n)]:e.includes("glm")?[a$a.replaceVariables(rA,n)]:e.includes("minimax")?[a$a.replaceVariables(iA,n)]:[a$a.replaceVariables(QD,n)]}function aA(t){return t==="coder"?["<guidelines>","## Mode: Coder","You are operating in coding assistant mode.","Focus on code-related tasks: reading, writing, editing, and explaining code.","Use tools efficiently to explore the codebase and complete coding tasks.","","## Working Guidelines","","**CRITICAL: Explore code first before implementing**","You MUST use these tools to explore the codebase:","- `Grep` - Search code patterns and function calls","- `Glob` - Find files matching patterns","- `Read` - Read full file contents","- `codebase` - Query code knowledge graph","","**Recommended workflow:**","1. Search existing implementations using Grep/codebase","2. Read related files using Read tool","3. Check existing tests to understand behavior","4. Query memory/note for relevant past experiences","5. Then implement based on what you found","","**Plan before implementing**","- `todo` - Create and update and read todo list before implementing","","**External knowledge:**","- `codesearch` - Search and get relevant context for any programming task using Exa Code API","- `websearch` - Search the web","- `webfetch` - Fetch web page content","","**Writing code:**","- Use `write` tool to create or overwrite files","- Use `edit` tool for incremental changes","- Always verify with tests after writing","","**Fallback:**","- `Bash` - When other tools are insufficient","","</guidelines>"]:["<guidelines>","## Mode: General","You are operating in general assistant mode.","You can help with a wide range of tasks including coding, analysis, writing, and more.","","## Working Guidelines","","**CRITICAL: Plan before executing**","- `todo` - Create and update and read todo list","","**Proactively gather context before responding:**","- `Grep` - Search code patterns and function calls","- `Glob` - Find files matching patterns","- `Read` - Read file contents","","**External knowledge:**","- `websearch` - Search the web","- `webfetch` - Fetch web page content","","**Writing file:**","- `write` - Create or overwrite files","- `edit` - Incremental changes","","**Always consider:**","- User intent and preferences","- Relevant historical context","- Available tools and their capabilities","","**Fallback:**","- `Bash` - When other tools are insufficient","","</guidelines>"]}async function cA(t,e){if(Me.disabled(["skill"],t.permission).has("skill"))return [];let n=await rn.available(t,e);return ["<skills>",rn.format(n,{verbose:false}),"</skills>"]}async function zp(t){let{Instance:e}=await import('./instance-YUOFE3Q3.mjs'),n=e.project,o=new Date,s=Intl.DateTimeFormat().resolvedOptions().timeZone,r=[];return r.push("<env>"),r.push("Here is some useful information about the environment you are running in:"),r.push(` Current model: ${t.model.id}`),r.push(` Agent ID: ${t.protocolMetadata.agentId}`),r.push(` Workspace directory: ${e.directory}`),r.push(` Worktree root folder: ${e.worktree}`),r.push(` Is directory a git repo: ${n.vcs==="git"?"yes":"no"}`),r.push(` Platform: ${process.platform}`),r.push(` Local time: ${formatLocalISOCompact(o)} (${s})`),r.push(` UTC time: ${o.toISOString()}`),r.push("</env>"),r.push(...aA(t.mode)),r.push(...await cA(t.agent,t.mode)),[r.join(`
935
+ `)]}var $a=a.create({service:"context-search"});async function Bp(t,e,n){try{let o=await Dn.get();return !o||!e?[]:await o.query(e,{agentId:t.agent.name,maxResults:n,minScore:.2})}catch(o){return $a.warn("memory search error",{error:String(o)}),[]}}async function Hp(t,e,n){try{let o=await on.get();if(!o||!e)return $a.debug("searchKnowledge: kb or query not available",{kb:!!o,query:!!e}),[];$a.debug("searchKnowledge: calling kb.search",{query:e,maxResults:n,minScore:.3});let s=await o.search(e,{maxResults:n,minScore:.3});return $a.debug("searchKnowledge: kb.search returned",{query:e,resultsCount:s.length,results:s.map(r=>({score:r.score,path:r.document.path}))}),s}catch(o){return $a.warn("knowledge search error",{error:String(o)}),[]}}var rs=a.create({service:"context-engine"}),dA=loadTextFile("./prompt/max-steps.txt",import.meta.url),uA=dA(),pA=loadTextFile("./prompt/plan.txt",import.meta.url),mA=pA(),fA=loadTextFile("./prompt/coder-plan.txt",import.meta.url),gA=fA(),hA=loadTextFile("./prompt/build-switch.txt",import.meta.url),Py=hA();function Wp(t,e,n){let o=n?`A plan file already exists at ${e}. You can read it and make incremental edits using the edit tool.`:`No plan file exists yet. You should create your plan at ${e} using the write tool.`;return t.replace("{{planFileInfo}}",o)}var To;(k=>{let t,e;async function n(){return e||(e=Bi().then(S=>({mode:S.mode??f$1,fileCacheMaxEntries:S.fileCache?.maxEntries??100,fileCacheMaxBytes:S.fileCache?.maxBytes??25*1024*1024,maxTokens:S.maxTokens??2e3,searchMaxResults:S.searchMaxResults??3}))),e}function o(){return t||(t=A.state(async()=>{let S=await n(),y=A.directory,x={workspace:y,name:"EasBot",userName:"",mission:""},I=false;try{let P=ke__default.join(y,".easbot"),T=ke__default.join(P,"protocol.json"),M=await Ot__default.readFile(T,"utf-8"),j=JSON.parse(M);j.metadata&&(x={agentId:j.metadata.agentId,workspace:j.metadata.workspace||y,name:j.metadata.name||"EasBot",userName:j.metadata.userName||"",mission:j.metadata.mission||""}),I=typeof j.setupCompletedAt=="string"&&j.setupCompletedAt.trim().length>0;}catch{rs.debug("protocol.json not found, using default metadata");}return {config:S,initialized:true,protocolInitialized:I,fileCache:hi(),protocolMetadata:x}})),t}async function s(){return o()()}function r(S){e=Promise.resolve({mode:S.mode??f$1,fileCacheMaxEntries:S.fileCacheMaxEntries??100,fileCacheMaxBytes:S.fileCacheMaxBytes??25*1024*1024,maxTokens:S.maxTokens??2e3,searchMaxResults:S.searchMaxResults??3}),rs.info("context engine configured",{mode:S.mode,maxTokens:S.maxTokens,searchMaxResults:S.searchMaxResults});}k.configure=r;async function i(){return (await s()).config}k.getConfig=i;async function c(S){let y=await s();return !y.protocolInitialized&&!y.protocolMetadata.agentId&&S&&(y.protocolMetadata.agentId=S.name),y.protocolMetadata}k.getProtocolMetadata=c;async function u(){let S=await s();return {protocolMetadata:S.protocolMetadata,protocolInitialized:S.protocolInitialized}}k.getContext=u;function l(){return hi()}k.getFileCache=l;function f(S){let y=[];for(let x of S.parts)x.type==="text"&&x.text&&y.push(x.text);return y.join(" ").trim()}k.extractQuery=f;async function m(S){let y=await je.triggerEvent(HookEvent.ContextBuildBefore,S,{sessionID:S.sessionID});y.modified&&y.output&&(S=y.output);let x=await s();x.protocolMetadata.agentId||(x.protocolMetadata.agentId=S.agent.name);let I=S.mode??x.config.mode??f$1,P=S.maxTokens??x.config.maxTokens??2e3,T=S.searchMaxResults??x.config.searchMaxResults??3,M=f(S.userMessage);rs.debug("context build started",{sessionID:S.sessionID,mode:I,hasQuery:!!M,messageCount:S.messages.length});let[j,N]=[Bp(S,M,T).catch(V=>(rs.warn("memory search failed",{error:String(V)}),[])),Hp(S,M,T).catch(V=>(rs.warn("knowledge search failed",{error:String(V)}),[]))],K=pr.buildStaticPrompt({mode:I,workspaceDir:S.session.directory,agent:S.agent,model:S.model,protocolMetadata:x.protocolMetadata,protocolInitialized:x.protocolInitialized});rs.debug("ContextEngine.build: static prompt promise created",{sessionDirectory:S.session.directory,agent:S.agent.name,protocolInitialized:x.protocolInitialized});let[te,U,_]=await Promise.all([K,j,N]),D=x.protocolMetadata,O=te.map(V=>V.name),C=te.map(V=>V.content),E=await Na.build({query:M,mode:I,sessionID:S.sessionID,memoryResults:U,knowledgeResults:_,includeTodos:true,includeCoderContext:I==="coder",useLLMSummary:true,maxTokens:P}),R=await a({sessionID:S.sessionID,model:S.model,agent:S.agent,user:S.user,workspace:S.session.directory,staticPrompt:C,staticPromptSources:O,dynamicParts:E,maxChars:P*4,protocolMetadata:x.protocolMetadata,mode:I}),{messages:L,lastUserMessage:q,lastAssistantMessage:Q}=await p(S),Z=h(L,R),se=S.model.limit?.context??0,le=se>0?se:Ce.DEFAULT_CONTEXT_LIMIT,be=Math.max(le-2e4,5e4)-Z,re=mn.calculateTokenUsageState(Z,S.model),X=re.isAboveAutoCompactThreshold||re.isAtBlockingLimit;re.isAboveWarningThreshold&&rs.warn("context window running low",{remaining:be,tokenEstimate:Z,percentLeft:re.percentLeft,needsCompaction:X});let H={sessionID:S.sessionID,isLastStep:S.isLastStep??false,mode:I,messageCount:L.length,tokenEstimate:Z,remaining:be,sources:w(I,U.length>0,_.length>0),memoryResults:U.length,knowledgeResults:_.length,lastUserMessage:q,lastAssistantMessage:Q,needsCompaction:X,protocolMetadata:D};rs.debug("context build completed",{...H,lastUserMessage:q?.info.id,lastAssistantMessage:Q?.info.id});let F={system:R,messages:L,tools:S.tools,model:S.model,agent:S.agent,session:S.session,metadata:H},ne=await je.triggerEvent(HookEvent.ContextBuildAfter,{context:F},{sessionID:S.sessionID});return ne.modified&&ne.output?ne.output.context:F}k.build=m;async function a(S){let {sessionID:y,model:x,agent:I,user:P,staticPrompt:M,staticPromptSources:j,dynamicParts:N,maxChars:K,protocolMetadata:te,mode:U}=S;await Ce.getProvider(x.providerID);await et.get(x.providerID);let O=[];I.prompt&&I.prompt.trim().length>0?O.push(a$a.replaceVariables(I.prompt,te)):O.push(...Up({model:x,protocolMetadata:te}));for(let C=0;C<M.length;C++){let E=j?.[C]??`template-${C}`,R=TruncateContent.truncate(M[C],{label:"static prompt",sourcePath:E,maxChars:K});O.push(R.content);}if(O.push(...await zp({model:x,mode:U,agent:I,protocolMetadata:te})),O.push(...N),P.system){let C=await TruncateContent.truncateAndSave(P.system,{label:"user system prompt",maxChars:K});O.push(C.content);}return await je.triggerEvent(HookEvent.SystemTransform,{sessionID:y,model:x}),O}async function p(S){let y=clone(S.messages),x=S.mode??f$1;for(let K=y.length-1;K>=0;K--){let te=y[K];if(te&&te.info.role==="assistant"&&te.info.finish){break}}(S.includeReminders??true)&&await d(y,{agent:S.agent,session:S.session,userMessageID:S.userMessage.info.id,lastFinished:S.lastFinished,step:S.step??1,isLastStep:S.isLastStep??false,mode:x});let T=y;S.maxMessages&&S.maxMessages>0&&(T=y.slice(-S.maxMessages));let M=await ve.toModelMessages(T,S.model);S.isLastStep&&M.push({role:"assistant",content:[{type:"text",text:uA}]});let j=y.findLast(K=>K.info.role==="user"),N=y.findLast(K=>K.info.role==="assistant");return {messages:M,lastUserMessage:j,lastAssistantMessage:N}}async function d(S,y){let{agent:x,session:I,lastFinished:P,step:T,isLastStep:M,mode:j}=y,N=S.findLast(D=>D.info.role==="user");if(!N)return;let K=j==="coder"?gA:mA,te=ee.plan(I),U=false;try{await Ot__default.access(te),U=!0;}catch{U=false;}let _=Wp(K,te,U);if(!a$2.EASBOT_PLAN_MODE)x.name==="plan"&&N.parts.push({id:Identifier.ascending("part"),messageID:N.info.id,sessionID:N.info.sessionID,type:"text",text:_,synthetic:true}),S.some(O=>O.info.role==="assistant"&&O.info.agent==="plan")&&x.name==="build"&&N.parts.push({id:Identifier.ascending("part"),messageID:N.info.id,sessionID:N.info.sessionID,type:"text",text:Wp(Py,te,U),synthetic:true});else {let D=S.findLast(O=>O.info.role==="assistant");if(x.name!=="plan"&&D?.info.agent==="plan"){if(U){let O=await ee.updatePart({id:Identifier.ascending("part"),messageID:N.info.id,sessionID:N.info.sessionID,type:"text",text:Wp(Py,te,U),synthetic:true});N.parts.push(O);}return}if(x.name==="plan"&&D?.info.agent!=="plan"){U||await Ot__default.mkdir(ke__default.dirname(te),{recursive:true});let O=await ee.updatePart({id:Identifier.ascending("part"),messageID:N.info.id,sessionID:N.info.sessionID,type:"text",text:_,synthetic:true});N.parts.push(O);return}}if(T>1&&P&&!M){for(let D of S)if(!(D.info.role!=="user"||D.info.id<=P.info.id))for(let O of D.parts)O.type!=="text"||O.ignored||O.synthetic||O.text?.trim()&&(O.text=`<system-reminder>
936
+ The user sent the following message:
937
+ `+O.text+`
938
+
939
+ Please address this message and continue with your tasks.
940
+ </system-reminder>`);}await je.triggerEvent(HookEvent.MessageTransform,{sessionID:y.session.id,userMessageID:y.userMessageID});}function h(S,y){let x=0;if(y)for(let I of y)x+=As(I);for(let I of S)if(I.content){if(typeof I.content=="string")x+=As(I.content);else if(Array.isArray(I.content)){for(let P of I.content)if(typeof P=="object"&&P!==null){let T=P;typeof T.text=="string"&&(x+=As(T.text));}}}return x}k.tokenCountWithEstimation=h;function w(S,y,x){let I=["system","history","tools","templates"];return y&&I.push("memory"),x&&I.push("knowledge"),S==="coder"&&I.push("coder-context"),I}function g(S,y){pr.invalidateCache(S,y);}k.invalidateCache=g;function b(){return pr.getCacheStats()}k.getCacheStats=b;async function v(){(await s()).fileCache.clear(),rs.debug("file cache reset");}k.resetFileCache=v;})(To||(To={}));async function yA(){return To.getContext()}async function bA(){return To.getProtocolMetadata()}function Fa(){let t=null,e=false,n=[];return {stream:{[Symbol.asyncIterator](){return {next(){return e?Promise.resolve({value:void 0,done:true}):n.length>0?Promise.resolve({value:n.shift(),done:false}):new Promise(i=>{t=i;})}}}},push:i=>{e||(t?(t({value:i,done:false}),t=null):n.push(i));},close:()=>{e=true,t&&(t({value:void 0,done:true}),t=null);}}}function gl(t){let e={directory:t.directory};return {config:{get:async(n,o)=>({data:await Ee(()=>Qo.getConfig(),"CONFIG_GET_ERROR",e)}),providers:async(n,o)=>({data:{providers:await Ee(()=>ql.listProviders(),"CONFIG_PROVIDERS_ERROR",e)}})},model:{default:async(n,o)=>{let s=await Ee(()=>wa.getDefaultModel(),"MODEL_DEFAULT_ERROR",e);if(!s)return {data:void 0};let{provider:r,model:i}=parseModelId(s);return {data:{providerID:r,modelID:i}}},parse:async(n,o)=>({data:await Ee(()=>Promise.resolve(wa.parseModel(n.model)),"MODEL_PARSE_ERROR",e)})},command:{list:async(n,o)=>({data:await Ee(()=>Gl.listCommands(n.contextMode),"COMMAND_LIST_ERROR",e)})},permission:{list:async(n,o)=>({data:await Ee(()=>mi.listPermissions(),"PERMISSION_LIST_ERROR",e)}),respond:async(n,o)=>(await Ee(()=>mi.respondPermission({sessionID:n.sessionID,permissionID:n.permissionID,response:n.response}),"PERMISSION_RESPOND_ERROR",e),{data:true}),reply:async(n,o)=>(await Ee(()=>mi.replyPermission({requestID:n.requestID,reply:n.reply,message:n.message}),"PERMISSION_REPLY_ERROR",e),{data:true})},question:{list:async(n,o)=>({data:await Ee(()=>pi.listQuestions(),"QUESTION_LIST_ERROR",e)}),reply:async(n,o)=>(await Ee(()=>pi.replyQuestion({requestID:n.requestID,answers:n.answers}),"QUESTION_REPLY_ERROR",e),{data:true}),reject:async(n,o)=>(await Ee(()=>pi.rejectQuestion({requestID:n.requestID}),"QUESTION_REJECT_ERROR",e),{data:true})},session:{create:async(n,o)=>({data:await Ee(()=>un.createSession({title:n?.title,directory:n?.directory??e.directory}),"SESSION_CREATE_ERROR",e)}),get:async(n,o)=>({data:await Ee(()=>un.getSession(n.sessionID),"SESSION_GET_ERROR",e)}),list:async(n,o)=>({data:await Ee(()=>un.listSessions({limit:n?.limit,directory:n?.directory??e.directory}),"SESSION_LIST_ERROR",e)}),fork:async(n,o)=>({data:await Ee(()=>un.forkSession(n.sessionID,n.messageID),"SESSION_FORK_ERROR",e)}),delete:async(n,o)=>(await Ee(()=>un.deleteSession(n.sessionID),"SESSION_DELETE_ERROR",e),{data:true}),abort:async(n,o)=>(await Ee(()=>un.abortSession(n.sessionID),"SESSION_ABORT_ERROR",e),{data:true}),summarize:async(n,o)=>({data:await Ee(()=>un.summarizeSession({sessionId:n.sessionID,providerID:n.providerID,modelID:n.modelID,auto:n.auto}),"SESSION_SUMMARIZE_ERROR",e)}),contextMode:{get:async(n,o)=>({data:await Ee(()=>un.getSessionContextMode(n.sessionID),"SESSION_CONTEXT_MODE_ERROR",e)}),set:async(n,o)=>(await Ee(()=>un.setSessionContextMode(n.sessionID,n.mode),"SESSION_CONTEXT_MODE_ERROR",e),{data:n.mode})},messages:async(n,o)=>({data:await Ee(()=>sr.listMessages(n.sessionID,n.limit),"SESSION_MESSAGES_ERROR",e)}),message:async(n,o)=>({data:await Ee(()=>sr.getMessage(n.sessionID,n.messageID),"SESSION_MESSAGE_ERROR",e)}),prompt:async(n,o)=>{let s=(n.parts??[]).filter(u=>u.type==="text").map(u=>u.text).join(`
941
+ `),r=(n.parts??[]).filter(u=>u.type==="file").map(u=>({url:u.url,filename:u.filename,mime:u.mime})),i=(n.parts??[]).find(u=>u.type==="agent")?.name;return {data:await Ee(()=>sr.send({sessionId:n.sessionID,text:s,agent:n.agent,subAgent:i,model:n.model,variant:n.variant,files:r.length>0?r:void 0,noReply:n.noReply,contextMode:n.contextMode}),"SESSION_PROMPT_ERROR",e)}},command:async(n,o)=>({data:await Ee(()=>sr.command({sessionId:n.sessionID,command:n.command,arguments:n.arguments,agent:n.agent,model:n.model,variant:n.variant,messageID:n.messageID,contextMode:n.contextMode,parts:n.parts}),"SESSION_COMMAND_ERROR",e)}),event:async(n,o)=>{let{stream:s,push:r,close:i}=Fa(),c;try{c=await Ee(()=>os.subscribeSession(n.sessionID,l=>{r({sessionID:n.sessionID,payload:l});}),"SESSION_EVENT_ERROR",e);}catch(l){throw i(),l}let u=n?.signal;return u&&u.addEventListener("abort",()=>{c?.(),i();}),{stream:s}},update:async(n,o)=>({data:await Ee(()=>un.updateSession(n.sessionID,n),"SESSION_UPDATE_ERROR",e)}),children:async(n,o)=>({data:await Ee(()=>un.getSessionChildren(n.sessionID),"SESSION_CHILDREN_ERROR",e)}),init:async(n,o)=>({data:await Ee(()=>un.initSession(n),"SESSION_INIT_ERROR",e)}),status:async(n,o)=>({data:await Ee(()=>un.listSessionStatuses(),"SESSION_STATUS_ERROR",e)})},message:{event:async(n,o)=>{let{stream:s,push:r,close:i}=Fa(),c;try{c=await Ee(()=>os.subscribeMessage(n.sessionID,n.messageID,l=>{r({sessionID:n.sessionID,messageID:n.messageID,payload:l});}),"MESSAGE_EVENT_ERROR",e);}catch(l){throw i(),l}let u=n?.signal;return u&&u.addEventListener("abort",()=>{c?.(),i();}),{stream:s}}},event:{subscribe:async(n,o)=>{let{stream:s,push:r,close:i}=Fa(),c;try{c=await Ee(()=>os.subscribeAll(l=>{r({payload:l});}),"EVENT_SUBSCRIBE_ERROR",e);}catch(l){throw i(),l}let u=n?.signal;return u&&u.addEventListener("abort",()=>{c?.(),i();}),{stream:s}},publish:async(n,o)=>(await Ee(()=>os.publish(n),"EVENT_PUBLISH_ERROR",e),{data:true})},agent:{list:async(n,o)=>({data:await Ee(()=>Ps.listAgents(),"AGENT_LIST_ERROR",e)}),get:async(n,o)=>({data:await Ee(()=>Ps.getAgent(n.agentID),"AGENT_GET_ERROR",e)}),default:async(n,o)=>({data:await Ee(()=>Ps.getDefaultAgent(),"AGENT_DEFAULT_ERROR",e)}),create:async(n,o)=>({data:await Ee(()=>Ps.createAgent({name:n.name,mode:n.mode,permission:n.permission}),"AGENT_CREATE_ERROR",e)}),event:async(n,o)=>{let{stream:s,push:r,close:i}=Fa(),c;try{c=await Ee(()=>os.subscribeAll(l=>{l.properties?.agentID===n.agentID&&r({agentID:n.agentID,payload:l});}),"AGENT_EVENT_ERROR",e);}catch(l){throw i(),l}let u=n?.signal;return u&&u.addEventListener("abort",()=>{c?.(),i();}),{stream:s}}},global:{event:async(n,o)=>{let{stream:s,push:r,close:i}=Fa(),c;try{c=await Ee(()=>os.subscribeAll(l=>{r({payload:l});}),"GLOBAL_EVENT_ERROR",e);}catch(l){throw i(),l}let u=n?.signal;return u&&u.addEventListener("abort",()=>{c?.(),i();}),{stream:s}},config:{get:async(n,o)=>({data:await Ee(()=>Qo.getGlobalConfig(),"CONFIG_GET_ERROR",e)}),update:async(n,o)=>({data:await Ee(()=>Qo.updateGlobalConfig(n),"CONFIG_UPDATE_ERROR",e)})},dispose:async(n,o)=>(await Ee(()=>Kl.dispose(),"GLOBAL_DISPOSE_ERROR",e),{data:true})},app:{agents:async(n,o)=>({data:await Ee(()=>Ps.listAgents(),"APP_AGENTS_ERROR",e)}),skills:async(n,o)=>({data:(await Ee(()=>Vl.all(),"APP_SKILLS_ERROR",e)).map(r=>({name:r.name,description:r.description??"",location:r.location}))}),log:async(n,o)=>({data:[]}),context:async(n,o)=>({data:await Ee(()=>nd.getContext(),"APP_CONTEXT_ERROR",e)})},auth:{set:async(n,o)=>(await Ee(()=>Ra.set(n.providerID,n.info),"AUTH_SET_ERROR",e),{data:true}),remove:async(n,o)=>(await Ee(()=>Ra.remove(n.providerID),"AUTH_REMOVE_ERROR",e),{data:true})},project:{list:async(n,o)=>({data:await Ee(()=>dr.list(),"PROJECT_LIST_ERROR",e)}),current:async(n,o)=>({data:await Ee(()=>dr.current(),"PROJECT_CURRENT_ERROR",e)}),initGit:async(n,o)=>({data:await Ee(()=>dr.initGit(n),"PROJECT_INIT_GIT_ERROR",e)}),update:async(n,o)=>({data:await Ee(()=>dr.update(n.projectID,n),"PROJECT_UPDATE_ERROR",e)})},pty:{list:async(n,o)=>({data:await Ee(()=>ss.list(),"PTY_LIST_ERROR",e)}),get:async(n,o)=>({data:await Ee(()=>ss.get(n.id),"PTY_GET_ERROR",e)}),create:async(n,o)=>({data:await Ee(()=>ss.create(n),"PTY_CREATE_ERROR",e)}),update:async(n,o)=>({data:await Ee(()=>ss.update(n.id,n),"PTY_UPDATE_ERROR",e)}),remove:async(n,o)=>(await Ee(()=>ss.remove(n.id),"PTY_REMOVE_ERROR",e),{data:true}),connect:async(n,o)=>({data:await Ee(()=>ss.connect(n.id),"PTY_CONNECT_ERROR",e)})},file:{list:async(n,o)=>({data:await Ee(()=>ur.list({directory:n?.directory,path:n?.path}),"FILE_LIST_ERROR",e)}),read:async(n,o)=>({data:await Ee(()=>ur.read({directory:n?.directory,path:n?.path}),"FILE_READ_ERROR",e)}),status:async(n,o)=>({data:await Ee(()=>ur.status(),"FILE_STATUS_ERROR",e)}),search:async(n,o)=>({data:await Ee(()=>ur.search(n),"FILE_SEARCH_ERROR",e)})},mcp:{status:async(n,o)=>({data:await Ee(()=>io.status(),"MCP_STATUS_ERROR",e)}),add:async(n,o)=>{let{name:s,config:r}=n;return {data:await Ee(()=>io.add(s,r),"MCP_ADD_ERROR",e)}},connect:async(n,o)=>{let{name:s}=n;return {data:await Ee(()=>io.connect(s),"MCP_CONNECT_ERROR",e)}},disconnect:async(n,o)=>{let{name:s}=n;return {data:await Ee(()=>io.disconnect(s),"MCP_DISCONNECT_ERROR",e)}},tools:async(n,o)=>{let s=await Ee(()=>io.tools(),"MCP_TOOLS_ERROR",e),r={};for(let i of Object.keys(s)){let c=i.split("_"),u=c[0];if(!u)continue;let l=c.slice(1).join("_");r[u]||(r[u]=[]),r[u].push(l);}return {data:r}},auth:{start:async(n,o)=>{let{name:s}=n;return {data:await Ee(()=>io.startAuth(s),"MCP_AUTH_START_ERROR",e)}},authenticate:async(n,o)=>{let{name:s}=n;return {data:await Ee(()=>io.authenticate(s),"MCP_AUTH_AUTHENTICATE_ERROR",e)}},finish:async(n,o)=>{let{name:s,authorizationCode:r}=n;return {data:await Ee(()=>io.finishAuth(s,r),"MCP_AUTH_FINISH_ERROR",e)}},callback:async(n,o)=>{let{name:s,callbackUrl:r}=n;return {data:await Ee(()=>io.authCallback(s,r),"MCP_AUTH_CALLBACK_ERROR",e)}},remove:async(n,o)=>{let{name:s}=n;return await Ee(()=>io.removeAuth(s),"MCP_AUTH_REMOVE_ERROR",e),{data:true}}}},lsp:{status:async(n,o)=>({data:await Ee(()=>Wl.getLspStatus(),"LSP_STATUS_ERROR",e)})}}}async function wA(){let{Server:t}=await import('./server-Z6BORWAL.mjs');return t.openapi()}var Fe=a.create({service:"cli-tui-state"});async function SA(t,e,n){let o=e.options,s=f=>{if(!f)return SessionTitle.createDefault(false);let m=f.trim();return m.slice(0,50)+(m.length>50?"...":"")};if(o?.new){let f=s(o.prompt),{data:m}=await t.session.create({title:f,directory:A.directory,contextMode:n.contextMode});return Fe.debug("New session created via --new",{sessionId:m?.id,contextMode:n.contextMode}),m?.id??null}let{data:r}=await t.session.list({limit:1}),i=r?.find(f=>!f.parentID)?.id,c=e.sessionId||n.sessionId||i;if(c&&o?.fork){let{data:f}=await t.session.fork({sessionID:c,contextMode:n.contextMode});return Fe.debug("Session forked",{baseID:c,forkedID:f?.id,contextMode:n.contextMode}),f?.id??null}if(c)return Fe.debug("Using existing session",{sessionId:c}),c;let u=s(o?.prompt),{data:l}=await t.session.create({title:u,directory:A.directory,contextMode:n.contextMode});return Fe.debug("New session created (fallback)",{sessionId:l?.id,contextMode:n.contextMode}),l?.id??null}async function CA(t={}){Fe.debug("Creating TUI state",{options:t});let e={directory:A.directory,projectId:A.project.id},n={toolsExpanded:true,showThinking:true,thinkingLevel:"low",verboseLevel:"off",messageLimit:50,localShellPermission:"ask",contextMode:void 0,model:void 0,agent:void 0,sessionId:void 0},o=t.sessionId||t.options?.sessionId;if(o)try{n=await a$c(o),Fe.debug("Loaded TUI state from session",{sessionId:o,persistedState:n});}catch{Fe.debug("No persisted state found for session",{sessionId:o});}let s=gl({directory:e.directory}),r=await SA(s,{...t,sessionId:o},n),i=r||"new";if(r)try{let f=(await s.session.get({sessionID:r})).data;f?.title&&(i=f.title);}catch(l){Fe.debug("Failed to load session title",{sessionId:r,error:l});}if(r&&r!==o)try{n=await a$c(r),Fe.debug("Loaded TUI state from resolved session",{sessionId:r,persistedState:n});}catch{Fe.debug("No persisted state found for resolved session",{sessionId:r});}let c=t.model||n.model;if(!c)try{let l=await s.model.default({});l.data&&(c=`${l.data.providerID}/${l.data.modelID}`,Fe.debug("Got default model from backend",{model:c}));}catch(l){Fe.warn("Failed to get default model",{error:l});}let u=t.agent||n.agent;if(!u)try{let m=((await s.app.agents({})).data||[]).filter(a=>a.mode!=="subagent");m.length>0?(u=m[0].name,Fe.debug("Got default agent from backend",{agent:u})):(u="",Fe.warn("No agents available"));}catch(l){u="",Fe.warn("Failed to get default agent",{error:l});}return r||Fe.warn("No session ID provided, TUI may not function correctly"),Fe.debug("TUI state resolved",{agent:{provided:t.agent,persisted:n.agent,final:u},model:{provided:t.model,persisted:n.model,final:c},sessionId:{provided:t.sessionId,persisted:n.sessionId,final:r},contextMode:n.contextMode}),{agent:u,currentSessionKey:i,currentSessionId:r,activeChatRunId:null,historyLoaded:false,toolsExpanded:n.toolsExpanded,showThinking:n.showThinking,thinkingLevel:n.thinkingLevel,verboseLevel:n.verboseLevel,messageLimit:n.messageLimit,localShellPermission:n.localShellPermission,contextMode:n.contextMode,pendingShellCommand:null,sessionInfo:{model:c,modelProvider:void 0,totalTokens:null,contextTokens:null},pendingPermission:null,pendingQuestion:null,questionDisplayTimer:null,instanceContext:e,sdk:s}}var Vp;function kA(){if(!Vp){let t=A.state(()=>new Map,async e=>{Fe.debug("Disposing TUI state",{count:e.size}),e.clear();});Vp=async e=>{let n=t(),o=JSON.stringify(e);if(!n.has(o)){let s=await CA(e);n.set(o,s);}return n.get(o)};}return Vp}async function Kp(t={}){return kA()(t)}async function ate(t,e,n,o){Fe.debug("Initializing TUI state with health check and event subscription");let s=await Kp(t);if(s.currentSessionId&&!s.contextMode)try{let c=await s.sdk.session.contextMode.get({sessionID:s.currentSessionId});c.data&&(s.contextMode=c.data,Fe.debug("Got contextMode from session API",{sessionId:s.currentSessionId,contextMode:s.contextMode}));}catch(c){Fe.debug("Failed to get contextMode from session API",{sessionId:s.currentSessionId,error:c});}s.currentSessionId?(Fe.debug("Saving initial TUI state to storage",{sessionId:s.currentSessionId}),await b$5(s)):Fe.warn("No session ID, skipping initial state save"),await PA(s,n),Fe.debug("Running TUI state health check");let r=await Ay(s);if(r.healthy)Fe.debug("TUI state health check passed");else {Fe.warn("TUI state health check failed",{report:r}),Fe.debug("Attempting to auto-heal TUI state");let c=await TA(s);c.success?(Fe.debug("TUI state auto-heal successful",{report:c}),n.addSystem(a$8("tui.state.healed")),await b$5(s)):(Fe.error("TUI state auto-heal failed",{report:c}),n.addSystem(a$8("tui.state.heal_failed")));}Fe.debug("Subscribing to backend state events");let i=await EA(s,e,n,o);return Fe.debug("Backend state events subscribed"),{state:s,unsubscribe:i}}async function PA(t,e){Fe.debug("Validating local preferences",{localModel:t.sessionInfo.model,localAgent:t.agent,sessionId:t.currentSessionId});try{let n=[];if(t.sessionInfo.model)try{let o=await t.sdk.model.parse({model:t.sessionInfo.model});o.data&&(((await t.sdk.config.providers({})).data?.providers||[]).find(u=>u.id===o.data.providerID)?.models?.[o.data.modelID]?(n.push(`model: ${t.sessionInfo.model}`),Fe.debug("Model validated successfully",{model:t.sessionInfo.model})):(Fe.warn("Local model does not exist",{model:t.sessionInfo.model,providerID:o.data.providerID,modelID:o.data.modelID}),e.addSystem(a$8("tui.state.model_not_found",{vars:{model:t.sessionInfo.model}})),t.sessionInfo.model=void 0));}catch(o){Fe.error("Failed to validate model",{model:t.sessionInfo.model,error:o});}if(t.agent)try{((await t.sdk.app.agents({})).data||[]).find(i=>i.name===t.agent)?(n.push(`agent: ${t.agent}`),Fe.debug("Agent validated successfully",{agent:t.agent})):(Fe.warn("Local agent does not exist",{agent:t.agent}),e.addSystem(a$8("tui.state.agent_not_found",{vars:{agent:t.agent}})),t.agent="");}catch(o){Fe.error("Failed to validate agent",{agent:t.agent,error:o});}n.length>0&&(Fe.debug("Local preferences validated",{validationResults:n}),e.addSystem(a$8("tui.state.preferences_validated",{vars:{items:n.join(", ")}}))),Fe.debug("Local preferences validation completed");}catch(n){Fe.error("Failed to validate local preferences",{error:n});}}async function Ey(t,e){return A.provide({directory:t.instanceContext.directory,init:void 0,fn:e})}async function Do(t,e,n){await Ey(t,async()=>{await ue.publish(e,n);});}async function od(t,e,n){let o=()=>{};return await Ey(t,async()=>{o=ue.subscribe(e,n),await ue.waitForSubscription();}),o}async function cte(t,e){await t.sdk.permission.reply({requestID:e.requestID,reply:e.reply});}async function lte(t,e){await t.sdk.question.reply({requestID:e.requestID,answers:e.answers});}var yo={async appendPrompt(t,e){await Do(t,c$2.PromptAppend,e);},async openHelp(t){await Do(t,c$2.CommandExecute,{command:"help.show"});},async openSessions(t){await Do(t,c$2.CommandExecute,{command:"session.list"});},async openThemes(t){await Do(t,c$2.CommandExecute,{command:"session.list"});},async openModels(t){await Do(t,c$2.CommandExecute,{command:"model.list"});},async submitPrompt(t){await Do(t,c$2.CommandExecute,{command:"prompt.submit"});},async clearPrompt(t){await Do(t,c$2.CommandExecute,{command:"prompt.clear"});},async executeCommand(t,e){let n={session_new:"session.new",session_share:"session.share",session_interrupt:"session.interrupt",session_compact:"session.compact",messages_page_up:"session.page.up",messages_page_down:"session.page.down",messages_line_up:"session.line.up",messages_line_down:"session.line.down",messages_half_page_up:"session.half.page.up",messages_half_page_down:"session.half.page.down",messages_first:"session.first",messages_last:"session.last",agent_cycle:"agent.cycle"};await Do(t,c$2.CommandExecute,{command:n[e.command]||e.command});},async showToast(t,e){await Do(t,c$2.ToastShow,e);},async selectSession(t,e){await Do(t,c$2.SessionSelect,e);},async publish(t,e){let n=Object.values(c$2).find(o=>o.type===e.type);n&&await Do(t,n,e.properties);}};async function Ty(t){return (await t.sdk.app.agents({})).data||[]}async function dte(t){return (await t.sdk.session.list({limit:50})).data||[]}async function Dy(t){let n=(await t.sdk.config.providers({})).data?.providers||[];return Object.fromEntries(n.filter(o=>typeof o.id=="string"&&o.id.length>0).map(o=>[o.id,{name:o.name,models:o.models}]))}async function EA(t,e,n,o){let s=[];Fe.debug("Subscribing to backend events");let r=await od(t,ee.Event.Created,async l=>{Fe.debug("Session created",{sessionId:l.properties.info.id}),n.addSystem(a$8("tui.state.session.created",{vars:{title:l.properties.info.title||l.properties.info.id}}));});s.push(r);let i=await od(t,ee.Event.Updated,async l=>{Fe.debug("Session updated",{sessionId:l.properties.info.id}),t.currentSessionId===l.properties.info.id&&o();});s.push(i);let c=await od(t,ee.Event.Deleted,async l=>{let f=l.properties.info.id,m=l.properties.info.title||f;Fe.debug("Session deleted",{sessionId:f,sessionTitle:m}),n.addSystem(a$8("tui.state.session.deleted",{vars:{title:m}})),t.currentSessionId===f&&(t.currentSessionId=null,t.currentSessionKey="new",o());});s.push(c);let u=await od(t,ze.ToolsChanged,async l=>{Fe.debug("MCP tools changed",{server:l.properties.server});});return s.push(u),Fe.debug("Backend events subscribed",{count:s.length}),()=>{Fe.debug("Unsubscribing from backend events");for(let l of s)l();}}async function Ay(t){let e={checks:[],healthy:true};Fe.debug("Running TUI state diagnostics");try{await(await import('fs/promises')).access(t.instanceContext.directory),e.checks.push({name:"Instance Context",status:"pass",message:`Directory exists: ${t.instanceContext.directory}`});}catch{e.healthy=false,e.checks.push({name:"Instance Context",status:"fail",message:`Directory not accessible: ${t.instanceContext.directory}`,suggestion:"Reinitialize Instance context"});}try{let n=await Ty(t);Fe.debug("Agent list retrieved for health check",{agent:t.agent,availableAgents:n.map(s=>s.name),agentCount:n.length}),n.find(s=>s.name===t.agent)?e.checks.push({name:"Current Agent",status:"pass",message:`Agent exists: ${t.agent}`}):(e.healthy=!1,e.checks.push({name:"Current Agent",status:"fail",message:`Agent not found: ${t.agent}`,suggestion:"Switch to default agent or first available agent"}),Fe.warn("Current agent not found in available agents",{agent:t.agent,availableAgents:n.map(s=>s.name)}));}catch(n){e.healthy=false,e.checks.push({name:"Current Agent",status:"fail",message:`Failed to check agent: ${String(n)}`,suggestion:"Check Instance context and API layer"});}if(t.currentSessionId)try{(await t.sdk.session.get({sessionID:t.currentSessionId})).data?e.checks.push({name:"Current Session",status:"pass",message:`Session exists: ${t.currentSessionId}`}):(e.healthy=!1,e.checks.push({name:"Current Session",status:"fail",message:`Session not found: ${t.currentSessionId}`,suggestion:"Clear invalid session ID or create new session"}));}catch(n){e.healthy=false,e.checks.push({name:"Current Session",status:"fail",message:`Failed to check session: ${String(n)}`,suggestion:"Clear invalid session ID"});}if(t.sessionInfo.model)try{let n=await Dy(t),{provider:o,model:s}=parseModelId(t.sessionInfo.model);n[o]?.models?.[s]?e.checks.push({name:"Current Model",status:"pass",message:`Model exists: ${t.sessionInfo.model}`}):(e.healthy=!1,e.checks.push({name:"Current Model",status:"fail",message:`Model not found: ${t.sessionInfo.model}`,suggestion:"Switch to default model or first available model"}));}catch(n){e.healthy=false,e.checks.push({name:"Current Model",status:"fail",message:`Failed to check model: ${String(n)}`,suggestion:"Check Instance context and API layer"});}return Fe.debug("TUI state diagnostics completed",{healthy:e.healthy,checks:e.checks.length}),e}async function TA(t){let e={actions:[],success:true};Fe.debug("Running TUI state auto-heal");let n=await Ay(t);for(let o of n.checks)if(o.status==="fail")try{switch(o.name){case "Current Agent":{let s=await Ty(t);s.length>0?(t.agent=s[0].name,e.actions.push({name:"Fix Current Agent",status:"success",message:`Switched to agent: ${t.agent} (temporary, not saved)`})):(e.success=!1,e.actions.push({name:"Fix Current Agent",status:"fail",message:"No agents available"}));break}case "Current Session":{t.currentSessionId=null,t.currentSessionKey="new",e.actions.push({name:"Fix Current Session",status:"success",message:"Cleared invalid session ID"});break}case "Current Model":{let s=await Dy(t),r=Object.keys(s);if(r.length>0){let i=r[0],c=s[i];if(c?.models){let u=Object.keys(c.models);if(u.length>0){let l=u[0];t.sessionInfo.model=`${i}/${l}`,e.actions.push({name:"Fix Current Model",status:"success",message:`Switched to model: ${t.sessionInfo.model}`});}else e.success=!1,e.actions.push({name:"Fix Current Model",status:"fail",message:"No models available in provider"});}else e.success=!1,e.actions.push({name:"Fix Current Model",status:"fail",message:"No models available"});}else e.success=!1,e.actions.push({name:"Fix Current Model",status:"fail",message:"No providers available"});break}}}catch(s){e.success=false,e.actions.push({name:`Fix ${o.name}`,status:"fail",message:`Failed to fix: ${String(s)}`});}return Fe.debug("TUI state auto-heal completed",{success:e.success,actions:e.actions.length}),e}var DA={400:{description:"Bad request",content:{"application/json":{schema:resolver(z$1.object({data:z$1.any(),errors:z$1.array(z$1.record(z$1.string(),z$1.any())),success:z$1.literal(false)}).meta({ref:"BadRequestError"}))}}},404:{description:"Not found",content:{"application/json":{schema:resolver(a$6.NotFoundError.Schema)}}}};function Te(...t){return Object.fromEntries(t.map(e=>[e,DA[e]]))}var Ao=()=>Kp(),RA=z$1.object({path:z$1.string(),body:z$1.any()}),_A=new AsyncQueue,MA=new AsyncQueue;var OA=new Hono().get("/next",describeRoute({summary:"Get next TUI request",description:"Retrieve the next TUI (Terminal User Interface) request from the queue for processing.",operationId:"tui.control.next",responses:{200:{description:"Next TUI request",content:{"application/json":{schema:resolver(RA)}}}}}),async t=>{let e=await _A.next();return t.json(e)}).post("/response",describeRoute({summary:"Submit TUI response",description:"Submit a response to the TUI request queue to complete a pending request.",operationId:"tui.control.response",responses:{200:{description:"Response submitted successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),validator("json",z$1.any()),async t=>{let e=t.req.valid("json");return MA.push(e),t.json(true)}),Oy=lazy(()=>new Hono().post("/append-prompt",describeRoute({summary:"Append TUI prompt",description:"Append prompt to the TUI",operationId:"tui.appendPrompt",responses:{200:{description:"Prompt processed successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",b$2.PromptAppend.properties),async t=>{let e=await Ao();return await yo.appendPrompt(e,t.req.valid("json")),t.json(true)}).post("/open-help",describeRoute({summary:"Open help dialog",description:"Open the help dialog in the TUI to display user assistance information.",operationId:"tui.openHelp",responses:{200:{description:"Help dialog opened successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.openHelp(e),t.json(true)}).post("/open-sessions",describeRoute({summary:"Open sessions dialog",description:"Open the session dialog",operationId:"tui.openSessions",responses:{200:{description:"Session dialog opened successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.openSessions(e),t.json(true)}).post("/open-themes",describeRoute({summary:"Open themes dialog",description:"Open the theme dialog",operationId:"tui.openThemes",responses:{200:{description:"Theme dialog opened successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.openThemes(e),t.json(true)}).post("/open-models",describeRoute({summary:"Open models dialog",description:"Open the model dialog",operationId:"tui.openModels",responses:{200:{description:"Model dialog opened successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.openModels(e),t.json(true)}).post("/submit-prompt",describeRoute({summary:"Submit TUI prompt",description:"Submit the prompt",operationId:"tui.submitPrompt",responses:{200:{description:"Prompt submitted successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.submitPrompt(e),t.json(true)}).post("/clear-prompt",describeRoute({summary:"Clear TUI prompt",description:"Clear the prompt",operationId:"tui.clearPrompt",responses:{200:{description:"Prompt cleared successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>{let e=await Ao();return await yo.clearPrompt(e),t.json(true)}).post("/execute-command",describeRoute({summary:"Execute TUI command",description:"Execute a TUI command (e.g. agent_cycle)",operationId:"tui.executeCommand",responses:{200:{description:"Command executed successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",z$1.object({command:z$1.string()})),async t=>{let e=await Ao();return await yo.executeCommand(e,t.req.valid("json")),t.json(true)}).post("/show-toast",describeRoute({summary:"Show TUI toast",description:"Show a toast notification in the TUI",operationId:"tui.showToast",responses:{200:{description:"Toast notification shown successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),validator("json",b$2.ToastShow.properties),async t=>{let e=await Ao();return await yo.showToast(e,t.req.valid("json")),t.json(true)}).post("/publish",describeRoute({summary:"Publish TUI event",description:"Publish a TUI event",operationId:"tui.publish",responses:{200:{description:"Event published successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",z$1.union(Object.values(b$2).map(t=>z$1.object({type:z$1.literal(t.type),properties:t.properties}).meta({ref:"Event."+t.type})))),async t=>{let e=await Ao();return await yo.publish(e,t.req.valid("json")),t.json(true)}).post("/select-session",describeRoute({summary:"Select session",description:"Navigate the TUI to display the specified session.",operationId:"tui.selectSession",responses:{200:{description:"Session selected successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("json",b$2.SessionSelect.properties),async t=>{let e=await Ao();return await yo.selectSession(e,t.req.valid("json")),t.json(true)}).route("/control",OA));var Ny=lazy(()=>new Hono().get("/",describeRoute({summary:"List all projects",description:"Get a list of projects that have been opened with EasBot.",operationId:"project.list",responses:{200:{description:"List of projects",content:{"application/json":{schema:resolver(Kt.Info.array())}}}}}),async t=>{let e=await Kt.list();return t.json(e)}).get("/current",describeRoute({summary:"Get current project",description:"Retrieve the currently active project that EasBot is working with.",operationId:"project.current",responses:{200:{description:"Current project information",content:{"application/json":{schema:resolver(Kt.Info)}}}}}),async t=>t.json(A.project)).patch("/:projectID",describeRoute({summary:"Update project",description:"Update project properties such as name, icon, and commands.",operationId:"project.update",responses:{200:{description:"Updated project information",content:{"application/json":{schema:resolver(Kt.Info)}}},...Te(400,404)}}),validator("param",z$1.object({projectID:z$1.string()})),validator("json",Kt.update.schema.omit({projectID:true})),async t=>{let e=t.req.valid("param").projectID,n=t.req.valid("json"),o=await Kt.update({...n,projectID:e});return t.json(o)}));var wi=a.create({service:"server"}),Uy=lazy(()=>new Hono().get("/",describeRoute({summary:"List sessions",description:"Get a list of all EasBot sessions, sorted by most recently updated.",operationId:"session.list",responses:{200:{description:"List of sessions",content:{"application/json":{schema:resolver(ee.Info.array())}}}}}),validator("query",z$1.object({directory:z$1.string().optional().meta({description:"Filter sessions by project directory"}),roots:z$1.coerce.boolean().optional().meta({description:"Only return root sessions (no parentID)"}),start:z$1.coerce.number().optional().meta({description:"Filter sessions updated on or after this timestamp (milliseconds since epoch)"}),search:z$1.string().optional().meta({description:"Filter sessions by title (case-insensitive)"}),limit:z$1.coerce.number().optional().meta({description:"Maximum number of sessions to return"})})),async t=>{let e=t.req.valid("query"),n=e.search?.toLowerCase(),o=[];for await(let s of ee.list())if(!(e.directory!==void 0&&s.directory!==e.directory)&&!(e.roots&&s.parentID)&&!(e.start!==void 0&&s.time.updated<e.start)&&!(n!==void 0&&!s.title.toLowerCase().includes(n))&&(o.push(s),e.limit!==void 0&&o.length>=e.limit))break;return t.json(o)}).get("/status",describeRoute({summary:"Get session status",description:"Retrieve the current status of all sessions, including active, idle, and completed states.",operationId:"session.status",responses:{200:{description:"Get session status",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),Ut.Info))}}},...Te(400)}}),async t=>{let e=Ut.list();return t.json(e)}).get("/:sessionID",describeRoute({summary:"Get session",description:"Retrieve detailed information about a specific EasBot session.",tags:["Session"],operationId:"session.get",responses:{200:{description:"Get session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:ee.get.schema})),async t=>{let e=t.req.valid("param").sessionID;wi.info("SEARCH",{url:t.req.url});let n=await ee.get(e);return t.json(n)}).get("/:sessionID/children",describeRoute({summary:"Get session children",tags:["Session"],description:"Retrieve all child sessions that were forked from the specified parent session.",operationId:"session.children",responses:{200:{description:"List of children",content:{"application/json":{schema:resolver(ee.Info.array())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:ee.children.schema})),async t=>{let e=t.req.valid("param").sessionID,n=await ee.children(e);return t.json(n)}).get("/:sessionID/todo",describeRoute({summary:"Get session todos",description:"Retrieve the todo list associated with a specific session, showing tasks and action items.",operationId:"session.todo",responses:{200:{description:"Todo list",content:{"application/json":{schema:resolver(no.Info.array())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),async t=>{let e=t.req.valid("param").sessionID,n=await no.get(e);return t.json(n)}).post("/",describeRoute({summary:"Create session",description:"Create a new EasBot session for interacting with AI assistants and managing conversations.",operationId:"session.create",responses:{...Te(400),200:{description:"Successfully created session",content:{"application/json":{schema:resolver(ee.Info)}}}}}),validator("json",ee.create.schema.optional()),async t=>{let e=t.req.valid("json")??{},n=await ee.create(e);return t.json(n)}).delete("/:sessionID",describeRoute({summary:"Delete session",description:"Delete a session and permanently remove all associated data, including messages and history.",operationId:"session.delete",responses:{200:{description:"Successfully deleted session",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:ee.remove.schema})),async t=>{let e=t.req.valid("param").sessionID;return await ee.remove(e),t.json(true)}).patch("/:sessionID",describeRoute({summary:"Update session",description:"Update properties of an existing session, such as title or other metadata.",operationId:"session.update",responses:{200:{description:"Successfully updated session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string()})),validator("json",z$1.object({title:z$1.string().optional(),time:z$1.object({archived:z$1.number().optional()}).optional()})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json"),o=await ee.update(e,s=>{n.title!==void 0&&(s.title=n.title),n.time?.archived!==void 0&&(s.time.archived=n.time.archived);},{touch:false});return t.json(o)}).post("/:sessionID/init",describeRoute({summary:"Initialize session",description:"Analyze the current application and create an AGENTS.md file with project-specific agent configurations.",operationId:"session.init",responses:{200:{description:"200",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",ee.initialize.schema.omit({sessionID:true})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json");return await ee.initialize({...n,sessionID:e}),t.json(true)}).post("/:sessionID/fork",describeRoute({summary:"Fork session",description:"Create a new session by forking an existing session at a specific message point.",operationId:"session.fork",responses:{200:{description:"200",content:{"application/json":{schema:resolver(ee.Info)}}}}}),validator("param",z$1.object({sessionID:ee.fork.schema.shape.sessionID})),validator("json",ee.fork.schema.omit({sessionID:true})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json"),o=await ee.fork({...n,sessionID:e});return t.json(o)}).post("/:sessionID/abort",describeRoute({summary:"Abort session",description:"Abort an active session and stop any ongoing AI processing or command execution.",operationId:"session.abort",responses:{200:{description:"Aborted session",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string()})),async t=>(await qe.cancel(t.req.valid("param").sessionID),t.json(true))).post("/:sessionID/share",describeRoute({summary:"Share session",description:"Create a shareable link for a session, allowing others to view the conversation.",operationId:"session.share",responses:{200:{description:"Successfully shared session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string()})),async t=>{let e=t.req.valid("param").sessionID;await ee.share(e);let n=await ee.get(e);return t.json(n)}).get("/:sessionID/diff",describeRoute({summary:"Get message diff",description:"Get the file changes (diff) that resulted from a specific user message in the session.",operationId:"session.diff",responses:{200:{description:"Successfully retrieved diff",content:{"application/json":{schema:resolver(xt.FileDiff.array())}}}}}),validator("param",z$1.object({sessionID:Rs.diff.schema.shape.sessionID})),validator("query",z$1.object({messageID:Rs.diff.schema.shape.messageID})),async t=>{let e=t.req.valid("query"),n=t.req.valid("param"),o=await Rs.diff({sessionID:n.sessionID,messageID:e.messageID});return t.json(o)}).delete("/:sessionID/share",describeRoute({summary:"Unshare session",description:"Remove the shareable link for a session, making it private again.",operationId:"session.unshare",responses:{200:{description:"Successfully unshared session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:ee.unshare.schema})),async t=>{let e=t.req.valid("param").sessionID;await ee.unshare(e);let n=await ee.get(e);return t.json(n)}).post("/:sessionID/summarize",describeRoute({summary:"Summarize session",description:"Generate a concise summary of the session using AI compaction to preserve key information.",operationId:"session.summarize",responses:{200:{description:"Summarized session",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",z$1.object({providerID:z$1.string(),modelID:z$1.string(),auto:z$1.boolean().optional().default(false)})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json"),o=await ee.get(e);return await Ro.cleanup(o),await mn.create({sessionID:e,agent:"compaction",model:{providerID:n.providerID,modelID:n.modelID},auto:n.auto}),await qe.loop({sessionID:e}),t.json(true)}).get("/:sessionID/contextMode",describeRoute({summary:"Get session context mode",description:"Get the context mode of a session (general or coder).",tags:["Session"],operationId:"session.contextMode.get",responses:{200:{description:"Context mode",content:{"application/json":{schema:resolver(z$1.enum(["general","coder"]))}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),async t=>{let e=t.req.valid("param").sessionID,n=await ee.getContextMode(e);return t.json(n)}).put("/:sessionID/contextMode",describeRoute({summary:"Set session context mode",description:"Set the context mode of a session (general or coder).",tags:["Session"],operationId:"session.contextMode.set",responses:{200:{description:"Successfully updated context mode",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",z$1.object({mode:z$1.enum(["general","coder"]).meta({description:"Context mode to set"})})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json");return await ee.setContextMode(e,n.mode),t.json(true)}).get("/:sessionID/message",describeRoute({summary:"Get session messages",description:"Retrieve all messages in a session, including user prompts and AI responses.",operationId:"session.messages",responses:{200:{description:"List of messages",content:{"application/json":{schema:resolver(ve.WithParts.array())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("query",z$1.object({limit:z$1.coerce.number().optional()})),async t=>{let e=t.req.valid("query"),n=await ee.messages({sessionID:t.req.valid("param").sessionID,limit:e.limit});return t.json(n)}).get("/:sessionID/message/:messageID",describeRoute({summary:"Get message",description:"Retrieve a specific message from a session by its message ID.",operationId:"session.message",responses:{200:{description:"Message",content:{"application/json":{schema:resolver(z$1.object({info:ve.Info,parts:ve.Part.array()}))}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"}),messageID:z$1.string().meta({description:"Message ID"})})),async t=>{let e=t.req.valid("param"),n=await ve.get({sessionID:e.sessionID,messageID:e.messageID});return t.json(n)}).delete("/:sessionID/message/:messageID/part/:partID",describeRoute({description:"Delete a part from a message",operationId:"part.delete",responses:{200:{description:"Successfully deleted part",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"}),messageID:z$1.string().meta({description:"Message ID"}),partID:z$1.string().meta({description:"Part ID"})})),async t=>{let e=t.req.valid("param");return await ee.removePart({sessionID:e.sessionID,messageID:e.messageID,partID:e.partID}),t.json(true)}).patch("/:sessionID/message/:messageID/part/:partID",describeRoute({description:"Update a part in a message",operationId:"part.update",responses:{200:{description:"Successfully updated part",content:{"application/json":{schema:resolver(ve.Part)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"}),messageID:z$1.string().meta({description:"Message ID"}),partID:z$1.string().meta({description:"Part ID"})})),validator("json",ve.Part),async t=>{let e=t.req.valid("param"),n=t.req.valid("json");if(n.id!==e.partID||n.messageID!==e.messageID||n.sessionID!==e.sessionID)throw new Error(`Part mismatch: body.id='${n.id}' vs partID='${e.partID}', body.messageID='${n.messageID}' vs messageID='${e.messageID}', body.sessionID='${n.sessionID}' vs sessionID='${e.sessionID}'`);let o=await ee.updatePart(n);return t.json(o)}).post("/:sessionID/message",describeRoute({summary:"Send message",description:"Create and send a new message to a session, streaming the AI response.",operationId:"session.prompt",responses:{200:{description:"Created message",content:{"application/json":{schema:resolver(z$1.object({info:ve.Assistant,parts:ve.Part.array()}))}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",qe.PromptInput.omit({sessionID:true})),async t=>(t.status(200),t.header("Content-Type","application/json"),stream(t,async e=>{let n=t.req.valid("param").sessionID,o=t.req.valid("json"),s=await qe.prompt({...o,sessionID:n});e.write(JSON.stringify(s));}))).post("/:sessionID/prompt_async",describeRoute({summary:"Send async message",description:"Create and send a new message to a session asynchronously, starting the session if needed and returning immediately.",operationId:"session.prompt_async",responses:{204:{description:"Prompt accepted"},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",qe.PromptInput.omit({sessionID:true})),async t=>(t.status(204),t.header("Content-Type","application/json"),stream(t,async()=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json");qe.prompt({...n,sessionID:e});}))).post("/:sessionID/command",describeRoute({summary:"Send command",description:"Send a new command to a session for execution by the AI assistant.",operationId:"session.command",responses:{200:{description:"Created message",content:{"application/json":{schema:resolver(z$1.object({info:ve.Assistant.optional(),parts:ve.Part.array().optional(),title:z$1.string(),metadata:z$1.record(z$1.string(),z$1.unknown()),output:z$1.string(),success:z$1.boolean(),error:z$1.string().optional()}))}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",qe.CommandInput.omit({sessionID:true})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json"),o=await qe.command({...n,sessionID:e});return t.json(o)}).post("/:sessionID/shell",describeRoute({summary:"Run shell command",description:"Execute a shell command within the session context and return the AI's response.",operationId:"session.shell",responses:{200:{description:"Created message",content:{"application/json":{schema:resolver(ve.Assistant)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string().meta({description:"Session ID"})})),validator("json",qe.ShellInput.omit({sessionID:true})),async t=>{let e=t.req.valid("param").sessionID,n=t.req.valid("json"),o=await qe.shell({...n,sessionID:e});return t.json(o)}).post("/:sessionID/revert",describeRoute({summary:"Revert message",description:"Revert a specific message in a session, undoing its effects and restoring the previous state.",operationId:"session.revert",responses:{200:{description:"Updated session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string()})),validator("json",Ro.RevertInput.omit({sessionID:true})),async t=>{let e=t.req.valid("param").sessionID;wi.info("revert",t.req.valid("json"));let n=await Ro.revert({sessionID:e,...t.req.valid("json")});return t.json(n)}).post("/:sessionID/unrevert",describeRoute({summary:"Restore reverted messages",description:"Restore all previously reverted messages in a session.",operationId:"session.unrevert",responses:{200:{description:"Updated session",content:{"application/json":{schema:resolver(ee.Info)}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string()})),async t=>{let e=t.req.valid("param").sessionID,n=await Ro.unrevert({sessionID:e});return t.json(n)}).post("/:sessionID/permissions/:permissionID",describeRoute({summary:"Respond to permission",deprecated:true,description:"Approve or deny a permission request from the AI assistant.",operationId:"permission.respond",responses:{200:{description:"Permission processed successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({sessionID:z$1.string(),permissionID:z$1.string()})),validator("json",z$1.object({response:Me.Reply})),async t=>{let e=t.req.valid("param");return Me.reply({requestID:e.permissionID,reply:t.req.valid("json").response}),t.json(true)}).get("/:sessionID/event",describeRoute({summary:"Get session events",description:"Subscribe to events for a specific session using server-sent events.",operationId:"session.event",responses:{200:{description:"Event stream",content:{"text/event-stream":{schema:resolver(z$1.object({sessionID:z$1.string(),directory:z$1.string(),payload:a$5.payloads()}))}}}}}),validator("param",z$1.object({sessionID:z$1.string()})),async t=>{let{sessionID:e}=t.req.valid("param");return wi.info("session event connected",{sessionID:e}),streamSSE(t,async n=>{await n.writeSSE({data:JSON.stringify({sessionID:e,payload:{type:"session.connected",properties:{}}})});async function o(r){(r.properties?.sessionID??r.properties?.sessionId)===e&&await n.writeSSE({data:JSON.stringify({sessionID:e,payload:r})});}yt.on("event",o);let s=setInterval(()=>{n.writeSSE({data:JSON.stringify({sessionID:e,payload:{type:"server.heartbeat",properties:{}}})});},3e4);await new Promise(r=>{n.onAbort(()=>{clearInterval(s),yt.off("event",o),wi.info("session event disconnected",{sessionID:e}),r();});});})}).get("/:sessionID/message/:messageID/event",describeRoute({summary:"Get message events",description:"Subscribe to events for a specific message using server-sent events.",operationId:"message.event",responses:{200:{description:"Event stream",content:{"text/event-stream":{schema:resolver(z$1.object({sessionID:z$1.string(),messageID:z$1.string(),directory:z$1.string(),payload:a$5.payloads()}))}}}}}),validator("param",z$1.object({sessionID:z$1.string(),messageID:z$1.string()})),async t=>{let{sessionID:e,messageID:n}=t.req.valid("param");return wi.info("message event connected",{sessionID:e,messageID:n}),streamSSE(t,async o=>{await o.writeSSE({data:JSON.stringify({sessionID:e,messageID:n,payload:{type:"message.connected",properties:{}}})});async function s(i){let c=i.properties?.sessionID??i.properties?.sessionId,u=i.properties?.messageID??i.properties?.messageId;c===e&&u===n&&await o.writeSSE({data:JSON.stringify({sessionID:e,messageID:n,payload:i})});}yt.on("event",s);let r=setInterval(()=>{o.writeSSE({data:JSON.stringify({sessionID:e,messageID:n,payload:{type:"server.heartbeat",properties:{}}})});},3e4);await new Promise(i=>{o.onAbort(()=>{clearInterval(r),yt.off("event",s),wi.info("message event disconnected",{sessionID:e,messageID:n}),i();});});})}));var zy=lazy(()=>new Hono().get("/",describeRoute({summary:"List PTY sessions",description:"Get a list of all active pseudo-terminal (PTY) sessions managed by EasBot.",operationId:"pty.list",responses:{200:{description:"List of sessions",content:{"application/json":{schema:resolver(rt.Info.array())}}}}}),async t=>t.json(rt.list())).post("/",describeRoute({summary:"Create PTY session",description:"Create a new pseudo-terminal (PTY) session for running shell commands and processes.",operationId:"pty.create",responses:{200:{description:"Created session",content:{"application/json":{schema:resolver(rt.Info)}}},...Te(400)}}),validator("json",rt.CreateInput),async t=>{let e=await rt.create(t.req.valid("json"));return t.json(e)}).get("/:ptyID",describeRoute({summary:"Get PTY session",description:"Retrieve detailed information about a specific pseudo-terminal (PTY) session.",operationId:"pty.get",responses:{200:{description:"Session info",content:{"application/json":{schema:resolver(rt.Info)}}},...Te(404)}}),validator("param",z$1.object({ptyID:z$1.string()})),async t=>{let e=rt.get(t.req.valid("param").ptyID);if(!e)throw new a$6.NotFoundError({message:"Session not found"});return t.json(e)}).put("/:ptyID",describeRoute({summary:"Update PTY session",description:"Update properties of an existing pseudo-terminal (PTY) session.",operationId:"pty.update",responses:{200:{description:"Updated session",content:{"application/json":{schema:resolver(rt.Info)}}},...Te(400)}}),validator("param",z$1.object({ptyID:z$1.string()})),validator("json",rt.UpdateInput),async t=>{let e=await rt.update(t.req.valid("param").ptyID,t.req.valid("json"));return t.json(e)}).delete("/:ptyID",describeRoute({summary:"Remove PTY session",description:"Remove and terminate a specific pseudo-terminal (PTY) session.",operationId:"pty.remove",responses:{200:{description:"Session removed",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(404)}}),validator("param",z$1.object({ptyID:z$1.string()})),async t=>(await rt.remove(t.req.valid("param").ptyID),t.json(true))).get("/:ptyID/connect",describeRoute({summary:"Connect to PTY session",description:"Establish a WebSocket connection to interact with a pseudo-terminal (PTY) session in real-time.",operationId:"pty.connect",responses:{200:{description:"Connected session",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(404)}}),validator("param",z$1.object({ptyID:z$1.string()})),async t=>t.json({error:"WebSocket not implemented in Node.js mode yet"},501)));var By=lazy(()=>new Hono().get("/",describeRoute({summary:"Get MCP status",description:"Get the status of all Model Context Protocol (MCP) servers.",operationId:"mcp.status",responses:{200:{description:"MCP server status",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),Status))}}}}}),async t=>t.json(await ze.status())).post("/",describeRoute({summary:"Add MCP server",description:"Dynamically add a new Model Context Protocol (MCP) server to the system.",operationId:"mcp.add",responses:{200:{description:"MCP server added successfully",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),Status))}}},...Te(400)}}),validator("json",z$1.object({name:z$1.string(),config:he.Mcp})),async t=>{let{name:e,config:n}=t.req.valid("json"),o=await ze.add(e,n);return t.json(o.status)}).post("/:name/auth",describeRoute({summary:"Start MCP OAuth",description:"Start OAuth authentication flow for a Model Context Protocol (MCP) server.",operationId:"mcp.auth.start",responses:{200:{description:"OAuth flow started",content:{"application/json":{schema:resolver(z$1.object({authorizationUrl:z$1.string().describe("URL to open in browser for authorization")}))}}},...Te(400,404)}}),async t=>{let e=t.req.param("name");if(!await ze.supportsOAuth(e))return t.json({error:`MCP server ${e} does not support OAuth`},400);let o=await ze.startAuth(e);return t.json(o)}).post("/:name/auth/callback",describeRoute({summary:"Complete MCP OAuth",description:"Complete OAuth authentication for a Model Context Protocol (MCP) server using the authorization code.",operationId:"mcp.auth.callback",responses:{200:{description:"OAuth authentication completed",content:{"application/json":{schema:resolver(Status)}}},...Te(400,404)}}),validator("json",z$1.object({code:z$1.string().describe("Authorization code from OAuth callback")})),async t=>{let e=t.req.param("name"),{code:n}=t.req.valid("json"),o=await ze.finishAuth(e,n);return t.json(o)}).post("/:name/auth/authenticate",describeRoute({summary:"Authenticate MCP OAuth",description:"Start OAuth flow and wait for callback (opens browser)",operationId:"mcp.auth.authenticate",responses:{200:{description:"OAuth authentication completed",content:{"application/json":{schema:resolver(Status)}}},...Te(400,404)}}),async t=>{let e=t.req.param("name");if(!await ze.supportsOAuth(e))return t.json({error:`MCP server ${e} does not support OAuth`},400);let o=await ze.authenticate(e);return t.json(o)}).delete("/:name/auth",describeRoute({summary:"Remove MCP OAuth",description:"Remove OAuth credentials for an MCP server",operationId:"mcp.auth.remove",responses:{200:{description:"OAuth credentials removed",content:{"application/json":{schema:resolver(z$1.object({success:z$1.literal(true)}))}}},...Te(404)}}),async t=>{let e=t.req.param("name");return await ze.removeAuth(e),t.json({success:true})}).post("/:name/connect",describeRoute({description:"Connect an MCP server",operationId:"mcp.connect",responses:{200:{description:"MCP server connected successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),validator("param",z$1.object({name:z$1.string()})),async t=>{let{name:e}=t.req.valid("param");return await ze.connect(e),t.json(true)}).post("/:name/disconnect",describeRoute({description:"Disconnect an MCP server",operationId:"mcp.disconnect",responses:{200:{description:"MCP server disconnected successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),validator("param",z$1.object({name:z$1.string()})),async t=>{let{name:e}=t.req.valid("param");return await ze.disconnect(e),t.json(true)}).get("/tools",describeRoute({summary:"Get MCP tools",description:"Get the list of tools from all connected MCP servers.",operationId:"mcp.tools",responses:{200:{description:"MCP tools by server",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),z$1.array(z$1.string())))}}}}}),async t=>{let e=await ze.tools(),n={};for(let o of Object.keys(e)){let s=o.split("_"),r=s[0];if(!r)continue;let i=s.slice(1).join("_");n[r]||(n[r]=[]),n[r].push(i);}return t.json(n)}));var Hy=lazy(()=>new Hono().get("/find",describeRoute({summary:"Find text",description:"Search for text patterns across files in the project using ripgrep.",operationId:"find.text",responses:{200:{description:"Matches",content:{"application/json":{schema:resolver(a$9.Match.shape.data.array())}}}}}),validator("query",z$1.object({pattern:z$1.string()})),async t=>{let e=t.req.valid("query").pattern,n=await a$9.search({cwd:A.directory,pattern:e,limit:10});return t.json(n)}).get("/find/file",describeRoute({summary:"Find files",description:"Search for files or directories by name or pattern in the project directory.",operationId:"find.files",responses:{200:{description:"File paths",content:{"application/json":{schema:resolver(z$1.string().array())}}}}}),validator("query",z$1.object({query:z$1.string(),dirs:z$1.enum(["true","false"]).optional(),type:z$1.enum(["file","directory"]).optional(),limit:z$1.coerce.number().int().min(1).max(200).optional()})),async t=>{let e=t.req.valid("query").query,n=t.req.valid("query").dirs,o=t.req.valid("query").type,s=t.req.valid("query").limit,r=await It.search({query:e,limit:s??10,dirs:n!=="false",type:o});return t.json(r)}).get("/find/symbol",describeRoute({summary:"Find symbols",description:"Search for workspace symbols like functions, classes, and variables using LSP.",operationId:"find.symbols",responses:{200:{description:"Symbols",content:{"application/json":{schema:resolver(Ve.LspSymbol.array())}}}}}),validator("query",z$1.object({query:z$1.string()})),async t=>t.json([])).get("/file",describeRoute({summary:"List files",description:"List files and directories in a specified path.",operationId:"file.list",responses:{200:{description:"Files and directories",content:{"application/json":{schema:resolver(It.Node.array())}}}}}),validator("query",z$1.object({path:z$1.string()})),async t=>{let e=t.req.valid("query").path,n=await It.list(e);return t.json(n)}).get("/file/content",describeRoute({summary:"Read file",description:"Read the content of a specified file.",operationId:"file.read",responses:{200:{description:"File content",content:{"application/json":{schema:resolver(It.Content)}}}}}),validator("query",z$1.object({path:z$1.string()})),async t=>{let e=t.req.valid("query").path,n=await It.read(e);return t.json(n)}).get("/file/status",describeRoute({summary:"Get file status",description:"Get the git status of all files in the project.",operationId:"file.status",responses:{200:{description:"File status",content:{"application/json":{schema:resolver(It.Info.array())}}}}}),async t=>{let e=await It.status();return t.json(e)}));var KA=a.create({service:"server"}),Gy=lazy(()=>new Hono().get("/",describeRoute({summary:"Get configuration",description:"Retrieve the current EasBot configuration settings and preferences.",operationId:"config.get",responses:{200:{description:"Get config info",content:{"application/json":{schema:resolver(he.Info)}}}}}),async t=>t.json(await he.get())).patch("/",describeRoute({summary:"Update configuration",description:"Update EasBot configuration settings and preferences.",operationId:"config.update",responses:{200:{description:"Successfully updated config",content:{"application/json":{schema:resolver(he.Info)}}},...Te(400)}}),validator("json",he.Info),async t=>{let e=t.req.valid("json");return await he.update(e),t.json(e)}).get("/providers",describeRoute({summary:"List config providers",description:"Get a list of all configured AI providers and their default models.",operationId:"config.providers",responses:{200:{description:"List of providers",content:{"application/json":{schema:resolver(z$1.object({providers:Ce.Info.array(),default:z$1.record(z$1.string(),z$1.string())}))}}}}}),async t=>{var o=[];try{let e=c(o,KA.time("providers"));let n=await Ce.list().then(c=>mapValues(c,u=>u));return t.json({providers:Object.values(n),default:mapValues(n,c=>Ce.sort(Object.values(c.models))[0]?.id??"")})}catch(s){var r=s,i=true;}finally{d(o,r,i);}}));var Uo;(D=>{let t=a.create({service:"worktree"});D.Event={Ready:a$5.define("worktree.ready",z$1.object({name:z$1.string(),branch:z$1.string()})),Failed:a$5.define("worktree.failed",z$1.object({message:z$1.string()}))},D.Info=z$1.object({name:z$1.string(),branch:z$1.string(),directory:z$1.string()}).meta({ref:"Worktree"}),D.CreateInput=z$1.object({name:z$1.string().optional(),startCommand:z$1.string().optional().describe("Additional startup script to run after the project's start command")}).meta({ref:"WorktreeCreateInput"}),D.RemoveInput=z$1.object({directory:z$1.string()}).meta({ref:"WorktreeRemoveInput"}),D.ResetInput=z$1.object({directory:z$1.string()}).meta({ref:"WorktreeResetInput"}),D.NotGitError=NamedError.create("WorktreeNotGitError",z$1.object({message:z$1.string()})),D.NameGenerationFailedError=NamedError.create("WorktreeNameGenerationFailedError",z$1.object({message:z$1.string()})),D.CreateFailedError=NamedError.create("WorktreeCreateFailedError",z$1.object({message:z$1.string()})),D.StartCommandFailedError=NamedError.create("WorktreeStartCommandFailedError",z$1.object({message:z$1.string()})),D.RemoveFailedError=NamedError.create("WorktreeRemoveFailedError",z$1.object({message:z$1.string()})),D.ResetFailedError=NamedError.create("WorktreeResetFailedError",z$1.object({message:z$1.string()}));let a$2=["brave","calm","clever","cosmic","crisp","curious","eager","gentle","glowing","happy","hidden","jolly","kind","lucky","mighty","misty","neon","nimble","playful","proud","quick","quiet","shiny","silent","stellar","sunny","swift","tidy","witty"],p=["cabin","cactus","canyon","circuit","comet","eagle","engine","falcon","forest","garden","harbor","island","knight","lagoon","meadow","moon","mountain","nebula","orchid","otter","panda","pixel","planet","river","rocket","sailor","squid","star","tiger","wizard","wolf"];function d(O){return O[Math.floor(Math.random()*O.length)]}function h(O){return O.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+/,"").replace(/-+$/,"")}function w(){return `${d(a$2)}-${d(p)}`}async function g(O){return Ot__default.stat(O).then(()=>true).catch(()=>false)}function b(O){return O?.length===0?"":new TextDecoder().decode(O).trim()}function v(O){return [b(O.stderr),b(O.stdout)].filter(Boolean).join(`
942
+ `)}function k(O){return [b(O.stderr),b(O.stdout)].filter(Boolean).flatMap(C=>C.split(`
943
+ `).map(E=>E.trim()).flatMap(E=>{let R=E.match(/^warning:\s+failed to remove\s+(.+):\s+/i);if(!R)return [];let L=R[1]?.trim().replace(/^['"]|['"]$/g,"");return L?[L]:[]}))}async function S(O,C){let E=await x(O);await Promise.all(C.map(async R=>{let L=await x(ke__default.resolve(O,R));L!==E&&L.startsWith(`${E}${ke__default.sep}`)&&await Ot__default.rm(L,{recursive:true,force:true}).catch(()=>{});}));}async function y(O){let C=await $`git clean -ffdx`.quiet().nothrow().cwd(O);if(C.exitCode===0)return C;let E=k(C);return E.length===0?C:(await S(O,E),$`git clean -ffdx`.quiet().nothrow().cwd(O))}async function x(O){let C=ke__default.resolve(O),E=await Ot__default.realpath(C).catch(()=>C),R=ke__default.normalize(E);return process.platform==="win32"?R.toLowerCase():R}async function I(O,C){for(let E of Array.from({length:26},(R,L)=>L)){let R=C?E===0?C:`${C}-${w()}`:w(),L=`easbot/${R}`,q=ke__default.join(O,R);if(await g(q))continue;let Q=`refs/heads/${L}`;if((await $`git show-ref --verify --quiet ${Q}`.quiet().nothrow().cwd(A.worktree)).exitCode!==0)return D.Info.parse({name:R,branch:L,directory:q})}throw new D.NameGenerationFailedError({message:"Failed to generate a unique worktree name"})}async function P(O,C){return process.platform==="win32"?$`cmd /c ${C}`.nothrow().cwd(O):$`bash -lc ${C}`.nothrow().cwd(O)}async function T(O,C,E){let R=C.trim();if(!R)return true;let L=await P(O,R);return L.exitCode===0?true:(t.error("worktree start command failed",{kind:E,directory:O,message:v(L)}),false)}async function M(O,C){let R=(await a$6.read(["project",C.projectID]).catch(()=>{}))?.commands?.start?.trim()??"";if(!await T(O,R,"project"))return false;let q=C.extra??"";return await T(O,q,"worktree"),true}function j(O,C){setTimeout(()=>{(async()=>{await M(O,C);})().catch(R=>{t.error("worktree start task failed",{directory:O,error:R});});},0);}async function N(O){if(A.project.vcs!=="git")throw new D.NotGitError({message:"Worktrees are only supported for git projects"});let C=ke__default.join(a$1.Path.data,"worktree",A.project.id);await Ot__default.mkdir(C,{recursive:true});let E=O?h(O):"";return I(C,E||void 0)}D.makeWorktreeInfo=N;async function K(O){if(A.project.vcs!=="git")throw new D.NotGitError({message:"Worktrees are only supported for git projects"});let C=await $`git worktree add --no-checkout -b ${O.branch} ${O.directory}`.quiet().nothrow().cwd(A.worktree);if(C.exitCode!==0)throw new D.CreateFailedError({message:v(C)||"Failed to create git worktree"});await Kt.addSandbox(A.project.id,O.directory).catch(()=>{});let E=A.project.id;setTimeout(()=>{(async()=>{let L=await $`git reset --hard`.quiet().nothrow().cwd(O.directory);if(L.exitCode!==0){let Q=v(L)||"Failed to populate worktree";t.error("worktree checkout failed",{directory:O.directory,message:Q}),yt.emit("event",{directory:O.directory,payload:{type:D.Event.Failed.type,properties:{message:Q}}});return}await A.provide({directory:O.directory,init:Ks,fn:()=>{}}).then(()=>true).catch(Q=>{let Z=Q instanceof Error?Q.message:String(Q);return t.error("worktree bootstrap failed",{directory:O.directory,message:Z}),yt.emit("event",{directory:O.directory,payload:{type:D.Event.Failed.type,properties:{message:Z}}}),false})&&(yt.emit("event",{directory:O.directory,payload:{type:D.Event.Ready.type,properties:{name:O.name,branch:O.branch}}}),await M(O.directory,{projectID:E}));})().catch(L=>{t.error("worktree start task failed",{directory:O.directory,error:L});});},0);}D.createFromInfo=K,D.create=fn$1(D.CreateInput.optional(),async O=>{if(A.project.vcs!=="git")throw new D.NotGitError({message:"Worktrees are only supported for git projects"});let C=ke__default.join(a$1.Path.data,"worktree",A.project.id);await Ot__default.mkdir(C,{recursive:true});let E=O?.name?h(O.name):"",R=await I(C,E||void 0),L=await $`git worktree add --no-checkout -b ${R.branch} ${R.directory}`.quiet().nothrow().cwd(A.worktree);if(L.exitCode!==0)throw new D.CreateFailedError({message:v(L)||"Failed to create git worktree"});await Kt.addSandbox(A.project.id,R.directory).catch(()=>{});let q=A.project.id,Q=O?.startCommand?.trim();return setTimeout(()=>{(async()=>{let se=await $`git reset --hard`.quiet().nothrow().cwd(R.directory);if(se.exitCode!==0){let de=v(se)||"Failed to populate worktree";t.error("worktree checkout failed",{directory:R.directory,message:de}),yt.emit("event",{directory:R.directory,payload:{type:D.Event.Failed.type,properties:{message:de}}});return}await A.provide({directory:R.directory,init:Ks,fn:()=>{}}).then(()=>true).catch(de=>{let be=de instanceof Error?de.message:String(de);return t.error("worktree bootstrap failed",{directory:R.directory,message:be}),yt.emit("event",{directory:R.directory,payload:{type:D.Event.Failed.type,properties:{message:be}}}),false})&&(yt.emit("event",{directory:R.directory,payload:{type:D.Event.Ready.type,properties:{name:R.name,branch:R.branch}}}),await M(R.directory,{projectID:q,extra:Q}));})().catch(se=>{t.error("worktree start task failed",{directory:R.directory,error:se});});},0),R}),D.remove=fn$1(D.RemoveInput,async O=>{if(A.project.vcs!=="git")throw new D.NotGitError({message:"Worktrees are only supported for git projects"});let C=await x(O.directory),E=await $`git worktree list --porcelain`.quiet().nothrow().cwd(A.worktree);if(E.exitCode!==0)throw new D.RemoveFailedError({message:v(E)||"Failed to read git worktrees"});let L=b(E.stdout).split(`
944
+ `).map(se=>se.trim()).reduce((se,le)=>{if(!le)return se;if(le.startsWith("worktree "))return se.push({path:le.slice(9).trim()}),se;let de=se[se.length-1];return de&&le.startsWith("branch ")&&(de.branch=le.slice(7).trim()),se},[]),q=await(async()=>{for(let se of L){if(!se.path)continue;if(await x(se.path)===C)return se}})();if(!q?.path)return await g(C)&&await Ot__default.rm(C,{recursive:true,force:true}),true;let Q=await $`git worktree remove --force ${q.path}`.quiet().nothrow().cwd(A.worktree);if(Q.exitCode!==0)throw new D.RemoveFailedError({message:v(Q)||"Failed to remove git worktree"});let Z=q.branch?.replace(/^refs\/heads\//,"");if(Z){let se=await $`git branch -D ${Z}`.quiet().nothrow().cwd(A.worktree);if(se.exitCode!==0)throw new D.RemoveFailedError({message:v(se)||"Failed to delete worktree branch"})}return true}),D.reset=fn$1(D.ResetInput,async O=>{if(A.project.vcs!=="git")throw new D.NotGitError({message:"Worktrees are only supported for git projects"});let C=await x(O.directory),E=await x(A.worktree);if(C===E)throw new D.ResetFailedError({message:"Cannot reset the primary workspace"});let R=await $`git worktree list --porcelain`.quiet().nothrow().cwd(A.worktree);if(R.exitCode!==0)throw new D.ResetFailedError({message:v(R)||"Failed to read git worktrees"});let q=b(R.stdout).split(`
945
+ `).map(ie=>ie.trim()).reduce((ie,De)=>{if(!De)return ie;if(De.startsWith("worktree "))return ie.push({path:De.slice(9).trim()}),ie;let Ae=ie[ie.length-1];return Ae&&De.startsWith("branch ")&&(Ae.branch=De.slice(7).trim()),ie},[]),Q=await(async()=>{for(let ie of q){if(!ie.path)continue;if(await x(ie.path)===C)return ie}})();if(!Q?.path)throw new D.ResetFailedError({message:"Worktree not found"});let Z=await $`git remote`.quiet().nothrow().cwd(A.worktree);if(Z.exitCode!==0)throw new D.ResetFailedError({message:v(Z)||"Failed to list git remotes"});let se=b(Z.stdout).split(`
946
+ `).map(ie=>ie.trim()).filter(Boolean),le=se.includes("origin")?"origin":se.length===1?se[0]:se.includes("upstream")?"upstream":"",de=le?await $`git symbolic-ref refs/remotes/${le}/HEAD`.quiet().nothrow().cwd(A.worktree):{exitCode:1,stdout:void 0},be=de.exitCode===0?b(de.stdout):"",re=be?be.replace(/^refs\/remotes\//,""):"",X=le&&re.startsWith(`${le}/`)?re.slice(`${le}/`.length):"",H=await $`git show-ref --verify --quiet refs/heads/main`.quiet().nothrow().cwd(A.worktree),F=await $`git show-ref --verify --quiet refs/heads/master`.quiet().nothrow().cwd(A.worktree),ne=H.exitCode===0?"main":F.exitCode===0?"master":"",V=X?`${le}/${X}`:ne;if(!V)throw new D.ResetFailedError({message:"Default branch not found"});if(X){let ie=await $`git fetch ${le} ${X}`.quiet().nothrow().cwd(A.worktree);if(ie.exitCode!==0)throw new D.ResetFailedError({message:v(ie)||`Failed to fetch ${V}`})}if(!Q.path)throw new D.ResetFailedError({message:"Worktree path not found"});let J=Q.path,oe=await $`git reset --hard ${V}`.quiet().nothrow().cwd(J);if(oe.exitCode!==0)throw new D.ResetFailedError({message:v(oe)||"Failed to reset worktree to target"});let ae=await y(J);if(ae.exitCode!==0)throw new D.ResetFailedError({message:v(ae)||"Failed to clean worktree"});let me=await $`git submodule update --init --recursive --force`.quiet().nothrow().cwd(J);if(me.exitCode!==0)throw new D.ResetFailedError({message:v(me)||"Failed to update submodules"});let pe=await $`git submodule foreach --recursive git reset --hard`.quiet().nothrow().cwd(J);if(pe.exitCode!==0)throw new D.ResetFailedError({message:v(pe)||"Failed to reset submodules"});let xe=await $`git submodule foreach --recursive git clean -fdx`.quiet().nothrow().cwd(J);if(xe.exitCode!==0)throw new D.ResetFailedError({message:v(xe)||"Failed to clean submodules"});let He=await $`git status --porcelain=v1`.quiet().nothrow().cwd(J);if(He.exitCode!==0)throw new D.ResetFailedError({message:v(He)||"Failed to read git status"});let Ie=b(He.stdout);if(Ie)throw new D.ResetFailedError({message:`Worktree reset left local changes:
947
+ ${Ie}`});let we=A.project.id;return j(J,{projectID:we}),true});})(Uo||(Uo={}));var Wy=lazy(()=>new Hono().get("/tool/ids",describeRoute({summary:"List tool IDs",description:"Get a list of all available tool IDs, including both built-in tools and dynamically registered tools.",operationId:"tool.ids",responses:{200:{description:"Tool IDs",content:{"application/json":{schema:resolver(z$1.array(z$1.string()).meta({ref:"ToolIDs"}))}}},...Te(400)}}),async t=>t.json(await ro.ids())).get("/tool",describeRoute({summary:"List tools",description:"Get a list of available tools with their JSON schema parameters for a specific provider and model combination.",operationId:"tool.list",responses:{200:{description:"Tools",content:{"application/json":{schema:resolver(z$1.array(z$1.object({id:z$1.string(),description:z$1.string(),parameters:z$1.any()}).meta({ref:"ToolListItem"})).meta({ref:"ToolList"}))}}},...Te(400)}}),validator("query",z$1.object({provider:z$1.string(),model:z$1.string()})),async t=>{let{provider:e,model:n}=t.req.valid("query"),o=await ro.tools({providerID:e,modelID:n});return t.json(o.map(s=>({id:s.id,description:s.description,parameters:s.parameters?._def?zodToJsonSchema(s.parameters):s.parameters})))}).post("/worktree",describeRoute({summary:"Create worktree",description:"Create a new git worktree for the current project and run any configured startup scripts.",operationId:"worktree.create",responses:{200:{description:"Worktree created",content:{"application/json":{schema:resolver(Uo.Info)}}},...Te(400)}}),validator("json",Uo.create.schema),async t=>{let e=t.req.valid("json"),n=await Uo.create(e);return t.json(n)}).get("/worktree",describeRoute({summary:"List worktrees",description:"List all sandbox worktrees for the current project.",operationId:"worktree.list",responses:{200:{description:"List of worktree directories",content:{"application/json":{schema:resolver(z$1.array(z$1.string()))}}}}}),async t=>{let e=await Kt.sandboxes(A.project.id);return t.json(e)}).delete("/worktree",describeRoute({summary:"Remove worktree",description:"Remove a git worktree and delete its branch.",operationId:"worktree.remove",responses:{200:{description:"Worktree removed",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",Uo.remove.schema),async t=>{let e=t.req.valid("json");return await Uo.remove(e),await Kt.removeSandbox(A.project.id,e.directory),t.json(true)}).post("/worktree/reset",describeRoute({summary:"Reset worktree",description:"Reset a worktree branch to the primary default branch.",operationId:"worktree.reset",responses:{200:{description:"Worktree reset",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",Uo.reset.schema),async t=>{let e=t.req.valid("json");return await Uo.reset(e),t.json(true)}).get("/resource",describeRoute({summary:"Get MCP resources",description:"Get all available MCP resources from connected servers. Optionally filter by name.",operationId:"experimental.resource.list",responses:{200:{description:"MCP resources",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),z$1.unknown()))}}}}}),async t=>t.json(await ze.resources())));var _s;(a=>{let t;function e(){return t||(t=A.state(async()=>({methods:pipe(await Ss.list(),filter(d=>d.auth?.provider!==void 0),map(d=>[d.auth.provider,d.auth]),fromEntries()),pending:{}}))),t}function n(){return e()()}a.Method=z$1.object({type:z$1.union([z$1.literal("oauth"),z$1.literal("api")]),label:z$1.string()}).meta({ref:"ProviderAuthMethod"});async function s(){let p=await n().then(d=>d.methods);return mapValues(p,d=>d.methods.map(h=>({type:h.type,label:h.label})))}a.methods=s,a.Authorization=z$1.object({url:z$1.string(),method:z$1.union([z$1.literal("auto"),z$1.literal("code")]),instructions:z$1.string()}).meta({ref:"ProviderAuthAuthorization"}),a.authorize=fn$1(z$1.object({providerID:z$1.string(),method:z$1.number()}),async p=>{let d=await n().then(w=>w.methods[p.providerID]);if(!d)return;let h=d.methods[p.method];if(h&&h.type==="oauth"&&h.authorize){let w=await h.authorize();return w?(await n().then(g=>g.pending[p.providerID]=w),{url:w.url??"",method:w.method??"",instructions:w.instructions??""}):void 0}}),a.callback=fn$1(z$1.object({providerID:z$1.string(),method:z$1.number(),code:z$1.string().optional()}),async p=>{let d=await n().then(w=>w.pending[p.providerID]);if(!d)throw new a.OauthMissing({providerID:p.providerID});let h;if(d.method==="code"){if(!p.code)throw new a.OauthCodeMissing({providerID:p.providerID});h=await d.callback(p.code);}if(d.method==="auto"&&(h=await d.callback()),h?.type==="success"){if("key"in h&&h.key&&await et.set(p.providerID,{type:"api",key:h.key??""}),"refresh"in h&&h.refresh){let w={type:"oauth",access:h.access??"",refresh:h.refresh??"",expires:h.expires??0};h.accountId&&(w.accountId=h.accountId),await et.set(p.providerID,w);}return}throw new a.OauthCallbackFailed({})}),a.api=fn$1(z$1.object({providerID:z$1.string(),key:z$1.string()}),async p=>{await et.set(p.providerID,{type:"api",key:p.key});}),a.OauthMissing=NamedError.create("ProviderAuthOauthMissing",z$1.object({providerID:z$1.string()})),a.OauthCodeMissing=NamedError.create("ProviderAuthOauthCodeMissing",z$1.object({providerID:z$1.string()})),a.OauthCallbackFailed=NamedError.create("ProviderAuthOauthCallbackFailed",z$1.object({}));})(_s||(_s={}));var Ky=lazy(()=>new Hono().get("/",describeRoute({summary:"List providers",description:"Get a list of all available AI providers, including both available and connected ones.",operationId:"provider.list",responses:{200:{description:"List of providers",content:{"application/json":{schema:resolver(z$1.object({all:a$3.Provider.array(),default:z$1.record(z$1.string(),z$1.string()),connected:z$1.array(z$1.string())}))}}}}}),async t=>{let e=await he.get(),n=new Set(e.disabled_providers??[]),o=e.enabled_providers?new Set(e.enabled_providers):void 0,s=await a$3.get(),r={};for(let[u,l]of Object.entries(s))(!o||o.has(u))&&!n.has(u)&&(r[u]=l);let i=await Ce.list(),c=Object.assign(mapValues(r,u=>Ce.fromModelsDevProvider(u)),i);return t.json({all:Object.values(c),default:mapValues(c,u=>Ce.sort(Object.values(u.models))[0]?.id??""),connected:Object.keys(i)})}).get("/auth",describeRoute({summary:"Get provider auth methods",description:"Retrieve available authentication methods for all AI providers.",operationId:"provider.auth",responses:{200:{description:"Provider auth methods",content:{"application/json":{schema:resolver(z$1.record(z$1.string(),z$1.array(_s.Method)))}}}}}),async t=>t.json(await _s.methods())).post("/:providerID/oauth/authorize",describeRoute({summary:"OAuth authorize",description:"Initiate OAuth authorization for a specific AI provider to get an authorization URL.",operationId:"provider.oauth.authorize",responses:{200:{description:"Authorization URL and method",content:{"application/json":{schema:resolver(_s.Authorization.optional())}}},...Te(400)}}),validator("param",z$1.object({providerID:z$1.string().meta({description:"Provider ID"})})),validator("json",z$1.object({method:z$1.number().meta({description:"Auth method index"})})),async t=>{let e=t.req.valid("param").providerID,{method:n}=t.req.valid("json"),o=await _s.authorize({providerID:e,method:n});return t.json(o)}).post("/:providerID/oauth/callback",describeRoute({summary:"OAuth callback",description:"Handle the OAuth callback from a provider after user authorization.",operationId:"provider.oauth.callback",responses:{200:{description:"OAuth callback processed successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("param",z$1.object({providerID:z$1.string().meta({description:"Provider ID"})})),validator("json",z$1.object({method:z$1.number().meta({description:"Auth method index"}),code:z$1.string().optional().meta({description:"OAuth authorization code"})})),async t=>{let e=t.req.valid("param").providerID,{method:n,code:o}=t.req.valid("json");return await _s.callback({providerID:e,method:n,code:o}),t.json(true)}));var Qy=lazy(()=>new Hono().get("/default",describeRoute({summary:"Get default model",description:"Get the default model for the current project, based on configuration or first available provider.",operationId:"model.default",responses:{200:{description:"Default model",content:{"application/json":{schema:resolver(z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional())}}},...Te(400)}}),async t=>{let e=await Ce.defaultModel();return e?t.json({providerID:e.providerID,modelID:e.modelID}):t.json(void 0)}).get("/parse",describeRoute({summary:"Parse model string",description:'Parse a model string in the format "providerID/modelID" and return its components.',operationId:"model.parse",responses:{200:{description:"Parsed model",content:{"application/json":{schema:resolver(z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional())}}},...Te(400)}}),async t=>{let e=t.req.query("model");if(!e)return t.json(void 0);let n=Ce.parseModel(e);return n?.providerID?t.json({providerID:n.providerID,modelID:n.modelID}):t.json(void 0)}));var Xy=lazy(()=>new Hono().get("/",describeRoute({summary:"List pending questions",description:"Get all pending question requests across all sessions.",operationId:"question.list",responses:{200:{description:"List of pending questions",content:{"application/json":{schema:resolver(zt.Request.array())}}}}}),async t=>{let e=await zt.list();return t.json(e)}).post("/:requestID/reply",describeRoute({summary:"Reply to question request",description:"Provide answers to a question request from the AI assistant.",operationId:"question.reply",responses:{200:{description:"Question answered successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({requestID:z$1.string()})),validator("json",zt.Reply),async t=>{let e=t.req.valid("param"),n=t.req.valid("json");return await zt.reply({requestID:e.requestID,answers:n.answers}),t.json(true)}).post("/:requestID/reject",describeRoute({summary:"Reject question request",description:"Reject a question request from the AI assistant.",operationId:"question.reject",responses:{200:{description:"Question rejected successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({requestID:z$1.string()})),async t=>{let e=t.req.valid("param");return await zt.reject(e.requestID),t.json(true)}));var nb=lazy(()=>new Hono().post("/:requestID/reply",describeRoute({summary:"Respond to permission request",description:"Approve or deny a permission request from the AI assistant.",operationId:"permission.reply",responses:{200:{description:"Permission processed successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400,404)}}),validator("param",z$1.object({requestID:z$1.string()})),validator("json",z$1.object({reply:Me.Reply,message:z$1.string().optional()})),async t=>{let e=t.req.valid("param"),n=t.req.valid("json");return await Me.reply({requestID:e.requestID,reply:n.reply,message:n.message}),t.json(true)}).get("/",describeRoute({summary:"List pending permissions",description:"Get all pending permission requests across all sessions.",operationId:"permission.list",responses:{200:{description:"List of pending permissions",content:{"application/json":{schema:resolver(Me.Request.array())}}}}}),async t=>{let e=await Me.list();return t.json(e)}));var ob=a.create({service:"server"}),gR=a$5.define("global.disposed",z$1.object({})),sb=lazy(()=>new Hono().get("/health",describeRoute({summary:"Get health",description:"Get health information about the EasBot server.",operationId:"global.health",responses:{200:{description:"Health information",content:{"application/json":{schema:resolver(z$1.object({healthy:z$1.literal(true),version:z$1.string()}))}}}}}),async t=>t.json({healthy:true,version:b$3.getVersion()})).get("/event",describeRoute({summary:"Get global events",description:"Subscribe to global events from the EasBot system using server-sent events.",operationId:"global.event",responses:{200:{description:"Event stream",content:{"text/event-stream":{schema:resolver(z$1.object({directory:z$1.string(),payload:a$5.payloads()}).meta({ref:"GlobalEvent"}))}}}}}),async t=>(ob.info("global event connected"),streamSSE(t,async e=>{e.writeSSE({data:JSON.stringify({payload:{type:"server.connected",properties:{}}})});async function n(s){await e.writeSSE({data:JSON.stringify(s)});}yt.on("event",n);let o=setInterval(()=>{e.writeSSE({data:JSON.stringify({payload:{type:"server.heartbeat",properties:{}}})});},3e4);await new Promise(s=>{e.onAbort(()=>{clearInterval(o),yt.off("event",n),s(),ob.info("global event disconnected");});});}))).get("/config",describeRoute({summary:"Get global configuration",description:"Retrieve the current global EasBot configuration settings and preferences.",operationId:"global.config.get",responses:{200:{description:"Get global config info",content:{"application/json":{schema:resolver(he.Info)}}}}}),async t=>t.json(await he.getGlobal())).patch("/config",describeRoute({summary:"Update global configuration",description:"Update global EasBot configuration settings and preferences.",operationId:"global.config.update",responses:{200:{description:"Successfully updated global config",content:{"application/json":{schema:resolver(he.Info)}}},...Te(400)}}),validator("json",he.Info),async t=>{let e=t.req.valid("json"),n=await he.updateGlobal(e);return t.json(n)}).post("/dispose",describeRoute({summary:"Dispose instance",description:"Clean up and dispose all EasBot instances, releasing all resources.",operationId:"global.dispose",responses:{200:{description:"Global disposed",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async t=>(await A.disposeAll(),yt.emit("event",{directory:"global",payload:{type:gR.type,properties:{}}}),t.json(true))));var rb=lazy(()=>new Hono().get("/",describeRoute({summary:"List agents",description:"Get a list of all available AI agents in the EasBot system.",operationId:"app.agents",responses:{200:{description:"List of agents",content:{"application/json":{schema:resolver(z$1.array(Ue.Info))}}}}}),async t=>{let e=await Ue.list();return t.json(e)}).get("/:agentID",describeRoute({summary:"Get agent",description:"Get details of a specific AI agent by name or ID.",operationId:"agent.get",responses:{200:{description:"Agent details",content:{"application/json":{schema:resolver(Ue.Info)}}},...Te(404)}}),async t=>{let e=t.req.param("agentID"),n=await Ue.get(e);return n?t.json(n):t.json({error:`Agent not found: ${e}`},404)}).get("/:agentID/event",describeRoute({summary:"Get agent events",description:"Subscribe to events for a specific agent using server-sent events.",operationId:"agent.event",responses:{200:{description:"Event stream",content:{"text/event-stream":{schema:{type:"object"}}}}}}),async t=>{let e=t.req.param("agentID");return streamSSE(t,async n=>{await n.writeSSE({data:JSON.stringify({type:"agent.connected",properties:{agentID:e}})});let o=ue.subscribeAll(async s=>{s.properties?.agentID===e&&await n.writeSSE({data:JSON.stringify(s)});});await new Promise(s=>{n.onAbort(()=>{o(),s();});});})}).get("/default",describeRoute({summary:"Get default agent",description:"Get the default agent configuration.",operationId:"agent.default",responses:{200:{description:"Default agent details",content:{"application/json":{schema:resolver(Ue.Info)}}},...Te(404)}}),async t=>{let e=await Ue.defaultAgent(),n=await Ue.get(e);return n?t.json(n):t.json({error:`Default agent not found: ${e}`},404)}).post("/",describeRoute({summary:"Create agent",description:"Create a new AI agent with specified configuration.",operationId:"agent.create",responses:{201:{description:"Agent created successfully",content:{"application/json":{schema:resolver(Ue.Info)}}},...Te(400),...Te(404)}}),validator("json",z$1.object({name:z$1.string(),mode:z$1.enum(["subagent","primary","all"]).optional(),permission:z$1.record(z$1.string(),z$1.any()).optional(),description:z$1.string().optional(),prompt:z$1.string().optional(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),temperature:z$1.number().optional(),topP:z$1.number().optional(),color:z$1.string().optional(),hidden:z$1.boolean().optional(),variant:z$1.string().optional(),steps:z$1.number().int().positive().optional(),options:z$1.record(z$1.string(),z$1.any()).optional()})),async t=>{let e=t.req.valid("json");try{if(!e.name||e.name.trim()==="")return t.json({error:"Agent name is required"},400);if(await Ue.get(e.name))return t.json({error:`Agent "${e.name}" already exists`},400);let o={mode:e.mode||"primary"};e.description&&(o.description=e.description),e.prompt&&(o.prompt=e.prompt),e.model&&(o.model=`${e.model.providerID}/${e.model.modelID}`),e.temperature!==void 0&&(o.temperature=e.temperature),e.topP!==void 0&&(o.topP=e.topP),e.color&&(o.color=e.color),e.hidden!==void 0&&(o.hidden=e.hidden),e.variant&&(o.variant=e.variant),e.steps!==void 0&&(o.steps=e.steps),e.permission&&(o.permission=e.permission),e.options&&(o.options=e.options),await he.update({agent:{[e.name]:o}});let s=await Ue.get(e.name);return s?t.json(s,201):t.json({error:`Failed to retrieve created agent "${e.name}"`},500)}catch(n){let o=n instanceof Error?n.message:"Agent creation failed";return t.json({error:o},400)}}));var Ga=a.create({service:"mdns"}),Wa;(s=>{let t,e;function n(r,i){if(e!==r){t&&o();try{let c=i??"easbot.local",u=`easbot-${r}`;t=new xR;let l=t.publish({name:u,type:"http",host:c,port:r,txt:{path:"/"}});l.on("up",()=>{Ga.info("mDNS service published",{name:u,port:r});}),l.on("error",f=>{Ga.error("mDNS service error",{error:f});}),e=r;}catch(c){if(Ga.error("mDNS publish failed",{error:c}),t)try{t.destroy();}catch{}t=void 0,e=void 0;}}}s.publish=n;function o(){if(t){try{t.unpublishAll(),t.destroy();}catch(r){Ga.error("mDNS unpublish failed",{error:r});}t=void 0,e=void 0,Ga.info("mDNS service unpublished");}}s.unpublish=o;})(Wa||(Wa={}));globalThis.AI_SDK_LOG_WARNINGS=false;var Va;(m=>{let t=a.create({service:"server"}),e=compress(),n=(a,p)=>!!(a==="/event"||a==="/global/event"||a==="/global/sync-event"||p==="POST"&&/\/session\/[^/]+\/(message|prompt_async)$/.test(a)),o,s=[];function r(){return o??new URL("http://localhost:4096")}m.url=r;let i=new Hono;m.App=lazy(()=>i.onError((a,p)=>{if(t.error("failed",{error:a}),a instanceof NamedError){let h;return a instanceof a$6.NotFoundError?h=404:a instanceof Ce.ModelNotFoundError||a.name==="ProviderAuthValidationFailed"||a.name.startsWith("Worktree")?h=400:h=500,p.json(a.toObject(),{status:h})}if(a instanceof HTTPException)return a.getResponse();let d=a instanceof Error&&a.stack?a.stack:a.toString();return p.json(new NamedError.Unknown({message:d}).toObject(),{status:500})}).use((a,p)=>{if(a.req.method==="OPTIONS")return p();let d=a$2.EASBOT_SERVER_PASSWORD;if(!d)return p();let h=a$2.EASBOT_SERVER_USERNAME??"easbot";return basicAuth({username:h,password:d})(a,p)}).use(async(a,p)=>{let d=a.req.path==="/log";d||t.info("request",{method:a.req.method,path:a.req.path});let h=t.time("request",{method:a.req.method,path:a.req.path});await p(),d||h.stop();}).use(cors({maxAge:86400,origin(a){if(a&&(a.startsWith("http://localhost:")||a.startsWith("http://127.0.0.1:")||a==="tauri://localhost"||a==="http://tauri.localhost"||a==="https://tauri.localhost"||/^https:\/\/([a-z0-9-]+\.)*easbot\.ai$/.test(a)||s.includes(a)))return a}})).use((a,p)=>n(a.req.path,a.req.method)?p():e(a,p)).route("/global",sb()).put("/auth/:providerID",describeRoute({summary:"Set auth credentials",description:"Set authentication credentials",operationId:"auth.set",responses:{200:{description:"Successfully set authentication credentials",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("param",z$1.object({providerID:z$1.string()})),validator("json",et.Info),async a=>{let p=a.req.valid("param").providerID,d=a.req.valid("json");return await et.set(p,d),a.json(true)}).delete("/auth/:providerID",describeRoute({summary:"Remove auth credentials",description:"Remove authentication credentials",operationId:"auth.remove",responses:{200:{description:"Successfully removed authentication credentials",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("param",z$1.object({providerID:z$1.string()})),async a=>{let p=a.req.valid("param").providerID;return await et.remove(p),a.json(true)}).use(async(a,p)=>{if(a.req.path==="/log")return p();let d=a.req.query("directory")||a.req.header("x-easbot-directory")||process.cwd(),h=Filesystem.resolve((()=>{try{return decodeURIComponent(d)}catch{return d}})());return A.provide({directory:h,init:Ks,async fn(){return p()}})}).get("/doc",openAPIRouteHandler(i,{documentation:{info:{title:"easbot",version:"0.0.3",description:"easbot api"},openapi:"3.1.1"}})).use(validator("query",z$1.object({directory:z$1.string().optional(),workspace:z$1.string().optional()}))).route("/project",Ny()).route("/pty",zy()).route("/config",Gy()).route("/experimental",Wy()).route("/session",Uy()).route("/permission",nb()).route("/question",Xy()).route("/provider",Ky()).route("/model",Qy()).route("/",Hy()).route("/mcp",By()).route("/agent",rb()).route("/tui",Oy()).post("/instance/dispose",describeRoute({summary:"Dispose instance",description:"Clean up and dispose the current EasBot instance, releasing all resources.",operationId:"instance.dispose",responses:{200:{description:"Instance disposed",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),async a=>(await A.dispose(),a.json(true))).get("/path",describeRoute({summary:"Get paths",description:"Retrieve the current working directory and related path information for the EasBot instance.",operationId:"path.get",responses:{200:{description:"Path",content:{"application/json":{schema:resolver(z$1.object({home:z$1.string(),state:z$1.string(),config:z$1.string(),worktree:z$1.string(),directory:z$1.string()}).meta({ref:"Path"}))}}}}}),async a=>a.json({home:a$1.Path.home,state:a$1.Path.state,config:a$1.Path.config,worktree:A.worktree,directory:A.directory})).get("/vcs",describeRoute({summary:"Get VCS info",description:"Retrieve version control system (VCS) information for the current project, such as git branch.",operationId:"vcs.get",responses:{200:{description:"VCS info",content:{"application/json":{schema:resolver(Vs.Info)}}}}}),async a=>{let p=await Vs.branch();return a.json({branch:p})}).get("/command",describeRoute({summary:"List commands",description:"Get a list of all available commands in the EasBot system.",operationId:"command.list",responses:{200:{description:"List of commands",content:{"application/json":{schema:resolver(gn.Info.array())}}}}}),validator("query",z$1.object({contextMode:z$1.string().optional()})),async a=>{let{contextMode:p}=a.req.valid("query"),d=await gn.list(p);return a.json(d)}).post("/log",describeRoute({summary:"Write log",description:"Write a log entry to the server logs with specified level and metadata.",operationId:"app.log",responses:{200:{description:"Log entry written successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}},...Te(400)}}),validator("json",z$1.object({service:z$1.string().meta({description:"Service name for the log entry"}),level:z$1.enum(["debug","info","error","warn"]).meta({description:"Log level"}),message:z$1.string().meta({description:"Log message"}),extra:z$1.record(z$1.string(),z$1.any()).optional().meta({description:"Additional metadata for the log entry"})})),async a$1=>{let{service:p,level:d,message:h,extra:w}=a$1.req.valid("json"),g=a.create({service:p});switch(d){case "debug":g.debug(h,w);break;case "info":g.info(h,w);break;case "error":g.error(h,w);break;case "warn":g.warn(h,w);break}return a$1.json(true)}).get("/agent",describeRoute({summary:"List agents",description:"Get a list of all available AI agents in the EasBot system.",operationId:"app.agents",responses:{200:{description:"List of agents",content:{"application/json":{schema:resolver(Ue.Info.array())}}}}}),async a=>{let p=await Ue.list();return a.json(p)}).get("/skill",describeRoute({summary:"List skills",description:"Get a list of all available skills in the EasBot system.",operationId:"app.skills",responses:{200:{description:"List of skills",content:{"application/json":{schema:resolver(rn.Info.array())}}}}}),async a=>{let p=await rn.all();return a.json(p)}).get("/lsp",describeRoute({summary:"Get LSP status",description:"Get LSP server status",operationId:"lsp.status",responses:{200:{description:"LSP server status",content:{"application/json":{schema:resolver(Ve.Status.array())}}}}}),async a=>a.json(await Ve.status())).get("/formatter",describeRoute({summary:"Get formatter status",description:"Get formatter status",operationId:"formatter.status",responses:{200:{description:"Formatter status",content:{"application/json":{schema:resolver(Us.Status.array())}}}}}),async a=>a.json(await Us.status())).get("/event",describeRoute({summary:"Subscribe to events",description:"Get events",operationId:"event.subscribe",responses:{200:{description:"Event stream",content:{"text/event-stream":{schema:resolver(a$5.payloads())}}}}}),async a=>(t.info("event connected"),streamSSE(a,async p=>{p.writeSSE({data:JSON.stringify({type:"server.connected",properties:{}})});let d=ue.subscribeAll(async w=>{await p.writeSSE({data:JSON.stringify(w)}),w.type===ue.InstanceDisposed.type&&p.close();}),h=setInterval(()=>{p.writeSSE({data:JSON.stringify({type:"server.heartbeat",properties:{}})});},3e4);await new Promise(w=>{p.onAbort(()=>{clearInterval(h),d(),w(),t.info("event disconnected");});});}))).post("/event",describeRoute({summary:"Publish event",description:"Publish an event to the event bus",operationId:"event.publish",responses:{200:{description:"Event published successfully",content:{"application/json":{schema:resolver(z$1.boolean())}}}}}),validator("json",z$1.object({type:z$1.string(),properties:z$1.record(z$1.string(),z$1.any()).optional()})),async a=>{let p=a.req.valid("json"),d=a$5.define(p.type,z$1.record(z$1.string(),z$1.any()));return await ue.publish(d,p.properties??{}),a.json(true)}).get("/context",describeRoute({summary:"Get context info",description:"Retrieve context information including protocol metadata, workspace path, and agent name.",operationId:"app.context",responses:{200:{description:"Context information",content:{"application/json":{schema:resolver(z$1.object({protocolMetadata:z$1.object({agentId:z$1.string().optional(),workspace:z$1.string(),name:z$1.string(),userName:z$1.string(),mission:z$1.string(),preferredName:z$1.string().optional(),coreRelationship:z$1.string().optional(),coreValues:z$1.array(z$1.string()).optional(),behaviorStyle:z$1.string().optional(),decisionPrinciples:z$1.array(z$1.string()).optional()}),protocolInitialized:z$1.boolean()}))}}}}}),async a=>{let p=await To.getContext();return a.json(p)}).all("/*",async a=>{let p=a.req.path,d=await proxy(`https://app.easbot.cn${p}`,{...a.req,headers:{...a.req.raw.headers,host:"app.easbot.cn"}});return d.headers.set("Content-Security-Policy","default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:; media-src 'self' data:; connect-src 'self' data:"),d}));async function u(){return await generateSpecs((0, m.App)(),{documentation:{info:{title:"easbot",version:"1.0.0",description:"easbot api"},openapi:"3.1.1"}})}m.openapi=u;function l(a){s=a.cors??[];let p=createServer((S,y)=>{(0, m.App)().fetch;let I=new URL(S.url??"/",`http://${S.headers.host}`),P=new Headers;for(let[N,K]of Object.entries(S.headers))K&&P.set(N,Array.isArray(K)?K.join(", "):K);let T=new AbortController;S.on("close",()=>T.abort());let M=new Request(I,{method:S.method,headers:P,body:S.method!=="GET"&&S.method!=="HEAD"?S:void 0,signal:T.signal,duplex:"half"}),j=(0, m.App)().fetch(M);Promise.resolve(j).then(N=>{y.statusCode=N.status,y.statusMessage=N.statusText;for(let[K,te]of N.headers.entries())y.setHeader(K,te);N.body?N.body.pipeTo(new WritableStream({write(K){y.write(K);},close(){y.end();}})):y.end();}).catch(N=>{t.error("Server error",{error:N.message}),y.statusCode=500,y.end("Internal Server Error");});}),d=S=>{try{return p.listen(S,a.hostname),!0}catch{return false}},h=a.port===0?d(4096)?4096:d(0)?p.address().port:null:d(a.port)?a.port:null;if(h===null)throw new Error(`Failed to start server on port ${a.port}`);let w=p.address(),g=typeof w=="object"&&w?w.port:h,b=a.hostname==="0.0.0.0"?"localhost":a.hostname;o=new URL(`http://${b}:${g}`);let v=a.mdns&&g&&a.hostname!=="127.0.0.1"&&a.hostname!=="localhost"&&a.hostname!=="::1";return v?Wa.publish(g,a.mdnsDomain):a.mdns&&t.warn("mDNS enabled but hostname is loopback; skipping mDNS publish"),{url:o,port:g,stop:async S=>(v&&Wa.unpublish(),new Promise(y=>{p.close(()=>{y();});})),raw:p}}m.listen=l,m.Default=m.App;})(Va||(Va={}));var cm=a.create({service:"plugin.codex"}),Ja="app_EMoamEEZ73f0CkXaXp7hrann",Ms="https://auth.openai.com",OR="https://chatgpt.com/backend-api/codex/responses",wr=1455,jR=3e3;async function LR(){let t=NR(43),n=new TextEncoder().encode(t),o=await crypto.subtle.digest("SHA-256",n),s=lb(o);return {verifier:t,challenge:s}}function NR(t){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~",n=crypto.getRandomValues(new Uint8Array(t));return Array.from(n).map(o=>e[o%e.length]).join("")}function lb(t){let e=new Uint8Array(t),n=String.fromCharCode(...e);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function $R(){return lb(crypto.getRandomValues(new Uint8Array(32)).buffer)}function ab(t){let e=t.split(".");if(e.length===3)try{let n=e[1];return n?JSON.parse(Buffer.from(n,"base64url").toString()):void 0}catch{return}}function cb(t){return t.chatgpt_account_id||t["https://api.openai.com/auth"]?.chatgpt_account_id||t.organizations?.[0]?.id}function im(t){if(t.id_token){let e=ab(t.id_token),n=e&&cb(e);if(n)return n}if(t.access_token){let e=ab(t.access_token);return e?cb(e):void 0}}function FR(t,e,n){let o=new URLSearchParams({response_type:"code",client_id:Ja,redirect_uri:t,scope:"openid profile email offline_access",code_challenge:e.challenge,code_challenge_method:"S256",id_token_add_organizations:"true",codex_cli_simplified_flow:"true",state:n,originator:"easbot"});return `${Ms}/oauth/authorize?${o.toString()}`}async function UR(t,e,n){let o=await fetch(`${Ms}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:t,redirect_uri:e,client_id:Ja,code_verifier:n.verifier}).toString()});if(!o.ok)throw new Error(`Token exchange failed: ${o.status}`);return o.json()}async function zR(t){let e=await fetch(`${Ms}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:t,client_id:Ja}).toString()});if(!e.ok)throw new Error(`Token refresh failed: ${e.status}`);return e.json()}var BR=`<!doctype html>
948
+ <html>
949
+ <head>
950
+ <title>EasBot - Codex Authorization Successful</title>
951
+ <style>
952
+ body {
953
+ font-family:
954
+ system-ui,
955
+ -apple-system,
956
+ sans-serif;
957
+ display: flex;
958
+ justify-content: center;
959
+ align-items: center;
960
+ height: 100vh;
961
+ margin: 0;
962
+ background: #131010;
963
+ color: #f1ecec;
964
+ }
965
+ .container {
966
+ text-align: center;
967
+ padding: 2rem;
968
+ }
969
+ h1 {
970
+ color: #f1ecec;
971
+ margin-bottom: 1rem;
972
+ }
973
+ p {
974
+ color: #b7b1b1;
975
+ }
976
+ </style>
977
+ </head>
978
+ <body>
979
+ <div class="container">
980
+ <h1>Authorization Successful</h1>
981
+ <p>You can close this window and return to EasBot.</p>
982
+ </div>
983
+ <script>
984
+ setTimeout(() => window.close(), 2000)
985
+ </script>
986
+ </body>
987
+ </html>`,am=t=>`<!doctype html>
988
+ <html>
989
+ <head>
990
+ <title>EasBot - Codex Authorization Failed</title>
991
+ <style>
992
+ body {
993
+ font-family:
994
+ system-ui,
995
+ -apple-system,
996
+ sans-serif;
997
+ display: flex;
998
+ justify-content: center;
999
+ align-items: center;
1000
+ height: 100vh;
1001
+ margin: 0;
1002
+ background: #131010;
1003
+ color: #f1ecec;
1004
+ }
1005
+ .container {
1006
+ text-align: center;
1007
+ padding: 2rem;
1008
+ }
1009
+ h1 {
1010
+ color: #fc533a;
1011
+ margin-bottom: 1rem;
1012
+ }
1013
+ p {
1014
+ color: #b7b1b1;
1015
+ }
1016
+ .error {
1017
+ color: #ff917b;
1018
+ font-family: monospace;
1019
+ margin-top: 1rem;
1020
+ padding: 1rem;
1021
+ background: #3c140d;
1022
+ border-radius: 0.5rem;
1023
+ }
1024
+ </style>
1025
+ </head>
1026
+ <body>
1027
+ <div class="container">
1028
+ <h1>Authorization Failed</h1>
1029
+ <p>An error occurred during authorization.</p>
1030
+ <div class="error">${t}</div>
1031
+ </div>
1032
+ </body>
1033
+ </html>`,Ka,jn;async function HR(){return Ka?{port:wr,redirectUri:`http://localhost:${wr}/auth/callback`}:(Ka=serve({port:wr,fetch(t){let e=new URL(t.url);if(e.pathname==="/auth/callback"){let n=e.searchParams.get("code"),o=e.searchParams.get("state"),s=e.searchParams.get("error"),r=e.searchParams.get("error_description");if(s){let c=r||s;return jn?.reject(new Error(c)),jn=void 0,new Response(am(c),{headers:{"Content-Type":"text/html"}})}if(!n){let c="Missing authorization code";return jn?.reject(new Error(c)),jn=void 0,new Response(am(c),{status:400,headers:{"Content-Type":"text/html"}})}if(!jn||o!==jn.state){let c="Invalid state - potential CSRF attack";return jn?.reject(new Error(c)),jn=void 0,new Response(am(c),{status:400,headers:{"Content-Type":"text/html"}})}let i=jn;return jn=void 0,UR(n,`http://localhost:${wr}/auth/callback`,i.pkce).then(c=>i.resolve(c)).catch(c=>i.reject(c)),new Response(BR,{headers:{"Content-Type":"text/html"}})}return e.pathname==="/cancel"?(jn?.reject(new Error("Login cancelled")),jn=void 0,new Response("Login cancelled",{status:200})):new Response("Not found",{status:404})}}),cm.info("codex oauth server started",{port:wr}),{port:wr,redirectUri:`http://localhost:${wr}/auth/callback`})}function qR(){Ka&&(Ka.close(),Ka=void 0,cm.info("codex oauth server stopped"));}function GR(t,e){return new Promise((n,o)=>{let s=setTimeout(()=>{jn&&(jn=void 0,o(new Error("OAuth callback timeout - authorization took too long")));},3e5);jn={pkce:t,state:e,resolve:r=>{clearTimeout(s),n(r);},reject:r=>{clearTimeout(s),o(r);}};})}async function db(t){return {auth:{provider:"openai",loader:async(e,n)=>{if((await e()).type!=="oauth")return {};let s=new Set(["gpt-5.1-codex-max","gpt-5.1-codex-mini","gpt-5.2","gpt-5.2-codex","gpt-5.3-codex","gpt-5.1-codex"]);for(let r of Object.keys(n.models))s.has(r)||delete n.models[r];if(!n.models["gpt-5.3-codex"]){let r={id:"gpt-5.3-codex",providerID:"openai",api:{id:"gpt-5.3-codex",url:"https://chatgpt.com/backend-api/codex",npm:"@ai-sdk/openai"},name:"GPT-5.3 Codex",capabilities:{temperature:false,reasoning:true,attachment:true,toolcall:true,input:{text:true,audio:false,image:true,video:false,pdf:false},output:{text:true,audio:false,image:false,video:false,pdf:false},interleaved:false},cost:{input:0,output:0,cache:{read:0,write:0}},limit:{context:4e5,input:272e3,output:128e3},status:"active",options:{},headers:{},release_date:"2026-02-05",variants:{},family:"gpt-codex"};r.variants=vt.variants(r),n.models["gpt-5.3-codex"]=r;}for(let r of Object.values(n.models))r.cost={input:0,output:0,cache:{read:0,write:0}};return {apiKey:Am,async fetch(r,i){i?.headers&&(i.headers instanceof Headers?(i.headers.delete("authorization"),i.headers.delete("Authorization")):Array.isArray(i.headers)?i.headers=i.headers.filter(([a])=>a.toLowerCase()!=="authorization"):(delete i.headers.authorization,delete i.headers.Authorization));let c=await e();if(c.type!=="oauth")return fetch(r,i);let u=c;if(!c.access||c.expires<Date.now()){cm.info("refreshing codex access token");let a=await zR(c.refresh),p=im(a)||u.accountId;await t.client.auth.set({providerID:"openai",auth:{type:"oauth",refresh:a.refresh_token,access:a.access_token,expires:Date.now()+(a.expires_in??3600)*1e3,...p&&{accountId:p}}}),c.access=a.access_token,u.accountId=p;}let l=new Headers;if(i?.headers)if(i.headers instanceof Headers)i.headers.forEach((a,p)=>{l.set(p,a);});else if(Array.isArray(i.headers))for(let[a,p]of i.headers)p!==void 0&&l.set(a,String(p));else for(let[a,p]of Object.entries(i.headers))p!==void 0&&l.set(a,String(p));l.set("authorization",`Bearer ${c.access}`),u.accountId&&l.set("ChatGPT-Account-Id",u.accountId);let f=r instanceof URL?r:new URL(typeof r=="string"?r:r.url),m=f.pathname.includes("/v1/responses")||f.pathname.includes("/chat/completions")?new URL(OR):f;return fetch(m,{...i,headers:l})}}},methods:[{label:"ChatGPT Pro/Plus (browser)",type:"oauth",authorize:async()=>{let{redirectUri:e}=await HR(),n=await LR(),o=$R(),s=FR(e,n,o),r=GR(n,o);return {url:s,instructions:"Complete authorization in your browser. This window will close automatically.",method:"auto",callback:async()=>{let i=await r;qR();let c=im(i);return {type:"success",refresh:i.refresh_token,access:i.access_token,expires:Date.now()+(i.expires_in??3600)*1e3,accountId:c}}}}},{label:"ChatGPT Pro/Plus (headless)",type:"oauth",authorize:async()=>{let e=await fetch(`${Ms}/api/accounts/deviceauth/usercode`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`easbot/${b$3.getVersion()}`},body:JSON.stringify({client_id:Ja})});if(!e.ok)throw new Error("Failed to initiate device authorization");let n=await e.json(),o=Math.max(parseInt(n.interval,10)||5,1)*1e3;return {url:`${Ms}/codex/device`,instructions:`Enter code: ${n.user_code}`,method:"auto",async callback(){for(;;){let s=await fetch(`${Ms}/api/accounts/deviceauth/token`,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`easbot/${b$3.getVersion()}`},body:JSON.stringify({device_auth_id:n.device_auth_id,user_code:n.user_code})});if(s.ok){let r=await s.json(),i=await fetch(`${Ms}/oauth/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",code:r.authorization_code,redirect_uri:`${Ms}/deviceauth/callback`,client_id:Ja,code_verifier:r.code_verifier}).toString()});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);let c=await i.json();return {type:"success",refresh:c.refresh_token,access:c.access_token,expires:Date.now()+(c.expires_in??3600)*1e3,accountId:im(c)}}if(s.status!==403&&s.status!==404)return {type:"failed"};await new Promise(r=>setTimeout(r,o+jR));}}}}},{label:"Manually enter API Key",type:"api"}]},"llm.headers":async(e,n)=>{e.model&&e.model.providerID==="openai"&&(e.headers??(e.headers={}),e.headers.originator="easbot",e.headers["User-Agent"]=`easbot/${b$3.getVersion()} (${Mc.platform()} ${Mc.release()}; ${Mc.arch()})`,e.headers.session_id=e.sessionID,n.modified=true,n.input=e);}}}var ub="Ov23li8tweQw6odWQebz",lm=3e3;function pb(t){return t.replace(/^https?:\/\//,"").replace(/\/$/,"")}function VR(t){return {DEVICE_CODE_URL:`https://${t}/login/device/code`,ACCESS_TOKEN_URL:`https://${t}/login/oauth/access_token`}}async function mb(t){let e=t.client;return {auth:{provider:"github-copilot",async loader(n,o){let s=await n();if(!s||s.type!=="oauth")return {};let r=s.enterpriseUrl,i=r?`https://copilot-api.${pb(r)}`:void 0;if(o?.models)for(let c of Object.values(o.models))c.cost={input:0,output:0,cache:{read:0,write:0}},c.api.npm="@ai-sdk/github-copilot";return {baseURL:i,apiKey:"",async fetch(c,u){let l=await n();if(l.type!=="oauth")return fetch(c,u);let f=c instanceof URL?c.href:c.toString(),{isVision:m,isAgent:a}=iife(()=>{try{let d=typeof u?.body=="string"?JSON.parse(u.body):u?.body;if(d?.messages&&f.includes("completions")){let h=d.messages[d.messages.length-1];return {isVision:d.messages.some(w=>Array.isArray(w.content)&&w.content.some(g=>g.type==="image_url")),isAgent:h?.role!=="user"}}if(d?.input){let h=d.input[d.input.length-1];return {isVision:d.input.some(w=>Array.isArray(w?.content)&&w.content.some(g=>g.type==="input_image")),isAgent:h?.role!=="user"}}if(d?.messages){let h=d.messages[d.messages.length-1],w=Array.isArray(h?.content)&&h.content.some(g=>g?.type!=="tool_result");return {isVision:d.messages.some(g=>Array.isArray(g?.content)&&g.content.some(b=>b?.type==="image"||b?.type==="tool_result"&&Array.isArray(b?.content)&&b.content.some(v=>v?.type==="image"))),isAgent:!(h?.role==="user"&&w)}}}catch{}return {isVision:false,isAgent:false}}),p={"x-initiator":a?"agent":"user",...u?.headers,"User-Agent":`easbot/${b$3.getVersion()}`,Authorization:`Bearer ${l.refresh}`,"Openai-Intent":"conversation-edits"};return m&&(p["Copilot-Vision-Request"]="true"),delete p["x-api-key"],delete p.authorization,fetch(c,{...u,headers:p})}}},methods:[{type:"oauth",label:"Login with GitHub Copilot",prompts:[{type:"select",key:"deploymentType",message:"Select GitHub deployment type",options:[{label:"GitHub.com",value:"github.com",hint:"Public"},{label:"GitHub Enterprise",value:"enterprise",hint:"Data residency or self-hosted"}]},{type:"text",key:"enterpriseUrl",message:"Enter your GitHub Enterprise URL or domain",placeholder:"company.ghe.com or https://company.ghe.com",condition:n=>n.deploymentType==="enterprise",validate:n=>{if(!n)return "URL or domain is required";try{return (n.includes("://")?new URL(n):new URL(`https://${n}`)).hostname?void 0:"Please enter a valid URL or domain"}catch{return "Please enter a valid URL (e.g., company.ghe.com or https://company.ghe.com)"}}}],async authorize(n={}){let o=n.deploymentType||"github.com",s="github.com",r="github-copilot";if(o==="enterprise"){let l=n.enterpriseUrl;s=pb(l),r="github-copilot-enterprise";}let i=VR(s),c=await fetch(i.DEVICE_CODE_URL,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":`easbot/${b$3.getVersion()}`},body:JSON.stringify({client_id:ub,scope:"read:user"})});if(!c.ok)throw new Error("Failed to initiate device authorization");let u=await c.json();return {url:u.verification_uri,instructions:`Enter code: ${u.user_code}`,method:"auto",async callback(){for(;;){let l=await fetch(i.ACCESS_TOKEN_URL,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":`easbot/${b$3.getVersion()}`},body:JSON.stringify({client_id:ub,device_code:u.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!l.ok)return {type:"failed"};let f=await l.json();if(f.access_token){let m={type:"success",refresh:f.access_token,access:f.access_token,expires:0};return r==="github-copilot-enterprise"&&(m.provider="github-copilot-enterprise",m.enterpriseUrl=s),m}if(f.error==="authorization_pending"){await new Promise(m=>setTimeout(m,u.interval*1e3+lm));continue}if(f.error==="slow_down"){let m=(u.interval+5)*1e3,a=f.interval;a&&typeof a=="number"&&a>0&&(m=a*1e3),await new Promise(p=>setTimeout(p,m+lm));continue}if(f.error)return {type:"failed"};await new Promise(m=>setTimeout(m,u.interval*1e3+lm));}}}}}]},"llm.headers":async(n,o)=>{!n.model||typeof n.model=="string"||!n.model.providerID.includes("github-copilot")||(n.headers??(n.headers={}),"api"in n.model&&typeof n.model.api=="object"&&n.model.api?.npm==="@ai-sdk/anthropic"&&(n.headers["anthropic-beta"]="interleaved-thinking-2025-05-14"),!(await e.session.get({sessionID:n.sessionID}).catch(()=>{}))?.data?.parentID)||(n.headers["x-initiator"]="agent",o.modified=true,o.input=n);}}}var Ss;(f=>{let t=a.create({service:"plugin"}),e=[],n=[db,mb],o;function s(m){if(m.hooks&&Array.isArray(m.hooks))for(let a of m.hooks)je.registerMatcher(a),t.debug("registered plugin hook matcher to Hook system",{event:a.event,hookCount:a.hooks.length});}async function r(m){if(m.tool&&Object.keys(m.tool).length>0)for(let[a,p]of Object.entries(m.tool))await ro.register({id:a,init:async()=>({parameters:z$1.object(p.args),description:p.description,execute:async(d,h)=>{if(!p.execute)throw new Error(`Tool ${a} does not have an execute function`);let w={...h,directory:A.directory,worktree:A.worktree};return await p.execute(d,w)}})}),t.debug("registered plugin tool to Tool system",{toolId:a});}function i(){return o||(o=A.state(async()=>{let m=createEasbotClient({baseUrl:"http://localhost:4096",directory:A.directory,fetch:async(...w)=>Va.App().fetch(...w)}),a=await he.get(),p=[],d={client:m,project:A.project,worktree:A.worktree,directory:A.directory,serverUrl:Va.url(),$:shell};for(let w of n){t.info("loading internal plugin",{name:w.name});let g=await w(d).catch(b=>{t.error("failed to load internal plugin",{name:w.name,error:b});});g&&(p.push(g),s(g),await r(g));}let h=a.plugin??[];h.length>0&&await he.waitForDependencies(),a$2.EASBOT_DISABLE_DEFAULT_PLUGINS||(h=[...e,...h]);for(let w of h)if(!(w.includes("easbot-openai-codex-auth")||w.includes("easbot-copilot-auth"))){if(t.info("loading plugin",{path:w}),!w.startsWith("file://")){let g=w.lastIndexOf("@"),b=g>0?w.substring(0,g):w,v=g>0?w.substring(g+1):"latest",k=e.some(S=>S.startsWith(b+"@"));if(w=await Shell.install(b,v).catch(S=>{if(!k)throw S;let y=S instanceof Error?S.message:String(S);return t.error("failed to install builtin plugin",{pkg:b,version:v,error:y}),ue.publish(ee.Event.Error,{error:new NamedError.Unknown({message:`Failed to install built-in plugin ${b}@${v}: ${y}`}).toObject()}).catch(x=>{t.error("failed to publish error event",{error:x});}),""}),!w)continue}await import(w).then(async g=>{let b=new Set;for(let[v,k]of Object.entries(g)){if(b.has(k))continue;b.add(k);let S=await k(d);p.push(S),s(S),await r(S);}}).catch(g=>{let b=g instanceof Error?g.message:String(g);t.error("failed to load plugin",{path:w,error:b}),ue.publish(ee.Event.Error,{error:new NamedError.Unknown({message:`Failed to load plugin ${w}: ${b}`}).toObject()}).catch(v=>{t.error("failed to publish error event",{error:v});});});}return {plugins:p,input:d}})),o}function c(){return i()()}async function u(){return c().then(m=>m.plugins)}f.list=u;async function l(){await je.init(),await gn.init(),await ro.init();let m=await c().then(p=>p.plugins),a=await he.get();for(let p of m)await p.config?.(a);ue.subscribeAll(async p=>{let d=await c().then(h=>h.plugins);for(let h of d)h.event?.({event:p});});}f.init=l;})(Ss||(Ss={}));var it;(c=>{let t;function e(){return t||(t=A.state(async()=>({...process.env}))),t}function n(){return e()()}async function o(u){return (await n())[u]}c.get=o;async function s(){return await n()}c.all=s;async function r(u,l){let f=await n();f[u]=l;}c.set=r;async function i(u){let l=await n();delete l[u];}c.remove=i;})(it||(it={}));var t_={"@ai-sdk/amazon-bedrock":()=>import('@ai-sdk/amazon-bedrock').then(t=>t.createAmazonBedrock),"@ai-sdk/anthropic":()=>import('@ai-sdk/anthropic').then(t=>t.createAnthropic),"@ai-sdk/azure":()=>import('@ai-sdk/azure').then(t=>t.createAzure),"@ai-sdk/google":()=>import('@ai-sdk/google').then(t=>t.createGoogleGenerativeAI),"@ai-sdk/google-vertex":()=>import('@ai-sdk/google-vertex').then(t=>t.createVertex),"@ai-sdk/google-vertex/anthropic":()=>import('@ai-sdk/google-vertex/anthropic').then(t=>t.createVertexAnthropic),"@ai-sdk/openai":()=>import('@ai-sdk/openai').then(t=>t.createOpenAI),"@ai-sdk/openai-compatible":()=>import('@ai-sdk/openai-compatible').then(t=>t.createOpenAICompatible),"@openrouter/ai-sdk-provider":()=>import('@openrouter/ai-sdk-provider').then(t=>t.createOpenRouter),"@ai-sdk/xai":()=>import('@ai-sdk/xai').then(t=>t.createXai),"@ai-sdk/mistral":()=>import('@ai-sdk/mistral').then(t=>t.createMistral),"@ai-sdk/groq":()=>import('@ai-sdk/groq').then(t=>t.createGroq),"@ai-sdk/deepinfra":()=>import('@ai-sdk/deepinfra').then(t=>t.createDeepInfra),"@ai-sdk/cerebras":()=>import('@ai-sdk/cerebras').then(t=>t.createCerebras),"@ai-sdk/cohere":()=>import('@ai-sdk/cohere').then(t=>t.createCohere),"@ai-sdk/gateway":()=>import('@ai-sdk/gateway').then(t=>t.createGateway),"@ai-sdk/togetherai":()=>import('@ai-sdk/togetherai').then(t=>t.createTogetherAI),"@ai-sdk/perplexity":()=>import('@ai-sdk/perplexity').then(t=>t.createPerplexity),"@ai-sdk/vercel":()=>import('@ai-sdk/vercel').then(t=>t.createVercel),"@ai-sdk/alibaba":()=>import('@ai-sdk/alibaba').then(t=>t.createAlibaba),"@ai-sdk/deepseek":()=>import('@ai-sdk/deepseek').then(t=>t.createDeepSeek),"gitlab-ai-provider":()=>import('gitlab-ai-provider').then(t=>t.createGitLab),"@ai-sdk/github-copilot":()=>import('./copilot-I52DJYYX.mjs').then(t=>t.createOpenaiCompatible),"@easbot/ollama-sdk":()=>import('@easbot/ollama-sdk').then(t=>t.createOllama),"@easbot/local-model-sdk":()=>import('@easbot/local-model-sdk').then(t=>t.createLocal)},Ce;(U=>{U.DEFAULT_CONTEXT_LIMIT=2e5,U.DEFAULT_INPUT_LIMIT_RATIO=.9,U.DEFAULT_OUTPUT_LIMIT=8192;function o(_=2e5){return Math.floor(_*.9)}U.getDefaultInputLimit=o;let s=a.create({service:"provider"});function r(_){let D=/^gpt-(\d+)/.exec(_);return D?Number(D[1])>=5:false}function i(_){return r(_)&&!_.startsWith("gpt-5-mini")}let c$1={async anthropic(){return {autoload:false,options:{headers:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"}}}},async opencode(_){let D=await(async()=>{let O=await it.all();return !!(_.env.some(E=>O[E])||await et.get(_.id)||(await he.get()).provider?.opencode?.options?.apiKey)})();if(!D)for(let[O,C]of Object.entries(_.models))C.cost.input!==0&&delete _.models[O];return {autoload:Object.keys(_.models).length>0,options:D?{}:{apiKey:"public"}}},openai:async()=>{let _=await it.get("OPENAI_BASE_URL");return {autoload:false,async getModel(D,O,C){return D.responses(O)},options:_?{baseURL:_}:{}}},"github-copilot":async()=>({autoload:false,async getModel(_,D,O){return _.responses===void 0&&_.chat===void 0?_.languageModel(D):i(D)?_.responses(D):_.chat(D)},options:{}}),"github-copilot-enterprise":async()=>({autoload:false,async getModel(_,D,O){return _.responses===void 0&&_.chat===void 0?_.languageModel(D):i(D)?_.responses(D):_.chat(D)},options:{}}),azure:async()=>({autoload:false,async getModel(_,D,O){return O?.useCompletionUrls?_.chat(D):_.responses(D)},options:{}}),"azure-cognitive-services":async()=>{let _=it.get("AZURE_COGNITIVE_SERVICES_RESOURCE_NAME");return {autoload:false,async getModel(D,O,C){return C?.useCompletionUrls?D.chat(O):D.responses(O)},options:{baseURL:_?`https://${_}.cognitiveservices.azure.com/openai`:void 0}}},"amazon-bedrock":async()=>{let D=(await he.get()).provider?.["amazon-bedrock"],O=await et.get("amazon-bedrock"),C=D?.options?.region,E=it.get("AWS_REGION"),R=C??E??"us-east-1",L=D?.options?.profile,q=it.get("AWS_PROFILE"),Q=L??q,Z=it.get("AWS_ACCESS_KEY_ID"),se=iife(()=>{let X=process.env.AWS_BEARER_TOKEN_BEDROCK;if(X)return X;if(O?.type==="api")return process.env.AWS_BEARER_TOKEN_BEDROCK=O.key,O.key}),le=it.get("AWS_WEB_IDENTITY_TOKEN_FILE"),de=!!(process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI||process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI);if(!Q&&!Z&&!se&&!le&&!de)return {autoload:false};let be={region:R};if(!se){let X=await Shell.install("@aws-sdk/credential-providers"),{pathToFileURL:H}=await import('url'),F=ke__default.join(X,"dist-cjs","index.js"),{fromNodeProviderChain:ne}=await import(H(F).href),V=Q?{profile:Q}:{};be.credentialProvider=ne(V);}let re=D?.options?.endpoint??D?.options?.baseURL;return re&&(be.baseURL=re),{autoload:true,options:be,async getModel(X,H,F){if(["global.","us.","eu.","jp.","apac.","au."].some(oe=>H.startsWith(oe)))return X.languageModel(H);let V=F?.region??R,J=V.split("-")[0];switch(J){case "us":{let oe=["nova-micro","nova-lite","nova-pro","nova-premier","nova-2","claude","deepseek"].some(me=>H.includes(me)),ae=V.startsWith("us-gov");oe&&!ae&&(H=`${J}.${H}`);break}case "eu":{let oe=["eu-west-1","eu-west-2","eu-west-3","eu-north-1","eu-central-1","eu-south-1","eu-south-2"].some(me=>V.includes(me)),ae=["claude","nova-lite","nova-micro","llama3","pixtral"].some(me=>H.includes(me));oe&&ae&&(H=`${J}.${H}`);break}case "ap":{let oe=["ap-southeast-2","ap-southeast-4"].includes(V),ae=V==="ap-northeast-1";oe&&["anthropic.claude-sonnet-4-5","anthropic.claude-haiku"].some(me=>H.includes(me))?(J="au",H=`${J}.${H}`):ae?["claude","nova-lite","nova-micro","nova-pro"].some(pe=>H.includes(pe))&&(J="jp",H=`${J}.${H}`):["claude","nova-lite","nova-micro","nova-pro"].some(pe=>H.includes(pe))&&(J="apac",H=`${J}.${H}`);break}}return X.languageModel(H)}}},nvidia:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.ai/","X-Title":"easbot"}}}),openrouter:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.cn/","X-Title":"easbot"}}}),vercel:async()=>({autoload:false,options:{headers:{"http-referer":"https://easbot.cn/","x-title":"easbot"}}}),"google-vertex":async()=>{let _=await it.get("GOOGLE_CLOUD_PROJECT")??it.get("GCP_PROJECT")??it.get("GCLOUD_PROJECT"),D=await it.get("GOOGLE_CLOUD_LOCATION")??it.get("VERTEX_LOCATION")??"us-east5";return !_?{autoload:false}:{autoload:true,vars(C){let E=D==="global"?"aiplatform.googleapis.com":`${D}-aiplatform.googleapis.com`;return {..._&&{GOOGLE_VERTEX_PROJECT:_},GOOGLE_VERTEX_LOCATION:D,GOOGLE_VERTEX_ENDPOINT:E}},options:{project:_,location:D,fetch:async(C,E)=>{let{GoogleAuth:R}=await import('google-auth-library'),Q=await(await new R().getApplicationDefault()).credential.getAccessToken(),Z=new Headers(E?.headers);return Z.set("Authorization",`Bearer ${Q.token}`),fetch(C,{...E,headers:Z})}},async getModel(C,E){let R=String(E).trim();return C.languageModel(R)}}},"google-vertex-anthropic":async()=>{let _=it.get("GOOGLE_CLOUD_PROJECT")??it.get("GCP_PROJECT")??it.get("GCLOUD_PROJECT"),D=it.get("GOOGLE_CLOUD_LOCATION")??it.get("VERTEX_LOCATION")??"global";return !_?{autoload:false}:{autoload:true,options:{project:_,location:D},async getModel(C,E){let R=String(E).trim();return C.languageModel(R)}}},"sap-ai-core":async()=>{let _=await et.get("sap-ai-core"),D=iife(()=>{let E=process.env.AICORE_SERVICE_KEY;if(E)return E;if(_?.type==="api")return process.env.AICORE_SERVICE_KEY=_.key,_.key}),O=process.env.AICORE_DEPLOYMENT_ID,C=process.env.AICORE_RESOURCE_GROUP;return {autoload:!!D,options:D?{deploymentId:O,resourceGroup:C}:{},async getModel(E,R){return E(R)}}},zenmux:async()=>({autoload:false,options:{headers:{"HTTP-Referer":"https://easbot.cn/","X-Title":"easbot"}}}),gitlab:async _=>{let D=it.get("GITLAB_INSTANCE_URL")||"https://gitlab.com",O=await et.get(_.id),C=await(async()=>O?.type==="oauth"?O.access:O?.type==="api"?O.key:it.get("GITLAB_TOKEN"))(),R=(await he.get()).provider?.gitlab,{VERSION:L,createGitLab:q}=await import('gitlab-ai-provider'),Q={"User-Agent":`easbot/${b$3.getVersion()} gitlab-ai-provider/${L} (${Mc.platform()} ${Mc.release()}; ${Mc.arch()})`,...R?.options?.aiGatewayHeaders||{}};return {autoload:!!C,options:{instanceUrl:D,apiKey:C,aiGatewayHeaders:Q,featureFlags:{duo_agent_platform_agentic_chat:true,duo_agent_platform:true,...R?.options?.featureFlags||{}}},async getModel(Z,se){return Z.agenticChat(se,{aiGatewayHeaders:Q,featureFlags:{duo_agent_platform_agentic_chat:true,duo_agent_platform:true,...R?.options?.featureFlags||{}}})}}},"cloudflare-workers-ai":async _=>{let D=it.get("CLOUDFLARE_ACCOUNT_ID");if(!D)return {autoload:false};let O=await iife(async()=>{let C=it.get("CLOUDFLARE_API_KEY");if(C)return C;let E=await et.get(_.id);if(E?.type==="api")return E.key});return {autoload:!!O,options:{apiKey:O,baseURL:`https://api.cloudflare.com/client/v4/accounts/${D}/ai/v1`},async getModel(C,E){return C.languageModel(E)}}},"cloudflare-ai-gateway":async _=>{let D=await it.get("CLOUDFLARE_ACCOUNT_ID"),O=await it.get("CLOUDFLARE_GATEWAY_ID");if(!D||!O)return {autoload:false};let C=await(async()=>{let Q=await it.get("CLOUDFLARE_API_TOKEN")||await it.get("CF_AIG_TOKEN");if(Q)return Q;let Z=await et.get(_.id);if(Z?.type==="api")return Z.key})();if(!C)throw new Error("CLOUDFLARE_API_TOKEN (or CF_AIG_TOKEN) is required for Cloudflare AI Gateway. Set it via environment variable or run `easbot auth cloudflare-ai-gateway`.");let{createAiGateway:E}=await import('ai-gateway-provider'),{createUnified:R}=await import('ai-gateway-provider/providers/unified'),L=E({accountId:D,gateway:O,apiKey:C}),q=R();return {autoload:true,async getModel(Q,Z,se){return L(q(Z))},options:{}}},cerebras:async()=>({autoload:false,options:{headers:{"X-Cerebras-3rd-Party-Integration":"easbot"}}}),ollama:async()=>{let _=await it.get("OLLAMA_BASE_URL")||"http://localhost:11434",D=a.file(),O=D?ke__default.dirname(D):"",C=a.getLevel();return s.debug("Ollama loader initialized",{baseURL:_,logDir:O,logLevel:C}),{autoload:true,options:{baseURL:_,logDir:O,logLevel:C},async getModel(E,R,L){s.debug("Ollama getModel called",{modelID:R,options:L,baseURL:_});let q=E.languageModel?E.languageModel(R):E(R);return s.debug("Ollama model created",{modelID:R}),q}}},"easbot-local":async()=>{let{Global:_}=await import('./global-KAF6JHVQ.mjs'),D=await it.get("LOCAL_MODEL_PATH")||ke__default.join(_.Path.cache,"models"),O=a.file(),C=O?ke__default.dirname(O):"",E=a.getLevel();s.debug("Local Model loader initialized",{modelsPath:D,logDir:C,logLevel:E});let{SUPPORTED_EMBEDDING_MODELS:R}=await import('@easbot/local-model-sdk');return {autoload:true,options:{cacheDir:D,logDir:C,logLevel:E,verbose:true},async getModel(L,q,Q){if(s.debug("Local Model getModel called",{modelID:q,options:Q,modelsPath:D}),q in R){s.debug("Creating embedding model",{modelID:q});let se=L.embeddingModel(q,Q);return s.debug("Embedding model created",{modelID:q}),se}else if(q.startsWith("rerank-")){s.debug("Creating rerank model",{modelID:q});let se=L.rerankingModel?L.rerankingModel(q.slice(6),Q):L(q);return s.debug("Language rerank created",{modelID:q}),se}else {s.debug("Creating language model",{modelID:q});let se=L.languageModel?L.languageModel(q,Q):L(q);return s.debug("Language model created",{modelID:q}),se}}}}};U.Model=z$1.object({id:z$1.string(),providerID:z$1.string(),api:z$1.object({id:z$1.string(),url:z$1.string(),npm:z$1.string()}),name:z$1.string(),family:z$1.string().optional(),capabilities:z$1.object({temperature:z$1.boolean(),reasoning:z$1.boolean(),attachment:z$1.boolean(),toolcall:z$1.boolean(),input:z$1.object({text:z$1.boolean(),audio:z$1.boolean(),image:z$1.boolean(),video:z$1.boolean(),pdf:z$1.boolean()}),output:z$1.object({text:z$1.boolean(),audio:z$1.boolean(),image:z$1.boolean(),video:z$1.boolean(),pdf:z$1.boolean()}),interleaved:z$1.union([z$1.boolean(),z$1.object({field:z$1.enum(["reasoning_content","reasoning_details"])})])}),cost:z$1.object({input:z$1.number(),output:z$1.number(),cache:z$1.object({read:z$1.number(),write:z$1.number()}),experimentalOver200K:z$1.object({input:z$1.number(),output:z$1.number(),cache:z$1.object({read:z$1.number(),write:z$1.number()})}).optional()}),limit:z$1.object({context:z$1.number(),input:z$1.number().optional(),output:z$1.number()}),status:z$1.enum(["alpha","beta","deprecated","active"]),options:z$1.record(z$1.string(),z$1.any()),headers:z$1.record(z$1.string(),z$1.string()),release_date:z$1.string(),variants:z$1.record(z$1.string(),z$1.record(z$1.string(),z$1.any())).optional()}).meta({ref:"Model"}),U.Info=z$1.object({id:z$1.string(),name:z$1.string(),source:z$1.enum(["env","config","custom","api"]),env:z$1.string().array(),key:z$1.string().optional(),options:z$1.record(z$1.string(),z$1.any()),models:z$1.record(z$1.string(),U.Model)}).meta({ref:"Provider"});function f(_,D){let O={id:D.id,providerID:_.id,name:D.name,family:D.family,api:{id:D.id,url:_.api,npm:D.provider?.npm??_.npm??"@ai-sdk/openai-compatible"},status:D.status??"active",headers:D.headers??{},options:D.options??{},cost:{input:D.cost?.input??0,output:D.cost?.output??0,cache:{read:D.cost?.cache_read??0,write:D.cost?.cache_write??0},experimentalOver200K:D.cost?.context_over_200k?{cache:{read:D.cost.context_over_200k.cache_read??0,write:D.cost.context_over_200k.cache_write??0},input:D.cost.context_over_200k.input,output:D.cost.context_over_200k.output}:void 0},limit:{context:D.limit.context??2e5,input:D.limit.input??o(D.limit.context??2e5),output:D.limit.output??8192},capabilities:{temperature:D.temperature,reasoning:D.reasoning,attachment:D.attachment,toolcall:D.tool_call,input:{text:D.modalities?.input?.includes("text")??false,audio:D.modalities?.input?.includes("audio")??false,image:D.modalities?.input?.includes("image")??false,video:D.modalities?.input?.includes("video")??false,pdf:D.modalities?.input?.includes("pdf")??false},output:{text:D.modalities?.output?.includes("text")??false,audio:D.modalities?.output?.includes("audio")??false,image:D.modalities?.output?.includes("image")??false,video:D.modalities?.output?.includes("video")??false,pdf:D.modalities?.output?.includes("pdf")??false},interleaved:D.interleaved??false},release_date:D.release_date,variants:{}};return O.variants=mapValues(vt.variants(O),C=>C),O}function m(_){return {id:_.id,source:"custom",name:_.name,env:_.env??[],options:{},models:mapValues(_.models,D=>f(_,D))}}U.fromModelsDevProvider=m;async function a$1(){var X=[];try{let _=c(X,s.time("state"));let D=await he.get();let O=await a$3.get();let C=mapValues(O,m);let E=new Set(D.disabled_providers??[]);let R=D.enabled_providers?new Set(D.enabled_providers):null;function L(V){return !(R&&!R.has(V)||E.has(V))}let q={};let Q=new Map;let Z={};let se=new Map;let le=new Map;s.info("init");let de=Object.entries(D.provider??{});if(C["github-copilot"]){let V=C["github-copilot"];C["github-copilot-enterprise"]={...V,id:"github-copilot-enterprise",name:"GitHub Copilot Enterprise",models:mapValues(V.models,J=>({...J,providerID:"github-copilot-enterprise"}))};}function be(V,J){let oe=q[V];if(oe){q[V]=mergeDeep(oe,J);return}let ae=C[V];ae&&(q[V]=mergeDeep(ae,J));}for(let[V,J]of de){let oe=C[V],ae={id:V,name:J.name??oe?.name??V,env:J.env??oe?.env??[],options:mergeDeep(oe?.options??{},J.options??{}),source:"config",models:oe?.models??{}};for(let[me,pe]of Object.entries(J.models??{})){let xe=ae.models[pe.id??me],He=iife(()=>pe.name?pe.name:pe.id&&pe.id!==me?me:xe?.name??me),Ie={id:me,api:{id:pe.id??xe?.api.id??me,npm:pe.provider?.npm??J.npm??xe?.api.npm??O[V]?.npm??"@ai-sdk/openai-compatible",url:J?.api??xe?.api.url??O[V]?.api??""},status:pe.status??xe?.status??"active",name:He,providerID:V,capabilities:{temperature:pe.temperature??xe?.capabilities.temperature??!1,reasoning:pe.reasoning??xe?.capabilities.reasoning??!1,attachment:pe.attachment??xe?.capabilities.attachment??!1,toolcall:pe.tool_call??xe?.capabilities.toolcall??!0,input:{text:pe.modalities?.input?.includes("text")??xe?.capabilities.input.text??!0,audio:pe.modalities?.input?.includes("audio")??xe?.capabilities.input.audio??!1,image:pe.modalities?.input?.includes("image")??xe?.capabilities.input.image??!1,video:pe.modalities?.input?.includes("video")??xe?.capabilities.input.video??!1,pdf:pe.modalities?.input?.includes("pdf")??xe?.capabilities.input.pdf??!1},output:{text:pe.modalities?.output?.includes("text")??xe?.capabilities.output.text??!0,audio:pe.modalities?.output?.includes("audio")??xe?.capabilities.output.audio??!1,image:pe.modalities?.output?.includes("image")??xe?.capabilities.output.image??!1,video:pe.modalities?.output?.includes("video")??xe?.capabilities.output.video??!1,pdf:pe.modalities?.output?.includes("pdf")??xe?.capabilities.output.pdf??!1},interleaved:pe.interleaved??!1},cost:{input:pe?.cost?.input??xe?.cost?.input??0,output:pe?.cost?.output??xe?.cost?.output??0,cache:{read:pe?.cost?.cache_read??xe?.cost?.cache.read??0,write:pe?.cost?.cache_write??xe?.cost?.cache.write??0}},options:mergeDeep(xe?.options??{},pe.options??{}),limit:{context:pe.limit?.context??xe?.limit?.context??2e5,input:pe.limit?.input??xe?.limit?.input??o(pe.limit?.context??2e5),output:pe.limit?.output??xe?.limit?.output??8192},headers:mergeDeep(xe?.headers??{},pe.headers??{}),family:pe.family??xe?.family??"",release_date:pe.release_date??xe?.release_date??"",variants:{}},we=mergeDeep(vt.variants(Ie),pe.variants??{});Ie.variants=mapValues(pickBy(we,ie=>!ie.disabled),ie=>omit(ie,["disabled"])),ae.models[me]=Ie;}C[V]=ae;}let re=await it.all();for(let[V,J]of Object.entries(C)){if(E.has(V))continue;let oe=J.env.map(ae=>re[ae]).find(Boolean);oe&&be(V,{source:"env",key:J.env.length===1?oe:void 0});}for(let[V,J]of Object.entries(await et.all()))E.has(V)||J.type==="api"&&be(V,{source:"api",key:J.key});for(let V of await Ss.list()){if(!V.auth)continue;let J=V.auth.provider;if(E.has(J))continue;let oe=!1,ae=await et.get(J);if(ae&&(oe=!0),J==="github-copilot"&&!oe&&await et.get("github-copilot-enterprise")&&(oe=!0),!!oe&&V.auth.loader){if(ae){let me=C[V.auth.provider];if(!me){s.error(`Auth provider ${V.auth.provider} not found in database`);return}let xe=await V.auth.loader(()=>et.get(J),me)??{},He=q[J]?{options:xe}:{source:"custom",options:xe};be(J,He);}if(J==="github-copilot"){let me="github-copilot-enterprise";if(!E.has(me)&&await et.get(me)){let xe=C[me];if(!xe){s.error(`Enterprise provider ${me} not found in database`);return}let Ie=await V.auth.loader(()=>et.get(me),xe)??{},we=q[me]?{options:Ie}:{source:"custom",options:Ie};be(me,we);}}}}for(let[V,J]of Object.entries(c$1)){if(E.has(V))continue;let oe=C[V];if(!oe){s.error("Provider does not exist in model list "+V);continue}let ae=await J(oe);if(ae&&(ae.autoload||q[V])){ae.getModel&&(Z[V]=ae.getModel);let me=ae.options??{},pe=q[V]?{options:me}:{source:"custom",options:me};be(V,pe);}}for(let[V,J]of de){let oe={source:"config"};J.env&&(oe.env=J.env),J.name&&(oe.name=J.name),J.options&&(oe.options=J.options),be(V,oe);}for(let[V,J]of Object.entries(q)){if(!L(V)){delete q[V];continue}let oe=D.provider?.[V];for(let[ae,me]of Object.entries(J.models)){me.api.id=me.api.id??me.id??ae,(ae==="gpt-5-chat-latest"||V==="openrouter"&&ae==="openai/gpt-5-chat")&&delete J.models[ae],me.status==="alpha"&&!a$2.EASBOT_ENABLE_EXPERIMENTAL_MODELS&&delete J.models[ae],me.status==="deprecated"&&delete J.models[ae],(oe?.blacklist?.includes(ae)||oe?.whitelist&&!oe.whitelist.includes(ae))&&delete J.models[ae],me.variants=mapValues(vt.variants(me),xe=>xe);let pe=oe?.models?.[ae]?.variants;if(pe&&me.variants){let xe=mergeDeep(me.variants,pe);me.variants=mapValues(pickBy(xe,He=>!He.disabled),He=>omit(He,["disabled"]));}}if(Object.keys(J.models).length===0){delete q[V];continue}s.info("found",{providerID:V});}return {models:Q,providers:q,sdk:se,localProxy:le,modelLoaders:Z}}catch(H){var F=H,ne=true;}finally{d(X,F,ne);}}let p;function d$1(){return p||(p=A.state(a$1)),p}async function h(){return d$1()()}async function w(){return (await h())?.providers??{}}U.list=w;async function g(){return (await h())?.localProxy??{}}U.getLocalProxy=g;async function b(_){try{var D=[];try{let R=c(D,s.time("getSDK",{providerID:_.providerID}));let L=await h();if(!L)throw new Error("Provider state not available");let q=L.providers[_.providerID];if(!q)throw new Error(`Provider ${_.providerID} not found`);let Q={...q.options};_.api.npm.includes("@ai-sdk/openai-compatible")&&Q.includeUsage!==!1&&(Q.includeUsage=!0);Q.baseURL||(Q.baseURL=_.api.url);Q.apiKey===void 0&&q.key&&(Q.apiKey=q.key);_.headers&&(Q.headers={...Q.headers,..._.headers});let Z=JSON.stringify({providerID:_.providerID,npm:_.api.npm,options:Q}).split("").reduce((xe,He)=>(xe=(xe<<5)-xe+He.charCodeAt(0),xe&xe),0);let se=L.sdk.get(Z);if(se)return se;let le=Q.fetch;Q.fetch=async(xe,He)=>{let Ie=le??fetch,we=He??{};if(Q.timeout!==void 0&&Q.timeout!==null){let ie=[];we.signal&&ie.push(we.signal),Q.timeout!==!1&&ie.push(AbortSignal.timeout(Q.timeout));let De=ie.length>1?AbortSignal.any(ie):ie[0];we.signal=De;}if(_.api.npm==="@ai-sdk/openai"&&we.body&&we.method==="POST"){let ie=JSON.parse(we.body);if(!(_.providerID.includes("azure")&&ie.store===!0)&&Array.isArray(ie.input)){for(let Ft of ie.input)"id"in Ft&&delete Ft.id;we.body=JSON.stringify(ie);}}return Ie(xe,{...we,timeout:!1})};let de=t_[_.api.npm];if(de){s.info("using bundled provider",{providerID:_.providerID,pkg:_.api.npm});let He=(await de())({name:_.providerID,...Q});return L.sdk.set(Z,He),He}let be;_.api.npm.startsWith("file://")?(s.info("loading local provider",{pkg:_.api.npm}),be=_.api.npm):be=await Shell.install(_.api.npm,"latest");let{pathToFileURL:re}=await import('url');let X=await import('path');let H=await import('fs/promises');let F=X.join(be,"package.json");let ne=JSON.parse(await H.readFile(F,"utf-8"));let V;ne.exports?.["."]?.import?V=ne.exports["."].import:ne.exports?.["."]?.require?V=ne.exports["."].require:ne.module?V=ne.module:ne.main?V=ne.main:V="index.js";let J=X.join(be,V);let oe=re(J).href;s.debug("Dynamic import",{npm:_.api.npm,entryPoint:V,fullPath:J,moduleURL:oe});let ae=await import(oe);let me=ae[Object.keys(ae).find(xe=>xe.startsWith("create"))];let pe=me({name:_.providerID,...Q});L.sdk.set(Z,pe);return pe}catch(O){var C=O,E=!0;}finally{d(D,C,E);}}catch(R){throw new U.InitError({providerID:_.providerID},{cause:R})}}async function v(_){return (await h())?.providers[_]}U.getProvider=v;async function k(_,D){let O=await h();if(!O)throw new Error("Provider state not available");let C=O.providers[_];if(!C){let R=Object.keys(O.providers),q=gb.go(_,R,{limit:3,threshold:-1e4}).map(Q=>Q.target);throw new U.ModelNotFoundError({providerID:_,modelID:D,suggestions:q})}let E=C.models[D];if(!E){let R=Object.keys(C.models),q=gb.go(D,R,{limit:3,threshold:-1e4}).map(Q=>Q.target);throw new U.ModelNotFoundError({providerID:_,modelID:D,suggestions:q})}return E}U.getModel=k;async function S(_){s.debug("getLanguage called",{providerID:_.providerID,modelID:_.id});let D=await h();if(!D)throw new Error("Provider state not available");let O=`${_.providerID}/${_.id}`;if(D.models.has(O))return s.debug("Model found in cache",{key:O}),D.models.get(O);let C=D.providers[_.providerID];if(!C)throw new Error(`Provider ${_.providerID} not found`);s.debug("Getting SDK for model",{providerID:_.providerID,modelID:_.id});let E=await b(_);s.debug("SDK obtained",{providerID:_.providerID});try{let R=D.modelLoaders[_.providerID];s.debug("Model loader check",{providerID:_.providerID,hasLoader:!!R,apiId:_.api.id,options:C.options});let L=R?await R(E,_.api.id,C.options):E.languageModel(_.api.id);return s.debug("Language model created",{providerID:_.providerID,modelID:_.id}),D.models.set(O,L),L}catch(R){throw s.error("Failed to create language model",{providerID:_.providerID,modelID:_.id,error:R}),R instanceof NoSuchModelError?new U.ModelNotFoundError({modelID:_.id,providerID:_.providerID},{cause:R}):R}}U.getLanguage=S;async function y(_,D){s.debug("getEmbedding called",{providerID:_,modelID:D});let O=await k(_,D),C=await b(O),E,R=C;if(typeof R.embeddingModel=="function")E=R.embeddingModel(O.api.id);else if(typeof R.textEmbeddingModel=="function")E=R.textEmbeddingModel(O.api.id);else throw new Error(`Provider ${_} does not support embedding model. SDK missing both 'embeddingModel' and 'textEmbeddingModel' methods.`);return s.debug("Embedding model created",{providerID:_,modelID:D}),E}U.getEmbedding=y;async function x(_,D){s.debug("getRerank called",{providerID:_,modelID:D});let O=await k(_,D),C=await b(O),E,R=C;if(typeof R.rerankingModel=="function")E=R.rerankingModel(O.api.id);else if(typeof R.languageModel=="function"){let L=await g(),q=`${_}/${D}`;if(q in L)return L[q];let Q=await S(O);if(Q){let Z=await k("easbot-local","rerank-proxy"),le=await b(Z);E=le.rerankingModel?le.rerankingModel(Z.api.id,{llm:Q,useEnhancedPrompt:true,promptLanguage:"cn",totalScore:1}):void 0,E&&L.set(q,E);}}if(!E)throw new Error(`Provider ${_} and model ${D} does not support rerank`);return s.debug("Rerank model created",{providerID:_,modelID:D}),E}U.getRerank=x;async function I(_,D){let O=await h();if(!O)return;let C=O.providers[_];if(C){for(let E of D)for(let R of Object.keys(C.models))if(R.includes(E))return {providerID:_,modelID:R}}}U.closest=I;async function P(_){let D=await he.get();if(D.small_model){let R=N(D.small_model);if(!R.providerID||!R.modelID)throw new Error("Invalid small_model format");return k(R.providerID,R.modelID)}let O=await h(),C=O?.providers[_];if(C){let R=["claude-haiku-4-5","claude-haiku-4.5","3-5-haiku","3.5-haiku","gemini-3-flash","gemini-2.5-flash","gpt-5-nano"];_.startsWith("easbot")&&(R=["gpt-5-nano"]),_.startsWith("github-copilot")&&(R=["gpt-5-mini","claude-haiku-4.5",...R]);for(let L of R)if(_==="amazon-bedrock"){let q=["global.","us.","eu."],Q=Object.keys(C.models).filter(de=>de.includes(L)),Z=Q.find(de=>de.startsWith("global."));if(Z)return k(_,Z);let se=C.options?.region;if(se){let de=se.split("-")[0];if(de==="us"||de==="eu"){let be=Q.find(re=>re.startsWith(`${de}.`));if(be)return k(_,be)}}let le=Q.find(de=>!q.some(be=>de.startsWith(be)));if(le)return k(_,le)}else for(let q of Object.keys(C.models))if(q.includes(L))return k(_,q)}if(O?.providers.easbot?.models["gpt-5-nano"])return k("easbot","gpt-5-nano")}U.getSmallModel=P;let T=["gpt-5","claude-sonnet-4","big-pickle","gemini-3-pro"];function M(_){return sortBy(_,[D=>T.findIndex(O=>D.id.includes(O)),"desc"],[D=>D.id.includes("latest")?0:1,"asc"],[D=>D.id,"desc"])}U.sort=M;async function j(){let _=await he.get();if(_.model)return N(_.model);let D=await w().then(C=>Object.values(C)).then(C=>C.find(E=>!_.provider||Object.keys(_.provider).includes(E.id)));if(!D)throw new Error("no providers found");let[O]=M(Object.values(D.models));if(!O)throw new Error("no models found");return {providerID:D.id,modelID:O.id}}U.defaultModel=j;function N(_){let{provider:D,model:O}=parseModelId(_);if(!D)throw new Error("Invalid model format: "+_);return {providerID:D,modelID:O}}U.parseModel=N,U.ModelNotFoundError=NamedError.create("ProviderModelNotFoundError",z$1.object({providerID:z$1.string(),modelID:z$1.string(),suggestions:z$1.array(z$1.string()).optional()})),U.InitError=NamedError.create("ProviderInitError",z$1.object({providerID:z$1.string()}));})(Ce||(Ce={}));var Rs;(c=>{let t=a.create({service:"session.summary"});function e(u){if(!u.startsWith('"')||!u.endsWith('"'))return u;let l=u.slice(1,-1),f=[];for(let m=0;m<l.length;m++){let a=l[m];if(a!=="\\"){f.push(a.charCodeAt(0));continue}let p=l[m+1];if(!p){f.push(92);continue}if(p>="0"&&p<="7"){let w=l.slice(m+1,m+4).match(/^[0-7]{1,3}/);if(!w){f.push(p.charCodeAt(0)),m++;continue}f.push(parseInt(w[0],8)),m+=w[0].length;continue}let d=p==="n"?`
1034
+ `:p==="r"?"\r":p==="t"?" ":p==="b"?"\b":p==="f"?"\f":p==="v"?"\v":p==="\\"||p==='"'?p:void 0;f.push((d??p).charCodeAt(0)),m++;}return Buffer.from(f).toString()}c.summarize=fn$1(z$1.object({sessionID:z$1.string(),messageID:z$1.string()}),async u=>{let l=await ee.messages({sessionID:u.sessionID});await Promise.all([o({sessionID:u.sessionID,messages:l}),s({messageID:u.messageID,messages:l})]);});async function o(u){let l=await i({messages:u.messages});await ee.update(u.sessionID,f=>{f.summary={additions:l.reduce((m,a)=>m+a.additions,0),deletions:l.reduce((m,a)=>m+a.deletions,0),files:l.length};}),await a$6.write(["session_diff",u.sessionID],l),await ue.publish(ee.Event.Diff,{sessionID:u.sessionID,diff:l});}async function s(u){let l=u.messages.filter(d=>d.info.id===u.messageID||d.info.role==="assistant"&&d.info.parentID===u.messageID),f=l.find(d=>d.info.id===u.messageID),m=f.info,a=await i({messages:l});m.summary={...m.summary,diffs:a},await ee.updateMessage(m);let p=f.parts.find(d=>d.type==="text"&&!d.synthetic);if(p&&!m.summary?.title){let d=await Ue.get("title");if(!d)return;let h=await gs.stream({agent:d,user:m,tools:{},model:d.model?await Ce.getModel(d.model.providerID,d.model.modelID):await Ce.getSmallModel(m.model.providerID)??await Ce.getModel(m.model.providerID,m.model.modelID),small:true,messages:[{role:"user",content:`
1035
+ The following is the text to summarize:
1036
+ <text>
1037
+ ${p?.text??""}
1038
+ </text>
1039
+ `}],abort:new AbortController().signal,sessionID:m.sessionID,system:[d.prompt??""],retries:3});t.debug("stream object received",{hasFullStream:!!h.fullStream,hasText:!!h.text,streamKeys:Object.keys(h)});let w=await h.text;t.debug("title",{title:w}),m.summary.title=w,await ee.updateMessage(m);}}c.diff=fn$1(z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message").optional()}),async u=>{let l=await a$6.read(["session_diff",u.sessionID]).catch(()=>[]),f=l.map(a=>{let p=e(a.file);return p===a.file?a:{...a,file:p}});return f.some((a,p)=>a.file!==l[p]?.file)&&a$6.write(["session_diff",u.sessionID],f).catch(()=>{}),f});async function i(u){let l,f;for(let m of u.messages){if(!l){for(let a of m.parts)if(a.type==="step-start"&&a.snapshot){l=a.snapshot;break}}for(let a of m.parts)a.type==="step-finish"&&a.snapshot&&(f=a.snapshot);}return l&&f?xt.diffFull(l,f):[]}c.computeDiff=i;})(Rs||(Rs={}));var Ro;(r=>{let t=a.create({service:"session.revert"});r.RevertInput=z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message"),partID:Identifier.schema("part").optional()});async function n(i){qe.assertNotBusy(i.sessionID);let c=await ee.messages({sessionID:i.sessionID}),u,l=await ee.get(i.sessionID),f,m=[];for(let a of c){a.info.role==="user"&&(u=a.info);let p=[];for(let d of a.parts){if(f){d.type==="patch"&&m.push(d);continue}if(!f){if(a.info.id===i.messageID&&!i.partID||d.id===i.partID){let h=p.some(w=>["text","tool"].includes(w.type))?i.partID:void 0;f={messageID:!h&&u?u.id:a.info.id,partID:h};}p.push(d);}}}if(f){let a=await ee.get(i.sessionID);f.snapshot=a.revert?.snapshot??await xt.track(),await xt.revert(m),f.snapshot&&(f.diff=await xt.diff(f.snapshot));let p=c.filter(h=>h.info.id>=f.messageID),d=await Rs.computeDiff({messages:p});return await a$6.write(["session_diff",i.sessionID],d),await ue.publish(ee.Event.Diff,{sessionID:i.sessionID,diff:d}),ee.update(i.sessionID,h=>{h.revert=f,h.summary={additions:d.reduce((w,g)=>w+g.additions,0),deletions:d.reduce((w,g)=>w+g.deletions,0),files:d.length};})}return l}r.revert=n;async function o(i){t.info("unreverting",i),qe.assertNotBusy(i.sessionID);let c=await ee.get(i.sessionID);return c.revert?(c.revert.snapshot&&await xt.restore(c.revert.snapshot),await ee.update(i.sessionID,l=>{l.revert=void 0;})):c}r.unrevert=o;async function s(i){if(!i.revert)return;let c=i.id,u=await ee.messages({sessionID:c}),l=i.revert.messageID,[f,m]=splitWhen(u,p=>p.info.id===l);u=f;for(let p of m)await a$6.remove(["message",c,p.info.id]),await ue.publish(ve.Event.Removed,{sessionID:c,messageID:p.info.id});let a=f.at(-1);if(i.revert.partID&&a){let p=i.revert.partID,[d,h]=splitWhen(a.parts,w=>w.id===p);a.parts=d;for(let w of h)await a$6.remove(["part",a.info.id,w.id]),await ue.publish(ve.Event.PartRemoved,{sessionID:c,messageID:a.info.id,partID:w.id});}await ee.update(c,p=>{p.revert=void 0;});}r.cleanup=s;})(Ro||(Ro={}));var Pb=a$5.define("command.executed",z$1.object({name:z$1.string(),sessionID:z$1.string(),arguments:z$1.union([z$1.string(),z$1.record(z$1.string(),z$1.unknown())]),messageID:z$1.string().optional()})),Eb=a.create({service:"command.executor"});z$1.object({sessionID:Identifier.schema("session"),agent:z$1.string(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),command:z$1.string()});z$1.object({messageID:Identifier.schema("message").optional(),sessionID:Identifier.schema("session"),agent:z$1.string().optional(),model:z$1.string().optional(),arguments:z$1.union([z$1.string(),z$1.record(z$1.string(),z$1.unknown())]),command:z$1.string(),variant:z$1.string().optional(),parts:z$1.array(z$1.discriminatedUnion("type",[ve.TextPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"TextPartInput"}),ve.FilePart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"FilePartInput"})])).optional()});var a_=/!`([^`]+)`/g;async function gd(t){let n=(await ve.filterCompacted(ve.stream(t))).filter(s=>s.info.role==="user").at(-1);if(!n)throw new Error("No user message found");let o=n.info;return await Ce.getModel(o.model.providerID,o.model.modelID)}async function c_(t){let e=[{type:"text",text:t}],n=a$a.files(t),o=new Set;for(let s of n){let r=s[1];if(!r||o.has(r))continue;o.add(r);let i=A.directory,c=ke__default.isAbsolute(r)?r:ke__default.resolve(i,r),u=Filesystem.stat(c);u&&(u.isDirectory()?e.push({type:"file",url:pathToFileURL(c).href,filename:r,mime:"application/x-directory"}):e.push({type:"file",url:pathToFileURL(c).href,filename:r,mime:"text/plain"}));}return e}var Ya;(n=>{async function t(o){let s=qe.start(o.sessionID);if(!s)throw new ee.BusyError(o.sessionID);let r=async()=>{(qe.state()[o.sessionID]?.callbacks??[]).length===0?await qe.cancel(o.sessionID):qe.loop({sessionID:o.sessionID,resume_existing:true}).catch(c=>{Eb.error("session loop failed to resume after shell command",{sessionID:o.sessionID,error:c});});};try{let i=await ee.get(o.sessionID);i.revert&&await Ro.cleanup(i);let c=await Ue.get(o.agent);if(!c)throw new Error(`Agent not found: ${o.agent}`);let u;o.model?u=await Ce.getModel(o.model.providerID,o.model.modelID):c.model?u=await Ce.getModel(c.model.providerID,c.model.modelID):u=await gd(o.sessionID);let l={id:Identifier.ascending("message"),sessionID:o.sessionID,time:{created:Date.now()},role:"user",agent:o.agent,model:{providerID:u.providerID,modelID:u.id}};await ee.updateMessage(l);let f={type:"text",id:Identifier.ascending("part"),messageID:l.id,sessionID:o.sessionID,text:"The following tool was executed by the user",synthetic:!0};await ee.updatePart(f);let m={id:Identifier.ascending("message"),sessionID:o.sessionID,parentID:l.id,mode:o.agent,agent:o.agent,cost:0,path:{cwd:A.directory,root:A.worktree},time:{created:Date.now()},role:"assistant",tokens:{input:0,output:0,reasoning:0,cache:{read:0,write:0}},modelID:u.id,providerID:u.providerID};await ee.updateMessage(m);let a={type:"tool",id:Identifier.ascending("part"),messageID:m.id,sessionID:o.sessionID,tool:"bash",callID:ulid(),state:{status:"running",time:{start:Date.now()},input:{command:o.command}}};await ee.updatePart(a);let p=Shell.acceptable(),d=await Promise.resolve(p),h=(process.platform==="win32"?ke__default.win32.basename(d??"",".exe"):ke__default.basename(d??"")).toLowerCase(),w={nu:{args:["-c",o.command]},fish:{args:["-c",o.command]},zsh:{args:["-c","-l",`
1040
+ [[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true
1041
+ [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true
1042
+ eval ${JSON.stringify(o.command)}
1043
+ `]},bash:{args:["-c","-l",`
1044
+ shopt -s expand_aliases
1045
+ [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true
1046
+ eval ${JSON.stringify(o.command)}
1047
+ `]},cmd:{args:["/c",o.command]},powershell:{args:["-NoProfile","-Command",o.command]},pwsh:{args:["-NoProfile","-Command",o.command]},"":{args:["-c",`${o.command}`]}},b=(w[h]??w[""])?.args??[];process.platform==="win32"&&(h==="cmd"?b=["/c",`chcp 65001 >nul 2>&1 && ${o.command}`]:(h==="powershell"||h==="pwsh")&&(b=["-NoProfile","-Command",`[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; ${o.command}`]));let v=A.directory,S=(await je.triggerEvent(HookEvent.ShellEnv,{cwd:v},{cwd:v})).output?.env??{},y=spawn(d??"sh",b,{cwd:v,detached:process.platform!=="win32",stdio:["ignore","pipe","pipe"],env:{...process.env,...S,TERM:"dumb",LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8"}}),x="";y.stdout?.on("data",j=>{x+=j.toString("utf-8"),a.state.status==="running"&&(a.state.metadata={output:x,description:""},ee.updatePart(a));}),y.stderr?.on("data",j=>{x+=j.toString("utf-8"),a.state.status==="running"&&(a.state.metadata={output:x,description:""},ee.updatePart(a));});let I=!1,P=!1,T=()=>Shell.killTree(y,{exited:()=>P});s.aborted&&(I=!0,await T());let M=()=>{I=!0,T();};return s.addEventListener("abort",M,{once:!0}),await new Promise(j=>{y.on("close",()=>{P=!0,s.removeEventListener("abort",M),j();});}),I&&(x+=`
1048
+
1049
+ `+["<metadata>","User aborted the command","</metadata>"].join(`
1050
+ `)),m.time={...m.time,completed:Date.now()},await ee.updateMessage(m),a.state.status==="running"&&(a.state={status:"completed",time:{...a.state.time,end:Date.now()},input:a.state.input,title:"",metadata:{output:x,description:""},output:x},await ee.updatePart(a)),{info:m,parts:[a],title:"Shell Command",metadata:{command:o.command},output:x,success:!I}}finally{await r();}}n.shell=t;async function e(o){Eb.debug("command",o);let s=await gn.get(o.command);if(!s)throw new Error(`Command not found: ${o.command}`);if(await je.triggerEvent(HookEvent.CommandBefore,{command:o.command,sessionID:o.sessionID,arguments:o.arguments},{sessionID:o.sessionID}),s.commandType==="local"){let y={sessionID:o.sessionID,directory:A.worktree,model:o.model,agent:s.agent??o.agent??await Ue.defaultAgent(),arguments:o.arguments},x=await s.execute(o.arguments,y);x.metadata.commandType="local";let I={...x,success:x.success,error:x.metadata?.error};return await ue.publish(Pb,{name:o.command,sessionID:o.sessionID,arguments:o.arguments}),await je.triggerEvent(HookEvent.CommandAfter,{command:o.command,sessionID:o.sessionID,arguments:o.arguments,result:I},{sessionID:o.sessionID}),I}let r=s.agent??o.agent??await Ue.defaultAgent(),i={sessionID:o.sessionID,directory:A.worktree,model:o.model,agent:r,arguments:o.arguments},u=(await s.execute(o.arguments,i)).output,l=u,f=a$a.shell(l);if(f.length>0){let y=await Promise.all(f.map(async([,I])=>{try{return await $`${{raw:I}}`.quiet().nothrow().text()}catch(P){return `Error executing command: ${P instanceof Error?P.message:String(P)}`}})),x=0;l=l.replace(a_,()=>y[x++]??"");}l=l.trim();let a=await(async()=>{if(s.model)return Ce.parseModel(s.model);if(s.agent){let x=await Ue.get(s.agent);if(x?.model)return x.model}if(o.model)return Ce.parseModel(o.model);let y=await gd(o.sessionID);return {providerID:y.providerID,modelID:y.id}})();try{await Ce.getModel(a.providerID,a.modelID);}catch(y){if(Ce.ModelNotFoundError.isInstance(y)){let{providerID:x,modelID:I,suggestions:P}=y.data,T=P&&P.length>0?` Did you mean: ${P.join(", ")}?`:"";await ue.publish(ee.Event.Error,{sessionID:o.sessionID,error:new NamedError.Unknown({message:`Model not found: ${x}/${I}.${T}`}).toObject()});}throw y}let p=await Ue.get(r);if(!p){let y=await Ue.list().then(P=>P.filter(T=>!T.hidden).map(T=>T.name)),x=y.length>0?` Available agents: ${y.join(", ")}`:"",I=new NamedError.Unknown({message:`Agent not found: "${r}".${x}`});throw await ue.publish(ee.Event.Error,{sessionID:o.sessionID,error:I.toObject()}),I}let d=await c_(l),h=[],w=s.subtask===true,g=Identifier.ascending("task"),b=w?[{type:"subtask",taskId:g,agent:p.name,description:s.description??"",command:o.command,model:{providerID:a.providerID,modelID:a.modelID},prompt:[...d??[],...h].find(y=>y.type==="text")?.text??""}]:[...d??[],...h,...o.parts??[]],v=w?o.agent??await Ue.defaultAgent():r,k=w?o.model?Ce.parseModel(o.model):{providerID:(await gd(o.sessionID)).providerID,modelID:(await gd(o.sessionID)).id}:a,S=await qe.prompt({sessionID:o.sessionID,messageID:o.messageID,model:k,agent:v,parts:b,variant:o.variant});return await ue.publish(Pb,{name:o.command,sessionID:o.sessionID,arguments:o.arguments,messageID:S.info.id}),await je.triggerEvent(HookEvent.CommandAfter,{command:o.command,sessionID:o.sessionID,arguments:o.arguments,result:{info:S.info,parts:S.parts,success:true}},{sessionID:o.sessionID}),{info:S.info,parts:S.parts,title:o.command,metadata:{command:o.command,arguments:o.arguments,commandType:"prompt"},output:u,success:true}}n.execute=e;})(Ya||(Ya={}));var yd=a.create({service:"tool.builder"}),bd;(r=>{function t(i){return (c,u)=>({sessionID:i.sessionID,abort:u.abortSignal??new AbortController().signal,messageID:i.processor?.message.id??"",callID:u.toolCallId,extra:{model:i.model,bypassAgentCheck:i.bypassAgentCheck,directory:i.session.directory},agent:i.agentName,messages:i.messages??[],protocolMetadata:i.protocolMetadata,metadata:async l=>{if(!i.processor)return;let f=i.processor.partFromToolCall(u.toolCallId);f&&f.state.status==="running"&&await ee.updatePart({...f,state:{title:l.title,metadata:l.metadata,status:"running",input:c,time:{start:Date.now()}}});},ask:async l=>{await Me.ask({...l,sessionID:i.sessionID,tool:{messageID:i.processor?.message.id??"",callID:u.toolCallId??""},ruleset:Me.merge(i.agent.permission,i.session.permission??[])});}})}async function e(i$1){var P=[];try{let{agent:c$1,session:u,model:l,userTools:f,messages:m,userMessageID:a,processor:p,bypassAgentCheck:d,protocolMetadata:h,includeMCP:w=!0,includeBuiltIn:g=!0,toolFilter:b}=i$1;let v=c(P,yd.time("buildTools"));let k=u.id;let S=u.contextMode??f$1;let y=t({sessionID:k,session:u,agent:c$1,model:l,agentName:c$1.name,messages:m??[],protocolMetadata:h,bypassAgentCheck:d,processor:p,userMessageID:a});let x={};if(g){let N=await ro.tools({providerID:l.providerID,modelID:l.api.id},c$1);for(let K of N){if(b&&!b(K.id))continue;let te=K.scope??i;if(te!=="all"&&te!==S)continue;let U=vt.schema(l,u_.toJSONSchema(K.parameters));x[K.id]=tool({description:K.description,inputSchema:jsonSchema(U),async execute(_,D){let O=y(_,D);await je.triggerEvent(HookEvent.ToolBefore,{tool:K.id,sessionID:O.sessionID,userMessageID:a,callID:O.callID??""},{sessionID:O.sessionID});let C=await K.execute(_,O);return await je.triggerEvent(HookEvent.ToolAfter,{tool:K.id,sessionID:O.sessionID,userMessageID:a,callID:O.callID??"",args:_},{sessionID:O.sessionID}),C}});}}if(w)try{let N=await ze.tools(),K=await ze.configInfo();for(let[te,U]of Object.entries(N)){if(b&&!b(te))continue;let _=te.split("_")[0];if(_){let C=K[_];if(C){let E=C.scope??i;if(E!=="all"&&E!==S)continue}}let D=U.execute;if(!D)continue;let O=vt.schema(l,await asSchema(U.inputSchema).jsonSchema);U.inputSchema=jsonSchema(O),U.execute=async(C,E)=>{let R=y(C,E);await je.triggerEvent(HookEvent.ToolBefore,{tool:te,sessionID:R.sessionID,userMessageID:a,callID:E.toolCallId},{sessionID:R.sessionID}),await R.ask({permission:te,metadata:{},patterns:["*"],always:["*"]});let L=await D(C,E);await je.triggerEvent(HookEvent.ToolAfter,{tool:te,sessionID:R.sessionID,userMessageID:a,callID:E.toolCallId,args:C},{sessionID:R.sessionID});let q=[],Q=[];for(let le of L.content)if(le.type==="text")q.push(le.text);else if(le.type==="image")Q.push({id:Identifier.ascending("part"),sessionID:k,messageID:p?.message.id??"",type:"file",mime:le.mimeType,url:`data:${le.mimeType};base64,${le.data}`});else if(le.type==="resource"){let{resource:de}=le;de.text&&q.push(de.text),de.blob&&Q.push({id:Identifier.ascending("part"),sessionID:k,messageID:p?.message.id??"",type:"file",mime:de.mimeType??"application/octet-stream",url:`data:${de.mimeType??"application/octet-stream"};base64,${de.blob}`,filename:de.uri});}let Z=await Ke.output(q.join(`
1051
+
1052
+ `),{},c$1);return {title:"",metadata:{...L.metadata??{},truncated:Z.truncated,...Z.truncated&&{outputPath:Z.outputPath}},output:Z.content,attachments:Q,content:L.content}},x[te]=U;}}catch(N){yd.error("Failed to load MCP tools",{error:N});}let I=n(x,c$1,f);yd.debug("built tools",{count:Object.keys(I).length,includeBuiltIn:g,includeMCP:w,contextMode:S,userToolsDisabled:Object.entries(f??{}).filter(([,N])=>N===!1).map(([N])=>N)});return I}catch(T){var M=T,j=true;}finally{d(P,M,j);}}r.buildTools=e;function n(i,c,u){let l=Me.disabled(Object.keys(i),c.permission),f={...i};for(let m of Object.keys(f))(u?.[m]===false||l.has(m))&&delete f[m];return f}async function o(i={}){let{includeMCP:c=true,includeBuiltIn:u=true,toolFilter:l}=i,f=[];if(u){let m=await ro.ids();for(let a of m)l&&!l(a)||f.push(a);}if(c)try{let m=await ze.tools();for(let a of Object.keys(m))l&&!l(a)||f.includes(a)||f.push(a);}catch(m){yd.error("Failed to load MCP tools",{error:m});}return f}r.listTools=o;async function s(i){let c=await ro.ids();if(Array.isArray(c)&&c.includes(i))return true;try{let u=await ze.tools();return i in u}catch{return false}}r.hasTool=s;})(bd||(bd={}));globalThis.AI_SDK_LOG_WARNINGS=false;var qe;(y=>{let t=a.create({service:"session.prompt"}),e$1;function n(){return e$1||(e$1=A.state(()=>({}),async x=>{for(let I of Object.values(x))I.abort.abort();})),e$1}function o(){return n()()}y.state=o;function s(x){if(o()[x])throw new ee.BusyError(x)}y.assertNotBusy=s,y.PromptInput=z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message").optional(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),agent:z$1.string().optional(),contextMode:z$1.enum(e).optional(),noReply:z$1.boolean().optional(),tools:z$1.record(z$1.string(),z$1.boolean()).optional().describe("@deprecated tools and permissions have been merged, you can set permissions on the session itself now"),system:z$1.string().optional(),variant:z$1.string().optional(),parts:z$1.array(z$1.discriminatedUnion("type",[ve.TextPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"TextPartInput"}),ve.FilePart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"FilePartInput"}),ve.AgentPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"AgentPartInput"}),ve.SubtaskPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"SubtaskPartInput"}),ve.SubtaskResultPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"SubtaskResultPartInput"}),ve.MemoryPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"MemoryPartInput"})]))}),y.prompt=fn$1(y.PromptInput,async x=>{let I=await ee.get(x.sessionID);await Ro.cleanup(I),x.contextMode&&(await ee.update(I.id,M=>{M.contextMode=x.contextMode;}),I.contextMode=x.contextMode);let P=await w(x);await ee.touch(x.sessionID);let T=[];for(let[M,j]of Object.entries(x.tools??{}))T.push({permission:M,action:j?"allow":"deny",pattern:"*"});return T.length>0&&(I.permission=T,await ee.update(I.id,M=>{M.permission=T;})),x.noReply===true?P:(0, y.loop)({sessionID:x.sessionID})});async function c$1(x){let I=[{type:"text",text:x}],P=a$a.files(x),T=new Set;return await Promise.all(P.map(async M=>{let j=M[1];if(!j||T.has(j))return;T.add(j);let N=j.startsWith("~/")?ke__default.join(Mc.homedir(),j.slice(2)):ke__default.resolve(A.worktree,j),K=await Ot__default.stat(N).catch(()=>{});if(K){if(K.isDirectory()){I.push({type:"file",url:pathToFileURL(N).href,filename:j,mime:"application/x-directory"});return}I.push({type:"file",url:pathToFileURL(N).href,filename:j,mime:"text/plain"});}})),I}y.resolvePromptParts=c$1;function u(x){let I=o();if(I[x])return;let P=new AbortController;return I[x]={abort:P,callbacks:[]},P.signal}y.start=u;function l(x){let I=o();if(I[x])return I[x].abort.signal}y.resume=l;async function f(x){t.info("cancel",{sessionID:x});let I=o(),P=I[x];if(!P){await Ut.set(x,{type:"idle"});return}for(let T of P.callbacks)T.reject(new Error("Session aborted"));P.callbacks=[],P.abort.abort(),delete I[x],await Ut.set(x,{type:"idle"});}y.cancel=f,y.LoopInput=z$1.object({sessionID:Identifier.schema("session"),resume_existing:z$1.boolean().optional()}),y.loop=fn$1(y.LoopInput,async x=>{var O=[];try{let{sessionID:I,resume_existing:P}=x;let T=P?l(I):u(I);if(!T)return new Promise((q,Q)=>{let Z=o()[I]?.callbacks;if(!Z){let se=o()[I]?.callbacks;se&&se.push({resolve:q,reject:Q});return}Z.push({resolve:q,reject:Q});});let M=c(O,defer(async()=>await f(I)),!0);let j=0;let N=await ee.get(I);for(;;){var K=[];try{await Ut.set(I,{type:"busy"});t.info("loop",{step:j,sessionID:I});if(T.aborted)break;let q=await je.triggerEvent(HookEvent.LoopStart,{sessionID:I,step:j,lastUserId:"",result:"start"},{sessionID:I});if(q.modified&&q.output?.result==="stop"){t.info("exiting loop due to hook",{sessionID:I});break}let Q=await ve.filterCompacted(ve.stream(I));let Z;let se;let le;let de;let be=[];for(let Ie=Q.length-1;Ie>=0;Ie--){let we=Q[Ie];if(!we)continue;if(!Z&&we.info.role==="user"&&(Z=we.info,se=we),!le&&we.info.role==="assistant"&&(le=we.info),!de&&we.info.role==="assistant"&&we.info.finish&&(de=we),Z&&de)break;let ie=we.parts.filter(De=>De.type==="compaction"||De.type==="subtask");ie.length>0&&!de&&be.push(...ie);}if(!Z)throw new Error("No user message found in stream. This should never happen.");if(le?.finish&&!["tool-calls","unknown"].includes(le.finish)&&Z.id<le.id){t.info("exiting loop",{sessionID:I});break}j++;j===1&&await S({session:N,modelID:Z.model.modelID,providerID:Z.model.providerID,history:Q});let re=await Ce.getModel(Z.model.providerID,Z.model.modelID).catch(async Ie=>{if(Ce.ModelNotFoundError.isInstance(Ie)){let we=Ie.data.suggestions&&Ie.data.suggestions.length>0?` Did you mean: ${Ie.data.suggestions.join(", ")}?`:"";await ue.publish(ee.Event.Error,{sessionID:I,error:new NamedError.Unknown({message:`Model not found: ${Ie.data.providerID}/${Ie.data.modelID}.${we}`}).toObject()});}throw Ie});let X=be.pop();if(X?.type==="subtask"){let Ie=await Ca.init(),we=X.model?await Ce.getModel(X.model.providerID,X.model.modelID):re,ie=await ee.updateMessage({id:Identifier.ascending("message"),role:"assistant",parentID:Z.id,sessionID:I,mode:X.agent,agent:X.agent,variant:Z.variant,path:{cwd:A.directory,root:A.worktree},cost:0,tokens:{input:0,output:0,reasoning:0,cache:{read:0,write:0}},modelID:we.id,providerID:we.providerID,time:{created:Date.now()}}),De=await ee.updatePart({id:Identifier.ascending("part"),messageID:ie.id,sessionID:ie.sessionID,type:"tool",callID:ulid(),tool:Ca.id,state:{status:"running",input:{prompt:X.prompt,description:X.description,subagent_type:X.agent,command:X.command},time:{start:Date.now()}}}),Ae={operation:"create",prompt:X.prompt,description:X.description,subagent_type:X.agent};await je.triggerEvent(HookEvent.ToolBefore,{tool:"task",sessionID:I,userMessageID:ie.parentID,callID:De.id},{sessionID:I});let Ft,Ln=await Ue.get(X.agent);if(!Ln)throw new Error(`Task agent not found: ${X.agent}`);let Jn={agent:X.agent,messageID:ie.id,sessionID:I,abort:T,callID:De.callID,extra:{bypassAgentCheck:!0},messages:Q,async metadata(Qt){await ee.updatePart({...De,type:"tool",state:{...De.state,...Qt}});},async ask(Qt){await Me.ask({...Qt,sessionID:I,ruleset:Me.merge(Ln.permission,N.permission??[])});}},Nn=await Ie.execute(Ae,Jn).catch(Qt=>{Ft=Qt,t.error("subtask execution failed",{error:Qt,agent:X.agent,description:X.description});});if(await je.triggerEvent(HookEvent.ToolAfter,{tool:"task",sessionID:I,userMessageID:ie.parentID,callID:De.id,args:Ae},{sessionID:I}),ie.finish="tool-calls",ie.time.completed=Date.now(),await ee.updateMessage(ie),Nn&&De.state.status==="running"){let Qt;Nn.attachments&&Nn.attachments.length>0&&(Qt=Nn.attachments.map(kt=>({...kt,id:kt.id??Identifier.ascending("part"),sessionID:kt.sessionID??De.sessionID,messageID:kt.messageID??De.messageID}))),await ee.updatePart({...De,state:{status:"completed",input:De.state.input,title:Nn.title,metadata:Nn.metadata,output:Nn.output,attachments:Qt,time:{...De.state.time,end:Date.now()}}});}if(Nn||await ee.updatePart({...De,state:{status:"error",error:Ft?`Tool execution failed: ${Ft.message}`:"Tool execution failed",time:{start:De.state.status==="running"?De.state.time.start:Date.now(),end:Date.now()},metadata:De.metadata,input:De.state.input}}),X.command){let Qt={id:Identifier.ascending("message"),sessionID:I,role:"user",time:{created:Date.now()},agent:Z.agent,model:Z.model};await ee.updateMessage(Qt),await ee.updatePart({id:Identifier.ascending("part"),messageID:Qt.id,sessionID:I,type:"text",text:"Summarize the task tool output above and continue with your task.",synthetic:!0});}continue}if(X?.type==="compaction"){if(await mn.compactConversation({messages:Q,parentID:Z.id,abort:T,sessionID:I,auto:X.auto})==="stop")break;continue}let H=await Ue.get(Z.agent);if(!H)throw new Error(`Agent not found: ${Z.agent}`);let F=H.steps??1/0;let ne=j>=F;let V=Gr.create({assistantMessage:await ee.updateMessage({id:Identifier.ascending("message"),parentID:Z.id,role:"assistant",mode:H.name,agent:H.name,variant:Z.variant,path:{cwd:A.directory,root:A.worktree},cost:0,tokens:{input:0,output:0,reasoning:0,cache:{read:0,write:0}},modelID:re.id,providerID:re.providerID,time:{created:Date.now()},sessionID:I}),sessionID:I,model:re,abort:T});let J=c(K,defer(()=>ir.clear(V.message.id)),!0);let oe=Q.findLast(Ie=>Ie.info.role==="user");let ae=oe?.parts.some(Ie=>Ie.type==="agent")??!1;let me=await To.getProtocolMetadata(H);let pe=await bd.buildTools({agent:H,session:N,model:re,userTools:Z.tools,processor:{message:{id:V.message.id,parentID:V.message.parentID},partFromToolCall:Ie=>V.partFromToolCall(Ie)},bypassAgentCheck:ae,messages:Q,protocolMetadata:me,userMessageID:V.message.parentID});let xe=await To.build({sessionID:I,userMessage:se,user:Z,messages:Q,model:re,agent:H,session:N,tools:pe,isLastStep:ne,step:j,lastFinished:de,maxMessages:100,mode:N.contextMode});if(xe.metadata.needsCompaction){await mn.create({sessionID:I,agent:"compaction",model:Z.model,auto:!0});continue}let He=await V.process({user:Z,agent:H,abort:T,sessionID:I,system:xe.system,messages:xe.messages,tools:pe,model:re,mode:xe.metadata.mode});if(He==="stop"){let Ie=await je.triggerEvent(HookEvent.LoopEnd,{sessionID:I,step:j,lastUserId:Z.id,result:"stop"},{sessionID:I});if(Ie.modified&&Ie.output.result==="continue")continue;break}He==="compact"&&await mn.create({sessionID:I,agent:"compaction",model:Z.model,auto:!0});}catch(te){var U=te,_=!0;}finally{var D=d(K,U,_);D&&await D;}}await mn.prune({sessionID:I});for await(let q of ve.stream(I)){if(q.info.role==="user")continue;let Q=o()[I]?.callbacks??[];for(let Z of Q)Z.resolve(q);return q}throw new Error("Impossible")}catch(C){var E=C,R=true;}finally{var L=d(O,E,R);L&&await L;}});async function p(x){for await(let I of ve.stream(x))if(I.info.role==="user"&&I.info.model)return I.info.model;return Ce.defaultModel()}y.lastModel=p;async function d$1(x){for await(let I of ve.stream(x))if(I.info.role==="user"&&I.info.agent)return I.info.agent;return await Ue.defaultAgent()}y.lastAgent=d$1;async function h(x){for await(let I of ve.stream(x))if(I.info.role==="user")return I.info}y.lastUserMessage=h;async function w(x){var te=[];try{let I=await Ue.get(x.agent??await Ue.defaultAgent());if(!I)throw new Error(`Agent not found: ${x.agent}`);let P=x.model??I.model??await p(x.sessionID);let T=!x.variant&&I.variant&&P.providerID?await Ce.getModel(P.providerID,P.modelID).catch(()=>{}):void 0;let M=x.variant??(I.variant&&T?.variants?.[I.variant]?I.variant:void 0);let j={id:x.messageID??Identifier.ascending("message"),role:"user",sessionID:x.sessionID,time:{created:Date.now()},tools:x.tools,agent:I.name,model:{providerID:P.providerID,modelID:P.modelID},system:x.system,variant:M};let N=c(te,defer(()=>ir.clear(j.id)),!0);let K=await Promise.all(x.parts.map(async C=>{if(C.type==="file"){if(C.source?.type==="resource"){let{clientName:R,uri:L}=C.source;t.info("mcp resource",{clientName:R,uri:L,mime:C.mime});let q=[{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Reading MCP resource: ${C.filename} (${L})`}];try{let Q=await ze.readResource(R,L);if(!Q)throw new Error(`Resource not found: ${R}/${L}`);let Z=Array.isArray(Q.contents)?Q.contents:[Q.contents];for(let se of Z)if("text"in se&&se.text)q.push({id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:se.text});else if("blob"in se&&se.blob){let le="mimeType"in se?se.mimeType:C.mime;q.push({id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`[Binary content: ${le}]`});}q.push({...C,id:C.id??Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID});}catch(Q){t.error("failed to read MCP resource",{error:Q,clientName:R,uri:L});let Z=Q instanceof Error?Q.message:String(Q);q.push({id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Failed to read MCP resource ${C.filename}: ${Z}`});}return q}let E=new URL(C.url);switch(E.protocol){case "data:":if(C.mime==="text/plain")return [{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Called the Read tool with the following input: ${JSON.stringify({filePath:C.filename})}`},{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:Buffer.from(C.url,"base64url").toString()},{...C,id:C.id??Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID}];break;case "file:":{t.info("file",{mime:C.mime});let R=fileURLToPath(C.url),L;try{L=await Ot__default.stat(R);}catch{L=void 0;}if(L?.isDirectory()&&(C.mime="application/x-directory"),C.mime==="text/plain"){let q,Q,Z={start:E.searchParams.get("start"),end:E.searchParams.get("end")};if(Z.start!=null){let de=C.url.split("?")[0]??"",be=parseInt(Z.start,10),re=Z.end?parseInt(Z.end,10):void 0;if(be===re){let X=fileURLToPath(de),H=await Ve.documentSymbol({file:X}).catch(()=>[]);for(let F of H){let ne;if("range"in F?ne=F.range:"location"in F&&(ne=F.location.range),ne?.start?.line&&ne?.start?.line===be){be=ne.start.line,re=ne?.end?.line??be;break}}}q=Math.max(be-1,0),re&&(Q=re-q);}let se={filePath:R,offset:q,limit:Q},le=[{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Called the Read tool with the following input: ${JSON.stringify(se)}`}];return await jl.init().then(async de=>{let be=await Ce.getModel(j.model.providerID,j.model.modelID),re={sessionID:x.sessionID,abort:new AbortController().signal,agent:x.agent,messageID:j.id,extra:{bypassCwdCheck:!0,model:be},messages:[],metadata:async()=>{},ask:async()=>{}},X=await de.execute(se,re);le.push({id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:X.output}),X.attachments&&X.attachments.length>0?le.push(...X.attachments.map(H=>({...H,id:H.id??Identifier.ascending("part"),synthetic:!0,filename:H.filename??C.filename,messageID:j.id,sessionID:x.sessionID}))):le.push({...C,id:C.id??Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID});}).catch(async de=>{t.error("failed to read file",{error:de});let be=de instanceof Error?de.message:de.toString();await ue.publish(ee.Event.Error,{sessionID:x.sessionID,error:new NamedError.Unknown({message:be}).toObject()}),le.push({id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Read tool failed to read ${R} with the following error: ${be}`});}),le}if(C.mime==="application/x-directory"){let q={path:R,limit:100},Q={sessionID:x.sessionID,abort:new AbortController().signal,agent:x.agent,messageID:j.id,extra:{bypassCwdCheck:!0},messages:[],metadata:async()=>{},ask:async()=>{}},Z=await Bl.init().then(se=>se.execute(q,Q));return [{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:`Called the list tool with the following input: ${JSON.stringify(q)}`},{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:Z.output},{...C,id:C.id??Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID}]}else {let q=await Ot__default.readFile(R);return qn.read(x.sessionID,R),[{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",text:`Called the Read tool with the following input: {"filePath":"${R}"}`,synthetic:!0},{id:C.id??Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"file",url:`data:${C.mime};base64,`+Buffer.from(q).toString("base64"),mime:C.mime,filename:C.filename,source:C.source}]}}}}if(C.type==="agent"){let R=Me.evaluate("task",C.name,I.permission).action==="deny"?" . Invoked by user; guaranteed to exist.":"";return [{id:Identifier.ascending("part"),...C,messageID:j.id,sessionID:x.sessionID},{id:Identifier.ascending("part"),messageID:j.id,sessionID:x.sessionID,type:"text",synthetic:!0,text:" Use the above message and context to generate a prompt and call the task tool with subagent: "+C.name+R}]}return [{id:Identifier.ascending("part"),...C,messageID:j.id,sessionID:x.sessionID}]})).then(C=>C.flat());await je.triggerEvent(HookEvent.MessageReceive,{sessionID:x.sessionID,agent:x.agent,model:x.model,userMessageID:j.id,messageID:x.messageID,variant:x.variant});await ee.updateMessage(j);for(let C of K)await ee.updatePart(C);return {info:j,parts:K}}catch(U){var _=U,D=true;}finally{var O=d(te,_,D);O&&await O;}}y.ShellInput=z$1.object({sessionID:Identifier.schema("session"),agent:z$1.string(),model:z$1.object({providerID:z$1.string(),modelID:z$1.string()}).optional(),command:z$1.string()});async function b(x){return Ya.shell(x)}y.shell=b,y.CommandInput=z$1.object({messageID:Identifier.schema("message").optional(),sessionID:Identifier.schema("session"),agent:z$1.string().optional(),model:z$1.string().optional(),contextMode:z$1.enum(e).optional(),arguments:z$1.union([z$1.string(),z$1.record(z$1.string(),z$1.unknown())]),command:z$1.string(),variant:z$1.string().optional(),parts:z$1.array(z$1.discriminatedUnion("type",[ve.TextPart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"TextPartInput"}),ve.FilePart.omit({messageID:true,sessionID:true}).partial({id:true}).meta({ref:"FilePartInput"})])).optional()});async function k(x){return x.contextMode&&await ee.update(x.sessionID,I=>{I.contextMode=x.contextMode;}),Ya.execute(x)}y.command=k;async function S(x){if(x.session.parentID||!ee.isDefaultTitle(x.session.title))return;let I=x.history.findIndex(D=>D.info.role==="user"&&!D.parts.every(O=>"synthetic"in O&&O.synthetic));if(I===-1||!(x.history.filter(D=>D.info.role==="user"&&!D.parts.every(O=>"synthetic"in O&&O.synthetic)).length===1))return;let T=x.history.slice(0,I+1),M=T[I];if(!M)return;let j=M.parts.filter(D=>D.type==="subtask"),N=j.length>0&&M.parts.every(D=>D.type==="subtask"),K=await Ue.get("title");if(!K)return;let te=await iife(async()=>K.model?await Ce.getModel(K.model.providerID,K.model.modelID):await Ce.getSmallModel(x.providerID)??await Ce.getModel(x.providerID,x.modelID)),U=await gs.stream({agent:K,user:M.info,system:[K.prompt??""],small:true,tools:{},model:te,abort:new AbortController().signal,sessionID:x.session.id,retries:2,messages:[{role:"user",content:`Generate a title for this conversation:
1053
+ `},...N?[{role:"user",content:j.map(D=>D.prompt).join(`
1054
+ `)}]:await ve.toModelMessages(T,te)]}),_=await Promise.resolve(U.text).catch(D=>{t.error("failed to generate title",{error:D});});if(_)return ee.update(x.session.id,D=>{let O=_.replace(/<think>[\s\S]*?<\/think>\s*/g,"").split(`
1055
+ `).map(E=>E.trim()).find(E=>E.length>0);if(!O)return;let C=O.length>100?O.substring(0,97)+"...":O;D.title=C;},{touch:false})}})(qe||(qe={}));var ee;(C=>{let t=a.create({service:"session"});function e$1(E=false){return SessionTitle.createDefault(E)}C.createDefaultTitle=e$1;function n(E){return SessionTitle.isDefault(E)}C.isDefaultTitle=n;function o(E){return SessionTitle.getForked(E)}C.Info=z$1.object({id:Identifier.schema("session"),slug:z$1.string(),projectID:z$1.string(),directory:z$1.string(),parentID:Identifier.schema("session").optional(),contextMode:z$1.enum(e).optional(),summary:z$1.object({additions:z$1.number(),deletions:z$1.number(),files:z$1.number(),diffs:xt.FileDiff.array().optional()}).optional(),share:z$1.object({url:z$1.string()}).optional(),title:z$1.string(),version:z$1.string(),time:z$1.object({created:z$1.number(),updated:z$1.number(),compacting:z$1.number().optional(),archived:z$1.number().optional()}),permission:Me.Ruleset.optional(),revert:z$1.object({messageID:z$1.string(),partID:z$1.string().optional(),snapshot:z$1.string().optional(),diff:z$1.string().optional()}).optional()}).meta({ref:"Session"}),C.ProjectInfo=z$1.object({id:z$1.string(),name:z$1.string().optional(),worktree:z$1.string()}).meta({ref:"ProjectSummary"}),C.GlobalInfo=C.Info.extend({project:C.ProjectInfo.nullable()}).meta({ref:"GlobalSession"}),C.ShareInfo=z$1.object({secret:z$1.string(),url:z$1.string()}).meta({ref:"SessionShare"}),C.Event={Created:a$5.define("session.created",z$1.object({info:C.Info})),Updated:a$5.define("session.updated",z$1.object({info:C.Info})),Deleted:a$5.define("session.deleted",z$1.object({info:C.Info})),Diff:a$5.define("session.diff",z$1.object({sessionID:z$1.string(),diff:xt.FileDiff.array()})),Error:a$5.define("session.error",z$1.object({sessionID:z$1.string().optional(),error:ve.Assistant.shape.error})),ContextModeChanged:a$5.define("session.context_mode_changed",z$1.object({sessionID:z$1.string(),contextMode:z$1.enum(e)}))},C.create=fn$1(z$1.object({parentID:Identifier.schema("session").optional(),title:z$1.string().optional(),permission:C.Info.shape.permission,contextMode:C.Info.shape.contextMode}).optional(),async E=>a$3({parentID:E?.parentID,directory:A.directory,title:E?.title,permission:E?.permission,contextMode:E?.contextMode})),C.fork=fn$1(z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message").optional(),contextMode:C.Info.shape.contextMode}),async E=>{let R=await(0, C.get)(E.sessionID);if(!R)throw new Error("session not found");let L=o(R.title),q=await a$3({directory:A.directory,title:L,contextMode:E.contextMode}),Q=await(0, C.messages)({sessionID:E.sessionID}),Z=new Map;for(let se of Q){if(E.messageID&&se.info.id>=E.messageID)break;let le=Identifier.ascending("message");Z.set(se.info.id,le);let de=se.info.role==="assistant"&&se.info.parentID?Z.get(se.info.parentID):void 0,be=await(0, C.updateMessage)({...se.info,sessionID:q.id,id:le,...de&&{parentID:de}});for(let re of se.parts)await(0, C.updatePart)({...re,id:Identifier.ascending("part"),messageID:be.id,sessionID:q.id});}return q}),C.touch=fn$1(Identifier.schema("session"),async E=>{await y(E,R=>{R.time.updated=Date.now();});});async function a$3(E){let R=await he.get(),L={id:Identifier.descending("session",E.id),slug:Slug.create(),version:b$3.getVersion(),projectID:A.project.id,directory:E.directory,parentID:E.parentID,contextMode:E.contextMode??R.context?.mode,title:E.title??e$1(!!E.parentID),permission:E.permission,time:{created:Date.now(),updated:Date.now()}};return t.info("created",L),await a$6.write(["session",A.project.id,L.id],L),await ue.publish(C.Event.Created,{info:L}),!L.parentID&&(a$2.EASBOT_AUTO_SHARE||R.share==="auto")&&(0, C.share)(L.id).then(q=>{y(L.id,Q=>{Q.share=q;});}).catch(()=>{}),await ue.publish(C.Event.Updated,{info:L}),L}C.createNext=a$3;function p(E){let R=A.project.vcs?ke__default.join(A.worktree,".easbot","plans"):ke__default.join(a$1.Path.data,"plans");return ke__default.join(R,[E.time.created,E.slug].join("-")+".md")}C.plan=p,C.get=fn$1(Identifier.schema("session"),async E=>await a$6.read(["session",A.project.id,E])),C.getShare=fn$1(Identifier.schema("session"),async E=>a$6.read(["share",E])),C.getProjectInfo=fn$1(z$1.void(),async()=>({id:A.project.id,name:A.project.name,worktree:A.worktree})),C.getGlobalInfo=fn$1(Identifier.schema("session"),async E=>{let R=await(0, C.get)(E);if(R)return {...R,project:{id:A.project.id,name:A.project.name,worktree:A.worktree}}});async function b(E){let R=await(0, C.get)(E);if(R?.contextMode)return R.contextMode;let L=await he.get();return L.context?.mode?L.context.mode:"general"}C.getContextMode=b;async function v(E,R){if(!e.includes(R))throw new Error(`Invalid contextMode: ${R}. Must be one of: ${e.join(", ")}`);await y(E,L=>{L.contextMode=R;}),await ue.publish(C.Event.ContextModeChanged,{sessionID:E,contextMode:R});}C.setContextMode=v,C.share=fn$1(Identifier.schema("session"),async E=>{if((await he.get()).share==="disabled")throw new Error("Sharing is disabled in configuration");let{Share:L}=await import('./share-JFZ3O2BX.mjs'),q=await L.create(E);return await y(E,Q=>{Q.share={url:q.url};},{touch:false}),q}),C.unshare=fn$1(Identifier.schema("session"),async E=>{let{Share:R}=await import('./share-JFZ3O2BX.mjs');await R.remove(E),await y(E,L=>{L.share=void 0;},{touch:false});});async function y(E,R,L){let q=A.project,Q=await a$6.update(["session",q.id,E],Z=>{R(Z),L?.touch!==false&&(Z.time.updated=Date.now());});return await ue.publish(C.Event.Updated,{info:Q}),Q}C.update=y,C.diff=fn$1(Identifier.schema("session"),async E=>await a$6.read(["session_diff",E])??[]),C.messages=fn$1(z$1.object({sessionID:Identifier.schema("session"),limit:z$1.number().optional()}),async E=>{let R=[];for await(let L of ve.stream(E.sessionID)){if(E.limit&&R.length>=E.limit)break;R.push(L);}return R.reverse(),R});async function*P(){let E=A.project;for(let R of await a$6.list(["session",E.id])){let L=await a$6.read(R).catch(()=>{});L&&(yield L);}}C.list=P,C.children=fn$1(Identifier.schema("session"),async E=>{let R=A.project,L=[];for(let q of await a$6.list(["session",R.id])){let Q=await a$6.read(q).catch(()=>{});Q&&Q.parentID===E&&L.push(Q);}return L}),C.remove=fn$1(Identifier.schema("session"),async E=>{let R=A.project;try{let L=await(0,C.get)(E);for(let q of await(0,C.children)(E))await(0,C.remove)(q.id);await(0,C.unshare)(E).catch(()=>{});for(let q of await a$6.list(["message",E])){for(let Q of await a$6.list(["part",q.at(-1)]))await a$6.remove(Q);await a$6.remove(q);}await a$6.remove(["session",R.id,E]),await ue.publish(C.Event.Deleted,{info:L});}catch(L){t.error(L);}}),C.updateMessage=fn$1(ve.Info,async E=>(await a$6.write(["message",E.sessionID,E.id],E),ue.publish(ve.Event.Updated,{info:E}),E)),C.removeMessage=fn$1(z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message")}),async E=>(await a$6.remove(["message",E.sessionID,E.messageID]),ue.publish(ve.Event.Removed,{sessionID:E.sessionID,messageID:E.messageID}),E.messageID)),C.removePart=fn$1(z$1.object({sessionID:Identifier.schema("session"),messageID:Identifier.schema("message"),partID:Identifier.schema("part")}),async E=>(await a$6.remove(["part",E.messageID,E.partID]),ue.publish(ve.Event.PartRemoved,{sessionID:E.sessionID,messageID:E.messageID,partID:E.partID}),E.partID));let te=z$1.union([ve.Part,z$1.object({part:ve.TextPart,delta:z$1.string()}),z$1.object({part:ve.ReasoningPart,delta:z$1.string()})]);C.updatePart=fn$1(te,async E=>{let R="delta"in E?E.part:E,L="delta"in E?E.delta:void 0;return await a$6.write(["part",R.messageID,R.id],R),ue.publish(ve.Event.PartUpdated,{part:R,delta:L,time:Date.now()}),R}),C.getUsage=fn$1(z$1.object({model:z$1.custom(),usage:z$1.custom(),metadata:z$1.custom().optional()}),E=>{let R=H=>Number.isFinite(H)?H:0,L=R(E.usage.inputTokens??0),q=R(E.usage.outputTokens??0),Q=R(E.usage.reasoningTokens??0),Z=R(E.usage.cachedInputTokens??0),se=R(E.metadata?.anthropic?.cacheCreationInputTokens??E.metadata?.bedrock?.usage?.cacheWriteInputTokens??E.metadata?.venice?.usage?.cacheCreationInputTokens??0),le=!!(E.metadata?.anthropic||E.metadata?.bedrock),de=R(le?L:L-Z-se),re={total:iife(()=>E.model.api.npm==="@ai-sdk/anthropic"||E.model.api.npm==="@ai-sdk/amazon-bedrock"||E.model.api.npm==="@ai-sdk/google-vertex/anthropic"?de+q+Z+se:E.usage.totalTokens),input:de,output:q,reasoning:Q,cache:{write:se,read:Z}},X=E.model.cost?.experimentalOver200K&&re.input+re.cache.read>2e5?E.model.cost.experimentalOver200K:E.model.cost;return {cost:R(new Decimal(0).add(new Decimal(re.input).mul(X?.input??0).div(1e6)).add(new Decimal(re.output).mul(X?.output??0).div(1e6)).add(new Decimal(re.cache.read).mul(X?.cache?.read??0).div(1e6)).add(new Decimal(re.cache.write).mul(X?.cache?.write??0).div(1e6)).add(new Decimal(re.reasoning).mul(X?.output??0).div(1e6)).toNumber()),tokens:re}});class D extends Error{constructor(L){super(`Session ${L} is busy`);b$1(this,"sessionID",L);}}C.BusyError=D,C.initialize=fn$1(z$1.object({sessionID:Identifier.schema("session"),modelID:z$1.string(),providerID:z$1.string(),messageID:Identifier.schema("message")}),async E=>{await qe.command({sessionID:E.sessionID,messageID:E.messageID,model:E.providerID+"/"+E.modelID,command:gn.Default.INIT,arguments:""});});})(ee||(ee={}));var Kt;(a$1=>{let t=a.create({service:"project"});a$1.Info=z$1.object({id:z$1.string(),worktree:z$1.string(),vcs:z$1.literal("git").optional(),name:z$1.string().optional(),icon:z$1.object({url:z$1.string().optional(),override:z$1.string().optional(),color:z$1.string().optional()}).optional(),commands:z$1.object({start:z$1.string().optional().describe("Startup script to run when creating a new workspace (worktree)")}).optional(),time:z$1.object({created:z$1.number(),updated:z$1.number(),initialized:z$1.number().optional()}),sandboxes:z$1.array(z$1.string())}).meta({ref:"Project"}),a$1.Event={Updated:a$5.define("project.updated",a$1.Info)};async function o(p){t.info("fromDirectory",{directory:p});let{id:d,sandbox:h,worktree:w,vcs:g}=await iife(async()=>{let k=Filesystem.up({targets:[".git"],start:p}),S=await k.next().then(x=>x.value);if(await k.return(void 0),S){let x=ke__default.dirname(S),I=await PKG.which("git"),P=await Ot__default.readFile(ke__default.join(S,"easbot"),"utf-8").then(j=>j.trim()).catch(()=>{});if(!I)return {id:P??"global",worktree:x,sandbox:x,vcs:a$1.Info.shape.vcs.parse(a$2.EASBOT_FAKE_VCS)};if(!P){let j=await $`git rev-list --max-parents=0 --all`.quiet().nothrow().cwd(x).text().then(N=>N.split(`
1056
+ `).filter(Boolean).map(K=>K.trim()).toSorted()).catch(()=>{});if(!j)return {id:"global",worktree:x,sandbox:x,vcs:a$1.Info.shape.vcs.parse(a$2.EASBOT_FAKE_VCS)};P=j[0],P&&Ot__default.writeFile(ke__default.join(S,"easbot"),P).catch(()=>{});}if(!P)return {id:"global",worktree:x,sandbox:x,vcs:"git"};let T=await $`git rev-parse --show-toplevel`.quiet().nothrow().cwd(x).text().then(j=>ke__default.resolve(x,j.trim())).catch(()=>{});if(!T)return {id:P,sandbox:x,worktree:x,vcs:a$1.Info.shape.vcs.parse(a$2.EASBOT_FAKE_VCS)};x=T;let M=await $`git rev-parse --git-common-dir`.quiet().nothrow().cwd(x).text().then(j=>{let N=ke__default.dirname(j.trim());return N==="."?x:N}).catch(()=>{});return M?{id:P,sandbox:x,worktree:M,vcs:"git"}:{id:P,sandbox:x,worktree:x,vcs:a$1.Info.shape.vcs.parse(a$2.EASBOT_FAKE_VCS)}}let y=p||process.cwd();return {id:"global",worktree:y,sandbox:y,vcs:a$1.Info.shape.vcs.parse(a$2.EASBOT_FAKE_VCS)}}),b=await a$6.read(["project",d]).catch(()=>{});b||(b={id:d,worktree:w,vcs:g,sandboxes:[],time:{created:Date.now(),updated:Date.now()}},d!=="global"&&await r(d,w)),b?.sandboxes||(b.sandboxes=[]),a$2.EASBOT_ICON_DISCOVERY&&await s(b);let v={...b,worktree:w,vcs:g,time:{...b?.time,updated:Date.now()}};return h!==v.worktree&&!v.sandboxes.includes(h)&&v.sandboxes.push(h),v.sandboxes=v.sandboxes.filter(k=>existsSync(k)),await a$6.write(["project",d],v),yt.emit("event",{payload:{type:a$1.Event.Updated.type,properties:v}}),{project:v,sandbox:h}}a$1.fromDirectory=o;async function s(p){if(p.vcs!=="git"||p.icon?.override||p.icon?.url)return;let h=(await glob("**/{favicon}.{ico,png,svg,jpg,jpeg,webp}",{cwd:p.worktree,absolute:true,nodir:true,follow:false,dot:false})).sort((y,x)=>y.length-x.length)[0];if(!h)return;let g=(await Ot__default.readFile(h)).toString("base64"),b=ke__default.extname(h).toLowerCase(),S=`data:${{".ico":"image/x-icon",".png":"image/png",".svg":"image/svg+xml",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp"}[b]||"image/png"};base64,${g}`;await(0, a$1.update)({projectID:p.id,icon:{url:S}});}a$1.discover=s;async function r(p,d){if(!await a$6.read(["project","global"]).catch(()=>{}))return;let w=await a$6.list(["session","global"]).catch(()=>[]);w.length!==0&&(t.info("migrating sessions from global",{newProjectID:p,worktree:d,count:w.length}),await work(10,w,async g=>{let b=g[g.length-1]??"",v=await a$6.read(g).catch(()=>{});v&&(v.directory&&v.directory!==d||(v.projectID=p,t.info("migrating session",{sessionID:b,from:"global",to:p}),await a$6.write(["session",p,b],v),await a$6.remove(g)));}).catch(g=>{t.error("failed to migrate sessions from global to project",{error:g,projectId:p});}));}async function i(p){await a$6.update(["project",p],d=>{d.time.initialized=Date.now();});}a$1.setInitialized=i;async function c(){let p=await a$6.list(["project"]);return (await Promise.all(p.map(h=>a$6.read(h)))).map(h=>({...h,sandboxes:h.sandboxes?.filter(w=>existsSync(w))}))}a$1.list=c,a$1.update=fn$1(z$1.object({projectID:z$1.string(),name:z$1.string().optional(),icon:a$1.Info.shape.icon.optional(),commands:a$1.Info.shape.commands.optional()}),async p=>{let d=await a$6.update(["project",p.projectID],h=>{if(p.name!==void 0&&(h.name=p.name),p.icon!==void 0&&(h.icon={...h.icon},p.icon.url!==void 0&&(h.icon.url=p.icon.url),p.icon.override!==void 0&&(h.icon.override=p.icon.override||void 0),p.icon.color!==void 0&&(h.icon.color=p.icon.color)),p.commands?.start!==void 0){let w=p.commands.start||void 0;h.commands={...h.commands??{}},h.commands.start=w,h.commands.start||(h.commands=void 0);}h.time.updated=Date.now();});return yt.emit("event",{payload:{type:a$1.Event.Updated.type,properties:d}}),d});async function l(p){let d=await a$6.read(["project",p]).catch(()=>{});if(!d?.sandboxes)return [];let h=[];for(let w of d.sandboxes)(await Ot__default.stat(w).catch(()=>{}))?.isDirectory()&&h.push(w);return h}a$1.sandboxes=l;async function f(p,d){let h=await a$6.update(["project",p],w=>{let g=w.sandboxes??[];g.includes(d)||g.push(d),w.sandboxes=g,w.time.updated=Date.now();});return yt.emit("event",{payload:{type:a$1.Event.Updated.type,properties:h}}),h}a$1.addSandbox=f;async function m(p,d){let h=await a$6.update(["project",p],w=>{let g=w.sandboxes??[];w.sandboxes=g.filter(b=>b!==d),w.time.updated=Date.now();});return yt.emit("event",{payload:{type:a$1.Event.Updated.type,properties:h}}),h}a$1.removeSandbox=m;})(Kt||(Kt={}));var Qa;(s=>{let t=a.create({service:"state"}),e=new Map;function n(r,i,c){return ()=>{let u=r(),l=e.get(u);l||(l=new Map,e.set(u,l));let f=l.get(i);if(f)return f.state;let m=i();return l.set(i,{state:m,dispose:c}),m}}s.create=n;async function o(r){let i=e.get(r);if(!i)return;t.info("waiting for state disposal to complete",{key:r});let c=false;setTimeout(()=>{c||t.warn("state disposal is taking an unusually long time - if it does not complete in a reasonable time, please report this as a bug",{key:r});},1e4).unref();let u=[];for(let[l,f]of i){if(!f.dispose)continue;let m=typeof l=="function"?l.name:String(l),a=Promise.resolve(f.state).then(p=>f.dispose(p)).catch(p=>{t.error("Error while disposing state:",{error:p,key:r,init:m});});u.push(a);}await Promise.all(u),i.clear(),e.delete(r),c=true,t.info("state disposal completed",{key:r});}s.dispose=o;})(Qa||(Qa={}));var Ri=Context.create("instance"),js=new Map,Xa={all:void 0},A={async provide(t){let e=js.get(t.directory);e||(a.Default.info("creating instance",{directory:t.directory}),e=iife(async()=>{let{project:o,sandbox:s}=await Kt.fromDirectory(t.directory),r={directory:t.directory,worktree:s,project:o};return await Ri.provide(r,async()=>{await t.init?.();}),r}),js.set(t.directory,e));let n=await e;return Ri.provide(n,async()=>t.fn())},get directory(){return Ri.use().directory},get worktree(){return Ri.use().worktree},get project(){return Ri.use().project},containsPath(t){return Filesystem.contains(A.directory,t)?true:A.worktree==="/"?false:Filesystem.contains(A.worktree,t)},state(t,e){return Qa.create(()=>A.directory,t,e)},async dispose(){a.Default.info("disposing instance",{directory:A.directory}),await Qa.dispose(A.directory),js.delete(A.directory),yt.emit("event",{directory:A.directory,payload:{type:"server.instance.disposed",properties:{directory:A.directory}}});},async disposeAll(){return Xa.all||(Xa.all=iife(async()=>{a.Default.info("disposing all instances");let t=[...js.entries()];for(let[e,n]of t){if(js.get(e)!==n)continue;let o=await n.catch(s=>{a.Default.warn("instance dispose failed",{key:e,error:s});});if(!o){js.get(e)===n&&js.delete(e);continue}js.get(e)===n&&await Ri.provide(o,async()=>{await A.dispose();});}}).finally(()=>{Xa.all=void 0;})),Xa.all}};var ue;(m=>{let t=a.create({service:"bus"});m.InstanceDisposed=a$5.define("server.instance.disposed",z$1.object({directory:z$1.string()}));let n;function o(){return n||(n=A.state(async()=>({subscriptions:new Map}),async a=>{let p=a.subscriptions.get("*");if(!p)return;let d={type:m.InstanceDisposed.type,properties:{directory:A.directory}};for(let h of [...p])h(d);})),n}function s(){return o()()}async function r(a,p){let d={type:a.type,properties:p};t.info("publishing",{type:a.type});let h=[],w=await s();for(let g of [a.type,"*"]){let b=w.subscriptions.get(g);for(let v of b??[])h.push(v(d));}return yt.emit("event",{directory:A.directory,payload:d}),Promise.all(h)}m.publish=r;function i(a,p){return l(a.type,p)}m.subscribe=i;function c(a,p){let d=i(a,h=>{p(h)&&d();});}m.once=c;function u(a){return l("*",a)}m.subscribeAll=u;function l(a,p){t.info("subscribing",{type:a});s().then(h=>{let w=h.subscriptions,g=w.get(a)??[];g.push(p),w.set(a,g);});return ()=>{t.info("unsubscribing",{type:a}),s().then(h=>{let w=h.subscriptions.get(a);if(!w)return;let g=w.indexOf(p);g!==-1&&w.splice(g,1);});}}async function f(){await s();}m.waitForSubscription=f;})(ue||(ue={}));export{ic as $,Hi as $a,ji as A,tg as Aa,Li as B,Nu as Ba,lc as C,cl as Ca,Ni as D,Is as Da,Mr as E,vn as Ea,$d as F,qo as G,xt as Ga,Fd as H,ve as Ha,Ui as I,ul as Ia,Ud as J,ee as Ja,zd as K,Kt as Ka,Lw as L,A as La,Nw as M,dc as Ma,$w as N,qd as Na,mn as O,Gd as Oa,Ns as P,Wd as Pa,Ed as Q,uc as Qa,qi as R,Or as Ra,kc as S,ex as Sa,px as T,Fs as Ta,Jd as U,pc as Ua,mx as V,mc as Va,fx as W,fc as Wa,un as X,gc as Xa,It as Y,po as Ya,sc as Z,hc as Za,rc as _,wt as _a,ue as a,kr as aa,yc as ab,Ve as b,Pr as ba,bc as bb,Ge as c,Er as ca,vo as cb,ju as d,Rd as da,wc as db,Xr as e,ro as ea,xc as eb,xs as f,gn as fa,Ic as fb,sl as g,Bt as ga,vc as gb,Ov as h,Hd as ha,Sc as hb,Vf as i,Yw as ia,Rr as ib,Ce as j,Qw as ja,Vd as jb,Me as k,Bi as ka,Kd as kb,Ro as l,ate as la,yx as lb,zt as m,Do as ma,he as mb,WI as n,od as na,Ks as nb,Fc as o,cte as oa,VI as p,lte as pa,JI as q,Ty as qa,wo as r,dte as ra,_i as s,Dy as sa,Mi as t,Va as ta,Ho as u,gl as ua,xo as v,wA as va,Io as w,Xu as wa,Dr as x,Zs as xa,Ar as y,qe as ya,Oi as z,eg as za};