blade-code 0.6.3 → 0.6.4

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 (48) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-07xv0cqp.js +1 -0
  3. package/dist/{chunk-t44946na.js → chunk-0e9dhemy.js} +3 -3
  4. package/dist/{chunk-qjhxk0yp.js → chunk-2zk921d9.js} +1 -1
  5. package/dist/chunk-3mmm8g84.js +1 -0
  6. package/dist/{chunk-r9vneqaw.js → chunk-59e6eg4b.js} +1 -1
  7. package/dist/{chunk-m1tnx0je.js → chunk-5bs94pb1.js} +9 -9
  8. package/dist/{chunk-t7hd45rg.js → chunk-6mfmy7nq.js} +2 -2
  9. package/dist/chunk-7c9k2c9m.js +1 -0
  10. package/dist/chunk-7t23swne.js +2125 -0
  11. package/dist/{chunk-39h8jdm3.js → chunk-7ycmx7c2.js} +1 -1
  12. package/dist/chunk-9p4fe43p.js +1 -0
  13. package/dist/{chunk-kevt8v3j.js → chunk-9vsbmtqj.js} +1 -1
  14. package/dist/{chunk-j1ehsp0x.js → chunk-bpx8x87m.js} +2 -2
  15. package/dist/{chunk-m7xm1ssb.js → chunk-cfe1fywb.js} +1 -1
  16. package/dist/{chunk-b5nhr3na.js → chunk-ck43cs45.js} +1 -1
  17. package/dist/{chunk-kds0h72f.js → chunk-dmc5gf4f.js} +1 -1
  18. package/dist/{chunk-g54k7rea.js → chunk-evc1xkeb.js} +1 -1
  19. package/dist/{chunk-9m9nqfc4.js → chunk-ey640ttd.js} +1 -1
  20. package/dist/chunk-f24ahjpc.js +1 -0
  21. package/dist/{chunk-21zps3hb.js → chunk-h46kk20y.js} +1 -1
  22. package/dist/{chunk-7rjrzngk.js → chunk-hc91pmdk.js} +1 -1
  23. package/dist/{chunk-s53zeref.js → chunk-j7nh0j36.js} +1 -1
  24. package/dist/{chunk-99gfk9b2.js → chunk-jm9r362m.js} +1 -1
  25. package/dist/{chunk-08h3wmqh.js → chunk-k063tt5h.js} +1 -1
  26. package/dist/{chunk-y57hcnk6.js → chunk-m26jr2tg.js} +1 -1
  27. package/dist/{chunk-67dzm8te.js → chunk-m41xq6d0.js} +1 -1
  28. package/dist/{chunk-0b3f8r1e.js → chunk-mpn4zfcn.js} +1 -1
  29. package/dist/{chunk-g7bw2nkz.js → chunk-njq4w631.js} +4 -4
  30. package/dist/{chunk-gn1acna6.js → chunk-nm2w2ftg.js} +1 -1
  31. package/dist/{chunk-nrh2jage.js → chunk-p8pggabj.js} +1 -1
  32. package/dist/{chunk-5v2jzxpw.js → chunk-qnvkxpkw.js} +1 -1
  33. package/dist/{chunk-zfy765hj.js → chunk-sfr69fw8.js} +1 -1
  34. package/dist/{chunk-63954vzc.js → chunk-sh1pk5j3.js} +1 -1
  35. package/dist/{chunk-gp3rn8f8.js → chunk-tdarh4fh.js} +1 -1
  36. package/dist/{chunk-8a2z6mgp.js → chunk-tz44akn7.js} +1 -1
  37. package/dist/chunk-vxgexcsm.js +1 -0
  38. package/dist/{chunk-8fq1wzv3.js → chunk-w96xaeyd.js} +1 -1
  39. package/dist/{chunk-ambewjsk.js → chunk-zm78rg9t.js} +1 -1
  40. package/dist/{chunk-t344cq6m.js → chunk-zwwvv85t.js} +1 -1
  41. package/package.json +2 -1
  42. package/dist/chunk-3ak4p05x.js +0 -1
  43. package/dist/chunk-563zye36.js +0 -1
  44. package/dist/chunk-8zh508xk.js +0 -2125
  45. package/dist/chunk-caw1bxy6.js +0 -1
  46. package/dist/chunk-drrgdzrf.js +0 -1
  47. package/dist/chunk-g7xh4e99.js +0 -1
  48. package/dist/chunk-n9mwp62v.js +0 -1
package/dist/blade.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{n as B}from"./chunk-63954vzc.js";import{$ as F,_ as D}from"./chunk-g54k7rea.js";import"./chunk-21zps3hb.js";import"./chunk-67dzm8te.js";import"./chunk-t44946na.js";import{wb as E,yb as q}from"./chunk-39h8jdm3.js";import{Hb as H}from"./chunk-j1ehsp0x.js";import{Kb as J}from"./chunk-s53zeref.js";var X=process.argv.slice(2),$=v(X),w=$!==null;if($!==null)H.setGlobalDebug($);function v(Q){for(let W=0;W<Q.length;W+=1){let T=Q[W];if(T==="--debug"||T==="-d"){let N=Q[W+1];return N&&!N.startsWith("-")?N:!0}if(T.startsWith("--debug="))return T.slice(8)||!0}return null}function C(Q){return Q.length===1&&(Q[0]==="--version"||Q[0]==="-V")}function z(Q,...W){return Q.some((T)=>W.some((N)=>T===N||T.startsWith(`${N}=`)))}async function f(){if(C(X)){let{getVersion:K}=await import("./chunk-08h3wmqh.js");console.log(K());return}let Q=D(process.cwd());if(F(Q),E(q()),process.getuid&&process.getuid()===0){let K=!!process.env.SUDO_USER,U=!!process.env.BLADE_ALLOW_ROOT;if(K&&!U)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}if(B(),z(X,"--headless")){let{handleHeadlessMode:K}=await import("./chunk-ambewjsk.js");if(await K())return}if(z(X,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-0b3f8r1e.js");if(await K())return}if(X.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-kds0h72f.js");await K();return}let[{default:W},{hideBin:T},{cliConfig:N,globalOptions:G},{loadConfiguration:I,validateOutput:L,validatePermissions:M},{doctorCommands:_},{installCommands:y},{mcpCommands:R},{serveCommand:S},{updateCommands:k},{webCommand:O}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-drrgdzrf.js"),import("./chunk-g7xh4e99.js"),import("./chunk-y57hcnk6.js"),import("./chunk-gn1acna6.js"),import("./chunk-9m9nqfc4.js"),import("./chunk-gp3rn8f8.js"),import("./chunk-7rjrzngk.js"),import("./chunk-99gfk9b2.js")]),x=W(T(process.argv)).scriptName(N.scriptName).usage(N.usage).version(N.version).locale(N.locale).showHelpOnFail(N.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(N.strict).parserConfiguration({"populate--":!0}).options(G).middleware([M,I,L]).command(R).command(_).command(k).command(y).command(O).command(S).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((K,U,Z)=>{if(U){if(console.error("An error occurred:"),console.error(U.message),w&&U.stack)console.error(`
2
+ import{n as B}from"./chunk-sh1pk5j3.js";import{$ as F,_ as D}from"./chunk-evc1xkeb.js";import"./chunk-h46kk20y.js";import"./chunk-m41xq6d0.js";import"./chunk-0e9dhemy.js";import{vb as E,xb as q}from"./chunk-7ycmx7c2.js";import{Gb as H}from"./chunk-bpx8x87m.js";import{Jb as J}from"./chunk-j7nh0j36.js";var X=process.argv.slice(2),$=v(X),w=$!==null;if($!==null)H.setGlobalDebug($);function v(Q){for(let W=0;W<Q.length;W+=1){let T=Q[W];if(T==="--debug"||T==="-d"){let N=Q[W+1];return N&&!N.startsWith("-")?N:!0}if(T.startsWith("--debug="))return T.slice(8)||!0}return null}function C(Q){return Q.length===1&&(Q[0]==="--version"||Q[0]==="-V")}function z(Q,...W){return Q.some((T)=>W.some((N)=>T===N||T.startsWith(`${N}=`)))}async function f(){if(C(X)){let{getVersion:K}=await import("./chunk-k063tt5h.js");console.log(K());return}let Q=D(process.cwd());if(F(Q),E(q()),process.getuid&&process.getuid()===0){let K=!!process.env.SUDO_USER,U=!!process.env.BLADE_ALLOW_ROOT;if(K&&!U)console.error(""),console.error("Error: 请不要使用 sudo 运行 blade"),console.error(""),console.error("原因:"),console.error(" 使用 sudo 会创建属于 root 的配置文件,"),console.error(" 导致普通用户无法访问。"),console.error(""),console.error("正确用法:"),console.error(" blade # 直接运行,不要加 sudo"),console.error(""),console.error("如果遇到权限错误,请运行:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("如果你确实需要以 root 运行(容器/CI),设置环境变量:"),console.error(" BLADE_ALLOW_ROOT=1 blade"),console.error(""),process.exit(1)}if(B(),z(X,"--headless")){let{handleHeadlessMode:K}=await import("./chunk-zm78rg9t.js");if(await K())return}if(z(X,"--print","-p")){let{handlePrintMode:K}=await import("./chunk-mpn4zfcn.js");if(await K())return}if(X.includes("--acp")){let{runAcpIntegration:K}=await import("./chunk-dmc5gf4f.js");await K();return}let[{default:W},{hideBin:T},{cliConfig:N,globalOptions:G},{loadConfiguration:I,validateOutput:L,validatePermissions:M},{doctorCommands:_},{installCommands:y},{mcpCommands:R},{serveCommand:S},{updateCommands:k},{webCommand:O}]=await Promise.all([import("yargs"),import("yargs/helpers"),import("./chunk-9p4fe43p.js"),import("./chunk-3mmm8g84.js"),import("./chunk-m26jr2tg.js"),import("./chunk-nm2w2ftg.js"),import("./chunk-ey640ttd.js"),import("./chunk-tdarh4fh.js"),import("./chunk-hc91pmdk.js"),import("./chunk-jm9r362m.js")]),x=W(T(process.argv)).scriptName(N.scriptName).usage(N.usage).version(N.version).locale(N.locale).showHelpOnFail(N.showHelpOnFail).demandCommand(0,"").recommendCommands().strict(N.strict).parserConfiguration({"populate--":!0}).options(G).middleware([M,I,L]).command(R).command(_).command(k).command(y).command(O).command(S).completion("completion",!1).help("help","Show help").alias("help","h").alias("version","V").fail((K,U,Z)=>{if(U){if(console.error("An error occurred:"),console.error(U.message),w&&U.stack)console.error(`
3
3
  Stack trace:`),console.error(U.stack);else console.error(`
4
4
  Run with --debug to show the stack trace.`);process.exit(1)}if(K)console.error("Error: Invalid arguments:"),console.error(K),console.error(`
5
- Hint: Did you mean:`),Z.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let U=K._.slice(1),Z=U.length>0?U.join(" "):void 0,V=import("./chunk-n9mwp62v.js").then(({checkVersionOnStartup:A})=>A()),[{render:b},{createElement:P},{AppWrapper:h}]=await Promise.all([import("ink"),import("react"),import("./chunk-m1tnx0je.js")]),Y={...K,initialMessage:Z,debug:K.debug,print:Boolean(K.print),versionCheckPromise:V};delete Y._,delete Y.$0,delete Y.message,b(P(h,Y),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await x.parse()}catch(K){console.error("Error: Parse error:",K),process.exit(1)}}if(J.main==J.module)f().catch(console.error);export{f as main};
5
+ Hint: Did you mean:`),Z.showHelp(),process.exit(1)}).command("$0",!1,()=>{},async(K)=>{let U=K._.slice(1),Z=U.length>0?U.join(" "):void 0,V=import("./chunk-7c9k2c9m.js").then(({checkVersionOnStartup:A})=>A()),[{render:b},{createElement:P},{AppWrapper:h}]=await Promise.all([import("ink"),import("react"),import("./chunk-5bs94pb1.js")]),Y={...K,initialMessage:Z,debug:K.debug,print:Boolean(K.print),versionCheckPromise:V};delete Y._,delete Y.$0,delete Y.message,b(P(h,Y),{patchConsole:!0,exitOnCtrlC:!1,alternateBuffer:!1})});try{await x.parse()}catch(K){console.error("Error: Parse error:",K),process.exit(1)}}if(J.main==J.module)f().catch(console.error);export{f as main};
@@ -0,0 +1 @@
1
+ import{ga as a}from"./chunk-ck43cs45.js";import"./chunk-h46kk20y.js";import"./chunk-m41xq6d0.js";import"./chunk-7ycmx7c2.js";import"./chunk-bpx8x87m.js";import"./chunk-j7nh0j36.js";export{a as SpecManager};
@@ -1,4 +1,4 @@
1
- import{yb as l}from"./chunk-39h8jdm3.js";import{Ib as x}from"./chunk-j1ehsp0x.js";import{Kb as N}from"./chunk-s53zeref.js";import{nanoid as j}from"nanoid";var U;((R)=>{R.PreToolUse="PreToolUse";R.PostToolUse="PostToolUse";R.PostToolUseFailure="PostToolUseFailure";R.PermissionRequest="PermissionRequest";R.UserPromptSubmit="UserPromptSubmit";R.SessionStart="SessionStart";R.SessionEnd="SessionEnd";R.Stop="Stop";R.SubagentStop="SubagentStop";R.Notification="Notification";R.Compaction="Compaction"})(U||={});var w;((W)=>{W.Approve="approve";W.Block="block";W.Async="async"})(w||={});var M;((W)=>{W.Allow="allow";W.Deny="deny";W.Ask="ask"})(M||={});var C={enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,httpPolicy:{},PreToolUse:[],PostToolUse:[{name:"builtin:code-review-sensor",matcher:{tools:"Edit|Write"},hooks:[{type:"prompt",prompt:"审查此代码变更,重点检查:"+"1) 安全漏洞(命令注入、XSS、SQL 注入、硬编码密钥/密码)"+"2) 明显的逻辑错误(无限循环、off-by-one、空引用)"+"3) 类型安全问题。"+"如果发现严重问题,将问题描述放在 hookSpecificOutput.additionalContext 中。"+"如果没有严重问题,返回 approve。",model:void 0,timeout:15}]}],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]};function S(Q,Y){return{...Q,...Y,PreToolUse:Y.PreToolUse??Q.PreToolUse,PostToolUse:Y.PostToolUse??Q.PostToolUse,PostToolUseFailure:Y.PostToolUseFailure??Q.PostToolUseFailure,PermissionRequest:Y.PermissionRequest??Q.PermissionRequest,UserPromptSubmit:Y.UserPromptSubmit??Q.UserPromptSubmit,SessionStart:Y.SessionStart??Q.SessionStart,SessionEnd:Y.SessionEnd??Q.SessionEnd,Stop:Y.Stop??Q.Stop,SubagentStop:Y.SubagentStop??Q.SubagentStop,Notification:Y.Notification??Q.Notification,Compaction:Y.Compaction??Q.Compaction}}function m(){let Q={};if(process.env.BLADE_DISABLE_HOOKS==="true")Q.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let Y=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(Y)&&Y>0)Q.defaultTimeout=Y}return Q}class E{executedHooks=new Map;canExecute(Q,Y){if(!this.executedHooks.has(Q))this.executedHooks.set(Q,new Set);if(this.executedHooks.get(Q).has(Y))return console.warn(`[HookGuard] Hook ${Y} for tool ${Q} already executed, skipping`),!1;return!0}markExecuted(Q,Y){let Z=this.executedHooks.get(Q);if(Z)Z.add(Y)}cleanup(Q){this.executedHooks.delete(Q)}cleanupAll(){this.executedHooks.clear()}}import{z as $}from"zod";var L=$.object({hook_event_name:$.nativeEnum(U),hook_execution_id:$.string(),timestamp:$.string(),project_dir:$.string(),session_id:$.string(),permission_mode:$.enum(["default","autoEdit","yolo","plan"]),_metadata:$.object({blade_version:$.string(),hook_timeout_ms:$.number()}).optional()}),u=L.extend({hook_event_name:$.literal("PreToolUse"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown())}),i=L.extend({hook_event_name:$.literal("PostToolUse"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown()),tool_response:$.unknown()}),a=L.extend({hook_event_name:$.literal("Stop"),reason:$.string().optional()}),c=L.extend({hook_event_name:$.literal("PostToolUseFailure"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown()),error:$.string(),error_type:$.string().optional(),is_interrupt:$.boolean(),is_timeout:$.boolean()}),s=L.extend({hook_event_name:$.literal("PermissionRequest"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown())}),r=L.extend({hook_event_name:$.literal("UserPromptSubmit"),user_prompt:$.string(),has_images:$.boolean(),image_count:$.number()}),n=L.extend({hook_event_name:$.literal("SessionStart"),is_resume:$.boolean(),resume_session_id:$.string().optional()}),o=L.extend({hook_event_name:$.literal("SessionEnd"),reason:$.enum(["user_exit","error","max_turns","idle_timeout","ctrl_c","clear","logout","other"])}),e=L.extend({hook_event_name:$.literal("SubagentStop"),agent_type:$.string(),task_description:$.string().optional(),success:$.boolean(),result_summary:$.string().optional(),error:$.string().optional()}),t=L.extend({hook_event_name:$.literal("Notification"),notification_type:$.enum(["permission_prompt","idle_prompt","auth_success","elicitation_dialog","info","warning","error"]),title:$.string().optional(),message:$.string()}),QQ=L.extend({hook_event_name:$.literal("Compaction"),trigger:$.enum(["manual","auto"]),messages_before:$.number(),tokens_before:$.number()}),CQ=$.discriminatedUnion("hook_event_name",[u,i,a,c,s,r,n,o,e,t,QQ]),YQ=$.object({hookEventName:$.literal("PreToolUse"),permissionDecision:$.nativeEnum(M).optional(),permissionDecisionReason:$.string().optional(),updatedInput:$.record($.unknown()).optional()}),ZQ=$.object({hookEventName:$.literal("PostToolUse"),additionalContext:$.string().optional(),updatedOutput:$.unknown().optional()}),WQ=$.object({hookEventName:$.literal("Stop"),continue:$.boolean().optional(),continueReason:$.string().optional()}),XQ=$.object({hookEventName:$.literal("SubagentStop"),continue:$.boolean().optional(),continueReason:$.string().optional(),additionalContext:$.string().optional()}),$Q=$.object({hookEventName:$.literal("PermissionRequest"),permissionDecision:$.enum(["approve","deny","ask"]).optional(),permissionDecisionReason:$.string().optional()}),qQ=$.object({hookEventName:$.literal("UserPromptSubmit"),updatedPrompt:$.string().optional(),contextInjection:$.string().optional()}),JQ=$.object({hookEventName:$.literal("SessionStart"),env:$.record($.string()).optional()}),GQ=$.object({hookEventName:$.literal("Compaction"),blockCompaction:$.boolean().optional(),blockReason:$.string().optional()}),FQ=$.object({decision:$.object({behavior:$.nativeEnum(w)}).optional(),systemMessage:$.string().optional(),hookSpecificOutput:$.discriminatedUnion("hookEventName",[YQ,ZQ,WQ,XQ,$Q,qQ,JQ,GQ]).optional(),suppressOutput:$.boolean().optional()}),KQ=$.object({type:$.literal("command"),command:$.string(),timeout:$.number().positive().optional(),statusMessage:$.string().optional()}),VQ=$.object({type:$.literal("prompt"),prompt:$.string(),model:$.string().optional(),timeout:$.number().positive().optional()}),RQ=$.discriminatedUnion("type",[KQ,VQ]),I=$.union([$.string(),$.array($.string())]),_Q=$.object({tools:I.optional(),paths:I.optional(),commands:I.optional()}),D=$.object({name:$.string().optional(),matcher:_Q.optional(),hooks:$.array(RQ)}),SQ=$.object({enabled:$.boolean().optional(),defaultTimeout:$.number().positive().optional(),timeoutBehavior:$.enum(["ignore","deny","ask"]).optional(),failureBehavior:$.enum(["ignore","deny","ask"]).optional(),maxConcurrentHooks:$.number().positive().optional(),PreToolUse:$.array(D).optional(),PostToolUse:$.array(D).optional(),PostToolUseFailure:$.array(D).optional(),PermissionRequest:$.array(D).optional(),UserPromptSubmit:$.array(D).optional(),SessionStart:$.array(D).optional(),SessionEnd:$.array(D).optional(),Stop:$.array(D).optional(),SubagentStop:$.array(D).optional(),Notification:$.array(D).optional(),Compaction:$.array(D).optional()});function k(Q){let Y=FQ.safeParse(Q);if(Y.success)return{success:!0,data:Y.data};return{success:!1,error:Y.error}}class f{parse(Q,Y,Z){if(Q.timedOut){let X=Z?.timeoutBehavior||"ignore",q="Hook timeout";if(X==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}let W=this.tryParseJSON(Q.stdout);if(W){let X=k(W);if(!X.success){let J="error"in X?X.error.message:"Unknown validation error",G=Z?.failureBehavior||"ignore",F=`Invalid hook output JSON: ${J}`;if(G==="deny")return{success:!1,blocking:!0,error:F,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else if(G==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${F}. Continue?`,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else return{success:!1,blocking:!1,warning:F,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}let q=X.data;if(q.decision?.behavior==="block")return{success:!1,blocking:!0,error:q.systemMessage||"Hook blocked execution",output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};if(q.decision?.behavior==="async")return{success:!0,output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};return{success:!0,output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}return this.parseByExitCode(Q,Y,Z)}parseByExitCode(Q,Y,Z){let W=Q.exitCode;switch(W){case 0:return{success:!0,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};case 2:return{success:!1,blocking:!0,error:Q.stderr||Q.stdout||"Hook returned exit code 2",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};case 124:{let X=Z?.timeoutBehavior||"ignore",q="Hook timeout";if(X==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y}}default:{let X=Z?.failureBehavior||"ignore",q=Q.stderr||Q.stdout||`Hook failed with exit code ${W}`;if(X==="deny")return{success:!1,blocking:!0,error:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${q}. Continue?`,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else return{success:!1,blocking:!1,warning:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y}}}}tryParseJSON(Q){try{let Y=Q.trim();if(!Y)return null;let Z=Y.match(/^\s*(\{[\s\S]*\})\s*$/);if(!Z)return null;return JSON.parse(Z[1])}catch{return null}}}import{spawn as DQ}from"child_process";class z{content="";maxSize;constructor(Q){this.maxSize=Q}append(Q){if(this.content.length<this.maxSize){let Y=this.maxSize-this.content.length;this.content+=Q.substring(0,Y)}}getContent(){return this.content}isFull(){return this.content.length>=this.maxSize}}class H{MAX_STDOUT_SIZE=1048576;MAX_STDERR_SIZE=1048576;MAX_INPUT_SIZE=102400;async execute(Q,Y,Z,W){let X=JSON.stringify(Y);if(X.length>this.MAX_INPUT_SIZE)throw Error(`Hook input too large: ${X.length} bytes (max ${this.MAX_INPUT_SIZE})`);let q=this.createSafeEnv(Y),J=DQ(Q,[],{shell:!0,env:q,cwd:Z.projectDir,timeout:W}),G=new z(this.MAX_STDOUT_SIZE),F=new z(this.MAX_STDERR_SIZE);J.stdout.setEncoding("utf8"),J.stderr.setEncoding("utf8"),J.stdout.on("data",(K)=>{G.append(K)}),J.stderr.on("data",(K)=>{F.append(K)});try{J.stdin.write(X),J.stdin.end()}catch(K){throw J.kill("SIGTERM"),Error(`Failed to write hook input: ${K}`)}return new Promise((K,O)=>{let R=!1,_=!1,V=null,A=()=>{if(V&&Z.abortSignal)Z.abortSignal.removeEventListener("abort",V),V=null},B=setTimeout(()=>{R=!0,J.kill("SIGKILL")},W);if(J.on("close",(b)=>{if(_)return;_=!0,clearTimeout(B),A(),K({stdout:G.getContent(),stderr:F.getContent(),exitCode:R?124:b??1,timedOut:R})}),J.on("error",(b)=>{if(_)return;_=!0,clearTimeout(B),A(),O(b)}),Z.abortSignal)V=()=>{if(_)return;_=!0,clearTimeout(B),A(),J.kill("SIGTERM"),K({stdout:G.getContent(),stderr:"Hook cancelled by abort signal",exitCode:1,timedOut:!1})},Z.abortSignal.addEventListener("abort",V)})}createSafeEnv(Q){return{BLADE_PROJECT_DIR:Q.project_dir,BLADE_SESSION_ID:Q.session_id,BLADE_HOOK_EVENT:Q.hook_event_name,BLADE_TOOL_NAME:"tool_name"in Q?Q.tool_name:"",BLADE_TOOL_USE_ID:"tool_use_id"in Q?Q.tool_use_id:"",PATH:process.env.PATH||"",HOME:process.env.HOME||"",USER:process.env.USER||"",SHELL:process.env.SHELL||"/bin/sh"}}}class P extends Error{constructor(Q){super(Q);this.name="HttpHookSecurityError"}}function h(Q,Y={}){let Z;try{Z=new URL(Q)}catch{throw new P(`Invalid URL: ${Q}`)}if(Z.protocol!=="https:"&&Z.protocol!=="http:")throw new P(`Only http/https supported, got: ${Z.protocol}`);let W=Z.hostname.toLowerCase();if(LQ(W,Y.allowedHosts))return;if(Z.protocol==="http:"&&!Y.allowHttp)throw new P(`HTTP (non-TLS) blocked for ${W}; use https:// or add to allowedHosts`);if(jQ(W)&&!Y.allowLoopback)throw new P(`Loopback address blocked: ${W}; enable policy.allowLoopback or add to allowedHosts`);if(AQ(W)&&!Y.allowPrivateRanges)throw new P(`Private/link-local address blocked: ${W}; enable policy.allowPrivateRanges or add to allowedHosts`)}function LQ(Q,Y){if(!Y||Y.length===0)return!1;return Y.some((Z)=>{let W=Z.toLowerCase();if(W===Q)return!0;if(W.startsWith("*.")){let X=W.slice(1);return Q.endsWith(X)&&Q.length>X.length}return!1})}function jQ(Q){if(Q==="localhost")return!0;if(Q==="::1"||Q==="[::1]")return!0;if(/^127\.\d+\.\d+\.\d+$/.test(Q))return!0;return!1}function AQ(Q){let Y=Q.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(!Y)return!1;let[Z,W]=Y.slice(1).map(Number);if(Z===10)return!0;if(Z===172&&W>=16&&W<=31)return!0;if(Z===192&&W===168)return!0;if(Z===169&&W===254)return!0;return!1}function p(Q){if(!Q)return{};let Y={};for(let[Z,W]of Object.entries(Q))Y[Z]=W.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(X,q)=>{return process.env[q]??`\${${q}}`});return Y}var OQ=x("Execution"),BQ={PreToolUse:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "...", "updatedInput": { ... } }',PostToolUse:'{ "additionalContext": "注入到工具结果的额外信息", "updatedOutput": "修改后的工具输出" }',Stop:'{ "continue": true, "continueReason": "继续执行的原因" } // continue: true 表示阻止停止',SubagentStop:'{ "continue": true, "continueReason": "...", "additionalContext": "..." }',PermissionRequest:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "..." }',UserPromptSubmit:'{ "updatedPrompt": "修改后的提示词", "contextInjection": "注入的上下文" }',Compaction:'{ "blockCompaction": true, "blockReason": "阻止压缩的原因" }'};class v{processExecutor=new H;outputParser=new f;chatServiceCache=new Map;async executePreToolHooks(Q,Y,Z){if(Q.length===0)return{decision:"allow"};let W="tool_input"in Y?Y.tool_input:{},X=[];for(let q of Q)try{let J={...Y,...W&&{tool_input:W}},G=await this.executeHook(q,J,Z);if(!G.success){if(G.blocking)return{decision:"deny",reason:G.error};if(G.needsConfirmation)return{decision:"ask",reason:G.warning||G.error};if(G.warning)X.push(G.warning);continue}let F=G.output?.hookSpecificOutput;if(F&&"permissionDecision"in F){switch(F.permissionDecision){case"deny":return{decision:"deny",reason:F.permissionDecisionReason};case"ask":return{decision:"ask",reason:F.permissionDecisionReason};case"allow":break}if("updatedInput"in F&&F.updatedInput)W={...W,...F.updatedInput}}}catch(J){let G=J instanceof Error?J.message:String(J);if(X.push(`Hook failed: ${G}`),Z.config.failureBehavior==="deny")return{decision:"deny",reason:G};else if(Z.config.failureBehavior==="ask")return{decision:"ask",reason:`Hook failed: ${G}. Continue?`}}return{decision:"allow",modifiedInput:W,warning:X.length>0?X.join(`
1
+ import{xb as l}from"./chunk-7ycmx7c2.js";import{Hb as x}from"./chunk-bpx8x87m.js";import{Jb as N}from"./chunk-j7nh0j36.js";import{nanoid as j}from"nanoid";var U;((R)=>{R.PreToolUse="PreToolUse";R.PostToolUse="PostToolUse";R.PostToolUseFailure="PostToolUseFailure";R.PermissionRequest="PermissionRequest";R.UserPromptSubmit="UserPromptSubmit";R.SessionStart="SessionStart";R.SessionEnd="SessionEnd";R.Stop="Stop";R.SubagentStop="SubagentStop";R.Notification="Notification";R.Compaction="Compaction"})(U||={});var w;((W)=>{W.Approve="approve";W.Block="block";W.Async="async"})(w||={});var M;((W)=>{W.Allow="allow";W.Deny="deny";W.Ask="ask"})(M||={});var C={enabled:!1,defaultTimeout:60,timeoutBehavior:"ignore",failureBehavior:"ignore",maxConcurrentHooks:5,httpPolicy:{},PreToolUse:[],PostToolUse:[{name:"builtin:code-review-sensor",matcher:{tools:"Edit|Write"},hooks:[{type:"prompt",prompt:"审查此代码变更,重点检查:"+"1) 安全漏洞(命令注入、XSS、SQL 注入、硬编码密钥/密码)"+"2) 明显的逻辑错误(无限循环、off-by-one、空引用)"+"3) 类型安全问题。"+"如果发现严重问题,将问题描述放在 hookSpecificOutput.additionalContext 中。"+"如果没有严重问题,返回 approve。",model:void 0,timeout:15}]}],PostToolUseFailure:[],PermissionRequest:[],UserPromptSubmit:[],SessionStart:[],SessionEnd:[],Stop:[],SubagentStop:[],Notification:[],Compaction:[]};function S(Q,Y){return{...Q,...Y,PreToolUse:Y.PreToolUse??Q.PreToolUse,PostToolUse:Y.PostToolUse??Q.PostToolUse,PostToolUseFailure:Y.PostToolUseFailure??Q.PostToolUseFailure,PermissionRequest:Y.PermissionRequest??Q.PermissionRequest,UserPromptSubmit:Y.UserPromptSubmit??Q.UserPromptSubmit,SessionStart:Y.SessionStart??Q.SessionStart,SessionEnd:Y.SessionEnd??Q.SessionEnd,Stop:Y.Stop??Q.Stop,SubagentStop:Y.SubagentStop??Q.SubagentStop,Notification:Y.Notification??Q.Notification,Compaction:Y.Compaction??Q.Compaction}}function m(){let Q={};if(process.env.BLADE_DISABLE_HOOKS==="true")Q.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let Y=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(Y)&&Y>0)Q.defaultTimeout=Y}return Q}class E{executedHooks=new Map;canExecute(Q,Y){if(!this.executedHooks.has(Q))this.executedHooks.set(Q,new Set);if(this.executedHooks.get(Q).has(Y))return console.warn(`[HookGuard] Hook ${Y} for tool ${Q} already executed, skipping`),!1;return!0}markExecuted(Q,Y){let Z=this.executedHooks.get(Q);if(Z)Z.add(Y)}cleanup(Q){this.executedHooks.delete(Q)}cleanupAll(){this.executedHooks.clear()}}import{z as $}from"zod";var L=$.object({hook_event_name:$.nativeEnum(U),hook_execution_id:$.string(),timestamp:$.string(),project_dir:$.string(),session_id:$.string(),permission_mode:$.enum(["default","autoEdit","yolo","plan"]),_metadata:$.object({blade_version:$.string(),hook_timeout_ms:$.number()}).optional()}),u=L.extend({hook_event_name:$.literal("PreToolUse"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown())}),i=L.extend({hook_event_name:$.literal("PostToolUse"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown()),tool_response:$.unknown()}),a=L.extend({hook_event_name:$.literal("Stop"),reason:$.string().optional()}),c=L.extend({hook_event_name:$.literal("PostToolUseFailure"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown()),error:$.string(),error_type:$.string().optional(),is_interrupt:$.boolean(),is_timeout:$.boolean()}),s=L.extend({hook_event_name:$.literal("PermissionRequest"),tool_name:$.string(),tool_use_id:$.string(),tool_input:$.record($.unknown())}),r=L.extend({hook_event_name:$.literal("UserPromptSubmit"),user_prompt:$.string(),has_images:$.boolean(),image_count:$.number()}),n=L.extend({hook_event_name:$.literal("SessionStart"),is_resume:$.boolean(),resume_session_id:$.string().optional()}),o=L.extend({hook_event_name:$.literal("SessionEnd"),reason:$.enum(["user_exit","error","max_turns","idle_timeout","ctrl_c","clear","logout","other"])}),e=L.extend({hook_event_name:$.literal("SubagentStop"),agent_type:$.string(),task_description:$.string().optional(),success:$.boolean(),result_summary:$.string().optional(),error:$.string().optional()}),t=L.extend({hook_event_name:$.literal("Notification"),notification_type:$.enum(["permission_prompt","idle_prompt","auth_success","elicitation_dialog","info","warning","error"]),title:$.string().optional(),message:$.string()}),QQ=L.extend({hook_event_name:$.literal("Compaction"),trigger:$.enum(["manual","auto"]),messages_before:$.number(),tokens_before:$.number()}),CQ=$.discriminatedUnion("hook_event_name",[u,i,a,c,s,r,n,o,e,t,QQ]),YQ=$.object({hookEventName:$.literal("PreToolUse"),permissionDecision:$.nativeEnum(M).optional(),permissionDecisionReason:$.string().optional(),updatedInput:$.record($.unknown()).optional()}),ZQ=$.object({hookEventName:$.literal("PostToolUse"),additionalContext:$.string().optional(),updatedOutput:$.unknown().optional()}),WQ=$.object({hookEventName:$.literal("Stop"),continue:$.boolean().optional(),continueReason:$.string().optional()}),XQ=$.object({hookEventName:$.literal("SubagentStop"),continue:$.boolean().optional(),continueReason:$.string().optional(),additionalContext:$.string().optional()}),$Q=$.object({hookEventName:$.literal("PermissionRequest"),permissionDecision:$.enum(["approve","deny","ask"]).optional(),permissionDecisionReason:$.string().optional()}),qQ=$.object({hookEventName:$.literal("UserPromptSubmit"),updatedPrompt:$.string().optional(),contextInjection:$.string().optional()}),JQ=$.object({hookEventName:$.literal("SessionStart"),env:$.record($.string()).optional()}),GQ=$.object({hookEventName:$.literal("Compaction"),blockCompaction:$.boolean().optional(),blockReason:$.string().optional()}),FQ=$.object({decision:$.object({behavior:$.nativeEnum(w)}).optional(),systemMessage:$.string().optional(),hookSpecificOutput:$.discriminatedUnion("hookEventName",[YQ,ZQ,WQ,XQ,$Q,qQ,JQ,GQ]).optional(),suppressOutput:$.boolean().optional()}),KQ=$.object({type:$.literal("command"),command:$.string(),timeout:$.number().positive().optional(),statusMessage:$.string().optional()}),VQ=$.object({type:$.literal("prompt"),prompt:$.string(),model:$.string().optional(),timeout:$.number().positive().optional()}),RQ=$.discriminatedUnion("type",[KQ,VQ]),I=$.union([$.string(),$.array($.string())]),_Q=$.object({tools:I.optional(),paths:I.optional(),commands:I.optional()}),D=$.object({name:$.string().optional(),matcher:_Q.optional(),hooks:$.array(RQ)}),SQ=$.object({enabled:$.boolean().optional(),defaultTimeout:$.number().positive().optional(),timeoutBehavior:$.enum(["ignore","deny","ask"]).optional(),failureBehavior:$.enum(["ignore","deny","ask"]).optional(),maxConcurrentHooks:$.number().positive().optional(),PreToolUse:$.array(D).optional(),PostToolUse:$.array(D).optional(),PostToolUseFailure:$.array(D).optional(),PermissionRequest:$.array(D).optional(),UserPromptSubmit:$.array(D).optional(),SessionStart:$.array(D).optional(),SessionEnd:$.array(D).optional(),Stop:$.array(D).optional(),SubagentStop:$.array(D).optional(),Notification:$.array(D).optional(),Compaction:$.array(D).optional()});function k(Q){let Y=FQ.safeParse(Q);if(Y.success)return{success:!0,data:Y.data};return{success:!1,error:Y.error}}class f{parse(Q,Y,Z){if(Q.timedOut){let X=Z?.timeoutBehavior||"ignore",q="Hook timeout";if(X==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}let W=this.tryParseJSON(Q.stdout);if(W){let X=k(W);if(!X.success){let J="error"in X?X.error.message:"Unknown validation error",G=Z?.failureBehavior||"ignore",F=`Invalid hook output JSON: ${J}`;if(G==="deny")return{success:!1,blocking:!0,error:F,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else if(G==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${F}. Continue?`,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};else return{success:!1,blocking:!1,warning:F,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}let q=X.data;if(q.decision?.behavior==="block")return{success:!1,blocking:!0,error:q.systemMessage||"Hook blocked execution",output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};if(q.decision?.behavior==="async")return{success:!0,output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y};return{success:!0,output:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:Q.exitCode,hook:Y}}return this.parseByExitCode(Q,Y,Z)}parseByExitCode(Q,Y,Z){let W=Q.exitCode;switch(W){case 0:return{success:!0,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};case 2:return{success:!1,blocking:!0,error:Q.stderr||Q.stdout||"Hook returned exit code 2",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};case 124:{let X=Z?.timeoutBehavior||"ignore",q="Hook timeout";if(X==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y}}default:{let X=Z?.failureBehavior||"ignore",q=Q.stderr||Q.stdout||`Hook failed with exit code ${W}`;if(X==="deny")return{success:!1,blocking:!0,error:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else if(X==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${q}. Continue?`,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y};else return{success:!1,blocking:!1,warning:q,stdout:Q.stdout,stderr:Q.stderr,exitCode:W,hook:Y}}}}tryParseJSON(Q){try{let Y=Q.trim();if(!Y)return null;let Z=Y.match(/^\s*(\{[\s\S]*\})\s*$/);if(!Z)return null;return JSON.parse(Z[1])}catch{return null}}}import{spawn as DQ}from"child_process";class z{content="";maxSize;constructor(Q){this.maxSize=Q}append(Q){if(this.content.length<this.maxSize){let Y=this.maxSize-this.content.length;this.content+=Q.substring(0,Y)}}getContent(){return this.content}isFull(){return this.content.length>=this.maxSize}}class H{MAX_STDOUT_SIZE=1048576;MAX_STDERR_SIZE=1048576;MAX_INPUT_SIZE=102400;async execute(Q,Y,Z,W){let X=JSON.stringify(Y);if(X.length>this.MAX_INPUT_SIZE)throw Error(`Hook input too large: ${X.length} bytes (max ${this.MAX_INPUT_SIZE})`);let q=this.createSafeEnv(Y),J=DQ(Q,[],{shell:!0,env:q,cwd:Z.projectDir,timeout:W}),G=new z(this.MAX_STDOUT_SIZE),F=new z(this.MAX_STDERR_SIZE);J.stdout.setEncoding("utf8"),J.stderr.setEncoding("utf8"),J.stdout.on("data",(K)=>{G.append(K)}),J.stderr.on("data",(K)=>{F.append(K)});try{J.stdin.write(X),J.stdin.end()}catch(K){throw J.kill("SIGTERM"),Error(`Failed to write hook input: ${K}`)}return new Promise((K,O)=>{let R=!1,_=!1,V=null,A=()=>{if(V&&Z.abortSignal)Z.abortSignal.removeEventListener("abort",V),V=null},B=setTimeout(()=>{R=!0,J.kill("SIGKILL")},W);if(J.on("close",(b)=>{if(_)return;_=!0,clearTimeout(B),A(),K({stdout:G.getContent(),stderr:F.getContent(),exitCode:R?124:b??1,timedOut:R})}),J.on("error",(b)=>{if(_)return;_=!0,clearTimeout(B),A(),O(b)}),Z.abortSignal)V=()=>{if(_)return;_=!0,clearTimeout(B),A(),J.kill("SIGTERM"),K({stdout:G.getContent(),stderr:"Hook cancelled by abort signal",exitCode:1,timedOut:!1})},Z.abortSignal.addEventListener("abort",V)})}createSafeEnv(Q){return{BLADE_PROJECT_DIR:Q.project_dir,BLADE_SESSION_ID:Q.session_id,BLADE_HOOK_EVENT:Q.hook_event_name,BLADE_TOOL_NAME:"tool_name"in Q?Q.tool_name:"",BLADE_TOOL_USE_ID:"tool_use_id"in Q?Q.tool_use_id:"",PATH:process.env.PATH||"",HOME:process.env.HOME||"",USER:process.env.USER||"",SHELL:process.env.SHELL||"/bin/sh"}}}class P extends Error{constructor(Q){super(Q);this.name="HttpHookSecurityError"}}function h(Q,Y={}){let Z;try{Z=new URL(Q)}catch{throw new P(`Invalid URL: ${Q}`)}if(Z.protocol!=="https:"&&Z.protocol!=="http:")throw new P(`Only http/https supported, got: ${Z.protocol}`);let W=Z.hostname.toLowerCase();if(LQ(W,Y.allowedHosts))return;if(Z.protocol==="http:"&&!Y.allowHttp)throw new P(`HTTP (non-TLS) blocked for ${W}; use https:// or add to allowedHosts`);if(jQ(W)&&!Y.allowLoopback)throw new P(`Loopback address blocked: ${W}; enable policy.allowLoopback or add to allowedHosts`);if(AQ(W)&&!Y.allowPrivateRanges)throw new P(`Private/link-local address blocked: ${W}; enable policy.allowPrivateRanges or add to allowedHosts`)}function LQ(Q,Y){if(!Y||Y.length===0)return!1;return Y.some((Z)=>{let W=Z.toLowerCase();if(W===Q)return!0;if(W.startsWith("*.")){let X=W.slice(1);return Q.endsWith(X)&&Q.length>X.length}return!1})}function jQ(Q){if(Q==="localhost")return!0;if(Q==="::1"||Q==="[::1]")return!0;if(/^127\.\d+\.\d+\.\d+$/.test(Q))return!0;return!1}function AQ(Q){let Y=Q.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(!Y)return!1;let[Z,W]=Y.slice(1).map(Number);if(Z===10)return!0;if(Z===172&&W>=16&&W<=31)return!0;if(Z===192&&W===168)return!0;if(Z===169&&W===254)return!0;return!1}function p(Q){if(!Q)return{};let Y={};for(let[Z,W]of Object.entries(Q))Y[Z]=W.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(X,q)=>{return process.env[q]??`\${${q}}`});return Y}var OQ=x("Execution"),BQ={PreToolUse:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "...", "updatedInput": { ... } }',PostToolUse:'{ "additionalContext": "注入到工具结果的额外信息", "updatedOutput": "修改后的工具输出" }',Stop:'{ "continue": true, "continueReason": "继续执行的原因" } // continue: true 表示阻止停止',SubagentStop:'{ "continue": true, "continueReason": "...", "additionalContext": "..." }',PermissionRequest:'{ "permissionDecision": "approve" | "deny" | "ask", "permissionDecisionReason": "..." }',UserPromptSubmit:'{ "updatedPrompt": "修改后的提示词", "contextInjection": "注入的上下文" }',Compaction:'{ "blockCompaction": true, "blockReason": "阻止压缩的原因" }'};class v{processExecutor=new H;outputParser=new f;chatServiceCache=new Map;async executePreToolHooks(Q,Y,Z){if(Q.length===0)return{decision:"allow"};let W="tool_input"in Y?Y.tool_input:{},X=[];for(let q of Q)try{let J={...Y,...W&&{tool_input:W}},G=await this.executeHook(q,J,Z);if(!G.success){if(G.blocking)return{decision:"deny",reason:G.error};if(G.needsConfirmation)return{decision:"ask",reason:G.warning||G.error};if(G.warning)X.push(G.warning);continue}let F=G.output?.hookSpecificOutput;if(F&&"permissionDecision"in F){switch(F.permissionDecision){case"deny":return{decision:"deny",reason:F.permissionDecisionReason};case"ask":return{decision:"ask",reason:F.permissionDecisionReason};case"allow":break}if("updatedInput"in F&&F.updatedInput)W={...W,...F.updatedInput}}}catch(J){let G=J instanceof Error?J.message:String(J);if(X.push(`Hook failed: ${G}`),Z.config.failureBehavior==="deny")return{decision:"deny",reason:G};else if(Z.config.failureBehavior==="ask")return{decision:"ask",reason:`Hook failed: ${G}. Continue?`}}return{decision:"allow",modifiedInput:W,warning:X.length>0?X.join(`
2
2
  `):void 0}}async executePostToolHooks(Q,Y,Z){if(Q.length===0)return{};let W=Z.config.maxConcurrentHooks||5,X=await this.executeHooksConcurrently(Q,Y,Z,W),q=[],J=void 0,G=[];for(let F of X){if(!F.success&&F.warning){G.push(F.warning);continue}let K=F.output?.hookSpecificOutput;if(K&&"additionalContext"in K){if(K.additionalContext)q.push(K.additionalContext);if("updatedOutput"in K&&K.updatedOutput!==void 0)J=K.updatedOutput}}return{additionalContext:q.length>0?q.join(`
3
3
 
4
4
  `):void 0,modifiedOutput:J,warning:G.length>0?G.join(`
@@ -21,7 +21,7 @@ import{yb as l}from"./chunk-39h8jdm3.js";import{Ib as x}from"./chunk-j1ehsp0x.js
21
21
  `):void 0}}async executeNotificationHooks(Q,Y,Z){let W="message"in Y?Y.message:"";if(Q.length===0)return{suppress:!1,message:W};let X=[],q=!1,J=W;for(let G of Q)try{let F=await this.executeHook(G,Y,Z);if(!F.success){if(F.warning)X.push(F.warning);continue}if(F.output?.suppressOutput){q=!0;break}if(F.stdout&&F.stdout.trim())J=F.stdout.trim()}catch(F){let K=F instanceof Error?F.message:String(F);X.push(`Hook failed: ${K}`)}return{suppress:q,message:J,warning:X.length>0?X.join(`
22
22
  `):void 0}}async executeCompactionHooks(Q,Y,Z){if(Q.length===0)return{blockCompaction:!1};let W=[];for(let X of Q)try{let q=await this.executeHook(X,Y,Z);if(!q.success){if(q.warning)W.push(q.warning);continue}let J=q.output?.hookSpecificOutput;if(J&&"blockCompaction"in J&&J.blockCompaction)return{blockCompaction:!0,blockReason:J.blockReason,warning:W.length>0?W.join(`
23
23
  `):void 0}}catch(q){let J=q instanceof Error?q.message:String(q);W.push(`Hook failed: ${J}`)}return{blockCompaction:!1,warning:W.length>0?W.join(`
24
- `):void 0}}async executeHook(Q,Y,Z){if(Q.type==="command")return this.executeCommandHook(Q,Y,Z);if(Q.type==="prompt")return this.executePromptHook(Q,Y,Z);if(Q.type==="function")return this.executeFunctionHook(Q,Y,Z);if(Q.type==="http")return this.executeHttpHook(Q,Y,Z);throw Error(`Hook type ${Q.type} not supported`)}async executeCommandHook(Q,Y,Z){let W=(Q.timeout??Z.config.defaultTimeout??60)*1000;try{let X=await this.processExecutor.execute(Q.command,Y,Z,W);return this.outputParser.parse(X,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){return{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}async executePromptHook(Q,Y,Z){let W=(Q.timeout??Z.config.defaultTimeout??60)*1000;try{let X=await this.getOrCreateChatService(Q.model),q="hook_event_name"in Y?String(Y.hook_event_name):"Unknown",J=this.buildPromptHookSystemMessage(Q,q),G=JSON.stringify(Y,null,2),F=new AbortController,K=setTimeout(()=>F.abort(),W),O;try{O=(await X.chat([{role:"system",content:J},{role:"user",content:G}],void 0,F.signal)).content}catch(_){if(F.signal.aborted||_ instanceof Error&&_.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior});throw _}finally{clearTimeout(K)}let R=this.extractJsonFromLLMResponse(O);return this.outputParser.parse({stdout:R,stderr:"",exitCode:0,timedOut:!1},Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){return OQ.warn(`[PromptHook] 执行失败: ${X instanceof Error?X.message:String(X)}`),{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}async executeFunctionHook(Q,Y,Z){let W=(Q.timeout??10)*1000;try{let X=await this.runFunctionWithTimeout(Q.handler,Y,Z,W);if(X===void 0||X===null)return{success:!0,hook:Q};let q={stdout:JSON.stringify(X),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(q,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){if(X.isTimeout){let q={stdout:"",stderr:`Function hook timeout after ${W}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse(q,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}return{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}runFunctionWithTimeout(Q,Y,Z,W){return new Promise((X,q)=>{let J=!1,G=setTimeout(()=>{if(J)return;J=!0;let K=Object.assign(Error(`Function hook timed out after ${W}ms`),{isTimeout:!0});q(K)},W),F=()=>{if(J)return;J=!0,clearTimeout(G),q(Error("Function hook aborted"))};Z.abortSignal?.addEventListener("abort",F,{once:!0}),Promise.resolve().then(()=>Q(Y,Z)).then((K)=>{if(J)return;J=!0,clearTimeout(G),Z.abortSignal?.removeEventListener("abort",F),X(K)},(K)=>{if(J)return;J=!0,clearTimeout(G),Z.abortSignal?.removeEventListener("abort",F),q(K)})})}async executeHttpHook(Q,Y,Z){let W=(Q.timeout??10)*1000,X=Q.maxResponseBytes??262144,q=Math.max(1,(Q.retries??0)+1);try{h(Q.url,Z.config.httpPolicy)}catch(K){return{success:!1,blocking:!0,error:K instanceof Error?K.message:String(K),hook:Q}}let J={"Content-Type":"application/json",...p(Q.headers)},G=JSON.stringify(Y),F;for(let K=0;K<q;K++){if(K>0){let V=Math.min(2**K*200,5000);await new Promise((A)=>setTimeout(A,V))}let O=new AbortController,R=setTimeout(()=>O.abort(),W),_=()=>O.abort();Z.abortSignal?.addEventListener("abort",_,{once:!0});try{let V=await fetch(Q.url,{method:"POST",headers:J,body:G,redirect:"manual",signal:O.signal});if(V.status>=300&&V.status<400){F=Error(`HTTP hook received redirect (${V.status}); redirects are disabled`);continue}if(!V.ok){if(F=Error(`HTTP hook returned ${V.status} ${V.statusText}`),V.status>=400&&V.status<500)break;continue}let B={stdout:await PQ(V,X),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(B,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(V){let A=V.name==="AbortError"||V.code==="ABORT_ERR";if(A&&Z.abortSignal?.aborted){F=Error("HTTP hook aborted by caller");break}if(A){let B={stdout:"",stderr:`HTTP hook timeout after ${W}ms`,exitCode:124,timedOut:!0};if(K===q-1)return this.outputParser.parse(B,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior});F=Error(`HTTP hook timeout attempt ${K+1}`);continue}F=V}finally{clearTimeout(R),Z.abortSignal?.removeEventListener("abort",_)}}return{success:!1,blocking:!1,error:F?.message??"HTTP hook failed",hook:Q}}async getOrCreateChatService(Q){let Y=Q||"__default__",Z=this.chatServiceCache.get(Y);if(Z)return Z;let{ensureStoreInitialized:W,getCurrentModel:X,getModelById:q}=await import("./chunk-kevt8v3j.js"),{createChatServiceAsync:J}=await import("./chunk-caw1bxy6.js");await W();let G=Q?q(Q)||X():X();if(!G)throw Error("PromptHook: 无法获取模型配置。请确保至少配置了一个模型。");let F=await J({provider:G.provider,apiKey:G.apiKey,baseUrl:G.baseUrl,model:G.model,temperature:G.temperature,maxContextTokens:G.maxContextTokens,maxOutputTokens:G.maxOutputTokens});return this.chatServiceCache.set(Y,F),F}buildPromptHookSystemMessage(Q,Y){let Z=BQ[Y]||"{ ... 根据事件类型返回相应字段 }";return`你是一个代码质量评估器,作为 Hook 在 ${Y} 事件中被触发。
24
+ `):void 0}}async executeHook(Q,Y,Z){if(Q.type==="command")return this.executeCommandHook(Q,Y,Z);if(Q.type==="prompt")return this.executePromptHook(Q,Y,Z);if(Q.type==="function")return this.executeFunctionHook(Q,Y,Z);if(Q.type==="http")return this.executeHttpHook(Q,Y,Z);throw Error(`Hook type ${Q.type} not supported`)}async executeCommandHook(Q,Y,Z){let W=(Q.timeout??Z.config.defaultTimeout??60)*1000;try{let X=await this.processExecutor.execute(Q.command,Y,Z,W);return this.outputParser.parse(X,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){return{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}async executePromptHook(Q,Y,Z){let W=(Q.timeout??Z.config.defaultTimeout??60)*1000;try{let X=await this.getOrCreateChatService(Q.model),q="hook_event_name"in Y?String(Y.hook_event_name):"Unknown",J=this.buildPromptHookSystemMessage(Q,q),G=JSON.stringify(Y,null,2),F=new AbortController,K=setTimeout(()=>F.abort(),W),O;try{O=(await X.chat([{role:"system",content:J},{role:"user",content:G}],void 0,F.signal)).content}catch(_){if(F.signal.aborted||_ instanceof Error&&_.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior});throw _}finally{clearTimeout(K)}let R=this.extractJsonFromLLMResponse(O);return this.outputParser.parse({stdout:R,stderr:"",exitCode:0,timedOut:!1},Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){return OQ.warn(`[PromptHook] 执行失败: ${X instanceof Error?X.message:String(X)}`),{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}async executeFunctionHook(Q,Y,Z){let W=(Q.timeout??10)*1000;try{let X=await this.runFunctionWithTimeout(Q.handler,Y,Z,W);if(X===void 0||X===null)return{success:!0,hook:Q};let q={stdout:JSON.stringify(X),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(q,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(X){if(X.isTimeout){let q={stdout:"",stderr:`Function hook timeout after ${W}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse(q,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}return{success:!1,blocking:!1,error:X instanceof Error?X.message:String(X),hook:Q}}}runFunctionWithTimeout(Q,Y,Z,W){return new Promise((X,q)=>{let J=!1,G=setTimeout(()=>{if(J)return;J=!0;let K=Object.assign(Error(`Function hook timed out after ${W}ms`),{isTimeout:!0});q(K)},W),F=()=>{if(J)return;J=!0,clearTimeout(G),q(Error("Function hook aborted"))};Z.abortSignal?.addEventListener("abort",F,{once:!0}),Promise.resolve().then(()=>Q(Y,Z)).then((K)=>{if(J)return;J=!0,clearTimeout(G),Z.abortSignal?.removeEventListener("abort",F),X(K)},(K)=>{if(J)return;J=!0,clearTimeout(G),Z.abortSignal?.removeEventListener("abort",F),q(K)})})}async executeHttpHook(Q,Y,Z){let W=(Q.timeout??10)*1000,X=Q.maxResponseBytes??262144,q=Math.max(1,(Q.retries??0)+1);try{h(Q.url,Z.config.httpPolicy)}catch(K){return{success:!1,blocking:!0,error:K instanceof Error?K.message:String(K),hook:Q}}let J={"Content-Type":"application/json",...p(Q.headers)},G=JSON.stringify(Y),F;for(let K=0;K<q;K++){if(K>0){let V=Math.min(2**K*200,5000);await new Promise((A)=>setTimeout(A,V))}let O=new AbortController,R=setTimeout(()=>O.abort(),W),_=()=>O.abort();Z.abortSignal?.addEventListener("abort",_,{once:!0});try{let V=await fetch(Q.url,{method:"POST",headers:J,body:G,redirect:"manual",signal:O.signal});if(V.status>=300&&V.status<400){F=Error(`HTTP hook received redirect (${V.status}); redirects are disabled`);continue}if(!V.ok){if(F=Error(`HTTP hook returned ${V.status} ${V.statusText}`),V.status>=400&&V.status<500)break;continue}let B={stdout:await PQ(V,X),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(B,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior})}catch(V){let A=V.name==="AbortError"||V.code==="ABORT_ERR";if(A&&Z.abortSignal?.aborted){F=Error("HTTP hook aborted by caller");break}if(A){let B={stdout:"",stderr:`HTTP hook timeout after ${W}ms`,exitCode:124,timedOut:!0};if(K===q-1)return this.outputParser.parse(B,Q,{timeoutBehavior:Z.config.timeoutBehavior,failureBehavior:Z.config.failureBehavior});F=Error(`HTTP hook timeout attempt ${K+1}`);continue}F=V}finally{clearTimeout(R),Z.abortSignal?.removeEventListener("abort",_)}}return{success:!1,blocking:!1,error:F?.message??"HTTP hook failed",hook:Q}}async getOrCreateChatService(Q){let Y=Q||"__default__",Z=this.chatServiceCache.get(Y);if(Z)return Z;let{ensureStoreInitialized:W,getCurrentModel:X,getModelById:q}=await import("./chunk-9vsbmtqj.js"),{createChatServiceAsync:J}=await import("./chunk-vxgexcsm.js");await W();let G=Q?q(Q)||X():X();if(!G)throw Error("PromptHook: 无法获取模型配置。请确保至少配置了一个模型。");let F=await J({provider:G.provider,apiKey:G.apiKey,baseUrl:G.baseUrl,model:G.model,temperature:G.temperature,maxContextTokens:G.maxContextTokens,maxOutputTokens:G.maxOutputTokens});return this.chatServiceCache.set(Y,F),F}buildPromptHookSystemMessage(Q,Y){let Z=BQ[Y]||"{ ... 根据事件类型返回相应字段 }";return`你是一个代码质量评估器,作为 Hook 在 ${Y} 事件中被触发。
25
25
 
26
26
  `+`## 评估指令
27
27
  ${Q.prompt}
@@ -38,4 +38,4 @@ ${Q.prompt}
38
38
  `+`- 只输出 JSON,不要包含 markdown 代码块或其他文本
39
39
  `+`- 如果没有发现问题,使用 "approve"
40
40
  `+'- 只在发现严重问题时使用 "block"'}extractJsonFromLLMResponse(Q){let Y=Q.trim(),Z=Y.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);if(Z)return Z[1].trim();return Y}async executeHooksConcurrently(Q,Y,Z,W){let X=[],q=new Set;for(let J of Q){if(q.size>=W)await Promise.race(q);let G=this.executeHook(J,Y,Z).catch((K)=>({success:!1,blocking:!1,error:K instanceof Error?K.message:String(K),hook:J})),F=G.then(()=>{q.delete(F)}).catch(()=>{q.delete(F)});q.add(F),X.push(G)}return Promise.all(X)}}async function PQ(Q,Y){let Z=Q.body?.getReader();if(!Z)return"";let W=new TextDecoder,X=0,q="";while(!0){let{value:J,done:G}=await Z.read();if(G)break;if(X+=J.byteLength,X>Y){try{Z.cancel()}catch{}q+=W.decode(J.slice(0,Y-(X-J.byteLength)));break}q+=W.decode(J,{stream:!0})}return q+=W.decode(),q}import g from"picomatch";var TQ=/^([A-Za-z0-9_|]+)\((.+)\)$/;class d{matches(Q,Y){if(!Q)return!0;if(Q.tools&&Y.toolName){if(!this.matchTools(Q.tools,Y))return!1}if(Q.paths&&Y.filePath){if(!this.matchPaths(Q.paths,Y.filePath))return!1}if(Q.commands&&Y.command){if(!this.matchCommands(Q.commands,Y.command))return!1}return!0}matchTools(Q,Y){if(Array.isArray(Q))return Q.some((Z)=>this.matchToolWithParams(Z,Y));return this.matchToolWithParams(Q,Y)}matchPaths(Q,Y){if(Array.isArray(Q))return Q.some((W)=>{return g(W)(Y)});return g(Q)(Y)}matchCommands(Q,Y){if(Array.isArray(Q))return Q.some((Z)=>this.matchPattern(Y,Z));return this.matchPattern(Y,Q)}matchToolWithParams(Q,Y){let{toolName:Z,command:W,filePath:X}=Y,q=TQ.exec(Q);if(!q)return this.matchPattern(Z,Q);let[,J,G]=q;if(!this.matchPattern(Z,J))return!1;let F=this.getArgValue(Z,W,X);if(!F)return!1;return this.matchGlobOrPattern(F,G)}getArgValue(Q,Y,Z){if(Q==="Bash"||Q==="BashTool")return Y;if(["Read","Edit","Write","Glob","Grep"].includes(Q))return Z;return Y||Z}matchGlobOrPattern(Q,Y){if(/[*?[\]{}!]/.test(Y))try{return g(Y,{bash:!0,dot:!0})(Q)}catch{}if(Y.endsWith("*")){let Z=Y.slice(0,-1);return Q.startsWith(Z)}return Q===Y}matchPattern(Q,Y){if(Y==="*")return!0;if(!Y.includes("|")&&!/[.*+?^${}()|[\]\\]/.test(Y))return Q===Y;if(Y.includes("|"))return Y.split("|").map((W)=>W.trim()).includes(Q);try{return new RegExp(Y).test(Q)}catch{return Q===Y}}}class T{static instance=null;config=C;executor=new v;guard=new E;matcher=new d;sessionDisabled=!1;constructor(){}static getInstance(){if(!T.instance)T.instance=new T;return T.instance}loadConfig(Q){let Y=S(C,Q),Z=m();Y=S(Y,Z),this.config=Y}isEnabled(){if(!this.config.enabled)return!1;if(this.sessionDisabled)return!1;return!0}disable(){this.sessionDisabled=!0,console.log("[HookManager] Hooks disabled for this session")}enable(){this.sessionDisabled=!1,console.log("[HookManager] Hooks enabled for this session")}getConfig(){return this.config}registerFunction(Q,Y,Z,W){let X={type:"function",handler:Z,timeout:W?.timeout},q={name:W?.name??`inline-${Q}-${Date.now()}`,matcher:Y,hooks:[X]},J=this.config[Q]??[];return this.config[Q]=[...J,q],()=>{let G=this.config[Q];if(!G)return;this.config[Q]=G.filter((F)=>F!==q)}}async reloadConfig(){let Q=await import("node:fs/promises"),Y=await import("node:path");try{let Z=Y.join(l(),".blade","settings.local.json"),W=await Q.readFile(Z,"utf-8"),X=JSON.parse(W);if(X.hooks)this.loadConfig(X.hooks)}catch{}}async executePreToolHooks(Q,Y,Z,W){if(!this.isEnabled())return{decision:"allow"};if(W.permissionMode==="plan")return{decision:"allow"};if(!this.guard.canExecute(Y,"PreToolUse"))return{decision:"allow"};let X={hook_event_name:"PreToolUse",hook_execution_id:j(),timestamp:new Date().toISOString(),tool_name:Q,tool_use_id:Y,tool_input:Z,project_dir:W.projectDir,session_id:W.sessionId,permission_mode:W.permissionMode},q=this.getMatchingHooks("PreToolUse",{toolName:Q,filePath:this.extractFilePath(Z),command:this.extractCommand(Q,Z)});if(q.length===0)return{decision:"allow"};let J={projectDir:W.projectDir,sessionId:W.sessionId,permissionMode:W.permissionMode,config:this.config,abortSignal:W.abortSignal};try{let G=await this.executor.executePreToolHooks(q,X,J);if(this.guard.markExecuted(Y,"PreToolUse"),W.permissionMode==="yolo"){if(G.decision==="deny")return G;return{decision:"allow",modifiedInput:G.modifiedInput,warning:G.warning,reason:G.reason}}return G}catch(G){return console.error("[HookManager] Error executing PreToolUse hooks:",G),{decision:"allow",warning:`Hook execution failed: ${G instanceof Error?G.message:String(G)}`}}}async executePostToolHooks(Q,Y,Z,W,X){if(!this.isEnabled())return{};if(X.permissionMode==="plan")return{};if(!this.guard.canExecute(Y,"PostToolUse"))return{};let q={hook_event_name:"PostToolUse",hook_execution_id:j(),timestamp:new Date().toISOString(),tool_name:Q,tool_use_id:Y,tool_input:Z,tool_response:W,project_dir:X.projectDir,session_id:X.sessionId,permission_mode:X.permissionMode},J=this.getMatchingHooks("PostToolUse",{toolName:Q,filePath:this.extractFilePath(Z),command:this.extractCommand(Q,Z)});if(J.length===0)return{};let G={projectDir:X.projectDir,sessionId:X.sessionId,permissionMode:X.permissionMode,config:this.config,abortSignal:X.abortSignal};try{let F=await this.executor.executePostToolHooks(J,q,G);return this.guard.markExecuted(Y,"PostToolUse"),F}catch(F){return console.error("[HookManager] Error executing PostToolUse hooks:",F),{warning:`Hook execution failed: ${F instanceof Error?F.message:String(F)}`}}finally{this.guard.cleanup(Y)}}async executeStopHooks(Q){if(!this.isEnabled())return{shouldStop:!0};let Y={hook_event_name:"Stop",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode,reason:Q.reason},Z=this.getMatchingHooks("Stop",{});if(Z.length===0)return{shouldStop:!0};let W={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:this.config,abortSignal:Q.abortSignal};try{return await this.executor.executeStopHooks(Z,Y,W)}catch(X){return console.error("[HookManager] Error executing Stop hooks:",X),{shouldStop:!0,warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executeSubagentStopHooks(Q,Y){if(!this.isEnabled())return{shouldStop:!0};let Z={hook_event_name:"SubagentStop",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode,agent_type:Q,task_description:Y.taskDescription,success:Y.success,result_summary:Y.resultSummary,error:Y.error},W=this.getMatchingHooks("SubagentStop",{});if(W.length===0)return{shouldStop:!0};let X={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{return await this.executor.executeSubagentStopHooks(W,Z,X)}catch(q){return console.error("[HookManager] Error executing SubagentStop hooks:",q),{shouldStop:!0,warning:`Hook execution failed: ${q instanceof Error?q.message:String(q)}`}}}async executePermissionRequestHooks(Q,Y,Z,W){if(!this.isEnabled())return{decision:"ask"};let X={hook_event_name:"PermissionRequest",hook_execution_id:j(),timestamp:new Date().toISOString(),tool_name:Q,tool_use_id:Y,tool_input:Z,project_dir:W.projectDir,session_id:W.sessionId,permission_mode:W.permissionMode},q=this.getMatchingHooks("PermissionRequest",{toolName:Q,filePath:this.extractFilePath(Z),command:this.extractCommand(Q,Z)});if(q.length===0)return{decision:"ask"};let J={projectDir:W.projectDir,sessionId:W.sessionId,permissionMode:W.permissionMode,config:this.config,abortSignal:W.abortSignal};try{return await this.executor.executePermissionRequestHooks(q,X,J)}catch(G){return console.error("[HookManager] Error executing PermissionRequest hooks:",G),{decision:"ask",warning:`Hook execution failed: ${G instanceof Error?G.message:String(G)}`}}}async executeUserPromptSubmitHooks(Q,Y){if(!this.isEnabled())return{proceed:!0};let Z={hook_event_name:"UserPromptSubmit",hook_execution_id:j(),timestamp:new Date().toISOString(),user_prompt:Q,has_images:Y.hasImages,image_count:Y.imageCount,project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode},W=this.getMatchingHooks("UserPromptSubmit",{});if(W.length===0)return{proceed:!0};let X={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{return await this.executor.executeUserPromptSubmitHooks(W,Z,X)}catch(q){return console.error("[HookManager] Error executing UserPromptSubmit hooks:",q),{proceed:!0,warning:`Hook execution failed: ${q instanceof Error?q.message:String(q)}`}}}async executeSessionStartHooks(Q){if(!this.isEnabled())return{proceed:!0};let Y={hook_event_name:"SessionStart",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode,is_resume:Q.isResume,resume_session_id:Q.resumeSessionId},Z=this.getMatchingHooks("SessionStart",{});if(Z.length===0)return{proceed:!0};let W={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:this.config,abortSignal:Q.abortSignal};try{return await this.executor.executeSessionStartHooks(Z,Y,W)}catch(X){return console.error("[HookManager] Error executing SessionStart hooks:",X),{proceed:!0,warning:`Hook execution failed: ${X instanceof Error?X.message:String(X)}`}}}async executeSessionEndHooks(Q,Y){if(!this.isEnabled())return{};let Z={hook_event_name:"SessionEnd",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode,reason:Q},W=this.getMatchingHooks("SessionEnd",{});if(W.length===0)return{};let X={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{return await this.executor.executeSessionEndHooks(W,Z,X),{}}catch(q){return console.error("[HookManager] Error executing SessionEnd hooks:",q),{warning:`Hook execution failed: ${q instanceof Error?q.message:String(q)}`}}}async executePostToolUseFailureHooks(Q,Y,Z,W,X){if(!this.isEnabled())return{};let q={hook_event_name:"PostToolUseFailure",hook_execution_id:j(),timestamp:new Date().toISOString(),tool_name:Q,tool_use_id:Y,tool_input:Z,error:W,error_type:X.errorType,is_interrupt:X.isInterrupt,is_timeout:X.isTimeout,project_dir:X.projectDir,session_id:X.sessionId,permission_mode:X.permissionMode},J=this.getMatchingHooks("PostToolUseFailure",{toolName:Q,filePath:this.extractFilePath(Z),command:this.extractCommand(Q,Z)});if(J.length===0)return{};let G={projectDir:X.projectDir,sessionId:X.sessionId,permissionMode:X.permissionMode,config:this.config,abortSignal:X.abortSignal};try{return await this.executor.executePostToolUseFailureHooks(J,q,G)}catch(F){return console.error("[HookManager] Error executing PostToolUseFailure hooks:",F),{warning:`Hook execution failed: ${F instanceof Error?F.message:String(F)}`}}}async executeNotificationHooks(Q,Y,Z){if(!this.isEnabled())return{suppress:!1,message:Y};let W={hook_event_name:"Notification",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Z.projectDir,session_id:Z.sessionId,permission_mode:Z.permissionMode,notification_type:Q,title:Z.title,message:Y},X=this.getMatchingHooks("Notification",{});if(X.length===0)return{suppress:!1,message:Y};let q={projectDir:Z.projectDir,sessionId:Z.sessionId,permissionMode:Z.permissionMode,config:this.config,abortSignal:Z.abortSignal};try{return await this.executor.executeNotificationHooks(X,W,q)}catch(J){return console.error("[HookManager] Error executing Notification hooks:",J),{suppress:!1,message:Y,warning:`Hook execution failed: ${J instanceof Error?J.message:String(J)}`}}}async executeCompactionHooks(Q,Y){if(!this.isEnabled())return{blockCompaction:!1};let Z={hook_event_name:"Compaction",hook_execution_id:j(),timestamp:new Date().toISOString(),project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode,trigger:Q,messages_before:Y.messagesBefore,tokens_before:Y.tokensBefore},W=this.getMatchingHooks("Compaction",{});if(W.length===0)return{blockCompaction:!1};let X={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{return await this.executor.executeCompactionHooks(W,Z,X)}catch(q){return console.error("[HookManager] Error executing Compaction hooks:",q),{blockCompaction:!1,warning:`Hook execution failed: ${q instanceof Error?q.message:String(q)}`}}}getMatchingHooks(Q,Y){let Z=this.config[Q]||[],W=[];for(let X of Z)if(this.matcher.matches(X.matcher,Y))W.push(...X.hooks);return W}extractFilePath(Q){let Y=["file_path","path","filePath","source","target"];for(let Z of Y){let W=Q[Z];if(typeof W==="string")return W}return}extractCommand(Q,Y){if(Q==="Bash"||Q==="BashTool"){let Z=Y.command;if(typeof Z==="string")return Z}return}cleanup(){this.guard.cleanupAll()}}
41
- export{U as nb,T as ob};
41
+ export{U as mb,T as nb};
@@ -1 +1 @@
1
- import{$a as k,Ra as a,Sa as b,Ta as c,Ua as d,Va as e,Wa as f,Xa as g,Ya as h,Za as i,_a as j,ab as l,bb as m,cb as n,db as o,gb as p,hb as q,ib as r}from"./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";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,a as isRootSystemPrompt,l as handleTaskListUpdate,m as handleSkillActivation,n as extractModelSwitch,r as executeLoopGenerator,c as drainLoop,f as checkStopHook,d as checkOutputRecovery,e as checkIncompleteIntent,q as checkAndCompactInLoop,o as applyToolDomainEffects,p as StreamingToolExecutor,b as ConversationState};
1
+ import{$a as k,Ra as a,Sa as b,Ta as c,Ua as d,Va as e,Wa as f,Xa as g,Ya as h,Za as i,_a as j,ab as l,bb as m,cb as n,db as o,gb as p,hb as q,ib as r}from"./chunk-njq4w631.js";import"./chunk-f24ahjpc.js";import"./chunk-0e9dhemy.js";import"./chunk-6mfmy7nq.js";import"./chunk-7ycmx7c2.js";import"./chunk-bpx8x87m.js";import"./chunk-j7nh0j36.js";export{g as saveUserMessage,i as saveToolUse,j as saveToolResult,k as saveCompaction,h as saveAssistantMessage,a as isRootSystemPrompt,l as handleTaskListUpdate,m as handleSkillActivation,n as extractModelSwitch,r as executeLoopGenerator,c as drainLoop,f as checkStopHook,d as checkOutputRecovery,e as checkIncompleteIntent,q as checkAndCompactInLoop,o as applyToolDomainEffects,p as StreamingToolExecutor,b as ConversationState};
@@ -0,0 +1 @@
1
+ import{v as a,w as b,x as c}from"./chunk-tz44akn7.js";import"./chunk-h46kk20y.js";import"./chunk-m41xq6d0.js";import"./chunk-7ycmx7c2.js";import"./chunk-bpx8x87m.js";import"./chunk-j7nh0j36.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
@@ -1,4 +1,4 @@
1
- import{ba as S,ca as h}from"./chunk-nrh2jage.js";import{lb as M}from"./chunk-3ak4p05x.js";import{Kb as c}from"./chunk-s53zeref.js";import{EventEmitter as r}from"events";import{z as L}from"zod";import{isPlainObject as v}from"lodash-es";function b(B){if(B===void 0)return"undefined";if(typeof B==="string")return B;try{let G=JSON.stringify(B);return G===void 0?String(B):G}catch{return String(B)}}class R extends Error{issues;type;constructor(B,G,Q="validation_error"){super(B);this.issues=G;this.type=Q;this.name="ToolValidationError"}}function g(B){let{code:G}=B,Q=B,X=Q.received;switch(G){case"invalid_type":{let Y=Q.expected;return`类型错误:期望 ${b(Y)},实际收到 ${b(X)}`}case"too_small":{let{minimum:Y,inclusive:$}=Q,W=typeof Q.type==="string"?Q.type:void 0;if(W==="string"&&typeof Y==="number")return`长度不能少于 ${Y} 个字符`;if(W==="number"&&typeof Y==="number")return`不能小于${$?"等于":""} ${Y}`;if(W==="array"&&typeof Y==="number")return`数组长度不能少于 ${Y}`;return"值太小"}case"too_big":{let{maximum:Y,inclusive:$}=Q,W=typeof Q.type==="string"?Q.type:void 0;if(W==="string"&&typeof Y==="number")return`长度不能超过 ${Y} 个字符`;if(W==="number"&&typeof Y==="number")return`不能大于${$?"等于":""} ${Y}`;if(W==="array"&&typeof Y==="number")return`数组长度不能超过 ${Y}`;return"值太大"}case"invalid_string":{let Y=Q.validation;if(Y==="email")return"必须是有效的电子邮件地址";if(Y==="url")return"必须是有效的 URL";if(Y==="uuid")return"必须是有效的 UUID";if(v(Y)){let $=Y;if(typeof $.includes==="string")return`必须包含 "${$.includes}"`;if(typeof $.startsWith==="string")return`必须以 "${$.startsWith}" 开头`;if(typeof $.endsWith==="string")return`必须以 "${$.endsWith}" 结尾`}return"字符串格式不正确"}case"invalid_enum_value":{let Y=Q.options;if(Array.isArray(Y))return`必须是以下值之一:${Y.map(($)=>b($)).join(", ")}`;return"必须是枚举允许的值之一"}case"invalid_literal":{let Y=Q.expected;return`必须是字面量值:${b(Y)}`}case"unrecognized_keys":{let Y=Q.keys;if(Array.isArray(Y))return`包含未知的参数:${Y.map(($)=>b($)).join(", ")}`;return"包含未知的参数"}case"invalid_union":return"不符合任何有效的类型定义";case"invalid_date":return"必须是有效的日期";case"custom":return B.message||"自定义验证失败";default:return B.message||"验证失败"}}function u(B){let G=B.issues.map((X)=>{let Y=X.path.join("."),$=g(X),W=X.received;return{field:Y||"root",message:$,value:W}}),Q=G.length===1?`参数验证失败 [${G[0].field}]: ${G[0].message}`:`参数验证失败 (${G.length} 个错误):
1
+ import{ba as S,ca as h}from"./chunk-p8pggabj.js";import{lb as M}from"./chunk-f24ahjpc.js";import{Jb as c}from"./chunk-j7nh0j36.js";import{EventEmitter as r}from"events";import{z as L}from"zod";import{isPlainObject as v}from"lodash-es";function b(B){if(B===void 0)return"undefined";if(typeof B==="string")return B;try{let G=JSON.stringify(B);return G===void 0?String(B):G}catch{return String(B)}}class R extends Error{issues;type;constructor(B,G,Q="validation_error"){super(B);this.issues=G;this.type=Q;this.name="ToolValidationError"}}function g(B){let{code:G}=B,Q=B,X=Q.received;switch(G){case"invalid_type":{let Y=Q.expected;return`类型错误:期望 ${b(Y)},实际收到 ${b(X)}`}case"too_small":{let{minimum:Y,inclusive:$}=Q,W=typeof Q.type==="string"?Q.type:void 0;if(W==="string"&&typeof Y==="number")return`长度不能少于 ${Y} 个字符`;if(W==="number"&&typeof Y==="number")return`不能小于${$?"等于":""} ${Y}`;if(W==="array"&&typeof Y==="number")return`数组长度不能少于 ${Y}`;return"值太小"}case"too_big":{let{maximum:Y,inclusive:$}=Q,W=typeof Q.type==="string"?Q.type:void 0;if(W==="string"&&typeof Y==="number")return`长度不能超过 ${Y} 个字符`;if(W==="number"&&typeof Y==="number")return`不能大于${$?"等于":""} ${Y}`;if(W==="array"&&typeof Y==="number")return`数组长度不能超过 ${Y}`;return"值太大"}case"invalid_string":{let Y=Q.validation;if(Y==="email")return"必须是有效的电子邮件地址";if(Y==="url")return"必须是有效的 URL";if(Y==="uuid")return"必须是有效的 UUID";if(v(Y)){let $=Y;if(typeof $.includes==="string")return`必须包含 "${$.includes}"`;if(typeof $.startsWith==="string")return`必须以 "${$.startsWith}" 开头`;if(typeof $.endsWith==="string")return`必须以 "${$.endsWith}" 结尾`}return"字符串格式不正确"}case"invalid_enum_value":{let Y=Q.options;if(Array.isArray(Y))return`必须是以下值之一:${Y.map(($)=>b($)).join(", ")}`;return"必须是枚举允许的值之一"}case"invalid_literal":{let Y=Q.expected;return`必须是字面量值:${b(Y)}`}case"unrecognized_keys":{let Y=Q.keys;if(Array.isArray(Y))return`包含未知的参数:${Y.map(($)=>b($)).join(", ")}`;return"包含未知的参数"}case"invalid_union":return"不符合任何有效的类型定义";case"invalid_date":return"必须是有效的日期";case"custom":return B.message||"自定义验证失败";default:return B.message||"验证失败"}}function u(B){let G=B.issues.map((X)=>{let Y=X.path.join("."),$=g(X),W=X.received;return{field:Y||"root",message:$,value:W}}),Q=G.length===1?`参数验证失败 [${G[0].field}]: ${G[0].message}`:`参数验证失败 (${G.length} 个错误):
2
2
  ${G.map((X)=>` - ${X.field}: ${X.message}`).join(`
3
3
  `)}`;return new R(Q,G)}function y(B,G){let Q=B.safeParse(G);if(!Q.success)throw u(Q.error);return Q.data}import{zodToJsonSchema as l}from"zod-to-json-schema";function H(B){let G=l(B,{target:"jsonSchema7",$refStrategy:"none"});if(G.type==="object"&&G.properties&&!Array.isArray(G.required))G.required=[];return G}class w{toolName;params;executeFn;descriptionFn;affectedPathsFn;constructor(B,G,Q,X,Y){this.toolName=B;this.params=G;this.executeFn=Q;this.descriptionFn=X;this.affectedPathsFn=Y}getDescription(){if(this.descriptionFn)return this.descriptionFn(this.params);return`执行工具: ${this.toolName}`}getAffectedPaths(){if(this.affectedPathsFn)return this.affectedPathsFn(this.params);return[]}async execute(B,G,Q){let X={signal:B,updateOutput:G,...Q};return this.executeFn(this.params,X)}}function k(B){return{name:B.name,displayName:B.displayName,kind:B.kind,isReadOnly:B.isReadOnly??M(B.kind),isConcurrencySafe:B.isConcurrencySafe??!1,strict:B.strict??!1,description:B.description,version:B.version||"1.0.0",category:B.category,tags:B.tags||[],getFunctionDeclaration(){let G=H(B.schema),Q=B.description.short;if(B.description.long)Q+=`
4
4
 
@@ -1,4 +1,6 @@
1
- import{e as E2,f as h2}from"./chunk-m7xm1ssb.js";import{h as A4,i as v4,j as R4}from"./chunk-zfy765hj.js";import{l as D$,m as k4,o as o1}from"./chunk-63954vzc.js";import{B as r8,C as e6,D as f4,E as X8,F as e1,G as h6,I as f6,J as D6,M as f$,N as M8,O as D4,P as _1,Q as wJ,R as bJ,S as M6,T as V4,U as C6,W as KJ,y as UJ}from"./chunk-8zh508xk.js";import{Y as S4}from"./chunk-r9vneqaw.js";import"./chunk-g54k7rea.js";import{fa as I2}from"./chunk-nrh2jage.js";import{ga as S8}from"./chunk-b5nhr3na.js";import{Aa as x6,Ga as p0,ha as O$,ia as m0,ja as E1,ka as vQ,la as i1,ma as T$,na as iJ,oa as mQ,pa as D2,qa as nJ,sa as K4,ua as iQ,va as H1,wa as C4,xa as w1,ya as b4}from"./chunk-21zps3hb.js";import{Ha as I4,Ja as M4}from"./chunk-67dzm8te.js";import{Oa as G4,Pa as T4,Ta as d6}from"./chunk-g7bw2nkz.js";import"./chunk-3ak4p05x.js";import{nb as yQ,ob as L1}from"./chunk-t44946na.js";import{rb as o2}from"./chunk-t7hd45rg.js";import{vb as AJ,yb as A0}from"./chunk-39h8jdm3.js";import{Fb as P4,Ib as j1}from"./chunk-j1ehsp0x.js";import{Kb as s$}from"./chunk-s53zeref.js";import{useMemoizedFn as dQ}from"ahooks";import{useEffect as c5,useState as lQ}from"react";import{useMemoizedFn as r0}from"ahooks";import{Box as l1}from"ink";import{useEffect as r1,useRef as T8}from"react";import{useShallow as nQ}from"zustand/react/shallow";import{useStore as c4}from"zustand";function Q0($){return c4(iQ,$)}var u4=[],tQ=()=>Q0(($)=>$.session.sessionId),sQ=()=>Q0(($)=>$.session.messages),eQ=()=>Q0(($)=>$.session.clearCount),$6=()=>Q0(($)=>$.session.isCompacting),Q6=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),f1=()=>Q0(($)=>$.session.actions),J6=()=>Q0(($)=>{let{inputTokens:Q,maxContextTokens:J}=$.session.tokenUsage;if(J<=0)return 100;let Y=Math.max(0,100-Q/J*100);return Math.round(Y)}),Y6=()=>Q0(($)=>$.app.initializationStatus),Z6=()=>Q0(($)=>$.app.initializationError),a$=()=>Q0(($)=>$.app.activeModal),X6=()=>Q0(($)=>$.app.tasks),q6=()=>Q0(($)=>$.app.modelEditorTarget),G6=()=>Q0(($)=>$.app.sessionSelectorData),U6=()=>Q0(($)=>$.app.awaitingSecondCtrlC),D1=()=>Q0(($)=>$.app.actions),o$=()=>Q0(($)=>$.app.initializationStatus==="ready"),K6=()=>Q0(($)=>$.app.tasks.length>0),_$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),O6=()=>Q0(($)=>$.config.config?.models??u4),i$=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let J=Q.currentModelId;return Q.models.find((Z)=>Z.id===J)??Q.models[0]}),z6=()=>Q0(($)=>$.config.config?.currentModelId),_0=()=>Q0(($)=>{return m0.getTheme()}),_6=()=>Q0(($)=>$.config.config?.theme??"default"),i0=()=>Q0(($)=>$.focus.currentFocus),N6=()=>Q0(($)=>$.focus.actions),V1=()=>Q0(($)=>$.command.isProcessing),F6=()=>Q0(($)=>$.command.actions),W6=()=>Q0(($)=>$.command.pendingCommands),n$=()=>Q0(($)=>$.app.thinkingModeEnabled),H6=()=>Q0(($)=>$.session.currentThinkingContent),L6=()=>Q0(($)=>$.session.thinkingExpanded),w6=()=>Q0(($)=>$.session.currentStreamingMessageId),b6=()=>Q0(nQ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),B6=()=>Q0(($)=>$.session.finalizingStreamingMessageId),A6=()=>Q0(($)=>$.session.historyExpanded),v6=()=>Q0(($)=>$.session.expandedMessageCount),R6=()=>Q0(nQ(($)=>{let Q=$.spec.currentSpec;if(!Q)return{phase:null,completed:0,total:0};let J=Q.tasks??[],Y=J.filter((Z)=>Z.status==="completed").length;return{phase:Q.phase,completed:Y,total:J.length}}));import{useMemoizedFn as u8}from"ahooks";import{useEffect as c6,useRef as Y9}from"react";function x4($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let X=JSON.parse(Y.responseBody)?.error?.message;if(X){let G=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${X}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function d4($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function l4($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function m8($){let Q=d4($),J=l4($),Y;if(J)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=x4($);return{displayMessage:Y,isAbort:Q,isVisionNotSupported:J}}function y6($){let{text:Q,images:J,parts:Y}=$;if(J.length===0)return Q;let Z=[];for(let q of Y)if(q.type==="text")Z.push({type:"text",text:q.text});else Z.push({type:"image_url",image_url:{url:`data:${q.mimeType};base64,${q.base64}`}});return Z}function P6($){return{role:$.role,content:$.content}}function I6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(P6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(P6);return[...$.restoredContextMessages,...Q]}function r4($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function a4($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function o4($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function i4($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function n4($,Q,J,Y){switch($){case"show_theme_selector":return J.setActiveModal("themeSelector"),!0;case"show_model_selector":return J.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return J.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return J.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return J.setActiveModal("agentsManager"),!0;case"show_skills_manager":return J.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return J.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return J.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return J.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return J.showSessionSelector(Z),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),J.setTasks([]),!0;case"compact_completed":case"compact_fallback":return Y.resetTokenUsage(),!0;case"exit_application":return o1(0),!0;default:return!1}}async function k6($,Q,J,Y){let{text:Z}=$;if(!M6(Z))return{type:"not_slash"};let q={cwd:A0(),signal:Y},X=await C6(Z,q);if(X.message){if(n4(X.message,X.data,Q,J))return{type:"handled",commandResult:{success:!0}}}if(r4(X.data)){let{skillName:K,skillArgs:U}=X.data,F=U?`Please use the "${K}" skill to help me with: ${U}`:`Please use the "${K}" skill.`;return J.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(a4(X.data)){let{commandName:K,processedContent:U}=X.data;J.addUserMessage(Z);let F=`# Custom Command: /${K}
1
+ import{e as E2,f as h2}from"./chunk-cfe1fywb.js";import{h as A4,i as v4,j as R4}from"./chunk-sfr69fw8.js";import{l as D$,m as k4,o as i1}from"./chunk-sh1pk5j3.js";import{B as r8,C as e6,D as f4,E as X8,F as e1,G as h6,I as I6,J as M6,M as f$,N as M8,O as D4,P as _1,Q as wJ,R as bJ,S as f6,T as V4,U as D6,W as KJ,y as UJ}from"./chunk-7t23swne.js";import{Y as S4}from"./chunk-59e6eg4b.js";import"./chunk-evc1xkeb.js";import{fa as I2}from"./chunk-p8pggabj.js";import{ga as S8}from"./chunk-ck43cs45.js";import{Aa as x6,Ga as p0,ha as O$,ia as m0,ja as E1,ka as vQ,la as o1,ma as T$,na as iJ,oa as mQ,pa as D2,qa as nJ,sa as K4,ua as iQ,va as H1,wa as C4,xa as w1,ya as b4}from"./chunk-h46kk20y.js";import{Ha as I4,Ja as M4}from"./chunk-m41xq6d0.js";import{Oa as G4,Pa as T4,Ta as d6}from"./chunk-njq4w631.js";import"./chunk-f24ahjpc.js";import{mb as yQ,nb as L1}from"./chunk-0e9dhemy.js";import{qb as o2}from"./chunk-6mfmy7nq.js";import{ub as AJ,xb as A0}from"./chunk-7ycmx7c2.js";import{Eb as P4,Hb as j1}from"./chunk-bpx8x87m.js";import{Jb as s$}from"./chunk-j7nh0j36.js";import{useMemoizedFn as dQ}from"ahooks";import{useEffect as c5,useState as lQ}from"react";import{useMemoizedFn as r0}from"ahooks";import{Box as l1}from"ink";import{useEffect as r1,useRef as T8}from"react";import{useShallow as nQ}from"zustand/react/shallow";import{useStore as c4}from"zustand";function Q0($){return c4(iQ,$)}var u4=[],tQ=()=>Q0(($)=>$.session.sessionId),sQ=()=>Q0(($)=>$.session.messages),eQ=()=>Q0(($)=>$.session.clearCount),$6=()=>Q0(($)=>$.session.isCompacting),Q6=()=>Q0(($)=>$.session.tokenUsage.estimatedCostUsd),f1=()=>Q0(($)=>$.session.actions),J6=()=>Q0(($)=>{let{inputTokens:Q,maxContextTokens:J}=$.session.tokenUsage;if(J<=0)return 100;let Y=Math.max(0,100-Q/J*100);return Math.round(Y)}),Y6=()=>Q0(($)=>$.app.initializationStatus),Z6=()=>Q0(($)=>$.app.initializationError),a$=()=>Q0(($)=>$.app.activeModal),X6=()=>Q0(($)=>$.app.tasks),q6=()=>Q0(($)=>$.app.modelEditorTarget),G6=()=>Q0(($)=>$.app.sessionSelectorData),U6=()=>Q0(($)=>$.app.awaitingSecondCtrlC),D1=()=>Q0(($)=>$.app.actions),o$=()=>Q0(($)=>$.app.initializationStatus==="ready"),K6=()=>Q0(($)=>$.app.tasks.length>0),_$=()=>Q0(($)=>$.config.config?.permissionMode||"default"),O6=()=>Q0(($)=>$.config.config?.models??u4),i$=()=>Q0(($)=>{let Q=$.config.config;if(!Q)return;let J=Q.currentModelId;return Q.models.find((Z)=>Z.id===J)??Q.models[0]}),z6=()=>Q0(($)=>$.config.config?.currentModelId),_0=()=>Q0(($)=>{return m0.getTheme()}),_6=()=>Q0(($)=>$.config.config?.theme??"default"),i0=()=>Q0(($)=>$.focus.currentFocus),N6=()=>Q0(($)=>$.focus.actions),V1=()=>Q0(($)=>$.command.isProcessing),F6=()=>Q0(($)=>$.command.actions),W6=()=>Q0(($)=>$.command.pendingCommands),n$=()=>Q0(($)=>$.app.thinkingModeEnabled),H6=()=>Q0(($)=>$.session.currentThinkingContent),L6=()=>Q0(($)=>$.session.thinkingExpanded),w6=()=>Q0(($)=>$.session.currentStreamingMessageId),b6=()=>Q0(nQ(($)=>({lines:$.session.currentStreamingLines,tail:$.session.currentStreamingTail,lineCount:$.session.currentStreamingLineCount,version:$.session.currentStreamingVersion}))),B6=()=>Q0(($)=>$.session.finalizingStreamingMessageId),A6=()=>Q0(($)=>$.session.historyExpanded),v6=()=>Q0(($)=>$.session.expandedMessageCount),R6=()=>Q0(nQ(($)=>{let Q=$.spec.currentSpec;if(!Q)return{phase:null,completed:0,total:0};let J=Q.tasks??[],Y=J.filter((Z)=>Z.status==="completed").length;return{phase:Q.phase,completed:Y,total:J.length}}));import{useMemoizedFn as u8}from"ahooks";import{useEffect as c6,useRef as Y9}from"react";function x4($){if(!($ instanceof Error))return"未知错误";let Y=$.lastError??$;if(Y.responseBody)try{let X=JSON.parse(Y.responseBody)?.error?.message;if(X){let G=Y.statusCode?` (HTTP ${Y.statusCode})`:"";return`${X}${G}`}}catch{}let Z=$.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return $.message}function d4($){if(!($ instanceof Error))return!1;return $.name==="AbortError"||$.message.includes("aborted")}function l4($){if(!($ instanceof Error))return!1;let Q=$.message;return Q.includes("can only concatenate str")||Q.includes("image_url")||Q.includes("multimodal")||Q.includes("vision")||Q.includes("does not support images")}function m8($){let Q=d4($),J=l4($),Y;if(J)Y="当前模型不支持图片理解功能。请切换到支持视觉能力的模型(如 Claude 4.5、GPT-5.2、Gemini 3 Pro、Qwen3-VL-Plus 等)后重试。";else Y=x4($);return{displayMessage:Y,isAbort:Q,isVisionNotSupported:J}}import{appendFileSync as r4,mkdirSync as a4,writeFileSync as o4}from"node:fs";import i4 from"node:os";import P6 from"node:path";var g8=P6.join(i4.homedir(),".blade","logs","stream-debug.log"),y6=!1;function n4(){if(y6)return;let $=P6.dirname(g8);a4($,{recursive:!0,mode:493}),o4(g8,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
2
+ `),y6=!0}function p8($,Q,J){n4();let Y=new Date().toISOString(),Z=J?` | ${JSON.stringify(J)}`:"",q=`[${Y}] [${$}] ${Q}${Z}
3
+ `;r4(g8,q)}var S$=j1("UI");function C6($,Q){let J=!1;return(Y)=>{switch(Y.kind){case"content_delta":if(J||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=Y.delta.length,p8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:Y.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(J||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{if(S$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:J,signalAborted:$.signal.aborted}),p8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:J,signalAborted:$.signal.aborted}),J||$.signal.aborted){J=!0;break}let{extraContent:Z,extraThinking:q}=$.streamingBuffer.drainPendingBuffers(),X=$.getStreamingMessageId();if(X){if(Z)o1(X,Z);T$(X)}$.sessionActions.finalizeStreamingMessage(Z,q),J=!0;break}case"model_fallback":J=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=Y.toolCall;if(!("function"in Z))break;if(S$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let q=JSON.parse(Z.function.arguments),X=I6(Z.function.name,q);$.sessionActions.addToolMessage(X,{toolName:Z.function.name,phase:"start",summary:X,params:q})}catch(q){S$.error("[loopEventHandler] onToolStart error:",q)}break}case"tool_result":{let Z=Y.toolCall;if(!("function"in Z))break;S$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:Y.result.success});let q=M6(Z.function.name,Y.result);$.sessionActions.addToolMessage(q.summary,{toolName:Z.function.name,phase:"complete",summary:q.summary,detail:q.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end")$.sessionActions.resetTokenUsage();break;case"turn_start":S$.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),J=!1;break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=Y}}}}function k6($){let{text:Q,images:J,parts:Y}=$;if(J.length===0)return Q;let Z=[];for(let q of Y)if(q.type==="text")Z.push({type:"text",text:q.text});else Z.push({type:"image_url",image_url:{url:`data:${q.mimeType};base64,${q.base64}`}});return Z}function S6($){return{role:$.role,content:$.content}}function T6($){if(!$.restoredContextMessages||$.restoredVisibleMessageCount<=0)return $.messages.map(S6);let Q=$.messages.slice($.restoredVisibleMessageCount).map(S6);return[...$.restoredContextMessages,...Q]}function t4($){return typeof $==="object"&&$!==null&&$.action==="invoke_skill"&&typeof $.skillName==="string"}function s4($){return typeof $==="object"&&$!==null&&$.action==="invoke_custom_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function e4($){return typeof $==="object"&&$!==null&&$.action==="invoke_plugin_command"&&typeof $.commandName==="string"&&typeof $.processedContent==="string"}function $9($){return typeof $==="object"&&$!==null&&$.action==="invoke_once_model"&&typeof $.modelId==="string"&&typeof $.prompt==="string"}function Q9($,Q,J,Y){switch($){case"show_theme_selector":return J.setActiveModal("themeSelector"),!0;case"show_model_selector":return J.setActiveModal("modelSelector"),!0;case"show_model_add_wizard":return J.setActiveModal("modelAddWizard"),!0;case"show_permissions_manager":return J.setActiveModal("permissionsManager"),!0;case"show_agents_manager":return J.setActiveModal("agentsManager"),!0;case"show_skills_manager":return J.setActiveModal("skillsManager"),!0;case"show_hooks_manager":return J.setActiveModal("hooksManager"),!0;case"show_plugins_manager":return J.setActiveModal("pluginsManager"),!0;case"show_agent_creation_wizard":return J.setActiveModal("agentCreationWizard"),!0;case"show_session_selector":{let Z=Q?.sessions;return J.showSessionSelector(Z),!0}case"clear_screen":return Y.clearMessages(),Y.setError(null),Y.resetTokenUsage(),J.setTasks([]),!0;case"compact_completed":case"compact_fallback":return Y.resetTokenUsage(),!0;case"exit_application":return i1(0),!0;default:return!1}}async function V6($,Q,J,Y){let{text:Z}=$;if(!f6(Z))return{type:"not_slash"};let q={cwd:A0(),signal:Y},X=await D6(Z,q);if(X.message){if(Q9(X.message,X.data,Q,J))return{type:"handled",commandResult:{success:!0}}}if(t4(X.data)){let{skillName:K,skillArgs:U}=X.data,F=U?`Please use the "${K}" skill to help me with: ${U}`:`Please use the "${K}" skill.`;return J.addUserMessage(F),{type:"continue_as_agent",result:{userDisplayMessage:F,agentInput:{displayText:F,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(s4(X.data)){let{commandName:K,processedContent:U}=X.data;J.addUserMessage(Z);let F=`# Custom Command: /${K}
2
4
 
3
5
  The user has invoked the custom command "/${K}". Follow the instructions below to complete the task.
4
6
 
@@ -8,7 +10,7 @@ ${U}
8
10
 
9
11
  ---
10
12
 
11
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:Z,agentInput:{displayText:Z,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(o4(X.data)){let{commandName:K,pluginName:U,processedContent:F}=X.data;J.addUserMessage(Z);let O=`# Plugin Command: /${K}
13
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:Z,agentInput:{displayText:Z,text:F,images:[],parts:[{type:"text",text:F}]},userMessageAlreadyAdded:!0}}}if(e4(X.data)){let{commandName:K,pluginName:U,processedContent:F}=X.data;J.addUserMessage(Z);let O=`# Plugin Command: /${K}
12
14
 
13
15
  The user has invoked the plugin command "/${K}" from plugin "${U}". Follow the instructions below to complete the task.
14
16
 
@@ -18,14 +20,12 @@ ${F}
18
20
 
19
21
  ---
20
22
 
21
- Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:Z,agentInput:{displayText:Z,text:O,images:[],parts:[{type:"text",text:O}]},userMessageAlreadyAdded:!0}}}if(i4(X.data)){let{modelId:K,prompt:U}=X.data;return J.addUserMessage(U),{type:"continue_as_agent",result:{userDisplayMessage:U,agentInput:{displayText:U,text:U,images:[],parts:[{type:"text",text:U}]},userMessageAlreadyAdded:!0,onceModelId:K}}}if(!X.success&&X.error)return J.addAssistantMessage(`${X.error}`),{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}};let G=X.message;if(X.success&&typeof G==="string"&&G.trim()!=="")J.addAssistantMessage(G);return{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}}}import{appendFileSync as t4,mkdirSync as s4,writeFileSync as e4}from"node:fs";import $9 from"node:os";import T6 from"node:path";var g8=T6.join($9.homedir(),".blade","logs","stream-debug.log"),S6=!1;function Q9(){if(S6)return;let $=T6.dirname(g8);s4($,{recursive:!0,mode:493}),e4(g8,`=== Stream Debug Log Started: ${new Date().toISOString()} ===
22
- `),S6=!0}function p8($,Q,J){Q9();let Y=new Date().toISOString(),Z=J?` | ${JSON.stringify(J)}`:"",q=`[${Y}] [${$}] ${Q}${Z}
23
- `;t4(g8,q)}var S$=j1("UI");function V6($,Q){let J=!1;return(Y)=>{switch(Y.kind){case"content_delta":if(J||$.signal.aborted)break;Q.contentDeltaCount++,Q.contentDeltaTotalLen+=Y.delta.length,p8("loopEventHandler","onContentDelta",{callCount:Q.contentDeltaCount,deltaLen:Y.delta.length,totalLen:Q.contentDeltaTotalLen}),$.streamingBuffer.batchAppendContent(Y.delta);break;case"thinking_delta":if(J||$.signal.aborted)break;if($.thinkingModeEnabled)$.streamingBuffer.batchAppendThinking(Y.delta);break;case"stream_end":{if(S$.debug("[loopEventHandler] stream_end",{contentDeltaCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:J,signalAborted:$.signal.aborted}),p8("loopEventHandler","onStreamEnd",{contentDeltaCallCount:Q.contentDeltaCount,contentDeltaTotalLen:Q.contentDeltaTotalLen,streamFinalized:J,signalAborted:$.signal.aborted}),J||$.signal.aborted){J=!0;break}let{extraContent:Z,extraThinking:q}=$.streamingBuffer.drainPendingBuffers(),X=$.getStreamingMessageId();if(X){if(Z)i1(X,Z);T$(X)}$.sessionActions.finalizeStreamingMessage(Z,q),J=!0;break}case"model_fallback":J=!0,$.streamingBuffer.resetStreamingBuffers(),$.sessionActions.discardStreamingMessage(),$.sessionActions.setCurrentThinkingContent(null);break;case"tool_start":{let Z=Y.toolCall;if(!("function"in Z))break;if(S$.debug("[loopEventHandler] tool_start",{toolName:Z.function.name,toolKind:Y.toolKind}),["TaskCreate","TaskUpdate","TaskList"].includes(Z.function.name))break;try{let q=JSON.parse(Z.function.arguments),X=f6(Z.function.name,q);$.sessionActions.addToolMessage(X,{toolName:Z.function.name,phase:"start",summary:X,params:q})}catch(q){S$.error("[loopEventHandler] onToolStart error:",q)}break}case"tool_result":{let Z=Y.toolCall;if(!("function"in Z))break;S$.debug("[loopEventHandler] tool_result",{toolName:Z.function.name,success:Y.result.success});let q=D6(Z.function.name,Y.result);$.sessionActions.addToolMessage(q.summary,{toolName:Z.function.name,phase:"complete",summary:q.summary,detail:q.detail});break}case"token_usage":$.sessionActions.updateTokenUsage(Y.usage);break;case"compaction":if($.sessionActions.setCompacting(Y.phase==="start"),Y.phase==="end")$.sessionActions.resetTokenUsage();break;case"turn_start":S$.debug("[loopEventHandler] turn_start",{turn:Y.turn,maxTurns:Y.maxTurns}),$.sessionActions.updateTokenUsage({turnCount:Y.turn}),J=!1;break;case"task_update":$.appActions.setTasks(Y.tasks);break;case"subagent_spawned":case"subagent_completed":break;default:{let Z=Y}}}}import{useMemoizedFn as j6}from"ahooks";import{useRef as E6}from"react";function m6($){let Q=E6(void 0),J=E6(void 0),Y=j6(async(q)=>{let X=q?.sessionId??$.sessionId,G=!!q?.modelId&&q.modelId!==$.modelId,K;if(!G&&X){if(J.current&&J.current.sessionId!==X)await J.current.dispose(),J.current=void 0;if(!J.current)J.current=await h6.create({sessionId:X,modelId:q?.modelId??$.modelId});else await J.current.refresh({modelId:q?.modelId??$.modelId});K=await f$.createWithRuntime(J.current,{sessionId:X,systemPrompt:q?.systemPrompt??$.systemPrompt,appendSystemPrompt:q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:q?.maxTurns??$.maxTurns,modelId:q?.modelId??$.modelId})}else K=await f$.create({systemPrompt:q?.systemPrompt??$.systemPrompt,appendSystemPrompt:q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:q?.maxTurns??$.maxTurns,modelId:q?.modelId??$.modelId});return Q.current=K,K}),Z=j6(()=>{if(Q.current)Q.current=void 0});return{agentRef:Q,createAgent:Y,cleanupAgent:Z}}import{useMemoizedFn as N$}from"ahooks";import{useEffect as J9,useRef as t$}from"react";function g6($){let Q=0;for(let J of $)if(J===`
24
- `)Q++;return Q}function p6($,Q){let J=Q?.flushTimeout??300,Y=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,q=t$(""),X=t$(null),G=t$(""),K=t$(null),U=N$(()=>{if(q.current){let W=q.current,w=$.appendAssistantContent(W);i1(w,W),q.current=""}if(X.current)clearTimeout(X.current),X.current=null}),F=N$(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=N$((W)=>{q.current+=W;let w=q.current;if(g6(w)>=Y||w.length>=Z){U();return}if(!X.current)X.current=setTimeout(U,J)}),N=N$((W)=>{G.current+=W;let w=G.current;if(g6(w)>=Y||w.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,J)}),z=N$(()=>{if(q.current="",X.current)clearTimeout(X.current),X.current=null;if(G.current="",K.current)clearTimeout(K.current),K.current=null}),_=N$(()=>{if(X.current)clearTimeout(X.current),X.current=null;if(K.current)clearTimeout(K.current),K.current=null;let W=q.current,w=G.current;return q.current="",G.current="",{extraContent:W,extraThinking:w}});return J9(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:N,flushContentBuffer:U,flushThinkingBuffer:F,resetStreamingBuffers:z,drainPendingBuffers:_}}var u6=j1("UI"),l6=($,Q,J,Y,Z)=>{let q=V1(),X=tQ(),G=_$(),K=n$(),U=f1(),F=D1(),O=F6(),N=Y9(!1),{createAgent:z,cleanupAgent:_}=m6({sessionId:X,systemPrompt:$,appendSystemPrompt:Q,maxTurns:Y}),W=p6(U);c6(()=>{return()=>{_(),W.resetStreamingBuffers()}},[_,W.resetStreamingBuffers]),c6(()=>{if(!K)U.setCurrentThinkingContent(null)},[K,U]);let w=u8(()=>{if(!q)return;Z?.();let{extraContent:R,extraThinking:I}=W.drainPendingBuffers();O.abort("user-cancel"),F.setTasks([]);let v=H1().session.currentStreamingMessageId;if(v){if(R)i1(v,R);T$(v)}if(U.finalizeStreamingMessage(R,I),!N.current)U.addAssistantMessage("任务已停止"),N.current=!0}),L=u8(async(R)=>{let I=!1,v,B=R;try{await x6();let A=O.getAbortController()??O.createAbortController(),b=await k6(R,F,U,A.signal);if(b.type==="handled")return b.commandResult;if(b.type==="continue_as_agent")I=b.result.userMessageAlreadyAdded,v=b.result.onceModelId,B=b.result.agentInput;let k=L1.getInstance(),V,p=await k.executeUserPromptSubmitHooks(B.text,{projectDir:A0(),sessionId:X,permissionMode:G,hasImages:B.images.length>0,imageCount:B.images.length});if(!p.proceed){if(p.warning)U.addAssistantMessage(`${p.warning}`);return{success:!1,error:"blocked by hook"}}if(p.updatedPrompt)B={...B,text:p.updatedPrompt,displayText:p.updatedPrompt,parts:[{type:"text",text:p.updatedPrompt}]};if(p.contextInjection)V=p.contextInjection;try{let{SpecManager:P}=await import("./chunk-563zye36.js"),r=P.getInstance().buildProgressContext();if(r)V=V?`${V}
23
+ Remember: Follow the above instructions carefully to complete the user's request.`;return{type:"continue_as_agent",result:{userDisplayMessage:Z,agentInput:{displayText:Z,text:O,images:[],parts:[{type:"text",text:O}]},userMessageAlreadyAdded:!0}}}if($9(X.data)){let{modelId:K,prompt:U}=X.data;return J.addUserMessage(U),{type:"continue_as_agent",result:{userDisplayMessage:U,agentInput:{displayText:U,text:U,images:[],parts:[{type:"text",text:U}]},userMessageAlreadyAdded:!0,onceModelId:K}}}if(!X.success&&X.error)return J.addAssistantMessage(`${X.error}`),{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}};let G=X.message;if(X.success&&typeof G==="string"&&G.trim()!=="")J.addAssistantMessage(G);return{type:"handled",commandResult:{success:X.success,output:X.message,error:X.error,metadata:X.data}}}import{useMemoizedFn as j6}from"ahooks";import{useRef as E6}from"react";function m6($){let Q=E6(void 0),J=E6(void 0),Y=j6(async(q)=>{let X=q?.sessionId??$.sessionId,G=!!q?.modelId&&q.modelId!==$.modelId,K;if(!G&&X){if(J.current&&J.current.sessionId!==X)await J.current.dispose(),J.current=void 0;if(!J.current)J.current=await h6.create({sessionId:X,modelId:q?.modelId??$.modelId});else await J.current.refresh({modelId:q?.modelId??$.modelId});K=await f$.createWithRuntime(J.current,{sessionId:X,systemPrompt:q?.systemPrompt??$.systemPrompt,appendSystemPrompt:q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:q?.maxTurns??$.maxTurns,modelId:q?.modelId??$.modelId})}else K=await f$.create({systemPrompt:q?.systemPrompt??$.systemPrompt,appendSystemPrompt:q?.appendSystemPrompt??$.appendSystemPrompt,maxTurns:q?.maxTurns??$.maxTurns,modelId:q?.modelId??$.modelId});return Q.current=K,K}),Z=j6(()=>{if(Q.current)Q.current=void 0});return{agentRef:Q,createAgent:Y,cleanupAgent:Z}}import{useMemoizedFn as N$}from"ahooks";import{useEffect as J9,useRef as t$}from"react";function g6($){let Q=0;for(let J of $)if(J===`
24
+ `)Q++;return Q}function p6($,Q){let J=Q?.flushTimeout??300,Y=Q?.minLinesToFlush??5,Z=Q?.minCharsToFlush??400,q=t$(""),X=t$(null),G=t$(""),K=t$(null),U=N$(()=>{if(q.current){let W=q.current,w=$.appendAssistantContent(W);o1(w,W),q.current=""}if(X.current)clearTimeout(X.current),X.current=null}),F=N$(()=>{if(G.current)$.appendThinkingContent(G.current),G.current="";if(K.current)clearTimeout(K.current),K.current=null}),O=N$((W)=>{q.current+=W;let w=q.current;if(g6(w)>=Y||w.length>=Z){U();return}if(!X.current)X.current=setTimeout(U,J)}),N=N$((W)=>{G.current+=W;let w=G.current;if(g6(w)>=Y||w.length>=Z){F();return}if(!K.current)K.current=setTimeout(F,J)}),z=N$(()=>{if(q.current="",X.current)clearTimeout(X.current),X.current=null;if(G.current="",K.current)clearTimeout(K.current),K.current=null}),_=N$(()=>{if(X.current)clearTimeout(X.current),X.current=null;if(K.current)clearTimeout(K.current),K.current=null;let W=q.current,w=G.current;return q.current="",G.current="",{extraContent:W,extraThinking:w}});return J9(()=>{return()=>{z()}},[z]),{batchAppendContent:O,batchAppendThinking:N,flushContentBuffer:U,flushThinkingBuffer:F,resetStreamingBuffers:z,drainPendingBuffers:_}}var u6=j1("UI"),l6=($,Q,J,Y,Z)=>{let q=V1(),X=tQ(),G=_$(),K=n$(),U=f1(),F=D1(),O=F6(),N=Y9(!1),{createAgent:z,cleanupAgent:_}=m6({sessionId:X,systemPrompt:$,appendSystemPrompt:Q,maxTurns:Y}),W=p6(U);c6(()=>{return()=>{_(),W.resetStreamingBuffers()}},[_,W.resetStreamingBuffers]),c6(()=>{if(!K)U.setCurrentThinkingContent(null)},[K,U]);let w=u8(()=>{if(!q)return;Z?.();let{extraContent:R,extraThinking:I}=W.drainPendingBuffers();O.abort("user-cancel"),F.setTasks([]);let v=H1().session.currentStreamingMessageId;if(v){if(R)o1(v,R);T$(v)}if(U.finalizeStreamingMessage(R,I),!N.current)U.addAssistantMessage("任务已停止"),N.current=!0}),L=u8(async(R)=>{let I=!1,v,B=R;try{await x6();let A=O.getAbortController()??O.createAbortController(),b=await V6(R,F,U,A.signal);if(b.type==="handled")return b.commandResult;if(b.type==="continue_as_agent")I=b.result.userMessageAlreadyAdded,v=b.result.onceModelId,B=b.result.agentInput;let k=L1.getInstance(),V,p=await k.executeUserPromptSubmitHooks(B.text,{projectDir:A0(),sessionId:X,permissionMode:G,hasImages:B.images.length>0,imageCount:B.images.length});if(!p.proceed){if(p.warning)U.addAssistantMessage(`${p.warning}`);return{success:!1,error:"blocked by hook"}}if(p.updatedPrompt)B={...B,text:p.updatedPrompt,displayText:p.updatedPrompt,parts:[{type:"text",text:p.updatedPrompt}]};if(p.contextInjection)V=p.contextInjection;try{let{SpecManager:P}=await import("./chunk-07xv0cqp.js"),r=P.getInstance().buildProgressContext();if(r)V=V?`${V}
25
25
 
26
- ${r}`:r}catch{}if(!I)U.addUserMessage(B.displayText);let d=y6(B),l=await z(v?{modelId:v}:void 0);if(A.signal.aborted)return u6.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let s=I6(H1().session);if(V)s.push({role:"system",content:`<user-prompt-submit-hook>
26
+ ${r}`:r}catch{}if(!I)U.addUserMessage(B.displayText);let d=k6(B),l=await z(v?{modelId:v}:void 0);if(A.signal.aborted)return u6.info("[handleCommandSubmit] Agent 创建期间已被中止"),{success:!1,error:"aborted"};let s=T6(H1().session);if(V)s.push({role:"system",content:`<user-prompt-submit-hook>
27
27
  ${V}
28
- </user-prompt-submit-hook>`});let D={messages:s,userId:"cli-user",sessionId:X,workspaceRoot:A0(),signal:A.signal,confirmationHandler:J,permissionMode:G},C={contentDeltaCount:0,contentDeltaTotalLen:0},y=V6({sessionActions:U,appActions:F,streamingBuffer:W,thinkingModeEnabled:K,getStreamingMessageId:()=>H1().session.currentStreamingMessageId,signal:A.signal},C),a=await d6(l.chatStream(d,D,{stream:!0,onTurnLimitReached:J?async(P)=>{let r=await J.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${P.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:r.approved,reason:r.reason}}:void 0}),y);if(a.metadata?.outputTruncated)U.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let u=a.finalMessage||"";if(u6.debug("[handleCommandSubmit] final reply",{success:a.success,outputLength:u.length,turnsCount:a.metadata?.turnsCount,toolCallsCount:a.metadata?.toolCallsCount}),!a.success&&a.error?.type==="api_error"){let P=a.error.message||"请求失败,请检查网络连接和 API 配置";return U.addAssistantMessage(P),{success:!1,error:P}}if(!u||u.trim()===""){let P=a.metadata?.abortReason;if(!N.current&&C.contentDeltaCount===0&&P!=="interrupt")return U.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:u??""}}return{success:!0,output:u}}catch(A){if(N.current)return{success:!1,error:"aborted"};let b=m8(A);return U.addAssistantMessage(`${b.displayMessage}`),{success:!1,error:b.displayMessage}}});return{executeCommand:u8(async(R)=>{if(!R.text.trim()&&R.images.length===0)return;if(q){Z?.();let{extraContent:v,extraThinking:B}=W.drainPendingBuffers();O.abort("interrupt");let A=H1().session.currentStreamingMessageId;if(A){if(v)i1(A,v);T$(A)}U.finalizeStreamingMessage(v,B)}F.setTasks([]),N.current=!1;let I=O.createAbortController();W.resetStreamingBuffers(),U.clearFinalizingStreamingMessageId(),O.setProcessing(!0);try{let v=await L(R);if(!v.success&&v.error&&v.error!=="aborted")U.setError(v.error)}catch(v){let B=m8(v);if(B.isAbort);else U.setError(`执行失败: ${B.displayMessage}`)}finally{if(O.getAbortController()===I)O.setProcessing(!1),O.clearAbortController(I),U.setCurrentThinkingContent(null)}}),handleAbort:w,isProcessing:q}};import{useMemoizedFn as e$}from"ahooks";import{useState as r6}from"react";var a6=()=>{let[$,Q]=r6([]),[J,Y]=r6(-1),Z=e$((K,U)=>{let F={display:K,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,F]),Y(-1)}),q=e$(()=>{if($.length===0)return null;let K=J===-1?$.length-1:Math.max(0,J-1);return Y(K),$[K]||null}),X=e$(()=>{if(J===-1)return null;let K=J+1;if(K>=$.length)return Y(-1),null;else return Y(K),$[K]||null}),G=e$(()=>{Y(-1)});return{commandHistory:$,historyIndex:J,addToHistory:Z,getPreviousCommand:q,getNextCommand:X,resetHistoryIndex:G}};import{useMemoizedFn as $8}from"ahooks";import{useMemo as Z9,useRef as o6,useState as X9}from"react";var i6=()=>{let[$,Q]=X9({isVisible:!1,details:null,resolver:null}),J=o6(null),Y=o6([]),Z=$8((U)=>{J.current=U,Q({isVisible:Boolean(U),details:U?.details??null,resolver:U?.resolve??null})}),q=$8((U)=>{return new Promise((F)=>{let O={details:U,resolve:F};if(!J.current){Z(O);return}Y.current.push(O)})}),X=$8((U)=>{if(J.current)J.current.resolve(U);let F=Y.current.shift()??null;Z(F)}),G=$8(()=>{if(J.current)J.current.resolve({approved:!1,reason:"__aborted__"});for(let U of Y.current)U.resolve({approved:!1,reason:"__aborted__"});Y.current=[],Z(null)}),K=Z9(()=>({requestConfirmation:q}),[q]);return{confirmationState:$,confirmationHandler:K,handleResponse:X,dismissAll:G}};import{useMemoizedFn as n1}from"ahooks";import{useRef as n6,useState as q9}from"react";var Q8="␞",J8="␟";function Y8($){return`${Q8}PASTE:${$}:`}function x8(){return J8}var nZ=new RegExp(`${Q8}PASTE:(\\d+):[\\s\\S]*?${J8}`,"g");function G9($){return $.includes(Q8)&&$.includes(J8)}function t6($="",Q=0){let[J,Y]=q9({value:$,cursorPosition:Q}),Z=n6(0),q=n6(new Map),X=n1((z)=>{Y((_)=>({value:z,cursorPosition:_.cursorPosition}));for(let _ of q.current.keys()){let W=Y8(_);if(!z.includes(W))q.current.delete(_)}}),G=n1((z)=>{Y((_)=>({..._,cursorPosition:Math.max(0,Math.min(z,_.value.length))}))}),K=n1(()=>{Y({value:"",cursorPosition:0}),q.current.clear()}),U=n1((z)=>{Z.current+=1;let _=Z.current;return q.current.set(_,{type:"text",data:z}),_}),F=n1((z,_)=>{Z.current+=1;let W=Z.current;return q.current.set(W,{type:"image",data:z,mimeType:_}),W}),O=n1((z)=>{for(let[_,W]of z)if(q.current.set(_,W),_>=Z.current)Z.current=_}),N=n1((z)=>{let _=[],W=[];if(!G9(z)){let k=z.trim();if(k)W.push({type:"text",text:k});return{displayText:z,text:z,images:_,parts:W}}let w=new RegExp(`${Q8}PASTE:(\\d+):[\\s\\S]*?${J8}`,"g"),L=Array.from(z.matchAll(w)),H=0,R="",I="";for(let k of L){let V=k.index,p=V+k[0].length,d=parseInt(k[1],10),l=q.current.get(d);if(V>H){let s=z.slice(H,V);W.push({type:"text",text:s}),R+=s,I+=s}if(!l)R+=k[0],I+=k[0],W.push({type:"text",text:k[0]});else if(l.type==="text")R+=l.data,I+=l.data,W.push({type:"text",text:l.data});else{let s={id:d,base64:l.data,mimeType:l.mimeType};_.push(s),W.push({type:"image",...s}),I+=`[Image #${d}]`}H=p}if(H<z.length){let k=z.slice(H);W.push({type:"text",text:k}),R+=k,I+=k}let v=[];for(let k of W)if(k.type==="text"&&v.length>0&&v[v.length-1].type==="text")v[v.length-1].text+=k.text;else v.push(k);let B=0,A=v.length;while(B<v.length&&v[B].type==="text"&&v[B].text.trim()==="")B++;while(A>B&&v[A-1].type==="text"&&v[A-1].text.trim()==="")A--;let b=v.slice(B,A);return{displayText:I.trim(),text:R.trim(),images:_,parts:b}});return{value:J.value,cursorPosition:J.cursorPosition,setValue:X,setCursorPosition:G,clear:K,pasteMap:q.current,addPasteMapping:U,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:N}}import{useMemoizedFn as XJ}from"ahooks";import{useInput as F9}from"ink";import{useEffect as qJ,useRef as GJ,useState as a8}from"react";import U9 from"fast-glob";import K9 from"fuse.js";import{useEffect as s6,useMemo as d8,useState as l8}from"react";var F$=null,O9=5000;function z9($,Q){let J=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of J){let Z=Y[1],q=Y.index+(Y[0].length-Z.length),X=q+Z.length;if(Q>=q&&Q<=X){let G=Z.slice(1),K=!1;if(G.startsWith('"')){if(K=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:q,endIndex:X,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var _9=[...r8.map(($)=>`${$}/**`),...r8,...e6.map(($)=>`**/${$}`)];function $J($,Q,J={}){let{cwd:Y=A0(),maxSuggestions:Z=15,ignorePatterns:q=_9,debounceDelay:X=300,fuzzyMatch:G=!0}=J,[K,U]=l8([]),[F,O]=l8(!1),[N,z]=l8(0),_=d8(()=>JSON.stringify(q),[q]),W=d8(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return z9($,Q)},[$,Q]);s6(()=>{if(!$.includes("@")){U([]),O(!1);return}let L=Date.now();if(F$&&F$.cwd===Y&&F$.ignoreKey===_&&L-F$.timestamp<O9){U(F$.files),O(!1);return}let H=!1,I=setTimeout(async()=>{O(!0);try{let B=(await U9("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:q})).map((A)=>A.replace(/\\/g,"/"));if(!H)U(B),F$={cwd:Y,ignoreKey:_,files:B,timestamp:L}}catch(v){if(console.error("Failed to load files for @ completion:",v),!H)U([])}finally{if(!H)O(!1)}},X);return()=>{H=!0,clearTimeout(I)}},[$,Y,X,_]);let w=d8(()=>{if(!W.hasQuery||K.length===0)return[];let L=W.query.toLowerCase();if(L==="")return K.slice(0,Z);if(G)return new K9(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(L).slice(0,Z).map((I)=>I.item);return K.filter((H)=>H.toLowerCase().includes(L)).slice(0,Z)},[W,K,Z,G]);return s6(()=>{z(0)},[w]),{...W,suggestions:w,selectedIndex:N,loading:F}}function N9($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function QJ($,Q,J){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=N9(J,Q.quoted),Z=$.slice(0,Q.startIndex),q=$.slice(Q.endIndex),X=Z+Y+" "+q,G=Q.startIndex+Y.length+1;return{newInput:X,newCursorPos:G}}import{useMemoizedFn as JJ}from"ahooks";import{useEffect as YJ,useRef as ZJ}from"react";var P0=($,Q)=>{let J=ZJ(!1),Y=ZJ(null),Z=JJ(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{w1().setAwaitingSecondCtrlC(!1),J.current=!1,Y.current=null},3000)}),q=()=>{D$().shutdown("SIGINT",0)},X=JJ(()=>{if(!J.current){if(J.current=!0,$&&Q)Q();w1().setAwaitingSecondCtrlC(!0),Z()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;w1().setAwaitingSecondCtrlC(!1),q()}});return YJ(()=>{if($){if(w1().setAwaitingSecondCtrlC(!1),J.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),YJ(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),X};var Z8=j1("UI"),OJ=($,Q,J,Y,Z,q,X,G,K,U)=>{let O=i0()==="main-input",N=$.value,z=$.setValue,_=$.cursorPosition,W=f1(),w=D1(),L=i$(),H=L?X8(L):!1,[R,I]=a8(!1),[v,B]=a8([]),[A,b]=a8(0),k=$J(N,_,{cwd:A0(),maxSuggestions:10}),V=P0(X||!1,q),p=GJ(0),d=500,l=GJ(!1);qJ(()=>{if(X)l.current=!1},[X]),qJ(()=>{if(k.hasQuery&&k.suggestions.length>0){let C=k.suggestions.map((y)=>({command:y,description:UJ(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));B(C),I(!0),b(0)}else if(N.startsWith("/"))if(N.includes(" "))I(!1),B([]);else{let y=KJ(N);B(y),I(y.length>0),b(0)}else I(!1),B([])},[N,k.hasQuery,k.suggestions]);let s=XJ(()=>{W.clearMessages(),W.setError(null)}),D=XJ(()=>{Z8.debug("[DIAG] handleSubmit called:",{input:N,showSuggestions:R});let C=N.trim();if(C){let y=$.resolveInput(C);Z8.debug("[DIAG] Submitting command:",{displayText:C,textLength:y.text.length,imageCount:y.images.length}),I(!1),B([]);let a=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(C,a),$.clear(),Q(y),Z8.debug("[DIAG] Command submitted to onSubmit callback")}else Z8.debug("[DIAG] Empty command, not submitting")});return F9((C,y)=>{if(C==="?"&&!N){K?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(C==="?"&&!N))return;if(y.ctrl&&C==="c"||y.meta&&C==="c"||y.ctrl&&C==="d"||y.meta&&C==="d"){V();return}if(y.ctrl&&C==="l"||y.meta&&C==="l"){s();return}if(y.ctrl&&C==="t"||y.meta&&C==="t"){W.toggleThinkingExpanded();return}if(y.ctrl&&C==="o"||y.meta&&C==="o"){W.toggleHistoryExpanded();return}if(y.escape){if(U)K?.();else if(X&&q){if(l.current)return;l.current=!0,q()}else if(R)I(!1),B([]);else if(N){let u=Date.now();if(u-p.current<500)$.clear(),p.current=0;else p.current=u}return}if(y.tab&&y.shift){G?.();return}if(y.tab){if(R&&v.length>0){let u=v[A].command;if(k.hasQuery&&k.suggestions.includes(u)){let{newInput:P,newCursorPos:r}=QJ(N,k,u);z(P),$.setCursorPosition(r)}else{let P=u+" ";z(P),$.setCursorPosition(P.length)}I(!1),B([])}else if(H)w.toggleThinkingMode();return}if(y.return){D();return}if(y.upArrow){if(R&&v.length>0){let u=v.length-1;b((P)=>P>0?P-1:u)}else{let u=J();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}if(y.downArrow){if(R&&v.length>0){let u=v.length-1;b((P)=>P<u?P+1:0)}else{let u=Y();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}},{isActive:O}),{handleSubmit:D,showSuggestions:R,suggestions:v,selectedSuggestionIndex:A}};import b9 from"ansi-escapes";import{useStdout as B9}from"ink";import{useCallback as A9,useEffect as v9,useRef as R9}from"react";import{useStdout as W9}from"ink";import{debounce as H9}from"lodash-es";import{useEffect as L9,useState as w9}from"react";function W$($=200){let{stdout:Q}=W9(),[J,Y]=w9(Q.columns||80);return L9(()=>{let Z=H9(()=>{Y(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),J}function zJ(){let{stdout:$}=B9(),Q=W$(),J=R9(!0),Y=Q0((q)=>q.session.actions.incrementClearCount),Z=A9(()=>{if($)$.write(b9.clearTerminal);Y()},[$,Y]);return v9(()=>{if(J.current){J.current=!1;return}let q=setTimeout(()=>{Z()},300);return()=>{clearTimeout(q)}},[Q,Z]),{refreshStatic:Z}}import _J from"node:fs";import y9 from"node:os";import o8 from"node:path";import{MultiSelect as P9}from"@inkjs/ui";import{useMemoizedFn as q8}from"ahooks";import{Box as t,Text as x,useFocus as I9,useFocusManager as M9,useInput as FJ}from"ink";import G8 from"ink-select-input";import C9 from"ink-spinner";import V$ from"ink-text-input";import{useEffect as NJ,useState as H$}from"react";import{jsxDEV as M}from"react/jsx-dev-runtime";var k9=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],S9=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function T9($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function j$({onComplete:$,onCancel:Q,initialConfig:J}){let[Y,Z]=H$(J?"name":"mode"),[q,X]=H$({name:J?.name||"",description:J?.description||"",tools:J?.tools||[],color:J?.color,location:J?.location||"project",systemPrompt:J?.systemPrompt||""}),[G,K]=H$(""),[U,F]=H$(!1),[O,N]=H$(""),[z,_]=H$(J?"edit":"manual"),{focus:W}=M9(),L={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];NJ(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;W(`step-${Y}`)},[Y,W]);let H=q8(()=>{let A=L.indexOf(Y);if(A<L.length-1)Z(L[A+1])}),R=q8(()=>{if(O)N("");if(Y==="confirm"&&z==="ai"){Z("aiPrompt");return}let A=L.indexOf(Y);if(A>0)Z(L[A-1]);else Q()}),I=q8(async()=>{F(!0),N("");try{let A=await f$.create(),b=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
28
+ </user-prompt-submit-hook>`});let D={messages:s,userId:"cli-user",sessionId:X,workspaceRoot:A0(),signal:A.signal,confirmationHandler:J,permissionMode:G},C={contentDeltaCount:0,contentDeltaTotalLen:0},y=C6({sessionActions:U,appActions:F,streamingBuffer:W,thinkingModeEnabled:K,getStreamingMessageId:()=>H1().session.currentStreamingMessageId,signal:A.signal},C),a=await d6(l.chatStream(d,D,{stream:!0,onTurnLimitReached:J?async(P)=>{let r=await J.requestConfirmation({type:"maxTurnsExceeded",message:`已进行 ${P.turnsCount} 轮对话。是否继续?`,risks:["继续执行可能导致更长的等待时间","可能产生更多的 API 费用"]});return{continue:r.approved,reason:r.reason}}:void 0}),y);if(a.metadata?.outputTruncated)U.addAssistantMessage("输出因达到 token 上限被截断,部分内容可能不完整。");let u=a.finalMessage||"";if(u6.debug("[handleCommandSubmit] final reply",{success:a.success,outputLength:u.length,turnsCount:a.metadata?.turnsCount,toolCallsCount:a.metadata?.toolCallsCount}),!a.success&&a.error?.type==="api_error"){let P=a.error.message||"请求失败,请检查网络连接和 API 配置";return U.addAssistantMessage(P),{success:!1,error:P}}if(!u||u.trim()===""){let P=a.metadata?.abortReason;if(!N.current&&C.contentDeltaCount===0&&P!=="interrupt")return U.addAssistantMessage("已取消"),{success:!0,output:"已取消"};return{success:!0,output:u??""}}return{success:!0,output:u}}catch(A){if(N.current)return{success:!1,error:"aborted"};let b=m8(A);return U.addAssistantMessage(`${b.displayMessage}`),{success:!1,error:b.displayMessage}}});return{executeCommand:u8(async(R)=>{if(!R.text.trim()&&R.images.length===0)return;if(q){Z?.();let{extraContent:v,extraThinking:B}=W.drainPendingBuffers();O.abort("interrupt");let A=H1().session.currentStreamingMessageId;if(A){if(v)o1(A,v);T$(A)}U.finalizeStreamingMessage(v,B)}F.setTasks([]),N.current=!1;let I=O.createAbortController();W.resetStreamingBuffers(),U.clearFinalizingStreamingMessageId(),O.setProcessing(!0);try{let v=await L(R);if(!v.success&&v.error&&v.error!=="aborted")U.setError(v.error)}catch(v){let B=m8(v);if(B.isAbort);else U.setError(`执行失败: ${B.displayMessage}`)}finally{if(O.getAbortController()===I)O.setProcessing(!1),O.clearAbortController(I),U.setCurrentThinkingContent(null)}}),handleAbort:w,isProcessing:q}};import{useMemoizedFn as e$}from"ahooks";import{useState as r6}from"react";var a6=()=>{let[$,Q]=r6([]),[J,Y]=r6(-1),Z=e$((K,U)=>{let F={display:K,pasteMappings:U?new Map(U):new Map};Q((O)=>[...O,F]),Y(-1)}),q=e$(()=>{if($.length===0)return null;let K=J===-1?$.length-1:Math.max(0,J-1);return Y(K),$[K]||null}),X=e$(()=>{if(J===-1)return null;let K=J+1;if(K>=$.length)return Y(-1),null;else return Y(K),$[K]||null}),G=e$(()=>{Y(-1)});return{commandHistory:$,historyIndex:J,addToHistory:Z,getPreviousCommand:q,getNextCommand:X,resetHistoryIndex:G}};import{useMemoizedFn as $8}from"ahooks";import{useMemo as Z9,useRef as o6,useState as X9}from"react";var i6=()=>{let[$,Q]=X9({isVisible:!1,details:null,resolver:null}),J=o6(null),Y=o6([]),Z=$8((U)=>{J.current=U,Q({isVisible:Boolean(U),details:U?.details??null,resolver:U?.resolve??null})}),q=$8((U)=>{return new Promise((F)=>{let O={details:U,resolve:F};if(!J.current){Z(O);return}Y.current.push(O)})}),X=$8((U)=>{if(J.current)J.current.resolve(U);let F=Y.current.shift()??null;Z(F)}),G=$8(()=>{if(J.current)J.current.resolve({approved:!1,reason:"__aborted__"});for(let U of Y.current)U.resolve({approved:!1,reason:"__aborted__"});Y.current=[],Z(null)}),K=Z9(()=>({requestConfirmation:q}),[q]);return{confirmationState:$,confirmationHandler:K,handleResponse:X,dismissAll:G}};import{useMemoizedFn as n1}from"ahooks";import{useRef as n6,useState as q9}from"react";var Q8="␞",J8="␟";function Y8($){return`${Q8}PASTE:${$}:`}function x8(){return J8}var nZ=new RegExp(`${Q8}PASTE:(\\d+):[\\s\\S]*?${J8}`,"g");function G9($){return $.includes(Q8)&&$.includes(J8)}function t6($="",Q=0){let[J,Y]=q9({value:$,cursorPosition:Q}),Z=n6(0),q=n6(new Map),X=n1((z)=>{Y((_)=>({value:z,cursorPosition:_.cursorPosition}));for(let _ of q.current.keys()){let W=Y8(_);if(!z.includes(W))q.current.delete(_)}}),G=n1((z)=>{Y((_)=>({..._,cursorPosition:Math.max(0,Math.min(z,_.value.length))}))}),K=n1(()=>{Y({value:"",cursorPosition:0}),q.current.clear()}),U=n1((z)=>{Z.current+=1;let _=Z.current;return q.current.set(_,{type:"text",data:z}),_}),F=n1((z,_)=>{Z.current+=1;let W=Z.current;return q.current.set(W,{type:"image",data:z,mimeType:_}),W}),O=n1((z)=>{for(let[_,W]of z)if(q.current.set(_,W),_>=Z.current)Z.current=_}),N=n1((z)=>{let _=[],W=[];if(!G9(z)){let k=z.trim();if(k)W.push({type:"text",text:k});return{displayText:z,text:z,images:_,parts:W}}let w=new RegExp(`${Q8}PASTE:(\\d+):[\\s\\S]*?${J8}`,"g"),L=Array.from(z.matchAll(w)),H=0,R="",I="";for(let k of L){let V=k.index,p=V+k[0].length,d=parseInt(k[1],10),l=q.current.get(d);if(V>H){let s=z.slice(H,V);W.push({type:"text",text:s}),R+=s,I+=s}if(!l)R+=k[0],I+=k[0],W.push({type:"text",text:k[0]});else if(l.type==="text")R+=l.data,I+=l.data,W.push({type:"text",text:l.data});else{let s={id:d,base64:l.data,mimeType:l.mimeType};_.push(s),W.push({type:"image",...s}),I+=`[Image #${d}]`}H=p}if(H<z.length){let k=z.slice(H);W.push({type:"text",text:k}),R+=k,I+=k}let v=[];for(let k of W)if(k.type==="text"&&v.length>0&&v[v.length-1].type==="text")v[v.length-1].text+=k.text;else v.push(k);let B=0,A=v.length;while(B<v.length&&v[B].type==="text"&&v[B].text.trim()==="")B++;while(A>B&&v[A-1].type==="text"&&v[A-1].text.trim()==="")A--;let b=v.slice(B,A);return{displayText:I.trim(),text:R.trim(),images:_,parts:b}});return{value:J.value,cursorPosition:J.cursorPosition,setValue:X,setCursorPosition:G,clear:K,pasteMap:q.current,addPasteMapping:U,addImagePasteMapping:F,restorePasteMappings:O,resolveInput:N}}import{useMemoizedFn as XJ}from"ahooks";import{useInput as F9}from"ink";import{useEffect as qJ,useRef as GJ,useState as a8}from"react";import U9 from"fast-glob";import K9 from"fuse.js";import{useEffect as s6,useMemo as d8,useState as l8}from"react";var F$=null,O9=5000;function z9($,Q){let J=[...$.matchAll(/(?:^|\s)(@(?:"[^"]*"|(?:[^\\ ]|\\ )*))/g)];for(let Y of J){let Z=Y[1],q=Y.index+(Y[0].length-Z.length),X=q+Z.length;if(Q>=q&&Q<=X){let G=Z.slice(1),K=!1;if(G.startsWith('"')){if(K=!0,G=G.slice(1),G.endsWith('"'))G=G.slice(0,-1)}return{hasQuery:!0,query:G,startIndex:q,endIndex:X,quoted:K}}}return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1}}var _9=[...r8.map(($)=>`${$}/**`),...r8,...e6.map(($)=>`**/${$}`)];function $J($,Q,J={}){let{cwd:Y=A0(),maxSuggestions:Z=15,ignorePatterns:q=_9,debounceDelay:X=300,fuzzyMatch:G=!0}=J,[K,U]=l8([]),[F,O]=l8(!1),[N,z]=l8(0),_=d8(()=>JSON.stringify(q),[q]),W=d8(()=>{if(Q===void 0)return{hasQuery:!1,query:"",startIndex:-1,endIndex:-1,quoted:!1};return z9($,Q)},[$,Q]);s6(()=>{if(!$.includes("@")){U([]),O(!1);return}let L=Date.now();if(F$&&F$.cwd===Y&&F$.ignoreKey===_&&L-F$.timestamp<O9){U(F$.files),O(!1);return}let H=!1,I=setTimeout(async()=>{O(!0);try{let B=(await U9("**/*",{cwd:Y,dot:!1,followSymbolicLinks:!1,onlyFiles:!1,markDirectories:!0,unique:!0,ignore:q})).map((A)=>A.replace(/\\/g,"/"));if(!H)U(B),F$={cwd:Y,ignoreKey:_,files:B,timestamp:L}}catch(v){if(console.error("Failed to load files for @ completion:",v),!H)U([])}finally{if(!H)O(!1)}},X);return()=>{H=!0,clearTimeout(I)}},[$,Y,X,_]);let w=d8(()=>{if(!W.hasQuery||K.length===0)return[];let L=W.query.toLowerCase();if(L==="")return K.slice(0,Z);if(G)return new K9(K,{threshold:0.4,ignoreLocation:!0,minMatchCharLength:1}).search(L).slice(0,Z).map((I)=>I.item);return K.filter((H)=>H.toLowerCase().includes(L)).slice(0,Z)},[W,K,Z,G]);return s6(()=>{z(0)},[w]),{...W,suggestions:w,selectedIndex:N,loading:F}}function N9($,Q=!1){if($.includes(" ")||Q)return`@"${$}"`;return`@${$}`}function QJ($,Q,J){if(!Q.hasQuery)return{newInput:$,newCursorPos:$.length};let Y=N9(J,Q.quoted),Z=$.slice(0,Q.startIndex),q=$.slice(Q.endIndex),X=Z+Y+" "+q,G=Q.startIndex+Y.length+1;return{newInput:X,newCursorPos:G}}import{useMemoizedFn as JJ}from"ahooks";import{useEffect as YJ,useRef as ZJ}from"react";var P0=($,Q)=>{let J=ZJ(!1),Y=ZJ(null),Z=JJ(()=>{if(Y.current)clearTimeout(Y.current);Y.current=setTimeout(()=>{w1().setAwaitingSecondCtrlC(!1),J.current=!1,Y.current=null},3000)}),q=()=>{D$().shutdown("SIGINT",0)},X=JJ(()=>{if(!J.current){if(J.current=!0,$&&Q)Q();w1().setAwaitingSecondCtrlC(!0),Z()}else{if(Y.current)clearTimeout(Y.current),Y.current=null;w1().setAwaitingSecondCtrlC(!1),q()}});return YJ(()=>{if($){if(w1().setAwaitingSecondCtrlC(!1),J.current=!1,Y.current)clearTimeout(Y.current),Y.current=null}},[$]),YJ(()=>{return()=>{if(Y.current)clearTimeout(Y.current)}},[]),X};var Z8=j1("UI"),OJ=($,Q,J,Y,Z,q,X,G,K,U)=>{let O=i0()==="main-input",N=$.value,z=$.setValue,_=$.cursorPosition,W=f1(),w=D1(),L=i$(),H=L?X8(L):!1,[R,I]=a8(!1),[v,B]=a8([]),[A,b]=a8(0),k=$J(N,_,{cwd:A0(),maxSuggestions:10}),V=P0(X||!1,q),p=GJ(0),d=500,l=GJ(!1);qJ(()=>{if(X)l.current=!1},[X]),qJ(()=>{if(k.hasQuery&&k.suggestions.length>0){let C=k.suggestions.map((y)=>({command:y,description:UJ(y)?`Directory: ${y}`:`File: ${y}`,matchScore:1}));B(C),I(!0),b(0)}else if(N.startsWith("/"))if(N.includes(" "))I(!1),B([]);else{let y=KJ(N);B(y),I(y.length>0),b(0)}else I(!1),B([])},[N,k.hasQuery,k.suggestions]);let s=XJ(()=>{W.clearMessages(),W.setError(null)}),D=XJ(()=>{Z8.debug("[DIAG] handleSubmit called:",{input:N,showSuggestions:R});let C=N.trim();if(C){let y=$.resolveInput(C);Z8.debug("[DIAG] Submitting command:",{displayText:C,textLength:y.text.length,imageCount:y.images.length}),I(!1),B([]);let a=$.pasteMap.size>0?new Map($.pasteMap):new Map;Z(C,a),$.clear(),Q(y),Z8.debug("[DIAG] Command submitted to onSubmit callback")}else Z8.debug("[DIAG] Empty command, not submitting")});return F9((C,y)=>{if(C==="?"&&!N){K?.(),setTimeout(()=>$.clear(),0);return}if(y.backspace||y.delete||y.leftArrow||y.rightArrow||y.pageUp||y.pageDown||!y.ctrl&&!y.meta&&!y.escape&&!y.tab&&!y.upArrow&&!y.downArrow&&!y.return&&!(C==="?"&&!N))return;if(y.ctrl&&C==="c"||y.meta&&C==="c"||y.ctrl&&C==="d"||y.meta&&C==="d"){V();return}if(y.ctrl&&C==="l"||y.meta&&C==="l"){s();return}if(y.ctrl&&C==="t"||y.meta&&C==="t"){W.toggleThinkingExpanded();return}if(y.ctrl&&C==="o"||y.meta&&C==="o"){W.toggleHistoryExpanded();return}if(y.escape){if(U)K?.();else if(X&&q){if(l.current)return;l.current=!0,q()}else if(R)I(!1),B([]);else if(N){let u=Date.now();if(u-p.current<500)$.clear(),p.current=0;else p.current=u}return}if(y.tab&&y.shift){G?.();return}if(y.tab){if(R&&v.length>0){let u=v[A].command;if(k.hasQuery&&k.suggestions.includes(u)){let{newInput:P,newCursorPos:r}=QJ(N,k,u);z(P),$.setCursorPosition(r)}else{let P=u+" ";z(P),$.setCursorPosition(P.length)}I(!1),B([])}else if(H)w.toggleThinkingMode();return}if(y.return){D();return}if(y.upArrow){if(R&&v.length>0){let u=v.length-1;b((P)=>P>0?P-1:u)}else{let u=J();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}if(y.downArrow){if(R&&v.length>0){let u=v.length-1;b((P)=>P<u?P+1:0)}else{let u=Y();if(u){if(u.pasteMappings.size>0)$.restorePasteMappings(u.pasteMappings);z(u.display),$.setCursorPosition(u.display.length)}}return}},{isActive:O}),{handleSubmit:D,showSuggestions:R,suggestions:v,selectedSuggestionIndex:A}};import b9 from"ansi-escapes";import{useStdout as B9}from"ink";import{useCallback as A9,useEffect as v9,useRef as R9}from"react";import{useStdout as W9}from"ink";import{debounce as H9}from"lodash-es";import{useEffect as L9,useState as w9}from"react";function W$($=200){let{stdout:Q}=W9(),[J,Y]=w9(Q.columns||80);return L9(()=>{let Z=H9(()=>{Y(Q.columns||80)},$);return Z(),Q.on("resize",Z),()=>{Q.off("resize",Z),Z.cancel()}},[Q,$]),J}function zJ(){let{stdout:$}=B9(),Q=W$(),J=R9(!0),Y=Q0((q)=>q.session.actions.incrementClearCount),Z=A9(()=>{if($)$.write(b9.clearTerminal);Y()},[$,Y]);return v9(()=>{if(J.current){J.current=!1;return}let q=setTimeout(()=>{Z()},300);return()=>{clearTimeout(q)}},[Q,Z]),{refreshStatic:Z}}import _J from"node:fs";import y9 from"node:os";import o8 from"node:path";import{MultiSelect as P9}from"@inkjs/ui";import{useMemoizedFn as q8}from"ahooks";import{Box as t,Text as x,useFocus as I9,useFocusManager as M9,useInput as FJ}from"ink";import G8 from"ink-select-input";import C9 from"ink-spinner";import V$ from"ink-text-input";import{useEffect as NJ,useState as H$}from"react";import{jsxDEV as M}from"react/jsx-dev-runtime";var k9=[{label:"Glob - 文件搜索",value:"Glob"},{label:"Grep - 内容搜索",value:"Grep"},{label:"Read - 读取文件",value:"Read"},{label:"Write - 写入文件",value:"Write"},{label:"Edit - 编辑文件",value:"Edit"},{label:"Bash - 执行命令",value:"Bash"},{label:"所有工具 (不限制)",value:"all"}],S9=[{label:"红色 (red)",value:"red"},{label:"蓝色 (blue)",value:"blue"},{label:"绿色 (green)",value:"green"},{label:"黄色 (yellow)",value:"yellow"},{label:"紫色 (purple)",value:"purple"},{label:"橙色 (orange)",value:"orange"},{label:"粉色 (pink)",value:"pink"},{label:"青色 (cyan)",value:"cyan"},{label:"不设置颜色",value:"none"}];function T9($){if(!$||$.trim()==="")return"名称不能为空";if(!/^[a-z0-9-]+$/.test($))return"名称只能包含小写字母、数字和连字符";if($.startsWith("-")||$.endsWith("-"))return"名称不能以连字符开头或结尾";return null}function j$({onComplete:$,onCancel:Q,initialConfig:J}){let[Y,Z]=H$(J?"name":"mode"),[q,X]=H$({name:J?.name||"",description:J?.description||"",tools:J?.tools||[],color:J?.color,location:J?.location||"project",systemPrompt:J?.systemPrompt||""}),[G,K]=H$(""),[U,F]=H$(!1),[O,N]=H$(""),[z,_]=H$(J?"edit":"manual"),{focus:W}=M9(),L={manual:["mode","name","description","tools","color","location","systemPrompt","confirm"],ai:["mode","aiPrompt","aiGenerating","confirm"],edit:["name","description","tools","color","location","systemPrompt","confirm"]}[z];NJ(()=>{if(Y==="name"||Y==="description"||Y==="systemPrompt"||Y==="aiPrompt")return;W(`step-${Y}`)},[Y,W]);let H=q8(()=>{let A=L.indexOf(Y);if(A<L.length-1)Z(L[A+1])}),R=q8(()=>{if(O)N("");if(Y==="confirm"&&z==="ai"){Z("aiPrompt");return}let A=L.indexOf(Y);if(A>0)Z(L[A-1]);else Q()}),I=q8(async()=>{F(!0),N("");try{let A=await f$.create(),b=`你是一个 Subagent 配置生成专家。用户会描述他们想要创建的 agent,你需要根据描述生成一个完整的 agent 配置。
29
29
 
30
30
  ## 可用工具列表
31
31
 
@@ -154,4 +154,4 @@ ${V}
154
154
  `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}catch(f0){a0.warn("Failed to initialize SpecManager:",f0),z.addAssistantMessage(`**已进入 Spec 模式**
155
155
 
156
156
  `+`请告诉我你想实现什么功能,我会引导你完成整个工作流:
157
- `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}}catch(f0){a0.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),C=r0(async(o)=>{try{await p0().addModel({name:o.name,provider:o.provider,apiKey:o.apiKey,baseUrl:o.baseUrl,model:o.model}),N.setInitializationStatus("ready")}catch(O0){a0.error("初始化配置保存失败:",O0 instanceof Error?O0.message:O0),N.setInitializationStatus("ready")}}),y=r0(()=>{if(U==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),{showSuggestions:a,suggestions:u,selectedSuggestionIndex:P}=OJ(s,k,p,d,l,V,w,D,y,U==="shortcuts");r1(()=>{if(s.value&&U==="shortcuts")N.closeModal()},[s.value,U,N]);let r=r0(async()=>{q.current=!0;try{let o=await _1.listSessions();if(o.length===0){z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let O0=o[0],f0=await _1.loadSession(O0.sessionId),r$=_1.toUISafeMessages(f0);z.restoreSession(O0.sessionId,r$,f0)}catch(o){a0.error("[BladeInterface] 继续会话失败:",o),z.addAssistantMessage("继续会话失败,开始新对话。")}}),T=r0(async()=>{q.current=!0;try{if(typeof J.resume==="string"&&J.resume!=="true"){let O0=await _1.loadSession(J.resume),f0=_1.toUISafeMessages(O0);z.restoreSession(J.resume,f0,O0);return}let o=await _1.listSessions();if(o.length===0)a0.error("没有找到历史会话"),o1(1);N.showSessionSelector(o)}catch(o){a0.error("[BladeInterface] 加载会话失败:",o),o1(1)}});r1(()=>{if(Y.current)return;if(Q){Y.current=!0,r();return}if(J.resume)Y.current=!0,T()},[Q,J.resume,r,T]);let h=r0(async(o)=>{let O0=v.details?.type;if(O0==="enterPlanMode"&&o.approved)try{await p0().setPermissionMode("plan"),a0.debug("[BladeInterface] Entered Plan mode")}catch(f0){a0.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(O0==="exitPlanMode"&&o.approved)a0.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");A(o)}),S=r0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),o1(0)}),i=r0(()=>{N.closeModal()}),D0=r0(async(o)=>{try{let O0=await _1.loadSession(o),f0=_1.toUISafeMessages(O0);z.restoreSession(o,f0,O0),N.closeModal()}catch(O0){a0.error("[BladeInterface] Failed to restore session:",O0),N.closeModal()}}),B0=r0(()=>{if(J.resume)o1(0);else N.closeModal()}),o0=r0((o)=>{N.showModelEditWizard(o)}),S0=r0((o)=>{z.addAssistantMessage(`已添加模型配置: ${o.name},并已切换到该模型`),i()}),J1=r0((o)=>{z.addAssistantMessage(`已更新模型配置: ${o.name}`),i()});r1(()=>{if(R){_.setFocus("model-config-wizard");return}if(v.isVisible)_.setFocus("confirmation-prompt");else if(U==="sessionSelector")_.setFocus("session-selector");else if(U==="themeSelector")_.setFocus("theme-selector");else if(U==="modelSelector")_.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")_.setFocus("model-config-wizard");else if(U==="permissionsManager")_.setFocus("permissions-manager");else if(U==="agentsManager")_.setFocus("agents-manager");else if(U==="agentCreationWizard")_.setFocus("agent-creation-wizard");else if(U==="hooksManager")_.setFocus("hooks-manager");else if(U==="shortcuts")_.setFocus("main-input");else _.setFocus("main-input")},[R,v.isVisible,U,_.setFocus]),r1(()=>{if(!H||q.current)return;if(b4().length>0){q.current=!0;return}q.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[H]),r1(()=>{if(!K)return;if(X.current===K)return;if(X.current=K,G==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,G,z.addAssistantMessage]);let j8=r0(async(o)=>{try{await k({displayText:o,text:o,images:[],parts:[{type:"text",text:o}]})}catch(O0){let f0=O0 instanceof Error?O0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${f0}`)}});r1(()=>{let o=J.initialMessage?.trim();if(!o||Z.current||!H||R)return;Z.current=!0,l(o),j8(o)},[J.initialMessage,H,R,k,l]);let E8=r0(async(o)=>{try{await p0().setPermissionMode(o)}catch(O0){a0.error("权限模式初始化失败:",O0 instanceof Error?O0.message:O0)}});if(r1(()=>{let o=J.permissionMode;if($)a0.debug("[Debug] permissionMode from CLI:",o),a0.debug("[Debug] current permissionMode:",W);if(!o||o===W)return;E8(o)},[J.permissionMode,W]),I)return null;if(R)return H0(pQ,{mode:"setup",onComplete:C,onCancel:S},void 0,!1,void 0,this);if($)a0.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:U});let rQ=U==="modelSelector",T1=O,C$=U==="modelAddWizard"?"add":U==="modelEditWizard"&&T1?"edit":null,j4=rQ||Boolean(C$),E4=U==="agentsManager",h4=U==="agentCreationWizard",m4=U==="skillsManager",g4=U==="pluginsManager",p4=T1?{name:T1.name,provider:T1.provider,baseUrl:T1.baseUrl,apiKey:T1.apiKey,model:T1.model}:void 0,aQ=v.isVisible&&v.details?v.details.type==="askUserQuestion"&&v.details.questions?H0(Z4,{questions:v.details.questions,onComplete:(o)=>h({approved:!0,answers:o}),onCancel:()=>h({approved:!1})},void 0,!1,void 0,this):H0(sJ,{details:v.details,onResponse:h},void 0,!1,void 0,this):U==="themeSelector"?H0(w4,{},void 0,!1,void 0,this):U==="permissionsManager"?H0(Q4,{onClose:i},void 0,!1,void 0,this):U==="sessionSelector"?H0(q4,{sessions:F,onSelect:D0,onCancel:B0},void 0,!1,void 0,this):U==="hooksManager"?H0($2,{onClose:i},void 0,!1,void 0,this):null,oQ=Boolean(aQ);return H0(l1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[aQ,H0(l1,{flexDirection:"column",display:oQ?"none":"flex",children:[W==="spec"&&H0(z4,{},void 0,!1,void 0,this),H0(V2,{},void 0,!1,void 0,this),H0(W4,{},void 0,!1,void 0,this),H0(w2,{paused:oQ},void 0,!1,void 0,this),H0(z2,{input:s.value,cursorPosition:s.cursorPosition,onChange:s.setValue,onChangeCursorPosition:s.setCursorPosition,onAddPasteMapping:s.addPasteMapping,onAddImagePasteMapping:s.addImagePasteMapping},void 0,!1,void 0,this),rQ&&H0(l1,{marginTop:1,paddingX:2,children:H0(n2,{onClose:i,onEdit:o0},void 0,!1,void 0,this)},void 0,!1,void 0,this),C$&&H0(l1,{marginTop:1,paddingX:2,children:H0(pQ,{mode:C$,modelId:T1?.id,initialConfig:C$==="edit"?p4:void 0,onComplete:C$==="edit"?J1:S0,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),E4&&H0(l1,{marginTop:1,paddingX:2,children:H0(HJ,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),h4&&H0(l1,{marginTop:1,paddingX:2,children:H0(j$,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),m4&&H0(l1,{marginTop:1,paddingX:2,children:H0(U4,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),g4&&H0(l1,{marginTop:1,paddingX:2,children:H0(J4,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(RJ,{suggestions:u,selectedIndex:P,visible:a&&!j4},void 0,!1,void 0,this),H0(vJ,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as m5,Text as a1}from"ink";import g5 from"react";import{jsxDEV as k1}from"react/jsx-dev-runtime";class f8 extends g5.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return k1(m5,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[k1(a1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),k1(a1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as z$,Text as S1,useInput as p5}from"ink";import{useState as xQ}from"react";import{jsxDEV as x0}from"react/jsx-dev-runtime";var D8=[{key:"update",label:"Update now",description:`runs \`${v4()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],y4=({versionInfo:$,onComplete:Q})=>{let[J,Y]=xQ(0),[Z,q]=xQ(!1),[X,G]=xQ(null);p5((U,F)=>{if(F.ctrl&&U==="c"){D$().shutdown("SIGINT",0);return}if(Z||X)return;if(F.upArrow||U==="k")Y((O)=>O>0?O-1:D8.length-1);else if(F.downArrow||U==="j")Y((O)=>O<D8.length-1?O+1:0);else if(F.return)K(D8[J].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{q(!0);let F=await R4();G(F.message),setTimeout(()=>{D$().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await A4($.latestVersion);Q();break}};if(X)return x0(z$,{flexDirection:"column",marginY:1,children:x0(S1,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return x0(z$,{flexDirection:"column",marginY:1,children:x0(S1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return x0(z$,{flexDirection:"column",marginY:1,children:[x0(S1,{color:"yellow",bold:!0,children:["Update available! ",x0(S1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x0(z$,{marginTop:1,children:x0(S1,{color:"gray",children:["Release notes:"," ",x0(S1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x0(z$,{flexDirection:"column",marginTop:1,children:D8.map((U,F)=>{let O=F===J,N=O?"› ":" ",z=`${F+1}. `;return x0(z$,{children:x0(S1,{color:O?"cyan":void 0,children:[N,z,U.label,U.description&&x0(S1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),x0(z$,{marginTop:1,children:x0(S1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function M$($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as V8}from"react/jsx-dev-runtime";function u5($){if(H1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");w1().setInitializationStatus("ready")}var G_=($)=>{let[Q,J]=lQ(!1),[Y,Z]=lQ(null),[q,X]=lQ(!1),G=dQ((F,O)=>{let N=F instanceof Error?F.message:String(F);if(w1().setInitializationError(N),w1().setInitializationStatus("error"),J(!0),O)console.error("[FAIL] 应用初始化失败:",N)}),K=dQ(async()=>{try{let F=H1().config.config??I4,O=M4(F,$);if(u5(O),O.resumeSessionId)C4().restoreSession(O.resumeSessionId,[]);if(O.debug)console.error("[Debug] 运行时配置:",O);let N=O.theme;if(N&&m0.hasTheme(N)){if(m0.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{let z=e1.loadFromStandardLocations();if($.debug&&z>0)console.log(`[OK] 已加载 ${z} 个 subagents: ${e1.getAllNames().join(", ")}`)}catch(z){if($.debug)console.warn("Subagents 加载失败:",M$(z))}try{let z=L1.getInstance();if(z.loadConfig(O.hooks||{}),$.debug&&O.hooks?.enabled)console.log("[OK] Hooks 系统已启用");let _=H1(),W=_.session.sessionId;if(P4(W),z.isEnabled()){let w=_.config.config?.permissionMode||"default",L=!!$.resume,H=await z.executeSessionStartHooks({projectDir:A0(),sessionId:W,permissionMode:w,isResume:L,resumeSessionId:typeof $.resume==="string"?$.resume:void 0});if(H.env){for(let[R,I]of Object.entries(H.env))process.env[R]=I;if($.debug)console.log("[OK] SessionStart hooks 注入环境变量:",Object.keys(H.env).join(", "))}if(H.warning&&$.debug)console.warn("SessionStart hooks 警告:",H.warning)}}catch(z){if($.debug)console.warn("Hooks 初始化失败:",M$(z))}try{let z=await T4();if($.debug&&z.skills.length>0)console.log(`[OK] 已加载 ${z.skills.length} 个 skills: ${z.skills.map((_)=>_.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let _ of z.errors)console.warn(`Skill 加载错误 (${_.path}): ${_.error}`)}catch(z){if($.debug)console.warn("Skills 初始化失败:",M$(z))}try{let z=await V4(A0());if($.debug&&z.commands.length>0)console.log(`[OK] 已加载 ${z.commands.length} 个自定义命令: ${z.commands.map((_)=>_.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let _ of z.errors)console.warn(`自定义命令加载错误 (${_.path}): ${_.error}`)}catch(z){if($.debug)console.warn("自定义命令初始化失败:",M$(z))}try{let _=await M8().initialize(A0(),$.pluginDir||[]);if($.debug&&_.plugins.length>0)console.log(`[OK] 已加载 ${_.plugins.length} 个插件: ${_.plugins.map((W)=>W.manifest.name).join(", ")}`);if(_.plugins.length>0){let W=await D4();if($.debug){let{totalCommands:w,totalSkills:L,totalAgents:H,totalMcpServers:R}=W;console.log(` [OK] 已集成: ${w} 命令, ${L} 技能, ${H} 代理, ${R} MCP 服务器`)}}if(_.errors.length>0&&$.debug)for(let W of _.errors)console.warn(`插件加载错误 (${W.path}): ${W.error}`)}catch(z){if($.debug)console.warn("插件系统初始化失败:",M$(z))}k4(async()=>{f4.getInstance().killAll(),await S4.getInstance().disconnectAll(),L1.getInstance().cleanup()}),J(!0)}catch(F){G(F,!!$.debug)}}),U=dQ(async()=>{if($.versionCheckPromise){let F=await $.versionCheckPromise;if(F){Z(F),X(!0);return}}await K()});if(c5(()=>{U()},[]),q&&Y)return V8(f8,{children:V8(y4,{versionInfo:Y,onComplete:()=>{X(!1),K()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return V8(f8,{children:V8(B4,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{G_ as AppWrapper};
157
+ `+"`提案 -> 需求 -> 设计 -> 任务 -> 实现`\n\n"+'例如:"实现用户认证功能" 或 "添加暗黑模式支持"')}}catch(f0){a0.error("权限模式切换失败:",f0 instanceof Error?f0.message:f0)}}),C=r0(async(o)=>{try{await p0().addModel({name:o.name,provider:o.provider,apiKey:o.apiKey,baseUrl:o.baseUrl,model:o.model}),N.setInitializationStatus("ready")}catch(O0){a0.error("初始化配置保存失败:",O0 instanceof Error?O0.message:O0),N.setInitializationStatus("ready")}}),y=r0(()=>{if(U==="shortcuts")N.closeModal();else N.setActiveModal("shortcuts")}),{showSuggestions:a,suggestions:u,selectedSuggestionIndex:P}=OJ(s,k,p,d,l,V,w,D,y,U==="shortcuts");r1(()=>{if(s.value&&U==="shortcuts")N.closeModal()},[s.value,U,N]);let r=r0(async()=>{q.current=!0;try{let o=await _1.listSessions();if(o.length===0){z.addAssistantMessage("没有找到历史会话,开始新对话。");return}let O0=o[0],f0=await _1.loadSession(O0.sessionId),r$=_1.toUISafeMessages(f0);z.restoreSession(O0.sessionId,r$,f0)}catch(o){a0.error("[BladeInterface] 继续会话失败:",o),z.addAssistantMessage("继续会话失败,开始新对话。")}}),T=r0(async()=>{q.current=!0;try{if(typeof J.resume==="string"&&J.resume!=="true"){let O0=await _1.loadSession(J.resume),f0=_1.toUISafeMessages(O0);z.restoreSession(J.resume,f0,O0);return}let o=await _1.listSessions();if(o.length===0)a0.error("没有找到历史会话"),i1(1);N.showSessionSelector(o)}catch(o){a0.error("[BladeInterface] 加载会话失败:",o),i1(1)}});r1(()=>{if(Y.current)return;if(Q){Y.current=!0,r();return}if(J.resume)Y.current=!0,T()},[Q,J.resume,r,T]);let h=r0(async(o)=>{let O0=v.details?.type;if(O0==="enterPlanMode"&&o.approved)try{await p0().setPermissionMode("plan"),a0.debug("[BladeInterface] Entered Plan mode")}catch(f0){a0.error("[BladeInterface] Failed to enter Plan mode:",f0)}if(O0==="exitPlanMode"&&o.approved)a0.debug("[BladeInterface] ExitPlanMode approved, Store auto-synced");A(o)}),S=r0(()=>{z.addAssistantMessage("设置已取消"),z.addAssistantMessage("Blade 需要 API 配置才能正常工作。"),z.addAssistantMessage("您可以稍后运行 Blade 重新进入设置向导。"),i1(0)}),i=r0(()=>{N.closeModal()}),D0=r0(async(o)=>{try{let O0=await _1.loadSession(o),f0=_1.toUISafeMessages(O0);z.restoreSession(o,f0,O0),N.closeModal()}catch(O0){a0.error("[BladeInterface] Failed to restore session:",O0),N.closeModal()}}),B0=r0(()=>{if(J.resume)i1(0);else N.closeModal()}),o0=r0((o)=>{N.showModelEditWizard(o)}),S0=r0((o)=>{z.addAssistantMessage(`已添加模型配置: ${o.name},并已切换到该模型`),i()}),J1=r0((o)=>{z.addAssistantMessage(`已更新模型配置: ${o.name}`),i()});r1(()=>{if(R){_.setFocus("model-config-wizard");return}if(v.isVisible)_.setFocus("confirmation-prompt");else if(U==="sessionSelector")_.setFocus("session-selector");else if(U==="themeSelector")_.setFocus("theme-selector");else if(U==="modelSelector")_.setFocus("model-selector");else if(U==="modelAddWizard"||U==="modelEditWizard")_.setFocus("model-config-wizard");else if(U==="permissionsManager")_.setFocus("permissions-manager");else if(U==="agentsManager")_.setFocus("agents-manager");else if(U==="agentCreationWizard")_.setFocus("agent-creation-wizard");else if(U==="hooksManager")_.setFocus("hooks-manager");else if(U==="shortcuts")_.setFocus("main-input");else _.setFocus("main-input")},[R,v.isVisible,U,_.setFocus]),r1(()=>{if(!H||q.current)return;if(b4().length>0){q.current=!0;return}q.current=!0,z.addAssistantMessage("请输入您的问题,我将为您提供帮助。")},[H]),r1(()=>{if(!K)return;if(X.current===K)return;if(X.current=K,G==="error")z.addAssistantMessage(`初始化失败: ${K}`);else z.addAssistantMessage(`${K}`),z.addAssistantMessage("请重新尝试设置,或检查文件权限")},[K,G,z.addAssistantMessage]);let j8=r0(async(o)=>{try{await k({displayText:o,text:o,images:[],parts:[{type:"text",text:o}]})}catch(O0){let f0=O0 instanceof Error?O0.message:"无法发送初始消息";z.addAssistantMessage(`初始消息发送失败:${f0}`)}});r1(()=>{let o=J.initialMessage?.trim();if(!o||Z.current||!H||R)return;Z.current=!0,l(o),j8(o)},[J.initialMessage,H,R,k,l]);let E8=r0(async(o)=>{try{await p0().setPermissionMode(o)}catch(O0){a0.error("权限模式初始化失败:",O0 instanceof Error?O0.message:O0)}});if(r1(()=>{let o=J.permissionMode;if($)a0.debug("[Debug] permissionMode from CLI:",o),a0.debug("[Debug] current permissionMode:",W);if(!o||o===W)return;E8(o)},[J.permissionMode,W]),I)return null;if(R)return H0(pQ,{mode:"setup",onComplete:C,onCancel:S},void 0,!1,void 0,this);if($)a0.debug("[Debug] 渲染主界面,条件检查:",{confirmationVisible:v.isVisible,activeModal:U});let rQ=U==="modelSelector",T1=O,C$=U==="modelAddWizard"?"add":U==="modelEditWizard"&&T1?"edit":null,j4=rQ||Boolean(C$),E4=U==="agentsManager",h4=U==="agentCreationWizard",m4=U==="skillsManager",g4=U==="pluginsManager",p4=T1?{name:T1.name,provider:T1.provider,baseUrl:T1.baseUrl,apiKey:T1.apiKey,model:T1.model}:void 0,aQ=v.isVisible&&v.details?v.details.type==="askUserQuestion"&&v.details.questions?H0(Z4,{questions:v.details.questions,onComplete:(o)=>h({approved:!0,answers:o}),onCancel:()=>h({approved:!1})},void 0,!1,void 0,this):H0(sJ,{details:v.details,onResponse:h},void 0,!1,void 0,this):U==="themeSelector"?H0(w4,{},void 0,!1,void 0,this):U==="permissionsManager"?H0(Q4,{onClose:i},void 0,!1,void 0,this):U==="sessionSelector"?H0(q4,{sessions:F,onSelect:D0,onCancel:B0},void 0,!1,void 0,this):U==="hooksManager"?H0($2,{onClose:i},void 0,!1,void 0,this):null,oQ=Boolean(aQ);return H0(l1,{flexDirection:"column",width:"100%",overflow:"hidden",children:[aQ,H0(l1,{flexDirection:"column",display:oQ?"none":"flex",children:[W==="spec"&&H0(z4,{},void 0,!1,void 0,this),H0(V2,{},void 0,!1,void 0,this),H0(W4,{},void 0,!1,void 0,this),H0(w2,{paused:oQ},void 0,!1,void 0,this),H0(z2,{input:s.value,cursorPosition:s.cursorPosition,onChange:s.setValue,onChangeCursorPosition:s.setCursorPosition,onAddPasteMapping:s.addPasteMapping,onAddImagePasteMapping:s.addImagePasteMapping},void 0,!1,void 0,this),rQ&&H0(l1,{marginTop:1,paddingX:2,children:H0(n2,{onClose:i,onEdit:o0},void 0,!1,void 0,this)},void 0,!1,void 0,this),C$&&H0(l1,{marginTop:1,paddingX:2,children:H0(pQ,{mode:C$,modelId:T1?.id,initialConfig:C$==="edit"?p4:void 0,onComplete:C$==="edit"?J1:S0,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),E4&&H0(l1,{marginTop:1,paddingX:2,children:H0(HJ,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),h4&&H0(l1,{marginTop:1,paddingX:2,children:H0(j$,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),m4&&H0(l1,{marginTop:1,paddingX:2,children:H0(U4,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),g4&&H0(l1,{marginTop:1,paddingX:2,children:H0(J4,{onComplete:i,onCancel:i},void 0,!1,void 0,this)},void 0,!1,void 0,this),H0(RJ,{suggestions:u,selectedIndex:P,visible:a&&!j4},void 0,!1,void 0,this),H0(vJ,{},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)};import{Box as m5,Text as a1}from"ink";import g5 from"react";import{jsxDEV as k1}from"react/jsx-dev-runtime";class f8 extends g5.Component{constructor($){super($);this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError($){return{hasError:!0,error:$,errorInfo:null}}componentDidCatch($,Q){this.setState({error:$,errorInfo:Q}),console.error("未捕获的错误:",$,Q)}render(){if(this.state.hasError)return k1(m5,{flexDirection:"column",padding:1,borderStyle:"round",borderColor:"red",children:[k1(a1,{color:"red",children:"应用发生错误"},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"red",children:this.state.error?.message},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"gray",children:"错误详情:"},void 0,!1,void 0,this),k1(a1,{color:"gray",children:this.state.error?.stack},void 0,!1,void 0,this),k1(a1,{children:" "},void 0,!1,void 0,this),k1(a1,{color:"yellow",children:"请重启应用或联系开发者"},void 0,!1,void 0,this)]},void 0,!0,void 0,this);return this.props.children}}import{Box as z$,Text as S1,useInput as p5}from"ink";import{useState as xQ}from"react";import{jsxDEV as x0}from"react/jsx-dev-runtime";var D8=[{key:"update",label:"Update now",description:`runs \`${v4()}\``},{key:"skip",label:"Skip",description:""},{key:"skip_until_next",label:"Skip until next version",description:""}],y4=({versionInfo:$,onComplete:Q})=>{let[J,Y]=xQ(0),[Z,q]=xQ(!1),[X,G]=xQ(null);p5((U,F)=>{if(F.ctrl&&U==="c"){D$().shutdown("SIGINT",0);return}if(Z||X)return;if(F.upArrow||U==="k")Y((O)=>O>0?O-1:D8.length-1);else if(F.downArrow||U==="j")Y((O)=>O<D8.length-1?O+1:0);else if(F.return)K(D8[J].key);else if(U==="1")K("update");else if(U==="2")K("skip");else if(U==="3")K("skip_until_next")});let K=async(U)=>{switch(U){case"update":{q(!0);let F=await R4();G(F.message),setTimeout(()=>{D$().shutdown("SIGINT",0)},1500);break}case"skip":Q();break;case"skip_until_next":if($.latestVersion)await A4($.latestVersion);Q();break}};if(X)return x0(z$,{flexDirection:"column",marginY:1,children:x0(S1,{children:X},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(Z)return x0(z$,{flexDirection:"column",marginY:1,children:x0(S1,{color:"cyan",children:"Updating..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);return x0(z$,{flexDirection:"column",marginY:1,children:[x0(S1,{color:"yellow",bold:!0,children:["Update available! ",x0(S1,{color:"gray",children:[$.currentVersion," ","->"," ",$.latestVersion]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),x0(z$,{marginTop:1,children:x0(S1,{color:"gray",children:["Release notes:"," ",x0(S1,{color:"cyan",underline:!0,children:$.releaseNotesUrl},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),x0(z$,{flexDirection:"column",marginTop:1,children:D8.map((U,F)=>{let O=F===J,N=O?"› ":" ",z=`${F+1}. `;return x0(z$,{children:x0(S1,{color:O?"cyan":void 0,children:[N,z,U.label,U.description&&x0(S1,{color:"gray",children:[" (",U.description,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)},U.key,!1,void 0,this)})},void 0,!1,void 0,this),x0(z$,{marginTop:1,children:x0(S1,{color:"gray",children:"Press enter to continue"},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)};function M$($){return($ instanceof Error?$.message:String($)).replace(/sk-[a-zA-Z0-9]{32,}/g,"sk-***").replace(/apiKey['":\s]+[a-zA-Z0-9-_]+/gi,"apiKey: ***").replace(/API_KEY['":\s=]+[a-zA-Z0-9-_]+/gi,"API_KEY=***")}import{jsxDEV as V8}from"react/jsx-dev-runtime";function u5($){if(H1().config.actions.setConfig($),$.debug)console.log("[Debug] 模型配置检查通过,准备就绪");w1().setInitializationStatus("ready")}var G_=($)=>{let[Q,J]=lQ(!1),[Y,Z]=lQ(null),[q,X]=lQ(!1),G=dQ((F,O)=>{let N=F instanceof Error?F.message:String(F);if(w1().setInitializationError(N),w1().setInitializationStatus("error"),J(!0),O)console.error("[FAIL] 应用初始化失败:",N)}),K=dQ(async()=>{try{let F=H1().config.config??I4,O=M4(F,$);if(u5(O),O.resumeSessionId)C4().restoreSession(O.resumeSessionId,[]);if(O.debug)console.error("[Debug] 运行时配置:",O);let N=O.theme;if(N&&m0.hasTheme(N)){if(m0.setTheme(N),$.debug)console.log(`[OK] 已加载主题: ${N}`)}try{let z=e1.loadFromStandardLocations();if($.debug&&z>0)console.log(`[OK] 已加载 ${z} 个 subagents: ${e1.getAllNames().join(", ")}`)}catch(z){if($.debug)console.warn("Subagents 加载失败:",M$(z))}try{let z=L1.getInstance();if(z.loadConfig(O.hooks||{}),$.debug&&O.hooks?.enabled)console.log("[OK] Hooks 系统已启用");let _=H1(),W=_.session.sessionId;if(P4(W),z.isEnabled()){let w=_.config.config?.permissionMode||"default",L=!!$.resume,H=await z.executeSessionStartHooks({projectDir:A0(),sessionId:W,permissionMode:w,isResume:L,resumeSessionId:typeof $.resume==="string"?$.resume:void 0});if(H.env){for(let[R,I]of Object.entries(H.env))process.env[R]=I;if($.debug)console.log("[OK] SessionStart hooks 注入环境变量:",Object.keys(H.env).join(", "))}if(H.warning&&$.debug)console.warn("SessionStart hooks 警告:",H.warning)}}catch(z){if($.debug)console.warn("Hooks 初始化失败:",M$(z))}try{let z=await T4();if($.debug&&z.skills.length>0)console.log(`[OK] 已加载 ${z.skills.length} 个 skills: ${z.skills.map((_)=>_.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let _ of z.errors)console.warn(`Skill 加载错误 (${_.path}): ${_.error}`)}catch(z){if($.debug)console.warn("Skills 初始化失败:",M$(z))}try{let z=await V4(A0());if($.debug&&z.commands.length>0)console.log(`[OK] 已加载 ${z.commands.length} 个自定义命令: ${z.commands.map((_)=>_.name).join(", ")}`);if(z.errors.length>0&&$.debug)for(let _ of z.errors)console.warn(`自定义命令加载错误 (${_.path}): ${_.error}`)}catch(z){if($.debug)console.warn("自定义命令初始化失败:",M$(z))}try{let _=await M8().initialize(A0(),$.pluginDir||[]);if($.debug&&_.plugins.length>0)console.log(`[OK] 已加载 ${_.plugins.length} 个插件: ${_.plugins.map((W)=>W.manifest.name).join(", ")}`);if(_.plugins.length>0){let W=await D4();if($.debug){let{totalCommands:w,totalSkills:L,totalAgents:H,totalMcpServers:R}=W;console.log(` [OK] 已集成: ${w} 命令, ${L} 技能, ${H} 代理, ${R} MCP 服务器`)}}if(_.errors.length>0&&$.debug)for(let W of _.errors)console.warn(`插件加载错误 (${W.path}): ${W.error}`)}catch(z){if($.debug)console.warn("插件系统初始化失败:",M$(z))}k4(async()=>{f4.getInstance().killAll(),await S4.getInstance().disconnectAll(),L1.getInstance().cleanup()}),J(!0)}catch(F){G(F,!!$.debug)}}),U=dQ(async()=>{if($.versionCheckPromise){let F=await $.versionCheckPromise;if(F){Z(F),X(!0);return}}await K()});if(c5(()=>{U()},[]),q&&Y)return V8(f8,{children:V8(y4,{versionInfo:Y,onComplete:()=>{X(!1),K()}},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!Q)return null;return V8(f8,{children:V8(B4,{...$},void 0,!1,void 0,this)},void 0,!1,void 0,this)};export{G_ as AppWrapper};
@@ -1,8 +1,8 @@
1
- import{Ib as S}from"./chunk-j1ehsp0x.js";var f=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],u={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},c={anthropic:"https://api.anthropic.com",openai:"https://api.openai.com/v1",google:"https://generativelanguage.googleapis.com/v1beta",deepseek:"https://api.deepseek.com/v1",groq:"https://api.groq.com/openai/v1",openrouter:"https://openrouter.ai/api/v1",togetherai:"https://api.together.xyz/v1","fireworks-ai":"https://api.fireworks.ai/inference/v1",mistral:"https://api.mistral.ai/v1",cohere:"https://api.cohere.ai/v1",perplexity:"https://api.perplexity.ai",xai:"https://api.x.ai/v1",cerebras:"https://api.cerebras.ai/v1","novita-ai":"https://api.novita.ai/v3/openai",nvidia:"https://integrate.api.nvidia.com/v1"},T={anthropic:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"},openrouter:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"},vercel:{"http-referer":"https://github.com/anthropics/blade","x-title":"blade"},zenmux:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"blade"}},H=(Q)=>{return T[Q]||{}};import{createAnthropic as I}from"@ai-sdk/anthropic";import{createAzure as K}from"@ai-sdk/azure";import{createDeepSeek as A}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as E}from"@ai-sdk/google";import{createOpenAI as y}from"@ai-sdk/openai";import{createOpenAICompatible as V}from"@ai-sdk/openai-compatible";import{generateText as U,jsonSchema as x,streamText as M}from"ai";var j=S("Chat");function O(Q){let q=new Set;for(let X of Q)if(X.role==="assistant"&&X.tool_calls)for(let W of X.tool_calls)q.add(W.id);return Q.filter((X)=>{if(X.role==="tool"){if(!X.tool_call_id)return!1;return q.has(X.tool_call_id)}return!0})}function L(Q){if(typeof Q==="string")return Q;return Q.filter((q)=>q.type==="text").map((q)=>q.text).join(`
1
+ import{Hb as S}from"./chunk-bpx8x87m.js";var f=["anthropic","openai","deepseek","google-generative-ai","groq","openrouter"],u={anthropic:"",openai:"","google-generative-ai":"",deepseek:"",groq:"",openrouter:"",azure:"",ollama:"",together:"",fireworks:"",mistral:"",cohere:"",perplexity:"",xai:"",default:""},c={anthropic:"https://api.anthropic.com",openai:"https://api.openai.com/v1",google:"https://generativelanguage.googleapis.com/v1beta",deepseek:"https://api.deepseek.com/v1",groq:"https://api.groq.com/openai/v1",openrouter:"https://openrouter.ai/api/v1",togetherai:"https://api.together.xyz/v1","fireworks-ai":"https://api.fireworks.ai/inference/v1",mistral:"https://api.mistral.ai/v1",cohere:"https://api.cohere.ai/v1",perplexity:"https://api.perplexity.ai",xai:"https://api.x.ai/v1",cerebras:"https://api.cerebras.ai/v1","novita-ai":"https://api.novita.ai/v3/openai",nvidia:"https://integrate.api.nvidia.com/v1"},T={anthropic:{"anthropic-beta":"claude-code-20250219,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14"},openrouter:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"Blade"},cerebras:{"X-Cerebras-3rd-Party-Integration":"blade"},vercel:{"http-referer":"https://github.com/anthropics/blade","x-title":"blade"},zenmux:{"HTTP-Referer":"https://github.com/anthropics/blade","X-Title":"blade"}},H=(Q)=>{return T[Q]||{}};import{createAnthropic as I}from"@ai-sdk/anthropic";import{createAzure as K}from"@ai-sdk/azure";import{createDeepSeek as A}from"@ai-sdk/deepseek";import{createGoogleGenerativeAI as E}from"@ai-sdk/google";import{createOpenAI as y}from"@ai-sdk/openai";import{createOpenAICompatible as V}from"@ai-sdk/openai-compatible";import{generateText as U,jsonSchema as x,streamText as M}from"ai";var j=S("Chat");function O(Q){let q=new Set;for(let X of Q)if(X.role==="assistant"&&X.tool_calls)for(let W of X.tool_calls)q.add(W.id);return Q.filter((X)=>{if(X.role==="tool"){if(!X.tool_call_id)return!1;return q.has(X.tool_call_id)}return!0})}function L(Q){if(typeof Q==="string")return Q;return Q.filter((q)=>q.type==="text").map((q)=>q.text).join(`
2
2
  `)}function h(Q){let q=Q;return q.text??q.textDelta??q.delta}function C(Q,q={}){try{return JSON.parse(Q)}catch{return j.warn("[VercelAIChatService] Failed to parse JSON, using fallback",{str:Q}),q}}class R{model;config;constructor(Q){this.config=Q,this.model=this.createModel(Q),j.debug("[VercelAIChatService] Initialized",{provider:Q.provider,model:Q.model})}createModel(Q){let{provider:q,apiKey:X,baseUrl:W,model:Y,customHeaders:Z,apiVersion:J}=Q;switch(q){case"openai":return y({apiKey:X,baseURL:W||void 0,headers:Z})(Y);case"anthropic":return I({apiKey:X,baseURL:W||void 0,headers:Z})(Y);case"gemini":{if(W&&!this.isGeminiOfficialUrl(W))return V({name:"gemini",apiKey:X,baseURL:W,headers:Z})(Y);return E({apiKey:X,baseURL:W||void 0})(Y)}case"google":case"google-generative-ai":case"google-vertex":{if(W&&!this.isGeminiOfficialUrl(W))return V({name:q,apiKey:X,baseURL:W,headers:Z})(Y);return E({apiKey:X,baseURL:W||void 0})(Y)}case"azure-openai":{let $=this.extractAzureResourceName(W);if($)return K({apiKey:X,resourceName:$,apiVersion:J||"2024-08-01-preview"})(Y);let _=this.buildAzureBaseUrl(W,Y);return V({name:"azure-openai",apiKey:X,baseURL:_,headers:{...Z,"api-key":X},queryParams:{"api-version":J||"2024-08-01-preview"}})(Y)}case"azure":{let $=this.extractAzureResourceName(W);if($)return K({apiKey:X,resourceName:$,apiVersion:J||"2024-08-01-preview"})(Y);let _=this.buildAzureBaseUrl(W,Y);return V({name:"azure-openai",apiKey:X,baseURL:_,headers:{...Z,"api-key":X},queryParams:{"api-version":J||"2024-08-01-preview"}})(Y)}case"deepseek":return A({apiKey:X,baseURL:W||void 0,headers:Z})(Y);default:return V({name:q,apiKey:X,baseURL:W,headers:Z})(Y)}}extractAzureResourceName(Q){if(!Q)return;let q=Q.match(/https:\/\/([^.]+)\.openai\.azure(?:\.com|\.us|\.cn|\.de)/);return q?q[1]:void 0}buildAzureBaseUrl(Q,q){if(!Q)return"";let X=Q.replace(/\/$/,"").replace(/\?.*$/,"");if(X.includes("/openai/deployments/"))return X;return`${X}/openai/deployments/${q}`}isGeminiOfficialUrl(Q){return Q.includes("generativelanguage.googleapis.com")||Q.includes("aiplatform.googleapis.com")}needsThinkingReplayMetadata(){return/deepseek/i.test([this.config.provider,this.config.model,this.config.baseUrl].join(" "))}getThinkingReplayProviderOptions(Q){let q=Q?.trim();if(!q||!this.needsThinkingReplayMetadata())return;return{openaiCompatible:{reasoning_content:q}}}shouldFlattenDeepSeekThinkingToolHistory(){return this.needsThinkingReplayMetadata()}flattenDeepSeekThinkingToolHistory(Q){let q=[],X,W=()=>{if(!X)return;q.push({role:"assistant",content:L(X.content).trim()||"I will use the requested tool and continue from its result."}),X=void 0};for(let Y of Q){if(Y.role==="system"){W(),q.push({role:"user",content:`<system>
3
3
  ${L(Y.content)}
4
4
  </system>`});continue}if(Y.role==="assistant"&&Y.tool_calls&&Y.tool_calls.length>0&&Y.reasoningContent?.trim()){W(),X=Y;continue}if(Y.role==="tool"&&X){let Z=X.tool_calls?.find(($)=>$.id===Y.tool_call_id),J=Z?.type==="function"?Z.function:void 0;q.push({role:"user",content:`Tool result for ${Y.name||J?.name||"tool"}${J?.arguments?`(${J.arguments})`:""}:
5
5
  ${L(Y.content)}
6
6
 
7
7
  Continue from this tool result.`});continue}W(),q.push(Y)}return W(),q}convertMessages(Q){let q=[],X=this.shouldFlattenDeepSeekThinkingToolHistory()?this.flattenDeepSeekThinkingToolHistory(Q):Q;for(let W of X)if(W.role==="system")if(Array.isArray(W.content)){let Y=W.content.find((J)=>J.type==="text"),Z={role:"system",content:L(W.content)};if(Y?.providerOptions)Z.providerOptions=Y.providerOptions;q.push(Z)}else q.push({role:"system",content:W.content});else if(W.role==="user")if(Array.isArray(W.content)){let Y=W.content.map((Z)=>{if(Z.type==="text"){let J={type:"text",text:Z.text};if(Z.providerOptions)J.providerOptions=Z.providerOptions;return J}return{type:"image",image:Z.image_url.url}});q.push({role:"user",content:Y})}else q.push({role:"user",content:W.content});else if(W.role==="assistant")if(W.tool_calls&&W.tool_calls.length>0){let Y=W.tool_calls.map((_)=>{let w=_.function;return{type:"tool-call",toolCallId:_.id,toolName:w?.name||"",input:C(w?.arguments||"{}",{})}}),Z=L(W.content),J=W.reasoningContent?.trim()?[{type:"reasoning",text:W.reasoningContent}]:[],$=this.getThinkingReplayProviderOptions(W.reasoningContent);if(Z){let _={role:"assistant",content:[...J,{type:"text",text:Z},...Y]};if($)_.providerOptions=$;q.push(_)}else if(J.length>0){let _={role:"assistant",content:[...J,...Y]};if($)_.providerOptions=$;q.push(_)}else q.push({role:"assistant",content:Y})}else if(W.reasoningContent?.trim()){let Y=L(W.content),Z=[{type:"reasoning",text:W.reasoningContent}];if(Y)Z.push({type:"text",text:Y});let J={role:"assistant",content:Z},$=this.getThinkingReplayProviderOptions(W.reasoningContent);if($)J.providerOptions=$;q.push(J)}else q.push({role:"assistant",content:L(W.content)});else if(W.role==="tool")q.push({role:"tool",content:[{type:"tool-result",toolCallId:W.tool_call_id,toolName:W.name||"unknown",output:{type:"text",value:L(W.content)}}]});if(this.config.enablePromptCaching&&this.config.provider==="anthropic"){let W=0;for(let Y of q)if(Y.role==="system"&&W<2)Y.providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}},W++;for(let Y=q.length-1;Y>=0;Y--)if(q[Y].role==="user"){q[Y].providerOptions={anthropic:{cacheControl:{type:"ephemeral"}}};break}}return q}convertTools(Q){if(!Q||Q.length===0)return;let q={};for(let X of Q)q[X.name]={description:X.description,inputSchema:x(X.parameters)};return q}convertToolCalls(Q){return Q.map((q)=>({id:q.toolCallId,type:"function",function:{name:q.toolName,arguments:JSON.stringify(q.args??q.input??{})}}))}convertUsage(Q,q){if(!Q)return;let X=Q.promptTokens??Q.inputTokens??0,W=Q.completionTokens??Q.outputTokens??0,Y={promptTokens:X,completionTokens:W,totalTokens:Q.totalTokens??X+W};if(Q.reasoningTokens)Y.reasoningTokens=Q.reasoningTokens;if(q?.anthropic){if(q.anthropic.cacheCreationInputTokens!==void 0)Y.cacheCreationInputTokens=q.anthropic.cacheCreationInputTokens;if(q.anthropic.cacheReadInputTokens!==void 0)Y.cacheReadInputTokens=q.anthropic.cacheReadInputTokens}return Y}isFallbackableError(Q){if(!(Q instanceof Error))return!1;let q=Q.message.toLowerCase();if(q.includes("timeout")||q.includes("econnrefused")||q.includes("enotfound"))return!0;let X=q.match(/status[:\s]*(\d{3})/),W=X?parseInt(X[1],10):Q.status;return W!==void 0&&[429,529,503,502,500].includes(W)}async retryWithBackoff(Q,q,X=2,W=1000){let Y;for(let Z=0;Z<=X;Z++)try{return await Q()}catch(J){if(Y=J,Z>=X)break;if(!this.isFallbackableError(J))throw J;if(q?.aborted)throw J;let $=W*Math.pow(2,Z);j.debug(`[VercelAIChatService] Retry ${Z+1}/${X} after ${$}ms`),await new Promise((_)=>setTimeout(_,$))}throw Y}getFallbackModelIds(){let Q=[];if(this.config.fallbackModels&&this.config.fallbackModels.length>0)Q.push(...this.config.fallbackModels);else if(this.config.fallbackModel)Q.push(this.config.fallbackModel);return Q}getThinkingProviderOptions(){if(!this.config.supportsThinking)return;let Q=this.config.thinkingMode??"budget";if(Q==="off")return;let q=Q==="adaptive",X=this.config.thinkingBudget??1e4;if(this.config.provider==="anthropic")return{anthropic:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:X}}};if(this.config.provider==="deepseek"||/deepseek/i.test(this.config.model))return{deepseek:{thinking:q?{type:"enabled",budgetTokens:0}:{type:"enabled",budgetTokens:X}}};return}getStreamTextOptions(Q,q,X,W){let Y=W;if(this.config.timeout&&this.config.timeout>0){let $=AbortSignal.timeout(this.config.timeout);if(W)Y=AbortSignal.any([W,$]);else Y=$}let Z={model:Q,messages:q,tools:X,maxOutputTokens:this.config.maxOutputTokens,temperature:this.config.temperature??0,abortSignal:Y,allowSystemInMessages:!0},J=this.getThinkingProviderOptions();if(J)Z.providerOptions=J;return Z}async chat(Q,q,X){let W=Date.now();j.debug("[VercelAIChatService] Starting chat request");let Y=O(Q),Z=this.convertMessages(Y),J=this.convertTools(q),$=async(_)=>{let w=await U(this.getStreamTextOptions(_,Z,J,X)),N=w.toolCalls&&w.toolCalls.length>0?this.convertToolCalls(w.toolCalls):void 0,z=Array.isArray(w.reasoning)?w.reasoning.map((B)=>B.text).join(""):void 0;return{content:w.text,reasoningContent:z,toolCalls:N,usage:this.convertUsage(w.usage,w.providerMetadata),finishReason:w.finishReason}};try{return await this.retryWithBackoff(()=>$(this.model),X,this.config.maxRetries)}catch(_){let w=Date.now()-W;if(j.error("[VercelAIChatService] Chat failed after",w,"ms"),!this.isFallbackableError(_))throw _;let N=this.getFallbackModelIds();if(N.length===0)throw _;for(let z of N){j.warn(`[VercelAIChatService] Trying fallback model: ${z}`);let B=this.createModel({...this.config,model:z});try{return await $(B)}catch(F){if(j.warn(`[VercelAIChatService] Fallback ${z} failed: ${F instanceof Error?F.message:F}`),!this.isFallbackableError(F))throw F}}throw _}}async*streamChat(Q,q,X){let W=Date.now();j.debug("[VercelAIChatService] Starting stream request");let Y=O(Q),Z=this.convertMessages(Y),J=this.convertTools(q),$=async function*(B,F){let D=M(B.getStreamTextOptions(F,Z,J,X)),P=0;for await(let G of D.fullStream)switch(G.type){case"text-delta":yield{content:h(G)};break;case"reasoning-delta":yield{reasoningContent:h(G)};break;case"tool-call":yield{toolCalls:[{index:P++,id:G.toolCallId,type:"function",function:{name:G.toolName,arguments:JSON.stringify(G.args??G.input??{})}}]};break;case"finish":yield{finishReason:G.finishReason,usage:B.convertUsage(G.totalUsage,G.providerMetadata)};break}},_=this.config.maxRetries??2,w;for(let B=0;B<=_;B++)try{yield*$(this,this.model);let F=Date.now()-W;j.debug("[VercelAIChatService] Stream completed in",F,"ms");return}catch(F){if(w=F,!this.isFallbackableError(F))throw F;if(B<_){let D=1000*Math.pow(2,B);j.debug(`[VercelAIChatService] Stream retry ${B+1}/${_} after ${D}ms`),await new Promise((P)=>setTimeout(P,D));continue}}let N=Date.now()-W;j.error("[VercelAIChatService] Stream failed after",N,"ms");let z=this.getFallbackModelIds();if(z.length===0)throw w;for(let B of z){j.warn(`[VercelAIChatService] Stream fallback: ${B}`),yield{modelFallback:!0};let F=this.createModel({...this.config,model:B});try{yield*$(this,F);return}catch(D){if(j.warn(`[VercelAIChatService] Stream fallback ${B} failed`),!this.isFallbackableError(D))throw D}}throw w}getConfig(){return{...this.config}}updateConfig(Q){j.debug("[VercelAIChatService] Updating configuration"),this.config={...this.config,...Q},this.model=this.createModel(this.config),j.debug("[VercelAIChatService] Configuration updated")}}var v=S("Service");async function qq(Q){let q=Q;if(q.provider){let X=H(q.provider);if(Object.keys(X).length>0)q={...q,customHeaders:{...X,...q.customHeaders}},v.debug(`Injected ${q.provider} specific headers:`,Object.keys(X))}return b(q)}function b(Q){return new R(Q)}
8
- export{f as pb,u as qb,c as rb,qq as sb};
8
+ export{f as ob,u as pb,c as qb,qq as rb};
@@ -0,0 +1 @@
1
+ import{g as a,h as b,i as c,j as d,k as e}from"./chunk-sfr69fw8.js";import"./chunk-j7nh0j36.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};