blade-code 0.6.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/blade.js +2 -2
- package/dist/{chunk-s53zeref.js → chunk-0afbeec0.js} +1 -1
- package/dist/chunk-2nnak657.js +6 -0
- package/dist/chunk-31chcjw6.js +2 -0
- package/dist/chunk-64jv62vs.js +1 -0
- package/dist/chunk-6f63v1mk.js +2 -0
- package/dist/{chunk-gn1acna6.js → chunk-7z6ba6t9.js} +1 -1
- package/dist/chunk-93xhspe5.js +1 -0
- package/dist/{chunk-8fq1wzv3.js → chunk-96w1szbp.js} +1 -1
- package/dist/{chunk-zfy765hj.js → chunk-c2b6ekqx.js} +1 -1
- package/dist/chunk-e21htmg4.js +2 -0
- package/dist/chunk-f76d6jxg.js +1 -0
- package/dist/chunk-fehae50v.js +1 -0
- package/dist/chunk-ft5nt5b5.js +6 -0
- package/dist/chunk-gertm8dw.js +157 -0
- package/dist/{chunk-b5nhr3na.js → chunk-gscq4fmx.js} +2 -2
- package/dist/{chunk-m7xm1ssb.js → chunk-gxnwrec6.js} +1 -1
- package/dist/{chunk-y57hcnk6.js → chunk-hc08zg54.js} +1 -1
- package/dist/chunk-hscq9623.js +1 -0
- package/dist/chunk-k4behavv.js +2 -0
- package/dist/{chunk-99gfk9b2.js → chunk-kk8akm7s.js} +1 -1
- package/dist/chunk-kpq18y6v.js +6 -0
- package/dist/{chunk-67dzm8te.js → chunk-m22zeqdy.js} +4 -4
- package/dist/{chunk-21zps3hb.js → chunk-mnw1xcwn.js} +2 -2
- package/dist/{chunk-j1ehsp0x.js → chunk-mt1c5da4.js} +2 -2
- package/dist/chunk-nsbhtvqd.js +1 -0
- package/dist/chunk-p9s685ta.js +1 -0
- package/dist/{chunk-63954vzc.js → chunk-pf33bn8s.js} +1 -1
- package/dist/chunk-phnararg.js +1 -0
- package/dist/{chunk-r9vneqaw.js → chunk-pkzy724w.js} +6 -6
- package/dist/{chunk-g54k7rea.js → chunk-q6c9qs9b.js} +2 -2
- package/dist/chunk-rzz6r1g9.js +41 -0
- package/dist/{chunk-7rjrzngk.js → chunk-sw6ngzbg.js} +1 -1
- package/dist/chunk-tn3xjczg.js +4 -0
- package/dist/chunk-v97f7je6.js +2138 -0
- package/dist/chunk-vzebrztg.js +9 -0
- package/dist/{chunk-39h8jdm3.js → chunk-wre40mf1.js} +1 -1
- package/dist/chunk-x46rv9sv.js +6 -0
- package/dist/chunk-ygta7118.js +1 -0
- package/dist/chunk-zd9stbct.js +618 -0
- package/dist/chunk-zjh9qqvq.js +1 -0
- package/dist/{chunk-9m9nqfc4.js → chunk-zmp3vdcj.js} +1 -1
- package/dist/web/assets/{FilePreview-R1mRzyRz.js → FilePreview-DLnUh-wQ.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-B46lJYAn.js → MarkdownRenderer-C5KTk9XG.js} +1 -1
- package/dist/web/assets/{McpModal-QRv5Ij61.js → McpModal-B9qJ4ewt.js} +1 -1
- package/dist/web/assets/{SettingsModal-D-mi6mUR.js → SettingsModal-DpeZ6cJb.js} +1 -1
- package/dist/web/assets/{SettingsStore-Dmo3sZ_R.js → SettingsStore-IzKtyAnM.js} +1 -1
- package/dist/web/assets/{SkillsModal-DNXjbjEs.js → SkillsModal-BDfzgJIj.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DG_Q4UKr.js → TerminalPanel-B2iTF_CR.js} +1 -1
- package/dist/web/assets/{dialog-CsiChiYt.js → dialog-sI3ihAze.js} +1 -1
- package/dist/web/assets/{index-BeYCsOvo.js → index-D8mo0jzF.js} +8 -8
- package/dist/web/index.html +1 -1
- package/package.json +5 -2
- package/dist/chunk-08h3wmqh.js +0 -1
- package/dist/chunk-0b3f8r1e.js +0 -6
- package/dist/chunk-3ak4p05x.js +0 -1
- package/dist/chunk-563zye36.js +0 -1
- package/dist/chunk-5v2jzxpw.js +0 -2
- package/dist/chunk-8a2z6mgp.js +0 -6
- package/dist/chunk-8zh508xk.js +0 -2125
- package/dist/chunk-ambewjsk.js +0 -6
- package/dist/chunk-caw1bxy6.js +0 -1
- package/dist/chunk-drrgdzrf.js +0 -1
- package/dist/chunk-g7bw2nkz.js +0 -613
- package/dist/chunk-g7xh4e99.js +0 -1
- package/dist/chunk-gp3rn8f8.js +0 -1
- package/dist/chunk-kds0h72f.js +0 -6
- package/dist/chunk-kevt8v3j.js +0 -1
- package/dist/chunk-m1tnx0je.js +0 -157
- package/dist/chunk-n9mwp62v.js +0 -1
- package/dist/chunk-nrh2jage.js +0 -2
- package/dist/chunk-qjhxk0yp.js +0 -1
- package/dist/chunk-t344cq6m.js +0 -4
- package/dist/chunk-t44946na.js +0 -41
- package/dist/chunk-t7hd45rg.js +0 -8
package/dist/chunk-g7xh4e99.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{v as a,w as b,x as c}from"./chunk-8a2z6mgp.js";import"./chunk-21zps3hb.js";import"./chunk-67dzm8te.js";import"./chunk-39h8jdm3.js";import"./chunk-j1ehsp0x.js";import"./chunk-s53zeref.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
|
package/dist/chunk-gp3rn8f8.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as y,b as A,c as C,d as D}from"./chunk-5v2jzxpw.js";import"./chunk-m7xm1ssb.js";import"./chunk-8zh508xk.js";import"./chunk-r9vneqaw.js";import"./chunk-g54k7rea.js";import"./chunk-nrh2jage.js";import"./chunk-b5nhr3na.js";import{Aa as q}from"./chunk-21zps3hb.js";import"./chunk-67dzm8te.js";import"./chunk-g7bw2nkz.js";import"./chunk-3ak4p05x.js";import"./chunk-t44946na.js";import"./chunk-t7hd45rg.js";import"./chunk-39h8jdm3.js";import"./chunk-j1ehsp0x.js";import"./chunk-s53zeref.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/dist/chunk-kds0h72f.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{A as V,G as f,J as N,K as L,M as T,S as h,U as P,V as R}from"./chunk-8zh508xk.js";import{Y as M}from"./chunk-r9vneqaw.js";import"./chunk-g54k7rea.js";import"./chunk-nrh2jage.js";import"./chunk-b5nhr3na.js";import{za as y}from"./chunk-21zps3hb.js";import"./chunk-67dzm8te.js";import{Ta as O}from"./chunk-g7bw2nkz.js";import"./chunk-3ak4p05x.js";import"./chunk-t44946na.js";import"./chunk-t7hd45rg.js";import{yb as D}from"./chunk-39h8jdm3.js";import{Ib as W}from"./chunk-j1ehsp0x.js";import"./chunk-s53zeref.js";import{Readable as K,Writable as k}from"node:stream";import*as _ from"@agentclientprotocol/sdk";import{PROTOCOL_VERSION as I}from"@agentclientprotocol/sdk";import{nanoid as S}from"nanoid";import{nanoid as x}from"nanoid";var X=W("Agent");class B{id;cwd;connection;clientCapabilities;agent=null;runtime=null;pendingPrompt=null;messages=[];mode="default";sessionApprovals=new Set;constructor(z,G,H,Q){this.id=z;this.cwd=G;this.connection=H;this.clientCapabilities=Q}async initialize(){X.debug(`[AcpSession ${this.id}] Initializing...`),V.initializeSession(this.connection,this.id,this.clientCapabilities,this.cwd),X.debug(`[AcpSession ${this.id}] ACP service context initialized`),this.runtime=await f.create({sessionId:this.id}),this.agent=await T.createWithRuntime(this.runtime,{sessionId:this.id}),X.debug(`[AcpSession ${this.id}] Agent created successfully`)}sendAvailableCommandsDelayed(){X.debug(`[AcpSession ${this.id}] Scheduling available commands update (500ms delay)`),setTimeout(()=>{this.sendAvailableCommands()},500)}async handleSlashCommand(z,G){try{X.debug(`[AcpSession ${this.id}] Executing slash command: ${z}`);let H={cwd:this.cwd,signal:G,acp:{sendMessage:(U)=>{this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:U}})},sendToolStart:(U,Y,q)=>{let Z=`tool_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,E=this.mapToolKind(q);this.sendUpdate({sessionUpdate:"tool_call",toolCallId:Z,status:"in_progress",title:`${U}`,content:[{type:"content",content:{type:"text",text:JSON.stringify(Y,null,2)}}],kind:E})},sendToolResult:(U,Y)=>{if(Y.summary)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:Y.summary}})}}},Q=await P(z,H),J=Q.content||Q.message;if(J)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:J}});if(Q.error)this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[FAIL] ${Q.error}`}});return{stopReason:Q.success?"end_turn":"cancelled"}}catch(H){return X.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=R(),G=["model","permissions","theme","config","exit","ide"],Q=z.filter((J)=>!G.includes(J.name)).map((J)=>{let U;if(J.usage){let Y=J.usage.replace(/^\/\w+\s*/,"").trim();if(Y)U=Y}if(J.aliases?.length){let Y=`Aliases: ${J.aliases.join(", ")}`;U=U?`${U} | ${Y}`:Y}return{name:J.name,description:J.description,input:U?{hint:U}:void 0}});X.info(`[AcpSession ${this.id}] Sending available commands: ${JSON.stringify(Q.map((J)=>J.name))}`),this.sendUpdate({sessionUpdate:"available_commands_update",availableCommands:Q}),X.info(`[AcpSession ${this.id}] Sent ${Q.length} available commands`)}catch(z){X.error(`[AcpSession ${this.id}] Failed to send available commands:`,z)}}async prompt(z){V.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(X.debug(`[AcpSession ${this.id}] Received prompt: ${H.slice(0,100)}...`),h(H))return await this.handleSlashCommand(H,G.signal);let Q={sessionId:this.id,userId:"acp-user",workspaceRoot:this.cwd,messages:[...this.messages],signal:G.signal,permissionMode:this.mapModeToPermissionMode(),confirmationHandler:{requestConfirmation:async(J)=>{return this.requestPermission(J)}}};if(await O(this.agent.chatStream(H,Q),async(J)=>{switch(J.kind){case"content_delta":this.sendUpdate({sessionUpdate:"agent_message_chunk",content:{type:"text",text:J.delta}});break;case"thinking_delta":this.sendUpdate({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:J.delta}});break;case"tool_start":{let U=J.toolCall,Y="function"in U?U.function.name:U.type,q=this.mapToolKind(J.toolKind);this.sendUpdate({sessionUpdate:"tool_call",toolCallId:U.id,status:"in_progress",title:`Executing ${Y}`,content:[],kind:q});break}case"tool_result":{let{toolCall:U,result:Y}=J,q=[],Z=Y.metadata;if(Z?.kind==="edit"&&typeof Z.file_path==="string"&&typeof Z.oldContent==="string"&&(typeof Z.newContent==="string"||Z.newContent===void 0))q.push({type:"diff",path:Z.file_path,oldText:Z.oldContent,newText:Z.newContent??null});else{let F="function"in U?U.function.name:U.type,j=L(N(F,Y));q.push({type:"content",content:{type:"text",text:j}})}let E=Y.success?"completed":"failed";this.sendUpdate({sessionUpdate:"tool_call_update",toolCallId:U.id,status:E,content:q});break}case"task_update":this.sendPlanUpdate(J.tasks);break;default:break}}),this.messages=[...Q.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 X.error(`[AcpSession ${this.id}] Prompt error:`,H),H}finally{if(this.pendingPrompt===G)this.pendingPrompt=null}}cancel(){if(X.info(`[AcpSession ${this.id}] Cancel requested`),this.pendingPrompt)this.pendingPrompt.abort(),this.pendingPrompt=null,X.info(`[AcpSession ${this.id}] Cancelled successfully`);else X.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",X.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(X.info(`[AcpSession ${this.id}] Model set to: ${z}`),this.agent)X.warn(`[AcpSession ${this.id}] Runtime model switching not yet implemented`)}async destroy(){if(this.cancel(),this.agent)await this.agent.destroy(),this.agent=null;if(this.runtime)await this.runtime.dispose(),this.runtime=null;V.destroySession(this.id),X.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 Q=H.resource;if("text"in Q)G.push(`<file path="${Q.uri}">
|
|
2
|
-
${Q.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)=>{X.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}));X.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 X.debug(`[AcpSession ${this.id}] Auto-approving ${G} in mode: ${this.mode}`),{approved:!0};if(this.mode==="plan"&&(G==="write"||G==="execute"))return X.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 X.debug(`[AcpSession ${this.id}] Using cached approval for: ${H}`),{approved:!0};try{let Q=x(),J=[];if(z.message)J.push({type:"content",content:{type:"text",text:z.message}});if(z.risks&&z.risks.length>0)J.push({type:"content",content:{type:"text",text:`Risks:
|
|
5
|
-
- ${z.risks.join(`
|
|
6
|
-
- `)}`}});let U=this.mapToolKind(G),Y={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:Q,status:"pending",title:z.title||"Permission Required",content:J,kind:U}},Z=(await this.connection.requestPermission(Y)).outcome;if(Z.outcome==="cancelled")return{approved:!1,reason:"User cancelled the permission request"};let E=Z.optionId,F=E==="allow_once"||E==="allow_always";if(E==="allow_always")this.sessionApprovals.add(H),X.debug(`[AcpSession ${this.id}] Cached approval for: ${H}`);return{approved:F,reason:F?void 0:"User denied the operation"}}catch(Q){return X.warn(`[AcpSession ${this.id}] Permission request failed:`,Q),{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 $=W("Agent");class w{connection;sessions=new Map;clientCapabilities;constructor(z){this.connection=z}async initialize(z){return $.info("[BladeAgent] Initializing ACP connection"),$.debug(`[BladeAgent] Client capabilities: ${JSON.stringify(z.clientCapabilities)}`),this.clientCapabilities=z.clientCapabilities,{protocolVersion:I,agentCapabilities:{loadSession:!1,promptCapabilities:{image:!0,audio:!1,embeddedContext:!0},mcpCapabilities:{http:!0,sse:!0}}}}async authenticate(z){return}async newSession(z){let G=S();$.info(`[BladeAgent] Creating new session: ${G}`),$.debug(`[BladeAgent] Session cwd: ${z.cwd||D()}`);let H=new B(G,z.cwd||D(),this.connection,this.clientCapabilities);await H.initialize(),this.sessions.set(G,H),$.info(`[BladeAgent] Session ${G} created, scheduling available commands update`),H.sendAvailableCommandsDelayed();let Q=y(),J=Q?.models||[],U=Q?.currentModelId||J[0]?.id,Y=J.map((Z)=>({modelId:Z.id,name:Z.name||Z.id,description:Z.provider?`Provider: ${Z.provider}`:void 0}));return{sessionId:G,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:Y.length>0?{availableModels:Y,currentModelId:U}: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){$.info(`[BladeAgent] Cancel notification received for session: ${z.sessionId}`);let G=this.sessions.get(z.sessionId);if(G)$.info("[BladeAgent] Found session, calling session.cancel()"),G.cancel();else $.warn(`[BladeAgent] Session not found for cancel: ${z.sessionId}`)}async setSessionMode(z){$.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){$.info(`[BladeAgent] Setting session model: ${z.modelId}`);let G=this.sessions.get(z.sessionId);if(G)await G.setModel(z.modelId);return{}}async destroy(){for(let z of this.sessions.values())await z.destroy();this.sessions.clear(),await M.getInstance().disconnectAll()}}async function Jz(){let z=k.toWeb(process.stdout),G=K.toWeb(process.stdin),H=_.ndJsonStream(z,G);await new _.AgentSideConnection((J)=>new w(J),H).closed}export{Jz as runAcpIntegration};
|
package/dist/chunk-kevt8v3j.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Aa as g,Ba as h,Ca as i,Da as j,Ea as k,Fa as l,Ga as m,ua as a,va as b,wa as c,xa as d,ya as e,za as f}from"./chunk-21zps3hb.js";import"./chunk-67dzm8te.js";import"./chunk-39h8jdm3.js";import"./chunk-j1ehsp0x.js";import"./chunk-s53zeref.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};
|