blade-code 0.7.8 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/chunk-04920kz2.js +1570 -0
- package/dist/{chunk-rnfd5ebv.js → chunk-06h100e2.js} +1 -1
- package/dist/chunk-07jvw0kn.js +1 -0
- package/dist/chunk-0dj326ms.js +5 -0
- package/dist/chunk-14erxdhd.js +1 -0
- package/dist/{chunk-48q9msfk.js → chunk-1pt090dg.js} +38 -38
- package/dist/{chunk-cjmxggke.js → chunk-1smf2dj3.js} +2 -2
- package/dist/chunk-34pdtz4q.js +3 -0
- package/dist/chunk-42ch5zg4.js +1 -0
- package/dist/chunk-49g067ek.js +41 -0
- package/dist/{chunk-71n472hj.js → chunk-61952mn3.js} +1 -1
- package/dist/{chunk-s4mke0t6.js → chunk-6yqzfz8t.js} +1 -1
- package/dist/chunk-7j6rxyt8.js +9 -0
- package/dist/{chunk-g7caymjr.js → chunk-9ad7tt9s.js} +1 -1
- package/dist/{chunk-jm2xhnrv.js → chunk-9xkjb87h.js} +1 -1
- package/dist/chunk-a12tmmfr.js +1 -0
- package/dist/{chunk-0e0z8yc1.js → chunk-bm8vwfez.js} +2 -2
- package/dist/chunk-cnftrx3g.js +1 -0
- package/dist/chunk-ctqf59q1.js +2 -0
- package/dist/chunk-d4ex0qvs.js +2 -0
- package/dist/{chunk-f9ybv4ph.js → chunk-dr06x0cw.js} +1 -1
- package/dist/chunk-epp5jx5f.js +6 -0
- package/dist/{chunk-4dmdn3a9.js → chunk-gsfkrr25.js} +1 -1
- package/dist/chunk-hjx5n3dw.js +3 -0
- package/dist/chunk-j39q2kx7.js +1 -0
- package/dist/chunk-j6hpzkpq.js +6 -0
- package/dist/{chunk-t70aqrm4.js → chunk-jt62ctz7.js} +1 -1
- package/dist/chunk-k47ssv3b.js +34 -0
- package/dist/{chunk-t2spryz0.js → chunk-kawv31m3.js} +1 -1
- package/dist/chunk-n4f8tseg.js +2 -0
- package/dist/chunk-nc4kfwef.js +1 -0
- package/dist/{chunk-9kejtkey.js → chunk-neenhtxw.js} +1 -1
- package/dist/chunk-pdydx73a.js +2 -0
- package/dist/chunk-qwdbqjh7.js +22 -0
- package/dist/{chunk-g6ted982.js → chunk-sr3bzb95.js} +1 -1
- package/dist/chunk-syj3anec.js +6 -0
- package/dist/chunk-tv4r86ez.js +24 -0
- package/dist/chunk-twem6p0g.js +2 -0
- package/dist/chunk-v3ctg84r.js +1 -0
- package/dist/chunk-v5rn5r1h.js +1 -0
- package/dist/{chunk-fb7amc2s.js → chunk-wmes2tt9.js} +1 -1
- package/dist/chunk-x6gt63vz.js +151 -0
- package/dist/chunk-xhnyy54e.js +2 -0
- package/dist/{chunk-6hn2jgw5.js → chunk-yhpm9azy.js} +1 -1
- package/dist/web/assets/{CodeBlockHighlighter-C1cp8dDv.js → CodeBlockHighlighter-D8_cOYpG.js} +1 -1
- package/dist/web/assets/{FilePreview-DRKRs8i2.js → FilePreview-Chqi7chf.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DFqPpAnM.js → MarkdownRenderer-JJScfgAO.js} +1 -1
- package/dist/web/assets/{McpModal-CX5-hlNv.js → McpModal-CiCuIUxC.js} +2 -2
- package/dist/web/assets/SettingsModal-Bew818xl.js +1 -0
- package/dist/web/assets/{SettingsStore-jup_Kikq.js → SettingsStore-B_4zN-c-.js} +1 -1
- package/dist/web/assets/{SkillsModal-DaAUrwXO.js → SkillsModal-Cot4Rb89.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DzlllDH7.js → TerminalPanel-DxB67ObY.js} +1 -1
- package/dist/web/assets/index-B-b3Yc5H.css +1 -0
- package/dist/web/assets/index-B3dW1Scg.js +16 -0
- package/dist/web/assets/{useRequest-DITGl55G.js → useRequest-B4kP-cmG.js} +1 -1
- package/dist/web/assets/{vendor-icons-BuFpOlRn.js → vendor-icons-DqO8ishN.js} +2 -2
- package/dist/web/assets/{vendor-markdown-Bo4W9Tae.js → vendor-markdown-b9iCqZWK.js} +1 -1
- package/dist/web/assets/vendor-radix-DyP_DOwV.js +45 -0
- package/dist/web/assets/{vendor-react-BalntB5F.js → vendor-react-FPIC4Czm.js} +2 -2
- package/dist/web/index.html +2 -2
- package/package.json +4 -11
- package/dist/chunk-1w6tqkxd.js +0 -34
- package/dist/chunk-2049tv49.js +0 -41
- package/dist/chunk-4745ktjj.js +0 -1570
- package/dist/chunk-5be6qr2v.js +0 -2
- package/dist/chunk-67vzgcs5.js +0 -2
- package/dist/chunk-6811kbxn.js +0 -1
- package/dist/chunk-6js5wp6t.js +0 -1
- package/dist/chunk-6kp3z956.js +0 -9
- package/dist/chunk-78txnq4n.js +0 -151
- package/dist/chunk-7r1hm0qz.js +0 -6
- package/dist/chunk-a7yjnqhd.js +0 -3
- package/dist/chunk-bwaqaktn.js +0 -1
- package/dist/chunk-cb82rf5h.js +0 -1
- package/dist/chunk-ce11m8bq.js +0 -1
- package/dist/chunk-e4rhdg3h.js +0 -1
- package/dist/chunk-faq7ay4j.js +0 -24
- package/dist/chunk-ky8ctbdc.js +0 -1
- package/dist/chunk-mpskff34.js +0 -1
- package/dist/chunk-pd1yqxcv.js +0 -9
- package/dist/chunk-phhmmybg.js +0 -2
- package/dist/chunk-qnevwq1q.js +0 -2
- package/dist/chunk-r1spf93b.js +0 -26
- package/dist/chunk-z4c68ve0.js +0 -6
- package/dist/chunk-z9zbcenc.js +0 -6
- package/dist/web/assets/SettingsModal-CfR_q6N7.js +0 -1
- package/dist/web/assets/index-BJTSF3fc.js +0 -9
- package/dist/web/assets/index-CL6apjgo.css +0 -1
- package/dist/web/assets/vendor-radix-CESj0OOY.js +0 -45
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as TS,f as MS}from"./chunk-xhnyy54e.js";import{$ as zS,A as DS,C as GS,D as BO,E as kO,G as XO,H as QO,I as L,J as E,K as YS,L as P,N as jS,P as FO,Q as fO,S as QS}from"./chunk-04920kz2.js";import{ca as n}from"./chunk-k47ssv3b.js";import{Ca as o,va as $O,xa as cO,ya as dO,za as aO}from"./chunk-tv4r86ez.js";import{Ka as VO}from"./chunk-pdydx73a.js";import{Qa as HS,Sa as wO,ab as yO}from"./chunk-1pt090dg.js";import{sb as JS}from"./chunk-9xkjb87h.js";import{Ab as zO,Bb as C,wb as g,yb as x,zb as b}from"./chunk-ctqf59q1.js";import{Cb as NS}from"./chunk-jt62ctz7.js";import{Ib as m}from"./chunk-gsfkrr25.js";import{Tb as q}from"./chunk-34pdtz4q.js";import{Yb as VS,dc as r}from"./chunk-hjx5n3dw.js";import{ec as PO}from"./chunk-dr06x0cw.js";var ox={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 ix(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as mS,readFileSync as HO}from"node:fs";import{createServer as kx}from"node:http";import{networkInterfaces as Px}from"node:os";import{dirname as Rx,extname as Ix,join as SO}from"node:path";import{fileURLToPath as gx}from"node:url";import{Hono as vx}from"hono";import{cors as ux}from"hono/cors";import{WebSocketServer as tx}from"ws";class I extends Error{code;statusCode;constructor(O,$,S=500){super($);this.code=O;this.statusCode=S;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class f extends I{constructor(O,$){super("NOT_FOUND",$?`${O} not found: ${$}`:`${O} not found`,404)}}class p extends I{constructor(O){super("BAD_REQUEST",O,400)}}class i extends I{constructor(O){super("CONFLICT",O,409)}}class t 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 sx=x.Object({error:x.Object({code:x.String(),message:x.String()})});import{Hono as PS}from"hono";var DO=q("Service"),RS=x.Object({updates:x.Record(x.String(),x.Any()),options:x.Optional(x.Object({scope:x.Optional(C(["local","project","global"])),immediate:x.Optional(x.Boolean())}))});function IS(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}}var vO=()=>{let O=new PS;return O.get("/",async($)=>{try{let S=$O();return $.json(S?IS(S):{})}catch(S){return DO.error("[ConfigRoutes] Failed to get config:",S),$.json({})}}),O.put("/",async($)=>{try{let S=await $.req.json(),V=g(RS,S);if(!V.success)throw new p("Invalid config update format");let{updates:J,options:j}=V.data;return await o().updateConfig(J,j),$.json({success:!0,updates:J})}catch(S){throw DO.error("[ConfigRoutes] Failed to update config:",S),S}}),O.get("/permissions",async($)=>{try{let S=$O();return $.json(S?.permissions||{})}catch(S){return DO.error("[ConfigRoutes] Failed to get permissions:",S),$.json({})}}),O};import{Hono as gS}from"hono";import{streamSSE as vS}from"hono/streaming";var uS=15000,tS=new Set(["task.status"]),lS=new Set(["queued","running","completed","failed","cancelled","interrupted"]),uO=()=>{let O=new gS;return O.get("/",($)=>vS($,async(S)=>{let V,J,j=!1,G=()=>{if(J!==void 0)clearInterval(J),J=void 0;V?.(),V=void 0},X=()=>{if(j)return;j=!0,G()};S.onAbort(X),V=E.subscribe((A)=>{if(!tS.has(A.type))return;let w=A.properties.taskStatus;if(typeof w!=="string"||!lS.has(w))return;S.writeSSE({data:JSON.stringify({type:A.type,properties:{sessionId:A.sessionId,projectPath:A.projectPath,taskStatus:w,...typeof A.properties.taskStatusReason==="string"?{taskStatusReason:A.properties.taskStatusReason}:{},...typeof A.properties.taskStartedAt==="string"?{taskStartedAt:A.properties.taskStartedAt}:{},...typeof A.properties.taskCompletedAt==="string"?{taskCompletedAt:A.properties.taskCompletedAt}:{},...typeof A.properties.updatedAt==="string"?{updatedAt:A.properties.updatedAt}:{}}})}).catch(X)});try{if(S.aborted||j)return;if(await S.writeSSE({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),S.aborted||j)return;J=setInterval(()=>{if(S.aborted||j)return;S.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(X)},uS);while(!S.aborted&&!j)await new Promise((A)=>setTimeout(A,1000))}finally{X()}})),O};import{Hono as cS}from"hono";var tO=()=>{let O=new cS;return O.get("/health",($)=>{return $.json({healthy:!0,version:VO()})}),O.get("/info",($)=>{return $.json({version:VO(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:m()})}),O};import{Hono as dS}from"hono";var jO=q("Service"),lO=()=>{let O=new dS;return O.get("/",async($)=>{try{let V=n.getInstance().getAllServers(),J=Array.from(V.entries()).map(([j,G])=>({id:j,name:j,status:G.status==="connected"?"connected":G.status==="connecting"?"connecting":G.lastError?"error":"offline",endpoint:G.config.command?`${G.config.command} ${(G.config.args||[]).join(" ")}`.trim():G.config.url||"Unknown",description:`MCP server: ${j}`,tools:G.tools.map((X)=>X.name),connectedAt:G.connectedAt?.toISOString(),error:G.lastError?.message}));return $.json(J)}catch(S){return jO.error("[McpRoutes] Failed to get MCP servers:",S),$.json([])}}),O.post("/:name/connect",async($)=>{try{let S=$.req.param("name");return await n.getInstance().connectServer(S),$.json({success:!0})}catch(S){return jO.error("[McpRoutes] Failed to connect MCP server:",S),$.json({success:!1,error:S.message},500)}}),O.post("/:name/disconnect",async($)=>{try{let S=$.req.param("name");return await n.getInstance().disconnectServer(S),$.json({success:!0})}catch(S){return jO.error("[McpRoutes] Failed to disconnect MCP server:",S),$.json({success:!1,error:S.message},500)}}),O.delete("/:name",async($)=>{try{let S=$.req.param("name");await n.getInstance().unregisterServer(S);let J=$O();if(J?.mcpServers){let{[S]:j,...G}=J.mcpServers;await o().updateConfig({mcpServers:G})}return $.json({success:!0})}catch(S){return jO.error("[McpRoutes] Failed to delete MCP server:",S),$.json({success:!1,error:S.message},500)}}),O.post("/",async($)=>{try{let S=await $.req.json(),{name:V,config:J}=S;if(!V||!J)return $.json({success:!1,error:"Missing name or config"},400);await n.getInstance().registerServer(V,J);let G=$O();return await o().updateConfig({mcpServers:{...G?.mcpServers,[V]:J}}),$.json({success:!0})}catch(S){return jO.error("[McpRoutes] Failed to add MCP server:",S),$.json({success:!1,error:S.message},500)}}),O};import{Hono as aS}from"hono";var AO=q("Service");function oS(O,$){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:$.contextWindow,maxTokens:$.maxTokens,reasoning:$.reasoning,input:$.input}}function iS(O){let $={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)$.model=O.model;return $}var oO=()=>{let O=new aS;return O.get("/",async($)=>{try{let S=cO(),V=dO(),J=r(),j=(G)=>oS(G,J.resolveConfig(G));return $.json({configured:S.map(j),current:V?j(V):null})}catch(S){return AO.error("[ModelsRoutes] Failed to get models:",S),$.json({configured:[],current:null})}}),O.post("/",async($)=>{try{let S=await $.req.json(),{provider:V,displayName:J,model:j,overrides:G,apiKey:X}=S;if(!V||!j)throw new p("provider and model are required");if(r().getModel(V,j),X?.trim())await r().setApiKey(V,X.trim());let A=await o().addModel({provider:V,displayName:J||void 0,model:j,overrides:G||void 0});return $.json({success:!0,model:A})}catch(S){throw AO.error("[ModelsRoutes] Failed to add model:",S),S}}),O.put("/:modelId",async($)=>{try{let S=$.req.param("modelId"),V=await $.req.json(),{displayName:J,overrides:j,model:G}=V,X=aO(S);if(!X)throw new p("model config not found");if(G)r().getModel(X.provider,G);return await o().updateModel(S,iS({displayName:J,overrides:j,model:G})),$.json({success:!0})}catch(S){throw AO.error("[ModelsRoutes] Failed to update model:",S),S}}),O.delete("/:modelId",async($)=>{try{let S=$.req.param("modelId");return await o().removeModel(S),$.json({success:!0})}catch(S){throw AO.error("[ModelsRoutes] Failed to delete model:",S),S}}),O};import{Hono as Mx}from"hono";import $S from"node:path";import{Mutex as $x}from"async-mutex";import{Hono as Vx}from"hono";import{streamSSE as Nx}from"hono/streaming";import{LRUCache as Jx}from"lru-cache";import{nanoid as NO}from"nanoid";var nO=b(C(["default","autoEdit","yolo","plan"]));var pO=b(C(["user","assistant","system","tool"])),nS=b(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()})})])),rO=x.Union([x.String(),x.Array(nS)]),q0=b(x.Object({id:x.String(),role:pO,content:rO,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())})),rS=b(C(["queued","running","completed","failed","cancelled","interrupted"])),sS=b(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(C(["subagent","fork"])),resumedFrom:x.Optional(x.String()),rootAgentId:x.Optional(x.String()),resumeDepth:x.Optional(x.Integer({minimum:0})),taskStatus:zO(rS,"completed"),taskStatusReason:x.Optional(x.String()),taskStartedAt:x.Optional(x.String()),taskCompletedAt:x.Optional(x.String()),messageCount:x.Number(),firstMessageTime:x.String(),lastMessageTime:x.String(),hasErrors:x.Boolean()})),C0=b(x.Object({version:x.Literal(1),sessionId:x.String(),goalId:x.String(),objective:x.String(),status:C(["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()})),sO=b(x.Object({role:pO,content:rO,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())})),L0=b(x.Object({session:sS,messages:x.Array(sO)})),eO=b(C(["conversation","code","both"])),eS=b(x.Object({messageId:x.String(),preview:x.String(),createdAt:x.String(),fileCount:x.Integer({minimum:0})})),OS=b(x.Object({targetMessageId:x.String({minLength:1}),mode:zO(eO,"conversation")})),F0=b(x.Object({checkpoint:eS,mode:eO,removedTurns:x.Integer({minimum:1}),restoredFiles:x.Array(x.String()),messages:x.Array(sO)})),Ox=C(["running","completed","failed","cancelled"]),iO=b(x.Object({id:x.String(),subagentType:x.String(),description:x.String(),status:Ox,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())}))})),SS=b(x.Object({prompt:x.String({minLength:1,maxLength:32000,pattern:"\\S"})})),f0=b(x.Object({source:iO,session:iO})),m0=b(x.Object({sessionId:x.String(),projectPath:x.String()})),h0=b(x.Object({type:x.String(),properties:x.Record(x.String(),x.Unknown())})),xS=b(x.Object({content:x.String(),projectPath:x.Optional(x.String()),permissionMode:x.Optional(nO),attachments:x.Optional(x.Array(x.Object({type:C(["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())})))})),k0=b(x.Object({messageId:x.String(),role:pO,content:x.String(),timestamp:x.String()})),P0=b(x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(C(["once","session","project"])),targetMode:x.Optional(nO),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))})),R0=b(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(C(["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())}))})),I0=b(C(["vs-dark","vs-light","hc-black"])),Sx=b(C(["light","dark","system"])),xx=b(x.Object({language:x.String(),theme:x.String(),uiTheme:Sx,autoSaveSessions:x.Boolean(),notifyBuild:x.Boolean(),notifyErrors:x.Boolean(),notifySounds:x.Boolean(),privacyTelemetry:x.Boolean(),privacyCrash:x.Boolean()})),g0=b(x.Partial(xx));var y=q("Service"),Gx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),Yx=xS,jx=x.Object({title:x.Optional(x.String()),projectPath:x.Optional(x.String())}),Qx=x.Object({projectPath:x.String()}),Ux=x.Object({objective:x.String({minLength:1}),tokenBudget:x.Optional(x.Integer({minimum:1})),permissionMode:x.Optional(C(["default","autoEdit","plan","yolo"]))}),Zx=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})})]),k=new Map,F=new Jx({max:100,ttl:1800000,dispose:(O,$)=>{if(O.status==="running"||O.status==="waiting_permission")O.abortController.abort(),y.debug(`[SessionRoutes] Run ${$} disposed due to cache eviction`)}});function Ax(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function _O(O,$="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed")return!1;let S=O.pendingPermission;return O.pendingPermission=void 0,S?.resolve({approved:!1,reason:JS}),O.abortController.abort($),O.status="cancelled",E.publish(Ax(O),"run.cancelled",{runId:O.id}),!0}function US(O,$=!1){let{permissionId:S,details:V}=O;if(V.type==="askUserQuestion"&&V.questions)return{type:"question.required",properties:{requestId:S,toolCallId:S,questions:V.questions,details:V,...$?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:S,toolName:V.toolName,description:V.message,args:V.args,details:V,...$?{replayed:!0}:{}}}}function Xx(){for(let O of F.values())_O(O,"route-reset");F.clear(),k.clear()}var ZS=(O)=>{if(!O||typeof O!=="object")return O;let $={...O},S=200000;if(typeof $.oldContent==="string"&&$.oldContent.length>S)delete $.oldContent;if(typeof $.newContent==="string"&&$.newContent.length>S)delete $.newContent;return $};function _x(O,$,S){switch(S.kind){case"tool_start":if("function"in S.toolCall)E.publish(O,"subagent.update",{subagentSessionId:$,toolName:S.toolCall.function.name}),E.publish(O,"subagent.tool.start",{subagentSessionId:$,toolCallId:S.toolCall.id,toolName:S.toolCall.function.name,arguments:S.toolCall.function.arguments,toolKind:S.toolKind});break;case"tool_result":if("function"in S.toolCall)E.publish(O,"subagent.tool.result",{subagentSessionId:$,toolCallId:S.toolCall.id,toolName:S.toolCall.function.name,success:!S.result.error,summary:S.result.metadata?.summary,output:fO(FO(S.toolCall.function.name,S.result)),metadata:ZS(S.result.metadata)});break;case"content_delta":E.publish(O,"subagent.delta",{subagentSessionId:$,delta:S.delta});break;case"thinking_delta":E.publish(O,"subagent.thinking.delta",{subagentSessionId:$,delta:S.delta});break;case"stream_end":E.publish(O,"subagent.stream.end",{subagentSessionId:$});break;default:break}}function qO(O,$="projectPath"){if(!$S.isAbsolute(O))throw new p(`${$} must be absolute`);return $S.resolve(O)}function CO(O){try{VS(O)}catch($){throw new p($ instanceof Error?$.message:`Invalid session ID: ${O}`)}}function v(O){return{sessionId:O.id,projectPath:O.projectPath}}function bO(O,$){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,messages:$}}function EO(O){let $=O.currentRunId?F.get(O.currentRunId):void 0,S=$?.status==="waiting_permission"?"running":$?.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:S,taskStatusReason:O.taskStatusReason,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,agentType:void 0,model:void 0,messageCount:O.messages.length,firstMessageTime:O.createdAt.toISOString(),lastMessageTime:O.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function l(O,$){if(CO(O),$!==void 0){let V=QO({sessionId:O,projectPath:qO($)});if(k.has(L(V)))return V;let J=await P.findSessionMetadata(V.sessionId,V.projectPath);if(!J)throw new f("Session",O);return QO({sessionId:J.sessionId,projectPath:J.projectPath})}let S=new Map;for(let V of k.values()){if(V.id!==O)continue;let J=v(V);S.set(L(J),J)}for(let V of await P.listSessions()){if(V.sessionId!==O)continue;let J=QO({sessionId:V.sessionId,projectPath:V.projectPath});S.set(L(J),J)}if(S.size===0)try{let V=await P.findSessionMetadata(O);if(!V)throw new f("Session",O);return QO({sessionId:V.sessionId,projectPath:V.projectPath})}catch(V){if(V instanceof f)throw V;if(V instanceof Error&&V.message.startsWith("Ambiguous session ID:"))throw new t;throw V}if(S.size>1)throw new t;return S.values().next().value}function LO(O){if(typeof O==="string")return O;return O.filter(($)=>$.type==="text").map(($)=>$.text).join(`
|
|
2
|
+
`)}function wx(O,$){let S=($??[]).filter((J)=>J.type==="image"&&typeof J.content==="string").map((J)=>({type:"image_url",image_url:{url:J.content}}));if(S.length===0)return O;let V=[];if(O.trim())V.push({type:"text",text:O});return V.push(...S),V}var AS=()=>{Xx();let O=new Vx;O.onError((N,U)=>{if(N instanceof I)return U.json(N.toObject(),N.statusCode);return y.error("[SessionRoutes] Unhandled route error:",N),U.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let $=new Map,S=new Map,V=new Map,J=new Map,j=(N)=>{let U=L(N),Y=J.get(U);if(!Y)Y=new $x,J.set(U,Y);return Y},G=async(N)=>{let U=L(v(N)),Y=$.get(U);if(Y)return Y;let Q=S.get(U);if(!Q)Q=jS.create({sessionId:N.id,workspaceRoot:N.projectPath}),S.set(U,Q);try{let Z=await Q;return $.set(U,Z),Z}finally{if(S.get(U)===Q)S.delete(U)}},X=async(N)=>{let U=L(N),Y=k.get(U);if(Y)return Y;let Q=V.get(U);if(!Q)Q=(async()=>{let Z=await P.findSessionMetadata(N.sessionId,N.projectPath);if(!Z)throw new f("Session",N.sessionId);let T=bO(Z,await P.loadSession(N.sessionId,N.projectPath));return k.set(U,T),T})(),V.set(U,Q);try{return await Q}finally{if(V.get(U)===Q)V.delete(U)}},A=async(N,U)=>{return X(await l(N,U))},w=(N,U,Y,Q={})=>{let Z=NO(12),T={id:Z,sessionId:N.id,projectPath:N.projectPath,status:"running",abortController:new AbortController,createdAt:new Date};return F.set(Z,T),N.currentRunId=Z,T.completion=Tx(T,N,U,Y,G,{pendingInputOnly:Q.pendingInputOnly,preparedInputTurn:Q.preparedInputTurn,goalContinuationOnly:Q.goalContinuationOnly}).catch((_)=>{y.error(`[SessionRoutes] Run ${Z} failed:`,_)}),T},D=async(N)=>{let U=N.currentRunId?F.get(N.currentRunId):void 0;if(U&&(U.status==="running"||U.status==="waiting_permission"))return;let Y=await G(N),Q=N.currentRunId?F.get(N.currentRunId):void 0;if(Q&&(Q.status==="running"||Q.status==="waiting_permission"))return;let Z=Y.getPendingSteeringCount()>0,_=(Z?null:await Y.getGoal())?.status==="active";if(!Z&&!_||Y.hasTurnOwner())return;w(N,"","default",{pendingInputOnly:Z,goalContinuationOnly:_})};return O.get("/",async(N)=>{try{let U=await P.listSessions(),Y=new Set(U.filter((H)=>H.relationType==="subagent").map((H)=>L({sessionId:H.sessionId,projectPath:H.projectPath}))),Q=Array.from(k.values()).filter((H)=>!Y.has(L(v(H)))&&H.relationType!=="subagent").map((H)=>EO(H)),Z=new Set(Q.map((H)=>L({sessionId:H.sessionId,projectPath:H.projectPath}))),T=U.filter((H)=>{if(H.relationType==="subagent")return!1;return!Z.has(L({sessionId:H.sessionId,projectPath:H.projectPath}))}),_=new Set(Z),W=T.filter((H)=>{let B=L({sessionId:H.sessionId,projectPath:H.projectPath});if(_.has(B))return!1;return _.add(B),!0}),K=[...Q,...W];return N.json(K)}catch(U){throw y.error("[SessionRoutes] Failed to list sessions:",U),new d("Failed to list sessions")}}),O.post("/",async(N)=>{try{let U=await N.req.json(),Y=g(Gx,U);if(!Y.success)throw new p("Invalid request body");let{title:Q,projectPath:Z}=Y.data,T=NS("web",12),_=qO(Z||N.get("directory")||m(),Z?"projectPath":"directory"),W=await P.createSessionMetadata(T,_,{title:Q}),K=bO(W,[]),H=v(K);return k.set(L(H),K),E.publish(H,"task.status",{taskStatus:W.taskStatus,updatedAt:W.lastMessageTime}),N.json({...EO(K),status:void 0,agentType:void 0,model:void 0})}catch(U){if(y.error("[SessionRoutes] Failed to create session:",U),U instanceof p)throw U;throw new d("Failed to create session")}}),O.post("/:sessionId/fork",async(N)=>{let U=N.req.param("sessionId");try{CO(U);let Y=await N.req.json(),Q=g(Qx,Y);if(!Q.success)throw new p("Invalid request body");let Z=qO(Q.data.projectPath),T=await P.findSessionMetadata(U,Z);if(!T)throw new f("Session",U);let _=await P.forkSession(U,{sourceProjectPath:T.projectPath,targetProjectPath:T.projectPath}),W=bO(_.metadata,_.messages),K=v(W);return k.set(L(K),W),E.publish(K,"task.status",{taskStatus:_.metadata.taskStatus,..._.metadata.taskCompletedAt?{taskCompletedAt:_.metadata.taskCompletedAt}:{},updatedAt:_.metadata.lastMessageTime}),N.json({session:_.metadata,messages:_.messages},201)}catch(Y){if(Y instanceof p||Y instanceof f||Y instanceof i)throw Y;if(Y instanceof YS)throw new i("Session has no durable creation record");throw y.error("[SessionRoutes] Failed to fork session:",Y),new d("Failed to fork session")}}),O.get("/:sessionId",async(N)=>{let U=N.req.param("sessionId");try{let Y=await l(U,N.req.query("projectPath")),Q=k.get(L(Y));if(Q)return N.json(EO(Q));let Z=await P.findSessionMetadata(Y.sessionId,Y.projectPath);if(!Z)throw new f("Session",U);return N.json(Z)}catch(Y){if(Y instanceof p||Y instanceof f||Y instanceof t)throw Y;throw y.error("[SessionRoutes] Failed to get session:",Y),new d("Failed to get session")}}),O.patch("/:sessionId",async(N)=>{let U=N.req.param("sessionId");try{let Y=await N.req.json(),Q=g(jx,Y);if(!Q.success)throw new p("Invalid request body");if(Q.data.title===void 0)throw new p("title is required");let Z=await l(U,Q.data.projectPath),T=await P.updateSessionMetadata(Z.sessionId,Z.projectPath,{title:Q.data.title}),_=k.get(L(Z));if(_)_.title=T.title??_.title,_.updatedAt=new Date(T.lastMessageTime);return N.json({success:!0,title:T.title})}catch(Y){if(y.error("[SessionRoutes] Failed to update session:",Y),Y instanceof p||Y instanceof f||Y instanceof t)throw Y;throw new d("Failed to update session")}}),O.get("/:sessionId/rewind",async(N)=>{let U=await A(N.req.param("sessionId"),N.req.query("projectPath")),Y=await G(U);return N.json({checkpoints:await Y.listRewindCheckpoints()})}),O.post("/:sessionId/rewind",async(N)=>{let U=g(OS,await N.req.json());if(!U.success)throw new p("Invalid rewind request");let Y=await A(N.req.param("sessionId"),N.req.query("projectPath")),Q=v(Y);return j(Q).runExclusive(async()=>{let Z=Y.currentRunId?F.get(Y.currentRunId):void 0;if(Z&&(Z.status==="running"||Z.status==="waiting_permission"))throw new i("Cannot rewind while a run is active");let T=await G(Y),_;try{_=await T.rewindSession(U.data)}catch(W){if(W instanceof Error&&W.message.startsWith("Cannot rewind while"))throw new i(W.message);throw W}return Y.messages=[..._.messages],Y.updatedAt=new Date,E.publish(Q,"session.rewound",{targetMessageId:_.checkpoint.messageId,mode:_.mode,removedTurns:_.removedTurns,restoredFiles:_.restoredFiles,messages:_.messages}),N.json(_)})}),O.get("/:sessionId/subagents",async(N)=>{let U=await A(N.req.param("sessionId"),N.req.query("projectPath")),Y=await G(U);return N.json({subagents:Y.listSubagents().map(XO)})}),O.post("/:sessionId/subagents/:agentId/resume",async(N)=>{CO(N.req.param("agentId"));let U=SS.safeParse(await N.req.json());if(!U.success)throw new p("Invalid subagent resume request");let Y=await A(N.req.param("sessionId"),N.req.query("projectPath")),Q=v(Y);return j(Q).runExclusive(async()=>{let Z=Y.currentRunId?F.get(Y.currentRunId):void 0;if(Z&&(Z.status==="running"||Z.status==="waiting_permission"))throw new i("Cannot resume a subagent while a parent run is active");let T=await G(Y),_=!1,W,K=(B)=>{E.publish(Q,"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})},H;try{H=T.resumeSubagent({agentId:N.req.param("agentId"),prompt:U.data.prompt,onEvent:(B,M)=>{_x(Q,M,B)},onCompleted:(B)=>{if(_)K(B);else W=B}})}catch(B){if(B instanceof Error&&(B.message.startsWith("Cannot resume")||B.message.startsWith("Subagent cannot")))throw new i(B.message);if(B instanceof Error&&B.message.startsWith("Subagent not found"))throw new f(B.message);throw B}if(E.publish(Q,"subagent.start",{subagentSessionId:H.session.id,type:H.session.subagentType,description:H.session.description,resumedFrom:H.source.id,rootAgentId:H.session.rootAgentId,resumeDepth:H.session.resumeDepth}),_=!0,W)K(W);return N.json({source:XO(H.source),session:XO(H.session)})})}),O.get("/:sessionId/goal",async(N)=>{let U=await A(N.req.param("sessionId"),N.req.query("projectPath"));return N.json({goal:await new GS(U.projectPath,U.id).get()})}),O.put("/:sessionId/goal",async(N)=>{let U=g(Ux,await N.req.json());if(!U.success)throw new p("Invalid goal request");let Y=await A(N.req.param("sessionId"),N.req.query("projectPath")),Q=v(Y);return j(Q).runExclusive(async()=>{let Z=Y.currentRunId?F.get(Y.currentRunId):void 0;if(Z&&(Z.status==="running"||Z.status==="waiting_permission"))return N.json({status:"rejected",reason:"run_active"},409);let _=await(await G(Y)).createGoal(U.data);E.publish(Q,"goal.updated",{goal:_});let W=U.data.permissionMode??"default",K=w(Y,"",W,{goalContinuationOnly:!0});return N.json({status:"running",runId:K.id,goal:_},202)})}),O.patch("/:sessionId/goal",async(N)=>{let U=g(Zx,await N.req.json());if(!U.success)throw new p("Invalid goal update");let Y=await A(N.req.param("sessionId"),N.req.query("projectPath")),Q=v(Y);return j(Q).runExclusive(async()=>{let Z=await G(Y),T;if(U.data.action==="pause")T=await Z.pauseGoal();else if(U.data.action==="edit")T=await Z.editGoal(U.data.objective);else T=await Z.resumeGoal();if(E.publish(Q,"goal.updated",{goal:T}),T.status==="active"&&(!Y.currentRunId||!["running","waiting_permission"].includes(F.get(Y.currentRunId)?.status??""))){let _=w(Y,"","default",{goalContinuationOnly:!0});return N.json({status:"running",runId:_.id,goal:T},202)}return N.json({status:T.status,goal:T})})}),O.delete("/:sessionId/goal",async(N)=>{let U=await A(N.req.param("sessionId"),N.req.query("projectPath")),Y=v(U),Z=await(await G(U)).clearGoal();if(Z)E.publish(Y,"goal.cleared",{});return N.json({cleared:Z})}),O.delete("/:sessionId",async(N)=>{let U=N.req.param("sessionId"),Y=N.req.query("projectPath");try{let Q=await l(U,Y),Z=L(Q),T=k.get(Z),_=$.get(Z),W;if(T?.currentRunId){let K=F.get(T.currentRunId);if(K)_O(K),await K.completion,W=K.id}if(_)await _.clearGoal().catch((K)=>{y.warn("[SessionRoutes] Failed to clear session goal:",K)});if(await P.deleteSession(Q.sessionId,Q.projectPath),W)F.delete(W);if(k.delete(Z),V.delete(Z),S.delete(Z),J.delete(Z),_){if(await _.dispose(),$.delete(Z),$.size===0)await n.getInstance().disconnectAll()}return N.json({success:!0})}catch(Q){if(y.error("[SessionRoutes] Failed to delete session:",Q),Q instanceof p||Q instanceof f||Q instanceof t)throw Q;throw new d("Failed to delete session")}}),O.get("/:sessionId/message",async(N)=>{let U=N.req.param("sessionId");try{let Y=await l(U,N.req.query("projectPath")),Q=k.get(L(Y)),Z=Q?.messages?Q.messages:await P.loadSession(Y.sessionId,Y.projectPath);return N.json(Z)}catch(Y){if(y.error("[SessionRoutes] Failed to get messages:",Y),Y instanceof p||Y instanceof f||Y instanceof t)throw Y;throw new d("Failed to get messages")}}),O.get("/:sessionId/events",async(N)=>{let U=N.req.param("sessionId"),Y=await l(U,N.req.query("projectPath")),Q=await X(Y);return Nx(N,async(Z)=>{let _,W,K=!1,H=()=>{if(W!==void 0)clearInterval(W),W=void 0;_?.(),_=void 0},B=()=>{if(K)return;K=!0,H()},M=new Set;Z.onAbort(B),_=E.subscribe((z)=>{if(z.sessionId!==Y.sessionId||z.projectPath!==Y.projectPath)return;let c=z.properties.requestId;if((z.type==="permission.asked"||z.type==="question.required")&&typeof c==="string"){if(M.has(c))return;M.add(c)}Z.writeSSE({data:JSON.stringify({type:z.type,properties:{...z.properties,sessionId:z.sessionId,projectPath:z.projectPath}})}).catch(B)});try{if(Z.aborted||K)return;if(await Z.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:Y.sessionId,projectPath:Y.projectPath,timestamp:Date.now()}})}).catch((h)=>{throw B(),h}),Z.aborted||K)return;let c=(Q.currentRunId?F.get(Q.currentRunId):void 0)?.pendingPermission;if(c){M.add(c.permissionId);let h=US(c,!0);await Z.writeSSE({data:JSON.stringify({type:h.type,properties:{...h.properties,sessionId:Y.sessionId,projectPath:Y.projectPath}})})}D(Q).catch((h)=>{y.error(`[SessionRoutes] Failed to resume pending input for ${U}:`,h)}),W=setInterval(()=>{if(!Z.aborted)Z.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(B)},15000);while(!Z.aborted&&!K)await new Promise((h)=>setTimeout(h,1000))}finally{B()}})}),O.post("/:sessionId/message",async(N)=>{let U=N.req.param("sessionId"),Y=await N.req.json(),Q=g(Yx,Y);if(!Q.success)throw new p("Invalid message format");let{content:Z,attachments:T,permissionMode:_,projectPath:W}=Q.data,K=_||"default",H=wx(Z,T),B=await A(U,W??N.req.query("projectPath")),M=v(B);return j(M).runExclusive(async()=>{let z=B.currentRunId?F.get(B.currentRunId):void 0;if(z&&(z.status==="running"||z.status==="waiting_permission")){let u=await(await G(B)).enqueueSteering(H,{allowBeforeTurn:!0});if(!u.accepted)return N.json({status:"rejected",reason:u.reason??"turn_unavailable"},409);let xO=u.messageId??NO(12),ZO=u.queued;E.publish(M,"message.created",{messageId:xO,role:"user",content:LO(H)});let KO=u.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(E.publish(M,KO,{runId:z.id,messageId:xO,queued:ZO}),u.delivery==="next_turn"&&z.status!=="running"&&z.status!=="waiting_permission")D(B).catch((kS)=>{y.error(`[SessionRoutes] Failed to wake queued follow-up for ${U}:`,kS)});if(u.delivery==="next_turn")z.pendingFollowUpRequested=!0;return N.json({runId:z.id,messageId:xO,status:u.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:ZO},202)}let h=await(await G(B)).prepareInputTurn(H);if(!h.accepted)return N.json({status:"rejected",reason:h.reason},h.reason==="queue_full"?429:409);let YO=w(B,H,K,{preparedInputTurn:h});return N.json({runId:YO.id,messageId:h.messageId,status:"running"},202)})}),O.post("/:sessionId/abort",async(N)=>{let U=N.req.param("sessionId"),Y=await l(U,N.req.query("projectPath")),Q=k.get(L(Y));if(Q?.currentRunId){let Z=F.get(Q.currentRunId);if(Z)_O(Z),await Z.completion}return N.json({success:!0})}),O.get("/:sessionId/status",async(N)=>{let U=N.req.param("sessionId"),Y=await l(U,N.req.query("projectPath")),Q=k.get(L(Y));if(!Q?.currentRunId)return N.json({sessionId:U,projectPath:Y.projectPath,status:"idle"});let Z=F.get(Q.currentRunId);return N.json({sessionId:U,projectPath:Y.projectPath,runId:Q.currentRunId,status:Z?.status||"idle"})}),O};async function Tx(O,$,S,V,J,j={}){let{abortController:G,sessionId:X,id:A}=O,w=j.preparedInputTurn?.messageId??NO(12),N=j.pendingInputOnly===!0||j.preparedInputTurn?.mode==="pending"||j.goalContinuationOnly===!0?void 0:NO(12),U,Y=v($),Q=(Z,T)=>{E.publish(Y,Z,T)};try{if($.taskStatus="running",$.taskStatusReason=void 0,$.taskStartedAt=new Date().toISOString(),$.taskCompletedAt=void 0,!j.pendingInputOnly&&!j.goalContinuationOnly)Q("message.created",{messageId:w,role:"user",content:LO(S)});if(Q("session.status",{status:"running"}),N)Q("message.created",{messageId:N,role:"assistant",content:""});U=await J($);let Z=U,T=await QS.createWithRuntime(Z,{sessionId:X}),_=async(M)=>{let z=NO(12),c=300000;O.status="waiting_permission";let h=new Promise((xO)=>{let ZO=setTimeout(()=>{y.warn(`[SessionRoutes] Permission ${z} timed out after 300000ms`),Q("permission.timeout",{requestId:z}),xO({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:z,resolve:(KO)=>{clearTimeout(ZO),xO(KO)},details:M}}),YO=O.pendingPermission;if(!YO)throw Error("Permission request was not registered");let WO=US(YO);Q(WO.type,WO.properties),y.info(`[SessionRoutes] Permission request created: ${z}, runId: ${A}`);let u=await h;if(y.info(`[SessionRoutes] Permission response received: ${z}, approved: ${u.approved}`),!G.signal.aborted)O.status="running";if(O.pendingPermission===YO)O.pendingPermission=void 0;return u},W={messages:[...$.messages],userId:"web-user",sessionId:X,workspaceRoot:$.projectPath,signal:G.signal,permissionMode:V,confirmationHandler:{requestConfirmation:_}},K=()=>{if(!N)N=NO(12),Q("message.created",{messageId:N,role:"assistant",content:""});return N},H=async(M)=>{switch(M.kind){case"content_delta":Q("message.delta",{messageId:K(),delta:M.delta});break;case"thinking_delta":Q("thinking.delta",{delta:M.delta});break;case"tool_start":if("function"in M.toolCall)Q("tool.start",{messageId:K(),toolName:M.toolCall.function.name,toolCallId:M.toolCall.id,arguments:M.toolCall.function.arguments,toolKind:M.toolKind});break;case"tool_result":if("function"in M.toolCall)Q("tool.result",{messageId:K(),toolName:M.toolCall.function.name,toolCallId:M.toolCall.id,success:M.result.success,summary:M.result.metadata?.summary,output:fO(FO(M.toolCall.function.name,M.result)),metadata:ZS(M.result.metadata)});break;case"token_usage":Q("token.usage",{...M.usage});break;case"turn_start":Q("turn.started",{turn:M.turn,maxTurns:M.maxTurns});break;case"steering_applied":Q("steering.applied",{runId:A,messageIds:M.messageIds,count:M.count,recovered:M.recovered,delivery:M.delivery,queued:Z.getPendingSteeringCount()});break;case"follow_up_started":{if(N)Q("message.complete",{messageId:N}),N=void 0;for(let z of M.messages){if(!z.recovered||z.persisted)continue;Q("message.created",{messageId:z.id,role:"user",content:LO(z.content),recovered:!0})}Q("follow_up.started",{runId:A,queued:M.queued,recovered:M.recovered}),K();break}case"goal_updated":Q("goal.updated",{goal:M.goal});break;case"goal_continuation_started":Q("goal.continuation.started",{goal:M.goal,continuation:M.continuation}),K();break;case"compaction":Q(M.phase==="start"?"compaction.started":"compaction.completed",{});break;case"model_fallback":Q("model.fallback",{});break;case"task_update":Q("task.updated",{tasks:M.tasks});break;default:break}},B=await yO(T.chatStream(S,W,{stream:!0,pendingInputOnly:j.pendingInputOnly,preparedInputTurn:j.preparedInputTurn,goalContinuationOnly:j.goalContinuationOnly}),H);if(!B.success)throw Error(B.error?.message??"Agent run failed");for(let M=0;M<20;M++){let z=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,Z.getPendingSteeringCount()===0){if(!z)break;continue}if(G.signal.aborted)break;if(B=await yO(T.chatStream("",W,{stream:!0,pendingInputOnly:!0}),H),!B.success)throw Error(B.error?.message??"Agent follow-up failed")}if($.messages=[...W.messages],$.updatedAt=new Date,G.signal.aborted||O.status==="cancelled"){$.taskStatus="cancelled",$.taskCompletedAt=new Date().toISOString(),Q("session.status",{status:"idle"});return}if(N)Q("message.complete",{messageId:N});Q("thinking.completed",{}),O.status="completed",$.taskStatus="completed",$.taskCompletedAt=new Date().toISOString(),Q("session.completed",{runId:A,outputTruncated:B.metadata?.outputTruncated??!1}),Q("session.status",{status:"idle"})}catch(Z){if(U&&j.preparedInputTurn)await U.finishTurn(j.preparedInputTurn.handle).catch(()=>{return});if(G.signal.aborted||O.status==="cancelled"){_O(O,"runtime-abort"),$.taskStatus="cancelled",$.taskCompletedAt=new Date().toISOString(),Q("session.status",{status:"idle"});return}y.error("[SessionRoutes] Agent execution error:",Z),O.status="failed",$.taskStatus="failed",$.taskStatusReason="Agent execution failed",$.taskCompletedAt=new Date().toISOString(),Q("session.error",{error:Z instanceof Error?Z.message:"Unknown error"}),Q("session.status",{status:"error"})}}function XS(O,$,S){y.info(`[SessionRoutes] Looking for permission ${$} in session ${O.sessionId}`),y.info(`[SessionRoutes] Active runs: ${F.size}`);for(let[V,J]of F.entries())if(y.info(`[SessionRoutes] Checking run ${V}: sessionId=${J.sessionId}, projectPath=${J.projectPath}, pendingPermission=${J.pendingPermission?.permissionId}`),J.sessionId===O.sessionId&&J.projectPath===O.projectPath&&J.pendingPermission?.permissionId===$)return J.pendingPermission.resolve(S),y.info(`[SessionRoutes] Permission ${$} responded, runId: ${J.id}`),!0;return y.error(`[SessionRoutes] Permission not found: ${$}`),!1}var mO=q("Service"),Bx=x.Object({approved:x.Boolean(),remember:x.Optional(x.Boolean()),scope:x.Optional(C(["once","session","project"])),targetMode:x.Optional(C(["default","autoEdit","plan","yolo"])),feedback:x.Optional(x.String()),answers:x.Optional(x.Record(x.String(),x.Union([x.String(),x.Array(x.String())])))}),_S=()=>{let O=new Mx;return O.post("/:permissionId",async($)=>{let S=$.req.param("permissionId"),V=$.req.query("sessionId"),J=$.req.query("projectPath");mO.info(`[PermissionRoutes] Received permission response: permissionId=${S}, sessionId=${V}`);try{let j=await $.req.json(),G=g(Bx,j);if(!G.success)throw new p("Invalid permission response format");let{approved:X,remember:A,scope:w,targetMode:D,feedback:N,answers:U}=G.data;if(!V)throw new p("sessionId query parameter is required");let Y=await l(V,J);if(!XS(Y,S,{approved:X,reason:N,scope:w,targetMode:D,feedback:N,answers:U}))throw new f("Permission request",S);return mO.info(`[PermissionRoutes] Permission ${S} ${X?"approved":"denied"}`),$.json({success:!0,approved:X,remember:A})}catch(j){if(mO.error("[PermissionRoutes] Failed to respond to permission:",j),j instanceof p||j instanceof t||j instanceof f||j instanceof I)throw j;throw j}}),O};import{Hono as Hx}from"hono";var wS=q("Service"),BS=()=>{let O=new Hx;return O.get("/",async($)=>{try{let S=await TS();return $.json(S)}catch(S){return wS.error("[ProviderRoutes] Failed to list providers:",S),$.json([])}}),O.get("/:provider/models",async($)=>{let S=$.req.param("provider");try{let V=await MS(S);return $.json(V)}catch(V){return wS.error("[ProviderRoutes] Failed to list models:",V),$.json([])}}),O.put("/:provider/credential",async($)=>{let S=$.req.param("provider"),V=await $.req.json();if(!V.apiKey?.trim())throw new p("apiKey is required");return await r().setApiKey(S,V.apiKey.trim()),$.json({success:!0})}),O.delete("/:provider/credential",async($)=>{return await r().clearCredential($.req.param("provider")),$.json({success:!0})}),O};import{Hono as Wx}from"hono";import*as s from"node:fs/promises";import{homedir as Kx}from"node:os";import*as TO from"node:path";var OO=q("Service"),hO=TO.join(Kx(),".blade","skills-config.json");async function WS(){try{let O=await s.readFile(hO,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function Dx(O){await s.mkdir(TO.dirname(hO),{recursive:!0}),await s.writeFile(hO,JSON.stringify(O,null,2))}async function zx(O,$){let S=await WS();if($)S.disabled=S.disabled.filter((V)=>V!==O);else if(!S.disabled.includes(O))S.disabled.push(O);await Dx(S)}var JO=null,px=300000;async function bx(){if(JO&&Date.now()-JO.timestamp<px)return JO.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 OO.warn(`GitHub API returned ${O.status}`),JO?.data||[];let $=await O.json(),S=[];for(let V of $){if(V.type!=="dir")continue;let J=`Official ${V.name} skill`;try{let j=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${V.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(j.ok){let X=(await j.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(X)J=X[1].trim().slice(0,100)}}catch{}S.push({name:V.name,description:J,tag:"Official",author:"Anthropic"})}return JO={data:S,timestamp:Date.now()},S}catch(O){return OO.warn("Failed to fetch skills catalog from GitHub:",O),JO?.data||[]}}var KS=()=>{let O=new Wx;return O.get("/",async($)=>{try{let S=wO();await S.initialize();let V=S.getAll(),J=await WS(),j=V.map((G)=>({id:G.name,name:G.name,enabled:!J.disabled.includes(G.name),description:G.description||"",version:G.version||"1.0.0",provider:"Local",location:G.source==="builtin"?"Built-in":G.basePath,capabilities:["prompts"],allowedTools:G.allowedTools||[]}));return $.json(j)}catch(S){return OO.error("[SkillsRoutes] Failed to get skills:",S),$.json([])}}),O.post("/:name/toggle",async($)=>{try{let S=$.req.param("name"),V=await $.req.json();return await zx(S,V.enabled),$.json({success:!0,enabled:V.enabled})}catch(S){return OO.error("[SkillsRoutes] Failed to toggle skill:",S),$.json({success:!1,error:S.message},500)}}),O.delete("/:name",async($)=>{try{let S=$.req.param("name"),V=`${process.env.HOME}/.blade/skills/${S}`;return await s.rm(V,{recursive:!0,force:!0}),await wO().refresh(),$.json({success:!0})}catch(S){return OO.error("[SkillsRoutes] Failed to uninstall skill:",S),$.json({success:!1,error:S.message},500)}}),O.post("/install",async($)=>{try{let S=await $.req.json(),V=HS(),J=wO(),j=!1;if(S.source==="catalog"&&S.name){if(j=await V.installOfficialSkill(S.name),!j)return $.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(S.source==="repo"&&S.url){if(j=await V.installFromRepo(S.url,S.name),!j)return $.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(S.source==="local"&&S.path){if(j=await V.installFromLocal(S.path,S.name),!j)return $.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 $.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await J.refresh(),$.json({success:!0})}catch(S){return OO.error("[SkillsRoutes] Failed to install skill:",S),$.json({success:!1,error:S.message},500)}}),O.get("/catalog",async($)=>{try{let S=await bx();return $.json(S)}catch(S){return OO.error("[SkillsRoutes] Failed to get catalog:",S),$.json([])}}),O};import Ex from"fast-glob";import{Hono as yx}from"hono";import{execSync as qx}from"node:child_process";import{readdir as Cx}from"node:fs/promises";import MO from"node:path";var UO=q("Service"),Lx=(O)=>{try{return qx("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},Fx=[...BO.map((O)=>`${O}/**`),...BO,...kO.map((O)=>`**/${O}`)],fx=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),pS=()=>{let O=new yx;return O.get("/commands",async($)=>{try{let S=$.req.query("q")||"",V=zS(S).filter((J)=>!fx.has(J.command));return $.json(V)}catch(S){return UO.error("[SuggestionsRoutes] Failed to get command suggestions:",S),$.json([])}}),O.get("/files",async($)=>{try{let S=$.req.query("q")||"",V=$.get("directory")||m(),J=Math.min(Number($.req.query("limit"))||100,1000),G=(await Ex("**/*",{cwd:V,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:Fx})).map((w)=>w.replace(/\\/g,"/"));if(!S)return $.json(G.slice(0,J));let X=S.toLowerCase(),A=G.filter((w)=>w.toLowerCase().includes(X)).slice(0,J);return $.json(A)}catch(S){return UO.error("[SuggestionsRoutes] Failed to get file suggestions:",S),$.json([])}}),O.get("/files/tree",async($)=>{try{let S=$.get("directory")||m(),V=$.req.query("path")||"",J=V?MO.join(S,V):S,G=(await Cx(J,{withFileTypes:!0})).map((w)=>({name:w.name,path:V?`${V}/${w.name}`:w.name,type:w.isDirectory()?"dir":"file"}));G.sort((w,D)=>{if(w.type!==D.type)return w.type==="dir"?-1:1;return w.name.localeCompare(D.name)});let X=new Set(BO),A=G.filter((w)=>{let D=w.name;if(D.startsWith("."))return!1;if(X.has(D))return!1;for(let N of kO)if(D.match(new RegExp(N.replace("*",".*"))))return!1;return!0});return $.json(A)}catch(S){return UO.error("[SuggestionsRoutes] Failed to get file tree:",S),$.json([])}}),O.get("/files/content",async($)=>{try{let S=$.req.query("path");if(!S)return $.json({error:"Missing file path"},400);let V=$.get("directory")||m(),J=MO.resolve(V,S),j=MO.relative(V,J);if(j.startsWith("..")||MO.isAbsolute(j))return $.json({error:"Invalid file path"},400);let G=DS(),X=await G.stat(J);if(!X?.isFile)return $.json({error:"File not found"},404);let A=200000,w=await G.readTextFile(J),D=w.length>A;return $.json({path:S,content:D?w.slice(0,A):w,truncated:D,size:X.size})}catch(S){return UO.error("[SuggestionsRoutes] Failed to get file content:",S),$.json({error:"Failed to read file"},500)}}),O.get("/git-info",async($)=>{try{let S=$.get("directory")||m(),V=Lx(S);return $.json({branch:V})}catch(S){return UO.error("[SuggestionsRoutes] Failed to get git info:",S),$.json({branch:null})}}),O};import{Hono as mx}from"hono";var e=q("Service"),GO=new Map,bS=2097152,ES=65536;function yS(){return typeof globalThis.Bun<"u"}async function hx(O,$,S){if(yS()){let{spawn:j}=await import("bun-pty"),G=j(O,$,{name:"xterm-256color",cwd:S.cwd,env:S.env});return{pid:G.pid,write:(X)=>G.write(X),resize:(X,A)=>G.resize(X,A),kill:()=>G.kill(),onData:(X)=>G.onData(X),onExit:(X)=>G.onExit(X)}}let J=(await import("node-pty")).spawn(O,$,{name:"xterm-256color",cwd:S.cwd,env:S.env,cols:80,rows:24});return{pid:J.pid,write:(j)=>J.write(j),resize:(j,G)=>J.resize(j,G),kill:()=>J.kill(),onData:(j)=>{J.onData(j)},onExit:(j)=>{J.onExit(j)}}}var IO=void 0,RO;if(yS())try{let{createBunWebSocket:O}=await import("hono/bun"),$=O();RO=$.upgradeWebSocket,IO=$.websocket}catch(O){e.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function qS(O,$){let S=`term-${Date.now()}`;e.info(`[Terminal] New connection: ${S}, cwd: ${O}`);let V=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",J=V.endsWith("sh")?["-l"]:[],j=await hx(V,J,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),G={id:S,process:j,cwd:O,buffer:"",subscribers:new Set};if(GO.set(S,G),G.subscribers.add($),j.onData((X)=>{let A=!1;for(let w of G.subscribers)try{w.send(X),A=!0}catch{G.subscribers.delete(w)}if(A)return;if(G.buffer+=X,G.buffer.length>bS)G.buffer=G.buffer.slice(-bS)}),j.onExit(({exitCode:X})=>{e.info(`[Terminal] Process exited: ${S}, code: ${X}`);for(let A of G.subscribers)try{A.close()}catch{}GO.delete(S)}),G.buffer){let X=G.buffer;G.buffer="";for(let A=0;A<X.length;A+=ES)$.send(X.slice(A,A+ES))}return{session:G,cleanup:()=>{if(e.info(`[Terminal] Connection closed: ${S}`),G.subscribers.delete($),G.subscribers.size===0){try{G.process.kill()}catch{}GO.delete(S)}}}}function CS(O,$){O.on("connection",async(S,V)=>{let J=new URL(V.url||"/",`http://${V.headers.host}`);if(!J.pathname.endsWith("/terminal/ws")){S.close();return}let j=J.searchParams.get("cwd")||$()||m();try{let{session:G,cleanup:X}=await qS(j,{send:(A)=>S.send(A),close:()=>S.close()});S.on("message",(A)=>{try{G.process.write(String(A))}catch(w){e.error("[Terminal] Failed to write to PTY:",w)}}),S.on("close",X),S.on("error",X)}catch(G){e.error("[Terminal] Failed to spawn PTY:",G),S.close()}})}var LS=()=>{let O=new mx;if(O.get("/status",($)=>{let S=Array.from(GO.values()).map((V)=>({id:V.id,cwd:V.cwd}));return $.json({active:S.length,terminals:S})}),O.post("/kill/:terminalId",($)=>{let S=$.req.param("terminalId"),V=GO.get(S);if(V){try{V.process.kill()}catch{}for(let J of V.subscribers)J.close();return GO.delete(S),$.json({success:!0})}return $.json({success:!1,error:"Terminal not found"},404)}),RO)O.get("/ws",RO(($)=>{let S=$.req.query("cwd")||$.get("directory")||m(),V;return{async onOpen(J,j){try{V=await qS(S,{send:(G)=>j.send(G),close:()=>j.close()})}catch(G){e.error("[Terminal] Failed to spawn PTY:",G),j.close()}},onMessage(J){if(!V)return;try{V.session.process.write(String(J.data))}catch(j){e.error("[Terminal] Failed to write to PTY:",j)}},onClose(){V?.cleanup()}}}));else O.get("/ws",($)=>{return $.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};var R=q("Service"),gO=[];function lx(){let O=Rx(gx(import.meta.url)),$=[SO(O,"web"),SO(m(),"dist/web"),SO(m(),"packages/cli/dist/web")];for(let S of $){let V=SO(S,"index.html");if(mS(V)){if(HO(V,"utf-8").includes("/assets/"))return R.debug(`[Server] Found web dist at: ${S}`),S}}return null}function cx(){let O=new vx;O.onError((S,V)=>{if(R.error("[Server] Request error:",S),S instanceof I)return V.json(S.toObject(),S.statusCode);let J=S instanceof Error?S.message:String(S);return V.json({error:{code:"INTERNAL_ERROR",message:J}},500)}),O.use(async(S,V)=>{let J=process.env.BLADE_SERVER_PASSWORD;if(!J)return V();let j=S.req.path;if(j==="/"||j.startsWith("/assets/")||j.endsWith(".html")||j.endsWith(".js")||j.endsWith(".css"))return V();let G=S.req.header("Authorization");if(!G?.startsWith("Basic "))return S.header("WWW-Authenticate",'Basic realm="Blade Server"'),S.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let X=Buffer.from(G.slice(6),"base64").toString(),[A,w]=X.split(":"),D=process.env.BLADE_SERVER_USERNAME??"blade";if(A!==D||w!==J)return S.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return V()}),O.use(async(S,V)=>{let J=S.req.path==="/health"||S.req.path==="/global/health"||S.req.path.startsWith("/assets/");if(!J)R.debug(`[Server] ${S.req.method} ${S.req.path}`);let j=Date.now();if(await V(),!J){let G=Date.now()-j;R.debug(`[Server] ${S.req.method} ${S.req.path} - ${S.res.status} (${G}ms)`)}}),O.use(ux({origin(S){if(!S)return;if(S.startsWith("http://localhost:"))return S;if(S.startsWith("http://127.0.0.1:"))return S;if(S==="tauri://localhost"||S==="http://tauri.localhost")return S;if(gO.includes(S))return S;return}})),O.use(async(S,V)=>{let J=S.req.query("directory")||S.req.header("x-blade-directory")||m();try{J=decodeURIComponent(J)}catch{}return S.set("directory",J),V()}),O.route("/global",tO()),O.route("/events",uO()),O.route("/sessions",AS()),O.route("/configs",vO()),O.route("/permissions",_S()),O.route("/providers",BS()),O.route("/models",oO()),O.route("/suggestions",pS()),O.route("/terminal",LS()),O.route("/mcp",lO()),O.route("/skills",KS()),O.get("/health",(S)=>{return S.json({healthy:!0,version:VO()})});let $=lx();if($)R.info(`[Server] Serving static files from ${$}`),O.get("/assets/*",(S)=>{let V=SO($,S.req.path);if(!mS(V))return S.json({error:{code:"NOT_FOUND",message:`File not found: ${S.req.path}`}},404);let J=HO(V),j=Ix(V).toLowerCase(),X={".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"}[j]||"application/octet-stream";return new Response(J,{headers:{"Content-Type":X,"Cache-Control":"public, max-age=31536000, immutable"}})}),O.get("/",(S)=>{let V=SO($,"index.html"),J=HO(V,"utf-8");return S.html(J)}),O.get("*",(S)=>{let V=S.req.path;if(V.includes("."))return S.json({error:{code:"NOT_FOUND",message:`File not found: ${V}`}},404);let J=SO($,"index.html"),j=HO(J,"utf-8");return S.html(j)});else R.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",(S)=>{return S.json({message:"Blade API Server",version:VO(),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("*",(S)=>{return S.json({error:{code:"NOT_FOUND",message:`Route not found: ${S.req.path}`}},404)});return O}function dx(){let O=Px(),$=[];for(let S of Object.keys(O)){let V=O[S];if(!V)continue;for(let J of V){if(J.internal||J.family!=="IPv4")continue;if(J.address.startsWith("172."))continue;$.push(J.address)}}return $}function FS(){return typeof globalThis.Bun<"u"}function fS(O,$){let S=globalThis.Bun,V=(j)=>{try{return S.serve({hostname:$.hostname,port:j,fetch:O.fetch,idleTimeout:0,websocket:IO})}catch(G){R.error("Failed to start Bun server:",G);return}},J=$.port===0?V(4096)??V(0):V($.port);if(!J)throw Error(`Failed to start Bun server on port ${$.port}`);return{url:J.url,port:J.port,hostname:J.hostname,stop:async()=>{J.stop(!0)}}}function ax(O,$){return new Promise((S,V)=>{let J=kx(async(w,D)=>{let N=new URL(w.url||"/",`http://${w.headers.host}`),U=new Headers;for(let[Z,T]of Object.entries(w.headers))if(T)if(Array.isArray(T))for(let _ of T)U.append(Z,_);else U.set(Z,T);let Y;if(w.method!=="GET"&&w.method!=="HEAD")Y=(await new Promise((T)=>{let _=[];w.on("data",(W)=>_.push(W)),w.on("end",()=>T(Buffer.concat(_)))})).toString();let Q=new Request(N.toString(),{method:w.method,headers:U,body:Y});try{let Z=await O.fetch(Q);if(D.statusCode=Z.status,Z.headers.forEach((T,_)=>{D.setHeader(_,T)}),Z.body){let T=Z.body.getReader(),_=async()=>{let{done:W,value:K}=await T.read();if(W){D.end();return}return D.write(K),_()};await _()}else{let T=await Z.text();D.end(T)}}catch(Z){R.error("[Server] Node request error:",Z),D.statusCode=500,D.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),j=new tx({noServer:!0}),G=m();CS(j,()=>G),J.on("upgrade",(w,D,N)=>{if(new URL(w.url||"/",`http://${w.headers.host}`).pathname==="/terminal/ws")j.handleUpgrade(w,D,N,(Y)=>{j.emit("connection",Y,w)});else D.destroy()});let X=(w)=>{return new Promise((D,N)=>{J.once("error",(U)=>{if(U.code==="EADDRINUSE")N(U);else N(U)}),J.listen(w,$.hostname,()=>{let U=J.address();if(U&&typeof U==="object")D(U.port);else D(w)})})};(async()=>{let w;if($.port===0)try{w=await X(4096)}catch{w=await X(0)}else w=await X($.port);let D=new URL(`http://${$.hostname==="0.0.0.0"?"localhost":$.hostname}:${w}`);S({url:D,port:w,hostname:$.hostname,stop:async()=>{return new Promise((N)=>{j.close(()=>{J.close(()=>N())})})}})})().catch(V)})}var hS;((M$)=>{let O,$;function S(){if(!$)$=cx();return $}M$.getApp=S;function V(G){gO=G.cors??[];let X=S();if(FS())O=fS(X,G),R.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 A=O;return{url:A.url,port:A.port,hostname:A.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,$=void 0,R.info("[Server] Blade server stopped")}}}M$.listen=V;async function J(G){gO=G.cors??[];let X=S();if(FS())O=fS(X,G),R.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else O=await ax(X,G),R.info(`[Server] Blade server listening on ${O.url} (Node.js runtime)`);let A=O;return{url:A.url,port:A.port,hostname:A.hostname,stop:async()=>{if(O)await O.stop(),O=void 0,$=void 0,R.info("[Server] Blade server stopped")}}}M$.listenAsync=J;function j(){return O!==void 0}M$.isRunning=j})(hS||={});export{ox as a,ix as b,dx as c,hS as d};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Ja as a,Ka as b,La as c,Ma as d,Na as e,Oa as f}from"./chunk-pdydx73a.js";import"./chunk-dr06x0cw.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ca as O}from"./chunk-k47ssv3b.js";import{Aa as J,Ca as L}from"./chunk-tv4r86ez.js";import"./chunk-qwdbqjh7.js";import"./chunk-pdydx73a.js";import"./chunk-9xkjb87h.js";import"./chunk-ctqf59q1.js";import"./chunk-jt62ctz7.js";import{Ib as H}from"./chunk-gsfkrr25.js";import"./chunk-34pdtz4q.js";import"./chunk-hjx5n3dw.js";import"./chunk-dr06x0cw.js";import P from"os";import E from"path";function _(q){return typeof q==="string"?q:void 0}function T(q){if(!Array.isArray(q))return;let z=[];for(let F of q)if(typeof F==="string")z.push(F);else if(F!=null)z.push(String(F));return z}function G(){console.log(`
|
|
2
2
|
blade mcp
|
|
3
3
|
`),console.log(`管理 MCP 服务器
|
|
4
4
|
`),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e={name:"blade-code",version:"0.8.1",private:!1,description:"🗡️ Blade Code - 智能代码助手命令行工具",type:"module",bin:{blade:"dist/blade.js"},files:["dist","vendor/ripgrep/**","README.md"],scripts:{dev:"node scripts/run-bun.js --watch src/blade.tsx","dev:serve":"node scripts/run-bun.js --watch src/blade.tsx serve --port 4097",build:"rm -rf dist && node scripts/run-bun.js run scripts/build.ts",start:"node scripts/run-bun.js run dist/blade.js",test:"node scripts/test.js","test:all":"vitest run --config vitest.config.ts","test:unit":"node scripts/test.js unit","test:integration":"node scripts/test.js integration","test:real-api":"node scripts/test.js realApi","test:cli":"node scripts/test.js cli","test:headless-core":"node scripts/test.js headlessCore","test:e2e":"node scripts/test.js e2e","test:performance":"node scripts/test.js performance","test:snapshot":"node scripts/test.js snapshot","test:security":"node scripts/test.js security","test:coverage":"node scripts/test.js all --coverage","test:watch":"vitest --watch --config vitest.config.ts","qualify:local":"node scripts/run-bun.js run scripts/qualify.ts local","qualify:production":"node scripts/run-bun.js run scripts/qualify.ts production","benchmark:repo":"node scripts/run-bun.js run scripts/run-real-repo-benchmark.ts","test:update-snapshots":"node scripts/test.js snapshot --update",lint:"biome lint src tests","lint:fix":"biome lint --write src tests","type-check":"tsc --noEmit","format:check":"biome format src tests",ready:"node scripts/run-bun.js run scripts/qualify.ts production","detect-unused":"node scripts/run-bun.js run scripts/detect-unused.ts",release:"node scripts/release.js","release:dry":"node scripts/release.js --dry-run","release:major":"node scripts/release.js --major","release:minor":"node scripts/release.js --minor","release:patch":"node scripts/release.js --patch"},keywords:["cli","blade","ai","assistant","agent","llm"],author:"echoVic",license:"MIT",engines:{node:">=22.19.0"},optionalDependencies:{"@vscode/ripgrep":"^1.17.0","bun-pty":"^0.4.8","node-pty":"1.0.0"},dependencies:{"@agentclientprotocol/sdk":"^0.12.0","@anthropic-ai/sandbox-runtime":"0.0.67","@earendil-works/pi-ai":"0.83.0","@inkjs/ui":"^2.0.0","@modelcontextprotocol/sdk":"^1.17.4",ahooks:"^3.9.6","ansi-escapes":"^7.2.0","async-mutex":"^0.5.0",axios:"^1.12.2",chalk:"^5.4.1",diff:"^8.0.2","fast-glob":"^3.3.3","fuse.js":"^7.1.0","gray-matter":"^4.0.3",hono:"^4.7.10",ink:"npm:@jrichman/ink@6.4.10","ink-big-text":"^2.0.0","ink-gradient":"^3.0.0","ink-select-input":"^6.2.0","ink-spinner":"^5.0.0","ink-text-input":"^6.0.0","js-tiktoken":"^1.0.21","lodash-es":"^4.17.21",lowlight:"^3.3.0","lru-cache":"^11.2.4",nanoid:"^5.1.6",open:"^10.1.2",openai:"^6.2.0",picomatch:"^4.0.3",react:"^19.1.1","react-dom":"^19.1.1",semver:"^7.7.3","string-width":"^8.1.0",undici:"^7.16.0","write-file-atomic":"^7.0.0",ws:"^8.18.0",yaml:"^2.8.1",yargs:"^18.0.0",typebox:"1.3.7",zustand:"^5.0.9"},devDependencies:{"@biomejs/biome":"^2.2.4","@types/bun":"^1.3.4","@types/json-schema":"^7.0.15","@types/lodash-es":"^4.17.12","@types/node":"^22.15.24","@types/picomatch":"^4.0.2","@types/react":"^19.1.1","@types/react-dom":"^19.1.1","@types/semver":"^7.7.1","@types/write-file-atomic":"^4.0.3","@types/ws":"^8.5.12","@types/yargs":"^17.0.33","@vitest/coverage-v8":"^3.0.0",jsdom:"^26.0.0",typescript:"^5.9.2",vitest:"^3.0.0"}};function r(){return{name:e.name,version:e.version,description:e.description}}function n(){return e.version}function o(){return e.name}function c(){return e.description}function d(){return`v${e.version}`}function a(){return`v${e.version} © 2025 Blade Code`}
|
|
2
|
+
export{r as Ja,n as Ka,o as La,c as Ma,d as Na,a as Oa};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import{Ib as V,Kb as L,Lb as M}from"./chunk-gsfkrr25.js";import{Tb as b}from"./chunk-34pdtz4q.js";import{dc as E}from"./chunk-hjx5n3dw.js";var G={currentModelId:"",models:[],temperature:0,maxOutputTokens:void 0,stream:!0,topP:0.9,topK:50,timeout:180000,theme:"dracula",uiTheme:"system",language:"zh-CN",fontSize:14,autoSaveSessions:!0,notifyBuild:!0,notifyErrors:!1,notifySounds:!1,privacyTelemetry:!1,privacyCrash:!0,debug:!1,mcpEnabled:!1,mcpServers:{},permissions:{allow:["Bash(pwd)","Bash(which *)","Bash(whoami)","Bash(hostname)","Bash(uname *)","Bash(date)","Bash(echo *)","Bash(ls *)","Bash(tree *)","Bash(git status)","Bash(git status -*)","Bash(git log *)","Bash(git diff *)","Bash(git show *)","Bash(git branch -* *)","Bash(git branch)","Bash(git tag -l *)","Bash(git tag --list *)","Bash(git stash list *)","Bash(git stash show *)","Bash(git rev-parse *)","Bash(git describe *)","Bash(git blame *)","Bash(git ls-files *)","Bash(git config --get *)","Bash(git config --list *)","Bash(git shortlog *)","Bash(git merge-base *)","Bash(git cat-file *)","Bash(git for-each-ref *)","Bash(git grep *)","Bash(git worktree list *)","Bash(git reflog show *)","Bash(git reflog)","Bash(git rev-list *)","Bash(git ls-remote *)","Bash(git remote -v)","Bash(git remote --verbose)","Bash(git remote)","Bash(gh pr view *)","Bash(gh pr list *)","Bash(gh pr diff *)","Bash(gh pr checks *)","Bash(gh pr status *)","Bash(gh issue view *)","Bash(gh issue list *)","Bash(gh issue status *)","Bash(gh run list *)","Bash(gh run view *)","Bash(gh repo view *)","Bash(gh auth status)","Bash(npm list *)","Bash(bun pm ls *)","Bash(npm view *)","Bash(npm outdated *)","Bash(pnpm list *)","Bash(yarn list *)","Bash(pip list *)","Bash(pip show *)"],ask:["Bash(curl *)","Bash(wget *)","Bash(aria2c *)","Bash(axel *)","Bash(rm -rf *)","Bash(rm -r *)","Bash(rm --recursive *)","Bash(nc *)","Bash(netcat *)","Bash(telnet *)","Bash(ncat *)"],deny:["Read(./.env)","Read(./.env.*)","Bash(rm -rf /)","Bash(rm -rf /*)","Bash(sudo *)","Bash(chmod 777 *)","Bash(bash *)","Bash(sh *)","Bash(zsh *)","Bash(fish *)","Bash(dash *)","Bash(eval *)","Bash(source *)","Bash(mkfs *)","Bash(fdisk *)","Bash(dd *)","Bash(format *)","Bash(parted *)","Bash(open http*)","Bash(open https*)","Bash(xdg-open http*)","Bash(xdg-open https*)"]},permissionMode:"default",hooks:{enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,PreToolUse:[],PostToolUse:[],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]},env:{},disableAllHooks:!1,maxTurns:-1};import{promises as T}from"fs";import{merge as A}from"lodash-es";import R from"os";import $ from"path";var x={sonnet:"claude-sonnet-4-20250514",opus:"claude-opus-4-20250514",haiku:"claude-3-5-haiku-20241022",claude:"claude-sonnet-4-20250514",gpt4o:"gpt-4o",gpt4:"gpt-4o",o1:"o1",o3:"o3","o4-mini":"o4-mini",deepseek:"deepseek-chat","deepseek-v3":"deepseek-chat","deepseek-r1":"deepseek-reasoner","deepseek-v4":"deepseek-v4-0324",gemini:"gemini-2.5-pro",flash:"gemini-2.5-flash",qwen:"qwen3-235b-a22b","qwen-max":"qwen-max","qwen-plus":"qwen-plus"};function _(J){let q=J.toLowerCase().trim();return x[q]??J}class N{static instance=null;runtimePermissionOverrides;constructor(){}static getInstance(){if(!N.instance)N.instance=new N;return N.instance}static resetInstance(){N.instance=null}async initialize(J){try{this.runtimePermissionOverrides=J?.permissions;let q=await this.loadConfigFiles(),H=await this.loadSettingsFiles(),K={...q,...H};if(J)K=this.mergeSettings(K,J);let Q=this.normalizeConfig(K),W={...G,...Q};if(this.resolveEnvInterpolation(W),process.env.BLADE_MODEL&&W.models?.length>0){let X=_(process.env.BLADE_MODEL),Y=W.models.find((Z)=>Z.id===X||Z.model===X||Z.id===process.env.BLADE_MODEL||Z.model===process.env.BLADE_MODEL);if(Y)W.currentModelId=Y.id}if(process.env.BLADE_DEBUG)W.debug=process.env.BLADE_DEBUG==="1"||process.env.BLADE_DEBUG==="true"||process.env.BLADE_DEBUG;if(W.models.length>0)this.validateConfig(W);if(W.debug)console.log("[ConfigManager] Configuration loaded successfully");return W}catch(q){return console.error("[ConfigManager] Failed to initialize:",q),G}}async loadConfigFiles(){let J=$.join(R.homedir(),".blade","config.json"),q=$.join(V(),".blade","config.json"),H={},K=await this.loadJsonFile(J);if(K)H={...H,...K};let Q=await this.loadJsonFile(q);if(Q){let W={...H.mcpServers||{},...Q.mcpServers||{}};if(H={...H,...Q},Object.keys(W).length>0)H.mcpServers=W}return H}async loadSettingsFiles(){let J=$.join(R.homedir(),".blade","settings.json"),q=$.join(V(),".blade","settings.json"),H=$.join(V(),".blade","settings.local.json"),K={},Q=await this.loadJsonFile(J);if(Q)K=this.mergeSettings(K,Q);let W=await this.loadJsonFile(q);if(W)K=this.mergeSettings(K,W);let X=await this.loadJsonFile(H);if(X)K=this.mergeSettings(K,X);return K}async loadWorkspacePermissions(J,q){let H={allow:[...q.allow],ask:[...q.ask],deny:[...q.deny]};if($.resolve(J)!==$.resolve(V())){let Q=await this.loadWorkspacePermissionOverrides(V()),W=await this.loadJsonFile($.join(R.homedir(),".blade","settings.json")),X={allow:Array.from(new Set([...G.permissions.allow,...W?.permissions?.allow||[],...this.runtimePermissionOverrides?.allow||[]])),ask:Array.from(new Set([...G.permissions.ask,...W?.permissions?.ask||[],...this.runtimePermissionOverrides?.ask||[]])),deny:Array.from(new Set([...G.permissions.deny,...W?.permissions?.deny||[],...this.runtimePermissionOverrides?.deny||[]]))};for(let Y of["allow","ask","deny"]){let Z=new Set(Q[Y].filter((F)=>!X[Y].includes(F)));H[Y]=H[Y].filter((F)=>!Z.has(F))}}let K=await this.loadWorkspacePermissionOverrides(J);for(let Q of["allow","ask","deny"])H[Q]=Array.from(new Set([...H[Q],...K[Q]]));return H}async loadWorkspacePermissionOverrides(J){let q={allow:[],ask:[],deny:[]},H=[$.join(J,".blade","settings.json"),$.join(J,".blade","settings.local.json")];for(let K of H){let Q=await this.loadJsonFile(K);if(!Q?.permissions)continue;for(let W of["allow","ask","deny"])q[W]=Array.from(new Set([...q[W],...Q.permissions[W]||[]]))}return q}mergeSettings(J,q){let H={...JSON.parse(JSON.stringify(J)),...JSON.parse(JSON.stringify(q))};if(q.permissions)H.permissions={allow:Array.from(new Set([...J.permissions?.allow||[],...q.permissions.allow||[]])),ask:Array.from(new Set([...J.permissions?.ask||[],...q.permissions.ask||[]])),deny:Array.from(new Set([...J.permissions?.deny||[],...q.permissions.deny||[]]))};if(q.hooks)H.hooks=A({},H.hooks,q.hooks);if(q.env)H.env=A({},H.env,q.env);if(q.mcpServers)H.mcpServers={...H.mcpServers||{},...q.mcpServers};if(q.disableAllHooks!==void 0)H.disableAllHooks=q.disableAllHooks;if(q.permissionMode!==void 0)H.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)H.maxTurns=q.maxTurns;return H}resolveEnvInterpolation(J){let q=/\$\{?([A-Z_][A-Z0-9_]*)(:-([^}]+))?\}?/g,H=(Q)=>{if(typeof Q==="string")return Q.replace(q,(W,X,Y,Z)=>{return process.env[X]||Z||W});if(Array.isArray(Q))return Q.map(H);if(typeof Q==="object"&&Q!==null){let W=Q;for(let[X,Y]of Object.entries(W))W[X]=H(Y);return W}return Q},K=J;for(let[Q,W]of Object.entries(K))K[Q]=H(W)}async loadJsonFile(J){try{if(await this.fileExists(J)){let q=await T.readFile(J,"utf-8");return JSON.parse(q)}}catch(q){console.warn(`[ConfigManager] Failed to load ${J}:`,q)}return null}async fileExists(J){try{return await T.access(J),!0}catch{return!1}}normalizeConfig(J){let q=JSON.parse(JSON.stringify(J)),H=(Q)=>Q.trim().replace(/^`|`$/g,""),K=(Q)=>{for(let[W,X]of Object.entries(Q))if(typeof X==="string")Q[W]=H(X);else if(Array.isArray(X))X.forEach((Y,Z)=>{if(typeof Y==="string")X[Z]=H(Y);else if(typeof Y==="object"&&Y!==null)K(Y)});else if(typeof X==="object"&&X!==null)K(X)};return K(q),q}validateConfig(J){let q=[];if(!J.models||J.models.length===0)q.push("没有可用的模型配置");if(!L(J.maxTurns))q.push(`maxTurns 必须是 ${M()}`);if(J.models&&J.models.length>0){if(!J.currentModelId)q.push("未设置当前模型 ID");else if(!J.models.find((K)=>K.id===J.currentModelId))q.push(`当前模型 ID "${J.currentModelId}" 在 models 列表中不存在`);for(let H of J.models){let K=`模型 "${H.displayName||H.id}"`,Q=["name","apiKey","baseUrl","maxContextTokens","maxOutputTokens","supportsThinking","thinkingBudget","thinkingMode"].filter((W)=>(W in H));if(Q.length>0)q.push(`${K}: 不再支持旧字段 ${Q.join(", ")};请重新配置模型`);if(!H.model)q.push(`${K}: model 字段必填`);if(!H.provider)q.push(`${K}: provider 字段必填`);if(H.overrides?.baseUrl&&!H.overrides.baseUrl.startsWith("http"))q.push(`${K}: overrides.baseUrl "${H.overrides.baseUrl}" 不是有效的 HTTP URL`);try{E().getModel(H.provider,H.model)}catch{q.push(`${K}: 内置 catalog 中不存在 ${H.provider}/${H.model}`)}}}if(q.length>0)throw Error(`配置验证失败:
|
|
2
|
+
${q.map((H)=>` - ${H}`).join(`
|
|
3
|
+
`)}
|
|
4
|
+
|
|
5
|
+
`+`请通过以下方式之一提供配置:
|
|
6
|
+
`+` 1. 首次启动: 运行 blade,系统会自动引导配置
|
|
7
|
+
`+` 2. 添加模型: blade 后输入 /model add
|
|
8
|
+
`+` 3. 初始化向导: 输入 /init
|
|
9
|
+
|
|
10
|
+
`+`配置文件示例 (~/.blade/config.json):
|
|
11
|
+
`+`{
|
|
12
|
+
"currentModelId": "model-id-123",
|
|
13
|
+
"models": [
|
|
14
|
+
{
|
|
15
|
+
"id": "model-id-123",
|
|
16
|
+
`+` "displayName": "默认模型",
|
|
17
|
+
`+` "provider": "deepseek",
|
|
18
|
+
"model": "deepseek-v4-pro"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
`)}}function y(J,q={}){let H={...J};if(q.debug!==void 0)H.debug=q.debug===""?!0:q.debug;if(q.model){if(!J.models.some((Q)=>Q.id===q.model))throw Error(`模型配置未找到: ${q.model}`);H.currentModelId=q.model}if(q.yolo===!0)H.permissionMode="yolo";else if(q.permissionMode!==void 0)H.permissionMode=q.permissionMode;if(q.maxTurns!==void 0)H.maxTurns=q.maxTurns;return H.systemPrompt=q.systemPrompt,H.appendSystemPrompt=q.appendSystemPrompt,H.model=q.model,H.resumeSessionId=q.sessionId,H.forkSession=q.forkSession,H.allowedTools=q.allowedTools,H.disallowedTools=q.disallowedTools,H.mcpConfigPaths=q.mcpConfig,H.strictMcpConfig=q.strictMcpConfig,H.addDirs=q.addDir,H.outputFormat=q.outputFormat,H.inputFormat=q.inputFormat,H.print=q.print,H.includePartialMessages=q.includePartialMessages,H.replayUserMessages=q.replayUserMessages,H.agentsConfig=q.agents,H.settingSources=q.settingSources,H}import{promises as D}from"node:fs";import w from"node:os";import B from"node:path";import{Mutex as j}from"async-mutex";import{merge as k}from"lodash-es";import C from"write-file-atomic";var S=b("Service"),U={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},Yq=new Set(Object.entries(U).filter(([J,q])=>q.persistable).map(([J])=>J)),Zq=new Set(Object.entries(U).filter(([J,q])=>!q.persistable).map(([J])=>J));class z{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!z.instance)z.instance=new z;return z.instance}static resetInstance(){if(z.instance)for(let J of z.instance.timers.values())clearTimeout(J);z.instance=null}async save(J,q={}){this.validatePersistableFields(J);let H=this.groupUpdatesByTarget(J,q.scope,q.projectDir);if(q.immediate)await Promise.all(Array.from(H.entries()).map(([K,Q])=>this.flushTarget(K,Q)));else for(let[K,Q]of H)this.scheduleSave(K,Q)}async flush(){for(let q of this.timers.values())clearTimeout(q);this.timers.clear();let J=Array.from(this.pendingUpdates.entries()).map(([q,H])=>this.flushTarget(q,H));this.pendingUpdates.clear(),await Promise.all(J)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(J,q={}){await this.appendPermissionRuleForDecision(J,"allow",q)}async appendPermissionDenyRule(J,q={}){await this.appendPermissionRuleForDecision(J,"deny",q)}async appendPermissionRuleForDecision(J,q,H){let K=H.scope??"local",Q=this.resolveFilePath("settings",K,H.projectDir);await this.flushTargetWithModifier(Q,(W)=>{let X=W.permissions??{allow:[],ask:[],deny:[]},Y={allow:q==="allow"?this.dedupeArray([...X.allow||[],J]):X.allow||[],ask:X.ask||[],deny:q==="deny"?this.dedupeArray([...X.deny||[],J]):X.deny||[]};return{...W,permissions:Y}})}async appendLocalPermissionRule(J,q={}){await this.appendPermissionRule(J,{...q,scope:"local"})}async appendLocalPermissionDenyRule(J,q={}){await this.appendPermissionDenyRule(J,{...q,scope:"local"})}validatePersistableFields(J){for(let q of Object.keys(J)){let H=U[q];if(!H)throw Error(`Unknown config field: ${q}`);if(!H.persistable)throw Error(`Field "${q}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(J,q,H){let K=new Map;for(let[Q,W]of Object.entries(J)){let X=U[Q];if(!X)continue;let Y=q??X.defaultScope,Z=this.resolveFilePath(X.target,Y,H);if(!K.has(Z))K.set(Z,{});K.get(Z)[Q]=W}return K}resolveFilePath(J,q,H){let K=H??V();if(J==="config")return q==="global"?B.join(w.homedir(),".blade","config.json"):B.join(K,".blade","config.json");switch(q){case"local":return B.join(K,".blade","settings.local.json");case"project":return B.join(K,".blade","settings.json");case"global":return B.join(w.homedir(),".blade","settings.json");default:return B.join(K,".blade","settings.local.json")}}scheduleSave(J,q){let H=this.pendingUpdates.get(J)??{},K=this.mergePendingUpdates(H,q);this.pendingUpdates.set(J,K);let Q=this.timers.get(J);if(Q)clearTimeout(Q);let W=setTimeout(async()=>{let X=this.pendingUpdates.get(J);if(X){this.pendingUpdates.delete(J),this.timers.delete(J);try{await this.flushTarget(J,X),this.lastSaveError=null}catch(Y){let Z=Y instanceof Error?Y:Error(String(Y));this.lastSaveError=Z,S.error(`Failed to save config to ${J}:`,Z.message),S.error("Stack trace:",Z.stack)}}},this.debounceDelay);this.timers.set(J,W)}mergePendingUpdates(J,q){let H={...J};for(let[K,Q]of Object.entries(q)){let W=U[K];if(!W){H[K]=Q;continue}switch(W.mergeStrategy){case"replace":H[K]=Q;break;case"append-dedupe":this.applyAppendDedupe(H,K,Q);break;case"deep-merge":this.applyDeepMerge(H,K,Q);break}}return H}async flushTarget(J,q){let H=this.fileLocks.get(J);if(!H)H=new j,this.fileLocks.set(J,H);await H.runExclusive(async()=>{await this.performWrite(J,q)})}async flushTargetWithModifier(J,q){let H=this.fileLocks.get(J);if(!H)H=new j,this.fileLocks.set(J,H);await H.runExclusive(async()=>{await D.mkdir(B.dirname(J),{recursive:!0,mode:493});let K={};try{let W=await D.readFile(J,"utf-8");K=JSON.parse(W)}catch{K={}}let Q=q(K);await this.atomicWrite(J,Q)})}async performWrite(J,q){await D.mkdir(B.dirname(J),{recursive:!0,mode:493});let H={};try{let Q=await D.readFile(J,"utf-8");H=JSON.parse(Q)}catch{H={}}let K={...H};for(let[Q,W]of Object.entries(q)){let X=U[Q];if(!X){K[Q]=W;continue}switch(X.mergeStrategy){case"replace":K[Q]=W;break;case"append-dedupe":this.applyAppendDedupe(K,Q,W);break;case"deep-merge":this.applyDeepMerge(K,Q,W);break}}await this.atomicWrite(J,K)}applyAppendDedupe(J,q,H){if(q==="permissions"&&typeof H==="object"&&H!==null){let K=J[q]??{allow:[],ask:[],deny:[]},Q=H;J[q]={allow:this.dedupeArray([...K.allow||[],...Q.allow||[]]),ask:this.dedupeArray([...K.ask||[],...Q.ask||[]]),deny:this.dedupeArray([...K.deny||[],...Q.deny||[]])}}else if(Array.isArray(H)){let K=Array.isArray(J[q])?J[q]:[];J[q]=this.dedupeArray([...K,...H])}else J[q]=H}applyDeepMerge(J,q,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let K=typeof J[q]==="object"&&J[q]!==null?J[q]:{};J[q]=k({},K,H)}else J[q]=H}dedupeArray(J){return Array.from(new Set(J))}async atomicWrite(J,q){await C(J,JSON.stringify(q,null,2),{mode:384,encoding:"utf-8"})}}function O(){return z.getInstance()}export{G as Da,N as Ea,y as Fa,O as Ga};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as m,T as g,U as c,X as d,Z as f}from"./chunk-04920kz2.js";import{Ib as u}from"./chunk-gsfkrr25.js";async function R(){if((await g().initialize(u(),[])).plugins.length>0)await c()}async function x(t){let e=t.message||t._?.[0];if(typeof e==="string"&&e.trim())return e;let n=t.stdin??process.stdin;if(!n.isTTY){let a=[];for await(let l of n)a.push(l);return Buffer.concat(a).toString("utf-8").trim()}if(t.defaultMessage!==void 0)return t.defaultMessage;throw Error("No input provided")}async function P(t){if(!d(t))return{mode:"agent",content:t};let e=await f(t,{cwd:u(),workspaceRoot:u()});if(!e.success)return{mode:"output",content:`Error: ${e.error||"未知错误"}`,exitCode:1};let n=e.data;if(n?.action==="invoke_skill"){let{skillName:a,skillArgs:l}=n;return{mode:"agent",content:l?`Please use the "${a}" skill to help me with: ${l}`:`Please use the "${a}" skill.`}}if(n?.action==="invoke_custom_command"||n?.action==="invoke_plugin_command"){let a=n.processedContent;return{mode:"agent",content:`# Custom Command: /${n.commandName}
|
|
2
2
|
|
|
3
3
|
${a}`}}return{mode:"output",content:e.content||e.message||"",exitCode:0}}function r(t){if(!(t instanceof Error))return!1;return t.message.includes("未找到会话")||t.message.includes("ENOENT")||t.message.includes("no such file")}async function i(t){try{return await m.loadSession(t,u())}catch(e){if(r(e))return null;throw e}}async function y(t){if(t.resume===!0||t.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof t.resume==="string"&&t.resume.length>0){if(t.forkSession){let e=u();return m.forkSession(t.resume,{newSessionId:t.sessionId,sourceProjectPath:e,targetProjectPath:e})}return{sessionId:t.resume,messages:await m.loadSession(t.resume)}}if(t.continue){let e=t.forkSession?await m.listSessions({cwd:u()}):await m.listSessions();if(e.length>0){let n=e[0].sessionId;if(t.forkSession){let a=u();return m.forkSession(n,{newSessionId:t.sessionId,sourceProjectPath:a,targetProjectPath:a})}return{sessionId:n,messages:await m.loadSession(n)}}if(t.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(t.sessionId)return{sessionId:t.sessionId,messages:await i(t.sessionId)??[]};return{sessionId:`${t.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
|
|
4
4
|
export{R as p,x as q,P as r,y as s};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{y as b}from"./chunk-twem6p0g.js";import{ra as T}from"./chunk-tv4r86ez.js";import{Da as S,Ea as h}from"./chunk-qwdbqjh7.js";import{Bb as r,wb as f,yb as n}from"./chunk-ctqf59q1.js";import{Eb as c,Hb as O,Jb as y}from"./chunk-gsfkrr25.js";import{Tb as M}from"./chunk-34pdtz4q.js";import{promises as N}from"node:fs";import E from"node:path";var k=["systemPrompt","appendSystemPrompt","initialMessage","resumeSessionId","forkSession","allowedTools","disallowedTools","mcpConfigPaths","strictMcpConfig","model","addDirs","outputFormat","inputFormat","print","includePartialMessages","replayUserMessages","agentsConfig","settingSources"],B=new Set([...Object.keys(S),...k]),a=n.Number({exclusiveMinimum:0}),l=n.String({minLength:1}),m=n.Array(n.String()),C=n.Object({currentModelId:n.Optional(n.String()),models:n.Optional(n.Array(n.Object({id:l,displayName:n.Optional(l),provider:l,model:l,overrides:n.Optional(n.Object({baseUrl:n.Optional(n.String()),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(a),timeout:n.Optional(a),apiVersion:n.Optional(n.String()),customHeaders:n.Optional(n.Record(n.String(),n.String())),maxRetries:n.Optional(n.Integer({minimum:0})),enablePromptCaching:n.Optional(n.Boolean())})),fallbackModels:n.Optional(n.Array(n.Object({provider:l,model:l})))}))),temperature:n.Optional(n.Number()),maxOutputTokens:n.Optional(a),stream:n.Optional(n.Boolean()),topP:n.Optional(n.Number()),topK:n.Optional(n.Number()),timeout:n.Optional(a),theme:n.Optional(n.String()),uiTheme:n.Optional(r(["light","dark","system"])),language:n.Optional(n.String()),fontSize:n.Optional(a),autoSaveSessions:n.Optional(n.Boolean()),notifyBuild:n.Optional(n.Boolean()),notifyErrors:n.Optional(n.Boolean()),notifySounds:n.Optional(n.Boolean()),privacyTelemetry:n.Optional(n.Boolean()),privacyCrash:n.Optional(n.Boolean()),debug:n.Optional(n.Union([n.Boolean(),n.String()])),mcpEnabled:n.Optional(n.Boolean()),mcpServers:n.Optional(n.Record(n.String(),n.Record(n.String(),n.Unknown()))),permissionMode:n.Optional(n.Enum(O)),maxTurns:n.Optional(n.Integer({minimum:-1,maximum:y})),systemPrompt:n.Optional(n.String()),appendSystemPrompt:n.Optional(n.String()),initialMessage:n.Optional(n.String()),resumeSessionId:n.Optional(n.String()),forkSession:n.Optional(n.Boolean()),allowedTools:n.Optional(n.Array(l)),disallowedTools:n.Optional(n.Array(l)),mcpConfigPaths:n.Optional(n.Array(l)),strictMcpConfig:n.Optional(n.Boolean()),model:n.Optional(l),addDirs:n.Optional(n.Array(l)),outputFormat:n.Optional(r(["text","json","stream-json","jsonl"])),inputFormat:n.Optional(r(["text","stream-json"])),print:n.Optional(n.Boolean()),includePartialMessages:n.Optional(n.Boolean()),replayUserMessages:n.Optional(n.Boolean()),agentsConfig:n.Optional(n.String()),settingSources:n.Optional(n.String()),permissions:n.Optional(n.Object({allow:n.Optional(m),ask:n.Optional(m),deny:n.Optional(m)})),env:n.Optional(n.Record(n.String(),n.String())),hooks:n.Optional(n.Record(n.String(),n.Unknown())),disableAllHooks:n.Optional(n.Boolean())}),R=[["systemPrompt","systemPrompt"],["appendSystemPrompt","appendSystemPrompt"],["initialMessage","initialMessage"],["resumeSessionId","sessionId"],["forkSession","forkSession"],["allowedTools","allowedTools"],["disallowedTools","disallowedTools"],["mcpConfigPaths","mcpConfig"],["strictMcpConfig","strictMcpConfig"],["model","model"],["addDirs","addDir"],["outputFormat","outputFormat"],["inputFormat","inputFormat"],["print","print"],["includePartialMessages","includePartialMessages"],["replayUserMessages","replayUserMessages"],["agentsConfig","agents"],["settingSources","settingSources"],["permissionMode","permissionMode"],["maxTurns","maxTurns"]];function u(o,e){let t;try{t=JSON.parse(o)}catch(i){let p=i instanceof Error?`: ${i.message}`:"";throw Error(`Invalid JSON provided to --settings (${e})${p}`)}if(!t||typeof t!=="object"||Array.isArray(t))throw Error("--settings must contain a JSON object");for(let i of Object.keys(t))if(!B.has(i))throw Error(`Unknown --settings field: ${i}`);let s=f(C,t);if(!s.success){let i=s.error.issues.map((p)=>`${p.path.join(".")||"settings"}: ${p.message}`).join("; ");throw Error(`Invalid --settings value: ${i}`)}return s.data}async function w(o){if(o===void 0)return;let e=o.trim();if(!e)throw Error("--settings requires a JSON object or file path");if(e.startsWith("{"))return u(e,"inline JSON");let t=E.resolve(c(),e),s;try{s=await N.readFile(t,"utf8")}catch(i){let p=i instanceof Error?`: ${i.message}`:"";throw Error(`Unable to read --settings file ${t}${p}`)}return u(s,t)}function P(o,e){if(!e)return;let t=e;for(let[s,i]of R){if(s==="permissionMode"&&o.yolo===!0)continue;if(o[i]===void 0&&t[s]!==void 0)o[i]=t[s]}}var d=M("General"),z=(o)=>{if(o.yolo){if(o.permissionMode&&o.permissionMode!=="yolo")throw Error("Cannot use both --yolo and --permission-mode with different values");o.permissionMode="yolo"}if(Array.isArray(o.allowedTools))o.allowedTools=o.allowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.disallowedTools))o.disallowedTools=o.disallowedTools.flatMap((e)=>e.split(",").map((t)=>t.trim()).filter((t)=>t.length>0));if(Array.isArray(o.allowedTools)&&Array.isArray(o.disallowedTools)){let e=o.allowedTools.filter((t)=>o.disallowedTools.includes(t));if(e.length>0)throw Error(`Tools cannot be both allowed and disallowed: ${e.join(", ")}`)}},L=async(o)=>{let e=await w(typeof o.settings==="string"?o.settings:void 0);if(P(o,e),typeof o.agents==="string")b(o.agents);I(o);try{let s=await h.getInstance().initialize(e);if(T().config.actions.setConfig(s),o.debug)d.info("[CLI] 配置已加载到 Store")}catch(t){d.error("[CLI] [FAIL] 配置初始化失败",t instanceof Error?t.message:t),console.error(`
|
|
2
|
+
[FAIL] 配置初始化失败
|
|
3
|
+
`),console.error("原因:",t instanceof Error?t.message:"未知错误"),console.error(`
|
|
4
|
+
请检查:`),console.error(" 1. 配置文件格式是否正确 (~/.blade/config.json)"),console.error(" 2. 是否需要运行 blade 进行首次配置"),console.error(` 3. 配置文件权限是否正确
|
|
5
|
+
`),process.exit(1)}};function I(o){if(o.continue&&o.resume)throw Error("Cannot use both --continue and --resume flags simultaneously");if(o.forkSession&&!o.continue&&!o.resume)throw Error("--fork-session requires --resume or --continue");if(o.sessionId&&(o.continue||o.resume)&&!o.forkSession)throw Error("--session-id can only be combined with --resume or --continue when --fork-session is set")}var V=(o)=>{if(o.outputFormat&&o.outputFormat!=="text"&&!o.print&&!o.headless)throw Error("--output-format can only be used with --print or --headless");if(o.headless&&o.outputFormat&&!["text","jsonl"].includes(o.outputFormat))throw Error(`--headless only supports --output-format text|jsonl, but got "${o.outputFormat}". Use --print for json|stream-json support.`);if(o.print&&o.outputFormat&&!["text","json","stream-json"].includes(o.outputFormat))throw Error(`--print only supports --output-format text|json|stream-json, but got "${o.outputFormat}". Use --headless for jsonl support.`);if(o.inputFormat==="stream-json"&&o.print)d.warn("[WARN] Warning: stream-json input format may not work as expected with --print")};
|
|
6
|
+
export{z as v,L as w,V as x};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import{Ea as Y0,Ga as x}from"./chunk-qwdbqjh7.js";import{Cb as Q0}from"./chunk-jt62ctz7.js";import{dc as l}from"./chunk-hjx5n3dw.js";import{nanoid as I0}from"nanoid";import{devtools as N0,subscribeWithSelector as R0}from"zustand/middleware";import{createStore as y0}from"zustand/vanilla";var V0={name:"ayu-dark",colors:{primary:"#ffcc66",secondary:"#bae67e",accent:"#73d0ff",success:"#bae67e",warning:"#ffcc66",error:"#ff3333",info:"#73d0ff",light:"#f0f0f0",dark:"#000000",muted:"#5c6773",highlight:"#2d323b",text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773",light:"#ffffff"},background:{primary:"#0f1419",secondary:"#14191f",dark:"#000000"},border:{light:"#2d323b",dark:"#000000"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.2)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)"}},G0={name:"dracula",colors:{primary:"#bd93f9",secondary:"#ffb86c",accent:"#ff79c6",success:"#50fa7b",warning:"#f1fa8c",error:"#ff5555",info:"#8be9fd",light:"#f8f8f2",dark:"#282a36",muted:"#6272a4",highlight:"#44475a",text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4",light:"#ffffff"},background:{primary:"#282a36",secondary:"#44475a",dark:"#21222c"},border:{light:"#44475a",dark:"#000000"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 42, 54, 0.2)",base:"0 1px 3px 0 rgba(40, 42, 54, 0.3), 0 1px 2px 0 rgba(40, 42, 54, 0.2)",lg:"0 10px 15px -3px rgba(40, 42, 54, 0.3), 0 4px 6px -2px rgba(40, 42, 54, 0.2)"}},F0={name:"monokai",colors:{primary:"#66d9ef",secondary:"#a6e22e",accent:"#f92672",success:"#a6e22e",warning:"#e6db74",error:"#f92672",info:"#66d9ef",light:"#f8f8f2",dark:"#272822",muted:"#75715e",highlight:"#3e3d32",text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e",light:"#ffffff"},background:{primary:"#272822",secondary:"#3e3d32",dark:"#1e1f1c"},border:{light:"#3e3d32",dark:"#000000"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(39, 40, 34, 0.2)",base:"0 1px 3px 0 rgba(39, 40, 34, 0.3), 0 1px 2px 0 rgba(39, 40, 34, 0.2)",lg:"0 10px 15px -3px rgba(39, 40, 34, 0.3), 0 4px 6px -2px rgba(39, 40, 34, 0.2)"}},J0={name:"nord",colors:{primary:"#88c0d0",secondary:"#81a1c1",accent:"#b48ead",success:"#a3be8c",warning:"#ebcb8b",error:"#bf616a",info:"#88c0d0",light:"#eceff4",dark:"#2e3440",muted:"#4c566a",highlight:"#434c5e",text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a",light:"#ffffff"},background:{primary:"#2e3440",secondary:"#3b4252",dark:"#242933"},border:{light:"#434c5e",dark:"#000000"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(46, 52, 64, 0.2)",base:"0 1px 3px 0 rgba(46, 52, 64, 0.3), 0 1px 2px 0 rgba(46, 52, 64, 0.2)",lg:"0 10px 15px -3px rgba(46, 52, 64, 0.3), 0 4px 6px -2px rgba(46, 52, 64, 0.2)"}},j0={name:"solarized-light",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#cb4b16",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#93a1a1",highlight:"#eee8d5",text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1",light:"#002b36"},background:{primary:"#fdf6e3",secondary:"#eee8d5",dark:"#073642"},border:{light:"#eee8d5",dark:"#073642"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(253, 246, 227, 0.2)",base:"0 1px 3px 0 rgba(253, 246, 227, 0.3), 0 1px 2px 0 rgba(253, 246, 227, 0.2)",lg:"0 10px 15px -3px rgba(253, 246, 227, 0.3), 0 4px 6px -2px rgba(253, 246, 227, 0.2)"}},U0={name:"solarized-dark",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#b58900",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#586e75",highlight:"#073642",text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75",light:"#fdf6e3"},background:{primary:"#002b36",secondary:"#073642",dark:"#001f29"},border:{light:"#073642",dark:"#000000"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 43, 54, 0.2)",base:"0 1px 3px 0 rgba(0, 43, 54, 0.3), 0 1px 2px 0 rgba(0, 43, 54, 0.2)",lg:"0 10px 15px -3px rgba(0, 43, 54, 0.3), 0 4px 6px -2px rgba(0, 43, 54, 0.2)"}},H0={name:"tokyo-night",colors:{primary:"#7aa2f7",secondary:"#7dcfff",accent:"#bb9af7",success:"#9ece6a",warning:"#e0af68",error:"#f7768e",info:"#7aa2f7",light:"#c0caf5",dark:"#1a1b26",muted:"#565f89",highlight:"#292e42",text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89",light:"#ffffff"},background:{primary:"#1a1b26",secondary:"#292e42",dark:"#16161e"},border:{light:"#292e42",dark:"#000000"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(26, 27, 38, 0.2)",base:"0 1px 3px 0 rgba(26, 27, 38, 0.3), 0 1px 2px 0 rgba(26, 27, 38, 0.2)",lg:"0 10px 15px -3px rgba(26, 27, 38, 0.3), 0 4px 6px -2px rgba(26, 27, 38, 0.2)"}},z0={name:"github",colors:{primary:"#0969da",secondary:"#8250df",accent:"#bc4c00",success:"#1a7f37",warning:"#bc4c00",error:"#d1242f",info:"#0969da",light:"#f6f8fa",dark:"#24292f",muted:"#6e7781",highlight:"#ddf4ff",text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f6f8fa",dark:"#24292f"},border:{light:"#d0d7de",dark:"#24292f"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(255, 255, 255, 0.2)",base:"0 1px 3px 0 rgba(255, 255, 255, 0.3), 0 1px 2px 0 rgba(255, 255, 255, 0.2)",lg:"0 10px 15px -3px rgba(255, 255, 255, 0.3), 0 4px 6px -2px rgba(255, 255, 255, 0.2)"}},_0={name:"gruvbox",colors:{primary:"#83a598",secondary:"#8ec07c",accent:"#d3869b",success:"#b8bb26",warning:"#fabd2f",error:"#fb4934",info:"#83a598",light:"#fbf1c7",dark:"#282828",muted:"#928374",highlight:"#3c3836",text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374",light:"#ffffff"},background:{primary:"#282828",secondary:"#3c3836",dark:"#1d2021"},border:{light:"#3c3836",dark:"#000000"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#8ec07c",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#b8bb26",default:"#ebdbb2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 40, 40, 0.2)",base:"0 1px 3px 0 rgba(40, 40, 40, 0.3), 0 1px 2px 0 rgba(40, 40, 40, 0.2)",lg:"0 10px 15px -3px rgba(40, 40, 40, 0.3), 0 4px 6px -2px rgba(40, 40, 40, 0.2)"}},K0={name:"one-dark",colors:{primary:"#61afef",secondary:"#c678dd",accent:"#e5c07b",success:"#98c379",warning:"#e5c07b",error:"#e06c75",info:"#56b6c2",light:"#abb2bf",dark:"#282c34",muted:"#5c6370",highlight:"#3e4451",text:{primary:"#abb2bf",secondary:"#c6c8d0",muted:"#5c6370",light:"#ffffff"},background:{primary:"#282c34",secondary:"#3e4451",dark:"#21252b"},border:{light:"#3e4451",dark:"#000000"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 44, 52, 0.2)",base:"0 1px 3px 0 rgba(40, 44, 52, 0.3), 0 1px 2px 0 rgba(40, 44, 52, 0.2)",lg:"0 10px 15px -3px rgba(40, 44, 52, 0.3), 0 4px 6px -2px rgba(40, 44, 52, 0.2)"}},W0={name:"catppuccin",colors:{primary:"#89b4fa",secondary:"#cba6f7",accent:"#f5c2e7",success:"#a6e3a1",warning:"#f9e2af",error:"#f38ba8",info:"#89dceb",light:"#cdd6f4",dark:"#11111b",muted:"#6c7086",highlight:"#181825",text:{primary:"#cdd6f4",secondary:"#bac2de",muted:"#6c7086",light:"#ffffff"},background:{primary:"#1e1e2e",secondary:"#181825",dark:"#11111b"},border:{light:"#181825",dark:"#000000"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#cdd6f4",operator:"#89dceb",type:"#f5c2e7",tag:"#f38ba8",attr:"#89b4fa",default:"#cdd6f4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(30, 30, 46, 0.2)",base:"0 1px 3px 0 rgba(30, 30, 46, 0.3), 0 1px 2px 0 rgba(30, 30, 46, 0.2)",lg:"0 10px 15px -3px rgba(30, 30, 46, 0.3), 0 4px 6px -2px rgba(30, 30, 46, 0.2)"}},O0={name:"rose-pine",colors:{primary:"#9ccfd8",secondary:"#c4a7e7",accent:"#f6c177",success:"#31748f",warning:"#f6c177",error:"#eb6f92",info:"#9ccfd8",light:"#e0def4",dark:"#191724",muted:"#6e6a86",highlight:"#1f1d2e",text:{primary:"#e0def4",secondary:"#cecacd",muted:"#6e6a86",light:"#ffffff"},background:{primary:"#191724",secondary:"#1f1d2e",dark:"#12101a"},border:{light:"#1f1d2e",dark:"#000000"},syntax:{comment:"#6e6a86",string:"#9ccfd8",number:"#ea9a97",keyword:"#c4a7e7",function:"#31748f",variable:"#e0def4",operator:"#f6c177",type:"#9ccfd8",tag:"#eb6f92",attr:"#f6c177",default:"#e0def4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(25, 23, 36, 0.2)",base:"0 1px 3px 0 rgba(25, 23, 36, 0.3), 0 1px 2px 0 rgba(25, 23, 36, 0.2)",lg:"0 10px 15px -3px rgba(25, 23, 36, 0.3), 0 4px 6px -2px rgba(25, 23, 36, 0.2)"}},q0={name:"kanagawa",colors:{primary:"#8ba4b0",secondary:"#a292a3",accent:"#c47fd5",success:"#76946a",warning:"#c0a36e",error:"#c34043",info:"#7e9cd8",light:"#dcd7ba",dark:"#1f1f28",muted:"#727169",highlight:"#2a2a37",text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169",light:"#ffffff"},background:{primary:"#1f1f28",secondary:"#2a2a37",dark:"#16161d"},border:{light:"#2a2a37",dark:"#000000"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#c34043",attr:"#7fb4ca",default:"#dcd7ba"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(31, 31, 40, 0.2)",base:"0 1px 3px 0 rgba(31, 31, 40, 0.3), 0 1px 2px 0 rgba(31, 31, 40, 0.2)",lg:"0 10px 15px -3px rgba(31, 31, 40, 0.3), 0 4px 6px -2px rgba(31, 31, 40, 0.2)"}},d=[{id:"ayu-dark",label:"Ayu Dark",theme:V0,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:G0,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:F0,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:J0,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:j0,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:U0,tags:["dark"]},{id:"tokyo-night",label:"Tokyo Night",theme:H0,tags:["dark","popular"]},{id:"github",label:"GitHub",theme:z0,tags:["light","minimal"]},{id:"gruvbox",label:"Gruvbox",theme:_0,tags:["dark","warm"]},{id:"one-dark",label:"One Dark",theme:K0,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:W0,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:O0,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:q0,tags:["dark","japanese"]}];var r={primary:"#0066cc",secondary:"#6c757d",accent:"#e83e8c",success:"#28a745",warning:"#ffc107",error:"#dc3545",info:"#17a2b8",light:"#f8f9fa",dark:"#343a40",muted:"#6c757d",highlight:"#fff3cd",text:{primary:"#212529",secondary:"#6c757d",muted:"#6c757d",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f8f9fa",dark:"#343a40"},border:{light:"#dee2e6",dark:"#495057"},syntax:{comment:"#6c757d",string:"#28a745",number:"#e83e8c",keyword:"#007bff",function:"#17a2b8",variable:"#495057",operator:"#ffc107",type:"#007bff",tag:"#dc3545",attr:"#ffc107",default:"#212529"}},M={name:"default",colors:r,spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)"}},w0={...M,name:"dark",colors:{...r,text:{primary:"#ffffff",secondary:"#e2e8f0",muted:"#94a3b8",light:"#000000"},background:{primary:"#1e293b",secondary:"#334155",dark:"#0f172a"},border:{light:"#475569",dark:"#64748b"},syntax:{comment:"#94a3b8",string:"#34d399",number:"#f472b6",keyword:"#60a5fa",function:"#06b6d4",variable:"#e2e8f0",operator:"#fbbf24",type:"#60a5fa",tag:"#fb7185",attr:"#fbbf24",default:"#ffffff"}}};class c{currentTheme=M;themes=new Map;constructor(){this.themes.set("default",M),this.themes.set("dark",w0);for(let X of d)this.themes.set(X.id,X.theme)}setTheme(X){let Z=this.themes.get(X);if(Z)this.currentTheme=Z;else throw Error(`Theme '${X}' not found`)}getTheme(){return this.currentTheme}getAvailableThemes(){return Array.from(this.themes.keys())}getCurrentThemeName(){return this.currentTheme.name}getThemeByName(X){return this.themes.get(X)}hasTheme(X){return this.themes.has(X)}}var i=new c;var x0={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},f=(X)=>({...x0,actions:{setInitializationStatus:(Z)=>{X((Q)=>({app:{...Q.app,initializationStatus:Z}}))},setInitializationError:(Z)=>{X((Q)=>({app:{...Q.app,initializationError:Z}}))},setActiveModal:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:Z}}))},showSessionSelector:(Z,Q="resume")=>{X((Y)=>({app:{...Y.app,activeModal:"sessionSelector",sessionSelectorData:{intent:Q,sessions:Z}}}))},showModelEditWizard:(Z)=>{X((Q)=>({app:{...Q.app,activeModal:"modelEditWizard",modelEditorTarget:Z}}))},closeModal:()=>{X((Z)=>({app:{...Z.app,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null}}))},setTasks:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Z}}))},updateTask:(Z)=>{X((Q)=>({app:{...Q.app,tasks:Q.app.tasks.map((Y)=>Y.id===Z.id?Z:Y)}}))},setAwaitingSecondCtrlC:(Z)=>{X((Q)=>({app:{...Q.app,awaitingSecondCtrlC:Z}}))},setThinkingModeEnabled:(Z)=>{X((Q)=>({app:{...Q.app,thinkingModeEnabled:Z}}))},toggleThinkingMode:()=>{X((Z)=>({app:{...Z.app,thinkingModeEnabled:!Z.app.thinkingModeEnabled}}))},startSubagentProgress:(Z,Q,Y)=>{X(($)=>({app:{...$.app,subagentProgress:{id:Z,type:Q,description:Y,status:"running",startTime:Date.now()}}}))},updateSubagentTool:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,currentTool:Z}}}})},completeSubagentProgress:(Z)=>{X((Q)=>{if(!Q.app.subagentProgress)return Q;return{app:{...Q.app,subagentProgress:{...Q.app.subagentProgress,status:Z?"completed":"failed",currentTool:void 0}}}}),setTimeout(()=>{X((Q)=>({app:{...Q.app,subagentProgress:null}}))},1500)}}});var P0={isProcessing:!1,abortController:null,pendingCommands:[],recoveredSteeringCount:0},b=(X,Z)=>({...P0,actions:{setProcessing:(Q)=>{X((Y)=>({command:{...Y.command,isProcessing:Q}}))},createAbortController:()=>{let Q=Z().command.abortController;if(Q&&!Q.signal.aborted)Q.abort("interrupted-by-new-command");let Y=new AbortController;return X(($)=>({command:{...$.command,abortController:Y}})),Y},getAbortController:()=>{return Z().command.abortController},clearAbortController:(Q)=>{let Y=Z().command.abortController;if(Q!==void 0&&Y!==Q)return;X(($)=>({command:{...$.command,abortController:null}}))},abort:(Q)=>{let{abortController:Y}=Z().command;if(Y&&!Y.signal.aborted)Y.abort(Q??"user-cancel");X(($)=>({command:{...$.command,isProcessing:!1,pendingCommands:[]}}))},enqueueCommand:(Q)=>{X((Y)=>({command:{...Y.command,pendingCommands:[...Y.command.pendingCommands,Q]}}))},dequeueCommand:()=>{let{pendingCommands:Q}=Z().command;if(Q.length===0)return;let[Y,...$]=Q;return X((V)=>({command:{...V.command,pendingCommands:$}})),Y},clearQueue:()=>{X((Q)=>({command:{...Q.command,pendingCommands:[]}}))},setRecoveredSteeringCount:(Q)=>{X((Y)=>({command:{...Y.command,recoveredSteeringCount:Math.max(0,Q)}}))}}});var v0={config:null},h=(X)=>({...v0,actions:{setConfig:(Z)=>{X((Q)=>({config:{...Q.config,config:Z}}))},updateConfig:(Z)=>{X((Q)=>{if(!Q.config.config)throw Error(`[ConfigSlice] Config not initialized. Cannot update: ${JSON.stringify(Z)}`);return{config:{...Q.config,config:{...Q.config.config,...Z}}}})}}});var D0={currentFocus:"main-input",previousFocus:null},p=(X)=>({...D0,actions:{setFocus:(Z)=>{X((Q)=>({focus:{...Q.focus,currentFocus:Z,previousFocus:Q.focus.currentFocus}}))},restorePreviousFocus:()=>{X((Z)=>({focus:{...Z.focus,currentFocus:Z.focus.previousFocus||"main-input",previousFocus:null}}))}}});function o(X,Z,Q,Y=0,$=0,V){let J=l(),H=V?J.models.getModel(V,X):J.models.getModels().find((W)=>W.id===X);if(!H)return 0;let U=H.cost,_=Z/1e6*U.input+Q/1e6*U.output+Y/1e6*U.cacheRead+$/1e6*U.cacheWrite;return Math.round(_*1e6)/1e6}var j={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/};function g0(X){let Z=[],Q=X.split(/\r?\n/),Y=!1,$=[],V=null,J=0,H=!1,U=[],_=[],W=!1,P=[],v=!1,O=[],F=0,G=!0;for(let w=0;w<Q.length;w++){let K=Q[w];if(W){if(K.match(j.diffEnd)){try{let q=JSON.parse(P.join(`
|
|
2
|
+
`));Z.push({type:"diff",content:"",diffData:{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine}})}catch(q){Z.push({type:"text",content:P.join(`
|
|
3
|
+
`)})}W=!1,P=[],G=!1;continue}P.push(K);continue}if(K.match(j.diffStart)){W=!0,P=[],G=!1;continue}if(Y){let q=K.match(j.codeBlock),D=K.trim()==="```";if(q&&q[1])J++,$.push(K);else if(D)if(J>0)J--,$.push(K);else{let $0=$.join(`
|
|
4
|
+
`);Z.push({type:"code",content:$0,language:V||void 0}),Y=!1,$=[],V=null,J=0,G=!1}else $.push(K);continue}let N=K.match(j.codeBlock);if(N){Y=!0,V=N[1]||null,J=0,G=!1;continue}let A=K.match(j.table),Z0=K.match(j.tableSeparator);if(A&&!H){if(w+1<Q.length){if(Q[w+1].match(j.tableSeparator)){H=!0,U=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0),_=[],G=!1;continue}}}if(H&&Z0)continue;if(H&&A){let q=A[1].split("|").map((D)=>D.trim()).filter((D)=>D.length>0);while(q.length<U.length)q.push("");if(q.length>U.length)q.length=U.length;_.push(q);continue}if(H&&!A){if(U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});H=!1,U=[],_=[]}let S=K.match(j.blockquote);if(S){let q=S[1].length,D=S[2]||"";if(v&&q===F)O.push(D);else{if(v)Z.push({type:"blockquote",content:O.join(`
|
|
5
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]});v=!0,F=q,O=[D]}G=!1;continue}if(v)Z.push({type:"blockquote",content:O.join(`
|
|
6
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]}),v=!1,O=[],F=0;let T=K.match(j.heading);if(T){Z.push({type:"heading",content:T[2],level:T[1].length}),G=!1;continue}let R=K.match(j.ulItem);if(R){Z.push({type:"list",content:R[3],listType:"ul",marker:R[2],indentation:R[1].length}),G=!1;continue}let y=K.match(j.olItem);if(y){Z.push({type:"list",content:y[3],listType:"ol",marker:y[2],indentation:y[1].length}),G=!1;continue}if(K.match(j.hr)){Z.push({type:"hr",content:""}),G=!1;continue}if(K.trim().length===0){if(!G)Z.push({type:"empty",content:""}),G=!0;continue}let g=K.match(j.commandMessage);if(g){Z.push({type:"command-message",content:g[1]}),G=!1;continue}Z.push({type:"text",content:K}),G=!1}if(Y){let w=$.join(`
|
|
7
|
+
`);Z.push({type:"code",content:w,language:V||void 0})}if(H&&U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});if(v&&O.length>0)Z.push({type:"blockquote",content:O.join(`
|
|
8
|
+
`),blockquoteLevel:F,blockquoteLines:[...O]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var E=new Map;function B0(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function E0(X){let Z=E.get(X);if(Z)return Z;let Q={state:B0(),blocks:[],pendingLine:"",finalized:!1};return E.set(X,Q),Q}function n(X){return X.endsWith("\r")?X.slice(0,-1):X}function a(X,Z){if(X.tableHeaders.length>0&&X.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:X.tableHeaders,rows:X.tableRows}});X.inTable=!1,X.tableHeaders=[],X.tableRows=[]}function k(X,Z){if(X.blockquoteLines.length>0)Z.push({type:"blockquote",content:X.blockquoteLines.join(`
|
|
9
|
+
`),blockquoteLevel:X.blockquoteLevel,blockquoteLines:[...X.blockquoteLines]});X.inBlockquote=!1,X.blockquoteLines=[],X.blockquoteLevel=0}function s(X,Z){let Q=X.codeBlockContent.join(`
|
|
10
|
+
`);Z.push({type:"code",content:Q,language:X.codeBlockLang||void 0}),X.inCodeBlock=!1,X.codeBlockContent=[],X.codeBlockLang=null,X.codeBlockDepth=0,X.lastLineEmpty=!1}function u(X,Z,Q=!0){let{state:Y,blocks:$}=Z;if(Y.pendingTableHeader!==null){if(X.match(j.tableSeparator)){Y.inTable=!0,Y.tableHeaders=Y.pendingTableHeader.slice(1,-1).split("|").map((F)=>F.trim()).filter((F)=>F.length>0),Y.tableRows=[],Y.pendingTableHeader=null,Y.lastLineEmpty=!1;return}$.push({type:"text",content:Y.pendingTableHeader}),Y.pendingTableHeader=null,Y.lastLineEmpty=!1}if(Y.inDiff){if(X.match(j.diffEnd)){try{let F=JSON.parse(Y.diffContent.join(`
|
|
11
|
+
`));$.push({type:"diff",content:"",diffData:{patch:F.patch,startLine:F.startLine,matchLine:F.matchLine}})}catch(F){$.push({type:"text",content:Y.diffContent.join(`
|
|
12
|
+
`)})}Y.inDiff=!1,Y.diffContent=[],Y.lastLineEmpty=!1;return}Y.diffContent.push(X);return}if(X.match(j.diffStart)){Y.inDiff=!0,Y.diffContent=[],Y.lastLineEmpty=!1;return}if(Y.inCodeBlock){let F=X.match(j.codeBlock),G=X.trim()==="```";if(F&&F[1])Y.codeBlockDepth++,Y.codeBlockContent.push(X);else if(G)if(Y.codeBlockDepth>0)Y.codeBlockDepth--,Y.codeBlockContent.push(X);else s(Y,$);else Y.codeBlockContent.push(X);return}let V=X.match(j.codeBlock);if(V){Y.inCodeBlock=!0,Y.codeBlockLang=V[1]||null,Y.codeBlockDepth=0,Y.lastLineEmpty=!1;return}let J=X.match(j.table),H=X.match(j.tableSeparator);if(J&&!Y.inTable){Y.pendingTableHeader=X;return}if(Y.inTable&&H)return;if(Y.inTable&&J){let F=J[1].split("|").map((G)=>G.trim()).filter((G)=>G.length>0);while(F.length<Y.tableHeaders.length)F.push("");if(F.length>Y.tableHeaders.length)F.length=Y.tableHeaders.length;Y.tableRows.push(F);return}if(Y.inTable&&!J){if(a(Y,$),Q){u(X,Z,!1);return}}let U=X.match(j.blockquote);if(U){let F=U[1].length,G=U[2]||"";if(Y.inBlockquote&&F===Y.blockquoteLevel)Y.blockquoteLines.push(G);else{if(Y.inBlockquote)k(Y,$);Y.inBlockquote=!0,Y.blockquoteLevel=F,Y.blockquoteLines=[G]}Y.lastLineEmpty=!1;return}if(Y.inBlockquote)k(Y,$);let _=X.match(j.heading);if(_){$.push({type:"heading",content:_[2],level:_[1].length}),Y.lastLineEmpty=!1;return}let W=X.match(j.ulItem);if(W){$.push({type:"list",content:W[3],listType:"ul",marker:W[2],indentation:W[1].length}),Y.lastLineEmpty=!1;return}let P=X.match(j.olItem);if(P){$.push({type:"list",content:P[3],listType:"ol",marker:P[2],indentation:P[1].length}),Y.lastLineEmpty=!1;return}if(X.match(j.hr)){$.push({type:"hr",content:""}),Y.lastLineEmpty=!1;return}if(X.trim().length===0){if(!Y.lastLineEmpty)$.push({type:"empty",content:""}),Y.lastLineEmpty=!0;return}let O=X.match(j.commandMessage);if(O){$.push({type:"command-message",content:O[1]}),Y.lastLineEmpty=!1;return}$.push({type:"text",content:X}),Y.lastLineEmpty=!1}function c0(X,Z){if(!X||!Z)return;let Q=E0(X);if(Q.finalized)return;let Y=Q.pendingLine+Z,$=Y.split(`
|
|
13
|
+
`),V=Y.endsWith(`
|
|
14
|
+
`),J=V?$:$.slice(0,-1);Q.pendingLine=V?"":$[$.length-1]??"";for(let H of J)u(n(H),Q)}function i0(X){let Z=E.get(X);if(!Z||Z.finalized)return;if(Z.pendingLine)u(n(Z.pendingLine),Z),Z.pendingLine="";if(Z.state.pendingTableHeader!==null)Z.blocks.push({type:"text",content:Z.state.pendingTableHeader}),Z.state.pendingTableHeader=null;if(Z.state.inCodeBlock)s(Z.state,Z.blocks);if(Z.state.inTable)a(Z.state,Z.blocks);if(Z.state.inBlockquote)k(Z.state,Z.blocks);if(Z.state.inDiff)Z.blocks.push({type:"text",content:Z.state.diffContent.join(`
|
|
15
|
+
`)}),Z.state.inDiff=!1,Z.state.diffContent=[];while(Z.blocks.length>0&&Z.blocks[Z.blocks.length-1].type==="empty")Z.blocks.pop();Z.finalized=!0}function l0(X){let Z=E.get(X);if(!Z||!Z.finalized)return null;return Z.blocks}function o0(X){let Z=E.get(X);if(!Z)return null;return Z.blocks}function A0(X){let Z=E.get(X);if(!Z)return null;let Q=[],Y=Z.state;if(Y.inDiff)Q.push("<<<DIFF>>>"),Q.push(...Y.diffContent);else if(Y.inCodeBlock){let $=Y.codeBlockLang?`\`\`\`${Y.codeBlockLang}`:"```";Q.push($),Q.push(...Y.codeBlockContent)}else if(Y.inTable){if(Y.tableHeaders.length>0){Q.push(`| ${Y.tableHeaders.join(" | ")} |`),Q.push(`| ${Y.tableHeaders.map(()=>"---").join(" | ")} |`);for(let $ of Y.tableRows)Q.push(`| ${$.join(" | ")} |`)}}else if(Y.inBlockquote){let $=">".repeat(Y.blockquoteLevel)+" ";for(let V of Y.blockquoteLines)Q.push($+V)}else if(Y.pendingTableHeader)Q.push(Y.pendingTableHeader);if(Z.pendingLine)Q.push(Z.pendingLine);return Q.length>0?Q:null}function n0(X){let Z=E.get(X);if(!Z)return null;let Q="text";if(Z.state.inDiff)Q="diff";else if(Z.state.inCodeBlock)Q="code";else if(Z.state.inTable||Z.state.pendingTableHeader)Q="table";let Y=A0(X);if(!Y||Y.length===0)return null;return{lines:Y,mode:Q}}function a0(X){E.delete(X)}function C(){E.clear()}var t=2000,I=[];function L0(){let X=I;return I=[],X}var X0={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:0,totalInputTokens:0,totalOutputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,turnCount:0,estimatedCostUsd:0},e={sessionId:Q0("tui"),messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,isCompacting:!1,currentCommand:null,error:null,isActive:!0,tokenUsage:{...X0},currentThinkingContent:null,thinkingExpanded:!1,clearCount:0,historyExpanded:!1,expandedMessageCount:100,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null},m=(X,Z)=>({...e,actions:{addMessage:(Q)=>{X((Y)=>({session:{...Y.session,messages:[...Y.session.messages,Q],error:null}}))},addUserMessage:(Q)=>{let Y={id:`user-${Date.now()}-${Math.random()}`,role:"user",content:Q,timestamp:Date.now()};Z().session.actions.addMessage(Y)},addAssistantMessage:(Q,Y)=>{let $={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y};Z().session.actions.addMessage($)},addAssistantMessageAndClearThinking:(Q)=>{let Y=Z().session.currentThinkingContent,$={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:Q,timestamp:Date.now(),thinkingContent:Y||void 0};X((V)=>({session:{...V.session,messages:[...V.session.messages,$],currentThinkingContent:null,error:null}}))},addToolMessage:(Q,Y)=>{let $={id:`tool-${Date.now()}-${Math.random()}`,role:"tool",content:Q,timestamp:Date.now(),metadata:Y};Z().session.actions.addMessage($)},setCompacting:(Q)=>{X((Y)=>({session:{...Y.session,isCompacting:Q}}))},setCommand:(Q)=>{X((Y)=>({session:{...Y.session,currentCommand:Q}}))},setError:(Q)=>{X((Y)=>({session:{...Y.session,error:Q}}))},clearMessages:()=>{C(),X((Q)=>({session:{...Q.session,messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,error:null,clearCount:Q.session.clearCount+1}}))},setCompactedContext:(Q)=>{X((Y)=>({session:{...Y.session,restoredContextMessages:[...Q],restoredVisibleMessageCount:Y.session.messages.length}}))},resetSession:()=>{C(),X((Q)=>({session:{...Q.session,...e,sessionId:Q.session.sessionId,isActive:!0}}))},restoreSession:(Q,Y,$)=>{C(),X((V)=>({session:{...V.session,sessionId:Q,messages:Y,restoredContextMessages:$??null,restoredVisibleMessageCount:$?Y.length:0,error:null,isActive:!0}}))},updateTokenUsage:(Q)=>{X((Y)=>{let $=Y.session.tokenUsage,{costUsd:V,...J}=Q,H=Math.max(0,Q.inputTokens??0),U=Math.max(0,Q.outputTokens??0),_=Math.max(0,Q.cacheReadTokens??0),W=Math.max(0,Q.cacheWriteTokens??0),P=$.totalInputTokens+H,v=$.totalOutputTokens+U,O=$.cacheReadTokens+_,F=$.cacheWriteTokens+W,G=Y.config?.config,w=G?.models?.find((A)=>A.id===G.currentModelId),K=w?.model??"",N=V??o(K,Math.max(0,H-_-W),U,_,W,w?.provider);return{session:{...Y.session,tokenUsage:{...$,...J,totalInputTokens:P,totalOutputTokens:v,cacheReadTokens:O,cacheWriteTokens:F,estimatedCostUsd:$.estimatedCostUsd+Math.max(0,N)}}}})},resetContextUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...Q.session.tokenUsage,inputTokens:0,outputTokens:0,totalTokens:0}}}))},resetTokenUsage:()=>{X((Q)=>({session:{...Q.session,tokenUsage:{...X0}}}))},setCurrentThinkingContent:(Q)=>{if(Z().session.currentThinkingContent===Q)return;X((Y)=>({session:{...Y.session,currentThinkingContent:Q}}))},appendThinkingContent:(Q)=>{X((Y)=>({session:{...Y.session,currentThinkingContent:(Y.session.currentThinkingContent||"")+Q}}))},setThinkingExpanded:(Q)=>{X((Y)=>({session:{...Y.session,thinkingExpanded:Q}}))},toggleThinkingExpanded:()=>{X((Q)=>({session:{...Q.session,thinkingExpanded:!Q.session.thinkingExpanded}}))},setHistoryExpanded:(Q)=>{X((Y)=>({session:{...Y.session,historyExpanded:Q}}))},toggleHistoryExpanded:()=>{X((Q)=>({session:{...Q.session,historyExpanded:!Q.session.historyExpanded}}))},setExpandedMessageCount:(Q)=>{X((Y)=>({session:{...Y.session,expandedMessageCount:Q}}))},incrementClearCount:()=>{X((Q)=>({session:{...Q.session,clearCount:Q.session.clearCount+1}}))},startStreamingAssistantMessage:()=>{let Q=`assistant-${Date.now()}-${Math.random()}`,Y={id:Q,role:"assistant",content:"",timestamp:Date.now()};return I=[],X(($)=>({session:{...$.session,messages:[...$.session.messages,Y],currentStreamingMessageId:Q,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,error:null}})),Q},appendAssistantContent:(Q)=>{let Y=Z().session.currentStreamingMessageId,$=Y??`assistant-${Date.now()}-${Math.random()}`;return I.push(Q),X((V)=>{let J=(w)=>w.endsWith("\r")?w.slice(0,-1):w,H=Y?V.session.currentStreamingLines:[],U=Y?V.session.currentStreamingTail:"",_=Y?V.session.currentStreamingLineCount:0,W=Y?V.session.currentStreamingVersion:0,v=(U+Q).split(`
|
|
16
|
+
`),O=v.slice(0,-1).map(J),F=J(v[v.length-1]??""),G=H;if(O.length>0){if(G=[...H,...O],G.length>t){let w=G.length-t;G=G.slice(w)}}return{session:{...V.session,currentStreamingMessageId:$,currentStreamingLines:G,currentStreamingTail:F,currentStreamingLineCount:_+O.length,currentStreamingVersion:W+1,error:null}}}),$},finalizeStreamingMessage:(Q,Y)=>{let $=L0();X((V)=>{let J=V.session.currentStreamingMessageId,U=$.join("")+(Q||""),_=(V.session.currentThinkingContent||"")+(Y||"");if(U.length>0){let W={id:J||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:U,timestamp:Date.now(),thinkingContent:_||void 0};return{session:{...V.session,messages:[...V.session.messages,W],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:W.id}}}return{session:{...V.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{X((Q)=>({session:{...Q.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{I=[],X((Q)=>({session:{...Q.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))}}});var C0=y0()(N0(R0((...X)=>({session:m(...X),app:f(...X),config:h(...X),focus:p(...X),command:b(...X)})),{name:"BladeStore",enabled:!0})),z=()=>C0.getState(),K1=()=>z().session.actions,W1=()=>z().app.actions,O1=()=>z().session.messages,B=()=>z().config.config,L=null;async function q1(){if(B()!==null)return;if(L)return L;return L=(async()=>{try{let Q=await Y0.getInstance().initialize();z().config.actions.setConfig(Q)}catch(Z){throw L=null,Error(`[FAIL] Store 未初始化且无法自动初始化
|
|
17
|
+
|
|
18
|
+
`+`原因: ${Z instanceof Error?Z.message:"未知错误"}
|
|
19
|
+
|
|
20
|
+
`+`请确保:
|
|
21
|
+
`+`1. 配置文件格式正确 (~/.blade/config.json)
|
|
22
|
+
`+`2. 运行 blade 进行首次配置
|
|
23
|
+
`+"3. 配置文件权限正确")}finally{L=null}})(),L}var w1=()=>z().config.config?.models??[],x1=()=>{let X=B();if(!X)return;let Z=X.currentModelId;return X.models.find((Y)=>Y.id===Z)??X.models[0]},P1=(X)=>{let Z=B();if(!Z)return;return Z.models.find((Q)=>Q.id===X)},v1=()=>z().config.config?.mcpServers??{},D1=()=>z().app.thinkingModeEnabled,B1=()=>({setPermissionMode:async(X)=>{z().config.actions.updateConfig({permissionMode:X})},setTheme:async(X,Z={})=>{try{i.setTheme(X)}catch{return}z().config.actions.updateConfig({theme:X}),await x().save({theme:X},{scope:"global",...Z})},setLanguage:async(X,Z={})=>{z().config.actions.updateConfig({language:X}),await x().save({language:X},{scope:"global",...Z})},setDebug:async(X,Z={})=>{z().config.actions.updateConfig({debug:X}),await x().save({debug:X},{scope:"global",...Z})},setTemperature:async(X,Z={})=>{z().config.actions.updateConfig({temperature:X}),await x().save({temperature:X},{scope:"global",...Z})},updateConfig:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y={...Q};z().config.actions.updateConfig(X);try{await x().save(X,Z)}catch($){throw z().config.actions.setConfig(Y),$}},flush:async()=>{await x().flush()},appendPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendPermissionRule(X,Z)},appendLocalPermissionAllowRule:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y=Q.permissions?.allow||[];if(!Y.includes(X)){let $=[...Y,X];z().config.actions.updateConfig({permissions:{...Q.permissions,allow:$}})}await x().appendLocalPermissionRule(X,Z)},setCurrentModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(!Q.models.find(($)=>$.id===X))throw Error(`Model not found: ${X}`);z().config.actions.updateConfig({currentModelId:X}),await x().save({currentModelId:X},{scope:"global",...Z})},addModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let Y="id"in X?X:{id:I0(),...X};if(Q.models.find((H)=>H.provider===Y.provider&&H.model===Y.model))throw Error(`Model already configured: ${Y.provider}/${Y.model}`);let J={models:[...Q.models,Y]};if(Q.models.length===0)J.currentModelId=Y.id;return z().config.actions.updateConfig(J),await x().save(J,{scope:"global",...Z}),Y},updateModel:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let $=Y.models.findIndex((J)=>J.id===X);if($===-1)throw Error(`Model not found: ${X}`);let V=[...Y.models];V[$]={...V[$],...Z},z().config.actions.updateConfig({models:V}),await x().save({models:V},{scope:"global",...Q})},removeModel:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");if(Q.models.length===1)throw Error("Cannot remove the only model");let Y=Q.models.filter((V)=>V.id!==X),$={models:Y};if(Q.currentModelId===X)$.currentModelId=Y[0].id;z().config.actions.updateConfig($),await x().save($,{scope:"global",...Z})},addMcpServer:async(X,Z,Q={})=>{let Y=B();if(!Y)throw Error("Config not initialized");let V={...Y.mcpServers??{},[X]:Z};z().config.actions.updateConfig({mcpServers:V}),await x().save({mcpServers:V},{scope:"project",...Q})},removeMcpServer:async(X,Z={})=>{let Q=B();if(!Q)throw Error("Config not initialized");let $={...Q.mcpServers??{}};delete $[X],z().config.actions.updateConfig({mcpServers:$}),await x().save({mcpServers:$},{scope:"project",...Z})}});
|
|
24
|
+
export{d as ga,i as ha,j as ia,g0 as ja,c0 as ka,i0 as la,l0 as ma,o0 as na,n0 as oa,a0 as pa,C0 as qa,z as ra,K1 as sa,W1 as ta,O1 as ua,B as va,q1 as wa,w1 as xa,x1 as ya,P1 as za,v1 as Aa,D1 as Ba,B1 as Ca};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{aa as W}from"./chunk-9ad7tt9s.js";import{Bb as H,wb as F,yb as k}from"./chunk-ctqf59q1.js";import{Jb as V}from"./chunk-gsfkrr25.js";var $=k.String({minLength:1,maxLength:128,pattern:"^[A-Za-z0-9][A-Za-z0-9_-]*$"}),Q=k.Array(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"}),{maxItems:128}),b=k.Object({description:k.String({minLength:1,maxLength:4096,pattern:".*\\S.*"}),prompt:k.String({minLength:1,maxLength:1e5,pattern:".*\\S.*"}),tools:k.Optional(Q),disallowedTools:k.Optional(Q),model:k.Optional(k.String({minLength:1,maxLength:200,pattern:".*\\S.*"})),permissionMode:k.Optional(H(["default","acceptEdits","dontAsk","bypassPermissions","plan","ignore"])),maxTurns:k.Optional(k.Integer({minimum:1,maximum:V})),isolation:k.Optional(H(["none","worktree"]))},{additionalProperties:!1});function O(Y){let w;try{w=JSON.parse(Y)}catch{throw Error("Invalid JSON provided to --agents")}if(w===null||Array.isArray(w)||typeof w!=="object")throw Error("--agents must be a JSON object");let I=Object.entries(w);if(I.length>64)throw Error("--agents supports at most 64 definitions");return I.map(([z,Z])=>{if(!F($,z).success)throw Error(`Invalid --agents name "${z}": use letters, numbers, hyphens, or underscores`);let K=F(b,Z);if(!K.success)throw Error(`Invalid --agents definition for "${z}"`);let q=K.data;return{name:z,description:q.description.trim(),systemPrompt:q.prompt.trim(),tools:q.tools?[...new Set(q.tools.map((B)=>B.trim()))]:void 0,disallowedTools:q.disallowedTools?[...new Set(q.disallowedTools.map((B)=>B.trim()))]:void 0,model:q.model?.trim(),permissionMode:q.permissionMode===void 0?void 0:W(q.permissionMode),maxTurns:q.maxTurns,isolation:q.isolation,source:"flag"}})}
|
|
2
|
+
export{O as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as a,h as b,i as c,j as d,k as e}from"./chunk-1smf2dj3.js";import"./chunk-dr06x0cw.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Pb as a}from"./chunk-0dj326ms.js";import"./chunk-34pdtz4q.js";import"./chunk-hjx5n3dw.js";import"./chunk-dr06x0cw.js";export{a as createChatServiceAsync};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ra as Q}from"./chunk-tv4r86ez.js";import{vb as U}from"./chunk-49g067ek.js";import{Ib as O}from"./chunk-gsfkrr25.js";import{Rb as K,Tb as N}from"./chunk-34pdtz4q.js";function Y(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var A=N("Service");function Z(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class D{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!D.instance)D.instance=new D;return D.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
|
|
2
2
|
再按一次 Ctrl+C 退出
|
|
3
3
|
`)}),this.initialized=!0,A.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup(b){return this.cleanupHandlers.push(b),A.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let q=this.cleanupHandlers.indexOf(b);if(q!==-1)this.cleanupHandlers.splice(q,1),A.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError(b,q){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${b}):`,q);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${b})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",q.message),console.error(""),q.stack)console.error("堆栈跟踪:"),console.error(q.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown(b,1)}async shutdown(b,q=0){if(this.isShuttingDown){A.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,A.info(`[GracefulShutdown] 开始优雅退出 (原因: ${b})`);try{await K()}catch(z){}try{let z=U.getInstance();if(z.isEnabled()){let F=Q(),W=F.session?.sessionId||"unknown",X=F.config?.config?.permissionMode||"default";await z.executeSessionEndHooks(Z(b),{projectDir:O(),sessionId:W,permissionMode:X})}}catch(z){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",z)}let B=5000,V=new Promise((z,F)=>{setTimeout(()=>{F(Error(`清理超时 (${B}ms)`))},B)});try{let z=this.runCleanupHandlers();await Promise.race([z,V])}catch(z){console.error("[GracefulShutdown] 清理过程中发生错误:",z)}finally{Y(),setTimeout(()=>{process.exit(q)},100)}}async runCleanupHandlers(){let b=[...this.cleanupHandlers].reverse();for(let q of b)try{let B=q();if(B instanceof Promise)await B}catch(B){console.error("[GracefulShutdown] 清理函数执行失败:",B)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var J=()=>{return D.getInstance()},H=(b)=>{return J().registerCleanup(b)},P=()=>{J().initialize()},L=(b=0)=>{J().shutdown("normal",b)};
|
|
4
4
|
export{J as l,H as m,P as n,L as o};
|