blade-code 0.7.8 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-04920kz2.js +1570 -0
  3. package/dist/{chunk-rnfd5ebv.js → chunk-06h100e2.js} +1 -1
  4. package/dist/chunk-07jvw0kn.js +1 -0
  5. package/dist/chunk-0dj326ms.js +5 -0
  6. package/dist/chunk-14erxdhd.js +1 -0
  7. package/dist/{chunk-48q9msfk.js → chunk-1pt090dg.js} +38 -38
  8. package/dist/{chunk-cjmxggke.js → chunk-1smf2dj3.js} +2 -2
  9. package/dist/chunk-34pdtz4q.js +3 -0
  10. package/dist/chunk-42ch5zg4.js +1 -0
  11. package/dist/chunk-49g067ek.js +41 -0
  12. package/dist/{chunk-71n472hj.js → chunk-61952mn3.js} +1 -1
  13. package/dist/{chunk-s4mke0t6.js → chunk-6yqzfz8t.js} +1 -1
  14. package/dist/chunk-7j6rxyt8.js +9 -0
  15. package/dist/{chunk-g7caymjr.js → chunk-9ad7tt9s.js} +1 -1
  16. package/dist/{chunk-jm2xhnrv.js → chunk-9xkjb87h.js} +1 -1
  17. package/dist/chunk-a12tmmfr.js +1 -0
  18. package/dist/{chunk-0e0z8yc1.js → chunk-bm8vwfez.js} +2 -2
  19. package/dist/chunk-cnftrx3g.js +1 -0
  20. package/dist/chunk-ctqf59q1.js +2 -0
  21. package/dist/chunk-d4ex0qvs.js +2 -0
  22. package/dist/{chunk-f9ybv4ph.js → chunk-dr06x0cw.js} +1 -1
  23. package/dist/chunk-epp5jx5f.js +6 -0
  24. package/dist/{chunk-4dmdn3a9.js → chunk-gsfkrr25.js} +1 -1
  25. package/dist/chunk-hjx5n3dw.js +3 -0
  26. package/dist/chunk-j39q2kx7.js +1 -0
  27. package/dist/chunk-j6hpzkpq.js +6 -0
  28. package/dist/{chunk-t70aqrm4.js → chunk-jt62ctz7.js} +1 -1
  29. package/dist/chunk-k47ssv3b.js +34 -0
  30. package/dist/{chunk-t2spryz0.js → chunk-kawv31m3.js} +1 -1
  31. package/dist/chunk-n4f8tseg.js +2 -0
  32. package/dist/chunk-nc4kfwef.js +1 -0
  33. package/dist/{chunk-9kejtkey.js → chunk-neenhtxw.js} +1 -1
  34. package/dist/chunk-pdydx73a.js +2 -0
  35. package/dist/chunk-qwdbqjh7.js +22 -0
  36. package/dist/{chunk-g6ted982.js → chunk-sr3bzb95.js} +1 -1
  37. package/dist/chunk-syj3anec.js +6 -0
  38. package/dist/chunk-tv4r86ez.js +24 -0
  39. package/dist/chunk-twem6p0g.js +2 -0
  40. package/dist/chunk-v3ctg84r.js +1 -0
  41. package/dist/chunk-v5rn5r1h.js +1 -0
  42. package/dist/{chunk-fb7amc2s.js → chunk-wmes2tt9.js} +1 -1
  43. package/dist/chunk-x6gt63vz.js +151 -0
  44. package/dist/chunk-xhnyy54e.js +2 -0
  45. package/dist/{chunk-6hn2jgw5.js → chunk-yhpm9azy.js} +1 -1
  46. package/dist/web/assets/{CodeBlockHighlighter-C1cp8dDv.js → CodeBlockHighlighter-D8_cOYpG.js} +1 -1
  47. package/dist/web/assets/{FilePreview-DRKRs8i2.js → FilePreview-Chqi7chf.js} +1 -1
  48. package/dist/web/assets/{MarkdownRenderer-DFqPpAnM.js → MarkdownRenderer-JJScfgAO.js} +1 -1
  49. package/dist/web/assets/{McpModal-CX5-hlNv.js → McpModal-CiCuIUxC.js} +2 -2
  50. package/dist/web/assets/SettingsModal-Bew818xl.js +1 -0
  51. package/dist/web/assets/{SettingsStore-jup_Kikq.js → SettingsStore-B_4zN-c-.js} +1 -1
  52. package/dist/web/assets/{SkillsModal-DaAUrwXO.js → SkillsModal-Cot4Rb89.js} +1 -1
  53. package/dist/web/assets/{TerminalPanel-DzlllDH7.js → TerminalPanel-DxB67ObY.js} +1 -1
  54. package/dist/web/assets/index-B-b3Yc5H.css +1 -0
  55. package/dist/web/assets/index-B3dW1Scg.js +16 -0
  56. package/dist/web/assets/{useRequest-DITGl55G.js → useRequest-B4kP-cmG.js} +1 -1
  57. package/dist/web/assets/{vendor-icons-BuFpOlRn.js → vendor-icons-DqO8ishN.js} +2 -2
  58. package/dist/web/assets/{vendor-markdown-Bo4W9Tae.js → vendor-markdown-b9iCqZWK.js} +1 -1
  59. package/dist/web/assets/vendor-radix-DyP_DOwV.js +45 -0
  60. package/dist/web/assets/{vendor-react-BalntB5F.js → vendor-react-FPIC4Czm.js} +2 -2
  61. package/dist/web/index.html +2 -2
  62. package/package.json +4 -11
  63. package/dist/chunk-1w6tqkxd.js +0 -34
  64. package/dist/chunk-2049tv49.js +0 -41
  65. package/dist/chunk-4745ktjj.js +0 -1570
  66. package/dist/chunk-5be6qr2v.js +0 -2
  67. package/dist/chunk-67vzgcs5.js +0 -2
  68. package/dist/chunk-6811kbxn.js +0 -1
  69. package/dist/chunk-6js5wp6t.js +0 -1
  70. package/dist/chunk-6kp3z956.js +0 -9
  71. package/dist/chunk-78txnq4n.js +0 -151
  72. package/dist/chunk-7r1hm0qz.js +0 -6
  73. package/dist/chunk-a7yjnqhd.js +0 -3
  74. package/dist/chunk-bwaqaktn.js +0 -1
  75. package/dist/chunk-cb82rf5h.js +0 -1
  76. package/dist/chunk-ce11m8bq.js +0 -1
  77. package/dist/chunk-e4rhdg3h.js +0 -1
  78. package/dist/chunk-faq7ay4j.js +0 -24
  79. package/dist/chunk-ky8ctbdc.js +0 -1
  80. package/dist/chunk-mpskff34.js +0 -1
  81. package/dist/chunk-pd1yqxcv.js +0 -9
  82. package/dist/chunk-phhmmybg.js +0 -2
  83. package/dist/chunk-qnevwq1q.js +0 -2
  84. package/dist/chunk-r1spf93b.js +0 -26
  85. package/dist/chunk-z4c68ve0.js +0 -6
  86. package/dist/chunk-z9zbcenc.js +0 -6
  87. package/dist/web/assets/SettingsModal-CfR_q6N7.js +0 -1
  88. package/dist/web/assets/index-BJTSF3fc.js +0 -9
  89. package/dist/web/assets/index-CL6apjgo.css +0 -1
  90. package/dist/web/assets/vendor-radix-CESj0OOY.js +0 -45
@@ -1,6 +0,0 @@
1
- import{y as w}from"./chunk-qnevwq1q.js";import{sa as S}from"./chunk-faq7ay4j.js";import{Ea as u,Fa as y}from"./chunk-r1spf93b.js";import{Ab as m,Cb as d,xb as r}from"./chunk-4dmdn3a9.js";import{Zb as b}from"./chunk-a7yjnqhd.js";import{promises as h}from"node:fs";import P from"node:path";import{z as o}from"zod";var M=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],T=new Set([...Object.keys(u),...M]),k=o.object({currentModelId:o.string().optional(),models:o.array(o.object({id:o.string().min(1),name:o.string().min(1),provider:o.string().min(1),apiKey:o.string(),baseUrl:o.string(),model:o.string().min(1),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),topP:o.number().optional(),topK:o.number().optional(),supportsThinking:o.boolean().optional(),thinkingBudget:o.number().positive().optional(),thinkingMode:o.enum(["off","budget","adaptive"]).optional(),apiVersion:o.string().optional(),projectId:o.string().optional(),fallbackModels:o.array(o.string()).optional(),enablePromptCaching:o.boolean().optional(),customHeaders:o.record(o.string()).optional(),timeout:o.number().positive().optional(),maxRetries:o.number().int().min(0).optional()})).optional(),temperature:o.number().optional(),maxContextTokens:o.number().positive().optional(),maxOutputTokens:o.number().positive().optional(),stream:o.boolean().optional(),topP:o.number().optional(),topK:o.number().optional(),timeout:o.number().positive().optional(),theme:o.string().optional(),uiTheme:o.enum(["light","dark","system"]).optional(),language:o.string().optional(),fontSize:o.number().positive().optional(),autoSaveSessions:o.boolean().optional(),notifyBuild:o.boolean().optional(),notifyErrors:o.boolean().optional(),notifySounds:o.boolean().optional(),privacyTelemetry:o.boolean().optional(),privacyCrash:o.boolean().optional(),debug:o.union([o.boolean(),o.string()]).optional(),mcpEnabled:o.boolean().optional(),mcpServers:o.record(o.record(o.unknown())).optional(),permissionMode:o.nativeEnum(m).optional(),maxTurns:o.number().int().min(-1).max(d).optional(),systemPrompt:o.string().optional(),appendSystemPrompt:o.string().optional(),initialMessage:o.string().optional(),resumeSessionId:o.string().optional(),forkSession:o.boolean().optional(),allowedTools:o.array(o.string().min(1)).optional(),disallowedTools:o.array(o.string().min(1)).optional(),mcpConfigPaths:o.array(o.string().min(1)).optional(),strictMcpConfig:o.boolean().optional(),model:o.string().min(1).optional(),addDirs:o.array(o.string().min(1)).optional(),outputFormat:o.enum(["text","json","stream-json","jsonl"]).optional(),inputFormat:o.enum(["text","stream-json"]).optional(),print:o.boolean().optional(),includePartialMessages:o.boolean().optional(),replayUserMessages:o.boolean().optional(),agentsConfig:o.string().optional(),settingSources:o.string().optional(),permissions:o.object({allow:o.array(o.string()).optional(),ask:o.array(o.string()).optional(),deny:o.array(o.string()).optional()}).optional(),env:o.record(o.string()).optional(),hooks:o.record(o.unknown()).optional(),disableAllHooks:o.boolean().optional()}).passthrough(),C=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"]];function a(n,i){let t;try{t=JSON.parse(n)}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Invalid JSON provided to --settings (${i})${l}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let e of Object.keys(t))if(!T.has(e))throw Error(`Unknown --settings field: ${e}`);let s=k.safeParse(t);if(!s.success){let e=s.error.issues.map((l)=>`${l.path.join(".")||"settings"}: ${l.message}`).join("; ");throw Error(`Invalid --settings value: ${e}`)}return s.data}async function c(n){if(n===void 0)return;let i=n.trim();if(!i)throw Error("--settings requires a JSON object or file path");if(i.startsWith("{"))return a(i,"inline JSON");let t=P.resolve(r(),i),s;try{s=await h.readFile(t,"utf8")}catch(e){let l=e instanceof Error?`: ${e.message}`:"";throw Error(`Unable to read --settings file ${t}${l}`)}return a(s,t)}function f(n,i){if(!i)return;let t=i;for(let[s,e]of C){if(s==="permissionMode"&&n.yolo===!0)continue;if(n[e]===void 0&&t[s]!==void 0)n[e]=t[s]}}var p=b("General"),K=(n)=>{if(n.yolo){if(n.permissionMode&&n.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");n.permissionMode="yolo"}if(Array.isArray(n.allowedTools))n.allowedTools=n.allowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.disallowedTools))n.disallowedTools=n.disallowedTools.flatMap((i)=>i.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(n.allowedTools)&&Array.isArray(n.disallowedTools)){let i=n.allowedTools.filter((t)=>n.disallowedTools.includes(t));if(i.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${i.join(", ")}`)}},z=async(n)=>{let i=await c(typeof n.settings==="string"?n.settings:void 0);if(f(n,i),typeof n.agents==="string")w(n.agents);E(n);try{let s=await y.getInstance().initialize(i);if(S().config.actions.setConfig(s),n.debug)p.info("[CLI] 配置已加载到 Store")}catch(t){p.error("[CLI] [FAIL] 配置初始化失败",t instanceof Error?t.message:t),console.error(`
2
- [FAIL] 配置初始化失败
3
- `),console.error("原因:",t instanceof Error?t.message:"未知错误"),console.error(`
4
- 请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
5
- `),process.exit(1)}};function E(n){if(n.continue&&n.resume)throw Error("Cannot use both --continue and --resume flags simultaneously");if(n.forkSession&&!n.continue&&!n.resume)throw Error("--fork-session requires --resume or --continue");if(n.sessionId&&(n.continue||n.resume)&&!n.forkSession)throw Error("--session-id can only be combined with --resume or --continue when --fork-session is set")}var B=(n)=>{if(n.outputFormat&&n.outputFormat!=="text"&&!n.print&&!n.headless)throw Error("--output-format can only be used with --print or --headless");if(n.headless&&n.outputFormat&&!["text","jsonl"].includes(n.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${n.outputFormat}". Use --print for json|stream-json support.`);if(n.print&&n.outputFormat&&!["text","json","stream-json"].includes(n.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${n.outputFormat}". Use --headless for jsonl support.`);if(n.inputFormat==="stream-json"&&n.print)p.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};
6
- export{K as v,z as w,B as x};
@@ -1,3 +0,0 @@
1
- import{$b as F}from"./chunk-f9ybv4ph.js";import{appendFileSync as R,existsSync as x,mkdirSync as m,readdirSync as C,statSync as z,unlinkSync as V}from"node:fs";import $ from"node:path";import{execSync as A}from"node:child_process";import*as _ from"node:os";import*as M from"node:path";function B(q){return M.resolve(q).replace(/[/\\]/g,"-").replace(/:/g,"_")}function f(q){let G=q.replace(/_/g,":");if(G.startsWith("-"))G="/"+G.slice(1);return G.replace(/-/g,"/")}function X(q){let G=B(q);return M.join(W(),"projects",G)}function N(q){return typeof q==="string"&&q!=="."&&q!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(q)}function Y(q){if(!N(q))throw Error(`Invalid session ID: ${q}`)}function u(q,G){return Y(G),M.join(X(q),`${G}.jsonl`)}function P(q,G){return Y(G),M.join(X(q),`${G}.inbox.json`)}function h(q,G){return Y(G),M.join(X(q),`${G}.goal.json`)}function y(q){try{return A("git rev-parse --abbrev-ref HEAD",{cwd:q,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function W(){return process.env.BLADE_STORAGE_ROOT||M.join(_.homedir(),".blade")}async function p(){let{readdir:q}=await import("node:fs/promises");try{let G=M.join(W(),"projects");return(await q(G,{withFileTypes:!0})).filter((H)=>H.isDirectory()).map((H)=>H.name)}catch{return[]}}var E;((J)=>{J[J.DEBUG=0]="DEBUG";J[J.INFO=1]="INFO";J[J.WARN=2]="WARN";J[J.ERROR=3]="ERROR"})(E||={});var Z=null,k=null,w=!1;function n(q){if(Z!==q)Z=q}async function l(){}function b(){if(w)return k;w=!0;try{let q=$.join(W(),"logs");if(!x(q))m(q,{recursive:!0,mode:493});if(z(q).uid===0&&process.getuid&&process.getuid()!==0)return console.error(""),console.error("[FAIL] 权限错误:~/.blade/logs 目录属于 root 用户"),console.error(""),console.error("这通常是因为您曾经使用 sudo 运行过 blade。"),console.error(""),console.error("解决方法:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("然后重新运行 blade(不要使用 sudo)"),console.error(""),null;return j(q,30),k=q,q}catch(q){return console.error("[Logger] 无法创建日志目录:",q),null}}function j(q,G){try{let K=C(q),H=Date.now(),J=G*24*60*60*1000;for(let T of K){if(!T.startsWith("blade-")||!T.endsWith(".log")&&!T.endsWith(".jsonl"))continue;let O=$.join(q,T);try{let U=z(O);if(H-U.mtimeMs>J)V(O)}catch(U){}}}catch(K){}}function D(){let q=b();if(!q)return null;let G=Z||"default";return $.join(q,`blade-${G}.jsonl`)}function v(q,G,K){let H=D();if(!H)return;try{let J={timestamp:new Date().toISOString(),level:E[G],category:q,message:K};R(H,JSON.stringify(J)+`
2
- `)}catch(J){}}class Q{static globalDebugConfig=null;enabled;minLevel;category;constructor(q={}){if(q.enabled!==void 0)this.enabled=q.enabled;else if(Q.globalDebugConfig!==null)this.enabled=Boolean(Q.globalDebugConfig);else this.enabled=!1;this.minLevel=q.minLevel??0,this.category=q.category??"General"}static setGlobalDebug(q){Q.globalDebugConfig=q}static clearGlobalDebug(){Q.globalDebugConfig=null}setEnabled(q){this.enabled=q}parseDebugFilter(q){if(!q)return{enabled:!1};if(q===!0||q==="true"||q==="1")return{enabled:!0};let G=String(q).trim();if(!G)return{enabled:!0};if(G.startsWith("!"))return{enabled:!0,filter:{mode:"exclude",categories:G.split(",").map((J)=>J.trim().replace(/^!/,"")).filter(Boolean)}};return{enabled:!0,filter:{mode:"include",categories:G.split(",").map((H)=>H.trim()).filter(Boolean)}}}shouldLogCategory(q){if(!q)return!0;let G=this.category.toLowerCase();if(q.mode==="include")return q.categories.some((K)=>G.includes(K.toLowerCase()));return!q.categories.some((K)=>G.includes(K.toLowerCase()))}shouldLogToConsole(q){if(Q.globalDebugConfig!==null){let{enabled:G,filter:K}=this.parseDebugFilter(Q.globalDebugConfig);if(!G)return!1;if(q<this.minLevel)return!1;return this.shouldLogCategory(K)}return this.enabled&&q>=this.minLevel}log(q,...G){let K=G.map((H)=>typeof H==="object"?JSON.stringify(H):String(H)).join(" ");if(v(this.category,q,K),this.shouldLogToConsole(q)){let H=E[q],J=`[${this.category}] [${H}]`;console.error(J,...G)}}debug(...q){this.log(0,...q)}info(...q){this.log(1,...q)}warn(...q){this.log(2,...q)}error(...q){this.log(3,...q)}}function i(q,G){return new Q({...G,category:q})}var a=new Q({category:"General"});
3
- export{f as Mb,X as Nb,N as Ob,Y as Pb,u as Qb,P as Rb,h as Sb,y as Tb,W as Ub,p as Vb,n as Wb,l as Xb,Q as Yb,i as Zb,a as _b};
@@ -1 +0,0 @@
1
- import{Lb as a}from"./chunk-6kp3z956.js";import"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";export{a as createChatServiceAsync};
@@ -1 +0,0 @@
1
- import{t as a,u as b}from"./chunk-s4mke0t6.js";import"./chunk-phhmmybg.js";import"./chunk-f9ybv4ph.js";export{a as globalOptions,b as cliConfig};
@@ -1 +0,0 @@
1
- import{Ia as a,Ja as b,Ka as c,La as d,Ma as e,Na as f}from"./chunk-phhmmybg.js";import"./chunk-f9ybv4ph.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
@@ -1 +0,0 @@
1
- import{a,b,c,d,e}from"./chunk-cjmxggke.js";import"./chunk-f9ybv4ph.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
@@ -1,24 +0,0 @@
1
- import{Fa as Y0,Ha as w}from"./chunk-r1spf93b.js";import{vb as Q0}from"./chunk-t70aqrm4.js";import{nanoid as L0}from"nanoid";import{devtools as R0,subscribeWithSelector as I0}from"zustand/middleware";import{createStore as N0}from"zustand/vanilla";var G0={name:"ayu-dark",colors:{primary:"#ffcc66",secondary:"#bae67e",accent:"#73d0ff",success:"#bae67e",warning:"#ffcc66",error:"#ff3333",info:"#73d0ff",light:"#f0f0f0",dark:"#000000",muted:"#5c6773",highlight:"#2d323b",text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773",light:"#ffffff"},background:{primary:"#0f1419",secondary:"#14191f",dark:"#000000"},border:{light:"#2d323b",dark:"#000000"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.2)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)"}},V0={name:"dracula",colors:{primary:"#bd93f9",secondary:"#ffb86c",accent:"#ff79c6",success:"#50fa7b",warning:"#f1fa8c",error:"#ff5555",info:"#8be9fd",light:"#f8f8f2",dark:"#282a36",muted:"#6272a4",highlight:"#44475a",text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4",light:"#ffffff"},background:{primary:"#282a36",secondary:"#44475a",dark:"#21222c"},border:{light:"#44475a",dark:"#000000"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 42, 54, 0.2)",base:"0 1px 3px 0 rgba(40, 42, 54, 0.3), 0 1px 2px 0 rgba(40, 42, 54, 0.2)",lg:"0 10px 15px -3px rgba(40, 42, 54, 0.3), 0 4px 6px -2px rgba(40, 42, 54, 0.2)"}},F0={name:"monokai",colors:{primary:"#66d9ef",secondary:"#a6e22e",accent:"#f92672",success:"#a6e22e",warning:"#e6db74",error:"#f92672",info:"#66d9ef",light:"#f8f8f2",dark:"#272822",muted:"#75715e",highlight:"#3e3d32",text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e",light:"#ffffff"},background:{primary:"#272822",secondary:"#3e3d32",dark:"#1e1f1c"},border:{light:"#3e3d32",dark:"#000000"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(39, 40, 34, 0.2)",base:"0 1px 3px 0 rgba(39, 40, 34, 0.3), 0 1px 2px 0 rgba(39, 40, 34, 0.2)",lg:"0 10px 15px -3px rgba(39, 40, 34, 0.3), 0 4px 6px -2px rgba(39, 40, 34, 0.2)"}},U0={name:"nord",colors:{primary:"#88c0d0",secondary:"#81a1c1",accent:"#b48ead",success:"#a3be8c",warning:"#ebcb8b",error:"#bf616a",info:"#88c0d0",light:"#eceff4",dark:"#2e3440",muted:"#4c566a",highlight:"#434c5e",text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a",light:"#ffffff"},background:{primary:"#2e3440",secondary:"#3b4252",dark:"#242933"},border:{light:"#434c5e",dark:"#000000"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(46, 52, 64, 0.2)",base:"0 1px 3px 0 rgba(46, 52, 64, 0.3), 0 1px 2px 0 rgba(46, 52, 64, 0.2)",lg:"0 10px 15px -3px rgba(46, 52, 64, 0.3), 0 4px 6px -2px rgba(46, 52, 64, 0.2)"}},j0={name:"solarized-light",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#cb4b16",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#93a1a1",highlight:"#eee8d5",text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1",light:"#002b36"},background:{primary:"#fdf6e3",secondary:"#eee8d5",dark:"#073642"},border:{light:"#eee8d5",dark:"#073642"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(253, 246, 227, 0.2)",base:"0 1px 3px 0 rgba(253, 246, 227, 0.3), 0 1px 2px 0 rgba(253, 246, 227, 0.2)",lg:"0 10px 15px -3px rgba(253, 246, 227, 0.3), 0 4px 6px -2px rgba(253, 246, 227, 0.2)"}},J0={name:"solarized-dark",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#b58900",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#586e75",highlight:"#073642",text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75",light:"#fdf6e3"},background:{primary:"#002b36",secondary:"#073642",dark:"#001f29"},border:{light:"#073642",dark:"#000000"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 43, 54, 0.2)",base:"0 1px 3px 0 rgba(0, 43, 54, 0.3), 0 1px 2px 0 rgba(0, 43, 54, 0.2)",lg:"0 10px 15px -3px rgba(0, 43, 54, 0.3), 0 4px 6px -2px rgba(0, 43, 54, 0.2)"}},H0={name:"tokyo-night",colors:{primary:"#7aa2f7",secondary:"#7dcfff",accent:"#bb9af7",success:"#9ece6a",warning:"#e0af68",error:"#f7768e",info:"#7aa2f7",light:"#c0caf5",dark:"#1a1b26",muted:"#565f89",highlight:"#292e42",text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89",light:"#ffffff"},background:{primary:"#1a1b26",secondary:"#292e42",dark:"#16161e"},border:{light:"#292e42",dark:"#000000"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(26, 27, 38, 0.2)",base:"0 1px 3px 0 rgba(26, 27, 38, 0.3), 0 1px 2px 0 rgba(26, 27, 38, 0.2)",lg:"0 10px 15px -3px rgba(26, 27, 38, 0.3), 0 4px 6px -2px rgba(26, 27, 38, 0.2)"}},z0={name:"github",colors:{primary:"#0969da",secondary:"#8250df",accent:"#bc4c00",success:"#1a7f37",warning:"#bc4c00",error:"#d1242f",info:"#0969da",light:"#f6f8fa",dark:"#24292f",muted:"#6e7781",highlight:"#ddf4ff",text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f6f8fa",dark:"#24292f"},border:{light:"#d0d7de",dark:"#24292f"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(255, 255, 255, 0.2)",base:"0 1px 3px 0 rgba(255, 255, 255, 0.3), 0 1px 2px 0 rgba(255, 255, 255, 0.2)",lg:"0 10px 15px -3px rgba(255, 255, 255, 0.3), 0 4px 6px -2px rgba(255, 255, 255, 0.2)"}},_0={name:"gruvbox",colors:{primary:"#83a598",secondary:"#8ec07c",accent:"#d3869b",success:"#b8bb26",warning:"#fabd2f",error:"#fb4934",info:"#83a598",light:"#fbf1c7",dark:"#282828",muted:"#928374",highlight:"#3c3836",text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374",light:"#ffffff"},background:{primary:"#282828",secondary:"#3c3836",dark:"#1d2021"},border:{light:"#3c3836",dark:"#000000"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#8ec07c",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#b8bb26",default:"#ebdbb2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 40, 40, 0.2)",base:"0 1px 3px 0 rgba(40, 40, 40, 0.3), 0 1px 2px 0 rgba(40, 40, 40, 0.2)",lg:"0 10px 15px -3px rgba(40, 40, 40, 0.3), 0 4px 6px -2px rgba(40, 40, 40, 0.2)"}},W0={name:"one-dark",colors:{primary:"#61afef",secondary:"#c678dd",accent:"#e5c07b",success:"#98c379",warning:"#e5c07b",error:"#e06c75",info:"#56b6c2",light:"#abb2bf",dark:"#282c34",muted:"#5c6370",highlight:"#3e4451",text:{primary:"#abb2bf",secondary:"#c6c8d0",muted:"#5c6370",light:"#ffffff"},background:{primary:"#282c34",secondary:"#3e4451",dark:"#21252b"},border:{light:"#3e4451",dark:"#000000"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 44, 52, 0.2)",base:"0 1px 3px 0 rgba(40, 44, 52, 0.3), 0 1px 2px 0 rgba(40, 44, 52, 0.2)",lg:"0 10px 15px -3px rgba(40, 44, 52, 0.3), 0 4px 6px -2px rgba(40, 44, 52, 0.2)"}},u0={name:"catppuccin",colors:{primary:"#89b4fa",secondary:"#cba6f7",accent:"#f5c2e7",success:"#a6e3a1",warning:"#f9e2af",error:"#f38ba8",info:"#89dceb",light:"#cdd6f4",dark:"#11111b",muted:"#6c7086",highlight:"#181825",text:{primary:"#cdd6f4",secondary:"#bac2de",muted:"#6c7086",light:"#ffffff"},background:{primary:"#1e1e2e",secondary:"#181825",dark:"#11111b"},border:{light:"#181825",dark:"#000000"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#cdd6f4",operator:"#89dceb",type:"#f5c2e7",tag:"#f38ba8",attr:"#89b4fa",default:"#cdd6f4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(30, 30, 46, 0.2)",base:"0 1px 3px 0 rgba(30, 30, 46, 0.3), 0 1px 2px 0 rgba(30, 30, 46, 0.2)",lg:"0 10px 15px -3px rgba(30, 30, 46, 0.3), 0 4px 6px -2px rgba(30, 30, 46, 0.2)"}},K0={name:"rose-pine",colors:{primary:"#9ccfd8",secondary:"#c4a7e7",accent:"#f6c177",success:"#31748f",warning:"#f6c177",error:"#eb6f92",info:"#9ccfd8",light:"#e0def4",dark:"#191724",muted:"#6e6a86",highlight:"#1f1d2e",text:{primary:"#e0def4",secondary:"#cecacd",muted:"#6e6a86",light:"#ffffff"},background:{primary:"#191724",secondary:"#1f1d2e",dark:"#12101a"},border:{light:"#1f1d2e",dark:"#000000"},syntax:{comment:"#6e6a86",string:"#9ccfd8",number:"#ea9a97",keyword:"#c4a7e7",function:"#31748f",variable:"#e0def4",operator:"#f6c177",type:"#9ccfd8",tag:"#eb6f92",attr:"#f6c177",default:"#e0def4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(25, 23, 36, 0.2)",base:"0 1px 3px 0 rgba(25, 23, 36, 0.3), 0 1px 2px 0 rgba(25, 23, 36, 0.2)",lg:"0 10px 15px -3px rgba(25, 23, 36, 0.3), 0 4px 6px -2px rgba(25, 23, 36, 0.2)"}},q0={name:"kanagawa",colors:{primary:"#8ba4b0",secondary:"#a292a3",accent:"#c47fd5",success:"#76946a",warning:"#c0a36e",error:"#c34043",info:"#7e9cd8",light:"#dcd7ba",dark:"#1f1f28",muted:"#727169",highlight:"#2a2a37",text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169",light:"#ffffff"},background:{primary:"#1f1f28",secondary:"#2a2a37",dark:"#16161d"},border:{light:"#2a2a37",dark:"#000000"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#c34043",attr:"#7fb4ca",default:"#dcd7ba"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(31, 31, 40, 0.2)",base:"0 1px 3px 0 rgba(31, 31, 40, 0.3), 0 1px 2px 0 rgba(31, 31, 40, 0.2)",lg:"0 10px 15px -3px rgba(31, 31, 40, 0.3), 0 4px 6px -2px rgba(31, 31, 40, 0.2)"}},g=[{id:"ayu-dark",label:"Ayu Dark",theme:G0,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:V0,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:F0,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:U0,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:j0,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:J0,tags:["dark"]},{id:"tokyo-night",label:"Tokyo Night",theme:H0,tags:["dark","popular"]},{id:"github",label:"GitHub",theme:z0,tags:["light","minimal"]},{id:"gruvbox",label:"Gruvbox",theme:_0,tags:["dark","warm"]},{id:"one-dark",label:"One Dark",theme:W0,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:u0,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:K0,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:q0,tags:["dark","japanese"]}];var c={primary:"#0066cc",secondary:"#6c757d",accent:"#e83e8c",success:"#28a745",warning:"#ffc107",error:"#dc3545",info:"#17a2b8",light:"#f8f9fa",dark:"#343a40",muted:"#6c757d",highlight:"#fff3cd",text:{primary:"#212529",secondary:"#6c757d",muted:"#6c757d",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f8f9fa",dark:"#343a40"},border:{light:"#dee2e6",dark:"#495057"},syntax:{comment:"#6c757d",string:"#28a745",number:"#e83e8c",keyword:"#007bff",function:"#17a2b8",variable:"#495057",operator:"#ffc107",type:"#007bff",tag:"#dc3545",attr:"#ffc107",default:"#212529"}},T={name:"default",colors:c,spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)"}},w0={...T,name:"dark",colors:{...c,text:{primary:"#ffffff",secondary:"#e2e8f0",muted:"#94a3b8",light:"#000000"},background:{primary:"#1e293b",secondary:"#334155",dark:"#0f172a"},border:{light:"#475569",dark:"#64748b"},syntax:{comment:"#94a3b8",string:"#34d399",number:"#f472b6",keyword:"#60a5fa",function:"#06b6d4",variable:"#e2e8f0",operator:"#fbbf24",type:"#60a5fa",tag:"#fb7185",attr:"#fbbf24",default:"#ffffff"}}};class i{currentTheme=T;themes=new Map;constructor(){this.themes.set("default",T),this.themes.set("dark",w0);for(let X of g)this.themes.set(X.id,X.theme)}setTheme(X){let Z=this.themes.get(X);if(Z)this.currentTheme=Z;else throw Error(`Theme '${X}' not found`)}getTheme(){return this.currentTheme}getAvailableThemes(){return Array.from(this.themes.keys())}getCurrentThemeName(){return this.currentTheme.name}getThemeByName(X){return this.themes.get(X)}hasTheme(X){return this.themes.has(X)}}var o=new i;var O0={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},C=(X)=>({...O0,actions:{setInitializationStatus:(Z)=>{X((Q)=>({app:{...Q.app,initializationStatus:Z}}))},setInitializationError:(Z)=>{X((Q)=>({app:{...Q.app,initializationError:Z}}))},setActiveModal:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:Z}}))},showSessionSelector:(Z,Q="resume")=>{X((Y)=>({app:{...Y.app,activeModal:"sessionSelector",sessionSelectorData:{intent:Q,sessions:Z}}}))},showModelEditWizard:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:"modelEditWizard",modelEditorTarget:Z}}))},closeModal:()=>{X((Z)=>({app:{...Z.app,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null}}))},setTasks:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Z}}))},updateTask:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Q.app.tasks.map((Y)=>Y.id===Z.id?Z:Y)}}))},setAwaitingSecondCtrlC:(Z)=>{X((Q)=>({app:{...Q.app,awaitingSecondCtrlC:Z}}))},setThinkingModeEnabled:(Z)=>{X((Q)=>({app:{...Q.app,thinkingModeEnabled:Z}}))},toggleThinkingMode:()=>{X((Z)=>({app:{...Z.app,thinkingModeEnabled:!Z.app.thinkingModeEnabled}}))},startSubagentProgress:(Z,Q,Y)=>{X(($)=>({app:{...$.app,subagentProgress:{id:Z,type:Q,description:Y,status:"running",startTime:Date.now()}}}))},updateSubagentTool:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,currentTool:Z}}}})},completeSubagentProgress:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,status:Z?"completed":"failed",currentTool:void 0}}}}),setTimeout(()=>{X((Q)=>({app:{...Q.app,subagentProgress:null}}))},1500)}}});var p0={isProcessing:!1,abortController:null,pendingCommands:[],recoveredSteeringCount:0},S=(X,Z)=>({...p0,actions:{setProcessing:(Q)=>{X((Y)=>({command:{...Y.command,isProcessing:Q}}))},createAbortController:()=>{let Q=Z().command.abortController;if(Q&&!Q.signal.aborted)Q.abort("interrupted-by-new-command");let Y=new AbortController;return X(($)=>({command:{...$.command,abortController:Y}})),Y},getAbortController:()=>{return Z().command.abortController},clearAbortController:(Q)=>{let Y=Z().command.abortController;if(Q!==void 0&&Y!==Q)return;X(($)=>({command:{...$.command,abortController:null}}))},abort:(Q)=>{let{abortController:Y}=Z().command;if(Y&&!Y.signal.aborted)Y.abort(Q??"user-cancel");X(($)=>({command:{...$.command,isProcessing:!1,pendingCommands:[]}}))},enqueueCommand:(Q)=>{X((Y)=>({command:{...Y.command,pendingCommands:[...Y.command.pendingCommands,Q]}}))},dequeueCommand:()=>{let{pendingCommands:Q}=Z().command;if(Q.length===0)return;let[Y,...$]=Q;return X((G)=>({command:{...G.command,pendingCommands:$}})),Y},clearQueue:()=>{X((Q)=>({command:{...Q.command,pendingCommands:[]}}))},setRecoveredSteeringCount:(Q)=>{X((Y)=>({command:{...Y.command,recoveredSteeringCount:Math.max(0,Q)}}))}}});var x0={config:null},f=(X)=>({...x0,actions:{setConfig:(Z)=>{X((Q)=>({config:{...Q.config,config:Z}}))},updateConfig:(Z)=>{X((Q)=>{if(!Q.config.config)throw Error(`[ConfigSlice] Config not initialized. Cannot update: ${JSON.stringify(Z)}`);return{config:{...Q.config,config:{...Q.config.config,...Z}}}})}}});var P0={currentFocus:"main-input",previousFocus:null},b=(X)=>({...P0,actions:{setFocus:(Z)=>{X((Q)=>({focus:{...Q.focus,currentFocus:Z,previousFocus:Q.focus.currentFocus}}))},restorePreviousFocus:()=>{X((Z)=>({focus:{...Z.focus,currentFocus:Z.focus.previousFocus||"main-input",previousFocus:null}}))}}});var h={"deepseek-chat":{input:0.27,output:1.1},"deepseek-coder":{input:0.14,output:0.28},"deepseek-reasoner":{input:0.55,output:2.19},"deepseek-v3":{input:0.27,output:1.1},"deepseek-v4":{input:0.27,output:1.1},"deepseek-v4-pro":{input:0.27,output:1.1},"deepseek-v4-0724":{input:0.27,output:1.1},"gpt-4o":{input:2.5,output:10},"gpt-4o-mini":{input:0.15,output:0.6},"gpt-4.1":{input:2,output:8},"gpt-4.1-mini":{input:0.4,output:1.6},"gpt-4.1-nano":{input:0.1,output:0.4},"gpt-4-turbo":{input:10,output:30},"gpt-4":{input:30,output:60},"gpt-3.5-turbo":{input:0.5,output:1.5},o1:{input:15,output:60},"o1-mini":{input:3,output:12},"o1-pro":{input:150,output:600},o3:{input:10,output:40},"o3-mini":{input:1.1,output:4.4},"o4-mini":{input:1.1,output:4.4},"claude-3.5-sonnet":{input:3,output:15,cacheRead:0.3,cacheWrite:3.75},"claude-3.5-haiku":{input:0.8,output:4,cacheRead:0.08,cacheWrite:1},"claude-sonnet-4":{input:3,output:15,cacheRead:0.3,cacheWrite:3.75},"claude-4-opus":{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},"claude-opus-4":{input:15,output:75,cacheRead:1.5,cacheWrite:18.75},"qwen-plus":{input:0.8,output:2},"qwen-max":{input:2,output:6},"qwen-turbo":{input:0.3,output:0.6},"qwen3-235b":{input:2,output:8},"gemini-2.5-pro":{input:1.25,output:10},"gemini-2.5-flash":{input:0.15,output:0.6}};function v0(X){let Z=X.toLowerCase();if(h[Z])return h[Z];for(let[Q,Y]of Object.entries(h))if(Z.includes(Q)||Q.includes(Z))return Y;return}function l(X,Z,Q,Y,$){let G=v0(X);if(!G)return 0;let j=Z/1e6*G.input+Q/1e6*G.output;if(Y&&G.cacheRead)j+=Y/1e6*G.cacheRead;if($&&G.cacheWrite)j+=$/1e6*G.cacheWrite;return Math.round(j*1e6)/1e6}var U={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/};function r0(X){let Z=[],Q=X.split(/\r?\n/),Y=!1,$=[],G=null,j=0,W=!1,H=[],u=[],q=!1,O=[],x=!1,z=[],F=0,V=!0;for(let p=0;p<Q.length;p++){let _=Q[p];if(q){if(_.match(U.diffEnd)){try{let K=JSON.parse(O.join(`
2
- `));Z.push({type:"diff",content:"",diffData:{patch:K.patch,startLine:K.startLine,matchLine:K.matchLine}})}catch(K){Z.push({type:"text",content:O.join(`
3
- `)})}q=!1,O=[],V=!1;continue}O.push(_);continue}if(_.match(U.diffStart)){q=!0,O=[],V=!1;continue}if(Y){let K=_.match(U.codeBlock),P=_.trim()==="```";if(K&&K[1])j++,$.push(_);else if(P)if(j>0)j--,$.push(_);else{let $0=$.join(`
4
- `);Z.push({type:"code",content:$0,language:G||void 0}),Y=!1,$=[],G=null,j=0,V=!1}else $.push(_);continue}let r=_.match(U.codeBlock);if(r){Y=!0,G=r[1]||null,j=0,V=!1;continue}let E=_.match(U.table),Z0=_.match(U.tableSeparator);if(E&&!W){if(p+1<Q.length){if(Q[p+1].match(U.tableSeparator)){W=!0,H=E[1].split("|").map((P)=>P.trim()).filter((P)=>P.length>0),u=[],V=!1;continue}}}if(W&&Z0)continue;if(W&&E){let K=E[1].split("|").map((P)=>P.trim()).filter((P)=>P.length>0);while(K.length<H.length)K.push("");if(K.length>H.length)K.length=H.length;u.push(K);continue}if(W&&!E){if(H.length>0&&u.length>0)Z.push({type:"table",content:"",tableData:{headers:H,rows:u}});W=!1,H=[],u=[]}let N=_.match(U.blockquote);if(N){let K=N[1].length,P=N[2]||"";if(x&&K===F)z.push(P);else{if(x)Z.push({type:"blockquote",content:z.join(`
5
- `),blockquoteLevel:F,blockquoteLines:[...z]});x=!0,F=K,z=[P]}V=!1;continue}if(x)Z.push({type:"blockquote",content:z.join(`
6
- `),blockquoteLevel:F,blockquoteLines:[...z]}),x=!1,z=[],F=0;let y=_.match(U.heading);if(y){Z.push({type:"heading",content:y[2],level:y[1].length}),V=!1;continue}let L=_.match(U.ulItem);if(L){Z.push({type:"list",content:L[3],listType:"ul",marker:L[2],indentation:L[1].length}),V=!1;continue}let R=_.match(U.olItem);if(R){Z.push({type:"list",content:R[3],listType:"ol",marker:R[2],indentation:R[1].length}),V=!1;continue}if(_.match(U.hr)){Z.push({type:"hr",content:""}),V=!1;continue}if(_.trim().length===0){if(!V)Z.push({type:"empty",content:""}),V=!0;continue}let d=_.match(U.commandMessage);if(d){Z.push({type:"command-message",content:d[1]}),V=!1;continue}Z.push({type:"text",content:_}),V=!1}if(Y){let p=$.join(`
7
- `);Z.push({type:"code",content:p,language:G||void 0})}if(W&&H.length>0&&u.length>0)Z.push({type:"table",content:"",tableData:{headers:H,rows:u}});if(x&&z.length>0)Z.push({type:"blockquote",content:z.join(`
8
- `),blockquoteLevel:F,blockquoteLines:[...z]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var D=new Map;function D0(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function B0(X){let Z=D.get(X);if(Z)return Z;let Q={state:D0(),blocks:[],pendingLine:"",finalized:!1};return D.set(X,Q),Q}function n(X){return X.endsWith("\r")?X.slice(0,-1):X}function a(X,Z){if(X.tableHeaders.length>0&&X.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:X.tableHeaders,rows:X.tableRows}});X.inTable=!1,X.tableHeaders=[],X.tableRows=[]}function M(X,Z){if(X.blockquoteLines.length>0)Z.push({type:"blockquote",content:X.blockquoteLines.join(`
9
- `),blockquoteLevel:X.blockquoteLevel,blockquoteLines:[...X.blockquoteLines]});X.inBlockquote=!1,X.blockquoteLines=[],X.blockquoteLevel=0}function s(X,Z){let Q=X.codeBlockContent.join(`
10
- `);Z.push({type:"code",content:Q,language:X.codeBlockLang||void 0}),X.inCodeBlock=!1,X.codeBlockContent=[],X.codeBlockLang=null,X.codeBlockDepth=0,X.lastLineEmpty=!1}function k(X,Z,Q=!0){let{state:Y,blocks:$}=Z;if(Y.pendingTableHeader!==null){if(X.match(U.tableSeparator)){Y.inTable=!0,Y.tableHeaders=Y.pendingTableHeader.slice(1,-1).split("|").map((F)=>F.trim()).filter((F)=>F.length>0),Y.tableRows=[],Y.pendingTableHeader=null,Y.lastLineEmpty=!1;return}$.push({type:"text",content:Y.pendingTableHeader}),Y.pendingTableHeader=null,Y.lastLineEmpty=!1}if(Y.inDiff){if(X.match(U.diffEnd)){try{let F=JSON.parse(Y.diffContent.join(`
11
- `));$.push({type:"diff",content:"",diffData:{patch:F.patch,startLine:F.startLine,matchLine:F.matchLine}})}catch(F){$.push({type:"text",content:Y.diffContent.join(`
12
- `)})}Y.inDiff=!1,Y.diffContent=[],Y.lastLineEmpty=!1;return}Y.diffContent.push(X);return}if(X.match(U.diffStart)){Y.inDiff=!0,Y.diffContent=[],Y.lastLineEmpty=!1;return}if(Y.inCodeBlock){let F=X.match(U.codeBlock),V=X.trim()==="```";if(F&&F[1])Y.codeBlockDepth++,Y.codeBlockContent.push(X);else if(V)if(Y.codeBlockDepth>0)Y.codeBlockDepth--,Y.codeBlockContent.push(X);else s(Y,$);else Y.codeBlockContent.push(X);return}let G=X.match(U.codeBlock);if(G){Y.inCodeBlock=!0,Y.codeBlockLang=G[1]||null,Y.codeBlockDepth=0,Y.lastLineEmpty=!1;return}let j=X.match(U.table),W=X.match(U.tableSeparator);if(j&&!Y.inTable){Y.pendingTableHeader=X;return}if(Y.inTable&&W)return;if(Y.inTable&&j){let F=j[1].split("|").map((V)=>V.trim()).filter((V)=>V.length>0);while(F.length<Y.tableHeaders.length)F.push("");if(F.length>Y.tableHeaders.length)F.length=Y.tableHeaders.length;Y.tableRows.push(F);return}if(Y.inTable&&!j){if(a(Y,$),Q){k(X,Z,!1);return}}let H=X.match(U.blockquote);if(H){let F=H[1].length,V=H[2]||"";if(Y.inBlockquote&&F===Y.blockquoteLevel)Y.blockquoteLines.push(V);else{if(Y.inBlockquote)M(Y,$);Y.inBlockquote=!0,Y.blockquoteLevel=F,Y.blockquoteLines=[V]}Y.lastLineEmpty=!1;return}if(Y.inBlockquote)M(Y,$);let u=X.match(U.heading);if(u){$.push({type:"heading",content:u[2],level:u[1].length}),Y.lastLineEmpty=!1;return}let q=X.match(U.ulItem);if(q){$.push({type:"list",content:q[3],listType:"ul",marker:q[2],indentation:q[1].length}),Y.lastLineEmpty=!1;return}let O=X.match(U.olItem);if(O){$.push({type:"list",content:O[3],listType:"ol",marker:O[2],indentation:O[1].length}),Y.lastLineEmpty=!1;return}if(X.match(U.hr)){$.push({type:"hr",content:""}),Y.lastLineEmpty=!1;return}if(X.trim().length===0){if(!Y.lastLineEmpty)$.push({type:"empty",content:""}),Y.lastLineEmpty=!0;return}let z=X.match(U.commandMessage);if(z){$.push({type:"command-message",content:z[1]}),Y.lastLineEmpty=!1;return}$.push({type:"text",content:X}),Y.lastLineEmpty=!1}function c0(X,Z){if(!X||!Z)return;let Q=B0(X);if(Q.finalized)return;let Y=Q.pendingLine+Z,$=Y.split(`
13
- `),G=Y.endsWith(`
14
- `),j=G?$:$.slice(0,-1);Q.pendingLine=G?"":$[$.length-1]??"";for(let W of j)k(n(W),Q)}function i0(X){let Z=D.get(X);if(!Z||Z.finalized)return;if(Z.pendingLine)k(n(Z.pendingLine),Z),Z.pendingLine="";if(Z.state.pendingTableHeader!==null)Z.blocks.push({type:"text",content:Z.state.pendingTableHeader}),Z.state.pendingTableHeader=null;if(Z.state.inCodeBlock)s(Z.state,Z.blocks);if(Z.state.inTable)a(Z.state,Z.blocks);if(Z.state.inBlockquote)M(Z.state,Z.blocks);if(Z.state.inDiff)Z.blocks.push({type:"text",content:Z.state.diffContent.join(`
15
- `)}),Z.state.inDiff=!1,Z.state.diffContent=[];while(Z.blocks.length>0&&Z.blocks[Z.blocks.length-1].type==="empty")Z.blocks.pop();Z.finalized=!0}function o0(X){let Z=D.get(X);if(!Z||!Z.finalized)return null;return Z.blocks}function l0(X){let Z=D.get(X);if(!Z)return null;return Z.blocks}function E0(X){let Z=D.get(X);if(!Z)return null;let Q=[],Y=Z.state;if(Y.inDiff)Q.push("<<<DIFF>>>"),Q.push(...Y.diffContent);else if(Y.inCodeBlock){let $=Y.codeBlockLang?`\`\`\`${Y.codeBlockLang}`:"```";Q.push($),Q.push(...Y.codeBlockContent)}else if(Y.inTable){if(Y.tableHeaders.length>0){Q.push(`| ${Y.tableHeaders.join(" | ")} |`),Q.push(`| ${Y.tableHeaders.map(()=>"---").join(" | ")} |`);for(let $ of Y.tableRows)Q.push(`| ${$.join(" | ")} |`)}}else if(Y.inBlockquote){let $=">".repeat(Y.blockquoteLevel)+" ";for(let G of Y.blockquoteLines)Q.push($+G)}else if(Y.pendingTableHeader)Q.push(Y.pendingTableHeader);if(Z.pendingLine)Q.push(Z.pendingLine);return Q.length>0?Q:null}function n0(X){let Z=D.get(X);if(!Z)return null;let Q="text";if(Z.state.inDiff)Q="diff";else if(Z.state.inCodeBlock)Q="code";else if(Z.state.inTable||Z.state.pendingTableHeader)Q="table";let Y=E0(X);if(!Y||Y.length===0)return null;return{lines:Y,mode:Q}}function a0(X){D.delete(X)}function I(){D.clear()}var t=2000,A=[];function A0(){let X=A;return A=[],X}var X0={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:200000,totalInputTokens:0,totalOutputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,turnCount:0,estimatedCostUsd:0},e={sessionId:Q0("tui"),messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,isCompacting:!1,currentCommand:null,error:null,isActive:!0,tokenUsage:{...X0},currentThinkingContent:null,thinkingExpanded:!1,clearCount:0,historyExpanded:!1,expandedMessageCount:100,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null},m=(X,Z)=>({...e,actions:{addMessage:(Q)=>{X((Y)=>({session:{...Y.session,messages:[...Y.session.messages,Q],error:null}}))},addUserMessage:(Q)=>{let Y={id:`user-${Date.now()}-${Math.random()}`,role:"user",content:Q,timestamp:Date.now()};Z().session.actions.addMessage(Y)},addAssistantMessage:(Q,Y)=>{let $={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y};Z().session.actions.addMessage($)},addAssistantMessageAndClearThinking:(Q)=>{let Y=Z().session.currentThinkingContent,$={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y||void 0};X((G)=>({session:{...G.session,messages:[...G.session.messages,$],currentThinkingContent:null,error:null}}))},addToolMessage:(Q,Y)=>{let $={id:`tool-${Date.now()}-${Math.random()}`,role:"tool",content:Q,timestamp:Date.now(),metadata:Y};Z().session.actions.addMessage($)},setCompacting:(Q)=>{X((Y)=>({session:{...Y.session,isCompacting:Q}}))},setCommand:(Q)=>{X((Y)=>({session:{...Y.session,currentCommand:Q}}))},setError:(Q)=>{X((Y)=>({session:{...Y.session,error:Q}}))},clearMessages:()=>{I(),X((Q)=>({session:{...Q.session,messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,error:null,clearCount:Q.session.clearCount+1}}))},setCompactedContext:(Q)=>{X((Y)=>({session:{...Y.session,restoredContextMessages:[...Q],restoredVisibleMessageCount:Y.session.messages.length}}))},resetSession:()=>{I(),X((Q)=>({session:{...Q.session,...e,sessionId:Q.session.sessionId,isActive:!0}}))},restoreSession:(Q,Y,$)=>{I(),X((G)=>({session:{...G.session,sessionId:Q,messages:Y,restoredContextMessages:$??null,restoredVisibleMessageCount:$?Y.length:0,error:null,isActive:!0}}))},updateTokenUsage:(Q)=>{X((Y)=>{let $=Y.session.tokenUsage,G=(Q.inputTokens??0)-(Q.inputTokens!==void 0?$.inputTokens:0),j=(Q.outputTokens??0)-(Q.outputTokens!==void 0?$.outputTokens:0),W=$.totalInputTokens+Math.max(0,G),H=$.totalOutputTokens+Math.max(0,j),u=$.cacheReadTokens+(Q.cacheReadTokens??0),q=$.cacheWriteTokens+(Q.cacheWriteTokens??0),O=Y.config?.config,z=O?.models?.find((V)=>V.id===O.currentModelId)?.model??"",F=l(z,W,H,u,q);return{session:{...Y.session,tokenUsage:{...$,...Q,totalInputTokens:W,totalOutputTokens:H,cacheReadTokens:u,cacheWriteTokens:q,estimatedCostUsd:F}}}})},resetTokenUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...X0}}}))},setCurrentThinkingContent:(Q)=>{if(Z().session.currentThinkingContent===Q)return;X((Y)=>({session:{...Y.session,currentThinkingContent:Q}}))},appendThinkingContent:(Q)=>{X((Y)=>({session:{...Y.session,currentThinkingContent:(Y.session.currentThinkingContent||"")+Q}}))},setThinkingExpanded:(Q)=>{X((Y)=>({session:{...Y.session,thinkingExpanded:Q}}))},toggleThinkingExpanded:()=>{X((Q)=>({session:{...Q.session,thinkingExpanded:!Q.session.thinkingExpanded}}))},setHistoryExpanded:(Q)=>{X((Y)=>({session:{...Y.session,historyExpanded:Q}}))},toggleHistoryExpanded:()=>{X((Q)=>({session:{...Q.session,historyExpanded:!Q.session.historyExpanded}}))},setExpandedMessageCount:(Q)=>{X((Y)=>({session:{...Y.session,expandedMessageCount:Q}}))},incrementClearCount:()=>{X((Q)=>({session:{...Q.session,clearCount:Q.session.clearCount+1}}))},startStreamingAssistantMessage:()=>{let Q=`assistant-${Date.now()}-${Math.random()}`,Y={id:Q,role:"assistant",content:"",timestamp:Date.now()};return A=[],X(($)=>({session:{...$.session,messages:[...$.session.messages,Y],currentStreamingMessageId:Q,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,error:null}})),Q},appendAssistantContent:(Q)=>{let Y=Z().session.currentStreamingMessageId,$=Y??`assistant-${Date.now()}-${Math.random()}`;return A.push(Q),X((G)=>{let j=(p)=>p.endsWith("\r")?p.slice(0,-1):p,W=Y?G.session.currentStreamingLines:[],H=Y?G.session.currentStreamingTail:"",u=Y?G.session.currentStreamingLineCount:0,q=Y?G.session.currentStreamingVersion:0,x=(H+Q).split(`
16
- `),z=x.slice(0,-1).map(j),F=j(x[x.length-1]??""),V=W;if(z.length>0){if(V=[...W,...z],V.length>t){let p=V.length-t;V=V.slice(p)}}return{session:{...G.session,currentStreamingMessageId:$,currentStreamingLines:V,currentStreamingTail:F,currentStreamingLineCount:u+z.length,currentStreamingVersion:q+1,error:null}}}),$},finalizeStreamingMessage:(Q,Y)=>{let $=A0();X((G)=>{let j=G.session.currentStreamingMessageId,H=$.join("")+(Q||""),u=(G.session.currentThinkingContent||"")+(Y||"");if(H.length>0){let q={id:j||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:H,timestamp:Date.now(),thinkingContent:u||void 0};return{session:{...G.session,messages:[...G.session.messages,q],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:q.id}}}return{session:{...G.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{X((Q)=>({session:{...Q.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{A=[],X((Q)=>({session:{...Q.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))}}});var y0=N0()(R0(I0((...X)=>({session:m(...X),app:C(...X),config:f(...X),focus:b(...X),command:S(...X)})),{name:"BladeStore",enabled:!0})),J=()=>y0.getState(),W1=()=>J().session.actions,u1=()=>J().app.actions,K1=()=>J().session.messages,v=()=>J().config.config,B=null;async function q1(){if(v()!==null)return;if(B)return B;return B=(async()=>{try{let Q=await Y0.getInstance().initialize();J().config.actions.setConfig(Q)}catch(Z){throw B=null,Error(`[FAIL] Store 未初始化且无法自动初始化
17
-
18
- `+`原因: ${Z instanceof Error?Z.message:"未知错误"}
19
-
20
- `+`请确保:
21
- `+`1. 配置文件格式正确 (~/.blade/config.json)
22
- `+`2. 运行 blade 进行首次配置
23
- `+"3. 配置文件权限正确")}finally{B=null}})(),B}var w1=()=>J().config.config?.models??[],O1=()=>{let X=v();if(!X)return;let Z=X.currentModelId;return X.models.find((Y)=>Y.id===Z)??X.models[0]},p1=(X)=>{let Z=v();if(!Z)return;return Z.models.find((Q)=>Q.id===X)},x1=()=>J().config.config?.mcpServers??{},P1=()=>J().app.thinkingModeEnabled,v1=()=>({setPermissionMode:async(X)=>{J().config.actions.updateConfig({permissionMode:X})},setTheme:async(X,Z={})=>{try{o.setTheme(X)}catch{return}J().config.actions.updateConfig({theme:X}),await w().save({theme:X},{scope:"global",...Z})},setLanguage:async(X,Z={})=>{J().config.actions.updateConfig({language:X}),await w().save({language:X},{scope:"global",...Z})},setDebug:async(X,Z={})=>{J().config.actions.updateConfig({debug:X}),await w().save({debug:X},{scope:"global",...Z})},setTemperature:async(X,Z={})=>{J().config.actions.updateConfig({temperature:X}),await w().save({temperature:X},{scope:"global",...Z})},updateConfig:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");let Y={...Q};J().config.actions.updateConfig(X);try{await w().save(X,Z)}catch($){throw J().config.actions.setConfig(Y),$}},flush:async()=>{await w().flush()},appendPermissionAllowRule:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];J().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await w().appendPermissionRule(X,Z)},appendLocalPermissionAllowRule:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];J().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await w().appendLocalPermissionRule(X,Z)},setCurrentModel:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");if(!Q.models.find(($)=>$.id===X))throw Error(`Model not found: ${X}`);J().config.actions.updateConfig({currentModelId:X}),await w().save({currentModelId:X},{scope:"global",...Z})},addModel:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");let Y="id"in X?X:{id:L0(),...X},G={models:[...Q.models,Y]};if(Q.models.length===0)G.currentModelId=Y.id;return J().config.actions.updateConfig(G),await w().save(G,{scope:"global",...Z}),Y},updateModel:async(X,Z,Q={})=>{let Y=v();if(!Y)throw Error("Config not initialized");let $=Y.models.findIndex((j)=>j.id===X);if($===-1)throw Error(`Model not found: ${X}`);let G=[...Y.models];G[$]={...G[$],...Z},J().config.actions.updateConfig({models:G}),await w().save({models:G},{scope:"global",...Q})},removeModel:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");if(Q.models.length===1)throw Error("Cannot remove the only model");let Y=Q.models.filter((G)=>G.id!==X),$={models:Y};if(Q.currentModelId===X)$.currentModelId=Y[0].id;J().config.actions.updateConfig($),await w().save($,{scope:"global",...Z})},addMcpServer:async(X,Z,Q={})=>{let Y=v();if(!Y)throw Error("Config not initialized");let G={...Y.mcpServers??{},[X]:Z};J().config.actions.updateConfig({mcpServers:G}),await w().save({mcpServers:G},{scope:"project",...Q})},removeMcpServer:async(X,Z={})=>{let Q=v();if(!Q)throw Error("Config not initialized");let $={...Q.mcpServers??{}};delete $[X],J().config.actions.updateConfig({mcpServers:$}),await w().save({mcpServers:$},{scope:"project",...Z})}});
24
- export{g as ha,o as ia,U as ja,r0 as ka,c0 as la,i0 as ma,o0 as na,l0 as oa,n0 as pa,a0 as qa,y0 as ra,J as sa,W1 as ta,u1 as ua,K1 as va,v as wa,q1 as xa,w1 as ya,O1 as za,p1 as Aa,x1 as Ba,P1 as Ca,v1 as Da};
@@ -1 +0,0 @@
1
- import{v as a,w as b,x as c}from"./chunk-7r1hm0qz.js";import"./chunk-qnevwq1q.js";import"./chunk-g7caymjr.js";import"./chunk-faq7ay4j.js";import"./chunk-r1spf93b.js";import"./chunk-t70aqrm4.js";import"./chunk-4dmdn3a9.js";import"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
@@ -1 +0,0 @@
1
- import{Aa as j,Ba as k,Ca as l,Da as m,ra as a,sa as b,ta as c,ua as d,va as e,wa as f,xa as g,ya as h,za as i}from"./chunk-faq7ay4j.js";import"./chunk-r1spf93b.js";import"./chunk-t70aqrm4.js";import"./chunk-4dmdn3a9.js";import"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,h as getAllModels,g as ensureStoreInitialized,m as configActions,d as appActions};
@@ -1,9 +0,0 @@
1
- import{$ as A,B,I as N,L as T,Q as h,R as q,T as E,Y as b,_ as x}from"./chunk-4745ktjj.js";import"./chunk-g7caymjr.js";import{da as C}from"./chunk-1w6tqkxd.js";import"./chunk-0e0z8yc1.js";import{wa as I}from"./chunk-faq7ay4j.js";import"./chunk-r1spf93b.js";import"./chunk-phhmmybg.js";import{$a as K}from"./chunk-48q9msfk.js";import{rb as j}from"./chunk-jm2xhnrv.js";import"./chunk-2049tv49.js";import{vb as S}from"./chunk-t70aqrm4.js";import{Bb as M}from"./chunk-4dmdn3a9.js";import"./chunk-6kp3z956.js";import{Zb as L}from"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";import{Readable as d,Writable as p}from"node:stream";import*as P from"@agentclientprotocol/sdk";import k from"node:path";import{PROTOCOL_VERSION as g}from"@agentclientprotocol/sdk";import{nanoid as O}from"nanoid";var V=L("Agent");function R(z){return Object.fromEntries(z.map((H)=>[H.name,H.value]))}function v(z){if("command"in z)return{type:"stdio",command:z.command,args:z.args,env:R(z.env)};return{type:z.type,url:z.url,headers:R(z.headers)}}function c(z){return Object.fromEntries(z.map((H)=>[H.name,v(H)]))}function y(z){if(typeof z==="string")return z?[{type:"text",text:z}]:[];return z.flatMap((H)=>{if(H.type==="text")return H.text?[{type:"text",text:H.text}]:[];let J=H.image_url.url,Q=/^data:([^;,]+);base64,(.+)$/s.exec(J);if(!Q)return[{type:"text",text:"[Image]"}];return[{type:"image",mimeType:Q[1]??"image/png",data:Q[2]??""}]})}class _{id;cwd;connection;clientCapabilities;options;agent=null;runtime=null;pendingPrompt=null;pendingResumeRequested=!1;availableCommandsTimer=null;destroyed=!1;messages;mode="default";constructor(z,H,J,Q,X={}){this.id=z;this.cwd=H;this.connection=J;this.clientCapabilities=Q;this.options=X;this.messages=[...X.initialMessages??[]]}async initialize(){V.debug(`[AcpSession ${this.id}] Initializing...`),B.initializeSession(this.connection,this.id,this.clientCapabilities,this.cwd),V.debug(`[AcpSession ${this.id}] ACP service context initialized`);let z=this.options.mcpServers?c(this.options.mcpServers):void 0;this.runtime=await T.create({sessionId:this.id,workspaceRoot:this.cwd,...z?{mcpServers:z}:{}}),this.agent=await E.createWithRuntime(this.runtime,{sessionId:this.id}),V.debug(`[AcpSession ${this.id}] Agent created successfully`);let H=await this.runtime.getGoal();if(this.runtime.getPendingSteeringCount()>0||H?.status==="active")if(this.options.initialMessages===void 0)this.schedulePendingResume();else this.pendingResumeRequested=!0}async replayHistory(){for(let z of this.messages){if(!this.canSendUpdates())return;let H=z.role==="user"?"user_message_chunk":z.role==="assistant"?"agent_message_chunk":void 0;if(!H)continue;for(let J of y(z.content)){if(!this.canSendUpdates())return;if(!await this.sendUpdateAndWait({sessionUpdate:H,content:J}))return}}if(this.pendingResumeRequested)this.schedulePendingResume()}sendAvailableCommandsDelayed(){if(this.destroyed||this.connection.signal.aborted)return;if(this.availableCommandsTimer!==null)clearTimeout(this.availableCommandsTimer);V.debug(`[AcpSession ${this.id}] Scheduling available commands update (500ms delay)`),this.availableCommandsTimer=setTimeout(()=>{if(this.availableCommandsTimer=null,this.destroyed||this.connection.signal.aborted)return;this.sendAvailableCommands()},500)}async handleSlashCommand(z,H){try{V.debug(`[AcpSession ${this.id}] Executing slash command: ${z}`);let J={cwd:this.cwd,workspaceRoot:this.cwd,sessionId:this.id,messages:[...this.messages],rewind:{listCheckpoints:async()=>{if(!this.runtime)throw Error("Session runtime is unavailable");return this.runtime.listRewindCheckpoints()},execute:async(Z)=>{if(!this.runtime)throw Error("Session runtime is unavailable");let $=await this.runtime.rewindSession(Z);return this.messages=[...$.messages],await this.agent?.destroy(),this.agent=await E.createWithRuntime(this.runtime,{sessionId:this.id}),$}},subagents:{list:async()=>{if(!this.runtime)throw Error("Session runtime is unavailable");return this.runtime.listSubagents()},resume:async(Z,$)=>{if(!this.runtime)throw Error("Session runtime is unavailable");let U=!1,W,G=(F)=>{this.sendUpdate({sessionUpdate:"tool_call_update",toolCallId:F.id,status:F.status==="completed"?"completed":"failed",content:[{type:"content",content:{type:"text",text:F.result?.message||F.result?.error||`Subagent ${F.status}`}}]})},D=this.runtime.resumeSubagent({agentId:Z,prompt:$,onCompleted:(F)=>{if(U)G(F);else W=F}});if(this.sendUpdate({sessionUpdate:"tool_call",toolCallId:D.session.id,status:"in_progress",title:`Resuming ${D.session.subagentType} subagent`,content:[{type:"content",content:{type:"text",text:`Resumed from ${D.source.id} at depth ${D.session.resumeDepth}`}}],kind:this.mapToolKind("readonly")}),U=!0,W)G(W);return D}},signal:H,acp:{sendMessage:(Z)=>{this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Z}})},sendToolStart:(Z,$,U)=>{let W=`tool_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,G=this.mapToolKind(U);this.sendUpdate({sessionUpdate:"tool_call",toolCallId:W,status:"in_progress",title:`${Z}`,content:[{type:"content",content:{type:"text",text:JSON.stringify($,null,2)}}],kind:G})},sendToolResult:(Z,$)=>{if($.summary)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:$.summary}})}}},Q=await x(z,J),X=Q.data?.action;if(X==="start_goal"||X==="resume_goal")this.schedulePendingResume();if(X==="rewind_session"&&Array.isArray(Q.data?.messages))this.messages=[...Q.data.messages];if((Q.message==="compact_completed"||Q.message==="compact_fallback")&&Q.data?.compactedMessages)this.messages=[...Q.data.compactedMessages];let Y=Q.content||Q.message;if(Y)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Y}});if(Q.error)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[FAIL] ${Q.error}`}});return{stopReason:Q.success?"end_turn":"cancelled"}}catch(J){return V.error(`[AcpSession ${this.id}] Slash command error:`,J),this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[FAIL] 命令执行失败: ${J instanceof Error?J.message:"未知错误"}`}}),{stopReason:"cancelled"}}}async sendAvailableCommands(){try{let z=A(),H=["model","permissions","theme","config","exit","ide"],Q=z.filter((X)=>!H.includes(X.name)).map((X)=>{let Y;if(X.usage){let Z=X.usage.replace(/^\/\w+\s*/,"").trim();if(Z)Y=Z}if(X.aliases?.length){let Z=`Aliases: ${X.aliases.join(", ")}`;Y=Y?`${Y} | ${Z}`:Z}return{name:X.name,description:X.description,input:Y?{hint:Y}:void 0}});V.info(`[AcpSession ${this.id}] Sending available commands: ${JSON.stringify(Q.map((X)=>X.name))}`),this.sendUpdate({sessionUpdate:"available_commands_update",availableCommands:Q}),V.info(`[AcpSession ${this.id}] Sent ${Q.length} available commands`)}catch(z){V.error(`[AcpSession ${this.id}] Failed to send available commands:`,z)}}async prompt(z,H={}){if(B.setCurrentSession(this.id),!this.agent||!this.runtime)throw Error("Session not initialized");let J=this.resolvePrompt(z.prompt);if(this.pendingPrompt){if(/^\/goal(?:\s|$)/i.test(J.trim()))return this.handleSlashCommand(J,this.pendingPrompt.signal);let X=await this.runtime.enqueueSteering(J,{allowBeforeTurn:!0});if(!X.accepted)throw Error(X.reason==="queue_full"?"Active turn steering queue is full":"Active turn is no longer steerable");if(V.debug(`[AcpSession ${this.id}] Queued steering for active turn (${X.queued})`),X.delivery==="next_turn")this.schedulePendingResume();return{stopReason:"end_turn"}}let Q=new AbortController;this.pendingPrompt=Q;try{if(V.debug(`[AcpSession ${this.id}] Received prompt: ${J.slice(0,100)}...`),b(J))return await this.handleSlashCommand(J,Q.signal);let X={sessionId:this.id,userId:"acp-user",workspaceRoot:this.cwd,messages:[...this.messages],signal:Q.signal,permissionMode:this.mapModeToPermissionMode(),confirmationHandler:{requestConfirmation:async(Y)=>{return this.requestPermission(Y)}}};if(await K(this.agent.chatStream(J,X,{pendingInputOnly:H.pendingInputOnly,goalContinuationOnly:H.goalContinuationOnly}),async(Y)=>{switch(Y.kind){case"content_delta":this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Y.delta}});break;case"thinking_delta":this.sendUpdate({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:Y.delta}});break;case"tool_start":{let Z=Y.toolCall,$="function"in Z?Z.function.name:Z.type,U=this.mapToolKind(Y.toolKind),W=`Executing ${$}`;if($==="Task"&&"function"in Z)try{let G=JSON.parse(Z.function.arguments),D=G.resume_from??G.resume;if(typeof D==="string")W=`Resuming ${String(G.subagent_type||"subagent")} from ${D}`}catch{}this.sendUpdate({sessionUpdate:"tool_call",toolCallId:Z.id,status:"in_progress",title:W,content:[],kind:U});break}case"tool_result":{let{toolCall:Z,result:$}=Y,U=[],W=$.metadata;if(W?.kind==="edit"&&typeof W.file_path==="string"&&typeof W.oldContent==="string"&&(typeof W.newContent==="string"||W.newContent===void 0))U.push({type:"diff",path:W.file_path,oldText:W.oldContent,newText:W.newContent??null});else{let D="function"in Z?Z.function.name:Z.type,F=q(h(D,$));U.push({type:"content",content:{type:"text",text:F}})}let G=$.success?"completed":"failed";this.sendUpdate({sessionUpdate:"tool_call_update",toolCallId:Z.id,status:G,content:U});break}case"task_update":this.sendPlanUpdate(Y.tasks);break;case"steering_applied":break;case"follow_up_started":for(let Z of Y.messages){if(!Z.recovered||Z.persisted)continue;for(let $ of y(Z.content))this.sendUpdate({sessionUpdate:"user_message_chunk",content:$})}if(Y.recovered>0)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[Resuming ${Y.recovered} queued instruction${Y.recovered===1?"":"s"} recovered after restart]
2
- `}});break;case"goal_updated":if(Y.goal&&Y.goal.status!=="active")this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[Goal ${Y.goal.status}: ${Y.goal.objective}]
3
- `}});break;case"goal_continuation_started":break;default:break}}),this.messages=[...X.messages],Q.signal.aborted)return{stopReason:"cancelled"};return{stopReason:"end_turn"}}catch(X){if(Q.signal.aborted||X instanceof Error&&X.name==="AbortError")return{stopReason:"cancelled"};throw V.error(`[AcpSession ${this.id}] Prompt error:`,X),X}finally{if(this.pendingPrompt===Q){if(this.pendingPrompt=null,!this.destroyed&&this.pendingResumeRequested)this.schedulePendingResume()}}}schedulePendingResume(){if(this.destroyed||this.connection.signal.aborted)return;this.pendingResumeRequested=!0,queueMicrotask(()=>{this.resumePendingIfIdle()})}async resumePendingIfIdle(){if(this.destroyed||this.connection.signal.aborted)return;if(this.pendingPrompt||!this.runtime||!this.agent)return;let z=this.runtime.getPendingSteeringCount()>0,J=(z?null:await this.runtime.getGoal())?.status==="active";if(!z&&!J){this.pendingResumeRequested=!1;return}this.pendingResumeRequested=!1,await this.prompt({sessionId:this.id,prompt:[]},{pendingInputOnly:z,goalContinuationOnly:J}).catch((Q)=>{V.error(`[AcpSession ${this.id}] Failed to resume pending input:`,Q)})}cancel(){if(V.info(`[AcpSession ${this.id}] Cancel requested`),this.pendingResumeRequested=!1,this.pendingPrompt)this.pendingPrompt.abort(),this.pendingPrompt=null,V.info(`[AcpSession ${this.id}] Cancelled successfully`);else V.warn(`[AcpSession ${this.id}] No pending prompt to cancel`)}async setMode(z){let H=["default","auto-edit","yolo","plan"];this.mode=H.includes(z)?z:"default",V.info(`[AcpSession ${this.id}] Mode set to: ${this.mode}`),this.sendUpdate({sessionUpdate:"current_mode_update",currentModeId:this.mode})}mapModeToPermissionMode(){switch(this.mode){case"yolo":return"yolo";case"auto-edit":return"autoEdit";case"plan":return"plan";case"default":default:return"default"}}shouldAutoApprove(z){switch(this.mode){case"yolo":return!0;case"auto-edit":return z==="readonly"||z==="write";case"plan":return z==="readonly";case"default":default:return!1}}async setModel(z){if(V.info(`[AcpSession ${this.id}] Model set to: ${z}`),this.pendingPrompt)throw Error("Cannot switch models while a prompt is active");if(!this.agent)throw Error("Session not initialized");await this.agent.switchModel(z)}async destroy(){if(this.destroyed)return;if(this.destroyed=!0,this.availableCommandsTimer!==null)clearTimeout(this.availableCommandsTimer),this.availableCommandsTimer=null;let z=this.agent,H=this.runtime;this.agent=null,this.runtime=null;let J,Q=async(X)=>{try{await X()}catch(Y){J??=Y}};if(await Q(()=>this.cancel()),z)await Q(()=>z.destroy());if(H)await Q(()=>H.dispose());if(await Q(()=>B.destroySession(this.id)),V.debug(`[AcpSession ${this.id}] Destroyed`),J!==void 0)throw J}resolvePrompt(z){let H=[];for(let J of z)if(J.type==="text")H.push(J.text);else if(J.type==="image")H.push(`[Image: ${J.mimeType}]`);else if(J.type==="resource"){let Q=J.resource;if("text"in Q)H.push(`<file path="${Q.uri}">
4
- ${Q.text}
5
- </file>`)}else if(J.type==="resource_link")H.push(`[Resource: ${J.uri}]`);return H.join(`
6
- `)}canSendUpdates(){return!this.destroyed&&!this.connection.signal.aborted}async sendUpdateAndWait(z){if(!this.canSendUpdates())return!1;return await this.connection.sessionUpdate({sessionId:this.id,update:z}),this.canSendUpdates()}sendUpdate(z){if(!this.canSendUpdates())return;let H={sessionId:this.id,update:z};this.connection.sessionUpdate(H).catch((J)=>{V.warn(`[AcpSession ${this.id}] Failed to send update:`,J)})}sendPlanUpdate(z){let H=z.map((J)=>({content:J.subject,priority:J.priority,status:J.status}));V.debug(`[AcpSession ${this.id}] Sending plan update with ${H.length} entries`),this.sendUpdate({sessionUpdate:"plan",entries:H})}async requestPermission(z){let H=this.pendingPrompt?.signal;if(z.type==="askUserQuestion")return this.requestUserQuestions(z,H);let J=z.kind?.toLowerCase()||"execute";if(this.shouldAutoApprove(J))return V.debug(`[AcpSession ${this.id}] Auto-approving ${J} in mode: ${this.mode}`),{approved:!0};if(this.mode==="plan"&&(J==="write"||J==="execute"))return V.debug(`[AcpSession ${this.id}] Rejecting ${J} in plan mode`),{approved:!1,reason:"Write and execute operations are not allowed in Plan mode"};try{let Q=O(),X=[];if(z.message)X.push({type:"content",content:{type:"text",text:z.message}});if(z.risks&&z.risks.length>0)X.push({type:"content",content:{type:"text",text:`Risks:
7
- - ${z.risks.join(`
8
- - `)}`}});let Y=this.mapToolKind(J),Z={sessionId:this.id,options:[{optionId:"allow_once",name:"Allow once",kind:"allow_once"},{optionId:"allow_always",name:"Always allow",kind:"allow_always"},{optionId:"reject_once",name:"Deny once",kind:"reject_once"},{optionId:"reject_always",name:"Always deny",kind:"reject_always"}],toolCall:{toolCallId:Q,status:"pending",title:z.title||"Permission Required",content:X,kind:Y}},$=await this.waitForClientInteraction(this.connection.requestPermission(Z),H);if(!$)return{approved:!1,reason:j};let U=$.outcome;if(U.outcome==="cancelled")return{approved:!1,reason:"User cancelled the permission request"};let W=U.optionId;if(W==="allow_always")return{approved:!0,scope:"project"};if(W==="reject_always")return{approved:!1,scope:"project",reason:"User permanently denied the permission request"};let G=W==="allow_once";return{approved:G,scope:"once",reason:G?void 0:"User denied the operation"}}catch(Q){return V.warn(`[AcpSession ${this.id}] Permission request failed:`,Q),{approved:!1,reason:"Permission request failed"}}}async requestUserQuestions(z,H){let J=z.questions??[];if(J.length===0)return{approved:!1,reason:"No structured questions were provided"};if(J.some((X)=>X.multiSelect))return{approved:!1,reason:"ACP does not support multi-select question responses"};let Q={};try{for(let[X,Y]of J.entries()){let Z=Y.options.map((G,D)=>`answer:${X}:${D}`),$=`answer:${X}:cancel`,U=await this.waitForClientInteraction(this.connection.requestPermission({sessionId:this.id,options:[...Y.options.map((G,D)=>({optionId:Z[D],name:G.label,kind:"allow_once"})),{optionId:$,name:"Cancel",kind:"reject_once"}],toolCall:{toolCallId:O(),status:"pending",title:Y.header,kind:"think",content:[{type:"content",content:{type:"text",text:[Y.question,...Y.options.map((G)=>`${G.label}: ${G.description}`)].join(`
9
- `)}}]}}),H);if(!U)return{approved:!1,reason:j};if(U.outcome.outcome!=="selected")return{approved:!1,reason:"User cancelled the question prompt"};let W=Z.indexOf(U.outcome.optionId);if(W<0)return{approved:!1,reason:"User cancelled the question prompt"};Q[Y.header]=Y.options[W].label}return{approved:!0,answers:Q}}catch(X){return V.warn(`[AcpSession ${this.id}] Question request failed:`,X),{approved:!1,reason:"Question request failed"}}}async waitForClientInteraction(z,H){if(!H)return z;if(H.aborted)return;return new Promise((J,Q)=>{let X=!1,Y=($)=>{if(X)return;X=!0,H.removeEventListener("abort",Z),$()},Z=()=>Y(()=>J(void 0));if(H.addEventListener("abort",Z,{once:!0}),H.aborted)Z();z.then(($)=>Y(()=>J($)),($)=>Y(()=>Q($)))})}mapToolKind(z){return{readonly:"read",write:"edit",execute:"execute",read:"read",edit:"edit",delete:"delete",move:"move",search:"search",think:"think",fetch:"fetch"}[z||""]||"other"}}var w=L("Agent");class f{connection;sessions=new Map;sessionLoadQueues=new Map;clientCapabilities;destroyed=!1;constructor(z){this.connection=z}async initialize(z){return w.info("[BladeAgent] Initializing ACP connection"),w.debug(`[BladeAgent] Client capabilities: ${JSON.stringify(z.clientCapabilities)}`),this.clientCapabilities=z.clientCapabilities,{protocolVersion:g,agentCapabilities:{loadSession:!0,sessionCapabilities:{list:{},fork:{}},promptCapabilities:{image:!0,audio:!1,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0}}}}async authenticate(z){return}async newSession(z){this.assertNotDestroyed();let H=S("acp");w.info(`[BladeAgent] Creating new session: ${H}`),w.debug(`[BladeAgent] Session cwd: ${z.cwd||M()}`);let J=new _(H,z.cwd||M(),this.connection,this.clientCapabilities,{mcpServers:z.mcpServers});try{await J.initialize(),this.assertNotDestroyed()}catch(Q){throw await J.destroy().catch(()=>{return}),Q}return this.sessions.set(H,J),w.info(`[BladeAgent] Session ${H} created, scheduling available commands update`),J.sendAvailableCommandsDelayed(),this.buildChildSessionResponse(H)}async unstable_listSessions(z){if(z.cwd!=null&&!k.isAbsolute(z.cwd))throw Error("ACP session list cwd must be absolute");let H=await N.listSessionPage({cwd:z.cwd??void 0,cursor:z.cursor??void 0,limit:50,includeSubagents:!1});return{sessions:H.sessions.map((J)=>({sessionId:J.sessionId,cwd:J.projectPath,title:J.title??null,updatedAt:J.lastMessageTime})),nextCursor:H.nextCursor}}async unstable_forkSession(z){if(this.assertNotDestroyed(),!k.isAbsolute(z.cwd))throw Error("ACP session fork cwd must be absolute");let H=await N.forkSession(z.sessionId,{sourceProjectPath:z.cwd,targetProjectPath:z.cwd});this.assertNotDestroyed();let J=new _(H.sessionId,z.cwd,this.connection,this.clientCapabilities,{initialMessages:H.messages,mcpServers:z.mcpServers});try{await J.initialize(),this.assertNotDestroyed()}catch(Q){throw await J.destroy().catch(()=>{return}),Q}return this.sessions.set(H.sessionId,J),J.sendAvailableCommandsDelayed(),this.buildChildSessionResponse(H.sessionId)}async loadSession(z){this.assertNotDestroyed(),w.info(`[BladeAgent] Loading session: ${z.sessionId}`);let J=(this.sessionLoadQueues.get(z.sessionId)??Promise.resolve()).then(()=>this.replaceSession(z)),Q=J.then(()=>{return},()=>{return});this.sessionLoadQueues.set(z.sessionId,Q);try{return await J}finally{if(this.sessionLoadQueues.get(z.sessionId)===Q)this.sessionLoadQueues.delete(z.sessionId)}}async replaceSession(z){this.assertNotDestroyed();let H=this.sessions.get(z.sessionId);if(H)try{await H.destroy()}finally{if(this.sessions.get(z.sessionId)===H)this.sessions.delete(z.sessionId)}let J=await N.loadSession(z.sessionId,z.cwd),Q=new _(z.sessionId,z.cwd,this.connection,this.clientCapabilities,{initialMessages:J,mcpServers:z.mcpServers});try{await Q.initialize(),await Q.replayHistory(),this.assertNotDestroyed()}catch(X){throw await Q.destroy().catch(()=>{return}),X}return this.sessions.set(z.sessionId,Q),Q.sendAvailableCommandsDelayed(),this.buildSessionSetup()}buildChildSessionResponse(z){return{sessionId:z,...this.buildSessionSetup()}}assertNotDestroyed(){if(this.destroyed)throw Error("BladeAgent is destroyed")}buildSessionSetup(){let z=I(),H=z?.models||[],J=z?.currentModelId||H[0]?.id,Q=H.map((Y)=>({modelId:Y.id,name:Y.name||Y.id,description:Y.provider?`Provider: ${Y.provider}`:void 0}));return{modes:{availableModes:[{id:"default",name:"Default",description:"Ask for confirmation before all file edits and commands"},{id:"auto-edit",name:"Auto Edit",description:"Auto-approve file edits, ask for shell commands"},{id:"yolo",name:"Full Auto",description:"Auto-approve everything without confirmation"},{id:"plan",name:"Plan Only",description:"Read-only mode, no file changes or commands"}],currentModeId:"default"},models:Q.length>0?{availableModels:Q,currentModelId:J}:void 0}}async prompt(z){let H=this.sessions.get(z.sessionId);if(!H)throw Error(`Session not found: ${z.sessionId}`);return H.prompt(z)}async cancel(z){w.info(`[BladeAgent] Cancel notification received for session: ${z.sessionId}`);let H=this.sessions.get(z.sessionId);if(H)w.info("[BladeAgent] Found session, calling session.cancel()"),H.cancel();else w.warn(`[BladeAgent] Session not found for cancel: ${z.sessionId}`)}async setSessionMode(z){w.info(`[BladeAgent] Setting session mode: ${z.modeId}`);let H=this.sessions.get(z.sessionId);if(H)await H.setMode(z.modeId);return{}}async unstable_setSessionModel(z){w.info(`[BladeAgent] Setting session model: ${z.modelId}`);let H=this.sessions.get(z.sessionId);if(!H)throw Error(`Session not found: ${z.sessionId}`);return await H.setModel(z.modelId),{}}async destroy(){this.destroyed=!0,await Promise.all([...this.sessionLoadQueues.values()]),this.sessionLoadQueues.clear();let z;for(let H of this.sessions.values())try{await H.destroy()}catch(J){z??=J}this.sessions.clear();try{await C.getInstance().disconnectAll()}catch(H){z??=H}if(z!==void 0)throw z}}async function Fz(){let z=p.toWeb(process.stdout),H=d.toWeb(process.stdin),J=P.ndJsonStream(z,H);await new P.AgentSideConnection((X)=>new f(X),J).closed}export{Fz as runAcpIntegration};
@@ -1,2 +0,0 @@
1
- var s={name:"blade-code",version:"0.7.8",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=20.0.0"},optionalDependencies:{"@vscode/ripgrep":"^1.17.0","bun-pty":"^0.4.8","node-pty":"1.0.0"},dependencies:{"@agentclientprotocol/sdk":"^0.12.0","@ai-sdk/anthropic":"^3.0.7","@ai-sdk/azure":"^3.0.5","@ai-sdk/deepseek":"^2.0.4","@ai-sdk/google":"^3.0.4","@ai-sdk/openai":"^3.0.26","@ai-sdk/openai-compatible":"^2.0.4","@anthropic-ai/sandbox-runtime":"0.0.67","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.17.4",ahooks:"^3.9.6",ai:"^6.0.39","ansi-escapes":"^7.2.0","async-mutex":"^0.5.0",axios:"^1.12.2",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.1.0","gray-matter":"^4.0.3",hono:"^4.7.10",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.17.21",lowlight:"^3.3.0","lru-cache":"^11.2.4",nanoid:"^5.1.6",open:"^10.1.2",openai:"^6.2.0",picomatch:"^4.0.3",react:"^19.1.1","react-dom":"^19.1.1",semver:"^7.7.3","string-width":"^8.1.0",undici:"^7.16.0","write-file-atomic":"^7.0.0",ws:"^8.18.0",yaml:"^2.8.1",yargs:"^18.0.0",zod:"^3.24.2","zod-to-json-schema":"^3.24.6",zustand:"^5.0.9"},devDependencies:{"@biomejs/biome":"^2.2.4","@types/bun":"^1.3.4","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.2","@types/react":"^19.1.1","@types/react-dom":"^19.1.1","@types/semver":"^7.7.1","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.5.12","@types/yargs":"^17.0.33","@vitest/coverage-v8":"^3.0.0",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^3.0.0"}};function r(){return{name:s.name,version:s.version,description:s.description}}function n(){return s.version}function o(){return s.name}function c(){return s.description}function a(){return`v${s.version}`}function d(){return`v${s.version} © 2025 Blade Code`}
2
- export{r as Ia,n as Ja,o as Ka,c as La,a as Ma,d as Na};
@@ -1,2 +0,0 @@
1
- import{ba as V}from"./chunk-g7caymjr.js";import{Cb as Q}from"./chunk-4dmdn3a9.js";import{z as k}from"zod";var Y=k.string().min(1).max(128).regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/),K=k.array(k.string().trim().min(1).max(200)).max(128).transform((F)=>[...new Set(F)]),Z=k.object({description:k.string().trim().min(1).max(4096),prompt:k.string().trim().min(1).max(1e5),tools:K.optional(),disallowedTools:K.optional(),model:k.string().trim().min(1).max(200).optional(),permissionMode:k.enum(["default","acceptEdits","dontAsk","bypassPermissions","plan","ignore"]).optional(),maxTurns:k.number().int().positive().max(Q).optional(),isolation:k.enum(["none","worktree"]).optional()}).strict();function y(F){let w;try{w=JSON.parse(F)}catch{throw Error("Invalid JSON provided to --agents")}if(w===null||Array.isArray(w)||typeof w!=="object")throw Error("--agents must be a JSON object");let H=Object.entries(w);if(H.length>64)throw Error("--agents supports at most 64 definitions");return H.map(([B,W])=>{if(!Y.safeParse(B).success)throw Error(`Invalid --agents name "${B}": use letters, numbers, hyphens, or underscores`);let I=Z.safeParse(W);if(!I.success)throw Error(`Invalid --agents definition for "${B}"`);let q=I.data;return{name:B,description:q.description,systemPrompt:q.prompt,tools:q.tools,disallowedTools:q.disallowedTools,model:q.model,permissionMode:q.permissionMode===void 0?void 0:V(q.permissionMode),maxTurns:q.maxTurns,isolation:q.isolation,source:"flag"}})}
2
- export{y};
@@ -1,26 +0,0 @@
1
- import{Bb as V,Db as E,Eb as L}from"./chunk-4dmdn3a9.js";import{Zb as x}from"./chunk-a7yjnqhd.js";var G={currentModelId:"",models:[],temperature:0,maxContextTokens:128000,maxOutputTokens:void 0,stream:!0,topP:0.9,topK:50,timeout:180000,theme:"dracula",uiTheme:"system",language:"zh-CN",fontSize:14,autoSaveSessions:!0,notifyBuild:!0,notifyErrors:!1,notifySounds:!1,privacyTelemetry:!1,privacyCrash:!0,debug:!1,mcpEnabled:!1,mcpServers:{},permissions:{allow:["Bash(pwd)","Bash(which *)","Bash(whoami)","Bash(hostname)","Bash(uname *)","Bash(date)","Bash(echo *)","Bash(ls *)","Bash(tree *)","Bash(git status)","Bash(git status -*)","Bash(git log *)","Bash(git diff *)","Bash(git show *)","Bash(git branch -* *)","Bash(git branch)","Bash(git tag -l *)","Bash(git tag --list *)","Bash(git stash list *)","Bash(git stash show *)","Bash(git rev-parse *)","Bash(git describe *)","Bash(git blame *)","Bash(git ls-files *)","Bash(git config --get *)","Bash(git config --list *)","Bash(git shortlog *)","Bash(git merge-base *)","Bash(git cat-file *)","Bash(git for-each-ref *)","Bash(git grep *)","Bash(git worktree list *)","Bash(git reflog show *)","Bash(git reflog)","Bash(git rev-list *)","Bash(git ls-remote *)","Bash(git remote -v)","Bash(git remote --verbose)","Bash(git remote)","Bash(gh pr view *)","Bash(gh pr list *)","Bash(gh pr diff *)","Bash(gh pr checks *)","Bash(gh pr status *)","Bash(gh issue view *)","Bash(gh issue list *)","Bash(gh issue status *)","Bash(gh run list *)","Bash(gh run view *)","Bash(gh repo view *)","Bash(gh auth status)","Bash(npm list *)","Bash(bun pm ls *)","Bash(npm view *)","Bash(npm outdated *)","Bash(pnpm list *)","Bash(yarn list *)","Bash(pip list *)","Bash(pip show *)"],ask:["Bash(curl *)","Bash(wget *)","Bash(aria2c *)","Bash(axel *)","Bash(rm -rf *)","Bash(rm -r *)","Bash(rm --recursive *)","Bash(nc *)","Bash(netcat *)","Bash(telnet *)","Bash(ncat *)"],deny:["Read(./.env)","Read(./.env.*)","Bash(rm -rf /)","Bash(rm -rf /*)","Bash(sudo *)","Bash(chmod 777 *)","Bash(bash *)","Bash(sh *)","Bash(zsh *)","Bash(fish *)","Bash(dash *)","Bash(eval *)","Bash(source *)","Bash(mkfs *)","Bash(fdisk *)","Bash(dd *)","Bash(format *)","Bash(parted *)","Bash(open http*)","Bash(open https*)","Bash(xdg-open http*)","Bash(xdg-open https*)"]},permissionMode:"default",hooks:{enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,PreToolUse:[],PostToolUse:[],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]},env:{},disableAllHooks:!1,maxTurns:-1};import{promises as T}from"fs";import{merge as A}from"lodash-es";import R from"os";import $ from"path";var S={sonnet:"claude-sonnet-4-20250514",opus:"claude-opus-4-20250514",haiku:"claude-3-5-haiku-20241022",claude:"claude-sonnet-4-20250514",gpt4o:"gpt-4o",gpt4:"gpt-4o",o1:"o1",o3:"o3","o4-mini":"o4-mini",deepseek:"deepseek-chat","deepseek-v3":"deepseek-chat","deepseek-r1":"deepseek-reasoner","deepseek-v4":"deepseek-v4-0324",gemini:"gemini-2.5-pro",flash:"gemini-2.5-flash",qwen:"qwen3-235b-a22b","qwen-max":"qwen-max","qwen-plus":"qwen-plus"};function I(H){let q=H.toLowerCase().trim();return S[q]??H}class N{static instance=null;runtimePermissionOverrides;constructor(){}static getInstance(){if(!N.instance)N.instance=new N;return N.instance}static resetInstance(){N.instance=null}async initialize(H){try{this.runtimePermissionOverrides=H?.permissions;let q=await this.loadConfigFiles(),J=await this.loadSettingsFiles(),K={...q,...J};if(H)K=this.mergeSettings(K,H);let Q=this.normalizeConfig(K),W={...G,...Q};if(this.resolveEnvInterpolation(W),process.env.BLADE_MODEL&&W.models?.length>0){let X=I(process.env.BLADE_MODEL),Y=W.models.find((Z)=>Z.id===X||Z.model===X||Z.id===process.env.BLADE_MODEL||Z.model===process.env.BLADE_MODEL);if(Y)W.currentModelId=Y.id}if(process.env.BLADE_API_KEY&&W.models?.length>0){let X=W.models.find((Y)=>Y.id===W.currentModelId);if(X)X.apiKey=process.env.BLADE_API_KEY}if(process.env.BLADE_BASE_URL&&W.models?.length>0){let X=W.models.find((Y)=>Y.id===W.currentModelId);if(X)X.baseUrl=process.env.BLADE_BASE_URL}if(process.env.BLADE_DEBUG)W.debug=process.env.BLADE_DEBUG==="1"||process.env.BLADE_DEBUG==="true"||process.env.BLADE_DEBUG;if(W.debug)console.log("[ConfigManager] Configuration loaded successfully");return W}catch(q){return console.error("[ConfigManager] Failed to initialize:",q),G}}async loadConfigFiles(){let H=$.join(R.homedir(),".blade","config.json"),q=$.join(V(),".blade","config.json"),J={},K=await this.loadJsonFile(H);if(K)J={...J,...K};let Q=await this.loadJsonFile(q);if(Q){let W={...J.mcpServers||{},...Q.mcpServers||{}};if(J={...J,...Q},Object.keys(W).length>0)J.mcpServers=W}return J}async loadSettingsFiles(){let H=$.join(R.homedir(),".blade","settings.json"),q=$.join(V(),".blade","settings.json"),J=$.join(V(),".blade","settings.local.json"),K={},Q=await this.loadJsonFile(H);if(Q)K=this.mergeSettings(K,Q);let W=await this.loadJsonFile(q);if(W)K=this.mergeSettings(K,W);let X=await this.loadJsonFile(J);if(X)K=this.mergeSettings(K,X);return K}async loadWorkspacePermissions(H,q){let J={allow:[...q.allow],ask:[...q.ask],deny:[...q.deny]};if($.resolve(H)!==$.resolve(V())){let Q=await this.loadWorkspacePermissionOverrides(V()),W=await this.loadJsonFile($.join(R.homedir(),".blade","settings.json")),X={allow:Array.from(new Set([...G.permissions.allow,...W?.permissions?.allow||[],...this.runtimePermissionOverrides?.allow||[]])),ask:Array.from(new Set([...G.permissions.ask,...W?.permissions?.ask||[],...this.runtimePermissionOverrides?.ask||[]])),deny:Array.from(new Set([...G.permissions.deny,...W?.permissions?.deny||[],...this.runtimePermissionOverrides?.deny||[]]))};for(let Y of["allow","ask","deny"]){let Z=new Set(Q[Y].filter((D)=>!X[Y].includes(D)));J[Y]=J[Y].filter((D)=>!Z.has(D))}}let K=await this.loadWorkspacePermissionOverrides(H);for(let Q of["allow","ask","deny"])J[Q]=Array.from(new Set([...J[Q],...K[Q]]));return J}async loadWorkspacePermissionOverrides(H){let q={allow:[],ask:[],deny:[]},J=[$.join(H,".blade","settings.json"),$.join(H,".blade","settings.local.json")];for(let K of J){let Q=await this.loadJsonFile(K);if(!Q?.permissions)continue;for(let W of["allow","ask","deny"])q[W]=Array.from(new Set([...q[W],...Q.permissions[W]||[]]))}return q}mergeSettings(H,q){let J={...JSON.parse(JSON.stringify(H)),...JSON.parse(JSON.stringify(q))};if(q.permissions)J.permissions={allow:Array.from(new Set([...H.permissions?.allow||[],...q.permissions.allow||[]])),ask:Array.from(new Set([...H.permissions?.ask||[],...q.permissions.ask||[]])),deny:Array.from(new Set([...H.permissions?.deny||[],...q.permissions.deny||[]]))};if(q.hooks)J.hooks=A({},J.hooks,q.hooks);if(q.env)J.env=A({},J.env,q.env);if(q.mcpServers)J.mcpServers={...J.mcpServers||{},...q.mcpServers};if(q.disableAllHooks!==void 0)J.disableAllHooks=q.disableAllHooks;if(q.permissionMode!==void 0)J.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)J.maxTurns=q.maxTurns;return J}resolveEnvInterpolation(H){let q=/\$\{?([A-Z_][A-Z0-9_]*)(:-([^}]+))?\}?/g,J=(Q)=>{if(typeof Q==="string")return Q.replace(q,(W,X,Y,Z)=>{return process.env[X]||Z||W});if(Array.isArray(Q))return Q.map(J);if(typeof Q==="object"&&Q!==null){let W=Q;for(let[X,Y]of Object.entries(W))W[X]=J(Y);return W}return Q},K=H;for(let[Q,W]of Object.entries(K))K[Q]=J(W)}async loadJsonFile(H){try{if(await this.fileExists(H)){let q=await T.readFile(H,"utf-8");return JSON.parse(q)}}catch(q){console.warn(`[ConfigManager] Failed to load ${H}:`,q)}return null}async fileExists(H){try{return await T.access(H),!0}catch{return!1}}normalizeConfig(H){let q=JSON.parse(JSON.stringify(H)),J=(Q)=>Q.trim().replace(/^`|`$/g,""),K=(Q)=>{for(let[W,X]of Object.entries(Q))if(typeof X==="string")Q[W]=J(X);else if(Array.isArray(X))X.forEach((Y,Z)=>{if(typeof Y==="string")X[Z]=J(Y);else if(typeof Y==="object"&&Y!==null)K(Y)});else if(typeof X==="object"&&X!==null)K(X)};return K(q),q}validateConfig(H){let q=[],J=[];if(!H.models||H.models.length===0)q.push("没有可用的模型配置");if(!E(H.maxTurns))q.push(`maxTurns 必须是 ${L()}`);if(H.models&&H.models.length>0){if(!H.currentModelId)q.push("未设置当前模型 ID");else if(!H.models.find((Q)=>Q.id===H.currentModelId))q.push(`当前模型 ID "${H.currentModelId}" 在 models 列表中不存在`);for(let K of H.models){let Q=`模型 "${K.name||K.id}"`;if(!K.apiKey)J.push(`${Q}: apiKey 为空`);if(!K.model)q.push(`${Q}: model 字段必填`);if(!K.provider)q.push(`${Q}: provider 字段必填`);if(K.baseUrl&&!K.baseUrl.startsWith("http"))J.push(`${Q}: baseUrl "${K.baseUrl}" 不是有效的 HTTP URL`)}}if(J.length>0)console.warn(`[ConfigManager] 配置警告:
2
- ${J.map((K)=>` ⚠ ${K}`).join(`
3
- `)}`);if(q.length>0)throw Error(`配置验证失败:
4
- ${q.map((K)=>` - ${K}`).join(`
5
- `)}
6
-
7
- `+`请通过以下方式之一提供配置:
8
- `+` 1. 首次启动: 运行 blade,系统会自动引导配置
9
- `+` 2. 添加模型: blade 后输入 /model add
10
- `+` 3. 初始化向导: 输入 /init
11
-
12
- `+`配置文件示例 (~/.blade/config.json):
13
- `+`{
14
- "currentModelId": "model-id-123",
15
- "models": [
16
- {
17
- "id": "model-id-123",
18
- `+` "name": "默认模型",
19
- `+` "provider": "openai-compatible",
20
- "apiKey": "your-api-key",
21
- "baseUrl": "https://api.example.com/v1",
22
- "model": "model-name"
23
- }
24
- ]
25
- }
26
- `)}}function b(H,q={}){let J={...H};if(q.debug!==void 0)J.debug=q.debug===""?!0:q.debug;if(q.model){if(!H.models.some((Q)=>Q.id===q.model))throw Error(`模型配置未找到: ${q.model}`);J.currentModelId=q.model}if(q.yolo===!0)J.permissionMode="yolo";else if(q.permissionMode!==void 0)J.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)J.maxTurns=q.maxTurns;return J.systemPrompt=q.systemPrompt,J.appendSystemPrompt=q.appendSystemPrompt,J.model=q.model,J.resumeSessionId=q.sessionId,J.forkSession=q.forkSession,J.allowedTools=q.allowedTools,J.disallowedTools=q.disallowedTools,J.mcpConfigPaths=q.mcpConfig,J.strictMcpConfig=q.strictMcpConfig,J.addDirs=q.addDir,J.outputFormat=q.outputFormat,J.inputFormat=q.inputFormat,J.print=q.print,J.includePartialMessages=q.includePartialMessages,J.replayUserMessages=q.replayUserMessages,J.agentsConfig=q.agents,J.settingSources=q.settingSources,J}import{promises as U}from"node:fs";import M from"node:os";import B from"node:path";import{Mutex as j}from"async-mutex";import{merge as y}from"lodash-es";import k from"write-file-atomic";var w=x("Service"),F={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxContextTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},Wq=new Set(Object.entries(F).filter(([H,q])=>q.persistable).map(([H])=>H)),Xq=new Set(Object.entries(F).filter(([H,q])=>!q.persistable).map(([H])=>H));class z{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!z.instance)z.instance=new z;return z.instance}static resetInstance(){if(z.instance)for(let H of z.instance.timers.values())clearTimeout(H);z.instance=null}async save(H,q={}){this.validatePersistableFields(H);let J=this.groupUpdatesByTarget(H,q.scope,q.projectDir);if(q.immediate)await Promise.all(Array.from(J.entries()).map(([K,Q])=>this.flushTarget(K,Q)));else for(let[K,Q]of J)this.scheduleSave(K,Q)}async flush(){for(let q of this.timers.values())clearTimeout(q);this.timers.clear();let H=Array.from(this.pendingUpdates.entries()).map(([q,J])=>this.flushTarget(q,J));this.pendingUpdates.clear(),await Promise.all(H)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(H,q={}){await this.appendPermissionRuleForDecision(H,"allow",q)}async appendPermissionDenyRule(H,q={}){await this.appendPermissionRuleForDecision(H,"deny",q)}async appendPermissionRuleForDecision(H,q,J){let K=J.scope??"local",Q=this.resolveFilePath("settings",K,J.projectDir);await this.flushTargetWithModifier(Q,(W)=>{let X=W.permissions??{allow:[],ask:[],deny:[]},Y={allow:q==="allow"?this.dedupeArray([...X.allow||[],H]):X.allow||[],ask:X.ask||[],deny:q==="deny"?this.dedupeArray([...X.deny||[],H]):X.deny||[]};return{...W,permissions:Y}})}async appendLocalPermissionRule(H,q={}){await this.appendPermissionRule(H,{...q,scope:"local"})}async appendLocalPermissionDenyRule(H,q={}){await this.appendPermissionDenyRule(H,{...q,scope:"local"})}validatePersistableFields(H){for(let q of Object.keys(H)){let J=F[q];if(!J)throw Error(`Unknown config field: ${q}`);if(!J.persistable)throw Error(`Field "${q}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(H,q,J){let K=new Map;for(let[Q,W]of Object.entries(H)){let X=F[Q];if(!X)continue;let Y=q??X.defaultScope,Z=this.resolveFilePath(X.target,Y,J);if(!K.has(Z))K.set(Z,{});K.get(Z)[Q]=W}return K}resolveFilePath(H,q,J){let K=J??V();if(H==="config")return q==="global"?B.join(M.homedir(),".blade","config.json"):B.join(K,".blade","config.json");switch(q){case"local":return B.join(K,".blade","settings.local.json");case"project":return B.join(K,".blade","settings.json");case"global":return B.join(M.homedir(),".blade","settings.json");default:return B.join(K,".blade","settings.local.json")}}scheduleSave(H,q){let J=this.pendingUpdates.get(H)??{},K=this.mergePendingUpdates(J,q);this.pendingUpdates.set(H,K);let Q=this.timers.get(H);if(Q)clearTimeout(Q);let W=setTimeout(async()=>{let X=this.pendingUpdates.get(H);if(X){this.pendingUpdates.delete(H),this.timers.delete(H);try{await this.flushTarget(H,X),this.lastSaveError=null}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));this.lastSaveError=Z,w.error(`Failed to save config to ${H}:`,Z.message),w.error("Stack trace:",Z.stack)}}},this.debounceDelay);this.timers.set(H,W)}mergePendingUpdates(H,q){let J={...H};for(let[K,Q]of Object.entries(q)){let W=F[K];if(!W){J[K]=Q;continue}switch(W.mergeStrategy){case"replace":J[K]=Q;break;case"append-dedupe":this.applyAppendDedupe(J,K,Q);break;case"deep-merge":this.applyDeepMerge(J,K,Q);break}}return J}async flushTarget(H,q){let J=this.fileLocks.get(H);if(!J)J=new j,this.fileLocks.set(H,J);await J.runExclusive(async()=>{await this.performWrite(H,q)})}async flushTargetWithModifier(H,q){let J=this.fileLocks.get(H);if(!J)J=new j,this.fileLocks.set(H,J);await J.runExclusive(async()=>{await U.mkdir(B.dirname(H),{recursive:!0,mode:493});let K={};try{let W=await U.readFile(H,"utf-8");K=JSON.parse(W)}catch{K={}}let Q=q(K);await this.atomicWrite(H,Q)})}async performWrite(H,q){await U.mkdir(B.dirname(H),{recursive:!0,mode:493});let J={};try{let Q=await U.readFile(H,"utf-8");J=JSON.parse(Q)}catch{J={}}let K={...J};for(let[Q,W]of Object.entries(q)){let X=F[Q];if(!X){K[Q]=W;continue}switch(X.mergeStrategy){case"replace":K[Q]=W;break;case"append-dedupe":this.applyAppendDedupe(K,Q,W);break;case"deep-merge":this.applyDeepMerge(K,Q,W);break}}await this.atomicWrite(H,K)}applyAppendDedupe(H,q,J){if(q==="permissions"&&typeof J==="object"&&J!==null){let K=H[q]??{allow:[],ask:[],deny:[]},Q=J;H[q]={allow:this.dedupeArray([...K.allow||[],...Q.allow||[]]),ask:this.dedupeArray([...K.ask||[],...Q.ask||[]]),deny:this.dedupeArray([...K.deny||[],...Q.deny||[]])}}else if(Array.isArray(J)){let K=Array.isArray(H[q])?H[q]:[];H[q]=this.dedupeArray([...K,...J])}else H[q]=J}applyDeepMerge(H,q,J){if(typeof J==="object"&&J!==null&&!Array.isArray(J)){let K=typeof H[q]==="object"&&H[q]!==null?H[q]:{};H[q]=y({},K,J)}else H[q]=J}dedupeArray(H){return Array.from(new Set(H))}async atomicWrite(H,q){await k(H,JSON.stringify(q,null,2),{mode:384,encoding:"utf-8"})}}function C(){return z.getInstance()}export{G as Ea,N as Fa,b as Ga,C as Ha};
@@ -1,6 +0,0 @@
1
- import{p as A,q as E,r as N,s as f}from"./chunk-g6ted982.js";import{t as D}from"./chunk-s4mke0t6.js";import{v as L,w as _,x}from"./chunk-7r1hm0qz.js";import{y as B}from"./chunk-qnevwq1q.js";import{L as $,T as b}from"./chunk-4745ktjj.js";import"./chunk-g7caymjr.js";import"./chunk-1w6tqkxd.js";import"./chunk-0e0z8yc1.js";import"./chunk-faq7ay4j.js";import"./chunk-r1spf93b.js";import"./chunk-phhmmybg.js";import{$a as Z}from"./chunk-48q9msfk.js";import"./chunk-jm2xhnrv.js";import"./chunk-2049tv49.js";import"./chunk-t70aqrm4.js";import{Ab as Y,Bb as T}from"./chunk-4dmdn3a9.js";import"./chunk-6kp3z956.js";import"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";import h from"yargs";import{hideBin as R}from"yargs/helpers";var w=new Set(Object.values(Y));function X(k){if(k&&w.has(k))return k;return}function M(k){return k.command("* [message]","Print response and exit (useful for pipes)",(F)=>F.positional("message",{describe:"Message to process",type:"string"}).option("p",{alias:"print",describe:"Print response and exit (useful for pipes)",type:"boolean"}).option("output-format",{describe:'Output format: "text", "json", "stream-json"',type:"string",default:"text"}).option("include-partial-messages",{describe:"Include partial message chunks as they arrive",type:"boolean"}).option("input-format",{describe:'Input format: "text", "stream-json"',type:"string",default:"text"}).option("model",{describe:"Model for the current session",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}),async(F)=>{if(!F.p)return;let q=await O(F);process.exit(q)})}async function O(k,F=process){let q;try{await A();let J=await E({message:k.message,_:k._,defaultMessage:"Hello"}),G=await N(J);if(G.mode==="output"){if(G.content)F.stdout.write(`${G.content}
2
- `);return G.exitCode??0}let Q=G.content,{sessionId:K,messages:U}=await f({sessionId:k.sessionId,continue:k.continue,resume:k.resume,forkSession:k.forkSession,fallbackSessionPrefix:"print"});q=await $.create({sessionId:K,workspaceRoot:T(),modelId:k.model,mcpConfig:k.mcpConfig,strictMcpConfig:k.strictMcpConfig,agents:k.agents?B(k.agents):void 0});let V=await b.createWithRuntime(q,{sessionId:K,systemPrompt:k.systemPrompt,appendSystemPrompt:k.appendSystemPrompt,maxTurns:k.maxTurns,modelId:k.model,permissionMode:X(k.permissionMode),toolWhitelist:k.allowedTools,toolBlacklist:k.disallowedTools,mcpConfig:k.mcpConfig,strictMcpConfig:k.strictMcpConfig}),H=(await Z(V.chatStream(Q,{messages:[...U],userId:"cli-user",sessionId:K,workspaceRoot:T(),permissionMode:X(k.permissionMode)}))).finalMessage||"";if(k.outputFormat==="json")F.stdout.write(`${JSON.stringify({response:H,input:Q,model:k.model,timestamp:new Date().toISOString()},null,2)}
3
- `);else if(k.outputFormat==="stream-json")F.stdout.write(`${JSON.stringify({type:"response",content:H})}
4
- `);else F.stdout.write(`${H}
5
- `);return 0}catch(J){return F.stderr.write(`Error: ${J instanceof Error?J.message:"未知错误"}
6
- `),1}finally{await q?.dispose()}}async function d(){if(process.argv.slice(2).findIndex((q)=>q==="--print"||q==="-p")===-1)return!1;try{let{print:q,"output-format":J,"include-partial-messages":G,"input-format":Q,"system-prompt":K,"append-system-prompt":U,"max-turns":V,...W}=D,H=h(R(process.argv)).scriptName("blade").strict(!1).options(W).middleware([_,L,x]);return M(H),await H.parse(),!0}catch(q){console.error(`Print mode error: ${q instanceof Error?q.message:"未知错误"}`),process.exit(1)}}export{O as runPrint,d as handlePrintMode};
@@ -1,6 +0,0 @@
1
- import{p as v,q as u,r as m,s as l}from"./chunk-g6ted982.js";import{t as g}from"./chunk-s4mke0t6.js";import{v as z,w as p,x as d}from"./chunk-7r1hm0qz.js";import{y as c}from"./chunk-qnevwq1q.js";import{L as C,P as E,Q as S,S as W,T as h}from"./chunk-4745ktjj.js";import"./chunk-g7caymjr.js";import"./chunk-1w6tqkxd.js";import"./chunk-0e0z8yc1.js";import"./chunk-faq7ay4j.js";import"./chunk-r1spf93b.js";import"./chunk-phhmmybg.js";import{$a as y}from"./chunk-48q9msfk.js";import"./chunk-jm2xhnrv.js";import"./chunk-2049tv49.js";import"./chunk-t70aqrm4.js";import{Ab as F,Bb as L,Cb as w}from"./chunk-4dmdn3a9.js";import"./chunk-6kp3z956.js";import"./chunk-a7yjnqhd.js";import"./chunk-f9ybv4ph.js";import Mq from"yargs";import{hideBin as Rq}from"yargs/helpers";import{z as X}from"zod";import{z as Y}from"zod";var k=1,_=Y.object({event_version:Y.literal(k)}),t=_.extend({type:Y.literal("content_delta"),delta:Y.string()}),e=_.extend({type:Y.literal("thinking_delta"),delta:Y.string()}),qq=_.extend({type:Y.literal("thinking"),content:Y.string()}),Qq=_.extend({type:Y.literal("stream_end")}),Yq=_.extend({type:Y.literal("content"),content:Y.string()}),Zq=_.extend({type:Y.literal("tool_start"),tool_name:Y.string(),summary:Y.string(),target:Y.string().optional(),tool_kind:Y.enum(["readonly","write","execute"]).optional()}),$q=_.extend({type:Y.literal("tool_result"),tool_name:Y.string(),summary:Y.string(),target:Y.string().optional(),tool_kind:Y.enum(["readonly","write","execute"]).optional(),success:Y.boolean().optional(),error_type:Y.string().optional(),error_message:Y.string().optional()}),Gq=_.extend({type:Y.literal("phase"),phase:Y.enum(["turn","searching","inspecting","target_hit","executing","completed"]),status:Y.enum(["ongoing","hit","done"]),message:Y.string(),turn:Y.number().optional(),tool_name:Y.string().optional(),target:Y.string().optional()}),Xq=_.extend({type:Y.literal("tool_detail"),tool_name:Y.string(),detail:Y.string()}),Uq=_.extend({type:Y.literal("task_update"),tasks:Y.array(W)}),Kq=_.extend({type:Y.literal("subagent"),state:Y.enum(["spawned","completed"]),session_id:Y.string(),subagent_type:Y.string().optional(),success:Y.boolean().optional(),summary:Y.string().optional(),resumed_from:Y.string().optional(),root_agent_id:Y.string().optional(),resume_depth:Y.number().int().nonnegative().optional()}),Vq=_.extend({type:Y.literal("token_usage"),input_tokens:Y.number(),output_tokens:Y.number(),total_tokens:Y.number(),max_context_tokens:Y.number()}),Dq=_.extend({type:Y.literal("compacting"),state:Y.enum(["started","completed"])}),bq=_.extend({type:Y.literal("turn_limit"),turns_count:Y.number(),action:Y.literal("continue")}),_q=_.extend({type:Y.literal("output"),content:Y.string(),exit_code:Y.number()}),Aq=_.extend({type:Y.literal("error"),message:Y.string()}),wq=Y.discriminatedUnion("type",[t,e,qq,Qq,Yq,Zq,$q,Gq,Xq,Uq,Kq,Vq,Dq,bq,_q,Aq]);function H(Q,$){return{event_version:k,type:Q,...$}}function jq(Q){if(Q?.signal)return{signal:Q.signal,dispose:()=>{return}};let $=new AbortController,G=()=>$.abort("interrupt");return process.once("SIGINT",G),process.once("SIGTERM",G),{signal:$.signal,dispose:()=>{process.removeListener("SIGINT",G),process.removeListener("SIGTERM",G)}}}var fq=X.enum(["text","jsonl"]),Iq=X.object({headless:X.boolean().optional(),message:X.string().optional(),_:X.array(X.union([X.string(),X.number()])).optional(),model:X.string().optional(),systemPrompt:X.string().optional(),appendSystemPrompt:X.string().optional(),maxTurns:X.number().int().max(w).refine((Q)=>Q===-1||Q>0,{message:"must be -1 or a positive integer"}).optional(),permissionMode:X.nativeEnum(F).optional(),mcpConfig:X.array(X.string()).optional(),strictMcpConfig:X.boolean().optional(),sessionId:X.string().optional(),allowedTools:X.array(X.string()).optional(),disallowedTools:X.array(X.string()).optional(),agents:X.string().optional(),continue:X.boolean().optional(),resume:X.union([X.string(),X.boolean()]).optional(),forkSession:X.boolean().optional(),outputFormat:fq.optional()});class i{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened(Q){this.openedThinking=Q}hasOpenThinking(){return this.openedThinking}completeStream(){let Q={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,Q}}function Bq(Q){return Q.issues.map(($)=>`${$.path.join(".")||"options"}: ${$.message}`).join("; ")}function Jq(Q){let $=Iq.safeParse(Q);if(!$.success)throw Error(`Invalid headless options: ${Bq($.error)}`);return $.data}function Pq(Q){return Q.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",($)=>$.positional("message",{describe:"Message to process",type:"string"}).option("headless",{type:"boolean",describe:"Run full agent loop without Ink UI and print events to the terminal"}).option("model",{describe:"Model ID for this run",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}).option("output-format",{alias:["outputFormat"],choices:["text","jsonl"],describe:"Headless output format",type:"string"}),async($)=>{if(!$.headless)return;let G=await Hq($);process.exit(G)})}function A(Q,$=""){Q.write(`${$}
2
- `)}function xq(Q){return`[task] [${Q.status}] ${Q.subject}`}function Lq(){return{requestConfirmation:async(Q)=>({approved:!0,reason:"headless-auto-approved",scope:"session"})}}function Nq(Q){if(!(Q instanceof Error))return"Unknown error";let q=Q.lastError??Q;if(q.responseBody)try{let V=JSON.parse(q.responseBody)?.error?.message;if(V)return q.statusCode?`${V} (HTTP ${q.statusCode})`:V}catch{}let Z=Q.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return Q.message}function Wq(Q){return Q==="jsonl"?"jsonl":"text"}function T(Q,$){let G=(...q)=>{for(let Z of q){let b=$[Z];if(typeof b==="string"&&b.trim()!=="")return b}return};switch(Q){case"Read":case"Edit":case"Write":case"UndoEdit":return G("file_path");case"NotebookEdit":return G("notebook_path");case"Grep":return G("path","pattern");case"Glob":return G("pattern");case"WebFetch":return G("url");case"WebSearch":return G("query");case"Bash":return G("command","description");case"Task":return G("description");case"LSP":return G("filePath","operation");case"EnterWorktree":return G("name");case"ExitWorktree":return G("action");default:return}}function kq(Q,$,G,q){let Z=new Set(["Glob","Grep","WebSearch","LS"]),b=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","NotebookEdit","Bash","LSP","UndoEdit","EnterWorktree","ExitWorktree"]).has(Q)&&!q.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${$}`,shouldLockTarget:!0};if(q.targetLocked)return{phase:"executing",status:"hit",message:G?`Working within target: ${$}`:`Executing: ${$}`,shouldLockTarget:!1};if(Z.has(Q))return{phase:"searching",status:"ongoing",message:`Still searching: ${$}`,shouldLockTarget:!1};if(b.has(Q))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${$}`,shouldLockTarget:!1};return{phase:"executing",status:q.targetLocked?"hit":"ongoing",message:`Executing: ${$}`,shouldLockTarget:!1}}function O(Q,$){let G=(q,Z)=>{Q.stdout.write(`${JSON.stringify(H(q,Z))}
3
- `)};return{contentDelta(q){if($==="jsonl"){G("content_delta",{delta:q});return}Q.stdout.write(q)},thinkingDelta(q,Z){if($==="jsonl")return G("thinking_delta",{delta:q}),Z;if(!Z)Q.stderr.write("[thinking] ");return Q.stderr.write(q),!0},thinking(q){if($==="jsonl"){G("thinking",{content:q});return}A(Q.stderr,`[thinking] ${q}`)},streamEnd(q,Z){if($==="jsonl"){G("stream_end",{});return}if(Z)Q.stderr.write(`
4
- `);if(q)Q.stdout.write(`
5
- `)},content(q){if($==="jsonl"){G("content",{content:q});return}A(Q.stdout,q)},toolStart(q,Z,b,V){if($==="jsonl"){G("tool_start",{tool_name:q,summary:Z,target:b,tool_kind:V});return}A(Q.stderr,`[tool:start] ${Z}`)},toolResult(q,Z,b,V,M){if($==="jsonl"){G("tool_result",{tool_name:q,summary:Z,target:b,tool_kind:V,success:M?.success,error_type:M?.errorType,error_message:M?.errorMessage});return}A(Q.stderr,`[tool:result] ${Z}`)},phase(q,Z,b,V={}){if($==="jsonl"){G("phase",{phase:q,status:Z,message:b,turn:V.turn,tool_name:V.toolName,target:V.target});return}A(Q.stderr,`[phase:${q}] ${b}`)},toolDetail(q,Z){if($==="jsonl"){G("tool_detail",{tool_name:q,detail:Z});return}A(Q.stderr,Z)},taskUpdate(q){if($==="jsonl"){G("task_update",{tasks:q});return}for(let Z of q)A(Q.stderr,xq(Z))},subagent(q){let Z=q.kind==="subagent_spawned";if($==="jsonl"){G("subagent",{state:Z?"spawned":"completed",session_id:q.sessionId,subagent_type:Z?q.type:void 0,success:Z?void 0:q.success,summary:Z?void 0:q.summary,resumed_from:q.resumedFrom,root_agent_id:q.rootAgentId,resume_depth:q.resumeDepth});return}A(Q.stderr,`[subagent:${Z?"spawned":"completed"}] ${q.sessionId}${q.resumedFrom?` resumed from ${q.resumedFrom}`:""}`)},tokenUsage(q){if($==="jsonl"){G("token_usage",{input_tokens:q.inputTokens,output_tokens:q.outputTokens,total_tokens:q.totalTokens,max_context_tokens:q.maxContextTokens});return}A(Q.stderr,`[tokens] in=${q.inputTokens} out=${q.outputTokens} total=${q.totalTokens} / ${q.maxContextTokens}`)},compacting(q){if($==="jsonl"){G("compacting",{state:q?"started":"completed"});return}A(Q.stderr,q?"[context] compacting started":"[context] compacting completed")},turnLimit(q){if($==="jsonl"){G("turn_limit",{turns_count:q,action:"continue"});return}A(Q.stderr,`[turn-limit] continuing after ${q} turns`)},output(q,Z=0){if($==="jsonl"){G("output",{content:q,exit_code:Z});return}A(Z===0?Q.stdout:Q.stderr,q)},error(q){if($==="jsonl"){G("error",{message:q});return}A(Q.stderr,q)}}}async function Hq(Q,$={stdout:process.stdout,stderr:process.stderr},G){let q="text",Z=O($,q),b=new i,V={targetLocked:!1},M,R=jq(G);try{let K=Jq(Q);q=Wq(K.outputFormat),Z=O($,q),await v();let r=await u(K),j=await m(r);if(j.mode==="output"){if(j.content)Z.output(j.content,j.exitCode??0);return j.exitCode??0}let N=K.permissionMode??"yolo",{sessionId:P,messages:n}=await l({sessionId:K.sessionId,continue:K.continue,resume:K.resume,forkSession:K.forkSession,fallbackSessionPrefix:"headless"}),s={messages:[...n],userId:"cli-user",sessionId:P,workspaceRoot:L(),permissionMode:N,signal:R.signal,confirmationHandler:Lq()};M=await C.create({sessionId:P,workspaceRoot:L(),modelId:K.model,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig,agents:K.agents?c(K.agents):void 0});let o=K.maxTurns??M.getConfig().maxTurns,a=await h.createWithRuntime(M,{sessionId:P,systemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,maxTurns:K.maxTurns,modelId:K.model,permissionMode:N,toolWhitelist:K.allowedTools,toolBlacklist:K.disallowedTools,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig}),x=await y(a.chatStream(j.content,s,{stream:!0,signal:R.signal,maxTurns:K.maxTurns,...o===-1?{onTurnLimitReached:async(D)=>{return Z.turnLimit(D.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}:{}}),async(D)=>{switch(D.kind){case"content_delta":b.markAssistantContent(),Z.contentDelta(D.delta);break;case"thinking_delta":b.setThinkingOpened(Z.thinkingDelta(D.delta,b.hasOpenThinking()));break;case"stream_end":{let U=b.completeStream();Z.streamEnd(U.wroteAssistantContent,U.openedThinking);break}case"tool_start":{let U=D.toolCall;if(!("function"in U))break;if(["TaskCreate","TaskUpdate","TaskList"].includes(U.function.name))break;try{let f=JSON.parse(U.function.arguments),I=E(U.function.name,f),B=T(U.function.name,f),J=kq(U.function.name,I,B,V);if(J.shouldLockTarget)V.targetLocked=!0;Z.phase(J.phase,J.status,J.message,{toolName:U.function.name,target:B}),Z.toolStart(U.function.name,I,B,D.toolKind)}catch{Z.phase(V.targetLocked?"executing":"searching",V.targetLocked?"hit":"ongoing",V.targetLocked?`Working within target: ${U.function.name}`:`Still searching: ${U.function.name}`,{toolName:U.function.name}),Z.toolStart(U.function.name,U.function.name,void 0,D.toolKind)}break}case"tool_result":{let U=D.toolCall;if(!("function"in U))break;let f;try{let B=JSON.parse(U.function.arguments);f=T(U.function.name,B)}catch{f=void 0}let I=S(U.function.name,D.result);if(Z.toolResult(U.function.name,I.summary,f,void 0,{success:D.result.success,errorType:D.result.error?.type,errorMessage:D.result.error?.message}),I.detail)Z.toolDetail(U.function.name,I.detail);break}case"token_usage":Z.tokenUsage(D.usage);break;case"compaction":Z.compacting(D.phase==="start");break;case"task_update":Z.taskUpdate(D.tasks);break;case"steering_applied":case"follow_up_started":case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":Z.subagent(D);break;case"model_fallback":break;case"turn_start":if(D.turn===1)V.targetLocked=!1;Z.phase("turn",V.targetLocked?"hit":"ongoing",`Turn ${D.turn} started`,{turn:D.turn});break;default:{let U=D}}});if(x.metadata?.outputTruncated)Z.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");if(!x.success)return Z.error(`Error: ${x.error?.message??"Agent execution failed"}`),1;return Z.phase("completed","done","Headless run completed"),0}catch(K){if(b.hasOpenThinking()&&q==="text")$.stderr.write(`
6
- `);return Z.error(`Error: ${Nq(K)}`),1}finally{try{await M?.dispose()}finally{R.dispose()}}}async function sq(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:G,"output-format":q,"system-prompt":Z,"append-system-prompt":b,"max-turns":V,...M}=g,R=Mq(Rq(process.argv)).scriptName("blade").strict(!1).options(M).middleware([p,z,d]);return Pq(R),await R.parse(),!0}export{Hq as runHeadless,sq as handleHeadlessMode,Iq as HeadlessOptionsSchema};
@@ -1 +0,0 @@
1
- import{r as n,j as e}from"./vendor-react-BalntB5F.js";import{D as U,a as z,b as K,c as b,u as J,d as Q}from"./index-BJTSF3fc.js";import{u as V}from"./SettingsStore-jup_Kikq.js";import{X as P,k as M,E as G,w as _,d as W,e as X}from"./vendor-icons-BuFpOlRn.js";import"./vendor-markdown-Bo4W9Tae.js";import"./vendor-monaco-w6PwaWGP.js";import"./vendor-radix-CESj0OOY.js";const L={id:"custom",name:"Custom (OpenAI Compatible)",icon:"🔌",description:"Any OpenAI-compatible API",envVars:[],bladeProvider:"openai-compatible"};function Y({open:p,onOpenChange:c,onSave:u}){const[E,d]=n.useState([L]),[x,s]=n.useState([]),[r,j]=n.useState("custom"),[o,i]=n.useState({bladeProvider:"openai-compatible",baseUrl:"",apiKey:"",modelId:"",name:""}),[y,N]=n.useState(!1),[w,v]=n.useState(!1),[k,S]=n.useState(!1);n.useEffect(()=>{p&&fetch("/providers").then(a=>a.json()).then(a=>d([L,...a])).catch(a=>console.error("Failed to load providers:",a))},[p]),n.useEffect(()=>{r&&r!=="custom"?fetch(`/providers/${r}/models`).then(a=>a.json()).then(a=>s(a)).catch(a=>console.error("Failed to load models:",a)):s([])},[r]);const F=a=>{j(a.id),i({...o,bladeProvider:a.bladeProvider,baseUrl:a.defaultBaseUrl||"",modelId:"",name:""}),N(!1)},A=()=>{!o.modelId||!o.apiKey||(u({...o,name:o.name||o.modelId}),i({bladeProvider:"openai-compatible",baseUrl:"",apiKey:"",modelId:"",name:""}),j("custom"),c(!1))},h=E.find(a=>a.id===r),B=x.find(a=>a.id===o.modelId),C=!(r==="custom")&&x.length>0,I=o.modelId&&o.apiKey;return e.jsx(U,{open:p,onOpenChange:c,children:e.jsxs(z,{className:"sm:max-w-[480px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl [&>button]:hidden","aria-describedby":void 0,children:[e.jsx(K,{className:"sr-only",children:"Add Model"}),e.jsxs("div",{className:"p-6 flex flex-col gap-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-base font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:"Add Model"}),e.jsx("button",{onClick:()=>c(!1),className:"text-[#9CA3AF] hover:text-[#111827] dark:text-[#71717a] dark:hover:text-[#E5E5E5] transition-colors",children:e.jsx(P,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Provider"}),e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>N(!y),className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#27272a] transition-colors",children:[e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx("span",{children:h==null?void 0:h.icon}),e.jsx("span",{children:h==null?void 0:h.name})]}),e.jsx(M,{className:"h-4 w-4 text-[#9CA3AF] dark:text-[#71717a]"})]}),y&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-40",onClick:()=>N(!1)}),e.jsx("div",{className:"absolute top-full left-0 right-0 mt-1 bg-white dark:bg-[#18181b] border border-[#E5E7EB] dark:border-zinc-800 rounded-md py-1 z-50 max-h-64 overflow-y-auto shadow-lg",children:E.map(a=>e.jsx("button",{type:"button",className:b("w-full text-left px-3 py-2 text-sm font-mono hover:bg-[#F3F4F6] dark:hover:bg-[#27272a] transition-colors",r===a.id?"text-[#111827] dark:text-[#E5E5E5] bg-[#F3F4F6] dark:bg-[#27272a]":"text-[#6B7280] dark:text-[#a1a1aa]"),onClick:()=>F(a),children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{children:a.icon}),e.jsx("span",{className:"font-medium",children:a.name})]})},a.id))})]})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Base URL"}),e.jsx("input",{type:"text",value:o.baseUrl,onChange:a=>i({...o,baseUrl:a.target.value}),placeholder:(h==null?void 0:h.defaultBaseUrl)||"https://api.openai.com/v1",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"API Key"}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:k?"text":"password",value:o.apiKey,onChange:a=>i({...o,apiKey:a.target.value}),placeholder:"sk-........................",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 pr-10 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"}),e.jsx("button",{type:"button",onClick:()=>S(!k),className:"absolute right-3 top-1/2 -translate-y-1/2 text-[#9CA3AF] hover:text-[#111827] dark:text-[#71717a] dark:hover:text-[#E5E5E5] transition-colors",children:k?e.jsx(G,{className:"h-4 w-4"}):e.jsx(_,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Model ID"}),C&&e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>v(!w),className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#27272a] transition-colors",children:[(B==null?void 0:B.name)||o.modelId||"Select model",e.jsx(M,{className:"h-4 w-4 text-[#9CA3AF] dark:text-[#71717a]"})]}),w&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"fixed inset-0 z-40",onClick:()=>v(!1)}),e.jsx("div",{className:"absolute top-full left-0 right-0 mt-1 bg-white dark:bg-[#18181b] border border-[#E5E7EB] dark:border-zinc-800 rounded-md py-1 z-50 max-h-48 overflow-y-auto shadow-lg",children:x.map(a=>e.jsx("button",{type:"button",className:b("w-full text-left px-3 py-2 text-sm font-mono hover:bg-[#F3F4F6] dark:hover:bg-[#27272a] transition-colors",o.modelId===a.id?"text-[#111827] dark:text-[#E5E5E5] bg-[#F3F4F6] dark:bg-[#27272a]":"text-[#6B7280] dark:text-[#a1a1aa]"),onClick:()=>{i({...o,modelId:a.id,name:a.name}),v(!1)},children:a.name},a.id))})]})]}),e.jsx("input",{type:"text",value:o.modelId,onChange:a=>i({...o,modelId:a.target.value,name:a.target.value}),placeholder:"gpt-4o, claude-3-opus, deepseek-chat, etc.",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"}),C&&e.jsx("p",{className:"text-[12px] text-[#9CA3AF] dark:text-[#71717a] font-mono",children:"You can select a listed model or type a custom model ID."})]})]}),e.jsxs("div",{className:"flex items-center gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:()=>c(!1),className:"flex-1 px-4 py-2 rounded-md text-sm text-[#6B7280] dark:text-[#a1a1aa] font-mono hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:"Cancel"}),e.jsx("button",{type:"button",onClick:A,disabled:!I,className:"flex-1 px-4 py-2 rounded-md text-sm text-white font-semibold font-mono bg-[#16A34A] hover:bg-[#15803d] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:"Save Model"})]})]})]})})}function q({open:p,onOpenChange:c,model:u,onSave:E}){const[d,x]=n.useState({baseUrl:"",apiKey:"",model:""}),[s,r]=n.useState(!1);n.useEffect(()=>{u&&x({baseUrl:u.baseUrl||"",apiKey:u.apiKey||"",model:u.model||""})},[u]);const j=()=>{!u||!d.model||(E(u.id,{baseUrl:d.baseUrl||void 0,apiKey:d.apiKey||void 0,model:d.model}),c(!1))},o=d.model;return e.jsx(U,{open:p,onOpenChange:c,children:e.jsxs(z,{className:"sm:max-w-[480px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl [&>button]:hidden","aria-describedby":void 0,children:[e.jsx(K,{className:"sr-only",children:"Edit Model"}),e.jsxs("div",{className:"p-6 flex flex-col gap-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-base font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:"Edit Model"}),e.jsx("button",{onClick:()=>c(!1),className:"text-[#9CA3AF] hover:text-[#111827] dark:text-[#71717a] dark:hover:text-[#E5E5E5] transition-colors",children:e.jsx(P,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Model ID"}),e.jsx("input",{type:"text",value:d.model,onChange:i=>x({...d,model:i.target.value}),placeholder:"gpt-4o, claude-3-opus, etc.",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Base URL"}),e.jsx("input",{type:"text",value:d.baseUrl,onChange:i=>x({...d,baseUrl:i.target.value}),placeholder:"https://api.openai.com/v1",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"API Key"}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:s?"text":"password",value:d.apiKey,onChange:i=>x({...d,apiKey:i.target.value}),placeholder:"Leave empty to keep current key",className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 py-2.5 pr-10 text-sm text-[#111827] dark:text-[#E5E5E5] font-mono placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none focus:ring-1 focus:ring-[#D1D5DB] dark:focus:ring-zinc-600"}),e.jsx("button",{type:"button",onClick:()=>r(!s),className:"absolute right-3 top-1/2 -translate-y-1/2 text-[#9CA3AF] hover:text-[#111827] dark:text-[#71717a] dark:hover:text-[#E5E5E5] transition-colors",children:s?e.jsx(G,{className:"h-4 w-4"}):e.jsx(_,{className:"h-4 w-4"})})]})]})]}),e.jsxs("div",{className:"flex items-center gap-3 pt-2",children:[e.jsx("button",{type:"button",onClick:()=>c(!1),className:"flex-1 px-4 py-2 rounded-md text-sm text-[#6B7280] dark:text-[#a1a1aa] font-mono hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:"Cancel"}),e.jsx("button",{type:"button",onClick:j,disabled:!o,className:"flex-1 px-4 py-2 rounded-md text-sm text-white font-semibold font-mono bg-[#16A34A] hover:bg-[#15803d] disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:"Save Changes"})]})]})]})})}const Z={"openai-compatible":{bg:"#10a37f",label:"OA"},anthropic:{bg:"#d97757",label:"A"},gemini:{bg:"#4285f4",label:"G"},"azure-openai":{bg:"#0078d4",label:"Az"},"gpt-openai-platform":{bg:"#10a37f",label:"GP"}};function re(){var O;const{isSettingsOpen:p,toggleSettings:c,isSidebarOpen:u,setSidebarOpen:E}=J(),{configuredModels:d,loadModels:x}=Q(),s=V(),[r,j]=n.useState("general"),[o,i]=n.useState(!1),[y,N]=n.useState(null),[w,v]=n.useState(null),[k,S]=n.useState(""),[F,A]=n.useState("all"),h=[{value:"general",label:"General"},{value:"models",label:"Models"},{value:"shortcuts",label:"Shortcuts"}],D=n.useMemo(()=>[{action:"Open command palette",combo:["Ctrl","K"],scope:"Global"},{action:"New chat",combo:["Ctrl","N"],scope:"Chat"},{action:"Focus input",combo:["Ctrl","L"],scope:"Chat"},{action:"Toggle sidebar",combo:["Ctrl","B"],scope:"Layout"},{action:"Search history",combo:["Ctrl","H"],scope:"History"}],[]).filter(t=>{const l=t.action.toLowerCase().includes(k.toLowerCase()),m=F==="all"||t.scope.toLowerCase()===F;return l&&m}),C=d.reduce((t,l)=>{const m=l.provider||"unknown";return t[m]||(t[m]=[]),t[m].push(l),t},{});n.useEffect(()=>{p&&(x(),s.loadSettings())},[p,x,s.loadSettings]);const I=async t=>{try{if(!(await fetch("/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t.bladeProvider,name:t.name||t.modelId,model:t.modelId,baseUrl:t.baseUrl||void 0,apiKey:t.apiKey||void 0})})).ok)throw new Error("Failed to save model");await x()}catch(l){console.error("Failed to save model:",l)}},a=async t=>{try{if(!(await fetch(`/models/${t}`,{method:"DELETE"})).ok)throw new Error("Failed to delete model");await x()}catch(l){console.error("Failed to delete model:",l)}},$=async(t,l)=>{try{if(!(await fetch(`/models/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)})).ok)throw new Error("Failed to update model");await x()}catch(m){console.error("Failed to update model:",m)}},H=t=>{N(y===t?null:t)};return e.jsxs(e.Fragment,{children:[e.jsx(U,{open:p,onOpenChange:c,children:e.jsxs(z,{className:"sm:max-w-[800px] h-[600px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl flex flex-col","aria-describedby":void 0,hideCloseButton:!0,children:[e.jsx(K,{className:"sr-only",children:"Settings"}),e.jsxs("div",{className:"flex h-full",children:[e.jsx("div",{className:"w-[200px] h-full bg-[#F3F4F6] dark:bg-[#18181b] p-6 flex flex-col gap-2",children:h.map(t=>e.jsx("button",{onClick:()=>j(t.value),className:b("w-full text-left px-3 py-2 rounded-md text-sm font-mono transition-colors",r===t.value?"bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5] font-medium":"text-[#6B7280] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-[#a1a1aa] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a]/50"),children:t.label},t.value))}),e.jsxs("div",{className:"flex-1 p-8 flex flex-col gap-6 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:r==="general"?"Settings":(O=h.find(t=>t.value===r))==null?void 0:O.label}),e.jsx("button",{onClick:c,className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",children:e.jsx(P,{className:"h-4 w-4"})})]}),r==="models"&&e.jsxs("div",{className:"flex flex-col gap-6 flex-1 min-h-0 overflow-hidden",children:[e.jsx("p",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono shrink-0",children:"Configure API keys and model settings for different providers."}),e.jsx("div",{className:"flex-1 overflow-y-auto min-h-0",children:e.jsxs("div",{className:"flex flex-col gap-2 pr-2",children:[Object.entries(C).map(([t,l])=>{const m=Z[t]||{bg:"#71717a",label:"?"},T=l.some(f=>f.apiKey),R=y===t;return e.jsxs("div",{className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>H(t),className:"w-full p-4 flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#1f1f23] transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded flex items-center justify-center text-white text-xs font-bold",style:{backgroundColor:m.bg},children:m.label}),e.jsxs("div",{className:"flex flex-col gap-0.5 text-left",children:[e.jsx("span",{className:"text-sm font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono capitalize",children:t.replace(/-/g," ")}),e.jsxs("span",{className:"text-xs text-[#9CA3AF] dark:text-[#71717a] font-mono",children:[l.length," model",l.length>1?"s":""]})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:b("text-xs font-mono",T?"text-[#16A34A]":"text-[#9CA3AF] dark:text-[#71717a]"),children:T?"● Connected":"○ Not Connected"}),e.jsx(M,{className:b("h-4 w-4 text-[#9CA3AF] dark:text-[#71717a] transition-transform",R&&"rotate-180")})]})]}),R&&e.jsx("div",{className:"border-t border-[#E5E7EB] dark:border-zinc-800",children:l.map(f=>e.jsxs("div",{className:"px-4 py-3 flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#1f1f23] group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 flex-1 min-w-0",children:[e.jsx("span",{className:"text-sm text-[#111827] dark:text-[#E5E5E5] font-mono truncate",children:f.model}),e.jsx("span",{className:"text-xs text-[#9CA3AF] dark:text-[#71717a] font-mono truncate",children:f.baseUrl||"Default URL"})]}),e.jsxs("div",{className:"flex items-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity",children:[e.jsx("button",{onClick:()=>v(f),className:"p-1.5 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] rounded transition-colors",children:e.jsx(W,{className:"h-3.5 w-3.5"})}),e.jsx("button",{onClick:()=>a(f.id),className:"p-1.5 text-[#9CA3AF] hover:text-red-500 hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-red-400 dark:hover:bg-[#27272a] rounded transition-colors",children:e.jsx(X,{className:"h-3.5 w-3.5"})})]})]},f.id))})]},t)}),Object.keys(C).length===0&&e.jsx("div",{className:"text-center py-8 text-[#9CA3AF] dark:text-[#71717a] text-sm font-mono",children:"No models configured yet"})]})}),e.jsx("button",{onClick:()=>i(!0),className:"w-full py-3 rounded-md text-[#6B7280] dark:text-[#a1a1aa] text-[13px] font-mono hover:bg-[#F3F4F6] dark:bg-[#18181b] transition-colors shrink-0",children:"+ Add New Model"})]}),r==="general"&&e.jsxs("div",{className:"flex flex-col gap-6 overflow-y-auto pr-2",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"General"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Response Language"}),e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#71717a] font-mono",children:"AI will respond in this language"})]}),e.jsxs("select",{value:s.language,onChange:t=>s.updateSettings({language:t.target.value}),className:"h-8 bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono rounded-md px-3 border border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("option",{value:"en-US",children:"English (US)"}),e.jsx("option",{value:"zh-CN",children:"简体中文"}),e.jsx("option",{value:"zh-TW",children:"繁體中文"}),e.jsx("option",{value:"ja-JP",children:"日本語"}),e.jsx("option",{value:"ko-KR",children:"한국어"}),e.jsx("option",{value:"es-ES",children:"Español"}),e.jsx("option",{value:"fr-FR",children:"Français"}),e.jsx("option",{value:"de-DE",children:"Deutsch"}),e.jsx("option",{value:"pt-BR",children:"Português (BR)"}),e.jsx("option",{value:"ru-RU",children:"Русский"})]})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Auto-save sessions"}),e.jsx(g,{enabled:s.autoSaveSessions,onChange:t=>s.updateSettings({autoSaveSessions:t})})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Appearance"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Theme Preference"}),e.jsx("div",{className:"flex items-center gap-2 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md p-1",children:["dark","light","system"].map(t=>e.jsx("button",{onClick:()=>s.updateSettings({uiTheme:t}),className:b("px-3 py-1 rounded text-[12px] font-mono transition-colors",s.uiTheme===t?"bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5]":"text-[#9CA3AF] dark:text-[#71717a] hover:text-[#111827] dark:hover:text-[#E5E5E5]"),children:t==="dark"?"Dark":t==="light"?"Light":"System"},t))})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Compact sidebar"}),e.jsx(g,{enabled:!u,onChange:t=>E(!t)})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Code theme"}),e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#71717a] font-mono",children:"Syntax highlighting colors"})]}),e.jsxs("select",{value:s.theme,onChange:t=>s.updateSettings({theme:t.target.value}),className:"h-8 bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono rounded-md px-3 border border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("option",{value:"dracula",children:"Dracula"}),e.jsx("option",{value:"monokai",children:"Monokai"}),e.jsx("option",{value:"nord",children:"Nord"}),e.jsx("option",{value:"tokyo-night",children:"Tokyo Night"}),e.jsx("option",{value:"one-dark",children:"One Dark"}),e.jsx("option",{value:"catppuccin",children:"Catppuccin"}),e.jsx("option",{value:"gruvbox",children:"Gruvbox"}),e.jsx("option",{value:"github",children:"GitHub"}),e.jsx("option",{value:"solarized-light",children:"Solarized Light"}),e.jsx("option",{value:"solarized-dark",children:"Solarized Dark"}),e.jsx("option",{value:"ayu-dark",children:"Ayu Dark"}),e.jsx("option",{value:"rose-pine",children:"Rose Pine"}),e.jsx("option",{value:"kanagawa",children:"Kanagawa"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Notifications"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Build finished"}),e.jsx(g,{enabled:s.notifyBuild,onChange:t=>s.updateSettings({notifyBuild:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Errors only"}),e.jsx(g,{enabled:s.notifyErrors,onChange:t=>s.updateSettings({notifyErrors:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"System sounds"}),e.jsx(g,{enabled:s.notifySounds,onChange:t=>s.updateSettings({notifySounds:t})})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Privacy"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Telemetry"}),e.jsx(g,{enabled:s.privacyTelemetry,onChange:t=>s.updateSettings({privacyTelemetry:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Crash reports"}),e.jsx(g,{enabled:s.privacyCrash,onChange:t=>s.updateSettings({privacyCrash:t})})]})]})]}),r==="shortcuts"&&e.jsxs("div",{className:"flex flex-col gap-4 flex-1 min-h-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-3 shrink-0",children:[e.jsx("input",{value:k,onChange:t=>S(t.target.value),placeholder:"Search actions...",className:"flex-1 h-9 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono"}),e.jsxs("select",{value:F,onChange:t=>A(t.target.value),className:"h-9 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:[e.jsx("option",{value:"all",children:"All scopes"}),e.jsx("option",{value:"global",children:"Global"}),e.jsx("option",{value:"chat",children:"Chat"}),e.jsx("option",{value:"layout",children:"Layout"}),e.jsx("option",{value:"history",children:"History"})]}),e.jsx("button",{onClick:()=>{S(""),A("all")},className:"h-9 px-3 rounded-md bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono font-semibold",children:"Reset"})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto border border-[#E5E7EB] dark:border-[#27272a] rounded-lg bg-[#E5E7EB] dark:bg-[#111827]",children:[e.jsxs("div",{className:"grid grid-cols-[1fr_180px_120px] gap-2 px-3 py-2 bg-white dark:bg-[#0C0C0C] text-[12px] text-[#6B7280] dark:text-[#94a3b8] font-mono font-semibold",children:[e.jsx("span",{children:"Action"}),e.jsx("span",{children:"Shortcut"}),e.jsx("span",{children:"Scope"})]}),D.map((t,l)=>e.jsxs("div",{className:b("grid grid-cols-[1fr_180px_120px] gap-2 px-3 py-2 text-[13px] font-mono",l%2===0?"bg-[#E5E7EB] dark:bg-[#111827]":"bg-white dark:bg-[#0C0C0C]"),children:[e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5]",children:t.action}),e.jsx("div",{className:"flex items-center gap-1",children:t.combo.map(m=>e.jsx("span",{className:"px-2 py-0.5 rounded bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono font-semibold",children:m},m))}),e.jsx("span",{className:"text-[#6B7280] dark:text-[#94a3b8] text-[12px]",children:t.scope})]},`${t.action}-${t.scope}`)),D.length===0&&e.jsx("div",{className:"px-3 py-6 text-center text-[12px] text-[#6B7280] dark:text-[#94a3b8] font-mono",children:"No shortcuts found."})]})]})]})]})]})}),e.jsx(Y,{open:o,onOpenChange:i,onSave:I}),e.jsx(q,{open:!!w,onOpenChange:t=>!t&&v(null),model:w,onSave:$})]})}function g({enabled:p,onChange:c}){return e.jsx("button",{onClick:()=>c(!p),className:b("w-10 h-5 rounded-full px-0.5 flex items-center transition-colors",p?"bg-[#22C55E]":"bg-[#E5E7EB] dark:bg-[#27272a]"),children:e.jsx("span",{className:b("h-4 w-4 rounded-full transition-transform",p?"translate-x-5 bg-white":"translate-x-0 bg-white dark:bg-[#a1a1aa]")})})}export{re as SettingsModal};