blade-code 0.4.3 → 0.4.5

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.
Files changed (38) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-tf0m57f5.js → chunk-2e3pajfb.js} +1 -1
  3. package/dist/{chunk-p0n9ggyv.js → chunk-2ymnexz1.js} +1 -1
  4. package/dist/{chunk-1dvhq0mn.js → chunk-45f363j6.js} +1 -1
  5. package/dist/{chunk-ehcjnwnr.js → chunk-9syksrkj.js} +1 -1
  6. package/dist/{chunk-hhnst8br.js → chunk-9tgyev1k.js} +1 -1
  7. package/dist/chunk-b67w51zf.js +1 -0
  8. package/dist/chunk-c6ts8bd9.js +26 -0
  9. package/dist/{chunk-420vamtq.js → chunk-cfbp6h36.js} +1 -1
  10. package/dist/{chunk-5zkcs06z.js → chunk-d1hwbcne.js} +1 -1
  11. package/dist/{chunk-hbv7nxdh.js → chunk-g8e0gb93.js} +1 -1
  12. package/dist/{chunk-7g20yr9m.js → chunk-gsbd4yph.js} +1 -1
  13. package/dist/chunk-hhgbhadg.js +76 -0
  14. package/dist/{chunk-qbm9qrtg.js → chunk-hj714bc0.js} +127 -104
  15. package/dist/{chunk-njy55zd2.js → chunk-kdpafv9g.js} +1 -1
  16. package/dist/{chunk-q4hrt6r4.js → chunk-ksd0cxtf.js} +1 -1
  17. package/dist/{chunk-hwkdy2ez.js → chunk-ksh07whh.js} +1 -1
  18. package/dist/{chunk-52k9k0w8.js → chunk-mjgch1nt.js} +1 -1
  19. package/dist/{chunk-zs7xeymy.js → chunk-n466beq9.js} +1 -1
  20. package/dist/{chunk-094ekgv6.js → chunk-nhp35rk0.js} +2 -2
  21. package/dist/chunk-pkmw32r0.js +8 -0
  22. package/dist/chunk-pmtfesmc.js +1 -0
  23. package/dist/{chunk-phzbecpx.js → chunk-r7dz28wh.js} +1 -1
  24. package/dist/{chunk-jz59sjzb.js → chunk-r8wmg3fc.js} +1 -1
  25. package/dist/{chunk-c7e33j6k.js → chunk-rjfq5mqt.js} +1 -1
  26. package/dist/chunk-v19vaykx.js +157 -0
  27. package/dist/{chunk-8jwqy5d0.js → chunk-v1c9xwen.js} +1 -1
  28. package/dist/{chunk-80jc465v.js → chunk-vnpzrswh.js} +1 -1
  29. package/dist/{chunk-vwn39c84.js → chunk-xcpjsrem.js} +1 -1
  30. package/dist/{chunk-zszvkp6z.js → chunk-xh33jnv4.js} +1 -1
  31. package/dist/{chunk-gm59f5pe.js → chunk-zp8pmxw9.js} +1 -1
  32. package/package.json +2 -2
  33. package/dist/chunk-5mtjqqav.js +0 -8
  34. package/dist/chunk-76emdpxa.js +0 -76
  35. package/dist/chunk-h3ccyfqj.js +0 -1
  36. package/dist/chunk-hwhz4m2c.js +0 -157
  37. package/dist/chunk-y5g06jmk.js +0 -24
  38. package/dist/chunk-yjs7nvr5.js +0 -1
@@ -1,4 +1,4 @@
1
- import{Ga as F,ra as $,ta as E,ua as q}from"./chunk-76emdpxa.js";import{Bb as w}from"./chunk-set7v1rf.js";import{nanoid as O}from"nanoid";var Z=w("Spec");class X{static instance=null;fileManager=null;constructor(){}static getInstance(){if(!X.instance)X.instance=new X;return X.instance}static resetInstance(){X.instance=null}getStoreState(){return q.getState().spec}updateStoreState(z){q.setState((B)=>({spec:{...B.spec,...z}}))}async initialize(z){if(this.fileManager){Z.debug("SpecManager already initialized, skipping...");return}this.fileManager=new E(z),await this.fileManager.initializeDirectories();let B=await this.fileManager.readSteeringContext();this.updateStoreState({steeringContext:B}),Z.debug("SpecManager initialized successfully")}getFileManager(){if(!this.fileManager)throw Error("SpecManager not initialized. Call initialize() first.");return this.fileManager}getState(){return{...this.getStoreState()}}getCurrentSpec(){return this.getStoreState().currentSpec}isActive(){return this.getStoreState().isActive}getSteeringContext(){return this.getStoreState().steeringContext}async getSteeringContextString(){let z=this.getStoreState().steeringContext;if(!z)return null;let B=[];if(z.constitution)B.push(`## Constitution (Project Governance)
1
+ import{Ga as F,ra as $,ta as E,ua as q}from"./chunk-hhgbhadg.js";import{Bb as w}from"./chunk-set7v1rf.js";import{nanoid as O}from"nanoid";var Z=w("Spec");class X{static instance=null;fileManager=null;constructor(){}static getInstance(){if(!X.instance)X.instance=new X;return X.instance}static resetInstance(){X.instance=null}getStoreState(){return q.getState().spec}updateStoreState(z){q.setState((B)=>({spec:{...B.spec,...z}}))}async initialize(z){if(this.fileManager){Z.debug("SpecManager already initialized, skipping...");return}this.fileManager=new E(z),await this.fileManager.initializeDirectories();let B=await this.fileManager.readSteeringContext();this.updateStoreState({steeringContext:B}),Z.debug("SpecManager initialized successfully")}getFileManager(){if(!this.fileManager)throw Error("SpecManager not initialized. Call initialize() first.");return this.fileManager}getState(){return{...this.getStoreState()}}getCurrentSpec(){return this.getStoreState().currentSpec}isActive(){return this.getStoreState().isActive}getSteeringContext(){return this.getStoreState().steeringContext}async getSteeringContextString(){let z=this.getStoreState().steeringContext;if(!z)return null;let B=[];if(z.constitution)B.push(`## Constitution (Project Governance)
2
2
 
3
3
  ${z.constitution}`);if(z.product)B.push(`## Product Vision
4
4
 
@@ -1,4 +1,4 @@
1
- import{Y as O}from"./chunk-njy55zd2.js";import"./chunk-phzbecpx.js";import{Ea as J,Ga as L}from"./chunk-76emdpxa.js";import"./chunk-y5g06jmk.js";import"./chunk-yddnm9n2.js";import{xb as H}from"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import P from"os";import E from"path";function _(q){return typeof q==="string"?q:void 0}function T(q){if(!Array.isArray(q))return;let z=[];for(let F of q)if(typeof F==="string")z.push(F);else if(F!=null)z.push(String(F));return z}function G(){console.log(`
1
+ import{Y as O}from"./chunk-kdpafv9g.js";import"./chunk-r7dz28wh.js";import{Ea as J,Ga as L}from"./chunk-hhgbhadg.js";import"./chunk-c6ts8bd9.js";import"./chunk-yddnm9n2.js";import{xb as H}from"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import P from"os";import E from"path";function _(q){return typeof q==="string"?q:void 0}function T(q){if(!Array.isArray(q))return;let z=[];for(let F of q)if(typeof F==="string")z.push(F);else if(F!=null)z.push(String(F));return z}function G(){console.log(`
2
2
  blade mcp
3
3
  `),console.log(`管理 MCP 服务器
4
4
  `),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
@@ -1,2 +1,2 @@
1
- import{ob as Q,pb as W,qb as Y}from"./chunk-5mtjqqav.js";import{Bb as X}from"./chunk-set7v1rf.js";var J=X("Service"),$="https://models.dev/api.json",j=3600000,G=null,Z=async()=>{if(G&&Date.now()-G.timestamp<j)return G.data;try{J.info("Fetching models.dev data...");let q=await fetch($,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!q.ok)throw Error(`HTTP ${q.status}: ${q.statusText}`);let x=await q.json();return G={data:x,timestamp:Date.now()},J.info(`Loaded ${Object.keys(x).length} providers from models.dev`),x}catch(q){throw J.error("Failed to fetch models.dev data:",q),q}},y=async()=>{let q=await Z(),x=[];for(let[w,k]of Object.entries(q)){let z=Object.keys(k.models||{}).length;if(z===0)continue;x.push({id:w,name:k.name||w,icon:W[w]||W.default,description:`${z} 个模型`,envVars:k.env||[],docUrl:k.doc,defaultBaseUrl:Y[w]})}return x.sort((w,k)=>{let z=Q.indexOf(w.id),K=Q.indexOf(k.id);if(z!==-1&&K!==-1)return z-K;if(z!==-1)return-1;if(K!==-1)return 1;return w.name.localeCompare(k.name)})},f=async(q)=>{let w=(await Z())[q];if(!w?.models)return J.warn(`No models found for provider: ${q}`),[];return Object.values(w.models).map((k)=>({id:k.id,name:k.name||k.id,contextWindow:k.limit?.context,maxOutput:k.limit?.output,inputCost:k.cost?.input,outputCost:k.cost?.output}))};
1
+ import{ob as Q,pb as W,qb as Y}from"./chunk-pkmw32r0.js";import{Bb as X}from"./chunk-set7v1rf.js";var J=X("Service"),$="https://models.dev/api.json",j=3600000,G=null,Z=async()=>{if(G&&Date.now()-G.timestamp<j)return G.data;try{J.info("Fetching models.dev data...");let q=await fetch($,{headers:{"User-Agent":"Blade-CLI/1.0"}});if(!q.ok)throw Error(`HTTP ${q.status}: ${q.statusText}`);let x=await q.json();return G={data:x,timestamp:Date.now()},J.info(`Loaded ${Object.keys(x).length} providers from models.dev`),x}catch(q){throw J.error("Failed to fetch models.dev data:",q),q}},y=async()=>{let q=await Z(),x=[];for(let[w,k]of Object.entries(q)){let z=Object.keys(k.models||{}).length;if(z===0)continue;x.push({id:w,name:k.name||w,icon:W[w]||W.default,description:`${z} 个模型`,envVars:k.env||[],docUrl:k.doc,defaultBaseUrl:Y[w]})}return x.sort((w,k)=>{let z=Q.indexOf(w.id),K=Q.indexOf(k.id);if(z!==-1&&K!==-1)return z-K;if(z!==-1)return-1;if(K!==-1)return 1;return w.name.localeCompare(k.name)})},f=async(q)=>{let w=(await Z())[q];if(!w?.models)return J.warn(`No models found for provider: ${q}`),[];return Object.values(w.models).map((k)=>({id:k.id,name:k.name||k.id,contextWindow:k.limit?.context,maxOutput:k.limit?.output,inputCost:k.cost?.input,outputCost:k.cost?.output}))};
2
2
  export{y as e,f};
@@ -1,4 +1,4 @@
1
- import{a as Q,b as R,c as T,d as W}from"./chunk-hwkdy2ez.js";import"./chunk-vwn39c84.js";import"./chunk-qbm9qrtg.js";import"./chunk-njy55zd2.js";import"./chunk-esnkk33h.js";import{ba as M}from"./chunk-phzbecpx.js";import"./chunk-8jwqy5d0.js";import{Aa as J}from"./chunk-76emdpxa.js";import"./chunk-y5g06jmk.js";import"./chunk-ehcjnwnr.js";import"./chunk-yddnm9n2.js";import"./chunk-094ekgv6.js";import"./chunk-5mtjqqav.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import b from"chalk";import H from"open";var $=`
1
+ import{a as Q,b as R,c as T,d as W}from"./chunk-ksh07whh.js";import"./chunk-xcpjsrem.js";import"./chunk-hj714bc0.js";import"./chunk-kdpafv9g.js";import"./chunk-esnkk33h.js";import{ba as M}from"./chunk-r7dz28wh.js";import"./chunk-v1c9xwen.js";import{Aa as J}from"./chunk-hhgbhadg.js";import"./chunk-c6ts8bd9.js";import"./chunk-9syksrkj.js";import"./chunk-yddnm9n2.js";import"./chunk-nhp35rk0.js";import"./chunk-pkmw32r0.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import b from"chalk";import H from"open";var $=`
2
2
  ____ _ _
3
3
  | __ )| | __ _ __| | ___
4
4
  | _ \\| |/ _\` |/ _\` |/ _ \\
@@ -1 +1 @@
1
- import{a as y,b as A,c as C,d as D}from"./chunk-hwkdy2ez.js";import"./chunk-vwn39c84.js";import"./chunk-qbm9qrtg.js";import"./chunk-njy55zd2.js";import"./chunk-esnkk33h.js";import"./chunk-phzbecpx.js";import"./chunk-8jwqy5d0.js";import{Aa as q}from"./chunk-76emdpxa.js";import"./chunk-y5g06jmk.js";import"./chunk-ehcjnwnr.js";import"./chunk-yddnm9n2.js";import"./chunk-094ekgv6.js";import"./chunk-5mtjqqav.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import H from"chalk";var R={command:"serve",describe:"Start a headless Blade server (no browser)",builder:y,handler:async(E)=>{let f=A(E);if(await q(),!process.env.BLADE_SERVER_PASSWORD)console.log(H.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let b=await D.listenAsync(f);if(console.log(`Blade server listening on http://${b.hostname}:${b.port}`),f.hostname==="0.0.0.0"){let F=C();for(let G of F)console.log(` Network: http://${G}:${b.port}`)}await new Promise(()=>{}),await b.stop()}};export{R as serveCommand};
1
+ import{a as y,b as A,c as C,d as D}from"./chunk-ksh07whh.js";import"./chunk-xcpjsrem.js";import"./chunk-hj714bc0.js";import"./chunk-kdpafv9g.js";import"./chunk-esnkk33h.js";import"./chunk-r7dz28wh.js";import"./chunk-v1c9xwen.js";import{Aa as q}from"./chunk-hhgbhadg.js";import"./chunk-c6ts8bd9.js";import"./chunk-9syksrkj.js";import"./chunk-yddnm9n2.js";import"./chunk-nhp35rk0.js";import"./chunk-pkmw32r0.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";import H from"chalk";var R={command:"serve",describe:"Start a headless Blade server (no browser)",builder:y,handler:async(E)=>{let f=A(E);if(await q(),!process.env.BLADE_SERVER_PASSWORD)console.log(H.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let b=await D.listenAsync(f);if(console.log(`Blade server listening on http://${b.hostname}:${b.port}`),f.hostname==="0.0.0.0"){let F=C();for(let G of F)console.log(` Network: http://${G}:${b.port}`)}await new Promise(()=>{}),await b.stop()}};export{R as serveCommand};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blade-code",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "private": false,
5
5
  "description": "🗡️ Blade Code - 智能代码助手命令行工具",
6
6
  "type": "module",
@@ -127,4 +127,4 @@
127
127
  "typescript": "^5.9.2",
128
128
  "vitest": "^3.0.0"
129
129
  }
130
- }
130
+ }
@@ -1,8 +0,0 @@
1
- import{Bb as R}from"./chunk-set7v1rf.js";var C=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],b={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},f={anthropic:"https://api.anthropic.com",openai:"https://api.openai.com/v1",google:"https://generativelanguage.googleapis.com/v1beta",deepseek:"https://api.deepseek.com/v1",groq:"https://api.groq.com/openai/v1",openrouter:"https://openrouter.ai/api/v1",togetherai:"https://api.together.xyz/v1","fireworks-ai":"https://api.fireworks.ai/inference/v1",mistral:"https://api.mistral.ai/v1",cohere:"https://api.cohere.ai/v1",perplexity:"https://api.perplexity.ai",xai:"https://api.x.ai/v1",cerebras:"https://api.cerebras.ai/v1","novita-ai":"https://api.novita.ai/v3/openai",nvidia:"https://integrate.api.nvidia.com/v1"},h={anthropic:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"},openrouter:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"},vercel:{"http-referer":"https://github.com/anthropics/blade","x-title":"blade"},zenmux:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"blade"}},V=(F)=>{return h[F]||{}};import{createAnthropic as A}from"@ai-sdk/anthropic";import{createAzure as E}from"@ai-sdk/azure";import{createDeepSeek as k}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as P}from"@ai-sdk/google";import{createOpenAI as x}from"@ai-sdk/openai";import{createOpenAICompatible as z}from"@ai-sdk/openai-compatible";import{generateText as H,jsonSchema as T,streamText as K}from"ai";var B=R("Chat");function O(F){let q=new Set;for(let W of F)if(W.role==="assistant"&&W.tool_calls)for(let Q of W.tool_calls)q.add(Q.id);return F.filter((W)=>{if(W.role==="tool"){if(!W.tool_call_id)return!1;return q.has(W.tool_call_id)}return!0})}function N(F){if(typeof F==="string")return F;return F.filter((q)=>q.type==="text").map((q)=>q.text).join(`
2
- `)}function L(F){let q=F;return q.text??q.textDelta??q.delta}function U(F,q={}){try{return JSON.parse(F)}catch{return B.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:F}),q}}class D{model;config;constructor(F){this.config=F,this.model=this.createModel(F),B.debug("[VercelAIChatService] Initialized",{provider:F.provider,model:F.model})}createModel(F){let{provider:q,apiKey:W,baseUrl:Q,model:X,customHeaders:Z,apiVersion:$}=F;switch(q){case"openai":return x({apiKey:W,baseURL:Q||void 0,headers:Z})(X);case"anthropic":return A({apiKey:W,baseURL:Q||void 0,headers:Z})(X);case"gemini":{if(Q&&!this.isGeminiOfficialUrl(Q))return z({name:"gemini",apiKey:W,baseURL:Q,headers:Z})(X);return P({apiKey:W,baseURL:Q||void 0})(X)}case"google":case"google-generative-ai":case"google-vertex":{if(Q&&!this.isGeminiOfficialUrl(Q))return z({name:q,apiKey:W,baseURL:Q,headers:Z})(X);return P({apiKey:W,baseURL:Q||void 0})(X)}case"azure-openai":{let Y=this.extractAzureResourceName(Q);if(Y)return E({apiKey:W,resourceName:Y,apiVersion:$||"2024-08-01-preview"})(X);let J=this.buildAzureBaseUrl(Q,X);return z({name:"azure-openai",apiKey:W,baseURL:J,headers:{...Z,"api-key":W},queryParams:{"api-version":$||"2024-08-01-preview"}})(X)}case"azure":{let Y=this.extractAzureResourceName(Q);if(Y)return E({apiKey:W,resourceName:Y,apiVersion:$||"2024-08-01-preview"})(X);let J=this.buildAzureBaseUrl(Q,X);return z({name:"azure-openai",apiKey:W,baseURL:J,headers:{...Z,"api-key":W},queryParams:{"api-version":$||"2024-08-01-preview"}})(X)}case"deepseek":return k({apiKey:W,baseURL:Q||void 0,headers:Z})(X);default:return z({name:q,apiKey:W,baseURL:Q,headers:Z})(X)}}extractAzureResourceName(F){if(!F)return;let q=F.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return q?q[1]:void 0}buildAzureBaseUrl(F,q){if(!F)return"";let W=F.replace(/\/$/,"").replace(/\?.*$/,"");if(W.includes("/openai/deployments/"))return W;return`${W}/openai/deployments/${q}`}isGeminiOfficialUrl(F){return F.includes("generativelanguage.googleapis.com")||F.includes("aiplatform.googleapis.com")}needsThinkingReplayMetadata(){return/deepseek/i.test([this.config.provider,this.config.model,this.config.baseUrl].join(" "))}getThinkingReplayProviderOptions(F){let q=F?.trim();if(!q||!this.needsThinkingReplayMetadata())return;return{openaiCompatible:{reasoning_content:q}}}shouldFlattenDeepSeekThinkingToolHistory(){return this.needsThinkingReplayMetadata()}flattenDeepSeekThinkingToolHistory(F){let q=[],W,Q=()=>{if(!W)return;q.push({role:"assistant",content:N(W.content).trim()||"I will use the requested tool and continue from its result."}),W=void 0};for(let X of F){if(X.role==="system"){Q(),q.push({role:"user",content:`<system>
3
- ${N(X.content)}
4
- </system>`});continue}if(X.role==="assistant"&&X.tool_calls&&X.tool_calls.length>0&&X.reasoningContent?.trim()){Q(),W=X;continue}if(X.role==="tool"&&W){let Z=W.tool_calls?.find((Y)=>Y.id===X.tool_call_id),$=Z?.type==="function"?Z.function:void 0;q.push({role:"user",content:`Tool result for ${X.name||$?.name||"tool"}${$?.arguments?`(${$.arguments})`:""}:
5
- ${N(X.content)}
6
-
7
- Continue from this tool result.`});continue}Q(),q.push(X)}return Q(),q}convertMessages(F){let q=[],W=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(F):F;for(let Q of W)if(Q.role==="system")if(Array.isArray(Q.content)){let X=Q.content.find(($)=>$.type==="text"),Z={role:"system",content:N(Q.content)};if(X?.providerOptions)Z.providerOptions=X.providerOptions;q.push(Z)}else q.push({role:"system",content:Q.content});else if(Q.role==="user")if(Array.isArray(Q.content)){let X=Q.content.map((Z)=>{if(Z.type==="text"){let $={type:"text",text:Z.text};if(Z.providerOptions)$.providerOptions=Z.providerOptions;return $}return{type:"image",image:Z.image_url.url}});q.push({role:"user",content:X})}else q.push({role:"user",content:Q.content});else if(Q.role==="assistant")if(Q.tool_calls&&Q.tool_calls.length>0){let X=Q.tool_calls.map((J)=>{let j=J.function;return{type:"tool-call",toolCallId:J.id,toolName:j?.name||"",input:U(j?.arguments||"{}",{})}}),Z=N(Q.content),$=Q.reasoningContent?.trim()?[{type:"reasoning",text:Q.reasoningContent}]:[],Y=this.getThinkingReplayProviderOptions(Q.reasoningContent);if(Z){let J={role:"assistant",content:[...$,{type:"text",text:Z},...X]};if(Y)J.providerOptions=Y;q.push(J)}else if($.length>0){let J={role:"assistant",content:[...$,...X]};if(Y)J.providerOptions=Y;q.push(J)}else q.push({role:"assistant",content:X})}else if(Q.reasoningContent?.trim()){let X=N(Q.content),Z=[{type:"reasoning",text:Q.reasoningContent}];if(X)Z.push({type:"text",text:X});let $={role:"assistant",content:Z},Y=this.getThinkingReplayProviderOptions(Q.reasoningContent);if(Y)$.providerOptions=Y;q.push($)}else q.push({role:"assistant",content:N(Q.content)});else if(Q.role==="tool")q.push({role:"tool",content:[{type:"tool-result",toolCallId:Q.tool_call_id,toolName:Q.name||"unknown",output:{type:"text",value:N(Q.content)}}]});return q}convertTools(F){if(!F||F.length===0)return;let q={};for(let W of F)q[W.name]={description:W.description,inputSchema:T(W.parameters)};return q}convertToolCalls(F){return F.map((q)=>({id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.args??q.input??{})}}))}convertUsage(F,q){if(!F)return;let W=F.promptTokens??F.inputTokens??0,Q=F.completionTokens??F.outputTokens??0,X={promptTokens:W,completionTokens:Q,totalTokens:F.totalTokens??W+Q};if(q?.anthropic){if(q.anthropic.cacheCreationInputTokens!==void 0)X.cacheCreationInputTokens=q.anthropic.cacheCreationInputTokens;if(q.anthropic.cacheReadInputTokens!==void 0)X.cacheReadInputTokens=q.anthropic.cacheReadInputTokens}return X}isFallbackableError(F){if(!(F instanceof Error))return!1;let W=F.message.toLowerCase().match(/status[:\s]*(\d{3})/),Q=W?parseInt(W[1],10):F.status;return Q!==void 0&&[429,529,503].includes(Q)}async chat(F,q,W){let Q=Date.now();B.debug("[VercelAIChatService] Starting chat request");let X=O(F),Z=this.convertMessages(X),$=this.convertTools(q);try{let Y=await H({model:this.model,messages:Z,tools:$,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:W,...{allowSystemInMessages:!0}}),J=Date.now()-Q;B.debug("[VercelAIChatService] Response received in",J,"ms");let j=Y.toolCalls&&Y.toolCalls.length>0?this.convertToolCalls(Y.toolCalls):void 0,w=Array.isArray(Y.reasoning)?Y.reasoning.map((_)=>_.text).join(""):void 0;return{content:Y.text,reasoningContent:w,toolCalls:j,usage:this.convertUsage(Y.usage,Y.providerMetadata),finishReason:Y.finishReason}}catch(Y){let J=Date.now()-Q;if(B.error("[VercelAIChatService] Chat failed after",J,"ms"),this.isFallbackableError(Y)&&this.config.fallbackModel){B.warn(`[VercelAIChatService] Switching to fallback model (non-stream): ${this.config.fallbackModel}`);let j={...this.config,model:this.config.fallbackModel},w=this.createModel(j);try{let _=await H({model:w,messages:Z,tools:$,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:W,...{allowSystemInMessages:!0}}),S=_.toolCalls&&_.toolCalls.length>0?this.convertToolCalls(_.toolCalls):void 0,G=Array.isArray(_.reasoning)?_.reasoning.map((I)=>I.text).join(""):void 0;return{content:_.text||"",reasoningContent:G,toolCalls:S,usage:this.convertUsage(_.usage,_.providerMetadata),finishReason:_.finishReason}}catch(_){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${_ instanceof Error?_.message:_}`,{cause:Y})}}throw Y}}async*streamChat(F,q,W){let Q=Date.now();B.debug("[VercelAIChatService] Starting stream request");let X=O(F),Z=this.convertMessages(X),$=this.convertTools(q);try{let Y=K({model:this.model,messages:Z,tools:$,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:W,...{allowSystemInMessages:!0}});B.debug("[VercelAIChatService] Stream started");let J=0;for await(let w of Y.fullStream)switch(w.type){case"text-delta":yield{content:L(w)};break;case"reasoning-delta":yield{reasoningContent:L(w)};break;case"tool-call":yield{toolCalls:[{index:J++,id:w.toolCallId,type:"function",function:{name:w.toolName,arguments:JSON.stringify(w.args??w.input??{})}}]};break;case"finish":yield{finishReason:w.finishReason,usage:this.convertUsage(w.totalUsage,w.providerMetadata)};break}let j=Date.now()-Q;B.debug("[VercelAIChatService] Stream completed in",j,"ms")}catch(Y){let J=Date.now()-Q;if(B.error("[VercelAIChatService] Stream failed after",J,"ms"),this.isFallbackableError(Y)&&this.config.fallbackModel){B.warn(`[VercelAIChatService] Switching to fallback model: ${this.config.fallbackModel}`),yield{modelFallback:!0};let j={...this.config,model:this.config.fallbackModel},w=this.createModel(j);try{let _=K({model:w,messages:Z,tools:$,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:W,...{allowSystemInMessages:!0}}),S=0;for await(let G of _.fullStream)switch(G.type){case"text-delta":yield{content:L(G)};break;case"reasoning-delta":yield{reasoningContent:L(G)};break;case"tool-call":yield{toolCalls:[{index:S++,id:G.toolCallId,type:"function",function:{name:G.toolName,arguments:JSON.stringify(G.args??G.input??{})}}]};break;case"finish":yield{finishReason:G.finishReason,usage:this.convertUsage(G.totalUsage,G.providerMetadata)};break}return}catch(_){throw Error(`Fallback model (${this.config.fallbackModel}) also failed: ${_ instanceof Error?_.message:_}`,{cause:Y})}}throw Y}}getConfig(){return{...this.config}}updateConfig(F){B.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...F},this.model=this.createModel(this.config),B.debug("[VercelAIChatService] Configuration updated")}}var M=R("Service");async function s(F){let q=F;if(q.provider){let W=V(q.provider);if(Object.keys(W).length>0)q={...q,customHeaders:{...W,...q.customHeaders}},M.debug(`Injected ${q.provider} specific headers:`,Object.keys(W))}return v(q)}function v(F){return new D(F)}
8
- export{C as ob,b as pb,f as qb,s as rb};
@@ -1,76 +0,0 @@
1
- import{Ia as KQ,Ka as A}from"./chunk-y5g06jmk.js";import{Bb as FQ}from"./chunk-set7v1rf.js";import{nanoid as rQ}from"nanoid";import{devtools as lQ,subscribeWithSelector as cQ}from"zustand/middleware";import{createStore as iQ}from"zustand/vanilla";var OQ={name:"ayu-dark",colors:{primary:"#ffcc66",secondary:"#bae67e",accent:"#73d0ff",success:"#bae67e",warning:"#ffcc66",error:"#ff3333",info:"#73d0ff",light:"#f0f0f0",dark:"#000000",muted:"#5c6773",highlight:"#2d323b",text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773",light:"#ffffff"},background:{primary:"#0f1419",secondary:"#14191f",dark:"#000000"},border:{light:"#2d323b",dark:"#000000"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.2)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)"}},xQ={name:"dracula",colors:{primary:"#bd93f9",secondary:"#ffb86c",accent:"#ff79c6",success:"#50fa7b",warning:"#f1fa8c",error:"#ff5555",info:"#8be9fd",light:"#f8f8f2",dark:"#282a36",muted:"#6272a4",highlight:"#44475a",text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4",light:"#ffffff"},background:{primary:"#282a36",secondary:"#44475a",dark:"#21222c"},border:{light:"#44475a",dark:"#000000"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 42, 54, 0.2)",base:"0 1px 3px 0 rgba(40, 42, 54, 0.3), 0 1px 2px 0 rgba(40, 42, 54, 0.2)",lg:"0 10px 15px -3px rgba(40, 42, 54, 0.3), 0 4px 6px -2px rgba(40, 42, 54, 0.2)"}},BQ={name:"monokai",colors:{primary:"#66d9ef",secondary:"#a6e22e",accent:"#f92672",success:"#a6e22e",warning:"#e6db74",error:"#f92672",info:"#66d9ef",light:"#f8f8f2",dark:"#272822",muted:"#75715e",highlight:"#3e3d32",text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e",light:"#ffffff"},background:{primary:"#272822",secondary:"#3e3d32",dark:"#1e1f1c"},border:{light:"#3e3d32",dark:"#000000"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(39, 40, 34, 0.2)",base:"0 1px 3px 0 rgba(39, 40, 34, 0.3), 0 1px 2px 0 rgba(39, 40, 34, 0.2)",lg:"0 10px 15px -3px rgba(39, 40, 34, 0.3), 0 4px 6px -2px rgba(39, 40, 34, 0.2)"}},wQ={name:"nord",colors:{primary:"#88c0d0",secondary:"#81a1c1",accent:"#b48ead",success:"#a3be8c",warning:"#ebcb8b",error:"#bf616a",info:"#88c0d0",light:"#eceff4",dark:"#2e3440",muted:"#4c566a",highlight:"#434c5e",text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a",light:"#ffffff"},background:{primary:"#2e3440",secondary:"#3b4252",dark:"#242933"},border:{light:"#434c5e",dark:"#000000"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(46, 52, 64, 0.2)",base:"0 1px 3px 0 rgba(46, 52, 64, 0.3), 0 1px 2px 0 rgba(46, 52, 64, 0.2)",lg:"0 10px 15px -3px rgba(46, 52, 64, 0.3), 0 4px 6px -2px rgba(46, 52, 64, 0.2)"}},_Q={name:"solarized-light",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#cb4b16",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#93a1a1",highlight:"#eee8d5",text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1",light:"#002b36"},background:{primary:"#fdf6e3",secondary:"#eee8d5",dark:"#073642"},border:{light:"#eee8d5",dark:"#073642"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(253, 246, 227, 0.2)",base:"0 1px 3px 0 rgba(253, 246, 227, 0.3), 0 1px 2px 0 rgba(253, 246, 227, 0.2)",lg:"0 10px 15px -3px rgba(253, 246, 227, 0.3), 0 4px 6px -2px rgba(253, 246, 227, 0.2)"}},AQ={name:"solarized-dark",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#b58900",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#586e75",highlight:"#073642",text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75",light:"#fdf6e3"},background:{primary:"#002b36",secondary:"#073642",dark:"#001f29"},border:{light:"#073642",dark:"#000000"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 43, 54, 0.2)",base:"0 1px 3px 0 rgba(0, 43, 54, 0.3), 0 1px 2px 0 rgba(0, 43, 54, 0.2)",lg:"0 10px 15px -3px rgba(0, 43, 54, 0.3), 0 4px 6px -2px rgba(0, 43, 54, 0.2)"}},DQ={name:"tokyo-night",colors:{primary:"#7aa2f7",secondary:"#7dcfff",accent:"#bb9af7",success:"#9ece6a",warning:"#e0af68",error:"#f7768e",info:"#7aa2f7",light:"#c0caf5",dark:"#1a1b26",muted:"#565f89",highlight:"#292e42",text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89",light:"#ffffff"},background:{primary:"#1a1b26",secondary:"#292e42",dark:"#16161e"},border:{light:"#292e42",dark:"#000000"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(26, 27, 38, 0.2)",base:"0 1px 3px 0 rgba(26, 27, 38, 0.3), 0 1px 2px 0 rgba(26, 27, 38, 0.2)",lg:"0 10px 15px -3px rgba(26, 27, 38, 0.3), 0 4px 6px -2px rgba(26, 27, 38, 0.2)"}},LQ={name:"github",colors:{primary:"#0969da",secondary:"#8250df",accent:"#bc4c00",success:"#1a7f37",warning:"#bc4c00",error:"#d1242f",info:"#0969da",light:"#f6f8fa",dark:"#24292f",muted:"#6e7781",highlight:"#ddf4ff",text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f6f8fa",dark:"#24292f"},border:{light:"#d0d7de",dark:"#24292f"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(255, 255, 255, 0.2)",base:"0 1px 3px 0 rgba(255, 255, 255, 0.3), 0 1px 2px 0 rgba(255, 255, 255, 0.2)",lg:"0 10px 15px -3px rgba(255, 255, 255, 0.3), 0 4px 6px -2px rgba(255, 255, 255, 0.2)"}},vQ={name:"gruvbox",colors:{primary:"#83a598",secondary:"#8ec07c",accent:"#d3869b",success:"#b8bb26",warning:"#fabd2f",error:"#fb4934",info:"#83a598",light:"#fbf1c7",dark:"#282828",muted:"#928374",highlight:"#3c3836",text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374",light:"#ffffff"},background:{primary:"#282828",secondary:"#3c3836",dark:"#1d2021"},border:{light:"#3c3836",dark:"#000000"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#8ec07c",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#b8bb26",default:"#ebdbb2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 40, 40, 0.2)",base:"0 1px 3px 0 rgba(40, 40, 40, 0.3), 0 1px 2px 0 rgba(40, 40, 40, 0.2)",lg:"0 10px 15px -3px rgba(40, 40, 40, 0.3), 0 4px 6px -2px rgba(40, 40, 40, 0.2)"}},EQ={name:"one-dark",colors:{primary:"#61afef",secondary:"#c678dd",accent:"#e5c07b",success:"#98c379",warning:"#e5c07b",error:"#e06c75",info:"#56b6c2",light:"#abb2bf",dark:"#282c34",muted:"#5c6370",highlight:"#3e4451",text:{primary:"#abb2bf",secondary:"#c6c8d0",muted:"#5c6370",light:"#ffffff"},background:{primary:"#282c34",secondary:"#3e4451",dark:"#21252b"},border:{light:"#3e4451",dark:"#000000"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 44, 52, 0.2)",base:"0 1px 3px 0 rgba(40, 44, 52, 0.3), 0 1px 2px 0 rgba(40, 44, 52, 0.2)",lg:"0 10px 15px -3px rgba(40, 44, 52, 0.3), 0 4px 6px -2px rgba(40, 44, 52, 0.2)"}},yQ={name:"catppuccin",colors:{primary:"#89b4fa",secondary:"#cba6f7",accent:"#f5c2e7",success:"#a6e3a1",warning:"#f9e2af",error:"#f38ba8",info:"#89dceb",light:"#cdd6f4",dark:"#11111b",muted:"#6c7086",highlight:"#181825",text:{primary:"#cdd6f4",secondary:"#bac2de",muted:"#6c7086",light:"#ffffff"},background:{primary:"#1e1e2e",secondary:"#181825",dark:"#11111b"},border:{light:"#181825",dark:"#000000"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#cdd6f4",operator:"#89dceb",type:"#f5c2e7",tag:"#f38ba8",attr:"#89b4fa",default:"#cdd6f4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(30, 30, 46, 0.2)",base:"0 1px 3px 0 rgba(30, 30, 46, 0.3), 0 1px 2px 0 rgba(30, 30, 46, 0.2)",lg:"0 10px 15px -3px rgba(30, 30, 46, 0.3), 0 4px 6px -2px rgba(30, 30, 46, 0.2)"}},CQ={name:"rose-pine",colors:{primary:"#9ccfd8",secondary:"#c4a7e7",accent:"#f6c177",success:"#31748f",warning:"#f6c177",error:"#eb6f92",info:"#9ccfd8",light:"#e0def4",dark:"#191724",muted:"#6e6a86",highlight:"#1f1d2e",text:{primary:"#e0def4",secondary:"#cecacd",muted:"#6e6a86",light:"#ffffff"},background:{primary:"#191724",secondary:"#1f1d2e",dark:"#12101a"},border:{light:"#1f1d2e",dark:"#000000"},syntax:{comment:"#6e6a86",string:"#9ccfd8",number:"#ea9a97",keyword:"#c4a7e7",function:"#31748f",variable:"#e0def4",operator:"#f6c177",type:"#9ccfd8",tag:"#eb6f92",attr:"#f6c177",default:"#e0def4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(25, 23, 36, 0.2)",base:"0 1px 3px 0 rgba(25, 23, 36, 0.3), 0 1px 2px 0 rgba(25, 23, 36, 0.2)",lg:"0 10px 15px -3px rgba(25, 23, 36, 0.3), 0 4px 6px -2px rgba(25, 23, 36, 0.2)"}},PQ={name:"kanagawa",colors:{primary:"#8ba4b0",secondary:"#a292a3",accent:"#c47fd5",success:"#76946a",warning:"#c0a36e",error:"#c34043",info:"#7e9cd8",light:"#dcd7ba",dark:"#1f1f28",muted:"#727169",highlight:"#2a2a37",text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169",light:"#ffffff"},background:{primary:"#1f1f28",secondary:"#2a2a37",dark:"#16161d"},border:{light:"#2a2a37",dark:"#000000"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#c34043",attr:"#7fb4ca",default:"#dcd7ba"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(31, 31, 40, 0.2)",base:"0 1px 3px 0 rgba(31, 31, 40, 0.3), 0 1px 2px 0 rgba(31, 31, 40, 0.2)",lg:"0 10px 15px -3px rgba(31, 31, 40, 0.3), 0 4px 6px -2px rgba(31, 31, 40, 0.2)"}},a=[{id:"ayu-dark",label:"Ayu Dark",theme:OQ,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:xQ,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:BQ,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:wQ,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:_Q,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:AQ,tags:["dark"]},{id:"tokyo-night",label:"Tokyo Night",theme:DQ,tags:["dark","popular"]},{id:"github",label:"GitHub",theme:LQ,tags:["light","minimal"]},{id:"gruvbox",label:"Gruvbox",theme:vQ,tags:["dark","warm"]},{id:"one-dark",label:"One Dark",theme:EQ,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:yQ,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:CQ,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:PQ,tags:["dark","japanese"]}];var t={primary:"#0066cc",secondary:"#6c757d",accent:"#e83e8c",success:"#28a745",warning:"#ffc107",error:"#dc3545",info:"#17a2b8",light:"#f8f9fa",dark:"#343a40",muted:"#6c757d",highlight:"#fff3cd",text:{primary:"#212529",secondary:"#6c757d",muted:"#6c757d",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f8f9fa",dark:"#343a40"},border:{light:"#dee2e6",dark:"#495057"},syntax:{comment:"#6c757d",string:"#28a745",number:"#e83e8c",keyword:"#007bff",function:"#17a2b8",variable:"#495057",operator:"#ffc107",type:"#007bff",tag:"#dc3545",attr:"#ffc107",default:"#212529"}},p={name:"default",colors:t,spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)"}},RQ={...p,name:"dark",colors:{...t,text:{primary:"#ffffff",secondary:"#e2e8f0",muted:"#94a3b8",light:"#000000"},background:{primary:"#1e293b",secondary:"#334155",dark:"#0f172a"},border:{light:"#475569",dark:"#64748b"},syntax:{comment:"#94a3b8",string:"#34d399",number:"#f472b6",keyword:"#60a5fa",function:"#06b6d4",variable:"#e2e8f0",operator:"#fbbf24",type:"#60a5fa",tag:"#fb7185",attr:"#fbbf24",default:"#ffffff"}}};class e{currentTheme=p;themes=new Map;constructor(){this.themes.set("default",p),this.themes.set("dark",RQ);for(let Q of a)this.themes.set(Q.id,Q.theme)}setTheme(Q){let Z=this.themes.get(Q);if(Z)this.currentTheme=Z;else throw Error(`Theme '${Q}' not found`)}getTheme(){return this.currentTheme}getAvailableThemes(){return Array.from(this.themes.keys())}getCurrentThemeName(){return this.currentTheme.name}getThemeByName(Q){return this.themes.get(Q)}hasTheme(Q){return this.themes.has(Q)}}var QQ=new e;var IQ={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},g=(Q)=>({...IQ,actions:{setInitializationStatus:(Z)=>{Q((X)=>({app:{...X.app,initializationStatus:Z}}))},setInitializationError:(Z)=>{Q((X)=>({app:{...X.app,initializationError:Z}}))},setActiveModal:(Z)=>{Q((X)=>({app:{...X.app,activeModal:Z}}))},showSessionSelector:(Z)=>{Q((X)=>({app:{...X.app,activeModal:"sessionSelector",sessionSelectorData:Z}}))},showModelEditWizard:(Z)=>{Q((X)=>({app:{...X.app,activeModal:"modelEditWizard",modelEditorTarget:Z}}))},closeModal:()=>{Q((Z)=>({app:{...Z.app,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null}}))},setTasks:(Z)=>{Q((X)=>({app:{...X.app,tasks:Z}}))},updateTask:(Z)=>{Q((X)=>({app:{...X.app,tasks:X.app.tasks.map(($)=>$.id===Z.id?Z:$)}}))},setAwaitingSecondCtrlC:(Z)=>{Q((X)=>({app:{...X.app,awaitingSecondCtrlC:Z}}))},setThinkingModeEnabled:(Z)=>{Q((X)=>({app:{...X.app,thinkingModeEnabled:Z}}))},toggleThinkingMode:()=>{Q((Z)=>({app:{...Z.app,thinkingModeEnabled:!Z.app.thinkingModeEnabled}}))},startSubagentProgress:(Z,X,$)=>{Q((Y)=>({app:{...Y.app,subagentProgress:{id:Z,type:X,description:$,status:"running",startTime:Date.now()}}}))},updateSubagentTool:(Z)=>{Q((X)=>{if(!X.app.subagentProgress)return X;return{app:{...X.app,subagentProgress:{...X.app.subagentProgress,currentTool:Z}}}})},completeSubagentProgress:(Z)=>{Q((X)=>{if(!X.app.subagentProgress)return X;return{app:{...X.app,subagentProgress:{...X.app.subagentProgress,status:Z?"completed":"failed",currentTool:void 0}}}}),setTimeout(()=>{Q((X)=>({app:{...X.app,subagentProgress:null}}))},1500)}}});var TQ={isProcessing:!1,abortController:null,pendingCommands:[]},d=(Q,Z)=>({...TQ,actions:{setProcessing:(X)=>{Q(($)=>({command:{...$.command,isProcessing:X}}))},createAbortController:()=>{let X=Z().command.abortController;if(X&&!X.signal.aborted)X.abort("interrupted-by-new-command");let $=new AbortController;return Q((Y)=>({command:{...Y.command,abortController:$}})),$},getAbortController:()=>{return Z().command.abortController},clearAbortController:(X)=>{let $=Z().command.abortController;if(X!==void 0&&$!==X)return;Q((Y)=>({command:{...Y.command,abortController:null}}))},abort:(X)=>{let{abortController:$}=Z().command;if($&&!$.signal.aborted)$.abort(X??"user-cancel");Q((Y)=>({command:{...Y.command,isProcessing:!1,pendingCommands:[]}}))},enqueueCommand:(X)=>{Q(($)=>({command:{...$.command,pendingCommands:[...$.command.pendingCommands,X]}}))},dequeueCommand:()=>{let{pendingCommands:X}=Z().command;if(X.length===0)return;let[$,...Y]=X;return Q((V)=>({command:{...V.command,pendingCommands:Y}})),$},clearQueue:()=>{Q((X)=>({command:{...X.command,pendingCommands:[]}}))}}});var MQ={config:null},m=(Q)=>({...MQ,actions:{setConfig:(Z)=>{Q((X)=>({config:{...X.config,config:Z}}))},updateConfig:(Z)=>{Q((X)=>{if(!X.config.config)throw Error(`[ConfigSlice] Config not initialized. Cannot update: ${JSON.stringify(Z)}`);return{config:{...X.config,config:{...X.config.config,...Z}}}})}}});var bQ={currentFocus:"main-input",previousFocus:null},r=(Q)=>({...bQ,actions:{setFocus:(Z)=>{Q((X)=>({focus:{...X.focus,currentFocus:Z,previousFocus:X.focus.currentFocus}}))},restorePreviousFocus:()=>{Q((Z)=>({focus:{...Z.focus,currentFocus:Z.focus.previousFocus||"main-input",previousFocus:null}}))}}});import{nanoid as fQ}from"nanoid";var W={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/};function $X(Q){let Z=[],X=Q.split(/\r?\n/),$=!1,Y=[],V=null,J=0,U=!1,G=[],z=[],K=!1,E=[],y=!1,B=[],H=0,j=!0;for(let D=0;D<X.length;D++){let O=X[D];if(K){if(O.match(W.diffEnd)){try{let w=JSON.parse(E.join(`
2
- `));Z.push({type:"diff",content:"",diffData:{patch:w.patch,startLine:w.startLine,matchLine:w.matchLine}})}catch(w){Z.push({type:"text",content:E.join(`
3
- `)})}K=!1,E=[],j=!1;continue}E.push(O);continue}if(O.match(W.diffStart)){K=!0,E=[],j=!1;continue}if($){let w=O.match(W.codeBlock),L=O.trim()==="```";if(w&&w[1])J++,Y.push(O);else if(L)if(J>0)J--,Y.push(O);else{let qQ=Y.join(`
4
- `);Z.push({type:"code",content:qQ,language:V||void 0}),$=!1,Y=[],V=null,J=0,j=!1}else Y.push(O);continue}let n=O.match(W.codeBlock);if(n){$=!0,V=n[1]||null,J=0,j=!1;continue}let T=O.match(W.table),WQ=O.match(W.tableSeparator);if(T&&!U){if(D+1<X.length){if(X[D+1].match(W.tableSeparator)){U=!0,G=T[1].split("|").map((L)=>L.trim()).filter((L)=>L.length>0),z=[],j=!1;continue}}}if(U&&WQ)continue;if(U&&T){let w=T[1].split("|").map((L)=>L.trim()).filter((L)=>L.length>0);while(w.length<G.length)w.push("");if(w.length>G.length)w.length=G.length;z.push(w);continue}if(U&&!T){if(G.length>0&&z.length>0)Z.push({type:"table",content:"",tableData:{headers:G,rows:z}});U=!1,G=[],z=[]}let S=O.match(W.blockquote);if(S){let w=S[1].length,L=S[2]||"";if(y&&w===H)B.push(L);else{if(y)Z.push({type:"blockquote",content:B.join(`
5
- `),blockquoteLevel:H,blockquoteLines:[...B]});y=!0,H=w,B=[L]}j=!1;continue}if(y)Z.push({type:"blockquote",content:B.join(`
6
- `),blockquoteLevel:H,blockquoteLines:[...B]}),y=!1,B=[],H=0;let u=O.match(W.heading);if(u){Z.push({type:"heading",content:u[2],level:u[1].length}),j=!1;continue}let h=O.match(W.ulItem);if(h){Z.push({type:"list",content:h[3],listType:"ul",marker:h[2],indentation:h[1].length}),j=!1;continue}let k=O.match(W.olItem);if(k){Z.push({type:"list",content:k[3],listType:"ol",marker:k[2],indentation:k[1].length}),j=!1;continue}if(O.match(W.hr)){Z.push({type:"hr",content:""}),j=!1;continue}if(O.trim().length===0){if(!j)Z.push({type:"empty",content:""}),j=!0;continue}let s=O.match(W.commandMessage);if(s){Z.push({type:"command-message",content:s[1]}),j=!1;continue}Z.push({type:"text",content:O}),j=!1}if($){let D=Y.join(`
7
- `);Z.push({type:"code",content:D,language:V||void 0})}if(U&&G.length>0&&z.length>0)Z.push({type:"table",content:"",tableData:{headers:G,rows:z}});if(y&&B.length>0)Z.push({type:"blockquote",content:B.join(`
8
- `),blockquoteLevel:H,blockquoteLines:[...B]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var C=new Map;function NQ(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function hQ(Q){let Z=C.get(Q);if(Z)return Z;let X={state:NQ(),blocks:[],pendingLine:"",finalized:!1};return C.set(Q,X),X}function XQ(Q){return Q.endsWith("\r")?Q.slice(0,-1):Q}function ZQ(Q,Z){if(Q.tableHeaders.length>0&&Q.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:Q.tableHeaders,rows:Q.tableRows}});Q.inTable=!1,Q.tableHeaders=[],Q.tableRows=[]}function l(Q,Z){if(Q.blockquoteLines.length>0)Z.push({type:"blockquote",content:Q.blockquoteLines.join(`
9
- `),blockquoteLevel:Q.blockquoteLevel,blockquoteLines:[...Q.blockquoteLines]});Q.inBlockquote=!1,Q.blockquoteLines=[],Q.blockquoteLevel=0}function $Q(Q,Z){let X=Q.codeBlockContent.join(`
10
- `);Z.push({type:"code",content:X,language:Q.codeBlockLang||void 0}),Q.inCodeBlock=!1,Q.codeBlockContent=[],Q.codeBlockLang=null,Q.codeBlockDepth=0,Q.lastLineEmpty=!1}function c(Q,Z,X=!0){let{state:$,blocks:Y}=Z;if($.pendingTableHeader!==null){if(Q.match(W.tableSeparator)){$.inTable=!0,$.tableHeaders=$.pendingTableHeader.slice(1,-1).split("|").map((H)=>H.trim()).filter((H)=>H.length>0),$.tableRows=[],$.pendingTableHeader=null,$.lastLineEmpty=!1;return}Y.push({type:"text",content:$.pendingTableHeader}),$.pendingTableHeader=null,$.lastLineEmpty=!1}if($.inDiff){if(Q.match(W.diffEnd)){try{let H=JSON.parse($.diffContent.join(`
11
- `));Y.push({type:"diff",content:"",diffData:{patch:H.patch,startLine:H.startLine,matchLine:H.matchLine}})}catch(H){Y.push({type:"text",content:$.diffContent.join(`
12
- `)})}$.inDiff=!1,$.diffContent=[],$.lastLineEmpty=!1;return}$.diffContent.push(Q);return}if(Q.match(W.diffStart)){$.inDiff=!0,$.diffContent=[],$.lastLineEmpty=!1;return}if($.inCodeBlock){let H=Q.match(W.codeBlock),j=Q.trim()==="```";if(H&&H[1])$.codeBlockDepth++,$.codeBlockContent.push(Q);else if(j)if($.codeBlockDepth>0)$.codeBlockDepth--,$.codeBlockContent.push(Q);else $Q($,Y);else $.codeBlockContent.push(Q);return}let V=Q.match(W.codeBlock);if(V){$.inCodeBlock=!0,$.codeBlockLang=V[1]||null,$.codeBlockDepth=0,$.lastLineEmpty=!1;return}let J=Q.match(W.table),U=Q.match(W.tableSeparator);if(J&&!$.inTable){$.pendingTableHeader=Q;return}if($.inTable&&U)return;if($.inTable&&J){let H=J[1].split("|").map((j)=>j.trim()).filter((j)=>j.length>0);while(H.length<$.tableHeaders.length)H.push("");if(H.length>$.tableHeaders.length)H.length=$.tableHeaders.length;$.tableRows.push(H);return}if($.inTable&&!J){if(ZQ($,Y),X){c(Q,Z,!1);return}}let G=Q.match(W.blockquote);if(G){let H=G[1].length,j=G[2]||"";if($.inBlockquote&&H===$.blockquoteLevel)$.blockquoteLines.push(j);else{if($.inBlockquote)l($,Y);$.inBlockquote=!0,$.blockquoteLevel=H,$.blockquoteLines=[j]}$.lastLineEmpty=!1;return}if($.inBlockquote)l($,Y);let z=Q.match(W.heading);if(z){Y.push({type:"heading",content:z[2],level:z[1].length}),$.lastLineEmpty=!1;return}let K=Q.match(W.ulItem);if(K){Y.push({type:"list",content:K[3],listType:"ul",marker:K[2],indentation:K[1].length}),$.lastLineEmpty=!1;return}let E=Q.match(W.olItem);if(E){Y.push({type:"list",content:E[3],listType:"ol",marker:E[2],indentation:E[1].length}),$.lastLineEmpty=!1;return}if(Q.match(W.hr)){Y.push({type:"hr",content:""}),$.lastLineEmpty=!1;return}if(Q.trim().length===0){if(!$.lastLineEmpty)Y.push({type:"empty",content:""}),$.lastLineEmpty=!0;return}let B=Q.match(W.commandMessage);if(B){Y.push({type:"command-message",content:B[1]}),$.lastLineEmpty=!1;return}Y.push({type:"text",content:Q}),$.lastLineEmpty=!1}function JX(Q,Z){if(!Q||!Z)return;let X=hQ(Q);if(X.finalized)return;let $=X.pendingLine+Z,Y=$.split(`
13
- `),V=$.endsWith(`
14
- `),J=V?Y:Y.slice(0,-1);X.pendingLine=V?"":Y[Y.length-1]??"";for(let U of J)c(XQ(U),X)}function UX(Q){let Z=C.get(Q);if(!Z||Z.finalized)return;if(Z.pendingLine)c(XQ(Z.pendingLine),Z),Z.pendingLine="";if(Z.state.pendingTableHeader!==null)Z.blocks.push({type:"text",content:Z.state.pendingTableHeader}),Z.state.pendingTableHeader=null;if(Z.state.inCodeBlock)$Q(Z.state,Z.blocks);if(Z.state.inTable)ZQ(Z.state,Z.blocks);if(Z.state.inBlockquote)l(Z.state,Z.blocks);if(Z.state.inDiff)Z.blocks.push({type:"text",content:Z.state.diffContent.join(`
15
- `)}),Z.state.inDiff=!1,Z.state.diffContent=[];while(Z.blocks.length>0&&Z.blocks[Z.blocks.length-1].type==="empty")Z.blocks.pop();Z.finalized=!0}function GX(Q){let Z=C.get(Q);if(!Z||!Z.finalized)return null;return Z.blocks}function jX(Q){let Z=C.get(Q);if(!Z)return null;return Z.blocks}function kQ(Q){let Z=C.get(Q);if(!Z)return null;let X=[],$=Z.state;if($.inDiff)X.push("<<<DIFF>>>"),X.push(...$.diffContent);else if($.inCodeBlock){let Y=$.codeBlockLang?`\`\`\`${$.codeBlockLang}`:"```";X.push(Y),X.push(...$.codeBlockContent)}else if($.inTable){if($.tableHeaders.length>0){X.push(`| ${$.tableHeaders.join(" | ")} |`),X.push(`| ${$.tableHeaders.map(()=>"---").join(" | ")} |`);for(let Y of $.tableRows)X.push(`| ${Y.join(" | ")} |`)}}else if($.inBlockquote){let Y=">".repeat($.blockquoteLevel)+" ";for(let V of $.blockquoteLines)X.push(Y+V)}else if($.pendingTableHeader)X.push($.pendingTableHeader);if(Z.pendingLine)X.push(Z.pendingLine);return X.length>0?X:null}function HX(Q){let Z=C.get(Q);if(!Z)return null;let X="text";if(Z.state.inDiff)X="diff";else if(Z.state.inCodeBlock)X="code";else if(Z.state.inTable||Z.state.pendingTableHeader)X="table";let $=kQ(Q);if(!$||$.length===0)return null;return{lines:$,mode:X}}function zX(Q){C.delete(Q)}function f(){C.clear()}var YQ=2000,M=[];function SQ(){let Q=M;return M=[],Q}var JQ={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:200000},VQ={sessionId:fQ(),messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,isCompacting:!1,currentCommand:null,error:null,isActive:!0,tokenUsage:{...JQ},currentThinkingContent:null,thinkingExpanded:!1,clearCount:0,historyExpanded:!1,expandedMessageCount:100,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null},i=(Q,Z)=>({...VQ,actions:{addMessage:(X)=>{Q(($)=>({session:{...$.session,messages:[...$.session.messages,X],error:null}}))},addUserMessage:(X)=>{let $={id:`user-${Date.now()}-${Math.random()}`,role:"user",content:X,timestamp:Date.now()};Z().session.actions.addMessage($)},addAssistantMessage:(X,$)=>{let Y={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:X,timestamp:Date.now(),thinkingContent:$};Z().session.actions.addMessage(Y)},addAssistantMessageAndClearThinking:(X)=>{let $=Z().session.currentThinkingContent,Y={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:X,timestamp:Date.now(),thinkingContent:$||void 0};Q((V)=>({session:{...V.session,messages:[...V.session.messages,Y],currentThinkingContent:null,error:null}}))},addToolMessage:(X,$)=>{let Y={id:`tool-${Date.now()}-${Math.random()}`,role:"tool",content:X,timestamp:Date.now(),metadata:$};Z().session.actions.addMessage(Y)},setCompacting:(X)=>{Q(($)=>({session:{...$.session,isCompacting:X}}))},setCommand:(X)=>{Q(($)=>({session:{...$.session,currentCommand:X}}))},setError:(X)=>{Q(($)=>({session:{...$.session,error:X}}))},clearMessages:()=>{f(),Q((X)=>({session:{...X.session,messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,error:null,clearCount:X.session.clearCount+1}}))},resetSession:()=>{f(),Q((X)=>({session:{...X.session,...VQ,sessionId:X.session.sessionId,isActive:!0}}))},restoreSession:(X,$,Y)=>{f(),Q((V)=>({session:{...V.session,sessionId:X,messages:$,restoredContextMessages:Y??null,restoredVisibleMessageCount:Y?$.length:0,error:null,isActive:!0}}))},updateTokenUsage:(X)=>{Q(($)=>({session:{...$.session,tokenUsage:{...$.session.tokenUsage,...X}}}))},resetTokenUsage:()=>{Q((X)=>({session:{...X.session,tokenUsage:{...JQ}}}))},setCurrentThinkingContent:(X)=>{if(Z().session.currentThinkingContent===X)return;Q(($)=>({session:{...$.session,currentThinkingContent:X}}))},appendThinkingContent:(X)=>{Q(($)=>({session:{...$.session,currentThinkingContent:($.session.currentThinkingContent||"")+X}}))},setThinkingExpanded:(X)=>{Q(($)=>({session:{...$.session,thinkingExpanded:X}}))},toggleThinkingExpanded:()=>{Q((X)=>({session:{...X.session,thinkingExpanded:!X.session.thinkingExpanded}}))},setHistoryExpanded:(X)=>{Q(($)=>({session:{...$.session,historyExpanded:X}}))},toggleHistoryExpanded:()=>{Q((X)=>({session:{...X.session,historyExpanded:!X.session.historyExpanded}}))},setExpandedMessageCount:(X)=>{Q(($)=>({session:{...$.session,expandedMessageCount:X}}))},incrementClearCount:()=>{Q((X)=>({session:{...X.session,clearCount:X.session.clearCount+1}}))},startStreamingAssistantMessage:()=>{let X=`assistant-${Date.now()}-${Math.random()}`,$={id:X,role:"assistant",content:"",timestamp:Date.now()};return M=[],Q((Y)=>({session:{...Y.session,messages:[...Y.session.messages,$],currentStreamingMessageId:X,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,error:null}})),X},appendAssistantContent:(X)=>{let $=Z().session.currentStreamingMessageId,Y=$??`assistant-${Date.now()}-${Math.random()}`;return M.push(X),Q((V)=>{let J=(D)=>D.endsWith("\r")?D.slice(0,-1):D,U=$?V.session.currentStreamingLines:[],G=$?V.session.currentStreamingTail:"",z=$?V.session.currentStreamingLineCount:0,K=$?V.session.currentStreamingVersion:0,y=(G+X).split(`
16
- `),B=y.slice(0,-1).map(J),H=J(y[y.length-1]??""),j=U;if(B.length>0){if(j=[...U,...B],j.length>YQ){let D=j.length-YQ;j=j.slice(D)}}return{session:{...V.session,currentStreamingMessageId:Y,currentStreamingLines:j,currentStreamingTail:H,currentStreamingLineCount:z+B.length,currentStreamingVersion:K+1,error:null}}}),Y},finalizeStreamingMessage:(X,$)=>{let Y=SQ();Q((V)=>{let J=V.session.currentStreamingMessageId,G=Y.join("")+(X||""),z=(V.session.currentThinkingContent||"")+($||"");if(G.length>0){let K={id:J||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:G,timestamp:Date.now(),thinkingContent:z||void 0};return{session:{...V.session,messages:[...V.session.messages,K],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:K.id}}}return{session:{...V.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{Q((X)=>({session:{...X.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{M=[],Q((X)=>({session:{...X.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))}}});import{nanoid as mQ}from"nanoid";import{promises as _}from"node:fs";import*as F from"node:path";import{fileURLToPath as uQ}from"node:url";import{nanoid as pQ}from"nanoid";var UQ={proposal:"proposal.md",spec:"spec.md",requirements:"requirements.md",design:"design.md",tasks:"tasks.md",meta:".meta.json"},P={SPECS:"specs",CHANGES:"changes",ARCHIVE:"archive",STEERING:"steering",SPEC_DELTA:"specs"},R={CONSTITUTION:"constitution.md",PRODUCT:"product.md",TECH:"tech.md",STRUCTURE:"structure.md"};var b={init:["requirements"],requirements:["design","tasks"],design:["tasks"],tasks:["implementation"],implementation:["done","tasks"],done:[]},OX={init:"初始化",requirements:"需求定义",design:"架构设计",tasks:"任务分解",implementation:"实现中",done:"已完成"},GQ={init:"proposal",requirements:"requirements",design:"design",tasks:"tasks",implementation:"tasks",done:null};var gQ=uQ(import.meta.url),dQ=F.dirname(gQ),jQ=F.join(dQ,"templates");class N{workspaceRoot;bladeDir;constructor(Q){this.workspaceRoot=Q,this.bladeDir=F.join(Q,".blade")}getSpecsDir(){return F.join(this.bladeDir,P.SPECS)}getChangesDir(){return F.join(this.bladeDir,P.CHANGES)}getArchiveDir(){return F.join(this.bladeDir,P.ARCHIVE)}getSteeringDir(){return F.join(this.bladeDir,P.STEERING)}getChangePath(Q){return F.join(this.getChangesDir(),Q)}getChangeFilePath(Q,Z){return F.join(this.getChangePath(Q),UQ[Z])}async initializeDirectories(){await _.mkdir(this.getChangesDir(),{recursive:!0,mode:493})}async createChangeDir(Q){let Z=this.getChangePath(Q);return await _.mkdir(Z,{recursive:!0,mode:493}),await _.mkdir(F.join(Z,P.SPEC_DELTA),{recursive:!0,mode:493}),Z}async readFile(Q){try{return await _.readFile(Q,"utf-8")}catch(Z){if(Z.code==="ENOENT")return null;throw Z}}async writeFile(Q,Z){let X=F.dirname(Q);await _.mkdir(X,{recursive:!0,mode:493}),await _.writeFile(Q,Z,"utf-8")}async fileExists(Q){try{return await _.access(Q),!0}catch{return!1}}async dirExists(Q){try{return(await _.stat(Q)).isDirectory()}catch{return!1}}createMetadata(Q,Z){let X=new Date().toISOString();return{id:pQ(),name:Q,description:Z,phase:"init",createdAt:X,updatedAt:X,tasks:[]}}async readMetadata(Q){let Z=this.getChangeFilePath(Q,"meta"),X=await this.readFile(Z);if(!X)return null;try{return JSON.parse(X)}catch{return null}}async writeMetadata(Q,Z){let X=this.getChangeFilePath(Q,"meta");Z.updatedAt=new Date().toISOString(),await this.writeFile(X,JSON.stringify(Z,null,2))}async updatePhase(Q,Z){let X=await this.readMetadata(Q);if(!X)return null;return X.phase=Z,await this.writeMetadata(Q,X),X}async readSpecFile(Q,Z){let X=this.getChangeFilePath(Q,Z);return this.readFile(X)}async writeSpecFile(Q,Z,X){let $=this.getChangeFilePath(Q,Z);await this.writeFile($,X);let Y=await this.readMetadata(Q);if(Y)await this.writeMetadata(Q,Y)}async getPhaseContent(Q,Z){let X=GQ[Z];if(!X)return null;return this.readSpecFile(Q,X)}async readSteeringContext(){let Q=this.getSteeringDir(),[Z,X,$,Y]=await Promise.all([this.readFile(F.join(Q,R.CONSTITUTION)),this.readFile(F.join(Q,R.PRODUCT)),this.readFile(F.join(Q,R.TECH)),this.readFile(F.join(Q,R.STRUCTURE))]);return{constitution:Z||void 0,product:X||void 0,tech:$||void 0,structure:Y||void 0}}async writeSteeringFile(Q,Z){let X=F.join(this.getSteeringDir(),R[Q]);await this.writeFile(X,Z)}async hasSteeringDocs(){let Q=this.getSteeringDir();if(!await this.dirExists(Q))return!1;return(await _.readdir(Q)).length>0}async listActiveChanges(){let Q=this.getChangesDir();if(!await this.dirExists(Q))return[];return(await _.readdir(Q,{withFileTypes:!0})).filter((X)=>X.isDirectory()).map((X)=>X.name)}async listArchivedChanges(){let Q=this.getArchiveDir();if(!await this.dirExists(Q))return[];return(await _.readdir(Q,{withFileTypes:!0})).filter((X)=>X.isDirectory()).map((X)=>X.name)}async changeExists(Q){return this.dirExists(this.getChangePath(Q))}async archiveChange(Q){let Z=this.getChangePath(Q),X=F.join(this.getArchiveDir(),Q);await _.mkdir(F.dirname(X),{recursive:!0,mode:493}),await _.rename(Z,X)}async restoreChange(Q){let Z=F.join(this.getArchiveDir(),Q),X=this.getChangePath(Q);await _.rename(Z,X)}async listSpecDomains(){let Q=this.getSpecsDir();if(!await this.dirExists(Q))return[];return(await _.readdir(Q,{withFileTypes:!0})).filter((X)=>X.isDirectory()).map((X)=>X.name)}async readAuthorativeSpec(Q){let Z=F.join(this.getSpecsDir(),Q,"spec.md");return this.readFile(Z)}async writeAuthorativeSpec(Q,Z){let X=F.join(this.getSpecsDir(),Q,"spec.md");await this.writeFile(X,Z)}async mergeSpecDeltas(Q){let Z=F.join(this.getChangePath(Q),P.SPEC_DELTA);if(!await this.dirExists(Z))return[];let X=[],$=await _.readdir(Z,{withFileTypes:!0});for(let Y of $){if(!Y.isDirectory())continue;let V=F.join(Z,Y.name,"spec.md"),J=await this.readFile(V);if(J){let U=await this.readAuthorativeSpec(Y.name),G=U?`${U}
17
-
18
- ---
19
-
20
- <!-- Merged from ${Q} -->
21
-
22
- ${J}`:J;await this.writeAuthorativeSpec(Y.name,G),X.push(Y.name)}}return X}static TEMPLATE_NAMES={proposal:"proposal.md.template",spec:"spec.md.template",requirements:"requirements.md.template",design:"design.md.template",tasks:"tasks.md.template",meta:""};static STEERING_TEMPLATE_NAMES={CONSTITUTION:"steering/constitution.md.template",PRODUCT:"steering/product.md.template",TECH:"steering/tech.md.template",STRUCTURE:"steering/structure.md.template"};async readTemplate(Q){let Z=N.TEMPLATE_NAMES[Q];if(!Z)return null;let X=F.join(jQ,Z);return this.readFile(X)}async readSteeringTemplate(Q){let Z=N.STEERING_TEMPLATE_NAMES[Q],X=F.join(jQ,Z);return this.readFile(X)}fillTemplate(Q,Z){let X=Q;for(let[$,Y]of Object.entries(Z))X=X.replace(new RegExp(`\\{\\{${$}\\}\\}`,"g"),Y);return X}async createFromTemplate(Q,Z,X){let $=await this.readTemplate(Z);if(!$)return null;let Y=this.fillTemplate($,{name:Q,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),...X});return await this.writeSpecFile(Q,Z,Y),Y}async createSteeringFromTemplate(Q,Z={}){let X=await this.readSteeringTemplate(Q);if(!X)return null;let $=this.fillTemplate(X,{createdAt:new Date().toISOString(),...Z});return await this.writeSteeringFile(Q,$),$}async initializeSteeringDocs(){let Q=[],Z=this.getSteeringDir();for(let[X,$]of Object.entries(R)){let Y=F.join(Z,$);if(!await this.fileExists(Y))await this.createSteeringFromTemplate(X),Q.push($)}return Q}}class x{static instance=null;fileManager=null;workspaceRoot=null;constructor(){}static getInstance(){if(!x.instance)x.instance=new x;return x.instance}static resetInstance(){x.instance=null}async initialize(Q){if(this.workspaceRoot===Q&&this.fileManager)return;this.workspaceRoot=Q,this.fileManager=new N(Q),await this.fileManager.initializeDirectories()}getFileManager(){if(!this.fileManager)throw Error("SpecService not initialized. Call initialize() first.");return this.fileManager}async readSteeringContext(){return this.getFileManager().readSteeringContext()}async readSpecMetadata(Q){return this.getFileManager().readMetadata(Q)}async specExists(Q){return this.getFileManager().changeExists(Q)}getSpecPath(Q){return this.getFileManager().getChangePath(Q)}async createSpec(Q,Z){let X=this.getFileManager();if(await X.changeExists(Q))return{success:!1,message:`Spec "${Q}" already exists`,error:"SPEC_EXISTS"};let $=await X.createChangeDir(Q),Y=X.createMetadata(Q,Z);await X.writeMetadata(Q,Y);let V=this.generateProposalTemplate(Q,Z);return await X.writeSpecFile(Q,"proposal",V),{success:!0,message:`Spec "${Q}" created successfully`,data:{spec:Y,path:$}}}async loadSpec(Q){let Z=this.getFileManager(),X=await Z.readMetadata(Q);if(!X)return{success:!1,message:`Spec "${Q}" not found`,error:"SPEC_NOT_FOUND"};let $=Z.getChangePath(Q);return{success:!0,message:`Spec "${Q}" loaded successfully`,data:{spec:X,path:$}}}canTransitionPhase(Q,Z){return b[Q].includes(Z)}getAllowedTransitions(Q){return b[Q]}async updatePhase(Q,Z){return this.getFileManager().updatePhase(Q,Z)}createTask(Q,Z,X){return{id:mQ(8),title:Q,description:Z,status:"pending",dependencies:X?.dependencies||[],affectedFiles:X?.affectedFiles||[],complexity:X?.complexity||"medium"}}async saveMetadata(Q,Z){await this.getFileManager().writeMetadata(Q,Z)}getNextTask(Q){return Q.find((Z)=>{if(Z.status!=="pending")return!1;return Z.dependencies.every((X)=>{return Q.find((Y)=>Y.id===X)?.status==="completed"})})||null}getTaskProgress(Q){if(Q.length===0)return{total:0,completed:0,percentage:0};let Z=Q.length,X=Q.filter((Y)=>Y.status==="completed").length,$=Math.round(X/Z*100);return{total:Z,completed:X,percentage:$}}async listActiveSpecs(){return this.getFileManager().listActiveChanges()}async listArchivedSpecs(){return this.getFileManager().listArchivedChanges()}async archiveSpec(Q){let Z=this.getFileManager();return await Z.mergeSpecDeltas(Q),await Z.updatePhase(Q,"done"),await Z.archiveChange(Q),{success:!0,message:`Spec "${Q}" archived successfully`}}async validateSpec(Q){let Z=this.getFileManager(),X=[],$=[],[Y,V,J,U,G]=await Promise.all([Z.readSpecFile(Q.name,"proposal"),Z.readSpecFile(Q.name,"spec"),Z.readSpecFile(Q.name,"requirements"),Z.readSpecFile(Q.name,"design"),Z.readSpecFile(Q.name,"tasks")]),z={proposal:!!Y,spec:!!V,requirements:!!J,design:!!U,tasks:!!G};if(Q.phase==="requirements"&&!z.requirements)X.push({severity:"warning",file:"requirements",message:"Requirements document is missing"}),$.push("Generate requirements using EARS format");if(Q.phase==="design"&&!z.design)X.push({severity:"warning",file:"design",message:"Design document is missing"}),$.push("Create architecture diagrams and API contracts");if(Q.phase==="tasks"&&Q.tasks.length===0)X.push({severity:"warning",file:"tasks",message:"No tasks defined"}),$.push("Break down the spec into atomic tasks");if(Q.phase==="implementation"){let K=this.getTaskProgress(Q.tasks);if(K.completed<K.total)X.push({severity:"info",file:"tasks",message:`${K.total-K.completed} tasks remaining`})}return{valid:X.filter((K)=>K.severity==="error").length===0,phase:Q.phase,completeness:z,issues:X,suggestions:$}}generateProposalTemplate(Q,Z){return`# ${Q}
23
-
24
- ## Summary
25
-
26
- ${Z}
27
-
28
- ## Background
29
-
30
- <!-- Why is this change needed? What problem does it solve? -->
31
-
32
- ## Goals
33
-
34
- <!-- What are the specific objectives of this change? -->
35
-
36
- - [ ] Goal 1
37
- - [ ] Goal 2
38
-
39
- ## Non-Goals
40
-
41
- <!-- What is explicitly out of scope? -->
42
-
43
- ## Risks and Mitigations
44
-
45
- <!-- What could go wrong? How will you address it? -->
46
-
47
- | Risk | Mitigation |
48
- |------|------------|
49
- | | |
50
-
51
- ## Open Questions
52
-
53
- <!-- What needs to be clarified before proceeding? -->
54
-
55
- 1.
56
- `}}var HQ=FQ("Spec"),zQ={currentSpec:null,specPath:null,isActive:!1,steeringContext:null,recentSpecs:[],isLoading:!1,error:null,workspaceRoot:null},o=(Q,Z)=>({...zQ,actions:{initialize:async(X)=>{let $=x.getInstance();await $.initialize(X);let Y=await $.readSteeringContext();Q((V)=>({spec:{...V.spec,workspaceRoot:X,steeringContext:Y}}))},createSpec:async(X,$)=>{let V=await x.getInstance().createSpec(X,$);if(V.success&&V.data){let{spec:J,path:U}=V.data,G=Z().spec.recentSpecs.filter((z)=>z!==X);G.unshift(X),Q((z)=>({spec:{...z.spec,currentSpec:J,specPath:U,isActive:!0,recentSpecs:G.slice(0,10)}}))}return V},loadSpec:async(X)=>{let Y=await x.getInstance().loadSpec(X);if(Y.success&&Y.data){let{spec:V,path:J}=Y.data,U=Z().spec.recentSpecs.filter((G)=>G!==X);U.unshift(X),Q((G)=>({spec:{...G.spec,currentSpec:V,specPath:J,isActive:!0,recentSpecs:U.slice(0,10)}}))}return Y},closeSpec:()=>{Q((X)=>({spec:{...X.spec,currentSpec:null,specPath:null,isActive:!1}}))},exitSpecMode:()=>{Z().spec.actions.closeSpec()},transitionPhase:async(X)=>{let $=Z().spec.currentSpec;if(!$)return{success:!1,message:"No active spec",error:"NO_ACTIVE_SPEC"};let Y=x.getInstance();if(!Y.canTransitionPhase($.phase,X))return{success:!1,message:`Cannot transition from "${$.phase}" to "${X}"`,error:"INVALID_TRANSITION"};let V=await Y.updatePhase($.name,X);if(!V)return{success:!1,message:"Failed to update phase",error:"UPDATE_FAILED"};if(Q((J)=>({spec:{...J.spec,currentSpec:V}})),X==="done")try{let{config:J}=Z();if(J.actions)J.actions.updateConfig({permissionMode:"default"});HQ.info("Spec 已完成,已自动退出 Spec 模式")}catch(J){HQ.error("自动退出 Spec 模式失败:",J)}return{success:!0,message:`Transitioned to "${X}" phase`,data:{spec:V,phase:X}}},getAllowedTransitions:()=>{let X=Z().spec.currentSpec;if(!X)return[];return b[X.phase]},addTask:async(X,$,Y)=>{let V=Z().spec.currentSpec;if(!V)return{success:!1,message:"No active spec",error:"NO_ACTIVE_SPEC"};let J=x.getInstance(),U=J.createTask(X,$,Y),G={...V,tasks:[...V.tasks,U],updatedAt:new Date().toISOString()};return await J.saveMetadata(V.name,G),Q((z)=>({spec:{...z.spec,currentSpec:G}})),{success:!0,message:`Task "${X}" added`,data:{task:U}}},updateTaskStatus:async(X,$)=>{let Y=Z().spec.currentSpec;if(!Y)return{success:!1,message:"No active spec",error:"NO_ACTIVE_SPEC"};let V=Y.tasks.find((K)=>K.id===X);if(!V)return{success:!1,message:`Task "${X}" not found`,error:"TASK_NOT_FOUND"};let J={...V,status:$,completedAt:$==="completed"?new Date().toISOString():V.completedAt},U=Y.tasks.map((K)=>K.id===X?J:K),G={...Y,tasks:U,currentTaskId:$==="in_progress"?X:Y.currentTaskId===X?void 0:Y.currentTaskId,updatedAt:new Date().toISOString()};return await x.getInstance().saveMetadata(Y.name,G),Q((K)=>({spec:{...K.spec,currentSpec:G}})),{success:!0,message:`Task status updated to "${$}"`,data:{task:J}}},getNextTask:()=>{let X=Z().spec.currentSpec;if(!X)return null;return x.getInstance().getNextTask(X.tasks)},getTaskProgress:()=>{let X=Z().spec.currentSpec;if(!X)return{total:0,completed:0,percentage:0};return x.getInstance().getTaskProgress(X.tasks)},listSpecs:async(X)=>{let $=x.getInstance(),Y=[],V=await $.listActiveSpecs();for(let J of V){let U=await $.readSpecMetadata(J);if(!U)continue;if(X?.phase&&U.phase!==X.phase)continue;if(X?.tags&&!X.tags.some((z)=>U.tags?.includes(z)))continue;if(X?.query&&!U.name.toLowerCase().includes(X.query.toLowerCase())&&!U.description.toLowerCase().includes(X.query.toLowerCase()))continue;let G=$.getTaskProgress(U.tasks);Y.push({name:U.name,description:U.description,phase:U.phase,updatedAt:U.updatedAt,path:$.getSpecPath(J),isArchived:!1,taskProgress:{total:G.total,completed:G.completed}})}if(X?.includeArchived){let J=await $.listArchivedSpecs();for(let U of J)Y.push({name:U,description:"(archived)",phase:"done",updatedAt:"",path:`archive/${U}`,isArchived:!0,taskProgress:{total:0,completed:0}})}return Y.sort((J,U)=>{if(J.isArchived!==U.isArchived)return J.isArchived?1:-1;return new Date(U.updatedAt).getTime()-new Date(J.updatedAt).getTime()}),Y},archiveCurrentSpec:async()=>{let X=Z().spec.currentSpec;if(!X)return{success:!1,message:"No active spec",error:"NO_ACTIVE_SPEC"};let Y=await x.getInstance().archiveSpec(X.name);if(Y.success)Z().spec.actions.closeSpec();return Y},validateCurrentSpec:async()=>{let X=Z().spec.currentSpec;if(!X)return{valid:!1,phase:"init",completeness:{proposal:!1,spec:!1,requirements:!1,design:!1,tasks:!1},issues:[{severity:"error",file:"meta",message:"No active spec"}],suggestions:["Create a new spec with /spec proposal <name>"]};return x.getInstance().validateSpec(X)},getSteeringContextString:async()=>{let X=Z().spec.steeringContext;if(!X)return null;let $=[];if(X.constitution)$.push(`## Constitution (Project Governance)
57
-
58
- ${X.constitution}`);if(X.product)$.push(`## Product Vision
59
-
60
- ${X.product}`);if(X.tech)$.push(`## Technology Stack
61
-
62
- ${X.tech}`);if(X.structure)$.push(`## Code Structure
63
-
64
- ${X.structure}`);return $.length>0?$.join(`
65
-
66
- ---
67
-
68
- `):null},setError:(X)=>{Q(($)=>({spec:{...$.spec,error:X}}))},setLoading:(X)=>{Q(($)=>({spec:{...$.spec,isLoading:X}}))},reset:()=>{Q((X)=>({spec:{...zQ,actions:X.spec.actions}}))}}});var oQ=iQ()(lQ(cQ((...Q)=>({session:i(...Q),app:g(...Q),config:m(...Q),focus:r(...Q),command:d(...Q),spec:o(...Q)})),{name:"BladeStore",enabled:!0})),q=()=>oQ.getState(),iX=()=>q().session.actions,oX=()=>q().app.actions,nX=()=>q().session.messages,v=()=>q().config.config,I=null;async function sX(){if(v()!==null)return;if(I)return I;return I=(async()=>{try{let X=await KQ.getInstance().initialize();q().config.actions.setConfig(X)}catch(Z){throw I=null,Error(`[FAIL] Store 未初始化且无法自动初始化
69
-
70
- `+`原因: ${Z instanceof Error?Z.message:"未知错误"}
71
-
72
- `+`请确保:
73
- `+`1. 配置文件格式正确 (~/.blade/config.json)
74
- `+`2. 运行 blade 进行首次配置
75
- `+"3. 配置文件权限正确")}finally{I=null}})(),I}var aX=()=>q().config.config?.models??[],tX=()=>{let Q=v();if(!Q)return;let Z=Q.currentModelId;return Q.models.find(($)=>$.id===Z)??Q.models[0]},eX=(Q)=>{let Z=v();if(!Z)return;return Z.models.find((X)=>X.id===Q)},QZ=()=>q().config.config?.mcpServers??{},XZ=()=>q().app.thinkingModeEnabled,ZZ=()=>({setPermissionMode:async(Q)=>{q().config.actions.updateConfig({permissionMode:Q})},setTheme:async(Q,Z={})=>{try{QQ.setTheme(Q)}catch{return}q().config.actions.updateConfig({theme:Q}),await A().save({theme:Q},{scope:"global",...Z})},setLanguage:async(Q,Z={})=>{q().config.actions.updateConfig({language:Q}),await A().save({language:Q},{scope:"global",...Z})},setDebug:async(Q,Z={})=>{q().config.actions.updateConfig({debug:Q}),await A().save({debug:Q},{scope:"global",...Z})},setTemperature:async(Q,Z={})=>{q().config.actions.updateConfig({temperature:Q}),await A().save({temperature:Q},{scope:"global",...Z})},updateConfig:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");let $={...X};q().config.actions.updateConfig(Q);try{await A().save(Q,Z)}catch(Y){throw q().config.actions.setConfig($),Y}},flush:async()=>{await A().flush()},appendPermissionAllowRule:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");let $=X.permissions?.allow||[];if(!$.includes(Q)){let Y=[...$,Q];q().config.actions.updateConfig({permissions:{...X.permissions,allow:Y}})}await A().appendPermissionRule(Q,Z)},appendLocalPermissionAllowRule:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");let $=X.permissions?.allow||[];if(!$.includes(Q)){let Y=[...$,Q];q().config.actions.updateConfig({permissions:{...X.permissions,allow:Y}})}await A().appendLocalPermissionRule(Q,Z)},setCurrentModel:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");if(!X.models.find((Y)=>Y.id===Q))throw Error(`Model not found: ${Q}`);q().config.actions.updateConfig({currentModelId:Q}),await A().save({currentModelId:Q},{scope:"global",...Z})},addModel:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");let $="id"in Q?Q:{id:rQ(),...Q},V={models:[...X.models,$]};if(X.models.length===0)V.currentModelId=$.id;return q().config.actions.updateConfig(V),await A().save(V,{scope:"global",...Z}),$},updateModel:async(Q,Z,X={})=>{let $=v();if(!$)throw Error("Config not initialized");let Y=$.models.findIndex((J)=>J.id===Q);if(Y===-1)throw Error(`Model not found: ${Q}`);let V=[...$.models];V[Y]={...V[Y],...Z},q().config.actions.updateConfig({models:V}),await A().save({models:V},{scope:"global",...X})},removeModel:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");if(X.models.length===1)throw Error("Cannot remove the only model");let $=X.models.filter((V)=>V.id!==Q),Y={models:$};if(X.currentModelId===Q)Y.currentModelId=$[0].id;q().config.actions.updateConfig(Y),await A().save(Y,{scope:"global",...Z})},addMcpServer:async(Q,Z,X={})=>{let $=v();if(!$)throw Error("Config not initialized");let V={...$.mcpServers??{},[Q]:Z};q().config.actions.updateConfig({mcpServers:V}),await A().save({mcpServers:V},{scope:"project",...X})},removeMcpServer:async(Q,Z={})=>{let X=v();if(!X)throw Error("Config not initialized");let Y={...X.mcpServers??{}};delete Y[Q],q().config.actions.updateConfig({mcpServers:Y}),await A().save({mcpServers:Y},{scope:"project",...Z})}});
76
- export{a as ha,QQ as ia,W as ja,$X as ka,JX as la,UX as ma,GX as na,jX as oa,HX as pa,zX as qa,b as ra,OX as sa,N as ta,oQ as ua,q as va,iX as wa,oX as xa,nX as ya,v as za,sX as Aa,aX as Ba,tX as Ca,eX as Da,QZ as Ea,XZ as Fa,ZZ as Ga};
@@ -1 +0,0 @@
1
- import{ga as a}from"./chunk-8jwqy5d0.js";import"./chunk-76emdpxa.js";import"./chunk-y5g06jmk.js";import"./chunk-7ycmx7c2.js";import"./chunk-set7v1rf.js";import"./chunk-j2ag7hh6.js";export{a as SpecManager};