blade-code 0.8.2 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/{chunk-0z5qe4m2.js → chunk-1m63zddw.js} +1 -1
- package/dist/chunk-23h9grdr.js +1 -0
- package/dist/{chunk-6jq8h5s9.js → chunk-2c69g6t9.js} +2 -2
- package/dist/{chunk-p4yrmzyr.js → chunk-5sccs44n.js} +1 -1
- package/dist/{chunk-5ad4qmfj.js → chunk-5yt80bn2.js} +1 -1
- package/dist/chunk-6msfa7jh.js +9 -0
- package/dist/{chunk-yfcfx0zk.js → chunk-6spmzx13.js} +1 -1
- package/dist/chunk-724djh7r.js +1 -0
- package/dist/{chunk-81p4kz0b.js → chunk-7bqkkjxf.js} +1 -1
- package/dist/chunk-804j7say.js +1 -0
- package/dist/chunk-8yk5w2ks.js +1 -0
- package/dist/chunk-97qxd4yb.js +2 -0
- package/dist/{chunk-qwfqp465.js → chunk-9cr3jexy.js} +1 -1
- package/dist/{chunk-kne7h7p5.js → chunk-ar5564sf.js} +1 -1
- package/dist/{chunk-f3pvwxp8.js → chunk-b922cq7k.js} +3 -3
- package/dist/{chunk-w4xcmzjm.js → chunk-be7qz4cv.js} +1 -1
- package/dist/chunk-bqhghfmt.js +6 -0
- package/dist/{chunk-s1y8w68s.js → chunk-crbh6x86.js} +1 -1
- package/dist/{chunk-5fw9k1ff.js → chunk-d7nrqg5b.js} +2 -2
- package/dist/{chunk-9xvnrq7m.js → chunk-eyypmc9m.js} +2 -2
- package/dist/{chunk-j77gyhpf.js → chunk-fma9cbq5.js} +1 -1
- package/dist/chunk-ghf5tgjr.js +1 -0
- package/dist/{chunk-11s7t9dp.js → chunk-hqtskyc1.js} +2 -2
- package/dist/chunk-jc7k8pfn.js +22 -0
- package/dist/{chunk-eycs00af.js → chunk-kf43f8sy.js} +218 -218
- package/dist/{chunk-rxjt7ma7.js → chunk-kjc2aqww.js} +1 -1
- package/dist/chunk-kjddt9xy.js +1 -0
- package/dist/{chunk-6avkjdjc.js → chunk-m0ded6ky.js} +27 -27
- package/dist/{chunk-fpdqvnmq.js → chunk-mqqajem9.js} +2 -2
- package/dist/{chunk-a90mfxv9.js → chunk-msr67f6q.js} +1 -1
- package/dist/{chunk-y08szyf9.js → chunk-mvww9cmc.js} +20 -20
- package/dist/{chunk-fkaebj8c.js → chunk-nbpjzzrg.js} +1 -1
- package/dist/chunk-ncvr73ev.js +1 -0
- package/dist/{chunk-9b297mzh.js → chunk-qvtahmff.js} +1 -1
- package/dist/chunk-qwn46cd6.js +2 -0
- package/dist/{chunk-887qxhn5.js → chunk-sva5bdgz.js} +2 -2
- package/dist/{chunk-4fye39a8.js → chunk-t9cqscfq.js} +1 -1
- package/dist/chunk-tzr992v4.js +1 -0
- package/dist/{chunk-1x3846v7.js → chunk-vxpdjtqc.js} +1 -1
- package/dist/{chunk-6x6zqjcs.js → chunk-wcf80p9y.js} +1 -1
- package/dist/chunk-x8xfx9nv.js +1 -0
- package/dist/{chunk-8fp3q919.js → chunk-yewg510f.js} +2 -2
- package/dist/{chunk-w11ht6f9.js → chunk-zj3q4btp.js} +1 -1
- package/dist/chunk-zjks0ncc.js +6 -0
- package/dist/{chunk-0g9cb41d.js → chunk-zsyff0ky.js} +2 -2
- package/dist/web/assets/{FilePreview-60E51igH.js → FilePreview-B5g8yi8d.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DU7jPn9K.js → MarkdownRenderer-qBCxzEb_.js} +1 -1
- package/dist/web/assets/{McpModal-CAMU6yrS.js → McpModal-C7y2Fsqc.js} +1 -1
- package/dist/web/assets/{SettingsModal-Cjj8NUQy.js → SettingsModal-Dmc7Dw_E.js} +1 -1
- package/dist/web/assets/{SettingsStore-CjvkbtuZ.js → SettingsStore-BfoB9tNV.js} +1 -1
- package/dist/web/assets/{SkillsModal-Cyc2JAFj.js → SkillsModal-CqFAIfj5.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DI-Ls-U8.js → TerminalPanel-EHh8-9b9.js} +1 -1
- package/dist/web/assets/index-B-BRpW1c.js +16 -0
- package/dist/web/assets/index-Ch0eqSLM.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-1evg2hdd.js +0 -2
- package/dist/chunk-3wghk9bp.js +0 -1
- package/dist/chunk-510rwhx6.js +0 -1
- package/dist/chunk-83dkggbx.js +0 -1
- package/dist/chunk-8epvwyg8.js +0 -6
- package/dist/chunk-9jkbykwq.js +0 -1
- package/dist/chunk-a83s9mww.js +0 -1
- package/dist/chunk-btst30by.js +0 -6
- package/dist/chunk-e9t5ga1b.js +0 -1
- package/dist/chunk-gvf4gff0.js +0 -9
- package/dist/chunk-j14rn2dx.js +0 -22
- package/dist/chunk-kcjgbbec.js +0 -1
- package/dist/chunk-q223bq79.js +0 -1
- package/dist/chunk-x83a97eh.js +0 -1
- package/dist/chunk-zns65xsy.js +0 -2
- package/dist/web/assets/index-BC0ssrep.js +0 -16
- package/dist/web/assets/index-Ci6gCUjf.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
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
2
|
blade mcp
|
|
3
3
|
`),console.log(`管理 MCP 服务器
|
|
4
4
|
`),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as o}from"./chunk-
|
|
1
|
+
import{g as o}from"./chunk-wcf80p9y.js";import"./chunk-be7qz4cv.js";import{execSync as r}from"child_process";var l={command:"update",describe:"Check for updates and install if available",handler:async()=>{console.log("Checking for updates...");try{let e=await o(!0);if(console.log(`Current version: ${e.currentVersion}`),e.error){console.log(`Warning: ${e.error}`);return}if(e.latestVersion)console.log(`Latest version: ${e.latestVersion}`);if(e.hasUpdate&&e.latestVersion){console.log(""),console.log(`\x1B[33mUpdate available: ${e.currentVersion} -> ${e.latestVersion}\x1B[0m`),console.log(""),console.log("Updating...");try{r("npm install -g blade-code@latest --registry https://registry.npmjs.org",{stdio:"inherit"}),console.log(""),console.log("Update complete!")}catch(t){console.error("Error: Update failed. Please run manually:"),console.error(" npm install -g blade-code@latest"),process.exit(1)}}else console.log("You are running the latest version of Blade")}catch(e){console.error(`Error: Failed to check for updates: ${e instanceof Error?e.message:"未知错误"}`),process.exit(1)}}};export{l as updateCommands};
|
|
@@ -0,0 +1,2 @@
|
|
|
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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e={name:"blade-code",version:"0.8.
|
|
2
|
-
export{r as
|
|
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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
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
2
|
export{O as z};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{nc as o}from"./chunk-zsyff0ky.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
|
|
2
2
|
export{e,i as f};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{oc as y}from"./chunk-be7qz4cv.js";import*as j from"fs/promises";import*as $ from"path";import b from"semver";import{fileURLToPath as N}from"url";import{ProxyAgent as G,fetch as H}from"undici";function T(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function R(){let q=T();if(q)try{return new G(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function K(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=R(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),w=()=>X.abort();Q?.addEventListener("abort",w);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await H(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",w)}}var D="blade-code",f="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",M=$.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),S=$.join(M,"version-cache.json"),k=3600000,L=`https://registry.npmjs.org/${D}/latest`;async function x(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let q=N(import.meta.url),z=$.dirname(q),W=[$.join(z,"..","..","package.json"),$.join(z,"..","package.json")];for(let Q of W)try{let B=await j.readFile(Q,"utf-8"),J=JSON.parse(B);if(J.name===D&&J.version)return J.version}catch{}return"unknown"}catch{return"unknown"}}async function I(){try{let q=await j.readFile(S,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<k)return z;return{...z,checkedAt:0}}catch{return null}}async function O(q){try{await j.mkdir(M,{recursive:!0,mode:493}),await j.writeFile(S,JSON.stringify(q,null,2))}catch{}}async function P(){try{let q=await K(L,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function v(q=!1){let z=await x(),W=f;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await I(),B=Q?.skipUntilVersion,J=null;if(!q&&Q&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await P(),J)await O({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});if(!J)return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};let X=b.gt(J,z),Y=X;if(X&&B)Y=b.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await I();await O({latestVersion:z?.latestVersion||q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${D}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function d(){try{let q=await v();return q.shouldPrompt?q:null}catch{return null}}
|
|
2
2
|
export{v as g,u as h,g as i,C as j,d as k};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Ga as Y0,Ia as x}from"./chunk-j14rn2dx.js";import{Eb as Q0}from"./chunk-81p4kz0b.js";import{fc as l}from"./chunk-0g9cb41d.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(`
|
|
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
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
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
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(`
|
|
@@ -21,4 +21,4 @@ import{Ga as Y0,Ia as x}from"./chunk-j14rn2dx.js";import{Eb as Q0}from"./chunk-8
|
|
|
21
21
|
`+`1. 配置文件格式正确 (~/.blade/config.json)
|
|
22
22
|
`+`2. 运行 blade 进行首次配置
|
|
23
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
|
|
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};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$ as
|
|
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
2
|
|
|
3
3
|
${a}`}}return{mode:"output",content:e.content||e.message||"",exitCode:0}}function r(t){if(!(t instanceof Error))return!1;return t.message.includes("未找到会话")||t.message.includes("ENOENT")||t.message.includes("no such file")}async function i(t){try{return await m.loadSession(t,u())}catch(e){if(r(e))return null;throw e}}async function y(t){if(t.resume===!0||t.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof t.resume==="string"&&t.resume.length>0){if(t.forkSession){let e=u();return m.forkSession(t.resume,{newSessionId:t.sessionId,sourceProjectPath:e,targetProjectPath:e})}return{sessionId:t.resume,messages:await m.loadSession(t.resume)}}if(t.continue){let e=t.forkSession?await m.listSessions({cwd:u()}):await m.listSessions();if(e.length>0){let n=e[0].sessionId;if(t.forkSession){let a=u();return m.forkSession(n,{newSessionId:t.sessionId,sourceProjectPath:a,targetProjectPath:a})}return{sessionId:n,messages:await m.loadSession(n)}}if(t.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(t.sessionId)return{sessionId:t.sessionId,messages:await i(t.sessionId)??[]};return{sessionId:`${t.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
|
|
4
4
|
export{R as q,x as r,P as s,y as t};
|
|
@@ -0,0 +1,6 @@
|
|
|
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};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
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
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
|
|
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};
|