blade-code 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/chunk-0abtfzm6.js +1 -0
- package/dist/chunk-0zkhjsbv.js +1 -0
- package/dist/{chunk-6msfa7jh.js → chunk-119fhp5q.js} +1 -1
- package/dist/{chunk-fma9cbq5.js → chunk-1rpgvk3r.js} +1 -1
- package/dist/{chunk-7bqkkjxf.js → chunk-1v2n922p.js} +1 -1
- package/dist/{chunk-eyypmc9m.js → chunk-2fbwmdvg.js} +2 -2
- package/dist/chunk-3qgj2y5r.js +1 -0
- package/dist/{chunk-sva5bdgz.js → chunk-45bme7n9.js} +2 -2
- package/dist/{chunk-zj3q4btp.js → chunk-5jq01mg6.js} +2 -2
- package/dist/{chunk-5sccs44n.js → chunk-5nye3k5w.js} +1 -1
- package/dist/chunk-7pevqbfd.js +2 -0
- package/dist/chunk-8dqvnx7n.js +2 -0
- package/dist/chunk-8edsvxf3.js +1 -0
- package/dist/{chunk-hqtskyc1.js → chunk-8vemqfe4.js} +2 -2
- package/dist/{chunk-d7nrqg5b.js → chunk-8vtznxpq.js} +2 -2
- package/dist/chunk-936ft6kq.js +2 -0
- package/dist/{chunk-jc7k8pfn.js → chunk-9ax02vtg.js} +2 -2
- package/dist/chunk-9qknesxs.js +6 -0
- package/dist/chunk-acegy4td.js +3 -0
- package/dist/chunk-aewrn5xp.js +1 -0
- package/dist/{chunk-mqqajem9.js → chunk-aq7wf2zt.js} +2 -2
- package/dist/{chunk-5yt80bn2.js → chunk-ax7bx0j8.js} +1 -1
- package/dist/chunk-b10vr4xj.js +2 -0
- package/dist/{chunk-vxpdjtqc.js → chunk-bc6wbcrs.js} +1 -1
- package/dist/chunk-bfgm5k3e.js +1566 -0
- package/dist/chunk-cf3fhs7j.js +1 -0
- package/dist/chunk-d7y2mf7c.js +4 -0
- package/dist/chunk-e1586s4t.js +1 -0
- package/dist/chunk-enk621t7.js +98 -0
- package/dist/chunk-fpr6d8zc.js +2 -0
- package/dist/{chunk-nbpjzzrg.js → chunk-gagt42k2.js} +1 -1
- package/dist/chunk-gdm1xzvp.js +2 -0
- package/dist/chunk-gm62cfjw.js +1 -0
- package/dist/chunk-h3bjmkvz.js +1 -0
- package/dist/{chunk-qvtahmff.js → chunk-j8en7x02.js} +1 -1
- package/dist/{chunk-2c69g6t9.js → chunk-jyr9417h.js} +2 -2
- package/dist/chunk-mcnfbhpr.js +6 -0
- package/dist/{chunk-wcf80p9y.js → chunk-mns8e65q.js} +1 -1
- package/dist/chunk-mpkr3s6b.js +3 -0
- package/dist/chunk-n9tgxfvw.js +615 -0
- package/dist/{chunk-be7qz4cv.js → chunk-ppyg431d.js} +1 -1
- package/dist/chunk-qxhrzws6.js +1 -0
- package/dist/{chunk-mvww9cmc.js → chunk-r6h7eja3.js} +1 -1
- package/dist/chunk-r8pjwjt6.js +1 -0
- package/dist/{chunk-97qxd4yb.js → chunk-rmfk5f9m.js} +2 -2
- package/dist/chunk-rrg9bw8r.js +25 -0
- package/dist/chunk-w3me85va.js +2 -0
- package/dist/{chunk-b922cq7k.js → chunk-wtxwny0p.js} +3 -3
- package/dist/{chunk-crbh6x86.js → chunk-x40fkg4z.js} +2 -2
- package/dist/{chunk-1m63zddw.js → chunk-x548f12z.js} +1 -1
- package/dist/{chunk-bqhghfmt.js → chunk-xtfzjb72.js} +1 -1
- package/dist/{chunk-ar5564sf.js → chunk-z0qxaky4.js} +1 -1
- package/dist/web/assets/{FilePreview-B5g8yi8d.js → FilePreview-DpovIbME.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-qBCxzEb_.js → MarkdownRenderer-73wC_SGk.js} +1 -1
- package/dist/web/assets/{McpModal-C7y2Fsqc.js → McpModal-CIpxuyTG.js} +1 -1
- package/dist/web/assets/{SettingsModal-Dmc7Dw_E.js → SettingsModal-BBa1libe.js} +1 -1
- package/dist/web/assets/{SettingsStore-BfoB9tNV.js → SettingsStore-C8YBWQPS.js} +1 -1
- package/dist/web/assets/{SkillsModal-CqFAIfj5.js → SkillsModal-DArZ-nCX.js} +1 -1
- package/dist/web/assets/{TerminalPanel-EHh8-9b9.js → TerminalPanel-BX7C7qiD.js} +1 -1
- package/dist/web/assets/index-DIWzaS2_.js +16 -0
- package/dist/web/index.html +1 -1
- package/package.json +2 -1
- package/dist/chunk-23h9grdr.js +0 -1
- package/dist/chunk-6spmzx13.js +0 -6
- package/dist/chunk-724djh7r.js +0 -1
- package/dist/chunk-804j7say.js +0 -1
- package/dist/chunk-8yk5w2ks.js +0 -1
- package/dist/chunk-9cr3jexy.js +0 -2
- package/dist/chunk-ghf5tgjr.js +0 -1
- package/dist/chunk-kf43f8sy.js +0 -1577
- package/dist/chunk-kjc2aqww.js +0 -2
- package/dist/chunk-kjddt9xy.js +0 -1
- package/dist/chunk-m0ded6ky.js +0 -615
- package/dist/chunk-msr67f6q.js +0 -3
- package/dist/chunk-ncvr73ev.js +0 -1
- package/dist/chunk-qwn46cd6.js +0 -2
- package/dist/chunk-t9cqscfq.js +0 -2
- package/dist/chunk-tzr992v4.js +0 -1
- package/dist/chunk-x8xfx9nv.js +0 -1
- package/dist/chunk-yewg510f.js +0 -24
- package/dist/chunk-zjks0ncc.js +0 -6
- package/dist/chunk-zsyff0ky.js +0 -3
- package/dist/web/assets/index-B-BRpW1c.js +0 -16
package/dist/chunk-msr67f6q.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{Oa as t}from"./chunk-jc7k8pfn.js";import{Sb as r}from"./chunk-kjc2aqww.js";import"./chunk-eyypmc9m.js";import"./chunk-zsyff0ky.js";import{oc as s}from"./chunk-be7qz4cv.js";var m={command:"doctor",describe:"Check the health of your Blade installation",handler:async()=>{console.log(`Running Blade health check...
|
|
2
|
-
`);let e=0;try{await t.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(o){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${o instanceof Error?o.message:"未知错误"}`),e++}let n=process.version;if(parseInt(n.slice(1).split(".")[0])>=18)console.log(`[OK] Node.js version: ${n}`);else console.log(`[WARN] Node.js version: ${n} (recommended: v18+)`),e++;try{let o=await import("fs/promises"),i=r();await o.access(i,(await import("fs")).constants.R_OK|(await import("fs")).constants.W_OK),console.log("[OK] File system permissions: OK")}catch(o){console.log("[FAIL] File system permissions: FAILED"),console.log(" Error: Cannot read/write in current directory"),e++}try{await import("ink"),console.log("[OK] Dependencies: OK")}catch(o){console.log("[FAIL] Dependencies: FAILED"),console.log(" Error: Missing required dependencies"),e++}if(console.log(`
|
|
3
|
-
Health Check Summary:`),e===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${e} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};export{m as doctorCommands};
|
package/dist/chunk-ncvr73ev.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{eb as a,fb as b,hb as c,ib as d,jb as e,kb as f,lb as g,mb as h,nb as i,ob as j,pb as k,qb as l,rb as m,sb as n,tb as o,wb as p,xb as q,yb as r}from"./chunk-m0ded6ky.js";import"./chunk-5sccs44n.js";import"./chunk-b922cq7k.js";import"./chunk-1m63zddw.js";import"./chunk-7bqkkjxf.js";import"./chunk-kjc2aqww.js";import"./chunk-d7nrqg5b.js";import"./chunk-eyypmc9m.js";import"./chunk-zsyff0ky.js";import"./chunk-be7qz4cv.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,d as isRootSystemPrompt,l as handleTaskListUpdate,m as handleSkillActivation,n as extractModelSwitch,r as executeLoopGenerator,f as drainLoop,c as checkStopHook,a as checkOutputRecovery,b as checkIncompleteIntent,q as checkAndCompactInLoop,o as applyToolDomainEffects,p as StreamingToolExecutor,e as ConversationState};
|
package/dist/chunk-qwn46cd6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{e as gS,f as vS}from"./chunk-vxpdjtqc.js";import{p as FS}from"./chunk-9cr3jexy.js";import{B as dS,D as ES,E as FO,F as iO,H as MO,I as yO,J as F,K as z,L as LS,M as E,N as GO,P as vO,Q as TO,R as cO,T as lO,U as dO,W as WS,da as aS}from"./chunk-kf43f8sy.js";import{ga as xO}from"./chunk-2c69g6t9.js";import{Ba as YS,Ca as QS,Da as TS,Ga as s,za as SO}from"./chunk-yewg510f.js";import{Ua as QO}from"./chunk-sva5bdgz.js";import{_a as tS,ab as EO,kb as gO}from"./chunk-m0ded6ky.js";import{Cb as zS}from"./chunk-5sccs44n.js";import{Gb as c,Ib as x,Jb as H,Kb as XO,Lb as W}from"./chunk-1m63zddw.js";import{Mb as IO}from"./chunk-7bqkkjxf.js";import{Sb as k}from"./chunk-kjc2aqww.js";import{bc as L}from"./chunk-eyypmc9m.js";import{gc as qS,kc as NS,nc as jO}from"./chunk-zsyff0ky.js";import{oc as rO}from"./chunk-be7qz4cv.js";var B0={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function H0(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as $x,readFileSync as mO}from"node:fs";import{createServer as G0}from"node:http";import{networkInterfaces as U0}from"node:os";import{dirname as Z0,extname as A0,join as YO}from"node:path";import{fileURLToPath as _0}from"node:url";import{Hono as w0}from"hono";import{cors as X0}from"hono/cors";import{WebSocketServer as y0}from"ws";class I extends Error{code;statusCode;constructor(O,S,j=500){super(S);this.code=O;this.statusCode=j;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class C extends I{constructor(O,S){super("NOT_FOUND",S?`${O} not found: ${S}`:`${O} not found`,404)}}class f extends I{constructor(O){super("BAD_REQUEST",O,400)}}class g extends I{constructor(O){super("CONFLICT",O,409)}}class _O extends I{constructor(O){super("TOO_MANY_REQUESTS",O,429)}}class i extends I{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class d extends I{constructor(O="Internal server error"){super("INTERNAL_ERROR",O,500)}}var q0=x.Object({error:x.Object({code:x.String(),message:x.String()})});import{Hono as Yx}from"hono";var kO=L("Service"),Qx=x.Object({updates:x.Record(x.String(),x.Any()),options:x.Optional(x.Object({scope:x.Optional(W(["local","project","global"])),immediate:x.Optional(x.Boolean())}))});function Tx(O){return{currentModelId:O.currentModelId,permissionMode:O.permissionMode,language:O.language,theme:O.theme,uiTheme:O.uiTheme,autoSaveSessions:O.autoSaveSessions,notifyBuild:O.notifyBuild,notifyErrors:O.notifyErrors,notifySounds:O.notifySounds,privacyTelemetry:O.privacyTelemetry,privacyCrash:O.privacyCrash,maxConcurrentTasks:O.maxConcurrentTasks,maxQueuedTasks:O.maxQueuedTasks}}var jS=()=>{let O=new Yx;return O.get("/",async(S)=>{try{let j=SO();return S.json(j?Tx(j):{})}catch(j){return kO.error("[ConfigRoutes] Failed to get config:",j),S.json({})}}),O.put("/",async(S)=>{try{let j=await S.req.json(),$=c(Qx,j);if(!$.success)throw new f("Invalid config update format");let{updates:J,options:Y}=$.data;return await s().updateConfig(J,Y),S.json({success:!0,updates:J})}catch(j){throw kO.error("[ConfigRoutes] Failed to update config:",j),j}}),O.get("/permissions",async(S)=>{try{let j=SO();return S.json(j?.permissions||{})}catch(j){return kO.error("[ConfigRoutes] Failed to get permissions:",j),S.json({})}}),O};import{Hono as Gx}from"hono";import{streamSSE as Ux}from"hono/streaming";var Zx=15000,Ax=new Set(["task.status"]),_x=new Set(["queued","running","completed","failed","cancelled","interrupted"]);function wx(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let S=O,j=["changedFiles","additions","deletions","commits"];if(j.some(($)=>typeof S[$]!=="number"||!Number.isInteger(S[$])||S[$]<0))return;return Object.fromEntries(j.map(($)=>[$,S[$]]))}function bO(O,S){return typeof O==="number"&&Number.isInteger(O)&&O>=S?O:void 0}var $S=()=>{let O=new Gx;return O.get("/",(S)=>Ux(S,async(j)=>{let $,J,Y=!1,Q=()=>{if(J!==void 0)clearInterval(J),J=void 0;$?.(),$=void 0},y=()=>{if(Y)return;Y=!0,Q()};j.onAbort(y),$=z.subscribe((Z)=>{if(!Ax.has(Z.type))return;let D=Z.properties.taskStatus;if(typeof D!=="string"||!_x.has(D))return;let B=wx(Z.properties.taskDiffStat),M=bO(Z.properties.taskQueuePosition,1),K=bO(Z.properties.taskQueueDepth,0),u=bO(Z.properties.taskConcurrencyLimit,1),N=bO(Z.properties.taskInFlight,0);j.writeSSE({data:JSON.stringify({type:Z.type,properties:{sessionId:Z.sessionId,projectPath:Z.projectPath,taskStatus:D,...typeof Z.properties.taskStatusReason==="string"?{taskStatusReason:Z.properties.taskStatusReason}:{},...typeof Z.properties.taskStartedAt==="string"?{taskStartedAt:Z.properties.taskStartedAt}:{},...typeof Z.properties.taskCompletedAt==="string"?{taskCompletedAt:Z.properties.taskCompletedAt}:{},...typeof Z.properties.updatedAt==="string"?{updatedAt:Z.properties.updatedAt}:{},...B?{taskDiffStat:B}:{},...M!==void 0?{taskQueuePosition:M}:{},...K!==void 0?{taskQueueDepth:K}:{},...u!==void 0?{taskConcurrencyLimit:u}:{},...N!==void 0?{taskInFlight:N}:{}}})}).catch(y)});try{if(j.aborted||Y)return;if(await j.writeSSE({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),j.aborted||Y)return;J=setInterval(()=>{if(j.aborted||Y)return;j.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(y)},Zx);while(!j.aborted&&!Y)await new Promise((Z)=>setTimeout(Z,1000))}finally{y()}})),O};import{Hono as Xx}from"hono";var VS=()=>{let O=new Xx;return O.get("/health",(S)=>{return S.json({healthy:!0,version:QO()})}),O.get("/info",(S)=>{let j=k(),$=SO();if($)TO.configure($.maxConcurrentTasks,$.maxQueuedTasks);return S.json({version:QO(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:j,gitBranch:NS(j),taskAdmission:TO.getStats()})}),O};import{Hono as yx}from"hono";var wO=L("Service"),JS=()=>{let O=new yx;return O.get("/",async(S)=>{try{let $=xO.getInstance().getAllServers(),J=Array.from($.entries()).map(([Y,Q])=>({id:Y,name:Y,status:Q.status==="connected"?"connected":Q.status==="connecting"?"connecting":Q.lastError?"error":"offline",endpoint:Q.config.command?`${Q.config.command} ${(Q.config.args||[]).join(" ")}`.trim():Q.config.url||"Unknown",description:`MCP server: ${Y}`,tools:Q.tools.map((y)=>y.name),connectedAt:Q.connectedAt?.toISOString(),error:Q.lastError?.message}));return S.json(J)}catch(j){return wO.error("[McpRoutes] Failed to get MCP servers:",j),S.json([])}}),O.post("/:name/connect",async(S)=>{try{let j=S.req.param("name");return await xO.getInstance().connectServer(j),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to connect MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.post("/:name/disconnect",async(S)=>{try{let j=S.req.param("name");return await xO.getInstance().disconnectServer(j),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to disconnect MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.delete("/:name",async(S)=>{try{let j=S.req.param("name");await xO.getInstance().unregisterServer(j);let J=SO();if(J?.mcpServers){let{[j]:Y,...Q}=J.mcpServers;await s().updateConfig({mcpServers:Q})}return S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to delete MCP server:",j),S.json({success:!1,error:j.message},500)}}),O.post("/",async(S)=>{try{let j=await S.req.json(),{name:$,config:J}=j;if(!$||!J)return S.json({success:!1,error:"Missing name or config"},400);await xO.getInstance().registerServer($,J);let Q=SO();return await s().updateConfig({mcpServers:{...Q?.mcpServers,[$]:J}}),S.json({success:!0})}catch(j){return wO.error("[McpRoutes] Failed to add MCP server:",j),S.json({success:!1,error:j.message},500)}}),O};import{Hono as Dx}from"hono";var fO=L("Service");function px(O,S){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:S.contextWindow,maxTokens:S.maxTokens,reasoning:S.reasoning,input:S.input}}function bx(O){let S={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)S.model=O.model;return S}var GS=()=>{let O=new Dx;return O.get("/",async(S)=>{try{let j=YS(),$=QS(),J=jO(),Y=(Q)=>px(Q,J.resolveConfig(Q));return S.json({configured:j.map(Y),current:$?Y($):null})}catch(j){return fO.error("[ModelsRoutes] Failed to get models:",j),S.json({configured:[],current:null})}}),O.post("/",async(S)=>{try{let j=await S.req.json(),{provider:$,displayName:J,model:Y,overrides:Q,apiKey:y}=j;if(!$||!Y)throw new f("provider and model are required");if(jO().getModel($,Y),y?.trim())await jO().setApiKey($,y.trim());let Z=await s().addModel({provider:$,displayName:J||void 0,model:Y,overrides:Q||void 0});return S.json({success:!0,model:Z})}catch(j){throw fO.error("[ModelsRoutes] Failed to add model:",j),j}}),O.put("/:modelId",async(S)=>{try{let j=S.req.param("modelId"),$=await S.req.json(),{displayName:J,overrides:Y,model:Q}=$,y=TS(j);if(!y)throw new f("model config not found");if(Q)jO().getModel(y.provider,Q);return await s().updateModel(j,bx({displayName:J,overrides:Y,model:Q})),S.json({success:!0})}catch(j){throw fO.error("[ModelsRoutes] Failed to update model:",j),j}}),O.delete("/:modelId",async(S)=>{try{let j=S.req.param("modelId");return await s().removeModel(j),S.json({success:!0})}catch(j){throw fO.error("[ModelsRoutes] Failed to delete model:",j),j}}),O};import{Hono as dx}from"hono";import MS from"node:path";import{Mutex as Lx}from"async-mutex";import{Hono as Wx}from"hono";import{streamSSE as Fx}from"hono/streaming";import{LRUCache as mx}from"lru-cache";import{nanoid as UO}from"nanoid";var hO=H(W(["default","autoEdit","yolo","plan"]));var PO=H(W(["user","assistant","system","tool"])),fx=H(x.Union([x.Object({type:x.Literal("text"),text:x.String()}),x.Object({type:x.Literal("image_url"),image_url:x.Object({url:x.String()})})])),ZS=x.Union([x.String(),x.Array(fx)]),J1=H(x.Object({id:x.String(),role:PO,content:ZS,timestamp:x.Number(),metadata:x.Optional(x.Record(x.String(),x.Unknown())),thinkingContent:x.Optional(x.String()),tool_call_id:x.Optional(x.String()),name:x.Optional(x.String()),tool_calls:x.Optional(x.Unknown())})),Bx=H(W(["queued","running","completed","failed","cancelled","interrupted"])),AS=H(W(["local","worktree"])),Hx=H(x.Object({changedFiles:x.Integer({minimum:0}),additions:x.Integer({minimum:0}),deletions:x.Integer({minimum:0}),commits:x.Integer({minimum:0})})),Mx=H(x.Object({path:x.String({minLength:1}),patch:x.String({maxLength:2097152}),additions:x.Integer({minimum:0}),deletions:x.Integer({minimum:0}),binary:x.Boolean(),truncated:x.Boolean()})),_S=H(x.Object({sessionId:x.String(),projectPath:x.String(),baseCommit:x.String(),files:x.Array(Mx,{maxItems:100}),truncated:x.Boolean()})),wS=H(x.Object({sessionId:x.String(),projectPath:x.String(),title:x.Optional(x.String()),gitBranch:x.Optional(x.String()),rootId:x.String(),parentId:x.Optional(x.String()),relationType:x.Optional(W(["subagent","fork"])),resumedFrom:x.Optional(x.String()),rootAgentId:x.Optional(x.String()),resumeDepth:x.Optional(x.Integer({minimum:0})),taskStatus:XO(Bx,"completed"),taskStatusReason:x.Optional(x.String()),taskStartedAt:x.Optional(x.String()),taskCompletedAt:x.Optional(x.String()),taskPromptSummary:x.Optional(x.String()),taskIsolation:x.Optional(AS),taskSourceProjectPath:x.Optional(x.String()),taskWorktreePath:x.Optional(x.String()),taskWorktreeBranch:x.Optional(x.String()),taskBaseCommit:x.Optional(x.String()),taskDiffStat:x.Optional(Hx),taskQueuePosition:x.Optional(x.Integer({minimum:1})),taskQueueDepth:x.Optional(x.Integer({minimum:0})),taskConcurrencyLimit:x.Optional(x.Integer({minimum:1})),messageCount:x.Number(),firstMessageTime:x.String(),lastMessageTime:x.String(),hasErrors:x.Boolean()})),Y1=H(x.Object({version:x.Literal(1),sessionId:x.String(),goalId:x.String(),objective:x.String(),status:W(["active","paused","blocked","usage_limited","budget_limited","complete"]),tokenBudget:x.Optional(x.Number()),tokensUsed:x.Number(),timeUsedSeconds:x.Number(),continuationCount:x.Number(),statusReason:x.Optional(x.String()),createdAt:x.String(),updatedAt:x.String()})),XS=H(x.Object({role:PO,content:ZS,metadata:x.Optional(x.Unknown()),reasoningContent:x.Optional(x.String()),thinkingContent:x.Optional(x.String()),tool_call_id:x.Optional(x.String()),name:x.Optional(x.String()),tool_calls:x.Optional(x.Unknown())})),Q1=H(x.Object({session:wS,messages:x.Array(XS)})),yS=H(W(["conversation","code","both"])),Kx=H(x.Object({messageId:x.String(),preview:x.String(),createdAt:x.String(),fileCount:x.Integer({minimum:0})})),DS=H(x.Object({targetMessageId:x.String({minLength:1}),mode:XO(yS,"conversation")})),T1=H(x.Object({checkpoint:Kx,mode:yS,removedTurns:x.Integer({minimum:1}),restoredFiles:x.Array(x.String()),messages:x.Array(XS)})),qx=W(["running","completed","failed","cancelled"]),US=H(x.Object({id:x.String(),subagentType:x.String(),description:x.String(),status:qx,rootAgentId:x.String(),resumedFrom:x.Optional(x.String()),resumeDepth:x.Integer({minimum:0}),createdAt:x.Number(),lastActiveAt:x.Number(),completedAt:x.Optional(x.Number()),result:x.Optional(x.Object({success:x.Boolean(),message:x.String(),error:x.Optional(x.String()),verificationCommands:x.Optional(x.Array(x.String()))})),stats:x.Optional(x.Object({tokens:x.Optional(x.Number()),toolCalls:x.Optional(x.Number()),duration:x.Optional(x.Number())}))})),pS=H(x.Object({prompt:x.String({minLength:1,maxLength:32000,pattern:"\\S"})})),G1=H(x.Object({source:US,session:US})),U1=H(x.Object({sessionId:x.String(),projectPath:x.String()})),Z1=H(x.Object({type:x.String(),properties:x.Record(x.String(),x.Unknown())})),bS=x.Object({type:W(["file","image","url"]),path:x.Optional(x.String()),url:x.Optional(x.String()),content:x.Optional(x.String()),mimeType:x.Optional(x.String()),name:x.Optional(x.String())}),fS=H(x.Object({prompt:x.String({minLength:1,maxLength:32000,pattern:"\\S"}),title:x.Optional(x.String({minLength:1,maxLength:200})),projectPath:x.Optional(x.String()),isolation:XO(AS,"worktree"),permissionMode:XO(hO,"default"),attachments:x.Optional(x.Array(bS))})),BS=H(x.Object({session:wS,runId:x.String(),messageId:x.String(),status:W(["queued","running"]),queuePosition:x.Optional(x.Integer({minimum:1})),queueDepth:x.Optional(x.Integer({minimum:0})),maxConcurrentTasks:x.Optional(x.Integer({minimum:1}))})),HS=H(x.Object({content:x.String(),projectPath:x.Optional(x.String()),permissionMode:x.Optional(hO),attachments:x.Optional(x.Array(bS))})),A1=H(x.Object({messageId:x.String(),role:PO,content:x.String(),timestamp:x.String()})),_1=H(x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(W(["once","session","project"])),targetMode:x.Optional(hO),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))})),w1=H(x.Object({id:x.String(),displayName:x.Optional(x.String()),provider:x.String(),model:x.String(),contextWindow:x.Optional(x.Number()),maxTokens:x.Optional(x.Number()),reasoning:x.Optional(x.Boolean()),input:x.Optional(x.Array(W(["text","image"]))),overrides:x.Optional(x.Object({baseUrl:x.Optional(x.String()),temperature:x.Optional(x.Number()),maxOutputTokens:x.Optional(x.Number()),timeout:x.Optional(x.Number())}))})),X1=H(W(["vs-dark","vs-light","hc-black"])),zx=H(W(["light","dark","system"])),Ex=H(x.Object({language:x.String(),theme:x.String(),uiTheme:zx,autoSaveSessions:x.Boolean(),notifyBuild:x.Boolean(),notifyErrors:x.Boolean(),notifySounds:x.Boolean(),privacyTelemetry:x.Boolean(),privacyCrash:x.Boolean()})),y1=H(x.Partial(Ex));var q=L("Service"),Cx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),kx=HS,hx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),Px=x.Object({projectPath:x.String()}),Rx=x.Object({objective:x.String({minLength:1}),tokenBudget:x.Optional(x.Integer({minimum:1})),permissionMode:x.Optional(W(["default","autoEdit","plan","yolo"]))}),Ix=x.Union([x.Object({action:x.Literal("pause")}),x.Object({action:x.Literal("resume")}),x.Object({action:x.Literal("edit"),objective:x.String({minLength:1})})]),R=new Map,OO=new Map,zO=new mx({max:100,ttl:1800000});function gx(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function a(O){if(!O)return;return OO.get(O)??zO.get(O)}function vx(O){if(OO.get(O.id)!==O)return;OO.delete(O.id),zO.set(O.id,O)}function cx(O){OO.delete(O),zO.delete(O)}function VO(O){return O?.status==="queued"||O?.status==="running"||O?.status==="waiting_permission"}function qO(O,S="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed")return!1;let j=O.pendingPermission;return O.pendingPermission=void 0,j?.resolve({approved:!1,reason:zS}),O.abortController.abort(S),O.status="cancelled",z.publish(gx(O),"run.cancelled",{runId:O.id}),!0}function mS(O,S=!1){let{permissionId:j,details:$}=O;if($.type==="askUserQuestion"&&$.questions)return{type:"question.required",properties:{requestId:j,toolCallId:j,questions:$.questions,details:$,...S?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:j,toolName:$.toolName,description:$.message,args:$.args,details:$,...S?{replayed:!0}:{}}}}function tx(){for(let O of OO.values())qO(O,"route-reset");OO.clear(),zO.clear(),R.clear()}var CS=(O)=>{if(!O||typeof O!=="object")return O;let S={...O},j=200000;if(typeof S.oldContent==="string"&&S.oldContent.length>j)delete S.oldContent;if(typeof S.newContent==="string"&&S.newContent.length>j)delete S.newContent;return S};function ux(O,S,j){switch(j.kind){case"tool_start":if("function"in j.toolCall)z.publish(O,"subagent.update",{subagentSessionId:S,toolName:j.toolCall.function.name}),z.publish(O,"subagent.tool.start",{subagentSessionId:S,toolCallId:j.toolCall.id,toolName:j.toolCall.function.name,arguments:j.toolCall.function.arguments,toolKind:j.toolKind});break;case"tool_result":if("function"in j.toolCall)z.publish(O,"subagent.tool.result",{subagentSessionId:S,toolCallId:j.toolCall.id,toolName:j.toolCall.function.name,success:!j.result.error,summary:j.result.metadata?.summary,output:dO(lO(j.toolCall.function.name,j.result)),metadata:CS(j.result.metadata)});break;case"content_delta":z.publish(O,"subagent.delta",{subagentSessionId:S,delta:j.delta});break;case"thinking_delta":z.publish(O,"subagent.thinking.delta",{subagentSessionId:S,delta:j.delta});break;case"stream_end":z.publish(O,"subagent.stream.end",{subagentSessionId:S});break;default:break}}function KO(O,S="projectPath"){if(!MS.isAbsolute(O))throw new f(`${S} must be absolute`);return MS.resolve(O)}function tO(O){try{qS(O)}catch(S){throw new f(S instanceof Error?S.message:`Invalid session ID: ${O}`)}}function t(O){return{sessionId:O.id,projectPath:O.projectPath}}function BO(O,S,j){return{id:O.sessionId,projectPath:O.projectPath,title:O.title??`Session ${O.sessionId.slice(0,6)}`,createdAt:new Date(O.firstMessageTime),updatedAt:new Date(O.lastMessageTime),rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,taskStatus:O.taskStatus,taskStatusReason:O.taskStatusReason,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:O.taskQueuePosition,taskQueueDepth:O.taskQueueDepth,taskConcurrencyLimit:O.taskConcurrencyLimit,taskWorktree:j,messages:S}}function kS(O,S){O.taskStatus=S.taskStatus,O.taskStatusReason=S.taskStatusReason,O.taskStartedAt=S.taskStartedAt,O.taskCompletedAt=S.taskCompletedAt,O.taskPromptSummary=S.taskPromptSummary,O.taskIsolation=S.taskIsolation,O.taskSourceProjectPath=S.taskSourceProjectPath,O.taskWorktreePath=S.taskWorktreePath,O.taskWorktreeBranch=S.taskWorktreeBranch,O.taskBaseCommit=S.taskBaseCommit,O.taskDiffStat=S.taskDiffStat,O.taskQueuePosition=S.taskQueuePosition,O.taskQueueDepth=S.taskQueueDepth,O.taskConcurrencyLimit=S.taskConcurrencyLimit,O.updatedAt=new Date(S.lastMessageTime)}async function RO(O){let S=await E.findSessionMetadata(O.id,O.projectPath);if(S)kS(O,S)}function HO(O){let S=a(O.currentRunId),j=S?.status==="waiting_permission"?"running":S?.status??O.taskStatus;return{sessionId:O.id,projectPath:O.projectPath,title:O.title,rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,status:void 0,taskStatus:j,taskStatusReason:O.taskStatusReason,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:S?.status==="queued"?S.taskQueuePosition:j==="queued"?O.taskQueuePosition:void 0,taskQueueDepth:S?.status==="queued"?S.taskQueueDepth:j==="queued"?O.taskQueueDepth:void 0,taskConcurrencyLimit:S?.taskConcurrencyLimit??O.taskConcurrencyLimit,agentType:void 0,model:void 0,messageCount:O.messages.length,firstMessageTime:O.createdAt.toISOString(),lastMessageTime:O.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function r(O,S){if(tO(O),S!==void 0){let $=yO({sessionId:O,projectPath:KO(S)});if(R.has(F($)))return $;let J=await E.findSessionMetadata($.sessionId,$.projectPath);if(!J)throw new C("Session",O);return yO({sessionId:J.sessionId,projectPath:J.projectPath})}let j=new Map;for(let $ of R.values()){if($.id!==O)continue;let J=t($);j.set(F(J),J)}for(let $ of await E.listSessions()){if($.sessionId!==O)continue;let J=yO({sessionId:$.sessionId,projectPath:$.projectPath});j.set(F(J),J)}if(j.size===0)try{let $=await E.findSessionMetadata(O);if(!$)throw new C("Session",O);return yO({sessionId:$.sessionId,projectPath:$.projectPath})}catch($){if($ instanceof C)throw $;if($ instanceof Error&&$.message.startsWith("Ambiguous session ID:"))throw new i;throw $}if(j.size>1)throw new i;return j.values().next().value}function uO(O){if(typeof O==="string")return O;return O.filter((S)=>S.type==="text").map((S)=>S.text).join(`
|
|
2
|
-
`)}function KS(O,S){let j=(S??[]).filter((J)=>J.type==="image"&&typeof J.content==="string").map((J)=>({type:"image_url",image_url:{url:J.content}}));if(j.length===0)return O;let $=[];if(O.trim())$.push({type:"text",text:O});return $.push(...j),$}var hS=()=>{tx();let O=new Wx;O.onError((N,T)=>{if(N instanceof I)return T.json(N.toObject(),N.statusCode);return q.error("[SessionRoutes] Unhandled route error:",N),T.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let S=new Map,j=new Map,$=new Map,J=new Map,Y=(N)=>{let T=F(N),V=J.get(T);if(!V)V=new Lx,J.set(T,V);return V},Q=async(N)=>{let T=F(t(N)),V=S.get(T);if(V)return V;let G=j.get(T);if(!G)G=cO.create({sessionId:N.id,workspaceRoot:N.projectPath,...N.taskWorktree?{taskWorktree:N.taskWorktree}:{},...N.taskIsolation?{taskIsolation:N.taskIsolation}:{}}),j.set(T,G);try{let U=await G;return S.set(T,U),U}finally{if(j.get(T)===G)j.delete(T)}},y=async(N)=>{let T=F(N),V=R.get(T);if(V)return V;let G=$.get(T);if(!G)G=(async()=>{let U=await E.findSessionMetadata(N.sessionId,N.projectPath);if(!U)throw new C("Session",N.sessionId);let[_,A]=await Promise.all([E.loadSession(N.sessionId,N.projectPath),E.findSessionTaskWorktree(N.sessionId,N.projectPath)]),p=BO(U,_,A);return R.set(T,p),p})(),$.set(T,G);try{return await G}finally{if($.get(T)===G)$.delete(T)}},Z=async(N,T)=>{return y(await r(N,T))},D=(N,T,V,G={})=>{let U=UO(12),_={id:U,sessionId:N.id,projectPath:N.projectPath,status:"running",abortController:new AbortController,createdAt:new Date};if(G.taskRuntime){let A=G.taskRuntime,p=TO.admit({key:`${N.projectPath}\x00${N.id}`,...A.getTaskAdmissionLimits(),signal:_.abortController.signal,onUpdate:(X)=>{_.status=X.state,_.taskQueuePosition=X.queuePosition,_.taskQueueDepth=X.queueDepth,_.taskConcurrencyLimit=X.maxConcurrent,N.taskStatus=X.state,N.taskQueuePosition=X.queuePosition,N.taskQueueDepth=X.queueDepth,N.taskConcurrencyLimit=X.maxConcurrent,_.taskAdmissionUpdate=(_.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await A.setTaskAdmission(X)}).catch((b)=>{q.warn(`[SessionRoutes] Failed to persist admission for ${N.id}:`,b)})}});_.taskAdmission=p;let w=p.getSnapshot();_.status=w.state,_.taskQueuePosition=w.queuePosition,_.taskQueueDepth=w.queueDepth,_.taskConcurrencyLimit=w.maxConcurrent}return OO.set(U,_),N.currentRunId=U,_.completion=lx(_,N,T,V,Q,{pendingInputOnly:G.pendingInputOnly,preparedInputTurn:G.preparedInputTurn,goalContinuationOnly:G.goalContinuationOnly,taskAdmission:_.taskAdmission}).catch((A)=>{q.error(`[SessionRoutes] Run ${U} failed:`,A)}),_},B=async(N)=>{let T=IO("task",12),V=KO(N.sourceProjectPath),G,U;try{let _=await FS.createSessionTask({sessionId:T,prompt:N.prompt,title:N.title,sourceProjectPath:V,isolation:N.isolation}),{metadata:A}=_;G=_.taskWorktree,U=BO(A,[],G);let p=t(U);R.set(F(p),U),z.publish(p,"task.status",{taskStatus:A.taskStatus,updatedAt:A.lastMessageTime});let w=KS(N.prompt,N.attachments),X=await Q(U),b=await X.prepareInputTurn(w);if(!b.accepted)throw new g(`Task prompt was not accepted: ${b.reason}`);let h=D(U,w,N.permissionMode,{preparedInputTurn:b,taskRuntime:X});return await h.taskAdmissionUpdate,{session:HO(U),runId:h.id,messageId:b.messageId,status:h.status==="queued"?"queued":"running",queuePosition:h.taskQueuePosition,queueDepth:h.taskQueueDepth,maxConcurrentTasks:h.taskConcurrencyLimit}}catch(_){if(_ instanceof vO&&U){let A=t(U),p=F(A);if(G)await GO.exit({sessionId:U.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await S.get(p)?.dispose().catch(()=>{return}),S.delete(p),await E.deleteSession(U.id,U.projectPath).catch(()=>{return}),R.delete(p),new _O("Task admission queue is full")}if(U){let A=await E.findSessionMetadata(U.id,U.projectPath).catch(()=>{return});if(!A||A.taskStatus==="queued"){let p=await E.updateSessionMetadata(U.id,U.projectPath,{taskStatus:"failed",taskStatusReason:"Task dispatch failed",taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});U.taskStatus=p?.taskStatus??"failed",U.taskStatusReason=p?.taskStatusReason??"Task dispatch failed",U.taskCompletedAt=p?.taskCompletedAt}else U.taskStatus=A.taskStatus,U.taskStatusReason=A.taskStatusReason,U.taskCompletedAt=A.taskCompletedAt}throw _}},M=async(N,T)=>{let V=await Z(N,T);if(!V.taskWorktree)throw new f("Session does not have a task worktree");try{await GO.restoreSession(V.taskWorktree);let G=await GO.getDiffArtifact(V.id);if(!G)throw new g("Task diff artifact is unavailable");return{sessionId:V.id,projectPath:V.projectPath,...G}}catch(G){if(G instanceof g)throw G;throw q.error("[SessionRoutes] Failed to load task diff artifact:",G),new g("Task diff artifact is unavailable")}},K=async(N)=>{let T=a(N.currentRunId);if(VO(T))return;let V=await Q(N),G=a(N.currentRunId);if(VO(G))return;let U=V.getPendingSteeringCount()>0,A=(U?null:await V.getGoal())?.status==="active";if(!U&&!A||V.hasTurnOwner())return;D(N,"","default",{pendingInputOnly:U,goalContinuationOnly:A,...N.taskIsolation?{taskRuntime:V}:{}})},u=async()=>{let N={scheduled:0,failed:0,deferred:0},T=(await E.listSessions()).filter((V)=>V.taskStatus==="queued"&&V.taskIsolation!==void 0).sort((V,G)=>V.firstMessageTime.localeCompare(G.firstMessageTime)||V.projectPath.localeCompare(G.projectPath)||V.sessionId.localeCompare(G.sessionId));for(let[V,G]of T.entries()){let U={sessionId:G.sessionId,projectPath:G.projectPath};try{if(!await cO.hasPendingInbox(G.projectPath,G.sessionId)){await E.updateSessionMetadata(G.sessionId,G.projectPath,{taskStatus:"failed",taskStatusReason:"Queued task input is missing",taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),N.failed++;continue}let _=await y(U);if(await K(_),_.currentRunId)N.scheduled++}catch(_){if(_ instanceof vO){N.deferred+=T.length-V;break}q.warn(`[SessionRoutes] Failed to recover queued task ${G.sessionId}:`,_),N.deferred++}}return N};return O.get("/",async(N)=>{try{let T=await E.listSessions(),V=new Set(T.filter((X)=>X.relationType==="subagent").map((X)=>F({sessionId:X.sessionId,projectPath:X.projectPath}))),G=Array.from(R.values()).filter((X)=>!V.has(F(t(X)))&&X.relationType!=="subagent").map((X)=>HO(X)),U=new Set(G.map((X)=>F({sessionId:X.sessionId,projectPath:X.projectPath}))),_=T.filter((X)=>{if(X.relationType==="subagent")return!1;return!U.has(F({sessionId:X.sessionId,projectPath:X.projectPath}))}),A=new Set(U),p=_.filter((X)=>{let b=F({sessionId:X.sessionId,projectPath:X.projectPath});if(A.has(b))return!1;return A.add(b),!0}),w=[...G,...p];return N.json(w)}catch(T){throw q.error("[SessionRoutes] Failed to list sessions:",T),new d("Failed to list sessions")}}),O.post("/",async(N)=>{try{let T=await N.req.json(),V=c(Cx,T);if(!V.success)throw new f("Invalid request body");let{title:G,projectPath:U}=V.data,_=IO("web",12),A=KO(U||N.get("directory")||k(),U?"projectPath":"directory"),p=await E.createSessionMetadata(_,A,{title:G}),w=BO(p,[]),X=t(w);return R.set(F(X),w),z.publish(X,"task.status",{taskStatus:p.taskStatus,updatedAt:p.lastMessageTime}),N.json({...HO(w),status:void 0,agentType:void 0,model:void 0})}catch(T){if(q.error("[SessionRoutes] Failed to create session:",T),T instanceof f)throw T;throw new d("Failed to create session")}}),O.post("/:sessionId/fork",async(N)=>{let T=N.req.param("sessionId");try{tO(T);let V=await N.req.json(),G=c(Px,V);if(!G.success)throw new f("Invalid request body");let U=KO(G.data.projectPath),_=await E.findSessionMetadata(T,U);if(!_)throw new C("Session",T);let A=await E.forkSession(T,{sourceProjectPath:_.projectPath,targetProjectPath:_.projectPath}),p=BO(A.metadata,A.messages),w=t(p);return R.set(F(w),p),z.publish(w,"task.status",{taskStatus:A.metadata.taskStatus,...A.metadata.taskCompletedAt?{taskCompletedAt:A.metadata.taskCompletedAt}:{},updatedAt:A.metadata.lastMessageTime}),N.json({session:A.metadata,messages:A.messages},201)}catch(V){if(V instanceof f||V instanceof C||V instanceof g)throw V;if(V instanceof LS)throw new g("Session has no durable creation record");throw q.error("[SessionRoutes] Failed to fork session:",V),new d("Failed to fork session")}}),O.get("/:sessionId",async(N)=>{let T=N.req.param("sessionId");try{let V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(G)return N.json(HO(G));let U=await E.findSessionMetadata(V.sessionId,V.projectPath);if(!U)throw new C("Session",T);return N.json(U)}catch(V){if(V instanceof f||V instanceof C||V instanceof i)throw V;throw q.error("[SessionRoutes] Failed to get session:",V),new d("Failed to get session")}}),O.patch("/:sessionId",async(N)=>{let T=N.req.param("sessionId");try{let V=await N.req.json(),G=c(hx,V);if(!G.success)throw new f("Invalid request body");if(G.data.title===void 0)throw new f("title is required");let U=await r(T,G.data.projectPath),_=await E.updateSessionMetadata(U.sessionId,U.projectPath,{title:G.data.title}),A=R.get(F(U));if(A)A.title=_.title??A.title,A.updatedAt=new Date(_.lastMessageTime);return N.json({success:!0,title:_.title})}catch(V){if(q.error("[SessionRoutes] Failed to update session:",V),V instanceof f||V instanceof C||V instanceof i)throw V;throw new d("Failed to update session")}}),O.get("/:sessionId/rewind",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=await Q(T);return N.json({checkpoints:await V.listRewindCheckpoints()})}),O.post("/:sessionId/rewind",async(N)=>{let T=c(DS,await N.req.json());if(!T.success)throw new f("Invalid rewind request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))throw new g("Cannot rewind while a run is active");let _=await Q(V),A;try{A=await _.rewindSession(T.data)}catch(p){if(p instanceof Error&&p.message.startsWith("Cannot rewind while"))throw new g(p.message);throw p}return V.messages=[...A.messages],V.updatedAt=new Date,z.publish(G,"session.rewound",{targetMessageId:A.checkpoint.messageId,mode:A.mode,removedTurns:A.removedTurns,restoredFiles:A.restoredFiles,messages:A.messages}),N.json(A)})}),O.get("/:sessionId/subagents",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=await Q(T);return N.json({subagents:V.listSubagents().map(MO)})}),O.post("/:sessionId/subagents/:agentId/resume",async(N)=>{tO(N.req.param("agentId"));let T=pS.safeParse(await N.req.json());if(!T.success)throw new f("Invalid subagent resume request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))throw new g("Cannot resume a subagent while a parent run is active");let _=await Q(V),A=!1,p,w=(b)=>{z.publish(G,"subagent.complete",{subagentSessionId:b.id,success:b.status==="completed",status:b.status,summary:b.result?.message?.slice(0,500),resumedFrom:b.resumedFrom,rootAgentId:b.rootAgentId,resumeDepth:b.resumeDepth})},X;try{X=_.resumeSubagent({agentId:N.req.param("agentId"),prompt:T.data.prompt,onEvent:(b,h)=>{ux(G,h,b)},onCompleted:(b)=>{if(A)w(b);else p=b}})}catch(b){if(b instanceof Error&&(b.message.startsWith("Cannot resume")||b.message.startsWith("Subagent cannot")))throw new g(b.message);if(b instanceof Error&&b.message.startsWith("Subagent not found"))throw new C(b.message);throw b}if(z.publish(G,"subagent.start",{subagentSessionId:X.session.id,type:X.session.subagentType,description:X.session.description,resumedFrom:X.source.id,rootAgentId:X.session.rootAgentId,resumeDepth:X.session.resumeDepth}),A=!0,p)w(p);return N.json({source:MO(X.source),session:MO(X.session)})})}),O.get("/:sessionId/goal",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath"));return N.json({goal:await new ES(T.projectPath,T.id).get()})}),O.put("/:sessionId/goal",async(N)=>{let T=c(Rx,await N.req.json());if(!T.success)throw new f("Invalid goal request");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=a(V.currentRunId);if(VO(U))return N.json({status:"rejected",reason:"run_active"},409);let _=await Q(V),A=await _.createGoal(T.data);z.publish(G,"goal.updated",{goal:A});let p=T.data.permissionMode??"default",w=D(V,"",p,{goalContinuationOnly:!0,...V.taskIsolation?{taskRuntime:_}:{}});return await w.taskAdmissionUpdate,N.json({status:w.status==="queued"?"queued":"running",runId:w.id,goal:A,queuePosition:w.taskQueuePosition,queueDepth:w.taskQueueDepth,maxConcurrentTasks:w.taskConcurrencyLimit},202)})}),O.patch("/:sessionId/goal",async(N)=>{let T=c(Ix,await N.req.json());if(!T.success)throw new f("Invalid goal update");let V=await Z(N.req.param("sessionId"),N.req.query("projectPath")),G=t(V);return Y(G).runExclusive(async()=>{let U=await Q(V),_;if(T.data.action==="pause")_=await U.pauseGoal();else if(T.data.action==="edit")_=await U.editGoal(T.data.objective);else _=await U.resumeGoal();if(z.publish(G,"goal.updated",{goal:_}),_.status==="active"&&!VO(a(V.currentRunId))){let A=D(V,"","default",{goalContinuationOnly:!0,...V.taskIsolation?{taskRuntime:U}:{}});return await A.taskAdmissionUpdate,N.json({status:A.status==="queued"?"queued":"running",runId:A.id,goal:_,queuePosition:A.taskQueuePosition,queueDepth:A.taskQueueDepth,maxConcurrentTasks:A.taskConcurrencyLimit},202)}return N.json({status:_.status,goal:_})})}),O.delete("/:sessionId/goal",async(N)=>{let T=await Z(N.req.param("sessionId"),N.req.query("projectPath")),V=t(T),U=await(await Q(T)).clearGoal();if(U)z.publish(V,"goal.cleared",{});return N.json({cleared:U})}),O.delete("/:sessionId",async(N)=>{let T=N.req.param("sessionId"),V=N.req.query("projectPath");try{let G=await r(T,V),U=F(G),_=R.get(U),A=S.get(U),p=_?.taskWorktree??await E.findSessionTaskWorktree(G.sessionId,G.projectPath),w;if(_?.currentRunId){let X=a(_.currentRunId);if(X)qO(X),await X.completion,w=X.id}if(A)await A.clearGoal().catch((X)=>{q.warn("[SessionRoutes] Failed to clear session goal:",X)});if(await E.deleteSession(G.sessionId,G.projectPath),w)cx(w);if(R.delete(U),$.delete(U),j.delete(U),J.delete(U),A){if(await A.dispose(),S.delete(U),S.size===0)await xO.getInstance().disconnectAll()}if(p)try{await GO.restoreSession(p),await GO.exit({sessionId:G.sessionId,action:"remove",discardChanges:!0})}catch(X){q.warn(`[SessionRoutes] Failed to remove deleted task worktree ${G.sessionId}:`,X)}return N.json({success:!0})}catch(G){if(q.error("[SessionRoutes] Failed to delete session:",G),G instanceof f||G instanceof C||G instanceof i)throw G;throw new d("Failed to delete session")}}),O.get("/:sessionId/message",async(N)=>{let T=N.req.param("sessionId");try{let V=await r(T,N.req.query("projectPath")),G=R.get(F(V)),U=G?.messages?G.messages:await E.loadSession(V.sessionId,V.projectPath);return N.json(U)}catch(V){if(q.error("[SessionRoutes] Failed to get messages:",V),V instanceof f||V instanceof C||V instanceof i)throw V;throw new d("Failed to get messages")}}),O.get("/:sessionId/events",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=await y(V);return Fx(N,async(U)=>{let A,p,w=!1,X=()=>{if(p!==void 0)clearInterval(p),p=void 0;A?.(),A=void 0},b=()=>{if(w)return;w=!0,X()},h=new Set;U.onAbort(b),A=z.subscribe((m)=>{if(m.sessionId!==V.sessionId||m.projectPath!==V.projectPath)return;let l=m.properties.requestId;if((m.type==="permission.asked"||m.type==="question.required")&&typeof l==="string"){if(h.has(l))return;h.add(l)}U.writeSSE({data:JSON.stringify({type:m.type,properties:{...m.properties,sessionId:m.sessionId,projectPath:m.projectPath}})}).catch(b)});try{if(U.aborted||w)return;if(await U.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:V.sessionId,projectPath:V.projectPath,timestamp:Date.now()}})}).catch((P)=>{throw b(),P}),U.aborted||w)return;let l=a(G.currentRunId)?.pendingPermission;if(l){h.add(l.permissionId);let P=mS(l,!0);await U.writeSSE({data:JSON.stringify({type:P.type,properties:{...P.properties,sessionId:V.sessionId,projectPath:V.projectPath}})})}K(G).catch((P)=>{q.error(`[SessionRoutes] Failed to resume pending input for ${T}:`,P)}),p=setInterval(()=>{if(!U.aborted)U.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(b)},15000);while(!U.aborted&&!w)await new Promise((P)=>setTimeout(P,1000))}finally{b()}})}),O.post("/:sessionId/message",async(N)=>{let T=N.req.param("sessionId"),V=await N.req.json(),G=c(kx,V);if(!G.success)throw new f("Invalid message format");let{content:U,attachments:_,permissionMode:A,projectPath:p}=G.data,w=A||"default",X=KS(U,_),b=await Z(T,p??N.req.query("projectPath")),h=t(b);return Y(h).runExclusive(async()=>{let m=a(b.currentRunId);if(VO(m)){let o=await(await Q(b)).enqueueSteering(X,{allowBeforeTurn:!0});if(!o.accepted)return N.json({status:"rejected",reason:o.reason??"turn_unavailable"},409);let CO=o.messageId??UO(12),xS=o.queued;z.publish(h,"message.created",{messageId:CO,role:"user",content:uO(X)});let Vx=o.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(z.publish(h,Vx,{runId:m.id,messageId:CO,queued:xS}),o.delivery==="next_turn"&&m.status!=="running"&&m.status!=="waiting_permission")K(b).catch((Jx)=>{q.error(`[SessionRoutes] Failed to wake queued follow-up for ${T}:`,Jx)});if(o.delivery==="next_turn")m.pendingFollowUpRequested=!0;return N.json({runId:m.id,messageId:CO,status:o.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:xS},202)}let l=await Q(b),P=await l.prepareInputTurn(X);if(!P.accepted)return N.json({status:"rejected",reason:P.reason},P.reason==="queue_full"?429:409);let e=D(b,X,w,{preparedInputTurn:P,...b.taskIsolation?{taskRuntime:l}:{}});return await e.taskAdmissionUpdate,N.json({runId:e.id,messageId:P.messageId,status:e.status==="queued"?"queued":"running",queuePosition:e.taskQueuePosition,queueDepth:e.taskQueueDepth,maxConcurrentTasks:e.taskConcurrencyLimit},202)})}),O.post("/:sessionId/abort",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(G?.currentRunId){let U=a(G.currentRunId);if(U)qO(U),await U.completion}return N.json({success:!0})}),O.get("/:sessionId/status",async(N)=>{let T=N.req.param("sessionId"),V=await r(T,N.req.query("projectPath")),G=R.get(F(V));if(!G?.currentRunId)return N.json({sessionId:T,projectPath:V.projectPath,status:"idle"});let U=a(G.currentRunId);return N.json({sessionId:T,projectPath:V.projectPath,runId:G.currentRunId,status:U?.status||"idle"})}),{app:O,dispatchTask:B,getTaskDiff:M,recoverQueuedTasks:u}};async function lx(O,S,j,$,J,Y={}){let{abortController:Q,sessionId:y,id:Z}=O,D=Y.preparedInputTurn?.messageId??UO(12),M=Y.pendingInputOnly===!0||Y.preparedInputTurn?.mode==="pending"||Y.goalContinuationOnly===!0?void 0:UO(12),K,u=t(S),N=(T,V)=>{z.publish(u,T,V)};try{if(Y.taskAdmission){if(await Y.taskAdmission.ready,await O.taskAdmissionUpdate,Q.signal.aborted)throw Error(String(Q.signal.reason||"Task run cancelled"))}if(S.taskStatus="running",S.taskStatusReason=void 0,S.taskStartedAt=new Date().toISOString(),S.taskCompletedAt=void 0,!Y.pendingInputOnly&&!Y.goalContinuationOnly)N("message.created",{messageId:D,role:"user",content:uO(j)});if(N("session.status",{status:"running"}),M)N("message.created",{messageId:M,role:"assistant",content:""});K=await J(S);let T=K,V=await WS.createWithRuntime(T,{sessionId:y,...S.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}}),G=async(w)=>{let X=UO(12),b=300000;O.status="waiting_permission";let h=new Promise((e)=>{let SS=setTimeout(()=>{q.warn(`[SessionRoutes] Permission ${X} timed out after 300000ms`),N("permission.timeout",{requestId:X}),e({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:X,resolve:(o)=>{clearTimeout(SS),e(o)},details:w}}),m=O.pendingPermission;if(!m)throw Error("Permission request was not registered");let l=mS(m);N(l.type,l.properties),q.info(`[SessionRoutes] Permission request created: ${X}, runId: ${Z}`);let P=await h;if(q.info(`[SessionRoutes] Permission response received: ${X}, approved: ${P.approved}`),!Q.signal.aborted)O.status="running";if(O.pendingPermission===m)O.pendingPermission=void 0;return P},U={messages:[...S.messages],userId:"web-user",sessionId:y,workspaceRoot:S.projectPath,signal:Q.signal,permissionMode:$,...S.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:G}},_=()=>{if(!M)M=UO(12),N("message.created",{messageId:M,role:"assistant",content:""});return M},A=async(w)=>{switch(w.kind){case"content_delta":N("message.delta",{messageId:_(),delta:w.delta});break;case"thinking_delta":N("thinking.delta",{delta:w.delta});break;case"tool_start":if("function"in w.toolCall)N("tool.start",{messageId:_(),toolName:w.toolCall.function.name,toolCallId:w.toolCall.id,arguments:w.toolCall.function.arguments,toolKind:w.toolKind});break;case"tool_result":if("function"in w.toolCall)N("tool.result",{messageId:_(),toolName:w.toolCall.function.name,toolCallId:w.toolCall.id,success:w.result.success,summary:w.result.metadata?.summary,output:dO(lO(w.toolCall.function.name,w.result)),metadata:CS(w.result.metadata)});break;case"token_usage":N("token.usage",{...w.usage});break;case"turn_start":N("turn.started",{turn:w.turn,maxTurns:w.maxTurns});break;case"steering_applied":N("steering.applied",{runId:Z,messageIds:w.messageIds,count:w.count,recovered:w.recovered,delivery:w.delivery,queued:T.getPendingSteeringCount()});break;case"follow_up_started":{if(M)N("message.complete",{messageId:M}),M=void 0;for(let X of w.messages){if(!X.recovered||X.persisted)continue;N("message.created",{messageId:X.id,role:"user",content:uO(X.content),recovered:!0})}N("follow_up.started",{runId:Z,queued:w.queued,recovered:w.recovered}),_();break}case"goal_updated":N("goal.updated",{goal:w.goal});break;case"goal_continuation_started":N("goal.continuation.started",{goal:w.goal,continuation:w.continuation}),_();break;case"compaction":N(w.phase==="start"?"compaction.started":"compaction.completed",{});break;case"model_fallback":N("model.fallback",{});break;case"task_update":N("task.updated",{tasks:w.tasks});break;default:break}},p=await gO(V.chatStream(j,U,{stream:!0,pendingInputOnly:Y.pendingInputOnly,preparedInputTurn:Y.preparedInputTurn,goalContinuationOnly:Y.goalContinuationOnly,taskAdmission:Y.taskAdmission}),A);if(!p.success)throw Error(p.error?.message??"Agent run failed");for(let w=0;w<20;w++){let X=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,T.getPendingSteeringCount()===0){if(!X)break;continue}if(Q.signal.aborted)break;if(p=await gO(V.chatStream("",U,{stream:!0,pendingInputOnly:!0,taskAdmission:Y.taskAdmission}),A),!p.success)throw Error(p.error?.message??"Agent follow-up failed")}if(S.messages=[...U.messages],S.updatedAt=new Date,await RO(S),Q.signal.aborted||O.status==="cancelled"){S.taskStatus="cancelled",S.taskCompletedAt??=new Date().toISOString(),N("session.status",{status:"idle"});return}if(M)N("message.complete",{messageId:M});N("thinking.completed",{}),O.status="completed",S.taskStatus="completed",S.taskCompletedAt??=new Date().toISOString(),N("session.completed",{runId:Z,outputTruncated:p.metadata?.outputTruncated??!1}),N("session.status",{status:"idle"})}catch(T){if(K&&Y.preparedInputTurn)await K.finishTurn(Y.preparedInputTurn.handle).catch(()=>{return});if(Q.signal.aborted||O.status==="cancelled"){if(qO(O,"runtime-abort"),S.taskIsolation)await(K??await J(S).catch(()=>{return}))?.setTaskStatus("cancelled",String(Q.signal.reason||"Task run cancelled")).catch(()=>{return});await RO(S).catch(()=>{return}),S.taskStatus="cancelled",S.taskCompletedAt??=new Date().toISOString(),N("session.status",{status:"idle"});return}if(await RO(S).catch(()=>{return}),q.error("[SessionRoutes] Agent execution error:",T),O.status="failed",S.taskStatus="failed",S.taskStatusReason??="Agent execution failed",S.taskCompletedAt??=new Date().toISOString(),S.taskIsolation){let V=K?await K.setTaskStatus("failed",S.taskStatusReason).catch(()=>{return}):await E.updateSessionMetadata(S.id,S.projectPath,{taskStatus:"failed",taskStatusReason:S.taskStatusReason,taskCompletedAt:S.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(V)kS(S,V)}N("session.error",{error:T instanceof Error?T.message:"Unknown error"}),N("session.status",{status:"error"})}finally{if(Y.taskAdmission?.release(),Y.taskAdmission){let T=TO.getStats();N("task.status",{taskStatus:S.taskStatus,...S.taskStatusReason?{taskStatusReason:S.taskStatusReason}:{},...S.taskStartedAt?{taskStartedAt:S.taskStartedAt}:{},...S.taskCompletedAt?{taskCompletedAt:S.taskCompletedAt}:{},...S.taskDiffStat?{taskDiffStat:S.taskDiffStat}:{},taskQueueDepth:T.queued,taskConcurrencyLimit:T.maxConcurrent,taskInFlight:T.inFlight,updatedAt:new Date().toISOString()})}vx(O)}}function PS(O,S,j){q.info(`[SessionRoutes] Looking for permission ${S} in session ${O.sessionId}`),q.info(`[SessionRoutes] Active runs: ${OO.size}`);for(let[$,J]of OO.entries())if(q.info(`[SessionRoutes] Checking run ${$}: sessionId=${J.sessionId}, projectPath=${J.projectPath}, pendingPermission=${J.pendingPermission?.permissionId}`),J.sessionId===O.sessionId&&J.projectPath===O.projectPath&&J.pendingPermission?.permissionId===S)return J.pendingPermission.resolve(j),q.info(`[SessionRoutes] Permission ${S} responded, runId: ${J.id}`),!0;return q.error(`[SessionRoutes] Permission not found: ${S}`),!1}var aO=L("Service"),ax=x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(W(["once","session","project"])),targetMode:x.Optional(W(["default","autoEdit","plan","yolo"])),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))}),RS=()=>{let O=new dx;return O.post("/:permissionId",async(S)=>{let j=S.req.param("permissionId"),$=S.req.query("sessionId"),J=S.req.query("projectPath");aO.info(`[PermissionRoutes] Received permission response: permissionId=${j}, sessionId=${$}`);try{let Y=await S.req.json(),Q=c(ax,Y);if(!Q.success)throw new f("Invalid permission response format");let{approved:y,remember:Z,scope:D,targetMode:B,feedback:M,answers:K}=Q.data;if(!$)throw new f("sessionId query parameter is required");let u=await r($,J);if(!PS(u,j,{approved:y,reason:M,scope:D,targetMode:B,feedback:M,answers:K}))throw new C("Permission request",j);return aO.info(`[PermissionRoutes] Permission ${j} ${y?"approved":"denied"}`),S.json({success:!0,approved:y,remember:Z})}catch(Y){if(aO.error("[PermissionRoutes] Failed to respond to permission:",Y),Y instanceof f||Y instanceof i||Y instanceof C||Y instanceof I)throw Y;throw Y}}),O};import{Hono as ox}from"hono";var IS=L("Service"),cS=()=>{let O=new ox;return O.get("/",async(S)=>{try{let j=await gS();return S.json(j)}catch(j){return IS.error("[ProviderRoutes] Failed to list providers:",j),S.json([])}}),O.get("/:provider/models",async(S)=>{let j=S.req.param("provider");try{let $=await vS(j);return S.json($)}catch($){return IS.error("[ProviderRoutes] Failed to list models:",$),S.json([])}}),O.put("/:provider/credential",async(S)=>{let j=S.req.param("provider"),$=await S.req.json();if(!$.apiKey?.trim())throw new f("apiKey is required");return await jO().setApiKey(j,$.apiKey.trim()),S.json({success:!0})}),O.delete("/:provider/credential",async(S)=>{return await jO().clearCredential(S.req.param("provider")),S.json({success:!0})}),O};import{Hono as ix}from"hono";import*as $O from"node:fs/promises";import{homedir as nx}from"node:os";import*as LO from"node:path";var JO=L("Service"),oO=LO.join(nx(),".blade","skills-config.json");async function uS(){try{let O=await $O.readFile(oO,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function rx(O){await $O.mkdir(LO.dirname(oO),{recursive:!0}),await $O.writeFile(oO,JSON.stringify(O,null,2))}async function ex(O,S){let j=await uS();if(S)j.disabled=j.disabled.filter(($)=>$!==O);else if(!j.disabled.includes(O))j.disabled.push(O);await rx(j)}var ZO=null,sx=300000;async function O0(){if(ZO&&Date.now()-ZO.timestamp<sx)return ZO.data;try{let O=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!O.ok)return JO.warn(`GitHub API returned ${O.status}`),ZO?.data||[];let S=await O.json(),j=[];for(let $ of S){if($.type!=="dir")continue;let J=`Official ${$.name} skill`;try{let Y=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${$.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(Y.ok){let y=(await Y.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(y)J=y[1].trim().slice(0,100)}}catch{}j.push({name:$.name,description:J,tag:"Official",author:"Anthropic"})}return ZO={data:j,timestamp:Date.now()},j}catch(O){return JO.warn("Failed to fetch skills catalog from GitHub:",O),ZO?.data||[]}}var lS=()=>{let O=new ix;return O.get("/",async(S)=>{try{let j=EO();await j.initialize();let $=j.getAll(),J=await uS(),Y=$.map((Q)=>({id:Q.name,name:Q.name,enabled:!J.disabled.includes(Q.name),description:Q.description||"",version:Q.version||"1.0.0",provider:"Local",location:Q.source==="builtin"?"Built-in":Q.basePath,capabilities:["prompts"],allowedTools:Q.allowedTools||[]}));return S.json(Y)}catch(j){return JO.error("[SkillsRoutes] Failed to get skills:",j),S.json([])}}),O.post("/:name/toggle",async(S)=>{try{let j=S.req.param("name"),$=await S.req.json();return await ex(j,$.enabled),S.json({success:!0,enabled:$.enabled})}catch(j){return JO.error("[SkillsRoutes] Failed to toggle skill:",j),S.json({success:!1,error:j.message},500)}}),O.delete("/:name",async(S)=>{try{let j=S.req.param("name"),$=`${process.env.HOME}/.blade/skills/${j}`;return await $O.rm($,{recursive:!0,force:!0}),await EO().refresh(),S.json({success:!0})}catch(j){return JO.error("[SkillsRoutes] Failed to uninstall skill:",j),S.json({success:!1,error:j.message},500)}}),O.post("/install",async(S)=>{try{let j=await S.req.json(),$=tS(),J=EO(),Y=!1;if(j.source==="catalog"&&j.name){if(Y=await $.installOfficialSkill(j.name),!Y)return S.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(j.source==="repo"&&j.url){if(Y=await $.installFromRepo(j.url,j.name),!Y)return S.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(j.source==="local"&&j.path){if(Y=await $.installFromLocal(j.path,j.name),!Y)return S.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return S.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await J.refresh(),S.json({success:!0})}catch(j){return JO.error("[SkillsRoutes] Failed to install skill:",j),S.json({success:!1,error:j.message},500)}}),O.get("/catalog",async(S)=>{try{let j=await O0();return S.json(j)}catch(j){return JO.error("[SkillsRoutes] Failed to get catalog:",j),S.json([])}}),O};import S0 from"fast-glob";import{Hono as x0}from"hono";import{execSync as j0}from"node:child_process";import{readdir as $0}from"node:fs/promises";import WO from"node:path";var DO=L("Service"),N0=(O)=>{try{return j0("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},V0=[...FO.map((O)=>`${O}/**`),...FO,...iO.map((O)=>`**/${O}`)],J0=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),oS=()=>{let O=new x0;return O.get("/commands",async(S)=>{try{let j=S.req.query("q")||"",$=aS(j).filter((J)=>!J0.has(J.command));return S.json($)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get command suggestions:",j),S.json([])}}),O.get("/files",async(S)=>{try{let j=S.req.query("q")||"",$=S.get("directory")||k(),J=Math.min(Number(S.req.query("limit"))||100,1000),Q=(await S0("**/*",{cwd:$,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:V0})).map((D)=>D.replace(/\\/g,"/"));if(!j)return S.json(Q.slice(0,J));let y=j.toLowerCase(),Z=Q.filter((D)=>D.toLowerCase().includes(y)).slice(0,J);return S.json(Z)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file suggestions:",j),S.json([])}}),O.get("/files/tree",async(S)=>{try{let j=S.get("directory")||k(),$=S.req.query("path")||"",J=$?WO.join(j,$):j,Q=(await $0(J,{withFileTypes:!0})).map((D)=>({name:D.name,path:$?`${$}/${D.name}`:D.name,type:D.isDirectory()?"dir":"file"}));Q.sort((D,B)=>{if(D.type!==B.type)return D.type==="dir"?-1:1;return D.name.localeCompare(B.name)});let y=new Set(FO),Z=Q.filter((D)=>{let B=D.name;if(B.startsWith("."))return!1;if(y.has(B))return!1;for(let M of iO)if(B.match(new RegExp(M.replace("*",".*"))))return!1;return!0});return S.json(Z)}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file tree:",j),S.json([])}}),O.get("/files/content",async(S)=>{try{let j=S.req.query("path");if(!j)return S.json({error:"Missing file path"},400);let $=S.get("directory")||k(),J=WO.resolve($,j),Y=WO.relative($,J);if(Y.startsWith("..")||WO.isAbsolute(Y))return S.json({error:"Invalid file path"},400);let Q=dS(),y=await Q.stat(J);if(!y?.isFile)return S.json({error:"File not found"},404);let Z=200000,D=await Q.readTextFile(J),B=D.length>Z;return S.json({path:j,content:B?D.slice(0,Z):D,truncated:B,size:y.size})}catch(j){return DO.error("[SuggestionsRoutes] Failed to get file content:",j),S.json({error:"Failed to read file"},500)}}),O.get("/git-info",async(S)=>{try{let j=S.get("directory")||k(),$=N0(j);return S.json({branch:$})}catch(j){return DO.error("[SuggestionsRoutes] Failed to get git info:",j),S.json({branch:null})}}),O};import{Hono as Y0}from"hono";var nO=L("Service"),iS=(O)=>{let S=new Y0;return S.onError((j,$)=>{if(j instanceof I)return $.json(j.toObject(),j.statusCode);return nO.error("[TaskRoutes] Unhandled route error:",j),$.json(new d("Failed to dispatch task").toObject(),500)}),S.post("/",async(j)=>{let $;try{$=await j.req.json()}catch{throw new f("Invalid request body")}let J=c(fS,$);if(!J.success)throw new f("Invalid task request");try{let Y=await O.dispatchTask({prompt:J.data.prompt,title:J.data.title,sourceProjectPath:J.data.projectPath||j.get("directory")||k(),isolation:J.data.isolation,permissionMode:J.data.permissionMode,attachments:J.data.attachments});return j.json(BS.parse(Y),202)}catch(Y){if(Y instanceof f||Y instanceof g||Y instanceof _O)throw Y;throw nO.error("[TaskRoutes] Failed to dispatch task:",Y),new d("Failed to dispatch task")}}),S.get("/:sessionId/diff",async(j)=>{try{let $=await O.getTaskDiff(j.req.param("sessionId"),j.req.query("projectPath"));return j.json(_S.parse($))}catch($){if($ instanceof f||$ instanceof C||$ instanceof g)throw $;throw nO.error("[TaskRoutes] Failed to load task diff:",$),new d("Failed to load task diff")}}),S};import{Hono as Q0}from"hono";var NO=L("Service"),AO=new Map,nS=2097152,rS=65536;function eS(){return typeof globalThis.Bun<"u"}async function T0(O,S,j){if(eS()){let{spawn:Y}=await import("bun-pty"),Q=Y(O,S,{name:"xterm-256color",cwd:j.cwd,env:j.env});return{pid:Q.pid,write:(y)=>Q.write(y),resize:(y,Z)=>Q.resize(y,Z),kill:()=>Q.kill(),onData:(y)=>Q.onData(y),onExit:(y)=>Q.onExit(y)}}let J=(await import("node-pty")).spawn(O,S,{name:"xterm-256color",cwd:j.cwd,env:j.env,cols:80,rows:24});return{pid:J.pid,write:(Y)=>J.write(Y),resize:(Y,Q)=>J.resize(Y,Q),kill:()=>J.kill(),onData:(Y)=>{J.onData(Y)},onExit:(Y)=>{J.onExit(Y)}}}var sO=void 0,eO;if(eS())try{let{createBunWebSocket:O}=await import("hono/bun"),S=O();eO=S.upgradeWebSocket,sO=S.websocket}catch(O){NO.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function sS(O,S){let j=`term-${Date.now()}`;NO.info(`[Terminal] New connection: ${j}, cwd: ${O}`);let $=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",J=$.endsWith("sh")?["-l"]:[],Y=await T0($,J,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),Q={id:j,process:Y,cwd:O,buffer:"",subscribers:new Set};if(AO.set(j,Q),Q.subscribers.add(S),Y.onData((y)=>{let Z=!1;for(let D of Q.subscribers)try{D.send(y),Z=!0}catch{Q.subscribers.delete(D)}if(Z)return;if(Q.buffer+=y,Q.buffer.length>nS)Q.buffer=Q.buffer.slice(-nS)}),Y.onExit(({exitCode:y})=>{NO.info(`[Terminal] Process exited: ${j}, code: ${y}`);for(let Z of Q.subscribers)try{Z.close()}catch{}AO.delete(j)}),Q.buffer){let y=Q.buffer;Q.buffer="";for(let Z=0;Z<y.length;Z+=rS)S.send(y.slice(Z,Z+rS))}return{session:Q,cleanup:()=>{if(NO.info(`[Terminal] Connection closed: ${j}`),Q.subscribers.delete(S),Q.subscribers.size===0){try{Q.process.kill()}catch{}AO.delete(j)}}}}function Ox(O,S){O.on("connection",async(j,$)=>{let J=new URL($.url||"/",`http://${$.headers.host}`);if(!J.pathname.endsWith("/terminal/ws")){j.close();return}let Y=J.searchParams.get("cwd")||S()||k();try{let{session:Q,cleanup:y}=await sS(Y,{send:(Z)=>j.send(Z),close:()=>j.close()});j.on("message",(Z)=>{try{Q.process.write(String(Z))}catch(D){NO.error("[Terminal] Failed to write to PTY:",D)}}),j.on("close",y),j.on("error",y)}catch(Q){NO.error("[Terminal] Failed to spawn PTY:",Q),j.close()}})}var Sx=()=>{let O=new Q0;if(O.get("/status",(S)=>{let j=Array.from(AO.values()).map(($)=>({id:$.id,cwd:$.cwd}));return S.json({active:j.length,terminals:j})}),O.post("/kill/:terminalId",(S)=>{let j=S.req.param("terminalId"),$=AO.get(j);if($){try{$.process.kill()}catch{}for(let J of $.subscribers)J.close();return AO.delete(j),S.json({success:!0})}return S.json({success:!1,error:"Terminal not found"},404)}),eO)O.get("/ws",eO((S)=>{let j=S.req.query("cwd")||S.get("directory")||k(),$;return{async onOpen(J,Y){try{$=await sS(j,{send:(Q)=>Y.send(Q),close:()=>Y.close()})}catch(Q){NO.error("[Terminal] Failed to spawn PTY:",Q),Y.close()}},onMessage(J){if(!$)return;try{$.session.process.write(String(J.data))}catch(Y){NO.error("[Terminal] Failed to write to PTY:",Y)}},onClose(){$?.cleanup()}}}));else O.get("/ws",(S)=>{return S.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};var v=L("Service"),OS=[],pO;function D0(){let O=Z0(_0(import.meta.url)),S=[YO(O,"web"),YO(k(),"dist/web"),YO(k(),"packages/cli/dist/web")];for(let j of S){let $=YO(j,"index.html");if($x($)){if(mO($,"utf-8").includes("/assets/"))return v.debug(`[Server] Found web dist at: ${j}`),j}}return null}function p0(){let O=new w0;O.onError(($,J)=>{if(v.error("[Server] Request error:",$),$ instanceof I)return J.json($.toObject(),$.statusCode);let Y=$ instanceof Error?$.message:String($);return J.json({error:{code:"INTERNAL_ERROR",message:Y}},500)}),O.use(async($,J)=>{let Y=process.env.BLADE_SERVER_PASSWORD;if(!Y)return J();let Q=$.req.path;if(Q==="/"||Q.startsWith("/assets/")||Q.endsWith(".html")||Q.endsWith(".js")||Q.endsWith(".css"))return J();let y=$.req.header("Authorization");if(!y?.startsWith("Basic "))return $.header("WWW-Authenticate",'Basic realm="Blade Server"'),$.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let Z=Buffer.from(y.slice(6),"base64").toString(),[D,B]=Z.split(":"),M=process.env.BLADE_SERVER_USERNAME??"blade";if(D!==M||B!==Y)return $.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return J()}),O.use(async($,J)=>{let Y=$.req.path==="/health"||$.req.path==="/global/health"||$.req.path.startsWith("/assets/");if(!Y)v.debug(`[Server] ${$.req.method} ${$.req.path}`);let Q=Date.now();if(await J(),!Y){let y=Date.now()-Q;v.debug(`[Server] ${$.req.method} ${$.req.path} - ${$.res.status} (${y}ms)`)}}),O.use(X0({origin($){if(!$)return;if($.startsWith("http://localhost:"))return $;if($.startsWith("http://127.0.0.1:"))return $;if($==="tauri://localhost"||$==="http://tauri.localhost")return $;if(OS.includes($))return $;return}})),O.use(async($,J)=>{let Y=$.req.query("directory")||$.req.header("x-blade-directory")||k();try{Y=decodeURIComponent(Y)}catch{}return $.set("directory",Y),J()});let S=hS();pO=S.recoverQueuedTasks,O.route("/global",VS()),O.route("/events",$S()),O.route("/sessions",S.app),O.route("/tasks",iS(S)),O.route("/configs",jS()),O.route("/permissions",RS()),O.route("/providers",cS()),O.route("/models",GS()),O.route("/suggestions",oS()),O.route("/terminal",Sx()),O.route("/mcp",JS()),O.route("/skills",lS()),O.get("/health",($)=>{return $.json({healthy:!0,version:QO()})});let j=D0();if(j)v.info(`[Server] Serving static files from ${j}`),O.get("/assets/*",($)=>{let J=YO(j,$.req.path);if(!$x(J))return $.json({error:{code:"NOT_FOUND",message:`File not found: ${$.req.path}`}},404);let Y=mO(J),Q=A0(J).toLowerCase(),Z={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[Q]||"application/octet-stream";return new Response(Y,{headers:{"Content-Type":Z,"Cache-Control":"public, max-age=31536000, immutable"}})}),O.get("/",($)=>{let J=YO(j,"index.html"),Y=mO(J,"utf-8");return $.html(Y)}),O.get("*",($)=>{let J=$.req.path;if(J.includes("."))return $.json({error:{code:"NOT_FOUND",message:`File not found: ${J}`}},404);let Y=YO(j,"index.html"),Q=mO(Y,"utf-8");return $.html(Q)});else v.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",($)=>{return $.json({message:"Blade API Server",version:QO(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),O.all("*",($)=>{return $.json({error:{code:"NOT_FOUND",message:`Route not found: ${$.req.path}`}},404)});return O}function b0(){let O=U0(),S=[];for(let j of Object.keys(O)){let $=O[j];if(!$)continue;for(let J of $){if(J.internal||J.family!=="IPv4")continue;if(J.address.startsWith("172."))continue;S.push(J.address)}}return S}function xx(){return typeof globalThis.Bun<"u"}function jx(O,S){let j=globalThis.Bun,$=(Y)=>{try{return j.serve({hostname:S.hostname,port:Y,fetch:O.fetch,idleTimeout:0,websocket:sO})}catch(Q){v.error("Failed to start Bun server:",Q);return}},J=S.port===0?$(4096)??$(0):$(S.port);if(!J)throw Error(`Failed to start Bun server on port ${S.port}`);return{url:J.url,port:J.port,hostname:J.hostname,stop:async()=>{J.stop(!0)}}}function f0(O,S){return new Promise((j,$)=>{let J=G0(async(D,B)=>{let M=new URL(D.url||"/",`http://${D.headers.host}`),K=new Headers;for(let[T,V]of Object.entries(D.headers))if(V)if(Array.isArray(V))for(let G of V)K.append(T,G);else K.set(T,V);let u;if(D.method!=="GET"&&D.method!=="HEAD")u=(await new Promise((V)=>{let G=[];D.on("data",(U)=>G.push(U)),D.on("end",()=>V(Buffer.concat(G)))})).toString();let N=new Request(M.toString(),{method:D.method,headers:K,body:u});try{let T=await O.fetch(N);if(B.statusCode=T.status,T.headers.forEach((V,G)=>{B.setHeader(G,V)}),T.body){let V=T.body.getReader(),G=async()=>{let{done:U,value:_}=await V.read();if(U){B.end();return}return B.write(_),G()};await G()}else{let V=await T.text();B.end(V)}}catch(T){v.error("[Server] Node request error:",T),B.statusCode=500,B.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),Y=new y0({noServer:!0}),Q=k();Ox(Y,()=>Q),J.on("upgrade",(D,B,M)=>{if(new URL(D.url||"/",`http://${D.headers.host}`).pathname==="/terminal/ws")Y.handleUpgrade(D,B,M,(u)=>{Y.emit("connection",u,D)});else B.destroy()});let y=(D)=>{return new Promise((B,M)=>{J.once("error",(K)=>{if(K.code==="EADDRINUSE")M(K);else M(K)}),J.listen(D,S.hostname,()=>{let K=J.address();if(K&&typeof K==="object")B(K.port);else B(D)})})};(async()=>{let D;if(S.port===0)try{D=await y(4096)}catch{D=await y(0)}else D=await y(S.port);let B=new URL(`http://${S.hostname==="0.0.0.0"?"localhost":S.hostname}:${D}`);j({url:B,port:D,hostname:S.hostname,stop:async()=>{return new Promise((M)=>{Y.close(()=>{J.close(()=>M())})})}})})().catch($)})}var Nx;((Jj)=>{let O,S;function j(){if(!S)S=p0();return S}Jj.getApp=j;function $(Q){OS=Q.cors??[];let y=j();if(xx())O=jx(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let Z=O;return pO?.().catch((D)=>{v.warn("[Server] Failed to recover queued tasks:",D)}),{url:Z.url,port:Z.port,hostname:Z.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,S=void 0,pO=void 0,v.info("[Server] Blade server stopped")}}}Jj.listen=$;async function J(Q){OS=Q.cors??[];let y=j();if(xx())O=jx(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else O=await f0(y,Q),v.info(`[Server] Blade server listening on ${O.url} (Node.js runtime)`);let Z=O;try{await pO?.()}catch(D){v.warn("[Server] Failed to recover queued tasks:",D)}return{url:Z.url,port:Z.port,hostname:Z.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,S=void 0,pO=void 0,v.info("[Server] Blade server stopped")}}}Jj.listenAsync=J;function Y(){return O!==void 0}Jj.isRunning=Y})(Nx||={});export{B0 as a,H0 as b,b0 as c,Nx as d};
|
package/dist/chunk-t9cqscfq.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ea as W}from"./chunk-ar5564sf.js";import{Gb as F,Ib as k,Lb as H}from"./chunk-1m63zddw.js";import{Tb as V}from"./chunk-kjc2aqww.js";var $=k.String({minLength:1,maxLength:128,pattern:"^[A-Za-z0-9][A-Za-z0-9_-]*$"}),Q=k.Array(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"}),{maxItems:128}),b=k.Object({description:k.String({minLength:1,maxLength:4096,pattern:".*\\S.*"}),prompt:k.String({minLength:1,maxLength:1e5,pattern:".*\\S.*"}),tools:k.Optional(Q),disallowedTools:k.Optional(Q),model:k.Optional(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"})),permissionMode:k.Optional(H(["default","acceptEdits","dontAsk","bypassPermissions","plan","ignore"])),maxTurns:k.Optional(k.Integer({minimum:1,maximum:V})),isolation:k.Optional(H(["none","worktree"]))},{additionalProperties:!1});function O(Y){let w;try{w=JSON.parse(Y)}catch{throw Error("Invalid JSON provided to --agents")}if(w===null||Array.isArray(w)||typeof w!=="object")throw Error("--agents must be a JSON object");let I=Object.entries(w);if(I.length>64)throw Error("--agents supports at most 64 definitions");return I.map(([z,Z])=>{if(!F($,z).success)throw Error(`Invalid --agents name "${z}": use letters, numbers, hyphens, or underscores`);let K=F(b,Z);if(!K.success)throw Error(`Invalid --agents definition for "${z}"`);let q=K.data;return{name:z,description:q.description.trim(),systemPrompt:q.prompt.trim(),tools:q.tools?[...new Set(q.tools.map((B)=>B.trim()))]:void 0,disallowedTools:q.disallowedTools?[...new Set(q.disallowedTools.map((B)=>B.trim()))]:void 0,model:q.model?.trim(),permissionMode:q.permissionMode===void 0?void 0:W(q.permissionMode),maxTurns:q.maxTurns,isolation:q.isolation,source:"flag"}})}
|
|
2
|
-
export{O as z};
|
package/dist/chunk-tzr992v4.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ra as a,Sa as b}from"./chunk-hqtskyc1.js";import"./chunk-zsyff0ky.js";import"./chunk-be7qz4cv.js";export{a as resolveModelConfig,b as getModelDisplayName};
|
package/dist/chunk-x8xfx9nv.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{g as a,h as b,i as c,j as d,k as e}from"./chunk-wcf80p9y.js";import"./chunk-be7qz4cv.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
|
package/dist/chunk-yewg510f.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import{Oa as Y0,Qa as x}from"./chunk-jc7k8pfn.js";import{Mb as Q0}from"./chunk-7bqkkjxf.js";import{nc as l}from"./chunk-zsyff0ky.js";import{nanoid as I0}from"nanoid";import{devtools as N0,subscribeWithSelector as R0}from"zustand/middleware";import{createStore as y0}from"zustand/vanilla";var V0={name:"ayu-dark",colors:{primary:"#ffcc66",secondary:"#bae67e",accent:"#73d0ff",success:"#bae67e",warning:"#ffcc66",error:"#ff3333",info:"#73d0ff",light:"#f0f0f0",dark:"#000000",muted:"#5c6773",highlight:"#2d323b",text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773",light:"#ffffff"},background:{primary:"#0f1419",secondary:"#14191f",dark:"#000000"},border:{light:"#2d323b",dark:"#000000"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.2)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)"}},G0={name:"dracula",colors:{primary:"#bd93f9",secondary:"#ffb86c",accent:"#ff79c6",success:"#50fa7b",warning:"#f1fa8c",error:"#ff5555",info:"#8be9fd",light:"#f8f8f2",dark:"#282a36",muted:"#6272a4",highlight:"#44475a",text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4",light:"#ffffff"},background:{primary:"#282a36",secondary:"#44475a",dark:"#21222c"},border:{light:"#44475a",dark:"#000000"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 42, 54, 0.2)",base:"0 1px 3px 0 rgba(40, 42, 54, 0.3), 0 1px 2px 0 rgba(40, 42, 54, 0.2)",lg:"0 10px 15px -3px rgba(40, 42, 54, 0.3), 0 4px 6px -2px rgba(40, 42, 54, 0.2)"}},F0={name:"monokai",colors:{primary:"#66d9ef",secondary:"#a6e22e",accent:"#f92672",success:"#a6e22e",warning:"#e6db74",error:"#f92672",info:"#66d9ef",light:"#f8f8f2",dark:"#272822",muted:"#75715e",highlight:"#3e3d32",text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e",light:"#ffffff"},background:{primary:"#272822",secondary:"#3e3d32",dark:"#1e1f1c"},border:{light:"#3e3d32",dark:"#000000"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(39, 40, 34, 0.2)",base:"0 1px 3px 0 rgba(39, 40, 34, 0.3), 0 1px 2px 0 rgba(39, 40, 34, 0.2)",lg:"0 10px 15px -3px rgba(39, 40, 34, 0.3), 0 4px 6px -2px rgba(39, 40, 34, 0.2)"}},J0={name:"nord",colors:{primary:"#88c0d0",secondary:"#81a1c1",accent:"#b48ead",success:"#a3be8c",warning:"#ebcb8b",error:"#bf616a",info:"#88c0d0",light:"#eceff4",dark:"#2e3440",muted:"#4c566a",highlight:"#434c5e",text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a",light:"#ffffff"},background:{primary:"#2e3440",secondary:"#3b4252",dark:"#242933"},border:{light:"#434c5e",dark:"#000000"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(46, 52, 64, 0.2)",base:"0 1px 3px 0 rgba(46, 52, 64, 0.3), 0 1px 2px 0 rgba(46, 52, 64, 0.2)",lg:"0 10px 15px -3px rgba(46, 52, 64, 0.3), 0 4px 6px -2px rgba(46, 52, 64, 0.2)"}},j0={name:"solarized-light",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#cb4b16",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#93a1a1",highlight:"#eee8d5",text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1",light:"#002b36"},background:{primary:"#fdf6e3",secondary:"#eee8d5",dark:"#073642"},border:{light:"#eee8d5",dark:"#073642"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(253, 246, 227, 0.2)",base:"0 1px 3px 0 rgba(253, 246, 227, 0.3), 0 1px 2px 0 rgba(253, 246, 227, 0.2)",lg:"0 10px 15px -3px rgba(253, 246, 227, 0.3), 0 4px 6px -2px rgba(253, 246, 227, 0.2)"}},U0={name:"solarized-dark",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#b58900",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#586e75",highlight:"#073642",text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75",light:"#fdf6e3"},background:{primary:"#002b36",secondary:"#073642",dark:"#001f29"},border:{light:"#073642",dark:"#000000"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 43, 54, 0.2)",base:"0 1px 3px 0 rgba(0, 43, 54, 0.3), 0 1px 2px 0 rgba(0, 43, 54, 0.2)",lg:"0 10px 15px -3px rgba(0, 43, 54, 0.3), 0 4px 6px -2px rgba(0, 43, 54, 0.2)"}},H0={name:"tokyo-night",colors:{primary:"#7aa2f7",secondary:"#7dcfff",accent:"#bb9af7",success:"#9ece6a",warning:"#e0af68",error:"#f7768e",info:"#7aa2f7",light:"#c0caf5",dark:"#1a1b26",muted:"#565f89",highlight:"#292e42",text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89",light:"#ffffff"},background:{primary:"#1a1b26",secondary:"#292e42",dark:"#16161e"},border:{light:"#292e42",dark:"#000000"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(26, 27, 38, 0.2)",base:"0 1px 3px 0 rgba(26, 27, 38, 0.3), 0 1px 2px 0 rgba(26, 27, 38, 0.2)",lg:"0 10px 15px -3px rgba(26, 27, 38, 0.3), 0 4px 6px -2px rgba(26, 27, 38, 0.2)"}},z0={name:"github",colors:{primary:"#0969da",secondary:"#8250df",accent:"#bc4c00",success:"#1a7f37",warning:"#bc4c00",error:"#d1242f",info:"#0969da",light:"#f6f8fa",dark:"#24292f",muted:"#6e7781",highlight:"#ddf4ff",text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f6f8fa",dark:"#24292f"},border:{light:"#d0d7de",dark:"#24292f"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(255, 255, 255, 0.2)",base:"0 1px 3px 0 rgba(255, 255, 255, 0.3), 0 1px 2px 0 rgba(255, 255, 255, 0.2)",lg:"0 10px 15px -3px rgba(255, 255, 255, 0.3), 0 4px 6px -2px rgba(255, 255, 255, 0.2)"}},_0={name:"gruvbox",colors:{primary:"#83a598",secondary:"#8ec07c",accent:"#d3869b",success:"#b8bb26",warning:"#fabd2f",error:"#fb4934",info:"#83a598",light:"#fbf1c7",dark:"#282828",muted:"#928374",highlight:"#3c3836",text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374",light:"#ffffff"},background:{primary:"#282828",secondary:"#3c3836",dark:"#1d2021"},border:{light:"#3c3836",dark:"#000000"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#8ec07c",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#b8bb26",default:"#ebdbb2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 40, 40, 0.2)",base:"0 1px 3px 0 rgba(40, 40, 40, 0.3), 0 1px 2px 0 rgba(40, 40, 40, 0.2)",lg:"0 10px 15px -3px rgba(40, 40, 40, 0.3), 0 4px 6px -2px rgba(40, 40, 40, 0.2)"}},K0={name:"one-dark",colors:{primary:"#61afef",secondary:"#c678dd",accent:"#e5c07b",success:"#98c379",warning:"#e5c07b",error:"#e06c75",info:"#56b6c2",light:"#abb2bf",dark:"#282c34",muted:"#5c6370",highlight:"#3e4451",text:{primary:"#abb2bf",secondary:"#c6c8d0",muted:"#5c6370",light:"#ffffff"},background:{primary:"#282c34",secondary:"#3e4451",dark:"#21252b"},border:{light:"#3e4451",dark:"#000000"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 44, 52, 0.2)",base:"0 1px 3px 0 rgba(40, 44, 52, 0.3), 0 1px 2px 0 rgba(40, 44, 52, 0.2)",lg:"0 10px 15px -3px rgba(40, 44, 52, 0.3), 0 4px 6px -2px rgba(40, 44, 52, 0.2)"}},W0={name:"catppuccin",colors:{primary:"#89b4fa",secondary:"#cba6f7",accent:"#f5c2e7",success:"#a6e3a1",warning:"#f9e2af",error:"#f38ba8",info:"#89dceb",light:"#cdd6f4",dark:"#11111b",muted:"#6c7086",highlight:"#181825",text:{primary:"#cdd6f4",secondary:"#bac2de",muted:"#6c7086",light:"#ffffff"},background:{primary:"#1e1e2e",secondary:"#181825",dark:"#11111b"},border:{light:"#181825",dark:"#000000"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#cdd6f4",operator:"#89dceb",type:"#f5c2e7",tag:"#f38ba8",attr:"#89b4fa",default:"#cdd6f4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(30, 30, 46, 0.2)",base:"0 1px 3px 0 rgba(30, 30, 46, 0.3), 0 1px 2px 0 rgba(30, 30, 46, 0.2)",lg:"0 10px 15px -3px rgba(30, 30, 46, 0.3), 0 4px 6px -2px rgba(30, 30, 46, 0.2)"}},O0={name:"rose-pine",colors:{primary:"#9ccfd8",secondary:"#c4a7e7",accent:"#f6c177",success:"#31748f",warning:"#f6c177",error:"#eb6f92",info:"#9ccfd8",light:"#e0def4",dark:"#191724",muted:"#6e6a86",highlight:"#1f1d2e",text:{primary:"#e0def4",secondary:"#cecacd",muted:"#6e6a86",light:"#ffffff"},background:{primary:"#191724",secondary:"#1f1d2e",dark:"#12101a"},border:{light:"#1f1d2e",dark:"#000000"},syntax:{comment:"#6e6a86",string:"#9ccfd8",number:"#ea9a97",keyword:"#c4a7e7",function:"#31748f",variable:"#e0def4",operator:"#f6c177",type:"#9ccfd8",tag:"#eb6f92",attr:"#f6c177",default:"#e0def4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(25, 23, 36, 0.2)",base:"0 1px 3px 0 rgba(25, 23, 36, 0.3), 0 1px 2px 0 rgba(25, 23, 36, 0.2)",lg:"0 10px 15px -3px rgba(25, 23, 36, 0.3), 0 4px 6px -2px rgba(25, 23, 36, 0.2)"}},q0={name:"kanagawa",colors:{primary:"#8ba4b0",secondary:"#a292a3",accent:"#c47fd5",success:"#76946a",warning:"#c0a36e",error:"#c34043",info:"#7e9cd8",light:"#dcd7ba",dark:"#1f1f28",muted:"#727169",highlight:"#2a2a37",text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169",light:"#ffffff"},background:{primary:"#1f1f28",secondary:"#2a2a37",dark:"#16161d"},border:{light:"#2a2a37",dark:"#000000"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#c34043",attr:"#7fb4ca",default:"#dcd7ba"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(31, 31, 40, 0.2)",base:"0 1px 3px 0 rgba(31, 31, 40, 0.3), 0 1px 2px 0 rgba(31, 31, 40, 0.2)",lg:"0 10px 15px -3px rgba(31, 31, 40, 0.3), 0 4px 6px -2px rgba(31, 31, 40, 0.2)"}},d=[{id:"ayu-dark",label:"Ayu Dark",theme:V0,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:G0,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:F0,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:J0,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:j0,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:U0,tags:["dark"]},{id:"tokyo-night",label:"Tokyo Night",theme:H0,tags:["dark","popular"]},{id:"github",label:"GitHub",theme:z0,tags:["light","minimal"]},{id:"gruvbox",label:"Gruvbox",theme:_0,tags:["dark","warm"]},{id:"one-dark",label:"One Dark",theme:K0,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:W0,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:O0,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:q0,tags:["dark","japanese"]}];var r={primary:"#0066cc",secondary:"#6c757d",accent:"#e83e8c",success:"#28a745",warning:"#ffc107",error:"#dc3545",info:"#17a2b8",light:"#f8f9fa",dark:"#343a40",muted:"#6c757d",highlight:"#fff3cd",text:{primary:"#212529",secondary:"#6c757d",muted:"#6c757d",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f8f9fa",dark:"#343a40"},border:{light:"#dee2e6",dark:"#495057"},syntax:{comment:"#6c757d",string:"#28a745",number:"#e83e8c",keyword:"#007bff",function:"#17a2b8",variable:"#495057",operator:"#ffc107",type:"#007bff",tag:"#dc3545",attr:"#ffc107",default:"#212529"}},M={name:"default",colors:r,spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)"}},w0={...M,name:"dark",colors:{...r,text:{primary:"#ffffff",secondary:"#e2e8f0",muted:"#94a3b8",light:"#000000"},background:{primary:"#1e293b",secondary:"#334155",dark:"#0f172a"},border:{light:"#475569",dark:"#64748b"},syntax:{comment:"#94a3b8",string:"#34d399",number:"#f472b6",keyword:"#60a5fa",function:"#06b6d4",variable:"#e2e8f0",operator:"#fbbf24",type:"#60a5fa",tag:"#fb7185",attr:"#fbbf24",default:"#ffffff"}}};class c{currentTheme=M;themes=new Map;constructor(){this.themes.set("default",M),this.themes.set("dark",w0);for(let X of d)this.themes.set(X.id,X.theme)}setTheme(X){let Z=this.themes.get(X);if(Z)this.currentTheme=Z;else throw Error(`Theme '${X}' not found`)}getTheme(){return this.currentTheme}getAvailableThemes(){return Array.from(this.themes.keys())}getCurrentThemeName(){return this.currentTheme.name}getThemeByName(X){return this.themes.get(X)}hasTheme(X){return this.themes.has(X)}}var i=new c;var x0={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},f=(X)=>({...x0,actions:{setInitializationStatus:(Z)=>{X((Q)=>({app:{...Q.app,initializationStatus:Z}}))},setInitializationError:(Z)=>{X((Q)=>({app:{...Q.app,initializationError:Z}}))},setActiveModal:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:Z}}))},showSessionSelector:(Z,Q="resume")=>{X((Y)=>({app:{...Y.app,activeModal:"sessionSelector",sessionSelectorData:{intent:Q,sessions:Z}}}))},showModelEditWizard:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:"modelEditWizard",modelEditorTarget:Z}}))},closeModal:()=>{X((Z)=>({app:{...Z.app,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null}}))},setTasks:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Z}}))},updateTask:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Q.app.tasks.map((Y)=>Y.id===Z.id?Z:Y)}}))},setAwaitingSecondCtrlC:(Z)=>{X((Q)=>({app:{...Q.app,awaitingSecondCtrlC:Z}}))},setThinkingModeEnabled:(Z)=>{X((Q)=>({app:{...Q.app,thinkingModeEnabled:Z}}))},toggleThinkingMode:()=>{X((Z)=>({app:{...Z.app,thinkingModeEnabled:!Z.app.thinkingModeEnabled}}))},startSubagentProgress:(Z,Q,Y)=>{X(($)=>({app:{...$.app,subagentProgress:{id:Z,type:Q,description:Y,status:"running",startTime:Date.now()}}}))},updateSubagentTool:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,currentTool:Z}}}})},completeSubagentProgress:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,status:Z?"completed":"failed",currentTool:void 0}}}}),setTimeout(()=>{X((Q)=>({app:{...Q.app,subagentProgress:null}}))},1500)}}});var P0={isProcessing:!1,abortController:null,pendingCommands:[],recoveredSteeringCount:0},b=(X,Z)=>({...P0,actions:{setProcessing:(Q)=>{X((Y)=>({command:{...Y.command,isProcessing:Q}}))},createAbortController:()=>{let Q=Z().command.abortController;if(Q&&!Q.signal.aborted)Q.abort("interrupted-by-new-command");let Y=new AbortController;return X(($)=>({command:{...$.command,abortController:Y}})),Y},getAbortController:()=>{return Z().command.abortController},clearAbortController:(Q)=>{let Y=Z().command.abortController;if(Q!==void 0&&Y!==Q)return;X(($)=>({command:{...$.command,abortController:null}}))},abort:(Q)=>{let{abortController:Y}=Z().command;if(Y&&!Y.signal.aborted)Y.abort(Q??"user-cancel");X(($)=>({command:{...$.command,isProcessing:!1,pendingCommands:[]}}))},enqueueCommand:(Q)=>{X((Y)=>({command:{...Y.command,pendingCommands:[...Y.command.pendingCommands,Q]}}))},dequeueCommand:()=>{let{pendingCommands:Q}=Z().command;if(Q.length===0)return;let[Y,...$]=Q;return X((V)=>({command:{...V.command,pendingCommands:$}})),Y},clearQueue:()=>{X((Q)=>({command:{...Q.command,pendingCommands:[]}}))},setRecoveredSteeringCount:(Q)=>{X((Y)=>({command:{...Y.command,recoveredSteeringCount:Math.max(0,Q)}}))}}});var v0={config:null},h=(X)=>({...v0,actions:{setConfig:(Z)=>{X((Q)=>({config:{...Q.config,config:Z}}))},updateConfig:(Z)=>{X((Q)=>{if(!Q.config.config)throw Error(`[ConfigSlice] Config not initialized. Cannot update: ${JSON.stringify(Z)}`);return{config:{...Q.config,config:{...Q.config.config,...Z}}}})}}});var D0={currentFocus:"main-input",previousFocus:null},p=(X)=>({...D0,actions:{setFocus:(Z)=>{X((Q)=>({focus:{...Q.focus,currentFocus:Z,previousFocus:Q.focus.currentFocus}}))},restorePreviousFocus:()=>{X((Z)=>({focus:{...Z.focus,currentFocus:Z.focus.previousFocus||"main-input",previousFocus:null}}))}}});function o(X,Z,Q,Y=0,$=0,V){let J=l(),H=V?J.models.getModel(V,X):J.models.getModels().find((W)=>W.id===X);if(!H)return 0;let U=H.cost,_=Z/1e6*U.input+Q/1e6*U.output+Y/1e6*U.cacheRead+$/1e6*U.cacheWrite;return Math.round(_*1e6)/1e6}var j={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/};function g0(X){let Z=[],Q=X.split(/\r?\n/),Y=!1,$=[],V=null,J=0,H=!1,U=[],_=[],W=!1,P=[],v=!1,O=[],F=0,G=!0;for(let w=0;w<Q.length;w++){let K=Q[w];if(W){if(K.match(j.diffEnd)){try{let q=JSON.parse(P.join(`
|
|
2
|
-
`));Z.push({type:"diff",content:"",diffData:{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine}})}catch(q){Z.push({type:"text",content:P.join(`
|
|
3
|
-
`)})}W=!1,P=[],G=!1;continue}P.push(K);continue}if(K.match(j.diffStart)){W=!0,P=[],G=!1;continue}if(Y){let q=K.match(j.codeBlock),D=K.trim()==="```";if(q&&q[1])J++,$.push(K);else if(D)if(J>0)J--,$.push(K);else{let $0=$.join(`
|
|
4
|
-
`);Z.push({type:"code",content:$0,language:V||void 0}),Y=!1,$=[],V=null,J=0,G=!1}else $.push(K);continue}let N=K.match(j.codeBlock);if(N){Y=!0,V=N[1]||null,J=0,G=!1;continue}let A=K.match(j.table),Z0=K.match(j.tableSeparator);if(A&&!H){if(w+1<Q.length){if(Q[w+1].match(j.tableSeparator)){H=!0,U=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0),_=[],G=!1;continue}}}if(H&&Z0)continue;if(H&&A){let q=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0);while(q.length<U.length)q.push("");if(q.length>U.length)q.length=U.length;_.push(q);continue}if(H&&!A){if(U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});H=!1,U=[],_=[]}let S=K.match(j.blockquote);if(S){let q=S[1].length,D=S[2]||"";if(v&&q===F)O.push(D);else{if(v)Z.push({type:"blockquote",content:O.join(`
|
|
5
|
-
`),blockquoteLevel:F,blockquoteLines:[...O]});v=!0,F=q,O=[D]}G=!1;continue}if(v)Z.push({type:"blockquote",content:O.join(`
|
|
6
|
-
`),blockquoteLevel:F,blockquoteLines:[...O]}),v=!1,O=[],F=0;let T=K.match(j.heading);if(T){Z.push({type:"heading",content:T[2],level:T[1].length}),G=!1;continue}let R=K.match(j.ulItem);if(R){Z.push({type:"list",content:R[3],listType:"ul",marker:R[2],indentation:R[1].length}),G=!1;continue}let y=K.match(j.olItem);if(y){Z.push({type:"list",content:y[3],listType:"ol",marker:y[2],indentation:y[1].length}),G=!1;continue}if(K.match(j.hr)){Z.push({type:"hr",content:""}),G=!1;continue}if(K.trim().length===0){if(!G)Z.push({type:"empty",content:""}),G=!0;continue}let g=K.match(j.commandMessage);if(g){Z.push({type:"command-message",content:g[1]}),G=!1;continue}Z.push({type:"text",content:K}),G=!1}if(Y){let w=$.join(`
|
|
7
|
-
`);Z.push({type:"code",content:w,language:V||void 0})}if(H&&U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});if(v&&O.length>0)Z.push({type:"blockquote",content:O.join(`
|
|
8
|
-
`),blockquoteLevel:F,blockquoteLines:[...O]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var E=new Map;function B0(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function E0(X){let Z=E.get(X);if(Z)return Z;let Q={state:B0(),blocks:[],pendingLine:"",finalized:!1};return E.set(X,Q),Q}function n(X){return X.endsWith("\r")?X.slice(0,-1):X}function a(X,Z){if(X.tableHeaders.length>0&&X.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:X.tableHeaders,rows:X.tableRows}});X.inTable=!1,X.tableHeaders=[],X.tableRows=[]}function k(X,Z){if(X.blockquoteLines.length>0)Z.push({type:"blockquote",content:X.blockquoteLines.join(`
|
|
9
|
-
`),blockquoteLevel:X.blockquoteLevel,blockquoteLines:[...X.blockquoteLines]});X.inBlockquote=!1,X.blockquoteLines=[],X.blockquoteLevel=0}function s(X,Z){let Q=X.codeBlockContent.join(`
|
|
10
|
-
`);Z.push({type:"code",content:Q,language:X.codeBlockLang||void 0}),X.inCodeBlock=!1,X.codeBlockContent=[],X.codeBlockLang=null,X.codeBlockDepth=0,X.lastLineEmpty=!1}function u(X,Z,Q=!0){let{state:Y,blocks:$}=Z;if(Y.pendingTableHeader!==null){if(X.match(j.tableSeparator)){Y.inTable=!0,Y.tableHeaders=Y.pendingTableHeader.slice(1,-1).split("|").map((F)=>F.trim()).filter((F)=>F.length>0),Y.tableRows=[],Y.pendingTableHeader=null,Y.lastLineEmpty=!1;return}$.push({type:"text",content:Y.pendingTableHeader}),Y.pendingTableHeader=null,Y.lastLineEmpty=!1}if(Y.inDiff){if(X.match(j.diffEnd)){try{let F=JSON.parse(Y.diffContent.join(`
|
|
11
|
-
`));$.push({type:"diff",content:"",diffData:{patch:F.patch,startLine:F.startLine,matchLine:F.matchLine}})}catch(F){$.push({type:"text",content:Y.diffContent.join(`
|
|
12
|
-
`)})}Y.inDiff=!1,Y.diffContent=[],Y.lastLineEmpty=!1;return}Y.diffContent.push(X);return}if(X.match(j.diffStart)){Y.inDiff=!0,Y.diffContent=[],Y.lastLineEmpty=!1;return}if(Y.inCodeBlock){let F=X.match(j.codeBlock),G=X.trim()==="```";if(F&&F[1])Y.codeBlockDepth++,Y.codeBlockContent.push(X);else if(G)if(Y.codeBlockDepth>0)Y.codeBlockDepth--,Y.codeBlockContent.push(X);else s(Y,$);else Y.codeBlockContent.push(X);return}let V=X.match(j.codeBlock);if(V){Y.inCodeBlock=!0,Y.codeBlockLang=V[1]||null,Y.codeBlockDepth=0,Y.lastLineEmpty=!1;return}let J=X.match(j.table),H=X.match(j.tableSeparator);if(J&&!Y.inTable){Y.pendingTableHeader=X;return}if(Y.inTable&&H)return;if(Y.inTable&&J){let F=J[1].split("|").map((G)=>G.trim()).filter((G)=>G.length>0);while(F.length<Y.tableHeaders.length)F.push("");if(F.length>Y.tableHeaders.length)F.length=Y.tableHeaders.length;Y.tableRows.push(F);return}if(Y.inTable&&!J){if(a(Y,$),Q){u(X,Z,!1);return}}let U=X.match(j.blockquote);if(U){let F=U[1].length,G=U[2]||"";if(Y.inBlockquote&&F===Y.blockquoteLevel)Y.blockquoteLines.push(G);else{if(Y.inBlockquote)k(Y,$);Y.inBlockquote=!0,Y.blockquoteLevel=F,Y.blockquoteLines=[G]}Y.lastLineEmpty=!1;return}if(Y.inBlockquote)k(Y,$);let _=X.match(j.heading);if(_){$.push({type:"heading",content:_[2],level:_[1].length}),Y.lastLineEmpty=!1;return}let W=X.match(j.ulItem);if(W){$.push({type:"list",content:W[3],listType:"ul",marker:W[2],indentation:W[1].length}),Y.lastLineEmpty=!1;return}let P=X.match(j.olItem);if(P){$.push({type:"list",content:P[3],listType:"ol",marker:P[2],indentation:P[1].length}),Y.lastLineEmpty=!1;return}if(X.match(j.hr)){$.push({type:"hr",content:""}),Y.lastLineEmpty=!1;return}if(X.trim().length===0){if(!Y.lastLineEmpty)$.push({type:"empty",content:""}),Y.lastLineEmpty=!0;return}let O=X.match(j.commandMessage);if(O){$.push({type:"command-message",content:O[1]}),Y.lastLineEmpty=!1;return}$.push({type:"text",content:X}),Y.lastLineEmpty=!1}function c0(X,Z){if(!X||!Z)return;let Q=E0(X);if(Q.finalized)return;let Y=Q.pendingLine+Z,$=Y.split(`
|
|
13
|
-
`),V=Y.endsWith(`
|
|
14
|
-
`),J=V?$:$.slice(0,-1);Q.pendingLine=V?"":$[$.length-1]??"";for(let H of J)u(n(H),Q)}function i0(X){let Z=E.get(X);if(!Z||Z.finalized)return;if(Z.pendingLine)u(n(Z.pendingLine),Z),Z.pendingLine="";if(Z.state.pendingTableHeader!==null)Z.blocks.push({type:"text",content:Z.state.pendingTableHeader}),Z.state.pendingTableHeader=null;if(Z.state.inCodeBlock)s(Z.state,Z.blocks);if(Z.state.inTable)a(Z.state,Z.blocks);if(Z.state.inBlockquote)k(Z.state,Z.blocks);if(Z.state.inDiff)Z.blocks.push({type:"text",content:Z.state.diffContent.join(`
|
|
15
|
-
`)}),Z.state.inDiff=!1,Z.state.diffContent=[];while(Z.blocks.length>0&&Z.blocks[Z.blocks.length-1].type==="empty")Z.blocks.pop();Z.finalized=!0}function l0(X){let Z=E.get(X);if(!Z||!Z.finalized)return null;return Z.blocks}function o0(X){let Z=E.get(X);if(!Z)return null;return Z.blocks}function A0(X){let Z=E.get(X);if(!Z)return null;let Q=[],Y=Z.state;if(Y.inDiff)Q.push("<<<DIFF>>>"),Q.push(...Y.diffContent);else if(Y.inCodeBlock){let $=Y.codeBlockLang?`\`\`\`${Y.codeBlockLang}`:"```";Q.push($),Q.push(...Y.codeBlockContent)}else if(Y.inTable){if(Y.tableHeaders.length>0){Q.push(`| ${Y.tableHeaders.join(" | ")} |`),Q.push(`| ${Y.tableHeaders.map(()=>"---").join(" | ")} |`);for(let $ of Y.tableRows)Q.push(`| ${$.join(" | ")} |`)}}else if(Y.inBlockquote){let $=">".repeat(Y.blockquoteLevel)+" ";for(let V of Y.blockquoteLines)Q.push($+V)}else if(Y.pendingTableHeader)Q.push(Y.pendingTableHeader);if(Z.pendingLine)Q.push(Z.pendingLine);return Q.length>0?Q:null}function n0(X){let Z=E.get(X);if(!Z)return null;let Q="text";if(Z.state.inDiff)Q="diff";else if(Z.state.inCodeBlock)Q="code";else if(Z.state.inTable||Z.state.pendingTableHeader)Q="table";let Y=A0(X);if(!Y||Y.length===0)return null;return{lines:Y,mode:Q}}function a0(X){E.delete(X)}function C(){E.clear()}var t=2000,I=[];function L0(){let X=I;return I=[],X}var X0={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:0,totalInputTokens:0,totalOutputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,turnCount:0,estimatedCostUsd:0},e={sessionId:Q0("tui"),messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,isCompacting:!1,currentCommand:null,error:null,isActive:!0,tokenUsage:{...X0},currentThinkingContent:null,thinkingExpanded:!1,clearCount:0,historyExpanded:!1,expandedMessageCount:100,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null},m=(X,Z)=>({...e,actions:{addMessage:(Q)=>{X((Y)=>({session:{...Y.session,messages:[...Y.session.messages,Q],error:null}}))},addUserMessage:(Q)=>{let Y={id:`user-${Date.now()}-${Math.random()}`,role:"user",content:Q,timestamp:Date.now()};Z().session.actions.addMessage(Y)},addAssistantMessage:(Q,Y)=>{let $={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y};Z().session.actions.addMessage($)},addAssistantMessageAndClearThinking:(Q)=>{let Y=Z().session.currentThinkingContent,$={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y||void 0};X((V)=>({session:{...V.session,messages:[...V.session.messages,$],currentThinkingContent:null,error:null}}))},addToolMessage:(Q,Y)=>{let $={id:`tool-${Date.now()}-${Math.random()}`,role:"tool",content:Q,timestamp:Date.now(),metadata:Y};Z().session.actions.addMessage($)},setCompacting:(Q)=>{X((Y)=>({session:{...Y.session,isCompacting:Q}}))},setCommand:(Q)=>{X((Y)=>({session:{...Y.session,currentCommand:Q}}))},setError:(Q)=>{X((Y)=>({session:{...Y.session,error:Q}}))},clearMessages:()=>{C(),X((Q)=>({session:{...Q.session,messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,error:null,clearCount:Q.session.clearCount+1}}))},setCompactedContext:(Q)=>{X((Y)=>({session:{...Y.session,restoredContextMessages:[...Q],restoredVisibleMessageCount:Y.session.messages.length}}))},resetSession:()=>{C(),X((Q)=>({session:{...Q.session,...e,sessionId:Q.session.sessionId,isActive:!0}}))},restoreSession:(Q,Y,$)=>{C(),X((V)=>({session:{...V.session,sessionId:Q,messages:Y,restoredContextMessages:$??null,restoredVisibleMessageCount:$?Y.length:0,error:null,isActive:!0}}))},updateTokenUsage:(Q)=>{X((Y)=>{let $=Y.session.tokenUsage,{costUsd:V,...J}=Q,H=Math.max(0,Q.inputTokens??0),U=Math.max(0,Q.outputTokens??0),_=Math.max(0,Q.cacheReadTokens??0),W=Math.max(0,Q.cacheWriteTokens??0),P=$.totalInputTokens+H,v=$.totalOutputTokens+U,O=$.cacheReadTokens+_,F=$.cacheWriteTokens+W,G=Y.config?.config,w=G?.models?.find((A)=>A.id===G.currentModelId),K=w?.model??"",N=V??o(K,Math.max(0,H-_-W),U,_,W,w?.provider);return{session:{...Y.session,tokenUsage:{...$,...J,totalInputTokens:P,totalOutputTokens:v,cacheReadTokens:O,cacheWriteTokens:F,estimatedCostUsd:$.estimatedCostUsd+Math.max(0,N)}}}})},resetContextUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...Q.session.tokenUsage,inputTokens:0,outputTokens:0,totalTokens:0}}}))},resetTokenUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...X0}}}))},setCurrentThinkingContent:(Q)=>{if(Z().session.currentThinkingContent===Q)return;X((Y)=>({session:{...Y.session,currentThinkingContent:Q}}))},appendThinkingContent:(Q)=>{X((Y)=>({session:{...Y.session,currentThinkingContent:(Y.session.currentThinkingContent||"")+Q}}))},setThinkingExpanded:(Q)=>{X((Y)=>({session:{...Y.session,thinkingExpanded:Q}}))},toggleThinkingExpanded:()=>{X((Q)=>({session:{...Q.session,thinkingExpanded:!Q.session.thinkingExpanded}}))},setHistoryExpanded:(Q)=>{X((Y)=>({session:{...Y.session,historyExpanded:Q}}))},toggleHistoryExpanded:()=>{X((Q)=>({session:{...Q.session,historyExpanded:!Q.session.historyExpanded}}))},setExpandedMessageCount:(Q)=>{X((Y)=>({session:{...Y.session,expandedMessageCount:Q}}))},incrementClearCount:()=>{X((Q)=>({session:{...Q.session,clearCount:Q.session.clearCount+1}}))},startStreamingAssistantMessage:()=>{let Q=`assistant-${Date.now()}-${Math.random()}`,Y={id:Q,role:"assistant",content:"",timestamp:Date.now()};return I=[],X(($)=>({session:{...$.session,messages:[...$.session.messages,Y],currentStreamingMessageId:Q,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,error:null}})),Q},appendAssistantContent:(Q)=>{let Y=Z().session.currentStreamingMessageId,$=Y??`assistant-${Date.now()}-${Math.random()}`;return I.push(Q),X((V)=>{let J=(w)=>w.endsWith("\r")?w.slice(0,-1):w,H=Y?V.session.currentStreamingLines:[],U=Y?V.session.currentStreamingTail:"",_=Y?V.session.currentStreamingLineCount:0,W=Y?V.session.currentStreamingVersion:0,v=(U+Q).split(`
|
|
16
|
-
`),O=v.slice(0,-1).map(J),F=J(v[v.length-1]??""),G=H;if(O.length>0){if(G=[...H,...O],G.length>t){let w=G.length-t;G=G.slice(w)}}return{session:{...V.session,currentStreamingMessageId:$,currentStreamingLines:G,currentStreamingTail:F,currentStreamingLineCount:_+O.length,currentStreamingVersion:W+1,error:null}}}),$},finalizeStreamingMessage:(Q,Y)=>{let $=L0();X((V)=>{let J=V.session.currentStreamingMessageId,U=$.join("")+(Q||""),_=(V.session.currentThinkingContent||"")+(Y||"");if(U.length>0){let W={id:J||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:U,timestamp:Date.now(),thinkingContent:_||void 0};return{session:{...V.session,messages:[...V.session.messages,W],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:W.id}}}return{session:{...V.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{X((Q)=>({session:{...Q.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{I=[],X((Q)=>({session:{...Q.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))}}});var C0=y0()(N0(R0((...X)=>({session:m(...X),app:f(...X),config:h(...X),focus:p(...X),command:b(...X)})),{name:"BladeStore",enabled:!0})),z=()=>C0.getState(),K1=()=>z().session.actions,W1=()=>z().app.actions,O1=()=>z().session.messages,B=()=>z().config.config,L=null;async function q1(){if(B()!==null)return;if(L)return L;return L=(async()=>{try{let Q=await Y0.getInstance().initialize();z().config.actions.setConfig(Q)}catch(Z){throw L=null,Error(`[FAIL] Store 未初始化且无法自动初始化
|
|
17
|
-
|
|
18
|
-
`+`原因: ${Z instanceof Error?Z.message:"未知错误"}
|
|
19
|
-
|
|
20
|
-
`+`请确保:
|
|
21
|
-
`+`1. 配置文件格式正确 (~/.blade/config.json)
|
|
22
|
-
`+`2. 运行 blade 进行首次配置
|
|
23
|
-
`+"3. 配置文件权限正确")}finally{L=null}})(),L}var w1=()=>z().config.config?.models??[],x1=()=>{let X=B();if(!X)return;let Z=X.currentModelId;return X.models.find((Y)=>Y.id===Z)??X.models[0]},P1=(X)=>{let Z=B();if(!Z)return;return Z.models.find((Q)=>Q.id===X)},v1=()=>z().config.config?.mcpServers??{},D1=()=>z().app.thinkingModeEnabled,B1=()=>({setPermissionMode:async(X)=>{z().config.actions.updateConfig({permissionMode:X})},setTheme:async(X,Z={})=>{try{i.setTheme(X)}catch{return}z().config.actions.updateConfig({theme:X}),await x().save({theme:X},{scope:"global",...Z})},setLanguage:async(X,Z={})=>{z().config.actions.updateConfig({language:X}),await x().save({language:X},{scope:"global",...Z})},setDebug:async(X,Z={})=>{z().config.actions.updateConfig({debug:X}),await x().save({debug:X},{scope:"global",...Z})},setTemperature:async(X,Z={})=>{z().config.actions.updateConfig({temperature:X}),await x().save({temperature:X},{scope:"global",...Z})},updateConfig:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y={...Q};z().config.actions.updateConfig(X);try{await x().save(X,Z)}catch($){throw z().config.actions.setConfig(Y),$}},flush:async()=>{await x().flush()},appendPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendPermissionRule(X,Z)},appendLocalPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendLocalPermissionRule(X,Z)},setCurrentModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(!Q.models.find(($)=>$.id===X))throw Error(`Model not found: ${X}`);z().config.actions.updateConfig({currentModelId:X}),await x().save({currentModelId:X},{scope:"global",...Z})},addModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y="id"in X?X:{id:I0(),...X};if(Q.models.find((H)=>H.provider===Y.provider&&H.model===Y.model))throw Error(`Model already configured: ${Y.provider}/${Y.model}`);let J={models:[...Q.models,Y]};if(Q.models.length===0)J.currentModelId=Y.id;return z().config.actions.updateConfig(J),await x().save(J,{scope:"global",...Z}),Y},updateModel:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let $=Y.models.findIndex((J)=>J.id===X);if($===-1)throw Error(`Model not found: ${X}`);let V=[...Y.models];V[$]={...V[$],...Z},z().config.actions.updateConfig({models:V}),await x().save({models:V},{scope:"global",...Q})},removeModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(Q.models.length===1)throw Error("Cannot remove the only model");let Y=Q.models.filter((V)=>V.id!==X),$={models:Y};if(Q.currentModelId===X)$.currentModelId=Y[0].id;z().config.actions.updateConfig($),await x().save($,{scope:"global",...Z})},addMcpServer:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let V={...Y.mcpServers??{},[X]:Z};z().config.actions.updateConfig({mcpServers:V}),await x().save({mcpServers:V},{scope:"project",...Q})},removeMcpServer:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let $={...Q.mcpServers??{}};delete $[X],z().config.actions.updateConfig({mcpServers:$}),await x().save({mcpServers:$},{scope:"project",...Z})}});
|
|
24
|
-
export{d as ka,i as la,j as ma,g0 as na,c0 as oa,i0 as pa,l0 as qa,o0 as ra,n0 as sa,a0 as ta,C0 as ua,z as va,K1 as wa,W1 as xa,O1 as ya,B as za,q1 as Aa,w1 as Ba,x1 as Ca,P1 as Da,v1 as Ea,D1 as Fa,B1 as Ga};
|
package/dist/chunk-zjks0ncc.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{z as A}from"./chunk-t9cqscfq.js";import{va as C}from"./chunk-yewg510f.js";import{Ha as f,Ia as T,Ja as M,Ka as w,La as N,Oa as k,Pa as b}from"./chunk-jc7k8pfn.js";import{Gb as S,Ib as n,Lb as m}from"./chunk-1m63zddw.js";import{Ob as O,Rb as c,Tb as y}from"./chunk-kjc2aqww.js";import{bc as h}from"./chunk-eyypmc9m.js";import{promises as I}from"node:fs";import R from"node:path";var U=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],x=new Set([...Object.keys(f),...U]),p=n.Number({exclusiveMinimum:0}),l=n.String({minLength:1}),r=n.Array(n.String()),B=n.Object({currentModelId:n.Optional(n.String()),models:n.Optional(n.Array(n.Object({id:l,displayName:n.Optional(l),provider:l,model:l,overrides:n.Optional(n.Object({baseUrl:n.Optional(n.String()),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(p),timeout:n.Optional(p),apiVersion:n.Optional(n.String()),customHeaders:n.Optional(n.Record(n.String(),n.String())),maxRetries:n.Optional(n.Integer({minimum:0})),enablePromptCaching:n.Optional(n.Boolean())})),fallbackModels:n.Optional(n.Array(n.Object({provider:l,model:l})))}))),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(p),stream:n.Optional(n.Boolean()),topP:n.Optional(n.Number()),topK:n.Optional(n.Number()),timeout:n.Optional(p),theme:n.Optional(n.String()),uiTheme:n.Optional(m(["light","dark","system"])),language:n.Optional(n.String()),fontSize:n.Optional(p),autoSaveSessions:n.Optional(n.Boolean()),notifyBuild:n.Optional(n.Boolean()),notifyErrors:n.Optional(n.Boolean()),notifySounds:n.Optional(n.Boolean()),privacyTelemetry:n.Optional(n.Boolean()),privacyCrash:n.Optional(n.Boolean()),debug:n.Optional(n.Union([n.Boolean(),n.String()])),mcpEnabled:n.Optional(n.Boolean()),mcpServers:n.Optional(n.Record(n.String(),n.Record(n.String(),n.Unknown()))),permissionMode:n.Optional(n.Enum(c)),maxTurns:n.Optional(n.Integer({minimum:-1,maximum:y})),maxConcurrentTasks:n.Optional(n.Integer({minimum:T,maximum:M})),maxQueuedTasks:n.Optional(n.Integer({minimum:w,maximum:N})),systemPrompt:n.Optional(n.String()),appendSystemPrompt:n.Optional(n.String()),initialMessage:n.Optional(n.String()),resumeSessionId:n.Optional(n.String()),forkSession:n.Optional(n.Boolean()),allowedTools:n.Optional(n.Array(l)),disallowedTools:n.Optional(n.Array(l)),mcpConfigPaths:n.Optional(n.Array(l)),strictMcpConfig:n.Optional(n.Boolean()),model:n.Optional(l),addDirs:n.Optional(n.Array(l)),outputFormat:n.Optional(m(["text","json","stream-json","jsonl"])),inputFormat:n.Optional(m(["text","stream-json"])),print:n.Optional(n.Boolean()),includePartialMessages:n.Optional(n.Boolean()),replayUserMessages:n.Optional(n.Boolean()),agentsConfig:n.Optional(n.String()),settingSources:n.Optional(n.String()),permissions:n.Optional(n.Object({allow:n.Optional(r),ask:n.Optional(r),deny:n.Optional(r)})),env:n.Optional(n.Record(n.String(),n.String())),hooks:n.Optional(n.Record(n.String(),n.Unknown())),disableAllHooks:n.Optional(n.Boolean())}),_=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"],["maxConcurrentTasks","maxConcurrentTasks"],["maxQueuedTasks","maxQueuedTasks"]];function u(o,e){let t;try{t=JSON.parse(o)}catch(i){let a=i instanceof Error?`: ${i.message}`:"";throw Error(`Invalid JSON provided to --settings (${e})${a}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let i of Object.keys(t))if(!x.has(i))throw Error(`Unknown --settings field: ${i}`);let s=S(B,t);if(!s.success){let i=s.error.issues.map((a)=>`${a.path.join(".")||"settings"}: ${a.message}`).join("; ");throw Error(`Invalid --settings value: ${i}`)}return s.data}async function P(o){if(o===void 0)return;let e=o.trim();if(!e)throw Error("--settings requires a JSON object or file path");if(e.startsWith("{"))return u(e,"inline JSON");let t=R.resolve(O(),e),s;try{s=await I.readFile(t,"utf8")}catch(i){let a=i instanceof Error?`: ${i.message}`:"";throw Error(`Unable to read --settings file ${t}${a}`)}return u(s,t)}function E(o,e){if(!e)return;let t=e;for(let[s,i]of _){if(s==="permissionMode"&&o.yolo===!0)continue;if(o[i]===void 0&&t[s]!==void 0)o[i]=t[s]}}var d=h("General"),Z=(o)=>{if(o.yolo){if(o.permissionMode&&o.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");o.permissionMode="yolo"}if(Array.isArray(o.allowedTools))o.allowedTools=o.allowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.disallowedTools))o.disallowedTools=o.disallowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.allowedTools)&&Array.isArray(o.disallowedTools)){let e=o.allowedTools.filter((t)=>o.disallowedTools.includes(t));if(e.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${e.join(", ")}`)}},g=async(o)=>{let e=await P(typeof o.settings==="string"?o.settings:void 0);if(E(o,e),typeof o.agents==="string")A(o.agents);F(o);try{let s=await k.getInstance().initialize(e),i=b(s,o);if(C().config.actions.setConfig(i),o.debug)d.info("[CLI] 配置已加载到 Store")}catch(t){d.error("[CLI] [FAIL] 配置初始化失败",t instanceof Error?t.message:t),console.error(`
|
|
2
|
-
[FAIL] 配置初始化失败
|
|
3
|
-
`),console.error("原因:",t instanceof Error?t.message:"未知错误"),console.error(`
|
|
4
|
-
请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
|
|
5
|
-
`),process.exit(1)}};function F(o){if(o.continue&&o.resume)throw Error("Cannot use both --continue and --resume flags simultaneously");if(o.forkSession&&!o.continue&&!o.resume)throw Error("--fork-session requires --resume or --continue");if(o.sessionId&&(o.continue||o.resume)&&!o.forkSession)throw Error("--session-id can only be combined with --resume or --continue when --fork-session is set")}var v=(o)=>{if(o.outputFormat&&o.outputFormat!=="text"&&!o.print&&!o.headless)throw Error("--output-format can only be used with --print or --headless");if(o.headless&&o.outputFormat&&!["text","jsonl"].includes(o.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${o.outputFormat}". Use --print for json|stream-json support.`);if(o.print&&o.outputFormat&&!["text","json","stream-json"].includes(o.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${o.outputFormat}". Use --headless for jsonl support.`);if(o.inputFormat==="stream-json"&&o.print)d.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};
|
|
6
|
-
export{Z as w,g as x,v as y};
|
package/dist/chunk-zsyff0ky.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{oc as $}from"./chunk-be7qz4cv.js";import{createModels as w}from"@earendil-works/pi-ai";import{builtinProviders as K}from"@earendil-works/pi-ai/providers/all";import{promises as L}from"node:fs";import X from"node:path";import{Mutex as U}from"async-mutex";import _ from"write-file-atomic";import{execSync as k}from"node:child_process";import*as W from"node:os";import*as G from"node:path";function A(q){return G.resolve(q).replace(/[/\\]/g,"-").replace(/:/g,"_")}function B(q){let z=q.replace(/_/g,":");if(z.startsWith("-"))z="/"+z.slice(1);return z.replace(/-/g,"/")}function O(q){let z=A(q);return G.join(J(),"projects",z)}function D(q){return typeof q==="string"&&q!=="."&&q!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(q)}function Q(q){if(!D(q))throw Error(`Invalid session ID: ${q}`)}function F(q,z){return Q(z),G.join(O(q),`${z}.jsonl`)}function R(q,z){return Q(z),G.join(O(q),`${z}.inbox.json`)}function C(q,z){return Q(z),G.join(O(q),`${z}.goal.json`)}function M(q){try{return k("git rev-parse --abbrev-ref HEAD",{cwd:q,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}function J(){return process.env.BLADE_STORAGE_ROOT||G.join(W.homedir(),".blade")}async function V(){let{readdir:q}=await import("node:fs/promises");try{let z=G.join(J(),"projects");return(await q(z,{withFileTypes:!0})).filter((H)=>H.isDirectory()).map((H)=>H.name)}catch{return[]}}class T{filePath;mutex=new U;constructor(q=X.join(J(),"auth.json")){this.filePath=q}async read(q){return(await this.readAll())[q]}async list(){let q=await this.readAll();return Object.entries(q).map(([z,E])=>({providerId:z,type:E.type}))}async modify(q,z){return this.mutex.runExclusive(async()=>{let E=await this.readAll(),H=E[q],N=await z(H);if(N===void 0)return H;return E[q]=N,await this.writeAll(E),N})}async delete(q){await this.mutex.runExclusive(async()=>{let z=await this.readAll();if(!(q in z))return;delete z[q],await this.writeAll(z)})}async readAll(){try{let q=await L.readFile(this.filePath,"utf8"),z=JSON.parse(q);return z&&typeof z==="object"&&!Array.isArray(z)?z:{}}catch(q){if(q.code==="ENOENT")return{};throw q}}async writeAll(q){let z=X.dirname(this.filePath);await L.mkdir(z,{recursive:!0,mode:448}),await L.chmod(z,448),await _(this.filePath,`${JSON.stringify(q,null,2)}
|
|
2
|
-
`,{mode:384}),await L.chmod(this.filePath,384)}}class Z{credentials;models;constructor(q=new T){this.credentials=q,this.models=w({credentials:q});for(let z of K())this.models.setProvider(z)}async listProviders(){return Promise.all(this.models.getProviders().map(async(q)=>{let z=q.getModels();return{id:q.id,name:q.name,modelCount:z.length,defaultBaseUrl:q.baseUrl??z[0]?.baseUrl,supportsApiKey:Boolean(q.auth.apiKey),supportsOAuth:Boolean(q.auth.oauth),configured:Boolean(await this.models.checkAuth(q.id))}}))}listModels(q){return this.models.getModels(q).map((z)=>this.toCatalogEntry(z))}getModel(q,z){let E=this.models.getModel(q,z);if(!E)throw Error(`Unknown pi-ai model: ${q}/${z}`);return E}resolveConfig(q){let z=this.getModel(q.provider,q.model),E=q.overrides;return{...z,...E?.baseUrl?{baseUrl:E.baseUrl}:{},...E?.maxOutputTokens?{maxTokens:E.maxOutputTokens}:{}}}async setApiKey(q,z){this.requireProvider(q),await this.credentials.modify(q,async()=>({type:"api_key",key:z}))}async clearCredential(q){this.requireProvider(q),await this.credentials.delete(q)}async isConfigured(q){return this.requireProvider(q),Boolean(await this.models.checkAuth(q))}requireProvider(q){if(!this.models.getProvider(q))throw Error(`Unknown pi-ai provider: ${q}`)}toCatalogEntry(q){return{id:q.id,name:q.name,provider:q.provider,api:q.api,baseUrl:q.baseUrl,reasoning:q.reasoning,input:[...q.input],contextWindow:q.contextWindow,maxTokens:q.maxTokens,cost:{...q.cost}}}}var Y;function c(){return Y??=new Z,Y}
|
|
3
|
-
export{B as dc,O as ec,D as fc,Q as gc,F as hc,R as ic,C as jc,M as kc,J as lc,V as mc,c as nc};
|