@dahawa/hawa-code 1.41.0 → 1.41.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/cli.js +589 -589
- package/hands.js +491 -491
- package/hawa.js +3 -3
- package/package.json +1 -1
- package/webServer/app.js +54 -54
- package/webServer/style.css +227 -0
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
|
|
11
|
-
${
|
|
12
|
-
`;X(s)?ye(s,n,"utf8"):he(s,n,"utf8")}var ht=5*1024*1024,yt=1024*1024,_t=Buffer.from('"compact_boundary"');var D=class s{static getTools=e=>[];static getMCPCommands=()=>[];static getMcpServer=e=>{};static getClients=async()=>[];static reloadClients=async()=>[];static reconnect=async(e,t,o)=>{};static registerIDEClient=(e,t)=>{};static cache=[];static add(e){s.cache.push(e)}static clear(){s.cache.forEach(e=>{e.cache.clear?.()})}};var v={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:!0,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},w=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 Le().lazyTool===!0}static isPowerShellToolEnable(){return I()}static isMemoEnable(){let e=process.env.HAWA_CODE_MEMO;return e==="true"||e==="1"}static isMessageArchivingEnable(){let e=process.env.HAWA_CODE_MESSAGE_ARCHIVING;return e==="true"||e==="1"}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),N(e)||P(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),N(t)||P(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 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))b(`\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,v),b(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return ne(ke(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return ne(e,".hcode","settings.json")}ensureDirExists(e){let t=Ce(e);N(t)||xe(t,{recursive:!0})}loadSettingsFromFile(e){if(!N(e))return{};let t="";try{return t=Ae(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?P(e,"{}","utf-8"):P(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={...v,...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,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,E=c?.network;(O||E)&&(a.network={...O,...E,allowedDomains:this.mergeStringArrays(O?.allowedDomains,E?.allowedDomains),deniedDomains:this.mergeStringArrays(O?.deniedDomains,E?.deniedDomains),allowUnixSockets:this.mergeStringArrays(O?.allowUnixSockets,E?.allowUnixSockets)});let R=i?.ignoreViolations,U=c?.ignoreViolations;if(R||U){let y={};if(R)for(let[_,k]of Object.entries(R))y[_]=[...k];if(U)for(let[_,k]of Object.entries(U))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,v)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,v)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let n={...this.loadSettings(),[e]:t};this.saveProjectSettings(n),g=n}resetSetting(e){let o={...this.loadSettings()};delete o[e],this.saveProjectSettings(o),g=o}getAllSettings(){return this.loadSettings()}},M=w.getInstance(),g=M.getAllSettings(),Le=function(){return w.test?w.testSettings:(g||(g=M.getAllSettings(),D.clear(),g.env&&Object.keys(g.env).length>0&&(Object.entries(g.env).forEach(([s,e])=>{let t;typeof e=="string"?t=e:t=String(e),t.length>0&&(process.env[s]=t)}),b(`\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D ${Object.keys(g.env).length} \u4E2A\u73AF\u5883\u53D8\u91CF`,g.env))),g)};function G(){let s=M.getUserSettingsPath(),e=M.getProjectSettingsPath();te(s,(t,o)=>{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(()=>G(),100)}),te(e,(t,o)=>{t==="change"&&(g=null,S.emit("webserver:settings_changed",{scope:"project"}),b("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",o))}).on("error",t=>{m("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>G(),100)})}G();import De from"os";import Ne from"path";import A from"fs";var Pe={sources:{},routing:{}};function re(){let s=De.homedir();return Ne.join(s,d,"config.json")}function se(){try{let s=re();if(!A.existsSync(s))return Pe;let e=A.readFileSync(s,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:ve(t)}catch(s){throw $(s),s}}function ve(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 oe(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 z=class{config;constructor(){try{this.config=se()}catch(e){console.log(e)}}reload(){this.config=se()}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()}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=re(),t={};if(A.existsSync(e)){let n=A.readFileSync(e,"utf-8");t=JSON.parse(n)}let o={...t,sources:this.config.sources,routing:this.config.routing};A.writeFileSync(e,JSON.stringify(o,null,2))}catch(e){$(e)}}},x=new z;import Re from"os";function Ue(){return C.join(Re.homedir(),d,"config.json")}function Ie(){try{x.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: ${Ue()}`),!1}let s=x.hasModelRouting(),e=x.hasSmallFastModelRouting();if(!s&&!e)return!1;let t=x.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 je(){if(K(),!Ie()){process.exit(0);return}(async()=>{let s=M.getSetting("env")||{},e=ae(import.meta.url),t=C.dirname(e),o=C.join(t,"cli.js"),n=ie(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 Fe(){let s=ae(import.meta.url),e=C.dirname(s),t=C.join(e,"cli.js"),o=ie(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 He(){process.argv.length<=2?je():await Fe()}await He();
|
|
10
|
+
import le from"os";import V from"path";import j from"fs";var J="hcode",d=".hcode";var ie="HAWA_CODE_GIT_BASH_PATH";var ae="Bash",ce="PowerShell";var He=I()?ce:ae;function I(){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])}var ue={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 ge(){let o=le.homedir();return V.join(o,d,"config.json")}function K(){let o=ge();j.existsSync(o)||(j.mkdirSync(V.dirname(o),{recursive:!0}),j.writeFileSync(o,JSON.stringify(ue,null,2)))}import{spawn as oe}from"child_process";import C from"path";import{fileURLToPath as re}from"url";import{existsSync as N,readFileSync as Te,writeFileSync as P,mkdirSync as we,watch as te}from"fs";import{join as ne,dirname as xe}from"path";import{homedir as Ae}from"os";import{existsSync as X,mkdirSync as de}from"fs";import{dirname as fe,join as u}from"path";import{writeFileSync as me,readFileSync as ct,appendFileSync as Se}from"fs";import{randomUUID as he}from"crypto";import{homedir as ye}from"os";import*as q from"os";import{randomUUID as pe}from"crypto";var F=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 F;var L=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={}}},T=class extends L{startTime;constructor(e=null){super(),this.startTime=e}},Q=pe(),H=class extends L{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 Q}switchSessionId(e){Q=e}},B=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 T(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 T(-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 T,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 B;var mt=he(),p=u(ye(),d);function f(o){return o.replace(/[^a-zA-Z0-9]/g,"-")}function _e(){return Y.getSessionContext().getSessionId()||W}var Z={temp:()=>u(q.tmpdir(),`${J}`),plan:()=>u(p,"plan"),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",_e(),"session-summary")};function be(o){return o.toISOString().replace(/[:.]/g,"-")}var W=be(new Date);function Me(){return u(Z.log(),W+".log")}function Oe(){return u(Z.log(),"error-"+W+".log")}function ee(o,e,...t){let n=t.map(s=>s instanceof Error?`${s.name}: ${s.message}
|
|
11
|
+
${s.stack.replace(/^/gm," ")}`:s);Ee(e,{level:o,message:n.length==1?n[0]:n})}function b(...o){ee("info",Me(),...o)}function m(...o){ee("error",Oe(),...o)}function $(...o){m(...o)}function Ee(o,e){let t=fe(o);X(t)||de(t,{recursive:!0});let s=(typeof e=="string"?e:JSON.stringify(e))+`
|
|
12
|
+
`;X(o)?Se(o,s,"utf8"):me(o,s,"utf8")}var St=5*1024*1024,ht=1024*1024,yt=Buffer.from('"compact_boundary"');var D=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 v={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:!0,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},w=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 Ce().lazyTool===!0}static isPowerShellToolEnable(){return I()}static isMemoEnable(){let e=process.env.HAWA_CODE_MEMO;return e==="true"||e==="1"}static isMessageArchivingEnable(){let e=process.env.HAWA_CODE_MESSAGE_ARCHIVING;return e==="true"||e==="1"}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),N(e)||P(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),N(t)||P(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,v),b(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return ne(Ae(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return ne(e,".hcode","settings.json")}ensureDirExists(e){let t=xe(e);N(t)||we(t,{recursive:!0})}loadSettingsFromFile(e){if(!N(e))return{};let t="";try{return t=Te(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?P(e,"{}","utf-8"):P(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={...v,...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,E=c?.network;(O||E)&&(a.network={...O,...E,allowedDomains:this.mergeStringArrays(O?.allowedDomains,E?.allowedDomains),deniedDomains:this.mergeStringArrays(O?.deniedDomains,E?.deniedDomains),allowUnixSockets:this.mergeStringArrays(O?.allowUnixSockets,E?.allowUnixSockets)});let R=i?.ignoreViolations,U=c?.ignoreViolations;if(R||U){let y={};if(R)for(let[_,k]of Object.entries(R))y[_]=[...k];if(U)for(let[_,k]of Object.entries(U))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,v)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,v)}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=w.getInstance(),g=M.getAllSettings(),Ce=function(){return w.test?w.testSettings:(g||(g=M.getAllSettings(),D.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 G(){let o=M.getUserSettingsPath(),e=M.getProjectSettingsPath();te(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(()=>G(),100)}),te(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(()=>G(),100)})}G();import ke from"os";import Le from"path";import x from"fs";var De={sources:{},routing:{}};function Ne(){let o=ke.homedir();return Le.join(o,d,"config.json")}function Pe(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 se(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 z=class{config;configPath;constructor(e){this.configPath=e||Ne();try{this.config=this.loadModelConfig()}catch(t){console.log(t)}}reload(){this.config=this.loadModelConfig()}loadModelConfig(){try{if(!x.existsSync(this.configPath))return De;let e=x.readFileSync(this.configPath,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:Pe(t)}catch(e){throw $(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=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()}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(x.existsSync(this.configPath)){let n=x.readFileSync(this.configPath,"utf-8");e=JSON.parse(n)}let t={...e,sources:this.config.sources,routing:this.config.routing};x.writeFileSync(this.configPath,JSON.stringify(t,null,2))}catch(e){$(e)}}},A=new z;import ve from"os";function Re(){return C.join(ve.homedir(),d,"config.json")}function Ue(){try{A.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: ${Re()}`),!1}let o=A.hasModelRouting(),e=A.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=A.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 Ie(){if(K(),!Ue()){process.exit(0);return}(async()=>{let o=M.getSetting("env")||{},e=re(import.meta.url),t=C.dirname(e),n=C.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 je(){let o=re(import.meta.url),e=C.dirname(o),t=C.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 Fe(){process.argv.length<=2?Ie():await je()}await Fe();
|