blade-code 0.7.6 → 0.7.8
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-npaj13y3.js → chunk-0e0z8yc1.js} +2 -2
- package/dist/{chunk-fceeqn6k.js → chunk-1w6tqkxd.js} +2 -2
- package/dist/{chunk-ttf06k8y.js → chunk-2049tv49.js} +3 -3
- package/dist/chunk-4745ktjj.js +1570 -0
- package/dist/chunk-48q9msfk.js +615 -0
- package/dist/chunk-4dmdn3a9.js +2 -0
- package/dist/{chunk-zr71r1z1.js → chunk-5be6qr2v.js} +1 -1
- package/dist/chunk-67vzgcs5.js +2 -0
- package/dist/{chunk-krrm6bjr.js → chunk-6811kbxn.js} +1 -1
- package/dist/{chunk-d9qh7bat.js → chunk-6hn2jgw5.js} +1 -1
- package/dist/chunk-6js5wp6t.js +1 -0
- package/dist/chunk-6kp3z956.js +9 -0
- package/dist/{chunk-pf45ctn7.js → chunk-71n472hj.js} +1 -1
- package/dist/chunk-78txnq4n.js +151 -0
- package/dist/chunk-7r1hm0qz.js +6 -0
- package/dist/{chunk-1y33d6xh.js → chunk-9kejtkey.js} +1 -1
- package/dist/chunk-a7yjnqhd.js +3 -0
- package/dist/chunk-bwaqaktn.js +1 -0
- package/dist/chunk-cb82rf5h.js +1 -0
- package/dist/chunk-ce11m8bq.js +1 -0
- package/dist/{chunk-m3hsaaq5.js → chunk-cjmxggke.js} +1 -1
- package/dist/chunk-e4rhdg3h.js +1 -0
- package/dist/{chunk-64x50qbc.js → chunk-f9ybv4ph.js} +1 -1
- package/dist/{chunk-x4fx52e7.js → chunk-faq7ay4j.js} +3 -3
- package/dist/{chunk-jhzf05kz.js → chunk-fb7amc2s.js} +1 -1
- package/dist/chunk-g6ted982.js +4 -0
- package/dist/{chunk-qyfdt8h1.js → chunk-g7caymjr.js} +1 -1
- package/dist/{chunk-ezkbqmvd.js → chunk-jm2xhnrv.js} +1 -1
- package/dist/chunk-ky8ctbdc.js +1 -0
- package/dist/chunk-mpskff34.js +1 -0
- package/dist/chunk-pd1yqxcv.js +9 -0
- package/dist/{chunk-arwynrtf.js → chunk-phhmmybg.js} +2 -2
- package/dist/chunk-qnevwq1q.js +2 -0
- package/dist/{chunk-ebynn53v.js → chunk-r1spf93b.js} +2 -2
- package/dist/{chunk-r0hc7wad.js → chunk-rnfd5ebv.js} +1 -1
- package/dist/{chunk-wg5nxtb2.js → chunk-s4mke0t6.js} +1 -1
- package/dist/{chunk-wstkn75a.js → chunk-t2spryz0.js} +1 -1
- package/dist/{chunk-rhvxr82g.js → chunk-t70aqrm4.js} +1 -1
- package/dist/{chunk-10q3krvh.js → chunk-z4c68ve0.js} +1 -1
- package/dist/chunk-z9zbcenc.js +6 -0
- package/dist/web/assets/{CodeBlockHighlighter-C86flFwh.js → CodeBlockHighlighter-C1cp8dDv.js} +1 -1
- package/dist/web/assets/FilePreview-DRKRs8i2.js +7 -0
- package/dist/web/assets/{MarkdownRenderer-CW8WpEw1.js → MarkdownRenderer-DFqPpAnM.js} +1 -1
- package/dist/web/assets/{McpModal-DnqrgBON.js → McpModal-CX5-hlNv.js} +1 -1
- package/dist/web/assets/{SettingsModal-CRNT-LCq.js → SettingsModal-CfR_q6N7.js} +1 -1
- package/dist/web/assets/{SettingsStore-B2GIhfKs.js → SettingsStore-jup_Kikq.js} +1 -1
- package/dist/web/assets/{SkillsModal-COQMbIdT.js → SkillsModal-DaAUrwXO.js} +1 -1
- package/dist/web/assets/{TerminalPanel-dCMUvQaH.js → TerminalPanel-DzlllDH7.js} +1 -1
- package/dist/web/assets/index-BJTSF3fc.js +9 -0
- package/dist/web/assets/index-CL6apjgo.css +1 -0
- package/dist/web/assets/{useRequest-C7k7cDPD.js → useRequest-DITGl55G.js} +1 -1
- package/dist/web/assets/{vendor-icons-BKXQ7ALf.js → vendor-icons-BuFpOlRn.js} +38 -28
- package/dist/web/assets/{vendor-markdown-DIcugY1e.js → vendor-markdown-Bo4W9Tae.js} +1 -1
- package/dist/web/assets/vendor-radix-CESj0OOY.js +45 -0
- package/dist/web/assets/{vendor-react-Dm1xU4bP.js → vendor-react-BalntB5F.js} +2 -2
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-1tzcptyb.js +0 -3
- package/dist/chunk-5accz8n9.js +0 -1
- package/dist/chunk-8raa4q9y.js +0 -1564
- package/dist/chunk-ad19yrq6.js +0 -1
- package/dist/chunk-bvn4e2vq.js +0 -1
- package/dist/chunk-cadngkwr.js +0 -2
- package/dist/chunk-cdx3hp1r.js +0 -9
- package/dist/chunk-g60w2r7f.js +0 -6
- package/dist/chunk-h7qab07x.js +0 -2
- package/dist/chunk-k76q8cyc.js +0 -151
- package/dist/chunk-n2yq1wn8.js +0 -9
- package/dist/chunk-q6sj33v8.js +0 -6
- package/dist/chunk-qedtzcp2.js +0 -1
- package/dist/chunk-t6qek6xk.js +0 -1
- package/dist/chunk-tyjns370.js +0 -1
- package/dist/chunk-ve6bvba4.js +0 -615
- package/dist/chunk-wdxbjvd5.js +0 -2
- package/dist/chunk-xj63cr29.js +0 -1
- package/dist/chunk-zmndvdgb.js +0 -4
- package/dist/web/assets/FilePreview-CbtOITD1.js +0 -7
- package/dist/web/assets/index-21gV5nOE.css +0 -1
- package/dist/web/assets/index-Cnz-_jPt.js +0 -10
- package/dist/web/assets/vendor-radix-2yBsoRqx.js +0 -45
package/dist/chunk-wdxbjvd5.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as uf,k as gf}from"./chunk-zr71r1z1.js";import{A as af,C as Pf,D as Gf,E as Bf,I as Qf,J as m,L as Rf,M as kf,O as mf,R as h,Y as rf}from"./chunk-8raa4q9y.js";import{$ as S}from"./chunk-fceeqn6k.js";import{sa as o,ua as Cf,va as zf,za as k}from"./chunk-x4fx52e7.js";import{Fa as a}from"./chunk-arwynrtf.js";import{La as df,Na as Zf,Wa as Uf}from"./chunk-ve6bvba4.js";import{mb as yf}from"./chunk-ezkbqmvd.js";import{qb as Lf}from"./chunk-rhvxr82g.js";import{wb as _}from"./chunk-cadngkwr.js";import{Qb as H}from"./chunk-1tzcptyb.js";import{Sb as qf}from"./chunk-64x50qbc.js";var f$={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 $$(V){return{port:V.port??0,hostname:V.hostname??"127.0.0.1",cors:V.cors??[]}}import{Hono as g0}from"hono";import{cors as l0}from"hono/cors";import{existsSync as Y0,readFileSync as Xf}from"node:fs";import{createServer as d0}from"node:http";import{networkInterfaces as c0}from"node:os";import{dirname as o0,extname as a0,join as u}from"node:path";import{fileURLToPath as r0}from"node:url";import{WebSocketServer as t0}from"ws";import{z as Vf}from"zod";class s extends Error{code;statusCode;constructor(V,$,f=500){super($);this.code=V;this.statusCode=f;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message}}}}class d extends s{constructor(V,$){super("NOT_FOUND",$?`${V} not found: ${$}`:`${V} not found`,404)}}class w extends s{constructor(V){super("BAD_REQUEST",V,400)}}var Q$=Vf.object({error:Vf.object({code:Vf.string(),message:Vf.string()})});import{Hono as K0}from"hono";import{z as c}from"zod";var Of=H("Service"),j0=c.object({updates:c.record(c.any()),options:c.object({scope:c.enum(["local","project","global"]).optional(),immediate:c.boolean().optional()}).optional()}),Hf=()=>{let V=new K0;return V.get("/",async($)=>{try{let f=o();return $.json(f||{})}catch(f){return Of.error("[ConfigRoutes] Failed to get config:",f),$.json({})}}),V.put("/",async($)=>{try{let f=await $.req.json(),Q=j0.safeParse(f);if(!Q.success)throw new w("Invalid config update format");let{updates:Y,options:G}=Q.data;return await k().updateConfig(Y,G),$.json({success:!0,updates:Y})}catch(f){throw Of.error("[ConfigRoutes] Failed to update config:",f),f}}),V.get("/permissions",async($)=>{try{let f=o();return $.json(f?.permissions||{})}catch(f){return Of.error("[ConfigRoutes] Failed to get permissions:",f),$.json({})}}),V};import{Hono as G0}from"hono";var Df=()=>{let V=new G0;return V.get("/health",($)=>{return $.json({healthy:!0,version:a()})}),V.get("/info",($)=>{return $.json({version:a(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:_()})}),V};import{Hono as X0}from"hono";var e=H("Service"),wf=()=>{let V=new X0;return V.get("/",async($)=>{try{let Q=S.getInstance().getAllServers(),Y=Array.from(Q.entries()).map(([G,Z])=>({id:G,name:G,status:Z.status==="connected"?"connected":Z.status==="connecting"?"connecting":Z.lastError?"error":"offline",endpoint:Z.config.command?`${Z.config.command} ${(Z.config.args||[]).join(" ")}`.trim():Z.config.url||"Unknown",description:`MCP server: ${G}`,tools:Z.tools.map((F)=>F.name),connectedAt:Z.connectedAt?.toISOString(),error:Z.lastError?.message}));return $.json(Y)}catch(f){return e.error("[McpRoutes] Failed to get MCP servers:",f),$.json([])}}),V.post("/:name/connect",async($)=>{try{let f=$.req.param("name");return await S.getInstance().connectServer(f),$.json({success:!0})}catch(f){return e.error("[McpRoutes] Failed to connect MCP server:",f),$.json({success:!1,error:f.message},500)}}),V.post("/:name/disconnect",async($)=>{try{let f=$.req.param("name");return await S.getInstance().disconnectServer(f),$.json({success:!0})}catch(f){return e.error("[McpRoutes] Failed to disconnect MCP server:",f),$.json({success:!1,error:f.message},500)}}),V.delete("/:name",async($)=>{try{let f=$.req.param("name");await S.getInstance().unregisterServer(f);let Y=o();if(Y?.mcpServers){let{[f]:G,...Z}=Y.mcpServers;await k().updateConfig({mcpServers:Z})}return $.json({success:!0})}catch(f){return e.error("[McpRoutes] Failed to delete MCP server:",f),$.json({success:!1,error:f.message},500)}}),V.post("/",async($)=>{try{let f=await $.req.json(),{name:Q,config:Y}=f;if(!Q||!Y)return $.json({success:!1,error:"Missing name or config"},400);await S.getInstance().registerServer(Q,Y);let Z=o();return await k().updateConfig({mcpServers:{...Z?.mcpServers,[Q]:Y}}),$.json({success:!0})}catch(f){return e.error("[McpRoutes] Failed to add MCP server:",f),$.json({success:!1,error:f.message},500)}}),V};import{Hono as N0}from"hono";var Jf=H("Service"),bf=()=>{let V=new N0;return V.get("/",async($)=>{try{let f=Cf(),Q=zf();return $.json({configured:f,current:Q})}catch(f){return Jf.error("[ModelsRoutes] Failed to get models:",f),$.json({configured:[],current:null})}}),V.post("/",async($)=>{try{let f=await $.req.json(),{provider:Q,name:Y,model:G,baseUrl:Z,apiKey:F}=f;if(!G)throw new w("model is required");let W=await k().addModel({provider:Q||"openai-compatible",name:Y||G,model:G,baseUrl:Z||void 0,apiKey:F||void 0});return $.json({success:!0,model:W})}catch(f){throw Jf.error("[ModelsRoutes] Failed to add model:",f),f}}),V.put("/:modelId",async($)=>{try{let f=$.req.param("modelId"),Q=await $.req.json(),{baseUrl:Y,apiKey:G,model:Z}=Q;return await k().updateModel(f,{baseUrl:Y||void 0,apiKey:G||void 0,model:Z||void 0}),$.json({success:!0})}catch(f){throw Jf.error("[ModelsRoutes] Failed to update model:",f),f}}),V.delete("/:modelId",async($)=>{try{let f=$.req.param("modelId");return await k().removeModel(f),$.json({success:!0})}catch(f){throw Jf.error("[ModelsRoutes] Failed to delete model:",f),f}}),V};import{Hono as H0}from"hono";import{z as P}from"zod";import{Mutex as F0}from"async-mutex";import{Hono as x0}from"hono";import{streamSSE as O0}from"hono/streaming";import{LRUCache as U0}from"lru-cache";import{nanoid as r}from"nanoid";import{z as T}from"zod";var D=H("Service"),W0=T.object({title:T.string().optional(),projectPath:T.string().optional()}),E0=T.object({content:T.string(),attachments:T.array(T.object({type:T.enum(["file","image","url"]),path:T.string().optional(),url:T.string().optional(),content:T.string().optional(),mimeType:T.string().optional(),name:T.string().optional()})).optional(),permissionMode:T.enum(["default","autoEdit","plan","yolo"]).optional()}),M0=T.object({title:T.string().optional()}),B0=T.object({objective:T.string().min(1),tokenBudget:T.number().int().positive().optional(),permissionMode:T.enum(["default","autoEdit","plan","yolo"]).optional()}),q0=T.discriminatedUnion("action",[T.object({action:T.literal("pause")}),T.object({action:T.literal("resume")}),T.object({action:T.literal("edit"),objective:T.string().min(1)})]),L=new Map,C=new U0({max:100,ttl:1800000,dispose:(V,$)=>{if(V.status==="running"||V.status==="waiting_permission")Yf(V,"cache-eviction"),D.debug(`[SessionRoutes] Run ${$} disposed due to cache eviction`)}});function Yf(V,$="user-cancel"){if(V.status==="cancelled"||V.status==="completed"||V.status==="failed")return!1;let f=V.pendingPermission;return V.pendingPermission=void 0,f?.resolve({approved:!1,reason:yf}),V.abortController.abort($),V.status="cancelled",m.publish(V.sessionId,"run.cancelled",{runId:V.id}),!0}function Sf(V,$=!1){let{permissionId:f,details:Q}=V;if(Q.type==="askUserQuestion"&&Q.questions)return{type:"question.required",properties:{requestId:f,toolCallId:f,questions:Q.questions,details:Q,...$?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:f,toolName:Q.toolName,description:Q.message,args:Q.args,details:Q,...$?{replayed:!0}:{}}}}var T0=(V)=>{if(!V||typeof V!=="object")return V;let $={...V},f=200000;if(typeof $.oldContent==="string"&&$.oldContent.length>f)delete $.oldContent;if(typeof $.newContent==="string"&&$.newContent.length>f)delete $.newContent;return $};function Wf(V){if(typeof V==="string")return V;return V.filter(($)=>$.type==="text").map(($)=>$.text).join(`
|
|
2
|
-
`)}function _0(V,$){let f=($??[]).filter((Y)=>Y.type==="image"&&typeof Y.content==="string").map((Y)=>({type:"image_url",image_url:{url:Y.content}}));if(f.length===0)return V;let Q=[];if(V.trim())Q.push({type:"text",text:V});return Q.push(...f),Q}var hf=()=>{let V=new x0,$=new Map,f=new Map,Q=new Map,Y=new Map,G=(J)=>{let K=Y.get(J);if(!K)K=new F0,Y.set(J,K);return K},Z=async(J)=>{let K=$.get(J.id);if(K)return K;let X=f.get(J.id);if(!X)X=Qf.create({sessionId:J.id,workspaceRoot:J.projectPath}),f.set(J.id,X);try{let j=await X;return $.set(J.id,j),j}finally{if(f.get(J.id)===X)f.delete(J.id)}},F=async(J,K)=>{let X=L.get(J);if(X)return X;let j=Q.get(J);if(!j)j=(async()=>{let N=(await h.listSessions()).find((A)=>A.sessionId===J),x=N?.projectPath??K,E=N?await h.loadSession(J,x).catch(()=>[]):[],B={id:J,projectPath:x,title:`Session ${J.slice(0,6)}`,createdAt:N?new Date(N.firstMessageTime):new Date,messages:E,parentId:N?.parentId,relationType:N?.relationType};return L.set(J,B),B})(),Q.set(J,j);try{return await j}finally{if(Q.get(J)===j)Q.delete(J)}},W=(J,K,X,j={})=>{let N=r(12),x={id:N,sessionId:J.id,status:"running",abortController:new AbortController,createdAt:new Date};return C.set(N,x),J.currentRunId=N,x.completion=A0(x,J,K,X,Z,{pendingInputOnly:j.pendingInputOnly,preparedInputTurn:j.preparedInputTurn,goalContinuationOnly:j.goalContinuationOnly}).catch((E)=>{D.error(`[SessionRoutes] Run ${N} failed:`,E)}),x},O=async(J)=>{let K=J.currentRunId?C.get(J.currentRunId):void 0;if(K&&(K.status==="running"||K.status==="waiting_permission"))return;let X=await Qf.hasPendingInbox(J.projectPath,J.id),j=!X&&await Qf.hasActiveGoal(J.projectPath,J.id);if(!X&&!j)return;let N=await Z(J),x=J.currentRunId?C.get(J.currentRunId):void 0;if(x&&(x.status==="running"||x.status==="waiting_permission"))return;if(X&&N.getPendingSteeringCount()===0||N.hasTurnOwner())return;W(J,"","default",{pendingInputOnly:X,goalContinuationOnly:j})};return V.get("/",async(J)=>{try{let K=await h.listSessions(),X=new Set(K.filter((M)=>M.relationType==="subagent").map((M)=>M.sessionId)),j=Array.from(L.values()).filter((M)=>!X.has(M.id)&&M.relationType!=="subagent").map((M)=>({sessionId:M.id,projectPath:M.projectPath,title:M.title,parentId:M.parentId,relationType:M.relationType,status:void 0,agentType:void 0,model:void 0,messageCount:M.messages.length,firstMessageTime:M.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0})),N=new Set(j.map((M)=>M.sessionId)),x=K.filter((M)=>!L.has(M.sessionId)&&!N.has(M.sessionId)&&M.relationType!=="subagent"),E=new Set(N),B=x.filter((M)=>{if(E.has(M.sessionId))return!1;return E.add(M.sessionId),!0}),A=[...j,...B];return J.json(A)}catch(K){return D.error("[SessionRoutes] Failed to list sessions:",K),J.json([])}}),V.post("/",async(J)=>{try{let K=await J.req.json(),X=W0.safeParse(K);if(!X.success)throw new w("Invalid request body");let{title:j,projectPath:N}=X.data,x=Lf("web",12),E=N||J.get("directory")||_(),B={id:x,projectPath:E,title:j||`Session ${x.slice(0,6)}`,createdAt:new Date,messages:[]};return L.set(x,B),J.json({sessionId:x,projectPath:E,title:B.title,parentId:void 0,relationType:void 0,status:void 0,agentType:void 0,model:void 0,messageCount:0,firstMessageTime:B.createdAt.toISOString(),lastMessageTime:B.createdAt.toISOString(),hasErrors:!1})}catch(K){throw D.error("[SessionRoutes] Failed to create session:",K),K}}),V.get("/:sessionId",async(J)=>{let K=J.req.param("sessionId"),X=L.get(K);if(X)return J.json({sessionId:X.id,projectPath:X.projectPath,title:X.title,parentId:X.parentId,relationType:X.relationType,messageCount:X.messages.length,firstMessageTime:X.createdAt.toISOString(),lastMessageTime:new Date().toISOString(),hasErrors:!1,isActive:!0});try{let N=(await h.listSessions()).find((x)=>x.sessionId===K);if(!N)throw new d("Session",K);return J.json(N)}catch(j){if(j instanceof d)throw j;throw D.error("[SessionRoutes] Failed to get session:",j),j}}),V.post("/:sessionId/fork",async(J)=>{let K=J.req.param("sessionId"),X=await F(K,J.get("directory")||_());return G(K).runExclusive(async()=>{let j=X.currentRunId?C.get(X.currentRunId):void 0;if(j&&(j.status==="running"||j.status==="waiting_permission"))return J.json({error:"Cannot branch an active session"},409);let N=await h.forkSession(K,{sourceProjectPath:X.projectPath,targetProjectPath:X.projectPath}),x=new Date,E={id:N.sessionId,projectPath:N.projectPath,title:`Session ${N.sessionId.slice(0,6)}`,createdAt:x,messages:N.messages,parentId:N.parentSessionId,relationType:"fork"};return L.set(E.id,E),J.json({sessionId:E.id,projectPath:E.projectPath,title:E.title,parentId:E.parentId,relationType:E.relationType,status:void 0,agentType:void 0,model:void 0,messageCount:E.messages.length,firstMessageTime:E.createdAt.toISOString(),lastMessageTime:E.createdAt.toISOString(),hasErrors:!1},201)})}),V.patch("/:sessionId",async(J)=>{let K=J.req.param("sessionId");try{let X=await J.req.json(),j=M0.safeParse(X);if(!j.success)throw new w("Invalid request body");let{title:N}=j.data,x=L.get(K);if(x&&N)x.title=N;return J.json({success:!0,title:N})}catch(X){throw D.error("[SessionRoutes] Failed to update session:",X),X}}),V.get("/:sessionId/goal",async(J)=>{let K=J.req.param("sessionId"),X=await F(K,J.get("directory")||_());return J.json({goal:await new Pf(X.projectPath,K).get()})}),V.put("/:sessionId/goal",async(J)=>{let K=J.req.param("sessionId"),X=B0.safeParse(await J.req.json());if(!X.success)throw new w("Invalid goal request");let j=await F(K,J.get("directory")||_());return G(K).runExclusive(async()=>{let N=j.currentRunId?C.get(j.currentRunId):void 0;if(N&&(N.status==="running"||N.status==="waiting_permission"))return J.json({status:"rejected",reason:"run_active"},409);let E=await(await Z(j)).createGoal(X.data);m.publish(K,"goal.updated",{goal:E});let B=X.data.permissionMode??"default",A=W(j,"",B,{goalContinuationOnly:!0});return J.json({status:"running",runId:A.id,goal:E},202)})}),V.patch("/:sessionId/goal",async(J)=>{let K=J.req.param("sessionId"),X=q0.safeParse(await J.req.json());if(!X.success)throw new w("Invalid goal update");let j=await F(K,J.get("directory")||_());return G(K).runExclusive(async()=>{let N=await Z(j),x;if(X.data.action==="pause")x=await N.pauseGoal();else if(X.data.action==="edit")x=await N.editGoal(X.data.objective);else x=await N.resumeGoal();if(m.publish(K,"goal.updated",{goal:x}),x.status==="active"&&(!j.currentRunId||!["running","waiting_permission"].includes(C.get(j.currentRunId)?.status??""))){let E=W(j,"","default",{goalContinuationOnly:!0});return J.json({status:"running",runId:E.id,goal:x},202)}return J.json({status:x.status,goal:x})})}),V.delete("/:sessionId/goal",async(J)=>{let K=J.req.param("sessionId"),X=await F(K,J.get("directory")||_()),N=await(await Z(X)).clearGoal();if(N)m.publish(K,"goal.cleared",{});return J.json({cleared:N})}),V.delete("/:sessionId",async(J)=>{let K=J.req.param("sessionId"),X=L.get(K);if(X?.currentRunId){let N=C.get(X.currentRunId);if(N)Yf(N),await N.completion,C.delete(X.currentRunId)}let j=$.get(K);if(j)await j.clearGoal().catch((N)=>{D.warn("[SessionRoutes] Failed to clear session goal:",N)});try{await h.deleteSession(K)}catch(N){D.warn("[SessionRoutes] Failed to delete session file:",N)}if(L.delete(K),Q.delete(K),f.delete(K),Y.delete(K),j){if(await j.dispose(),$.delete(K),$.size===0)await S.getInstance().disconnectAll()}return J.json({success:!0})}),V.get("/:sessionId/message",async(J)=>{let K=J.req.param("sessionId");try{let X=await h.loadSession(K);return J.json(X)}catch(X){return D.error("[SessionRoutes] Failed to get messages:",X),J.json([])}}),V.get("/:sessionId/events",async(J)=>{let K=J.req.param("sessionId"),X=await F(K,J.get("directory")||_());return O0(J,async(j)=>{await j.writeSSE({data:JSON.stringify({type:"connected",properties:{sessionId:K,timestamp:Date.now()}})});let x=new Set,E=m.subscribe((q)=>{if(q.sessionId!==K)return;let U=q.properties.requestId;if((q.type==="permission.asked"||q.type==="question.required")&&typeof U==="string"){if(x.has(U))return;x.add(U)}j.writeSSE({data:JSON.stringify({type:q.type,properties:{sessionId:q.sessionId,...q.properties}})}).catch(()=>{})}),A=(X.currentRunId?C.get(X.currentRunId):void 0)?.pendingPermission;if(A){x.add(A.permissionId);let q=Sf(A,!0);await j.writeSSE({data:JSON.stringify({type:q.type,properties:{sessionId:K,...q.properties}})})}O(X).catch((q)=>{D.error(`[SessionRoutes] Failed to resume pending input for ${K}:`,q)});let M=setInterval(()=>{if(!j.aborted)j.writeSSE({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})}).catch(()=>{})},15000);j.onAbort(()=>{clearInterval(M),E()});while(!0)if(await new Promise((q)=>setTimeout(q,1000)),j.aborted)break})}),V.post("/:sessionId/message",async(J)=>{let K=J.req.param("sessionId"),X=await J.req.json(),j=E0.safeParse(X);if(!j.success)throw new w("Invalid message format");let{content:N,attachments:x,permissionMode:E}=j.data,B=E||"default",A=J.get("directory")||_(),M=_0(N,x),q=await F(K,A);return G(K).runExclusive(async()=>{let U=q.currentRunId?C.get(q.currentRunId):void 0;if(U&&(U.status==="running"||U.status==="waiting_permission")){let y=await(await Z(q)).enqueueSteering(M,{allowBeforeTurn:!0});if(!y.accepted)return J.json({status:"rejected",reason:y.reason??"turn_unavailable"},409);let l=y.messageId??r(12),n=y.queued;m.publish(K,"message.created",{messageId:l,role:"user",content:Wf(M)});let Ff=y.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(m.publish(K,Ff,{runId:U.id,messageId:l,queued:n}),y.delivery==="next_turn"&&U.status!=="running"&&U.status!=="waiting_permission")O(q).catch((xf)=>{D.error(`[SessionRoutes] Failed to wake queued follow-up for ${K}:`,xf)});if(y.delivery==="next_turn")U.pendingFollowUpRequested=!0;return J.json({runId:U.id,messageId:l,status:y.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:n},202)}let g=await(await Z(q)).prepareInputTurn(M);if(!g.accepted)return J.json({status:"rejected",reason:g.reason},g.reason==="queue_full"?429:409);let Nf=W(q,M,B,{preparedInputTurn:g});return J.json({runId:Nf.id,messageId:g.messageId,status:"running"},202)})}),V.post("/:sessionId/abort",async(J)=>{let K=J.req.param("sessionId"),X=L.get(K);if(X?.currentRunId){let j=C.get(X.currentRunId);if(j)Yf(j),await j.completion}return J.json({success:!0})}),V.get("/:sessionId/status",async(J)=>{let K=J.req.param("sessionId"),X=L.get(K);if(!X?.currentRunId)return J.json({sessionId:K,status:"idle"});let j=C.get(X.currentRunId);return J.json({sessionId:K,runId:X.currentRunId,status:j?.status||"idle"})}),V};async function A0(V,$,f,Q,Y,G={}){let{abortController:Z,sessionId:F,id:W}=V,O=G.preparedInputTurn?.messageId??r(12),K=G.pendingInputOnly===!0||G.preparedInputTurn?.mode==="pending"||G.goalContinuationOnly===!0?void 0:r(12),X,j=(N,x)=>{m.publish(F,N,x)};try{if(!G.pendingInputOnly&&!G.goalContinuationOnly)j("message.created",{messageId:O,role:"user",content:Wf(f)});if(j("session.status",{status:"running"}),K)j("message.created",{messageId:K,role:"assistant",content:""});X=await Y($);let N=X,x=await mf.createWithRuntime(N,{sessionId:F}),E=async(U)=>{let z=r(12),g=300000;V.status="waiting_permission";let Nf=new Promise((n)=>{let Ff=setTimeout(()=>{D.warn(`[SessionRoutes] Permission ${z} timed out after 300000ms`),j("permission.timeout",{requestId:z}),n({approved:!1,reason:"timeout"})},300000);V.pendingPermission={permissionId:z,resolve:(xf)=>{clearTimeout(Ff),n(xf)},details:U}}),$f=V.pendingPermission;if(!$f)throw Error("Permission request was not registered");let y=Sf($f);j(y.type,y.properties),D.info(`[SessionRoutes] Permission request created: ${z}, runId: ${W}`);let l=await Nf;if(D.info(`[SessionRoutes] Permission response received: ${z}, approved: ${l.approved}`),!Z.signal.aborted)V.status="running";if(V.pendingPermission===$f)V.pendingPermission=void 0;return l},B={messages:[...$.messages],userId:"web-user",sessionId:F,workspaceRoot:$.projectPath,signal:Z.signal,permissionMode:Q,confirmationHandler:{requestConfirmation:E}},A=()=>{if(!K)K=r(12),j("message.created",{messageId:K,role:"assistant",content:""});return K},M=async(U)=>{switch(U.kind){case"content_delta":j("message.delta",{messageId:A(),delta:U.delta});break;case"thinking_delta":j("thinking.delta",{delta:U.delta});break;case"tool_start":if("function"in U.toolCall)j("tool.start",{messageId:A(),toolName:U.toolCall.function.name,toolCallId:U.toolCall.id,arguments:U.toolCall.function.arguments,toolKind:U.toolKind});break;case"tool_result":if("function"in U.toolCall)j("tool.result",{messageId:A(),toolName:U.toolCall.function.name,toolCallId:U.toolCall.id,success:U.result.success,summary:U.result.metadata?.summary,output:kf(Rf(U.toolCall.function.name,U.result)),metadata:T0(U.result.metadata)});break;case"token_usage":j("token.usage",{...U.usage});break;case"turn_start":j("turn.started",{turn:U.turn,maxTurns:U.maxTurns});break;case"steering_applied":j("steering.applied",{runId:W,messageIds:U.messageIds,count:U.count,recovered:U.recovered,delivery:U.delivery,queued:N.getPendingSteeringCount()});break;case"follow_up_started":{if(K)j("message.complete",{messageId:K}),K=void 0;for(let z of U.messages){if(!z.recovered||z.persisted)continue;j("message.created",{messageId:z.id,role:"user",content:Wf(z.content),recovered:!0})}j("follow_up.started",{runId:W,queued:U.queued,recovered:U.recovered}),A();break}case"goal_updated":j("goal.updated",{goal:U.goal});break;case"goal_continuation_started":j("goal.continuation.started",{goal:U.goal,continuation:U.continuation}),A();break;case"compaction":j(U.phase==="start"?"compaction.started":"compaction.completed",{});break;case"model_fallback":j("model.fallback",{});break;case"task_update":j("task.updated",{tasks:U.tasks});break;default:break}},q=await Uf(x.chatStream(f,B,{stream:!0,pendingInputOnly:G.pendingInputOnly,preparedInputTurn:G.preparedInputTurn,goalContinuationOnly:G.goalContinuationOnly}),M);if(!q.success)throw Error(q.error?.message??"Agent run failed");for(let U=0;U<20;U++){let z=V.pendingFollowUpRequested===!0;if(V.pendingFollowUpRequested=!1,N.getPendingSteeringCount()===0){if(!z)break;continue}if(Z.signal.aborted)break;if(q=await Uf(x.chatStream("",B,{stream:!0,pendingInputOnly:!0}),M),!q.success)throw Error(q.error?.message??"Agent follow-up failed")}if($.messages=[...B.messages],Z.signal.aborted||V.status==="cancelled"){j("session.status",{status:"idle"});return}if(K)j("message.complete",{messageId:K});j("thinking.completed",{}),V.status="completed",j("session.completed",{runId:W,outputTruncated:q.metadata?.outputTruncated??!1}),j("session.status",{status:"idle"})}catch(N){if(X&&G.preparedInputTurn)await X.finishTurn(G.preparedInputTurn.handle).catch(()=>{return});if(Z.signal.aborted||V.status==="cancelled"){Yf(V,"runtime-abort"),j("session.status",{status:"idle"});return}D.error("[SessionRoutes] Agent execution error:",N),V.status="failed",j("session.error",{error:N instanceof Error?N.message:"Unknown error"}),j("session.status",{status:"error"})}}function vf(V,$,f){D.info(`[SessionRoutes] Looking for permission ${$} in session ${V}`),D.info(`[SessionRoutes] Active runs: ${C.size}`);for(let[Q,Y]of C.entries())if(D.info(`[SessionRoutes] Checking run ${Q}: sessionId=${Y.sessionId}, pendingPermission=${Y.pendingPermission?.permissionId}`),Y.sessionId===V&&Y.pendingPermission?.permissionId===$)return Y.pendingPermission.resolve(f),D.info(`[SessionRoutes] Permission ${$} responded, runId: ${Y.id}`),!0;return D.error(`[SessionRoutes] Permission not found: ${$}`),!1}var Ef=H("Service"),D0=P.object({approved:P.boolean(),remember:P.boolean().optional(),scope:P.enum(["once","session","project"]).optional(),targetMode:P.enum(["default","autoEdit","plan","yolo"]).optional(),feedback:P.string().optional(),answers:P.record(P.union([P.string(),P.array(P.string())])).optional()}),If=()=>{let V=new H0;return V.post("/:permissionId",async($)=>{let f=$.req.param("permissionId"),Q=$.req.query("sessionId");Ef.info(`[PermissionRoutes] Received permission response: permissionId=${f}, sessionId=${Q}`);try{let Y=await $.req.json(),G=D0.safeParse(Y);if(!G.success)throw new w("Invalid permission response format");let{approved:Z,remember:F,scope:W,targetMode:O,feedback:J,answers:K}=G.data;if(!Q)throw new w("sessionId query parameter is required");if(!vf(Q,f,{approved:Z,reason:J,scope:W,targetMode:O,feedback:J,answers:K}))throw new d("Permission request",f);return Ef.info(`[PermissionRoutes] Permission ${f} ${Z?"approved":"denied"}`),$.json({success:!0,approved:Z,remember:F})}catch(Y){throw Ef.error("[PermissionRoutes] Failed to respond to permission:",Y),Y}}),V};import{Hono as w0}from"hono";var pf=H("Service"),lf=()=>{let V=new w0;return V.get("/",async($)=>{try{let f=await uf();return $.json(f)}catch(f){return pf.error("[ProviderRoutes] Failed to list providers:",f),$.json([])}}),V.get("/:provider/models",async($)=>{let f=$.req.param("provider");try{let Q=await gf(f);return $.json(Q)}catch(Q){return pf.error("[ProviderRoutes] Failed to list models:",Q),$.json([])}}),V};import{Hono as C0}from"hono";import*as v from"node:fs/promises";import{homedir as z0}from"node:os";import*as Kf from"node:path";var p=H("Service"),Mf=Kf.join(z0(),".blade","skills-config.json");async function cf(){try{let V=await v.readFile(Mf,"utf-8");return JSON.parse(V)}catch{return{disabled:[]}}}async function b0(V){await v.mkdir(Kf.dirname(Mf),{recursive:!0}),await v.writeFile(Mf,JSON.stringify(V,null,2))}async function L0(V,$){let f=await cf();if($)f.disabled=f.disabled.filter((Q)=>Q!==V);else if(!f.disabled.includes(V))f.disabled.push(V);await b0(f)}var t=null,y0=300000;async function P0(){if(t&&Date.now()-t.timestamp<y0)return t.data;try{let V=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!V.ok)return p.warn(`GitHub API returned ${V.status}`),t?.data||[];let $=await V.json(),f=[];for(let Q of $){if(Q.type!=="dir")continue;let Y=`Official ${Q.name} skill`;try{let G=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${Q.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(G.ok){let F=(await G.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(F)Y=F[1].trim().slice(0,100)}}catch{}f.push({name:Q.name,description:Y,tag:"Official",author:"Anthropic"})}return t={data:f,timestamp:Date.now()},f}catch(V){return p.warn("Failed to fetch skills catalog from GitHub:",V),t?.data||[]}}var of=()=>{let V=new C0;return V.get("/",async($)=>{try{let f=Zf();await f.initialize();let Q=f.getAll(),Y=await cf(),G=Q.map((Z)=>({id:Z.name,name:Z.name,enabled:!Y.disabled.includes(Z.name),description:Z.description||"",version:Z.version||"1.0.0",provider:"Local",location:Z.source==="builtin"?"Built-in":Z.basePath,capabilities:["prompts"],allowedTools:Z.allowedTools||[]}));return $.json(G)}catch(f){return p.error("[SkillsRoutes] Failed to get skills:",f),$.json([])}}),V.post("/:name/toggle",async($)=>{try{let f=$.req.param("name"),Q=await $.req.json();return await L0(f,Q.enabled),$.json({success:!0,enabled:Q.enabled})}catch(f){return p.error("[SkillsRoutes] Failed to toggle skill:",f),$.json({success:!1,error:f.message},500)}}),V.delete("/:name",async($)=>{try{let f=$.req.param("name"),Q=`${process.env.HOME}/.blade/skills/${f}`;return await v.rm(Q,{recursive:!0,force:!0}),await Zf().refresh(),$.json({success:!0})}catch(f){return p.error("[SkillsRoutes] Failed to uninstall skill:",f),$.json({success:!1,error:f.message},500)}}),V.post("/install",async($)=>{try{let f=await $.req.json(),Q=df(),Y=Zf(),G=!1;if(f.source==="catalog"&&f.name){if(G=await Q.installOfficialSkill(f.name),!G)return $.json({success:!1,error:"Failed to install skill from catalog"},500)}else if(f.source==="repo"&&f.url){if(G=await Q.installFromRepo(f.url,f.name),!G)return $.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if(f.source==="local"&&f.path){if(G=await Q.installFromLocal(f.path,f.name),!G)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 Y.refresh(),$.json({success:!0})}catch(f){return p.error("[SkillsRoutes] Failed to install skill:",f),$.json({success:!1,error:f.message},500)}}),V.get("/catalog",async($)=>{try{let f=await P0();return $.json(f)}catch(f){return p.error("[SkillsRoutes] Failed to get catalog:",f),$.json([])}}),V};import R0 from"fast-glob";import{Hono as k0}from"hono";import{execSync as m0}from"node:child_process";import{readdir as S0}from"node:fs/promises";import jf from"node:path";var ff=H("Service"),h0=(V)=>{try{return m0("git rev-parse --abbrev-ref HEAD",{cwd:V,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},v0=[...Gf.map((V)=>`${V}/**`),...Gf,...Bf.map((V)=>`**/${V}`)],I0=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),tf=()=>{let V=new k0;return V.get("/commands",async($)=>{try{let f=$.req.query("q")||"",Q=rf(f).filter((Y)=>!I0.has(Y.command));return $.json(Q)}catch(f){return ff.error("[SuggestionsRoutes] Failed to get command suggestions:",f),$.json([])}}),V.get("/files",async($)=>{try{let f=$.req.query("q")||"",Q=$.get("directory")||_(),Y=Math.min(Number($.req.query("limit"))||100,1000),Z=(await R0("**/*",{cwd:Q,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:v0})).map((O)=>O.replace(/\\/g,"/"));if(!f)return $.json(Z.slice(0,Y));let F=f.toLowerCase(),W=Z.filter((O)=>O.toLowerCase().includes(F)).slice(0,Y);return $.json(W)}catch(f){return ff.error("[SuggestionsRoutes] Failed to get file suggestions:",f),$.json([])}}),V.get("/files/tree",async($)=>{try{let f=$.get("directory")||_(),Q=$.req.query("path")||"",Y=Q?jf.join(f,Q):f,Z=(await S0(Y,{withFileTypes:!0})).map((O)=>({name:O.name,path:Q?`${Q}/${O.name}`:O.name,type:O.isDirectory()?"dir":"file"}));Z.sort((O,J)=>{if(O.type!==J.type)return O.type==="dir"?-1:1;return O.name.localeCompare(J.name)});let F=new Set(Gf),W=Z.filter((O)=>{let J=O.name;if(J.startsWith("."))return!1;if(F.has(J))return!1;for(let K of Bf)if(J.match(new RegExp(K.replace("*",".*"))))return!1;return!0});return $.json(W)}catch(f){return ff.error("[SuggestionsRoutes] Failed to get file tree:",f),$.json([])}}),V.get("/files/content",async($)=>{try{let f=$.req.query("path");if(!f)return $.json({error:"Missing file path"},400);let Q=$.get("directory")||_(),Y=jf.resolve(Q,f),G=jf.relative(Q,Y);if(G.startsWith("..")||jf.isAbsolute(G))return $.json({error:"Invalid file path"},400);let Z=af(),F=await Z.stat(Y);if(!F?.isFile)return $.json({error:"File not found"},404);let W=200000,O=await Z.readTextFile(Y),J=O.length>W;return $.json({path:f,content:J?O.slice(0,W):O,truncated:J,size:F.size})}catch(f){return ff.error("[SuggestionsRoutes] Failed to get file content:",f),$.json({error:"Failed to read file"},500)}}),V.get("/git-info",async($)=>{try{let f=$.get("directory")||_(),Q=h0(f);return $.json({branch:Q})}catch(f){return ff.error("[SuggestionsRoutes] Failed to get git info:",f),$.json({branch:null})}}),V};import{Hono as p0}from"hono";var I=H("Service"),i=new Map,nf=2097152,sf=65536;function ef(){return typeof globalThis.Bun<"u"}async function u0(V,$,f){if(ef()){let{spawn:G}=await import("bun-pty"),Z=G(V,$,{name:"xterm-256color",cwd:f.cwd,env:f.env});return{pid:Z.pid,write:(F)=>Z.write(F),resize:(F,W)=>Z.resize(F,W),kill:()=>Z.kill(),onData:(F)=>Z.onData(F),onExit:(F)=>Z.onExit(F)}}let Y=(await import("node-pty")).spawn(V,$,{name:"xterm-256color",cwd:f.cwd,env:f.env,cols:80,rows:24});return{pid:Y.pid,write:(G)=>Y.write(G),resize:(G,Z)=>Y.resize(G,Z),kill:()=>Y.kill(),onData:(G)=>{Y.onData(G)},onExit:(G)=>{Y.onExit(G)}}}var _f=void 0,Tf;if(ef())try{let{createBunWebSocket:V}=await import("hono/bun"),$=V();Tf=$.upgradeWebSocket,_f=$.websocket}catch(V){I.warn("[Terminal] Failed to initialize Bun WebSocket support:",V)}async function f0(V,$){let f=`term-${Date.now()}`;I.info(`[Terminal] New connection: ${f}, cwd: ${V}`);let Q=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",Y=Q.endsWith("sh")?["-l"]:[],G=await u0(Q,Y,{cwd:V,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),Z={id:f,process:G,cwd:V,buffer:"",subscribers:new Set};if(i.set(f,Z),Z.subscribers.add($),G.onData((F)=>{let W=!1;for(let O of Z.subscribers)try{O.send(F),W=!0}catch{Z.subscribers.delete(O)}if(W)return;if(Z.buffer+=F,Z.buffer.length>nf)Z.buffer=Z.buffer.slice(-nf)}),G.onExit(({exitCode:F})=>{I.info(`[Terminal] Process exited: ${f}, code: ${F}`);for(let W of Z.subscribers)try{W.close()}catch{}i.delete(f)}),Z.buffer){let F=Z.buffer;Z.buffer="";for(let W=0;W<F.length;W+=sf)$.send(F.slice(W,W+sf))}return{session:Z,cleanup:()=>{if(I.info(`[Terminal] Connection closed: ${f}`),Z.subscribers.delete($),Z.subscribers.size===0){try{Z.process.kill()}catch{}i.delete(f)}}}}function $0(V,$){V.on("connection",async(f,Q)=>{let Y=new URL(Q.url||"/",`http://${Q.headers.host}`);if(!Y.pathname.endsWith("/terminal/ws")){f.close();return}let G=Y.searchParams.get("cwd")||$()||_();try{let{session:Z,cleanup:F}=await f0(G,{send:(W)=>f.send(W),close:()=>f.close()});f.on("message",(W)=>{try{Z.process.write(String(W))}catch(O){I.error("[Terminal] Failed to write to PTY:",O)}}),f.on("close",F),f.on("error",F)}catch(Z){I.error("[Terminal] Failed to spawn PTY:",Z),f.close()}})}var V0=()=>{let V=new p0;if(V.get("/status",($)=>{let f=Array.from(i.values()).map((Q)=>({id:Q.id,cwd:Q.cwd}));return $.json({active:f.length,terminals:f})}),V.post("/kill/:terminalId",($)=>{let f=$.req.param("terminalId"),Q=i.get(f);if(Q){try{Q.process.kill()}catch{}for(let Y of Q.subscribers)Y.close();return i.delete(f),$.json({success:!0})}return $.json({success:!1,error:"Terminal not found"},404)}),Tf)V.get("/ws",Tf(($)=>{let f=$.req.query("cwd")||$.get("directory")||_(),Q;return{async onOpen(Y,G){try{Q=await f0(f,{send:(Z)=>G.send(Z),close:()=>G.close()})}catch(Z){I.error("[Terminal] Failed to spawn PTY:",Z),G.close()}},onMessage(Y){if(!Q)return;try{Q.session.process.write(String(Y.data))}catch(G){I.error("[Terminal] Failed to write to PTY:",G)}},onClose(){Q?.cleanup()}}}));else V.get("/ws",($)=>{return $.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return V};var b=H("Service"),Af=[];function i0(){let V=o0(r0(import.meta.url)),$=[u(V,"web"),u(_(),"dist/web"),u(_(),"packages/cli/dist/web")];for(let f of $){let Q=u(f,"index.html");if(Y0(Q)){if(Xf(Q,"utf-8").includes("/assets/"))return b.debug(`[Server] Found web dist at: ${f}`),f}}return null}function n0(){let V=new g0;V.onError((f,Q)=>{if(b.error("[Server] Request error:",f),f instanceof s)return Q.json(f.toObject(),f.statusCode);let Y=f instanceof Error?f.message:String(f);return Q.json({error:{code:"INTERNAL_ERROR",message:Y}},500)}),V.use(async(f,Q)=>{let Y=process.env.BLADE_SERVER_PASSWORD;if(!Y)return Q();let G=f.req.path;if(G==="/"||G.startsWith("/assets/")||G.endsWith(".html")||G.endsWith(".js")||G.endsWith(".css"))return Q();let Z=f.req.header("Authorization");if(!Z?.startsWith("Basic "))return f.header("WWW-Authenticate",'Basic realm="Blade Server"'),f.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let F=Buffer.from(Z.slice(6),"base64").toString(),[W,O]=F.split(":"),J=process.env.BLADE_SERVER_USERNAME??"blade";if(W!==J||O!==Y)return f.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return Q()}),V.use(async(f,Q)=>{let Y=f.req.path==="/health"||f.req.path==="/global/health"||f.req.path.startsWith("/assets/");if(!Y)b.debug(`[Server] ${f.req.method} ${f.req.path}`);let G=Date.now();if(await Q(),!Y){let Z=Date.now()-G;b.debug(`[Server] ${f.req.method} ${f.req.path} - ${f.res.status} (${Z}ms)`)}}),V.use(l0({origin(f){if(!f)return;if(f.startsWith("http://localhost:"))return f;if(f.startsWith("http://127.0.0.1:"))return f;if(f==="tauri://localhost"||f==="http://tauri.localhost")return f;if(Af.includes(f))return f;return}})),V.use(async(f,Q)=>{let Y=f.req.query("directory")||f.req.header("x-blade-directory")||_();try{Y=decodeURIComponent(Y)}catch{}return f.set("directory",Y),Q()}),V.route("/global",Df()),V.route("/sessions",hf()),V.route("/configs",Hf()),V.route("/permissions",If()),V.route("/providers",lf()),V.route("/models",bf()),V.route("/suggestions",tf()),V.route("/terminal",V0()),V.route("/mcp",wf()),V.route("/skills",of()),V.get("/health",(f)=>{return f.json({healthy:!0,version:a()})});let $=i0();if($)b.info(`[Server] Serving static files from ${$}`),V.get("/assets/*",(f)=>{let Q=u($,f.req.path);if(!Y0(Q))return f.json({error:{code:"NOT_FOUND",message:`File not found: ${f.req.path}`}},404);let Y=Xf(Q),G=a0(Q).toLowerCase(),F={".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"}[G]||"application/octet-stream";return new Response(Y,{headers:{"Content-Type":F,"Cache-Control":"public, max-age=31536000, immutable"}})}),V.get("/",(f)=>{let Q=u($,"index.html"),Y=Xf(Q,"utf-8");return f.html(Y)}),V.get("*",(f)=>{let Q=f.req.path;if(Q.includes("."))return f.json({error:{code:"NOT_FOUND",message:`File not found: ${Q}`}},404);let Y=u($,"index.html"),G=Xf(Y,"utf-8");return f.html(G)});else b.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),V.get("/",(f)=>{return f.json({message:"Blade API Server",version:a(),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"}})}),V.all("*",(f)=>{return f.json({error:{code:"NOT_FOUND",message:`Route not found: ${f.req.path}`}},404)});return V}function s0(){let V=c0(),$=[];for(let f of Object.keys(V)){let Q=V[f];if(!Q)continue;for(let Y of Q){if(Y.internal||Y.family!=="IPv4")continue;if(Y.address.startsWith("172."))continue;$.push(Y.address)}}return $}function J0(){return typeof globalThis.Bun<"u"}function Q0(V,$){let f=globalThis.Bun,Q=(G)=>{try{return f.serve({hostname:$.hostname,port:G,fetch:V.fetch,idleTimeout:0,websocket:_f})}catch(Z){b.error("Failed to start Bun server:",Z);return}},Y=$.port===0?Q(4096)??Q(0):Q($.port);if(!Y)throw Error(`Failed to start Bun server on port ${$.port}`);return{url:Y.url,port:Y.port,hostname:Y.hostname,stop:async()=>{Y.stop(!0)}}}function e0(V,$){return new Promise((f,Q)=>{let Y=d0(async(O,J)=>{let K=new URL(O.url||"/",`http://${O.headers.host}`),X=new Headers;for(let[x,E]of Object.entries(O.headers))if(E)if(Array.isArray(E))for(let B of E)X.append(x,B);else X.set(x,E);let j;if(O.method!=="GET"&&O.method!=="HEAD")j=(await new Promise((E)=>{let B=[];O.on("data",(A)=>B.push(A)),O.on("end",()=>E(Buffer.concat(B)))})).toString();let N=new Request(K.toString(),{method:O.method,headers:X,body:j});try{let x=await V.fetch(N);if(J.statusCode=x.status,x.headers.forEach((E,B)=>{J.setHeader(B,E)}),x.body){let E=x.body.getReader(),B=async()=>{let{done:A,value:M}=await E.read();if(A){J.end();return}return J.write(M),B()};await B()}else{let E=await x.text();J.end(E)}}catch(x){b.error("[Server] Node request error:",x),J.statusCode=500,J.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}}),G=new t0({noServer:!0}),Z=_();$0(G,()=>Z),Y.on("upgrade",(O,J,K)=>{if(new URL(O.url||"/",`http://${O.headers.host}`).pathname==="/terminal/ws")G.handleUpgrade(O,J,K,(j)=>{G.emit("connection",j,O)});else J.destroy()});let F=(O)=>{return new Promise((J,K)=>{Y.once("error",(X)=>{if(X.code==="EADDRINUSE")K(X);else K(X)}),Y.listen(O,$.hostname,()=>{let X=Y.address();if(X&&typeof X==="object")J(X.port);else J(O)})})};(async()=>{let O;if($.port===0)try{O=await F(4096)}catch{O=await F(0)}else O=await F($.port);let J=new URL(`http://${$.hostname==="0.0.0.0"?"localhost":$.hostname}:${O}`);f({url:J,port:O,hostname:$.hostname,stop:async()=>{return new Promise((K)=>{G.close(()=>{Y.close(()=>K())})})}})})().catch(Q)})}var Z0;((tV)=>{let V,$;function f(){if(!$)$=n0();return $}tV.getApp=f;function Q(Z){Af=Z.cors??[];let F=f();if(J0())V=Q0(F,Z),b.info(`[Server] Blade server listening on ${V.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 W=V;return{url:W.url,port:W.port,hostname:W.hostname,stop:async()=>{if(V)await V.stop(),V=void 0,$=void 0,b.info("[Server] Blade server stopped")}}}tV.listen=Q;async function Y(Z){Af=Z.cors??[];let F=f();if(J0())V=Q0(F,Z),b.info(`[Server] Blade server listening on ${V.url} (Bun runtime)`);else V=await e0(F,Z),b.info(`[Server] Blade server listening on ${V.url} (Node.js runtime)`);let W=V;return{url:W.url,port:W.port,hostname:W.hostname,stop:async()=>{if(V)await V.stop(),V=void 0,$=void 0,b.info("[Server] Blade server stopped")}}}tV.listenAsync=Y;function G(){return V!==void 0}tV.isRunning=G})(Z0||={});export{f$ as f,$$ as g,s0 as h,Z0 as i};
|
package/dist/chunk-xj63cr29.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{v as a,w as b,x as c}from"./chunk-q6sj33v8.js";import"./chunk-h7qab07x.js";import"./chunk-qyfdt8h1.js";import"./chunk-x4fx52e7.js";import"./chunk-ebynn53v.js";import"./chunk-rhvxr82g.js";import"./chunk-cadngkwr.js";import"./chunk-1tzcptyb.js";import"./chunk-64x50qbc.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
|
package/dist/chunk-zmndvdgb.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{P as c,Q as g,R as m,U as d,W as r}from"./chunk-8raa4q9y.js";import{wb as n}from"./chunk-cadngkwr.js";async function h(){if((await c().initialize(n(),[])).plugins.length>0)await g()}async function R(e){let t=e.message||e._?.[0];if(typeof t==="string"&&t.trim())return t;let a=e.stdin??process.stdin;if(!a.isTTY){let u=[];for await(let l of a)u.push(l);return Buffer.concat(u).toString("utf-8").trim()}if(e.defaultMessage!==void 0)return e.defaultMessage;throw Error("No input provided")}async function x(e){if(!d(e))return{mode:"agent",content:e};let t=await r(e,{cwd:n(),workspaceRoot:n()});if(!t.success)return{mode:"output",content:`Error: ${t.error||"未知错误"}`,exitCode:1};let a=t.data;if(a?.action==="invoke_skill"){let{skillName:u,skillArgs:l}=a;return{mode:"agent",content:l?`Please use the "${u}" skill to help me with: ${l}`:`Please use the "${u}" skill.`}}if(a?.action==="invoke_custom_command"||a?.action==="invoke_plugin_command"){let u=a.processedContent;return{mode:"agent",content:`# Custom Command: /${a.commandName}
|
|
2
|
-
|
|
3
|
-
${u}`}}return{mode:"output",content:t.content||t.message||"",exitCode:0}}function i(e){if(!(e instanceof Error))return!1;return e.message.includes("未找到会话")||e.message.includes("ENOENT")||e.message.includes("no such file")}async function f(e){try{return await m.loadSession(e,n())}catch(t){if(i(t))return null;throw t}}async function _(e){if(e.resume===!0||e.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof e.resume==="string"&&e.resume.length>0){if(e.forkSession)return m.forkSession(e.resume,{newSessionId:e.sessionId,targetProjectPath:n()});return{sessionId:e.resume,messages:await m.loadSession(e.resume)}}if(e.continue){let t=await m.listSessions();if(t.length>0){let a=t[0].sessionId;if(e.forkSession)return m.forkSession(a,{newSessionId:e.sessionId,targetProjectPath:n()});return{sessionId:a,messages:await m.loadSession(a)}}if(e.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(e.sessionId)return{sessionId:e.sessionId,messages:await f(e.sessionId)??[]};return{sessionId:`${e.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
|
|
4
|
-
export{h as p,R as q,x as r,_ as s};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{_ as Q}from"./vendor-markdown-DIcugY1e.js";import{r as l,j as e}from"./vendor-react-Dm1xU4bP.js";import{c as j,u as le,e as fe,B as ue}from"./index-Cnz-_jPt.js";import{n as xe,L as Y,o as Z,p as M}from"./vendor-radix-2yBsoRqx.js";import{u as me}from"./SettingsStore-B2GIhfKs.js";import{X as pe,j as J,m as H,h as ee,v as be,w as ge}from"./vendor-icons-BKXQ7ALf.js";import"./vendor-monaco-w6PwaWGP.js";const he=xe,te=l.forwardRef(({className:t,...a},r)=>e.jsx(Y,{ref:r,className:j("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...a}));te.displayName=Y.displayName;const S=l.forwardRef(({className:t,...a},r)=>e.jsx(Z,{ref:r,className:j("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",t),...a}));S.displayName=Z.displayName;const L=l.forwardRef(({className:t,...a},r)=>e.jsx(M,{ref:r,className:j("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...a}));L.displayName=M.displayName;const ye={"ayu-dark":{background:{primary:"#0f1419",secondary:"#14191f"},text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773"},border:{light:"#2d323b"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},dracula:{background:{primary:"#282a36",secondary:"#44475a"},text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4"},border:{light:"#44475a"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},monokai:{background:{primary:"#272822",secondary:"#3e3d32"},text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e"},border:{light:"#3e3d32"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},nord:{background:{primary:"#2e3440",secondary:"#3b4252"},text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a"},border:{light:"#434c5e"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},"solarized-light":{background:{primary:"#fdf6e3",secondary:"#eee8d5"},text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1"},border:{light:"#eee8d5"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},"solarized-dark":{background:{primary:"#002b36",secondary:"#073642"},text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75"},border:{light:"#073642"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},"tokyo-night":{background:{primary:"#1a1b26",secondary:"#292e42"},text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89"},border:{light:"#292e42"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},github:{background:{primary:"#ffffff",secondary:"#f6f8fa"},text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781"},border:{light:"#d0d7de"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},gruvbox:{background:{primary:"#282828",secondary:"#3c3836"},text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374"},border:{light:"#3c3836"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#b8bb26",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#fabd2f",default:"#ebdbb2"}},"one-dark":{background:{primary:"#282c34",secondary:"#21252b"},text:{primary:"#abb2bf",secondary:"#e5c07b",muted:"#5c6370"},border:{light:"#3e4451"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},catppuccin:{background:{primary:"#1e1e2e",secondary:"#313244"},text:{primary:"#cdd6f4",secondary:"#f5e0dc",muted:"#6c7086"},border:{light:"#313244"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#f5e0dc",operator:"#89dceb",type:"#f9e2af",tag:"#f38ba8",attr:"#f9e2af",default:"#cdd6f4"}},"rose-pine":{background:{primary:"#191724",secondary:"#1f1d2e"},text:{primary:"#e0def4",secondary:"#908caa",muted:"#6e6a86"},border:{light:"#26233a"},syntax:{comment:"#6e6a86",string:"#f6c177",number:"#ebbcba",keyword:"#c4a7e7",function:"#9ccfd8",variable:"#e0def4",operator:"#31748f",type:"#eb6f92",tag:"#eb6f92",attr:"#c4a7e7",default:"#e0def4"}},kanagawa:{background:{primary:"#1f1f28",secondary:"#2a2a37"},text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169"},border:{light:"#2a2a37"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#e46876",attr:"#ffa066",default:"#dcd7ba"}}};function ke(t){const a=t.replace("#",""),r=parseInt(a.substring(0,2),16),s=parseInt(a.substring(2,4),16),o=parseInt(a.substring(4,6),16);return(.299*r+.587*s+.114*o)/255<.5}function ve(t){return{base:ke(t.background.primary)?"vs-dark":"vs",inherit:!0,rules:[{token:"",foreground:t.text.primary.replace("#",""),background:t.background.primary.replace("#","")},{token:"comment",foreground:t.syntax.comment.replace("#",""),fontStyle:"italic"},{token:"string",foreground:t.syntax.string.replace("#","")},{token:"number",foreground:t.syntax.number.replace("#","")},{token:"keyword",foreground:t.syntax.keyword.replace("#","")},{token:"type",foreground:t.syntax.type.replace("#","")},{token:"identifier",foreground:t.syntax.variable.replace("#","")},{token:"function",foreground:t.syntax.function.replace("#","")},{token:"variable",foreground:t.syntax.variable.replace("#","")},{token:"operator",foreground:t.syntax.operator.replace("#","")},{token:"delimiter",foreground:t.syntax.operator.replace("#","")},{token:"tag",foreground:t.syntax.tag.replace("#","")},{token:"attribute.name",foreground:t.syntax.attr.replace("#","")},{token:"attribute.value",foreground:t.syntax.string.replace("#","")}],colors:{"editor.background":t.background.primary,"editor.foreground":t.text.primary,"editor.lineHighlightBackground":t.background.secondary,"editor.selectionBackground":`${t.syntax.function}40`,"editorLineNumber.foreground":t.text.muted,"editorLineNumber.activeForeground":t.text.secondary,"editorCursor.foreground":t.text.primary,"editorIndentGuide.background":t.border.light,"editorWidget.background":t.background.secondary,"editorWidget.border":t.border.light,"scrollbarSlider.background":`${t.text.muted}40`,"scrollbarSlider.hoverBackground":`${t.text.muted}60`}}}const K=new Set;function U(t,a){const r=a.toLowerCase().replace(/\s+/g,"-"),s=ye[r];if(!s)return"vs-dark";if(!K.has(r)){const o=ve(s);t.editor.defineTheme(r,o),K.add(r)}return r}l.lazy(async()=>({default:(await Q(()=>import("./vendor-react-Dm1xU4bP.js").then(a=>a.k),[])).DiffEditor}));const Ee=l.lazy(async()=>({default:(await Q(()=>import("./vendor-react-Dm1xU4bP.js").then(a=>a.k),[])).Editor}));function Re(){const{toggleFilePreview:t}=le(),{messages:a,currentSessionId:r}=fe(),[s,o]=l.useState("diff"),[c,i]=l.useState([]),[d,u]=l.useState({}),[x,p]=l.useState(!1),[g,b]=l.useState(null),[F,k]=l.useState({}),[w,T]=l.useState({}),[h,P]=l.useState(null),[re,A]=l.useState(""),[D,z]=l.useState(!1),[_,$]=l.useState(null),[W,R]=l.useState(!1),I=async(n="")=>{try{const f=n?`/suggestions/files/tree?path=${encodeURIComponent(n)}`:"/suggestions/files/tree",m=await fetch(f);if(!m.ok)throw new Error("Failed to load tree");return(await m.json()).map(B=>({...B,children:B.type==="dir"?[]:void 0}))}catch{return[]}};l.useEffect(()=>{let n=!0;return(async()=>{p(!0),b(null);try{const m=await I();n&&i(m)}catch(m){n&&b(m.message)}finally{n&&p(!1)}})(),()=>{n=!1}},[r]),l.useEffect(()=>{P(null),A(""),$(null),R(!1),k({}),u({})},[r]);const C=l.useMemo(()=>Ne(a),[a]),O=l.useMemo(()=>we(a),[a]),[ne,se]=l.useState({}),oe=n=>{se(f=>({...f,[n]:!f[n]}))},de=async n=>{P(n),A(""),z(!0),$(null),R(!1);try{const f=await fetch(`/suggestions/files/content?path=${encodeURIComponent(n)}`);if(!f.ok)throw new Error("Failed to load file");const m=await f.json();A(m.content||""),R(!!m.truncated)}catch(f){$(f.message)}finally{z(!1)}},ie=async n=>{const f=!F[n];if(k(m=>({...m,[n]:f})),f&&!d[n]){const m=await I(n);u(y=>({...y,[n]:m}))}},ce=n=>{T(f=>({...f,[n]:!f[n]}))};return e.jsxs("div",{className:"w-[55%] min-w-[420px] max-w-[860px] border-l border-[#E5E7EB] dark:border-zinc-800 bg-white dark:bg-[#09090b] flex flex-col h-full shadow-xl shrink-0",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 h-12 border-b border-[#E5E7EB] dark:border-zinc-800 shrink-0",children:[e.jsx("span",{className:"font-normal text-[13px] text-[#6B7280] dark:text-zinc-400 font-mono",children:"Preview"}),e.jsx(ue,{variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-zinc-500 dark:hover:text-zinc-300 dark:hover:bg-zinc-800/50",children:e.jsx(pe,{className:"w-4 h-4"})})]}),e.jsxs(he,{value:s,onValueChange:n=>o(n),className:"flex flex-col flex-1 min-h-0",children:[e.jsx("div",{className:"px-4 py-3 border-b border-[#E5E7EB] dark:border-zinc-800",children:e.jsxs(te,{className:"bg-white dark:bg-[#111113] border border-[#E5E7EB] dark:border-[#27272a] h-9 p-1 rounded-md w-full justify-start",children:[e.jsx(S,{value:"diff",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Diff"}),e.jsx(S,{value:"files",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Files"}),e.jsx(S,{value:"logs",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Logs"})]})}),e.jsx(L,{value:"diff",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:C.length===0?e.jsx(N,{title:"No patch yet",subtitle:"Run a tool that changes files to see diffs here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mb-2",children:[C.length," changed file",C.length>1?"s":""]}),C.map(n=>{var y;const f=((y=n.filePath)==null?void 0:y.split("/").pop())||"unknown",m=ne[n.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>oe(n.filePath||""),className:"w-full flex items-center gap-2 px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:[m?e.jsx(J,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(H,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(ee,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono flex-1 text-left truncate",children:f}),n.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:n.summary})]}),m&&e.jsxs("div",{className:"border-t border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("div",{className:"px-3 py-1 text-[11px] text-[#9CA3AF] dark:text-[#52525b] font-mono truncate",children:n.filePath}),e.jsx(Be,{diff:n.diff})]})]},n.filePath)})]})})}),e.jsx(L,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(N,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&g&&e.jsx(N,{title:"Failed to load files",subtitle:g}),!x&&!g&&c.length===0&&e.jsx(N,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!g&&c.length>0&&e.jsxs("div",{className:"h-full grid grid-cols-[220px_1fr] gap-4 min-h-0",children:[e.jsx("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-2 overflow-y-auto min-h-0",children:c.map(n=>e.jsx(ae,{node:n,depth:0,expandedDirs:F,childrenCache:d,toggleDir:ie,selectedPath:h,onSelectFile:de},n.path))}),e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden flex flex-col min-h-0",children:[e.jsxs("div",{className:"px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono flex items-center justify-between",children:[e.jsx("span",{children:h||"Select a file to preview"}),h&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:D?"Loading…":W?"Truncated":"Ready"})]}),W&&!D&&e.jsx("div",{className:"px-3 py-2 bg-[#FEF3C7] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[11px] text-[#b45309] dark:text-[#facc15] font-mono",children:"Preview truncated to 200k characters."}),e.jsxs("div",{className:"flex-1 min-h-0",children:[!h&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Pick a file from the tree to preview."}),h&&_&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:_}),h&&!_&&e.jsx("div",{className:"h-full",children:D?e.jsx(q,{}):e.jsx(l.Suspense,{fallback:e.jsx(q,{}),children:e.jsx(Fe,{content:re,filename:h})})})]})]})]})]})}),e.jsx(L,{value:"logs",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:O.length===0?e.jsx(N,{title:"No logs yet",subtitle:"Tool runs will appear here."}):O.map(n=>{var V;const f=w[n.id],m=(n.content||"").split(`
|
|
2
|
-
`),y=m.length>10||(((V=n.content)==null?void 0:V.length)||0)>800,B=f||!y?m:m.slice(0,8);return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("div",{className:"text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:n.title}),n.subtitle&&e.jsx("div",{className:"text-[11px] text-[#6B7280] dark:text-[#71717a] font-mono",children:n.subtitle})]}),e.jsx(je,{status:n.status})]}),n.content&&e.jsxs("div",{className:"px-3 py-3 space-y-2",children:[e.jsxs("pre",{className:"text-[12px] text-[#374151] dark:text-[#d4d4d8] bg-[#F3F4F6] dark:bg-[#09090b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md p-3 overflow-x-auto whitespace-pre-wrap font-mono",children:[B.join(`
|
|
3
|
-
`),!f&&y&&`
|
|
4
|
-
…`]}),y&&e.jsxs("button",{onClick:()=>ce(n.id),className:"flex items-center gap-1 text-[12px] text-[#6B7280] dark:text-[#a1a1aa] font-mono hover:text-[#111827] dark:hover:text-[#E5E5E5] transition-colors",children:[f?e.jsx(J,{className:"w-3 h-3"}):e.jsx(H,{className:"w-3 h-3"}),f?"Collapse":"Expand"]})]})]},n.id)})})})]})]})}function N({title:t,subtitle:a}){return e.jsxs("div",{className:"border border-dashed border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-6 text-center",children:[e.jsx("div",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:t}),e.jsx("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mt-1",children:a})]})}function je({status:t}){const a=t==="success"?"Success":t==="error"?"Failed":"Running",r=t==="success"?"bg-[#22C55E] text-white":t==="error"?"bg-[#FEE2E2] text-[#b91c1c] dark:bg-[#EF4444]/20 dark:text-[#fca5a5]":"bg-[#E5E7EB] text-[#6B7280] dark:bg-[#27272a] dark:text-[#a1a1aa]";return e.jsx("span",{className:j("text-[11px] px-2 py-0.5 rounded-full font-mono",r),children:a})}function ae({node:t,depth:a,expandedDirs:r,childrenCache:s,toggleDir:o,onSelectFile:c,selectedPath:i}){const d=t.type==="dir",u=r[t.path],x=!d&&i===t.path,p=s[t.path]||[];return e.jsxs("div",{children:[e.jsx("button",{onClick:()=>{d?o(t.path):c(t.path)},className:j("flex items-center gap-2 w-full text-left text-[12px] font-mono px-2 py-1 rounded-md transition-colors",x?"bg-[#16A34A]/10 text-[#111827] dark:bg-[#22C55E]/10 dark:text-[#E5E5E5]":"hover:bg-[#F3F4F6] text-[#6B7280] dark:hover:bg-[#111113] dark:text-[#a1a1aa]",d&&"cursor-pointer",x&&"border border-[#16A34A]/30 dark:border-[#22C55E]/30"),style:{paddingLeft:a*14+8},children:d?e.jsxs(e.Fragment,{children:[u?e.jsx(be,{className:"h-3.5 w-3.5 shrink-0 text-[#111827] dark:text-[#E5E5E5]"}):e.jsx(ge,{className:"h-3.5 w-3.5 shrink-0 text-[#6B7280] dark:text-[#a1a1aa]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]}):e.jsxs(e.Fragment,{children:[e.jsx(ee,{className:"h-3.5 w-3.5 shrink-0 text-[#9CA3AF] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]})}),d&&u&&e.jsx("div",{children:p.map(g=>e.jsx(ae,{node:g,depth:a+1,expandedDirs:r,childrenCache:s,toggleDir:o,onSelectFile:c,selectedPath:i},g.path))})]})}function we(t){return t.flatMap(a=>{var o,c,i;const r=[];if((o=a.agentContent)!=null&&o.toolCalls)for(const d of a.agentContent.toolCalls){const u=X(d.arguments),x=d.output,p=x?(c=E(x))!=null&&c.diff?G(x):x:void 0;r.push({id:`${a.id}-${d.toolCallId}`,title:d.toolName||"Tool",subtitle:d.summary,status:d.status==="success"?"success":d.status==="error"?"error":"running",content:p||(u?`Arguments:
|
|
5
|
-
${u}`:void 0),timestamp:a.timestamp})}const s=a.metadata;if(s){if(s.kind==="tool_call"){const d=s.toolName||"Tool",u=X(s.arguments);r.push({id:a.id,title:`Tool Call · ${d}`,subtitle:s.toolKind?String(s.toolKind):void 0,status:s.status==="success"?"success":s.status==="error"?"error":"running",content:u?`Arguments:
|
|
6
|
-
${u}`:void 0,timestamp:a.timestamp})}if(s.kind==="tool_result"){const d=s.toolName||"Tool",u=s.success,x=s.summary,p=s.output,g=p?(i=E(p))!=null&&i.diff?G(p):p:void 0;r.push({id:a.id,title:`Tool Result · ${d}`,subtitle:x,status:u===void 0?"running":u?"success":"error",content:g,timestamp:a.timestamp})}}return r})}function Ne(t){var s;const a=[],r=new Set;for(let o=t.length-1;o>=0;o-=1){const c=t[o];if((s=c.agentContent)!=null&&s.toolCalls)for(let p=c.agentContent.toolCalls.length-1;p>=0;p-=1){const g=c.agentContent.toolCalls[p],b=g.metadata,F=g.output||"",k=E(F)||E((b==null?void 0:b.diff_snippet)||"");if(k!=null&&k.diff){const w=(b==null?void 0:b.file_path)||g.toolName||"unknown";if(!r.has(w)){r.add(w);const T=typeof(b==null?void 0:b.oldContent)=="string"?b.oldContent:void 0,h=typeof(b==null?void 0:b.newContent)=="string"?b.newContent:void 0;a.push({diff:k.diff,filePath:w,summary:g.summary,oldContent:T,newContent:h})}}}const i=c.metadata;if(!i||i.kind!=="tool_result")continue;const d=i.metadata,u=i.output||(typeof c.content=="string"?c.content:"")||"",x=E(u)||E((d==null?void 0:d.diff_snippet)||"");if(x!=null&&x.diff){const p=(d==null?void 0:d.file_path)||i.toolName||"unknown";if(!r.has(p)){r.add(p);const g=typeof(d==null?void 0:d.oldContent)=="string"?d.oldContent:void 0,b=typeof(d==null?void 0:d.newContent)=="string"?d.newContent:void 0;a.push({diff:x.diff,filePath:p,summary:i.summary,oldContent:g,newContent:b})}}}return a.reverse()}function E(t){if(!t)return null;const a=/<<<DIFF>>>\s*([\s\S]*?)\s*<<<\/DIFF>>>/m,r=t.match(a);if(!r)return null;try{return{diff:JSON.parse(r[1])}}catch{return null}}function G(t){return t?t.replace(/<<<DIFF>>>[\s\S]*?<<<\/DIFF>>>/m,"").trim():""}function X(t){if(!t)return"";if(typeof t=="string")try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}return JSON.stringify(t,null,2)}function q(){return e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Loading editor…"})}function Fe({content:t,filename:a}){const{theme:r}=me(),s=l.useRef(null),[o,c]=l.useState("vs-dark"),i=Ce(a),d=u=>{s.current=u;const x=U(u,r);c(x)};return l.useEffect(()=>{if(s.current){const u=U(s.current,r);c(u)}},[r]),e.jsx(Ee,{value:t,language:i,theme:o,height:"100%",beforeMount:d,options:{readOnly:!0,minimap:{enabled:!1},fontSize:12,lineNumbers:"on",wordWrap:"on",scrollBeyondLastLine:!1,automaticLayout:!0}},a)}function Ce(t){var s;const a=((s=t.split(".").pop())==null?void 0:s.toLowerCase())||"";return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",md:"markdown",css:"css",scss:"scss",html:"html",yml:"yaml",yaml:"yaml",go:"go",rs:"rust",py:"python",java:"java",c:"c",cpp:"cpp",h:"cpp",hpp:"cpp",sh:"shell",zsh:"shell",toml:"toml",xml:"xml"}[a]||"plaintext"}function Be({diff:t}){const a=t.patch.split(`
|
|
7
|
-
`);let r=0,s=0;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-md overflow-hidden bg-white dark:bg-[#111113]",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#111113] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:[e.jsx("span",{children:"Patch"}),t.matchLine&&e.jsxs("span",{children:["Line ",t.matchLine]})]}),e.jsx("div",{className:"text-[12px] font-mono",children:a.map((o,c)=>{if(o.startsWith("@@")){const i=/@@ -(?<old>\d+),?(?<oldCount>\d*) \+(?<new>\d+),?(?<newCount>\d*) @@/.exec(o);return i!=null&&i.groups&&(r=parseInt(i.groups.old,10),s=parseInt(i.groups.new,10)),e.jsx(v,{line:o},`${o}-${c}`)}if(o.startsWith("---")||o.startsWith("+++")||o.startsWith("Index:")||o.startsWith("==="))return e.jsx(v,{line:o},`${o}-${c}`);if(o.startsWith("+")){const i=s;return s+=1,e.jsx(v,{line:o,oldLine:null,newLine:i},`${o}-${c}`)}if(o.startsWith("-")){const i=r;return r+=1,e.jsx(v,{line:o,oldLine:i,newLine:null},`${o}-${c}`)}if(o.startsWith(" ")){const i=r,d=s;return r+=1,s+=1,e.jsx(v,{line:o,oldLine:i,newLine:d},`${o}-${c}`)}return e.jsx(v,{line:o},`${o}-${c}`)})})]})}function v({line:t,oldLine:a,newLine:r}){const s=t.startsWith("---")||t.startsWith("+++")||t.startsWith("Index:")||t.startsWith("==="),o=t.startsWith("@@"),c=t[0],i=s||o?t:t.slice(1),d=s?"text-[#6B7280] dark:text-[#a1a1aa]":c==="+"?"text-[#166534] bg-[#22C55E]/10 dark:text-[#86efac] dark:bg-[#22C55E]/10":c==="-"?"text-[#b91c1c] bg-[#EF4444]/10 dark:text-[#fca5a5] dark:bg-[#EF4444]/10":o?"text-[#1d4ed8] bg-[#DBEAFE] dark:text-[#93c5fd] dark:bg-[#1e3a8a]/30":"text-[#374151] dark:text-[#d4d4d8]";return e.jsxs("div",{className:j("grid grid-cols-[40px_40px_1fr] gap-2 px-3 py-0.5",d),children:[e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:a?String(a).padStart(2," "):""}),e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:r?String(r).padStart(2," "):""}),e.jsx("span",{className:"whitespace-pre",children:i})]})}export{Re as FilePreview};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:JetBrains Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 240 10% 3.9%;--sidebar-background: 240 4.8% 95.9%;--card: 0 0% 100%;--card-foreground: 240 10% 3.9%;--popover: 0 0% 100%;--popover-foreground: 240 10% 3.9%;--primary: 240 5.9% 10%;--primary-foreground: 0 0% 98%;--secondary: 240 4.8% 95.9%;--secondary-foreground: 240 5.9% 10%;--muted: 240 4.8% 95.9%;--muted-foreground: 240 3.8% 46.1%;--accent: 240 4.8% 95.9%;--accent-foreground: 240 5.9% 10%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 0 0% 98%;--border: 240 5.9% 90%;--input: 240 5.9% 90%;--ring: 240 10% 3.9%;--radius: .5rem;--success: 142 76% 36%;--success-foreground: 0 0% 100%;--warning: 38 92% 50%;--warning-foreground: 0 0% 0%;--info: 217 91% 60%;--info-foreground: 0 0% 100%;--panel: 240 4.8% 95.9%;--panel-foreground: 240 10% 3.9%;--panel-hover: 240 4.8% 90%;--panel-active: 240 4.8% 85%;--subtle: 240 3.8% 46.1%;--subtle-foreground: 240 5.9% 10%}.dark{--background: 0 0% 4.7%;--foreground: 0 0% 98%;--card: 240 10% 3.9%;--card-foreground: 0 0% 98%;--popover: 240 10% 3.9%;--popover-foreground: 0 0% 98%;--primary: 0 0% 98%;--primary-foreground: 240 5.9% 10%;--secondary: 240 3.7% 15.9%;--secondary-foreground: 0 0% 98%;--muted: 240 3.7% 15.9%;--muted-foreground: 240 5% 64.9%;--accent: 240 3.7% 15.9%;--accent-foreground: 0 0% 98%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--border: 240 3.7% 15.9%;--input: 240 3.7% 15.9%;--ring: 240 4.9% 83.9%;--sidebar-background: 240 10% 3.9%;--success: 142 71% 45%;--success-foreground: 0 0% 0%;--warning: 38 92% 50%;--warning-foreground: 0 0% 0%;--info: 217 91% 60%;--info-foreground: 0 0% 100%;--panel: 240 6% 10%;--panel-foreground: 0 0% 90%;--panel-hover: 240 5% 17%;--panel-active: 220 13% 13%;--subtle: 240 5% 65%;--subtle-foreground: 0 0% 98%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-\[50\%\]{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-3{right:.75rem}.right-4{right:1rem}.top-1{top:.25rem}.top-1\/2{top:50%}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-auto{margin-left:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[34px\]{height:34px}.h-\[600px\]{height:600px}.h-\[620px\]{height:620px}.h-\[680px\]{height:680px}.h-\[calc\(100\%-40px\)\]{height:calc(100% - 40px)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-\[120px\]{max-height:120px}.max-h-\[160px\]{max-height:160px}.max-h-\[200px\]{max-height:200px}.max-h-\[240px\]{max-height:240px}.min-h-0{min-height:0px}.min-h-\[140px\]{min-height:140px}.min-h-\[62px\]{min-height:62px}.min-h-\[80px\]{min-height:80px}.min-h-\[88px\]{min-height:88px}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[260px\]{width:260px}.w-\[45\%\]{width:45%}.w-\[55\%\]{width:55%}.w-\[62px\]{width:62px}.w-\[64px\]{width:64px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[420px\]{min-width:420px}.max-w-4xl{max-width:56rem}.max-w-\[220px\]{max-width:220px}.max-w-\[420px\]{max-width:420px}.max-w-\[85\%\]{max-width:85%}.max-w-\[860px\]{max-width:860px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-\[--radix-popover-content-transform-origin\]{transform-origin:var(--radix-popover-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[1fr_180px_120px\]{grid-template-columns:1fr 180px 120px}.grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.grid-cols-\[40px_40px_1fr\]{grid-template-columns:40px 40px 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2{row-gap:.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-\[\#E5E7EB\]>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.self-end{align-self:flex-end}.\!overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[\#16A34A\]\/30{border-color:#16a34a4d}.border-\[\#22C55E\]{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-\[\#CFCFD6\]{--tw-border-opacity: 1;border-color:rgb(207 207 214 / var(--tw-border-opacity, 1))}.border-\[\#D1D5DB\]{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-\[\#D9DBE2\]{--tw-border-opacity: 1;border-color:rgb(217 219 226 / var(--tw-border-opacity, 1))}.border-\[\#E1E2E7\]{--tw-border-opacity: 1;border-color:rgb(225 226 231 / var(--tw-border-opacity, 1))}.border-\[\#E5E7EB\]{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-\[\#FCA5A5\]{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-transparent{border-color:transparent}.border-violet-200{--tw-border-opacity: 1;border-color:rgb(221 214 254 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-\[\#111827\]{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-\[\#16A34A\]{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-\[\#16A34A\]\/10{background-color:#16a34a1a}.bg-\[\#16A34A\]\/20{background-color:#16a34a33}.bg-\[\#22C55E\]{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-\[\#22C55E\]\/10{background-color:#22c55e1a}.bg-\[\#22C55E\]\/20{background-color:#22c55e33}.bg-\[\#3B82F6\]{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-\[\#3b82f6\]\/20{background-color:#3b82f633}.bg-\[\#6366F1\]{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.bg-\[\#DBEAFE\]{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-\[\#DCFCE7\]{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-\[\#E1E2E7\]{--tw-bg-opacity: 1;background-color:rgb(225 226 231 / var(--tw-bg-opacity, 1))}.bg-\[\#E5E7EB\]{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-\[\#EF4444\]{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-\[\#EF4444\]\/10{background-color:#ef44441a}.bg-\[\#F3F4F6\]{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-\[\#F8F8FA\]{--tw-bg-opacity: 1;background-color:rgb(248 248 250 / var(--tw-bg-opacity, 1))}.bg-\[\#F9FAFB\]{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-\[\#FEE2E2\]{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-\[\#FEF3C7\]{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/5{background-color:#0000000d}.bg-black\/70{background-color:#000000b3}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-600{--tw-bg-opacity: 1;background-color:rgb(225 29 72 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-violet-400{--tw-bg-opacity: 1;background-color:rgb(167 139 250 / var(--tw-bg-opacity, 1))}.bg-violet-600{--tw-bg-opacity: 1;background-color:rgb(124 58 237 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/55{background-color:#ffffff8c}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.stroke-\[3\]{stroke-width:3}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-tight{letter-spacing:-.025em}.text-\[\#111827\]{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-\[\#15803D\]{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-\[\#166534\]{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-\[\#16A34A\]{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-\[\#1D4ED8\],.text-\[\#1d4ed8\]{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-\[\#22C55E\]{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-\[\#252932\]{--tw-text-opacity: 1;color:rgb(37 41 50 / var(--tw-text-opacity, 1))}.text-\[\#2563eb\]{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-\[\#272A31\]{--tw-text-opacity: 1;color:rgb(39 42 49 / var(--tw-text-opacity, 1))}.text-\[\#374151\]{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-\[\#3b82f6\]{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-\[\#4F5561\]{--tw-text-opacity: 1;color:rgb(79 85 97 / var(--tw-text-opacity, 1))}.text-\[\#555B66\]{--tw-text-opacity: 1;color:rgb(85 91 102 / var(--tw-text-opacity, 1))}.text-\[\#5F6470\]{--tw-text-opacity: 1;color:rgb(95 100 112 / var(--tw-text-opacity, 1))}.text-\[\#6B7280\]{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-\[\#6F7480\]{--tw-text-opacity: 1;color:rgb(111 116 128 / var(--tw-text-opacity, 1))}.text-\[\#737986\]{--tw-text-opacity: 1;color:rgb(115 121 134 / var(--tw-text-opacity, 1))}.text-\[\#858A96\]{--tw-text-opacity: 1;color:rgb(133 138 150 / var(--tw-text-opacity, 1))}.text-\[\#8B909C\]{--tw-text-opacity: 1;color:rgb(139 144 156 / var(--tw-text-opacity, 1))}.text-\[\#92400E\]{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-\[\#9CA3AF\]{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-\[\#DC2626\]{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-\[\#b45309\]{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-\[\#b91c1c\]{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-\[\#ef4444\]{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-\[\#f59e0b\]{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-\[\#f87171\]{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[0_0_4px_rgba\(34\,197\,94\,0\.4\)\]{--tw-shadow: 0 0 4px rgba(34,197,94,.4);--tw-shadow-colored: 0 0 4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(167\,139\,250\,0\.65\)\]{--tw-shadow: 0 0 8px rgba(167,139,250,.65);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\]{--tw-shadow: 0 1px 2px rgba(15,23,42,.04);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-100{transition-delay:.1s}.delay-200{transition-delay:.2s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.delay-100{animation-delay:.1s}.delay-200{animation-delay:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.running{animation-play-state:running}.paused{animation-play-state:paused}.placeholder\:text-\[\#9CA3AF\]::-moz-placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-\[\#9CA3AF\]::placeholder{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:mb-0:last-child{margin-bottom:0}.focus-within\:border-\[\#D1D5DB\]:focus-within{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-within\:ring-\[\#D1D5DB\]:focus-within{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1))}.hover\:bg-\[\#0F172A\]:hover{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#15803D\]:hover,.hover\:bg-\[\#15803d\]:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#16A34A\]:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#2563EB\]:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#4F46E5\]:hover{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#D1D5DB\]:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#DC2626\]:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#E5E7EB\]:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#E5E7EB\]\/60:hover{background-color:#e5e7eb99}.hover\:bg-\[\#F3F4F6\]:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#F4F4F6\]:hover{--tw-bg-opacity: 1;background-color:rgb(244 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-black\/5:hover{background-color:#0000000d}.hover\:bg-black\/\[0\.025\]:hover{background-color:#00000006}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-500:hover{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-500\/10:hover{background-color:#f43f5e1a}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-violet-500:hover{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.hover\:text-\[\#111827\]:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-\[\#252932\]:hover{--tw-text-opacity: 1;color:rgb(37 41 50 / var(--tw-text-opacity, 1))}.hover\:text-\[\#7f1d1d\]:hover{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-rose-600:hover{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.focus\:border-\[\#22C55E\]:focus{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.focus\:border-\[\#E5E7EB\]:focus{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.focus\:border-violet-400:focus{--tw-border-opacity: 1;border-color:rgb(167 139 250 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-\[\#22C55E\]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 197 94 / var(--tw-ring-opacity, 1))}.focus\:ring-\[\#D1D5DB\]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity, 1))}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-violet-400\/20:focus{--tw-ring-color: rgb(167 139 250 / .2)}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-violet-500\/50:focus-visible{--tw-ring-color: rgb(139 92 246 / .5)}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width: 0px}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-\[\#E5E7EB\]:disabled{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.disabled\:text-\[\#9CA3AF\]:disabled{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.disabled\:opacity-35:disabled{opacity:.35}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[state\=active\]\:bg-\[\#E5E7EB\][data-state=active]{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=active\]\:text-\[\#111827\][data-state=active]{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed]{--tw-exit-translate-x: -50%}.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed]{--tw-exit-translate-y: -48%}.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open]{--tw-enter-translate-x: -50%}.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open]{--tw-enter-translate-y: -48%}.dark\:divide-\[\#27272a\]:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(39 39 42 / var(--tw-divide-opacity, 1))}.dark\:border-\[\#1f2937\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\:border-\[\#22C55E\]\/30:is(.dark *){border-color:#22c55e4d}.dark\:border-\[\#27272a\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.dark\:border-\[\#30323A\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(48 50 58 / var(--tw-border-opacity, 1))}.dark\:border-\[\#3A3C45\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(58 60 69 / var(--tw-border-opacity, 1))}.dark\:border-\[\#52525b\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.dark\:border-\[\#7f1d1d\]:is(.dark *){--tw-border-opacity: 1;border-color:rgb(127 29 29 / var(--tw-border-opacity, 1))}.dark\:border-amber-400\/15:is(.dark *){border-color:#fbbf2426}.dark\:border-violet-400\/20:is(.dark *){border-color:#a78bfa33}.dark\:border-zinc-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(63 63 70 / var(--tw-border-opacity, 1))}.dark\:border-zinc-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.dark\:bg-\[\#09090b\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#0C0C0C\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(12 12 12 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#0a0a0a\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(10 10 10 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#111113\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 17 19 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#111217\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 18 23 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#111827\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#17181D\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(23 24 29 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#18181b\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#1e1e1e\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 30 30 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#1e3a8a\]\/30:is(.dark *){background-color:#1e3a8a4d}.dark\:bg-\[\#1f2937\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#22C55E\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#22C55E\]\/10:is(.dark *){background-color:#22c55e1a}.dark\:bg-\[\#22C55E\]\/20:is(.dark *){background-color:#22c55e33}.dark\:bg-\[\#27272a\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#272932\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 41 50 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#30323A\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(48 50 58 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#3B82F6\]\/20:is(.dark *){background-color:#3b82f633}.dark\:bg-\[\#3f1d1d\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 29 29 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#E5E5E5\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(229 229 229 / var(--tw-bg-opacity, 1))}.dark\:bg-\[\#EF4444\]\/10:is(.dark *){background-color:#ef44441a}.dark\:bg-\[\#EF4444\]\/20:is(.dark *){background-color:#ef444433}.dark\:bg-\[\#F59E0B\]\/20:is(.dark *){background-color:#f59e0b33}.dark\:bg-\[\#a1a1aa\]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(161 161 170 / var(--tw-bg-opacity, 1))}.dark\:bg-amber-400\/\[0\.06\]:is(.dark *){background-color:#fbbf240f}.dark\:bg-black\/10:is(.dark *){background-color:#0000001a}.dark\:bg-transparent:is(.dark *){background-color:transparent}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:bg-white\/\[0\.06\]:is(.dark *){background-color:#ffffff0f}.dark\:bg-zinc-100:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(244 244 245 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-800\/50:is(.dark *){background-color:#27272a80}.dark\:bg-zinc-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:bg-zinc-900\/50:is(.dark *){background-color:#18181b80}.dark\:bg-zinc-950\/50:is(.dark *){background-color:#09090b80}.dark\:text-\[\#0C0C0C\]:is(.dark *){--tw-text-opacity: 1;color:rgb(12 12 12 / var(--tw-text-opacity, 1))}.dark\:text-\[\#22C55E\]:is(.dark *){--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.dark\:text-\[\#3b82f6\]:is(.dark *){--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.dark\:text-\[\#52525b\]:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:text-\[\#60A5FA\]:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-\[\#71717a\]:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:text-\[\#777C89\]:is(.dark *){--tw-text-opacity: 1;color:rgb(119 124 137 / var(--tw-text-opacity, 1))}.dark\:text-\[\#86efac\]:is(.dark *){--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.dark\:text-\[\#93c5fd\]:is(.dark *){--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-\[\#94a3b8\]:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.dark\:text-\[\#A2A6B1\]:is(.dark *){--tw-text-opacity: 1;color:rgb(162 166 177 / var(--tw-text-opacity, 1))}.dark\:text-\[\#A5A9B3\]:is(.dark *){--tw-text-opacity: 1;color:rgb(165 169 179 / var(--tw-text-opacity, 1))}.dark\:text-\[\#A9ACB8\]:is(.dark *){--tw-text-opacity: 1;color:rgb(169 172 184 / var(--tw-text-opacity, 1))}.dark\:text-\[\#C1C4CC\]:is(.dark *){--tw-text-opacity: 1;color:rgb(193 196 204 / var(--tw-text-opacity, 1))}.dark\:text-\[\#E3E4E8\]:is(.dark *){--tw-text-opacity: 1;color:rgb(227 228 232 / var(--tw-text-opacity, 1))}.dark\:text-\[\#E5E5E5\]:is(.dark *){--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.dark\:text-\[\#FBBF24\]:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-\[\#a1a1aa\]:is(.dark *){--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.dark\:text-\[\#d4d4d8\]:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.dark\:text-\[\#facc15\]:is(.dark *){--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.dark\:text-\[\#fca5a5\]:is(.dark *){--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.dark\:text-amber-200:is(.dark *){--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.dark\:text-amber-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-cyan-400:is(.dark *){--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.dark\:text-emerald-300:is(.dark *){--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.dark\:text-orange-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.dark\:text-rose-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.dark\:text-violet-300:is(.dark *){--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:text-zinc-100:is(.dark *){--tw-text-opacity: 1;color:rgb(244 244 245 / var(--tw-text-opacity, 1))}.dark\:text-zinc-300:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.dark\:text-zinc-500:is(.dark *){--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:text-zinc-600:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:text-zinc-800:is(.dark *){--tw-text-opacity: 1;color:rgb(39 39 42 / var(--tw-text-opacity, 1))}.dark\:text-zinc-900:is(.dark *){--tw-text-opacity: 1;color:rgb(24 24 27 / var(--tw-text-opacity, 1))}.dark\:shadow-\[0_1px_0_rgba\(255\,255\,255\,0\.025\)_inset\]:is(.dark *){--tw-shadow: 0 1px 0 rgba(255,255,255,.025) inset;--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.dark\:placeholder\:text-\[\#71717a\]:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-\[\#71717a\]:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(113 113 122 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-600:is(.dark *)::-moz-placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:placeholder\:text-zinc-600:is(.dark *)::placeholder{--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:focus-within\:border-zinc-600:focus-within:is(.dark *){--tw-border-opacity: 1;border-color:rgb(82 82 91 / var(--tw-border-opacity, 1))}.dark\:focus-within\:ring-zinc-600:focus-within:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(82 82 91 / var(--tw-ring-opacity, 1))}.dark\:hover\:bg-\[\#111113\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 17 19 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#16A34A\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#18181b\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#1ea34b\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 163 75 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#1f1f23\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 31 35 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#27272a\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#27272a\]\/50:hover:is(.dark *){background-color:#27272a80}.dark\:hover\:bg-\[\#32323a\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(50 50 58 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-\[\#3f3f46\]:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(63 63 70 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-white:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-white\/5:hover:is(.dark *){background-color:#ffffff0d}.dark\:hover\:bg-white\/\[0\.025\]:hover:is(.dark *){background-color:#ffffff06}.dark\:hover\:bg-white\/\[0\.06\]:hover:is(.dark *){background-color:#ffffff0f}.dark\:hover\:bg-zinc-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:hover\:bg-zinc-800\/50:hover:is(.dark *){background-color:#27272a80}.dark\:hover\:text-\[\#E5E5E5\]:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.dark\:hover\:text-\[\#fecaca\]:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.dark\:hover\:text-red-400:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:text-rose-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:hover\:text-zinc-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(228 228 231 / var(--tw-text-opacity, 1))}.dark\:hover\:text-zinc-300:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(212 212 216 / var(--tw-text-opacity, 1))}.dark\:focus\:border-\[\#27272a\]:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(39 39 42 / var(--tw-border-opacity, 1))}.dark\:focus\:ring-zinc-600:focus:is(.dark *){--tw-ring-opacity: 1;--tw-ring-color: rgb(82 82 91 / var(--tw-ring-opacity, 1))}.dark\:disabled\:bg-zinc-800:disabled:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:disabled\:text-zinc-600:disabled:is(.dark *){--tw-text-opacity: 1;color:rgb(82 82 91 / var(--tw-text-opacity, 1))}.dark\:data-\[state\=active\]\:bg-\[\#27272a\][data-state=active]:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(39 39 42 / var(--tw-bg-opacity, 1))}.dark\:data-\[state\=active\]\:text-white[data-state=active]:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:max-w-\[320px\]{max-width:320px}.sm\:max-w-\[480px\]{max-width:480px}.sm\:max-w-\[540px\]{max-width:540px}.sm\:max-w-\[800px\]{max-width:800px}.sm\:max-w-\[820px\]{max-width:820px}.sm\:max-w-\[900px\]{max-width:900px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>div\]\:\!block>div{display:block!important}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:h-\[18px\] svg{height:18px}.\[\&_svg\]\:w-\[18px\] svg{width:18px}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAASIABAAAAAACQQAAAQuAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoBmA/U1RBVF4AdBEICoRkhAALIAABNgIkAzoEIAWFAAeBFAwHG2oHKJ6DceNW4lJEFHn9tEOE37LNsvkjHr7f739rn3u+OSrSxLQytE91Dw2PYtNVq3Qaw/vJ7fUBMdOj/u2ImB98cT5WUx9F13ZKt06mU7tG1sAYcM26yCRX4f/0904bmwq8hwkUUMTRX61pa9C3xlpAGYw1vOu8C2SBZZFlld7DAW82RJWmwYMI1AJCKBNCIASqdZGFmtPSNQRhMpR0EKjWTwm6z6sJ+4jqhxjovTinVdRpZaQjaQzAYjI8NgAKDJCokgunCn9oUQE8VZd/F//+v6P4F1U9gLr58yNI/dJX9BAshEoJbTDogz7ocKoUsPvES8UK/aQIUQgpGgECBVLkOEV6iASTYgNAPKdNXayhDPL7IJuAZnEYSZ0eOLc9i5Rv5/+lEi3sW/kfnCf/+fTe0sxS7CKLx5erRJkKOixEqQaoqrvx5HN4iz4VhX0gS6DjFIWUzn/fIXJRVFY1NFRVNVeFt+SYmrK6vCU6eJsnKnJj5HTESMTQZOTI3Y/tzr3rUcOsiRy/ciP50s3Mycgxmhz9GMXhjzVH30ut796NHP0UUa31/Zoa6vCH6iPvdIM0IRANaT60FablmZlZd+UKNFy9NrvnFGxb5NC2CRxR0/rIyF/WNn+35sv9r+tHVhkseuWGKkCPPh96+GXt8Lc/Sh24ujfjf+tNw1lZWreiPuHb/PSpyjdv2rf/++ZE5TSKjFdZxYsBvr1sEHl5STuHZqYR7jGYGvGBBdjcaB5bODY1GAxMjsd0wDMIzXAXODRd74DxNMtO4YuYHclgLQRzp9KlUmxptCwv9bYgvWGD2xBW7r9413fdJu+mxzvzAUYeeONQvZP4kgfqZle4jhH/MWh+UbxgtJdrLdXLymNL53PRU0D3Q6FcXTfGqGcul6vrqhgLGAVSv+IVIfZOHpu+mlLqSlnj903j8mazXDsba/wbxhS/4Oubh1c5/uXDgt4j5KtnGEy5BIJHo0ur+jD+r2qCkuP1aRVM8EpUoRYSJyqNRA38uwDvHBNo0AejO2Z+ZYLLal1QiFyFh1EDQOgSCSCpjwwKU8yDbIjroEwne0G5Qca49cYp4AlqtQNZfWTQoFb1tRpFYAmRD+HXTkV4uQhG2bg4OKmyoypAsUGtWgQXyFxYrkpODeUxvGqIZA61erXo0sFG1UBGuPgpuon8RNUG2DhovAjZCBuZwtXrU3mQGki9+pm0eVZAXoWxLWTQoYHBPrJR4WunNxIFbCHfkTyPK+sqxjxDmGArZvf79JGJ3GwEqjwc7a7NIrl/7bJ7Nzu4+n1Ow6shEPnUrtVo7cnd5Wi5qCUbBIQbNKCP95FMCSZylEV5VCiiMqqiOmrKZ/I/C0gI1fyuulVcM2E1r4MhtcV/fbCD+HwEvVzH1dGNAzFE0FTbKzyQz3gootrNbN2a4PuG0j0JOgE=) format("woff2"),url(data:font/woff;base64,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) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2) format("woff2"),url(/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2) format("woff2"),url(/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|