blade-code 0.7.7 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/{chunk-0b3m5qn6.js → chunk-06h100e2.js} +1 -1
- package/dist/chunk-07jvw0kn.js +1 -0
- package/dist/chunk-0dj326ms.js +5 -0
- package/dist/chunk-14erxdhd.js +1 -0
- package/dist/chunk-1pt090dg.js +615 -0
- package/dist/{chunk-2qckpa16.js → chunk-1smf2dj3.js} +2 -2
- package/dist/chunk-34pdtz4q.js +3 -0
- package/dist/chunk-3gw66r7a.js +2 -0
- package/dist/chunk-49g067ek.js +41 -0
- package/dist/chunk-6es6av6j.js +2 -0
- package/dist/{chunk-6y58y4rx.js → chunk-9xkjb87h.js} +1 -1
- package/dist/chunk-a12tmmfr.js +1 -0
- package/dist/chunk-bggvft3z.js +1 -0
- package/dist/{chunk-60se4kxq.js → chunk-bm8vwfez.js} +1 -1
- package/dist/chunk-bxbagv76.js +9 -0
- package/dist/chunk-ctqf59q1.js +2 -0
- package/dist/chunk-d08wbxjr.js +1 -0
- package/dist/chunk-d4ex0qvs.js +2 -0
- package/dist/{chunk-zet4zjc3.js → chunk-dr06x0cw.js} +1 -1
- package/dist/chunk-e4a240t7.js +34 -0
- package/dist/{chunk-v61bja34.js → chunk-gsfkrr25.js} +1 -1
- package/dist/chunk-gytwh5y1.js +6 -0
- package/dist/chunk-hjx5n3dw.js +3 -0
- package/dist/chunk-hrnd3wjg.js +6 -0
- package/dist/chunk-j39q2kx7.js +1 -0
- package/dist/chunk-jakzknh3.js +1570 -0
- package/dist/chunk-jqr2pknb.js +151 -0
- package/dist/{chunk-2n8a87ds.js → chunk-jt62ctz7.js} +1 -1
- package/dist/{chunk-5xjj88wd.js → chunk-kawv31m3.js} +1 -1
- package/dist/chunk-n8ymp6nd.js +1 -0
- package/dist/{chunk-yyw9bbfd.js → chunk-nned222j.js} +1 -1
- package/dist/chunk-qwdbqjh7.js +22 -0
- package/dist/chunk-syj3anec.js +6 -0
- package/dist/chunk-tv4r86ez.js +24 -0
- package/dist/chunk-twem6p0g.js +2 -0
- package/dist/chunk-v3ctg84r.js +1 -0
- package/dist/chunk-v5rn5r1h.js +1 -0
- package/dist/{chunk-w1m1ehs1.js → chunk-wmes2tt9.js} +1 -1
- package/dist/chunk-xhnyy54e.js +2 -0
- package/dist/{chunk-6087cgst.js → chunk-ychj0e5q.js} +1 -1
- package/dist/{chunk-7e5hzpmp.js → chunk-ydb9myhe.js} +1 -1
- package/dist/{chunk-p7rf3zp8.js → chunk-yhpm9azy.js} +1 -1
- package/dist/{chunk-c6rtexw1.js → chunk-yqxw7zz4.js} +1 -1
- package/dist/web/assets/{FilePreview-B2anY2d1.js → FilePreview-DvgnEspB.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-BVfRG88x.js → MarkdownRenderer-e1ZUy6jV.js} +1 -1
- package/dist/web/assets/{McpModal-BVvb-dzr.js → McpModal-Raois2g1.js} +1 -1
- package/dist/web/assets/SettingsModal-Dzuatoea.js +1 -0
- package/dist/web/assets/{SettingsStore-B87y64B4.js → SettingsStore-BxDA0Usw.js} +1 -1
- package/dist/web/assets/{SkillsModal-BXYaF2KK.js → SkillsModal-Cg2-befH.js} +1 -1
- package/dist/web/assets/{TerminalPanel-B-NRhOXN.js → TerminalPanel-CEoQI9Lu.js} +1 -1
- package/dist/web/assets/index-BvGeIa_-.js +16 -0
- package/dist/web/assets/index-DDJnZJcp.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +4 -11
- package/dist/chunk-0y895nft.js +0 -9
- package/dist/chunk-2j3tb2dm.js +0 -1
- package/dist/chunk-3fcze972.js +0 -1
- package/dist/chunk-4n7fsts0.js +0 -2
- package/dist/chunk-54vk4tw8.js +0 -615
- package/dist/chunk-6cry51vb.js +0 -9
- package/dist/chunk-778h8815.js +0 -26
- package/dist/chunk-89j9pm90.js +0 -24
- package/dist/chunk-8e0rv3j5.js +0 -41
- package/dist/chunk-8p98nt9v.js +0 -151
- package/dist/chunk-94vj1hjp.js +0 -1
- package/dist/chunk-c8cxeve8.js +0 -1
- package/dist/chunk-d61d6m07.js +0 -2
- package/dist/chunk-ebcmqx1k.js +0 -2
- package/dist/chunk-gsn659hw.js +0 -1
- package/dist/chunk-h79044h0.js +0 -3
- package/dist/chunk-kppxkh33.js +0 -1
- package/dist/chunk-ptt8s7nd.js +0 -6
- package/dist/chunk-qnh7np1s.js +0 -6
- package/dist/chunk-ran4gsmy.js +0 -1
- package/dist/chunk-swyvd7hd.js +0 -1
- package/dist/chunk-t9zdypqp.js +0 -2
- package/dist/chunk-x1khkevy.js +0 -1563
- package/dist/chunk-x24ddbhs.js +0 -6
- package/dist/chunk-x466sb8s.js +0 -34
- package/dist/web/assets/SettingsModal-aseVv-gp.js +0 -1
- package/dist/web/assets/index-9kl44E8k.js +0 -9
- package/dist/web/assets/index-CUVe9dGs.css +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{nanoid as q}from"nanoid";var u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function B(j="session",m=21){if(!u.test(j))throw Error(`Invalid session ID prefix: ${j}`);return`${j}-${q(m)}`}
|
|
2
|
-
export{B as
|
|
2
|
+
export{B as Cb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./chunk-
|
|
1
|
+
import"./chunk-dr06x0cw.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as a,u as b}from"./chunk-nned222j.js";import"./chunk-6es6av6j.js";import"./chunk-dr06x0cw.js";export{a as globalOptions,b as cliConfig};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ka as d,Ma as h}from"./chunk-6es6av6j.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
|
|
2
2
|
export{q as t,w as u};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import{Ib as V,Kb as L,Lb as M}from"./chunk-gsfkrr25.js";import{Tb as b}from"./chunk-34pdtz4q.js";import{dc as E}from"./chunk-hjx5n3dw.js";var G={currentModelId:"",models:[],temperature:0,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 x={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 _(J){let q=J.toLowerCase().trim();return x[q]??J}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(J){try{this.runtimePermissionOverrides=J?.permissions;let q=await this.loadConfigFiles(),H=await this.loadSettingsFiles(),K={...q,...H};if(J)K=this.mergeSettings(K,J);let Q=this.normalizeConfig(K),W={...G,...Q};if(this.resolveEnvInterpolation(W),process.env.BLADE_MODEL&&W.models?.length>0){let X=_(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_DEBUG)W.debug=process.env.BLADE_DEBUG==="1"||process.env.BLADE_DEBUG==="true"||process.env.BLADE_DEBUG;if(W.models.length>0)this.validateConfig(W);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 J=$.join(R.homedir(),".blade","config.json"),q=$.join(V(),".blade","config.json"),H={},K=await this.loadJsonFile(J);if(K)H={...H,...K};let Q=await this.loadJsonFile(q);if(Q){let W={...H.mcpServers||{},...Q.mcpServers||{}};if(H={...H,...Q},Object.keys(W).length>0)H.mcpServers=W}return H}async loadSettingsFiles(){let J=$.join(R.homedir(),".blade","settings.json"),q=$.join(V(),".blade","settings.json"),H=$.join(V(),".blade","settings.local.json"),K={},Q=await this.loadJsonFile(J);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(H);if(X)K=this.mergeSettings(K,X);return K}async loadWorkspacePermissions(J,q){let H={allow:[...q.allow],ask:[...q.ask],deny:[...q.deny]};if($.resolve(J)!==$.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((F)=>!X[Y].includes(F)));H[Y]=H[Y].filter((F)=>!Z.has(F))}}let K=await this.loadWorkspacePermissionOverrides(J);for(let Q of["allow","ask","deny"])H[Q]=Array.from(new Set([...H[Q],...K[Q]]));return H}async loadWorkspacePermissionOverrides(J){let q={allow:[],ask:[],deny:[]},H=[$.join(J,".blade","settings.json"),$.join(J,".blade","settings.local.json")];for(let K of H){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(J,q){let H={...JSON.parse(JSON.stringify(J)),...JSON.parse(JSON.stringify(q))};if(q.permissions)H.permissions={allow:Array.from(new Set([...J.permissions?.allow||[],...q.permissions.allow||[]])),ask:Array.from(new Set([...J.permissions?.ask||[],...q.permissions.ask||[]])),deny:Array.from(new Set([...J.permissions?.deny||[],...q.permissions.deny||[]]))};if(q.hooks)H.hooks=A({},H.hooks,q.hooks);if(q.env)H.env=A({},H.env,q.env);if(q.mcpServers)H.mcpServers={...H.mcpServers||{},...q.mcpServers};if(q.disableAllHooks!==void 0)H.disableAllHooks=q.disableAllHooks;if(q.permissionMode!==void 0)H.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)H.maxTurns=q.maxTurns;return H}resolveEnvInterpolation(J){let q=/\$\{?([A-Z_][A-Z0-9_]*)(:-([^}]+))?\}?/g,H=(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(H);if(typeof Q==="object"&&Q!==null){let W=Q;for(let[X,Y]of Object.entries(W))W[X]=H(Y);return W}return Q},K=J;for(let[Q,W]of Object.entries(K))K[Q]=H(W)}async loadJsonFile(J){try{if(await this.fileExists(J)){let q=await T.readFile(J,"utf-8");return JSON.parse(q)}}catch(q){console.warn(`[ConfigManager] Failed to load ${J}:`,q)}return null}async fileExists(J){try{return await T.access(J),!0}catch{return!1}}normalizeConfig(J){let q=JSON.parse(JSON.stringify(J)),H=(Q)=>Q.trim().replace(/^`|`$/g,""),K=(Q)=>{for(let[W,X]of Object.entries(Q))if(typeof X==="string")Q[W]=H(X);else if(Array.isArray(X))X.forEach((Y,Z)=>{if(typeof Y==="string")X[Z]=H(Y);else if(typeof Y==="object"&&Y!==null)K(Y)});else if(typeof X==="object"&&X!==null)K(X)};return K(q),q}validateConfig(J){let q=[];if(!J.models||J.models.length===0)q.push("没有可用的模型配置");if(!L(J.maxTurns))q.push(`maxTurns 必须是 ${M()}`);if(J.models&&J.models.length>0){if(!J.currentModelId)q.push("未设置当前模型 ID");else if(!J.models.find((K)=>K.id===J.currentModelId))q.push(`当前模型 ID "${J.currentModelId}" 在 models 列表中不存在`);for(let H of J.models){let K=`模型 "${H.displayName||H.id}"`,Q=["name","apiKey","baseUrl","maxContextTokens","maxOutputTokens","supportsThinking","thinkingBudget","thinkingMode"].filter((W)=>(W in H));if(Q.length>0)q.push(`${K}: 不再支持旧字段 ${Q.join(", ")};请重新配置模型`);if(!H.model)q.push(`${K}: model 字段必填`);if(!H.provider)q.push(`${K}: provider 字段必填`);if(H.overrides?.baseUrl&&!H.overrides.baseUrl.startsWith("http"))q.push(`${K}: overrides.baseUrl "${H.overrides.baseUrl}" 不是有效的 HTTP URL`);try{E().getModel(H.provider,H.model)}catch{q.push(`${K}: 内置 catalog 中不存在 ${H.provider}/${H.model}`)}}}if(q.length>0)throw Error(`配置验证失败:
|
|
2
|
+
${q.map((H)=>` - ${H}`).join(`
|
|
3
|
+
`)}
|
|
4
|
+
|
|
5
|
+
`+`请通过以下方式之一提供配置:
|
|
6
|
+
`+` 1. 首次启动: 运行 blade,系统会自动引导配置
|
|
7
|
+
`+` 2. 添加模型: blade 后输入 /model add
|
|
8
|
+
`+` 3. 初始化向导: 输入 /init
|
|
9
|
+
|
|
10
|
+
`+`配置文件示例 (~/.blade/config.json):
|
|
11
|
+
`+`{
|
|
12
|
+
"currentModelId": "model-id-123",
|
|
13
|
+
"models": [
|
|
14
|
+
{
|
|
15
|
+
"id": "model-id-123",
|
|
16
|
+
`+` "displayName": "默认模型",
|
|
17
|
+
`+` "provider": "deepseek",
|
|
18
|
+
"model": "deepseek-v4-pro"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
`)}}function y(J,q={}){let H={...J};if(q.debug!==void 0)H.debug=q.debug===""?!0:q.debug;if(q.model){if(!J.models.some((Q)=>Q.id===q.model))throw Error(`模型配置未找到: ${q.model}`);H.currentModelId=q.model}if(q.yolo===!0)H.permissionMode="yolo";else if(q.permissionMode!==void 0)H.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)H.maxTurns=q.maxTurns;return H.systemPrompt=q.systemPrompt,H.appendSystemPrompt=q.appendSystemPrompt,H.model=q.model,H.resumeSessionId=q.sessionId,H.forkSession=q.forkSession,H.allowedTools=q.allowedTools,H.disallowedTools=q.disallowedTools,H.mcpConfigPaths=q.mcpConfig,H.strictMcpConfig=q.strictMcpConfig,H.addDirs=q.addDir,H.outputFormat=q.outputFormat,H.inputFormat=q.inputFormat,H.print=q.print,H.includePartialMessages=q.includePartialMessages,H.replayUserMessages=q.replayUserMessages,H.agentsConfig=q.agents,H.settingSources=q.settingSources,H}import{promises as D}from"node:fs";import w from"node:os";import B from"node:path";import{Mutex as j}from"async-mutex";import{merge as k}from"lodash-es";import C from"write-file-atomic";var S=b("Service"),U={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},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}},Yq=new Set(Object.entries(U).filter(([J,q])=>q.persistable).map(([J])=>J)),Zq=new Set(Object.entries(U).filter(([J,q])=>!q.persistable).map(([J])=>J));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 J of z.instance.timers.values())clearTimeout(J);z.instance=null}async save(J,q={}){this.validatePersistableFields(J);let H=this.groupUpdatesByTarget(J,q.scope,q.projectDir);if(q.immediate)await Promise.all(Array.from(H.entries()).map(([K,Q])=>this.flushTarget(K,Q)));else for(let[K,Q]of H)this.scheduleSave(K,Q)}async flush(){for(let q of this.timers.values())clearTimeout(q);this.timers.clear();let J=Array.from(this.pendingUpdates.entries()).map(([q,H])=>this.flushTarget(q,H));this.pendingUpdates.clear(),await Promise.all(J)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(J,q={}){await this.appendPermissionRuleForDecision(J,"allow",q)}async appendPermissionDenyRule(J,q={}){await this.appendPermissionRuleForDecision(J,"deny",q)}async appendPermissionRuleForDecision(J,q,H){let K=H.scope??"local",Q=this.resolveFilePath("settings",K,H.projectDir);await this.flushTargetWithModifier(Q,(W)=>{let X=W.permissions??{allow:[],ask:[],deny:[]},Y={allow:q==="allow"?this.dedupeArray([...X.allow||[],J]):X.allow||[],ask:X.ask||[],deny:q==="deny"?this.dedupeArray([...X.deny||[],J]):X.deny||[]};return{...W,permissions:Y}})}async appendLocalPermissionRule(J,q={}){await this.appendPermissionRule(J,{...q,scope:"local"})}async appendLocalPermissionDenyRule(J,q={}){await this.appendPermissionDenyRule(J,{...q,scope:"local"})}validatePersistableFields(J){for(let q of Object.keys(J)){let H=U[q];if(!H)throw Error(`Unknown config field: ${q}`);if(!H.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(J,q,H){let K=new Map;for(let[Q,W]of Object.entries(J)){let X=U[Q];if(!X)continue;let Y=q??X.defaultScope,Z=this.resolveFilePath(X.target,Y,H);if(!K.has(Z))K.set(Z,{});K.get(Z)[Q]=W}return K}resolveFilePath(J,q,H){let K=H??V();if(J==="config")return q==="global"?B.join(w.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(w.homedir(),".blade","settings.json");default:return B.join(K,".blade","settings.local.json")}}scheduleSave(J,q){let H=this.pendingUpdates.get(J)??{},K=this.mergePendingUpdates(H,q);this.pendingUpdates.set(J,K);let Q=this.timers.get(J);if(Q)clearTimeout(Q);let W=setTimeout(async()=>{let X=this.pendingUpdates.get(J);if(X){this.pendingUpdates.delete(J),this.timers.delete(J);try{await this.flushTarget(J,X),this.lastSaveError=null}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));this.lastSaveError=Z,S.error(`Failed to save config to ${J}:`,Z.message),S.error("Stack trace:",Z.stack)}}},this.debounceDelay);this.timers.set(J,W)}mergePendingUpdates(J,q){let H={...J};for(let[K,Q]of Object.entries(q)){let W=U[K];if(!W){H[K]=Q;continue}switch(W.mergeStrategy){case"replace":H[K]=Q;break;case"append-dedupe":this.applyAppendDedupe(H,K,Q);break;case"deep-merge":this.applyDeepMerge(H,K,Q);break}}return H}async flushTarget(J,q){let H=this.fileLocks.get(J);if(!H)H=new j,this.fileLocks.set(J,H);await H.runExclusive(async()=>{await this.performWrite(J,q)})}async flushTargetWithModifier(J,q){let H=this.fileLocks.get(J);if(!H)H=new j,this.fileLocks.set(J,H);await H.runExclusive(async()=>{await D.mkdir(B.dirname(J),{recursive:!0,mode:493});let K={};try{let W=await D.readFile(J,"utf-8");K=JSON.parse(W)}catch{K={}}let Q=q(K);await this.atomicWrite(J,Q)})}async performWrite(J,q){await D.mkdir(B.dirname(J),{recursive:!0,mode:493});let H={};try{let Q=await D.readFile(J,"utf-8");H=JSON.parse(Q)}catch{H={}}let K={...H};for(let[Q,W]of Object.entries(q)){let X=U[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(J,K)}applyAppendDedupe(J,q,H){if(q==="permissions"&&typeof H==="object"&&H!==null){let K=J[q]??{allow:[],ask:[],deny:[]},Q=H;J[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(H)){let K=Array.isArray(J[q])?J[q]:[];J[q]=this.dedupeArray([...K,...H])}else J[q]=H}applyDeepMerge(J,q,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let K=typeof J[q]==="object"&&J[q]!==null?J[q]:{};J[q]=k({},K,H)}else J[q]=H}dedupeArray(J){return Array.from(new Set(J))}async atomicWrite(J,q){await C(J,JSON.stringify(q,null,2),{mode:384,encoding:"utf-8"})}}function O(){return z.getInstance()}export{G as Da,N as Ea,y as Fa,O as Ga};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{y as b}from"./chunk-twem6p0g.js";import{ra as T}from"./chunk-tv4r86ez.js";import{Da as S,Ea as h}from"./chunk-qwdbqjh7.js";import{Bb as r,wb as f,yb as n}from"./chunk-ctqf59q1.js";import{Eb as c,Hb as O,Jb as y}from"./chunk-gsfkrr25.js";import{Tb as M}from"./chunk-34pdtz4q.js";import{promises as N}from"node:fs";import E from"node:path";var k=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],B=new Set([...Object.keys(S),...k]),a=n.Number({exclusiveMinimum:0}),l=n.String({minLength:1}),m=n.Array(n.String()),C=n.Object({currentModelId:n.Optional(n.String()),models:n.Optional(n.Array(n.Object({id:l,displayName:n.Optional(l),provider:l,model:l,overrides:n.Optional(n.Object({baseUrl:n.Optional(n.String()),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(a),timeout:n.Optional(a),apiVersion:n.Optional(n.String()),customHeaders:n.Optional(n.Record(n.String(),n.String())),maxRetries:n.Optional(n.Integer({minimum:0})),enablePromptCaching:n.Optional(n.Boolean())})),fallbackModels:n.Optional(n.Array(n.Object({provider:l,model:l})))}))),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(a),stream:n.Optional(n.Boolean()),topP:n.Optional(n.Number()),topK:n.Optional(n.Number()),timeout:n.Optional(a),theme:n.Optional(n.String()),uiTheme:n.Optional(r(["light","dark","system"])),language:n.Optional(n.String()),fontSize:n.Optional(a),autoSaveSessions:n.Optional(n.Boolean()),notifyBuild:n.Optional(n.Boolean()),notifyErrors:n.Optional(n.Boolean()),notifySounds:n.Optional(n.Boolean()),privacyTelemetry:n.Optional(n.Boolean()),privacyCrash:n.Optional(n.Boolean()),debug:n.Optional(n.Union([n.Boolean(),n.String()])),mcpEnabled:n.Optional(n.Boolean()),mcpServers:n.Optional(n.Record(n.String(),n.Record(n.String(),n.Unknown()))),permissionMode:n.Optional(n.Enum(O)),maxTurns:n.Optional(n.Integer({minimum:-1,maximum:y})),systemPrompt:n.Optional(n.String()),appendSystemPrompt:n.Optional(n.String()),initialMessage:n.Optional(n.String()),resumeSessionId:n.Optional(n.String()),forkSession:n.Optional(n.Boolean()),allowedTools:n.Optional(n.Array(l)),disallowedTools:n.Optional(n.Array(l)),mcpConfigPaths:n.Optional(n.Array(l)),strictMcpConfig:n.Optional(n.Boolean()),model:n.Optional(l),addDirs:n.Optional(n.Array(l)),outputFormat:n.Optional(r(["text","json","stream-json","jsonl"])),inputFormat:n.Optional(r(["text","stream-json"])),print:n.Optional(n.Boolean()),includePartialMessages:n.Optional(n.Boolean()),replayUserMessages:n.Optional(n.Boolean()),agentsConfig:n.Optional(n.String()),settingSources:n.Optional(n.String()),permissions:n.Optional(n.Object({allow:n.Optional(m),ask:n.Optional(m),deny:n.Optional(m)})),env:n.Optional(n.Record(n.String(),n.String())),hooks:n.Optional(n.Record(n.String(),n.Unknown())),disableAllHooks:n.Optional(n.Boolean())}),R=[["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 u(o,e){let t;try{t=JSON.parse(o)}catch(i){let p=i instanceof Error?`: ${i.message}`:"";throw Error(`Invalid JSON provided to --settings (${e})${p}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let i of Object.keys(t))if(!B.has(i))throw Error(`Unknown --settings field: ${i}`);let s=f(C,t);if(!s.success){let i=s.error.issues.map((p)=>`${p.path.join(".")||"settings"}: ${p.message}`).join("; ");throw Error(`Invalid --settings value: ${i}`)}return s.data}async function w(o){if(o===void 0)return;let e=o.trim();if(!e)throw Error("--settings requires a JSON object or file path");if(e.startsWith("{"))return u(e,"inline JSON");let t=E.resolve(c(),e),s;try{s=await N.readFile(t,"utf8")}catch(i){let p=i instanceof Error?`: ${i.message}`:"";throw Error(`Unable to read --settings file ${t}${p}`)}return u(s,t)}function P(o,e){if(!e)return;let t=e;for(let[s,i]of R){if(s==="permissionMode"&&o.yolo===!0)continue;if(o[i]===void 0&&t[s]!==void 0)o[i]=t[s]}}var d=M("General"),z=(o)=>{if(o.yolo){if(o.permissionMode&&o.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");o.permissionMode="yolo"}if(Array.isArray(o.allowedTools))o.allowedTools=o.allowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.disallowedTools))o.disallowedTools=o.disallowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.allowedTools)&&Array.isArray(o.disallowedTools)){let e=o.allowedTools.filter((t)=>o.disallowedTools.includes(t));if(e.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${e.join(", ")}`)}},L=async(o)=>{let e=await w(typeof o.settings==="string"?o.settings:void 0);if(P(o,e),typeof o.agents==="string")b(o.agents);I(o);try{let s=await h.getInstance().initialize(e);if(T().config.actions.setConfig(s),o.debug)d.info("[CLI] 配置已加载到 Store")}catch(t){d.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 I(o){if(o.continue&&o.resume)throw Error("Cannot use both --continue and --resume flags simultaneously");if(o.forkSession&&!o.continue&&!o.resume)throw Error("--fork-session requires --resume or --continue");if(o.sessionId&&(o.continue||o.resume)&&!o.forkSession)throw Error("--session-id can only be combined with --resume or --continue when --fork-session is set")}var V=(o)=>{if(o.outputFormat&&o.outputFormat!=="text"&&!o.print&&!o.headless)throw Error("--output-format can only be used with --print or --headless");if(o.headless&&o.outputFormat&&!["text","jsonl"].includes(o.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${o.outputFormat}". Use --print for json|stream-json support.`);if(o.print&&o.outputFormat&&!["text","json","stream-json"].includes(o.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${o.outputFormat}". Use --headless for jsonl support.`);if(o.inputFormat==="stream-json"&&o.print)d.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};
|
|
6
|
+
export{z as v,L as w,V as x};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import{Ea as Y0,Ga as x}from"./chunk-qwdbqjh7.js";import{Cb as Q0}from"./chunk-jt62ctz7.js";import{dc as l}from"./chunk-hjx5n3dw.js";import{nanoid as I0}from"nanoid";import{devtools as N0,subscribeWithSelector as R0}from"zustand/middleware";import{createStore as y0}from"zustand/vanilla";var V0={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)"}},G0={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)"}},J0={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)"}},U0={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)"}},K0={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)"}},W0={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)"}},O0={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)"}},d=[{id:"ayu-dark",label:"Ayu Dark",theme:V0,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:G0,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:F0,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:J0,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:j0,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:U0,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:K0,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:W0,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:O0,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:q0,tags:["dark","japanese"]}];var r={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"}},M={name:"default",colors:r,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={...M,name:"dark",colors:{...r,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 c{currentTheme=M;themes=new Map;constructor(){this.themes.set("default",M),this.themes.set("dark",w0);for(let X of d)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 i=new c;var x0={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},f=(X)=>({...x0,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},b=(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((V)=>({command:{...V.command,pendingCommands:$}})),Y},clearQueue:()=>{X((Q)=>({command:{...Q.command,pendingCommands:[]}}))},setRecoveredSteeringCount:(Q)=>{X((Y)=>({command:{...Y.command,recoveredSteeringCount:Math.max(0,Q)}}))}}});var v0={config:null},h=(X)=>({...v0,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 D0={currentFocus:"main-input",previousFocus:null},p=(X)=>({...D0,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}}))}}});function o(X,Z,Q,Y=0,$=0,V){let J=l(),H=V?J.models.getModel(V,X):J.models.getModels().find((W)=>W.id===X);if(!H)return 0;let U=H.cost,_=Z/1e6*U.input+Q/1e6*U.output+Y/1e6*U.cacheRead+$/1e6*U.cacheWrite;return Math.round(_*1e6)/1e6}var j={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 g0(X){let Z=[],Q=X.split(/\r?\n/),Y=!1,$=[],V=null,J=0,H=!1,U=[],_=[],W=!1,P=[],v=!1,O=[],F=0,G=!0;for(let w=0;w<Q.length;w++){let K=Q[w];if(W){if(K.match(j.diffEnd)){try{let q=JSON.parse(P.join(`
|
|
2
|
+
`));Z.push({type:"diff",content:"",diffData:{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine}})}catch(q){Z.push({type:"text",content:P.join(`
|
|
3
|
+
`)})}W=!1,P=[],G=!1;continue}P.push(K);continue}if(K.match(j.diffStart)){W=!0,P=[],G=!1;continue}if(Y){let q=K.match(j.codeBlock),D=K.trim()==="```";if(q&&q[1])J++,$.push(K);else if(D)if(J>0)J--,$.push(K);else{let $0=$.join(`
|
|
4
|
+
`);Z.push({type:"code",content:$0,language:V||void 0}),Y=!1,$=[],V=null,J=0,G=!1}else $.push(K);continue}let N=K.match(j.codeBlock);if(N){Y=!0,V=N[1]||null,J=0,G=!1;continue}let A=K.match(j.table),Z0=K.match(j.tableSeparator);if(A&&!H){if(w+1<Q.length){if(Q[w+1].match(j.tableSeparator)){H=!0,U=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0),_=[],G=!1;continue}}}if(H&&Z0)continue;if(H&&A){let q=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0);while(q.length<U.length)q.push("");if(q.length>U.length)q.length=U.length;_.push(q);continue}if(H&&!A){if(U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});H=!1,U=[],_=[]}let S=K.match(j.blockquote);if(S){let q=S[1].length,D=S[2]||"";if(v&&q===F)O.push(D);else{if(v)Z.push({type:"blockquote",content:O.join(`
|
|
5
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]});v=!0,F=q,O=[D]}G=!1;continue}if(v)Z.push({type:"blockquote",content:O.join(`
|
|
6
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]}),v=!1,O=[],F=0;let T=K.match(j.heading);if(T){Z.push({type:"heading",content:T[2],level:T[1].length}),G=!1;continue}let R=K.match(j.ulItem);if(R){Z.push({type:"list",content:R[3],listType:"ul",marker:R[2],indentation:R[1].length}),G=!1;continue}let y=K.match(j.olItem);if(y){Z.push({type:"list",content:y[3],listType:"ol",marker:y[2],indentation:y[1].length}),G=!1;continue}if(K.match(j.hr)){Z.push({type:"hr",content:""}),G=!1;continue}if(K.trim().length===0){if(!G)Z.push({type:"empty",content:""}),G=!0;continue}let g=K.match(j.commandMessage);if(g){Z.push({type:"command-message",content:g[1]}),G=!1;continue}Z.push({type:"text",content:K}),G=!1}if(Y){let w=$.join(`
|
|
7
|
+
`);Z.push({type:"code",content:w,language:V||void 0})}if(H&&U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});if(v&&O.length>0)Z.push({type:"blockquote",content:O.join(`
|
|
8
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var E=new Map;function B0(){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 E0(X){let Z=E.get(X);if(Z)return Z;let Q={state:B0(),blocks:[],pendingLine:"",finalized:!1};return E.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 k(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 u(X,Z,Q=!0){let{state:Y,blocks:$}=Z;if(Y.pendingTableHeader!==null){if(X.match(j.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(j.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(j.diffStart)){Y.inDiff=!0,Y.diffContent=[],Y.lastLineEmpty=!1;return}if(Y.inCodeBlock){let F=X.match(j.codeBlock),G=X.trim()==="```";if(F&&F[1])Y.codeBlockDepth++,Y.codeBlockContent.push(X);else if(G)if(Y.codeBlockDepth>0)Y.codeBlockDepth--,Y.codeBlockContent.push(X);else s(Y,$);else Y.codeBlockContent.push(X);return}let V=X.match(j.codeBlock);if(V){Y.inCodeBlock=!0,Y.codeBlockLang=V[1]||null,Y.codeBlockDepth=0,Y.lastLineEmpty=!1;return}let J=X.match(j.table),H=X.match(j.tableSeparator);if(J&&!Y.inTable){Y.pendingTableHeader=X;return}if(Y.inTable&&H)return;if(Y.inTable&&J){let F=J[1].split("|").map((G)=>G.trim()).filter((G)=>G.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){u(X,Z,!1);return}}let U=X.match(j.blockquote);if(U){let F=U[1].length,G=U[2]||"";if(Y.inBlockquote&&F===Y.blockquoteLevel)Y.blockquoteLines.push(G);else{if(Y.inBlockquote)k(Y,$);Y.inBlockquote=!0,Y.blockquoteLevel=F,Y.blockquoteLines=[G]}Y.lastLineEmpty=!1;return}if(Y.inBlockquote)k(Y,$);let _=X.match(j.heading);if(_){$.push({type:"heading",content:_[2],level:_[1].length}),Y.lastLineEmpty=!1;return}let W=X.match(j.ulItem);if(W){$.push({type:"list",content:W[3],listType:"ul",marker:W[2],indentation:W[1].length}),Y.lastLineEmpty=!1;return}let P=X.match(j.olItem);if(P){$.push({type:"list",content:P[3],listType:"ol",marker:P[2],indentation:P[1].length}),Y.lastLineEmpty=!1;return}if(X.match(j.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 O=X.match(j.commandMessage);if(O){$.push({type:"command-message",content:O[1]}),Y.lastLineEmpty=!1;return}$.push({type:"text",content:X}),Y.lastLineEmpty=!1}function c0(X,Z){if(!X||!Z)return;let Q=E0(X);if(Q.finalized)return;let Y=Q.pendingLine+Z,$=Y.split(`
|
|
13
|
+
`),V=Y.endsWith(`
|
|
14
|
+
`),J=V?$:$.slice(0,-1);Q.pendingLine=V?"":$[$.length-1]??"";for(let H of J)u(n(H),Q)}function i0(X){let Z=E.get(X);if(!Z||Z.finalized)return;if(Z.pendingLine)u(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)k(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 l0(X){let Z=E.get(X);if(!Z||!Z.finalized)return null;return Z.blocks}function o0(X){let Z=E.get(X);if(!Z)return null;return Z.blocks}function A0(X){let Z=E.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 V of Y.blockquoteLines)Q.push($+V)}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=E.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=A0(X);if(!Y||Y.length===0)return null;return{lines:Y,mode:Q}}function a0(X){E.delete(X)}function C(){E.clear()}var t=2000,I=[];function L0(){let X=I;return I=[],X}var X0={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:0,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((V)=>({session:{...V.session,messages:[...V.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:()=>{C(),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:()=>{C(),X((Q)=>({session:{...Q.session,...e,sessionId:Q.session.sessionId,isActive:!0}}))},restoreSession:(Q,Y,$)=>{C(),X((V)=>({session:{...V.session,sessionId:Q,messages:Y,restoredContextMessages:$??null,restoredVisibleMessageCount:$?Y.length:0,error:null,isActive:!0}}))},updateTokenUsage:(Q)=>{X((Y)=>{let $=Y.session.tokenUsage,{costUsd:V,...J}=Q,H=Math.max(0,Q.inputTokens??0),U=Math.max(0,Q.outputTokens??0),_=Math.max(0,Q.cacheReadTokens??0),W=Math.max(0,Q.cacheWriteTokens??0),P=$.totalInputTokens+H,v=$.totalOutputTokens+U,O=$.cacheReadTokens+_,F=$.cacheWriteTokens+W,G=Y.config?.config,w=G?.models?.find((A)=>A.id===G.currentModelId),K=w?.model??"",N=V??o(K,Math.max(0,H-_-W),U,_,W,w?.provider);return{session:{...Y.session,tokenUsage:{...$,...J,totalInputTokens:P,totalOutputTokens:v,cacheReadTokens:O,cacheWriteTokens:F,estimatedCostUsd:$.estimatedCostUsd+Math.max(0,N)}}}})},resetContextUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...Q.session.tokenUsage,inputTokens:0,outputTokens:0,totalTokens:0}}}))},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 I=[],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 I.push(Q),X((V)=>{let J=(w)=>w.endsWith("\r")?w.slice(0,-1):w,H=Y?V.session.currentStreamingLines:[],U=Y?V.session.currentStreamingTail:"",_=Y?V.session.currentStreamingLineCount:0,W=Y?V.session.currentStreamingVersion:0,v=(U+Q).split(`
|
|
16
|
+
`),O=v.slice(0,-1).map(J),F=J(v[v.length-1]??""),G=H;if(O.length>0){if(G=[...H,...O],G.length>t){let w=G.length-t;G=G.slice(w)}}return{session:{...V.session,currentStreamingMessageId:$,currentStreamingLines:G,currentStreamingTail:F,currentStreamingLineCount:_+O.length,currentStreamingVersion:W+1,error:null}}}),$},finalizeStreamingMessage:(Q,Y)=>{let $=L0();X((V)=>{let J=V.session.currentStreamingMessageId,U=$.join("")+(Q||""),_=(V.session.currentThinkingContent||"")+(Y||"");if(U.length>0){let W={id:J||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:U,timestamp:Date.now(),thinkingContent:_||void 0};return{session:{...V.session,messages:[...V.session.messages,W],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:W.id}}}return{session:{...V.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{X((Q)=>({session:{...Q.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{I=[],X((Q)=>({session:{...Q.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))}}});var C0=y0()(N0(R0((...X)=>({session:m(...X),app:f(...X),config:h(...X),focus:p(...X),command:b(...X)})),{name:"BladeStore",enabled:!0})),z=()=>C0.getState(),K1=()=>z().session.actions,W1=()=>z().app.actions,O1=()=>z().session.messages,B=()=>z().config.config,L=null;async function q1(){if(B()!==null)return;if(L)return L;return L=(async()=>{try{let Q=await Y0.getInstance().initialize();z().config.actions.setConfig(Q)}catch(Z){throw L=null,Error(`[FAIL] Store 未初始化且无法自动初始化
|
|
17
|
+
|
|
18
|
+
`+`原因: ${Z instanceof Error?Z.message:"未知错误"}
|
|
19
|
+
|
|
20
|
+
`+`请确保:
|
|
21
|
+
`+`1. 配置文件格式正确 (~/.blade/config.json)
|
|
22
|
+
`+`2. 运行 blade 进行首次配置
|
|
23
|
+
`+"3. 配置文件权限正确")}finally{L=null}})(),L}var w1=()=>z().config.config?.models??[],x1=()=>{let X=B();if(!X)return;let Z=X.currentModelId;return X.models.find((Y)=>Y.id===Z)??X.models[0]},P1=(X)=>{let Z=B();if(!Z)return;return Z.models.find((Q)=>Q.id===X)},v1=()=>z().config.config?.mcpServers??{},D1=()=>z().app.thinkingModeEnabled,B1=()=>({setPermissionMode:async(X)=>{z().config.actions.updateConfig({permissionMode:X})},setTheme:async(X,Z={})=>{try{i.setTheme(X)}catch{return}z().config.actions.updateConfig({theme:X}),await x().save({theme:X},{scope:"global",...Z})},setLanguage:async(X,Z={})=>{z().config.actions.updateConfig({language:X}),await x().save({language:X},{scope:"global",...Z})},setDebug:async(X,Z={})=>{z().config.actions.updateConfig({debug:X}),await x().save({debug:X},{scope:"global",...Z})},setTemperature:async(X,Z={})=>{z().config.actions.updateConfig({temperature:X}),await x().save({temperature:X},{scope:"global",...Z})},updateConfig:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y={...Q};z().config.actions.updateConfig(X);try{await x().save(X,Z)}catch($){throw z().config.actions.setConfig(Y),$}},flush:async()=>{await x().flush()},appendPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendPermissionRule(X,Z)},appendLocalPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendLocalPermissionRule(X,Z)},setCurrentModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(!Q.models.find(($)=>$.id===X))throw Error(`Model not found: ${X}`);z().config.actions.updateConfig({currentModelId:X}),await x().save({currentModelId:X},{scope:"global",...Z})},addModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y="id"in X?X:{id:I0(),...X};if(Q.models.find((H)=>H.provider===Y.provider&&H.model===Y.model))throw Error(`Model already configured: ${Y.provider}/${Y.model}`);let J={models:[...Q.models,Y]};if(Q.models.length===0)J.currentModelId=Y.id;return z().config.actions.updateConfig(J),await x().save(J,{scope:"global",...Z}),Y},updateModel:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let $=Y.models.findIndex((J)=>J.id===X);if($===-1)throw Error(`Model not found: ${X}`);let V=[...Y.models];V[$]={...V[$],...Z},z().config.actions.updateConfig({models:V}),await x().save({models:V},{scope:"global",...Q})},removeModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(Q.models.length===1)throw Error("Cannot remove the only model");let Y=Q.models.filter((V)=>V.id!==X),$={models:Y};if(Q.currentModelId===X)$.currentModelId=Y[0].id;z().config.actions.updateConfig($),await x().save($,{scope:"global",...Z})},addMcpServer:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let V={...Y.mcpServers??{},[X]:Z};z().config.actions.updateConfig({mcpServers:V}),await x().save({mcpServers:V},{scope:"project",...Q})},removeMcpServer:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let $={...Q.mcpServers??{}};delete $[X],z().config.actions.updateConfig({mcpServers:$}),await x().save({mcpServers:$},{scope:"project",...Z})}});
|
|
24
|
+
export{d as ga,i as ha,j as ia,g0 as ja,c0 as ka,i0 as la,l0 as ma,o0 as na,n0 as oa,a0 as pa,C0 as qa,z as ra,K1 as sa,W1 as ta,O1 as ua,B as va,q1 as wa,w1 as xa,x1 as ya,P1 as za,v1 as Aa,D1 as Ba,B1 as Ca};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{aa as W}from"./chunk-9ad7tt9s.js";import{Bb as H,wb as F,yb as k}from"./chunk-ctqf59q1.js";import{Jb as V}from"./chunk-gsfkrr25.js";var $=k.String({minLength:1,maxLength:128,pattern:"^[A-Za-z0-9][A-Za-z0-9_-]*$"}),Q=k.Array(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"}),{maxItems:128}),b=k.Object({description:k.String({minLength:1,maxLength:4096,pattern:".*\\S.*"}),prompt:k.String({minLength:1,maxLength:1e5,pattern:".*\\S.*"}),tools:k.Optional(Q),disallowedTools:k.Optional(Q),model:k.Optional(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"})),permissionMode:k.Optional(H(["default","acceptEdits","dontAsk","bypassPermissions","plan","ignore"])),maxTurns:k.Optional(k.Integer({minimum:1,maximum:V})),isolation:k.Optional(H(["none","worktree"]))},{additionalProperties:!1});function O(Y){let w;try{w=JSON.parse(Y)}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 I=Object.entries(w);if(I.length>64)throw Error("--agents supports at most 64 definitions");return I.map(([z,Z])=>{if(!F($,z).success)throw Error(`Invalid --agents name "${z}": use letters, numbers, hyphens, or underscores`);let K=F(b,Z);if(!K.success)throw Error(`Invalid --agents definition for "${z}"`);let q=K.data;return{name:z,description:q.description.trim(),systemPrompt:q.prompt.trim(),tools:q.tools?[...new Set(q.tools.map((B)=>B.trim()))]:void 0,disallowedTools:q.disallowedTools?[...new Set(q.disallowedTools.map((B)=>B.trim()))]:void 0,model:q.model?.trim(),permissionMode:q.permissionMode===void 0?void 0:W(q.permissionMode),maxTurns:q.maxTurns,isolation:q.isolation,source:"flag"}})}
|
|
2
|
+
export{O as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a,h as b,i as c,j as d,k as e}from"./chunk-1smf2dj3.js";import"./chunk-dr06x0cw.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Pb as a}from"./chunk-0dj326ms.js";import"./chunk-34pdtz4q.js";import"./chunk-hjx5n3dw.js";import"./chunk-dr06x0cw.js";export{a as createChatServiceAsync};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{ra as Q}from"./chunk-
|
|
1
|
+
import{ra as Q}from"./chunk-tv4r86ez.js";import{vb as U}from"./chunk-49g067ek.js";import{Ib as O}from"./chunk-gsfkrr25.js";import{Rb as K,Tb as N}from"./chunk-34pdtz4q.js";function Y(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var A=N("Service");function Z(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class D{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!D.instance)D.instance=new D;return D.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
|
|
2
2
|
再按一次 Ctrl+C 退出
|
|
3
3
|
`)}),this.initialized=!0,A.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup(b){return this.cleanupHandlers.push(b),A.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let q=this.cleanupHandlers.indexOf(b);if(q!==-1)this.cleanupHandlers.splice(q,1),A.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError(b,q){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${b}):`,q);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${b})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",q.message),console.error(""),q.stack)console.error("堆栈跟踪:"),console.error(q.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown(b,1)}async shutdown(b,q=0){if(this.isShuttingDown){A.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,A.info(`[GracefulShutdown] 开始优雅退出 (原因: ${b})`);try{await K()}catch(z){}try{let z=U.getInstance();if(z.isEnabled()){let F=Q(),W=F.session?.sessionId||"unknown",X=F.config?.config?.permissionMode||"default";await z.executeSessionEndHooks(Z(b),{projectDir:O(),sessionId:W,permissionMode:X})}}catch(z){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",z)}let B=5000,V=new Promise((z,F)=>{setTimeout(()=>{F(Error(`清理超时 (${B}ms)`))},B)});try{let z=this.runCleanupHandlers();await Promise.race([z,V])}catch(z){console.error("[GracefulShutdown] 清理过程中发生错误:",z)}finally{Y(),setTimeout(()=>{process.exit(q)},100)}}async runCleanupHandlers(){let b=[...this.cleanupHandlers].reverse();for(let q of b)try{let B=q();if(B instanceof Promise)await B}catch(B){console.error("[GracefulShutdown] 清理函数执行失败:",B)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var J=()=>{return D.getInstance()},H=(b)=>{return J().registerCleanup(b)},P=()=>{J().initialize()},L=(b=0)=>{J().shutdown("normal",b)};
|
|
4
4
|
export{J as l,H as m,P as n,L as o};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{ca as O}from"./chunk-
|
|
1
|
+
import{ca as O}from"./chunk-e4a240t7.js";import{Aa as J,Ca as L}from"./chunk-tv4r86ez.js";import"./chunk-qwdbqjh7.js";import"./chunk-6es6av6j.js";import"./chunk-9xkjb87h.js";import"./chunk-ctqf59q1.js";import"./chunk-jt62ctz7.js";import{Ib as H}from"./chunk-gsfkrr25.js";import"./chunk-34pdtz4q.js";import"./chunk-hjx5n3dw.js";import"./chunk-dr06x0cw.js";import P from"os";import E from"path";function _(q){return typeof q==="string"?q:void 0}function T(q){if(!Array.isArray(q))return;let z=[];for(let F of q)if(typeof F==="string")z.push(F);else if(F!=null)z.push(String(F));return z}function G(){console.log(`
|
|
2
2
|
blade mcp
|
|
3
3
|
`),console.log(`管理 MCP 服务器
|
|
4
4
|
`),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{a as Q,b as R,c as T,d as W}from"./chunk-3gw66r7a.js";import"./chunk-xhnyy54e.js";import"./chunk-jakzknh3.js";import"./chunk-9ad7tt9s.js";import"./chunk-e4a240t7.js";import"./chunk-bm8vwfez.js";import{wa as J}from"./chunk-tv4r86ez.js";import"./chunk-qwdbqjh7.js";import"./chunk-d4ex0qvs.js";import{Ka as M}from"./chunk-6es6av6j.js";import"./chunk-1pt090dg.js";import"./chunk-9xkjb87h.js";import"./chunk-49g067ek.js";import"./chunk-ctqf59q1.js";import"./chunk-jt62ctz7.js";import"./chunk-gsfkrr25.js";import"./chunk-0dj326ms.js";import"./chunk-34pdtz4q.js";import"./chunk-hjx5n3dw.js";import"./chunk-dr06x0cw.js";import b from"chalk";import H from"open";var $=`
|
|
2
2
|
____ _ _
|
|
3
3
|
| __ )| | __ _ __| | ___
|
|
4
4
|
| _ \\| |/ _\` |/ _\` |/ _ \\
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{g as o}from"./chunk-1smf2dj3.js";import"./chunk-dr06x0cw.js";import{execSync as r}from"child_process";var l={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let e=await o(!0);if(console.log(`Current version: ${e.currentVersion}`),e.error){console.log(`Warning: ${e.error}`);return}if(e.latestVersion)console.log(`Latest version: ${e.latestVersion}`);if(e.hasUpdate&&e.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${e.currentVersion} -> ${e.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{r("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(t){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch(e){console.error(`Error: Failed to check for updates: ${e instanceof Error?e.message:"未知错误"}`),process.exit(1)}}};export{l as updateCommands};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{I as m,T as g,U as c,X as d,Z as f}from"./chunk-jakzknh3.js";import{Ib as u}from"./chunk-gsfkrr25.js";async function R(){if((await g().initialize(u(),[])).plugins.length>0)await c()}async function x(t){let e=t.message||t._?.[0];if(typeof e==="string"&&e.trim())return e;let n=t.stdin??process.stdin;if(!n.isTTY){let a=[];for await(let l of n)a.push(l);return Buffer.concat(a).toString("utf-8").trim()}if(t.defaultMessage!==void 0)return t.defaultMessage;throw Error("No input provided")}async function P(t){if(!d(t))return{mode:"agent",content:t};let e=await f(t,{cwd:u(),workspaceRoot:u()});if(!e.success)return{mode:"output",content:`Error: ${e.error||"未知错误"}`,exitCode:1};let n=e.data;if(n?.action==="invoke_skill"){let{skillName:a,skillArgs:l}=n;return{mode:"agent",content:l?`Please use the "${a}" skill to help me with: ${l}`:`Please use the "${a}" skill.`}}if(n?.action==="invoke_custom_command"||n?.action==="invoke_plugin_command"){let a=n.processedContent;return{mode:"agent",content:`# Custom Command: /${n.commandName}
|
|
2
2
|
|
|
3
3
|
${a}`}}return{mode:"output",content:e.content||e.message||"",exitCode:0}}function r(t){if(!(t instanceof Error))return!1;return t.message.includes("未找到会话")||t.message.includes("ENOENT")||t.message.includes("no such file")}async function i(t){try{return await m.loadSession(t,u())}catch(e){if(r(e))return null;throw e}}async function y(t){if(t.resume===!0||t.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof t.resume==="string"&&t.resume.length>0){if(t.forkSession){let e=u();return m.forkSession(t.resume,{newSessionId:t.sessionId,sourceProjectPath:e,targetProjectPath:e})}return{sessionId:t.resume,messages:await m.loadSession(t.resume)}}if(t.continue){let e=t.forkSession?await m.listSessions({cwd:u()}):await m.listSessions();if(e.length>0){let n=e[0].sessionId;if(t.forkSession){let a=u();return m.forkSession(n,{newSessionId:t.sessionId,sourceProjectPath:a,targetProjectPath:a})}return{sessionId:n,messages:await m.loadSession(n)}}if(t.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(t.sessionId)return{sessionId:t.sessionId,messages:await i(t.sessionId)??[]};return{sessionId:`${t.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
|
|
4
4
|
export{R as p,x as q,P as r,y as s};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as ue}from"./vendor-markdown-Bo4W9Tae.js";import{r as i,j as e}from"./vendor-react-BalntB5F.js";import{c as F,u as Fe,e as $,s as re,B as Ce,f as ae}from"./index-9kl44E8k.js";import{n as Be,L as xe,o as me,p as pe}from"./vendor-radix-CESj0OOY.js";import{u as Se}from"./SettingsStore-B87y64B4.js";import{X as Le,k as ne,n as se,i as be,x as Re,y as De}from"./vendor-icons-BuFpOlRn.js";import"./vendor-monaco-w6PwaWGP.js";const Te=Be,ge=i.forwardRef(({className:t,...a},r)=>e.jsx(xe,{ref:r,className:F("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...a}));ge.displayName=xe.displayName;const z=i.forwardRef(({className:t,...a},r)=>e.jsx(me,{ref:r,className:F("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",t),...a}));z.displayName=me.displayName;const W=i.forwardRef(({className:t,...a},r)=>e.jsx(pe,{ref:r,className:F("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...a}));W.displayName=pe.displayName;const Ae={"ayu-dark":{background:{primary:"#0f1419",secondary:"#14191f"},text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773"},border:{light:"#2d323b"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},dracula:{background:{primary:"#282a36",secondary:"#44475a"},text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4"},border:{light:"#44475a"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},monokai:{background:{primary:"#272822",secondary:"#3e3d32"},text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e"},border:{light:"#3e3d32"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},nord:{background:{primary:"#2e3440",secondary:"#3b4252"},text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a"},border:{light:"#434c5e"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},"solarized-light":{background:{primary:"#fdf6e3",secondary:"#eee8d5"},text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1"},border:{light:"#eee8d5"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},"solarized-dark":{background:{primary:"#002b36",secondary:"#073642"},text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75"},border:{light:"#073642"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},"tokyo-night":{background:{primary:"#1a1b26",secondary:"#292e42"},text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89"},border:{light:"#292e42"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},github:{background:{primary:"#ffffff",secondary:"#f6f8fa"},text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781"},border:{light:"#d0d7de"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},gruvbox:{background:{primary:"#282828",secondary:"#3c3836"},text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374"},border:{light:"#3c3836"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#b8bb26",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#fabd2f",default:"#ebdbb2"}},"one-dark":{background:{primary:"#282c34",secondary:"#21252b"},text:{primary:"#abb2bf",secondary:"#e5c07b",muted:"#5c6370"},border:{light:"#3e4451"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},catppuccin:{background:{primary:"#1e1e2e",secondary:"#313244"},text:{primary:"#cdd6f4",secondary:"#f5e0dc",muted:"#6c7086"},border:{light:"#313244"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#f5e0dc",operator:"#89dceb",type:"#f9e2af",tag:"#f38ba8",attr:"#f9e2af",default:"#cdd6f4"}},"rose-pine":{background:{primary:"#191724",secondary:"#1f1d2e"},text:{primary:"#e0def4",secondary:"#908caa",muted:"#6e6a86"},border:{light:"#26233a"},syntax:{comment:"#6e6a86",string:"#f6c177",number:"#ebbcba",keyword:"#c4a7e7",function:"#9ccfd8",variable:"#e0def4",operator:"#31748f",type:"#eb6f92",tag:"#eb6f92",attr:"#c4a7e7",default:"#e0def4"}},kanagawa:{background:{primary:"#1f1f28",secondary:"#2a2a37"},text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169"},border:{light:"#2a2a37"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#e46876",attr:"#ffa066",default:"#dcd7ba"}}};function _e(t){const a=t.replace("#",""),r=parseInt(a.substring(0,2),16),s=parseInt(a.substring(2,4),16),o=parseInt(a.substring(4,6),16);return(.299*r+.587*s+.114*o)/255<.5}function $e(t){return{base:_e(t.background.primary)?"vs-dark":"vs",inherit:!0,rules:[{token:"",foreground:t.text.primary.replace("#",""),background:t.background.primary.replace("#","")},{token:"comment",foreground:t.syntax.comment.replace("#",""),fontStyle:"italic"},{token:"string",foreground:t.syntax.string.replace("#","")},{token:"number",foreground:t.syntax.number.replace("#","")},{token:"keyword",foreground:t.syntax.keyword.replace("#","")},{token:"type",foreground:t.syntax.type.replace("#","")},{token:"identifier",foreground:t.syntax.variable.replace("#","")},{token:"function",foreground:t.syntax.function.replace("#","")},{token:"variable",foreground:t.syntax.variable.replace("#","")},{token:"operator",foreground:t.syntax.operator.replace("#","")},{token:"delimiter",foreground:t.syntax.operator.replace("#","")},{token:"tag",foreground:t.syntax.tag.replace("#","")},{token:"attribute.name",foreground:t.syntax.attr.replace("#","")},{token:"attribute.value",foreground:t.syntax.string.replace("#","")}],colors:{"editor.background":t.background.primary,"editor.foreground":t.text.primary,"editor.lineHighlightBackground":t.background.secondary,"editor.selectionBackground":`${t.syntax.function}40`,"editorLineNumber.foreground":t.text.muted,"editorLineNumber.activeForeground":t.text.secondary,"editorCursor.foreground":t.text.primary,"editorIndentGuide.background":t.border.light,"editorWidget.background":t.background.secondary,"editorWidget.border":t.border.light,"scrollbarSlider.background":`${t.text.muted}40`,"scrollbarSlider.hoverBackground":`${t.text.muted}60`}}}const oe=new Set;function de(t,a){const r=a.toLowerCase().replace(/\s+/g,"-"),s=Ae[r];if(!s)return"vs-dark";if(!oe.has(r)){const o=$e(s);t.editor.defineTheme(r,o),oe.add(r)}return r}i.lazy(async()=>({default:(await ue(()=>import("./vendor-react-BalntB5F.js").then(a=>a.k),[])).DiffEditor}));const ze=i.lazy(async()=>({default:(await ue(()=>import("./vendor-react-BalntB5F.js").then(a=>a.k),[])).Editor}));function ie(t,a){return t instanceof Error?t.message:a}function Ye(){const{toggleFilePreview:t}=Fe(),{messages:a,currentSessionRef:r}=$(),[s,o]=i.useState("diff"),[l,c]=i.useState([]),[d,u]=i.useState({}),[x,m]=i.useState(!1),[b,p]=i.useState(null),[q,E]=i.useState({}),[C,I]=i.useState({}),[v,Q]=i.useState(null),[ye,P]=i.useState(""),[G,O]=i.useState(!1),[V,J]=i.useState(null),[Y,H]=i.useState(!1),Z=i.useRef(r),B=i.useRef(0),D=i.useRef(0),T=i.useRef({}),K=i.useRef(0),S=i.useRef({}),j=i.useRef({}),U=i.useRef(null);i.useLayoutEffect(()=>{re(Z.current,r)||(B.current+=1),Z.current=r},[r]);const X=(n,f)=>f===B.current&&re($.getState().currentSessionRef,n),M=async(n,f="")=>{const g=f?`/suggestions/files/tree?path=${encodeURIComponent(f)}`:"/suggestions/files/tree",h=await fetch(g,{headers:ae(n)});if(!h.ok)throw new Error("Failed to load tree");return(await h.json()).map(y=>({...y,children:y.type==="dir"?[]:void 0}))};i.useEffect(()=>{const n=++D.current;return(async()=>{if(!r){c([]),m(!1),p(null);return}const g={...r},h=B.current,k=()=>n===D.current&&X(g,h);if(k()){c([]),m(!0),p(null);try{const y=await M(g);k()&&c(y)}catch(y){k()&&p(ie(y,"Failed to load tree"))}finally{k()&&m(!1)}}})(),()=>{D.current===n&&(D.current+=1)}},[r==null?void 0:r.projectPath,r==null?void 0:r.sessionId]),i.useEffect(()=>{U.current=null,S.current={},j.current={},T.current={},K.current+=1,Q(null),P(""),O(!1),J(null),H(!1),E({}),u({})},[r==null?void 0:r.projectPath,r==null?void 0:r.sessionId]);const A=i.useMemo(()=>Ie(a),[a]),ee=i.useMemo(()=>qe(a),[a]),[ke,ve]=i.useState({}),Ee=n=>{ve(f=>({...f,[n]:!f[n]}))},je=async n=>{const f=$.getState().currentSessionRef;if(!f)return;const g=B.current,h=++K.current,k=()=>h===K.current&&U.current===n&&X(f,g);U.current=n,Q(n),P(""),O(!0),J(null),H(!1);try{const y=await fetch(`/suggestions/files/content?path=${encodeURIComponent(n)}`,{headers:ae(f)});if(!y.ok)throw new Error("Failed to load file");const L=await y.json();k()&&(P(L.content||""),H(!!L.truncated))}catch(y){k()&&J(ie(y,"Failed to load file"))}finally{k()&&O(!1)}},we=async n=>{const f=(T.current[n]??0)+1;T.current[n]=f;const g=!S.current[n],h={...S.current,[n]:g};if(S.current=h,E(h),!g||j.current[n])return;const k=$.getState().currentSessionRef;if(!k)return;const y=B.current,L=()=>T.current[n]===f&&S.current[n]===!0&&X(k,y);try{const _=await M(k,n);if(L()){const te={...j.current,[n]:_};j.current=te,u(te)}}catch{if(L()){const _={...j.current,[n]:[]};j.current=_,u(_)}}},Ne=n=>{I(f=>({...f,[n]:!f[n]}))};return e.jsxs("div",{className:"w-[55%] min-w-[420px] max-w-[860px] border-l border-[#E5E7EB] dark:border-zinc-800 bg-white dark:bg-[#09090b] flex flex-col h-full shadow-xl shrink-0",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 h-12 border-b border-[#E5E7EB] dark:border-zinc-800 shrink-0",children:[e.jsx("span",{className:"font-normal text-[13px] text-[#6B7280] dark:text-zinc-400 font-mono",children:"Preview"}),e.jsx(Ce,{variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-zinc-500 dark:hover:text-zinc-300 dark:hover:bg-zinc-800/50",children:e.jsx(Le,{className:"w-4 h-4"})})]}),e.jsxs(Te,{value:s,onValueChange:n=>o(n),className:"flex flex-col flex-1 min-h-0",children:[e.jsx("div",{className:"px-4 py-3 border-b border-[#E5E7EB] dark:border-zinc-800",children:e.jsxs(ge,{className:"bg-white dark:bg-[#111113] border border-[#E5E7EB] dark:border-[#27272a] h-9 p-1 rounded-md w-full justify-start",children:[e.jsx(z,{value:"diff",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Diff"}),e.jsx(z,{value:"files",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Files"}),e.jsx(z,{value:"logs",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Logs"})]})}),e.jsx(W,{value:"diff",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:A.length===0?e.jsx(R,{title:"No patch yet",subtitle:"Run a tool that changes files to see diffs here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mb-2",children:[A.length," changed file",A.length>1?"s":""]}),A.map(n=>{var h;const f=((h=n.filePath)==null?void 0:h.split("/").pop())||"unknown",g=ke[n.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>Ee(n.filePath||""),className:"w-full flex items-center gap-2 px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:[g?e.jsx(ne,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(se,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(be,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono flex-1 text-left truncate",children:f}),n.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:n.summary})]}),g&&e.jsxs("div",{className:"border-t border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("div",{className:"px-3 py-1 text-[11px] text-[#9CA3AF] dark:text-[#52525b] font-mono truncate",children:n.filePath}),e.jsx(Oe,{diff:n.diff})]})]},n.filePath)})]})})}),e.jsx(W,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(R,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&b&&e.jsx(R,{title:"Failed to load files",subtitle:b}),!x&&!b&&l.length===0&&e.jsx(R,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!b&&l.length>0&&e.jsxs("div",{className:"h-full grid grid-cols-[220px_1fr] gap-4 min-h-0",children:[e.jsx("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-2 overflow-y-auto min-h-0",children:l.map(n=>e.jsx(he,{node:n,depth:0,expandedDirs:q,childrenCache:d,toggleDir:we,selectedPath:v,onSelectFile:je},n.path))}),e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden flex flex-col min-h-0",children:[e.jsxs("div",{className:"px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono flex items-center justify-between",children:[e.jsx("span",{children:v||"Select a file to preview"}),v&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:G?"Loading…":Y?"Truncated":"Ready"})]}),Y&&!G&&e.jsx("div",{className:"px-3 py-2 bg-[#FEF3C7] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[11px] text-[#b45309] dark:text-[#facc15] font-mono",children:"Preview truncated to 200k characters."}),e.jsxs("div",{className:"flex-1 min-h-0",children:[!v&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Pick a file from the tree to preview."}),v&&V&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:V}),v&&!V&&e.jsx("div",{className:"h-full",children:G?e.jsx(fe,{}):e.jsx(i.Suspense,{fallback:e.jsx(fe,{}),children:e.jsx(Pe,{content:ye,filename:v})})})]})]})]})]})}),e.jsx(W,{value:"logs",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:ee.length===0?e.jsx(R,{title:"No logs yet",subtitle:"Tool runs will appear here."}):ee.map(n=>{var y;const f=C[n.id],g=(n.content||"").split(`
|
|
1
|
+
import{_ as ue}from"./vendor-markdown-Bo4W9Tae.js";import{r as i,j as e}from"./vendor-react-BalntB5F.js";import{c as F,u as Fe,e as $,s as re,B as Ce,f as ae}from"./index-BvGeIa_-.js";import{n as Be,L as xe,o as me,p as pe}from"./vendor-radix-CESj0OOY.js";import{u as Se}from"./SettingsStore-BxDA0Usw.js";import{X as Le,k as ne,n as se,i as be,x as Re,y as De}from"./vendor-icons-BuFpOlRn.js";import"./vendor-monaco-w6PwaWGP.js";const Te=Be,ge=i.forwardRef(({className:t,...a},r)=>e.jsx(xe,{ref:r,className:F("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...a}));ge.displayName=xe.displayName;const z=i.forwardRef(({className:t,...a},r)=>e.jsx(me,{ref:r,className:F("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",t),...a}));z.displayName=me.displayName;const W=i.forwardRef(({className:t,...a},r)=>e.jsx(pe,{ref:r,className:F("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...a}));W.displayName=pe.displayName;const Ae={"ayu-dark":{background:{primary:"#0f1419",secondary:"#14191f"},text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773"},border:{light:"#2d323b"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},dracula:{background:{primary:"#282a36",secondary:"#44475a"},text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4"},border:{light:"#44475a"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},monokai:{background:{primary:"#272822",secondary:"#3e3d32"},text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e"},border:{light:"#3e3d32"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},nord:{background:{primary:"#2e3440",secondary:"#3b4252"},text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a"},border:{light:"#434c5e"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},"solarized-light":{background:{primary:"#fdf6e3",secondary:"#eee8d5"},text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1"},border:{light:"#eee8d5"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},"solarized-dark":{background:{primary:"#002b36",secondary:"#073642"},text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75"},border:{light:"#073642"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},"tokyo-night":{background:{primary:"#1a1b26",secondary:"#292e42"},text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89"},border:{light:"#292e42"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},github:{background:{primary:"#ffffff",secondary:"#f6f8fa"},text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781"},border:{light:"#d0d7de"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},gruvbox:{background:{primary:"#282828",secondary:"#3c3836"},text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374"},border:{light:"#3c3836"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#b8bb26",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#fabd2f",default:"#ebdbb2"}},"one-dark":{background:{primary:"#282c34",secondary:"#21252b"},text:{primary:"#abb2bf",secondary:"#e5c07b",muted:"#5c6370"},border:{light:"#3e4451"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},catppuccin:{background:{primary:"#1e1e2e",secondary:"#313244"},text:{primary:"#cdd6f4",secondary:"#f5e0dc",muted:"#6c7086"},border:{light:"#313244"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#f5e0dc",operator:"#89dceb",type:"#f9e2af",tag:"#f38ba8",attr:"#f9e2af",default:"#cdd6f4"}},"rose-pine":{background:{primary:"#191724",secondary:"#1f1d2e"},text:{primary:"#e0def4",secondary:"#908caa",muted:"#6e6a86"},border:{light:"#26233a"},syntax:{comment:"#6e6a86",string:"#f6c177",number:"#ebbcba",keyword:"#c4a7e7",function:"#9ccfd8",variable:"#e0def4",operator:"#31748f",type:"#eb6f92",tag:"#eb6f92",attr:"#c4a7e7",default:"#e0def4"}},kanagawa:{background:{primary:"#1f1f28",secondary:"#2a2a37"},text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169"},border:{light:"#2a2a37"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#e46876",attr:"#ffa066",default:"#dcd7ba"}}};function _e(t){const a=t.replace("#",""),r=parseInt(a.substring(0,2),16),s=parseInt(a.substring(2,4),16),o=parseInt(a.substring(4,6),16);return(.299*r+.587*s+.114*o)/255<.5}function $e(t){return{base:_e(t.background.primary)?"vs-dark":"vs",inherit:!0,rules:[{token:"",foreground:t.text.primary.replace("#",""),background:t.background.primary.replace("#","")},{token:"comment",foreground:t.syntax.comment.replace("#",""),fontStyle:"italic"},{token:"string",foreground:t.syntax.string.replace("#","")},{token:"number",foreground:t.syntax.number.replace("#","")},{token:"keyword",foreground:t.syntax.keyword.replace("#","")},{token:"type",foreground:t.syntax.type.replace("#","")},{token:"identifier",foreground:t.syntax.variable.replace("#","")},{token:"function",foreground:t.syntax.function.replace("#","")},{token:"variable",foreground:t.syntax.variable.replace("#","")},{token:"operator",foreground:t.syntax.operator.replace("#","")},{token:"delimiter",foreground:t.syntax.operator.replace("#","")},{token:"tag",foreground:t.syntax.tag.replace("#","")},{token:"attribute.name",foreground:t.syntax.attr.replace("#","")},{token:"attribute.value",foreground:t.syntax.string.replace("#","")}],colors:{"editor.background":t.background.primary,"editor.foreground":t.text.primary,"editor.lineHighlightBackground":t.background.secondary,"editor.selectionBackground":`${t.syntax.function}40`,"editorLineNumber.foreground":t.text.muted,"editorLineNumber.activeForeground":t.text.secondary,"editorCursor.foreground":t.text.primary,"editorIndentGuide.background":t.border.light,"editorWidget.background":t.background.secondary,"editorWidget.border":t.border.light,"scrollbarSlider.background":`${t.text.muted}40`,"scrollbarSlider.hoverBackground":`${t.text.muted}60`}}}const oe=new Set;function de(t,a){const r=a.toLowerCase().replace(/\s+/g,"-"),s=Ae[r];if(!s)return"vs-dark";if(!oe.has(r)){const o=$e(s);t.editor.defineTheme(r,o),oe.add(r)}return r}i.lazy(async()=>({default:(await ue(()=>import("./vendor-react-BalntB5F.js").then(a=>a.k),[])).DiffEditor}));const ze=i.lazy(async()=>({default:(await ue(()=>import("./vendor-react-BalntB5F.js").then(a=>a.k),[])).Editor}));function ie(t,a){return t instanceof Error?t.message:a}function Ye(){const{toggleFilePreview:t}=Fe(),{messages:a,currentSessionRef:r}=$(),[s,o]=i.useState("diff"),[l,c]=i.useState([]),[d,u]=i.useState({}),[x,m]=i.useState(!1),[b,p]=i.useState(null),[q,E]=i.useState({}),[C,I]=i.useState({}),[v,Q]=i.useState(null),[ye,P]=i.useState(""),[G,O]=i.useState(!1),[V,J]=i.useState(null),[Y,H]=i.useState(!1),Z=i.useRef(r),B=i.useRef(0),D=i.useRef(0),T=i.useRef({}),K=i.useRef(0),S=i.useRef({}),j=i.useRef({}),U=i.useRef(null);i.useLayoutEffect(()=>{re(Z.current,r)||(B.current+=1),Z.current=r},[r]);const X=(n,f)=>f===B.current&&re($.getState().currentSessionRef,n),M=async(n,f="")=>{const g=f?`/suggestions/files/tree?path=${encodeURIComponent(f)}`:"/suggestions/files/tree",h=await fetch(g,{headers:ae(n)});if(!h.ok)throw new Error("Failed to load tree");return(await h.json()).map(y=>({...y,children:y.type==="dir"?[]:void 0}))};i.useEffect(()=>{const n=++D.current;return(async()=>{if(!r){c([]),m(!1),p(null);return}const g={...r},h=B.current,k=()=>n===D.current&&X(g,h);if(k()){c([]),m(!0),p(null);try{const y=await M(g);k()&&c(y)}catch(y){k()&&p(ie(y,"Failed to load tree"))}finally{k()&&m(!1)}}})(),()=>{D.current===n&&(D.current+=1)}},[r==null?void 0:r.projectPath,r==null?void 0:r.sessionId]),i.useEffect(()=>{U.current=null,S.current={},j.current={},T.current={},K.current+=1,Q(null),P(""),O(!1),J(null),H(!1),E({}),u({})},[r==null?void 0:r.projectPath,r==null?void 0:r.sessionId]);const A=i.useMemo(()=>Ie(a),[a]),ee=i.useMemo(()=>qe(a),[a]),[ke,ve]=i.useState({}),Ee=n=>{ve(f=>({...f,[n]:!f[n]}))},je=async n=>{const f=$.getState().currentSessionRef;if(!f)return;const g=B.current,h=++K.current,k=()=>h===K.current&&U.current===n&&X(f,g);U.current=n,Q(n),P(""),O(!0),J(null),H(!1);try{const y=await fetch(`/suggestions/files/content?path=${encodeURIComponent(n)}`,{headers:ae(f)});if(!y.ok)throw new Error("Failed to load file");const L=await y.json();k()&&(P(L.content||""),H(!!L.truncated))}catch(y){k()&&J(ie(y,"Failed to load file"))}finally{k()&&O(!1)}},we=async n=>{const f=(T.current[n]??0)+1;T.current[n]=f;const g=!S.current[n],h={...S.current,[n]:g};if(S.current=h,E(h),!g||j.current[n])return;const k=$.getState().currentSessionRef;if(!k)return;const y=B.current,L=()=>T.current[n]===f&&S.current[n]===!0&&X(k,y);try{const _=await M(k,n);if(L()){const te={...j.current,[n]:_};j.current=te,u(te)}}catch{if(L()){const _={...j.current,[n]:[]};j.current=_,u(_)}}},Ne=n=>{I(f=>({...f,[n]:!f[n]}))};return e.jsxs("div",{className:"w-[55%] min-w-[420px] max-w-[860px] border-l border-[#E5E7EB] dark:border-zinc-800 bg-white dark:bg-[#09090b] flex flex-col h-full shadow-xl shrink-0",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 h-12 border-b border-[#E5E7EB] dark:border-zinc-800 shrink-0",children:[e.jsx("span",{className:"font-normal text-[13px] text-[#6B7280] dark:text-zinc-400 font-mono",children:"Preview"}),e.jsx(Ce,{variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-zinc-500 dark:hover:text-zinc-300 dark:hover:bg-zinc-800/50",children:e.jsx(Le,{className:"w-4 h-4"})})]}),e.jsxs(Te,{value:s,onValueChange:n=>o(n),className:"flex flex-col flex-1 min-h-0",children:[e.jsx("div",{className:"px-4 py-3 border-b border-[#E5E7EB] dark:border-zinc-800",children:e.jsxs(ge,{className:"bg-white dark:bg-[#111113] border border-[#E5E7EB] dark:border-[#27272a] h-9 p-1 rounded-md w-full justify-start",children:[e.jsx(z,{value:"diff",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Diff"}),e.jsx(z,{value:"files",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Files"}),e.jsx(z,{value:"logs",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Logs"})]})}),e.jsx(W,{value:"diff",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:A.length===0?e.jsx(R,{title:"No patch yet",subtitle:"Run a tool that changes files to see diffs here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mb-2",children:[A.length," changed file",A.length>1?"s":""]}),A.map(n=>{var h;const f=((h=n.filePath)==null?void 0:h.split("/").pop())||"unknown",g=ke[n.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>Ee(n.filePath||""),className:"w-full flex items-center gap-2 px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:[g?e.jsx(ne,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(se,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(be,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono flex-1 text-left truncate",children:f}),n.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:n.summary})]}),g&&e.jsxs("div",{className:"border-t border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("div",{className:"px-3 py-1 text-[11px] text-[#9CA3AF] dark:text-[#52525b] font-mono truncate",children:n.filePath}),e.jsx(Oe,{diff:n.diff})]})]},n.filePath)})]})})}),e.jsx(W,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(R,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&b&&e.jsx(R,{title:"Failed to load files",subtitle:b}),!x&&!b&&l.length===0&&e.jsx(R,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!b&&l.length>0&&e.jsxs("div",{className:"h-full grid grid-cols-[220px_1fr] gap-4 min-h-0",children:[e.jsx("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-2 overflow-y-auto min-h-0",children:l.map(n=>e.jsx(he,{node:n,depth:0,expandedDirs:q,childrenCache:d,toggleDir:we,selectedPath:v,onSelectFile:je},n.path))}),e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden flex flex-col min-h-0",children:[e.jsxs("div",{className:"px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono flex items-center justify-between",children:[e.jsx("span",{children:v||"Select a file to preview"}),v&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:G?"Loading…":Y?"Truncated":"Ready"})]}),Y&&!G&&e.jsx("div",{className:"px-3 py-2 bg-[#FEF3C7] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[11px] text-[#b45309] dark:text-[#facc15] font-mono",children:"Preview truncated to 200k characters."}),e.jsxs("div",{className:"flex-1 min-h-0",children:[!v&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Pick a file from the tree to preview."}),v&&V&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:V}),v&&!V&&e.jsx("div",{className:"h-full",children:G?e.jsx(fe,{}):e.jsx(i.Suspense,{fallback:e.jsx(fe,{}),children:e.jsx(Pe,{content:ye,filename:v})})})]})]})]})]})}),e.jsx(W,{value:"logs",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:ee.length===0?e.jsx(R,{title:"No logs yet",subtitle:"Tool runs will appear here."}):ee.map(n=>{var y;const f=C[n.id],g=(n.content||"").split(`
|
|
2
2
|
`),h=g.length>10||(((y=n.content)==null?void 0:y.length)||0)>800,k=f||!h?g:g.slice(0,8);return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("div",{className:"text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:n.title}),n.subtitle&&e.jsx("div",{className:"text-[11px] text-[#6B7280] dark:text-[#71717a] font-mono",children:n.subtitle})]}),e.jsx(We,{status:n.status})]}),n.content&&e.jsxs("div",{className:"px-3 py-3 space-y-2",children:[e.jsxs("pre",{className:"text-[12px] text-[#374151] dark:text-[#d4d4d8] bg-[#F3F4F6] dark:bg-[#09090b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md p-3 overflow-x-auto whitespace-pre-wrap font-mono",children:[k.join(`
|
|
3
3
|
`),!f&&h&&`
|
|
4
4
|
…`]}),h&&e.jsxs("button",{onClick:()=>Ne(n.id),className:"flex items-center gap-1 text-[12px] text-[#6B7280] dark:text-[#a1a1aa] font-mono hover:text-[#111827] dark:hover:text-[#E5E5E5] transition-colors",children:[f?e.jsx(ne,{className:"w-3 h-3"}):e.jsx(se,{className:"w-3 h-3"}),f?"Collapse":"Expand"]})]})]},n.id)})})})]})]})}function R({title:t,subtitle:a}){return e.jsxs("div",{className:"border border-dashed border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-6 text-center",children:[e.jsx("div",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:t}),e.jsx("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mt-1",children:a})]})}function We({status:t}){const a=t==="success"?"Success":t==="error"?"Failed":"Running",r=t==="success"?"bg-[#22C55E] text-white":t==="error"?"bg-[#FEE2E2] text-[#b91c1c] dark:bg-[#EF4444]/20 dark:text-[#fca5a5]":"bg-[#E5E7EB] text-[#6B7280] dark:bg-[#27272a] dark:text-[#a1a1aa]";return e.jsx("span",{className:F("text-[11px] px-2 py-0.5 rounded-full font-mono",r),children:a})}function he({node:t,depth:a,expandedDirs:r,childrenCache:s,toggleDir:o,onSelectFile:l,selectedPath:c}){const d=t.type==="dir",u=r[t.path],x=!d&&c===t.path,m=s[t.path]||[];return e.jsxs("div",{children:[e.jsx("button",{onClick:()=>{d?o(t.path):l(t.path)},className:F("flex items-center gap-2 w-full text-left text-[12px] font-mono px-2 py-1 rounded-md transition-colors",x?"bg-[#16A34A]/10 text-[#111827] dark:bg-[#22C55E]/10 dark:text-[#E5E5E5]":"hover:bg-[#F3F4F6] text-[#6B7280] dark:hover:bg-[#111113] dark:text-[#a1a1aa]",d&&"cursor-pointer",x&&"border border-[#16A34A]/30 dark:border-[#22C55E]/30"),style:{paddingLeft:a*14+8},children:d?e.jsxs(e.Fragment,{children:[u?e.jsx(Re,{className:"h-3.5 w-3.5 shrink-0 text-[#111827] dark:text-[#E5E5E5]"}):e.jsx(De,{className:"h-3.5 w-3.5 shrink-0 text-[#6B7280] dark:text-[#a1a1aa]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]}):e.jsxs(e.Fragment,{children:[e.jsx(be,{className:"h-3.5 w-3.5 shrink-0 text-[#9CA3AF] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]})}),d&&u&&e.jsx("div",{children:m.map(b=>e.jsx(he,{node:b,depth:a+1,expandedDirs:r,childrenCache:s,toggleDir:o,onSelectFile:l,selectedPath:c},b.path))})]})}function qe(t){return t.flatMap(a=>{var o,l,c;const r=[];if((o=a.agentContent)!=null&&o.toolCalls)for(const d of a.agentContent.toolCalls){const u=le(d.arguments),x=d.output,m=x?(l=N(x))!=null&&l.diff?ce(x):x:void 0;r.push({id:`${a.id}-${d.toolCallId}`,title:d.toolName||"Tool",subtitle:d.summary,status:d.status==="success"?"success":d.status==="error"?"error":"running",content:m||(u?`Arguments:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as k,r as h,_ as j}from"./vendor-markdown-Bo4W9Tae.js";import{r as o,j as r}from"./vendor-react-BalntB5F.js";import{c as b}from"./index-
|
|
1
|
+
import{M as k,r as h,_ as j}from"./vendor-markdown-Bo4W9Tae.js";import{r as o,j as r}from"./vendor-react-BalntB5F.js";import{c as b}from"./index-BvGeIa_-.js";import{a as f}from"./SettingsStore-BxDA0Usw.js";import{c as g,I as N}from"./vendor-icons-BuFpOlRn.js";import"./vendor-monaco-w6PwaWGP.js";import"./vendor-radix-CESj0OOY.js";const v=[h],y=o.lazy(()=>j(()=>import("./CodeBlockHighlighter-C1cp8dDv.js"),[]).then(t=>({default:t.CodeBlockHighlighter}))),P=o.memo(function({content:s,className:a,syntaxHighlight:d=!0}){const i=f(),E=o.useMemo(()=>({code({className:e,children:n,...c}){const x=/language-(\w+)/.exec(e||""),p=!x,m=x?x[1]:"",l=String(n).replace(/\n$/,"");return p?r.jsx("code",{className:b("bg-[#F3F4F6] dark:bg-[#27272a] px-1.5 py-0.5 rounded text-[#111827] dark:text-[#E5E5E5] font-mono text-[13px]",e),...c,children:n}):d?r.jsxs("div",{className:"relative my-4 rounded-lg overflow-hidden border border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#1e1e1e]",children:[r.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-[#F3F4F6] dark:bg-[#27272a] border-b border-[#E5E7EB] dark:border-[#27272a]",children:[r.jsx("span",{className:"text-xs text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:m||"text"}),r.jsx(F,{content:l})]}),r.jsx(o.Suspense,{fallback:r.jsx(u,{className:e,code:l,props:c}),children:r.jsx(y,{code:l,language:m,isDark:i})})]}):r.jsx(u,{className:e,code:l,props:c})},p({children:e}){return r.jsx("p",{className:"mb-4 leading-relaxed last:mb-0",children:e})},ul({children:e}){return r.jsx("ul",{className:"pl-4 mb-4 space-y-1 list-disc last:mb-0",children:e})},ol({children:e}){return r.jsx("ol",{className:"pl-4 mb-4 space-y-1 list-decimal last:mb-0",children:e})},li({children:e}){return r.jsx("li",{className:"leading-relaxed",children:e})},h1({children:e}){return r.jsx("h1",{className:"text-2xl font-bold mb-4 mt-6 text-[#111827] dark:text-[#E5E5E5]",children:e})},h2({children:e}){return r.jsx("h2",{className:"text-xl font-bold mb-3 mt-5 text-[#111827] dark:text-[#E5E5E5]",children:e})},h3({children:e}){return r.jsx("h3",{className:"text-lg font-bold mb-2 mt-4 text-[#111827] dark:text-[#E5E5E5]",children:e})},blockquote({children:e}){return r.jsx("blockquote",{className:"border-l-2 border-[#22C55E] pl-4 italic text-[#6B7280] dark:text-[#a1a1aa] mb-4",children:e})},a({href:e,children:n}){return r.jsx("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"text-[#22C55E] hover:underline transition-colors",children:n})},table({children:e}){return r.jsx("div",{className:"overflow-x-auto mb-4 border border-[#E5E7EB] dark:border-[#27272a] rounded-lg",children:r.jsx("table",{className:"w-full text-sm text-left",children:e})})},thead({children:e}){return r.jsx("thead",{className:"bg-[#F3F4F6] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5]",children:e})},tbody({children:e}){return r.jsx("tbody",{className:"divide-y divide-[#E5E7EB] dark:divide-[#27272a]",children:e})},tr({children:e}){return r.jsx("tr",{className:"hover:bg-[#F3F4F6] dark:hover:bg-[#27272a]/50 transition-colors",children:e})},th({children:e}){return r.jsx("th",{className:"px-4 py-3 font-medium whitespace-nowrap",children:e})},td({children:e}){return r.jsx("td",{className:"px-4 py-3 text-[#374151] dark:text-[#d4d4d8]",children:e})},hr(){return r.jsx("hr",{className:"my-6 border-[#E5E7EB] dark:border-[#27272a]"})}}),[i,d]);return r.jsx("div",{className:b("text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono break-words min-w-0 w-full",a),children:r.jsx(k,{remarkPlugins:v,components:E,children:s})})});function u({className:t,code:s,props:a}){return r.jsx("pre",{className:"my-4 overflow-x-auto rounded-lg border border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#1e1e1e] p-4 text-[13px] leading-normal",children:r.jsx("code",{className:t,...a,children:s})})}function F({content:t}){const[s,a]=o.useState(!1),d=async()=>{await navigator.clipboard.writeText(t),a(!0),setTimeout(()=>a(!1),2e3)};return r.jsx("button",{onClick:d,className:"p-1 hover:bg-[#E5E7EB] dark:hover:bg-[#3f3f46] rounded-md transition-colors text-[#9CA3AF] dark:text-[#a1a1aa] hover:text-[#111827] dark:hover:text-[#E5E5E5]",title:"Copy code",children:s?r.jsx(g,{className:"h-3.5 w-3.5 text-[#22C55E]"}):r.jsx(N,{className:"h-3.5 w-3.5"})})}export{P as MarkdownRenderer};
|