@dahawa/hawa-code 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/hawa.js CHANGED
@@ -7,6 +7,6 @@ const require = createRequire(import.meta.url);
7
7
  const __filename = fileURLToPath(import.meta.url);
8
8
  const __dirname = dirname(__filename);
9
9
 
10
- import ue from"os";import V from"path";import F from"fs";var K="hcode",d=".hcode";var ae="HAWA_CODE_GIT_BASH_PATH";var ce="Bash",le="PowerShell";var He=j()?le:ce;function j(){return process.platform!=="win32"?!1:process.env.HAWA_CODE_POWER_SHELL_ENABLE==="true"||process.env.HAWA_CODE_POWER_SHELL_ENABLE==="1"?!0:!(process.env.HAWA_CODE_POWER_SHELL_ENABLE==="false"||process.env.HAWA_CODE_POWER_SHELL_ENABLE==="0"||process.env[ae])}var ge={sources:{"qwen-coding":{base_url:"https://dashscope.aliyuncs.com/apps/anthropic",auth_token:"sk-{ \u4F7F\u7528\u81EA\u5DF1\u7684 token }",api_type:"anthropic",models:["qwen3-coder-plus"]},"kimi-k2":{base_url:"https://api.moonshot.cn/anthropic",auth_token:"sk-{ \u4F7F\u7528\u81EA\u5DF1\u7684 token }",api_type:"anthropic",models:["kimi-k2-0905-preview"]},deepseek:{base_url:"https://api.deepseek.com/anthropic",auth_token:"sk-{ \u4F7F\u7528\u81EA\u5DF1\u7684 token }",api_type:"anthropic",models:["deepseek-chat"]},openrouter:{base_url:"https://openrouter.ai/api/v1",auth_token:"sk-or-v1-{ \u4F7F\u7528\u81EA\u5DF1\u7684 token }",api_type:"openai",models:["anthropic/claude-sonnet-4"]},gemini:{base_url:"https://generativelanguage.googleapis.com",auth_token:"AI{ \u4F7F\u7528\u81EA\u5DF1\u7684 token }",api_type:"gemini",models:["gemini-2.5-pro"]}},routing:{MODEL:[{source:"qwen-coding",model:"qwen3-coder-plus",weight:50},{source:"kimi-k2",model:"kimi-k2-0905-preview",weight:50}],SMALL_FAST_MODEL:[{source:"deepseek",model:"deepseek-chat",weight:50},{source:"openrouter",model:"anthropic/claude-sonnet-4",weight:50}]}};function pe(){let o=ue.homedir();return V.join(o,d,"config.json")}function Q(){let o=pe();F.existsSync(o)||(F.mkdirSync(V.dirname(o),{recursive:!0}),F.writeFileSync(o,JSON.stringify(ge,null,2)))}import{spawn as re}from"child_process";import k from"path";import{fileURLToPath as ie}from"url";import{existsSync as P,readFileSync as xe,writeFileSync as v,mkdirSync as Ae,watch as ne}from"fs";import{join as se,dirname as Ce}from"path";import{homedir as ke}from"os";import{existsSync as q,mkdirSync as fe}from"fs";import{dirname as me,join as u}from"path";import{writeFileSync as Se,readFileSync as lt,appendFileSync as he}from"fs";import{randomUUID as ye}from"crypto";import{homedir as _e}from"os";import*as Z from"os";import{randomUUID as de}from"crypto";var B=class{listeners=new Map;registry=new FinalizationRegistry(e=>{for(let[t,n]of this.listeners.entries()){for(let s of Array.from(n))s.token===e&&n.delete(s);n.size===0&&this.listeners.delete(t)}});on(e,t,n){let s=this.listeners.get(e);s||(s=new Set,this.listeners.set(e,s));let r={callback:t,thisRef:n?new WeakRef(n):void 0};if(n){let i={};r.token=i,this.registry.register(n,i,i)}return s.add(r),()=>{this.off(e,t,n)}}off(e,t,n){let s=this.listeners.get(e);if(s){if(!t&&n===void 0){for(let r of s)r.token&&this.registry.unregister(r.token);this.listeners.delete(e);return}for(let r of Array.from(s)){let i=t?r.callback===t:!0,c=!0;n!==void 0&&(c=r.thisRef?.deref()===n),i&&c&&(r.token&&this.registry.unregister(r.token),s.delete(r))}s.size===0&&this.listeners.delete(e)}}emit(e,t){let n=this.listeners.get(e);if(n)for(let s of Array.from(n)){let r;if(s.thisRef&&(r=s.thisRef.deref(),!r)){n.delete(s);continue}try{let i=s.callback.call(r,t);i instanceof Promise&&i.catch(c=>{m(`Async error in listener for "${e}"`,c)})}catch(i){m(`Error in listener for "${e}"`,i)}}}},S=new B;var D=class{datas={};setData(e,t){this.datas[e]=t}getData(e){return this.datas[e]}takeData(e){let t=this.datas[e];return delete this.datas[e],t}clear(){this.datas={}}},E=class extends D{startTime;constructor(e=null){super(),this.startTime=e}},Y=de(),H=class extends D{PENDING_PROMPTS_KEY="pendingPrompts";addPendingPrompt(e){let t=this.getPendingPrompts();t.push(e),this.setData(this.PENDING_PROMPTS_KEY,t)}getPendingPrompts(){let e=this.getData(this.PENDING_PROMPTS_KEY);return Array.isArray(e)?e:[]}takePendingPrompts(){let e=this.getPendingPrompts();return this.setData(this.PENDING_PROMPTS_KEY,[]),e}async waitGetPendingPrompts(e){let n=Date.now(),s=e*1e3;for(;Date.now()-n<s;){let r=this.getPendingPrompts();if(r.length>0)return r;await new Promise(i=>setTimeout(i,200))}return[]}getSessionId(){return Y}switchSessionId(e){Y=e}},W=class o{static sessionContext={};static inQueryContextHolder={};static queryContext={};onQueryStart(e="defalt",t){e||(e="defalt");let n=o.inQueryContextHolder[e+""];n&&n.startTime&&n.startTime>0||(o.inQueryContextHolder[e+""]=new E(Date.now()),S.emit("webserver:agent_status",{agentId:e,status:"started",agentType:t?.agentType,agentName:t?.agentName,description:t?.description,timestamp:Date.now()}))}onQueryEnd(e="defalt",t=!1){e||(e="defalt"),o.inQueryContextHolder[e+""]=new E(-1),t||(o.queryContext[e+""]={}),S.emit("webserver:agent_status",{agentId:e,status:"ended",timestamp:Date.now()})}getSessionContext(e="defalt"){e||(e="defalt");let t=o.sessionContext[e+""];return t||(t=new H,o.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=o.inQueryContextHolder[e+""];return t||(t=new E,o.inQueryContextHolder[e+""]=t),t}getQueryContext(e="defalt"){e||(e="defalt");let t=o.queryContext[e+""];return t||(t={},o.queryContext[e+""]=t),t}isQuerying(e="defalt"){return e||(e="defalt"),this.getInQueryContext(e).startTime>0}},X=new W;var ht=ye(),p=u(_e(),d);function f(o){return o.replace(/[^a-zA-Z0-9]/g,"-")}function be(){return X.getSessionContext().getSessionId()||$}function Me(){try{let o=w().planDirectory;if(o)return o}catch{}return u(p,"plan")}var ee={temp:()=>u(Z.tmpdir(),`${K}`),plan:()=>Me(),memory:()=>u(p,"projects",f(process.cwd()),"memory"),apis:()=>u(p,"projects",f(process.cwd()),"apis"),errors:()=>u(p,"projects",f(process.cwd()),"errors"),messages:()=>u(p,"projects",f(process.cwd()),"messages"),mcpLogs:o=>u(p,"projects",f(process.cwd()),`mcp-logs-${o}`),log:()=>u(p,"projects",f(process.cwd()),"log"),vcrFixtures:()=>u(p,"projects",f(process.cwd()),"vcr-fixtures"),sessionSummary:()=>u(p,"projects",f(process.cwd()),"messages",be(),"session-summary")};function Oe(o){return o.toISOString().replace(/[:.]/g,"-")}var $=Oe(new Date);function Te(){return u(ee.log(),$+".log")}function Ee(){return u(ee.log(),"error-"+$+".log")}function te(o,e,...t){let n=t.map(s=>s instanceof Error?`${s.name}: ${s.message}
11
- ${s.stack.replace(/^/gm," ")}`:s);we(e,{level:o,message:n.length==1?n[0]:n})}function b(...o){te("info",Te(),...o)}function m(...o){te("error",Ee(),...o)}function G(...o){m(...o)}function we(o,e){let t=me(o);q(t)||fe(t,{recursive:!0});let s=(typeof e=="string"?e:JSON.stringify(e))+`
12
- `;q(o)?he(o,s,"utf8"):Se(o,s,"utf8")}var yt=5*1024*1024,_t=1024*1024,bt=Buffer.from('"compact_boundary"');var N=class o{static getTools=e=>[];static getMCPCommands=()=>[];static getMcpServer=e=>{};static getClients=async()=>[];static reloadClients=async()=>[];static reconnect=async(e,t,n)=>{};static registerIDEClient=(e,t)=>{};static cache=[];static add(e){o.cache.push(e)}static clear(){o.cache.forEach(e=>{e.cache.clear?.()})}};var R={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:!0,memo:!1,messageArchiving:!1,autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},autoMemory:{enabled:!0,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!0,minHours:24,minSessions:5},proxy:!1},x=class o{static test=!1;static testSettings;static setSettings(e){o.testSettings=e}static instance;static isTasksEnable(){return process.env.HAWA_CODE_ENABLE_TASKS=="true"||o.isAgentTeamEnable()}static isAgentTeamEnable(){return process.env.HAWA_CODE_EXPERIMENTAL_AGENT_TEAMS=="1"}static isLazyToolEnable(){return w().lazyTool===!0}static isPowerShellToolEnable(){return j()}static isMemoEnable(){return w().memo===!0}static isMessageArchivingEnable(){return w().messageArchiving===!0}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),P(e)||v(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),P(t)||v(t,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8")}getDefaultSettingsStructure(){return{env:{},permissions:{allow:[],deny:[],ask:[]},autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},thinking:"medium"}}static getInstance(){return o.instance||(o.instance=new o),o.instance}addProjectAllowedTools(e){let t=this.loadSettingsFromFile(this.getProjectSettingsPath()),n=t.permissions||{allow:[],deny:[]};if(n.allow||(n.allow=[]),n.allow.includes(e))b(`\u5DE5\u5177 '${e}' \u5DF2\u5B58\u5728\u4E8E\u9879\u76EE\u5141\u8BB8\u5217\u8868\u4E2D\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0`);else{n.allow.push(e),n.allow.sort();let s={...t,permissions:{...n}};this.saveSettingsToFile(this.getProjectSettingsPath(),s,R),b(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return se(ke(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return se(e,".hcode","settings.json")}ensureDirExists(e){let t=Ce(e);P(t)||Ae(t,{recursive:!0})}loadSettingsFromFile(e){if(!P(e))return{};let t="";try{return t=xe(e,"utf-8"),JSON.parse(t)}catch(n){return console.error(`Error reading settings file ${e} => ${t} `,n),{}}}saveSettingsToFile(e,t,n){let s={...t};for(let[r,i]of Object.entries(t))if(r in n)if(typeof i=="object"&&typeof n[r]=="object"){if(JSON.stringify(i)===JSON.stringify(n[r]))delete s[r];else if(r==="permissions"&&i&&typeof i=="object"){let c=n.permissions||{},a=i;Array.isArray(a.allow)&&Array.isArray(c.allow)&&JSON.stringify(a.allow)===JSON.stringify(c.allow)&&delete a.allow,Array.isArray(a.deny)&&Array.isArray(c.deny)&&JSON.stringify(a.deny)===JSON.stringify(c.deny)&&delete a.deny,Object.keys(a).length===0&&delete s[r]}}else i===n[r]&&delete s[r];this.ensureDirExists(e),Object.keys(s).length===0?v(e,"{}","utf-8"):v(e,JSON.stringify(s,null,2),"utf-8")}mergeStringArrays(e,t){if(!e&&!t)return;let n=[...e||[]];return(t||[]).forEach(s=>{n.includes(s)||n.push(s)}),n}loadSettings(){let e=this.loadSettingsFromFile(this.getUserSettingsPath()),t=this.loadSettingsFromFile(this.getProjectSettingsPath()),n={...e.env,...t.env},s={...e.permissions};if(e.permissions?.allow&&t.permissions?.allow){let a=[...e.permissions.allow];t.permissions.allow.forEach(l=>{a.includes(l)||a.push(l)}),s.allow=a}else t.permissions?.allow&&(s.allow=[...t.permissions.allow]);if(e.permissions?.deny&&t.permissions?.deny){let a=[...e.permissions.deny];t.permissions.deny.forEach(l=>{a.includes(l)||a.push(l)}),s.deny=a}else t.permissions?.deny&&(s.deny=[...t.permissions.deny]);if(e.permissions?.ask&&t.permissions?.ask){let a=[...e.permissions.ask];t.permissions.ask.forEach(l=>{a.includes(l)||a.push(l)}),s.ask=a}else t.permissions?.ask&&(s.ask=[...t.permissions.ask]);let r={...R,...e,...t};n&&Object.keys(n).length>0&&(r.env=n),s&&(s.allow||s.deny||s.ask)&&(r.permissions=s);let i=e.sandbox,c=t.sandbox;if(i||c){let a={...i,...c},l=i?.filesystem,h=c?.filesystem;(l||h)&&(a.filesystem={...l,...h,allowWrite:this.mergeStringArrays(l?.allowWrite,h?.allowWrite),denyWrite:this.mergeStringArrays(l?.denyWrite,h?.denyWrite),denyRead:this.mergeStringArrays(l?.denyRead,h?.denyRead),allowRead:this.mergeStringArrays(l?.allowRead,h?.allowRead)});let O=i?.network,T=c?.network;(O||T)&&(a.network={...O,...T,allowedDomains:this.mergeStringArrays(O?.allowedDomains,T?.allowedDomains),deniedDomains:this.mergeStringArrays(O?.deniedDomains,T?.deniedDomains),allowUnixSockets:this.mergeStringArrays(O?.allowUnixSockets,T?.allowUnixSockets)});let U=i?.ignoreViolations,I=c?.ignoreViolations;if(U||I){let y={};if(U)for(let[_,L]of Object.entries(U))y[_]=[...L];if(I)for(let[_,L]of Object.entries(I))y[_]?y[_]=this.mergeStringArrays(y[_],L)??[]:y[_]=[...L];a.ignoreViolations=y}r.sandbox=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,R)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,R)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let s={...this.loadSettings(),[e]:t};this.saveProjectSettings(s),g=s}resetSetting(e){let n={...this.loadSettings()};delete n[e],this.saveProjectSettings(n),g=n}getAllSettings(){return this.loadSettings()}},M=x.getInstance(),g=M.getAllSettings(),w=function(){return x.test?x.testSettings:(g||(g=M.getAllSettings(),N.clear(),g.env&&Object.keys(g.env).length>0&&(Object.entries(g.env).forEach(([o,e])=>{let t;typeof e=="string"?t=e:t=String(e),t.length>0&&(process.env[o]=t)}),b(`\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D ${Object.keys(g.env).length} \u4E2A\u73AF\u5883\u53D8\u91CF`,g.env))),g)};function z(){let o=M.getUserSettingsPath(),e=M.getProjectSettingsPath();ne(o,(t,n)=>{t==="change"&&(g=null,S.emit("webserver:settings_changed",{scope:"user"}),b("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{m("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>z(),100)}).unref(),ne(e,(t,n)=>{t==="change"&&(g=null,S.emit("webserver:settings_changed",{scope:"project"}),b("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",n))}).on("error",t=>{m("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>z(),100)}).unref()}z();import Le from"os";import De from"path";import A from"fs";var Ne={sources:{},routing:{}};function Pe(){let o=Le.homedir();return De.join(o,d,"config.json")}function ve(o){let e={},t={};for(let[n,s]of Object.entries(o))if(s?.enable===!0&&s?.env){let r=s.env,i=n;e[i]={base_url:r.BASE_URL||"",auth_token:r.AUTH_TOKEN||"",api_type:r.API_TYPE||"anthropic",models:[]},r.MODEL&&(t.MODEL=[{source:i,model:r.MODEL,weight:100}],e[i].models.push(r.MODEL)),r.SMALL_FAST_MODEL&&(t.SMALL_FAST_MODEL=[{source:i,model:r.SMALL_FAST_MODEL,weight:100}],e[i].models.includes(r.SMALL_FAST_MODEL)||e[i].models.push(r.SMALL_FAST_MODEL));break}return{sources:e,routing:t}}function oe(o){if(o.length===0)throw new Error("No items to select from");if(o.length===1)return o[0];let e=o.reduce((n,s)=>n+(s.weight??100),0),t=Math.random()*e;for(let n of o){let s=n.weight??100;if(t-=s,t<=0)return n}return o[o.length-1]}var J=class{config;configPath;constructor(e){this.configPath=e||Pe();try{this.config=this.loadModelConfig()}catch(t){console.log(t)}}reload(){this.config=this.loadModelConfig()}loadModelConfig(){try{if(!A.existsSync(this.configPath))return Ne;let e=A.readFileSync(this.configPath,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:ve(t)}catch(e){throw G(e),e}}getConfig(){return this.config}hasModelRouting(){return!!(this.config.routing?.MODEL&&this.config.routing.MODEL.length>0)}getModelRoutingModels(){let e=this.config.routing?.MODEL;return!e||e.length===0?[]:e.map(t=>t.model)}hasSmallFastModelRouting(){return!!(this.config.routing?.SMALL_FAST_MODEL&&this.config.routing.SMALL_FAST_MODEL.length>0)}getModel(){let e=this.config.routing?.MODEL;if(!e||e.length===0)throw new Error("No MODEL routing configuration found");let t=oe(e);return`${t.source}__${t.model}`}getSmallFastModel(){let e=this.config.routing?.SMALL_FAST_MODEL;if(!e||e.length===0)throw new Error("No SMALL_FAST_MODEL routing configuration found");let t=oe(e);return`${t.source}__${t.model}`}getSourceConfig(e){return this.config.sources?.[e]}parseModelKey(e){let t=e.indexOf("__");return t===-1?{source:"",model:e}:{source:e.slice(0,t),model:e.slice(t+2)}}getModelSourceConfig(e){let{source:t}=this.parseModelKey(e);if(t)return this.getSourceConfig(t)}setModelRouting(e){this.config.routing.MODEL=e,this.saveConfig()}setSmallFastModelRouting(e){this.config.routing.SMALL_FAST_MODEL=e,this.saveConfig()}updateConfig(e){this.config=e,this.saveConfig()}getAvailableModels(){let e=[];for(let[t,n]of Object.entries(this.config.sources||{}))for(let s of n.models||[])e.push(`${t}__${s}`);return e}saveConfig(){try{let e={};if(A.existsSync(this.configPath)){let n=A.readFileSync(this.configPath,"utf-8");e=JSON.parse(n)}let t={...e,sources:this.config.sources,routing:this.config.routing};A.writeFileSync(this.configPath,JSON.stringify(t,null,2))}catch(e){G(e)}}},C=new J;import Re from"os";function Ue(){return k.join(Re.homedir(),d,"config.json")}function Ie(){try{C.reload()}catch(s){return console.error(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`),console.error(`\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${Ue()}`),!1}let o=C.hasModelRouting(),e=C.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=C.getConfig(),n=t.routing||{};for(let[s,r]of Object.entries(n))for(let i of r)if(!t.sources[i.source])return console.error(`\u914D\u7F6E\u9519\u8BEF: routing.${s} \u4E2D\u5F15\u7528\u7684 source "${i.source}" \u5728 sources \u4E2D\u4E0D\u5B58\u5728`),!1;return!0}function je(){if(Q(),!Ie()){process.exit(0);return}(async()=>{let o=M.getSetting("env")||{},e=ie(import.meta.url),t=k.dirname(e),n=k.join(t,"cli.js"),s=re(process.execPath,["--no-deprecation",n,...process.argv.slice(2)],{env:{...process.env,...o},stdio:"inherit",cwd:process.cwd()});s.on("error",r=>{console.error("Failed to start command:",r.message),process.exit(1)}),s.on("close",r=>{process.exit(r||0)})})()}async function Fe(){let o=ie(import.meta.url),e=k.dirname(o),t=k.join(e,"cli.js"),n=re(process.execPath,["--no-deprecation",t,...process.argv.slice(2)],{env:process.env,stdio:"inherit",cwd:process.cwd()});n.on("error",s=>{console.error("Failed to start command:",s.message),process.exit(1)}),n.on("close",s=>{process.exit(s||0)})}async function Be(){process.argv.length<=2?je():await Fe()}await Be();
10
+ import{spawn as oe}from"child_process";import D from"path";import{fileURLToPath as re}from"url";import{existsSync as v,readFileSync as Oe,writeFileSync as R,mkdirSync as Te,watch as ee}from"fs";import{join as te,dirname as Ee}from"path";import{homedir as we}from"os";import{existsSync as K,mkdirSync as ue}from"fs";import{dirname as ge,join as u}from"path";import{writeFileSync as pe,readFileSync as Xe,appendFileSync as fe}from"fs";import{randomUUID as de}from"crypto";import{homedir as me}from"os";var Q="hcode",b=".hcode";var ie="HAWA_CODE_GIT_BASH_PATH";var ae="Bash",ce="PowerShell";var ve=F()?ce:ae;function F(){return process.platform!=="win32"?!1:process.env.HAWA_CODE_POWER_SHELL_ENABLE==="true"||process.env.HAWA_CODE_POWER_SHELL_ENABLE==="1"?!0:!(process.env.HAWA_CODE_POWER_SHELL_ENABLE==="false"||process.env.HAWA_CODE_POWER_SHELL_ENABLE==="0"||process.env[ie])}import*as X from"os";import{randomUUID as le}from"crypto";var B=class{listeners=new Map;registry=new FinalizationRegistry(e=>{for(let[t,n]of this.listeners.entries()){for(let s of Array.from(n))s.token===e&&n.delete(s);n.size===0&&this.listeners.delete(t)}});on(e,t,n){let s=this.listeners.get(e);s||(s=new Set,this.listeners.set(e,s));let r={callback:t,thisRef:n?new WeakRef(n):void 0};if(n){let i={};r.token=i,this.registry.register(n,i,i)}return s.add(r),()=>{this.off(e,t,n)}}off(e,t,n){let s=this.listeners.get(e);if(s){if(!t&&n===void 0){for(let r of s)r.token&&this.registry.unregister(r.token);this.listeners.delete(e);return}for(let r of Array.from(s)){let i=t?r.callback===t:!0,c=!0;n!==void 0&&(c=r.thisRef?.deref()===n),i&&c&&(r.token&&this.registry.unregister(r.token),s.delete(r))}s.size===0&&this.listeners.delete(e)}}emit(e,t){let n=this.listeners.get(e);if(n)for(let s of Array.from(n)){let r;if(s.thisRef&&(r=s.thisRef.deref(),!r)){n.delete(s);continue}try{let i=s.callback.call(r,t);i instanceof Promise&&i.catch(c=>{m(`Async error in listener for "${e}"`,c)})}catch(i){m(`Error in listener for "${e}"`,i)}}}},S=new B;var P=class{datas={};setData(e,t){this.datas[e]=t}getData(e){return this.datas[e]}takeData(e){let t=this.datas[e];return delete this.datas[e],t}clear(){this.datas={}}},x=class extends P{startTime;constructor(e=null){super(),this.startTime=e}},V=le(),H=class extends P{PENDING_PROMPTS_KEY="pendingPrompts";addPendingPrompt(e){let t=this.getPendingPrompts();t.push(e),this.setData(this.PENDING_PROMPTS_KEY,t)}getPendingPrompts(){let e=this.getData(this.PENDING_PROMPTS_KEY);return Array.isArray(e)?e:[]}takePendingPrompts(){let e=this.getPendingPrompts();return this.setData(this.PENDING_PROMPTS_KEY,[]),e}async waitGetPendingPrompts(e){let n=Date.now(),s=e*1e3;for(;Date.now()-n<s;){let r=this.getPendingPrompts();if(r.length>0)return r;await new Promise(i=>setTimeout(i,200))}return[]}getSessionId(){return V}switchSessionId(e){V=e}},W=class o{static sessionContext={};static inQueryContextHolder={};static queryContext={};onQueryStart(e="defalt",t){e||(e="defalt");let n=o.inQueryContextHolder[e+""];n&&n.startTime&&n.startTime>0||(o.inQueryContextHolder[e+""]=new x(Date.now()),S.emit("webserver:agent_status",{agentId:e,status:"started",agentType:t?.agentType,agentName:t?.agentName,description:t?.description,timestamp:Date.now()}))}onQueryEnd(e="defalt",t=!1){e||(e="defalt"),o.inQueryContextHolder[e+""]=new x(-1),t||(o.queryContext[e+""]={}),S.emit("webserver:agent_status",{agentId:e,status:"ended",timestamp:Date.now()})}getSessionContext(e="defalt"){e||(e="defalt");let t=o.sessionContext[e+""];return t||(t=new H,o.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=o.inQueryContextHolder[e+""];return t||(t=new x,o.inQueryContextHolder[e+""]=t),t}getQueryContext(e="defalt"){e||(e="defalt");let t=o.queryContext[e+""];return t||(t={},o.queryContext[e+""]=t),t}isQuerying(e="defalt"){return e||(e="defalt"),this.getInQueryContext(e).startTime>0}},Y=new W;var rt=de(),p=u(me(),b);function f(o){return o.replace(/[^a-zA-Z0-9]/g,"-")}function Se(){return Y.getSessionContext().getSessionId()||$}function he(){try{let o=A().planDirectory;if(o)return o}catch{}return u(p,"plan")}var q={temp:()=>u(X.tmpdir(),`${Q}`),plan:()=>he(),memory:()=>u(p,"projects",f(process.cwd()),"memory"),apis:()=>u(p,"projects",f(process.cwd()),"apis"),errors:()=>u(p,"projects",f(process.cwd()),"errors"),messages:()=>u(p,"projects",f(process.cwd()),"messages"),mcpLogs:o=>u(p,"projects",f(process.cwd()),`mcp-logs-${o}`),log:()=>u(p,"projects",f(process.cwd()),"log"),vcrFixtures:()=>u(p,"projects",f(process.cwd()),"vcr-fixtures"),sessionSummary:()=>u(p,"projects",f(process.cwd()),"messages",Se(),"session-summary")};function ye(o){return o.toISOString().replace(/[:.]/g,"-")}var $=ye(new Date);function _e(){return u(q.log(),$+".log")}function be(){return u(q.log(),"error-"+$+".log")}function Z(o,e,...t){let n=t.map(s=>s instanceof Error?`${s.name}: ${s.message}
11
+ ${s.stack.replace(/^/gm," ")}`:s);Me(e,{level:o,message:n.length==1?n[0]:n})}function M(...o){Z("info",_e(),...o)}function m(...o){Z("error",be(),...o)}function N(...o){m(...o)}function Me(o,e){let t=ge(o);K(t)||ue(t,{recursive:!0});let s=(typeof e=="string"?e:JSON.stringify(e))+`
12
+ `;K(o)?fe(o,s,"utf8"):pe(o,s,"utf8")}var it=5*1024*1024,at=1024*1024,ct=Buffer.from('"compact_boundary"');var L=class o{static getTools=e=>[];static getMCPCommands=()=>[];static getMcpServer=e=>{};static getClients=async()=>[];static reloadClients=async()=>[];static reconnect=async(e,t,n)=>{};static registerIDEClient=(e,t)=>{};static cache=[];static add(e){o.cache.push(e)}static clear(){o.cache.forEach(e=>{e.cache.clear?.()})}};var U={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:!0,memo:!1,messageArchiving:!1,autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},autoMemory:{enabled:!0,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!0,minHours:24,minSessions:5},proxy:!1,agentDepth:1},C=class o{static test=!1;static testSettings;static setSettings(e){o.testSettings=e}static instance;static isTasksEnable(){return process.env.HAWA_CODE_ENABLE_TASKS=="true"||o.isAgentTeamEnable()}static isAgentTeamEnable(){return process.env.HAWA_CODE_EXPERIMENTAL_AGENT_TEAMS=="1"}static isLazyToolEnable(){return A().lazyTool===!0}static isPowerShellToolEnable(){return F()}static isMemoEnable(){return A().memo===!0}static isMessageArchivingEnable(){return A().messageArchiving===!0}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),v(e)||R(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),v(t)||R(t,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8")}getDefaultSettingsStructure(){return{env:{},permissions:{allow:[],deny:[],ask:[]},autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},thinking:"medium"}}static getInstance(){return o.instance||(o.instance=new o),o.instance}addProjectAllowedTools(e){let t=this.loadSettingsFromFile(this.getProjectSettingsPath()),n=t.permissions||{allow:[],deny:[]};if(n.allow||(n.allow=[]),n.allow.includes(e))M(`\u5DE5\u5177 '${e}' \u5DF2\u5B58\u5728\u4E8E\u9879\u76EE\u5141\u8BB8\u5217\u8868\u4E2D\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0`);else{n.allow.push(e),n.allow.sort();let s={...t,permissions:{...n}};this.saveSettingsToFile(this.getProjectSettingsPath(),s,U),M(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return te(we(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return te(e,".hcode","settings.json")}ensureDirExists(e){let t=Ee(e);v(t)||Te(t,{recursive:!0})}loadSettingsFromFile(e){if(!v(e))return{};let t="";try{return t=Oe(e,"utf-8"),JSON.parse(t)}catch(n){return console.error(`Error reading settings file ${e} => ${t} `,n),{}}}saveSettingsToFile(e,t,n){let s={...t};for(let[r,i]of Object.entries(t))if(r in n)if(typeof i=="object"&&typeof n[r]=="object"){if(JSON.stringify(i)===JSON.stringify(n[r]))delete s[r];else if(r==="permissions"&&i&&typeof i=="object"){let c=n.permissions||{},a=i;Array.isArray(a.allow)&&Array.isArray(c.allow)&&JSON.stringify(a.allow)===JSON.stringify(c.allow)&&delete a.allow,Array.isArray(a.deny)&&Array.isArray(c.deny)&&JSON.stringify(a.deny)===JSON.stringify(c.deny)&&delete a.deny,Object.keys(a).length===0&&delete s[r]}}else i===n[r]&&delete s[r];this.ensureDirExists(e),Object.keys(s).length===0?R(e,"{}","utf-8"):R(e,JSON.stringify(s,null,2),"utf-8")}mergeStringArrays(e,t){if(!e&&!t)return;let n=[...e||[]];return(t||[]).forEach(s=>{n.includes(s)||n.push(s)}),n}loadSettings(){let e=this.loadSettingsFromFile(this.getUserSettingsPath()),t=this.loadSettingsFromFile(this.getProjectSettingsPath()),n={...e.env,...t.env},s={...e.permissions};if(e.permissions?.allow&&t.permissions?.allow){let a=[...e.permissions.allow];t.permissions.allow.forEach(l=>{a.includes(l)||a.push(l)}),s.allow=a}else t.permissions?.allow&&(s.allow=[...t.permissions.allow]);if(e.permissions?.deny&&t.permissions?.deny){let a=[...e.permissions.deny];t.permissions.deny.forEach(l=>{a.includes(l)||a.push(l)}),s.deny=a}else t.permissions?.deny&&(s.deny=[...t.permissions.deny]);if(e.permissions?.ask&&t.permissions?.ask){let a=[...e.permissions.ask];t.permissions.ask.forEach(l=>{a.includes(l)||a.push(l)}),s.ask=a}else t.permissions?.ask&&(s.ask=[...t.permissions.ask]);let r={...U,...e,...t};n&&Object.keys(n).length>0&&(r.env=n),s&&(s.allow||s.deny||s.ask)&&(r.permissions=s);let i=e.sandbox,c=t.sandbox;if(i||c){let a={...i,...c},l=i?.filesystem,h=c?.filesystem;(l||h)&&(a.filesystem={...l,...h,allowWrite:this.mergeStringArrays(l?.allowWrite,h?.allowWrite),denyWrite:this.mergeStringArrays(l?.denyWrite,h?.denyWrite),denyRead:this.mergeStringArrays(l?.denyRead,h?.denyRead),allowRead:this.mergeStringArrays(l?.allowRead,h?.allowRead)});let E=i?.network,w=c?.network;(E||w)&&(a.network={...E,...w,allowedDomains:this.mergeStringArrays(E?.allowedDomains,w?.allowedDomains),deniedDomains:this.mergeStringArrays(E?.deniedDomains,w?.deniedDomains),allowUnixSockets:this.mergeStringArrays(E?.allowUnixSockets,w?.allowUnixSockets)});let I=i?.ignoreViolations,j=c?.ignoreViolations;if(I||j){let y={};if(I)for(let[_,k]of Object.entries(I))y[_]=[...k];if(j)for(let[_,k]of Object.entries(j))y[_]?y[_]=this.mergeStringArrays(y[_],k)??[]:y[_]=[...k];a.ignoreViolations=y}r.sandbox=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,U)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,U)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let s={...this.loadSettings(),[e]:t};this.saveProjectSettings(s),g=s}resetSetting(e){let n={...this.loadSettings()};delete n[e],this.saveProjectSettings(n),g=n}getAllSettings(){return this.loadSettings()}},O=C.getInstance(),g=O.getAllSettings(),A=function(){return C.test?C.testSettings:(g||(g=O.getAllSettings(),L.clear(),g.env&&Object.keys(g.env).length>0&&(Object.entries(g.env).forEach(([o,e])=>{let t;typeof e=="string"?t=e:t=String(e),t.length>0&&(process.env[o]=t)}),M(`\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D ${Object.keys(g.env).length} \u4E2A\u73AF\u5883\u53D8\u91CF`,g.env))),g)};function G(){let o=O.getUserSettingsPath(),e=O.getProjectSettingsPath();ee(o,(t,n)=>{t==="change"&&(g=null,S.emit("webserver:settings_changed",{scope:"user"}),M("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{m("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>G(),100)}).unref(),ee(e,(t,n)=>{t==="change"&&(g=null,S.emit("webserver:settings_changed",{scope:"project"}),M("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",n))}).on("error",t=>{m("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>G(),100)}).unref()}G();import xe from"os";import se from"path";import d from"fs";var z={sources:{openai:{base_url:"https://api.openai.com/v1",auth_token:"{apikey}",api_type:"openai",models:["gpt-5.5","gpt-5.4-mini"]},kimi:{base_url:"https://api.kimi.com/coding",auth_token:"{apikey}",api_type:"anthropic",models:["K2.5","K2.6"]},"qwen-coding":{base_url:"https://coding.dashscope.aliyuncs.com/apps/anthropic",auth_token:"{apikey}",api_type:"anthropic",models:["qwen3-coder-plus"]}},routing:{MODEL:[{source:"kimi",model:"K2.6",weight:60},{source:"openai",model:"gpt-5.5",weight:40}],SMALL_FAST_MODEL:[{source:"qwen-coding",model:"qwen3-coder-plus",weight:50},{source:"kimi",model:"K2.5",weight:50}]}};function Ae(){let o=xe.homedir();return se.join(o,b,"config.json")}function ne(o){if(o.length===0)throw new Error("No items to select from");if(o.length===1)return o[0];let e=o.reduce((n,s)=>n+(s.weight??100),0),t=Math.random()*e;for(let n of o){let s=n.weight??100;if(t-=s,t<=0)return n}return o[o.length-1]}var J=class{config;configPath;constructor(e){this.configPath=e||Ae();try{this.config=this.loadModelConfig()}catch(t){console.log(t)}}initConfig(){if(!d.existsSync(this.configPath))try{let e=se.dirname(this.configPath);d.mkdirSync(e,{recursive:!0}),d.writeFileSync(this.configPath,JSON.stringify(z,null,2))}catch(e){N(e)}}reload(){this.config=this.loadModelConfig()}loadModelConfig(){try{if(!d.existsSync(this.configPath))return z;let e=d.readFileSync(this.configPath,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:z}catch(e){throw N(e),e}}getConfig(){return this.config}hasModelRouting(){return!!(this.config.routing?.MODEL&&this.config.routing.MODEL.length>0)}getModelRoutingModels(){let e=this.config.routing?.MODEL;return!e||e.length===0?[]:e.map(t=>t.model)}hasSmallFastModelRouting(){return!!(this.config.routing?.SMALL_FAST_MODEL&&this.config.routing.SMALL_FAST_MODEL.length>0)}getModel(){let e=this.config.routing?.MODEL;if(!e||e.length===0)throw new Error("No MODEL routing configuration found");let t=ne(e);return`${t.source}__${t.model}`}getSmallFastModel(){let e=this.config.routing?.SMALL_FAST_MODEL;if(!e||e.length===0)throw new Error("No SMALL_FAST_MODEL routing configuration found");let t=ne(e);return`${t.source}__${t.model}`}getSourceConfig(e){return this.config.sources?.[e]}parseModelKey(e){let t=e.indexOf("__");return t===-1?{source:"",model:e}:{source:e.slice(0,t),model:e.slice(t+2)}}getModelSourceConfig(e){let{source:t}=this.parseModelKey(e);if(t)return this.getSourceConfig(t)}setModelRouting(e){this.config.routing.MODEL=e,this.saveConfig()}setSmallFastModelRouting(e){this.config.routing.SMALL_FAST_MODEL=e,this.saveConfig()}updateConfig(e){this.config=e,this.saveConfig()}getAvailableModels(){let e=[];for(let[t,n]of Object.entries(this.config.sources||{}))for(let s of n.models||[])e.push(`${t}__${s}`);return e}saveConfig(){try{let e={};if(d.existsSync(this.configPath)){let n=d.readFileSync(this.configPath,"utf-8");e=JSON.parse(n)}let t={...e,sources:this.config.sources,routing:this.config.routing};d.writeFileSync(this.configPath,JSON.stringify(t,null,2))}catch(e){N(e)}}},T=new J;import Ce from"os";function De(){return D.join(Ce.homedir(),b,"config.json")}function ke(){try{T.reload()}catch(s){return console.error(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${s instanceof Error?s.message:String(s)}`),console.error(`\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${De()}`),!1}let o=T.hasModelRouting(),e=T.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=T.getConfig(),n=t.routing||{};for(let[s,r]of Object.entries(n))for(let i of r)if(!t.sources[i.source])return console.error(`\u914D\u7F6E\u9519\u8BEF: routing.${s} \u4E2D\u5F15\u7528\u7684 source "${i.source}" \u5728 sources \u4E2D\u4E0D\u5B58\u5728`),!1;return!0}function Pe(){if(T.initConfig(),!ke()){process.exit(0);return}(async()=>{let o=O.getSetting("env")||{},e=re(import.meta.url),t=D.dirname(e),n=D.join(t,"cli.js"),s=oe(process.execPath,["--no-deprecation",n,...process.argv.slice(2)],{env:{...process.env,...o},stdio:"inherit",cwd:process.cwd()});s.on("error",r=>{console.error("Failed to start command:",r.message),process.exit(1)}),s.on("close",r=>{process.exit(r||0)})})()}async function Ne(){let o=re(import.meta.url),e=D.dirname(o),t=D.join(e,"cli.js"),n=oe(process.execPath,["--no-deprecation",t,...process.argv.slice(2)],{env:process.env,stdio:"inherit",cwd:process.cwd()});n.on("error",s=>{console.error("Failed to start command:",s.message),process.exit(1)}),n.on("close",s=>{process.exit(s||0)})}async function Le(){process.argv.length<=2?Pe():await Ne()}await Le();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dahawa/hawa-code",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "bin": {
5
5
  "hcode": "hawa.js"
6
6
  },