@dahawa/hawa-code 1.37.4 → 1.38.1

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 ce from"os";import $ from"path";import v from"fs";var W="hcode",p=".hcode";var re="HAWA_CODE_GIT_BASH_PATH";var ie="Bash",ae="PowerShell";var Ie=P()?ae:ie;function P(){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[re])}var le={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 ue(){let n=ce.homedir();return $.join(n,p,"config.json")}function G(){let n=ue();v.existsSync(n)||(v.mkdirSync($.dirname(n),{recursive:!0}),v.writeFileSync(n,JSON.stringify(le,null,2)))}import{spawn as se}from"child_process";import T from"path";import{fileURLToPath as oe}from"url";import{existsSync as C,readFileSync as Ee,writeFileSync as k,mkdirSync as Te,watch as X}from"fs";import{join as q,dirname as Ae}from"path";import{homedir as we}from"os";import{existsSync as K,mkdirSync as pe}from"fs";import{dirname as de,join as l}from"path";import{writeFileSync as fe,readFileSync as tt,appendFileSync as me}from"fs";import{randomUUID as Se}from"crypto";import{homedir as he}from"os";import*as V from"os";import{randomUUID as ge}from"crypto";var w=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={}}},_=class extends w{startTime;constructor(e=null){super(),this.startTime=e}},J=ge(),R=class extends w{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 o=Date.now(),s=e*1e3;for(;Date.now()-o<s;){let r=this.getPendingPrompts();if(r.length>0)return r;await new Promise(i=>setTimeout(i,200))}return[]}getSessionId(){return J}switchSessionId(e){J=e}},U=class n{static sessionContext={};static inQueryContextHolder={};static queryContext={};onQueryStart(e="defalt"){e||(e="defalt");let t=n.inQueryContextHolder[e+""];t&&t.startTime&&t.startTime>0||(n.inQueryContextHolder[e+""]=new _(Date.now()))}onQueryEnd(e="defalt",t=!1){e||(e="defalt"),n.inQueryContextHolder[e+""]=new _(-1),t||(n.queryContext[e+""]={})}getSessionContext(e="defalt"){e||(e="defalt");let t=n.sessionContext[e+""];return t||(t=new R,n.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=n.inQueryContextHolder[e+""];return t||(t=new _,n.inQueryContextHolder[e+""]=t),t}getQueryContext(e="defalt"){e||(e="defalt");let t=n.queryContext[e+""];return t||(t={},n.queryContext[e+""]=t),t}isQuerying(e="defalt"){return e||(e="defalt"),this.getInQueryContext(e).startTime>0}},z=new U;var at=Se(),g=l(he(),p);function d(n){return n.replace(/[^a-zA-Z0-9]/g,"-")}function ye(){return z.getSessionContext().getSessionId()||I}var Y={temp:()=>l(V.tmpdir(),`${W}`),plan:()=>l(g,"plan"),memory:()=>l(g,"projects",d(process.cwd()),"memory"),apis:()=>l(g,"projects",d(process.cwd()),"apis"),errors:()=>l(g,"projects",d(process.cwd()),"errors"),messages:()=>l(g,"projects",d(process.cwd()),"messages"),mcpLogs:n=>l(g,"projects",d(process.cwd()),`mcp-logs-${n}`),log:()=>l(g,"projects",d(process.cwd()),"log"),vcrFixtures:()=>l(g,"projects",d(process.cwd()),"vcr-fixtures"),sessionSummary:()=>l(g,"projects",d(process.cwd()),"messages",ye(),"session-summary")};function _e(n){return n.toISOString().replace(/[:.]/g,"-")}var I=_e(new Date);function Me(){return l(Y.log(),I+".log")}function Oe(){return l(Y.log(),"error-"+I+".log")}function Q(n,e,...t){let o=t.map(s=>s instanceof Error?`${s.name}: ${s.message}
11
- ${s.stack.replace(/^/gm," ")}`:s);be(e,{level:n,message:o.length==1?o[0]:o})}function M(...n){Q("info",Me(),...n)}function x(...n){Q("error",Oe(),...n)}function j(...n){x(...n)}function be(n,e){let t=de(n);K(t)||pe(t,{recursive:!0});let s=(typeof e=="string"?e:JSON.stringify(e))+`
12
- `;K(n)?me(n,s,"utf8"):fe(n,s,"utf8")}var ct=5*1024*1024,lt=1024*1024,ut=Buffer.from('"compact_boundary"');var L={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,autoMemory:{enabled:!0,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!0,minHours:24,minSessions:5}},F=class n{static test=!1;static testSettings;static setSettings(e){n.testSettings=e}static instance;static isTasksEnable(){return process.env.HAWA_CODE_ENABLE_TASKS=="true"||n.isAgentTeamEnable()}static isAgentTeamEnable(){return process.env.HAWA_CODE_EXPERIMENTAL_AGENT_TEAMS=="1"}static isLazyToolEnable(){return process.env.HAWA_CODE_LAZY_TOOL==="true"||process.env.HAWA_CODE_LAZY_TOOL==="1"}static isPowerShellToolEnable(){return P()}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),C(e)||k(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),C(t)||k(t,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8")}getDefaultSettingsStructure(){return{env:{},permissions:{allow:[],deny:[],ask:[]},autoMode:{enabled:!1,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},thinking:"medium"}}static getInstance(){return n.instance||(n.instance=new n),n.instance}addProjectAllowedTools(e){let t=this.loadSettingsFromFile(this.getProjectSettingsPath()),o=t.permissions||{allow:[],deny:[]};if(o.allow||(o.allow=[]),o.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{o.allow.push(e),o.allow.sort();let s={...t,permissions:{...o}};this.saveSettingsToFile(this.getProjectSettingsPath(),s,L),M(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return q(we(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return q(e,".hcode","settings.json")}ensureDirExists(e){let t=Ae(e);C(t)||Te(t,{recursive:!0})}loadSettingsFromFile(e){if(!C(e))return{};let t="";try{return t=Ee(e,"utf-8"),JSON.parse(t)}catch(o){return console.error(`Error reading settings file ${e} => ${t} `,o),{}}}saveSettingsToFile(e,t,o){let s={...t};for(let[r,i]of Object.entries(t))if(r in o)if(typeof i=="object"&&typeof o[r]=="object"){if(JSON.stringify(i)===JSON.stringify(o[r]))delete s[r];else if(r==="permissions"&&i&&typeof i=="object"){let u=o.permissions||{},a=i;Array.isArray(a.allow)&&Array.isArray(u.allow)&&JSON.stringify(a.allow)===JSON.stringify(u.allow)&&delete a.allow,Array.isArray(a.deny)&&Array.isArray(u.deny)&&JSON.stringify(a.deny)===JSON.stringify(u.deny)&&delete a.deny,Object.keys(a).length===0&&delete s[r]}}else i===o[r]&&delete s[r];this.ensureDirExists(e),Object.keys(s).length===0?k(e,"{}","utf-8"):k(e,JSON.stringify(s,null,2),"utf-8")}mergeStringArrays(e,t){if(!e&&!t)return;let o=[...e||[]];return(t||[]).forEach(s=>{o.includes(s)||o.push(s)}),o}loadSettings(){let e=this.loadSettingsFromFile(this.getUserSettingsPath()),t=this.loadSettingsFromFile(this.getProjectSettingsPath()),o={...e.env,...t.env},s={...e.permissions};if(e.permissions?.allow&&t.permissions?.allow){let a=[...e.permissions.allow];t.permissions.allow.forEach(c=>{a.includes(c)||a.push(c)}),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(c=>{a.includes(c)||a.push(c)}),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(c=>{a.includes(c)||a.push(c)}),s.ask=a}else t.permissions?.ask&&(s.ask=[...t.permissions.ask]);let r={...L,...e,...t};o&&Object.keys(o).length>0&&(r.env=o),s&&(s.allow||s.deny||s.ask)&&(r.permissions=s);let i=e.sandbox,u=t.sandbox;if(i||u){let a={...i,...u},c=i?.filesystem,f=u?.filesystem;(c||f)&&(a.filesystem={...c,...f,allowWrite:this.mergeStringArrays(c?.allowWrite,f?.allowWrite),denyWrite:this.mergeStringArrays(c?.denyWrite,f?.denyWrite),denyRead:this.mergeStringArrays(c?.denyRead,f?.denyRead),allowRead:this.mergeStringArrays(c?.allowRead,f?.allowRead)});let h=i?.network,y=u?.network;(h||y)&&(a.network={...h,...y,allowedDomains:this.mergeStringArrays(h?.allowedDomains,y?.allowedDomains),deniedDomains:this.mergeStringArrays(h?.deniedDomains,y?.deniedDomains),allowUnixSockets:this.mergeStringArrays(h?.allowUnixSockets,y?.allowUnixSockets)});let D=i?.ignoreViolations,N=u?.ignoreViolations;if(D||N){let m={};if(D)for(let[S,A]of Object.entries(D))m[S]=[...A];if(N)for(let[S,A]of Object.entries(N))m[S]?m[S]=this.mergeStringArrays(m[S],A)??[]:m[S]=[...A];a.ignoreViolations=m}r.sandbox=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,L)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,L)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let s={...this.loadSettings(),[e]:t};this.saveProjectSettings(s)}resetSetting(e){let o={...this.loadSettings()};delete o[e],this.saveProjectSettings(o)}getAllSettings(){return this.loadSettings()}},O=F.getInstance(),Z=O.getAllSettings();function H(){let n=O.getUserSettingsPath(),e=O.getProjectSettingsPath();X(n,(t,o)=>{t==="change"&&(Z=null,M("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{x("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>H(),100)}),X(e,(t,o)=>{t==="change"&&(Z=null,M("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",o))}).on("error",t=>{x("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>H(),100)})}H();import xe from"os";import Ce from"path";import b from"fs";var ke={sources:{},routing:{}};function ne(){let n=xe.homedir();return Ce.join(n,p,"config.json")}function ee(){try{let n=ne();if(!b.existsSync(n))return ke;let e=b.readFileSync(n,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:Le(t)}catch(n){throw j(n),n}}function Le(n){let e={},t={};for(let[o,s]of Object.entries(n))if(s?.enable===!0&&s?.env){let r=s.env,i=o;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 te(n){if(n.length===0)throw new Error("No items to select from");if(n.length===1)return n[0];let e=n.reduce((o,s)=>o+(s.weight??100),0),t=Math.random()*e;for(let o of n){let s=o.weight??100;if(t-=s,t<=0)return o}return n[n.length-1]}var B=class{config;constructor(){try{this.config=ee()}catch(e){console.log(e)}}reload(){this.config=ee()}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=te(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=te(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()}getAvailableModels(){let e=[];for(let[t,o]of Object.entries(this.config.sources||{}))for(let s of o.models||[])e.push(`${t}__${s}`);return e}saveConfig(){try{let e=ne(),t={};if(b.existsSync(e)){let s=b.readFileSync(e,"utf-8");t=JSON.parse(s)}let o={...t,sources:this.config.sources,routing:this.config.routing};b.writeFileSync(e,JSON.stringify(o,null,2))}catch(e){j(e)}}},E=new B;import De from"os";function Ne(){return T.join(De.homedir(),p,"config.json")}function Pe(){try{E.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: ${Ne()}`),!1}let n=E.hasModelRouting(),e=E.hasSmallFastModelRouting();if(!n&&!e)return!1;let t=E.getConfig(),o=t.routing||{};for(let[s,r]of Object.entries(o))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 ve(){if(G(),!Pe()){process.exit(0);return}(async()=>{let n=O.getSetting("env")||{},e=oe(import.meta.url),t=T.dirname(e),o=T.join(t,"cli.js"),s=se(process.execPath,["--no-deprecation",o,...process.argv.slice(2)],{env:{...process.env,...n},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 Re(){let n=oe(import.meta.url),e=T.dirname(n),t=T.join(e,"cli.js"),o=se(process.execPath,["--no-deprecation",t,...process.argv.slice(2)],{env:process.env,stdio:"inherit",cwd:process.cwd()});o.on("error",s=>{console.error("Failed to start command:",s.message),process.exit(1)}),o.on("close",s=>{process.exit(s||0)})}async function Ue(){process.argv.length<=2?ve():await Re()}await Ue();
10
+ import ue from"os";import z from"path";import R from"fs";var G="hcode",p=".hcode";var ae="HAWA_CODE_GIT_BASH_PATH";var ce="Bash",le="PowerShell";var Fe=v()?le:ce;function v(){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 s=ue.homedir();return z.join(s,p,"config.json")}function J(){let s=pe();R.existsSync(s)||(R.mkdirSync(z.dirname(s),{recursive:!0}),R.writeFileSync(s,JSON.stringify(ge,null,2)))}import{spawn as re}from"child_process";import T from"path";import{fileURLToPath as ie}from"url";import{existsSync as C,readFileSync as Te,writeFileSync as L,mkdirSync as xe,watch as Z}from"fs";import{join as ee,dirname as Ae}from"path";import{homedir as ke}from"os";import{existsSync as Y,mkdirSync as fe}from"fs";import{dirname as me,join as u}from"path";import{writeFileSync as Se,readFileSync as at,appendFileSync as he}from"fs";import{randomUUID as ye}from"crypto";import{homedir as _e}from"os";import*as Q from"os";import{randomUUID as de}from"crypto";var U=class{listeners=new Map;registry=new FinalizationRegistry(e=>{for(let[t,o]of this.listeners.entries()){for(let n of Array.from(o))n.token===e&&o.delete(n);o.size===0&&this.listeners.delete(t)}});on(e,t,o){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n));let r={callback:t,thisRef:o?new WeakRef(o):void 0};if(o){let i={};r.token=i,this.registry.register(o,i,i)}return n.add(r),()=>{this.off(e,t,o)}}off(e,t,o){let n=this.listeners.get(e);if(n){if(!t&&o===void 0){for(let r of n)r.token&&this.registry.unregister(r.token);this.listeners.delete(e);return}for(let r of Array.from(n)){let i=t?r.callback===t:!0,c=!0;o!==void 0&&(c=r.thisRef?.deref()===o),i&&c&&(r.token&&this.registry.unregister(r.token),n.delete(r))}n.size===0&&this.listeners.delete(e)}}emit(e,t){let o=this.listeners.get(e);if(o)for(let n of Array.from(o)){let r;if(n.thisRef&&(r=n.thisRef.deref(),!r)){o.delete(n);continue}try{let i=n.callback.call(r,t);i instanceof Promise&&i.catch(c=>{f(`Async error in listener for "${e}"`,c)})}catch(i){f(`Error in listener for "${e}"`,i)}}}},A=new U;var k=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={}}},b=class extends k{startTime;constructor(e=null){super(),this.startTime=e}},K=de(),I=class extends k{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 o=Date.now(),n=e*1e3;for(;Date.now()-o<n;){let r=this.getPendingPrompts();if(r.length>0)return r;await new Promise(i=>setTimeout(i,200))}return[]}getSessionId(){return K}switchSessionId(e){K=e}},j=class s{static sessionContext={};static inQueryContextHolder={};static queryContext={};onQueryStart(e="defalt"){e||(e="defalt");let t=s.inQueryContextHolder[e+""];t&&t.startTime&&t.startTime>0||(s.inQueryContextHolder[e+""]=new b(Date.now()),A.emit("webserver:agent_status",{agentId:e,status:"started",timestamp:Date.now()}))}onQueryEnd(e="defalt",t=!1){e||(e="defalt"),s.inQueryContextHolder[e+""]=new b(-1),t||(s.queryContext[e+""]={}),A.emit("webserver:agent_status",{agentId:e,status:"ended",timestamp:Date.now()})}getSessionContext(e="defalt"){e||(e="defalt");let t=s.sessionContext[e+""];return t||(t=new I,s.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=s.inQueryContextHolder[e+""];return t||(t=new b,s.inQueryContextHolder[e+""]=t),t}getQueryContext(e="defalt"){e||(e="defalt");let t=s.queryContext[e+""];return t||(t={},s.queryContext[e+""]=t),t}isQuerying(e="defalt"){return e||(e="defalt"),this.getInQueryContext(e).startTime>0}},V=new j;var ft=ye(),g=u(_e(),p);function d(s){return s.replace(/[^a-zA-Z0-9]/g,"-")}function be(){return V.getSessionContext().getSessionId()||F}var X={temp:()=>u(Q.tmpdir(),`${G}`),plan:()=>u(g,"plan"),memory:()=>u(g,"projects",d(process.cwd()),"memory"),apis:()=>u(g,"projects",d(process.cwd()),"apis"),errors:()=>u(g,"projects",d(process.cwd()),"errors"),messages:()=>u(g,"projects",d(process.cwd()),"messages"),mcpLogs:s=>u(g,"projects",d(process.cwd()),`mcp-logs-${s}`),log:()=>u(g,"projects",d(process.cwd()),"log"),vcrFixtures:()=>u(g,"projects",d(process.cwd()),"vcr-fixtures"),sessionSummary:()=>u(g,"projects",d(process.cwd()),"messages",be(),"session-summary")};function Me(s){return s.toISOString().replace(/[:.]/g,"-")}var F=Me(new Date);function Oe(){return u(X.log(),F+".log")}function Ee(){return u(X.log(),"error-"+F+".log")}function q(s,e,...t){let o=t.map(n=>n instanceof Error?`${n.name}: ${n.message}
11
+ ${n.stack.replace(/^/gm," ")}`:n);we(e,{level:s,message:o.length==1?o[0]:o})}function M(...s){q("info",Oe(),...s)}function f(...s){q("error",Ee(),...s)}function B(...s){f(...s)}function we(s,e){let t=me(s);Y(t)||fe(t,{recursive:!0});let n=(typeof e=="string"?e:JSON.stringify(e))+`
12
+ `;Y(s)?he(s,n,"utf8"):Se(s,n,"utf8")}var mt=5*1024*1024,St=1024*1024,ht=Buffer.from('"compact_boundary"');var D={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,autoMemory:{enabled:!0,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!0,minHours:24,minSessions:5}},H=class s{static test=!1;static testSettings;static setSettings(e){s.testSettings=e}static instance;static isTasksEnable(){return process.env.HAWA_CODE_ENABLE_TASKS=="true"||s.isAgentTeamEnable()}static isAgentTeamEnable(){return process.env.HAWA_CODE_EXPERIMENTAL_AGENT_TEAMS=="1"}static isLazyToolEnable(){return process.env.HAWA_CODE_LAZY_TOOL==="true"||process.env.HAWA_CODE_LAZY_TOOL==="1"}static isPowerShellToolEnable(){return v()}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),C(e)||L(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),C(t)||L(t,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8")}getDefaultSettingsStructure(){return{env:{},permissions:{allow:[],deny:[],ask:[]},autoMode:{enabled:!1,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},thinking:"medium"}}static getInstance(){return s.instance||(s.instance=new s),s.instance}addProjectAllowedTools(e){let t=this.loadSettingsFromFile(this.getProjectSettingsPath()),o=t.permissions||{allow:[],deny:[]};if(o.allow||(o.allow=[]),o.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{o.allow.push(e),o.allow.sort();let n={...t,permissions:{...o}};this.saveSettingsToFile(this.getProjectSettingsPath(),n,D),M(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return ee(ke(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return ee(e,".hcode","settings.json")}ensureDirExists(e){let t=Ae(e);C(t)||xe(t,{recursive:!0})}loadSettingsFromFile(e){if(!C(e))return{};let t="";try{return t=Te(e,"utf-8"),JSON.parse(t)}catch(o){return console.error(`Error reading settings file ${e} => ${t} `,o),{}}}saveSettingsToFile(e,t,o){let n={...t};for(let[r,i]of Object.entries(t))if(r in o)if(typeof i=="object"&&typeof o[r]=="object"){if(JSON.stringify(i)===JSON.stringify(o[r]))delete n[r];else if(r==="permissions"&&i&&typeof i=="object"){let c=o.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 n[r]}}else i===o[r]&&delete n[r];this.ensureDirExists(e),Object.keys(n).length===0?L(e,"{}","utf-8"):L(e,JSON.stringify(n,null,2),"utf-8")}mergeStringArrays(e,t){if(!e&&!t)return;let o=[...e||[]];return(t||[]).forEach(n=>{o.includes(n)||o.push(n)}),o}loadSettings(){let e=this.loadSettingsFromFile(this.getUserSettingsPath()),t=this.loadSettingsFromFile(this.getProjectSettingsPath()),o={...e.env,...t.env},n={...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)}),n.allow=a}else t.permissions?.allow&&(n.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)}),n.deny=a}else t.permissions?.deny&&(n.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)}),n.ask=a}else t.permissions?.ask&&(n.ask=[...t.permissions.ask]);let r={...D,...e,...t};o&&Object.keys(o).length>0&&(r.env=o),n&&(n.allow||n.deny||n.ask)&&(r.permissions=n);let i=e.sandbox,c=t.sandbox;if(i||c){let a={...i,...c},l=i?.filesystem,m=c?.filesystem;(l||m)&&(a.filesystem={...l,...m,allowWrite:this.mergeStringArrays(l?.allowWrite,m?.allowWrite),denyWrite:this.mergeStringArrays(l?.denyWrite,m?.denyWrite),denyRead:this.mergeStringArrays(l?.denyRead,m?.denyRead),allowRead:this.mergeStringArrays(l?.allowRead,m?.allowRead)});let y=i?.network,_=c?.network;(y||_)&&(a.network={...y,..._,allowedDomains:this.mergeStringArrays(y?.allowedDomains,_?.allowedDomains),deniedDomains:this.mergeStringArrays(y?.deniedDomains,_?.deniedDomains),allowUnixSockets:this.mergeStringArrays(y?.allowUnixSockets,_?.allowUnixSockets)});let N=i?.ignoreViolations,P=c?.ignoreViolations;if(N||P){let S={};if(N)for(let[h,x]of Object.entries(N))S[h]=[...x];if(P)for(let[h,x]of Object.entries(P))S[h]?S[h]=this.mergeStringArrays(S[h],x)??[]:S[h]=[...x];a.ignoreViolations=S}r.sandbox=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,D)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,D)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let n={...this.loadSettings(),[e]:t};this.saveProjectSettings(n)}resetSetting(e){let o={...this.loadSettings()};delete o[e],this.saveProjectSettings(o)}getAllSettings(){return this.loadSettings()}},O=H.getInstance(),te=O.getAllSettings();function W(){let s=O.getUserSettingsPath(),e=O.getProjectSettingsPath();Z(s,(t,o)=>{t==="change"&&(te=null,M("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{f("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>W(),100)}),Z(e,(t,o)=>{t==="change"&&(te=null,M("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",o))}).on("error",t=>{f("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>W(),100)})}W();import Ce from"os";import Le from"path";import E from"fs";var De={sources:{},routing:{}};function oe(){let s=Ce.homedir();return Le.join(s,p,"config.json")}function ne(){try{let s=oe();if(!E.existsSync(s))return De;let e=E.readFileSync(s,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:Ne(t)}catch(s){throw B(s),s}}function Ne(s){let e={},t={};for(let[o,n]of Object.entries(s))if(n?.enable===!0&&n?.env){let r=n.env,i=o;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 se(s){if(s.length===0)throw new Error("No items to select from");if(s.length===1)return s[0];let e=s.reduce((o,n)=>o+(n.weight??100),0),t=Math.random()*e;for(let o of s){let n=o.weight??100;if(t-=n,t<=0)return o}return s[s.length-1]}var $=class{config;constructor(){try{this.config=ne()}catch(e){console.log(e)}}reload(){this.config=ne()}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=se(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=se(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()}getAvailableModels(){let e=[];for(let[t,o]of Object.entries(this.config.sources||{}))for(let n of o.models||[])e.push(`${t}__${n}`);return e}saveConfig(){try{let e=oe(),t={};if(E.existsSync(e)){let n=E.readFileSync(e,"utf-8");t=JSON.parse(n)}let o={...t,sources:this.config.sources,routing:this.config.routing};E.writeFileSync(e,JSON.stringify(o,null,2))}catch(e){B(e)}}},w=new $;import Pe from"os";function ve(){return T.join(Pe.homedir(),p,"config.json")}function Re(){try{w.reload()}catch(n){return console.error(`\u914D\u7F6E\u6587\u4EF6\u9519\u8BEF: ${n instanceof Error?n.message:String(n)}`),console.error(`\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84: ${ve()}`),!1}let s=w.hasModelRouting(),e=w.hasSmallFastModelRouting();if(!s&&!e)return!1;let t=w.getConfig(),o=t.routing||{};for(let[n,r]of Object.entries(o))for(let i of r)if(!t.sources[i.source])return console.error(`\u914D\u7F6E\u9519\u8BEF: routing.${n} \u4E2D\u5F15\u7528\u7684 source "${i.source}" \u5728 sources \u4E2D\u4E0D\u5B58\u5728`),!1;return!0}function Ue(){if(J(),!Re()){process.exit(0);return}(async()=>{let s=O.getSetting("env")||{},e=ie(import.meta.url),t=T.dirname(e),o=T.join(t,"cli.js"),n=re(process.execPath,["--no-deprecation",o,...process.argv.slice(2)],{env:{...process.env,...s},stdio:"inherit",cwd:process.cwd()});n.on("error",r=>{console.error("Failed to start command:",r.message),process.exit(1)}),n.on("close",r=>{process.exit(r||0)})})()}async function Ie(){let s=ie(import.meta.url),e=T.dirname(s),t=T.join(e,"cli.js"),o=re(process.execPath,["--no-deprecation",t,...process.argv.slice(2)],{env:process.env,stdio:"inherit",cwd:process.cwd()});o.on("error",n=>{console.error("Failed to start command:",n.message),process.exit(1)}),o.on("close",n=>{process.exit(n||0)})}async function je(){process.argv.length<=2?Ue():await Ie()}await je();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dahawa/hawa-code",
3
- "version": "1.37.4",
3
+ "version": "1.38.1",
4
4
  "bin": {
5
5
  "hcode": "hawa.js"
6
6
  },