blade-code 0.8.3 → 0.10.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/README.md +20 -5
- package/dist/blade.js +4 -4
- package/dist/chunk-0aj7gp37.js +2 -0
- package/dist/{chunk-7bqkkjxf.js → chunk-0h81hxkw.js} +1 -1
- package/dist/chunk-2beq0syt.js +2 -0
- package/dist/chunk-2fdjn926.js +1 -0
- package/dist/chunk-3c5gvxr6.js +1 -0
- package/dist/chunk-44wkjs2j.js +114 -0
- package/dist/chunk-4vaywb2r.js +2 -0
- package/dist/{chunk-crbh6x86.js → chunk-61087jc8.js} +2 -2
- package/dist/chunk-6g21dh3n.js +1 -0
- package/dist/chunk-6hj2dk75.js +3 -0
- package/dist/chunk-6n5xdf2r.js +2 -0
- package/dist/chunk-6qe5k7dw.js +4 -0
- package/dist/chunk-7dcm1aqd.js +1 -0
- package/dist/chunk-7eptyk20.js +1 -0
- package/dist/chunk-88vy9hh0.js +4 -0
- package/dist/chunk-8nm1hqr1.js +2 -0
- package/dist/chunk-8rg05w47.js +174 -0
- package/dist/chunk-93ptxa5p.js +4 -0
- package/dist/chunk-949btxxx.js +1485 -0
- package/dist/chunk-9jy87d0y.js +3 -0
- package/dist/chunk-9kd14cwq.js +1 -0
- package/dist/chunk-a7nbn5kf.js +3 -0
- package/dist/chunk-af49jmns.js +5 -0
- package/dist/chunk-asbp4cv4.js +1 -0
- package/dist/chunk-beqaxytd.js +2 -0
- package/dist/chunk-bqdc3m0p.js +6 -0
- package/dist/chunk-bx50res5.js +99 -0
- package/dist/chunk-cznge1n7.js +1 -0
- package/dist/{chunk-5yt80bn2.js → chunk-d3236505.js} +1 -1
- package/dist/chunk-d9ddpapp.js +18 -0
- package/dist/chunk-e3tk2jna.js +636 -0
- package/dist/chunk-f8db8ftd.js +10 -0
- package/dist/chunk-fjp5tvh8.js +1 -0
- package/dist/chunk-fjw32ex5.js +2 -0
- package/dist/chunk-gafbzeyk.js +1 -0
- package/dist/chunk-hh3xw391.js +6 -0
- package/dist/chunk-hzvp3bc1.js +44 -0
- package/dist/chunk-jv4nkkb5.js +1 -0
- package/dist/{chunk-eyypmc9m.js → chunk-jxv6r0c7.js} +2 -2
- package/dist/{chunk-mqqajem9.js → chunk-kq5my0yy.js} +2 -2
- package/dist/chunk-m3tx1k0s.js +1 -0
- package/dist/chunk-m78ceafk.js +1 -0
- package/dist/{chunk-be7qz4cv.js → chunk-mjp61rqd.js} +1 -1
- package/dist/chunk-mvwp3c11.js +45 -0
- package/dist/chunk-mwrn7mcr.js +1 -0
- package/dist/chunk-mxhg6jt9.js +25 -0
- package/dist/chunk-nah0cbnp.js +2 -0
- package/dist/chunk-px5ck9pf.js +2 -0
- package/dist/chunk-qev36qrb.js +2 -0
- package/dist/{chunk-ar5564sf.js → chunk-sndbq5xt.js} +1 -1
- package/dist/chunk-t8q9ks7e.js +3 -0
- package/dist/{chunk-wcf80p9y.js → chunk-th7sxjtk.js} +2 -2
- package/dist/{chunk-97qxd4yb.js → chunk-ty2kc6kg.js} +2 -2
- package/dist/chunk-v4mr98vm.js +1 -0
- package/dist/chunk-vb0t2hhd.js +25 -0
- package/dist/chunk-vjpd3nee.js +2 -0
- package/dist/chunk-vvy506b3.js +3 -0
- package/dist/chunk-vyq9r31h.js +22 -0
- package/dist/chunk-w4qsayn6.js +9 -0
- package/dist/chunk-wsqz3x2e.js +161 -0
- package/dist/{chunk-vxpdjtqc.js → chunk-wvj9h7mb.js} +1 -1
- package/dist/chunk-yvah5h4x.js +13 -0
- package/dist/chunk-z5ae4qvf.js +2 -0
- package/dist/chunk-zcw7kyf4.js +2 -0
- package/dist/{chunk-qvtahmff.js → chunk-zkbf8n6y.js} +1 -1
- package/dist/web/assets/ChatView-CnwNosSG.js +7 -0
- package/dist/web/assets/CodeBlockHighlighter-CBo_AxjZ.js +8 -0
- package/dist/web/assets/FilePreview-hNo6RCNY.js +8 -0
- package/dist/web/assets/MarkdownRenderer-BON4fqSr.js +30 -0
- package/dist/web/assets/McpModal-Go_8v1Vu.js +5 -0
- package/dist/web/assets/SettingsModal-CRu1zGQf.js +1 -0
- package/dist/web/assets/TaskSwitcher-Ds8CBVtp.js +1 -0
- package/dist/web/assets/TerminalPanel-Dm4bu6ib.js +1 -0
- package/dist/web/assets/index-BNsnHxlt.js +32 -0
- package/dist/web/assets/index-DI8ZWdWH.js +11 -0
- package/dist/web/assets/index-DVTiq-7u.css +1 -0
- package/dist/web/assets/vendor-icons-CsBKlDXT.js +381 -0
- package/dist/web/assets/vendor-radix-DXRuAJHH.js +45 -0
- package/dist/web/assets/vendor-react-DG5dkZ_t.js +49 -0
- package/dist/web/index.html +5 -2
- package/package.json +37 -34
- package/dist/chunk-1m63zddw.js +0 -2
- package/dist/chunk-23h9grdr.js +0 -1
- package/dist/chunk-2c69g6t9.js +0 -34
- package/dist/chunk-5sccs44n.js +0 -1
- package/dist/chunk-6msfa7jh.js +0 -9
- package/dist/chunk-6spmzx13.js +0 -6
- package/dist/chunk-724djh7r.js +0 -1
- package/dist/chunk-804j7say.js +0 -1
- package/dist/chunk-8yk5w2ks.js +0 -1
- package/dist/chunk-9cr3jexy.js +0 -2
- package/dist/chunk-b922cq7k.js +0 -41
- package/dist/chunk-bqhghfmt.js +0 -6
- package/dist/chunk-d7nrqg5b.js +0 -5
- package/dist/chunk-fma9cbq5.js +0 -10
- package/dist/chunk-ghf5tgjr.js +0 -1
- package/dist/chunk-hqtskyc1.js +0 -2
- package/dist/chunk-jc7k8pfn.js +0 -22
- package/dist/chunk-kf43f8sy.js +0 -1577
- package/dist/chunk-kjc2aqww.js +0 -2
- package/dist/chunk-kjddt9xy.js +0 -1
- package/dist/chunk-m0ded6ky.js +0 -615
- package/dist/chunk-msr67f6q.js +0 -3
- package/dist/chunk-mvww9cmc.js +0 -151
- package/dist/chunk-nbpjzzrg.js +0 -13
- package/dist/chunk-ncvr73ev.js +0 -1
- package/dist/chunk-qwn46cd6.js +0 -2
- package/dist/chunk-sva5bdgz.js +0 -2
- package/dist/chunk-t9cqscfq.js +0 -2
- package/dist/chunk-tzr992v4.js +0 -1
- package/dist/chunk-x8xfx9nv.js +0 -1
- package/dist/chunk-yewg510f.js +0 -24
- package/dist/chunk-zj3q4btp.js +0 -4
- package/dist/chunk-zjks0ncc.js +0 -6
- package/dist/chunk-zsyff0ky.js +0 -3
- package/dist/web/assets/CodeBlockHighlighter-D8_cOYpG.js +0 -1
- package/dist/web/assets/FilePreview-B5g8yi8d.js +0 -7
- package/dist/web/assets/MarkdownRenderer-qBCxzEb_.js +0 -1
- package/dist/web/assets/McpModal-C7y2Fsqc.js +0 -5
- package/dist/web/assets/SettingsModal-Dmc7Dw_E.js +0 -1
- package/dist/web/assets/SettingsStore-BfoB9tNV.js +0 -1
- package/dist/web/assets/SkillsModal-CqFAIfj5.js +0 -1
- package/dist/web/assets/TerminalPanel-EHh8-9b9.js +0 -1
- package/dist/web/assets/index-B-BRpW1c.js +0 -16
- package/dist/web/assets/index-Ch0eqSLM.css +0 -1
- package/dist/web/assets/useRequest-B4kP-cmG.js +0 -1
- package/dist/web/assets/vendor-icons-DBM55KTG.js +0 -251
- package/dist/web/assets/vendor-markdown-b9iCqZWK.js +0 -36
- package/dist/web/assets/vendor-monaco-w6PwaWGP.js +0 -11
- package/dist/web/assets/vendor-radix-DyP_DOwV.js +0 -45
- package/dist/web/assets/vendor-react-FPIC4Czm.js +0 -49
package/dist/chunk-nbpjzzrg.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{ga as O}from"./chunk-2c69g6t9.js";import{Ea as J,Ga as L}from"./chunk-yewg510f.js";import"./chunk-jc7k8pfn.js";import"./chunk-sva5bdgz.js";import"./chunk-5sccs44n.js";import"./chunk-1m63zddw.js";import"./chunk-7bqkkjxf.js";import{Sb as H}from"./chunk-kjc2aqww.js";import"./chunk-eyypmc9m.js";import"./chunk-zsyff0ky.js";import"./chunk-be7qz4cv.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
|
-
blade mcp
|
|
3
|
-
`),console.log(`管理 MCP 服务器
|
|
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 字符串添加服务器
|
|
5
|
-
`),console.log("Options:"),console.log(` -h, --help 显示帮助信息 [boolean]
|
|
6
|
-
`),console.log("Examples:"),console.log(" blade mcp list"),console.log(" blade mcp add github npx -y @modelcontextprotocol/server-github"),console.log(" blade mcp add api --transport http http://localhost:3000"),console.log(` blade mcp remove github
|
|
7
|
-
`),console.log(`使用 blade mcp <command> --help 查看各子命令的详细帮助
|
|
8
|
-
`)}function b(q){return q.reduce((z,F)=>{let[K,...B]=F.split("=");return z[K]=B.join("="),z},{})}function R(q){return q.reduce((z,F)=>{let[K,...B]=F.split(":");return z[K.trim()]=B.join(":").trim(),z},{})}var M={command:"add <name> [commandOrUrl] [args...]",describe:"添加 MCP 服务器",builder:(q)=>{return q.positional("name",{type:"string",describe:"服务器名称",demandOption:!0}).positional("commandOrUrl",{type:"string",describe:"stdio: 命令 | http/sse: URL"}).positional("args",{type:"string",array:!0,describe:"stdio 命令参数",default:[]}).option("transport",{alias:"t",choices:["stdio","sse","http"],default:"stdio",describe:"传输类型"}).option("env",{alias:"e",type:"array",describe:"环境变量 (KEY=value)"}).option("header",{alias:"H",type:"array",describe:"HTTP 头 (Key: Value)"}).option("timeout",{type:"number",describe:"超时时间(毫秒)"}).option("global",{alias:"g",type:"boolean",default:!1,describe:"存储到全局配置(~/.blade/config.json)"}).example([["$0 mcp add github -- npx -y @modelcontextprotocol/server-github","Add stdio server (recommended)"],["$0 mcp add github npx @modelcontextprotocol/server-github -e GITHUB_TOKEN=xxx","Add stdio server with env"],['$0 mcp add api --transport http http://localhost:3000 -H "Auth: Bearer token"',"Add HTTP server"]])},handler:async(q)=>{try{let{name:z,commandOrUrl:F,args:K,transport:B,env:Q,header:V,timeout:W}=q,Y=q.global===!0,$=_(z),Z=_(F),N=T(K)||[],k=T(Q),w=T(V),D=typeof W==="number"?W:void 0,I=B==="stdio"||B==="sse"||B==="http"?B:"stdio",x=q["--"];if(Array.isArray(x)&&x.length>0)Z=String(x[0]),N=x.slice(1).map((j)=>String(j));if(!$||!Z)console.error("Error: 缺少必需参数: name 和 commandOrUrl"),console.log(`
|
|
9
|
-
Tip: 用法:`),console.log(" blade mcp add <name> <command> [args...]"),console.log(" blade mcp add <name> -- <command> [args...]"),console.log(`
|
|
10
|
-
示例:`),console.log(" blade mcp add github npx -y @modelcontextprotocol/server-github"),console.log(" blade mcp add github -- npx -y @modelcontextprotocol/server-github"),process.exit(1);let X={type:I};if(I==="stdio"){if(X.command=Z,X.args=N,k)X.env=b(k)}else if(X.url=Z,w)X.headers=R(w);if(D!==void 0)X.timeout=D;await L().addMcpServer($,X,{scope:Y?"global":"project"});let U=Y?E.join(P.homedir(),".blade","config.json"):E.join(H(),".blade","config.json");console.log(`MCP 服务器 "${$}" 已添加`),console.log(` 配置文件: ${U}`)}catch(z){console.error(`Error: 添加失败: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}}},C={command:"remove <name>",describe:"删除 MCP 服务器",aliases:["rm"],builder:(q)=>{return q.positional("name",{type:"string",describe:"服务器名称",demandOption:!0}).option("global",{alias:"g",type:"boolean",default:!1,describe:"从全局配置删除(~/.blade/config.json)"}).example([["$0 mcp remove github","Remove the specified MCP server"]])},handler:async(q)=>{try{let z=J(),F=q.global===!0,K=_(q.name);if(!K)console.error("Error: 缺少必需参数: name"),process.exit(1);if(!z[K])console.error(`Error: 服务器 "${K}" 不存在`),process.exit(1);await L().removeMcpServer(K,{scope:F?"global":"project"}),console.log(`MCP 服务器 "${K}" 已删除`)}catch(z){console.error(`Error: 删除失败: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}}},A={command:"list",describe:"列出所有 MCP 服务器并检查健康状态",aliases:["ls"],handler:async()=>{try{let q=J();if(console.log(""),Object.keys(q).length===0){console.log("暂无配置的 MCP 服务器");return}console.log(`检查 MCP 服务器健康状态...
|
|
11
|
-
`);let z=O.getInstance(),F=Object.entries(q).map(async([B,Q])=>{try{let V=z.getServerStatus(B);if(!V)await z.registerServer(B,Q),V=z.getServerStatus(B);else if(V.status==="disconnected")await z.connectServer(B);return{name:B,config:Q,serverInfo:V}}catch(V){return{name:B,config:Q,serverInfo:null,error:V}}}),K=await Promise.all(F);for(let{name:B,config:Q,serverInfo:V,error:W}of K){let Y=V?.status||"disconnected",$=Y==="connected"?"[OK]":"[FAIL]",Z=Y==="connected"?"Connected":"Failed";if(console.log(`${B}: ${Q.type==="stdio"?Q.command:Q.url} - ${$} ${Z}`),W&&Y!=="connected")console.log(` 错误: ${W instanceof Error?W.message:String(W)}`)}console.log("");for(let{name:B}of K)try{await z.unregisterServer(B)}catch(Q){}process.exit(0)}catch(q){console.error(`Error: 列表获取失败: ${q instanceof Error?q.message:"未知错误"}`),process.exit(1)}}},h={command:"get <name>",describe:"获取服务器详情",builder:(q)=>{return q.positional("name",{type:"string",describe:"服务器名称",demandOption:!0}).example([["$0 mcp get github","Get details of the specified server"]])},handler:async(q)=>{try{let z=J(),F=_(q.name);if(!F)console.error("Error: 缺少必需参数: name"),process.exit(1);let K=z[F];if(!K)console.error(`Error: 服务器 "${F}" 不存在`),process.exit(1);console.log(`
|
|
12
|
-
服务器: ${F}
|
|
13
|
-
`),console.log(JSON.stringify(K,null,2))}catch(z){console.error(`Error: 获取失败: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}}},d={command:"add-json <name> <json>",describe:"从 JSON 字符串添加服务器",builder:(q)=>{return q.positional("name",{type:"string",describe:"服务器名称",demandOption:!0}).positional("json",{type:"string",describe:"JSON 配置字符串",demandOption:!0}).option("global",{alias:"g",type:"boolean",default:!1,describe:"存储到全局配置(~/.blade/config.json)"}).example([[`$0 mcp add-json my-server '{"type":"stdio","command":"npx","args":["-y","@example/server"]}'`,"Add server from JSON string"]])},handler:async(q)=>{try{let z=_(q.json),F=_(q.name);if(!z||!F)throw Error("缺少必需参数: name 或 json");let K=JSON.parse(z),B=q.global===!0;if(!K.type)throw Error('配置必须包含 "type" 字段');await L().addMcpServer(F,K,{scope:B?"global":"project"});let Q=B?E.join(P.homedir(),".blade","config.json"):E.join(H(),".blade","config.json");console.log(`MCP 服务器 "${F}" 已添加`),console.log(` 配置文件: ${Q}`)}catch(z){console.error(`Error: 添加失败: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}}},i={command:"mcp",describe:"管理 MCP 服务器",builder:(q)=>{return q.command(M).command(C).command(A).command(h).command(d).demandCommand(0).help(!1).option("help",{alias:"h",type:"boolean",describe:"显示帮助信息"})},handler:(q)=>{let z=["add","remove","list","ls","get","add-json"];if(!(Array.isArray(q._)?q._:[]).some((B)=>typeof B==="string"&&z.includes(B))||q.help)G(),process.exit(0)}};export{i as mcpCommands};
|
package/dist/chunk-ncvr73ev.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{eb as a,fb as b,hb as c,ib as d,jb as e,kb as f,lb as g,mb as h,nb as i,ob as j,pb as k,qb as l,rb as m,sb as n,tb as o,wb as p,xb as q,yb as r}from"./chunk-m0ded6ky.js";import"./chunk-5sccs44n.js";import"./chunk-b922cq7k.js";import"./chunk-1m63zddw.js";import"./chunk-7bqkkjxf.js";import"./chunk-kjc2aqww.js";import"./chunk-d7nrqg5b.js";import"./chunk-eyypmc9m.js";import"./chunk-zsyff0ky.js";import"./chunk-be7qz4cv.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,d as isRootSystemPrompt,l as handleTaskListUpdate,m as handleSkillActivation,n as extractModelSwitch,r as executeLoopGenerator,f as drainLoop,c as checkStopHook,a as checkOutputRecovery,b as checkIncompleteIntent,q as checkAndCompactInLoop,o as applyToolDomainEffects,p as StreamingToolExecutor,e as ConversationState};
|
package/dist/chunk-qwn46cd6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{e as gS,f as vS}from"./chunk-vxpdjtqc.js";import{p as FS}from"./chunk-9cr3jexy.js";import{B as dS,D as ES,E as FO,F as iO,H as MO,I as yO,J as F,K as z,L as LS,M as E,N as GO,P as vO,Q as TO,R as cO,T as lO,U as dO,W as WS,da as aS}from"./chunk-kf43f8sy.js";import{ga as xO}from"./chunk-2c69g6t9.js";import{Ba as YS,Ca as QS,Da as TS,Ga as s,za as SO}from"./chunk-yewg510f.js";import{Ua as QO}from"./chunk-sva5bdgz.js";import{_a as tS,ab as EO,kb as gO}from"./chunk-m0ded6ky.js";import{Cb as zS}from"./chunk-5sccs44n.js";import{Gb as c,Ib as x,Jb as H,Kb as XO,Lb as W}from"./chunk-1m63zddw.js";import{Mb as IO}from"./chunk-7bqkkjxf.js";import{Sb as k}from"./chunk-kjc2aqww.js";import{bc as L}from"./chunk-eyypmc9m.js";import{gc as qS,kc as NS,nc as jO}from"./chunk-zsyff0ky.js";import{oc as rO}from"./chunk-be7qz4cv.js";var B0={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function H0(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as $x,readFileSync as mO}from"node:fs";import{createServer as G0}from"node:http";import{networkInterfaces as U0}from"node:os";import{dirname as Z0,extname as A0,join as YO}from"node:path";import{fileURLToPath as _0}from"node:url";import{Hono as w0}from"hono";import{cors as X0}from"hono/cors";import{WebSocketServer as y0}from"ws";class I extends Error{code;statusCode;constructor(O,S,j=500){super(S);this.code=O;this.statusCode=j;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class C extends I{constructor(O,S){super("NOT_FOUND",S?`${O} not found: ${S}`:`${O} not found`,404)}}class f extends I{constructor(O){super("BAD_REQUEST",O,400)}}class g extends I{constructor(O){super("CONFLICT",O,409)}}class _O extends I{constructor(O){super("TOO_MANY_REQUESTS",O,429)}}class i extends I{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class d extends I{constructor(O="Internal server error"){super("INTERNAL_ERROR",O,500)}}var q0=x.Object({error:x.Object({code:x.String(),message:x.String()})});import{Hono as Yx}from"hono";var kO=L("Service"),Qx=x.Object({updates:x.Record(x.String(),x.Any()),options:x.Optional(x.Object({scope:x.Optional(W(["local","project","global"])),immediate:x.Optional(x.Boolean())}))});function Tx(O){return{currentModelId:O.currentModelId,permissionMode:O.permissionMode,language:O.language,theme:O.theme,uiTheme:O.uiTheme,autoSaveSessions:O.autoSaveSessions,notifyBuild:O.notifyBuild,notifyErrors:O.notifyErrors,notifySounds:O.notifySounds,privacyTelemetry:O.privacyTelemetry,privacyCrash:O.privacyCrash,maxConcurrentTasks:O.maxConcurrentTasks,maxQueuedTasks:O.maxQueuedTasks}}var jS=()=>{let O=new Yx;return O.get("/",async(S)=>{try{let j=SO();return S.json(j?Tx(j):{})}catch(j){return kO.error("[ConfigRoutes] Failed to get config:",j),S.json({})}}),O.put("/",async(S)=>{try{let j=await S.req.json(),$=c(Qx,j);if(!$.success)throw new f("Invalid config update format");let{updates:J,options:Y}=$.data;return await s().updateConfig(J,Y),S.json({success:!0,updates:J})}catch(j){throw kO.error("[ConfigRoutes] Failed to update config:",j),j}}),O.get("/permissions",async(S)=>{try{let j=SO();return S.json(j?.permissions||{})}catch(j){return kO.error("[ConfigRoutes] Failed to get permissions:",j),S.json({})}}),O};import{Hono as Gx}from"hono";import{streamSSE as Ux}from"hono/streaming";var Zx=15000,Ax=new Set(["task.status"]),_x=new Set(["queued","running","completed","failed","cancelled","interrupted"]);function wx(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let S=O,j=["changedFiles","additions","deletions","commits"];if(j.some(($)=>typeof S[$]!=="number"||!Number.isInteger(S[$])||S[$]<0))return;return Object.fromEntries(j.map(($)=>[$,S[$]]))}function bO(O,S){return typeof O==="number"&&Number.isInteger(O)&&O>=S?O:void 0}var $S=()=>{let O=new Gx;return O.get("/",(S)=>Ux(S,async(j)=>{let $,J,Y=!1,Q=()=>{if(J!==void 0)clearInterval(J),J=void 0;$?.(),$=void 0},y=()=>{if(Y)return;Y=!0,Q()};j.onAbort(y),$=z.subscribe((Z)=>{if(!Ax.has(Z.type))return;let D=Z.properties.taskStatus;if(typeof D!=="string"||!_x.has(D))return;let B=wx(Z.properties.taskDiffStat),M=bO(Z.properties.taskQueuePosition,1),K=bO(Z.properties.taskQueueDepth,0),u=bO(Z.properties.taskConcurrencyLimit,1),N=bO(Z.properties.taskInFlight,0);j.writeSSE({data:JSON.stringify({type:Z.type,properties:{sessionId:Z.sessionId,projectPath:Z.projectPath,taskStatus:D,...typeof Z.properties.taskStatusReason==="string"?{taskStatusReason:Z.properties.taskStatusReason}:{},...typeof Z.properties.taskStartedAt==="string"?{taskStartedAt:Z.properties.taskStartedAt}:{},...typeof Z.properties.taskCompletedAt==="string"?{taskCompletedAt:Z.properties.taskCompletedAt}:{},...typeof Z.properties.updatedAt==="string"?{updatedAt:Z.properties.updatedAt}:{},...B?{taskDiffStat:B}:{},...M!==void 0?{taskQueuePosition:M}:{},...K!==void 0?{taskQueueDepth:K}:{},...u!==void 0?{taskConcurrencyLimit:u}:{},...N!==void 0?{taskInFlight:N}:{}}})}).catch(y)});try{if(j.aborted||Y)return;if(await j.writeSSE({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),j.aborted||Y)return;J=setInterval(()=>{if(j.aborted||Y)return;j.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(y)},Zx);while(!j.aborted&&!Y)await new Promise((Z)=>setTimeout(Z,1000))}finally{y()}})),O};import{Hono as Xx}from"hono";var VS=()=>{let O=new Xx;return O.get("/health",(S)=>{return S.json({healthy:!0,version:QO()})}),O.get("/info",(S)=>{let j=k(),$=SO();if($)TO.configure($.maxConcurrentTasks,$.maxQueuedTasks);return S.json({version:QO(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:j,gitBranch:NS(j),taskAdmission:TO.getStats()})}),O};import{Hono as yx}from"hono";var wO=L("Service"),JS=()=>{let O=new yx;return O.get("/",async(S)=>{try{let $=xO.getInstance().getAllServers(),J=Array.from($.entries()).map(([Y,Q])=>({id:Y,name:Y,status:Q.status==="connected"?"connected":Q.status==="connecting"?"connecting":Q.lastError?"error":"offline",endpoint:Q.config.command?`${Q.config.command} ${(Q.config.args||[]).join(" ")}`.trim():Q.config.url||"Unknown",description:`MCP server: ${Y}`,tools:Q.tools.map((y)=>y.name),connectedAt:Q.connectedAt?.toISOString(),error:Q.lastError?.message}));return S.json(J)}catch(j){return wO.error("[McpRoutes] Failed to get MCP servers:",j),S.json([])}}),O.post("/:name/connect",async(S)=>{try{let j=S.req.param("name");return await xO.getInstance().connectServer(j),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to connect MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.post("/:name/disconnect",async(S)=>{try{let j=S.req.param("name");return await xO.getInstance().disconnectServer(j),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to disconnect MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.delete("/:name",async(S)=>{try{let j=S.req.param("name");await xO.getInstance().unregisterServer(j);let J=SO();if(J?.mcpServers){let{[j]:Y,...Q}=J.mcpServers;await s().updateConfig({mcpServers:Q})}return S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to delete MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.post("/",async(S)=>{try{let j=await S.req.json(),{name:$,config:J}=j;if(!$||!J)return S.json({success:!1,error:"Missing name or config"},400);await xO.getInstance().registerServer($,J);let Q=SO();return await s().updateConfig({mcpServers:{...Q?.mcpServers,[$]:J}}),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to add MCP server:",j),S.json({success:!1,error:j.message},500)}}),O};import{Hono as Dx}from"hono";var fO=L("Service");function px(O,S){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:S.contextWindow,maxTokens:S.maxTokens,reasoning:S.reasoning,input:S.input}}function bx(O){let S={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)S.model=O.model;return S}var GS=()=>{let O=new Dx;return O.get("/",async(S)=>{try{let j=YS(),$=QS(),J=jO(),Y=(Q)=>px(Q,J.resolveConfig(Q));return S.json({configured:j.map(Y),current:$?Y($):null})}catch(j){return fO.error("[ModelsRoutes] Failed to get models:",j),S.json({configured:[],current:null})}}),O.post("/",async(S)=>{try{let j=await S.req.json(),{provider:$,displayName:J,model:Y,overrides:Q,apiKey:y}=j;if(!$||!Y)throw new f("provider and model are required");if(jO().getModel($,Y),y?.trim())await jO().setApiKey($,y.trim());let Z=await s().addModel({provider:$,displayName:J||void 0,model:Y,overrides:Q||void 0});return S.json({success:!0,model:Z})}catch(j){throw fO.error("[ModelsRoutes] Failed to add model:",j),j}}),O.put("/:modelId",async(S)=>{try{let j=S.req.param("modelId"),$=await S.req.json(),{displayName:J,overrides:Y,model:Q}=$,y=TS(j);if(!y)throw new f("model config not found");if(Q)jO().getModel(y.provider,Q);return await s().updateModel(j,bx({displayName:J,overrides:Y,model:Q})),S.json({success:!0})}catch(j){throw fO.error("[ModelsRoutes] Failed to update model:",j),j}}),O.delete("/:modelId",async(S)=>{try{let j=S.req.param("modelId");return await s().removeModel(j),S.json({success:!0})}catch(j){throw fO.error("[ModelsRoutes] Failed to delete model:",j),j}}),O};import{Hono as dx}from"hono";import MS from"node:path";import{Mutex as Lx}from"async-mutex";import{Hono as Wx}from"hono";import{streamSSE as Fx}from"hono/streaming";import{LRUCache as mx}from"lru-cache";import{nanoid as UO}from"nanoid";var hO=H(W(["default","autoEdit","yolo","plan"]));var PO=H(W(["user","assistant","system","tool"])),fx=H(x.Union([x.Object({type:x.Literal("text"),text:x.String()}),x.Object({type:x.Literal("image_url"),image_url:x.Object({url:x.String()})})])),ZS=x.Union([x.String(),x.Array(fx)]),J1=H(x.Object({id:x.String(),role:PO,content:ZS,timestamp:x.Number(),metadata:x.Optional(x.Record(x.String(),x.Unknown())),thinkingContent:x.Optional(x.String()),tool_call_id:x.Optional(x.String()),name:x.Optional(x.String()),tool_calls:x.Optional(x.Unknown())})),Bx=H(W(["queued","running","completed","failed","cancelled","interrupted"])),AS=H(W(["local","worktree"])),Hx=H(x.Object({changedFiles:x.Integer({minimum:0}),additions:x.Integer({minimum:0}),deletions:x.Integer({minimum:0}),commits:x.Integer({minimum:0})})),Mx=H(x.Object({path:x.String({minLength:1}),patch:x.String({maxLength:2097152}),additions:x.Integer({minimum:0}),deletions:x.Integer({minimum:0}),binary:x.Boolean(),truncated:x.Boolean()})),_S=H(x.Object({sessionId:x.String(),projectPath:x.String(),baseCommit:x.String(),files:x.Array(Mx,{maxItems:100}),truncated:x.Boolean()})),wS=H(x.Object({sessionId:x.String(),projectPath:x.String(),title:x.Optional(x.String()),gitBranch:x.Optional(x.String()),rootId:x.String(),parentId:x.Optional(x.String()),relationType:x.Optional(W(["subagent","fork"])),resumedFrom:x.Optional(x.String()),rootAgentId:x.Optional(x.String()),resumeDepth:x.Optional(x.Integer({minimum:0})),taskStatus:XO(Bx,"completed"),taskStatusReason:x.Optional(x.String()),taskStartedAt:x.Optional(x.String()),taskCompletedAt:x.Optional(x.String()),taskPromptSummary:x.Optional(x.String()),taskIsolation:x.Optional(AS),taskSourceProjectPath:x.Optional(x.String()),taskWorktreePath:x.Optional(x.String()),taskWorktreeBranch:x.Optional(x.String()),taskBaseCommit:x.Optional(x.String()),taskDiffStat:x.Optional(Hx),taskQueuePosition:x.Optional(x.Integer({minimum:1})),taskQueueDepth:x.Optional(x.Integer({minimum:0})),taskConcurrencyLimit:x.Optional(x.Integer({minimum:1})),messageCount:x.Number(),firstMessageTime:x.String(),lastMessageTime:x.String(),hasErrors:x.Boolean()})),Y1=H(x.Object({version:x.Literal(1),sessionId:x.String(),goalId:x.String(),objective:x.String(),status:W(["active","paused","blocked","usage_limited","budget_limited","complete"]),tokenBudget:x.Optional(x.Number()),tokensUsed:x.Number(),timeUsedSeconds:x.Number(),continuationCount:x.Number(),statusReason:x.Optional(x.String()),createdAt:x.String(),updatedAt:x.String()})),XS=H(x.Object({role:PO,content:ZS,metadata:x.Optional(x.Unknown()),reasoningContent:x.Optional(x.String()),thinkingContent:x.Optional(x.String()),tool_call_id:x.Optional(x.String()),name:x.Optional(x.String()),tool_calls:x.Optional(x.Unknown())})),Q1=H(x.Object({session:wS,messages:x.Array(XS)})),yS=H(W(["conversation","code","both"])),Kx=H(x.Object({messageId:x.String(),preview:x.String(),createdAt:x.String(),fileCount:x.Integer({minimum:0})})),DS=H(x.Object({targetMessageId:x.String({minLength:1}),mode:XO(yS,"conversation")})),T1=H(x.Object({checkpoint:Kx,mode:yS,removedTurns:x.Integer({minimum:1}),restoredFiles:x.Array(x.String()),messages:x.Array(XS)})),qx=W(["running","completed","failed","cancelled"]),US=H(x.Object({id:x.String(),subagentType:x.String(),description:x.String(),status:qx,rootAgentId:x.String(),resumedFrom:x.Optional(x.String()),resumeDepth:x.Integer({minimum:0}),createdAt:x.Number(),lastActiveAt:x.Number(),completedAt:x.Optional(x.Number()),result:x.Optional(x.Object({success:x.Boolean(),message:x.String(),error:x.Optional(x.String()),verificationCommands:x.Optional(x.Array(x.String()))})),stats:x.Optional(x.Object({tokens:x.Optional(x.Number()),toolCalls:x.Optional(x.Number()),duration:x.Optional(x.Number())}))})),pS=H(x.Object({prompt:x.String({minLength:1,maxLength:32000,pattern:"\\S"})})),G1=H(x.Object({source:US,session:US})),U1=H(x.Object({sessionId:x.String(),projectPath:x.String()})),Z1=H(x.Object({type:x.String(),properties:x.Record(x.String(),x.Unknown())})),bS=x.Object({type:W(["file","image","url"]),path:x.Optional(x.String()),url:x.Optional(x.String()),content:x.Optional(x.String()),mimeType:x.Optional(x.String()),name:x.Optional(x.String())}),fS=H(x.Object({prompt:x.String({minLength:1,maxLength:32000,pattern:"\\S"}),title:x.Optional(x.String({minLength:1,maxLength:200})),projectPath:x.Optional(x.String()),isolation:XO(AS,"worktree"),permissionMode:XO(hO,"default"),attachments:x.Optional(x.Array(bS))})),BS=H(x.Object({session:wS,runId:x.String(),messageId:x.String(),status:W(["queued","running"]),queuePosition:x.Optional(x.Integer({minimum:1})),queueDepth:x.Optional(x.Integer({minimum:0})),maxConcurrentTasks:x.Optional(x.Integer({minimum:1}))})),HS=H(x.Object({content:x.String(),projectPath:x.Optional(x.String()),permissionMode:x.Optional(hO),attachments:x.Optional(x.Array(bS))})),A1=H(x.Object({messageId:x.String(),role:PO,content:x.String(),timestamp:x.String()})),_1=H(x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(W(["once","session","project"])),targetMode:x.Optional(hO),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))})),w1=H(x.Object({id:x.String(),displayName:x.Optional(x.String()),provider:x.String(),model:x.String(),contextWindow:x.Optional(x.Number()),maxTokens:x.Optional(x.Number()),reasoning:x.Optional(x.Boolean()),input:x.Optional(x.Array(W(["text","image"]))),overrides:x.Optional(x.Object({baseUrl:x.Optional(x.String()),temperature:x.Optional(x.Number()),maxOutputTokens:x.Optional(x.Number()),timeout:x.Optional(x.Number())}))})),X1=H(W(["vs-dark","vs-light","hc-black"])),zx=H(W(["light","dark","system"])),Ex=H(x.Object({language:x.String(),theme:x.String(),uiTheme:zx,autoSaveSessions:x.Boolean(),notifyBuild:x.Boolean(),notifyErrors:x.Boolean(),notifySounds:x.Boolean(),privacyTelemetry:x.Boolean(),privacyCrash:x.Boolean()})),y1=H(x.Partial(Ex));var q=L("Service"),Cx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),kx=HS,hx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),Px=x.Object({projectPath:x.String()}),Rx=x.Object({objective:x.String({minLength:1}),tokenBudget:x.Optional(x.Integer({minimum:1})),permissionMode:x.Optional(W(["default","autoEdit","plan","yolo"]))}),Ix=x.Union([x.Object({action:x.Literal("pause")}),x.Object({action:x.Literal("resume")}),x.Object({action:x.Literal("edit"),objective:x.String({minLength:1})})]),R=new Map,OO=new Map,zO=new mx({max:100,ttl:1800000});function gx(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function a(O){if(!O)return;return OO.get(O)??zO.get(O)}function vx(O){if(OO.get(O.id)!==O)return;OO.delete(O.id),zO.set(O.id,O)}function cx(O){OO.delete(O),zO.delete(O)}function VO(O){return O?.status==="queued"||O?.status==="running"||O?.status==="waiting_permission"}function qO(O,S="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed")return!1;let j=O.pendingPermission;return O.pendingPermission=void 0,j?.resolve({approved:!1,reason:zS}),O.abortController.abort(S),O.status="cancelled",z.publish(gx(O),"run.cancelled",{runId:O.id}),!0}function mS(O,S=!1){let{permissionId:j,details:$}=O;if($.type==="askUserQuestion"&&$.questions)return{type:"question.required",properties:{requestId:j,toolCallId:j,questions:$.questions,details:$,...S?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:j,toolName:$.toolName,description:$.message,args:$.args,details:$,...S?{replayed:!0}:{}}}}function tx(){for(let O of OO.values())qO(O,"route-reset");OO.clear(),zO.clear(),R.clear()}var CS=(O)=>{if(!O||typeof O!=="object")return O;let S={...O},j=200000;if(typeof S.oldContent==="string"&&S.oldContent.length>j)delete S.oldContent;if(typeof S.newContent==="string"&&S.newContent.length>j)delete S.newContent;return S};function ux(O,S,j){switch(j.kind){case"tool_start":if("function"in j.toolCall)z.publish(O,"subagent.update",{subagentSessionId:S,toolName:j.toolCall.function.name}),z.publish(O,"subagent.tool.start",{subagentSessionId:S,toolCallId:j.toolCall.id,toolName:j.toolCall.function.name,arguments:j.toolCall.function.arguments,toolKind:j.toolKind});break;case"tool_result":if("function"in j.toolCall)z.publish(O,"subagent.tool.result",{subagentSessionId:S,toolCallId:j.toolCall.id,toolName:j.toolCall.function.name,success:!j.result.error,summary:j.result.metadata?.summary,output:dO(lO(j.toolCall.function.name,j.result)),metadata:CS(j.result.metadata)});break;case"content_delta":z.publish(O,"subagent.delta",{subagentSessionId:S,delta:j.delta});break;case"thinking_delta":z.publish(O,"subagent.thinking.delta",{subagentSessionId:S,delta:j.delta});break;case"stream_end":z.publish(O,"subagent.stream.end",{subagentSessionId:S});break;default:break}}function KO(O,S="projectPath"){if(!MS.isAbsolute(O))throw new f(`${S} must be absolute`);return MS.resolve(O)}function tO(O){try{qS(O)}catch(S){throw new f(S instanceof Error?S.message:`Invalid session ID: ${O}`)}}function t(O){return{sessionId:O.id,projectPath:O.projectPath}}function BO(O,S,j){return{id:O.sessionId,projectPath:O.projectPath,title:O.title??`Session ${O.sessionId.slice(0,6)}`,createdAt:new Date(O.firstMessageTime),updatedAt:new Date(O.lastMessageTime),rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,taskStatus:O.taskStatus,taskStatusReason:O.taskStatusReason,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:O.taskQueuePosition,taskQueueDepth:O.taskQueueDepth,taskConcurrencyLimit:O.taskConcurrencyLimit,taskWorktree:j,messages:S}}function kS(O,S){O.taskStatus=S.taskStatus,O.taskStatusReason=S.taskStatusReason,O.taskStartedAt=S.taskStartedAt,O.taskCompletedAt=S.taskCompletedAt,O.taskPromptSummary=S.taskPromptSummary,O.taskIsolation=S.taskIsolation,O.taskSourceProjectPath=S.taskSourceProjectPath,O.taskWorktreePath=S.taskWorktreePath,O.taskWorktreeBranch=S.taskWorktreeBranch,O.taskBaseCommit=S.taskBaseCommit,O.taskDiffStat=S.taskDiffStat,O.taskQueuePosition=S.taskQueuePosition,O.taskQueueDepth=S.taskQueueDepth,O.taskConcurrencyLimit=S.taskConcurrencyLimit,O.updatedAt=new Date(S.lastMessageTime)}async function RO(O){let S=await E.findSessionMetadata(O.id,O.projectPath);if(S)kS(O,S)}function HO(O){let S=a(O.currentRunId),j=S?.status==="waiting_permission"?"running":S?.status??O.taskStatus;return{sessionId:O.id,projectPath:O.projectPath,title:O.title,rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,status:void 0,taskStatus:j,taskStatusReason:O.taskStatusReason,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:S?.status==="queued"?S.taskQueuePosition:j==="queued"?O.taskQueuePosition:void 0,taskQueueDepth:S?.status==="queued"?S.taskQueueDepth:j==="queued"?O.taskQueueDepth:void 0,taskConcurrencyLimit:S?.taskConcurrencyLimit??O.taskConcurrencyLimit,agentType:void 0,model:void 0,messageCount:O.messages.length,firstMessageTime:O.createdAt.toISOString(),lastMessageTime:O.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function r(O,S){if(tO(O),S!==void 0){let $=yO({sessionId:O,projectPath:KO(S)});if(R.has(F($)))return $;let J=await E.findSessionMetadata($.sessionId,$.projectPath);if(!J)throw new C("Session",O);return yO({sessionId:J.sessionId,projectPath:J.projectPath})}let j=new Map;for(let $ of R.values()){if($.id!==O)continue;let J=t($);j.set(F(J),J)}for(let $ of await E.listSessions()){if($.sessionId!==O)continue;let J=yO({sessionId:$.sessionId,projectPath:$.projectPath});j.set(F(J),J)}if(j.size===0)try{let $=await E.findSessionMetadata(O);if(!$)throw new C("Session",O);return yO({sessionId:$.sessionId,projectPath:$.projectPath})}catch($){if($ instanceof C)throw $;if($ instanceof Error&&$.message.startsWith("Ambiguous session ID:"))throw new i;throw $}if(j.size>1)throw new i;return j.values().next().value}function uO(O){if(typeof O==="string")return O;return O.filter((S)=>S.type==="text").map((S)=>S.text).join(`
|
|
2
|
-
`)}function KS(O,S){let j=(S??[]).filter((J)=>J.type==="image"&&typeof J.content==="string").map((J)=>({type:"image_url",image_url:{url:J.content}}));if(j.length===0)return O;let $=[];if(O.trim())$.push({type:"text",text:O});return $.push(...j),$}var hS=()=>{tx();let O=new Wx;O.onError((N,T)=>{if(N instanceof I)return T.json(N.toObject(),N.statusCode);return q.error("[SessionRoutes] Unhandled route error:",N),T.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let S=new Map,j=new Map,$=new Map,J=new Map,Y=(N)=>{let T=F(N),V=J.get(T);if(!V)V=new Lx,J.set(T,V);return V},Q=async(N)=>{let T=F(t(N)),V=S.get(T);if(V)return V;let G=j.get(T);if(!G)G=cO.create({sessionId:N.id,workspaceRoot:N.projectPath,...N.taskWorktree?{taskWorktree:N.taskWorktree}:{},...N.taskIsolation?{taskIsolation:N.taskIsolation}:{}}),j.set(T,G);try{let U=await G;return S.set(T,U),U}finally{if(j.get(T)===G)j.delete(T)}},y=async(N)=>{let T=F(N),V=R.get(T);if(V)return V;let G=$.get(T);if(!G)G=(async()=>{let U=await E.findSessionMetadata(N.sessionId,N.projectPath);if(!U)throw new C("Session",N.sessionId);let[_,A]=await Promise.all([E.loadSession(N.sessionId,N.projectPath),E.findSessionTaskWorktree(N.sessionId,N.projectPath)]),p=BO(U,_,A);return R.set(T,p),p})(),$.set(T,G);try{return await G}finally{if($.get(T)===G)$.delete(T)}},Z=async(N,T)=>{return y(await r(N,T))},D=(N,T,V,G={})=>{let U=UO(12),_={id:U,sessionId:N.id,projectPath:N.projectPath,status:"running",abortController:new AbortController,createdAt:new Date};if(G.taskRuntime){let A=G.taskRuntime,p=TO.admit({key:`${N.projectPath}\x00${N.id}`,...A.getTaskAdmissionLimits(),signal:_.abortController.signal,onUpdate:(X)=>{_.status=X.state,_.taskQueuePosition=X.queuePosition,_.taskQueueDepth=X.queueDepth,_.taskConcurrencyLimit=X.maxConcurrent,N.taskStatus=X.state,N.taskQueuePosition=X.queuePosition,N.taskQueueDepth=X.queueDepth,N.taskConcurrencyLimit=X.maxConcurrent,_.taskAdmissionUpdate=(_.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await A.setTaskAdmission(X)}).catch((b)=>{q.warn(`[SessionRoutes] Failed to persist admission for ${N.id}:`,b)})}});_.taskAdmission=p;let w=p.getSnapshot();_.status=w.state,_.taskQueuePosition=w.queuePosition,_.taskQueueDepth=w.queueDepth,_.taskConcurrencyLimit=w.maxConcurrent}return OO.set(U,_),N.currentRunId=U,_.completion=lx(_,N,T,V,Q,{pendingInputOnly:G.pendingInputOnly,preparedInputTurn:G.preparedInputTurn,goalContinuationOnly:G.goalContinuationOnly,taskAdmission:_.taskAdmission}).catch((A)=>{q.error(`[SessionRoutes] Run ${U} failed:`,A)}),_},B=async(N)=>{let T=IO("task",12),V=KO(N.sourceProjectPath),G,U;try{let _=await FS.createSessionTask({sessionId:T,prompt:N.prompt,title:N.title,sourceProjectPath:V,isolation:N.isolation}),{metadata:A}=_;G=_.taskWorktree,U=BO(A,[],G);let p=t(U);R.set(F(p),U),z.publish(p,"task.status",{taskStatus:A.taskStatus,updatedAt:A.lastMessageTime});let w=KS(N.prompt,N.attachments),X=await Q(U),b=await X.prepareInputTurn(w);if(!b.accepted)throw new g(`Task prompt was not accepted: ${b.reason}`);let h=D(U,w,N.permissionMode,{preparedInputTurn:b,taskRuntime:X});return await h.taskAdmissionUpdate,{session:HO(U),runId:h.id,messageId:b.messageId,status:h.status==="queued"?"queued":"running",queuePosition:h.taskQueuePosition,queueDepth:h.taskQueueDepth,maxConcurrentTasks:h.taskConcurrencyLimit}}catch(_){if(_ instanceof vO&&U){let A=t(U),p=F(A);if(G)await GO.exit({sessionId:U.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await S.get(p)?.dispose().catch(()=>{return}),S.delete(p),await E.deleteSession(U.id,U.projectPath).catch(()=>{return}),R.delete(p),new _O("Task admission queue is full")}if(U){let A=await E.findSessionMetadata(U.id,U.projectPath).catch(()=>{return});if(!A||A.taskStatus==="queued"){let p=await E.updateSessionMetadata(U.id,U.projectPath,{taskStatus:"failed",taskStatusReason:"Task dispatch failed",taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});U.taskStatus=p?.taskStatus??"failed",U.taskStatusReason=p?.taskStatusReason??"Task dispatch failed",U.taskCompletedAt=p?.taskCompletedAt}else U.taskStatus=A.taskStatus,U.taskStatusReason=A.taskStatusReason,U.taskCompletedAt=A.taskCompletedAt}throw _}},M=async(N,T)=>{let V=await Z(N,T);if(!V.taskWorktree)throw new f("Session does not have a task worktree");try{await GO.restoreSession(V.taskWorktree);let G=await GO.getDiffArtifact(V.id);if(!G)throw new g("Task diff artifact is unavailable");return{sessionId:V.id,projectPath:V.projectPath,...G}}catch(G){if(G instanceof g)throw G;throw q.error("[SessionRoutes] Failed to load task diff artifact:",G),new g("Task diff artifact is unavailable")}},K=async(N)=>{let T=a(N.currentRunId);if(VO(T))return;let V=await Q(N),G=a(N.currentRunId);if(VO(G))return;let U=V.getPendingSteeringCount()>0,A=(U?null:await V.getGoal())?.status==="active";if(!U&&!A||V.hasTurnOwner())return;D(N,"","default",{pendingInputOnly:U,goalContinuationOnly:A,...N.taskIsolation?{taskRuntime:V}:{}})},u=async()=>{let N={scheduled:0,failed:0,deferred:0},T=(await E.listSessions()).filter((V)=>V.taskStatus==="queued"&&V.taskIsolation!==void 0).sort((V,G)=>V.firstMessageTime.localeCompare(G.firstMessageTime)||V.projectPath.localeCompare(G.projectPath)||V.sessionId.localeCompare(G.sessionId));for(let[V,G]of T.entries()){let U={sessionId:G.sessionId,projectPath:G.projectPath};try{if(!await cO.hasPendingInbox(G.projectPath,G.sessionId)){await E.updateSessionMetadata(G.sessionId,G.projectPath,{taskStatus:"failed",taskStatusReason:"Queued task input is missing",taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),N.failed++;continue}let _=await y(U);if(await K(_),_.currentRunId)N.scheduled++}catch(_){if(_ instanceof vO){N.deferred+=T.length-V;break}q.warn(`[SessionRoutes] Failed to recover queued task ${G.sessionId}:`,_),N.deferred++}}return N};return O.get("/",async(N)=>{try{let T=await E.listSessions(),V=new Set(T.filter((X)=>X.relationType==="subagent").map((X)=>F({sessionId:X.sessionId,projectPath:X.projectPath}))),G=Array.from(R.values()).filter((X)=>!V.has(F(t(X)))&&X.relationType!=="subagent").map((X)=>HO(X)),U=new Set(G.map((X)=>F({sessionId:X.sessionId,projectPath:X.projectPath}))),_=T.filter((X)=>{if(X.relationType==="subagent")return!1;return!U.has(F({sessionId:X.sessionId,projectPath:X.projectPath}))}),A=new Set(U),p=_.filter((X)=>{let b=F({sessionId:X.sessionId,projectPath:X.projectPath});if(A.has(b))return!1;return A.add(b),!0}),w=[...G,...p];return N.json(w)}catch(T){throw q.error("[SessionRoutes] Failed to list sessions:",T),new d("Failed to list sessions")}}),O.post("/",async(N)=>{try{let T=await N.req.json(),V=c(Cx,T);if(!V.success)throw new f("Invalid request body");let{title:G,projectPath:U}=V.data,_=IO("web",12),A=KO(U||N.get("directory")||k(),U?"projectPath":"directory"),p=await E.createSessionMetadata(_,A,{title:G}),w=BO(p,[]),X=t(w);return R.set(F(X),w),z.publish(X,"task.status",{taskStatus:p.taskStatus,updatedAt:p.lastMessageTime}),N.json({...HO(w),status:void 0,agentType:void 0,model:void 0})}catch(T){if(q.error("[SessionRoutes] Failed to create session:",T),T instanceof f)throw T;throw new d("Failed to create session")}}),O.post("/:sessionId/fork",async(N)=>{let T=N.req.param("sessionId");try{tO(T);let V=await N.req.json(),G=c(Px,V);if(!G.success)throw new f("Invalid request body");let U=KO(G.data.projectPath),_=await E.findSessionMetadata(T,U);if(!_)throw new C("Session",T);let A=await E.forkSession(T,{sourceProjectPath:_.projectPath,targetProjectPath:_.projectPath}),p=BO(A.metadata,A.messages),w=t(p);return R.set(F(w),p),z.publish(w,"task.status",{taskStatus:A.metadata.taskStatus,...A.metadata.taskCompletedAt?{taskCompletedAt:A.metadata.taskCompletedAt}:{},updatedAt:A.metadata.lastMessageTime}),N.json({session:A.metadata,messages:A.messages},201)}catch(V){if(V instanceof f||V instanceof C||V instanceof g)throw V;if(V instanceof LS)throw new g("Session has no durable creation record");throw q.error("[SessionRoutes] Failed to fork session:",V),new d("Failed to fork session")}}),O.get("/:sessionId",async(N)=>{let T=N.req.param("sessionId");try{let V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(G)return N.json(HO(G));let U=await E.findSessionMetadata(V.sessionId,V.projectPath);if(!U)throw new C("Session",T);return N.json(U)}catch(V){if(V instanceof f||V instanceof C||V instanceof i)throw V;throw q.error("[SessionRoutes] Failed to get session:",V),new d("Failed to get session")}}),O.patch("/:sessionId",async(N)=>{let T=N.req.param("sessionId");try{let V=await N.req.json(),G=c(hx,V);if(!G.success)throw new f("Invalid request body");if(G.data.title===void 0)throw new f("title is required");let U=await r(T,G.data.projectPath),_=await E.updateSessionMetadata(U.sessionId,U.projectPath,{title:G.data.title}),A=R.get(F(U));if(A)A.title=_.title??A.title,A.updatedAt=new Date(_.lastMessageTime);return N.json({success:!0,title:_.title})}catch(V){if(q.error("[SessionRoutes] Failed to update session:",V),V instanceof f||V instanceof C||V instanceof i)throw V;throw new d("Failed to update session")}}),O.get("/:sessionId/rewind",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=await Q(T);return N.json({checkpoints:await V.listRewindCheckpoints()})}),O.post("/:sessionId/rewind",async(N)=>{let T=c(DS,await N.req.json());if(!T.success)throw new f("Invalid rewind request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))throw new g("Cannot rewind while a run is active");let _=await Q(V),A;try{A=await _.rewindSession(T.data)}catch(p){if(p instanceof Error&&p.message.startsWith("Cannot rewind while"))throw new g(p.message);throw p}return V.messages=[...A.messages],V.updatedAt=new Date,z.publish(G,"session.rewound",{targetMessageId:A.checkpoint.messageId,mode:A.mode,removedTurns:A.removedTurns,restoredFiles:A.restoredFiles,messages:A.messages}),N.json(A)})}),O.get("/:sessionId/subagents",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=await Q(T);return N.json({subagents:V.listSubagents().map(MO)})}),O.post("/:sessionId/subagents/:agentId/resume",async(N)=>{tO(N.req.param("agentId"));let T=pS.safeParse(await N.req.json());if(!T.success)throw new f("Invalid subagent resume request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))throw new g("Cannot resume a subagent while a parent run is active");let _=await Q(V),A=!1,p,w=(b)=>{z.publish(G,"subagent.complete",{subagentSessionId:b.id,success:b.status==="completed",status:b.status,summary:b.result?.message?.slice(0,500),resumedFrom:b.resumedFrom,rootAgentId:b.rootAgentId,resumeDepth:b.resumeDepth})},X;try{X=_.resumeSubagent({agentId:N.req.param("agentId"),prompt:T.data.prompt,onEvent:(b,h)=>{ux(G,h,b)},onCompleted:(b)=>{if(A)w(b);else p=b}})}catch(b){if(b instanceof Error&&(b.message.startsWith("Cannot resume")||b.message.startsWith("Subagent cannot")))throw new g(b.message);if(b instanceof Error&&b.message.startsWith("Subagent not found"))throw new C(b.message);throw b}if(z.publish(G,"subagent.start",{subagentSessionId:X.session.id,type:X.session.subagentType,description:X.session.description,resumedFrom:X.source.id,rootAgentId:X.session.rootAgentId,resumeDepth:X.session.resumeDepth}),A=!0,p)w(p);return N.json({source:MO(X.source),session:MO(X.session)})})}),O.get("/:sessionId/goal",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath"));return N.json({goal:await new ES(T.projectPath,T.id).get()})}),O.put("/:sessionId/goal",async(N)=>{let T=c(Rx,await N.req.json());if(!T.success)throw new f("Invalid goal request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))return N.json({status:"rejected",reason:"run_active"},409);let _=await Q(V),A=await _.createGoal(T.data);z.publish(G,"goal.updated",{goal:A});let p=T.data.permissionMode??"default",w=D(V,"",p,{goalContinuationOnly:!0,...V.taskIsolation?{taskRuntime:_}:{}});return await w.taskAdmissionUpdate,N.json({status:w.status==="queued"?"queued":"running",runId:w.id,goal:A,queuePosition:w.taskQueuePosition,queueDepth:w.taskQueueDepth,maxConcurrentTasks:w.taskConcurrencyLimit},202)})}),O.patch("/:sessionId/goal",async(N)=>{let T=c(Ix,await N.req.json());if(!T.success)throw new f("Invalid goal update");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=await Q(V),_;if(T.data.action==="pause")_=await U.pauseGoal();else if(T.data.action==="edit")_=await U.editGoal(T.data.objective);else _=await U.resumeGoal();if(z.publish(G,"goal.updated",{goal:_}),_.status==="active"&&!VO(a(V.currentRunId))){let A=D(V,"","default",{goalContinuationOnly:!0,...V.taskIsolation?{taskRuntime:U}:{}});return await A.taskAdmissionUpdate,N.json({status:A.status==="queued"?"queued":"running",runId:A.id,goal:_,queuePosition:A.taskQueuePosition,queueDepth:A.taskQueueDepth,maxConcurrentTasks:A.taskConcurrencyLimit},202)}return N.json({status:_.status,goal:_})})}),O.delete("/:sessionId/goal",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=t(T),U=await(await Q(T)).clearGoal();if(U)z.publish(V,"goal.cleared",{});return N.json({cleared:U})}),O.delete("/:sessionId",async(N)=>{let T=N.req.param("sessionId"),V=N.req.query("projectPath");try{let G=await r(T,V),U=F(G),_=R.get(U),A=S.get(U),p=_?.taskWorktree??await E.findSessionTaskWorktree(G.sessionId,G.projectPath),w;if(_?.currentRunId){let X=a(_.currentRunId);if(X)qO(X),await X.completion,w=X.id}if(A)await A.clearGoal().catch((X)=>{q.warn("[SessionRoutes] Failed to clear session goal:",X)});if(await E.deleteSession(G.sessionId,G.projectPath),w)cx(w);if(R.delete(U),$.delete(U),j.delete(U),J.delete(U),A){if(await A.dispose(),S.delete(U),S.size===0)await xO.getInstance().disconnectAll()}if(p)try{await GO.restoreSession(p),await GO.exit({sessionId:G.sessionId,action:"remove",discardChanges:!0})}catch(X){q.warn(`[SessionRoutes] Failed to remove deleted task worktree ${G.sessionId}:`,X)}return N.json({success:!0})}catch(G){if(q.error("[SessionRoutes] Failed to delete session:",G),G instanceof f||G instanceof C||G instanceof i)throw G;throw new d("Failed to delete session")}}),O.get("/:sessionId/message",async(N)=>{let T=N.req.param("sessionId");try{let V=await r(T,N.req.query("projectPath")),G=R.get(F(V)),U=G?.messages?G.messages:await E.loadSession(V.sessionId,V.projectPath);return N.json(U)}catch(V){if(q.error("[SessionRoutes] Failed to get messages:",V),V instanceof f||V instanceof C||V instanceof i)throw V;throw new d("Failed to get messages")}}),O.get("/:sessionId/events",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=await y(V);return Fx(N,async(U)=>{let A,p,w=!1,X=()=>{if(p!==void 0)clearInterval(p),p=void 0;A?.(),A=void 0},b=()=>{if(w)return;w=!0,X()},h=new Set;U.onAbort(b),A=z.subscribe((m)=>{if(m.sessionId!==V.sessionId||m.projectPath!==V.projectPath)return;let l=m.properties.requestId;if((m.type==="permission.asked"||m.type==="question.required")&&typeof l==="string"){if(h.has(l))return;h.add(l)}U.writeSSE({data:JSON.stringify({type:m.type,properties:{...m.properties,sessionId:m.sessionId,projectPath:m.projectPath}})}).catch(b)});try{if(U.aborted||w)return;if(await U.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:V.sessionId,projectPath:V.projectPath,timestamp:Date.now()}})}).catch((P)=>{throw b(),P}),U.aborted||w)return;let l=a(G.currentRunId)?.pendingPermission;if(l){h.add(l.permissionId);let P=mS(l,!0);await U.writeSSE({data:JSON.stringify({type:P.type,properties:{...P.properties,sessionId:V.sessionId,projectPath:V.projectPath}})})}K(G).catch((P)=>{q.error(`[SessionRoutes] Failed to resume pending input for ${T}:`,P)}),p=setInterval(()=>{if(!U.aborted)U.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(b)},15000);while(!U.aborted&&!w)await new Promise((P)=>setTimeout(P,1000))}finally{b()}})}),O.post("/:sessionId/message",async(N)=>{let T=N.req.param("sessionId"),V=await N.req.json(),G=c(kx,V);if(!G.success)throw new f("Invalid message format");let{content:U,attachments:_,permissionMode:A,projectPath:p}=G.data,w=A||"default",X=KS(U,_),b=await Z(T,p??N.req.query("projectPath")),h=t(b);return Y(h).runExclusive(async()=>{let m=a(b.currentRunId);if(VO(m)){let o=await(await Q(b)).enqueueSteering(X,{allowBeforeTurn:!0});if(!o.accepted)return N.json({status:"rejected",reason:o.reason??"turn_unavailable"},409);let CO=o.messageId??UO(12),xS=o.queued;z.publish(h,"message.created",{messageId:CO,role:"user",content:uO(X)});let Vx=o.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(z.publish(h,Vx,{runId:m.id,messageId:CO,queued:xS}),o.delivery==="next_turn"&&m.status!=="running"&&m.status!=="waiting_permission")K(b).catch((Jx)=>{q.error(`[SessionRoutes] Failed to wake queued follow-up for ${T}:`,Jx)});if(o.delivery==="next_turn")m.pendingFollowUpRequested=!0;return N.json({runId:m.id,messageId:CO,status:o.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:xS},202)}let l=await Q(b),P=await l.prepareInputTurn(X);if(!P.accepted)return N.json({status:"rejected",reason:P.reason},P.reason==="queue_full"?429:409);let e=D(b,X,w,{preparedInputTurn:P,...b.taskIsolation?{taskRuntime:l}:{}});return await e.taskAdmissionUpdate,N.json({runId:e.id,messageId:P.messageId,status:e.status==="queued"?"queued":"running",queuePosition:e.taskQueuePosition,queueDepth:e.taskQueueDepth,maxConcurrentTasks:e.taskConcurrencyLimit},202)})}),O.post("/:sessionId/abort",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(G?.currentRunId){let U=a(G.currentRunId);if(U)qO(U),await U.completion}return N.json({success:!0})}),O.get("/:sessionId/status",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(!G?.currentRunId)return N.json({sessionId:T,projectPath:V.projectPath,status:"idle"});let U=a(G.currentRunId);return N.json({sessionId:T,projectPath:V.projectPath,runId:G.currentRunId,status:U?.status||"idle"})}),{app:O,dispatchTask:B,getTaskDiff:M,recoverQueuedTasks:u}};async function lx(O,S,j,$,J,Y={}){let{abortController:Q,sessionId:y,id:Z}=O,D=Y.preparedInputTurn?.messageId??UO(12),M=Y.pendingInputOnly===!0||Y.preparedInputTurn?.mode==="pending"||Y.goalContinuationOnly===!0?void 0:UO(12),K,u=t(S),N=(T,V)=>{z.publish(u,T,V)};try{if(Y.taskAdmission){if(await Y.taskAdmission.ready,await O.taskAdmissionUpdate,Q.signal.aborted)throw Error(String(Q.signal.reason||"Task run cancelled"))}if(S.taskStatus="running",S.taskStatusReason=void 0,S.taskStartedAt=new Date().toISOString(),S.taskCompletedAt=void 0,!Y.pendingInputOnly&&!Y.goalContinuationOnly)N("message.created",{messageId:D,role:"user",content:uO(j)});if(N("session.status",{status:"running"}),M)N("message.created",{messageId:M,role:"assistant",content:""});K=await J(S);let T=K,V=await WS.createWithRuntime(T,{sessionId:y,...S.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}}),G=async(w)=>{let X=UO(12),b=300000;O.status="waiting_permission";let h=new Promise((e)=>{let SS=setTimeout(()=>{q.warn(`[SessionRoutes] Permission ${X} timed out after 300000ms`),N("permission.timeout",{requestId:X}),e({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:X,resolve:(o)=>{clearTimeout(SS),e(o)},details:w}}),m=O.pendingPermission;if(!m)throw Error("Permission request was not registered");let l=mS(m);N(l.type,l.properties),q.info(`[SessionRoutes] Permission request created: ${X}, runId: ${Z}`);let P=await h;if(q.info(`[SessionRoutes] Permission response received: ${X}, approved: ${P.approved}`),!Q.signal.aborted)O.status="running";if(O.pendingPermission===m)O.pendingPermission=void 0;return P},U={messages:[...S.messages],userId:"web-user",sessionId:y,workspaceRoot:S.projectPath,signal:Q.signal,permissionMode:$,...S.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:G}},_=()=>{if(!M)M=UO(12),N("message.created",{messageId:M,role:"assistant",content:""});return M},A=async(w)=>{switch(w.kind){case"content_delta":N("message.delta",{messageId:_(),delta:w.delta});break;case"thinking_delta":N("thinking.delta",{delta:w.delta});break;case"tool_start":if("function"in w.toolCall)N("tool.start",{messageId:_(),toolName:w.toolCall.function.name,toolCallId:w.toolCall.id,arguments:w.toolCall.function.arguments,toolKind:w.toolKind});break;case"tool_result":if("function"in w.toolCall)N("tool.result",{messageId:_(),toolName:w.toolCall.function.name,toolCallId:w.toolCall.id,success:w.result.success,summary:w.result.metadata?.summary,output:dO(lO(w.toolCall.function.name,w.result)),metadata:CS(w.result.metadata)});break;case"token_usage":N("token.usage",{...w.usage});break;case"turn_start":N("turn.started",{turn:w.turn,maxTurns:w.maxTurns});break;case"steering_applied":N("steering.applied",{runId:Z,messageIds:w.messageIds,count:w.count,recovered:w.recovered,delivery:w.delivery,queued:T.getPendingSteeringCount()});break;case"follow_up_started":{if(M)N("message.complete",{messageId:M}),M=void 0;for(let X of w.messages){if(!X.recovered||X.persisted)continue;N("message.created",{messageId:X.id,role:"user",content:uO(X.content),recovered:!0})}N("follow_up.started",{runId:Z,queued:w.queued,recovered:w.recovered}),_();break}case"goal_updated":N("goal.updated",{goal:w.goal});break;case"goal_continuation_started":N("goal.continuation.started",{goal:w.goal,continuation:w.continuation}),_();break;case"compaction":N(w.phase==="start"?"compaction.started":"compaction.completed",{});break;case"model_fallback":N("model.fallback",{});break;case"task_update":N("task.updated",{tasks:w.tasks});break;default:break}},p=await gO(V.chatStream(j,U,{stream:!0,pendingInputOnly:Y.pendingInputOnly,preparedInputTurn:Y.preparedInputTurn,goalContinuationOnly:Y.goalContinuationOnly,taskAdmission:Y.taskAdmission}),A);if(!p.success)throw Error(p.error?.message??"Agent run failed");for(let w=0;w<20;w++){let X=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,T.getPendingSteeringCount()===0){if(!X)break;continue}if(Q.signal.aborted)break;if(p=await gO(V.chatStream("",U,{stream:!0,pendingInputOnly:!0,taskAdmission:Y.taskAdmission}),A),!p.success)throw Error(p.error?.message??"Agent follow-up failed")}if(S.messages=[...U.messages],S.updatedAt=new Date,await RO(S),Q.signal.aborted||O.status==="cancelled"){S.taskStatus="cancelled",S.taskCompletedAt??=new Date().toISOString(),N("session.status",{status:"idle"});return}if(M)N("message.complete",{messageId:M});N("thinking.completed",{}),O.status="completed",S.taskStatus="completed",S.taskCompletedAt??=new Date().toISOString(),N("session.completed",{runId:Z,outputTruncated:p.metadata?.outputTruncated??!1}),N("session.status",{status:"idle"})}catch(T){if(K&&Y.preparedInputTurn)await K.finishTurn(Y.preparedInputTurn.handle).catch(()=>{return});if(Q.signal.aborted||O.status==="cancelled"){if(qO(O,"runtime-abort"),S.taskIsolation)await(K??await J(S).catch(()=>{return}))?.setTaskStatus("cancelled",String(Q.signal.reason||"Task run cancelled")).catch(()=>{return});await RO(S).catch(()=>{return}),S.taskStatus="cancelled",S.taskCompletedAt??=new Date().toISOString(),N("session.status",{status:"idle"});return}if(await RO(S).catch(()=>{return}),q.error("[SessionRoutes] Agent execution error:",T),O.status="failed",S.taskStatus="failed",S.taskStatusReason??="Agent execution failed",S.taskCompletedAt??=new Date().toISOString(),S.taskIsolation){let V=K?await K.setTaskStatus("failed",S.taskStatusReason).catch(()=>{return}):await E.updateSessionMetadata(S.id,S.projectPath,{taskStatus:"failed",taskStatusReason:S.taskStatusReason,taskCompletedAt:S.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(V)kS(S,V)}N("session.error",{error:T instanceof Error?T.message:"Unknown error"}),N("session.status",{status:"error"})}finally{if(Y.taskAdmission?.release(),Y.taskAdmission){let T=TO.getStats();N("task.status",{taskStatus:S.taskStatus,...S.taskStatusReason?{taskStatusReason:S.taskStatusReason}:{},...S.taskStartedAt?{taskStartedAt:S.taskStartedAt}:{},...S.taskCompletedAt?{taskCompletedAt:S.taskCompletedAt}:{},...S.taskDiffStat?{taskDiffStat:S.taskDiffStat}:{},taskQueueDepth:T.queued,taskConcurrencyLimit:T.maxConcurrent,taskInFlight:T.inFlight,updatedAt:new Date().toISOString()})}vx(O)}}function PS(O,S,j){q.info(`[SessionRoutes] Looking for permission ${S} in session ${O.sessionId}`),q.info(`[SessionRoutes] Active runs: ${OO.size}`);for(let[$,J]of OO.entries())if(q.info(`[SessionRoutes] Checking run ${$}: sessionId=${J.sessionId}, projectPath=${J.projectPath}, pendingPermission=${J.pendingPermission?.permissionId}`),J.sessionId===O.sessionId&&J.projectPath===O.projectPath&&J.pendingPermission?.permissionId===S)return J.pendingPermission.resolve(j),q.info(`[SessionRoutes] Permission ${S} responded, runId: ${J.id}`),!0;return q.error(`[SessionRoutes] Permission not found: ${S}`),!1}var aO=L("Service"),ax=x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(W(["once","session","project"])),targetMode:x.Optional(W(["default","autoEdit","plan","yolo"])),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))}),RS=()=>{let O=new dx;return O.post("/:permissionId",async(S)=>{let j=S.req.param("permissionId"),$=S.req.query("sessionId"),J=S.req.query("projectPath");aO.info(`[PermissionRoutes] Received permission response: permissionId=${j}, sessionId=${$}`);try{let Y=await S.req.json(),Q=c(ax,Y);if(!Q.success)throw new f("Invalid permission response format");let{approved:y,remember:Z,scope:D,targetMode:B,feedback:M,answers:K}=Q.data;if(!$)throw new f("sessionId query parameter is required");let u=await r($,J);if(!PS(u,j,{approved:y,reason:M,scope:D,targetMode:B,feedback:M,answers:K}))throw new C("Permission request",j);return aO.info(`[PermissionRoutes] Permission ${j} ${y?"approved":"denied"}`),S.json({success:!0,approved:y,remember:Z})}catch(Y){if(aO.error("[PermissionRoutes] Failed to respond to permission:",Y),Y instanceof f||Y instanceof i||Y instanceof C||Y instanceof I)throw Y;throw Y}}),O};import{Hono as ox}from"hono";var IS=L("Service"),cS=()=>{let O=new ox;return O.get("/",async(S)=>{try{let j=await gS();return S.json(j)}catch(j){return IS.error("[ProviderRoutes] Failed to list providers:",j),S.json([])}}),O.get("/:provider/models",async(S)=>{let j=S.req.param("provider");try{let $=await vS(j);return S.json($)}catch($){return IS.error("[ProviderRoutes] Failed to list models:",$),S.json([])}}),O.put("/:provider/credential",async(S)=>{let j=S.req.param("provider"),$=await S.req.json();if(!$.apiKey?.trim())throw new f("apiKey is required");return await jO().setApiKey(j,$.apiKey.trim()),S.json({success:!0})}),O.delete("/:provider/credential",async(S)=>{return await jO().clearCredential(S.req.param("provider")),S.json({success:!0})}),O};import{Hono as ix}from"hono";import*as $O from"node:fs/promises";import{homedir as nx}from"node:os";import*as LO from"node:path";var JO=L("Service"),oO=LO.join(nx(),".blade","skills-config.json");async function uS(){try{let O=await $O.readFile(oO,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function rx(O){await $O.mkdir(LO.dirname(oO),{recursive:!0}),await $O.writeFile(oO,JSON.stringify(O,null,2))}async function ex(O,S){let j=await uS();if(S)j.disabled=j.disabled.filter(($)=>$!==O);else if(!j.disabled.includes(O))j.disabled.push(O);await rx(j)}var ZO=null,sx=300000;async function O0(){if(ZO&&Date.now()-ZO.timestamp<sx)return ZO.data;try{let O=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!O.ok)return JO.warn(`GitHub API returned ${O.status}`),ZO?.data||[];let S=await O.json(),j=[];for(let $ of S){if($.type!=="dir")continue;let J=`Official ${$.name} skill`;try{let Y=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${$.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(Y.ok){let y=(await Y.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(y)J=y[1].trim().slice(0,100)}}catch{}j.push({name:$.name,description:J,tag:"Official",author:"Anthropic"})}return ZO={data:j,timestamp:Date.now()},j}catch(O){return JO.warn("Failed to fetch skills catalog from GitHub:",O),ZO?.data||[]}}var lS=()=>{let O=new ix;return O.get("/",async(S)=>{try{let j=EO();await j.initialize();let $=j.getAll(),J=await uS(),Y=$.map((Q)=>({id:Q.name,name:Q.name,enabled:!J.disabled.includes(Q.name),description:Q.description||"",version:Q.version||"1.0.0",provider:"Local",location:Q.source==="builtin"?"Built-in":Q.basePath,capabilities:["prompts"],allowedTools:Q.allowedTools||[]}));return S.json(Y)}catch(j){return JO.error("[SkillsRoutes] Failed to get skills:",j),S.json([])}}),O.post("/:name/toggle",async(S)=>{try{let j=S.req.param("name"),$=await S.req.json();return await ex(j,$.enabled),S.json({success:!0,enabled:$.enabled})}catch(j){return JO.error("[SkillsRoutes] Failed to toggle skill:",j),S.json({success:!1,error:j.message},500)}}),O.delete("/:name",async(S)=>{try{let j=S.req.param("name"),$=`${process.env.HOME}/.blade/skills/${j}`;return await $O.rm($,{recursive:!0,force:!0}),await EO().refresh(),S.json({success:!0})}catch(j){return JO.error("[SkillsRoutes] Failed to uninstall skill:",j),S.json({success:!1,error:j.message},500)}}),O.post("/install",async(S)=>{try{let j=await S.req.json(),$=tS(),J=EO(),Y=!1;if(j.source==="catalog"&&j.name){if(Y=await $.installOfficialSkill(j.name),!Y)return S.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(j.source==="repo"&&j.url){if(Y=await $.installFromRepo(j.url,j.name),!Y)return S.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(j.source==="local"&&j.path){if(Y=await $.installFromLocal(j.path,j.name),!Y)return S.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return S.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await J.refresh(),S.json({success:!0})}catch(j){return JO.error("[SkillsRoutes] Failed to install skill:",j),S.json({success:!1,error:j.message},500)}}),O.get("/catalog",async(S)=>{try{let j=await O0();return S.json(j)}catch(j){return JO.error("[SkillsRoutes] Failed to get catalog:",j),S.json([])}}),O};import S0 from"fast-glob";import{Hono as x0}from"hono";import{execSync as j0}from"node:child_process";import{readdir as $0}from"node:fs/promises";import WO from"node:path";var DO=L("Service"),N0=(O)=>{try{return j0("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},V0=[...FO.map((O)=>`${O}/**`),...FO,...iO.map((O)=>`**/${O}`)],J0=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),oS=()=>{let O=new x0;return O.get("/commands",async(S)=>{try{let j=S.req.query("q")||"",$=aS(j).filter((J)=>!J0.has(J.command));return S.json($)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get command suggestions:",j),S.json([])}}),O.get("/files",async(S)=>{try{let j=S.req.query("q")||"",$=S.get("directory")||k(),J=Math.min(Number(S.req.query("limit"))||100,1000),Q=(await S0("**/*",{cwd:$,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:V0})).map((D)=>D.replace(/\\/g,"/"));if(!j)return S.json(Q.slice(0,J));let y=j.toLowerCase(),Z=Q.filter((D)=>D.toLowerCase().includes(y)).slice(0,J);return S.json(Z)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file suggestions:",j),S.json([])}}),O.get("/files/tree",async(S)=>{try{let j=S.get("directory")||k(),$=S.req.query("path")||"",J=$?WO.join(j,$):j,Q=(await $0(J,{withFileTypes:!0})).map((D)=>({name:D.name,path:$?`${$}/${D.name}`:D.name,type:D.isDirectory()?"dir":"file"}));Q.sort((D,B)=>{if(D.type!==B.type)return D.type==="dir"?-1:1;return D.name.localeCompare(B.name)});let y=new Set(FO),Z=Q.filter((D)=>{let B=D.name;if(B.startsWith("."))return!1;if(y.has(B))return!1;for(let M of iO)if(B.match(new RegExp(M.replace("*",".*"))))return!1;return!0});return S.json(Z)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file tree:",j),S.json([])}}),O.get("/files/content",async(S)=>{try{let j=S.req.query("path");if(!j)return S.json({error:"Missing file path"},400);let $=S.get("directory")||k(),J=WO.resolve($,j),Y=WO.relative($,J);if(Y.startsWith("..")||WO.isAbsolute(Y))return S.json({error:"Invalid file path"},400);let Q=dS(),y=await Q.stat(J);if(!y?.isFile)return S.json({error:"File not found"},404);let Z=200000,D=await Q.readTextFile(J),B=D.length>Z;return S.json({path:j,content:B?D.slice(0,Z):D,truncated:B,size:y.size})}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file content:",j),S.json({error:"Failed to read file"},500)}}),O.get("/git-info",async(S)=>{try{let j=S.get("directory")||k(),$=N0(j);return S.json({branch:$})}catch(j){return DO.error("[SuggestionsRoutes] Failed to get git info:",j),S.json({branch:null})}}),O};import{Hono as Y0}from"hono";var nO=L("Service"),iS=(O)=>{let S=new Y0;return S.onError((j,$)=>{if(j instanceof I)return $.json(j.toObject(),j.statusCode);return nO.error("[TaskRoutes] Unhandled route error:",j),$.json(new d("Failed to dispatch task").toObject(),500)}),S.post("/",async(j)=>{let $;try{$=await j.req.json()}catch{throw new f("Invalid request body")}let J=c(fS,$);if(!J.success)throw new f("Invalid task request");try{let Y=await O.dispatchTask({prompt:J.data.prompt,title:J.data.title,sourceProjectPath:J.data.projectPath||j.get("directory")||k(),isolation:J.data.isolation,permissionMode:J.data.permissionMode,attachments:J.data.attachments});return j.json(BS.parse(Y),202)}catch(Y){if(Y instanceof f||Y instanceof g||Y instanceof _O)throw Y;throw nO.error("[TaskRoutes] Failed to dispatch task:",Y),new d("Failed to dispatch task")}}),S.get("/:sessionId/diff",async(j)=>{try{let $=await O.getTaskDiff(j.req.param("sessionId"),j.req.query("projectPath"));return j.json(_S.parse($))}catch($){if($ instanceof f||$ instanceof C||$ instanceof g)throw $;throw nO.error("[TaskRoutes] Failed to load task diff:",$),new d("Failed to load task diff")}}),S};import{Hono as Q0}from"hono";var NO=L("Service"),AO=new Map,nS=2097152,rS=65536;function eS(){return typeof globalThis.Bun<"u"}async function T0(O,S,j){if(eS()){let{spawn:Y}=await import("bun-pty"),Q=Y(O,S,{name:"xterm-256color",cwd:j.cwd,env:j.env});return{pid:Q.pid,write:(y)=>Q.write(y),resize:(y,Z)=>Q.resize(y,Z),kill:()=>Q.kill(),onData:(y)=>Q.onData(y),onExit:(y)=>Q.onExit(y)}}let J=(await import("node-pty")).spawn(O,S,{name:"xterm-256color",cwd:j.cwd,env:j.env,cols:80,rows:24});return{pid:J.pid,write:(Y)=>J.write(Y),resize:(Y,Q)=>J.resize(Y,Q),kill:()=>J.kill(),onData:(Y)=>{J.onData(Y)},onExit:(Y)=>{J.onExit(Y)}}}var sO=void 0,eO;if(eS())try{let{createBunWebSocket:O}=await import("hono/bun"),S=O();eO=S.upgradeWebSocket,sO=S.websocket}catch(O){NO.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function sS(O,S){let j=`term-${Date.now()}`;NO.info(`[Terminal] New connection: ${j}, cwd: ${O}`);let $=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",J=$.endsWith("sh")?["-l"]:[],Y=await T0($,J,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),Q={id:j,process:Y,cwd:O,buffer:"",subscribers:new Set};if(AO.set(j,Q),Q.subscribers.add(S),Y.onData((y)=>{let Z=!1;for(let D of Q.subscribers)try{D.send(y),Z=!0}catch{Q.subscribers.delete(D)}if(Z)return;if(Q.buffer+=y,Q.buffer.length>nS)Q.buffer=Q.buffer.slice(-nS)}),Y.onExit(({exitCode:y})=>{NO.info(`[Terminal] Process exited: ${j}, code: ${y}`);for(let Z of Q.subscribers)try{Z.close()}catch{}AO.delete(j)}),Q.buffer){let y=Q.buffer;Q.buffer="";for(let Z=0;Z<y.length;Z+=rS)S.send(y.slice(Z,Z+rS))}return{session:Q,cleanup:()=>{if(NO.info(`[Terminal] Connection closed: ${j}`),Q.subscribers.delete(S),Q.subscribers.size===0){try{Q.process.kill()}catch{}AO.delete(j)}}}}function Ox(O,S){O.on("connection",async(j,$)=>{let J=new URL($.url||"/",`http://${$.headers.host}`);if(!J.pathname.endsWith("/terminal/ws")){j.close();return}let Y=J.searchParams.get("cwd")||S()||k();try{let{session:Q,cleanup:y}=await sS(Y,{send:(Z)=>j.send(Z),close:()=>j.close()});j.on("message",(Z)=>{try{Q.process.write(String(Z))}catch(D){NO.error("[Terminal] Failed to write to PTY:",D)}}),j.on("close",y),j.on("error",y)}catch(Q){NO.error("[Terminal] Failed to spawn PTY:",Q),j.close()}})}var Sx=()=>{let O=new Q0;if(O.get("/status",(S)=>{let j=Array.from(AO.values()).map(($)=>({id:$.id,cwd:$.cwd}));return S.json({active:j.length,terminals:j})}),O.post("/kill/:terminalId",(S)=>{let j=S.req.param("terminalId"),$=AO.get(j);if($){try{$.process.kill()}catch{}for(let J of $.subscribers)J.close();return AO.delete(j),S.json({success:!0})}return S.json({success:!1,error:"Terminal not found"},404)}),eO)O.get("/ws",eO((S)=>{let j=S.req.query("cwd")||S.get("directory")||k(),$;return{async onOpen(J,Y){try{$=await sS(j,{send:(Q)=>Y.send(Q),close:()=>Y.close()})}catch(Q){NO.error("[Terminal] Failed to spawn PTY:",Q),Y.close()}},onMessage(J){if(!$)return;try{$.session.process.write(String(J.data))}catch(Y){NO.error("[Terminal] Failed to write to PTY:",Y)}},onClose(){$?.cleanup()}}}));else O.get("/ws",(S)=>{return S.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};var v=L("Service"),OS=[],pO;function D0(){let O=Z0(_0(import.meta.url)),S=[YO(O,"web"),YO(k(),"dist/web"),YO(k(),"packages/cli/dist/web")];for(let j of S){let $=YO(j,"index.html");if($x($)){if(mO($,"utf-8").includes("/assets/"))return v.debug(`[Server] Found web dist at: ${j}`),j}}return null}function p0(){let O=new w0;O.onError(($,J)=>{if(v.error("[Server] Request error:",$),$ instanceof I)return J.json($.toObject(),$.statusCode);let Y=$ instanceof Error?$.message:String($);return J.json({error:{code:"INTERNAL_ERROR",message:Y}},500)}),O.use(async($,J)=>{let Y=process.env.BLADE_SERVER_PASSWORD;if(!Y)return J();let Q=$.req.path;if(Q==="/"||Q.startsWith("/assets/")||Q.endsWith(".html")||Q.endsWith(".js")||Q.endsWith(".css"))return J();let y=$.req.header("Authorization");if(!y?.startsWith("Basic "))return $.header("WWW-Authenticate",'Basic realm="Blade Server"'),$.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let Z=Buffer.from(y.slice(6),"base64").toString(),[D,B]=Z.split(":"),M=process.env.BLADE_SERVER_USERNAME??"blade";if(D!==M||B!==Y)return $.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return J()}),O.use(async($,J)=>{let Y=$.req.path==="/health"||$.req.path==="/global/health"||$.req.path.startsWith("/assets/");if(!Y)v.debug(`[Server] ${$.req.method} ${$.req.path}`);let Q=Date.now();if(await J(),!Y){let y=Date.now()-Q;v.debug(`[Server] ${$.req.method} ${$.req.path} - ${$.res.status} (${y}ms)`)}}),O.use(X0({origin($){if(!$)return;if($.startsWith("http://localhost:"))return $;if($.startsWith("http://127.0.0.1:"))return $;if($==="tauri://localhost"||$==="http://tauri.localhost")return $;if(OS.includes($))return $;return}})),O.use(async($,J)=>{let Y=$.req.query("directory")||$.req.header("x-blade-directory")||k();try{Y=decodeURIComponent(Y)}catch{}return $.set("directory",Y),J()});let S=hS();pO=S.recoverQueuedTasks,O.route("/global",VS()),O.route("/events",$S()),O.route("/sessions",S.app),O.route("/tasks",iS(S)),O.route("/configs",jS()),O.route("/permissions",RS()),O.route("/providers",cS()),O.route("/models",GS()),O.route("/suggestions",oS()),O.route("/terminal",Sx()),O.route("/mcp",JS()),O.route("/skills",lS()),O.get("/health",($)=>{return $.json({healthy:!0,version:QO()})});let j=D0();if(j)v.info(`[Server] Serving static files from ${j}`),O.get("/assets/*",($)=>{let J=YO(j,$.req.path);if(!$x(J))return $.json({error:{code:"NOT_FOUND",message:`File not found: ${$.req.path}`}},404);let Y=mO(J),Q=A0(J).toLowerCase(),Z={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[Q]||"application/octet-stream";return new Response(Y,{headers:{"Content-Type":Z,"Cache-Control":"public, max-age=31536000, immutable"}})}),O.get("/",($)=>{let J=YO(j,"index.html"),Y=mO(J,"utf-8");return $.html(Y)}),O.get("*",($)=>{let J=$.req.path;if(J.includes("."))return $.json({error:{code:"NOT_FOUND",message:`File not found: ${J}`}},404);let Y=YO(j,"index.html"),Q=mO(Y,"utf-8");return $.html(Q)});else v.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",($)=>{return $.json({message:"Blade API Server",version:QO(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),O.all("*",($)=>{return $.json({error:{code:"NOT_FOUND",message:`Route not found: ${$.req.path}`}},404)});return O}function b0(){let O=U0(),S=[];for(let j of Object.keys(O)){let $=O[j];if(!$)continue;for(let J of $){if(J.internal||J.family!=="IPv4")continue;if(J.address.startsWith("172."))continue;S.push(J.address)}}return S}function xx(){return typeof globalThis.Bun<"u"}function jx(O,S){let j=globalThis.Bun,$=(Y)=>{try{return j.serve({hostname:S.hostname,port:Y,fetch:O.fetch,idleTimeout:0,websocket:sO})}catch(Q){v.error("Failed to start Bun server:",Q);return}},J=S.port===0?$(4096)??$(0):$(S.port);if(!J)throw Error(`Failed to start Bun server on port ${S.port}`);return{url:J.url,port:J.port,hostname:J.hostname,stop:async()=>{J.stop(!0)}}}function f0(O,S){return new Promise((j,$)=>{let J=G0(async(D,B)=>{let M=new URL(D.url||"/",`http://${D.headers.host}`),K=new Headers;for(let[T,V]of Object.entries(D.headers))if(V)if(Array.isArray(V))for(let G of V)K.append(T,G);else K.set(T,V);let u;if(D.method!=="GET"&&D.method!=="HEAD")u=(await new Promise((V)=>{let G=[];D.on("data",(U)=>G.push(U)),D.on("end",()=>V(Buffer.concat(G)))})).toString();let N=new Request(M.toString(),{method:D.method,headers:K,body:u});try{let T=await O.fetch(N);if(B.statusCode=T.status,T.headers.forEach((V,G)=>{B.setHeader(G,V)}),T.body){let V=T.body.getReader(),G=async()=>{let{done:U,value:_}=await V.read();if(U){B.end();return}return B.write(_),G()};await G()}else{let V=await T.text();B.end(V)}}catch(T){v.error("[Server] Node request error:",T),B.statusCode=500,B.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),Y=new y0({noServer:!0}),Q=k();Ox(Y,()=>Q),J.on("upgrade",(D,B,M)=>{if(new URL(D.url||"/",`http://${D.headers.host}`).pathname==="/terminal/ws")Y.handleUpgrade(D,B,M,(u)=>{Y.emit("connection",u,D)});else B.destroy()});let y=(D)=>{return new Promise((B,M)=>{J.once("error",(K)=>{if(K.code==="EADDRINUSE")M(K);else M(K)}),J.listen(D,S.hostname,()=>{let K=J.address();if(K&&typeof K==="object")B(K.port);else B(D)})})};(async()=>{let D;if(S.port===0)try{D=await y(4096)}catch{D=await y(0)}else D=await y(S.port);let B=new URL(`http://${S.hostname==="0.0.0.0"?"localhost":S.hostname}:${D}`);j({url:B,port:D,hostname:S.hostname,stop:async()=>{return new Promise((M)=>{Y.close(()=>{J.close(()=>M())})})}})})().catch($)})}var Nx;((Jj)=>{let O,S;function j(){if(!S)S=p0();return S}Jj.getApp=j;function $(Q){OS=Q.cors??[];let y=j();if(xx())O=jx(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let Z=O;return pO?.().catch((D)=>{v.warn("[Server] Failed to recover queued tasks:",D)}),{url:Z.url,port:Z.port,hostname:Z.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,S=void 0,pO=void 0,v.info("[Server] Blade server stopped")}}}Jj.listen=$;async function J(Q){OS=Q.cors??[];let y=j();if(xx())O=jx(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else O=await f0(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Node.js runtime)`);let Z=O;try{await pO?.()}catch(D){v.warn("[Server] Failed to recover queued tasks:",D)}return{url:Z.url,port:Z.port,hostname:Z.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,S=void 0,pO=void 0,v.info("[Server] Blade server stopped")}}}Jj.listenAsync=J;function Y(){return O!==void 0}Jj.isRunning=Y})(Nx||={});export{B0 as a,H0 as b,b0 as c,Nx as d};
|
package/dist/chunk-sva5bdgz.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var e={name:"blade-code",version:"0.8.3",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=22.19.0"},optionalDependencies:{"@vscode/ripgrep":"^1.17.0","bun-pty":"^0.4.8","node-pty":"1.0.0"},dependencies:{"@agentclientprotocol/sdk":"^0.12.0","@anthropic-ai/sandbox-runtime":"0.0.67","@earendil-works/pi-ai":"0.83.0","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.17.4",ahooks:"^3.9.6","ansi-escapes":"^7.2.0","async-mutex":"^0.5.0",axios:"^1.12.2",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.1.0","gray-matter":"^4.0.3",hono:"^4.7.10",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.17.21",lowlight:"^3.3.0","lru-cache":"^11.2.4",nanoid:"^5.1.6",open:"^10.1.2",openai:"^6.2.0",picomatch:"^4.0.3",react:"^19.1.1","react-dom":"^19.1.1",semver:"^7.7.3","string-width":"^8.1.0",undici:"^7.16.0","write-file-atomic":"^7.0.0",ws:"^8.18.0",yaml:"^2.8.1",yargs:"^18.0.0",typebox:"1.3.7",zustand:"^5.0.9"},devDependencies:{"@biomejs/biome":"^2.2.4","@types/bun":"^1.3.4","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.2","@types/react":"^19.1.1","@types/react-dom":"^19.1.1","@types/semver":"^7.7.1","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.5.12","@types/yargs":"^17.0.33","@vitest/coverage-v8":"^3.0.0",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^3.0.0"}};function r(){return{name:e.name,version:e.version,description:e.description}}function n(){return e.version}function o(){return e.name}function c(){return e.description}function d(){return`v${e.version}`}function a(){return`v${e.version} © 2025 Blade Code`}
|
|
2
|
-
export{r as Ta,n as Ua,o as Va,c as Wa,d as Xa,a as Ya};
|
package/dist/chunk-t9cqscfq.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ea as W}from"./chunk-ar5564sf.js";import{Gb as F,Ib as k,Lb as H}from"./chunk-1m63zddw.js";import{Tb as V}from"./chunk-kjc2aqww.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 z};
|
package/dist/chunk-tzr992v4.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ra as a,Sa as b}from"./chunk-hqtskyc1.js";import"./chunk-zsyff0ky.js";import"./chunk-be7qz4cv.js";export{a as resolveModelConfig,b as getModelDisplayName};
|
package/dist/chunk-x8xfx9nv.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as a,h as b,i as c,j as d,k as e}from"./chunk-wcf80p9y.js";import"./chunk-be7qz4cv.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
|
package/dist/chunk-yewg510f.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import{Oa as Y0,Qa as x}from"./chunk-jc7k8pfn.js";import{Mb as Q0}from"./chunk-7bqkkjxf.js";import{nc as l}from"./chunk-zsyff0ky.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 ka,i as la,j as ma,g0 as na,c0 as oa,i0 as pa,l0 as qa,o0 as ra,n0 as sa,a0 as ta,C0 as ua,z as va,K1 as wa,W1 as xa,O1 as ya,B as za,q1 as Aa,w1 as Ba,x1 as Ca,P1 as Da,v1 as Ea,D1 as Fa,B1 as Ga};
|
package/dist/chunk-zj3q4btp.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{$ as d,M as m,X as g,Y as c,ba as f}from"./chunk-kf43f8sy.js";import{Sb as u}from"./chunk-kjc2aqww.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
|
-
|
|
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
|
-
export{R as q,x as r,P as s,y as t};
|
package/dist/chunk-zjks0ncc.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{z as A}from"./chunk-t9cqscfq.js";import{va as C}from"./chunk-yewg510f.js";import{Ha as f,Ia as T,Ja as M,Ka as w,La as N,Oa as k,Pa as b}from"./chunk-jc7k8pfn.js";import{Gb as S,Ib as n,Lb as m}from"./chunk-1m63zddw.js";import{Ob as O,Rb as c,Tb as y}from"./chunk-kjc2aqww.js";import{bc as h}from"./chunk-eyypmc9m.js";import{promises as I}from"node:fs";import R from"node:path";var U=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],x=new Set([...Object.keys(f),...U]),p=n.Number({exclusiveMinimum:0}),l=n.String({minLength:1}),r=n.Array(n.String()),B=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(p),timeout:n.Optional(p),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(p),stream:n.Optional(n.Boolean()),topP:n.Optional(n.Number()),topK:n.Optional(n.Number()),timeout:n.Optional(p),theme:n.Optional(n.String()),uiTheme:n.Optional(m(["light","dark","system"])),language:n.Optional(n.String()),fontSize:n.Optional(p),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(c)),maxTurns:n.Optional(n.Integer({minimum:-1,maximum:y})),maxConcurrentTasks:n.Optional(n.Integer({minimum:T,maximum:M})),maxQueuedTasks:n.Optional(n.Integer({minimum:w,maximum:N})),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(m(["text","json","stream-json","jsonl"])),inputFormat:n.Optional(m(["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(r),ask:n.Optional(r),deny:n.Optional(r)})),env:n.Optional(n.Record(n.String(),n.String())),hooks:n.Optional(n.Record(n.String(),n.Unknown())),disableAllHooks:n.Optional(n.Boolean())}),_=[["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"],["maxConcurrentTasks","maxConcurrentTasks"],["maxQueuedTasks","maxQueuedTasks"]];function u(o,e){let t;try{t=JSON.parse(o)}catch(i){let a=i instanceof Error?`: ${i.message}`:"";throw Error(`Invalid JSON provided to --settings (${e})${a}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let i of Object.keys(t))if(!x.has(i))throw Error(`Unknown --settings field: ${i}`);let s=S(B,t);if(!s.success){let i=s.error.issues.map((a)=>`${a.path.join(".")||"settings"}: ${a.message}`).join("; ");throw Error(`Invalid --settings value: ${i}`)}return s.data}async function P(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=R.resolve(O(),e),s;try{s=await I.readFile(t,"utf8")}catch(i){let a=i instanceof Error?`: ${i.message}`:"";throw Error(`Unable to read --settings file ${t}${a}`)}return u(s,t)}function E(o,e){if(!e)return;let t=e;for(let[s,i]of _){if(s==="permissionMode"&&o.yolo===!0)continue;if(o[i]===void 0&&t[s]!==void 0)o[i]=t[s]}}var d=h("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(", ")}`)}},g=async(o)=>{let e=await P(typeof o.settings==="string"?o.settings:void 0);if(E(o,e),typeof o.agents==="string")A(o.agents);F(o);try{let s=await k.getInstance().initialize(e),i=b(s,o);if(C().config.actions.setConfig(i),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 F(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 w,g as x,v as y};
|
package/dist/chunk-zsyff0ky.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{oc as $}from"./chunk-be7qz4cv.js";import{createModels as w}from"@earendil-works/pi-ai";import{builtinProviders as K}from"@earendil-works/pi-ai/providers/all";import{promises as L}from"node:fs";import X from"node:path";import{Mutex as U}from"async-mutex";import _ from"write-file-atomic";import{execSync as k}from"node:child_process";import*as W from"node:os";import*as G from"node:path";function A(q){return G.resolve(q).replace(/[/\\]/g,"-").replace(/:/g,"_")}function B(q){let z=q.replace(/_/g,":");if(z.startsWith("-"))z="/"+z.slice(1);return z.replace(/-/g,"/")}function O(q){let z=A(q);return G.join(J(),"projects",z)}function D(q){return typeof q==="string"&&q!=="."&&q!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(q)}function Q(q){if(!D(q))throw Error(`Invalid session ID: ${q}`)}function F(q,z){return Q(z),G.join(O(q),`${z}.jsonl`)}function R(q,z){return Q(z),G.join(O(q),`${z}.inbox.json`)}function C(q,z){return Q(z),G.join(O(q),`${z}.goal.json`)}function M(q){try{return k("git rev-parse --abbrev-ref HEAD",{cwd:q,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function J(){return process.env.BLADE_STORAGE_ROOT||G.join(W.homedir(),".blade")}async function V(){let{readdir:q}=await import("node:fs/promises");try{let z=G.join(J(),"projects");return(await q(z,{withFileTypes:!0})).filter((H)=>H.isDirectory()).map((H)=>H.name)}catch{return[]}}class T{filePath;mutex=new U;constructor(q=X.join(J(),"auth.json")){this.filePath=q}async read(q){return(await this.readAll())[q]}async list(){let q=await this.readAll();return Object.entries(q).map(([z,E])=>({providerId:z,type:E.type}))}async modify(q,z){return this.mutex.runExclusive(async()=>{let E=await this.readAll(),H=E[q],N=await z(H);if(N===void 0)return H;return E[q]=N,await this.writeAll(E),N})}async delete(q){await this.mutex.runExclusive(async()=>{let z=await this.readAll();if(!(q in z))return;delete z[q],await this.writeAll(z)})}async readAll(){try{let q=await L.readFile(this.filePath,"utf8"),z=JSON.parse(q);return z&&typeof z==="object"&&!Array.isArray(z)?z:{}}catch(q){if(q.code==="ENOENT")return{};throw q}}async writeAll(q){let z=X.dirname(this.filePath);await L.mkdir(z,{recursive:!0,mode:448}),await L.chmod(z,448),await _(this.filePath,`${JSON.stringify(q,null,2)}
|
|
2
|
-
`,{mode:384}),await L.chmod(this.filePath,384)}}class Z{credentials;models;constructor(q=new T){this.credentials=q,this.models=w({credentials:q});for(let z of K())this.models.setProvider(z)}async listProviders(){return Promise.all(this.models.getProviders().map(async(q)=>{let z=q.getModels();return{id:q.id,name:q.name,modelCount:z.length,defaultBaseUrl:q.baseUrl??z[0]?.baseUrl,supportsApiKey:Boolean(q.auth.apiKey),supportsOAuth:Boolean(q.auth.oauth),configured:Boolean(await this.models.checkAuth(q.id))}}))}listModels(q){return this.models.getModels(q).map((z)=>this.toCatalogEntry(z))}getModel(q,z){let E=this.models.getModel(q,z);if(!E)throw Error(`Unknown pi-ai model: ${q}/${z}`);return E}resolveConfig(q){let z=this.getModel(q.provider,q.model),E=q.overrides;return{...z,...E?.baseUrl?{baseUrl:E.baseUrl}:{},...E?.maxOutputTokens?{maxTokens:E.maxOutputTokens}:{}}}async setApiKey(q,z){this.requireProvider(q),await this.credentials.modify(q,async()=>({type:"api_key",key:z}))}async clearCredential(q){this.requireProvider(q),await this.credentials.delete(q)}async isConfigured(q){return this.requireProvider(q),Boolean(await this.models.checkAuth(q))}requireProvider(q){if(!this.models.getProvider(q))throw Error(`Unknown pi-ai provider: ${q}`)}toCatalogEntry(q){return{id:q.id,name:q.name,provider:q.provider,api:q.api,baseUrl:q.baseUrl,reasoning:q.reasoning,input:[...q.input],contextWindow:q.contextWindow,maxTokens:q.maxTokens,cost:{...q.cost}}}}var Y;function c(){return Y??=new Z,Y}
|
|
3
|
-
export{B as dc,O as ec,D as fc,Q as gc,F as hc,R as ic,C as jc,M as kc,J as lc,V as mc,c as nc};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as L}from"./vendor-react-FPIC4Czm.js";import{S as e,v as p,o as l,b as s,s as h,a as m,d as c,j as a,e as d,f as y,m as g,p as r,h as j,t as x,i as t,y as i}from"./vendor-markdown-b9iCqZWK.js";import"./vendor-monaco-w6PwaWGP.js";e.registerLanguage("bash",s);e.registerLanguage("sh",s);e.registerLanguage("shell",s);e.registerLanguage("shell-session",h);e.registerLanguage("css",m);e.registerLanguage("diff",c);e.registerLanguage("javascript",a);e.registerLanguage("js",a);e.registerLanguage("json",d);e.registerLanguage("jsx",y);e.registerLanguage("markdown",g);e.registerLanguage("md",g);e.registerLanguage("python",r);e.registerLanguage("py",r);e.registerLanguage("scss",j);e.registerLanguage("tsx",x);e.registerLanguage("typescript",t);e.registerLanguage("ts",t);e.registerLanguage("yaml",i);e.registerLanguage("yml",i);function S({code:n,language:u,isDark:o}){return L.jsx(e,{style:o?p:l,language:u,PreTag:"div",wrapLongLines:!0,customStyle:{margin:0,padding:"16px",background:"transparent",fontSize:"13px",lineHeight:"1.5"},children:n})}export{S as CodeBlockHighlighter};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{_ as ye}from"./vendor-markdown-b9iCqZWK.js";import{r as d,j as e}from"./vendor-react-FPIC4Czm.js";import{c as D,u as _e,e as _,s as z,f as Ie,B as qe,g as fe}from"./index-B-BRpW1c.js";import{n as Pe,L as ke,o as ve,p as Ee}from"./vendor-radix-DyP_DOwV.js";import{u as ze}from"./SettingsStore-BfoB9tNV.js";import{X as We,b as ue,d as xe,a as je,I as Ge,J as Oe}from"./vendor-icons-DBM55KTG.js";import"./vendor-monaco-w6PwaWGP.js";const Je=Pe,we=d.forwardRef(({className:t,...n},a)=>e.jsx(ke,{ref:a,className:D("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...n}));we.displayName=ke.displayName;const W=d.forwardRef(({className:t,...n},a)=>e.jsx(ve,{ref:a,className:D("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),...n}));W.displayName=ve.displayName;const G=d.forwardRef(({className:t,...n},a)=>e.jsx(Ee,{ref:a,className:D("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...n}));G.displayName=Ee.displayName;const Ve={"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 He(t){const n=t.replace("#",""),a=parseInt(n.substring(0,2),16),s=parseInt(n.substring(2,4),16),o=parseInt(n.substring(4,6),16);return(.299*a+.587*s+.114*o)/255<.5}function Ke(t){return{base:He(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 me=new Set;function pe(t,n){const a=n.toLowerCase().replace(/\s+/g,"-"),s=Ve[a];if(!s)return"vs-dark";if(!me.has(a)){const o=Ke(s);t.editor.defineTheme(a,o),me.add(a)}return a}d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).DiffEditor}));const Ue=d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).Editor}));function te(t,n){return t instanceof Error?t.message:n}function dt(){const{toggleFilePreview:t}=_e(),{messages:n,currentSessionRef:a,sessions:s}=_(),[o,f]=d.useState("diff"),[c,i]=d.useState([]),[p,b]=d.useState({}),[x,y]=d.useState(!1),[m,R]=d.useState(null),[w,N]=d.useState({}),[O,J]=d.useState({}),[E,ae]=d.useState(null),[Fe,V]=d.useState(""),[H,K]=d.useState(!1),[U,X]=d.useState(null),[re,M]=d.useState(!1),ne=d.useRef(a),T=d.useRef(0),I=d.useRef(0),q=d.useRef({}),Q=d.useRef(0),F=d.useRef(0),A=d.useRef({}),C=d.useRef({}),Y=d.useRef(null);d.useLayoutEffect(()=>{z(ne.current,a)||(T.current+=1),ne.current=a},[a]);const Z=(r,l)=>l===T.current&&z(_.getState().currentSessionRef,r),se=async(r,l="")=>{const g=l?`/suggestions/files/tree?path=${encodeURIComponent(l)}`:"/suggestions/files/tree",u=await fetch(g,{headers:fe(r)});if(!u.ok)throw new Error("Failed to load tree");return(await u.json()).map(h=>({...h,children:h.type==="dir"?[]:void 0}))};d.useEffect(()=>{const r=++I.current;return(async()=>{if(!a){i([]),y(!1),R(null);return}const g={...a},u=T.current,k=()=>r===I.current&&Z(g,u);if(k()){i([]),y(!0),R(null);try{const h=await se(g);k()&&i(h)}catch(h){k()&&R(te(h,"Failed to load tree"))}finally{k()&&y(!1)}}})(),()=>{I.current===r&&(I.current+=1)}},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]),d.useEffect(()=>{Y.current=null,A.current={},C.current={},q.current={},Q.current+=1,ae(null),V(""),K(!1),X(null),M(!1),N({}),b({})},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]);const v=d.useMemo(()=>s.find(r=>z({sessionId:r.sessionId,projectPath:r.projectPath},a)),[a,s]),Ce=d.useMemo(()=>Qe(n),[n]),[Se,oe]=d.useState(null),[Be,ee]=d.useState(!1),[ie,de]=d.useState(null),S=Se??Ce,ce=d.useMemo(()=>Me(n),[n]),[Le,De]=d.useState({});d.useEffect(()=>{const r=++F.current;if(oe(null),de(null),ee(!1),!a||(v==null?void 0:v.taskIsolation)!=="worktree"||!v.taskDiffStat||v.taskDiffStat.changedFiles===0)return;const l={...a};return ee(!0),Ie.getTaskDiff(l).then(g=>{r!==F.current||!z(_.getState().currentSessionRef,l)||oe(g.files.map(u=>({filePath:u.path,diff:{patch:u.patch},summary:u.binary?"binary":`+${u.additions} -${u.deletions}${u.truncated?" (truncated)":""}`})))}).catch(g=>{r===F.current&&de(te(g,"Failed to load task diff"))}).finally(()=>{r===F.current&&ee(!1)}),()=>{F.current===r&&(F.current+=1)}},[v==null?void 0:v.taskCompletedAt,v==null?void 0:v.taskDiffStat,v==null?void 0:v.taskIsolation,a]);const Re=r=>{De(l=>({...l,[r]:!l[r]}))},Te=async r=>{const l=_.getState().currentSessionRef;if(!l)return;const g=T.current,u=++Q.current,k=()=>u===Q.current&&Y.current===r&&Z(l,g);Y.current=r,ae(r),V(""),K(!0),X(null),M(!1);try{const h=await fetch(`/suggestions/files/content?path=${encodeURIComponent(r)}`,{headers:fe(l)});if(!h.ok)throw new Error("Failed to load file");const $=await h.json();k()&&(V($.content||""),M(!!$.truncated))}catch(h){k()&&X(te(h,"Failed to load file"))}finally{k()&&K(!1)}},Ae=async r=>{const l=(q.current[r]??0)+1;q.current[r]=l;const g=!A.current[r],u={...A.current,[r]:g};if(A.current=u,N(u),!g||C.current[r])return;const k=_.getState().currentSessionRef;if(!k)return;const h=T.current,$=()=>q.current[r]===l&&A.current[r]===!0&&Z(k,h);try{const P=await se(k,r);if($()){const le={...C.current,[r]:P};C.current=le,b(le)}}catch{if($()){const P={...C.current,[r]:[]};C.current=P,b(P)}}},$e=r=>{J(l=>({...l,[r]:!l[r]}))};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(qe,{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(We,{className:"w-4 h-4"})})]}),e.jsxs(Je,{value:o,onValueChange:r=>f(r),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(we,{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(W,{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(W,{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(W,{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(G,{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:Be&&S.length===0?e.jsx(j,{title:"Loading task diff…",subtitle:"Reading the durable worktree artifact."}):ie&&S.length===0?e.jsx(j,{title:"Failed to load task diff",subtitle:ie}):S.length===0?e.jsx(j,{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:[S.length," changed file",S.length>1?"s":""]}),S.map(r=>{var u;const l=((u=r.filePath)==null?void 0:u.split("/").pop())||"unknown",g=Le[r.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>Re(r.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(ue,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(xe,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(je,{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:l}),r.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:r.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:r.filePath}),e.jsx(et,{diff:r.diff})]})]},r.filePath)})]})})}),e.jsx(G,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(j,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&m&&e.jsx(j,{title:"Failed to load files",subtitle:m}),!x&&!m&&c.length===0&&e.jsx(j,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!m&&c.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:c.map(r=>e.jsx(Ne,{node:r,depth:0,expandedDirs:w,childrenCache:p,toggleDir:Ae,selectedPath:E,onSelectFile:Te},r.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:E||"Select a file to preview"}),E&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:H?"Loading…":re?"Truncated":"Ready"})]}),re&&!H&&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:[!E&&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."}),E&&U&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:U}),E&&!U&&e.jsx("div",{className:"h-full",children:H?e.jsx(he,{}):e.jsx(d.Suspense,{fallback:e.jsx(he,{}),children:e.jsx(Ye,{content:Fe,filename:E})})})]})]})]})]})}),e.jsx(G,{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:ce.length===0?e.jsx(j,{title:"No logs yet",subtitle:"Tool runs will appear here."}):ce.map(r=>{var h;const l=O[r.id],g=(r.content||"").split(`
|
|
2
|
-
`),u=g.length>10||(((h=r.content)==null?void 0:h.length)||0)>800,k=l||!u?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:r.title}),r.subtitle&&e.jsx("div",{className:"text-[11px] text-[#6B7280] dark:text-[#71717a] font-mono",children:r.subtitle})]}),e.jsx(Xe,{status:r.status})]}),r.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
|
-
`),!l&&u&&`
|
|
4
|
-
…`]}),u&&e.jsxs("button",{onClick:()=>$e(r.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:[l?e.jsx(ue,{className:"w-3 h-3"}):e.jsx(xe,{className:"w-3 h-3"}),l?"Collapse":"Expand"]})]})]},r.id)})})})]})]})}function j({title:t,subtitle:n}){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:n})]})}function Xe({status:t}){const n=t==="success"?"Success":t==="error"?"Failed":"Running",a=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:D("text-[11px] px-2 py-0.5 rounded-full font-mono",a),children:n})}function Ne({node:t,depth:n,expandedDirs:a,childrenCache:s,toggleDir:o,onSelectFile:f,selectedPath:c}){const i=t.type==="dir",p=a[t.path],b=!i&&c===t.path,x=s[t.path]||[];return e.jsxs("div",{children:[e.jsx("button",{onClick:()=>{i?o(t.path):f(t.path)},className:D("flex items-center gap-2 w-full text-left text-[12px] font-mono px-2 py-1 rounded-md transition-colors",b?"bg-[#16A34A]/10 text-[#111827] dark:bg-[#22C55E]/10 dark:text-[#E5E5E5]":"hover:bg-[#F3F4F6] text-[#6B7280] dark:hover:bg-[#111113] dark:text-[#a1a1aa]",i&&"cursor-pointer",b&&"border border-[#16A34A]/30 dark:border-[#22C55E]/30"),style:{paddingLeft:n*14+8},children:i?e.jsxs(e.Fragment,{children:[p?e.jsx(Ge,{className:"h-3.5 w-3.5 shrink-0 text-[#111827] dark:text-[#E5E5E5]"}):e.jsx(Oe,{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(je,{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})]})}),i&&p&&e.jsx("div",{children:x.map(y=>e.jsx(Ne,{node:y,depth:n+1,expandedDirs:a,childrenCache:s,toggleDir:o,onSelectFile:f,selectedPath:c},y.path))})]})}function Me(t){return t.flatMap(n=>{var o,f,c;const a=[];if((o=n.agentContent)!=null&&o.toolCalls)for(const i of n.agentContent.toolCalls){const p=ge(i.arguments),b=i.output,x=b?(f=L(b))!=null&&f.diff?be(b):b:void 0;a.push({id:`${n.id}-${i.toolCallId}`,title:i.toolName||"Tool",subtitle:i.summary,status:i.status==="success"?"success":i.status==="error"?"error":"running",content:x||(p?`Arguments:
|
|
5
|
-
${p}`:void 0),timestamp:n.timestamp})}const s=n.metadata;if(s){if(s.kind==="tool_call"){const i=s.toolName||"Tool",p=ge(s.arguments);a.push({id:n.id,title:`Tool Call · ${i}`,subtitle:s.toolKind?String(s.toolKind):void 0,status:s.status==="success"?"success":s.status==="error"?"error":"running",content:p?`Arguments:
|
|
6
|
-
${p}`:void 0,timestamp:n.timestamp})}if(s.kind==="tool_result"){const i=s.toolName||"Tool",p=s.success,b=s.summary,x=s.output,y=x?(c=L(x))!=null&&c.diff?be(x):x:void 0;a.push({id:n.id,title:`Tool Result · ${i}`,subtitle:b,status:p===void 0?"running":p?"success":"error",content:y,timestamp:n.timestamp})}}return a})}function Qe(t){var s;const n=[],a=new Set;for(let o=t.length-1;o>=0;o-=1){const f=t[o];if((s=f.agentContent)!=null&&s.toolCalls)for(let x=f.agentContent.toolCalls.length-1;x>=0;x-=1){const y=f.agentContent.toolCalls[x],m=y.metadata,R=y.output||"",w=L(R)||L((m==null?void 0:m.diff_snippet)||"");if(w!=null&&w.diff){const N=(m==null?void 0:m.file_path)||y.toolName||"unknown";if(!a.has(N)){a.add(N);const O=typeof(m==null?void 0:m.oldContent)=="string"?m.oldContent:void 0,J=typeof(m==null?void 0:m.newContent)=="string"?m.newContent:void 0;n.push({diff:w.diff,filePath:N,summary:y.summary,oldContent:O,newContent:J})}}}const c=f.metadata;if(!c||c.kind!=="tool_result")continue;const i=c.metadata,p=c.output||(typeof f.content=="string"?f.content:"")||"",b=L(p)||L((i==null?void 0:i.diff_snippet)||"");if(b!=null&&b.diff){const x=(i==null?void 0:i.file_path)||c.toolName||"unknown";if(!a.has(x)){a.add(x);const y=typeof(i==null?void 0:i.oldContent)=="string"?i.oldContent:void 0,m=typeof(i==null?void 0:i.newContent)=="string"?i.newContent:void 0;n.push({diff:b.diff,filePath:x,summary:c.summary,oldContent:y,newContent:m})}}}return n.reverse()}function L(t){if(!t)return null;const n=/<<<DIFF>>>\s*([\s\S]*?)\s*<<<\/DIFF>>>/m,a=t.match(n);if(!a)return null;try{return{diff:JSON.parse(a[1])}}catch{return null}}function be(t){return t?t.replace(/<<<DIFF>>>[\s\S]*?<<<\/DIFF>>>/m,"").trim():""}function ge(t){if(!t)return"";if(typeof t=="string")try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}return JSON.stringify(t,null,2)}function he(){return e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Loading editor…"})}function Ye({content:t,filename:n}){const{theme:a}=ze(),s=d.useRef(null),[o,f]=d.useState("vs-dark"),c=Ze(n),i=p=>{s.current=p;const b=pe(p,a);f(b)};return d.useEffect(()=>{if(s.current){const p=pe(s.current,a);f(p)}},[a]),e.jsx(Ue,{value:t,language:c,theme:o,height:"100%",beforeMount:i,options:{readOnly:!0,minimap:{enabled:!1},fontSize:12,lineNumbers:"on",wordWrap:"on",scrollBeyondLastLine:!1,automaticLayout:!0}},n)}function Ze(t){var s;const n=((s=t.split(".").pop())==null?void 0:s.toLowerCase())||"";return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",md:"markdown",css:"css",scss:"scss",html:"html",yml:"yaml",yaml:"yaml",go:"go",rs:"rust",py:"python",java:"java",c:"c",cpp:"cpp",h:"cpp",hpp:"cpp",sh:"shell",zsh:"shell",toml:"toml",xml:"xml"}[n]||"plaintext"}function et({diff:t}){const n=t.patch.split(`
|
|
7
|
-
`);let a=0,s=0;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-md overflow-hidden bg-white dark:bg-[#111113]",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#111113] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:[e.jsx("span",{children:"Patch"}),t.matchLine&&e.jsxs("span",{children:["Line ",t.matchLine]})]}),e.jsx("div",{className:"text-[12px] font-mono",children:n.map((o,f)=>{if(o.startsWith("@@")){const c=/@@ -(?<old>\d+),?(?<oldCount>\d*) \+(?<new>\d+),?(?<newCount>\d*) @@/.exec(o);return c!=null&&c.groups&&(a=parseInt(c.groups.old,10),s=parseInt(c.groups.new,10)),e.jsx(B,{line:o},`${o}-${f}`)}if(o.startsWith("---")||o.startsWith("+++")||o.startsWith("Index:")||o.startsWith("==="))return e.jsx(B,{line:o},`${o}-${f}`);if(o.startsWith("+")){const c=s;return s+=1,e.jsx(B,{line:o,oldLine:null,newLine:c},`${o}-${f}`)}if(o.startsWith("-")){const c=a;return a+=1,e.jsx(B,{line:o,oldLine:c,newLine:null},`${o}-${f}`)}if(o.startsWith(" ")){const c=a,i=s;return a+=1,s+=1,e.jsx(B,{line:o,oldLine:c,newLine:i},`${o}-${f}`)}return e.jsx(B,{line:o},`${o}-${f}`)})})]})}function B({line:t,oldLine:n,newLine:a}){const s=t.startsWith("---")||t.startsWith("+++")||t.startsWith("Index:")||t.startsWith("==="),o=t.startsWith("@@"),f=t[0],c=s||o?t:t.slice(1),i=s?"text-[#6B7280] dark:text-[#a1a1aa]":f==="+"?"text-[#166534] bg-[#22C55E]/10 dark:text-[#86efac] dark:bg-[#22C55E]/10":f==="-"?"text-[#b91c1c] bg-[#EF4444]/10 dark:text-[#fca5a5] dark:bg-[#EF4444]/10":o?"text-[#1d4ed8] bg-[#DBEAFE] dark:text-[#93c5fd] dark:bg-[#1e3a8a]/30":"text-[#374151] dark:text-[#d4d4d8]";return e.jsxs("div",{className:D("grid grid-cols-[40px_40px_1fr] gap-2 px-3 py-0.5",i),children:[e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:n?String(n).padStart(2," "):""}),e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:a?String(a).padStart(2," "):""}),e.jsx("span",{className:"whitespace-pre",children:c})]})}export{dt as FilePreview};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{M as p,r as h,_ as j}from"./vendor-markdown-b9iCqZWK.js";import{r as o,j as r}from"./vendor-react-FPIC4Czm.js";import{c as b}from"./index-B-BRpW1c.js";import{a as f}from"./SettingsStore-BfoB9tNV.js";import{k as g,Q as N}from"./vendor-icons-DBM55KTG.js";import"./vendor-monaco-w6PwaWGP.js";import"./vendor-radix-DyP_DOwV.js";const v=[h],y=o.lazy(()=>j(()=>import("./CodeBlockHighlighter-D8_cOYpG.js"),[]).then(t=>({default:t.CodeBlockHighlighter}))),R=o.memo(function({content:s,className:a,syntaxHighlight:d=!0}){const i=f(),E=o.useMemo(()=>({code({className:e,children:n,...x}){const c=/language-(\w+)/.exec(e||""),k=!c,m=c?c[1]:"",l=String(n).replace(/\n$/,"");return k?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),...x,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:x}),children:r.jsx(y,{code:l,language:m,isDark:i})})]}):r.jsx(u,{className:e,code:l,props:x})},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(p,{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{R as MarkdownRenderer};
|