blade-code 0.7.1 → 0.7.2
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-108p1xw7.js +1 -0
- package/dist/{chunk-a7dw8fwn.js → chunk-1mge0pzv.js} +1 -1
- package/dist/{chunk-zxddgwsb.js → chunk-1w719wd9.js} +1 -1
- package/dist/{chunk-b0q2q0ax.js → chunk-22gxb9qs.js} +2 -2
- package/dist/{chunk-56frm8dx.js → chunk-275gt6q1.js} +1 -1
- package/dist/chunk-42q476bq.js +1 -0
- package/dist/{chunk-mt1c5da4.js → chunk-4hk7wfat.js} +2 -2
- package/dist/{chunk-f8mjpmdx.js → chunk-67zx7ymj.js} +1 -1
- package/dist/chunk-7d1pn8a1.js +2 -0
- package/dist/{chunk-2dvn9y9f.js → chunk-8xdqtspw.js} +1 -1
- package/dist/{chunk-7v7s2aag.js → chunk-9zwf87ne.js} +1 -1
- package/dist/chunk-abpvdaq2.js +6 -0
- package/dist/{chunk-867h27ke.js → chunk-b6mxeey0.js} +2 -2
- package/dist/chunk-cadngkwr.js +2 -0
- package/dist/{chunk-0afbeec0.js → chunk-cfrbsnfb.js} +1 -1
- package/dist/{chunk-h7qab07x.js → chunk-cqrkeq20.js} +1 -1
- package/dist/{chunk-7z6ba6t9.js → chunk-f9b8h03c.js} +1 -1
- package/dist/chunk-g0h3rans.js +6 -0
- package/dist/chunk-hv0bzn31.js +1 -0
- package/dist/chunk-j3k2c6tm.js +1 -0
- package/dist/chunk-je6r01h4.js +1 -0
- package/dist/{chunk-xmdpc0y5.js → chunk-k18bq4mn.js} +2 -2
- package/dist/{chunk-zvk6ktj1.js → chunk-m2k4h3bs.js} +1 -1
- package/dist/chunk-m4a480k7.js +9 -0
- package/dist/chunk-nh37erd3.js +1 -0
- package/dist/{chunk-qds0yxfy.js → chunk-p6d7k1x6.js} +3 -3
- package/dist/chunk-p9pthxkm.js +6 -0
- package/dist/{chunk-1dt2y16n.js → chunk-qw2wy4jc.js} +1 -1
- package/dist/{chunk-bmxgshct.js → chunk-rmtcqc8q.js} +1 -1
- package/dist/{chunk-v1d0d4b4.js → chunk-rr62k3ar.js} +1 -1
- package/dist/{chunk-aam53te2.js → chunk-t3pyakvc.js} +2 -2
- package/dist/chunk-t6y57501.js +1533 -0
- package/dist/chunk-wc2xb6ge.js +24 -0
- package/dist/{chunk-f76d6jxg.js → chunk-wcm0nc84.js} +1 -1
- package/dist/{chunk-zm4jr1k2.js → chunk-xa8szzc6.js} +1 -1
- package/dist/{chunk-qyfdt8h1.js → chunk-z0qxaky4.js} +1 -1
- package/dist/chunk-z72cp8f5.js +150 -0
- package/dist/{chunk-dzmrdtpc.js → chunk-zcreym5g.js} +37 -34
- package/dist/chunk-ztpseq3n.js +1 -0
- package/dist/web/assets/{FilePreview-DLnUh-wQ.js → FilePreview-DXDzoFFc.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-C5KTk9XG.js → MarkdownRenderer-BVPOLK1b.js} +1 -1
- package/dist/web/assets/{McpModal-B9qJ4ewt.js → McpModal-DeTf34Fw.js} +1 -1
- package/dist/web/assets/{SettingsModal-DpeZ6cJb.js → SettingsModal-CDLkPyL-.js} +1 -1
- package/dist/web/assets/{SettingsStore-IzKtyAnM.js → SettingsStore-DYKvNeV_.js} +1 -1
- package/dist/web/assets/{SkillsModal-BDfzgJIj.js → SkillsModal-D784AUrt.js} +1 -1
- package/dist/web/assets/{TerminalPanel-B2iTF_CR.js → TerminalPanel-BosJuIct.js} +1 -1
- package/dist/web/assets/{dialog-sI3ihAze.js → dialog-CgyS_4Eo.js} +1 -1
- package/dist/web/assets/index-Abieffcr.js +10 -0
- package/dist/web/assets/index-CQ3JnuUf.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/chunk-0k8js58t.js +0 -6
- package/dist/chunk-0vd9antx.js +0 -1
- package/dist/chunk-6jezjq4h.js +0 -6
- package/dist/chunk-6k4vs71p.js +0 -1
- package/dist/chunk-70ya127f.js +0 -1
- package/dist/chunk-7ycmx7c2.js +0 -2
- package/dist/chunk-92qcc3gj.js +0 -2138
- package/dist/chunk-a2nshjdc.js +0 -49
- package/dist/chunk-a8eedntd.js +0 -6
- package/dist/chunk-d3db8wrw.js +0 -1
- package/dist/chunk-e06p3dkw.js +0 -157
- package/dist/chunk-k9h9bw13.js +0 -76
- package/dist/chunk-m51xzgwt.js +0 -1
- package/dist/chunk-qdnx9x5g.js +0 -2
- package/dist/chunk-r6paqm6d.js +0 -1
- package/dist/chunk-v0rjbvky.js +0 -9
- package/dist/chunk-vs915jzz.js +0 -1
- package/dist/chunk-zbtb3jxm.js +0 -1
- package/dist/web/assets/index-D8mo0jzF.js +0 -10
- package/dist/web/assets/index-DmXmCQOW.css +0 -1
package/package.json
CHANGED
package/dist/chunk-0k8js58t.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{p as d,q as p,r as u,s as m}from"./chunk-f8mjpmdx.js";import{t as c}from"./chunk-1dt2y16n.js";import{v as z,w as g,x as v}from"./chunk-zvk6ktj1.js";import{y as h}from"./chunk-h7qab07x.js";import{H as y,J as C,K as E,M as N,N as S}from"./chunk-92qcc3gj.js";import"./chunk-a2nshjdc.js";import"./chunk-qyfdt8h1.js";import"./chunk-aam53te2.js";import"./chunk-b0q2q0ax.js";import"./chunk-k9h9bw13.js";import"./chunk-867h27ke.js";import"./chunk-xmdpc0y5.js";import{Za as F}from"./chunk-dzmrdtpc.js";import"./chunk-f76d6jxg.js";import"./chunk-qds0yxfy.js";import{wb as O,xb as w}from"./chunk-7ycmx7c2.js";import"./chunk-v0rjbvky.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";import bq from"yargs";import{hideBin as Dq}from"yargs/helpers";import{z as $}from"zod";import{z as Q}from"zod";var W=1,D=Q.object({event_version:Q.literal(W)}),o=D.extend({type:Q.literal("content_delta"),delta:Q.string()}),a=D.extend({type:Q.literal("thinking_delta"),delta:Q.string()}),e=D.extend({type:Q.literal("thinking"),content:Q.string()}),t=D.extend({type:Q.literal("stream_end")}),qq=D.extend({type:Q.literal("content"),content:Q.string()}),Gq=D.extend({type:Q.literal("tool_start"),tool_name:Q.string(),summary:Q.string(),target:Q.string().optional(),tool_kind:Q.enum(["readonly","write","execute"]).optional()}),Qq=D.extend({type:Q.literal("tool_result"),tool_name:Q.string(),summary:Q.string(),target:Q.string().optional(),tool_kind:Q.enum(["readonly","write","execute"]).optional(),success:Q.boolean().optional(),error_type:Q.string().optional(),error_message:Q.string().optional()}),Xq=D.extend({type:Q.literal("phase"),phase:Q.enum(["turn","searching","inspecting","target_hit","executing","completed"]),status:Q.enum(["ongoing","hit","done"]),message:Q.string(),turn:Q.number().optional(),tool_name:Q.string().optional(),target:Q.string().optional()}),Yq=D.extend({type:Q.literal("tool_detail"),tool_name:Q.string(),detail:Q.string()}),Zq=D.extend({type:Q.literal("task_update"),tasks:Q.array(N)}),$q=D.extend({type:Q.literal("token_usage"),input_tokens:Q.number(),output_tokens:Q.number(),total_tokens:Q.number(),max_context_tokens:Q.number()}),Uq=D.extend({type:Q.literal("compacting"),state:Q.enum(["started","completed"])}),Kq=D.extend({type:Q.literal("turn_limit"),turns_count:Q.number(),action:Q.literal("continue")}),Vq=D.extend({type:Q.literal("output"),content:Q.string(),exit_code:Q.number()}),_q=D.extend({type:Q.literal("error"),message:Q.string()}),Tq=Q.discriminatedUnion("type",[o,a,e,t,qq,Gq,Qq,Xq,Yq,Zq,$q,Uq,Kq,Vq,_q]);function k(G,Y){return{event_version:W,type:G,...Y}}function Aq(G){if(G?.signal)return{signal:G.signal,dispose:()=>{return}};let Y=new AbortController,Z=()=>Y.abort("interrupt");return process.once("SIGINT",Z),process.once("SIGTERM",Z),{signal:Y.signal,dispose:()=>{process.removeListener("SIGINT",Z),process.removeListener("SIGTERM",Z)}}}var Mq=$.enum(["text","jsonl"]),Rq=$.object({headless:$.boolean().optional(),message:$.string().optional(),_:$.array($.union([$.string(),$.number()])).optional(),model:$.string().optional(),systemPrompt:$.string().optional(),appendSystemPrompt:$.string().optional(),maxTurns:$.number().int().refine((G)=>G===-1||G>0,{message:"must be -1 or a positive integer"}).optional(),permissionMode:$.nativeEnum(O).optional(),mcpConfig:$.array($.string()).optional(),strictMcpConfig:$.boolean().optional(),sessionId:$.string().optional(),allowedTools:$.array($.string()).optional(),disallowedTools:$.array($.string()).optional(),agents:$.string().optional(),continue:$.boolean().optional(),resume:$.union([$.string(),$.boolean()]).optional(),forkSession:$.boolean().optional(),outputFormat:Mq.optional()});class l{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened(G){this.openedThinking=G}hasOpenThinking(){return this.openedThinking}completeStream(){let G={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,G}}function jq(G){return G.issues.map((Y)=>`${Y.path.join(".")||"options"}: ${Y.message}`).join("; ")}function fq(G){let Y=Rq.safeParse(G);if(!Y.success)throw Error(`Invalid headless options: ${jq(Y.error)}`);return Y.data}function Bq(G){return G.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",(Y)=>Y.positional("message",{describe:"Message to process",type:"string"}).option("headless",{type:"boolean",describe:"Run full agent loop without Ink UI and print events to the terminal"}).option("model",{describe:"Model ID for this run",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}).option("output-format",{alias:["outputFormat"],choices:["text","jsonl"],describe:"Headless output format",type:"string"}),async(Y)=>{if(!Y.headless)return;let Z=await Nq(Y);process.exit(Z)})}function A(G,Y=""){G.write(`${Y}
|
|
2
|
-
`)}function Iq(G){return`[task] [${G.status}] ${G.subject}`}function Jq(){return{requestConfirmation:async(G)=>({approved:!0,reason:"headless-auto-approved",scope:"session"})}}function xq(G){if(!(G instanceof Error))return"Unknown error";let q=G.lastError??G;if(q.responseBody)try{let V=JSON.parse(q.responseBody)?.error?.message;if(V)return q.statusCode?`${V} (HTTP ${q.statusCode})`:V}catch{}let X=G.message.match(/Last error:\s*(.+)$/);if(X)return X[1];return G.message}function Pq(G){return G==="jsonl"?"jsonl":"text"}function H(G,Y){let Z=(...q)=>{for(let X of q){let _=Y[X];if(typeof _==="string"&&_.trim()!=="")return _}return};switch(G){case"Read":case"Edit":case"Write":case"UndoEdit":return Z("file_path");case"NotebookEdit":return Z("notebook_path");case"Grep":return Z("path","pattern");case"Glob":return Z("pattern");case"WebFetch":return Z("url");case"WebSearch":return Z("query");case"Bash":return Z("command","description");case"Task":return Z("description");case"LSP":return Z("filePath","operation");case"EnterWorktree":return Z("name");case"ExitWorktree":return Z("action");default:return}}function Lq(G,Y,Z,q){let X=new Set(["Glob","Grep","WebSearch","LS"]),_=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","NotebookEdit","Bash","LSP","UndoEdit","EnterWorktree","ExitWorktree"]).has(G)&&!q.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${Y}`,shouldLockTarget:!0};if(q.targetLocked)return{phase:"executing",status:"hit",message:Z?`Working within target: ${Y}`:`Executing: ${Y}`,shouldLockTarget:!1};if(X.has(G))return{phase:"searching",status:"ongoing",message:`Still searching: ${Y}`,shouldLockTarget:!1};if(_.has(G))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${Y}`,shouldLockTarget:!1};return{phase:"executing",status:q.targetLocked?"hit":"ongoing",message:`Executing: ${Y}`,shouldLockTarget:!1}}function T(G,Y){let Z=(q,X)=>{G.stdout.write(`${JSON.stringify(k(q,X))}
|
|
3
|
-
`)};return{contentDelta(q){if(Y==="jsonl"){Z("content_delta",{delta:q});return}G.stdout.write(q)},thinkingDelta(q,X){if(Y==="jsonl")return Z("thinking_delta",{delta:q}),X;if(!X)G.stderr.write("[thinking] ");return G.stderr.write(q),!0},thinking(q){if(Y==="jsonl"){Z("thinking",{content:q});return}A(G.stderr,`[thinking] ${q}`)},streamEnd(q,X){if(Y==="jsonl"){Z("stream_end",{});return}if(X)G.stderr.write(`
|
|
4
|
-
`);if(q)G.stdout.write(`
|
|
5
|
-
`)},content(q){if(Y==="jsonl"){Z("content",{content:q});return}A(G.stdout,q)},toolStart(q,X,_,V){if(Y==="jsonl"){Z("tool_start",{tool_name:q,summary:X,target:_,tool_kind:V});return}A(G.stderr,`[tool:start] ${X}`)},toolResult(q,X,_,V,M){if(Y==="jsonl"){Z("tool_result",{tool_name:q,summary:X,target:_,tool_kind:V,success:M?.success,error_type:M?.errorType,error_message:M?.errorMessage});return}A(G.stderr,`[tool:result] ${X}`)},phase(q,X,_,V={}){if(Y==="jsonl"){Z("phase",{phase:q,status:X,message:_,turn:V.turn,tool_name:V.toolName,target:V.target});return}A(G.stderr,`[phase:${q}] ${_}`)},toolDetail(q,X){if(Y==="jsonl"){Z("tool_detail",{tool_name:q,detail:X});return}A(G.stderr,X)},taskUpdate(q){if(Y==="jsonl"){Z("task_update",{tasks:q});return}for(let X of q)A(G.stderr,Iq(X))},tokenUsage(q){if(Y==="jsonl"){Z("token_usage",{input_tokens:q.inputTokens,output_tokens:q.outputTokens,total_tokens:q.totalTokens,max_context_tokens:q.maxContextTokens});return}A(G.stderr,`[tokens] in=${q.inputTokens} out=${q.outputTokens} total=${q.totalTokens} / ${q.maxContextTokens}`)},compacting(q){if(Y==="jsonl"){Z("compacting",{state:q?"started":"completed"});return}A(G.stderr,q?"[context] compacting started":"[context] compacting completed")},turnLimit(q){if(Y==="jsonl"){Z("turn_limit",{turns_count:q,action:"continue"});return}A(G.stderr,`[turn-limit] continuing after ${q} turns`)},output(q,X=0){if(Y==="jsonl"){Z("output",{content:q,exit_code:X});return}A(X===0?G.stdout:G.stderr,q)},error(q){if(Y==="jsonl"){Z("error",{message:q});return}A(G.stderr,q)}}}async function Nq(G,Y={stdout:process.stdout,stderr:process.stderr},Z){let q="text",X=T(Y,q),_=new l,V={targetLocked:!1},M,R=Aq(Z);try{let K=fq(G);q=Pq(K.outputFormat),X=T(Y,q),await d();let i=await p(K),j=await u(i);if(j.mode==="output"){if(j.content)X.output(j.content,j.exitCode??0);return j.exitCode??0}let L=K.permissionMode??"yolo",{sessionId:x,messages:n}=await m({sessionId:K.sessionId,continue:K.continue,resume:K.resume,forkSession:K.forkSession,fallbackSessionPrefix:"headless"}),r={messages:[...n],userId:"cli-user",sessionId:x,workspaceRoot:w(),permissionMode:L,signal:R.signal,confirmationHandler:Jq()};M=await y.create({sessionId:x,modelId:K.model,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig,agents:K.agents?h(K.agents):void 0});let s=await S.createWithRuntime(M,{sessionId:x,systemPrompt:K.systemPrompt,appendSystemPrompt:K.appendSystemPrompt,maxTurns:K.maxTurns,modelId:K.model,permissionMode:L,toolWhitelist:K.allowedTools,toolBlacklist:K.disallowedTools,mcpConfig:K.mcpConfig,strictMcpConfig:K.strictMcpConfig}),P=await F(s.chatStream(j.content,r,{stream:!0,signal:R.signal,maxTurns:K.maxTurns,onTurnLimitReached:async(b)=>{return X.turnLimit(b.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}),async(b)=>{switch(b.kind){case"content_delta":_.markAssistantContent(),X.contentDelta(b.delta);break;case"thinking_delta":_.setThinkingOpened(X.thinkingDelta(b.delta,_.hasOpenThinking()));break;case"stream_end":{let U=_.completeStream();X.streamEnd(U.wroteAssistantContent,U.openedThinking);break}case"tool_start":{let U=b.toolCall;if(!("function"in U))break;if(["TaskCreate","TaskUpdate","TaskList"].includes(U.function.name))break;try{let f=JSON.parse(U.function.arguments),B=C(U.function.name,f),I=H(U.function.name,f),J=Lq(U.function.name,B,I,V);if(J.shouldLockTarget)V.targetLocked=!0;X.phase(J.phase,J.status,J.message,{toolName:U.function.name,target:I}),X.toolStart(U.function.name,B,I,b.toolKind)}catch{X.phase(V.targetLocked?"executing":"searching",V.targetLocked?"hit":"ongoing",V.targetLocked?`Working within target: ${U.function.name}`:`Still searching: ${U.function.name}`,{toolName:U.function.name}),X.toolStart(U.function.name,U.function.name,void 0,b.toolKind)}break}case"tool_result":{let U=b.toolCall;if(!("function"in U))break;let f;try{let I=JSON.parse(U.function.arguments);f=H(U.function.name,I)}catch{f=void 0}let B=E(U.function.name,b.result);if(X.toolResult(U.function.name,B.summary,f,void 0,{success:b.result.success,errorType:b.result.error?.type,errorMessage:b.result.error?.message}),B.detail)X.toolDetail(U.function.name,B.detail);break}case"token_usage":X.tokenUsage(b.usage);break;case"compaction":X.compacting(b.phase==="start");break;case"task_update":X.taskUpdate(b.tasks);break;case"subagent_spawned":case"subagent_completed":break;case"model_fallback":break;case"turn_start":if(b.turn===1)V.targetLocked=!1;X.phase("turn",V.targetLocked?"hit":"ongoing",`Turn ${b.turn} started`,{turn:b.turn});break;default:{let U=b}}});if(P.metadata?.outputTruncated)X.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");if(!P.success)return X.error(`Error: ${P.error?.message??"Agent execution failed"}`),1;return X.phase("completed","done","Headless run completed"),0}catch(K){if(_.hasOpenThinking()&&q==="text")Y.stderr.write(`
|
|
6
|
-
`);return X.error(`Error: ${xq(K)}`),1}finally{try{await M?.dispose()}finally{R.dispose()}}}async function lq(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:Z,"output-format":q,"system-prompt":X,"append-system-prompt":_,"max-turns":V,...M}=c,R=bq(Dq(process.argv)).scriptName("blade").strict(!1).options(M).middleware([g,z,v]);return Bq(R),await R.parse(),!0}export{Nq as runHeadless,lq as handleHeadlessMode,Rq as HeadlessOptionsSchema};
|
package/dist/chunk-0vd9antx.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Aa as k,Ba as l,Ca as m,qa as a,ra as b,sa as c,ta as d,ua as e,va as f,wa as g,xa as h,ya as i,za as j}from"./chunk-k9h9bw13.js";import"./chunk-867h27ke.js";import"./chunk-7ycmx7c2.js";import"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";export{a as vanillaStore,c as sessionActions,l as getThinkingModeEnabled,b as getState,j as getModelById,e as getMessages,k as getMcpServers,i as getCurrentModel,f as getConfig,h as getAllModels,g as ensureStoreInitialized,m as configActions,d as appActions};
|
package/dist/chunk-6jezjq4h.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{B as W,H as L,K as P,L as T,N as R,Q as U,T as M,V as h,W as j}from"./chunk-92qcc3gj.js";import"./chunk-a2nshjdc.js";import"./chunk-qyfdt8h1.js";import{$ as y}from"./chunk-aam53te2.js";import"./chunk-b0q2q0ax.js";import{va as A}from"./chunk-k9h9bw13.js";import"./chunk-867h27ke.js";import"./chunk-xmdpc0y5.js";import{Za as f}from"./chunk-dzmrdtpc.js";import"./chunk-f76d6jxg.js";import"./chunk-qds0yxfy.js";import{xb as B}from"./chunk-7ycmx7c2.js";import"./chunk-v0rjbvky.js";import{Ob as _}from"./chunk-mt1c5da4.js";import"./chunk-0afbeec0.js";import{Readable as v,Writable as c}from"node:stream";import*as w from"@agentclientprotocol/sdk";import{PROTOCOL_VERSION as u}from"@agentclientprotocol/sdk";import{nanoid as C}from"nanoid";import{nanoid as K}from"nanoid";var Y=_("Agent");function N(z){return Object.fromEntries(z.map((G)=>[G.name,G.value]))}function b(z){if("command"in z)return{type:"stdio",command:z.command,args:z.args,env:N(z.env)};return{type:z.type,url:z.url,headers:N(z.headers)}}function k(z){return Object.fromEntries(z.map((G)=>[G.name,b(G)]))}function S(z){if(typeof z==="string")return z?[{type:"text",text:z}]:[];return z.flatMap((G)=>{if(G.type==="text")return G.text?[{type:"text",text:G.text}]:[];let H=G.image_url.url,J=/^data:([^;,]+);base64,(.+)$/s.exec(H);if(!J)return[{type:"text",text:"[Image]"}];return[{type:"image",mimeType:J[1]??"image/png",data:J[2]??""}]})}class D{id;cwd;connection;clientCapabilities;options;agent=null;runtime=null;pendingPrompt=null;messages;mode="default";sessionApprovals=new Set;constructor(z,G,H,J,Q={}){this.id=z;this.cwd=G;this.connection=H;this.clientCapabilities=J;this.options=Q;this.messages=[...Q.initialMessages??[]]}async initialize(){Y.debug(`[AcpSession ${this.id}] Initializing...`),W.initializeSession(this.connection,this.id,this.clientCapabilities,this.cwd),Y.debug(`[AcpSession ${this.id}] ACP service context initialized`);let z=this.options.mcpServers?k(this.options.mcpServers):void 0;this.runtime=await L.create({sessionId:this.id,...z?{mcpServers:z}:{}}),this.agent=await R.createWithRuntime(this.runtime,{sessionId:this.id}),Y.debug(`[AcpSession ${this.id}] Agent created successfully`)}async replayHistory(){for(let z of this.messages){let G=z.role==="user"?"user_message_chunk":z.role==="assistant"?"agent_message_chunk":void 0;if(!G)continue;for(let H of S(z.content))await this.connection.sessionUpdate({sessionId:this.id,update:{sessionUpdate:G,content:H}})}}sendAvailableCommandsDelayed(){Y.debug(`[AcpSession ${this.id}] Scheduling available commands update (500ms delay)`),setTimeout(()=>{this.sendAvailableCommands()},500)}async handleSlashCommand(z,G){try{Y.debug(`[AcpSession ${this.id}] Executing slash command: ${z}`);let H={cwd:this.cwd,signal:G,acp:{sendMessage:(X)=>{this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:X}})},sendToolStart:(X,Z,E)=>{let $=`tool_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,F=this.mapToolKind(E);this.sendUpdate({sessionUpdate:"tool_call",toolCallId:$,status:"in_progress",title:`${X}`,content:[{type:"content",content:{type:"text",text:JSON.stringify(Z,null,2)}}],kind:F})},sendToolResult:(X,Z)=>{if(Z.summary)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Z.summary}})}}},J=await h(z,H),Q=J.content||J.message;if(Q)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Q}});if(J.error)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[FAIL] ${J.error}`}});return{stopReason:J.success?"end_turn":"cancelled"}}catch(H){return Y.error(`[AcpSession ${this.id}] Slash command error:`,H),this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[FAIL] 命令执行失败: ${H instanceof Error?H.message:"未知错误"}`}}),{stopReason:"cancelled"}}}async sendAvailableCommands(){try{let z=j(),G=["model","permissions","theme","config","exit","ide"],J=z.filter((Q)=>!G.includes(Q.name)).map((Q)=>{let X;if(Q.usage){let Z=Q.usage.replace(/^\/\w+\s*/,"").trim();if(Z)X=Z}if(Q.aliases?.length){let Z=`Aliases: ${Q.aliases.join(", ")}`;X=X?`${X} | ${Z}`:Z}return{name:Q.name,description:Q.description,input:X?{hint:X}:void 0}});Y.info(`[AcpSession ${this.id}] Sending available commands: ${JSON.stringify(J.map((Q)=>Q.name))}`),this.sendUpdate({sessionUpdate:"available_commands_update",availableCommands:J}),Y.info(`[AcpSession ${this.id}] Sent ${J.length} available commands`)}catch(z){Y.error(`[AcpSession ${this.id}] Failed to send available commands:`,z)}}async prompt(z){W.setCurrentSession(this.id),this.pendingPrompt?.abort();let G=new AbortController;if(this.pendingPrompt=G,!this.agent)throw Error("Session not initialized");try{let H=this.resolvePrompt(z.prompt);if(Y.debug(`[AcpSession ${this.id}] Received prompt: ${H.slice(0,100)}...`),M(H))return await this.handleSlashCommand(H,G.signal);let J={sessionId:this.id,userId:"acp-user",workspaceRoot:this.cwd,messages:[...this.messages],signal:G.signal,permissionMode:this.mapModeToPermissionMode(),confirmationHandler:{requestConfirmation:async(Q)=>{return this.requestPermission(Q)}}};if(await f(this.agent.chatStream(H,J),async(Q)=>{switch(Q.kind){case"content_delta":this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Q.delta}});break;case"thinking_delta":this.sendUpdate({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:Q.delta}});break;case"tool_start":{let X=Q.toolCall,Z="function"in X?X.function.name:X.type,E=this.mapToolKind(Q.toolKind);this.sendUpdate({sessionUpdate:"tool_call",toolCallId:X.id,status:"in_progress",title:`Executing ${Z}`,content:[],kind:E});break}case"tool_result":{let{toolCall:X,result:Z}=Q,E=[],$=Z.metadata;if($?.kind==="edit"&&typeof $.file_path==="string"&&typeof $.oldContent==="string"&&(typeof $.newContent==="string"||$.newContent===void 0))E.push({type:"diff",path:$.file_path,oldText:$.oldContent,newText:$.newContent??null});else{let V="function"in X?X.function.name:X.type,x=T(P(V,Z));E.push({type:"content",content:{type:"text",text:x}})}let F=Z.success?"completed":"failed";this.sendUpdate({sessionUpdate:"tool_call_update",toolCallId:X.id,status:F,content:E});break}case"task_update":this.sendPlanUpdate(Q.tasks);break;default:break}}),this.messages=[...J.messages],G.signal.aborted)return{stopReason:"cancelled"};return{stopReason:"end_turn"}}catch(H){if(G.signal.aborted||H instanceof Error&&H.name==="AbortError")return{stopReason:"cancelled"};throw Y.error(`[AcpSession ${this.id}] Prompt error:`,H),H}finally{if(this.pendingPrompt===G)this.pendingPrompt=null}}cancel(){if(Y.info(`[AcpSession ${this.id}] Cancel requested`),this.pendingPrompt)this.pendingPrompt.abort(),this.pendingPrompt=null,Y.info(`[AcpSession ${this.id}] Cancelled successfully`);else Y.warn(`[AcpSession ${this.id}] No pending prompt to cancel`)}async setMode(z){let G=["default","auto-edit","yolo","plan"];this.mode=G.includes(z)?z:"default",Y.info(`[AcpSession ${this.id}] Mode set to: ${this.mode}`),this.sendUpdate({sessionUpdate:"current_mode_update",currentModeId:this.mode})}mapModeToPermissionMode(){switch(this.mode){case"yolo":return"yolo";case"auto-edit":return"autoEdit";case"plan":return"plan";case"default":default:return"default"}}shouldAutoApprove(z){switch(this.mode){case"yolo":return!0;case"auto-edit":return z==="readonly"||z==="write";case"plan":return z==="readonly";case"default":default:return!1}}async setModel(z){if(Y.info(`[AcpSession ${this.id}] Model set to: ${z}`),this.pendingPrompt)throw Error("Cannot switch models while a prompt is active");if(!this.agent)throw Error("Session not initialized");await this.agent.switchModel(z)}async destroy(){if(this.cancel(),this.agent)await this.agent.destroy(),this.agent=null;if(this.runtime)await this.runtime.dispose(),this.runtime=null;W.destroySession(this.id),Y.debug(`[AcpSession ${this.id}] Destroyed`)}resolvePrompt(z){let G=[];for(let H of z)if(H.type==="text")G.push(H.text);else if(H.type==="image")G.push(`[Image: ${H.mimeType}]`);else if(H.type==="resource"){let J=H.resource;if("text"in J)G.push(`<file path="${J.uri}">
|
|
2
|
-
${J.text}
|
|
3
|
-
</file>`)}else if(H.type==="resource_link")G.push(`[Resource: ${H.uri}]`);return G.join(`
|
|
4
|
-
`)}sendUpdate(z){let G={sessionId:this.id,update:z};this.connection.sessionUpdate(G).catch((H)=>{Y.warn(`[AcpSession ${this.id}] Failed to send update:`,H)})}sendPlanUpdate(z){let G=z.map((H)=>({content:H.subject,priority:H.priority,status:H.status}));Y.debug(`[AcpSession ${this.id}] Sending plan update with ${G.length} entries`),this.sendUpdate({sessionUpdate:"plan",entries:G})}async requestPermission(z){let G=z.kind?.toLowerCase()||"execute";if(this.shouldAutoApprove(G))return Y.debug(`[AcpSession ${this.id}] Auto-approving ${G} in mode: ${this.mode}`),{approved:!0};if(this.mode==="plan"&&(G==="write"||G==="execute"))return Y.debug(`[AcpSession ${this.id}] Rejecting ${G} in plan mode`),{approved:!1,reason:"Write and execute operations are not allowed in Plan mode"};let H=`${G}:${z.title||"unknown"}`;if(this.sessionApprovals.has(H))return Y.debug(`[AcpSession ${this.id}] Using cached approval for: ${H}`),{approved:!0};try{let J=K(),Q=[];if(z.message)Q.push({type:"content",content:{type:"text",text:z.message}});if(z.risks&&z.risks.length>0)Q.push({type:"content",content:{type:"text",text:`Risks:
|
|
5
|
-
- ${z.risks.join(`
|
|
6
|
-
- `)}`}});let X=this.mapToolKind(G),Z={sessionId:this.id,options:[{optionId:"allow_once",name:"Allow once",kind:"allow_once"},{optionId:"allow_always",name:"Always allow",kind:"allow_always"},{optionId:"reject_once",name:"Deny once",kind:"reject_once"},{optionId:"reject_always",name:"Always deny",kind:"reject_always"}],toolCall:{toolCallId:J,status:"pending",title:z.title||"Permission Required",content:Q,kind:X}},$=(await this.connection.requestPermission(Z)).outcome;if($.outcome==="cancelled")return{approved:!1,reason:"User cancelled the permission request"};let F=$.optionId,V=F==="allow_once"||F==="allow_always";if(F==="allow_always")this.sessionApprovals.add(H),Y.debug(`[AcpSession ${this.id}] Cached approval for: ${H}`);return{approved:V,reason:V?void 0:"User denied the operation"}}catch(J){return Y.warn(`[AcpSession ${this.id}] Permission request failed:`,J),{approved:!1,reason:"Permission request failed"}}}mapToolKind(z){return{readonly:"read",write:"edit",execute:"execute",read:"read",edit:"edit",delete:"delete",move:"move",search:"search",think:"think",fetch:"fetch"}[z||""]||"other"}}var q=_("Agent");class O{connection;sessions=new Map;clientCapabilities;constructor(z){this.connection=z}async initialize(z){return q.info("[BladeAgent] Initializing ACP connection"),q.debug(`[BladeAgent] Client capabilities: ${JSON.stringify(z.clientCapabilities)}`),this.clientCapabilities=z.clientCapabilities,{protocolVersion:u,agentCapabilities:{loadSession:!0,promptCapabilities:{image:!0,audio:!1,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0}}}}async authenticate(z){return}async newSession(z){let G=C();q.info(`[BladeAgent] Creating new session: ${G}`),q.debug(`[BladeAgent] Session cwd: ${z.cwd||B()}`);let H=new D(G,z.cwd||B(),this.connection,this.clientCapabilities,{mcpServers:z.mcpServers});try{await H.initialize()}catch(J){throw await H.destroy().catch(()=>{return}),J}return this.sessions.set(G,H),q.info(`[BladeAgent] Session ${G} created, scheduling available commands update`),H.sendAvailableCommandsDelayed(),{sessionId:G,...this.buildSessionState()}}async loadSession(z){q.info(`[BladeAgent] Loading session: ${z.sessionId}`);let G=await U.loadSession(z.sessionId,z.cwd),H=this.sessions.get(z.sessionId);if(H)await H.destroy(),this.sessions.delete(z.sessionId),G=await U.loadSession(z.sessionId,z.cwd);let J=new D(z.sessionId,z.cwd,this.connection,this.clientCapabilities,{initialMessages:G,mcpServers:z.mcpServers});try{await J.initialize(),await J.replayHistory()}catch(Q){throw await J.destroy().catch(()=>{return}),Q}return this.sessions.set(z.sessionId,J),J.sendAvailableCommandsDelayed(),this.buildSessionState()}buildSessionState(){let z=A(),G=z?.models||[],H=z?.currentModelId||G[0]?.id,J=G.map((X)=>({modelId:X.id,name:X.name||X.id,description:X.provider?`Provider: ${X.provider}`:void 0}));return{modes:{availableModes:[{id:"default",name:"Default",description:"Ask for confirmation before all file edits and commands"},{id:"auto-edit",name:"Auto Edit",description:"Auto-approve file edits, ask for shell commands"},{id:"yolo",name:"Full Auto",description:"Auto-approve everything without confirmation"},{id:"plan",name:"Plan Only",description:"Read-only mode, no file changes or commands"}],currentModeId:"default"},models:J.length>0?{availableModels:J,currentModelId:H}:void 0}}async prompt(z){let G=this.sessions.get(z.sessionId);if(!G)throw Error(`Session not found: ${z.sessionId}`);return G.prompt(z)}async cancel(z){q.info(`[BladeAgent] Cancel notification received for session: ${z.sessionId}`);let G=this.sessions.get(z.sessionId);if(G)q.info("[BladeAgent] Found session, calling session.cancel()"),G.cancel();else q.warn(`[BladeAgent] Session not found for cancel: ${z.sessionId}`)}async setSessionMode(z){q.info(`[BladeAgent] Setting session mode: ${z.modeId}`);let G=this.sessions.get(z.sessionId);if(G)await G.setMode(z.modeId);return{}}async unstable_setSessionModel(z){q.info(`[BladeAgent] Setting session model: ${z.modelId}`);let G=this.sessions.get(z.sessionId);if(!G)throw Error(`Session not found: ${z.sessionId}`);return await G.setModel(z.modelId),{}}async destroy(){for(let z of this.sessions.values())await z.destroy();this.sessions.clear(),await y.getInstance().disconnectAll()}}async function qz(){let z=c.toWeb(process.stdout),G=v.toWeb(process.stdin),H=w.ndJsonStream(z,G);await new w.AgentSideConnection((Q)=>new O(Q),H).closed}export{qz as runAcpIntegration};
|
package/dist/chunk-6k4vs71p.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a,b,c,d,e}from"./chunk-7v7s2aag.js";import"./chunk-0afbeec0.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
|
package/dist/chunk-70ya127f.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ha as a,Ia as b,Ja as c,Ka as d,La as e,Ma as f}from"./chunk-xmdpc0y5.js";import"./chunk-0afbeec0.js";export{b as getVersion,c as getPackageName,a as getPackageInfo,e as getFormattedVersion,d as getDescription,f as getCopyright};
|
package/dist/chunk-7ycmx7c2.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{realpathSync as G}from"fs";import{cwd as K}from"process";var D=null;function N(){let q="";if(typeof process<"u"&&typeof process.cwd==="function"&&typeof G==="function"){let F=K();try{q=G(F).normalize("NFC")}catch{q=F.normalize("NFC")}}return{cwd:q,originalCwd:q,projectRoot:q}}function B(){if(!D)D=N();return D}function H(){return B().cwd}function Z(q){B().cwd=q.normalize("NFC")}function J(){return B().originalCwd}function $(){return B().projectRoot}function b(q){B().projectRoot=q.normalize("NFC")}var Q;((x)=>{x.DEFAULT="default";x.AUTO_EDIT="autoEdit";x.YOLO="yolo";x.PLAN="plan";x.SPEC="spec"})(Q||={});import{AsyncLocalStorage as R}from"async_hooks";var U=new R;function V(){return U.getStore()??H()}function W(){try{return V()}catch{return J()}}
|
|
2
|
-
export{Z as sb,J as tb,$ as ub,b as vb,Q as wb,W as xb};
|