@dahawa/hawa-code 1.38.12 → 1.39.0
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 +939 -872
- package/hands.js +648 -581
- package/hawa.js +3 -3
- package/package.json +1 -1
- package/webServer/app.js +60 -60
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
|
-
${n.stack.replace(/^/gm," ")}`:n);we(e,{level:
|
|
12
|
-
`;Q(o)?he(o,n,"utf8"):Se(o,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},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 process.env.HAWA_CODE_LAZY_TOOL==="true"||process.env.HAWA_CODE_LAZY_TOOL==="1"}static isPowerShellToolEnable(){return R()}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 o.instance||(o.instance=new o),o.instance}addProjectAllowedTools(e){let t=this.loadSettingsFromFile(this.getProjectSettingsPath()),s=t.permissions||{allow:[],deny:[]};if(s.allow||(s.allow=[]),s.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{s.allow.push(e),s.allow.sort();let n={...t,permissions:{...s}};this.saveSettingsToFile(this.getProjectSettingsPath(),n,D),M(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return te(ke(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return te(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(s){return console.error(`Error reading settings file ${e} => ${t} `,s),{}}}saveSettingsToFile(e,t,s){let n={...t};for(let[r,i]of Object.entries(t))if(r in s)if(typeof i=="object"&&typeof s[r]=="object"){if(JSON.stringify(i)===JSON.stringify(s[r]))delete n[r];else if(r==="permissions"&&i&&typeof i=="object"){let c=s.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===s[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 s=[...e||[]];return(t||[]).forEach(n=>{s.includes(n)||s.push(n)}),s}loadSettings(){let e=this.loadSettingsFromFile(this.getUserSettingsPath()),t=this.loadSettingsFromFile(this.getProjectSettingsPath()),s={...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};s&&Object.keys(s).length>0&&(r.env=s),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 P=i?.ignoreViolations,v=c?.ignoreViolations;if(P||v){let S={};if(P)for(let[h,x]of Object.entries(P))S[h]=[...x];if(v)for(let[h,x]of Object.entries(v))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),N=n}resetSetting(e){let s={...this.loadSettings()};delete s[e],this.saveProjectSettings(s),N=s}getAllSettings(){return this.loadSettings()}},O=W.getInstance(),N=O.getAllSettings();function $(){let o=O.getUserSettingsPath(),e=O.getProjectSettingsPath();ee(o,(t,s)=>{t==="change"&&(N=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(()=>$(),100)}),ee(e,(t,s)=>{t==="change"&&(N=null,M("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",s))}).on("error",t=>{f("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>$(),100)})}$();import Ce from"os";import Le from"path";import E from"fs";var De={sources:{},routing:{}};function oe(){let o=Ce.homedir();return Le.join(o,p,"config.json")}function ne(){try{let o=oe();if(!E.existsSync(o))return De;let e=E.readFileSync(o,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:Ne(t)}catch(o){throw H(o),o}}function Ne(o){let e={},t={};for(let[s,n]of Object.entries(o))if(n?.enable===!0&&n?.env){let r=n.env,i=s;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((s,n)=>s+(n.weight??100),0),t=Math.random()*e;for(let s of o){let n=s.weight??100;if(t-=n,t<=0)return s}return o[o.length-1]}var G=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,s]of Object.entries(this.config.sources||{}))for(let n of s.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 s={...t,sources:this.config.sources,routing:this.config.routing};E.writeFileSync(e,JSON.stringify(s,null,2))}catch(e){H(e)}}},w=new G;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 o=w.hasModelRouting(),e=w.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=w.getConfig(),s=t.routing||{};for(let[n,r]of Object.entries(s))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(K(),!Re()){process.exit(0);return}(async()=>{let o=O.getSetting("env")||{},e=ie(import.meta.url),t=T.dirname(e),s=T.join(t,"cli.js"),n=re(process.execPath,["--no-deprecation",s,...process.argv.slice(2)],{env:{...process.env,...o},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 o=ie(import.meta.url),e=T.dirname(o),t=T.join(e,"cli.js"),s=re(process.execPath,["--no-deprecation",t,...process.argv.slice(2)],{env:process.env,stdio:"inherit",cwd:process.cwd()});s.on("error",n=>{console.error("Failed to start command:",n.message),process.exit(1)}),s.on("close",n=>{process.exit(n||0)})}async function je(){process.argv.length<=2?Ue():await Ie()}await je();
|
|
10
|
+
import ge from"os";import V from"path";import j from"fs";var J="hcode",d=".hcode";var ce="HAWA_CODE_GIT_BASH_PATH";var le="Bash",ue="PowerShell";var Be=I()?ue:le;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[ce])}var pe={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 de(){let s=ge.homedir();return V.join(s,d,"config.json")}function K(){let s=de();j.existsSync(s)||(j.mkdirSync(V.dirname(s),{recursive:!0}),j.writeFileSync(s,JSON.stringify(pe,null,2)))}import{spawn as ie}from"child_process";import x from"path";import{fileURLToPath as ae}from"url";import{existsSync as N,readFileSync as Ae,writeFileSync as P,mkdirSync as xe,watch as te}from"fs";import{join as ne,dirname as Ce}from"path";import{homedir as ke}from"os";import{existsSync as X,mkdirSync as me}from"fs";import{dirname as Se,join as u}from"path";import{writeFileSync as he,readFileSync as lt,appendFileSync as ye}from"fs";import{randomUUID as _e}from"crypto";import{homedir as be}from"os";import*as q from"os";import{randomUUID as fe}from"crypto";var F=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=>{m(`Async error in listener for "${e}"`,c)})}catch(i){m(`Error in listener for "${e}"`,i)}}}},k=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={}}},E=class extends L{startTime;constructor(e=null){super(),this.startTime=e}},Q=fe(),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 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 Q}switchSessionId(e){Q=e}},B=class s{static sessionContext={};static inQueryContextHolder={};static queryContext={};onQueryStart(e="defalt",t){e||(e="defalt");let o=s.inQueryContextHolder[e+""];o&&o.startTime&&o.startTime>0||(s.inQueryContextHolder[e+""]=new E(Date.now()),k.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"),s.inQueryContextHolder[e+""]=new E(-1),t||(s.queryContext[e+""]={}),k.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 H,s.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=s.inQueryContextHolder[e+""];return t||(t=new E,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}},Y=new B;var St=_e(),p=u(be(),d);function f(s){return s.replace(/[^a-zA-Z0-9]/g,"-")}function Me(){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:s=>u(p,"projects",f(process.cwd()),`mcp-logs-${s}`),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",Me(),"session-summary")};function Oe(s){return s.toISOString().replace(/[:.]/g,"-")}var W=Oe(new Date);function Ee(){return u(Z.log(),W+".log")}function Te(){return u(Z.log(),"error-"+W+".log")}function ee(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 _(...s){ee("info",Ee(),...s)}function m(...s){ee("error",Te(),...s)}function $(...s){m(...s)}function we(s,e){let t=Se(s);X(t)||me(t,{recursive:!0});let n=(typeof e=="string"?e:JSON.stringify(e))+`
|
|
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},T=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))_(`\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),_(`\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,S=c?.filesystem;(l||S)&&(a.filesystem={...l,...S,allowWrite:this.mergeStringArrays(l?.allowWrite,S?.allowWrite),denyWrite:this.mergeStringArrays(l?.denyWrite,S?.denyWrite),denyRead:this.mergeStringArrays(l?.denyRead,S?.denyRead),allowRead:this.mergeStringArrays(l?.allowRead,S?.allowRead)});let M=i?.network,O=c?.network;(M||O)&&(a.network={...M,...O,allowedDomains:this.mergeStringArrays(M?.allowedDomains,O?.allowedDomains),deniedDomains:this.mergeStringArrays(M?.deniedDomains,O?.deniedDomains),allowUnixSockets:this.mergeStringArrays(M?.allowUnixSockets,O?.allowUnixSockets)});let R=i?.ignoreViolations,U=c?.ignoreViolations;if(R||U){let h={};if(R)for(let[y,C]of Object.entries(R))h[y]=[...C];if(U)for(let[y,C]of Object.entries(U))h[y]?h[y]=this.mergeStringArrays(h[y],C)??[]:h[y]=[...C];a.ignoreViolations=h}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()}},b=T.getInstance(),g=b.getAllSettings(),Le=function(){return T.test?T.testSettings:(g||(g=b.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)}),_(`\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=b.getUserSettingsPath(),e=b.getProjectSettingsPath();te(s,(t,o)=>{t==="change"&&(g=null,_("\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,_("\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 w 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(!w.existsSync(s))return Pe;let e=w.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(w.existsSync(e)){let n=w.readFileSync(e,"utf-8");t=JSON.parse(n)}let o={...t,sources:this.config.sources,routing:this.config.routing};w.writeFileSync(e,JSON.stringify(o,null,2))}catch(e){$(e)}}},A=new z;import Re from"os";function Ue(){return x.join(Re.homedir(),d,"config.json")}function Ie(){try{A.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=A.hasModelRouting(),e=A.hasSmallFastModelRouting();if(!s&&!e)return!1;let t=A.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=b.getSetting("env")||{},e=ae(import.meta.url),t=x.dirname(e),o=x.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=x.dirname(s),t=x.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();
|