blade-code 0.10.5 → 0.10.6

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 (90) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-rh7v814a.js → chunk-0rp2ck29.js} +2 -2
  3. package/dist/chunk-10k6egwk.js +1 -0
  4. package/dist/chunk-17xtw88g.js +1 -0
  5. package/dist/chunk-1cvr3qtd.js +1482 -0
  6. package/dist/chunk-1kg9r8xp.js +2 -0
  7. package/dist/{chunk-51wtvmzn.js → chunk-383vbwmt.js} +1 -1
  8. package/dist/chunk-3kk3bk11.js +1 -0
  9. package/dist/{chunk-6tx8k249.js → chunk-45dcfkwe.js} +2 -2
  10. package/dist/chunk-47dsd91k.js +99 -0
  11. package/dist/chunk-4kaygjqv.js +10 -0
  12. package/dist/{chunk-35yktzm1.js → chunk-4y28hykg.js} +1 -1
  13. package/dist/chunk-50fq7r0h.js +22 -0
  14. package/dist/chunk-59eje513.js +1 -0
  15. package/dist/{chunk-qda309d9.js → chunk-6cv4gddv.js} +2 -2
  16. package/dist/{chunk-hh85pk77.js → chunk-710bvht9.js} +47 -47
  17. package/dist/{chunk-xv0maezy.js → chunk-76d7p64v.js} +1 -1
  18. package/dist/{chunk-bexgcc2d.js → chunk-7xm3vjkz.js} +1 -1
  19. package/dist/{chunk-19kg7yvw.js → chunk-9sfmrb1j.js} +2 -2
  20. package/dist/chunk-a9pbpgkg.js +9 -0
  21. package/dist/{chunk-gxmrakrk.js → chunk-b4n34hrn.js} +1 -1
  22. package/dist/{chunk-v93hcxe7.js → chunk-bn0ge244.js} +1 -1
  23. package/dist/{chunk-fvhc1yj8.js → chunk-bnrce0hg.js} +1 -1
  24. package/dist/{chunk-9ffr01c3.js → chunk-c2rhwxyn.js} +1 -1
  25. package/dist/chunk-c8rky275.js +6 -0
  26. package/dist/{chunk-epj56s0n.js → chunk-c9tzf9r5.js} +1 -1
  27. package/dist/{chunk-njyvrtje.js → chunk-dcvvxsa1.js} +2 -2
  28. package/dist/{chunk-5twefby5.js → chunk-evaht3v4.js} +1 -1
  29. package/dist/{chunk-0n97186m.js → chunk-frcg8gea.js} +2 -2
  30. package/dist/{chunk-drrdzmaa.js → chunk-g4q26d9a.js} +2 -2
  31. package/dist/{chunk-s645azsm.js → chunk-g9n211y4.js} +2 -2
  32. package/dist/{chunk-vntzy7bc.js → chunk-gb4n3hwj.js} +2 -2
  33. package/dist/{chunk-ea7wsges.js → chunk-hjsm6ejs.js} +2 -2
  34. package/dist/chunk-j1sd03h7.js +1 -0
  35. package/dist/chunk-jqyvnmfr.js +187 -0
  36. package/dist/chunk-jrh5tzc4.js +1 -0
  37. package/dist/{chunk-an96c54z.js → chunk-k0p9ecgc.js} +7 -7
  38. package/dist/{chunk-z906d5tb.js → chunk-kcs3xa8f.js} +2 -2
  39. package/dist/{chunk-63ysxybd.js → chunk-kcwq1e7h.js} +1 -1
  40. package/dist/chunk-kj1ah6kn.js +1 -0
  41. package/dist/{chunk-am8dtvff.js → chunk-m4htdpr9.js} +2 -2
  42. package/dist/chunk-n34z4c47.js +1 -0
  43. package/dist/{chunk-6eragc74.js → chunk-n5m2p0bq.js} +2 -2
  44. package/dist/{chunk-gxzbv67r.js → chunk-n9khyme2.js} +2 -2
  45. package/dist/{chunk-1vx4sf1y.js → chunk-nfmsn652.js} +2 -2
  46. package/dist/{chunk-ydtcvxsm.js → chunk-p196e4rq.js} +1 -1
  47. package/dist/{chunk-qm11hjd3.js → chunk-p4j4aawd.js} +1 -1
  48. package/dist/chunk-qvabd0vg.js +1 -0
  49. package/dist/{chunk-sanhjqpd.js → chunk-r083b7vn.js} +2 -2
  50. package/dist/{chunk-gb54hc78.js → chunk-rag8zchg.js} +1 -1
  51. package/dist/{chunk-ygx03mdh.js → chunk-rw6gv740.js} +1 -1
  52. package/dist/{chunk-jza1rsan.js → chunk-sf9pe2n6.js} +1 -1
  53. package/dist/chunk-t75wspk3.js +1 -0
  54. package/dist/{chunk-vpj0sv73.js → chunk-thvwt4kc.js} +3 -3
  55. package/dist/{chunk-yc53wz4r.js → chunk-v1p80wvh.js} +2 -2
  56. package/dist/chunk-vddqv6fv.js +1 -0
  57. package/dist/{chunk-948qe2pp.js → chunk-vvbd9fb5.js} +1 -1
  58. package/dist/{chunk-15d49qty.js → chunk-w154jyby.js} +1 -1
  59. package/dist/{chunk-dqvcgwhe.js → chunk-w4zvftrw.js} +2 -2
  60. package/dist/chunk-wa7v7akz.js +3 -0
  61. package/dist/chunk-wxwqz67n.js +1 -0
  62. package/dist/chunk-x9hm3p3a.js +1 -0
  63. package/dist/chunk-xd2g4zjx.js +1 -0
  64. package/dist/{chunk-tq52pbde.js → chunk-xkp4ph6v.js} +1 -1
  65. package/dist/{chunk-fz1vyc15.js → chunk-xsmtpkjm.js} +1 -1
  66. package/dist/{chunk-g6h6h8xr.js → chunk-yt39kfc6.js} +1 -1
  67. package/package.json +1 -1
  68. package/dist/chunk-069zpw09.js +0 -6
  69. package/dist/chunk-1m5r6mp2.js +0 -180
  70. package/dist/chunk-1q21sxhx.js +0 -1
  71. package/dist/chunk-1r6szcrj.js +0 -1
  72. package/dist/chunk-1x4fpe47.js +0 -1
  73. package/dist/chunk-2nkd1kjx.js +0 -1
  74. package/dist/chunk-417wefq7.js +0 -99
  75. package/dist/chunk-4ncbd4k0.js +0 -1
  76. package/dist/chunk-62881c2s.js +0 -1484
  77. package/dist/chunk-7443b95r.js +0 -1
  78. package/dist/chunk-79s052sw.js +0 -2
  79. package/dist/chunk-7jy60gnx.js +0 -1
  80. package/dist/chunk-c5tds5v0.js +0 -9
  81. package/dist/chunk-ccwskwb3.js +0 -1
  82. package/dist/chunk-f6mszdsd.js +0 -1
  83. package/dist/chunk-nz78b5c5.js +0 -10
  84. package/dist/chunk-r1764q6f.js +0 -1
  85. package/dist/chunk-r6mwyg3h.js +0 -3
  86. package/dist/chunk-rzzt21ef.js +0 -22
  87. package/dist/chunk-t8x2qpe2.js +0 -1
  88. package/dist/chunk-tjnfhm9v.js +0 -1
  89. package/dist/chunk-v0ygsjry.js +0 -1
  90. package/dist/chunk-zyz82mcd.js +0 -1
@@ -0,0 +1 @@
1
+ import{qb as a,rb as b,sb as c,tb as d,ub as e,vb as f}from"./chunk-47dsd91k.js";import"./chunk-k0p9ecgc.js";import"./chunk-b4n34hrn.js";import"./chunk-4y28hykg.js";import"./chunk-p4j4aawd.js";import"./chunk-6cv4gddv.js";import"./chunk-1kg9r8xp.js";import"./chunk-c9tzf9r5.js";import"./chunk-7xm3vjkz.js";import"./chunk-nfmsn652.js";import"./chunk-frcg8gea.js";import"./chunk-c2rhwxyn.js";export{a as __setSessionSnapshotIOForTesting,b as __resetSessionSnapshotIOForTesting,f as SessionService,c as SessionMissingCreationError,d as SessionArchivedError,e as SessionArchiveConflictError};
@@ -1,2 +1,2 @@
1
1
  var g;((e)=>{e.DEFAULT="default";e.AUTO_EDIT="autoEdit";e.YOLO="yolo";e.PLAN="plan"})(g||={});import p from"typebox/schema";import u from"typebox/value";class s extends Error{issues;constructor(t){super(t.map((r)=>{return`${r.path.length>0?r.path.join("."):"root"}: ${r.message}`}).join("; "));this.issues=t;this.name="SchemaValidationError"}}function T(t){if(!t)return[];return t.split("/").slice(1).map((r)=>r.replace(/~1/g,"/").replace(/~0/g,"~")).map((r)=>/^(0|[1-9]\d*)$/.test(r)?Number(r):r)}function d(t,r){let n=t;for(let o of r){if(n===null||typeof n!=="object")return;n=n[o]}return n}function f(t,r){let[,n]=p.Errors(t,r);return n.map((o)=>{let e=T(o.instancePath);return{code:o.keyword,path:e,message:o.message,value:d(r,e)}})}function a(t,r){let n=u.Default(t,u.Clone(r)),o=f(t,n);if(o.length>0)return{success:!1,error:new s(o)};let e=u.Clean(t,n),c=f(t,e);if(c.length>0)return{success:!1,error:new s(c)};return{success:!0,data:e}}function i(t,r){let n=a(t,r);if(!n.success)throw n.error;return n.data}import l from"typebox";function m(t){return Object.defineProperties(t,{parse:{value:(r)=>i(t,r),enumerable:!1},safeParse:{value:(r)=>a(t,r),enumerable:!1}}),t}function N(t,r){return l.Optional({...t,default:r})}function R(t,r={}){return l.Unsafe({type:"string",enum:[...t],...r})}var _=100;function I(t){return Number.isInteger(t)&&t>=-1&&t<=100}function y(){return"-1, 0, or an integer from 1 to 100"}
2
- export{g as be,a as ce,i as de,l as ee,m as fe,N as ge,R as he,_ as ie,I as je,y as ke};
2
+ export{g as ge,a as he,i as ie,l as je,m as ke,N as le,R as me,_ as ne,I as oe,y as pe};
@@ -1,4 +1,4 @@
1
- import{ia as H}from"./chunk-s645azsm.js";import"./chunk-jza1rsan.js";import{oc as $,uc as T}from"./chunk-sanhjqpd.js";import"./chunk-g6h6h8xr.js";import"./chunk-fvhc1yj8.js";import"./chunk-vpj0sv73.js";import"./chunk-qm11hjd3.js";import"./chunk-qda309d9.js";import"./chunk-rh7v814a.js";import"./chunk-tq52pbde.js";import"./chunk-79s052sw.js";import{re as k}from"./chunk-epj56s0n.js";import"./chunk-gxzbv67r.js";import"./chunk-bexgcc2d.js";import"./chunk-1vx4sf1y.js";import"./chunk-z906d5tb.js";import"./chunk-948qe2pp.js";import"./chunk-0n97186m.js";import"./chunk-9ffr01c3.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
1
+ import{ha as H}from"./chunk-g9n211y4.js";import"./chunk-sf9pe2n6.js";import{tc as $,zc as T}from"./chunk-r083b7vn.js";import"./chunk-yt39kfc6.js";import"./chunk-bnrce0hg.js";import"./chunk-thvwt4kc.js";import"./chunk-p4j4aawd.js";import"./chunk-6cv4gddv.js";import"./chunk-0rp2ck29.js";import"./chunk-xkp4ph6v.js";import"./chunk-1kg9r8xp.js";import{we as k}from"./chunk-c9tzf9r5.js";import"./chunk-n9khyme2.js";import"./chunk-7xm3vjkz.js";import"./chunk-nfmsn652.js";import"./chunk-kcs3xa8f.js";import"./chunk-vvbd9fb5.js";import"./chunk-frcg8gea.js";import"./chunk-c2rhwxyn.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){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 login <name> 登录远程 MCP OAuth"),console.log(" blade mcp logout <name> 清除远程 MCP OAuth 凭证"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
@@ -1 +1 @@
1
- import{nd as F}from"./chunk-qda309d9.js";import{re as G}from"./chunk-epj56s0n.js";import{promises as $}from"node:fs";import b from"node:os";import W from"node:path";import{Mutex as j}from"async-mutex";import{merge as N}from"lodash-es";import A from"write-file-atomic";var B=F("Service"),Z={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},modelProviders:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},communicationStyle:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},enabledPlugins:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},pluginSourcePolicy:{target:"settings",defaultScope:"global",mergeStrategy:"replace",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxConcurrentTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxQueuedTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},lspServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},S=new Set(Object.entries(Z).filter(([q,z])=>z.persistable).map(([q])=>q)),m=new Set(Object.entries(Z).filter(([q,z])=>!z.persistable).map(([q])=>q));class V{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!V.instance)V.instance=new V;return V.instance}static resetInstance(){if(V.instance)for(let q of V.instance.timers.values())clearTimeout(q);V.instance=null}async save(q,z={}){this.validatePersistableFields(q);let H=this.groupUpdatesByTarget(q,z.scope,z.projectDir);if(z.immediate)await Promise.all(Array.from(H.entries()).map(([J,K])=>this.flushTarget(J,K)));else for(let[J,K]of H)this.scheduleSave(J,K)}async flush(){for(let z of this.timers.values())clearTimeout(z);this.timers.clear();let q=Array.from(this.pendingUpdates.entries()).map(([z,H])=>this.flushTarget(z,H));this.pendingUpdates.clear(),await Promise.all(q)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(q,z={}){await this.appendPermissionRuleForDecision(q,"allow",z)}async appendPermissionDenyRule(q,z={}){await this.appendPermissionRuleForDecision(q,"deny",z)}async appendPermissionRuleForDecision(q,z,H){let J=H.scope??"local",K=this.resolveFilePath("settings",J,H.projectDir);await this.flushTargetWithModifier(K,(M)=>{let Q=M.permissions??{allow:[],ask:[],deny:[]},X={allow:z==="allow"?this.dedupeArray([...Q.allow||[],q]):Q.allow||[],ask:Q.ask||[],deny:z==="deny"?this.dedupeArray([...Q.deny||[],q]):Q.deny||[]};return{...M,permissions:X}})}async appendLocalPermissionRule(q,z={}){await this.appendPermissionRule(q,{...z,scope:"local"})}async appendLocalPermissionDenyRule(q,z={}){await this.appendPermissionDenyRule(q,{...z,scope:"local"})}async removePluginSetting(q,z={}){let H=z.scope??"local",J=this.resolveFilePath("settings",H,z.projectDir);await this.flushTargetWithModifier(J,(K)=>{let M={...K.enabledPlugins??{}};delete M[q];let Q={...K};if(Object.keys(M).length>0)Q.enabledPlugins=M;else delete Q.enabledPlugins;return Q})}validatePersistableFields(q){for(let z of Object.keys(q)){let H=Z[z];if(!H)throw Error(`Unknown config field: ${z}`);if(!H.persistable)throw Error(`Field "${z}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(q,z,H){let J=new Map;for(let[K,M]of Object.entries(q)){let Q=Z[K];if(!Q)continue;let X=z??Q.defaultScope,Y=this.resolveFilePath(Q.target,X,H);if(!J.has(Y))J.set(Y,{});J.get(Y)[K]=M}return J}resolveFilePath(q,z,H){let J=H??G();if(q==="config")return z==="global"?W.join(b.homedir(),".blade","config.json"):W.join(J,".blade","config.json");switch(z){case"local":return W.join(J,".blade","settings.local.json");case"project":return W.join(J,".blade","settings.json");case"global":return W.join(b.homedir(),".blade","settings.json");default:return W.join(J,".blade","settings.local.json")}}scheduleSave(q,z){let H=this.pendingUpdates.get(q)??{},J=this.mergePendingUpdates(H,z);this.pendingUpdates.set(q,J);let K=this.timers.get(q);if(K)clearTimeout(K);let M=setTimeout(async()=>{let Q=this.pendingUpdates.get(q);if(Q){this.pendingUpdates.delete(q),this.timers.delete(q);try{await this.flushTarget(q,Q),this.lastSaveError=null}catch(X){let Y=X instanceof Error?X:Error(String(X));this.lastSaveError=Y,B.error(`Failed to save config to ${q}:`,Y.message),B.error("Stack trace:",Y.stack)}}},this.debounceDelay);this.timers.set(q,M)}mergePendingUpdates(q,z){let H={...q};for(let[J,K]of Object.entries(z)){let M=Z[J];if(!M){H[J]=K;continue}switch(M.mergeStrategy){case"replace":H[J]=K;break;case"append-dedupe":this.applyAppendDedupe(H,J,K);break;case"deep-merge":this.applyDeepMerge(H,J,K);break}}return H}async flushTarget(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await this.performWrite(q,z)})}async flushTargetWithModifier(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let J={};try{let M=await $.readFile(q,"utf-8");J=JSON.parse(M)}catch{J={}}let K=z(J);await this.atomicWrite(q,K)})}async performWrite(q,z){await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let H={};try{let K=await $.readFile(q,"utf-8");H=JSON.parse(K)}catch{H={}}let J={...H};for(let[K,M]of Object.entries(z)){let Q=Z[K];if(!Q){J[K]=M;continue}switch(Q.mergeStrategy){case"replace":J[K]=M;break;case"append-dedupe":this.applyAppendDedupe(J,K,M);break;case"deep-merge":this.applyDeepMerge(J,K,M);break}}await this.atomicWrite(q,J)}applyAppendDedupe(q,z,H){if(z==="permissions"&&typeof H==="object"&&H!==null){let J=q[z]??{allow:[],ask:[],deny:[]},K=H;q[z]={allow:this.dedupeArray([...J.allow||[],...K.allow||[]]),ask:this.dedupeArray([...J.ask||[],...K.ask||[]]),deny:this.dedupeArray([...J.deny||[],...K.deny||[]])}}else if(Array.isArray(H)){let J=Array.isArray(q[z])?q[z]:[];q[z]=this.dedupeArray([...J,...H])}else q[z]=H}applyDeepMerge(q,z,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let J=typeof q[z]==="object"&&q[z]!==null?q[z]:{};q[z]=N({},J,H)}else q[z]=H}dedupeArray(q){return Array.from(new Set(q))}async atomicWrite(q,z){await A(q,JSON.stringify(z,null,2),{mode:384,encoding:"utf-8"})}}function O(){return V.getInstance()}export{O as vc};
1
+ import{sd as F}from"./chunk-6cv4gddv.js";import{we as G}from"./chunk-c9tzf9r5.js";import{promises as $}from"node:fs";import b from"node:os";import W from"node:path";import{Mutex as j}from"async-mutex";import{merge as N}from"lodash-es";import A from"write-file-atomic";var B=F("Service"),Z={models:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},modelProviders:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},currentModelId:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},temperature:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},maxOutputTokens:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},timeout:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},theme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},uiTheme:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},language:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},debug:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},fontSize:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},autoSaveSessions:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyBuild:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifyErrors:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},notifySounds:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyTelemetry:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},privacyCrash:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},communicationStyle:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},permissionMode:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},permissions:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},hooks:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},enabledPlugins:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},pluginSourcePolicy:{target:"settings",defaultScope:"global",mergeStrategy:"replace",persistable:!0},env:{target:"settings",defaultScope:"local",mergeStrategy:"deep-merge",persistable:!0},disableAllHooks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxTurns:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxConcurrentTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},maxQueuedTasks:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!0},mcpServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},lspServers:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!0},stream:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topP:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},topK:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},mcpEnabled:{target:"config",defaultScope:"global",mergeStrategy:"replace",persistable:!1},systemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},appendSystemPrompt:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},initialMessage:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},resumeSessionId:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},forkSession:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},allowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},disallowedTools:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},mcpConfigPaths:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},strictMcpConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},addDirs:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},outputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},inputFormat:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},print:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},includePartialMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},replayUserMessages:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},agentsConfig:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1},settingSources:{target:"settings",defaultScope:"local",mergeStrategy:"replace",persistable:!1}},S=new Set(Object.entries(Z).filter(([q,z])=>z.persistable).map(([q])=>q)),m=new Set(Object.entries(Z).filter(([q,z])=>!z.persistable).map(([q])=>q));class V{static instance=null;pendingUpdates=new Map;timers=new Map;fileLocks=new Map;lastSaveError=null;debounceDelay=300;constructor(){}static getInstance(){if(!V.instance)V.instance=new V;return V.instance}static resetInstance(){if(V.instance)for(let q of V.instance.timers.values())clearTimeout(q);V.instance=null}async save(q,z={}){this.validatePersistableFields(q);let H=this.groupUpdatesByTarget(q,z.scope,z.projectDir);if(z.immediate)await Promise.all(Array.from(H.entries()).map(([J,K])=>this.flushTarget(J,K)));else for(let[J,K]of H)this.scheduleSave(J,K)}async flush(){for(let z of this.timers.values())clearTimeout(z);this.timers.clear();let q=Array.from(this.pendingUpdates.entries()).map(([z,H])=>this.flushTarget(z,H));this.pendingUpdates.clear(),await Promise.all(q)}getLastSaveError(){return this.lastSaveError}clearLastSaveError(){this.lastSaveError=null}async appendPermissionRule(q,z={}){await this.appendPermissionRuleForDecision(q,"allow",z)}async appendPermissionDenyRule(q,z={}){await this.appendPermissionRuleForDecision(q,"deny",z)}async appendPermissionRuleForDecision(q,z,H){let J=H.scope??"local",K=this.resolveFilePath("settings",J,H.projectDir);await this.flushTargetWithModifier(K,(M)=>{let Q=M.permissions??{allow:[],ask:[],deny:[]},X={allow:z==="allow"?this.dedupeArray([...Q.allow||[],q]):Q.allow||[],ask:Q.ask||[],deny:z==="deny"?this.dedupeArray([...Q.deny||[],q]):Q.deny||[]};return{...M,permissions:X}})}async appendLocalPermissionRule(q,z={}){await this.appendPermissionRule(q,{...z,scope:"local"})}async appendLocalPermissionDenyRule(q,z={}){await this.appendPermissionDenyRule(q,{...z,scope:"local"})}async removePluginSetting(q,z={}){let H=z.scope??"local",J=this.resolveFilePath("settings",H,z.projectDir);await this.flushTargetWithModifier(J,(K)=>{let M={...K.enabledPlugins??{}};delete M[q];let Q={...K};if(Object.keys(M).length>0)Q.enabledPlugins=M;else delete Q.enabledPlugins;return Q})}validatePersistableFields(q){for(let z of Object.keys(q)){let H=Z[z];if(!H)throw Error(`Unknown config field: ${z}`);if(!H.persistable)throw Error(`Field "${z}" is non-persistable and cannot be saved to config files. Non-persistable fields are runtime-only and only valid for the current session.`)}}groupUpdatesByTarget(q,z,H){let J=new Map;for(let[K,M]of Object.entries(q)){let Q=Z[K];if(!Q)continue;let X=z??Q.defaultScope,Y=this.resolveFilePath(Q.target,X,H);if(!J.has(Y))J.set(Y,{});J.get(Y)[K]=M}return J}resolveFilePath(q,z,H){let J=H??G();if(q==="config")return z==="global"?W.join(b.homedir(),".blade","config.json"):W.join(J,".blade","config.json");switch(z){case"local":return W.join(J,".blade","settings.local.json");case"project":return W.join(J,".blade","settings.json");case"global":return W.join(b.homedir(),".blade","settings.json");default:return W.join(J,".blade","settings.local.json")}}scheduleSave(q,z){let H=this.pendingUpdates.get(q)??{},J=this.mergePendingUpdates(H,z);this.pendingUpdates.set(q,J);let K=this.timers.get(q);if(K)clearTimeout(K);let M=setTimeout(async()=>{let Q=this.pendingUpdates.get(q);if(Q){this.pendingUpdates.delete(q),this.timers.delete(q);try{await this.flushTarget(q,Q),this.lastSaveError=null}catch(X){let Y=X instanceof Error?X:Error(String(X));this.lastSaveError=Y,B.error(`Failed to save config to ${q}:`,Y.message),B.error("Stack trace:",Y.stack)}}},this.debounceDelay);this.timers.set(q,M)}mergePendingUpdates(q,z){let H={...q};for(let[J,K]of Object.entries(z)){let M=Z[J];if(!M){H[J]=K;continue}switch(M.mergeStrategy){case"replace":H[J]=K;break;case"append-dedupe":this.applyAppendDedupe(H,J,K);break;case"deep-merge":this.applyDeepMerge(H,J,K);break}}return H}async flushTarget(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await this.performWrite(q,z)})}async flushTargetWithModifier(q,z){let H=this.fileLocks.get(q);if(!H)H=new j,this.fileLocks.set(q,H);await H.runExclusive(async()=>{await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let J={};try{let M=await $.readFile(q,"utf-8");J=JSON.parse(M)}catch{J={}}let K=z(J);await this.atomicWrite(q,K)})}async performWrite(q,z){await $.mkdir(W.dirname(q),{recursive:!0,mode:493});let H={};try{let K=await $.readFile(q,"utf-8");H=JSON.parse(K)}catch{H={}}let J={...H};for(let[K,M]of Object.entries(z)){let Q=Z[K];if(!Q){J[K]=M;continue}switch(Q.mergeStrategy){case"replace":J[K]=M;break;case"append-dedupe":this.applyAppendDedupe(J,K,M);break;case"deep-merge":this.applyDeepMerge(J,K,M);break}}await this.atomicWrite(q,J)}applyAppendDedupe(q,z,H){if(z==="permissions"&&typeof H==="object"&&H!==null){let J=q[z]??{allow:[],ask:[],deny:[]},K=H;q[z]={allow:this.dedupeArray([...J.allow||[],...K.allow||[]]),ask:this.dedupeArray([...J.ask||[],...K.ask||[]]),deny:this.dedupeArray([...J.deny||[],...K.deny||[]])}}else if(Array.isArray(H)){let J=Array.isArray(q[z])?q[z]:[];q[z]=this.dedupeArray([...J,...H])}else q[z]=H}applyDeepMerge(q,z,H){if(typeof H==="object"&&H!==null&&!Array.isArray(H)){let J=typeof q[z]==="object"&&q[z]!==null?q[z]:{};q[z]=N({},J,H)}else q[z]=H}dedupeArray(q){return Array.from(new Set(q))}async atomicWrite(q,z){await A(q,JSON.stringify(z,null,2),{mode:384,encoding:"utf-8"})}}function O(){return V.getInstance()}export{O as Ac};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blade-code",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "private": false,
5
5
  "description": "🗡️ Blade Code - 智能代码助手命令行工具",
6
6
  "type": "module",
@@ -1,6 +0,0 @@
1
- import{m as Yq,n as Zq,o as $q,p as Gq}from"./chunk-51wtvmzn.js";import{q as Qq}from"./chunk-xv0maezy.js";import{E as i,F as r,G as s,I as F,J as a}from"./chunk-62881c2s.js";import"./chunk-s645azsm.js";import{Aa as l,Da as v}from"./chunk-1m5r6mp2.js";import"./chunk-jza1rsan.js";import{qb as u}from"./chunk-417wefq7.js";import"./chunk-an96c54z.js";import{Jb as n}from"./chunk-6eragc74.js";import{Lb as t,Mb as e,Nb as qq}from"./chunk-19kg7yvw.js";import{Ob as o}from"./chunk-6tx8k249.js";import"./chunk-drrdzmaa.js";import{mc as m}from"./chunk-sanhjqpd.js";import"./chunk-g6h6h8xr.js";import"./chunk-fvhc1yj8.js";import"./chunk-dqvcgwhe.js";import"./chunk-ea7wsges.js";import"./chunk-gxmrakrk.js";import"./chunk-yc53wz4r.js";import"./chunk-am8dtvff.js";import"./chunk-35yktzm1.js";import"./chunk-63ysxybd.js";import"./chunk-vpj0sv73.js";import"./chunk-qm11hjd3.js";import"./chunk-qda309d9.js";import"./chunk-rh7v814a.js";import{be as g,ce as d,ee as q,fe as C,he as j,ie as p}from"./chunk-tq52pbde.js";import"./chunk-79s052sw.js";import{re as x}from"./chunk-epj56s0n.js";import"./chunk-gxzbv67r.js";import"./chunk-bexgcc2d.js";import"./chunk-1vx4sf1y.js";import"./chunk-z906d5tb.js";import"./chunk-948qe2pp.js";import"./chunk-0n97186m.js";import"./chunk-9ffr01c3.js";import mq from"yargs";import{hideBin as uq}from"yargs/helpers";var k=1;function B(Z){return q.Object({event_version:q.Literal(k),...Z})}var Kq=B({type:q.Literal("content_delta"),delta:q.String()}),jq=B({type:q.Literal("thinking_delta"),delta:q.String()}),bq=B({type:q.Literal("thinking"),content:q.String()}),Aq=B({type:q.Literal("stream_end")}),Hq=B({type:q.Literal("content"),content:q.String()}),w=j(["readonly","write","execute"]),Rq=B({type:q.Literal("tool_start"),tool_name:q.String(),summary:q.String(),target:q.Optional(q.String()),tool_kind:q.Optional(w)}),zq=B({type:q.Literal("tool_progress"),tool_name:q.String(),message:q.String(),progress:q.Optional(q.Number()),total:q.Optional(q.Number())}),Mq=B({type:q.Literal("tool_result"),tool_name:q.String(),summary:q.String(),target:q.Optional(q.String()),tool_kind:q.Optional(w),success:q.Optional(q.Boolean()),error_type:q.Optional(q.String()),error_message:q.Optional(q.String())}),Eq=B({type:q.Literal("mcp_catalog_changed"),revision:q.Integer({minimum:1}),server_name:q.String(),added:q.Array(q.String()),removed:q.Array(q.String()),updated:q.Array(q.String())}),Pq=B({type:q.Literal("mcp_content_changed"),revision:q.Integer({minimum:1}),server_name:q.String(),content_kind:j(["resources","resource_templates","prompts"]),added:q.Array(q.String()),removed:q.Array(q.String()),updated:q.Array(q.String())}),Nq=B({type:q.Literal("mcp_resource_updated"),revision:q.Integer({minimum:1}),server_name:q.String(),uri:q.String()}),fq=B({type:q.Literal("mcp_connection_changed"),revision:q.Integer({minimum:1}),server_name:q.String(),phase:j(["reconnecting","recovered","failed"]),reason:q.String(),attempt:q.Integer({minimum:0}),max_attempts:q.Integer({minimum:0}),next_retry_at:q.Optional(q.Integer({minimum:0})),error:q.Optional(q.String())}),xq=B({type:q.Literal("mcp_log"),revision:q.Integer({minimum:1}),server_name:q.String(),level:j(["debug","info","notice","warning","error","critical","alert","emergency"]),logger:q.Optional(q.String()),message:q.String(),projected_bytes:q.Integer({minimum:0}),data_sha256:q.String(),truncated:q.Boolean(),details_omitted:q.Boolean(),timestamp:q.Integer({minimum:0}),synthetic:q.Optional(q.Boolean())}),Iq=B({type:q.Literal("mcp_instructions_changed"),revision:q.Integer({minimum:0}),server_name:q.String(),action:j(["added","removed"]),reason:j(["snapshot","connection","disconnection"]),text:q.Optional(q.String()),source_bytes:q.Optional(q.Integer({minimum:0})),projected_bytes:q.Optional(q.Integer({minimum:0})),sha256:q.Optional(q.String()),truncated:q.Optional(q.Boolean()),details_omitted:q.Optional(q.Boolean())}),Lq=B({type:q.Literal("mcp_task_changed"),revision:q.Integer({minimum:0}),task_id:q.String(),server_name:q.String(),tool_name:q.String(),status:j(["working","input_required","interrupted","completed","failed","cancelled"]),status_message:q.Optional(q.String()),created_at:q.Integer({minimum:0}),updated_at:q.Integer({minimum:0}),completed_at:q.Optional(q.Integer({minimum:0})),has_result:q.Boolean(),error:q.Optional(q.String())}),Jq=B({type:q.Literal("project_rules_loaded"),files:q.Array(q.Object({id:q.String(),relative_path:q.String(),source:j(["project","local"]),conditional:q.Boolean(),content_sha256:q.String({pattern:"^[a-f0-9]{64}$"})})),trigger_paths:q.Array(q.String()),blocked_write:q.Boolean()}),Wq=B({type:q.Literal("user_shell_started"),execution_id:q.String(),command:q.String(),auxiliary:q.Boolean()}),Sq=B({type:q.Literal("user_shell_output"),execution_id:q.String(),stream:j(["stdout","stderr"]),chunk:q.String(),stream_truncated:q.Boolean()}),Oq=B({type:q.Literal("user_shell_completed"),execution_id:q.String(),message_id:q.String(),status:j(["completed","failed","aborted","timed_out","spawn_error"]),exit_code:q.Union([q.Integer(),q.Null()]),duration_ms:q.Number({minimum:0}),stdout:q.String(),stderr:q.String(),truncated:q.Boolean(),auxiliary:q.Boolean()}),hq=B({type:q.Literal("phase"),phase:j(["turn","searching","inspecting","target_hit","executing","completed"]),status:j(["ongoing","hit","done"]),message:q.String(),turn:q.Optional(q.Number()),tool_name:q.Optional(q.String()),target:q.Optional(q.String())}),Cq=B({type:q.Literal("tool_detail"),tool_name:q.String(),detail:q.String()}),Fq=B({type:q.Literal("task_update"),tasks:q.Array(F)}),kq=B({type:q.Literal("subagent"),state:j(["spawned","completed"]),session_id:q.String(),subagent_type:q.Optional(q.String()),success:q.Optional(q.Boolean()),summary:q.Optional(q.String()),verification_verdict:q.Optional(j(["pass","fail","partial"])),resumed_from:q.Optional(q.String()),root_agent_id:q.Optional(q.String()),resume_depth:q.Optional(q.Integer({minimum:0}))}),wq=B({type:q.Literal("token_usage"),input_tokens:q.Number(),output_tokens:q.Number(),total_tokens:q.Number(),max_context_tokens:q.Number(),cache_read_tokens:q.Optional(q.Number()),cache_write_tokens:q.Optional(q.Number()),cost_usd:q.Optional(q.Number())}),Tq=B({type:q.Literal("compacting"),state:j(["started","completed"])}),yq=B({type:q.Literal("turn_limit"),turns_count:q.Number(),action:q.Literal("continue")}),cq=B({type:q.Literal("task_session"),session_id:q.String(),project_path:q.String(),source_project_path:q.String(),isolation:j(["local","worktree"]),worktree_branch:q.Optional(q.String()),base_commit:q.Optional(q.String())}),gq=B({type:q.Literal("task_admission"),state:j(["queued","running"]),queue_position:q.Optional(q.Integer({minimum:1})),queue_depth:q.Integer({minimum:0}),in_flight:q.Integer({minimum:0}),max_concurrent_tasks:q.Integer({minimum:1})}),dq=B({type:q.Literal("output"),content:q.String(),exit_code:q.Number()}),pq=B({type:q.Literal("error"),message:q.String()}),GQ=C(q.Union([Kq,jq,bq,Aq,Hq,Rq,zq,Mq,Eq,Pq,Nq,fq,xq,Iq,Lq,Jq,Wq,Sq,Oq,hq,Cq,Fq,kq,wq,Tq,yq,cq,gq,dq,pq]));function T(Z,$){return{event_version:k,type:Z,...$}}function lq(Z){if(Z?.signal)return{signal:Z.signal,dispose:()=>{return}};let $=new AbortController,G=()=>$.abort("interrupt");return process.once("SIGINT",G),process.once("SIGTERM",G),{signal:$.signal,dispose:()=>{process.removeListener("SIGINT",G),process.removeListener("SIGTERM",G)}}}var vq=j(["text","jsonl"]),iq=q.Object({headless:q.Optional(q.Boolean()),message:q.Optional(q.String()),_:q.Optional(q.Array(q.Union([q.String(),q.Number()]))),model:q.Optional(q.String()),systemPrompt:q.Optional(q.String()),appendSystemPrompt:q.Optional(q.String()),maxTurns:q.Optional(q.Refine(q.Integer({maximum:p}),(Z)=>Z===-1||Z>0,()=>"must be -1 or a positive integer")),permissionMode:q.Optional(q.Enum(g)),mcpConfig:q.Optional(q.Array(q.String())),strictMcpConfig:q.Optional(q.Boolean()),sessionId:q.Optional(q.String()),allowedTools:q.Optional(q.Array(q.String())),disallowedTools:q.Optional(q.Array(q.String())),agents:q.Optional(q.String()),continue:q.Optional(q.Boolean()),resume:q.Optional(q.Union([q.String(),q.Boolean()])),forkSession:q.Optional(q.Boolean()),taskIsolation:q.Optional(j(["local","worktree"])),outputFormat:q.Optional(vq)});class Vq{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened(Z){this.openedThinking=Z}hasOpenThinking(){return this.openedThinking}completeStream(){let Z={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,Z}}function rq(Z){return Z.issues.map(($)=>`${$.path.join(".")||"options"}: ${$.message}`).join("; ")}function sq(Z){let $=d(iq,Z);if(!$.success)throw Error(`Invalid headless options: ${rq($.error)}`);return $.data}function aq(Z){return Z.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",($)=>$.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"}).option("task-isolation",{alias:["taskIsolation"],choices:["local","worktree"],describe:"Dispatch a new durable task in the selected workspace mode",type:"string"}),async($)=>{if(!$.headless)return;let G=await QQ($);process.exit(G)})}function _(Z,$=""){Z.write(`${$}
2
- `)}function oq(Z){return`[task] [${Z.status}] ${Z.subject}`}function nq(){return{requestConfirmation:async(Z)=>Z.type==="mcpElicitation"?{approved:!1,reason:"headless-mcp-elicitation-unavailable",elicitation:{action:"cancel"}}:Z.type==="mcpSampling"?{approved:!1,reason:"headless-mcp-sampling-unavailable"}:{approved:!0,reason:"headless-auto-approved",scope:"session"}}}function tq(Z){if(!(Z instanceof Error))return"Unknown error";let Q=Z.lastError??Z;if(Q.responseBody)try{let K=JSON.parse(Q.responseBody)?.error?.message;if(K)return Q.statusCode?`${K} (HTTP ${Q.statusCode})`:K}catch{}let Y=Z.message.match(/Last error:\s*(.+)$/);if(Y)return Y[1];return Z.message}function eq(Z){return Z==="jsonl"?"jsonl":"text"}function y(Z,$){let G=(...Q)=>{for(let Y of Q){let U=$[Y];if(typeof U==="string"&&U.trim()!=="")return U}return};switch(Z){case"Read":case"Edit":case"Write":case"UndoEdit":return G("file_path");case"ApplyPatch":return"multi-file patch";case"NotebookEdit":return G("notebook_path");case"Grep":return G("path","pattern");case"Glob":return G("pattern");case"WebFetch":return G("url");case"WebSearch":return G("query");case"Bash":return G("command","description");case"Task":return G("description");case"LSP":return G("filePath","operation");case"EnterWorktree":return G("name");case"ExitWorktree":return G("action");default:return}}function qQ(Z,$,G,Q){let Y=new Set(["Glob","Grep","WebSearch","LS"]),U=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","ApplyPatch","NotebookEdit","Bash","LSP","UndoEdit","EnterWorktree","ExitWorktree"]).has(Z)&&!Q.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${$}`,shouldLockTarget:!0};if(Q.targetLocked)return{phase:"executing",status:"hit",message:G?`Working within target: ${$}`:`Executing: ${$}`,shouldLockTarget:!1};if(Y.has(Z))return{phase:"searching",status:"ongoing",message:`Still searching: ${$}`,shouldLockTarget:!1};if(U.has(Z))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${$}`,shouldLockTarget:!1};return{phase:"executing",status:Q.targetLocked?"hit":"ongoing",message:`Executing: ${$}`,shouldLockTarget:!1}}function c(Z,$){let G=(Q,Y)=>{Z.stdout.write(`${JSON.stringify(T(Q,Y))}
3
- `)};return{contentDelta(Q){if($==="jsonl"){G("content_delta",{delta:Q});return}Z.stdout.write(Q)},thinkingDelta(Q,Y){if($==="jsonl")return G("thinking_delta",{delta:Q}),Y;if(!Y)Z.stderr.write("[thinking] ");return Z.stderr.write(Q),!0},thinking(Q){if($==="jsonl"){G("thinking",{content:Q});return}_(Z.stderr,`[thinking] ${Q}`)},streamEnd(Q,Y){if($==="jsonl"){G("stream_end",{});return}if(Y)Z.stderr.write(`
4
- `);if(Q)Z.stdout.write(`
5
- `)},content(Q){if($==="jsonl"){G("content",{content:Q});return}_(Z.stdout,Q)},toolStart(Q,Y,U,K){if($==="jsonl"){G("tool_start",{tool_name:Q,summary:Y,target:U,tool_kind:K});return}_(Z.stderr,`[tool:start] ${Y}`)},toolProgress(Q,Y,U,K){if($==="jsonl"){G("tool_progress",{tool_name:Q,message:Y,progress:U,total:K});return}_(Z.stderr,`[tool:progress] ${Q}: ${Y}`)},toolResult(Q,Y,U,K,A){if($==="jsonl"){G("tool_result",{tool_name:Q,summary:Y,target:U,tool_kind:K,success:A?.success,error_type:A?.errorType,error_message:A?.errorMessage});return}_(Z.stderr,`[tool:result] ${Y}`)},mcpCatalogChanged(Q){if($==="jsonl"){G("mcp_catalog_changed",{revision:Q.revision,server_name:Q.serverName,added:Q.added,removed:Q.removed,updated:Q.updated});return}_(Z.stderr,`[mcp:catalog] r${Q.revision} ${Q.serverName} +${Q.added.length} -${Q.removed.length} ~${Q.updated.length}`)},mcpContentChanged(Q){if($==="jsonl"){G("mcp_content_changed",{revision:Q.revision,server_name:Q.serverName,content_kind:Q.contentKind==="resourceTemplates"?"resource_templates":Q.contentKind,added:Q.added,removed:Q.removed,updated:Q.updated});return}_(Z.stderr,`[mcp:${Q.contentKind}] r${Q.revision} ${Q.serverName} +${Q.added.length} -${Q.removed.length} ~${Q.updated.length}`)},mcpResourceUpdated(Q){if($==="jsonl"){G("mcp_resource_updated",{revision:Q.revision,server_name:Q.serverName,uri:Q.uri});return}_(Z.stderr,`[mcp:resource] r${Q.revision} ${Q.serverName} updated ${Q.uri}`)},mcpConnectionChanged(Q){if($==="jsonl"){G("mcp_connection_changed",{revision:Q.revision,server_name:Q.serverName,phase:Q.phase,reason:Q.reason,attempt:Q.attempt,max_attempts:Q.maxAttempts,...Q.nextRetryAt!==void 0?{next_retry_at:Q.nextRetryAt}:{},...Q.error?{error:Q.error}:{}});return}_(Z.stderr,`[mcp:connection] r${Q.revision} ${Q.serverName} ${Q.phase} ${Q.attempt}/${Q.maxAttempts}`)},mcpLog(Q){if($==="jsonl"){G("mcp_log",{revision:Q.revision,server_name:Q.serverName,level:Q.level,logger:Q.logger,message:Q.message,projected_bytes:Q.projectedBytes,data_sha256:Q.dataSha256,truncated:Q.truncated,details_omitted:Q.detailsOmitted,timestamp:Q.timestamp,synthetic:Q.synthetic});return}_(Z.stderr,`[mcp:log] ${Q.level} ${Q.serverName}${Q.logger?` logger=${Q.logger}`:""}: ${Q.message}`)},mcpInstructionsChanged(Q){if($==="jsonl"){G("mcp_instructions_changed",{revision:Q.revision,server_name:Q.serverName,action:Q.action,reason:Q.reason,text:Q.text,source_bytes:Q.sourceBytes,projected_bytes:Q.projectedBytes,sha256:Q.sha256,truncated:Q.truncated,details_omitted:Q.detailsOmitted});return}_(Z.stderr,`[mcp:instructions] ${Q.action} ${Q.serverName}${Q.truncated?" (truncated)":""}`)},mcpTaskChanged(Q){if($==="jsonl"){G("mcp_task_changed",{revision:Q.revision,task_id:Q.taskId,server_name:Q.serverName,tool_name:Q.toolName,status:Q.status,status_message:Q.statusMessage,created_at:Q.createdAt,updated_at:Q.updatedAt,completed_at:Q.completedAt,has_result:Q.hasResult,error:Q.error});return}_(Z.stderr,`[mcp:task] ${Q.taskId} ${Q.serverName}/${Q.toolName} `+Q.status)},projectRulesLoaded(Q){if($==="jsonl"){G("project_rules_loaded",{files:Q.files.map((Y)=>({id:Y.id,relative_path:Y.relativePath,source:Y.source,conditional:Y.conditional,content_sha256:Y.contentSha256})),trigger_paths:Q.triggerPaths,blocked_write:Q.blockedWrite});return}_(Z.stderr,`[project-rules] loaded ${Q.files.length} file(s)${Q.blockedWrite?" before write":""}`)},userShellStarted(Q,Y,U){if($==="jsonl"){G("user_shell_started",{execution_id:Q,command:Y,auxiliary:U});return}_(Z.stderr,`[user-shell:start] ${Y}`)},userShellOutput(Q,Y,U,K){if($==="jsonl"){G("user_shell_output",{execution_id:Q,stream:Y,chunk:U,stream_truncated:K});return}(Y==="stderr"?Z.stderr:Z.stdout).write(U)},userShellCompleted(Q){if($==="jsonl"){G("user_shell_completed",{execution_id:Q.executionId,message_id:Q.messageId,status:Q.record.status,exit_code:Q.record.exitCode,duration_ms:Q.record.durationMs,stdout:Q.record.stdout,stderr:Q.record.stderr,truncated:Q.record.truncated,auxiliary:Q.auxiliary});return}_(Z.stderr,`[user-shell:${Q.record.status}] exit=${Q.record.exitCode??"null"} ${Q.record.durationMs}ms`)},phase(Q,Y,U,K={}){if($==="jsonl"){G("phase",{phase:Q,status:Y,message:U,turn:K.turn,tool_name:K.toolName,target:K.target});return}_(Z.stderr,`[phase:${Q}] ${U}`)},toolDetail(Q,Y){if($==="jsonl"){G("tool_detail",{tool_name:Q,detail:Y});return}_(Z.stderr,Y)},taskUpdate(Q){if($==="jsonl"){G("task_update",{tasks:Q});return}for(let Y of Q)_(Z.stderr,oq(Y))},subagent(Q){let Y=Q.kind==="subagent_spawned";if($==="jsonl"){G("subagent",{state:Y?"spawned":"completed",session_id:Q.sessionId,subagent_type:Q.type,success:Y?void 0:Q.success,summary:Y?void 0:Q.summary,verification_verdict:Y?void 0:Q.verificationVerdict,resumed_from:Q.resumedFrom,root_agent_id:Q.rootAgentId,resume_depth:Q.resumeDepth});return}_(Z.stderr,`[subagent:${Y?"spawned":"completed"}] ${Q.sessionId}${Q.resumedFrom?` resumed from ${Q.resumedFrom}`:""}`)},tokenUsage(Q){if($==="jsonl"){G("token_usage",{input_tokens:Q.inputTokens,output_tokens:Q.outputTokens,total_tokens:Q.totalTokens,max_context_tokens:Q.maxContextTokens,cache_read_tokens:Q.cacheReadTokens,cache_write_tokens:Q.cacheWriteTokens,cost_usd:Q.costUsd});return}_(Z.stderr,`[tokens] in=${Q.inputTokens} out=${Q.outputTokens} total=${Q.totalTokens} / ${Q.maxContextTokens}`)},compacting(Q){if($==="jsonl"){G("compacting",{state:Q?"started":"completed"});return}_(Z.stderr,Q?"[context] compacting started":"[context] compacting completed")},turnLimit(Q){if($==="jsonl"){G("turn_limit",{turns_count:Q,action:"continue"});return}_(Z.stderr,`[turn-limit] continuing after ${Q} turns`)},taskSession(Q){if($==="jsonl"){G("task_session",{session_id:Q.sessionId,project_path:Q.projectPath,source_project_path:Q.sourceProjectPath,isolation:Q.isolation,worktree_branch:Q.worktreeBranch,base_commit:Q.baseCommit});return}_(Z.stderr,`[task:${Q.isolation}] ${Q.sessionId} ${Q.sourceProjectPath} -> ${Q.projectPath}${Q.worktreeBranch?` (${Q.worktreeBranch})`:""}`)},taskAdmission(Q){if($==="jsonl"){G("task_admission",{state:Q.state,queue_position:Q.queuePosition,queue_depth:Q.queueDepth,in_flight:Q.inFlight,max_concurrent_tasks:Q.maxConcurrentTasks});return}_(Z.stderr,Q.state==="queued"?`[task:queued] position ${Q.queuePosition??1}/${Q.queueDepth} (running ${Q.inFlight}/${Q.maxConcurrentTasks})`:`[task:running] admitted (running ${Q.inFlight}/${Q.maxConcurrentTasks})`)},output(Q,Y=0){if($==="jsonl"){G("output",{content:Q,exit_code:Y});return}_(Y===0?Z.stdout:Z.stderr,Q)},error(Q){if($==="jsonl"){G("error",{message:Q});return}_(Z.stderr,Q)}}}async function QQ(Z,$={stdout:process.stdout,stderr:process.stderr},G){let Q="text",Y=c($,Q),U=new Vq,K={targetLocked:!1},A,E,I=lq(G);try{let D=sq(Z);Q=eq(D.outputFormat),Y=c($,Q),await Yq();let Xq=await Zq(D),H=await $q(Xq);if(H.mode==="output"){if(H.content)Y.output(H.content,H.exitCode??0);return H.exitCode??0}let J=H.content.trimStart().startsWith("!")?H.content.trimStart().slice(1).trim():void 0;if(J!==void 0&&D.taskIsolation)throw Error("User shell commands cannot be combined with --task-isolation");if(D.taskIsolation&&(D.continue||D.resume||D.forkSession))throw Error("--task-isolation cannot be combined with --continue, --resume, or --fork-session");let{sessionId:R,messages:S,metadata:O}=await Gq({sessionId:D.sessionId,continue:D.continue,resume:D.resume,forkSession:D.forkSession,fallbackSessionPrefix:"headless"}),P=D.permissionMode??O?.permissionMode??"yolo",h=D.model&&D.model!=="inherit"?D.model:m()?.id,b=D.taskIsolation?await Qq.createSessionTask({sessionId:R,prompt:H.content,sourceProjectPath:x(),isolation:D.taskIsolation,dispatch:{version:1,prompt:H.content,sourceProjectPath:x(),isolation:D.taskIsolation,permissionMode:P,...h?{modelId:h}:{}}}):void 0,N=b?.metadata.projectPath??O?.projectPath??x();if(!b)await u.setSessionPermissionMode(R,N,P);if(b)Y.taskSession({sessionId:R,projectPath:N,sourceProjectPath:b.metadata.taskSourceProjectPath??x(),isolation:D.taskIsolation,worktreeBranch:b.metadata.taskWorktreeBranch,baseCommit:b.metadata.taskBaseCommit}),E=v.subscribe((V)=>{if(V.type!=="task.status"||V.sessionId!==R||V.projectPath!==N||!["queued","running"].includes(String(V.properties.taskStatus))||typeof V.properties.taskQueueDepth!=="number"||typeof V.properties.taskInFlight!=="number"||typeof V.properties.taskConcurrencyLimit!=="number")return;Y.taskAdmission({state:V.properties.taskStatus,queuePosition:typeof V.properties.taskQueuePosition==="number"?V.properties.taskQueuePosition:void 0,queueDepth:V.properties.taskQueueDepth,inFlight:V.properties.taskInFlight,maxConcurrentTasks:V.properties.taskConcurrencyLimit})});let Dq={messages:[...S],userId:"cli-user",sessionId:R,workspaceRoot:N,permissionMode:P,signal:I.signal,...b?.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:nq()};if(A=await i.create({sessionId:R,workspaceRoot:N,modelId:D.model,permissionMode:P,mcpConfig:D.mcpConfig,strictMcpConfig:D.strictMcpConfig,agents:D.agents?o(D.agents):void 0,...b?.taskWorktree?{taskWorktree:b.taskWorktree}:{},...b?.metadata.taskIsolation?{taskIsolation:b.metadata.taskIsolation}:{},...S.length>0?{sessionStart:{isResume:!0,resumeSessionId:R}}:{}}),J!==void 0){let V=await A.executeUserShellCommand(J,{signal:I.signal,onEvent:(X)=>{if(X.type==="started")Y.userShellStarted(X.executionId,X.command,X.auxiliary);else if(X.type==="output")Y.userShellOutput(X.executionId,X.stream,X.chunk,X.streamTruncated)}});return Y.userShellCompleted(V),V.record.status==="completed"?0:V.record.status==="aborted"?130:V.record.exitCode??1}let Bq=D.maxTurns??A.getConfig().maxTurns,Uq=b?.taskWorktree?[...new Set([...D.disallowedTools??[],"EnterWorktree","ExitWorktree"])]:D.disallowedTools,_q=await a.createWithRuntime(A,{sessionId:R,systemPrompt:D.systemPrompt,appendSystemPrompt:D.appendSystemPrompt,maxTurns:D.maxTurns,modelId:D.model,permissionMode:P,toolWhitelist:D.allowedTools,toolBlacklist:Uq,mcpConfig:D.mcpConfig,strictMcpConfig:D.strictMcpConfig}),W=await l(_q.chatStream(H.content,Dq,{stream:!0,signal:I.signal,maxTurns:D.maxTurns,...Bq===-1?{onTurnLimitReached:async(V)=>{return Y.turnLimit(V.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}:{}}),async(V)=>{switch(V.kind){case"content_delta":U.markAssistantContent(),Y.contentDelta(V.delta);break;case"thinking_delta":U.setThinkingOpened(Y.thinkingDelta(V.delta,U.hasOpenThinking()));break;case"stream_end":{let X=U.completeStream();Y.streamEnd(X.wroteAssistantContent,X.openedThinking);break}case"tool_start":{let X=V.toolCall;if(!("function"in X))break;if(["TaskCreate","TaskUpdate","TaskList"].includes(X.function.name))break;try{let z=JSON.parse(X.function.arguments),M=r(X.function.name,z),f=y(X.function.name,z),L=qQ(X.function.name,M,f,K);if(L.shouldLockTarget)K.targetLocked=!0;Y.phase(L.phase,L.status,L.message,{toolName:X.function.name,target:f}),Y.toolStart(X.function.name,M,f,V.toolKind)}catch{Y.phase(K.targetLocked?"executing":"searching",K.targetLocked?"hit":"ongoing",K.targetLocked?`Working within target: ${X.function.name}`:`Still searching: ${X.function.name}`,{toolName:X.function.name}),Y.toolStart(X.function.name,X.function.name,void 0,V.toolKind)}break}case"tool_progress":{let X=V.toolCall;if(!("function"in X))break;Y.toolProgress(X.function.name,V.update.message,V.update.progress,V.update.total);break}case"tool_result":{let X=V.toolCall;if(!("function"in X))break;let z;try{let f=JSON.parse(X.function.arguments);z=y(X.function.name,f)}catch{z=void 0}let M=s(X.function.name,V.result);if(Y.toolResult(X.function.name,M.summary,z,void 0,{success:V.result.success,errorType:V.result.error?.type,errorMessage:V.result.error?.message}),M.detail)Y.toolDetail(X.function.name,M.detail);break}case"token_usage":Y.tokenUsage(V.usage);break;case"compaction":Y.compacting(V.phase==="start");break;case"task_update":Y.taskUpdate(V.tasks);break;case"mcp_catalog_changed":Y.mcpCatalogChanged(V);break;case"mcp_content_changed":Y.mcpContentChanged(V);break;case"mcp_resource_updated":Y.mcpResourceUpdated(V);break;case"mcp_connection_changed":Y.mcpConnectionChanged(V);break;case"mcp_log":Y.mcpLog(V);break;case"mcp_instructions_changed":Y.mcpInstructionsChanged(V);break;case"mcp_task_changed":Y.mcpTaskChanged(V);break;case"project_rules_loaded":Y.projectRulesLoaded(V);break;case"steering_applied":case"follow_up_started":case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":Y.subagent(V);break;case"model_fallback":break;case"turn_start":if(V.turn===1)K.targetLocked=!1;Y.phase("turn",K.targetLocked?"hit":"ongoing",`Turn ${V.turn} started`,{turn:V.turn});break;default:{let X=V}}});if(W.metadata?.outputTruncated)Y.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");if(!W.success)return Y.error(`Error: ${W.error?.message??"Agent execution failed"}`),1;return Y.phase("completed","done","Headless run completed"),0}catch(D){if(U.hasOpenThinking()&&Q==="text")$.stderr.write(`
6
- `);return Y.error(`Error: ${tq(D)}`),1}finally{E?.();try{await A?.dispose()}finally{I.dispose()}}}async function JQ(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:G,"output-format":Q,"system-prompt":Y,"append-system-prompt":U,"max-turns":K,...A}=n,E=mq(uq(process.argv)).scriptName("blade").strict(!1).options(A).middleware([e,t,qq]);return aq(E),await E.parse(),!0}export{QQ as runHeadless,JQ as handleHeadlessMode,iq as HeadlessOptionsSchema};