@easbot/agent 0.2.28 → 0.2.32

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 (98) hide show
  1. package/dist/chunks/acp-EMYJGRAW.mjs +16 -0
  2. package/dist/chunks/adapter-loader-NJKRWATC.mjs +1 -0
  3. package/dist/chunks/{agent-DQAY44EW.mjs → agent-5RKJILIT.mjs} +1 -1
  4. package/dist/chunks/{agent-TMTKXGO5.mjs → agent-ZYCLULYQ.mjs} +1 -1
  5. package/dist/chunks/app-RUR3EKXE.mjs +1 -0
  6. package/dist/chunks/{auth-DHIUZUBT.mjs → auth-4K3ZL6IZ.mjs} +1 -1
  7. package/dist/chunks/bootstrap-HHX67JWH.mjs +1 -0
  8. package/dist/chunks/{build-program-NEPEF27C.mjs → build-program-FDMZOIRV.mjs} +1 -1
  9. package/dist/chunks/bus-ILD32DY6.mjs +1 -0
  10. package/dist/chunks/{chunk-JEUEJB5B.mjs → chunk-2A5IMRBR.mjs} +1 -1
  11. package/dist/chunks/{chunk-NQDXG75V.mjs → chunk-5HMIZBWX.mjs} +2 -2
  12. package/dist/chunks/{chunk-7SGBJ5NP.mjs → chunk-7QUCWKBW.mjs} +1 -1
  13. package/dist/chunks/{chunk-IXVWBJIE.mjs → chunk-CIWBRN5R.mjs} +1 -1
  14. package/dist/chunks/{chunk-WT6HKW7N.mjs → chunk-LGCBI3XO.mjs} +1 -1
  15. package/dist/chunks/{chunk-3VYIQTJ7.mjs → chunk-MNFXN5CQ.mjs} +3 -3
  16. package/dist/chunks/{chunk-U4BAW7XF.mjs → chunk-SF52HNJQ.mjs} +1 -1
  17. package/dist/chunks/{chunk-QMJ4R4AL.mjs → chunk-TGMBM3LH.mjs} +1 -1
  18. package/dist/chunks/{chunk-AP3ZZPEV.mjs → chunk-V47M5AIQ.mjs} +1 -1
  19. package/dist/chunks/{chunk-TQNXBACI.mjs → chunk-VCWACWRA.mjs} +1 -1
  20. package/dist/chunks/{chunk-KZLMEUTB.mjs → chunk-Z76342HO.mjs} +198 -204
  21. package/dist/chunks/{chunk-I3VIJLPG.mjs → chunk-ZRQN5OEL.mjs} +1 -1
  22. package/dist/chunks/{command-WLZAXIPJ.mjs → command-O22JUBKW.mjs} +1 -1
  23. package/dist/chunks/compaction-BBFXKQLT.mjs +1 -0
  24. package/dist/chunks/{config-WLSYCCYR.mjs → config-4BV4A44P.mjs} +1 -1
  25. package/dist/chunks/{confirm-dialog-XBLCGOEC.mjs → confirm-dialog-JSKEM3X2.mjs} +1 -1
  26. package/dist/chunks/{debug-J5RTJUKH.mjs → debug-IDSUSGE2.mjs} +3 -3
  27. package/dist/chunks/{export-I4GL3OUG.mjs → export-CLUTYBVZ.mjs} +1 -1
  28. package/dist/chunks/file-6KLFN3KH.mjs +1 -0
  29. package/dist/chunks/gateway-TD6PI5QI.mjs +16 -0
  30. package/dist/chunks/{generate-KTY277XK.mjs → generate-RLRBTIAB.mjs} +1 -1
  31. package/dist/chunks/{github-JLFW4AJU.mjs → github-VD3MTG4A.mjs} +1 -1
  32. package/dist/chunks/global-5VXYUQCD.mjs +1 -0
  33. package/dist/chunks/{import-E46ADPOS.mjs → import-PWETHHEM.mjs} +1 -1
  34. package/dist/chunks/installation-J3DOZYAO.mjs +1 -0
  35. package/dist/chunks/instance-WJN3WTMR.mjs +1 -0
  36. package/dist/chunks/loader-4NQWDIG5.mjs +1 -0
  37. package/dist/chunks/loader-7OJVB2VM.mjs +1 -0
  38. package/dist/chunks/lsp-VWPJRY6K.mjs +1 -0
  39. package/dist/chunks/{mcp-QLI6EI3R.mjs → mcp-2CRPI57O.mjs} +1 -1
  40. package/dist/chunks/mcp-AB6BM3HE.mjs +1 -0
  41. package/dist/chunks/models-476VQW2D.mjs +1 -0
  42. package/dist/chunks/{pr-FAF6WBPN.mjs → pr-536BX37K.mjs} +1 -1
  43. package/dist/chunks/preferences-7X5P7MJV.mjs +1 -0
  44. package/dist/chunks/project-7YILR444.mjs +1 -0
  45. package/dist/chunks/prompt-HUYC5Q7B.mjs +1 -0
  46. package/dist/chunks/provider-TM5PF6US.mjs +1 -0
  47. package/dist/chunks/registry-3T3TMX6L.mjs +1 -0
  48. package/dist/chunks/revert-OM52XV5I.mjs +1 -0
  49. package/dist/chunks/ripgrep-62V4DGAC.mjs +1 -0
  50. package/dist/chunks/{run-IO45RQPY.mjs → run-7XQNMJD2.mjs} +1 -1
  51. package/dist/chunks/scheduler-PH6VI2DT.mjs +1 -0
  52. package/dist/chunks/server-BTOAV625.mjs +1 -0
  53. package/dist/chunks/session-DM4VRA4R.mjs +1 -0
  54. package/dist/chunks/{session-C5EPZY5K.mjs → session-NRMPDP2T.mjs} +1 -1
  55. package/dist/chunks/session-WRNXT6MY.mjs +1 -0
  56. package/dist/chunks/{settings-panel-4GBMKF7S.mjs → settings-panel-SM37CCB4.mjs} +1 -1
  57. package/dist/chunks/share-TDA5RXVK.mjs +1 -0
  58. package/dist/chunks/snapshot-ROYL6CIJ.mjs +1 -0
  59. package/dist/chunks/{stats-KXJDFVQY.mjs → stats-FP5BZIOF.mjs} +1 -1
  60. package/dist/chunks/storage-HNIBWXUM.mjs +1 -0
  61. package/dist/chunks/{tui-Y3HZ4TPR.mjs → tui-ITRCFGRG.mjs} +1 -1
  62. package/dist/chunks/tui-PDUMZURP.mjs +1 -0
  63. package/dist/chunks/types-RK7YP347.mjs +1 -0
  64. package/dist/chunks/{update-TMILGQ45.mjs → update-KBNWYZYQ.mjs} +1 -1
  65. package/dist/cli.mjs +2 -2
  66. package/package.json +13 -13
  67. package/dist/chunks/acp-NOH5UGDP.mjs +0 -16
  68. package/dist/chunks/adapter-loader-U27XVFCP.mjs +0 -1
  69. package/dist/chunks/app-LKNWY3XR.mjs +0 -1
  70. package/dist/chunks/bootstrap-PNCIQQPA.mjs +0 -1
  71. package/dist/chunks/bus-FZCZO73P.mjs +0 -1
  72. package/dist/chunks/compaction-4RM7SP7O.mjs +0 -1
  73. package/dist/chunks/file-YIYCOEN2.mjs +0 -1
  74. package/dist/chunks/gateway-H7SBUORZ.mjs +0 -16
  75. package/dist/chunks/global-V7QPWK55.mjs +0 -1
  76. package/dist/chunks/installation-267NAZFC.mjs +0 -1
  77. package/dist/chunks/instance-QFPEWLLX.mjs +0 -1
  78. package/dist/chunks/loader-HMK7CNAK.mjs +0 -1
  79. package/dist/chunks/loader-I5FNCXH5.mjs +0 -1
  80. package/dist/chunks/lsp-E6FAZ6N3.mjs +0 -1
  81. package/dist/chunks/mcp-R47GH2RJ.mjs +0 -1
  82. package/dist/chunks/models-IEIC4WVB.mjs +0 -1
  83. package/dist/chunks/preferences-SIWFQFGI.mjs +0 -1
  84. package/dist/chunks/project-LUWDCN2Y.mjs +0 -1
  85. package/dist/chunks/prompt-AB5CWZPX.mjs +0 -1
  86. package/dist/chunks/provider-EYMJXLXQ.mjs +0 -1
  87. package/dist/chunks/registry-DOT4QLWX.mjs +0 -1
  88. package/dist/chunks/revert-2T3C7NKR.mjs +0 -1
  89. package/dist/chunks/ripgrep-OK5E6NNN.mjs +0 -1
  90. package/dist/chunks/scheduler-5CZ7GLSE.mjs +0 -1
  91. package/dist/chunks/server-5LRBAHRI.mjs +0 -1
  92. package/dist/chunks/session-SI5SDDKY.mjs +0 -1
  93. package/dist/chunks/session-UI6NLBHC.mjs +0 -1
  94. package/dist/chunks/share-42YY7MEP.mjs +0 -1
  95. package/dist/chunks/snapshot-WL44FNUR.mjs +0 -1
  96. package/dist/chunks/storage-ZQQ3MTYY.mjs +0 -1
  97. package/dist/chunks/tui-YE2OOUN3.mjs +0 -1
  98. package/dist/chunks/types-YH67KBGI.mjs +0 -1
@@ -1 +1 @@
1
- import {Na}from'./chunk-KZLMEUTB.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-U4BAW7XF.mjs';import {b as b$1}from'./chunk-X6ISXWBN.mjs';import d from'fs';import u from'path';var P=a.create({service:"cli-plugin"});function S(t,e,r){return {context:t,logger:a,config:r,registerCli(n,o){try{t._pluginCliRegistrations||(t._pluginCliRegistrations=[]),t._pluginCliRegistrations.push({pluginId:e,register:n,commands:o?.commands||[]}),P.debug("Plugin CLI registered",{pluginId:e,commands:o?.commands});}catch(a){throw P.error("Plugin CLI registration failed",{pluginId:e,error:a}),a}},registerCommand(n){try{if(t._pluginCommands||(t._pluginCommands=[]),!n.name||!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(n.name))throw new Error(`Invalid command name: ${n.name}`);let o=t._pluginCommands.find(s=>s.name.toLowerCase()===n.name.toLowerCase());if(o)throw new Error(`Command "${n.name}" is already registered by plugin "${o.pluginId}"`);let a=async s=>{try{return await n.handler(s)}catch(i){return P.error("Plugin command handler failed",{pluginId:e,commandName:n.name,error:i}),{text:`Command failed: ${i instanceof Error?i.message:String(i)}`}}};t._pluginCommands.push({...n,handler:a,pluginId:e}),P.debug("Plugin command registered",{pluginId:e,commandName:n.name});}catch(o){throw P.error("Plugin command registration failed",{pluginId:e,error:o}),o}}}}var g=a.create({service:"cli-plugin-discovery"});async function F(t){if(t.enabled===false)return g.debug("Plugin system is disabled"),[];let e=[],r=new Set;if(t.loadPaths)for(let s of t.loadPaths){let i=await I(s,"npm");for(let l of i)r.has(l.id)||(e.push(l),r.add(l.id));}let n=u.join(Na.directory,".easbot","extensions");if(d.existsSync(n)){let s=await h(n,"workspace");for(let i of s)r.has(i.id)||(e.push(i),r.add(i.id));}let o=u.join(a$1.Path.config,"extensions");if(d.existsSync(o)){let s=await h(o,"global");for(let i of s)r.has(i.id)||(e.push(i),r.add(i.id));}let a=e.filter(s=>t.deny?.includes(s.id)?(g.debug("Plugin denied by blacklist",{pluginId:s.id}),false):t.allow&&t.allow.length>0&&!t.allow.includes(s.id)?(g.debug("Plugin not in whitelist",{pluginId:s.id}),false):true);return g.info("Discovered plugins",{count:a.length,plugins:a.map(s=>s.id)}),a}async function I(t,e){if(!d.existsSync(t))return g.debug("Plugin path does not exist",{pluginPath:t}),[];let r=d.statSync(t);return r.isFile()?A(t,e):r.isDirectory()?h(t,e):[]}async function A(t,e){let r=u.dirname(t),n=u.join(r,"easbot.plugin.json"),o;if(d.existsSync(n))try{o=JSON.parse(d.readFileSync(n,"utf-8"));}catch(s){return g.error("Failed to read plugin manifest",{manifestPath:n,error:s}),[]}let a=o?.id||u.basename(t,u.extname(t));return [{id:a,name:o?.name||a,version:o?.version||"0.0.0",description:o?.description,path:t,source:e,enabled:true,manifest:o}]}async function h(t,e){let r=[];try{let n=d.readdirSync(t,{withFileTypes:!0});for(let o of n){let a=u.join(t,o.name);if(o.isFile()&&(o.name.endsWith(".ts")||o.name.endsWith(".js"))){let s=await A(a,e);r.push(...s);}else if(o.isDirectory()){let s=u.join(a,"easbot.plugin.json");if(!d.existsSync(s)){g.debug("Plugin directory missing manifest",{entryPath:a});continue}let i;try{i=JSON.parse(d.readFileSync(s,"utf-8"));}catch(m){g.error("Failed to read plugin manifest",{manifestPath:s,error:m});continue}let l=i.main||"index.ts",f=u.join(a,l);if(d.existsSync(f))r.push({id:i.id,name:i.name||i.id,version:i.version||"0.0.0",description:i.description,path:f,source:e,enabled:!0,manifest:i});else {let m=["index.js","plugin.ts","plugin.js"],w=!1;for(let E of m){let C=u.join(a,E);if(d.existsSync(C)){r.push({id:i.id,name:i.name||i.id,version:i.version||"0.0.0",description:i.description,path:C,source:e,enabled:!0,manifest:i}),w=!0;break}}w||g.error("Plugin entry file not found",{entryPath:a,entryFile:l});}}}}catch(n){g.error("Failed to read plugin directory",{dirPath:t,error:n});}return r}var c=a.create({service:"cli-plugin-loader"}),b=class{constructor(e){b$1(this,"loadedPlugins",new Map);b$1(this,"context");this.context=e;}async loadAll(e){let r=await F(e),n=await Promise.allSettled(r.map(async i=>{let l=this.context.config.plugins,f=l&&typeof l=="object"&&"entries"in l&&l.entries&&typeof l.entries=="object"?l.entries[i.id]:void 0;if(f&&typeof f=="object"&&"enabled"in f&&f.enabled===false)return c.info("Plugin disabled in config",{pluginId:i.id}),{pluginId:i.id,status:"disabled"};try{return await this.loadPlugin(i),{pluginId:i.id,status:"loaded"}}catch(m){return c.error("Failed to load plugin",{pluginId:i.id,error:m}),{pluginId:i.id,status:"failed",error:m}}})),o=n.filter(i=>i.status==="fulfilled"&&i.value.status==="loaded").length,a=n.filter(i=>i.status==="fulfilled"&&i.value.status==="failed").length,s=n.filter(i=>i.status==="fulfilled"&&i.value.status==="disabled").length;c.info("All plugins processed",{total:r.length,loaded:o,failed:a,disabled:s});}async loadPlugin(e){if(this.loadedPlugins.has(e.id)){c.debug("Plugin already loaded",{pluginId:e.id});return}c.debug("Loading plugin",{pluginId:e.id,path:e.path});try{let r=await import(e.path),n=r.default||r.plugin;if(!n)throw new Error("Plugin module does not export a plugin definition");if(typeof n!="function"&&(typeof n!="object"||!n.register))throw new Error("Plugin must be a function or an object with a register method");this.loadedPlugins.set(e.id,n),await this.initializePlugin(e.id,n),c.info("Plugin loaded successfully",{pluginId:e.id,name:e.name});}catch(r){let n=r instanceof Error?r.message:String(r),o=r instanceof Error?r.stack:void 0;throw c.error("Failed to load plugin module",{pluginId:e.id,path:e.path,error:n,stack:o}),new Error(`Failed to load plugin "${e.id}" from ${e.path}: ${n}`)}}async initializePlugin(e,r){let n=this.context.config.plugins,o=n&&typeof n=="object"&&"entries"in n&&n.entries&&typeof n.entries=="object"?n.entries[e]:void 0,a=(o&&typeof o=="object"&&"config"in o?o.config:{})||{},s=S(this.context,e,a);try{if(typeof r=="function")await r(s);else {let i=r;i.id&&i.id!==e&&c.warn("Plugin ID mismatch",{expected:e,actual:i.id}),await i.register(s);}c.debug("Plugin initialized",{pluginId:e});}catch(i){throw c.error("Plugin initialization failed",{pluginId:e,error:i}),this.loadedPlugins.delete(e),new Error(`Plugin "${e}" initialization failed: ${i instanceof Error?i.message:String(i)}`)}}getPlugin(e){return this.loadedPlugins.get(e)}getLoadedPluginIds(){return Array.from(this.loadedPlugins.keys())}};function H(t){return new b(t)}export{b as a,H as b};
1
+ import {Na}from'./chunk-Z76342HO.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-SF52HNJQ.mjs';import {b as b$1}from'./chunk-X6ISXWBN.mjs';import d from'fs';import u from'path';var P=a.create({service:"cli-plugin"});function S(t,e,r){return {context:t,logger:a,config:r,registerCli(n,o){try{t._pluginCliRegistrations||(t._pluginCliRegistrations=[]),t._pluginCliRegistrations.push({pluginId:e,register:n,commands:o?.commands||[]}),P.debug("Plugin CLI registered",{pluginId:e,commands:o?.commands});}catch(a){throw P.error("Plugin CLI registration failed",{pluginId:e,error:a}),a}},registerCommand(n){try{if(t._pluginCommands||(t._pluginCommands=[]),!n.name||!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(n.name))throw new Error(`Invalid command name: ${n.name}`);let o=t._pluginCommands.find(s=>s.name.toLowerCase()===n.name.toLowerCase());if(o)throw new Error(`Command "${n.name}" is already registered by plugin "${o.pluginId}"`);let a=async s=>{try{return await n.handler(s)}catch(i){return P.error("Plugin command handler failed",{pluginId:e,commandName:n.name,error:i}),{text:`Command failed: ${i instanceof Error?i.message:String(i)}`}}};t._pluginCommands.push({...n,handler:a,pluginId:e}),P.debug("Plugin command registered",{pluginId:e,commandName:n.name});}catch(o){throw P.error("Plugin command registration failed",{pluginId:e,error:o}),o}}}}var g=a.create({service:"cli-plugin-discovery"});async function F(t){if(t.enabled===false)return g.debug("Plugin system is disabled"),[];let e=[],r=new Set;if(t.loadPaths)for(let s of t.loadPaths){let i=await I(s,"npm");for(let l of i)r.has(l.id)||(e.push(l),r.add(l.id));}let n=u.join(Na.directory,".easbot","extensions");if(d.existsSync(n)){let s=await h(n,"workspace");for(let i of s)r.has(i.id)||(e.push(i),r.add(i.id));}let o=u.join(a$1.Path.config,"extensions");if(d.existsSync(o)){let s=await h(o,"global");for(let i of s)r.has(i.id)||(e.push(i),r.add(i.id));}let a=e.filter(s=>t.deny?.includes(s.id)?(g.debug("Plugin denied by blacklist",{pluginId:s.id}),false):t.allow&&t.allow.length>0&&!t.allow.includes(s.id)?(g.debug("Plugin not in whitelist",{pluginId:s.id}),false):true);return g.info("Discovered plugins",{count:a.length,plugins:a.map(s=>s.id)}),a}async function I(t,e){if(!d.existsSync(t))return g.debug("Plugin path does not exist",{pluginPath:t}),[];let r=d.statSync(t);return r.isFile()?A(t,e):r.isDirectory()?h(t,e):[]}async function A(t,e){let r=u.dirname(t),n=u.join(r,"easbot.plugin.json"),o;if(d.existsSync(n))try{o=JSON.parse(d.readFileSync(n,"utf-8"));}catch(s){return g.error("Failed to read plugin manifest",{manifestPath:n,error:s}),[]}let a=o?.id||u.basename(t,u.extname(t));return [{id:a,name:o?.name||a,version:o?.version||"0.0.0",description:o?.description,path:t,source:e,enabled:true,manifest:o}]}async function h(t,e){let r=[];try{let n=d.readdirSync(t,{withFileTypes:!0});for(let o of n){let a=u.join(t,o.name);if(o.isFile()&&(o.name.endsWith(".ts")||o.name.endsWith(".js"))){let s=await A(a,e);r.push(...s);}else if(o.isDirectory()){let s=u.join(a,"easbot.plugin.json");if(!d.existsSync(s)){g.debug("Plugin directory missing manifest",{entryPath:a});continue}let i;try{i=JSON.parse(d.readFileSync(s,"utf-8"));}catch(m){g.error("Failed to read plugin manifest",{manifestPath:s,error:m});continue}let l=i.main||"index.ts",f=u.join(a,l);if(d.existsSync(f))r.push({id:i.id,name:i.name||i.id,version:i.version||"0.0.0",description:i.description,path:f,source:e,enabled:!0,manifest:i});else {let m=["index.js","plugin.ts","plugin.js"],w=!1;for(let E of m){let C=u.join(a,E);if(d.existsSync(C)){r.push({id:i.id,name:i.name||i.id,version:i.version||"0.0.0",description:i.description,path:C,source:e,enabled:!0,manifest:i}),w=!0;break}}w||g.error("Plugin entry file not found",{entryPath:a,entryFile:l});}}}}catch(n){g.error("Failed to read plugin directory",{dirPath:t,error:n});}return r}var c=a.create({service:"cli-plugin-loader"}),b=class{constructor(e){b$1(this,"loadedPlugins",new Map);b$1(this,"context");this.context=e;}async loadAll(e){let r=await F(e),n=await Promise.allSettled(r.map(async i=>{let l=this.context.config.plugins,f=l&&typeof l=="object"&&"entries"in l&&l.entries&&typeof l.entries=="object"?l.entries[i.id]:void 0;if(f&&typeof f=="object"&&"enabled"in f&&f.enabled===false)return c.info("Plugin disabled in config",{pluginId:i.id}),{pluginId:i.id,status:"disabled"};try{return await this.loadPlugin(i),{pluginId:i.id,status:"loaded"}}catch(m){return c.error("Failed to load plugin",{pluginId:i.id,error:m}),{pluginId:i.id,status:"failed",error:m}}})),o=n.filter(i=>i.status==="fulfilled"&&i.value.status==="loaded").length,a=n.filter(i=>i.status==="fulfilled"&&i.value.status==="failed").length,s=n.filter(i=>i.status==="fulfilled"&&i.value.status==="disabled").length;c.info("All plugins processed",{total:r.length,loaded:o,failed:a,disabled:s});}async loadPlugin(e){if(this.loadedPlugins.has(e.id)){c.debug("Plugin already loaded",{pluginId:e.id});return}c.debug("Loading plugin",{pluginId:e.id,path:e.path});try{let r=await import(e.path),n=r.default||r.plugin;if(!n)throw new Error("Plugin module does not export a plugin definition");if(typeof n!="function"&&(typeof n!="object"||!n.register))throw new Error("Plugin must be a function or an object with a register method");this.loadedPlugins.set(e.id,n),await this.initializePlugin(e.id,n),c.info("Plugin loaded successfully",{pluginId:e.id,name:e.name});}catch(r){let n=r instanceof Error?r.message:String(r),o=r instanceof Error?r.stack:void 0;throw c.error("Failed to load plugin module",{pluginId:e.id,path:e.path,error:n,stack:o}),new Error(`Failed to load plugin "${e.id}" from ${e.path}: ${n}`)}}async initializePlugin(e,r){let n=this.context.config.plugins,o=n&&typeof n=="object"&&"entries"in n&&n.entries&&typeof n.entries=="object"?n.entries[e]:void 0,a=(o&&typeof o=="object"&&"config"in o?o.config:{})||{},s=S(this.context,e,a);try{if(typeof r=="function")await r(s);else {let i=r;i.id&&i.id!==e&&c.warn("Plugin ID mismatch",{expected:e,actual:i.id}),await i.register(s);}c.debug("Plugin initialized",{pluginId:e});}catch(i){throw c.error("Plugin initialization failed",{pluginId:e,error:i}),this.loadedPlugins.delete(e),new Error(`Plugin "${e}" initialization failed: ${i instanceof Error?i.message:String(i)}`)}}getPlugin(e){return this.loadedPlugins.get(e)}getLoadedPluginIds(){return Array.from(this.loadedPlugins.keys())}};function H(t){return new b(t)}export{b as a,H as b};
@@ -1,2 +1,2 @@
1
- import {a as a$2,b}from'./chunk-JEUEJB5B.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-U4BAW7XF.mjs';import _ from'path';import d from'fs/promises';import t from'zod';import {lazy,Fetch}from'@easbot/utils';var n;(r=>{let g=a.create({service:"models.dev"}),s=_.join(a$1.Path.cache,"models.json");r.Model=t.object({id:t.string(),name:t.string(),family:t.string().optional(),release_date:t.string(),attachment:t.boolean(),reasoning:t.boolean(),temperature:t.boolean(),tool_call:t.boolean(),interleaved:t.union([t.literal(true),t.object({field:t.enum(["reasoning_content","reasoning_details"])}).strict()]).optional(),cost:t.object({input:t.number(),output:t.number(),cache_read:t.number().optional(),cache_write:t.number().optional(),context_over_200k:t.object({input:t.number(),output:t.number(),cache_read:t.number().optional(),cache_write:t.number().optional()}).optional()}).optional(),limit:t.object({context:t.number(),input:t.number().optional(),output:t.number()}),modalities:t.object({input:t.array(t.enum(["text","audio","image","video","pdf"])),output:t.array(t.enum(["text","audio","image","video","pdf"]))}).optional(),experimental:t.boolean().optional(),status:t.enum(["alpha","beta","deprecated"]).optional(),options:t.record(t.string(),t.any()),headers:t.record(t.string(),t.string()).optional(),provider:t.object({npm:t.string()}).optional(),variants:t.record(t.string(),t.record(t.string(),t.any())).optional()}),r.Provider=t.object({api:t.string().optional(),name:t.string(),env:t.array(t.string()),id:t.string(),npm:t.string().optional(),models:t.record(t.string(),r.Model)});function a$3(){return a$2.EASBOT_MODELS_URL||"https://models.dev"}r.Data=lazy(async()=>{let e=a$2.EASBOT_MODELS_PATH??s,p=await d.readFile(e,"utf-8").then(i=>JSON.parse(i)).catch(()=>{});if(p)return p;let c=await import('./models-snapshot-XTWYGG3T.mjs').then(i=>i.snapshot).catch(()=>{});return c||(a$2.EASBOT_DISABLE_MODELS_FETCH?{}:(await Fetch.get(a$3())).data)});async function E(){return await(0, r.Data)()}r.get=E;async function v(){try{let e=await Fetch.get(a$3(),{headers:{"User-Agent":`EasBot/${b.getVersion()}`},responseType:"text"});e.ok&&(await d.writeFile(s,e.data),r.Data.reset());}catch(e){g.warn("Failed to refresh models from models.dev, using cached or snapshot data",{error:e instanceof Error?e.message:String(e),url:a$3()});}}r.refresh=v;})(n||(n={}));function z(){a$2.EASBOT_DISABLE_MODELS_FETCH||(n.refresh(),setInterval(async()=>{await n.refresh();},60*1e3*60).unref());}
1
+ import {a as a$2,b}from'./chunk-2A5IMRBR.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-SF52HNJQ.mjs';import _ from'path';import d from'fs/promises';import t from'zod';import {lazy,Fetch}from'@easbot/utils';var n;(r=>{let g=a.create({service:"models.dev"}),s=_.join(a$1.Path.cache,"models.json");r.Model=t.object({id:t.string(),name:t.string(),family:t.string().optional(),release_date:t.string(),attachment:t.boolean(),reasoning:t.boolean(),temperature:t.boolean(),tool_call:t.boolean(),interleaved:t.union([t.literal(true),t.object({field:t.enum(["reasoning_content","reasoning_details"])}).strict()]).optional(),cost:t.object({input:t.number(),output:t.number(),cache_read:t.number().optional(),cache_write:t.number().optional(),context_over_200k:t.object({input:t.number(),output:t.number(),cache_read:t.number().optional(),cache_write:t.number().optional()}).optional()}).optional(),limit:t.object({context:t.number(),input:t.number().optional(),output:t.number()}),modalities:t.object({input:t.array(t.enum(["text","audio","image","video","pdf"])),output:t.array(t.enum(["text","audio","image","video","pdf"]))}).optional(),experimental:t.boolean().optional(),status:t.enum(["alpha","beta","deprecated"]).optional(),options:t.record(t.string(),t.any()),headers:t.record(t.string(),t.string()).optional(),provider:t.object({npm:t.string()}).optional(),variants:t.record(t.string(),t.record(t.string(),t.any())).optional()}),r.Provider=t.object({api:t.string().optional(),name:t.string(),env:t.array(t.string()),id:t.string(),npm:t.string().optional(),models:t.record(t.string(),r.Model)});function a$3(){return a$2.EASBOT_MODELS_URL||"https://models.dev"}r.Data=lazy(async()=>{let e=a$2.EASBOT_MODELS_PATH??s,p=await d.readFile(e,"utf-8").then(i=>JSON.parse(i)).catch(()=>{});if(p)return p;let c=await import('./models-snapshot-XTWYGG3T.mjs').then(i=>i.snapshot).catch(()=>{});return c||(a$2.EASBOT_DISABLE_MODELS_FETCH?{}:(await Fetch.get(a$3())).data)});async function E(){return await(0, r.Data)()}r.get=E;async function v(){try{let e=await Fetch.get(a$3(),{headers:{"User-Agent":`EasBot/${b.getVersion()}`},responseType:"text"});e.ok&&(await d.writeFile(s,e.data),r.Data.reset());}catch(e){g.warn("Failed to refresh models from models.dev, using cached or snapshot data",{error:e instanceof Error?e.message:String(e),url:a$3()});}}r.refresh=v;})(n||(n={}));function z(){a$2.EASBOT_DISABLE_MODELS_FETCH||(n.refresh(),setInterval(async()=>{await n.refresh();},60*1e3*60).unref());}
2
2
  export{n as a,z as b};
@@ -1,8 +1,8 @@
1
- import {a as a$2,b as b$1}from'./chunk-CQVEAYYW.mjs';import {ma,ra,ta,sa,oa,pa,qa,Ja,na,ga}from'./chunk-KZLMEUTB.mjs';import {c as c$1}from'./chunk-ZBRXNYEM.mjs';import {b as b$2}from'./chunk-TQNXBACI.mjs';import {c}from'./chunk-DEZT7DOH.mjs';import {a as a$1}from'./chunk-NQDXG75V.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$3}from'./chunk-U4BAW7XF.mjs';import {b}from'./chunk-X6ISXWBN.mjs';import {Input,truncateToWidth,isKeyRelease,getKeybindings,Editor,matchesKey,Key,Container,Text,Markdown}from'@easbot/tui';import {loadTextFile,Shell,parseModelId,Fetch,Filesystem}from'@easbot/utils';import {randomUUID}from'crypto';import {readdirSync,existsSync}from'fs';import zt from'path';import {pathToFileURL}from'url';import {GatewayClient}from'@easbot/gateway';var _e=class extends Editor{constructor(t,n){super(t,n);b(this,"onEscape");b(this,"onCtrlC");b(this,"onCtrlD");b(this,"onCtrlG");b(this,"onCtrlL");b(this,"onCtrlO");b(this,"onCtrlP");b(this,"onCtrlT");b(this,"inputHandlerManager");}setInputHandlerManager(t){this.inputHandlerManager=t;}addToHistory(t){this.inputHandlerManager?.isHistoryBrowsing()||super.addToHistory(t);}handleInput(t){t.includes("\x1B")||t.includes("\r")||t.includes(`
1
+ import {a as a$2,b as b$1}from'./chunk-CQVEAYYW.mjs';import {ma,ra,ta,sa,oa,pa,qa,Ja,na,ga}from'./chunk-Z76342HO.mjs';import {c as c$1}from'./chunk-ZBRXNYEM.mjs';import {b as b$2}from'./chunk-VCWACWRA.mjs';import {c}from'./chunk-DEZT7DOH.mjs';import {a as a$1}from'./chunk-5HMIZBWX.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$3}from'./chunk-SF52HNJQ.mjs';import {b}from'./chunk-X6ISXWBN.mjs';import {Input,truncateToWidth,isKeyRelease,getKeybindings,Editor,matchesKey,Key,Container,Text,Markdown}from'@easbot/tui';import {loadTextFile,Shell,parseModelId,Fetch,Filesystem}from'@easbot/utils';import {randomUUID}from'crypto';import {readdirSync,existsSync}from'fs';import zt from'path';import {pathToFileURL}from'url';import {GatewayClient}from'@easbot/gateway';var _e=class extends Editor{constructor(t,n){super(t,n);b(this,"onEscape");b(this,"onCtrlC");b(this,"onCtrlD");b(this,"onCtrlG");b(this,"onCtrlL");b(this,"onCtrlO");b(this,"onCtrlP");b(this,"onCtrlT");b(this,"inputHandlerManager");}setInputHandlerManager(t){this.inputHandlerManager=t;}addToHistory(t){this.inputHandlerManager?.isHistoryBrowsing()||super.addToHistory(t);}handleInput(t){t.includes("\x1B")||t.includes("\r")||t.includes(`
2
2
  `);let n=matchesKey(t,Key.up)||matchesKey(t,Key.down);if(n&&this.inputHandlerManager?this.inputHandlerManager.setHistoryBrowsing(true):this.inputHandlerManager&&!n&&(matchesKey(t,Key.ctrl("l"))||matchesKey(t,Key.ctrl("o"))||matchesKey(t,Key.ctrl("p"))||matchesKey(t,Key.ctrl("g"))||matchesKey(t,Key.ctrl("t"))||matchesKey(t,Key.escape)||matchesKey(t,Key.ctrl("c"))||matchesKey(t,Key.ctrl("d"))||this.inputHandlerManager.setHistoryBrowsing(false)),matchesKey(t,Key.ctrl("l"))&&this.onCtrlL){this.onCtrlL();return}if(matchesKey(t,Key.ctrl("o"))&&this.onCtrlO){this.onCtrlO();return}if(matchesKey(t,Key.ctrl("p"))&&this.onCtrlP){this.onCtrlP();return}if(matchesKey(t,Key.ctrl("g"))&&this.onCtrlG){this.onCtrlG();return}if(matchesKey(t,Key.ctrl("t"))&&this.onCtrlT){this.onCtrlT();return}if(matchesKey(t,Key.escape)){if(this.isShowingAutocomplete()){super.handleInput(t);return}if(this.onEscape){this.onEscape();return}}if(matchesKey(t,Key.ctrl("c"))&&this.onCtrlC){this.onCtrlC();return}if(matchesKey(t,Key.ctrl("d"))){this.getText().length===0&&this.onCtrlD&&this.onCtrlD();return}super.handleInput(t);}};var x={text:"#E8E3D5",dim:"#7B7F87",accent:"#F6C453",accentSoft:"#F2A65A",border:"#3C414B",userBg:"#2B2F36",userText:"#5A9F7A",userLabel:"#5A9F7A",systemText:"#9BA3B2",systemLabel:"#7B7F87",assistantLabel:"#B85C5C",subagentLabel:"#9B72CF",subagentBg:"#2A2535",toolPendingBg:"#1F2A2F",toolSuccessBg:"#1E2D23",toolErrorBg:"#2F1F1F",toolTitle:"#F6C453",toolOutput:"#E1DACB",quote:"#8CC8FF",quoteBorder:"#3B4D6B",code:"#F0C987",codeBorder:"#343A45",link:"#7DD3A5",error:"#F97066",success:"#7DD3A5"},I=s=>e=>`\x1B[38;2;${Lt(s)}m${e}\x1B[0m`,Ce=s=>e=>`\x1B[48;2;${Lt(s)}m${e}\x1B[0m`,ve=s=>`\x1B[1m${s}\x1B[0m`,rt=s=>`\x1B[3m${s}\x1B[0m`;function Lt(s){let e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(s);if(!e)return "255;255;255";let t=Number.parseInt(e[1]||"0",16),n=Number.parseInt(e[2]||"0",16),r=Number.parseInt(e[3]||"0",16);return `${t};${n};${r}`}var ts={selectedPrefix:s=>I(x.accent)(s),selectedText:s=>ve(I(x.accent)(s)),description:s=>I(x.dim)(s),scrollInfo:s=>I(x.dim)(s),noMatch:s=>I(x.dim)(s)},ee={fg:I(x.text),assistantText:s=>s,dim:I(x.dim),accent:I(x.accent),accentSoft:I(x.accentSoft),success:I(x.success),error:I(x.error),header:s=>ve(I(x.accent)(s)),system:I(x.systemText),userBg:Ce(x.userBg),userText:I(x.userText),userLabel:s=>I(x.userLabel)(s),systemLabel:s=>I(x.systemLabel)(s),assistantLabel:s=>I(x.assistantLabel)(s),subagentLabel:s=>I(x.subagentLabel)(s),subagentBg:Ce(x.subagentBg),subagent:s=>I(x.subagentLabel)(s),toolTitle:I(x.toolTitle),toolOutput:I(x.toolOutput),toolPendingBg:Ce(x.toolPendingBg),toolSuccessBg:Ce(x.toolSuccessBg),toolErrorBg:Ce(x.toolErrorBg),border:I(x.border),bold:ve,italic:rt,user:s=>I(x.userText)(s),assistant:s=>I(x.text)(s),code:I(x.code),quote:I(x.quote),link:I(x.link),tool:I(x.toolTitle),thinking:s=>rt(I(x.dim)(s)),warning:I(x.accentSoft),muted:I(x.dim),highlight:s=>ve(I(x.accent)(s))},ss=ts;function ns(s,e){let t=s.split(`
3
3
  `);if(!e)return t.map(a=>I(x.code)(a));let n={keyword:I("#C586C0"),string:I("#CE9178"),comment:I("#6A9955"),number:I("#B5CEA8"),function:I("#DCDCAA"),type:I("#4EC9B0"),operator:I("#D4D4D4"),default:I(x.code)},r=e.toLowerCase();return r==="typescript"||r==="ts"||r==="javascript"||r==="js"?t.map(a=>is(a,n)):r==="python"||r==="py"?t.map(a=>rs(a,n)):r==="bash"||r==="sh"||r==="shell"?t.map(a=>os(a,n)):r==="json"?t.map(a=>as(a,n)):t.map(a=>n.default(a))}function is(s,e){if(s.trim().startsWith("//"))return e.comment?.(s)??s;let t=/\b(const|let|var|function|async|await|return|if|else|for|while|class|interface|type|import|export|from|default|new|this|super|extends|implements)\b/g,n=s.replace(t,r=>e.keyword?.(r)??r);return n=n.replace(/(['"`])(?:(?=(\\?))\2.)*?\1/g,r=>e.string?.(r)??r),n=n.replace(/\b\d+(\.\d+)?\b/g,r=>e.number?.(r)??r),n}function rs(s,e){if(s.trim().startsWith("#"))return e.comment?.(s)??s;let t=/\b(def|class|if|elif|else|for|while|return|import|from|as|try|except|finally|with|async|await|lambda|yield|pass|break|continue|None|True|False)\b/g,n=s.replace(t,r=>e.keyword?.(r)??r);return n=n.replace(/(['"])(?:(?=(\\?))\2.)*?\1/g,r=>e.string?.(r)??r),n=n.replace(/\b\d+(\.\d+)?\b/g,r=>e.number?.(r)??r),n}function os(s,e){if(s.trim().startsWith("#"))return e.comment?.(s)??s;let t=/\b(if|then|else|elif|fi|for|while|do|done|case|esac|function|return|exit|export|source|alias)\b/g,n=s.replace(t,r=>e.keyword?.(r)??r);return n=n.replace(/(['"])(?:(?=(\\?))\2.)*?\1/g,r=>e.string?.(r)??r),n=n.replace(/\$\{?[\w_]+\}?/g,r=>e.type?.(r)??r),n}function as(s,e){let t=s;return t=t.replace(/"([^"]+)":/g,(n,r)=>`${e.type?.(`"${r}"`)??`"${r}"`}: `),t=t.replace(/:\s*"([^"]+)"/g,(n,r)=>`: ${e.string?.(`"${r}"`)??`"${r}"`}`),t=t.replace(/:\s*(\d+(\.\d+)?)/g,(n,r)=>`: ${e.number?.(r)??r}`),t=t.replace(/:\s*(true|false|null)/g,(n,r)=>`: ${e.keyword?.(r)??r}`),t}var xe={heading:s=>ve(I(x.accent)(s)),link:s=>I(x.link)(s),linkUrl:s=>I(x.dim)(s),code:s=>I(x.code)(s),codeBlock:s=>I(x.code)(s),codeBlockBorder:s=>I(x.codeBorder)(s),quote:s=>I(x.quote)(s),quoteBorder:s=>I(x.quoteBorder)(s),hr:s=>I(x.border)(s),listBullet:s=>I(x.accentSoft)(s),bold:ve,italic:rt,strikethrough:s=>`\x1B[9m${s}\x1B[0m`,underline:s=>`\x1B[4m${s}\x1B[0m`,highlightCode:ns,codeBlockIndent:" "},Mt={borderColor:s=>I(x.border)(s),selectList:ss};var z=a.create({service:"cli-tui-chatlog"}),ot=null;function ds(){if(ot)return ot;let s=a$1("tui.system.tool_executing",{vars:{tool:""}}).split(":")[0]?.trim()||"",e=a$1("tui.system.tool_completed",{vars:{tool:""}}).split(":")[0]?.trim()||"",t=a$1("tui.system.tool_failed",{vars:{tool:""}}).split(":")[0]?.trim()||"",n=[],r=a=>a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return s&&s!=="tui.system.tool_executing"&&n.push(new RegExp(r(s),"i")),e&&e!=="tui.system.tool_completed"&&n.push(new RegExp(r(e),"i")),t&&t!=="tui.system.tool_failed"&&n.push(new RegExp(r(t),"i")),n.push(/[⚙🔧]\s*(执行工具|Executing tool)/iu,/[✓✅]\s*(工具完成|工具执行完成|Tool completed|Tool execution completed)/iu,/[✗❌]\s*(工具失败|工具执行失败|Tool failed|Tool execution failed)/iu),ot=n,n}var $e=class extends Container{constructor(){super();b(this,"messages",[]);b(this,"maxMessages",1e3);b(this,"containerWidth",80);b(this,"getState");b(this,"cachedProtocolMetadata",null);b(this,"_cachedPrimaryAgents",null);}setStateGetter(t){this.getState=t,this.loadProtocolMetadata();}async loadProtocolMetadata(){let t=this.getState?.();if(t?.sdk)try{let n=await t.sdk.app.context({});n.data?.protocolMetadata&&(this.cachedProtocolMetadata=n.data.protocolMetadata);}catch(n){z.debug("Failed to load protocol metadata",{error:n});}}setWidth(t){this.containerWidth=t;}addUser(t,n,r){this.addMessage("user",t,n,r);}addAssistant(t,n,r){this.addMessage("assistant",t,n,r);}addSystem(t,n,r){this.addMessage("system",t,n,r);}addMessage(t,n,r,a){if(z.debug("addMessage called",{type:t,content:n.substring(0,100),id:r,currentMessagesCount:this.messages.length}),r&&this.messages.findIndex(l=>l.id===r)!==-1){z.debug("Message with same ID already exists, skipping",{id:r});return}this.messages.push({type:t,content:n,timestamp:Date.now(),id:r,metadata:a}),z.debug("After push, messages count",{count:this.messages.length}),this.messages.length>this.maxMessages&&(this.messages=this.messages.slice(-this.maxMessages)),z.debug("Calling updateChildren"),this.updateChildren(),z.debug("updateChildren completed");}clear(){this.messages=[],this.updateChildren();}updateChildren(){let t=this.getState?.(),n=t?.toolsExpanded??false,r=t?.showThinking??false,a=t?.verboseLevel??"off",o=t?.messageLimit??50;z.debug("updateChildren called",{messagesCount:this.messages.length,childrenBeforeClear:this.children.length,toolsExpanded:n,showThinking:r,verboseLevel:a,messageLimit:o}),this.children=[],z.debug("Children cleared",{childrenAfterClear:this.children.length});let l=new Set,d=0,u=this.messages.slice(-o);z.debug("Applied message limit",{originalCount:this.messages.length,limitedCount:u.length,messageLimit:o});for(let c of u){if(c.id&&l.has(c.id)){z.debug("Skipping duplicate ID",{id:c.id});continue}if(!n&&this.shouldFilterToolMessage(c)){z.debug("Filtering tool message (tools collapsed)",{content:c.content.substring(0,50),metadata:c.metadata});continue}if(c.id&&!r&&this.shouldFilterThinkingMessage(c)){z.debug("Filtering thinking message (thinking mode off)",{content:c.content.substring(0,50),metadata:c.metadata});continue}if(c.id&&a==="off"&&this.shouldFilterBackgroundAgentMessage(c)){z.debug("Filtering background agent message (verbose off)",{content:c.content.substring(0,50),agent:c.metadata?.agent});continue}if(c.type==="assistant"&&this.shouldFilterAssistantMessage(c.content)){z.debug("Filtering assistant metadata",{content:c.content.substring(0,50)});continue}c.id&&l.add(c.id),z.debug("Rendering message",{type:c.type,content:c.content.substring(0,50),id:c.id,hasId:!!c.id,metadata:c.metadata}),this.renderMessage(c),d++;}z.debug("updateChildren completed",{childrenAfterRender:this.children.length,renderedCount:d}),this.invalidate();}shouldFilterSystemMessage(t){return ds().some(r=>r.test(t))}shouldFilterToolMessage(t){return t.metadata?.isTool===true?true:t.type==="system"?this.shouldFilterSystemMessage(t.content):false}shouldFilterThinkingMessage(t){return t.metadata?.isThinking===true}shouldFilterBackgroundAgentMessage(t){let n=t.metadata?.agent;if(!n)return false;let r=this.getState?.();if(!r?.sdk)return false;let a=async()=>{try{return ((await r.sdk.app.agents({})).data||[]).filter(d=>d.mode==="primary"&&d.hidden!==!0).map(d=>d.name)}catch{return []}};return this._cachedPrimaryAgents?!this._cachedPrimaryAgents.includes(n):(a().then(o=>{this._cachedPrimaryAgents=o,this.updateChildren();}),false)}shouldFilterAssistantMessage(t){return /^>\s+[\w-]+(\s+·\s+[\w-]+)?$/.test(t.trim())}renderMessage(t){let n=new Date(t.timestamp).toLocaleTimeString();switch(t.type){case "user":{if(t.metadata?.isSubagentResult){let l=t.metadata.agent||"SubAgent",d=ee.subagentLabel(`[${n}] ${l}: `),u=new Text(d,1,0);this.addChild(u);let p=new Markdown(t.content,0,0,xe).render(this.containerWidth-2);for(let _ of p){let $=new Text(_,1,0);this.addChild($);}break}let r=ee.userLabel(`[${n}] ${a$1("tui.chatlog.user_prefix")}: `),a=new Text(r,1,0);if(this.addChild(a),t.content.trim().startsWith("/")){let l=ee.accent(t.content),d=new Text(l,1,0);this.addChild(d);}else {let l=ee.userText(t.content),u=new Markdown(l,0,0,xe).render(this.containerWidth-2);for(let c of u){let p=new Text(c,1,0);this.addChild(p);}}break}case "assistant":{let r=a$1("tui.chatlog.assistant_prefix");this.cachedProtocolMetadata?.name?r=this.cachedProtocolMetadata.name:t.metadata?.agent&&(r=t.metadata.agent);let a=ee.assistantLabel(`[${n}] ${r}: `),o=new Text(a,1,0);this.addChild(o);let d=new Markdown(t.content,0,0,xe).render(this.containerWidth-2);for(let u of d){let c=new Text(u,1,0);this.addChild(c);}break}case "system":{let r=ee.systemLabel(`[${n}] ${a$1("tui.chatlog.system_prefix")}: `),a=new Text(r,1,0);this.addChild(a);let o=ee.system(t.content),d=new Markdown(o,0,0,xe).render(this.containerWidth-2);for(let u of d){let c=new Text(u,1,0);this.addChild(c);}break}}}};var cs={q:"exit",quit:"exit",h:"help",s:"status",a:"agent",m:"model",sess:"session",skills:"skill",commands:"command",mcps:"mcp",models:"model",agents:"agent",sessions:"session",btw:"command"},us=new Set(["btw","sync","abort","compact"]);function Dt(s){let e=s.replace(/^\//,"").trim();if(!e)return {name:"",args:""};let[t="",...n]=e.split(/\s+/),r=t.toLowerCase();return us.has(r)?{name:"command",args:e}:{name:cs[r]??r,args:n.join(" ").trim()}}var at=[{name:"help",description:a$1("tui.command.help.description")},{name:"status",description:a$1("tui.command.status.description")},{name:"command",description:a$1("tui.command.command.description")},{name:"agent",description:a$1("tui.command.agent.description")},{name:"session",description:a$1("tui.command.session.description")},{name:"new",description:a$1("tui.command.new.description")},{name:"fork",description:a$1("tui.command.fork.description")},{name:"reset",description:a$1("tui.command.reset.description")},{name:"model",description:a$1("tui.command.model.description")},{name:"settings",description:a$1("tui.command.settings.description")},{name:"verbose",description:a$1("tui.command.verbose.description")},{name:"thinking",description:a$1("tui.command.thinking.description")},{name:"abort",description:a$1("tui.command.abort.description")},{name:"clear",description:a$1("tui.command.clear.description")},{name:"compact",description:a$1("tui.command.compact.description")},{name:"skill",description:a$1("tui.command.skill.description")},{name:"mcp",description:a$1("tui.command.mcp.description")},{name:"exit",description:a$1("tui.command.exit.description")}];async function _t(s,e){let t=[...at];if(s)try{let r=(await s.command.list({contextMode:e})).data||[],a=new Set(at.map(o=>o.name));for(let o of r)a.has(o.name)||t.push({name:o.name,description:o.description||""});}catch(n){console.error("Failed to fetch dynamic commands:",n);}return t}function Rt(){return at}function $t(){let s=[];return s.push("# "+a$1("tui.help.title")),s.push(""),s.push("## "+a$1("tui.help.section.basic")),s.push("- `"+a$1("tui.help.command.help")+"`"),s.push("- `"+a$1("tui.help.command.status")+"`"),s.push("- `"+a$1("tui.help.command.command")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.agent")),s.push("- `"+a$1("tui.help.command.agent")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.session")),s.push("- `"+a$1("tui.help.command.session")+"`"),s.push("- `"+a$1("tui.help.command.new")+"`"),s.push("- `"+a$1("tui.help.command.fork")+"`"),s.push("- `"+a$1("tui.help.command.reset")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.model")),s.push("- `"+a$1("tui.help.command.model")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.settings")),s.push("- `"+a$1("tui.help.command.settings")+"`"),s.push("- `"+a$1("tui.help.command.verbose")+"`"),s.push("- `"+a$1("tui.help.command.thinking")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.operations")),s.push("- `"+a$1("tui.help.command.abort")+"`"),s.push("- `"+a$1("tui.help.command.clear")+"`"),s.push("- `"+a$1("tui.help.command.compact")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.skill")),s.push("- `"+a$1("tui.help.command.skill")+"`"),s.push("- `"+a$1("tui.help.command.mcp")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.exit")),s.push("- `"+a$1("tui.help.command.exit")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.local")),s.push("- `"+a$1("tui.help.command.local")+"`"),s.push(""),s.push("## "+a$1("tui.help.section.shortcuts")),s.push("- `"+a$1("tui.help.shortcut.ctrl_c")+"`"),s.push("- `"+a$1("tui.help.shortcut.ctrl_d")+"`"),s.push("- `"+a$1("tui.help.shortcut.ctrl_l")+"`"),s.push("- `"+a$1("tui.help.shortcut.ctrl_p")+"`"),s.push("- `"+a$1("tui.help.shortcut.ctrl_g")+"`"),s.push("- `"+a$1("tui.help.shortcut.esc")+"`"),s.join(`
4
4
  `)}var ms=/[\s\-_./:#@]/;function Ht(s,e){return e===0||ms.test(s[e-1]??"")}function Ft(s,e){if(!e)return null;let t=s.toLowerCase(),n=e.toLowerCase(),r=t.length-n.length;if(r<0)return null;for(let a=0;a<=r;a++)if(t.startsWith(n,a)&&Ht(t,a))return a;return null}function gs(s,e){if(s.length===0)return 0;if(s.length>e.length)return null;let t=0,n=0,r=-1,a=0;for(let o=0;o<e.length&&t<s.length;o++)if(e[o]===s[t]){let l=Ht(e,o);r===o-1?(a++,n-=a*5):(a=0,r>=0&&(n+=(o-r-1)*2)),l&&(n-=10),n+=o*.1,r=o,t++;}return t<s.length?null:n}function qt(s,e){let t=e.trim();if(!t)return s;let n=t.split(/\s+/).filter(a=>a.length>0);if(n.length===0)return s;let r=[];for(let a of s){let o=a.searchTextLower??"",l=0,d=true;for(let u of n){let c=gs(u,o);if(c!==null)l+=c;else {d=false;break}}d&&r.push({item:a,score:l});}return r.sort((a,o)=>a.score-o.score),r.map(a=>a.item)}var ys="\x1B",Bt=new RegExp(`${ys}\\[[0-9;]*m`,"g"),se=class se{constructor(e,t,n){b(this,"items");b(this,"filteredItems");b(this,"selectedIndex",0);b(this,"maxVisible");b(this,"theme");b(this,"searchInput");b(this,"regexCache",new Map);b(this,"onSelect");b(this,"onCancel");b(this,"onSelectionChange");b(this,"compareByScore",(e,t)=>e.tier!==t.tier?e.tier-t.tier:e.score!==t.score?e.score-t.score:this.getItemLabel(e.item).localeCompare(this.getItemLabel(t.item)));this.items=e,this.filteredItems=e,this.maxVisible=t,this.theme=n,this.searchInput=new Input;}getCachedRegex(e){let t=this.regexCache.get(e);return t||(t=new RegExp(this.escapeRegex(e),"gi"),this.regexCache.set(e,t)),t}updateFilter(){let e=this.searchInput.getValue().trim();e?this.filteredItems=this.smartFilter(e):this.filteredItems=this.items,this.selectedIndex=0,this.notifySelectionChange();}smartFilter(e){let t=e.toLowerCase(),n=[],r=[];for(let o of this.items){let l=this.getItemLabel(o),d=o.description??"",u=a$2(l).toLowerCase(),c=a$2(d).toLowerCase(),p=u.indexOf(t);if(p!==-1){n.push({item:o,tier:0,score:p});continue}let _=Ft(u,t);if(_!==null){n.push({item:o,tier:1,score:_});continue}let $=c.indexOf(t);if($!==-1){n.push({item:o,tier:2,score:$});continue}let ne=o.searchText??"";r.push({item:o,searchTextLower:[l,d,ne].map(A=>a$2(A)).filter(Boolean).join(" ").toLowerCase()});}n.sort(this.compareByScore);let a=qt(r,t);return [...n.map(o=>o.item),...a.map(o=>o.item)]}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}getItemLabel(e){return e.label||e.value}splitAnsiParts(e){let t=[];Bt.lastIndex=0;let n=0,r;for(;(r=Bt.exec(e))!==null;)r.index>n&&t.push({text:e.slice(n,r.index),isAnsi:false}),t.push({text:r[0],isAnsi:true}),n=r.index+r[0].length;return n<e.length&&t.push({text:e.slice(n),isAnsi:false}),t}highlightMatch(e,t){let n=t.trim().split(/\s+/).map(o=>o.toLowerCase()).filter(o=>o.length>0);if(n.length===0)return e;let r=Array.from(new Set(n)).toSorted((o,l)=>l.length-o.length),a=this.splitAnsiParts(e);for(let o of r){let l=this.getCachedRegex(o),d=[];for(let u of a){if(u.isAnsi){d.push(u);continue}l.lastIndex=0;let c=u.text.replace(l,p=>this.theme.matchHighlight(p));if(c===u.text){d.push(u);continue}d.push(...this.splitAnsiParts(c));}a=d;}return a.map(o=>o.text).join("")}setSelectedIndex(e){this.selectedIndex=Math.max(0,Math.min(e,this.filteredItems.length-1));}invalidate(){this.searchInput.invalidate();}render(e){let t=[],r=this.theme.searchPrompt("search: "),a=Math.max(1,e-b$1(r)),l=this.searchInput.render(a)[0]??"";t.push(`${r}${this.theme.searchInput(l)}`),t.push("");let d=this.searchInput.getValue().trim();if(this.filteredItems.length===0)return t.push(this.theme.noMatch(" No matches")),t;let u=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),c=Math.min(u+this.maxVisible,this.filteredItems.length);for(let p=u;p<c;p++){let _=this.filteredItems[p];if(!_)continue;let $=p===this.selectedIndex;t.push(this.renderItemLine(_,$,e,d));}if(this.filteredItems.length>this.maxVisible){let p=`${this.selectedIndex+1}/${this.filteredItems.length}`;t.push(this.theme.scrollInfo(` ${p}`));}return t}renderItemLine(e,t,n,r){let a=t?"\u2192 ":" ",o=a.length,l=this.getItemLabel(e),d=e.description;if(d){let $=this.getDescriptionLayout(n,o);if($){let ne=truncateToWidth(l,$.maxValueWidth,""),A=this.highlightMatch(ne,r),M=b$1(A),h=$.availableWidth-M-$.spacingWidth;if(h>=se.DESCRIPTION_MIN_WIDTH){let re=" ".repeat($.spacingWidth),H=truncateToWidth(d,h,""),w=this.highlightMatch(H,r),f=t?w:this.theme.description(w),g=`${a}${A}${re}${f}`;return t?this.theme.selectedText(g):g}}}let u=n-o-2,c=truncateToWidth(l,u,""),p=this.highlightMatch(c,r),_=`${a}${p}`;return t?this.theme.selectedText(_):_}getDescriptionLayout(e,t){if(e<=se.DESCRIPTION_LAYOUT_MIN_WIDTH)return null;let n=Math.max(1,e-t-se.RIGHT_MARGIN_WIDTH),r=n-se.DESCRIPTION_MIN_WIDTH-se.DESCRIPTION_SPACING_WIDTH;return r<1?null:{availableWidth:n,maxValueWidth:r,spacingWidth:se.DESCRIPTION_SPACING_WIDTH}}handleInput(e){if(isKeyRelease(e))return;let t=getKeybindings(),n=!this.searchInput.getValue().trim();if(t.matches(e,"tui.select.up")||t.matches(e,"tui.editor.cursorUp")||n&&e==="k"){this.selectedIndex=Math.max(0,this.selectedIndex-1),this.notifySelectionChange();return}if(t.matches(e,"tui.select.down")||t.matches(e,"tui.editor.cursorDown")||n&&e==="j"){this.selectedIndex=Math.min(this.filteredItems.length-1,this.selectedIndex+1),this.notifySelectionChange();return}if(t.matches(e,"tui.select.confirm")){let o=this.filteredItems[this.selectedIndex];o&&this.onSelect&&this.onSelect(o);return}if(t.matches(e,"tui.select.cancel")){this.onCancel&&this.onCancel();return}let r=this.searchInput.getValue();this.searchInput.handleInput(e);let a=this.searchInput.getValue();r!==a&&this.updateFilter();}notifySelectionChange(){let e=this.filteredItems[this.selectedIndex];e&&this.onSelectionChange&&this.onSelectionChange(e);}getSelectedItem(){return this.filteredItems[this.selectedIndex]??null}};b(se,"DESCRIPTION_LAYOUT_MIN_WIDTH",40),b(se,"DESCRIPTION_MIN_WIDTH",12),b(se,"DESCRIPTION_SPACING_WIDTH",2),b(se,"RIGHT_MARGIN_WIDTH",2);var He=se;var ge=a.create({service:"cli-tui-selectors"}),Ss={selectedPrefix:s=>`\x1B[36m${s}\x1B[0m`,selectedText:s=>`\x1B[1;36m${s}\x1B[0m`,description:s=>`\x1B[90m${s}\x1B[0m`,scrollInfo:s=>`\x1B[90m${s}\x1B[0m`,noMatch:s=>`\x1B[90m${s}\x1B[0m`,searchPrompt:s=>`\x1B[36m${s}\x1B[0m`,searchInput:s=>s,matchHighlight:s=>`\x1B[1;33m${s}\x1B[0m`};function pe(s,e){ge.debug("Creating searchable select list",{itemsCount:s.length,title:e.title});let t=e.maxVisible??10,n=new He(s,t,Ss);return e.onSelect&&(n.onSelect=e.onSelect),e.onCancel&&(n.onCancel=e.onCancel),n}function Fe(s,e){ge.info("Creating model selector with data");let t=[];for(let[n,r]of Object.entries(s))if(r?.models)for(let[a,o]of Object.entries(r.models))t.push({label:`${r.name} - ${o.name}`,value:`${n}/${a}`,description:o.family||""});return ge.debug("Model list loaded",{count:t.length}),pe(t,{title:e.title||a$1("tui.selector.model.title"),placeholder:e.placeholder||a$1("tui.selector.model.placeholder"),onSelect:e.onSelect,onCancel:e.onCancel})}function qe(s,e){ge.info("Creating session selector with data",{count:s.length});let t=s.map(n=>({label:n.title||n.id,value:n.id,description:`\u66F4\u65B0\u65F6\u95F4: ${n.time?.updated?new Date(n.time.updated).toLocaleString():"\u672A\u77E5"}`}));return ge.debug("Session list loaded",{count:t.length}),pe(t,{title:e.title||a$1("tui.selector.session.title"),placeholder:e.placeholder||a$1("tui.selector.session.placeholder"),onSelect:e.onSelect,onCancel:e.onCancel})}function Be(s,e){ge.info("Creating agent selector with data",{count:s.length});let t=s.map(n=>({label:n.name,value:n.name,description:n.description||(n.mode?`\u6A21\u5F0F: ${n.mode}`:"")}));return ge.debug("Agent list loaded",{count:t.length}),pe(t,{title:e.title||a$1("tui.selector.agent.title"),placeholder:e.placeholder||a$1("tui.selector.agent.placeholder"),onSelect:e.onSelect,onCancel:e.onCancel})}var T=a.create({service:"cli-tui-command-handlers"});async function vs(s,e){let t=[];t.push("## "+a$1("tui.handler.status.title")),t.push(""),t.push("### "+a$1("tui.handler.status.system_info")),t.push("- **"+a$1("tui.handler.status.system")+"**: "+a$1("tui.handler.status.ok")),t.push("- **"+a$1("tui.handler.status.directory")+"**: `"+e+"`"),t.push(""),t.push("### "+a$1("tui.handler.status.global_paths")),t.push("- **home**: `"+a$3.Path.home+"`"),t.push("- **data**: `"+a$3.Path.data+"`"),t.push("- **bin**: `"+a$3.Path.bin+"`"),t.push("- **log**: `"+a$3.Path.log+"`"),t.push("- **cache**: `"+a$3.Path.cache+"`"),t.push("- **config**: `"+a$3.Path.config+"`"),t.push("- **state**: `"+a$3.Path.state+"`"),t.push(""),t.push("### "+a$1("tui.handler.status.session_info")),t.push("- **"+a$1("tui.handler.status.agent_label")+"**: "+(s.agent||a$1("tui.handler.status.not_set"))),t.push("- **"+a$1("tui.handler.status.session_label")+"**: "+(s.currentSessionKey||a$1("tui.handler.status.not_set"))),t.push("- **"+a$1("tui.handler.status.model_label")+"**: "+(s.sessionInfo.model||a$1("tui.handler.status.not_set"))),t.push("");try{let r=(await s.sdk.command.list({})).data||[],a=r.filter(d=>d.source==="skill"),o=r.filter(d=>d.source==="mcp"),l=r.filter(d=>d.source==="command");if(t.push("### "+a$1("tui.handler.status.skills")+" ("+a.length+")"),a.length>0){let d=a.map(u=>u.name).join(", ");t.push(d);}t.push("");try{let u=(await s.sdk.mcp.status({})).data||{},p=(await s.sdk.mcp.tools({})).data||{},_=Object.entries(u).filter(([,$])=>$.status==="connected");if(t.push("### "+a$1("tui.handler.status.mcp")+" ("+_.length+")"),_.length>0)for(let[$]of _){let ne=p[$]||[];ne.length>0?t.push("- **"+$+"** ("+ne.length+"): "+ne.join(", ")):t.push("- **"+$+"**");}t.push("");}catch(d){T.error("Failed to get MCP status",{error:d}),t.push("### "+a$1("tui.handler.status.mcp")+" (0)"),t.push("");}if(t.push("### "+a$1("tui.handler.status.commands")+" ("+l.length+")"),l.length>0){let d=l.map(u=>u.name).join(", ");t.push(d);}t.push(""),t.push("### "+a$1("tui.handler.status.services"));try{if(!s.sdk?.lsp)T.warn("SDK or LSP API is not initialized"),t.push("- **LSP**: "+a$1("tui.handler.status.error_loading_lsp"));else {let d=await s.sdk.lsp.status({});if(!d||typeof d!="object")T.warn("LSP status response is not a valid object",{response:d,responseType:typeof d}),t.push("- **LSP**: "+a$1("tui.handler.status.error_loading_lsp"));else {let u=Array.isArray(d.data)?d.data:[];if(t.push("- **LSP ("+u.length+")**: "),u.length>0){let c=u.filter(p=>p&&typeof p=="object").map(p=>p?.name||"unknown").join(", ");t.push(" "+c);}else t.push(" "+a$1("tui.handler.status.no_lsp"));}}}catch(d){T.error("Failed to get LSP status",{error:d}),t.push("- **LSP**: "+a$1("tui.handler.status.error_loading_lsp"));}}catch(n){T.error("Failed to get command list for status",{error:n}),t.push(""),t.push("_"+a$1("tui.handler.status.error_loading")+"_");}return t.join(`
5
- `)}function Ut(s,e){let{chatLog:t,tui:n,directory:r,openOverlay:a,closeOverlay:o,requestExit:l,setActivityStatus:d,updateFooter:u,refreshSessionInfo:c$1,loadHistory:p,setSession:_,refreshAgents:$,abortActive:ne}=s,A=()=>{o();},M=async(H,w,f,g)=>{try{if(!w){T.warn("Cannot publish command event: no session ID",{name:H});return}await na(e,ga.Event.Executed,{name:H,sessionID:w,arguments:f,messageID:g}),T.debug("Command event published",{name:H,sessionId:w,messageId:g});}catch(k){T.error("Failed to publish command event",{name:H,sessionId:w,messageId:g,error:k instanceof Error?k.message:String(k),stack:k instanceof Error?k.stack:void 0});}},he=async H=>{T.debug("Handle command called",{raw:H});let{name:w,args:f}=Dt(H);if(T.debug("Parsed command",{name:w,args:f}),!w){T.debug("No command name, returning");return}try{switch(w){case "help":T.debug("Executing help command"),t.addSystem($t()),T.debug("Help text added to chatLog"),await M("help",e.currentSessionId||"",f||"",randomUUID());break;case "commands":case "command":case "cmds":case "cmd":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="command");if(b.length===0){t.addSystem(a$1("tui.handler.command.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("command",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.command.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening command selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/command ${y.value} `):await re("command",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle command",{error:g}),t.addSystem(a$1("tui.handler.command.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "status":t.addSystem(await vs(e,r)),await M("status",e.currentSessionId||"",f||"",randomUUID());break;case "agents":case "agent":if(f)e.agent=f,t.addSystem(a$1("tui.handler.agent.switched",{vars:{agentId:f}})),u(),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening agent selector");let k=(await ra(e)).filter(S=>S.mode==="primary"&&S.hidden!==!0),b=Be(k,{onSelect:async S=>{e.agent=S.value,t.addSystem(a$1("tui.handler.agent.switched",{vars:{agentId:S.value}})),u(),A(),await b$2(e);},onCancel:A});a(b),await M(w,e.currentSessionId||"","",randomUUID());}break;case "sessions":case "session":if(f&&_)await _(f),u(),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening session selector");let g=await sa(e),k=qe(g,{onSelect:async b=>{_&&await _(b.value),u(),A();},onCancel:A});a(k),await M(w,e.currentSessionId||"","",randomUUID());}break;case "models":case "model":if(f)e.sessionInfo.model=f,t.addSystem(a$1("tui.handler.model.set",{vars:{model:f}})),u(),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening model selector");let g=await ta(e),k=Fe(g,{onSelect:async b=>{e.sessionInfo.model=b.value,t.addSystem(a$1("tui.handler.model.set",{vars:{model:b.value}})),u(),A(),await b$2(e);},onCancel:A});a(k),await M(w,e.currentSessionId||"","",randomUUID());}break;case "fork":{try{d(a$1("tui.handler.fork.begin"));let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before forking session",{sessionId:g});}catch(k){T.warn("Failed to abort agent before forking, continuing anyway",{error:k});}if(t.clear(),g){let b=(await e.sdk.session.fork({sessionID:g})).data;b&&(e.currentSessionId=b.id,e.currentSessionKey=b.title||b.slug||b.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e));}p&&await p(),u(),d(a$1("tui.status.ready"));}catch(g){T.error("Failed to fork session",{error:g}),t.addSystem(a$1("tui.handler.fork.error",{vars:{error:String(g)}})),d(a$1("tui.status.error"));}await M("fork",e.currentSessionId||"",f||"",randomUUID());break}case "new":{try{d(a$1("tui.handler.new.begin"));let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before creating new session",{sessionId:g});}catch(E){T.warn("Failed to abort agent before creating new session, continuing anyway",{error:E});}t.clear();let k=e.instanceContext.directory,S=(await e.sdk.session.create({directory:k})).data;S&&(e.currentSessionId=S.id,e.currentSessionKey=S.title||S.slug||S.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e)),u(),d(a$1("tui.status.ready"));}catch(g){T.error("Failed to create new session",{error:g}),t.addSystem(a$1("tui.handler.new.error",{vars:{error:String(g)}})),d(a$1("tui.status.error"));}await M("new",e.currentSessionId||"",f||"",randomUUID());break}case "reset":{try{let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before reset",{sessionId:g});}catch(k){T.warn("Failed to abort agent before reset, continuing anyway",{error:k});}t.clear(),t.addSystem(a$1("tui.handler.session.reset")),p&&await p();}catch(g){T.error("Failed to reset session",{error:g}),t.addSystem(a$1("tui.handler.session.reset_error",{vars:{error:String(g)}}));}await M("reset",e.currentSessionId||"",f||"",randomUUID());break}case "settings":{T.info("Opening settings panel");let{createSettingsPanel:g}=await import('./settings-panel-4GBMKF7S.mjs'),k=g({currentSettings:{thinkingLevel:e.thinkingLevel,showThinking:e.showThinking,verboseLevel:e.verboseLevel,messageLimit:e.messageLimit,toolsExpanded:e.toolsExpanded,localShellPermission:e.localShellPermission,contextMode:e.contextMode},onChange:(b,S)=>{switch(b){case "thinkingLevel":e.thinkingLevel=S,t.addSystem(a$1("tui.handler.thinking_level.set",{vars:{level:S}}));break;case "showThinking":e.showThinking=S==="true",T.info("showThinking changed",{newValue:S,showThinking:e.showThinking}),t.addSystem(e.showThinking?a$1("tui.hint.show_thinking_on"):a$1("tui.hint.show_thinking_off"));break;case "verboseLevel":e.verboseLevel=S,t.addSystem(a$1("tui.handler.verbose_level.set",{vars:{level:S}}));break;case "messageLimit":e.messageLimit=Number.parseInt(S,10),t.addSystem(a$1("tui.handler.message_limit.set",{vars:{limit:S}}));break;case "toolsExpanded":e.toolsExpanded=S==="true",T.info("toolsExpanded changed",{newValue:S,toolsExpanded:e.toolsExpanded}),t.addSystem(e.toolsExpanded?a$1("tui.hint.tools_expanded"):a$1("tui.hint.tools_collapsed"));break;case "localShellPermission":e.localShellPermission=S,T.info("localShellPermission changed",{newValue:S,localShellPermission:e.localShellPermission}),t.addSystem(a$1("tui.shell.permission.updated",{vars:{permission:S}}));break;case "contextMode":{let E=S;e.contextMode=E,T.info("contextMode changed",{newValue:S,contextMode:E}),t.addSystem(a$1("tui.handler.context_mode.set",{vars:{mode:E}})),e.currentSessionId&&e.sdk.session.contextMode.set({sessionID:e.currentSessionId,mode:E}).catch(y=>{T.error("Failed to update session contextMode",{error:y,sessionId:e.currentSessionId});});break}}b$2(e).then(async()=>{try{T.info("Publishing HeaderRefresh event",{id:b,newValue:S}),await na(e,c.StatusBarRefresh,{reason:`settings changed: ${b}`});}catch(E){T.error("Failed to publish HeaderRefresh event",{error:E});}}).catch(E=>{T.error("Failed to save TUI state after settings change",{error:E,id:b});});},onCancel:A});a(k),await M("settings",e.currentSessionId||"",f||"",randomUUID());break}case "verbose":if(!f){t.addSystem(a$1("tui.handler.verbose.usage")),await M(w,e.currentSessionId||"","",randomUUID());break}if(f!=="on"&&f!=="off"){t.addSystem(a$1("tui.handler.verbose.invalid",{vars:{value:f}})),await M(w,e.currentSessionId||"",f,randomUUID());break}e.verboseLevel=f,t.addSystem(a$1("tui.handler.verbose.set",{vars:{level:f}})),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());break;case "thinking":if(!f){t.addSystem(a$1("tui.handler.thinking.usage"));break}e.thinkingLevel=f,t.addSystem(a$1("tui.handler.thinking.set",{vars:{level:f}})),await b$2(e),await M("thinking",e.currentSessionId||"",f||"",randomUUID());break;case "clear":{T.info("Opening clear confirmation dialog");let{createConfirmDialog:g}=await import('./confirm-dialog-XBLCGOEC.mjs'),k=g({message:a$1("tui.dialog.clear.message"),onConfirm:async()=>{try{d(a$1("tui.handler.clear.begin")),A();let b=e.currentSessionId;if(b&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:b}),e.activeChatRunId=null,T.info("Aborted running agent before clearing session",{sessionId:b});}catch(y){T.warn("Failed to abort agent before clearing, continuing anyway",{error:y});}t.clear(),b&&await e.sdk.session.delete({sessionID:b});let E=(await e.sdk.session.create({directory:e.instanceContext.directory})).data;E&&(e.currentSessionId=E.id,e.currentSessionKey=E.title||E.slug||E.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e)),u(),t.addSystem(a$1("tui.handler.clear.success")),d(a$1("tui.status.ready")),await M("clear",e.currentSessionId||"",f||"",randomUUID());}catch(b){T.error("Failed to clear chat history",{error:b}),t.addSystem(a$1("tui.handler.clear.error",{vars:{error:String(b)}})),d(a$1("tui.status.error")),await M("clear",e.currentSessionId||"",f||"",randomUUID());}},onCancel:()=>{t.addSystem(a$1("tui.clear.cancel")),A();}});a(k);break}case "skills":case "skill":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="skill");if(b.length===0){t.addSystem(a$1("tui.handler.skill.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("skill",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.skill.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening skill selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/skill ${y.value} `):await re("skill",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle skill",{error:g}),t.addSystem(a$1("tui.handler.skill.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "mcps":case "mcp":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="mcp");if(b.length===0){t.addSystem(a$1("tui.handler.mcp.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("mcp",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.mcp.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening MCP prompt selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/mcp ${y.value} `):await re("mcp",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle MCP prompt",{error:g}),t.addSystem(a$1("tui.handler.mcp.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "exit":case "quit":await M(w,e.currentSessionId||"",f||"",randomUUID()),l();break;default:T.debug("Unknown command, sending as message"),await h(H);break}}catch(g){let k=g instanceof Error?g.message:String(g);T.error("Command execution failed",{command:w,args:f,error:k,stack:g instanceof Error?g.stack:void 0}),t.addSystem(a$1("tui.handler.command.error",{vars:{command:w,error:k}}));}T.debug("handleCommand completed");},h=async(H,w,f)=>{try{let g=randomUUID();if(e.activeChatRunId=g,d(a$1("tui.handler.send.sending")),!e.currentSessionId)throw new Error("No active session");let k;if(e.sessionInfo.model){let{provider:E,model:y}=parseModelId(e.sessionInfo.model);E&&y&&(k={providerID:E,modelID:y});}let b=[{type:"text",text:H}];if(w&&w.length>0)for(let E of w)b.push({type:"file",url:E.url,filename:E.filename,mime:E.mime});f&&b.push({type:"agent",name:f});let S=await e.sdk.session.prompt({sessionID:e.currentSessionId,parts:b,agent:e.agent||void 0,model:k,variant:e.thinkingLevel,contextMode:e.contextMode});if(S.data&&e.currentSessionId&&await M("message",e.currentSessionId,H,S.data.info?.id||randomUUID()),S.data){let E=S.data.parts?.filter(y=>y.type==="text")||[];for(let y of E)"text"in y&&y.text&&t.addAssistant(y.text,S.data.info?.id);}e.activeChatRunId=null,d("");}catch(g){e.activeChatRunId=null;let k=g instanceof Error?g.message:String(g),b=g instanceof Error?g.name:"Error";t.addSystem(a$1("tui.handler.send.error",{vars:{error:k}})),d(a$1("tui.handler.send.error_status")),T.error("Failed to send message",{error:k,errorName:b,sessionId:e.currentSessionId,hasModel:!!e.sessionInfo.model,stack:g instanceof Error?g.stack:void 0});}},re=async(H,w,f,g,k,b)=>{try{let S=H==="skill"?a$1("tui.handler.skill.executing"):H==="command"?a$1("tui.handler.command.executing"):a$1("tui.handler.mcp.executing");if(g.addSystem(S+`: ${w}`),k(a$1("tui.handler.executing",{vars:{command:w}})),!f.currentSessionId)throw new Error("No active session");let E;f.sessionInfo.model&&(E=f.sessionInfo.model);let y=b?[{type:"text",text:b}]:void 0,te=(await f.sdk.session.command({sessionID:f.currentSessionId,command:w,arguments:b??"",agent:f.agent||void 0,model:E,variant:f.thinkingLevel,contextMode:f.contextMode,parts:y})).data,ae=te?.metadata?.commandType;if(te?.success)ae==="local"&&g.addSystem(a$1("tui.handler.local.completed")+`: ${w}
5
+ `)}function Ut(s,e){let{chatLog:t,tui:n,directory:r,openOverlay:a,closeOverlay:o,requestExit:l,setActivityStatus:d,updateFooter:u,refreshSessionInfo:c$1,loadHistory:p,setSession:_,refreshAgents:$,abortActive:ne}=s,A=()=>{o();},M=async(H,w,f,g)=>{try{if(!w){T.warn("Cannot publish command event: no session ID",{name:H});return}await na(e,ga.Event.Executed,{name:H,sessionID:w,arguments:f,messageID:g}),T.debug("Command event published",{name:H,sessionId:w,messageId:g});}catch(k){T.error("Failed to publish command event",{name:H,sessionId:w,messageId:g,error:k instanceof Error?k.message:String(k),stack:k instanceof Error?k.stack:void 0});}},he=async H=>{T.debug("Handle command called",{raw:H});let{name:w,args:f}=Dt(H);if(T.debug("Parsed command",{name:w,args:f}),!w){T.debug("No command name, returning");return}try{switch(w){case "help":T.debug("Executing help command"),t.addSystem($t()),T.debug("Help text added to chatLog"),await M("help",e.currentSessionId||"",f||"",randomUUID());break;case "commands":case "command":case "cmds":case "cmd":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="command");if(b.length===0){t.addSystem(a$1("tui.handler.command.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("command",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.command.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening command selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/command ${y.value} `):await re("command",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle command",{error:g}),t.addSystem(a$1("tui.handler.command.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "status":t.addSystem(await vs(e,r)),await M("status",e.currentSessionId||"",f||"",randomUUID());break;case "agents":case "agent":if(f)e.agent=f,t.addSystem(a$1("tui.handler.agent.switched",{vars:{agentId:f}})),u(),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening agent selector");let k=(await ra(e)).filter(S=>S.mode==="primary"&&S.hidden!==!0),b=Be(k,{onSelect:async S=>{e.agent=S.value,t.addSystem(a$1("tui.handler.agent.switched",{vars:{agentId:S.value}})),u(),A(),await b$2(e);},onCancel:A});a(b),await M(w,e.currentSessionId||"","",randomUUID());}break;case "sessions":case "session":if(f&&_)await _(f),u(),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening session selector");let g=await sa(e),k=qe(g,{onSelect:async b=>{_&&await _(b.value),u(),A();},onCancel:A});a(k),await M(w,e.currentSessionId||"","",randomUUID());}break;case "models":case "model":if(f)e.sessionInfo.model=f,t.addSystem(a$1("tui.handler.model.set",{vars:{model:f}})),u(),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());else {T.info("Opening model selector");let g=await ta(e),k=Fe(g,{onSelect:async b=>{e.sessionInfo.model=b.value,t.addSystem(a$1("tui.handler.model.set",{vars:{model:b.value}})),u(),A(),await b$2(e);},onCancel:A});a(k),await M(w,e.currentSessionId||"","",randomUUID());}break;case "fork":{try{d(a$1("tui.handler.fork.begin"));let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before forking session",{sessionId:g});}catch(k){T.warn("Failed to abort agent before forking, continuing anyway",{error:k});}if(t.clear(),g){let b=(await e.sdk.session.fork({sessionID:g})).data;b&&(e.currentSessionId=b.id,e.currentSessionKey=b.title||b.slug||b.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e));}p&&await p(),u(),d(a$1("tui.status.ready"));}catch(g){T.error("Failed to fork session",{error:g}),t.addSystem(a$1("tui.handler.fork.error",{vars:{error:String(g)}})),d(a$1("tui.status.error"));}await M("fork",e.currentSessionId||"",f||"",randomUUID());break}case "new":{try{d(a$1("tui.handler.new.begin"));let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before creating new session",{sessionId:g});}catch(E){T.warn("Failed to abort agent before creating new session, continuing anyway",{error:E});}t.clear();let k=e.instanceContext.directory,S=(await e.sdk.session.create({directory:k})).data;S&&(e.currentSessionId=S.id,e.currentSessionKey=S.title||S.slug||S.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e)),u(),d(a$1("tui.status.ready"));}catch(g){T.error("Failed to create new session",{error:g}),t.addSystem(a$1("tui.handler.new.error",{vars:{error:String(g)}})),d(a$1("tui.status.error"));}await M("new",e.currentSessionId||"",f||"",randomUUID());break}case "reset":{try{let g=e.currentSessionId;if(g&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:g}),e.activeChatRunId=null,T.info("Aborted running agent before reset",{sessionId:g});}catch(k){T.warn("Failed to abort agent before reset, continuing anyway",{error:k});}t.clear(),t.addSystem(a$1("tui.handler.session.reset")),p&&await p();}catch(g){T.error("Failed to reset session",{error:g}),t.addSystem(a$1("tui.handler.session.reset_error",{vars:{error:String(g)}}));}await M("reset",e.currentSessionId||"",f||"",randomUUID());break}case "settings":{T.info("Opening settings panel");let{createSettingsPanel:g}=await import('./settings-panel-SM37CCB4.mjs'),k=g({currentSettings:{thinkingLevel:e.thinkingLevel,showThinking:e.showThinking,verboseLevel:e.verboseLevel,messageLimit:e.messageLimit,toolsExpanded:e.toolsExpanded,localShellPermission:e.localShellPermission,contextMode:e.contextMode},onChange:(b,S)=>{switch(b){case "thinkingLevel":e.thinkingLevel=S,t.addSystem(a$1("tui.handler.thinking_level.set",{vars:{level:S}}));break;case "showThinking":e.showThinking=S==="true",T.info("showThinking changed",{newValue:S,showThinking:e.showThinking}),t.addSystem(e.showThinking?a$1("tui.hint.show_thinking_on"):a$1("tui.hint.show_thinking_off"));break;case "verboseLevel":e.verboseLevel=S,t.addSystem(a$1("tui.handler.verbose_level.set",{vars:{level:S}}));break;case "messageLimit":e.messageLimit=Number.parseInt(S,10),t.addSystem(a$1("tui.handler.message_limit.set",{vars:{limit:S}}));break;case "toolsExpanded":e.toolsExpanded=S==="true",T.info("toolsExpanded changed",{newValue:S,toolsExpanded:e.toolsExpanded}),t.addSystem(e.toolsExpanded?a$1("tui.hint.tools_expanded"):a$1("tui.hint.tools_collapsed"));break;case "localShellPermission":e.localShellPermission=S,T.info("localShellPermission changed",{newValue:S,localShellPermission:e.localShellPermission}),t.addSystem(a$1("tui.shell.permission.updated",{vars:{permission:S}}));break;case "contextMode":{let E=S;e.contextMode=E,T.info("contextMode changed",{newValue:S,contextMode:E}),t.addSystem(a$1("tui.handler.context_mode.set",{vars:{mode:E}})),e.currentSessionId&&e.sdk.session.contextMode.set({sessionID:e.currentSessionId,mode:E}).catch(y=>{T.error("Failed to update session contextMode",{error:y,sessionId:e.currentSessionId});});break}}b$2(e).then(async()=>{try{T.info("Publishing HeaderRefresh event",{id:b,newValue:S}),await na(e,c.StatusBarRefresh,{reason:`settings changed: ${b}`});}catch(E){T.error("Failed to publish HeaderRefresh event",{error:E});}}).catch(E=>{T.error("Failed to save TUI state after settings change",{error:E,id:b});});},onCancel:A});a(k),await M("settings",e.currentSessionId||"",f||"",randomUUID());break}case "verbose":if(!f){t.addSystem(a$1("tui.handler.verbose.usage")),await M(w,e.currentSessionId||"","",randomUUID());break}if(f!=="on"&&f!=="off"){t.addSystem(a$1("tui.handler.verbose.invalid",{vars:{value:f}})),await M(w,e.currentSessionId||"",f,randomUUID());break}e.verboseLevel=f,t.addSystem(a$1("tui.handler.verbose.set",{vars:{level:f}})),await b$2(e),await M(w,e.currentSessionId||"",f,randomUUID());break;case "thinking":if(!f){t.addSystem(a$1("tui.handler.thinking.usage"));break}e.thinkingLevel=f,t.addSystem(a$1("tui.handler.thinking.set",{vars:{level:f}})),await b$2(e),await M("thinking",e.currentSessionId||"",f||"",randomUUID());break;case "clear":{T.info("Opening clear confirmation dialog");let{createConfirmDialog:g}=await import('./confirm-dialog-JSKEM3X2.mjs'),k=g({message:a$1("tui.dialog.clear.message"),onConfirm:async()=>{try{d(a$1("tui.handler.clear.begin")),A();let b=e.currentSessionId;if(b&&e.activeChatRunId)try{await e.sdk.session.abort({sessionID:b}),e.activeChatRunId=null,T.info("Aborted running agent before clearing session",{sessionId:b});}catch(y){T.warn("Failed to abort agent before clearing, continuing anyway",{error:y});}t.clear(),b&&await e.sdk.session.delete({sessionID:b});let E=(await e.sdk.session.create({directory:e.instanceContext.directory})).data;E&&(e.currentSessionId=E.id,e.currentSessionKey=E.title||E.slug||E.id,e.sessionInfo={model:e.sessionInfo.model},await b$2(e)),u(),t.addSystem(a$1("tui.handler.clear.success")),d(a$1("tui.status.ready")),await M("clear",e.currentSessionId||"",f||"",randomUUID());}catch(b){T.error("Failed to clear chat history",{error:b}),t.addSystem(a$1("tui.handler.clear.error",{vars:{error:String(b)}})),d(a$1("tui.status.error")),await M("clear",e.currentSessionId||"",f||"",randomUUID());}},onCancel:()=>{t.addSystem(a$1("tui.clear.cancel")),A();}});a(k);break}case "skills":case "skill":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="skill");if(b.length===0){t.addSystem(a$1("tui.handler.skill.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("skill",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.skill.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening skill selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/skill ${y.value} `):await re("skill",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle skill",{error:g}),t.addSystem(a$1("tui.handler.skill.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "mcps":case "mcp":{try{let b=((await e.sdk.command.list({})).data||[]).filter(y=>y.source==="mcp");if(b.length===0){t.addSystem(a$1("tui.handler.mcp.empty")),await M(w,e.currentSessionId||"",f||"",randomUUID());break}if(f){let y=f.split(/\s+/),G=y[0],te=y.slice(1).join(" ");b.some(ae=>ae.name===G)?await re("mcp",G,e,t,d,te||void 0):t.addSystem(a$1("tui.handler.mcp.not_found",{vars:{name:G}})),await M(w,e.currentSessionId||"",f,randomUUID());break}T.info("Opening MCP prompt selector");let S=b.map(y=>({label:y.name,description:y.description||"",value:y.name})),E=pe(S,{onSelect:async y=>{A(),s.setInputText?s.setInputText(`/mcp ${y.value} `):await re("mcp",y.value,e,t,d);},onCancel:A});a(E),await M(w,e.currentSessionId||"","",randomUUID());}catch(g){T.error("Failed to handle MCP prompt",{error:g}),t.addSystem(a$1("tui.handler.mcp.error",{vars:{error:String(g)}})),await M(w,e.currentSessionId||"",f||"",randomUUID());}break}case "exit":case "quit":await M(w,e.currentSessionId||"",f||"",randomUUID()),l();break;default:T.debug("Unknown command, sending as message"),await h(H);break}}catch(g){let k=g instanceof Error?g.message:String(g);T.error("Command execution failed",{command:w,args:f,error:k,stack:g instanceof Error?g.stack:void 0}),t.addSystem(a$1("tui.handler.command.error",{vars:{command:w,error:k}}));}T.debug("handleCommand completed");},h=async(H,w,f)=>{try{let g=randomUUID();if(e.activeChatRunId=g,d(a$1("tui.handler.send.sending")),!e.currentSessionId)throw new Error("No active session");let k;if(e.sessionInfo.model){let{provider:E,model:y}=parseModelId(e.sessionInfo.model);E&&y&&(k={providerID:E,modelID:y});}let b=[{type:"text",text:H}];if(w&&w.length>0)for(let E of w)b.push({type:"file",url:E.url,filename:E.filename,mime:E.mime});f&&b.push({type:"agent",name:f});let S=await e.sdk.session.prompt({sessionID:e.currentSessionId,parts:b,agent:e.agent||void 0,model:k,variant:e.thinkingLevel,contextMode:e.contextMode});if(S.data&&e.currentSessionId&&await M("message",e.currentSessionId,H,S.data.info?.id||randomUUID()),S.data){let E=S.data.parts?.filter(y=>y.type==="text")||[];for(let y of E)"text"in y&&y.text&&t.addAssistant(y.text,S.data.info?.id);}e.activeChatRunId=null,d("");}catch(g){e.activeChatRunId=null;let k=g instanceof Error?g.message:String(g),b=g instanceof Error?g.name:"Error";t.addSystem(a$1("tui.handler.send.error",{vars:{error:k}})),d(a$1("tui.handler.send.error_status")),T.error("Failed to send message",{error:k,errorName:b,sessionId:e.currentSessionId,hasModel:!!e.sessionInfo.model,stack:g instanceof Error?g.stack:void 0});}},re=async(H,w,f,g,k,b)=>{try{let S=H==="skill"?a$1("tui.handler.skill.executing"):H==="command"?a$1("tui.handler.command.executing"):a$1("tui.handler.mcp.executing");if(g.addSystem(S+`: ${w}`),k(a$1("tui.handler.executing",{vars:{command:w}})),!f.currentSessionId)throw new Error("No active session");let E;f.sessionInfo.model&&(E=f.sessionInfo.model);let y=b?[{type:"text",text:b}]:void 0,te=(await f.sdk.session.command({sessionID:f.currentSessionId,command:w,arguments:b??"",agent:f.agent||void 0,model:E,variant:f.thinkingLevel,contextMode:f.contextMode,parts:y})).data,ae=te?.metadata?.commandType;if(te?.success)ae==="local"&&g.addSystem(a$1("tui.handler.local.completed")+`: ${w}
6
6
  `+a$1("tui.handler.local.output")+`:
7
7
  `+te.output);else {let Je=te?.error??"Command execution failed",ke=H==="skill"?"tui.handler.skill.error":H==="command"?"tui.handler.command.error":"tui.handler.mcp.error";g.addSystem(a$1(ke,{vars:{command:w,error:Je}}));}k("");}catch(S){let E=S instanceof Error?S.message:String(S),y=S instanceof Error?S.name:"Error",G=H==="skill"?a$1("tui.handler.skill.error"):H==="command"?a$1("tui.handler.command.error"):a$1("tui.handler.mcp.error");g.addSystem(G+`: ${w}
8
8
  ${E}`),k(a$1("tui.status.error")),T.error("Failed to execute command",{type:H,name:w,error:E,errorName:y,sessionId:f.currentSessionId,stack:S instanceof Error?S.stack:void 0});}};return {handleCommand:he,sendMessage:h}}var L=a.create({service:"cli-tui-events"});function Ot(s){return e=>{try{if(e.type==="message.updated"){xs(s,e);return}if(e.type==="message.part.updated"){ws(s,e);return}if(e.type==="session.status"){Fs(s,e);return}if(e.type==="session.error"){qs(s,e);return}if(e.type==="agent.updated"){Bs(s,e);return}if(e.type==="session.updated"){Us(s,e);return}if(e.type==="permission.asked"){Os(s,e);return}if(e.type==="question.asked"){Ws(s,e);return}}catch(t){L.error("Event handling failed",{eventType:e.type,error:t instanceof Error?t.message:String(t)});}}}function xs(s,e){if(e.type!=="message.updated")return;let{properties:t}=e,{info:n}=t,r=s.state?.currentSessionId||s.sessionId;if(!(r&&n.sessionID!==r)&&(L.debug("Message updated",{role:n.role,agent:n.agent,sessionID:n.sessionID,messageId:n.id}),n.role,s.state&&"model"in n&&n.model)){let a=`${n.model.providerID}/${n.model.modelID}`;s.state.sessionInfo.model=a,L.debug("Model info updated",{model:a}),s.updateFooter&&s.updateFooter();}}function ws(s,e){if(e.type!=="message.part.updated")return;let{properties:t}=e,{part:n}=t;if(!n){L.warn("Message part is undefined",{event:e,properties:t,propertiesType:typeof t,propertiesKeys:t?Object.keys(t):[]});return}let r=s.state?.currentSessionId||s.sessionId;r&&n.sessionID!==r||(Ts(n),ks(s,n));}function Ts(s){L.debug("handleMessagePartUpdated",{type:s.type,status:"state"in s?s.state?.status:void 0,hasTimeEnd:"time"in s&&s.time&&"end"in s.time?!!s.time.end:false,timeEnd:"time"in s&&s.time&&"end"in s.time?s.time.end:void 0,hasText:"text"in s,textLength:"text"in s&&s.text?.length||0,textPreview:"text"in s?s.text?.substring(0,100):void 0,sessionID:s.sessionID});}function ks(s,e){if(e.type==="tool"){Rs(s,e);return}if(e.type==="text"){if("time"in e&&e.time&&"end"in e.time&&e.time.end){L.info("Calling handleTextPart",{hasText:"text"in e&&!!e.text,textLength:"text"in e&&e.text?.length||0}),$s(s,e);return}if(!("time"in e)){L.info("Calling handleUserTextPart for user message",{hasText:!!e.text,textLength:e.text?.length||0}),Ps(s,e);return}}if(e.type==="reasoning"&&"time"in e&&e.time&&"end"in e.time&&e.time.end){Hs(s,e);return}if(e.type==="step-start"){As(s);return}if(e.type==="step-finish"){Es(s,e);return}if(e.type==="subtask-result"){Ls(s,e);return}}function Ps(s,e){let t=e.text?.trim();t&&(L.debug("User text output",{length:t.length,messageId:e.messageID}),s.chatLog.addUser(t,e.messageID),s.tui.requestRender());}function As(s){s.setActivityStatus(a$1("tui.status.executing_step"));}function Es(s,e){s.setActivityStatus(a$1("tui.status.step_completed")),s.state&&e.tokens&&Ds(s,e.tokens);}function Ls(s,e){L.debug("handleSubagentResultPart called",{taskId:e.taskId,agent:e.agent,status:e.status});let t=Ja.formatSubtaskResultPart(e);L.debug("formattedContent",{content:t}),s.chatLog.addUser(t,e.id,{agent:e.agent,isSubagentResult:true,subtaskResultPart:{taskId:e.taskId,source:e.source,agent:e.agent,status:e.status,result:e.result,error:e.error,duration:e.duration,rounds:e.rounds,time:e.time,metadata:e.metadata}}),s.tui.requestRender();}async function Ms(s){let e=s.sessionInfo.model;if(!e)return null;let{provider:t,model:n}=parseModelId(e);if(!t||!n)return null;try{return ((await s.sdk.config.providers({})).data?.providers??[]).find(d=>d.id===t)?.models?.[n]?.limit?.context??null}catch(r){return L.warn("Failed to get context limit from model config",{error:r,providerID:t,modelID:n}),null}}function Ds(s,e){let t=e.input+e.output+e.reasoning+e.cache.read+e.cache.write;s.state.sessionInfo.totalTokens=t,s.state.sessionInfo.contextTokens||Ms(s.state).then(n=>{s.state.sessionInfo.contextTokens=n??2e5,L.debug("Context limit updated",{contextLimit:s.state.sessionInfo.contextTokens}),s.updateFooter&&s.updateFooter();}),L.debug("Token usage updated",{total:t,input:e.input,output:e.output,reasoning:e.reasoning,cacheRead:e.cache.read,cacheWrite:e.cache.write});}function _s(s){let e=s.state?.status==="running"||s.state?.status==="completed"?s.state.input:void 0;if(!e)return;let t=e.filePath??e.filepath??e.path,n=e.title;return t?n=Filesystem.normalize(t):e.url&&(n=e.url),n}function Rs(s,e){if(!e.state){L.warn("Tool part missing state",{tool:e.tool,partType:e.type});return}let t=_s(e),n=t?`${e.tool} ${t}`:e.tool;if(e.state.status==="running"&&(s.setActivityStatus(a$1("tui.status.executing_tool",{vars:{tool:e.tool}})),s.chatLog.addSystem(a$1("tui.system.tool_executing",{vars:{tool:n}}),e.id,{isTool:true,toolName:e.tool,toolCallId:e.callID,toolStatus:"executing",title:t}),s.updateChatLog&&s.updateChatLog()),e.state.status==="completed"){if(s.setActivityStatus(a$1("tui.status.tool_completed")),s.chatLog.addSystem(a$1("tui.system.tool_completed",{vars:{tool:n}}),e.id,{isTool:true,toolName:e.tool,toolCallId:e.callID,toolStatus:"completed",result:e.state.output,title:t}),s.state?.toolsExpanded&&s.state?.verboseLevel==="on"&&e.state.output){let a=(typeof e.state.output=="string"?e.state.output:JSON.stringify(e.state.output,null,2)).trim();a&&s.chatLog.addSystem(`Tool output:
@@ -33,7 +33,7 @@ ${E}`),k(a$1("tui.status.error")),T.error("Failed to execute command",{type:H,na
33
33
  `;}L.debug("displayQuestion - final message",{messageLength:l.length,messagePreview:l.substring(0,100)}),s.chatLog.addSystem(l);}var K=a.create({service:"cli-tui-session-actions"});async function Nt(s){K.info("Refreshing agent list");try{s.setActivityStatus(a$1("tui.session.loading_agents"));let n=((await s.sdk.app.agents({})).data||[]).map(r=>r.name);return K.info("Agent list loaded",{count:n.length}),s.setActivityStatus(a$1("tui.status.ready")),n}catch(e){return K.error("Failed to refresh agent list",{error:e}),s.chatLog.addSystem(a$1("tui.session.agents_failed",{vars:{error:String(e)}})),s.setActivityStatus(a$1("tui.status.error")),[]}}async function dt(s,e){K.info("Refreshing session info",{sessionId:e});try{s.setActivityStatus(a$1("tui.session.loading_info"));let n=(await s.sdk.session.get({sessionID:e})).data;return K.info("Session info loaded",{sessionId:e}),s.setActivityStatus(a$1("tui.status.ready")),n??null}catch(t){return K.error("Failed to refresh session info",{sessionId:e,error:t}),s.chatLog.addSystem(a$1("tui.session.info_failed",{vars:{error:String(t)}})),s.setActivityStatus(a$1("tui.status.error")),null}}async function Ue(s,e,t){K.info("Loading history",{sessionId:e,limit:t});try{s.setActivityStatus(a$1("tui.session.loading_history"));let r=(await s.sdk.session.messages({sessionID:e,limit:t})).data||[];K.info("History loaded",{sessionId:e,count:r.length});for(let a=0;a<r.length;a++){let o=r[a],l=o?.info?.role;if(l==="user"){let u=(o?.parts?.filter(p=>p.type==="text")||[]).map(p=>("text"in p?p.text:"")||"").join(`
34
34
  `),c=o?.parts?.filter(p=>p.type==="subtask-result")||[];K.debug("loadHistory processing user message",{messageId:o?.info?.id,partCount:o?.parts?.length||0,subtaskPartCount:c.length});for(let p of c)if("agent"in p&&"taskId"in p){K.debug("loadHistory adding subtask-result",{messageId:o?.info?.id,agent:p.agent,taskId:p.taskId});let _=Ja.formatSubtaskResultPart(p);s.chatLog.addUser(_,o?.info?.id,{agent:p.agent||"SubAgent",isSubagentResult:!0,subtaskResultPart:{taskId:p.taskId,source:p.source,agent:p.agent,status:p.status,result:p.result,error:p.error,duration:p.duration,rounds:p.rounds,time:p.time,metadata:p.metadata}});}u&&s.chatLog.addUser(u,o?.info?.id,{agent:o?.info?.agent});}else if(l==="assistant"){let u=(o?.parts?.filter(c=>c.type==="text")||[]).map(c=>("text"in c?c.text:"")||"").join(`
35
35
  `);u&&s.chatLog.addAssistant(u,o?.info?.id,{agent:o?.info?.agent});}else if(l==="system"){let u=(o?.parts?.filter(c=>c.type==="text")||[]).map(c=>("text"in c?c.text:"")||"").join(`
36
- `);s.chatLog.addSystem(u,o?.info?.id,{agent:o?.info?.agent});}}return s.setActivityStatus(a$1("tui.status.ready")),r}catch(n){return K.error("Failed to load history",{sessionId:e,error:n}),s.chatLog.addSystem(a$1("tui.session.history_failed",{vars:{error:String(n)}})),s.setActivityStatus(a$1("tui.status.error")),[]}}async function Qt(s,e,t){K.info("Switching session",{sessionId:e});try{t.currentSessionId=e,t.currentSessionKey=e,t.historyLoaded=!1;let n=await dt(s,e);n&&(t.currentSessionKey=n.title||e,t.sessionInfo.model=n.model,t.sessionInfo.modelProvider=n.modelProvider);let{loadTuiState:r,saveTuiStateToStorage:a}=await import('./preferences-SIWFQFGI.mjs'),o=await r(e);t.toolsExpanded=o.toolsExpanded,t.showThinking=o.showThinking,t.thinkingLevel=o.thinkingLevel,t.verboseLevel=o.verboseLevel,t.messageLimit=o.messageLimit,t.localShellPermission=o.localShellPermission,o.model&&(t.sessionInfo.model=o.model),o.agent&&(t.agent=o.agent),K.debug("Session preferences loaded",{sessionId:e,model:t.sessionInfo.model,agent:t.agent,thinkingLevel:t.thinkingLevel}),await a(t),await Ue(s,e,t.messageLimit),t.historyLoaded=!0,s.chatLog.addSystem(a$1("tui.session.switched",{vars:{sessionId:e}}));}catch(n){K.error("Failed to switch session",{sessionId:e,error:n}),s.chatLog.addSystem(a$1("tui.session.switch_failed",{vars:{error:String(n)}})),s.setActivityStatus(a$1("tui.status.error"));}}async function Gt(s,e){K.info("Aborting current run",{sessionId:e});try{s.setActivityStatus(a$1("tui.session.aborting"));let t=s.sdk.session.abort({sessionID:e}),n=new Promise((r,a)=>{setTimeout(()=>a(new Error(a$1("tui.abort.timeout"))),5e3);});await Promise.race([t,n]),s.chatLog.addSystem(a$1("tui.session.aborted")),s.setActivityStatus(a$1("tui.status.ready"));}catch(t){K.error("Failed to abort",{sessionId:e,error:t}),s.chatLog.addSystem(a$1("tui.session.abort_failed",{vars:{error:String(t)}})),s.setActivityStatus(a$1("tui.status.error"));}}function jt(s,e){return {openOverlay:r=>{s.showOverlay(r);},closeOverlay:()=>{s.hasOverlay()&&s.hideOverlay(),s.setFocus(e);}}}var Oe=a.create({service:"tui-autocomplete"});function Kt(s){return new ct(s)}var ct=class{constructor(e){b(this,"basePath");b(this,"commands");b(this,"getAgents");this.basePath=e.basePath,this.commands=e.slashCommands,this.getAgents=e.getAgents;}updateCommands(e){this.commands=e;}setGetAgents(e){this.getAgents=e;}async getSuggestions(e,t,n,r){let o=(e[t]||"").slice(0,n),l=this.extractHashPrefix(o);if(l)return this.getFileSuggestions(l);let d=this.extractAtPrefix(o);return d?await this.getAgentSuggestions(d):o.startsWith("/")?this.getCommandSuggestions(o):null}applyCompletion(e,t,n,r,a){let o=e[t]||"",l=o.slice(0,n-a.length),d=o.slice(n);if(a.startsWith("#")){let u=r.label.endsWith("/"),c=u?r.value.replace(/\/$/,""):r.value,p=u?"":" ";return {lines:[...e.slice(0,t),l+c+p+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+c.length+p.length}}if(a.startsWith("@"))return {lines:[...e.slice(0,t),l+r.value+" "+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+r.value.length+1};if(a.startsWith("/")){let u="/"+r.value+" ";return {lines:[...e.slice(0,t),l+u+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+u.length}}return {lines:[...e.slice(0,t),l+r.value+" "+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+r.value.length+1}}async getCommandSuggestions(e){let t=e.indexOf(" ");if(t===-1){let d=e.slice(1),u=this.commands.filter(c=>c.name.toLowerCase().includes(d.toLowerCase())).map(c=>({value:c.name,label:c.name,description:c.description}));return u.length===0?null:{items:u.slice(0,50),prefix:e}}let n=e.slice(1,t),r=e.slice(t+1),a=this.commands.find(d=>d.name===n);if(!a?.getArgumentCompletions)return null;let o=a.getArgumentCompletions(r),l=o instanceof Promise?await o:o;return !l||l.length===0?null:{items:l.slice(0,50),prefix:r}}getFileSuggestions(e){let t=e.startsWith('#"')?e.slice(2):e.slice(1),n=e.startsWith('#"'),r=t.replace(/\\/g,"/");if(this.isDrivePath(r))return Oe.debug("Drive path, skip autocomplete",{normalizedPath:r}),null;let{targetPath:a,searchQuery:o}=this.parsePath(r),l=this.resolveBaseDir(a);try{let d;try{d=readdirSync(l,{withFileTypes:!0});}catch{return Oe.debug("Directory not found",{baseDir:l}),null}let u=[];for(let c of d){if(o&&!c.name.toLowerCase().includes(o.toLowerCase()))continue;let p=c.isDirectory(),_=a?`${a}${c.name}`:c.name;if(u.push({value:n?`#"${_}${p?"/":""}"`:`#${_}${p?"/":""}`,label:p?`${c.name}/`:c.name,description:_}),u.length>=50)break}return u.sort((c,p)=>{let _=c.label.endsWith("/"),$=p.label.endsWith("/");return _&&!$?-1:!_&&$?1:c.label.localeCompare(p.label)}),u.length===0?null:{items:u,prefix:e}}catch(d){return Oe.debug("File search failed",{error:d,targetPath:a}),null}}async getAgentSuggestions(e){if(!this.getAgents)return null;let t=e.slice(1);try{let r=(await this.getAgents()).filter(a=>a.hidden!==!0).filter(a=>a.name.toLowerCase().includes(t.toLowerCase())).map(a=>({value:`@${a.name}`,label:a.name,description:a.description}));return r.length===0?null:{items:r.slice(0,50),prefix:e}}catch(n){return Oe.debug("Agent search failed",{error:n,prefix:e}),null}}extractAtPrefix(e){let t=new Set([" "," ",'"',"'","="]);for(let n=e.length-1;n>=0;n--)if(t.has(e[n]??"")){let r=n+1;return e[r]==="@"?e.slice(r):null}return e.startsWith("@")?e:null}extractHashPrefix(e){let t=new Set([" "," ",'"',"'","="]);for(let n=e.length-1;n>=0;n--)if(t.has(e[n]??"")){let r=n+1;return e[r]==="#"?e.slice(r):null}return e.startsWith("#")?e:null}isDrivePath(e){return /^[A-Za-z]:[/\\]?$/.test(e)}parsePath(e){let t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return t===-1?{targetPath:"",searchQuery:e}:{targetPath:e.slice(0,t+1),searchQuery:e.slice(t+1)}}resolveBaseDir(e){return e?zt.join(this.basePath,e):this.basePath}};function ut(s,e){let t=[],n=/(?<![\w`])#(\S+)/g,r;for(;(r=n.exec(s))!==null;){let a=r[1];if(!a)continue;let o=a.replace(/\\/g,"/"),l=js(o,e);existsSync(l)&&t.push({path:a,url:pathToFileURL(l).href,exists:true});}return {attachments:t,invalidPaths:[]}}function js(s,e){if(/^[A-Za-z]:[/\\]/.test(s))return s;let t=s.replace(/^[/\\]+/,"");return zt.join(e,t)}var U=a.create({service:"cli-tui-input-handlers"}),We=class{constructor(){b(this,"handlers",[]);b(this,"isBrowsingHistory",false);}register(e){this.handlers.push(e),U.debug("Register input handler",{name:e.name,total:this.handlers.length});}setHistoryBrowsing(e){this.isBrowsingHistory=e;}isHistoryBrowsing(){return this.isBrowsingHistory}async handle(e,t){let n=e.trim();if(n){this.isBrowsingHistory;for(let r of this.handlers)if(r.canHandle(n,t.state)){U.debug("Handle input with handler",{handler:r.name,input:n.substring(0,50)}),await r.handle(n,t);return}U.warn("No handler can process input",{input:n.substring(0,50)});}}getPrompt(e){for(let t of this.handlers)if(t.getPrompt&&t.canHandle("",e)){let n=t.getPrompt(e);if(n)return n}return "> "}},Ne=class{constructor(){b(this,"name","permission");}canHandle(e,t){return t.pendingPermission!==null}async handle(e,t){let{state:n,chatLog:r,tui:a}=t,o=n.pendingPermission;if(!o)return;let l=e.toLowerCase().trim(),d;if(l==="y"||l==="yes")d="once";else if(l==="a"||l==="always")d="always";else if(l==="n"||l==="no"||l==="reject")d="reject";else {r.addSystem(a$1("tui.permission.invalid_input"));return}try{await pa(n,{requestID:o.id,reply:d}),n.pendingPermission=null;let u=d==="once"?a$1("tui.permission.once"):d==="always"?a$1("tui.permission.always"):a$1("tui.permission.reject");r.addSystem(a$1("tui.permission.replied",{vars:{reply:u}})),U.info("Permission request replied",{requestID:o.id,reply:d});}catch(u){U.error("Failed to reply permission request",{error:u}),r.addSystem(a$1("tui.permission.error")),n.pendingPermission=null;}}getPrompt(e){return e.pendingPermission?a$1("tui.permission.prompt"):"> "}},Qe=class{constructor(){b(this,"name","question");}canHandle(e,t){return !(t.pendingQuestion===null||e.startsWith("/"))}async handle(e,t){let{state:n,chatLog:r,tui:a}=t,o=n.pendingQuestion;if(!o){U.warn("QuestionInputHandler.handle - no pending question");return}U.debug("QuestionInputHandler.handle - processing input",{input:e.substring(0,50),currentIndex:o.currentQuestionIndex,totalQuestions:o.questions.length,requestID:o.id});let l=o.currentQuestionIndex,d=o.questions[l];if(!d){U.error("Current question does not exist",{currentIndex:l,totalQuestions:o.questions.length}),n.pendingQuestion=null;return}let u=this.parseAnswer(e,d);if(!u){U.debug("QuestionInputHandler.handle - invalid input",{input:e}),r.addSystem(a$1("tui.question.invalid_input"));return}if(U.debug("QuestionInputHandler.handle - answer parsed",{answer:u,answerLength:u.length}),o.collectedAnswers.push(u),o.currentQuestionIndex++,o.currentQuestionIndex<o.questions.length){U.debug("QuestionInputHandler.handle - showing next question",{nextIndex:o.currentQuestionIndex,totalQuestions:o.questions.length});let c=o.questions[o.currentQuestionIndex];c&&this.displayQuestion(c,o.currentQuestionIndex,o.questions.length,r);}else {U.info("QuestionInputHandler.handle - all questions answered, calling API",{requestID:o.id,answerCount:o.collectedAnswers.length,answers:o.collectedAnswers});try{await qa(n,{requestID:o.id,answers:o.collectedAnswers}),n.pendingQuestion=null,r.addSystem(a$1("tui.question.completed",{vars:{count:o.collectedAnswers.length}})),U.info("Question request completed",{requestID:o.id});}catch(c){U.error("Failed to reply question request",{error:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0,requestID:o.id,answers:o.collectedAnswers,errorType:c instanceof Error?c.constructor.name:typeof c});let p=c instanceof Error?c.message:String(c);r.addSystem(`${a$1("tui.question.error")}: ${p}`),n.pendingQuestion=null;}}}parseAnswer(e,t){let n=e.trim();if(!t.options||t.options.length===0)return [n];let r=n.match(/^(\d+(?:,\s*\d+)*)$/);if(r?.[1]){let o=r[1].split(",").map(l=>Number.parseInt(l.trim(),10)).filter(l=>l>0&&l<=t.options.length);if(o.length===0)return null;if(!t.multiple&&o.length>1){let l=o[0];if(l!==void 0){let d=t.options[l-1];if(d)return [d.label]}return null}return o.map(l=>{let d=t.options[l-1];return d?d.label:""}).filter(l=>l!=="")}return t.custom===false?null:[n]}displayQuestion(e,t,n,r){let a=`
36
+ `);s.chatLog.addSystem(u,o?.info?.id,{agent:o?.info?.agent});}}return s.setActivityStatus(a$1("tui.status.ready")),r}catch(n){return K.error("Failed to load history",{sessionId:e,error:n}),s.chatLog.addSystem(a$1("tui.session.history_failed",{vars:{error:String(n)}})),s.setActivityStatus(a$1("tui.status.error")),[]}}async function Qt(s,e,t){K.info("Switching session",{sessionId:e});try{t.currentSessionId=e,t.currentSessionKey=e,t.historyLoaded=!1;let n=await dt(s,e);n&&(t.currentSessionKey=n.title||e,t.sessionInfo.model=n.model,t.sessionInfo.modelProvider=n.modelProvider);let{loadTuiState:r,saveTuiStateToStorage:a}=await import('./preferences-7X5P7MJV.mjs'),o=await r(e);t.toolsExpanded=o.toolsExpanded,t.showThinking=o.showThinking,t.thinkingLevel=o.thinkingLevel,t.verboseLevel=o.verboseLevel,t.messageLimit=o.messageLimit,t.localShellPermission=o.localShellPermission,o.model&&(t.sessionInfo.model=o.model),o.agent&&(t.agent=o.agent),K.debug("Session preferences loaded",{sessionId:e,model:t.sessionInfo.model,agent:t.agent,thinkingLevel:t.thinkingLevel}),await a(t),await Ue(s,e,t.messageLimit),t.historyLoaded=!0,s.chatLog.addSystem(a$1("tui.session.switched",{vars:{sessionId:e}}));}catch(n){K.error("Failed to switch session",{sessionId:e,error:n}),s.chatLog.addSystem(a$1("tui.session.switch_failed",{vars:{error:String(n)}})),s.setActivityStatus(a$1("tui.status.error"));}}async function Gt(s,e){K.info("Aborting current run",{sessionId:e});try{s.setActivityStatus(a$1("tui.session.aborting"));let t=s.sdk.session.abort({sessionID:e}),n=new Promise((r,a)=>{setTimeout(()=>a(new Error(a$1("tui.abort.timeout"))),5e3);});await Promise.race([t,n]),s.chatLog.addSystem(a$1("tui.session.aborted")),s.setActivityStatus(a$1("tui.status.ready"));}catch(t){K.error("Failed to abort",{sessionId:e,error:t}),s.chatLog.addSystem(a$1("tui.session.abort_failed",{vars:{error:String(t)}})),s.setActivityStatus(a$1("tui.status.error"));}}function jt(s,e){return {openOverlay:r=>{s.showOverlay(r);},closeOverlay:()=>{s.hasOverlay()&&s.hideOverlay(),s.setFocus(e);}}}var Oe=a.create({service:"tui-autocomplete"});function Kt(s){return new ct(s)}var ct=class{constructor(e){b(this,"basePath");b(this,"commands");b(this,"getAgents");this.basePath=e.basePath,this.commands=e.slashCommands,this.getAgents=e.getAgents;}updateCommands(e){this.commands=e;}setGetAgents(e){this.getAgents=e;}async getSuggestions(e,t,n,r){let o=(e[t]||"").slice(0,n),l=this.extractHashPrefix(o);if(l)return this.getFileSuggestions(l);let d=this.extractAtPrefix(o);return d?await this.getAgentSuggestions(d):o.startsWith("/")?this.getCommandSuggestions(o):null}applyCompletion(e,t,n,r,a){let o=e[t]||"",l=o.slice(0,n-a.length),d=o.slice(n);if(a.startsWith("#")){let u=r.label.endsWith("/"),c=u?r.value.replace(/\/$/,""):r.value,p=u?"":" ";return {lines:[...e.slice(0,t),l+c+p+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+c.length+p.length}}if(a.startsWith("@"))return {lines:[...e.slice(0,t),l+r.value+" "+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+r.value.length+1};if(a.startsWith("/")){let u="/"+r.value+" ";return {lines:[...e.slice(0,t),l+u+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+u.length}}return {lines:[...e.slice(0,t),l+r.value+" "+d,...e.slice(t+1)],cursorLine:t,cursorCol:l.length+r.value.length+1}}async getCommandSuggestions(e){let t=e.indexOf(" ");if(t===-1){let d=e.slice(1),u=this.commands.filter(c=>c.name.toLowerCase().includes(d.toLowerCase())).map(c=>({value:c.name,label:c.name,description:c.description}));return u.length===0?null:{items:u.slice(0,50),prefix:e}}let n=e.slice(1,t),r=e.slice(t+1),a=this.commands.find(d=>d.name===n);if(!a?.getArgumentCompletions)return null;let o=a.getArgumentCompletions(r),l=o instanceof Promise?await o:o;return !l||l.length===0?null:{items:l.slice(0,50),prefix:r}}getFileSuggestions(e){let t=e.startsWith('#"')?e.slice(2):e.slice(1),n=e.startsWith('#"'),r=t.replace(/\\/g,"/");if(this.isDrivePath(r))return Oe.debug("Drive path, skip autocomplete",{normalizedPath:r}),null;let{targetPath:a,searchQuery:o}=this.parsePath(r),l=this.resolveBaseDir(a);try{let d;try{d=readdirSync(l,{withFileTypes:!0});}catch{return Oe.debug("Directory not found",{baseDir:l}),null}let u=[];for(let c of d){if(o&&!c.name.toLowerCase().includes(o.toLowerCase()))continue;let p=c.isDirectory(),_=a?`${a}${c.name}`:c.name;if(u.push({value:n?`#"${_}${p?"/":""}"`:`#${_}${p?"/":""}`,label:p?`${c.name}/`:c.name,description:_}),u.length>=50)break}return u.sort((c,p)=>{let _=c.label.endsWith("/"),$=p.label.endsWith("/");return _&&!$?-1:!_&&$?1:c.label.localeCompare(p.label)}),u.length===0?null:{items:u,prefix:e}}catch(d){return Oe.debug("File search failed",{error:d,targetPath:a}),null}}async getAgentSuggestions(e){if(!this.getAgents)return null;let t=e.slice(1);try{let r=(await this.getAgents()).filter(a=>a.hidden!==!0).filter(a=>a.name.toLowerCase().includes(t.toLowerCase())).map(a=>({value:`@${a.name}`,label:a.name,description:a.description}));return r.length===0?null:{items:r.slice(0,50),prefix:e}}catch(n){return Oe.debug("Agent search failed",{error:n,prefix:e}),null}}extractAtPrefix(e){let t=new Set([" "," ",'"',"'","="]);for(let n=e.length-1;n>=0;n--)if(t.has(e[n]??"")){let r=n+1;return e[r]==="@"?e.slice(r):null}return e.startsWith("@")?e:null}extractHashPrefix(e){let t=new Set([" "," ",'"',"'","="]);for(let n=e.length-1;n>=0;n--)if(t.has(e[n]??"")){let r=n+1;return e[r]==="#"?e.slice(r):null}return e.startsWith("#")?e:null}isDrivePath(e){return /^[A-Za-z]:[/\\]?$/.test(e)}parsePath(e){let t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return t===-1?{targetPath:"",searchQuery:e}:{targetPath:e.slice(0,t+1),searchQuery:e.slice(t+1)}}resolveBaseDir(e){return e?zt.join(this.basePath,e):this.basePath}};function ut(s,e){let t=[],n=/(?<![\w`])#(\S+)/g,r;for(;(r=n.exec(s))!==null;){let a=r[1];if(!a)continue;let o=a.replace(/\\/g,"/"),l=js(o,e);existsSync(l)&&t.push({path:a,url:pathToFileURL(l).href,exists:true});}return {attachments:t,invalidPaths:[]}}function js(s,e){if(/^[A-Za-z]:[/\\]/.test(s))return s;let t=s.replace(/^[/\\]+/,"");return zt.join(e,t)}var U=a.create({service:"cli-tui-input-handlers"}),We=class{constructor(){b(this,"handlers",[]);b(this,"isBrowsingHistory",false);}register(e){this.handlers.push(e),U.debug("Register input handler",{name:e.name,total:this.handlers.length});}setHistoryBrowsing(e){this.isBrowsingHistory=e;}isHistoryBrowsing(){return this.isBrowsingHistory}async handle(e,t){let n=e.trim();if(n){this.isBrowsingHistory;for(let r of this.handlers)if(r.canHandle(n,t.state)){U.debug("Handle input with handler",{handler:r.name,input:n.substring(0,50)}),await r.handle(n,t);return}U.warn("No handler can process input",{input:n.substring(0,50)});}}getPrompt(e){for(let t of this.handlers)if(t.getPrompt&&t.canHandle("",e)){let n=t.getPrompt(e);if(n)return n}return "> "}},Ne=class{constructor(){b(this,"name","permission");}canHandle(e,t){return t.pendingPermission!==null}async handle(e,t){let{state:n,chatLog:r,tui:a}=t,o=n.pendingPermission;if(!o)return;let l=e.toLowerCase().trim(),d;if(l==="y"||l==="yes")d="once";else if(l==="a"||l==="always")d="always";else if(l==="n"||l==="no"||l==="reject")d="reject";else {r.addSystem(a$1("tui.permission.invalid_input"));return}try{await pa(n,{requestID:o.id,reply:d}),n.pendingPermission=null;let u=d==="once"?a$1("tui.permission.once"):d==="always"?a$1("tui.permission.always"):a$1("tui.permission.reject");r.addSystem(a$1("tui.permission.replied",{vars:{reply:u}})),U.info("Permission request replied",{requestID:o.id,reply:d});}catch(u){U.error("Failed to reply permission request",{error:u}),r.addSystem(a$1("tui.permission.error")),n.pendingPermission=null;}}getPrompt(e){return e.pendingPermission?a$1("tui.permission.prompt"):"> "}},Qe=class{constructor(){b(this,"name","question");}canHandle(e,t){return !(t.pendingQuestion===null||e.startsWith("/"))}async handle(e,t){let{state:n,chatLog:r,tui:a}=t,o=n.pendingQuestion;if(!o){U.warn("QuestionInputHandler.handle - no pending question");return}U.debug("QuestionInputHandler.handle - processing input",{input:e.substring(0,50),currentIndex:o.currentQuestionIndex,totalQuestions:o.questions.length,requestID:o.id});let l=o.currentQuestionIndex,d=o.questions[l];if(!d){U.error("Current question does not exist",{currentIndex:l,totalQuestions:o.questions.length}),n.pendingQuestion=null;return}let u=this.parseAnswer(e,d);if(!u){U.debug("QuestionInputHandler.handle - invalid input",{input:e}),r.addSystem(a$1("tui.question.invalid_input"));return}if(U.debug("QuestionInputHandler.handle - answer parsed",{answer:u,answerLength:u.length}),o.collectedAnswers.push(u),o.currentQuestionIndex++,o.currentQuestionIndex<o.questions.length){U.debug("QuestionInputHandler.handle - showing next question",{nextIndex:o.currentQuestionIndex,totalQuestions:o.questions.length});let c=o.questions[o.currentQuestionIndex];c&&this.displayQuestion(c,o.currentQuestionIndex,o.questions.length,r);}else {U.info("QuestionInputHandler.handle - all questions answered, calling API",{requestID:o.id,answerCount:o.collectedAnswers.length,answers:o.collectedAnswers});try{await qa(n,{requestID:o.id,answers:o.collectedAnswers}),n.pendingQuestion=null,r.addSystem(a$1("tui.question.completed",{vars:{count:o.collectedAnswers.length}})),U.info("Question request completed",{requestID:o.id});}catch(c){U.error("Failed to reply question request",{error:c instanceof Error?c.message:String(c),stack:c instanceof Error?c.stack:void 0,requestID:o.id,answers:o.collectedAnswers,errorType:c instanceof Error?c.constructor.name:typeof c});let p=c instanceof Error?c.message:String(c);r.addSystem(`${a$1("tui.question.error")}: ${p}`),n.pendingQuestion=null;}}}parseAnswer(e,t){let n=e.trim();if(!t.options||t.options.length===0)return [n];let r=n.match(/^(\d+(?:,\s*\d+)*)$/);if(r?.[1]){let o=r[1].split(",").map(l=>Number.parseInt(l.trim(),10)).filter(l=>l>0&&l<=t.options.length);if(o.length===0)return null;if(!t.multiple&&o.length>1){let l=o[0];if(l!==void 0){let d=t.options[l-1];if(d)return [d.label]}return null}return o.map(l=>{let d=t.options[l-1];return d?d.label:""}).filter(l=>l!=="")}return t.custom===false?null:[n]}displayQuestion(e,t,n,r){let a=`
37
37
  ${a$1("tui.question.header",{vars:{current:t+1,total:n}})}
38
38
  `;if(a+=`${e.header}
39
39
  `,a+=`${e.question}
@@ -1,2 +1,2 @@
1
- import {mkdir,readFile,readdir,rm,writeFile}from'fs/promises';import s from'path';import {xdgData,xdgCache,xdgConfig,xdgState}from'xdg-basedir';import O from'os';import {Filesystem}from'@easbot/utils';var p={name:"@easbot/agent",version:"0.2.28",description:"Core Agent for the easbot monorepo ecosystem",type:"module",bin:{easbot:"./dist/cli.mjs"},scripts:{dev:"cross-env NODE_ENV=development tsx src/cli.ts -- tui",start:"cross-env NODE_ENV=production node dist/cli.mjs tui --new",build:"tsup --env.NODE_ENV production",test:"vitest","test:run":"vitest run","test:ui":"vitest --ui","test:watch":"vitest --watch","test:coverage":"vitest run --coverage","test:unit":"vitest run --config ./vitest.unit.config.ts","test:unit:watch":"vitest --config ./vitest.unit.config.ts","test:integration":"vitest run --config ./vitest.integration.config.ts","test:integration:watch":"vitest --config ./vitest.integration.config.ts","test:e2e":"vitest run --config ./vitest.e2e.config.ts","test:e2e:watch":"vitest --config ./vitest.e2e.config.ts",lint:"biome check .","lint:fix":"biome check --write .","lint:fix:unsafe":"biome check --write --unsafe ./src","lint:report":"biome check --reporter=summary .",format:"biome format .","format:fix":"biome format --write .","type-check":"tsc --noEmit",clean:"npx rimraf dist node_modules",prepare:"echo 'agent: Environment ready for CLI usage'","publish:npm":"bash scripts/publish.sh","publish:npm:win":"powershell -ExecutionPolicy Bypass -File scripts/publish.ps1"},keywords:["ai","agent","eas","bot","automation"],author:"houjallen",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/houjallen/easbot.git",directory:"packages/agent"},homepage:"https://github.com/houjallen/easbot/tree/main/packages/agent#readme",bugs:{url:"https://github.com/houjallen/easbot/issues"},files:["dist","README.md","README.en.md","LICENSE"],dependencies:{"@agentclientprotocol/sdk":"^0.21.1","@ai-sdk/alibaba":"^1.0.23","@ai-sdk/amazon-bedrock":"^4.0.105","@ai-sdk/anthropic":"^3.0.77","@ai-sdk/azure":"^3.0.64","@ai-sdk/cerebras":"^2.0.51","@ai-sdk/cohere":"3.0.35","@ai-sdk/deepinfra":"^2.0.51","@ai-sdk/deepseek":"^2.0.35","@ai-sdk/gateway":"^3.0.114","@ai-sdk/google":"^3.0.73","@ai-sdk/google-vertex":"^4.0.128","@ai-sdk/groq":"^3.0.39","@ai-sdk/mistral":"^3.0.37","@ai-sdk/openai":"^3.0.63","@ai-sdk/openai-compatible":"^2.0.47","@ai-sdk/perplexity":"^3.0.33","@ai-sdk/provider":"^3.0.10","@ai-sdk/provider-utils":"^4.0.27","@ai-sdk/togetherai":"^2.0.51","@ai-sdk/vercel":"^2.0.49","@ai-sdk/xai":"^3.0.90","@aws-sdk/credential-providers":"^3.1047.0","@clack/prompts":"^1.4.0","@easbot/codebase":"workspace:*","@easbot/gateway":"workspace:*","@easbot/local-model-sdk":"workspace:*","@easbot/memory":"workspace:*","@easbot/mcp":"workspace:*","@easbot/note":"workspace:*","@easbot/ollama-sdk":"workspace:*","@easbot/plugin":"workspace:*","@easbot/sdk":"workspace:*","@easbot/tui":"workspace:*","@easbot/types":"workspace:*","@easbot/utils":"workspace:*","@hono/node-server":"^2.0.2","@hono/node-ws":"^1.3.1","@hono/standard-validator":"^0.2.2","@hono/zod-validator":"^0.7.6","@modelcontextprotocol/sdk":"^1.29.0","@openrouter/ai-sdk-provider":"^2.9.0","@parcel/watcher":"^2.5.6","@standard-schema/spec":"^1.1.0","@wasmer/wasi":"^1.2.2","@zip.js/zip.js":"^2.8.26",ai:"^6.0.182","ai-gateway-provider":"^3.1.3",ajv:"^8.20.0",axios:"^1.16.1","bash-parser":"^0.5.0","bonjour-service":"^1.4.0",chalk:"^5.6.2",clipboardy:"^5.3.1",commander:"^14.0.3","decimal.js":"^10.6.0",dotenv:"^17.4.2",diff:"^9.0.0","drizzle-orm":"^0.45.2","fast-check":"^4.8.0",fuzzysort:"^3.1.0","gitlab-ai-provider":"^6.6.0",glob:"^13.0.6","google-auth-library":"^10.6.2","gray-matter":"^4.0.3",hono:"^4.12.18","hono-openapi":"^1.3.0",ignore:"^7.0.5","jieba-wasm":"^2.4.0",jiti:"^2.7.0","jsonc-parser":"^3.3.1","lru-cache":"^11.3.6",minimatch:"^10.2.5","node-gyp":"^12.3.0","node-html-parser":"^7.1.0","node-pty":"^1.1.0",open:"^11.0.0",remeda:"^2.34.1","tree-sitter-bash":"^0.25.1",turndown:"^7.2.4",ulid:"^3.0.2",undici:"^8.3.0","vscode-jsonrpc":"^8.2.1","vscode-languageserver-types":"^3.17.5",which:"^6.0.1","why-is-node-running":"^3.2.2",ws:"^8.20.1","xdg-basedir":"5.1.0",zod:"^4.4.3","zod-to-json-schema":"^3.25.2"},devDependencies:{"@actions/core":"^3.0.1","@actions/github":"^9.1.1","@octokit/graphql":"^9.0.3","@octokit/rest":"^22.0.1","@octokit/webhooks-types":"^7.6.1","@types/node":"^25.8.0","@types/turndown":"^5.0.6","@types/which":"^3.0.4","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.6",esbuild:"^0.28.0","esbuild-plugin-alias":"^0.2.1",tsup:"^8.5.1",tsx:"^4.22.0",typescript:"^6.0.3",vitest:"^4.1.6"}};var l="easbot",d=Filesystem.normalize(s.join(xdgData,l)),S=Filesystem.normalize(s.join(xdgCache,l)),z=Filesystem.normalize(s.join(xdgConfig,l)),N=Filesystem.normalize(s.join(xdgState,l)),g;(e=>{e.Path={get home(){return Filesystem.normalize(process.env.EASBOT_TEST_HOME||O.homedir())},data:d,bin:Filesystem.normalize(s.join(d,"bin")),log:Filesystem.normalize(s.join(d,"log")),cache:S,config:z,state:N};function B(){return (process.env.PATH||process.env.Path||"")+s.delimiter+e.Path.bin}e.getPathWithBin=B;let t=null,o=null;async function b(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=p.version||"local";}catch{t="local";}return t||"local"}function f(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=p.version||"local";}catch{t="local";}return t||"local"}e.getVersion=f;function u(){if(o)return o;if(process.env.EASBOT_CHANNEL)return o=process.env.EASBOT_CHANNEL,o;let i=f();return i==="local"||i.includes("dev")?o="local":i.includes("beta")||i.includes("alpha")?o="preview":o="latest",o||"local"}e.getChannel=u;function C(){return u()==="local"}e.isLocal=C;function H(){return u()==="preview"}e.isPreview=H;let h=false,n=null;async function V(){if(!h)return n||(n=(async()=>{await b(),await Promise.all([mkdir(e.Path.data,{recursive:true}),mkdir(e.Path.config,{recursive:true}),mkdir(e.Path.state,{recursive:true}),mkdir(e.Path.log,{recursive:true}),mkdir(e.Path.bin,{recursive:true}),mkdir(e.Path.cache,{recursive:true})]).then(()=>{let c=process.env.PATH||process.env.Path||"";process.env.PATH=c+s.delimiter+e.Path.bin,process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let i="1",m=s.join(e.Path.cache,"version");if(await readFile(m,"utf-8").catch(()=>"0")!==i){try{let c=await readdir(e.Path.cache);await Promise.all(c.map(k=>rm(s.join(e.Path.cache,k),{recursive:!0,force:!0})));}catch{}await writeFile(m,i);}h=true;})(),n)}e.init=V;})(g||(g={}));
1
+ import {mkdir,readFile,readdir,rm,writeFile}from'fs/promises';import s from'path';import {xdgData,xdgCache,xdgConfig,xdgState}from'xdg-basedir';import O from'os';import {Filesystem}from'@easbot/utils';var p={name:"@easbot/agent",version:"0.2.32",description:"Core Agent for the easbot monorepo ecosystem",type:"module",bin:{easbot:"./dist/cli.mjs"},scripts:{dev:"cross-env NODE_ENV=development tsx src/cli.ts -- tui",start:"cross-env NODE_ENV=production node dist/cli.mjs tui --new",build:"tsup --env.NODE_ENV production",test:"vitest","test:run":"vitest run","test:ui":"vitest --ui","test:watch":"vitest --watch","test:coverage":"vitest run --coverage","test:unit":"vitest run --config ./vitest.unit.config.ts","test:unit:watch":"vitest --config ./vitest.unit.config.ts","test:integration":"vitest run --config ./vitest.integration.config.ts","test:integration:watch":"vitest --config ./vitest.integration.config.ts","test:e2e":"vitest run --config ./vitest.e2e.config.ts","test:e2e:watch":"vitest --config ./vitest.e2e.config.ts",lint:"biome check .","lint:fix":"biome check --write .","lint:fix:unsafe":"biome check --write --unsafe ./src","lint:report":"biome check --reporter=summary .",format:"biome format .","format:fix":"biome format --write .","type-check":"tsc --noEmit",clean:"npx rimraf dist node_modules",prepare:"echo 'agent: Environment ready for CLI usage'","publish:npm":"bash scripts/publish.sh","publish:npm:win":"powershell -ExecutionPolicy Bypass -File scripts/publish.ps1"},keywords:["ai","agent","eas","bot","automation"],author:"houjallen",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/houjallen/easbot.git",directory:"packages/agent"},homepage:"https://github.com/houjallen/easbot/tree/main/packages/agent#readme",bugs:{url:"https://github.com/houjallen/easbot/issues"},files:["dist","README.md","README.en.md","LICENSE"],dependencies:{"@agentclientprotocol/sdk":"^0.21.1","@ai-sdk/alibaba":"^1.0.23","@ai-sdk/amazon-bedrock":"^4.0.105","@ai-sdk/anthropic":"^3.0.77","@ai-sdk/azure":"^3.0.64","@ai-sdk/cerebras":"^2.0.51","@ai-sdk/cohere":"3.0.35","@ai-sdk/deepinfra":"^2.0.51","@ai-sdk/deepseek":"^2.0.35","@ai-sdk/gateway":"^3.0.114","@ai-sdk/google":"^3.0.73","@ai-sdk/google-vertex":"^4.0.128","@ai-sdk/groq":"^3.0.39","@ai-sdk/mistral":"^3.0.37","@ai-sdk/openai":"^3.0.63","@ai-sdk/openai-compatible":"^2.0.47","@ai-sdk/perplexity":"^3.0.33","@ai-sdk/provider":"^3.0.10","@ai-sdk/provider-utils":"^4.0.27","@ai-sdk/togetherai":"^2.0.51","@ai-sdk/vercel":"^2.0.49","@ai-sdk/xai":"^3.0.90","@aws-sdk/credential-providers":"^3.1047.0","@clack/prompts":"^1.4.0","@easbot/codebase":"workspace:*","@easbot/gateway":"workspace:*","@easbot/local-model-sdk":"workspace:*","@easbot/memory":"workspace:*","@easbot/mcp":"workspace:*","@easbot/note":"workspace:*","@easbot/ollama-sdk":"workspace:*","@easbot/plugin":"workspace:*","@easbot/sdk":"workspace:*","@easbot/tui":"workspace:*","@easbot/types":"workspace:*","@easbot/utils":"workspace:*","@hono/node-server":"^2.0.2","@hono/node-ws":"^1.3.1","@hono/standard-validator":"^0.2.2","@hono/zod-validator":"^0.7.6","@modelcontextprotocol/sdk":"^1.29.0","@openrouter/ai-sdk-provider":"^2.9.0","@parcel/watcher":"^2.5.6","@standard-schema/spec":"^1.1.0","@wasmer/wasi":"^1.2.2","@zip.js/zip.js":"^2.8.26",ai:"^6.0.182","ai-gateway-provider":"^3.1.3",ajv:"^8.20.0",axios:"^1.16.1","bash-parser":"^0.5.0","bonjour-service":"^1.4.0",chalk:"^5.6.2",clipboardy:"^5.3.1",commander:"^14.0.3","decimal.js":"^10.6.0",dotenv:"^17.4.2",diff:"^9.0.0","drizzle-orm":"^0.45.2","fast-check":"^4.8.0",fuzzysort:"^3.1.0","gitlab-ai-provider":"^6.6.0",glob:"^13.0.6","google-auth-library":"^10.6.2","gray-matter":"^4.0.3",hono:"^4.12.18","hono-openapi":"^1.3.0",ignore:"^7.0.5","jieba-wasm":"^2.4.0",jiti:"^2.7.0","jsonc-parser":"^3.3.1","lru-cache":"^11.3.6",minimatch:"^10.2.5","node-gyp":"^12.3.0","node-html-parser":"^7.1.0","node-pty":"^1.1.0",open:"^11.0.0",remeda:"^2.34.1","tree-sitter-bash":"^0.25.1",turndown:"^7.2.4",ulid:"^3.0.2",undici:"^8.3.0","vscode-jsonrpc":"^8.2.1","vscode-languageserver-types":"^3.17.5",which:"^6.0.1","why-is-node-running":"^3.2.2",ws:"^8.20.1","xdg-basedir":"5.1.0",zod:"^4.4.3","zod-to-json-schema":"^3.25.2"},devDependencies:{"@actions/core":"^3.0.1","@actions/github":"^9.1.1","@octokit/graphql":"^9.0.3","@octokit/rest":"^22.0.1","@octokit/webhooks-types":"^7.6.1","@types/node":"^25.8.0","@types/turndown":"^5.0.6","@types/which":"^3.0.4","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.6",esbuild:"^0.28.0","esbuild-plugin-alias":"^0.2.1",tsup:"^8.5.1",tsx:"^4.22.0",typescript:"^6.0.3",vitest:"^4.1.6"}};var l="easbot",d=Filesystem.normalize(s.join(xdgData,l)),S=Filesystem.normalize(s.join(xdgCache,l)),z=Filesystem.normalize(s.join(xdgConfig,l)),N=Filesystem.normalize(s.join(xdgState,l)),g;(e=>{e.Path={get home(){return Filesystem.normalize(process.env.EASBOT_TEST_HOME||O.homedir())},data:d,bin:Filesystem.normalize(s.join(d,"bin")),log:Filesystem.normalize(s.join(d,"log")),cache:S,config:z,state:N};function B(){return (process.env.PATH||process.env.Path||"")+s.delimiter+e.Path.bin}e.getPathWithBin=B;let t=null,o=null;async function b(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=p.version||"local";}catch{t="local";}return t||"local"}function f(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=p.version||"local";}catch{t="local";}return t||"local"}e.getVersion=f;function u(){if(o)return o;if(process.env.EASBOT_CHANNEL)return o=process.env.EASBOT_CHANNEL,o;let i=f();return i==="local"||i.includes("dev")?o="local":i.includes("beta")||i.includes("alpha")?o="preview":o="latest",o||"local"}e.getChannel=u;function C(){return u()==="local"}e.isLocal=C;function H(){return u()==="preview"}e.isPreview=H;let h=false,n=null;async function V(){if(!h)return n||(n=(async()=>{await b(),await Promise.all([mkdir(e.Path.data,{recursive:true}),mkdir(e.Path.config,{recursive:true}),mkdir(e.Path.state,{recursive:true}),mkdir(e.Path.log,{recursive:true}),mkdir(e.Path.bin,{recursive:true}),mkdir(e.Path.cache,{recursive:true})]).then(()=>{let c=process.env.PATH||process.env.Path||"";process.env.PATH=c+s.delimiter+e.Path.bin,process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let i="1",m=s.join(e.Path.cache,"version");if(await readFile(m,"utf-8").catch(()=>"0")!==i){try{let c=await readdir(e.Path.cache);await Promise.all(c.map(k=>rm(s.join(e.Path.cache,k),{recursive:!0,force:!0})));}catch{}await writeFile(m,i);}h=true;})(),n)}e.init=V;})(g||(g={}));
2
2
  export{g as a};
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-U4BAW7XF.mjs';import {c,d}from'./chunk-X6ISXWBN.mjs';import s from'path';import a$2 from'fs/promises';import {NamedError,lazy,Filesystem,PKG,$ as $$1,Lock}from'@easbot/utils';import E from'zod';import {glob}from'glob';var $;(J=>{let d$1=a.create({service:"storage"});J.NotFoundError=NamedError.create("NotFoundError",E.object({message:E.string()}));let O=[async n=>{let o=s.resolve(n,"../project");if(await Filesystem.isDir(o))for await(let i of new PKG.Glob("*").scan({cwd:o})){d$1.info(`migrating project ${i}`);let t=i,r=s.join(o,i),e="/";if(t!=="global"){let g=await glob("storage/session/message/*/*.json",{cwd:s.join(o,i),absolute:true});for(let c of g)if(e=(await a$2.readFile(c,"utf-8").then(m=>JSON.parse(m))).path?.root??"",e)break;if(!e||!await Filesystem.isDir(e))continue;let[u]=await $$1`git rev-list --max-parents=0 --all`.quiet().nothrow().cwd(e).text().then(c=>c.split(`
1
+ import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-SF52HNJQ.mjs';import {c,d}from'./chunk-X6ISXWBN.mjs';import s from'path';import a$2 from'fs/promises';import {NamedError,lazy,Filesystem,PKG,$ as $$1,Lock}from'@easbot/utils';import E from'zod';import {glob}from'glob';var $;(J=>{let d$1=a.create({service:"storage"});J.NotFoundError=NamedError.create("NotFoundError",E.object({message:E.string()}));let O=[async n=>{let o=s.resolve(n,"../project");if(await Filesystem.isDir(o))for await(let i of new PKG.Glob("*").scan({cwd:o})){d$1.info(`migrating project ${i}`);let t=i,r=s.join(o,i),e="/";if(t!=="global"){let g=await glob("storage/session/message/*/*.json",{cwd:s.join(o,i),absolute:true});for(let c of g)if(e=(await a$2.readFile(c,"utf-8").then(m=>JSON.parse(m))).path?.root??"",e)break;if(!e||!await Filesystem.isDir(e))continue;let[u]=await $$1`git rev-list --max-parents=0 --all`.quiet().nothrow().cwd(e).text().then(c=>c.split(`
2
2
  `).filter(Boolean).map(w=>w.trim()).toSorted());if(!u)continue;t=u,await PKG.write(s.join(n,"project",t+".json"),JSON.stringify({id:u,vcs:"git",worktree:e,time:{created:Date.now(),initialized:Date.now()}})),d$1.info(`migrating sessions for project ${t}`);for await(let c of new PKG.Glob("storage/session/info/*.json").scan({cwd:r,absolute:true})){let w=s.join(n,"session",t,s.basename(c));d$1.info("copying",{sessionFile:c,dest:w});let m=await a$2.readFile(c,"utf-8").then(p=>JSON.parse(p));await a$2.writeFile(w,JSON.stringify(m)),d$1.info(`migrating messages for session ${m.id}`);for await(let p of new PKG.Glob(`storage/session/message/${m.id}/*.json`).scan({cwd:r,absolute:true})){let S=s.join(n,"message",m.id,s.basename(p));d$1.info("copying",{msgFile:p,dest:S});let h=await a$2.readFile(p,"utf-8").then(j=>JSON.parse(j));await a$2.writeFile(S,JSON.stringify(h)),d$1.info(`migrating parts for message ${h.id}`);for await(let j of new PKG.Glob(`storage/session/part/${m.id}/${h.id}/*.json`).scan({cwd:r,absolute:true})){let T=s.join(n,"part",h.id,s.basename(j)),P=await PKG.file(j).json();d$1.info("copying",{partFile:j,dest:T}),await PKG.write(T,JSON.stringify(P));}}}}}},async n=>{for await(let o of new PKG.Glob("session/*/*.json").scan({cwd:n,absolute:true})){let i=await PKG.file(o).json();if(!i.projectID||!i.summary?.diffs)continue;let{diffs:t}=i.summary;await PKG.write(s.join(n,"session_diff",i.id+".json"),JSON.stringify(t)),await PKG.write(s.join(n,"session",i.projectID,i.id+".json"),JSON.stringify({...i,summary:{additions:t.reduce((r,e)=>r+e.additions,0),deletions:t.reduce((r,e)=>r+e.deletions,0)}}));}}],l=lazy(async()=>{let n=s.join(a$1.Path.data,"storage");await a$2.mkdir(n,{recursive:true});let o=s.join(n,"migration"),i=await a$2.readFile(o,"utf-8").then(t=>parseInt(t,10)).catch(()=>0);for(let t=i;t<O.length;t++){d$1.info("running migration",{index:t});let r=O[t];r&&(await r(n).catch(()=>d$1.error("failed to run migration",{index:t})),await a$2.writeFile(o,(t+1).toString(),"utf-8"));}return {dir:n}});async function M(n){let o=await l().then(t=>t.dir),i=s.join(o,...n)+".json";return y(async()=>{await a$2.unlink(i).catch(()=>{});})}J.remove=M;async function R(n){let o=await l().then(t=>t.dir),i=s.join(o,...n)+".json";return y(async()=>{var e=[];try{let t=c(e,await Lock.read(i));let r=await a$2.readFile(i,"utf-8");return JSON.parse(r)}catch(g){var u=g,c$1=true;}finally{d(e,u,c$1);}})}J.read=R;async function A(n,o){let i=await l().then(r=>r.dir),t=s.join(i,...n)+".json";return y(async()=>{var g=[];try{let r=c(g,await Lock.write(t));let e=await a$2.readFile(t,"utf-8").then(m=>JSON.parse(m));o(e);await a$2.writeFile(t,JSON.stringify(e,null,2),"utf-8");return e}catch(u){var c$1=u,w=true;}finally{d(g,c$1,w);}})}J.update=A;async function B(n,o){let i=await l().then(r=>r.dir),t=s.join(i,...n)+".json";return y(async()=>{var e=[];try{let r=c(e,await Lock.write(t));await a$2.mkdir(s.dirname(t),{recursive:!0});await a$2.writeFile(t,JSON.stringify(o,null,2),"utf-8");}catch(g){var u=g,c$1=true;}finally{d(e,u,c$1);}})}J.write=B;async function y(n){return n().catch(o=>{if(!(o instanceof Error))throw o;let i=o;throw i.code==="ENOENT"?new J.NotFoundError({message:`Resource not found: ${i.path}`}):o})}let k="**/*";async function q(n){let o=await l().then(i=>i.dir);try{let t=(await glob(k,{cwd:s.join(o,...n),nodir:!0})).map(r=>[...n,...r.slice(0,-5).split(s.sep)]);return t.sort(),t}catch{return []}}J.list=q;})($||($={}));export{$ as a};
@@ -1 +1 @@
1
- import {Na,pb}from'./chunk-KZLMEUTB.mjs';import {a}from'./chunk-LFYBZHOI.mjs';var e=a.create({service:"cli-bootstrap"});async function f(o,i){let r=o||process.cwd();try{let{Global:t}=await import('./global-V7QPWK55.mjs');await t.init();}catch(t){throw e.error("Failed to initialize Global",{error:t instanceof Error?t.message:String(t)}),new Error(`Global initialization failed: ${t instanceof Error?t.message:String(t)}`)}try{return await Na.provide({directory:r,init:pb,fn:async()=>await i()})}catch(t){throw e.error("Failed to execute in Instance context",{directory:r,error:t instanceof Error?t.message:String(t)}),t}}async function g(o={}){let i=o.directory??process.cwd();try{let{Global:r}=await import('./global-V7QPWK55.mjs');await r.init();}catch(r){throw e.error("Failed to initialize Global",{error:r instanceof Error?r.message:String(r)}),new Error(`Global initialization failed: ${r instanceof Error?r.message:String(r)}`)}try{return await Na.provide({directory:i,init:pb,fn:async()=>{let{buildProgram:r}=await import('./build-program-NEPEF27C.mjs');return await r(o)}})}catch(r){throw e.error("Failed to build program in Instance context",{directory:i,error:r instanceof Error?r.message:String(r)}),r}}export{f as a,g as b};
1
+ import {Na,pb}from'./chunk-Z76342HO.mjs';import {a}from'./chunk-LFYBZHOI.mjs';var e=a.create({service:"cli-bootstrap"});async function f(o,i){let r=o||process.cwd();try{let{Global:t}=await import('./global-5VXYUQCD.mjs');await t.init();}catch(t){throw e.error("Failed to initialize Global",{error:t instanceof Error?t.message:String(t)}),new Error(`Global initialization failed: ${t instanceof Error?t.message:String(t)}`)}try{return await Na.provide({directory:r,init:pb,fn:async()=>await i()})}catch(t){throw e.error("Failed to execute in Instance context",{directory:r,error:t instanceof Error?t.message:String(t)}),t}}async function g(o={}){let i=o.directory??process.cwd();try{let{Global:r}=await import('./global-5VXYUQCD.mjs');await r.init();}catch(r){throw e.error("Failed to initialize Global",{error:r instanceof Error?r.message:String(r)}),new Error(`Global initialization failed: ${r instanceof Error?r.message:String(r)}`)}try{return await Na.provide({directory:i,init:pb,fn:async()=>{let{buildProgram:r}=await import('./build-program-FDMZOIRV.mjs');return await r(o)}})}catch(r){throw e.error("Failed to build program in Instance context",{directory:i,error:r instanceof Error?r.message:String(r)}),r}}export{f as a,g as b};
@@ -1 +1 @@
1
- import {a as a$1}from'./chunk-QMJ4R4AL.mjs';import {a}from'./chunk-LFYBZHOI.mjs';var n=a.create({service:"tui-state-storage"}),i={toolsExpanded:true,showThinking:true,verboseLevel:"off",thinkingLevel:"low",messageLimit:50,localShellPermission:"ask"};async function h(o){try{let e=await a$1.read(["tui",o]),t={toolsExpanded:typeof e.toolsExpanded=="boolean"?e.toolsExpanded:i.toolsExpanded,showThinking:typeof e.showThinking=="boolean"?e.showThinking:i.showThinking,verboseLevel:e.verboseLevel==="on"||e.verboseLevel==="off"?e.verboseLevel:i.verboseLevel,thinkingLevel:e.thinkingLevel==="off"||e.thinkingLevel==="low"||e.thinkingLevel==="medium"||e.thinkingLevel==="high"?e.thinkingLevel:i.thinkingLevel,messageLimit:e.messageLimit===25||e.messageLimit===50||e.messageLimit===100?e.messageLimit:i.messageLimit,localShellPermission:e.localShellPermission==="on"||e.localShellPermission==="off"||e.localShellPermission==="ask"?e.localShellPermission:i.localShellPermission,contextMode:e.contextMode==="general"||e.contextMode==="coder"?e.contextMode:void 0,model:e.model,agent:e.agent,sessionId:e.sessionId};return n.debug("TUI state loaded",{sessionId:o,state:t}),t}catch(e){return e instanceof a$1.NotFoundError?n.debug("TUI state not found, using defaults",{sessionId:o}):n.warn("Failed to load TUI state, using defaults",{sessionId:o,error:e}),{...i}}}async function r(o,e){try{await a$1.write(["tui",o],e),n.debug("TUI state saved",{sessionId:o,state:e});}catch(t){n.error("Failed to save TUI state",{sessionId:o,error:t});}}async function c(o){if(!o.currentSessionId){n.warn("Cannot save TUI state: no session ID");return}let e={toolsExpanded:o.toolsExpanded,showThinking:o.showThinking,thinkingLevel:o.thinkingLevel,verboseLevel:o.verboseLevel,messageLimit:o.messageLimit,localShellPermission:o.localShellPermission,contextMode:o.contextMode,model:o.sessionInfo.model,agent:o.agent||void 0,sessionId:o.currentSessionId};await r(o.currentSessionId,e);}export{h as a,c as b};
1
+ import {a as a$1}from'./chunk-TGMBM3LH.mjs';import {a}from'./chunk-LFYBZHOI.mjs';var n=a.create({service:"tui-state-storage"}),i={toolsExpanded:true,showThinking:true,verboseLevel:"off",thinkingLevel:"low",messageLimit:50,localShellPermission:"ask"};async function h(o){try{let e=await a$1.read(["tui",o]),t={toolsExpanded:typeof e.toolsExpanded=="boolean"?e.toolsExpanded:i.toolsExpanded,showThinking:typeof e.showThinking=="boolean"?e.showThinking:i.showThinking,verboseLevel:e.verboseLevel==="on"||e.verboseLevel==="off"?e.verboseLevel:i.verboseLevel,thinkingLevel:e.thinkingLevel==="off"||e.thinkingLevel==="low"||e.thinkingLevel==="medium"||e.thinkingLevel==="high"?e.thinkingLevel:i.thinkingLevel,messageLimit:e.messageLimit===25||e.messageLimit===50||e.messageLimit===100?e.messageLimit:i.messageLimit,localShellPermission:e.localShellPermission==="on"||e.localShellPermission==="off"||e.localShellPermission==="ask"?e.localShellPermission:i.localShellPermission,contextMode:e.contextMode==="general"||e.contextMode==="coder"?e.contextMode:void 0,model:e.model,agent:e.agent,sessionId:e.sessionId};return n.debug("TUI state loaded",{sessionId:o,state:t}),t}catch(e){return e instanceof a$1.NotFoundError?n.debug("TUI state not found, using defaults",{sessionId:o}):n.warn("Failed to load TUI state, using defaults",{sessionId:o,error:e}),{...i}}}async function r(o,e){try{await a$1.write(["tui",o],e),n.debug("TUI state saved",{sessionId:o,state:e});}catch(t){n.error("Failed to save TUI state",{sessionId:o,error:t});}}async function c(o){if(!o.currentSessionId){n.warn("Cannot save TUI state: no session ID");return}let e={toolsExpanded:o.toolsExpanded,showThinking:o.showThinking,thinkingLevel:o.thinkingLevel,verboseLevel:o.verboseLevel,messageLimit:o.messageLimit,localShellPermission:o.localShellPermission,contextMode:o.contextMode,model:o.sessionInfo.model,agent:o.agent||void 0,sessionId:o.currentSessionId};await r(o.currentSessionId,e);}export{h as a,c as b};