@dahawa/hawa-code 2.7.6 → 2.7.8
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 +722 -702
- package/hands.js +674 -654
- package/hawa.js +2 -2
- package/package.json +1 -1
- package/webServer/app.js +1 -1
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{spawn as ie}from"child_process";import
|
|
10
|
+
import{spawn as ie}from"child_process";import D from"path";import{fileURLToPath as ae}from"url";import{existsSync as U,readFileSync as we,writeFileSync as I,mkdirSync as Ee,watch as ne}from"fs";import{join as se,dirname as Oe}from"path";import{homedir as Ae}from"os";import{existsSync as q,mkdirSync as pe}from"fs";import{dirname as de,join as g}from"path";import{writeFileSync as fe,readFileSync as Ze,appendFileSync as me}from"fs";import{randomUUID as he}from"crypto";import{homedir as Se}from"os";var Y="hcode",x=".hcode";var ce="HAWA_CODE_GIT_BASH_PATH";var le="Bash",ue="PowerShell";var Ue=H()?ue:le;function H(){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])}import*as Z from"os";import{randomUUID as ge}from"crypto";var W=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,l=!0;n!==void 0&&(l=r.thisRef?.deref()===n),i&&l&&(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(l=>{y(`Async error in listener for "${e}"`,l)})}catch(i){y(`Error in listener for "${e}"`,i)}}}},b=new W;var N=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={}}},P=class extends N{startTime;constructor(e=null){super(),this.startTime=e}},K=ge(),$=class extends N{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 K}switchSessionId(e){K=e}},z=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 P(Date.now()),b.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 P(-1),t||(o.queryContext[e+""]={}),b.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 $,o.sessionContext[e+""]=t),t}getInQueryContext(e="defalt"){e||(e="defalt");let t=o.inQueryContextHolder[e+""];return t||(t=new P,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 z;var at=he(),m=g(Se(),x);function h(o){return o.replace(/[^a-zA-Z0-9]/g,"-")}function ye(){return X.getSessionContext().getSessionId()||G}function be(){try{let o=d().planDirectory;if(o)return o}catch{}return g(m,"plan")}var ee={temp:()=>g(Z.tmpdir(),`${Y}`),plan:()=>be(),memory:()=>g(m,"projects",h(process.cwd()),"memory"),apis:()=>g(m,"projects",h(process.cwd()),"apis"),errors:()=>g(m,"projects",h(process.cwd()),"errors"),messages:()=>g(m,"projects",h(process.cwd()),"messages"),mcpLogs:o=>g(m,"projects",h(process.cwd()),`mcp-logs-${o}`),log:()=>g(m,"projects",h(process.cwd()),"log"),vcrFixtures:()=>g(m,"projects",h(process.cwd()),"vcr-fixtures"),sessionSummary:()=>g(m,"projects",h(process.cwd()),"messages",ye(),"session-summary")};function _e(o){return o.toISOString().replace(/[:.]/g,"-")}var G=_e(new Date);function Me(){return g(ee.log(),G+".log")}function Te(){return g(ee.log(),"error-"+G+".log")}function te(o,e,...t){let n=t.map(s=>s instanceof Error?`${s.name}: ${s.message}
|
|
11
11
|
${s.stack.replace(/^/gm," ")}`:s);xe(e,{level:o,message:n.length==1?n[0]:n})}function w(...o){te("info",Me(),...o)}function y(...o){te("error",Te(),...o)}function v(...o){y(...o)}function xe(o,e){let t=de(o);q(t)||pe(t,{recursive:!0});let s=(typeof e=="string"?e:JSON.stringify(e))+`
|
|
12
|
-
`;q(o)?me(o,s,"utf8"):fe(o,s,"utf8")}var ct=5*1024*1024,lt=1024*1024,ut=Buffer.from('"compact_boundary"');var R=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 j={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:"proxy",memo:!1,headlessBrowser:!1,showWindowTokens:!1,messageArchiving:!1,archiveToolUseInputs:!1,autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},autoMemory:{enabled:!1,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!1,minHours:24,minSessions:5},proxy:!1,agentDepth:1,codemodeMethodsMax:20,codemodeSession:!1,plugins:{pluginClaudeCompat:!0}},L=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 getLazyToolMode(){let t=m().lazyTool;return t==="proxy"||t==="loading"||t==="off"?t:"proxy"}static isLazyToolEnable(){return o.getLazyToolMode()==="loading"}static isProxyToolEnable(){return o.getLazyToolMode()==="proxy"}static isLazyOrProxyEnable(){return o.getLazyToolMode()!=="off"}static isPowerShellToolEnable(){return H()}static isMemoEnable(){return m().memo===!0}static isHeadlessBrowserEnable(){return m().headlessBrowser===!0}static isMessageArchivingEnable(){return m().messageArchiving===!0}static isArchiveToolUseInputsEnable(){return m().archiveToolUseInputs===!0}static getCodemodeMethodsMax(){let e=m().codemodeMethodsMax;return typeof e!="number"||Number.isNaN(e)?20:Math.min(100,Math.max(1,Math.floor(e)))}static isCodemodeSessionEnable(){return m().codemodeSession===!0}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),U(e)||I(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),U(t)||I(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))w(`\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,j),w(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return se(Ae(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return se(e,".hcode","settings.json")}ensureDirExists(e){let t=Ee(e);U(t)||Oe(t,{recursive:!0})}loadSettingsFromFile(e){if(!U(e))return{};let t="";try{return t=we(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 l=n.permissions||{},c=i;Array.isArray(c.allow)&&Array.isArray(l.allow)&&JSON.stringify(c.allow)===JSON.stringify(l.allow)&&delete c.allow,Array.isArray(c.deny)&&Array.isArray(l.deny)&&JSON.stringify(c.deny)===JSON.stringify(l.deny)&&delete c.deny,Object.keys(c).length===0&&delete s[r]}}else i===n[r]&&delete s[r];this.ensureDirExists(e),Object.keys(s).length===0?I(e,"{}","utf-8"):I(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(u=>{a.includes(u)||a.push(u)}),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(u=>{a.includes(u)||a.push(u)}),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(u=>{a.includes(u)||a.push(u)}),s.ask=a}else t.permissions?.ask&&(s.ask=[...t.permissions.ask]);let r={...j,...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,l=t.sandbox;if(i||l){let a={...i,...l},u=i?.filesystem,_=l?.filesystem;(u||_)&&(a.filesystem={...u,..._,allowWrite:this.mergeStringArrays(u?.allowWrite,_?.allowWrite),denyWrite:this.mergeStringArrays(u?.denyWrite,_?.denyWrite),denyRead:this.mergeStringArrays(u?.denyRead,_?.denyRead),allowRead:this.mergeStringArrays(u?.allowRead,_?.allowRead)});let A=i?.network,C=l?.network;(A||C)&&(a.network={...A,...C,allowedDomains:this.mergeStringArrays(A?.allowedDomains,C?.allowedDomains),deniedDomains:this.mergeStringArrays(A?.deniedDomains,C?.deniedDomains),allowUnixSockets:this.mergeStringArrays(A?.allowUnixSockets,C?.allowUnixSockets)});let F=i?.ignoreViolations,B=l?.ignoreViolations;if(F||B){let M={};if(F)for(let[T,D]of Object.entries(F))M[T]=[...D];if(B)for(let[T,D]of Object.entries(B))M[T]?M[T]=this.mergeStringArrays(M[T],D)??[]:M[T]=[...D];a.ignoreViolations=M}r.sandbox=a}let c=e.plugins,d=t.plugins;if(c||d){let a={...c,...d};(c?.enabledPlugins||d?.enabledPlugins)&&(a.enabledPlugins=this.mergeStringArrays(c?.enabledPlugins,d?.enabledPlugins)),(c?.disabledPlugins||d?.disabledPlugins)&&(a.disabledPlugins=this.mergeStringArrays(c?.disabledPlugins,d?.disabledPlugins)),(c?.pluginMarketplaceAllowlist||d?.pluginMarketplaceAllowlist)&&(a.pluginMarketplaceAllowlist=this.mergeStringArrays(c?.pluginMarketplaceAllowlist,d?.pluginMarketplaceAllowlist)),(c?.pluginConfigs||d?.pluginConfigs)&&(a.pluginConfigs={...c?.pluginConfigs,...d?.pluginConfigs}),r.plugins=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,j)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,j)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let s={...this.loadSettings(),[e]:t};this.saveProjectSettings(s),p=s}resetSetting(e){let n={...this.loadSettings()};delete n[e],this.saveProjectSettings(n),p=n}getAllSettings(){return this.loadSettings()}},O=L.getInstance(),p=O.getAllSettings(),m=function(){return L.test?L.testSettings:(p||(p=O.getAllSettings(),R.clear(),p.env&&Object.keys(p.env).length>0&&(Object.entries(p.env).forEach(([o,e])=>{let t;typeof e=="string"?t=e:t=String(e),t.length>0&&(process.env[o]=t)}),w(`\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D ${Object.keys(p.env).length} \u4E2A\u73AF\u5883\u53D8\u91CF`,p.env))),p)};function J(){let o=O.getUserSettingsPath(),e=O.getProjectSettingsPath();ne(o,(t,n)=>{t==="change"&&(p=null,b.emit("webserver:settings_changed",{scope:"user"}),w("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{y("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>J(),100)}).unref(),ne(e,(t,n)=>{t==="change"&&(p=null,b.emit("webserver:settings_changed",{scope:"project"}),w("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",n))}).on("error",t=>{y("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>J(),100)}).unref()}J();import Ce from"os";import re from"path";import h from"fs";var Q={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 Pe(){let o=Ce.homedir();return re.join(o,x,"config.json")}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 V=class{config;configPath;constructor(e){this.configPath=e||Pe();try{this.config=this.loadModelConfig()}catch(t){console.log(t)}}initConfig(){if(!h.existsSync(this.configPath))try{let e=re.dirname(this.configPath);h.mkdirSync(e,{recursive:!0}),h.writeFileSync(this.configPath,JSON.stringify(Q,null,2))}catch(e){v(e)}}reload(){this.config=this.loadModelConfig()}loadModelConfig(){try{if(!h.existsSync(this.configPath))return Q;let e=h.readFileSync(this.configPath,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:Q}catch(e){throw v(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(h.existsSync(this.configPath)){let n=h.readFileSync(this.configPath,"utf-8");e=JSON.parse(n)}let t={...e,sources:this.config.sources,routing:this.config.routing};h.writeFileSync(this.configPath,JSON.stringify(t,null,2))}catch(e){v(e)}}},E=new V;import Le from"os";function ke(){return k.join(Le.homedir(),x,"config.json")}function De(){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: ${ke()}`),!1}let o=E.hasModelRouting(),e=E.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=E.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 Ne(){if(E.initConfig(),!De()){process.exit(0);return}(async()=>{let o=O.getSetting("env")||{},e=ae(import.meta.url),t=k.dirname(e),n=k.join(t,"cli.js"),s=ie(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 ve(){let o=ae(import.meta.url),e=k.dirname(o),t=k.join(e,"cli.js"),n=ie(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 Re(){process.argv.length<=2?Ne():await ve()}await Re();
|
|
12
|
+
`;q(o)?me(o,s,"utf8"):fe(o,s,"utf8")}var ct=5*1024*1024,lt=1024*1024,ut=Buffer.from('"compact_boundary"');var R=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 j={env:{},permissions:{allow:[],deny:[],ask:[]},enableAllProjectMcpServers:!1,enabledMcpjsonServers:[],autoCompactEnabled:!0,language:"auto",thinking:"medium",disableSuggestion:!1,lazyTool:"proxy",memo:!1,headlessBrowser:!1,headlessBrowserDebug:!1,showWindowTokens:!1,messageArchiving:!1,archiveToolUseInputs:!1,archiveThinking:!1,autoMode:{enabled:!0,model:"",maxConsecutiveDenials:3,maxTotalDenials:20},autoMemory:{enabled:!1,minTokens:3e3,minTurns:3,teamMemoryEnabled:!1},autoDream:{enabled:!1,minHours:24,minSessions:5},proxy:!1,agentDepth:1,codemodeMethodsMax:20,codemodeSession:!1,plugins:{pluginClaudeCompat:!0}},k=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 getLazyToolMode(){let t=d().lazyTool;return t==="proxy"||t==="loading"||t==="off"?t:"proxy"}static isLazyToolEnable(){return o.getLazyToolMode()==="loading"}static isProxyToolEnable(){return o.getLazyToolMode()==="proxy"}static isLazyOrProxyEnable(){return o.getLazyToolMode()!=="off"}static isPowerShellToolEnable(){return H()}static isMemoEnable(){return d().memo===!0}static isHeadlessBrowserEnable(){return d().headlessBrowser===!0}static isHeadlessBrowserDebug(){let e=process.env.HAWA_CODE_HEADLESS_BROWSER_DEBUG;return e==="true"||e==="1"?!0:d().headlessBrowserDebug===!0}static isMessageArchivingEnable(){return d().messageArchiving===!0}static isArchiveToolUseInputsEnable(){return d().archiveToolUseInputs===!0}static isArchiveThinkingEnable(){return d().archiveThinking===!0}static getCodemodeMethodsMax(){let e=d().codemodeMethodsMax;return typeof e!="number"||Number.isNaN(e)?20:Math.min(100,Math.max(1,Math.floor(e)))}static isCodemodeSessionEnable(){return d().codemodeSession===!0}constructor(){this.initializeConfigDirectories()}initializeConfigDirectories(){let e=this.getUserSettingsPath(),t=this.getProjectSettingsPath();this.ensureDirExists(e),U(e)||I(e,JSON.stringify(this.getDefaultSettingsStructure(),null,2),"utf-8"),this.ensureDirExists(t),U(t)||I(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))w(`\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,j),w(`\u5DF2\u5C06\u5DE5\u5177 '${e}' \u6DFB\u52A0\u5230\u9879\u76EE\u5141\u8BB8\u5217\u8868`)}}getUserSettingsPath(){return se(Ae(),".hcode","settings.json")}getProjectSettingsPath(){let e=process.cwd();return se(e,".hcode","settings.json")}ensureDirExists(e){let t=Oe(e);U(t)||Ee(t,{recursive:!0})}loadSettingsFromFile(e){if(!U(e))return{};let t="";try{return t=we(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 l=n.permissions||{},c=i;Array.isArray(c.allow)&&Array.isArray(l.allow)&&JSON.stringify(c.allow)===JSON.stringify(l.allow)&&delete c.allow,Array.isArray(c.deny)&&Array.isArray(l.deny)&&JSON.stringify(c.deny)===JSON.stringify(l.deny)&&delete c.deny,Object.keys(c).length===0&&delete s[r]}}else i===n[r]&&delete s[r];this.ensureDirExists(e),Object.keys(s).length===0?I(e,"{}","utf-8"):I(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(u=>{a.includes(u)||a.push(u)}),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(u=>{a.includes(u)||a.push(u)}),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(u=>{a.includes(u)||a.push(u)}),s.ask=a}else t.permissions?.ask&&(s.ask=[...t.permissions.ask]);let r={...j,...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,l=t.sandbox;if(i||l){let a={...i,...l},u=i?.filesystem,_=l?.filesystem;(u||_)&&(a.filesystem={...u,..._,allowWrite:this.mergeStringArrays(u?.allowWrite,_?.allowWrite),denyWrite:this.mergeStringArrays(u?.denyWrite,_?.denyWrite),denyRead:this.mergeStringArrays(u?.denyRead,_?.denyRead),allowRead:this.mergeStringArrays(u?.allowRead,_?.allowRead)});let A=i?.network,C=l?.network;(A||C)&&(a.network={...A,...C,allowedDomains:this.mergeStringArrays(A?.allowedDomains,C?.allowedDomains),deniedDomains:this.mergeStringArrays(A?.deniedDomains,C?.deniedDomains),allowUnixSockets:this.mergeStringArrays(A?.allowUnixSockets,C?.allowUnixSockets)});let B=i?.ignoreViolations,F=l?.ignoreViolations;if(B||F){let M={};if(B)for(let[T,L]of Object.entries(B))M[T]=[...L];if(F)for(let[T,L]of Object.entries(F))M[T]?M[T]=this.mergeStringArrays(M[T],L)??[]:M[T]=[...L];a.ignoreViolations=M}r.sandbox=a}let c=e.plugins,f=t.plugins;if(c||f){let a={...c,...f};(c?.enabledPlugins||f?.enabledPlugins)&&(a.enabledPlugins=this.mergeStringArrays(c?.enabledPlugins,f?.enabledPlugins)),(c?.disabledPlugins||f?.disabledPlugins)&&(a.disabledPlugins=this.mergeStringArrays(c?.disabledPlugins,f?.disabledPlugins)),(c?.pluginMarketplaceAllowlist||f?.pluginMarketplaceAllowlist)&&(a.pluginMarketplaceAllowlist=this.mergeStringArrays(c?.pluginMarketplaceAllowlist,f?.pluginMarketplaceAllowlist)),(c?.pluginConfigs||f?.pluginConfigs)&&(a.pluginConfigs={...c?.pluginConfigs,...f?.pluginConfigs}),r.plugins=a}return r}saveUserSettings(e){let t=this.getUserSettingsPath();this.saveSettingsToFile(t,e,j)}saveProjectSettings(e){let t=this.getProjectSettingsPath();this.saveSettingsToFile(t,e,j)}getSetting(e){return this.loadSettings()[e]}updateSetting(e,t){let s={...this.loadSettings(),[e]:t};this.saveProjectSettings(s),p=s}resetSetting(e){let n={...this.loadSettings()};delete n[e],this.saveProjectSettings(n),p=n}getAllSettings(){return this.loadSettings()}},E=k.getInstance(),p=E.getAllSettings(),d=function(){return k.test?k.testSettings:(p||(p=E.getAllSettings(),R.clear(),p.env&&Object.keys(p.env).length>0&&(Object.entries(p.env).forEach(([o,e])=>{let t;typeof e=="string"?t=e:t=String(e),t.length>0&&(process.env[o]=t)}),w(`\u5DF2\u4ECE\u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D ${Object.keys(p.env).length} \u4E2A\u73AF\u5883\u53D8\u91CF`,p.env))),p)};function J(){let o=E.getUserSettingsPath(),e=E.getProjectSettingsPath();ne(o,(t,n)=>{t==="change"&&(p=null,b.emit("webserver:settings_changed",{scope:"user"}),w("\u7528\u6237\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D"))}).on("error",t=>{y("\u7528\u6237\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>J(),100)}).unref(),ne(e,(t,n)=>{t==="change"&&(p=null,b.emit("webserver:settings_changed",{scope:"project"}),w("\u9879\u76EE\u7EA7\u914D\u7F6E\u5DF2\u70ED\u52A0\u8F7D",n))}).on("error",t=>{y("\u9879\u76EE\u7EA7\u914D\u7F6E\u76D1\u63A7\u51FA\u9519:",t),setTimeout(()=>J(),100)}).unref()}J();import Ce from"os";import re from"path";import S from"fs";var V={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 Pe(){let o=Ce.homedir();return re.join(o,x,"config.json")}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 Q=class{config;configPath;constructor(e){this.configPath=e||Pe();try{this.config=this.loadModelConfig()}catch(t){console.log(t)}}initConfig(){if(!S.existsSync(this.configPath))try{let e=re.dirname(this.configPath);S.mkdirSync(e,{recursive:!0}),S.writeFileSync(this.configPath,JSON.stringify(V,null,2))}catch(e){v(e)}}reload(){this.config=this.loadModelConfig()}loadModelConfig(){try{if(!S.existsSync(this.configPath))return V;let e=S.readFileSync(this.configPath,"utf-8"),t=JSON.parse(e);return t.sources&&t.routing?t:V}catch(e){throw v(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(S.existsSync(this.configPath)){let n=S.readFileSync(this.configPath,"utf-8");e=JSON.parse(n)}let t={...e,sources:this.config.sources,routing:this.config.routing};S.writeFileSync(this.configPath,JSON.stringify(t,null,2))}catch(e){v(e)}}},O=new Q;import ke from"os";function De(){return D.join(ke.homedir(),x,"config.json")}function Le(){try{O.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=O.hasModelRouting(),e=O.hasSmallFastModelRouting();if(!o&&!e)return!1;let t=O.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 Ne(){if(O.initConfig(),!Le()){process.exit(0);return}(async()=>{let o=E.getSetting("env")||{},e=ae(import.meta.url),t=D.dirname(e),n=D.join(t,"cli.js"),s=ie(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 ve(){let o=ae(import.meta.url),e=D.dirname(o),t=D.join(e,"cli.js"),n=ie(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 Re(){process.argv.length<=2?Ne():await ve()}await Re();
|
package/package.json
CHANGED
package/webServer/app.js
CHANGED
|
@@ -95,7 +95,7 @@ Please report this to https://github.com/markedjs/marked.`,e){let l="<p>An error
|
|
|
95
95
|
`):JSON.stringify(t):e.is_error?"[Error]":"[Empty result]"}function pT(e){if(!e)return"";let t=typeof e=="string"?e:JSON.stringify(e,null,2);return t.length>800?t.substring(0,800)+"...":t}function Uy({rawMessages:e,autoScroll:t,userType:n,pendingUserResponses:l,sendUserResponse:a}){let s=(0,dl.useRef)(null),o=(0,dl.useRef)(!1),u=(0,dl.useMemo)(()=>zy(e,{userType:n}),[e,n]);(0,dl.useEffect)(()=>{t&&s.current&&!o.current&&(s.current.scrollTop=s.current.scrollHeight)},[u,t]);let r=()=>{if(!s.current)return;let{scrollTop:d,scrollHeight:c,clientHeight:p}=s.current,f=c-d-p<50;o.current=!f};return u.length===0?(0,i.jsx)("div",{className:"message-list",children:(0,i.jsx)("div",{className:"empty-state",children:"Waiting for messages..."})}):(0,i.jsx)("div",{className:"message-list",ref:s,onScroll:r,children:u.map(d=>(0,i.jsx)(xy,{message:d,pendingUserResponses:l,sendUserResponse:a},d.id))})}var Bn=Q(Z(),1);function Dy({activeAgent:e,isLoading:t=!1,promptStatus:n,onSubmit:l,onInterrupt:a}){let[s,o]=(0,Bn.useState)(""),u=(0,Bn.useRef)(null),r=e==="main",d=r&&s.trim()!=="",c=r&&t,p=(0,Bn.useCallback)(()=>{let b=u.current;if(!b)return;b.style.height="auto";let N=parseFloat(getComputedStyle(b).minHeight)||0;b.style.height=`${Math.min(Math.max(b.scrollHeight,N),200)}px`},[]);(0,Bn.useEffect)(()=>{p()},[s,p]);let f=b=>{b.key==="Enter"&&!b.shiftKey&&!b.nativeEvent.isComposing&&(b.preventDefault(),d&&(l(s),o("")))},m=()=>{d&&(l(s),o(""))},y=s.startsWith("!")?"bash":s.startsWith("/")?"command":"text";return(0,i.jsx)("div",{className:"prompt-input-bar",children:(0,i.jsxs)("div",{className:"prompt-input-inner",children:[(0,i.jsx)("span",{className:`prompt-input-mode ${y}`,children:y==="bash"?"!":y==="command"?"/":null}),(0,i.jsx)("textarea",{ref:u,className:"prompt-input-field",value:s,onChange:b=>o(b.target.value),onKeyDown:f,placeholder:r?t?"Agent is busy; your prompt will be queued...":"Type a prompt and press Enter...":"Switch to Main agent to type a prompt",disabled:!r,rows:3}),c?(0,i.jsx)("button",{className:"prompt-input-interrupt",onClick:a,type:"button",title:"Interrupt",children:(0,i.jsx)("span",{className:"interrupt-icon"})}):(0,i.jsx)("button",{className:"prompt-input-send",onClick:m,disabled:!d,type:"button",title:"Send",children:(0,i.jsx)("span",{className:"send-icon"})})]})})}var qt=Q(Z(),1);var ct=Q(Z(),1);function Ly(){let[e,t]=(0,ct.useState)(null),[n,l]=(0,ct.useState)(null),[a,s]=(0,ct.useState)(null),[o,u]=(0,ct.useState)(!0),[r,d]=(0,ct.useState)(null),c=(0,ct.useCallback)(async()=>{try{let[y,b,N]=await Promise.all([fetch("/api/settings"),fetch("/api/settings/sources"),fetch("/api/model-config")]);if(!y.ok)throw new Error(`Failed to load settings: ${y.status}`);if(!b.ok)throw new Error(`Failed to load settings sources: ${b.status}`);if(!N.ok)throw new Error(`Failed to load model config: ${N.status}`);let g=await y.json(),h=await b.json(),v=await N.json();t(g),l({user:h.user||{},project:h.project||{}}),s(v),d(null)}catch(y){d(y instanceof Error?y.message:"Failed to load settings")}finally{u(!1)}},[]);(0,ct.useEffect)(()=>{c();let y=()=>{c()};return window.addEventListener("settings:changed",y),()=>{window.removeEventListener("settings:changed",y)}},[c]);let p=(0,ct.useCallback)(async(y,b,N)=>{let g=await fetch(`/api/settings/${y}/${b}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({value:N})});if(!g.ok){let h=await g.json().catch(()=>({error:"Update failed"}));throw new Error(h.error||"Update failed")}await c()},[c]),f=(0,ct.useCallback)(async(y,b)=>{let N=await fetch(`/api/settings/${y}/${b}`,{method:"DELETE"});if(!N.ok){let g=await N.json().catch(()=>({error:"Reset failed"}));throw new Error(g.error||"Reset failed")}await c()},[c]),m=(0,ct.useCallback)(async y=>{let b=await fetch("/api/model-config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(y)});if(!b.ok){let N=await b.json().catch(()=>({error:"Update model config failed",details:[]})),g=[N.error,...N.details||[]].filter(Boolean).join(`
|
|
96
96
|
`);throw new Error(g||"Update model config failed")}await c()},[c]);return{settings:e,sources:n,modelConfig:a,loading:o,error:r,updateSetting:p,resetSetting:f,updateModelConfig:m,refresh:c}}var $y=Q(Z(),1);function To({label:e,value:t,onChange:n}){return(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-label",children:e}),(0,i.jsx)("button",{className:`setting-toggle ${t?"on":"off"}`,onClick:()=>n(!t),children:t?"On":"Off"})]})}function Qc({label:e,value:t,options:n,onChange:l}){return(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-label",children:e}),(0,i.jsx)("select",{className:"setting-select",value:t,onChange:a=>l(a.target.value),children:n.map(a=>(0,i.jsx)("option",{value:a,children:a},a))})]})}function Eo({label:e,value:t,onChange:n,placeholder:l}){return(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-label",children:e}),(0,i.jsx)("input",{className:"setting-input",type:"text",value:t,placeholder:l,onChange:a=>n(a.target.value)})]})}function _o({label:e,value:t,onChange:n,min:l,max:a}){return(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-label",children:e}),(0,i.jsx)("input",{className:"setting-input",type:"number",value:t,min:l,max:a,onChange:s=>n(parseInt(s.target.value,10)||0)})]})}function pl({label:e,value:t,fields:n,onChange:l}){let a=t||{},s=(o,u)=>{l({...a,[o]:u})};return(0,i.jsxs)("div",{className:"setting-object",children:[(0,i.jsx)("h4",{className:"setting-object-title",children:e}),(0,i.jsx)("div",{className:"setting-object-fields",children:n.map(o=>{let u=a[o.key];switch(o.type){case"boolean":return(0,i.jsx)(To,{label:o.label,value:!!u,onChange:r=>s(o.key,r)},o.key);case"number":return(0,i.jsx)(_o,{label:o.label,value:typeof u=="number"?u:0,min:o.min,max:o.max,onChange:r=>s(o.key,r)},o.key);case"string":return(0,i.jsx)(Eo,{label:o.label,value:typeof u=="string"?u:"",placeholder:o.placeholder,onChange:r=>s(o.key,r)},o.key);default:return null}})})]})}var Ss=Q(Z(),1);function By(e){return JSON.stringify(e??{},null,2)}function Ro({label:e,value:t,onChange:n,rows:l=8,className:a}){let[s,o]=(0,Ss.useState)(()=>By(t)),[u,r]=(0,Ss.useState)(null);(0,Ss.useEffect)(()=>{o(By(t)),r(null)},[t]);let d=()=>{try{let c=JSON.parse(s);r(null),n(c)}catch(c){r(c instanceof Error?c.message:"Invalid JSON")}};return(0,i.jsxs)("div",{className:`setting-json-editor ${a||""}`,children:[(0,i.jsx)("label",{className:"setting-json-label",children:e}),(0,i.jsx)("textarea",{className:"setting-json-textarea",value:s,onChange:c=>o(c.target.value),onBlur:d,rows:l,spellCheck:!1}),u&&(0,i.jsx)("div",{className:"setting-json-error",children:u})]})}var ko=Q(Z(),1);function Hy(e){return Object.entries(e??{}).map(([t,n])=>({key:t,value:String(n??"")}))}function qy(e){let t={};for(let n of e){let l=n.key.trim();l&&(t[l]=n.value)}return t}function mT(e,t){let n=Object.keys(e),l=Object.keys(t);return n.length!==l.length?!1:n.every(a=>e[a]===t[a])}function Gy({label:e,value:t,onChange:n}){let[l,a]=(0,ko.useState)(()=>Hy(t));(0,ko.useEffect)(()=>{a(Hy(t))},[t]);let s=qy(l),o=p=>{let f=qy(p);mT(s,f)||n(f),a(p)},u=(p,f)=>{let m=l.map((y,b)=>b===p?{...y,key:f}:y);o(m)},r=(p,f)=>{let m=l.map((y,b)=>b===p?{...y,value:f}:y);o(m)},d=()=>{a([...l,{key:"",value:""}])},c=p=>{let f=l.filter((m,y)=>y!==p);o(f)};return(0,i.jsxs)("div",{className:"setting-key-value",children:[(0,i.jsx)("h4",{className:"setting-key-value-title",children:e}),(0,i.jsx)("div",{className:"setting-key-value-list",children:l.map((p,f)=>(0,i.jsxs)("div",{className:"setting-key-value-row",children:[(0,i.jsx)("input",{className:"setting-input setting-key-value-key",type:"text",value:p.key,placeholder:"KEY",onChange:m=>u(f,m.target.value)}),(0,i.jsx)("span",{className:"setting-key-value-separator",children:"="}),(0,i.jsx)("input",{className:"setting-input setting-key-value-value",type:"text",value:p.value,placeholder:"value",onChange:m=>r(f,m.target.value)}),(0,i.jsx)("button",{className:"setting-key-value-remove",onClick:()=>c(f),title:"Remove",children:"\xD7"})]},f))}),(0,i.jsx)("button",{className:"setting-key-value-add",onClick:d,children:"+ Add"})]})}var gl=Q(Z(),1);function Hn(e){return JSON.parse(JSON.stringify(e))}function Yy(e){return!e||typeof e!="object"||Array.isArray(e)?{sources:{},routing:{}}:{sources:typeof e.sources=="object"&&!Array.isArray(e.sources)?e.sources:{},routing:typeof e.routing=="object"&&!Array.isArray(e.routing)?e.routing:{}}}function Qy(e){return Array.isArray(e)?e.join(", "):""}function gT(e){return e.split(",").map(t=>t.trim()).filter(Boolean)}var hT=["anthropic","openai","openai-responses","gemini"];function ml({label:e,children:t}){return(0,i.jsxs)("div",{className:"model-config-field",children:[(0,i.jsx)("label",{className:"model-config-field-label",children:e}),(0,i.jsx)("div",{className:"model-config-field-input",children:t})]})}function jy({label:e,value:t,onChange:n,placeholder:l}){return(0,i.jsx)(ml,{label:e,children:(0,i.jsx)("input",{className:"model-config-input",type:"text",value:t,placeholder:l,onChange:a=>n(a.target.value)})})}function vT({sourceName:e,existingNames:t,onRename:n}){let[l,a]=(0,gl.useState)(e);return(0,gl.useEffect)(()=>{a(e)},[e]),(0,i.jsx)(ml,{label:"Source Name",children:(0,i.jsx)("input",{className:"model-config-input",type:"text",value:l,onChange:s=>a(s.target.value),onBlur:()=>{let s=l.trim();if(!s||s===e||t.includes(s)){a(e);return}n(s)},onKeyDown:s=>{s.key==="Enter"&&s.target.blur()}})})}function yT({models:e,onChange:t}){let[n,l]=(0,gl.useState)(Qy(e));return(0,gl.useEffect)(()=>{l(Qy(e))},[e]),(0,i.jsx)(ml,{label:"Models (comma separated)",children:(0,i.jsx)("input",{className:"model-config-input",type:"text",value:n,placeholder:"model-a, model-b",onChange:a=>l(a.target.value),onBlur:a=>t(gT(a.target.value))})})}function bT({label:e,value:t,onChange:n,min:l}){return(0,i.jsx)(ml,{label:e,children:(0,i.jsx)("input",{className:"model-config-input",type:"number",value:t,min:l,onChange:a=>n(parseInt(a.target.value,10)||0)})})}function Zy({value:e,onChange:t}){let[n,l]=(0,gl.useState)("form"),a=Yy(e),s=(f,m,y)=>{let b=Hn(a);b.sources[f]||(b.sources[f]={base_url:"",auth_token:"",api_type:"anthropic",models:[]}),b.sources[f][m]=y,t(b)},o=()=>{let f=Hn(a),m=1;for(;f.sources[`source${m}`];)m++;f.sources[`source${m}`]={base_url:"",auth_token:"",api_type:"anthropic",models:[]},t(f)},u=f=>{let m=Hn(a);delete m.sources[f];for(let y of Object.keys(m.routing)){let b=y;m.routing[b]=(m.routing[b]||[]).filter(N=>N.source!==f)}t(m)},r=(f,m,y,b)=>{let N=Hn(a);N.routing[f]||(N.routing[f]=[]);let g=N.routing[f];g[m]||(g[m]={source:"",model:""}),g[m][y]=b,t(N)},d=f=>{let m=Hn(a);m.routing[f]||(m.routing[f]=[]),m.routing[f].push({source:"",model:"",weight:100}),t(m)},c=(f,m)=>{let y=Hn(a);y.routing[f]&&y.routing[f].splice(m,1),t(y)};return(0,i.jsxs)("div",{className:"model-config-setting",children:[(0,i.jsxs)("div",{className:"model-config-tabs",children:[(0,i.jsx)("button",{className:`model-config-tab ${n==="form"?"active":""}`,onClick:()=>l("form"),children:"Form"}),(0,i.jsx)("button",{className:`model-config-tab ${n==="json"?"active":""}`,onClick:()=>l("json"),children:"JSON"})]}),n==="form"?(0,i.jsxs)("div",{className:"model-config-form",children:[(0,i.jsxs)("div",{className:"model-config-section",children:[(0,i.jsx)("h4",{className:"model-config-section-title",children:"Sources"}),Object.keys(a.sources).length===0&&(0,i.jsx)("div",{className:"model-config-empty",children:"No sources configured"}),Object.entries(a.sources).map(([f,m])=>(0,i.jsxs)("div",{className:"model-config-card",children:[(0,i.jsxs)("div",{className:"model-config-card-header",children:[(0,i.jsx)(vT,{sourceName:f,existingNames:Object.keys(a.sources),onRename:y=>{let b=Hn(a);b.sources[y]=b.sources[f],delete b.sources[f];for(let N of Object.keys(b.routing)){let g=N;b.routing[g]=(b.routing[g]||[]).map(h=>h.source===f?{...h,source:y}:h)}t(b)}}),(0,i.jsx)("button",{className:"model-config-remove-button",onClick:()=>u(f),children:"Remove"})]}),(0,i.jsx)(jy,{label:"Base URL",value:m.base_url||"",onChange:y=>s(f,"base_url",y),placeholder:"https://api.example.com"}),(0,i.jsx)(jy,{label:"Auth Token",value:m.auth_token||"",onChange:y=>s(f,"auth_token",y),placeholder:"sk-..."}),(0,i.jsx)(ml,{label:"API Type",children:(0,i.jsx)("select",{className:"model-config-select",value:m.api_type||"anthropic",onChange:y=>s(f,"api_type",y.target.value),children:hT.map(y=>(0,i.jsx)("option",{value:y,children:y},y))})}),(0,i.jsx)(yT,{models:m.models,onChange:y=>s(f,"models",y)})]},f)),(0,i.jsx)("button",{className:"model-config-add-button",onClick:o,children:"Add Source"})]}),(0,i.jsxs)("div",{className:"model-config-section",children:[(0,i.jsx)("h4",{className:"model-config-section-title",children:"Routing"}),["MODEL","SMALL_FAST_MODEL"].map(f=>(0,i.jsxs)("div",{className:"model-config-routing-group",children:[(0,i.jsx)("h5",{className:"model-config-routing-type",children:f}),(a.routing[f]||[]).length===0&&(0,i.jsx)("div",{className:"model-config-empty",children:"No routing items"}),(a.routing[f]||[]).map((m,y)=>(0,i.jsx)("div",{className:"model-config-card",children:(0,i.jsxs)("div",{className:"model-config-card-row",children:[(0,i.jsx)(ml,{label:"Source",children:(0,i.jsxs)("select",{className:"model-config-select",value:m.source||"",onChange:b=>{let N=b.target.value,g=Hn(a);g.routing[f]||(g.routing[f]=[]);let h=g.routing[f];if(!h[y])h[y]={source:N,model:""};else{h[y].source=N;let v=g.sources[N]?.models||[];v.length>0&&!v.includes(h[y].model)?h[y].model=v[0]:v.length===0&&(h[y].model="")}t(g)},children:[(0,i.jsx)("option",{value:"",children:"Select source"}),Object.keys(a.sources).map(b=>(0,i.jsx)("option",{value:b,children:b},b))]})}),(0,i.jsx)(ml,{label:"Model",children:(0,i.jsxs)("select",{className:"model-config-select",value:m.model||"",onChange:b=>r(f,y,"model",b.target.value),disabled:!m.source||!a.sources[m.source]?.models?.length,children:[(0,i.jsx)("option",{value:"",children:m.source?a.sources[m.source]?.models?.length?"Select model":"No models available":"Select source first"}),(a.sources[m.source]?.models||[]).map(b=>(0,i.jsx)("option",{value:b,children:b},b))]})}),(0,i.jsx)(bT,{label:"Weight",value:typeof m.weight=="number"?m.weight:100,min:0,onChange:b=>r(f,y,"weight",b)}),(0,i.jsx)("button",{className:"model-config-remove-button",onClick:()=>c(f,y),children:"Remove"})]})},y)),(0,i.jsxs)("button",{className:"model-config-add-button",onClick:()=>d(f),children:["Add ",f," Route"]})]},f))]})]}):(0,i.jsx)("div",{className:"model-config-json-wrapper",children:(0,i.jsx)(Ro,{label:"Model Config (config.json)",value:a,onChange:f=>t(Yy(f)),className:"model-config-json-editor"})})]})}var Ns=Q(Z(),1);var Oe=Q(Z(),1);async function hl(e,t){let n=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),l=await n.json().catch(()=>({error:"Request failed"}));if(!n.ok)throw new Error(l.error||`Request failed: ${n.status}`);return l}async function ST(e){let t=await fetch(e,{method:"DELETE"}),n=await t.json().catch(()=>({error:"Request failed"}));if(!t.ok)throw new Error(n.error||`Request failed: ${t.status}`);return n}function Xy(){let[e,t]=(0,Oe.useState)([]),[n,l]=(0,Oe.useState)([]),[a,s]=(0,Oe.useState)([]),[o,u]=(0,Oe.useState)(!0),[r,d]=(0,Oe.useState)(null),c=(0,Oe.useCallback)(async()=>{try{u(!0);let[v,S,k]=await Promise.all([fetch("/api/marketplaces"),fetch("/api/plugins"),fetch("/api/plugins/available")]);if(!v.ok)throw new Error(`Failed to load marketplaces: ${v.status}`);if(!S.ok)throw new Error(`Failed to load plugins: ${S.status}`);if(!k.ok)throw new Error(`Failed to load available plugins: ${k.status}`);let z=await v.json(),R=await S.json(),C=await k.json();t(z.marketplaces||[]),l(R.plugins||[]),s(C.available||[]),d(null)}catch(v){d(v instanceof Error?v.message:"Failed to load plugins")}finally{u(!1)}},[]);(0,Oe.useEffect)(()=>{c()},[c]);let p=(0,Oe.useCallback)(async v=>{let S=await hl("/api/marketplaces",{source:v});return await c(),S.name},[c]),f=(0,Oe.useCallback)(async v=>{await ST(`/api/marketplaces/${encodeURIComponent(v)}`),await c()},[c]),m=(0,Oe.useCallback)(async v=>{let S=await hl(`/api/marketplaces/${encodeURIComponent(v)}/update`,{});return await c(),{updated:S.updated||[],errors:S.errors||[]}},[c]),y=(0,Oe.useCallback)(async v=>{let S=await hl("/api/plugins/install",{spec:v});return await c(),S.id},[c]),b=(0,Oe.useCallback)(async v=>{await hl("/api/plugins/uninstall",{spec:v}),await c()},[c]),N=(0,Oe.useCallback)(async v=>{let S=await hl("/api/plugins/update",{spec:v});return await c(),{updated:S.updated||[],errors:S.errors||[]}},[c]),g=(0,Oe.useCallback)(async v=>{await hl("/api/plugins/enable",{spec:v}),await c()},[c]),h=(0,Oe.useCallback)(async v=>{await hl("/api/plugins/disable",{spec:v}),await c()},[c]);return{marketplaces:e,plugins:n,available:a,loading:o,error:r,refresh:c,addMarketplace:p,removeMarketplace:f,updateMarketplace:m,installPlugin:y,uninstallPlugin:b,updatePlugin:N,enablePlugin:g,disablePlugin:h}}function Vy({value:e,onChange:t}){let{marketplaces:n,plugins:l,available:a,loading:s,error:o,addMarketplace:u,removeMarketplace:r,updateMarketplace:d,installPlugin:c,uninstallPlugin:p,updatePlugin:f,enablePlugin:m,disablePlugin:y}=Xy(),[b,N]=(0,Ns.useState)(""),[g,h]=(0,Ns.useState)(""),[v,S]=(0,Ns.useState)(null),[k,z]=(0,Ns.useState)(null),R=A=>{S(A),z(null)},C=A=>{z(A),S(null)},_=async()=>{if(b.trim())try{let A=await u(b.trim());N(""),C(A?`Added marketplace "${A}"`:"Marketplace added")}catch(A){R(A instanceof Error?A.message:"Failed to add marketplace")}},x=async A=>{try{await r(A),C(`Removed marketplace "${A}"`)}catch(T){R(T instanceof Error?T.message:"Failed to remove marketplace")}},L=async A=>{try{let T=await d(A);T.errors.length>0?R(T.errors.join(`
|
|
97
97
|
`)):C(`Updated marketplace "${A}"`)}catch(T){R(T instanceof Error?T.message:"Failed to update marketplace")}},q=async A=>{let T=A??g;if(T.trim())try{let w=await c(T.trim());A||h(""),C(w?`Installed plugin "${w}"`:"Plugin installed")}catch(w){R(w instanceof Error?w.message:"Failed to install plugin")}},O=async A=>{try{await p(A),C(`Uninstalled plugin "${A}"`)}catch(T){R(T instanceof Error?T.message:"Failed to uninstall plugin")}},D=async A=>{try{let T=await f(A);T.errors.length>0?R(T.errors.join(`
|
|
98
|
-
`)):C(`Updated ${T.updated.length} plugin(s)`)}catch(T){R(T instanceof Error?T.message:"Failed to update plugin")}};return(0,i.jsxs)("div",{className:"plugins-setting",children:[s&&(0,i.jsx)("div",{className:"setting-loading",children:"Loading plugins..."}),o&&(0,i.jsx)("div",{className:"setting-error",children:o}),v&&(0,i.jsx)("div",{className:"setting-error",children:v}),k&&(0,i.jsx)("div",{className:"setting-success",children:k}),(0,i.jsx)("div",{className:"plugins-section",children:(0,i.jsx)(pl,{label:"Plugin Settings",value:e||{},fields:[{key:"pluginClaudeCompat",label:"Claude Code plugin compatibility",type:"boolean"},{key:"pluginAutoUpdate",label:"Auto update plugins",type:"boolean"},{key:"pluginAutoUpdateInterval",label:"Auto update interval (minutes)",type:"number",min:1},{key:"pluginSandboxHooks",label:"Sandbox plugin hooks",type:"boolean"}],onChange:t})}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Marketplaces"}),(0,i.jsx)("div",{className:"plugin-input-row",children:(0,i.jsx)("input",{className:"setting-input plugin-input",type:"text",value:b,placeholder:"marketplace source (path, URL, or owner/repo)",onChange:A=>N(A.target.value),onKeyDown:A=>{A.key==="Enter"&&_()}})}),(0,i.jsx)("div",{className:"plugin-actions-row",children:(0,i.jsx)("button",{className:"setting-button-small",onClick:_,disabled:!b.trim(),children:"Add Marketplace"})}),(0,i.jsxs)("div",{className:"plugins-list",children:[n.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No marketplaces registered."}),n.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.name}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.type," \u2014 ",A.source]})]}),(0,i.jsxs)("div",{className:"plugin-actions",children:[(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>L(A.name),children:"Update"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>x(A.name),children:"Remove"})]})]},A.name))]})]}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Available Plugins"}),(0,i.jsxs)("div",{className:"plugins-list",children:[a.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No available plugins."}),a.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.plugin}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.marketplace," \u2014 ",A.description||"No description"]})]}),(0,i.jsx)("div",{className:"plugin-actions",children:(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>q(`${A.plugin}@${A.marketplace}`),children:"Install"})})]},`${A.plugin}@${A.marketplace}`))]})]}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Installed Plugins"}),(0,i.jsx)("div",{className:"plugin-input-row",children:(0,i.jsx)("input",{className:"setting-input plugin-input",type:"text",value:g,placeholder:"plugin[@marketplace]",onChange:A=>h(A.target.value),onKeyDown:A=>{A.key==="Enter"&&q()}})}),(0,i.jsxs)("div",{className:"plugin-actions-row",children:[(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>q(),disabled:!g.trim(),children:"Install"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>D(),children:"Update All"})]}),(0,i.jsxs)("div",{className:"plugins-list",children:[l.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No plugins installed."}),l.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.plugin}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.marketplace," \u2014 ",A.version," \u2014 ",A.enabled?"enabled":"disabled"]})]}),(0,i.jsxs)("div",{className:"plugin-actions",children:[A.enabled?(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>y(A.id),children:"Disable"}):(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>m(A.id),children:"Enable"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>D(A.id),children:"Update"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>O(A.id),children:"Uninstall"})]})]},A.id))]})]})]})}function Ky(e){return e===void 0?"undefined":e===null?"null":typeof e=="boolean"?e?"true":"false":typeof e=="string"?e:JSON.stringify(e,null,2)}function Jy({label:e,keys:t,settings:n,modelConfig:l,onUpdate:a,onModelConfigUpdate:s}){let[o,u]=(0,$y.useState)(new Set),r=c=>{u(p=>{let f=new Set(p);return f.has(c)?f.delete(c):f.add(c),f})},d=c=>{let p=n[c];switch(c){case"proxy":case"disableSuggestion":case"memo":case"messageArchiving":case"archiveToolUseInputs":return(0,i.jsx)(To,{label:c==="archiveToolUseInputs"?"Archive Tool Use Inputs":c,value:!!p,onChange:f=>a(c,f)});case"lazyTool":return(0,i.jsx)(Qc,{label:c,value:p==="off"||p==="loading"||p==="proxy"?p:p===!0?"loading":p===!1?"off":"loading",options:["off","loading","proxy"],onChange:f=>a(c,f)});case"plugins":return(0,i.jsx)(Vy,{value:p||{},onChange:f=>a(c,f)});case"thinking":return(0,i.jsx)(Qc,{label:c,value:p||"medium",options:["off","low","medium","high"],onChange:f=>a(c,f)});case"language":case"planDirectory":return(0,i.jsx)(Eo,{label:c,value:p||"",placeholder:c==="planDirectory"?"/path/to/plan/directory":"auto",onChange:f=>a(c,f)});case"agentDepth":return(0,i.jsx)(_o,{label:c,value:typeof p=="number"?p:1,min:1,max:5,onChange:f=>a(c,f)});case"webServer":return(0,i.jsx)(pl,{label:"Web Server",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"port",label:"Port",type:"number",min:1,max:65535},{key:"host",label:"Host",type:"string"}],onChange:f=>a(c,f)});case"autoMode":return(0,i.jsx)(pl,{label:"Auto Mode",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"model",label:"Model",type:"string"},{key:"maxConsecutiveDenials",label:"Max Consecutive Denials",type:"number",min:0},{key:"maxTotalDenials",label:"Max Total Denials",type:"number",min:0}],onChange:f=>a(c,f)});case"autoMemory":return(0,i.jsx)(pl,{label:"Auto Memory",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"minTokens",label:"Min Tokens",type:"number",min:0},{key:"minTurns",label:"Min Turns",type:"number",min:0},{key:"teamMemoryEnabled",label:"Team Memory Enabled",type:"boolean"}],onChange:f=>a(c,f)});case"autoDream":return(0,i.jsx)(pl,{label:"Auto Dream",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"minHours",label:"Min Hours",type:"number",min:0},{key:"minSessions",label:"Min Sessions",type:"number",min:0}],onChange:f=>a(c,f)});case"modelConfig":return(0,i.jsx)(Zy,{value:l||{sources:{},routing:{}},onChange:f=>s?.(f)});case"sandbox":case"sessionSummary":case"permissions":return(0,i.jsx)(Ro,{label:c,value:p,onChange:f=>a(c,f)});case"env":return(0,i.jsx)(Gy,{label:c,value:p||{},onChange:f=>a(c,f)});default:{let f=p!==null&&typeof p=="object",m=o.has(c);return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-key",children:c}),f?(0,i.jsx)("button",{className:"setting-expand-button",onClick:()=>r(c),children:m?"Collapse":"Expand"}):(0,i.jsx)("span",{className:"setting-value",children:Ky(p)})]}),f&&m&&(0,i.jsx)("pre",{className:"setting-json",children:Ky(p)})]})}}};return(0,i.jsxs)("div",{className:"setting-section",children:[(0,i.jsx)("h3",{className:"setting-section-title",children:e}),(0,i.jsx)("div",{className:"setting-list",children:t.map(c=>(0,i.jsx)("div",{className:"setting-item",children:d(c)},c))})]})}var Py=[{id:"general",label:"General",keys:["proxy","lazyTool","thinking","language","disableSuggestion","memo","messageArchiving","archiveToolUseInputs","planDirectory","agentDepth"]},{id:"plugins",label:"Plugins",keys:["plugins"]},{id:"webServer",label:"Web Server",keys:["webServer"]},{id:"auto",label:"Auto Mode",keys:["autoMode"]},{id:"memory",label:"Memory",keys:["autoMemory","autoDream"]},{id:"model",label:"Model Config",keys:["modelConfig"]},{id:"advanced",label:"Advanced",keys:["env","permissions","sandbox","sessionSummary"]}];function xo(e){return JSON.parse(JSON.stringify(e))}function jc(e,t){return e===t?!0:typeof e!=typeof t||e===null||t===null?!1:typeof e=="object"?JSON.stringify(e)===JSON.stringify(t):!1}function Wy(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);return Array.from(n).filter(l=>!jc(e[l],t[l]))}function Iy({onClose:e}){let{settings:t,modelConfig:n,loading:l,error:a,updateSetting:s,updateModelConfig:o,refresh:u}=Ly(),[r,d]=(0,qt.useState)("general"),[c,p]=(0,qt.useState)(null),[f,m]=(0,qt.useState)(null),[y,b]=(0,qt.useState)(!1),[N,g]=(0,qt.useState)(null),[h,v]=(0,qt.useState)(!1);(0,qt.useEffect)(()=>{t&&c===null&&p(xo(t))},[t,c]),(0,qt.useEffect)(()=>{n&&f===null&&m(xo(n))},[n,f]);let S=(q,O)=>{p(D=>D&&{...D,[q]:O}),v(!1)},k=q=>{m(q),v(!1)},z=async()=>{if(!t||!c)return;let q=Wy(t,c),O=n&&f&&!jc(n,f);if(!(q.length===0&&!O)){b(!0),g(null),v(!1);try{for(let D of q)await s("project",D,c[D]);O&&f&&await o(f),await u(),p(null),m(null),v(!0)}catch(D){g(D instanceof Error?D.message:"Save failed")}finally{b(!1)}}},R=()=>{t&&p(xo(t)),n&&m(xo(n)),g(null),v(!1)};if(l)return(0,i.jsx)("div",{className:"settings-panel",children:(0,i.jsx)("div",{className:"empty-state",children:"Loading settings..."})});if(a)return(0,i.jsx)("div",{className:"settings-panel",children:(0,i.jsxs)("div",{className:"settings-error",children:[(0,i.jsx)("div",{className:"settings-error-message",children:a}),(0,i.jsx)("button",{className:"settings-close-button",onClick:e,children:"Close"})]})});if(!t||!c||!n||!f)return null;let C=Py.find(q=>q.id===r),_=Wy(t,c),x=n&&f&&!jc(n,f),L=_.length>0||x;return(0,i.jsxs)("div",{className:"settings-panel",children:[(0,i.jsxs)("div",{className:"settings-header",children:[(0,i.jsx)("h2",{className:"settings-title",children:"Settings"}),(0,i.jsxs)("div",{className:"settings-header-actions",children:[L&&(0,i.jsx)("button",{className:"settings-reset-button",onClick:R,disabled:y,children:"Reset"}),(0,i.jsx)("button",{className:"settings-save-button",onClick:z,disabled:!L||y,children:y?"Saving...":"Save"}),(0,i.jsx)("button",{className:"settings-close-button",onClick:e,children:"Close"})]})]}),N&&(0,i.jsx)("div",{className:"settings-save-error",children:N.split(`
|
|
98
|
+
`)):C(`Updated ${T.updated.length} plugin(s)`)}catch(T){R(T instanceof Error?T.message:"Failed to update plugin")}};return(0,i.jsxs)("div",{className:"plugins-setting",children:[s&&(0,i.jsx)("div",{className:"setting-loading",children:"Loading plugins..."}),o&&(0,i.jsx)("div",{className:"setting-error",children:o}),v&&(0,i.jsx)("div",{className:"setting-error",children:v}),k&&(0,i.jsx)("div",{className:"setting-success",children:k}),(0,i.jsx)("div",{className:"plugins-section",children:(0,i.jsx)(pl,{label:"Plugin Settings",value:e||{},fields:[{key:"pluginClaudeCompat",label:"Claude Code plugin compatibility",type:"boolean"},{key:"pluginAutoUpdate",label:"Auto update plugins",type:"boolean"},{key:"pluginAutoUpdateInterval",label:"Auto update interval (minutes)",type:"number",min:1},{key:"pluginSandboxHooks",label:"Sandbox plugin hooks",type:"boolean"}],onChange:t})}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Marketplaces"}),(0,i.jsx)("div",{className:"plugin-input-row",children:(0,i.jsx)("input",{className:"setting-input plugin-input",type:"text",value:b,placeholder:"marketplace source (path, URL, or owner/repo)",onChange:A=>N(A.target.value),onKeyDown:A=>{A.key==="Enter"&&_()}})}),(0,i.jsx)("div",{className:"plugin-actions-row",children:(0,i.jsx)("button",{className:"setting-button-small",onClick:_,disabled:!b.trim(),children:"Add Marketplace"})}),(0,i.jsxs)("div",{className:"plugins-list",children:[n.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No marketplaces registered."}),n.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.name}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.type," \u2014 ",A.source]})]}),(0,i.jsxs)("div",{className:"plugin-actions",children:[(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>L(A.name),children:"Update"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>x(A.name),children:"Remove"})]})]},A.name))]})]}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Available Plugins"}),(0,i.jsxs)("div",{className:"plugins-list",children:[a.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No available plugins."}),a.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.plugin}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.marketplace," \u2014 ",A.description||"No description"]})]}),(0,i.jsx)("div",{className:"plugin-actions",children:(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>q(`${A.plugin}@${A.marketplace}`),children:"Install"})})]},`${A.plugin}@${A.marketplace}`))]})]}),(0,i.jsxs)("div",{className:"plugins-section",children:[(0,i.jsx)("h4",{className:"setting-section-subtitle",children:"Installed Plugins"}),(0,i.jsx)("div",{className:"plugin-input-row",children:(0,i.jsx)("input",{className:"setting-input plugin-input",type:"text",value:g,placeholder:"plugin[@marketplace]",onChange:A=>h(A.target.value),onKeyDown:A=>{A.key==="Enter"&&q()}})}),(0,i.jsxs)("div",{className:"plugin-actions-row",children:[(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>q(),disabled:!g.trim(),children:"Install"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>D(),children:"Update All"})]}),(0,i.jsxs)("div",{className:"plugins-list",children:[l.length===0&&!s&&(0,i.jsx)("div",{className:"setting-empty",children:"No plugins installed."}),l.map(A=>(0,i.jsxs)("div",{className:"plugin-row",children:[(0,i.jsxs)("div",{className:"plugin-info",children:[(0,i.jsx)("div",{className:"plugin-name",children:A.plugin}),(0,i.jsxs)("div",{className:"plugin-meta",children:[A.marketplace," \u2014 ",A.version," \u2014 ",A.enabled?"enabled":"disabled"]})]}),(0,i.jsxs)("div",{className:"plugin-actions",children:[A.enabled?(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>y(A.id),children:"Disable"}):(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>m(A.id),children:"Enable"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>D(A.id),children:"Update"}),(0,i.jsx)("button",{className:"setting-button-small",onClick:()=>O(A.id),children:"Uninstall"})]})]},A.id))]})]})]})}function Ky(e){return e===void 0?"undefined":e===null?"null":typeof e=="boolean"?e?"true":"false":typeof e=="string"?e:JSON.stringify(e,null,2)}function Jy({label:e,keys:t,settings:n,modelConfig:l,onUpdate:a,onModelConfigUpdate:s}){let[o,u]=(0,$y.useState)(new Set),r=c=>{u(p=>{let f=new Set(p);return f.has(c)?f.delete(c):f.add(c),f})},d=c=>{let p=n[c];switch(c){case"proxy":case"disableSuggestion":case"memo":case"messageArchiving":case"archiveToolUseInputs":case"archiveThinking":return(0,i.jsx)(To,{label:c==="archiveToolUseInputs"?"Archive Tool Use Inputs":c==="archiveThinking"?"Archive Thinking":c,value:!!p,onChange:f=>a(c,f)});case"lazyTool":return(0,i.jsx)(Qc,{label:c,value:p==="off"||p==="loading"||p==="proxy"?p:p===!0?"loading":p===!1?"off":"loading",options:["off","loading","proxy"],onChange:f=>a(c,f)});case"plugins":return(0,i.jsx)(Vy,{value:p||{},onChange:f=>a(c,f)});case"thinking":return(0,i.jsx)(Qc,{label:c,value:p||"medium",options:["off","low","medium","high"],onChange:f=>a(c,f)});case"language":case"planDirectory":return(0,i.jsx)(Eo,{label:c,value:p||"",placeholder:c==="planDirectory"?"/path/to/plan/directory":"auto",onChange:f=>a(c,f)});case"agentDepth":return(0,i.jsx)(_o,{label:c,value:typeof p=="number"?p:1,min:1,max:5,onChange:f=>a(c,f)});case"webServer":return(0,i.jsx)(pl,{label:"Web Server",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"port",label:"Port",type:"number",min:1,max:65535},{key:"host",label:"Host",type:"string"}],onChange:f=>a(c,f)});case"autoMode":return(0,i.jsx)(pl,{label:"Auto Mode",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"model",label:"Model",type:"string"},{key:"maxConsecutiveDenials",label:"Max Consecutive Denials",type:"number",min:0},{key:"maxTotalDenials",label:"Max Total Denials",type:"number",min:0}],onChange:f=>a(c,f)});case"autoMemory":return(0,i.jsx)(pl,{label:"Auto Memory",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"minTokens",label:"Min Tokens",type:"number",min:0},{key:"minTurns",label:"Min Turns",type:"number",min:0},{key:"teamMemoryEnabled",label:"Team Memory Enabled",type:"boolean"}],onChange:f=>a(c,f)});case"autoDream":return(0,i.jsx)(pl,{label:"Auto Dream",value:p||{},fields:[{key:"enabled",label:"Enabled",type:"boolean"},{key:"minHours",label:"Min Hours",type:"number",min:0},{key:"minSessions",label:"Min Sessions",type:"number",min:0}],onChange:f=>a(c,f)});case"modelConfig":return(0,i.jsx)(Zy,{value:l||{sources:{},routing:{}},onChange:f=>s?.(f)});case"sandbox":case"sessionSummary":case"permissions":return(0,i.jsx)(Ro,{label:c,value:p,onChange:f=>a(c,f)});case"env":return(0,i.jsx)(Gy,{label:c,value:p||{},onChange:f=>a(c,f)});default:{let f=p!==null&&typeof p=="object",m=o.has(c);return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"setting-row",children:[(0,i.jsx)("span",{className:"setting-key",children:c}),f?(0,i.jsx)("button",{className:"setting-expand-button",onClick:()=>r(c),children:m?"Collapse":"Expand"}):(0,i.jsx)("span",{className:"setting-value",children:Ky(p)})]}),f&&m&&(0,i.jsx)("pre",{className:"setting-json",children:Ky(p)})]})}}};return(0,i.jsxs)("div",{className:"setting-section",children:[(0,i.jsx)("h3",{className:"setting-section-title",children:e}),(0,i.jsx)("div",{className:"setting-list",children:t.map(c=>(0,i.jsx)("div",{className:"setting-item",children:d(c)},c))})]})}var Py=[{id:"general",label:"General",keys:["proxy","lazyTool","thinking","language","disableSuggestion","memo","messageArchiving","archiveToolUseInputs","archiveThinking","planDirectory","agentDepth"]},{id:"plugins",label:"Plugins",keys:["plugins"]},{id:"webServer",label:"Web Server",keys:["webServer"]},{id:"auto",label:"Auto Mode",keys:["autoMode"]},{id:"memory",label:"Memory",keys:["autoMemory","autoDream"]},{id:"model",label:"Model Config",keys:["modelConfig"]},{id:"advanced",label:"Advanced",keys:["env","permissions","sandbox","sessionSummary"]}];function xo(e){return JSON.parse(JSON.stringify(e))}function jc(e,t){return e===t?!0:typeof e!=typeof t||e===null||t===null?!1:typeof e=="object"?JSON.stringify(e)===JSON.stringify(t):!1}function Wy(e,t){let n=new Set([...Object.keys(e),...Object.keys(t)]);return Array.from(n).filter(l=>!jc(e[l],t[l]))}function Iy({onClose:e}){let{settings:t,modelConfig:n,loading:l,error:a,updateSetting:s,updateModelConfig:o,refresh:u}=Ly(),[r,d]=(0,qt.useState)("general"),[c,p]=(0,qt.useState)(null),[f,m]=(0,qt.useState)(null),[y,b]=(0,qt.useState)(!1),[N,g]=(0,qt.useState)(null),[h,v]=(0,qt.useState)(!1);(0,qt.useEffect)(()=>{t&&c===null&&p(xo(t))},[t,c]),(0,qt.useEffect)(()=>{n&&f===null&&m(xo(n))},[n,f]);let S=(q,O)=>{p(D=>D&&{...D,[q]:O}),v(!1)},k=q=>{m(q),v(!1)},z=async()=>{if(!t||!c)return;let q=Wy(t,c),O=n&&f&&!jc(n,f);if(!(q.length===0&&!O)){b(!0),g(null),v(!1);try{for(let D of q)await s("project",D,c[D]);O&&f&&await o(f),await u(),p(null),m(null),v(!0)}catch(D){g(D instanceof Error?D.message:"Save failed")}finally{b(!1)}}},R=()=>{t&&p(xo(t)),n&&m(xo(n)),g(null),v(!1)};if(l)return(0,i.jsx)("div",{className:"settings-panel",children:(0,i.jsx)("div",{className:"empty-state",children:"Loading settings..."})});if(a)return(0,i.jsx)("div",{className:"settings-panel",children:(0,i.jsxs)("div",{className:"settings-error",children:[(0,i.jsx)("div",{className:"settings-error-message",children:a}),(0,i.jsx)("button",{className:"settings-close-button",onClick:e,children:"Close"})]})});if(!t||!c||!n||!f)return null;let C=Py.find(q=>q.id===r),_=Wy(t,c),x=n&&f&&!jc(n,f),L=_.length>0||x;return(0,i.jsxs)("div",{className:"settings-panel",children:[(0,i.jsxs)("div",{className:"settings-header",children:[(0,i.jsx)("h2",{className:"settings-title",children:"Settings"}),(0,i.jsxs)("div",{className:"settings-header-actions",children:[L&&(0,i.jsx)("button",{className:"settings-reset-button",onClick:R,disabled:y,children:"Reset"}),(0,i.jsx)("button",{className:"settings-save-button",onClick:z,disabled:!L||y,children:y?"Saving...":"Save"}),(0,i.jsx)("button",{className:"settings-close-button",onClick:e,children:"Close"})]})]}),N&&(0,i.jsx)("div",{className:"settings-save-error",children:N.split(`
|
|
99
99
|
`).map((q,O)=>(0,i.jsx)("div",{children:q},O))}),h&&(0,i.jsx)("div",{className:"settings-save-success",children:"Settings saved successfully"}),(0,i.jsxs)("div",{className:"settings-layout",children:[(0,i.jsx)("div",{className:"settings-sidebar",children:Py.map(q=>(0,i.jsx)("button",{className:`settings-sidebar-item ${r===q.id?"active":""}`,onClick:()=>d(q.id),children:q.label},q.id))}),(0,i.jsx)("div",{className:"settings-content",children:(0,i.jsx)(Jy,{label:C.label,keys:C.keys,settings:c,modelConfig:f,onUpdate:S,onModelConfigUpdate:k})})]})]})}var fa=Q(Z(),1);var NT="Hawa Code";function Fy(){return typeof Notification>"u"?"unsupported":Notification.permission}function eb(e){return e>=70?"high":e>=30?"moderate":"low"}function TT(e){switch(e.toolName){case"Bash":return"Bash command";case"PowerShell":return"PowerShell command";case"Read":return"Read file";case"Write":return"Write file";case"Edit":return"Edit file";case"Glob":case"Grep":return"Read files";case"NotebookEdit":return"Edit notebook";case"Cwd":return"Current directory";default:return"Tool use"}}function Zc(e){switch(e){case"Read":case"Write":case"Edit":return"file_path";case"Glob":case"Grep":return"path";case"NotebookEdit":return"notebook_path";default:return null}}function ET(e){return Zc(e)!==null}function _T(e){let{toolName:t,input:n}=e;if(t==="Bash"||t==="PowerShell"){let a=n.command;if(typeof a=="string")return(0,i.jsx)("code",{className:"tool-confirm-command",children:a})}let l=Zc(t);if(l){let a=n[l];if(typeof a=="string")return(0,i.jsxs)("span",{className:"tool-confirm-call",children:[t,"(",(0,i.jsx)("span",{className:"tool-confirm-path",children:a}),")"]})}return(0,i.jsx)("pre",{className:"tool-confirm-input",children:JSON.stringify(n,null,2)})}function RT(e){let{toolName:t,input:n,commandPrefix:l,cwd:a,isReadOnly:s}=e,o=[{label:"Yes",decision:"allow"}],u="",r=!1;if(t==="Bash"||t==="PowerShell"){let d=typeof n.command=="string"?n.command:"",c=l||d;c&&(r=!0,u=`Yes, and don't ask again for ${c} commands in ${a}`)}else if(ET(t))if(t==="Read")r=!0,u="Yes, and don't ask again for file reads this session";else if(t==="Glob"||t==="Grep")r=!1;else{let d=Zc(t);(typeof n[d]=="string"?n[d]:"").startsWith(a)&&(r=!0,u="Yes, and don't ask again for file edits this session")}else s||(r=!0,u=`Yes, and don't ask again for ${t} commands in ${a}`);return r&&o.push({label:u,decision:"allow_permanent"}),o.push({label:`No, and tell ${NT} what to do differently (esc)`,decision:"reject"}),o}function tb({queue:e,onDecision:t}){let[n,l]=(0,fa.useState)(Fy),[a,s]=(0,fa.useState)(!1),[o,u]=(0,fa.useState)(null);(0,fa.useEffect)(()=>{let N=setInterval(()=>{l(Fy())},1e3);return()=>clearInterval(N)},[]);let r=async N=>{if(N.preventDefault(),N.stopPropagation(),console.log("[ToolConfirmQueue] Enable notifications clicked"),typeof Notification>"u"){console.warn("[ToolConfirmQueue] Notification API not available"),u("Notifications are not supported in this browser.");return}if(!window.isSecureContext){console.warn("[ToolConfirmQueue] Not a secure context"),u("Notifications require a secure context (HTTPS or localhost).");return}if(window.self!==window.top){console.warn("[ToolConfirmQueue] Running in iframe"),u("Please allow notifications in the top-level browser window.");return}s(!0),u(null);let g=5e3,h=new Promise((v,S)=>{setTimeout(()=>S(new Error("timeout")),g)});try{console.log("[ToolConfirmQueue] Requesting notification permission...");let v=await Promise.race([Notification.requestPermission(),h]);console.log("[ToolConfirmQueue] Notification permission result:",v),l(v),u(v==="granted"?"Notifications enabled.":v==="denied"?"Notifications blocked in browser settings.":"Permission prompt was dismissed. Check browser notification settings.")}catch(v){v instanceof Error&&v.message==="timeout"?(console.warn("[ToolConfirmQueue] Notification permission request timed out"),u("Browser did not respond. Please allow notifications manually in site settings.")):(console.error("[ToolConfirmQueue] Failed to request notification permission:",v),u(`Failed to request notifications: ${v instanceof Error?v.message:String(v)}`))}finally{s(!1)}};if(e.length===0)return null;let d=e[0],{toolUseID:c,description:p,hookWarning:f,riskScore:m}=d,y=TT(d),b=RT(d);return(0,i.jsx)("div",{className:"tool-confirm-overlay",children:(0,i.jsxs)("div",{className:"tool-confirm-card",children:[(0,i.jsxs)("div",{className:"tool-confirm-header",children:[(0,i.jsx)("h3",{className:"tool-confirm-title",children:y}),e.length>1&&(0,i.jsxs)("span",{className:"tool-confirm-queue-count",children:[e.length," pending"]})]}),(0,i.jsxs)("div",{className:"tool-confirm-body",children:[(0,i.jsx)("div",{className:"tool-confirm-section",children:_T(d)}),p&&(0,i.jsx)("div",{className:"tool-confirm-section",children:(0,i.jsx)("p",{className:"tool-confirm-description",children:p})}),f&&(0,i.jsx)("div",{className:"tool-confirm-warning",children:f}),m!=null&&(0,i.jsxs)("div",{className:`tool-confirm-risk tool-confirm-risk-${eb(m)}`,children:["Risk: ",eb(m)]}),(0,i.jsx)("div",{className:"tool-confirm-question",children:"Do you want to proceed?"})]}),(0,i.jsx)("div",{className:"tool-confirm-actions",children:b.map(N=>{let g="tool-confirm-btn";return N.decision==="allow"?g+=" tool-confirm-allow":N.decision==="allow_permanent"?g+=" tool-confirm-allow-permanent":N.decision==="reject"&&(g+=" tool-confirm-reject"),(0,i.jsx)("button",{className:g,onClick:()=>t(c,N.decision),children:N.label},N.decision)})}),n==="default"&&(0,i.jsxs)("div",{className:"tool-confirm-notification-banner",children:[(0,i.jsx)("span",{children:"You may miss confirmation alerts when the page is hidden. Enable background notifications."}),(0,i.jsx)("button",{type:"button",onClick:r,disabled:a,children:a?"Requesting\u2026":"Enable notifications"})]}),o&&(0,i.jsx)("div",{className:`tool-confirm-notification-banner ${n==="granted"?"tool-confirm-notification-granted":n==="denied"?"tool-confirm-notification-denied":"tool-confirm-notification-info"}`,children:(0,i.jsx)("span",{children:o})}),n==="denied"&&!o&&(0,i.jsx)("div",{className:"tool-confirm-notification-banner tool-confirm-notification-denied",children:(0,i.jsx)("span",{children:"Browser notifications are blocked. Please allow them in your browser settings."})})]})})}function nb(){let t=`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}/ws`,{rawMessages:n,agents:l,status:a,confirmQueue:s,sendConfirmResponse:o,sendPrompt:u,sendInterrupt:r,promptStatus:d,pendingUserResponses:c,sendUserResponse:p}=Yg(t),{userType:f}=Qg(),[m,y]=(0,qn.useState)("main"),[b,N]=(0,qn.useState)(!0),[g,h]=(0,qn.useState)(!1),[v,S]=(0,qn.useState)(()=>{try{return localStorage.getItem("hawa.sidebarCollapsed")==="true"}catch{return!1}});(0,qn.useEffect)(()=>{try{localStorage.setItem("hawa.sidebarCollapsed",String(v))}catch{}},[v]),(0,qn.useEffect)(()=>{l.length>0&&m&&!l.find(O=>O.id===m)&&y(l[0].id)},[l,m]);let k=n[m]||[],z=l.find(O=>O.id===m),R=m==="main"&&(z?.status==="running"||z?.status==="started"),C=l.filter(O=>O.status==="running"||O.status==="started"),_=m!=="main"&&z?.status==="ended",x=O=>{u(m,O)},L=()=>{r(m)},q=c.size>0;return(0,i.jsxs)("div",{className:"app",children:[(0,i.jsxs)("div",{className:`left-sidebar ${v?"collapsed":""}`,children:[(0,i.jsxs)("div",{className:"sidebar-header",children:[(0,i.jsx)("button",{className:"collapse-button",onClick:()=>S(!v),title:v?"Expand sidebar":"Collapse sidebar",children:v?"\u226B":"\u2261"}),!v&&(0,i.jsx)("span",{className:"sidebar-title",children:"Hawa Code"})]}),(0,i.jsx)(Kg,{agents:l,activeAgent:m,onSelect:O=>{h(!1),y(O)},collapsed:v}),(0,i.jsxs)("div",{className:"sidebar-footer",children:[!v&&(0,i.jsxs)("div",{className:"sidebar-stats",children:["Agents: ",l.length||1," (",l.length>0?C.length:1," active)"]}),(0,i.jsxs)("button",{className:`sidebar-button ${g?"active":""}`,onClick:()=>{g||y(""),h(!g)},title:"Settings",children:[(0,i.jsx)("span",{className:"sidebar-button-icon",children:"\u2699"}),!v&&(0,i.jsx)("span",{className:"sidebar-button-text",children:"Settings"})]})]})]}),(0,i.jsxs)("div",{className:"main-content",children:[(0,i.jsxs)("div",{className:"header",children:[(0,i.jsx)("span",{className:"header-title",children:g?"Settings":"Agent Viewer"}),(0,i.jsxs)("div",{className:"header-status",children:[(0,i.jsxs)("span",{children:["Messages: ",k.length]}),(0,i.jsx)("span",{className:`status-dot ${a}`}),(0,i.jsx)("span",{children:a==="connected"?"Connected":a==="connecting"?"Connecting...":"Disconnected"})]})]}),g?(0,i.jsx)(Iy,{onClose:()=>h(!1)}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Uy,{rawMessages:k,autoScroll:b,userType:f,pendingUserResponses:c,sendUserResponse:p}),!b&&(0,i.jsx)("button",{className:"auto-scroll-toggle",onClick:()=>N(!0),children:"Resume auto-scroll"}),!q&&!_&&(0,i.jsx)(Dy,{activeAgent:m,isLoading:R,promptStatus:d,onSubmit:x,onInterrupt:L})]})]}),(0,i.jsx)(tb,{queue:s,onDecision:o})]})}var lb=document.getElementById("root");lb&&(0,ab.createRoot)(lb).render((0,i.jsx)(nb,{}));
|
|
100
100
|
/*! Bundled license information:
|
|
101
101
|
|