blade-code 0.8.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blade.js +2 -2
- package/dist/chunk-0abtfzm6.js +1 -0
- package/dist/chunk-0zkhjsbv.js +1 -0
- package/dist/chunk-119fhp5q.js +9 -0
- package/dist/{chunk-j77gyhpf.js → chunk-1rpgvk3r.js} +1 -1
- package/dist/{chunk-81p4kz0b.js → chunk-1v2n922p.js} +1 -1
- package/dist/{chunk-9xvnrq7m.js → chunk-2fbwmdvg.js} +2 -2
- package/dist/chunk-3qgj2y5r.js +1 -0
- package/dist/{chunk-887qxhn5.js → chunk-45bme7n9.js} +2 -2
- package/dist/{chunk-w11ht6f9.js → chunk-5jq01mg6.js} +2 -2
- package/dist/{chunk-p4yrmzyr.js → chunk-5nye3k5w.js} +1 -1
- package/dist/chunk-7pevqbfd.js +2 -0
- package/dist/chunk-8dqvnx7n.js +2 -0
- package/dist/chunk-8edsvxf3.js +1 -0
- package/dist/{chunk-11s7t9dp.js → chunk-8vemqfe4.js} +2 -2
- package/dist/{chunk-5fw9k1ff.js → chunk-8vtznxpq.js} +2 -2
- package/dist/chunk-936ft6kq.js +2 -0
- package/dist/chunk-9ax02vtg.js +22 -0
- package/dist/chunk-9qknesxs.js +6 -0
- package/dist/chunk-acegy4td.js +3 -0
- package/dist/chunk-aewrn5xp.js +1 -0
- package/dist/{chunk-fpdqvnmq.js → chunk-aq7wf2zt.js} +2 -2
- package/dist/{chunk-5ad4qmfj.js → chunk-ax7bx0j8.js} +1 -1
- package/dist/chunk-b10vr4xj.js +2 -0
- package/dist/{chunk-1x3846v7.js → chunk-bc6wbcrs.js} +1 -1
- package/dist/chunk-bfgm5k3e.js +1566 -0
- package/dist/chunk-cf3fhs7j.js +1 -0
- package/dist/chunk-d7y2mf7c.js +4 -0
- package/dist/chunk-e1586s4t.js +1 -0
- package/dist/chunk-enk621t7.js +98 -0
- package/dist/chunk-fpr6d8zc.js +2 -0
- package/dist/{chunk-fkaebj8c.js → chunk-gagt42k2.js} +1 -1
- package/dist/chunk-gdm1xzvp.js +2 -0
- package/dist/chunk-gm62cfjw.js +1 -0
- package/dist/chunk-h3bjmkvz.js +1 -0
- package/dist/{chunk-9b297mzh.js → chunk-j8en7x02.js} +1 -1
- package/dist/{chunk-6jq8h5s9.js → chunk-jyr9417h.js} +2 -2
- package/dist/chunk-mcnfbhpr.js +6 -0
- package/dist/{chunk-6x6zqjcs.js → chunk-mns8e65q.js} +1 -1
- package/dist/chunk-mpkr3s6b.js +3 -0
- package/dist/chunk-n9tgxfvw.js +615 -0
- package/dist/{chunk-w4xcmzjm.js → chunk-ppyg431d.js} +1 -1
- package/dist/chunk-qxhrzws6.js +1 -0
- package/dist/{chunk-y08szyf9.js → chunk-r6h7eja3.js} +20 -20
- package/dist/chunk-r8pjwjt6.js +1 -0
- package/dist/chunk-rmfk5f9m.js +2 -0
- package/dist/chunk-rrg9bw8r.js +25 -0
- package/dist/chunk-w3me85va.js +2 -0
- package/dist/{chunk-f3pvwxp8.js → chunk-wtxwny0p.js} +3 -3
- package/dist/{chunk-s1y8w68s.js → chunk-x40fkg4z.js} +2 -2
- package/dist/{chunk-0z5qe4m2.js → chunk-x548f12z.js} +1 -1
- package/dist/chunk-xtfzjb72.js +6 -0
- package/dist/{chunk-kne7h7p5.js → chunk-z0qxaky4.js} +1 -1
- package/dist/web/assets/{FilePreview-60E51igH.js → FilePreview-DpovIbME.js} +1 -1
- package/dist/web/assets/{MarkdownRenderer-DU7jPn9K.js → MarkdownRenderer-73wC_SGk.js} +1 -1
- package/dist/web/assets/{McpModal-CAMU6yrS.js → McpModal-CIpxuyTG.js} +1 -1
- package/dist/web/assets/{SettingsModal-Cjj8NUQy.js → SettingsModal-BBa1libe.js} +1 -1
- package/dist/web/assets/{SettingsStore-CjvkbtuZ.js → SettingsStore-C8YBWQPS.js} +1 -1
- package/dist/web/assets/{SkillsModal-Cyc2JAFj.js → SkillsModal-DArZ-nCX.js} +1 -1
- package/dist/web/assets/{TerminalPanel-DI-Ls-U8.js → TerminalPanel-BX7C7qiD.js} +1 -1
- package/dist/web/assets/index-Ch0eqSLM.css +1 -0
- package/dist/web/assets/index-DIWzaS2_.js +16 -0
- package/dist/web/index.html +2 -2
- package/package.json +2 -1
- package/dist/chunk-0g9cb41d.js +0 -3
- package/dist/chunk-1evg2hdd.js +0 -2
- package/dist/chunk-3wghk9bp.js +0 -1
- package/dist/chunk-4fye39a8.js +0 -2
- package/dist/chunk-510rwhx6.js +0 -1
- package/dist/chunk-6avkjdjc.js +0 -615
- package/dist/chunk-83dkggbx.js +0 -1
- package/dist/chunk-8epvwyg8.js +0 -6
- package/dist/chunk-8fp3q919.js +0 -24
- package/dist/chunk-9jkbykwq.js +0 -1
- package/dist/chunk-a83s9mww.js +0 -1
- package/dist/chunk-a90mfxv9.js +0 -3
- package/dist/chunk-btst30by.js +0 -6
- package/dist/chunk-e9t5ga1b.js +0 -1
- package/dist/chunk-eycs00af.js +0 -1577
- package/dist/chunk-gvf4gff0.js +0 -9
- package/dist/chunk-j14rn2dx.js +0 -22
- package/dist/chunk-kcjgbbec.js +0 -1
- package/dist/chunk-q223bq79.js +0 -1
- package/dist/chunk-qwfqp465.js +0 -2
- package/dist/chunk-rxjt7ma7.js +0 -2
- package/dist/chunk-x83a97eh.js +0 -1
- package/dist/chunk-yfcfx0zk.js +0 -6
- package/dist/chunk-zns65xsy.js +0 -2
- package/dist/web/assets/index-BC0ssrep.js +0 -16
- package/dist/web/assets/index-Ci6gCUjf.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{X as a,Y as b,Z as c}from"./chunk-mcnfbhpr.js";import"./chunk-7pevqbfd.js";import"./chunk-z0qxaky4.js";import"./chunk-rrg9bw8r.js";import"./chunk-9ax02vtg.js";import"./chunk-x548f12z.js";import"./chunk-1v2n922p.js";import"./chunk-fpr6d8zc.js";import"./chunk-acegy4td.js";import"./chunk-w3me85va.js";import"./chunk-2fbwmdvg.js";import"./chunk-gdm1xzvp.js";import"./chunk-ppyg431d.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Vb as d,Xb as h}from"./chunk-45bme7n9.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
|
|
2
|
+
export{q as V,w as W};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import{Na as G0,Pa as x}from"./chunk-9ax02vtg.js";import{Db as $0}from"./chunk-1v2n922p.js";import{Mb as s}from"./chunk-acegy4td.js";import{nanoid as T0}from"nanoid";import{devtools as C0,subscribeWithSelector as M0}from"zustand/middleware";import{createStore as f0}from"zustand/vanilla";var U0={name:"ayu-dark",colors:{primary:"#ffcc66",secondary:"#bae67e",accent:"#73d0ff",success:"#bae67e",warning:"#ffcc66",error:"#ff3333",info:"#73d0ff",light:"#f0f0f0",dark:"#000000",muted:"#5c6773",highlight:"#2d323b",text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773",light:"#ffffff"},background:{primary:"#0f1419",secondary:"#14191f",dark:"#000000"},border:{light:"#2d323b",dark:"#000000"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.2)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px 0 rgba(0, 0, 0, 0.2)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)"}},H0={name:"dracula",colors:{primary:"#bd93f9",secondary:"#ffb86c",accent:"#ff79c6",success:"#50fa7b",warning:"#f1fa8c",error:"#ff5555",info:"#8be9fd",light:"#f8f8f2",dark:"#282a36",muted:"#6272a4",highlight:"#44475a",text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4",light:"#ffffff"},background:{primary:"#282a36",secondary:"#44475a",dark:"#21222c"},border:{light:"#44475a",dark:"#000000"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 42, 54, 0.2)",base:"0 1px 3px 0 rgba(40, 42, 54, 0.3), 0 1px 2px 0 rgba(40, 42, 54, 0.2)",lg:"0 10px 15px -3px rgba(40, 42, 54, 0.3), 0 4px 6px -2px rgba(40, 42, 54, 0.2)"}},j0={name:"monokai",colors:{primary:"#66d9ef",secondary:"#a6e22e",accent:"#f92672",success:"#a6e22e",warning:"#e6db74",error:"#f92672",info:"#66d9ef",light:"#f8f8f2",dark:"#272822",muted:"#75715e",highlight:"#3e3d32",text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e",light:"#ffffff"},background:{primary:"#272822",secondary:"#3e3d32",dark:"#1e1f1c"},border:{light:"#3e3d32",dark:"#000000"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(39, 40, 34, 0.2)",base:"0 1px 3px 0 rgba(39, 40, 34, 0.3), 0 1px 2px 0 rgba(39, 40, 34, 0.2)",lg:"0 10px 15px -3px rgba(39, 40, 34, 0.3), 0 4px 6px -2px rgba(39, 40, 34, 0.2)"}},z0={name:"nord",colors:{primary:"#88c0d0",secondary:"#81a1c1",accent:"#b48ead",success:"#a3be8c",warning:"#ebcb8b",error:"#bf616a",info:"#88c0d0",light:"#eceff4",dark:"#2e3440",muted:"#4c566a",highlight:"#434c5e",text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a",light:"#ffffff"},background:{primary:"#2e3440",secondary:"#3b4252",dark:"#242933"},border:{light:"#434c5e",dark:"#000000"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(46, 52, 64, 0.2)",base:"0 1px 3px 0 rgba(46, 52, 64, 0.3), 0 1px 2px 0 rgba(46, 52, 64, 0.2)",lg:"0 10px 15px -3px rgba(46, 52, 64, 0.3), 0 4px 6px -2px rgba(46, 52, 64, 0.2)"}},_0={name:"solarized-light",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#cb4b16",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#93a1a1",highlight:"#eee8d5",text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1",light:"#002b36"},background:{primary:"#fdf6e3",secondary:"#eee8d5",dark:"#073642"},border:{light:"#eee8d5",dark:"#073642"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(253, 246, 227, 0.2)",base:"0 1px 3px 0 rgba(253, 246, 227, 0.3), 0 1px 2px 0 rgba(253, 246, 227, 0.2)",lg:"0 10px 15px -3px rgba(253, 246, 227, 0.3), 0 4px 6px -2px rgba(253, 246, 227, 0.2)"}},K0={name:"solarized-dark",colors:{primary:"#268bd2",secondary:"#2aa198",accent:"#d33682",success:"#859900",warning:"#b58900",error:"#dc322f",info:"#268bd2",light:"#fdf6e3",dark:"#073642",muted:"#586e75",highlight:"#073642",text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75",light:"#fdf6e3"},background:{primary:"#002b36",secondary:"#073642",dark:"#001f29"},border:{light:"#073642",dark:"#000000"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 43, 54, 0.2)",base:"0 1px 3px 0 rgba(0, 43, 54, 0.3), 0 1px 2px 0 rgba(0, 43, 54, 0.2)",lg:"0 10px 15px -3px rgba(0, 43, 54, 0.3), 0 4px 6px -2px rgba(0, 43, 54, 0.2)"}},W0={name:"tokyo-night",colors:{primary:"#7aa2f7",secondary:"#7dcfff",accent:"#bb9af7",success:"#9ece6a",warning:"#e0af68",error:"#f7768e",info:"#7aa2f7",light:"#c0caf5",dark:"#1a1b26",muted:"#565f89",highlight:"#292e42",text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89",light:"#ffffff"},background:{primary:"#1a1b26",secondary:"#292e42",dark:"#16161e"},border:{light:"#292e42",dark:"#000000"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(26, 27, 38, 0.2)",base:"0 1px 3px 0 rgba(26, 27, 38, 0.3), 0 1px 2px 0 rgba(26, 27, 38, 0.2)",lg:"0 10px 15px -3px rgba(26, 27, 38, 0.3), 0 4px 6px -2px rgba(26, 27, 38, 0.2)"}},O0={name:"github",colors:{primary:"#0969da",secondary:"#8250df",accent:"#bc4c00",success:"#1a7f37",warning:"#bc4c00",error:"#d1242f",info:"#0969da",light:"#f6f8fa",dark:"#24292f",muted:"#6e7781",highlight:"#ddf4ff",text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f6f8fa",dark:"#24292f"},border:{light:"#d0d7de",dark:"#24292f"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(255, 255, 255, 0.2)",base:"0 1px 3px 0 rgba(255, 255, 255, 0.3), 0 1px 2px 0 rgba(255, 255, 255, 0.2)",lg:"0 10px 15px -3px rgba(255, 255, 255, 0.3), 0 4px 6px -2px rgba(255, 255, 255, 0.2)"}},q0={name:"gruvbox",colors:{primary:"#83a598",secondary:"#8ec07c",accent:"#d3869b",success:"#b8bb26",warning:"#fabd2f",error:"#fb4934",info:"#83a598",light:"#fbf1c7",dark:"#282828",muted:"#928374",highlight:"#3c3836",text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374",light:"#ffffff"},background:{primary:"#282828",secondary:"#3c3836",dark:"#1d2021"},border:{light:"#3c3836",dark:"#000000"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#8ec07c",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#b8bb26",default:"#ebdbb2"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 40, 40, 0.2)",base:"0 1px 3px 0 rgba(40, 40, 40, 0.3), 0 1px 2px 0 rgba(40, 40, 40, 0.2)",lg:"0 10px 15px -3px rgba(40, 40, 40, 0.3), 0 4px 6px -2px rgba(40, 40, 40, 0.2)"}},w0={name:"one-dark",colors:{primary:"#61afef",secondary:"#c678dd",accent:"#e5c07b",success:"#98c379",warning:"#e5c07b",error:"#e06c75",info:"#56b6c2",light:"#abb2bf",dark:"#282c34",muted:"#5c6370",highlight:"#3e4451",text:{primary:"#abb2bf",secondary:"#c6c8d0",muted:"#5c6370",light:"#ffffff"},background:{primary:"#282c34",secondary:"#3e4451",dark:"#21252b"},border:{light:"#3e4451",dark:"#000000"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(40, 44, 52, 0.2)",base:"0 1px 3px 0 rgba(40, 44, 52, 0.3), 0 1px 2px 0 rgba(40, 44, 52, 0.2)",lg:"0 10px 15px -3px rgba(40, 44, 52, 0.3), 0 4px 6px -2px rgba(40, 44, 52, 0.2)"}},x0={name:"catppuccin",colors:{primary:"#89b4fa",secondary:"#cba6f7",accent:"#f5c2e7",success:"#a6e3a1",warning:"#f9e2af",error:"#f38ba8",info:"#89dceb",light:"#cdd6f4",dark:"#11111b",muted:"#6c7086",highlight:"#181825",text:{primary:"#cdd6f4",secondary:"#bac2de",muted:"#6c7086",light:"#ffffff"},background:{primary:"#1e1e2e",secondary:"#181825",dark:"#11111b"},border:{light:"#181825",dark:"#000000"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#cdd6f4",operator:"#89dceb",type:"#f5c2e7",tag:"#f38ba8",attr:"#89b4fa",default:"#cdd6f4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(30, 30, 46, 0.2)",base:"0 1px 3px 0 rgba(30, 30, 46, 0.3), 0 1px 2px 0 rgba(30, 30, 46, 0.2)",lg:"0 10px 15px -3px rgba(30, 30, 46, 0.3), 0 4px 6px -2px rgba(30, 30, 46, 0.2)"}},D0={name:"rose-pine",colors:{primary:"#9ccfd8",secondary:"#c4a7e7",accent:"#f6c177",success:"#31748f",warning:"#f6c177",error:"#eb6f92",info:"#9ccfd8",light:"#e0def4",dark:"#191724",muted:"#6e6a86",highlight:"#1f1d2e",text:{primary:"#e0def4",secondary:"#cecacd",muted:"#6e6a86",light:"#ffffff"},background:{primary:"#191724",secondary:"#1f1d2e",dark:"#12101a"},border:{light:"#1f1d2e",dark:"#000000"},syntax:{comment:"#6e6a86",string:"#9ccfd8",number:"#ea9a97",keyword:"#c4a7e7",function:"#31748f",variable:"#e0def4",operator:"#f6c177",type:"#9ccfd8",tag:"#eb6f92",attr:"#f6c177",default:"#e0def4"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(25, 23, 36, 0.2)",base:"0 1px 3px 0 rgba(25, 23, 36, 0.3), 0 1px 2px 0 rgba(25, 23, 36, 0.2)",lg:"0 10px 15px -3px rgba(25, 23, 36, 0.3), 0 4px 6px -2px rgba(25, 23, 36, 0.2)"}},P0={name:"kanagawa",colors:{primary:"#8ba4b0",secondary:"#a292a3",accent:"#c47fd5",success:"#76946a",warning:"#c0a36e",error:"#c34043",info:"#7e9cd8",light:"#dcd7ba",dark:"#1f1f28",muted:"#727169",highlight:"#2a2a37",text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169",light:"#ffffff"},background:{primary:"#1f1f28",secondary:"#2a2a37",dark:"#16161d"},border:{light:"#2a2a37",dark:"#000000"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#c34043",attr:"#7fb4ca",default:"#dcd7ba"}},spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(31, 31, 40, 0.2)",base:"0 1px 3px 0 rgba(31, 31, 40, 0.3), 0 1px 2px 0 rgba(31, 31, 40, 0.2)",lg:"0 10px 15px -3px rgba(31, 31, 40, 0.3), 0 4px 6px -2px rgba(31, 31, 40, 0.2)"}},c=[{id:"ayu-dark",label:"Ayu Dark",theme:U0,tags:["dark","popular"]},{id:"dracula",label:"Dracula",theme:H0,tags:["dark","popular"]},{id:"monokai",label:"Monokai",theme:j0,tags:["dark","classic"]},{id:"nord",label:"Nord",theme:z0,tags:["dark","minimal"]},{id:"solarized-light",label:"Solarized Light",theme:_0,tags:["light"]},{id:"solarized-dark",label:"Solarized Dark",theme:K0,tags:["dark"]},{id:"tokyo-night",label:"Tokyo Night",theme:W0,tags:["dark","popular"]},{id:"github",label:"GitHub",theme:O0,tags:["light","minimal"]},{id:"gruvbox",label:"Gruvbox",theme:q0,tags:["dark","warm"]},{id:"one-dark",label:"One Dark",theme:w0,tags:["dark","popular"]},{id:"catppuccin",label:"Catppuccin",theme:x0,tags:["dark","pastel"]},{id:"rose-pine",label:"Rose Pine",theme:D0,tags:["dark","elegant"]},{id:"kanagawa",label:"Kanagawa",theme:P0,tags:["dark","japanese"]}];var i={primary:"#0066cc",secondary:"#6c757d",accent:"#e83e8c",success:"#28a745",warning:"#ffc107",error:"#dc3545",info:"#17a2b8",light:"#f8f9fa",dark:"#343a40",muted:"#6c757d",highlight:"#fff3cd",text:{primary:"#212529",secondary:"#6c757d",muted:"#6c757d",light:"#ffffff"},background:{primary:"#ffffff",secondary:"#f8f9fa",dark:"#343a40"},border:{light:"#dee2e6",dark:"#495057"},syntax:{comment:"#6c757d",string:"#28a745",number:"#e83e8c",keyword:"#007bff",function:"#17a2b8",variable:"#495057",operator:"#ffc107",type:"#007bff",tag:"#dc3545",attr:"#ffc107",default:"#212529"}},f={name:"default",colors:i,spacing:{xs:0.25,sm:0.5,md:1,lg:1.5,xl:2},typography:{fontSize:{xs:0.75,sm:0.875,base:1,lg:1.125,xl:1.25,"2xl":1.5,"3xl":1.875},fontWeight:{light:300,normal:400,medium:500,semibold:600,bold:700}},borderRadius:{sm:0.125,base:0.25,lg:0.5,xl:0.75},boxShadow:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)"}},B0={...f,name:"dark",colors:{...i,text:{primary:"#ffffff",secondary:"#e2e8f0",muted:"#94a3b8",light:"#000000"},background:{primary:"#1e293b",secondary:"#334155",dark:"#0f172a"},border:{light:"#475569",dark:"#64748b"},syntax:{comment:"#94a3b8",string:"#34d399",number:"#f472b6",keyword:"#60a5fa",function:"#06b6d4",variable:"#e2e8f0",operator:"#fbbf24",type:"#60a5fa",tag:"#fb7185",attr:"#fbbf24",default:"#ffffff"}}};class l{currentTheme=f;themes=new Map;constructor(){this.themes.set("default",f),this.themes.set("dark",B0);for(let Q of c)this.themes.set(Q.id,Q.theme)}setTheme(Q){let Z=this.themes.get(Q);if(Z)this.currentTheme=Z;else throw Error(`Theme '${Q}' not found`)}getTheme(){return this.currentTheme}getAvailableThemes(){return Array.from(this.themes.keys())}getCurrentThemeName(){return this.currentTheme.name}getThemeByName(Q){return this.themes.get(Q)}hasTheme(Q){return this.themes.has(Q)}}var o=new l;var E0={initializationStatus:"idle",initializationError:null,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null,tasks:[],awaitingSecondCtrlC:!1,thinkingModeEnabled:!1,subagentProgress:null},b=(Q)=>({...E0,actions:{setInitializationStatus:(Z)=>{Q((X)=>({app:{...X.app,initializationStatus:Z}}))},setInitializationError:(Z)=>{Q((X)=>({app:{...X.app,initializationError:Z}}))},setActiveModal:(Z)=>{Q((X)=>({app:{...X.app,activeModal:Z}}))},showSessionSelector:(Z,X="resume")=>{Q((Y)=>({app:{...Y.app,activeModal:"sessionSelector",sessionSelectorData:{intent:X,sessions:Z}}}))},showModelEditWizard:(Z)=>{Q((X)=>({app:{...X.app,activeModal:"modelEditWizard",modelEditorTarget:Z}}))},closeModal:()=>{Q((Z)=>({app:{...Z.app,activeModal:"none",sessionSelectorData:void 0,modelEditorTarget:null}}))},setTasks:(Z)=>{Q((X)=>({app:{...X.app,tasks:Z}}))},updateTask:(Z)=>{Q((X)=>({app:{...X.app,tasks:X.app.tasks.map((Y)=>Y.id===Z.id?Z:Y)}}))},setAwaitingSecondCtrlC:(Z)=>{Q((X)=>({app:{...X.app,awaitingSecondCtrlC:Z}}))},setThinkingModeEnabled:(Z)=>{Q((X)=>({app:{...X.app,thinkingModeEnabled:Z}}))},toggleThinkingMode:()=>{Q((Z)=>({app:{...Z.app,thinkingModeEnabled:!Z.app.thinkingModeEnabled}}))},startSubagentProgress:(Z,X,Y)=>{Q(($)=>({app:{...$.app,subagentProgress:{id:Z,type:X,description:Y,status:"running",startTime:Date.now()}}}))},updateSubagentTool:(Z)=>{Q((X)=>{if(!X.app.subagentProgress)return X;return{app:{...X.app,subagentProgress:{...X.app.subagentProgress,currentTool:Z}}}})},completeSubagentProgress:(Z)=>{Q((X)=>{if(!X.app.subagentProgress)return X;return{app:{...X.app,subagentProgress:{...X.app.subagentProgress,status:Z?"completed":"failed",currentTool:void 0}}}}),setTimeout(()=>{Q((X)=>({app:{...X.app,subagentProgress:null}}))},1500)}}});var A0={isProcessing:!1,abortController:null,pendingCommands:[],recoveredSteeringCount:0},h=(Q,Z)=>({...A0,actions:{setProcessing:(X)=>{Q((Y)=>({command:{...Y.command,isProcessing:X}}))},createAbortController:()=>{let X=Z().command.abortController;if(X&&!X.signal.aborted)X.abort("interrupted-by-new-command");let Y=new AbortController;return Q(($)=>({command:{...$.command,abortController:Y}})),Y},getAbortController:()=>{return Z().command.abortController},clearAbortController:(X)=>{let Y=Z().command.abortController;if(X!==void 0&&Y!==X)return;Q(($)=>({command:{...$.command,abortController:null}}))},abort:(X)=>{let{abortController:Y}=Z().command;if(Y&&!Y.signal.aborted)Y.abort(X??"user-cancel");Q(($)=>({command:{...$.command,isProcessing:!1,pendingCommands:[]}}))},enqueueCommand:(X)=>{Q((Y)=>({command:{...Y.command,pendingCommands:[...Y.command.pendingCommands,X]}}))},dequeueCommand:()=>{let{pendingCommands:X}=Z().command;if(X.length===0)return;let[Y,...$]=X;return Q((V)=>({command:{...V.command,pendingCommands:$}})),Y},clearQueue:()=>{Q((X)=>({command:{...X.command,pendingCommands:[]}}))},setRecoveredSteeringCount:(X)=>{Q((Y)=>({command:{...Y.command,recoveredSteeringCount:Math.max(0,X)}}))}}});var L0={config:null},p=(Q)=>({...L0,actions:{setConfig:(Z)=>{Q((X)=>({config:{...X.config,config:Z}}))},updateConfig:(Z)=>{Q((X)=>{if(!X.config.config)throw Error(`[ConfigSlice] Config not initialized. Cannot update: ${JSON.stringify(Z)}`);return{config:{...X.config,config:{...X.config.config,...Z}}}})}}});var v0={currentFocus:"main-input",previousFocus:null},k=(Q)=>({...v0,actions:{setFocus:(Z)=>{Q((X)=>({focus:{...X.focus,currentFocus:Z,previousFocus:X.focus.currentFocus}}))},restorePreviousFocus:()=>{Q((Z)=>({focus:{...Z.focus,currentFocus:Z.focus.previousFocus||"main-input",previousFocus:null}}))}}});function u(Q,Z,X,Y){let $=Q.messages.find((F)=>F.id===Z);if($)return $;let V={id:Z,role:X,content:"",timestamp:Y};return Q.messages.push(V),V}function n(Q,Z){let X=Date.parse(Z.timestamp)||Date.now();switch(Z.type){case"message_created":return u(Q,Z.data.messageId,Z.data.role,X),Q;case"part_created":case"part_updated":{let{messageId:Y,partType:$,payload:V,partId:F}=Z.data,H=Q.messages.find((U)=>U.id===Y)??u(Q,Y,"assistant",X);if($==="text"){let U=V.text??"";Q.streamingText.delete(F),H.content=U}else if($==="image")H.content=H.content?`${H.content}
|
|
2
|
+
[Image]`:"[Image]";return Q}default:return Q}}function a(Q,Z){if(Z.channel!=="content")return Q;let X=Q.messages.find((V)=>V.id===Z.messageId)??u(Q,Z.messageId,"assistant",Date.now()),$=(Q.streamingText.get(Z.partId)?.text??"")+Z.delta;return Q.streamingText.set(Z.partId,{messageId:Z.messageId,text:$}),X.content=$,Q}function t(Q,Z,X,Y=0,$=0,V){let F=s(),H=V?F.models.getModel(V,Q):F.models.getModels().find((W)=>W.id===Q);if(!H)return 0;let U=H.cost,_=Z/1e6*U.input+X/1e6*U.output+Y/1e6*U.cacheRead+$/1e6*U.cacheWrite;return Math.round(_*1e6)/1e6}var j={codeBlock:/^```(\w+)?\s*$/,heading:/^ *(#{1,4}) +(.+)/,blockquote:/^(>+)\s?(.*)/,ulItem:/^([ \t]*)([-*+]) +(.+)/,olItem:/^([ \t]*)(\d+)\. +(.+)/,hr:/^ *([-*_] *){3,} *$/,table:/^\|(.+)\|$/,tableSeparator:/^\|[\s]*:?-+:?[\s]*(\|[\s]*:?-+:?[\s]*)+\|?$/,diffStart:/^<<<DIFF>>>$/,diffEnd:/^<<<\/DIFF>>>$/,commandMessage:/<command-message>(.*?)<\/command-message>/};function o0(Q){let Z=[],X=Q.split(/\r?\n/),Y=!1,$=[],V=null,F=0,H=!1,U=[],_=[],W=!1,D=[],P=!1,O=[],J=0,G=!0;for(let w=0;w<X.length;w++){let K=X[w];if(W){if(K.match(j.diffEnd)){try{let q=JSON.parse(D.join(`
|
|
3
|
+
`));Z.push({type:"diff",content:"",diffData:{patch:q.patch,startLine:q.startLine,matchLine:q.matchLine}})}catch(q){Z.push({type:"text",content:D.join(`
|
|
4
|
+
`)})}W=!1,D=[],G=!1;continue}D.push(K);continue}if(K.match(j.diffStart)){W=!0,D=[],G=!1;continue}if(Y){let q=K.match(j.codeBlock),B=K.trim()==="```";if(q&&q[1])F++,$.push(K);else if(B)if(F>0)F--,$.push(K);else{let J0=$.join(`
|
|
5
|
+
`);Z.push({type:"code",content:J0,language:V||void 0}),Y=!1,$=[],V=null,F=0,G=!1}else $.push(K);continue}let R=K.match(j.codeBlock);if(R){Y=!0,V=R[1]||null,F=0,G=!1;continue}let L=K.match(j.table),F0=K.match(j.tableSeparator);if(L&&!H){if(w+1<X.length){if(X[w+1].match(j.tableSeparator)){H=!0,U=L[1].split("|").map((B)=>B.trim()).filter((B)=>B.length>0),_=[],G=!1;continue}}}if(H&&F0)continue;if(H&&L){let q=L[1].split("|").map((B)=>B.trim()).filter((B)=>B.length>0);while(q.length<U.length)q.push("");if(q.length>U.length)q.length=U.length;_.push(q);continue}if(H&&!L){if(U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});H=!1,U=[],_=[]}let C=K.match(j.blockquote);if(C){let q=C[1].length,B=C[2]||"";if(P&&q===J)O.push(B);else{if(P)Z.push({type:"blockquote",content:O.join(`
|
|
6
|
+
`),blockquoteLevel:J,blockquoteLines:[...O]});P=!0,J=q,O=[B]}G=!1;continue}if(P)Z.push({type:"blockquote",content:O.join(`
|
|
7
|
+
`),blockquoteLevel:J,blockquoteLines:[...O]}),P=!1,O=[],J=0;let M=K.match(j.heading);if(M){Z.push({type:"heading",content:M[2],level:M[1].length}),G=!1;continue}let y=K.match(j.ulItem);if(y){Z.push({type:"list",content:y[3],listType:"ul",marker:y[2],indentation:y[1].length}),G=!1;continue}let S=K.match(j.olItem);if(S){Z.push({type:"list",content:S[3],listType:"ol",marker:S[2],indentation:S[1].length}),G=!1;continue}if(K.match(j.hr)){Z.push({type:"hr",content:""}),G=!1;continue}if(K.trim().length===0){if(!G)Z.push({type:"empty",content:""}),G=!0;continue}let r=K.match(j.commandMessage);if(r){Z.push({type:"command-message",content:r[1]}),G=!1;continue}Z.push({type:"text",content:K}),G=!1}if(Y){let w=$.join(`
|
|
8
|
+
`);Z.push({type:"code",content:w,language:V||void 0})}if(H&&U.length>0&&_.length>0)Z.push({type:"table",content:"",tableData:{headers:U,rows:_}});if(P&&O.length>0)Z.push({type:"blockquote",content:O.join(`
|
|
9
|
+
`),blockquoteLevel:J,blockquoteLines:[...O]});while(Z.length>0&&Z[Z.length-1].type==="empty")Z.pop();return Z}var A=new Map;function I0(){return{inCodeBlock:!1,codeBlockContent:[],codeBlockLang:null,codeBlockDepth:0,inTable:!1,tableHeaders:[],tableRows:[],inDiff:!1,diffContent:[],inBlockquote:!1,blockquoteLines:[],blockquoteLevel:0,lastLineEmpty:!0,pendingTableHeader:null}}function N0(Q){let Z=A.get(Q);if(Z)return Z;let X={state:I0(),blocks:[],pendingLine:"",finalized:!1};return A.set(Q,X),X}function e(Q){return Q.endsWith("\r")?Q.slice(0,-1):Q}function Q0(Q,Z){if(Q.tableHeaders.length>0&&Q.tableRows.length>0)Z.push({type:"table",content:"",tableData:{headers:Q.tableHeaders,rows:Q.tableRows}});Q.inTable=!1,Q.tableHeaders=[],Q.tableRows=[]}function m(Q,Z){if(Q.blockquoteLines.length>0)Z.push({type:"blockquote",content:Q.blockquoteLines.join(`
|
|
10
|
+
`),blockquoteLevel:Q.blockquoteLevel,blockquoteLines:[...Q.blockquoteLines]});Q.inBlockquote=!1,Q.blockquoteLines=[],Q.blockquoteLevel=0}function X0(Q,Z){let X=Q.codeBlockContent.join(`
|
|
11
|
+
`);Z.push({type:"code",content:X,language:Q.codeBlockLang||void 0}),Q.inCodeBlock=!1,Q.codeBlockContent=[],Q.codeBlockLang=null,Q.codeBlockDepth=0,Q.lastLineEmpty=!1}function g(Q,Z,X=!0){let{state:Y,blocks:$}=Z;if(Y.pendingTableHeader!==null){if(Q.match(j.tableSeparator)){Y.inTable=!0,Y.tableHeaders=Y.pendingTableHeader.slice(1,-1).split("|").map((J)=>J.trim()).filter((J)=>J.length>0),Y.tableRows=[],Y.pendingTableHeader=null,Y.lastLineEmpty=!1;return}$.push({type:"text",content:Y.pendingTableHeader}),Y.pendingTableHeader=null,Y.lastLineEmpty=!1}if(Y.inDiff){if(Q.match(j.diffEnd)){try{let J=JSON.parse(Y.diffContent.join(`
|
|
12
|
+
`));$.push({type:"diff",content:"",diffData:{patch:J.patch,startLine:J.startLine,matchLine:J.matchLine}})}catch(J){$.push({type:"text",content:Y.diffContent.join(`
|
|
13
|
+
`)})}Y.inDiff=!1,Y.diffContent=[],Y.lastLineEmpty=!1;return}Y.diffContent.push(Q);return}if(Q.match(j.diffStart)){Y.inDiff=!0,Y.diffContent=[],Y.lastLineEmpty=!1;return}if(Y.inCodeBlock){let J=Q.match(j.codeBlock),G=Q.trim()==="```";if(J&&J[1])Y.codeBlockDepth++,Y.codeBlockContent.push(Q);else if(G)if(Y.codeBlockDepth>0)Y.codeBlockDepth--,Y.codeBlockContent.push(Q);else X0(Y,$);else Y.codeBlockContent.push(Q);return}let V=Q.match(j.codeBlock);if(V){Y.inCodeBlock=!0,Y.codeBlockLang=V[1]||null,Y.codeBlockDepth=0,Y.lastLineEmpty=!1;return}let F=Q.match(j.table),H=Q.match(j.tableSeparator);if(F&&!Y.inTable){Y.pendingTableHeader=Q;return}if(Y.inTable&&H)return;if(Y.inTable&&F){let J=F[1].split("|").map((G)=>G.trim()).filter((G)=>G.length>0);while(J.length<Y.tableHeaders.length)J.push("");if(J.length>Y.tableHeaders.length)J.length=Y.tableHeaders.length;Y.tableRows.push(J);return}if(Y.inTable&&!F){if(Q0(Y,$),X){g(Q,Z,!1);return}}let U=Q.match(j.blockquote);if(U){let J=U[1].length,G=U[2]||"";if(Y.inBlockquote&&J===Y.blockquoteLevel)Y.blockquoteLines.push(G);else{if(Y.inBlockquote)m(Y,$);Y.inBlockquote=!0,Y.blockquoteLevel=J,Y.blockquoteLines=[G]}Y.lastLineEmpty=!1;return}if(Y.inBlockquote)m(Y,$);let _=Q.match(j.heading);if(_){$.push({type:"heading",content:_[2],level:_[1].length}),Y.lastLineEmpty=!1;return}let W=Q.match(j.ulItem);if(W){$.push({type:"list",content:W[3],listType:"ul",marker:W[2],indentation:W[1].length}),Y.lastLineEmpty=!1;return}let D=Q.match(j.olItem);if(D){$.push({type:"list",content:D[3],listType:"ol",marker:D[2],indentation:D[1].length}),Y.lastLineEmpty=!1;return}if(Q.match(j.hr)){$.push({type:"hr",content:""}),Y.lastLineEmpty=!1;return}if(Q.trim().length===0){if(!Y.lastLineEmpty)$.push({type:"empty",content:""}),Y.lastLineEmpty=!0;return}let O=Q.match(j.commandMessage);if(O){$.push({type:"command-message",content:O[1]}),Y.lastLineEmpty=!1;return}$.push({type:"text",content:Q}),Y.lastLineEmpty=!1}function s0(Q,Z){if(!Q||!Z)return;let X=N0(Q);if(X.finalized)return;let Y=X.pendingLine+Z,$=Y.split(`
|
|
14
|
+
`),V=Y.endsWith(`
|
|
15
|
+
`),F=V?$:$.slice(0,-1);X.pendingLine=V?"":$[$.length-1]??"";for(let H of F)g(e(H),X)}function t0(Q){let Z=A.get(Q);if(!Z||Z.finalized)return;if(Z.pendingLine)g(e(Z.pendingLine),Z),Z.pendingLine="";if(Z.state.pendingTableHeader!==null)Z.blocks.push({type:"text",content:Z.state.pendingTableHeader}),Z.state.pendingTableHeader=null;if(Z.state.inCodeBlock)X0(Z.state,Z.blocks);if(Z.state.inTable)Q0(Z.state,Z.blocks);if(Z.state.inBlockquote)m(Z.state,Z.blocks);if(Z.state.inDiff)Z.blocks.push({type:"text",content:Z.state.diffContent.join(`
|
|
16
|
+
`)}),Z.state.inDiff=!1,Z.state.diffContent=[];while(Z.blocks.length>0&&Z.blocks[Z.blocks.length-1].type==="empty")Z.blocks.pop();Z.finalized=!0}function e0(Q){let Z=A.get(Q);if(!Z||!Z.finalized)return null;return Z.blocks}function Q1(Q){let Z=A.get(Q);if(!Z)return null;return Z.blocks}function R0(Q){let Z=A.get(Q);if(!Z)return null;let X=[],Y=Z.state;if(Y.inDiff)X.push("<<<DIFF>>>"),X.push(...Y.diffContent);else if(Y.inCodeBlock){let $=Y.codeBlockLang?`\`\`\`${Y.codeBlockLang}`:"```";X.push($),X.push(...Y.codeBlockContent)}else if(Y.inTable){if(Y.tableHeaders.length>0){X.push(`| ${Y.tableHeaders.join(" | ")} |`),X.push(`| ${Y.tableHeaders.map(()=>"---").join(" | ")} |`);for(let $ of Y.tableRows)X.push(`| ${$.join(" | ")} |`)}}else if(Y.inBlockquote){let $=">".repeat(Y.blockquoteLevel)+" ";for(let V of Y.blockquoteLines)X.push($+V)}else if(Y.pendingTableHeader)X.push(Y.pendingTableHeader);if(Z.pendingLine)X.push(Z.pendingLine);return X.length>0?X:null}function X1(Q){let Z=A.get(Q);if(!Z)return null;let X="text";if(Z.state.inDiff)X="diff";else if(Z.state.inCodeBlock)X="code";else if(Z.state.inTable||Z.state.pendingTableHeader)X="table";let Y=R0(Q);if(!Y||Y.length===0)return null;return{lines:Y,mode:X}}function Y1(Q){A.delete(Q)}function T(){A.clear()}var Y0=2000,N=[];function y0(){let Q=N;return N=[],Q}var I={messages:[],streamingText:new Map};function S0(){I={messages:[],streamingText:new Map}}var V0={inputTokens:0,outputTokens:0,totalTokens:0,maxContextTokens:0,totalInputTokens:0,totalOutputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,turnCount:0,estimatedCostUsd:0},Z0={sessionId:$0("tui"),messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,isCompacting:!1,currentCommand:null,error:null,isActive:!0,tokenUsage:{...V0},currentThinkingContent:null,thinkingExpanded:!1,clearCount:0,historyExpanded:!1,expandedMessageCount:100,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null},d=(Q,Z)=>({...Z0,actions:{addMessage:(X)=>{Q((Y)=>({session:{...Y.session,messages:[...Y.session.messages,X],error:null}}))},addUserMessage:(X)=>{let Y={id:`user-${Date.now()}-${Math.random()}`,role:"user",content:X,timestamp:Date.now()};Z().session.actions.addMessage(Y)},addAssistantMessage:(X,Y)=>{let $={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:X,timestamp:Date.now(),thinkingContent:Y};Z().session.actions.addMessage($)},addAssistantMessageAndClearThinking:(X)=>{let Y=Z().session.currentThinkingContent,$={id:`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:X,timestamp:Date.now(),thinkingContent:Y||void 0};Q((V)=>({session:{...V.session,messages:[...V.session.messages,$],currentThinkingContent:null,error:null}}))},addToolMessage:(X,Y)=>{let $={id:`tool-${Date.now()}-${Math.random()}`,role:"tool",content:X,timestamp:Date.now(),metadata:Y};Z().session.actions.addMessage($)},setCompacting:(X)=>{Q((Y)=>({session:{...Y.session,isCompacting:X}}))},setCommand:(X)=>{Q((Y)=>({session:{...Y.session,currentCommand:X}}))},setError:(X)=>{Q((Y)=>({session:{...Y.session,error:X}}))},clearMessages:()=>{T(),Q((X)=>({session:{...X.session,messages:[],restoredContextMessages:null,restoredVisibleMessageCount:0,error:null,clearCount:X.session.clearCount+1}}))},setCompactedContext:(X)=>{Q((Y)=>({session:{...Y.session,restoredContextMessages:[...X],restoredVisibleMessageCount:Y.session.messages.length}}))},resetSession:()=>{T(),Q((X)=>({session:{...X.session,...Z0,sessionId:X.session.sessionId,isActive:!0}}))},restoreSession:(X,Y,$)=>{T(),Q((V)=>({session:{...V.session,sessionId:X,messages:Y,restoredContextMessages:$??null,restoredVisibleMessageCount:$?Y.length:0,error:null,isActive:!0}}))},updateTokenUsage:(X)=>{Q((Y)=>{let $=Y.session.tokenUsage,{costUsd:V,...F}=X,H=Math.max(0,X.inputTokens??0),U=Math.max(0,X.outputTokens??0),_=Math.max(0,X.cacheReadTokens??0),W=Math.max(0,X.cacheWriteTokens??0),D=$.totalInputTokens+H,P=$.totalOutputTokens+U,O=$.cacheReadTokens+_,J=$.cacheWriteTokens+W,G=Y.config?.config,w=G?.models?.find((L)=>L.id===G.currentModelId),K=w?.model??"",R=V??t(K,Math.max(0,H-_-W),U,_,W,w?.provider);return{session:{...Y.session,tokenUsage:{...$,...F,totalInputTokens:D,totalOutputTokens:P,cacheReadTokens:O,cacheWriteTokens:J,estimatedCostUsd:$.estimatedCostUsd+Math.max(0,R)}}}})},resetContextUsage:()=>{Q((X)=>({session:{...X.session,tokenUsage:{...X.session.tokenUsage,inputTokens:0,outputTokens:0,totalTokens:0}}}))},resetTokenUsage:()=>{Q((X)=>({session:{...X.session,tokenUsage:{...V0}}}))},setCurrentThinkingContent:(X)=>{if(Z().session.currentThinkingContent===X)return;Q((Y)=>({session:{...Y.session,currentThinkingContent:X}}))},appendThinkingContent:(X)=>{Q((Y)=>({session:{...Y.session,currentThinkingContent:(Y.session.currentThinkingContent||"")+X}}))},setThinkingExpanded:(X)=>{Q((Y)=>({session:{...Y.session,thinkingExpanded:X}}))},toggleThinkingExpanded:()=>{Q((X)=>({session:{...X.session,thinkingExpanded:!X.session.thinkingExpanded}}))},setHistoryExpanded:(X)=>{Q((Y)=>({session:{...Y.session,historyExpanded:X}}))},toggleHistoryExpanded:()=>{Q((X)=>({session:{...X.session,historyExpanded:!X.session.historyExpanded}}))},setExpandedMessageCount:(X)=>{Q((Y)=>({session:{...Y.session,expandedMessageCount:X}}))},incrementClearCount:()=>{Q((X)=>({session:{...X.session,clearCount:X.session.clearCount+1}}))},startStreamingAssistantMessage:()=>{let X=`assistant-${Date.now()}-${Math.random()}`,Y={id:X,role:"assistant",content:"",timestamp:Date.now()};return N=[],Q(($)=>({session:{...$.session,messages:[...$.session.messages,Y],currentStreamingMessageId:X,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,error:null}})),X},appendAssistantContent:(X)=>{let Y=Z().session.currentStreamingMessageId,$=Y??`assistant-${Date.now()}-${Math.random()}`;return N.push(X),Q((V)=>{let F=(w)=>w.endsWith("\r")?w.slice(0,-1):w,H=Y?V.session.currentStreamingLines:[],U=Y?V.session.currentStreamingTail:"",_=Y?V.session.currentStreamingLineCount:0,W=Y?V.session.currentStreamingVersion:0,P=(U+X).split(`
|
|
17
|
+
`),O=P.slice(0,-1).map(F),J=F(P[P.length-1]??""),G=H;if(O.length>0){if(G=[...H,...O],G.length>Y0){let w=G.length-Y0;G=G.slice(w)}}return{session:{...V.session,currentStreamingMessageId:$,currentStreamingLines:G,currentStreamingTail:J,currentStreamingLineCount:_+O.length,currentStreamingVersion:W+1,error:null}}}),$},finalizeStreamingMessage:(X,Y)=>{let $=y0();Q((V)=>{let F=V.session.currentStreamingMessageId,U=$.join("")+(X||""),_=(V.session.currentThinkingContent||"")+(Y||"");if(U.length>0){let W={id:F||`assistant-${Date.now()}-${Math.random()}`,role:"assistant",content:U,timestamp:Date.now(),thinkingContent:_||void 0};return{session:{...V.session,messages:[...V.session.messages,W],currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:W.id}}}return{session:{...V.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,currentThinkingContent:null,finalizingStreamingMessageId:null}}})},clearFinalizingStreamingMessageId:()=>{Q((X)=>({session:{...X.session,finalizingStreamingMessageId:null}}))},discardStreamingMessage:()=>{N=[],Q((X)=>({session:{...X.session,currentStreamingMessageId:null,currentStreamingChunks:[],currentStreamingLines:[],currentStreamingTail:"",currentStreamingLineCount:0,currentStreamingVersion:0,finalizingStreamingMessageId:null}}))},applyCommittedEvent:(X)=>{n(I,X),Q((Y)=>({session:{...Y.session,messages:[...I.messages],error:null}}))},applyStreamingDelta:(X)=>{a(I,X),Q((Y)=>({session:{...Y.session,messages:[...I.messages]}}))},resetConversationProjection:()=>{S0()}}});var b0=f0()(C0(M0((...Q)=>({session:d(...Q),app:b(...Q),config:p(...Q),focus:k(...Q),command:h(...Q)})),{name:"BladeStore",enabled:!0})),z=()=>b0.getState(),P1=()=>z().session.actions,B1=()=>z().app.actions,E1=()=>z().session.messages,E=()=>z().config.config,v=null;async function A1(){if(E()!==null)return;if(v)return v;return v=(async()=>{try{let X=await G0.getInstance().initialize();z().config.actions.setConfig(X)}catch(Z){throw v=null,Error(`[FAIL] Store 未初始化且无法自动初始化
|
|
18
|
+
|
|
19
|
+
`+`原因: ${Z instanceof Error?Z.message:"未知错误"}
|
|
20
|
+
|
|
21
|
+
`+`请确保:
|
|
22
|
+
`+`1. 配置文件格式正确 (~/.blade/config.json)
|
|
23
|
+
`+`2. 运行 blade 进行首次配置
|
|
24
|
+
`+"3. 配置文件权限正确")}finally{v=null}})(),v}var L1=()=>z().config.config?.models??[],v1=()=>{let Q=E();if(!Q)return;let Z=Q.currentModelId;return Q.models.find((Y)=>Y.id===Z)??Q.models[0]},I1=(Q)=>{let Z=E();if(!Z)return;return Z.models.find((X)=>X.id===Q)},N1=()=>z().config.config?.mcpServers??{},R1=()=>z().app.thinkingModeEnabled,y1=()=>({setPermissionMode:async(Q)=>{z().config.actions.updateConfig({permissionMode:Q})},setTheme:async(Q,Z={})=>{try{o.setTheme(Q)}catch{return}z().config.actions.updateConfig({theme:Q}),await x().save({theme:Q},{scope:"global",...Z})},setLanguage:async(Q,Z={})=>{z().config.actions.updateConfig({language:Q}),await x().save({language:Q},{scope:"global",...Z})},setDebug:async(Q,Z={})=>{z().config.actions.updateConfig({debug:Q}),await x().save({debug:Q},{scope:"global",...Z})},setTemperature:async(Q,Z={})=>{z().config.actions.updateConfig({temperature:Q}),await x().save({temperature:Q},{scope:"global",...Z})},updateConfig:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");let Y={...X};z().config.actions.updateConfig(Q);try{await x().save(Q,Z)}catch($){throw z().config.actions.setConfig(Y),$}},flush:async()=>{await x().flush()},appendPermissionAllowRule:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");let Y=X.permissions?.allow||[];if(!Y.includes(Q)){let $=[...Y,Q];z().config.actions.updateConfig({permissions:{...X.permissions,allow:$}})}await x().appendPermissionRule(Q,Z)},appendLocalPermissionAllowRule:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");let Y=X.permissions?.allow||[];if(!Y.includes(Q)){let $=[...Y,Q];z().config.actions.updateConfig({permissions:{...X.permissions,allow:$}})}await x().appendLocalPermissionRule(Q,Z)},setCurrentModel:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");if(!X.models.find(($)=>$.id===Q))throw Error(`Model not found: ${Q}`);z().config.actions.updateConfig({currentModelId:Q}),await x().save({currentModelId:Q},{scope:"global",...Z})},addModel:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");let Y="id"in Q?Q:{id:T0(),...Q};if(X.models.find((H)=>H.provider===Y.provider&&H.model===Y.model))throw Error(`Model already configured: ${Y.provider}/${Y.model}`);let F={models:[...X.models,Y]};if(X.models.length===0)F.currentModelId=Y.id;return z().config.actions.updateConfig(F),await x().save(F,{scope:"global",...Z}),Y},updateModel:async(Q,Z,X={})=>{let Y=E();if(!Y)throw Error("Config not initialized");let $=Y.models.findIndex((F)=>F.id===Q);if($===-1)throw Error(`Model not found: ${Q}`);let V=[...Y.models];V[$]={...V[$],...Z},z().config.actions.updateConfig({models:V}),await x().save({models:V},{scope:"global",...X})},removeModel:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");if(X.models.length===1)throw Error("Cannot remove the only model");let Y=X.models.filter((V)=>V.id!==Q),$={models:Y};if(X.currentModelId===Q)$.currentModelId=Y[0].id;z().config.actions.updateConfig($),await x().save($,{scope:"global",...Z})},addMcpServer:async(Q,Z,X={})=>{let Y=E();if(!Y)throw Error("Config not initialized");let V={...Y.mcpServers??{},[Q]:Z};z().config.actions.updateConfig({mcpServers:V}),await x().save({mcpServers:V},{scope:"project",...X})},removeMcpServer:async(Q,Z={})=>{let X=E();if(!X)throw Error("Config not initialized");let $={...X.mcpServers??{}};delete $[Q],z().config.actions.updateConfig({mcpServers:$}),await x().save({mcpServers:$},{scope:"project",...Z})}});
|
|
25
|
+
export{c as ja,o as ka,j as la,o0 as ma,s0 as na,t0 as oa,e0 as pa,Q1 as qa,X1 as ra,Y1 as sa,b0 as ta,z as ua,P1 as va,B1 as wa,E1 as xa,E as ya,A1 as za,L1 as Aa,v1 as Ba,I1 as Ca,N1 as Da,R1 as Ea,y1 as Fa};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{realpathSync as z}from"fs";import{cwd as F}from"process";var u=null;function G(){let m="";if(typeof process<"u"&&typeof process.cwd==="function"&&typeof z==="function"){let x=F();try{m=z(x).normalize("NFC")}catch{m=x.normalize("NFC")}}return{cwd:m,originalCwd:m,projectRoot:m}}function q(){if(!u)u=G();return u}function B(){return q().cwd}function N(m){q().cwd=m.normalize("NFC")}function D(){return q().originalCwd}function P(){return q().projectRoot}function Q(m){q().projectRoot=m.normalize("NFC")}import{AsyncLocalStorage as H}from"async_hooks";var I=new H;function J(){return I.getStore()??B()}function W(){try{return J()}catch{return D()}}
|
|
2
|
+
export{N as nc,D as oc,P as pc,Q as qc,W as rc};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Ab as X,Db as d,yb as h}from"./chunk-0z5qe4m2.js";import{Kb as n}from"./chunk-rxjt7ma7.js";import{Vb as s}from"./chunk-9xvnrq7m.js";import{gc as B}from"./chunk-w4xcmzjm.js";import{nanoid as V}from"nanoid";var g;((G)=>{G.PreToolUse="PreToolUse";G.PostToolUse="PostToolUse";G.PostToolUseFailure="PostToolUseFailure";G.PermissionRequest="PermissionRequest";G.UserPromptSubmit="UserPromptSubmit";G.SessionStart="SessionStart";G.SessionEnd="SessionEnd";G.Stop="Stop";G.SubagentStop="SubagentStop";G.Notification="Notification";G.Compaction="Compaction"})(g||={});var T;((Q)=>{Q.Approve="approve";Q.Block="block";Q.Async="async"})(T||={});var N;((Q)=>{Q.Allow="allow";Q.Deny="deny";Q.Ask="ask"})(N||={});var y={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 M(O,S){return{...O,...S,PreToolUse:S.PreToolUse??O.PreToolUse,PostToolUse:S.PostToolUse??O.PostToolUse,PostToolUseFailure:S.PostToolUseFailure??O.PostToolUseFailure,PermissionRequest:S.PermissionRequest??O.PermissionRequest,UserPromptSubmit:S.UserPromptSubmit??O.UserPromptSubmit,SessionStart:S.SessionStart??O.SessionStart,SessionEnd:S.SessionEnd??O.SessionEnd,Stop:S.Stop??O.Stop,SubagentStop:S.SubagentStop??O.SubagentStop,Notification:S.Notification??O.Notification,Compaction:S.Compaction??O.Compaction}}function k(){let O={};if(process.env.BLADE_DISABLE_HOOKS==="true")O.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let S=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(S)&&S>0)O.defaultTimeout=S}return O}class C{executedHooks=new Map;canExecute(O,S){if(!this.executedHooks.has(O))this.executedHooks.set(O,new Set);if(this.executedHooks.get(O).has(S))return console.warn(`[HookGuard] Hook ${S} for tool ${O} already executed, skipping`),!1;return!0}markExecuted(O,S){let q=this.executedHooks.get(O);if(q)q.add(S)}cleanup(O){this.executedHooks.delete(O)}cleanupAll(){this.executedHooks.clear()}}var r=X.Object({hookEventName:X.Literal("PreToolUse"),permissionDecision:X.Optional(X.Enum(N)),permissionDecisionReason:X.Optional(X.String()),updatedInput:X.Optional(X.Record(X.String(),X.Unknown()))}),o=X.Object({hookEventName:X.Literal("PostToolUse"),additionalContext:X.Optional(X.String()),updatedOutput:X.Optional(X.Unknown())}),e=X.Object({hookEventName:X.Literal("Stop"),continue:X.Optional(X.Boolean()),continueReason:X.Optional(X.String())}),t=X.Object({hookEventName:X.Literal("SubagentStop"),continue:X.Optional(X.Boolean()),continueReason:X.Optional(X.String()),additionalContext:X.Optional(X.String())}),OO=X.Object({hookEventName:X.Literal("PermissionRequest"),permissionDecision:X.Optional(d(["approve","deny","ask"])),permissionDecisionReason:X.Optional(X.String())}),SO=X.Object({hookEventName:X.Literal("UserPromptSubmit"),updatedPrompt:X.Optional(X.String()),contextInjection:X.Optional(X.String())}),qO=X.Object({hookEventName:X.Literal("SessionStart"),env:X.Optional(X.Record(X.String(),X.String()))}),QO=X.Object({hookEventName:X.Literal("Compaction"),blockCompaction:X.Optional(X.Boolean()),blockReason:X.Optional(X.String())}),YO=X.Object({decision:X.Optional(X.Object({behavior:X.Enum(T)})),systemMessage:X.Optional(X.String()),hookSpecificOutput:X.Optional(X.Union([r,o,e,t,OO,SO,qO,QO])),suppressOutput:X.Optional(X.Boolean())});function p(O){return h(YO,O)}class w{parse(O,S,q){if(O.timedOut){let Y=q?.timeoutBehavior||"ignore",Z="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}let Q=this.tryParseJSON(O.stdout);if(Q){let Y=p(Q);if(!Y.success){let W="error"in Y?Y.error.message:"Unknown validation error",$=q?.failureBehavior||"ignore",R=`Invalid hook output JSON: ${W}`;if($==="deny")return{success:!1,blocking:!0,error:R,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else if($==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${R}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else return{success:!1,blocking:!1,warning:R,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}let Z=Y.data;if(Z.decision?.behavior==="block")return{success:!1,blocking:!0,error:Z.systemMessage||"Hook blocked execution",output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};if(Z.decision?.behavior==="async")return{success:!0,output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};return{success:!0,output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}return this.parseByExitCode(O,S,q)}parseByExitCode(O,S,q){let Q=O.exitCode;switch(Q){case 0:return{success:!0,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};case 2:return{success:!1,blocking:!0,error:O.stderr||O.stdout||"Hook returned exit code 2",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};case 124:{let Y=q?.timeoutBehavior||"ignore",Z="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S}}default:{let Y=q?.failureBehavior||"ignore",Z=O.stderr||O.stdout||`Hook failed with exit code ${Q}`;if(Y==="deny")return{success:!1,blocking:!0,error:Z,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${Z}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else return{success:!1,blocking:!1,warning:Z,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S}}}}tryParseJSON(O){try{let S=O.trim();if(!S)return null;let q=S.match(/^\s*(\{[\s\S]*\})\s*$/);if(!q)return null;return JSON.parse(q[1])}catch{return null}}}import{spawn as u}from"node:child_process";var ZO=500;function WO(O){return new Promise((S)=>setTimeout(S,O))}function x(O){return O&&typeof O==="object"&&"code"in O?String(O.code):void 0}function $O(O,S){return new Promise((q)=>{let Q=["/PID",String(O),"/T"];if(S)Q.push("/F");let Y=u("taskkill",Q,{stdio:"ignore",windowsHide:!0}),Z=!1,W=($)=>{if(Z)return;Z=!0,q($)};Y.once("error",()=>W(!1)),Y.once("close",($)=>W($===0))})}class a{child;state="owned";terminationPromise;terminationResult;platform;gracePeriodMs;killProcess;taskkill;wait;constructor(O,S={}){this.child=O;this.platform=S.platform??process.platform,this.gracePeriodMs=S.gracePeriodMs??ZO,this.killProcess=S.killProcess??process.kill.bind(process),this.taskkill=S.taskkill??$O,this.wait=S.wait??WO;let q=()=>{if(this.state==="owned")this.state="released"};O.once("close",q),O.once("error",q)}release(){if(this.state==="owned")this.state="released"}terminate(){if(this.terminationPromise)return this.terminationPromise;if(this.terminationResult)return Promise.resolve(this.terminationResult);if(this.state==="released")return this.terminationResult={success:!0,alreadyExited:!0,forced:!1},Promise.resolve(this.terminationResult);return this.state="terminating",this.terminationPromise=this.terminateOwnedTree().then((O)=>{return this.state="released",this.terminationResult=O,O}),this.terminationPromise}async terminateOwnedTree(){let O=this.child.pid;if(!O)return{success:!1,alreadyExited:!0,forced:!1};if(this.platform==="win32"){let Q=await this.taskkill(O,!1);await this.wait(this.gracePeriodMs);let Y=await this.taskkill(O,!0);if(!Q&&!Y)return{success:this.signalDirectChild("SIGKILL"),alreadyExited:!1,forced:!0};return{success:!0,alreadyExited:!1,forced:!0}}let S=this.signalPosixTree(O,"SIGTERM");await this.wait(this.gracePeriodMs);let q=this.signalPosixTree(O,"SIGKILL");return{success:S||q,alreadyExited:!1,forced:q}}signalPosixTree(O,S){if(O<=1||O===process.pid)return this.signalDirectChild(S);try{return this.killProcess(-O,S)}catch(q){if(x(q)==="ESRCH")return!0;return this.signalDirectChild(S)}}signalDirectChild(O){try{return this.child.kill(O)}catch(S){return x(S)==="ESRCH"}}}function l(O,S,q={}){let Q=u(O,S,{...q,detached:process.platform==="win32"?q.detached:!0,windowsHide:q.windowsHide??!0});return{child:Q,processTree:new a(Q)}}class E{content="";maxSize;constructor(O){this.maxSize=O}append(O){if(this.content.length<this.maxSize){let S=this.maxSize-this.content.length;this.content+=O.substring(0,S)}}getContent(){return this.content}isFull(){return this.content.length>=this.maxSize}}class I{MAX_STDOUT_SIZE=1048576;MAX_STDERR_SIZE=1048576;MAX_INPUT_SIZE=102400;async execute(O,S,q,Q){let Y=JSON.stringify(S);if(Y.length>this.MAX_INPUT_SIZE)throw Error(`Hook input too large: ${Y.length} bytes (max ${this.MAX_INPUT_SIZE})`);let Z=this.createSafeEnv(S),{child:W,processTree:$}=l(O,[],{shell:!0,env:Z,cwd:q.projectDir}),R=new E(this.MAX_STDOUT_SIZE),J=new E(this.MAX_STDERR_SIZE);W.stdout?.setEncoding("utf8"),W.stderr?.setEncoding("utf8"),W.stdout?.on("data",(F)=>{R.append(F)}),W.stderr?.on("data",(F)=>{J.append(F)});try{W.stdin?.write(Y),W.stdin?.end()}catch(F){throw await $.terminate(),Error(`Failed to write hook input: ${F}`)}return new Promise((F,G)=>{let K=!1,z=!1,D,L=()=>{return D??=$.terminate(),D},j=null,A=()=>{if(j&&q.abortSignal)q.abortSignal.removeEventListener("abort",j),j=null},U=setTimeout(()=>{K=!0,L()},Q);if(W.on("close",async(b)=>{if(z)return;if(z=!0,clearTimeout(U),A(),K)await L();F({stdout:R.getContent(),stderr:J.getContent(),exitCode:K?124:b??1,timedOut:K})}),W.on("error",(b)=>{if(z)return;z=!0,clearTimeout(U),A(),G(b)}),q.abortSignal){if(j=()=>{if(z)return;z=!0,clearTimeout(U),A(),L().then(()=>{F({stdout:R.getContent(),stderr:"Hook cancelled by abort signal",exitCode:1,timedOut:!1})})},q.abortSignal.addEventListener("abort",j),q.abortSignal.aborted)j()}})}createSafeEnv(O){return{BLADE_PROJECT_DIR:O.project_dir,BLADE_SESSION_ID:O.session_id,BLADE_HOOK_EVENT:O.hook_event_name,BLADE_TOOL_NAME:"tool_name"in O?O.tool_name:"",BLADE_TOOL_USE_ID:"tool_use_id"in O?O.tool_use_id:"",PATH:process.env.PATH||"",HOME:process.env.HOME||"",USER:process.env.USER||"",SHELL:process.env.SHELL||"/bin/sh"}}}class _ extends Error{constructor(O){super(O);this.name="HttpHookSecurityError"}}function i(O,S={}){let q;try{q=new URL(O)}catch{throw new _(`Invalid URL: ${O}`)}if(q.protocol!=="https:"&&q.protocol!=="http:")throw new _(`Only http/https supported, got: ${q.protocol}`);let Q=q.hostname.toLowerCase();if(RO(Q,S.allowedHosts))return;if(q.protocol==="http:"&&!S.allowHttp)throw new _(`HTTP (non-TLS) blocked for ${Q}; use https:// or add to allowedHosts`);if(XO(Q)&&!S.allowLoopback)throw new _(`Loopback address blocked: ${Q}; enable policy.allowLoopback or add to allowedHosts`);if(JO(Q)&&!S.allowPrivateRanges)throw new _(`Private/link-local address blocked: ${Q}; enable policy.allowPrivateRanges or add to allowedHosts`)}function RO(O,S){if(!S||S.length===0)return!1;return S.some((q)=>{let Q=q.toLowerCase();if(Q===O)return!0;if(Q.startsWith("*.")){let Y=Q.slice(1);return O.endsWith(Y)&&O.length>Y.length}return!1})}function XO(O){if(O==="localhost")return!0;if(O==="::1"||O==="[::1]")return!0;if(/^127\.\d+\.\d+\.\d+$/.test(O))return!0;return!1}function JO(O){let S=O.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(!S)return!1;let[q,Q]=S.slice(1).map(Number);if(q===10)return!0;if(q===172&&Q>=16&&Q<=31)return!0;if(q===192&&Q===168)return!0;if(q===169&&Q===254)return!0;return!1}function c(O){if(!O)return{};let S={};for(let[q,Q]of Object.entries(O))S[q]=Q.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(Y,Z)=>{return process.env[Z]??`\${${Z}}`});return S}var zO=s("Execution"),FO={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 f{processExecutor=new I;outputParser=new w;chatServiceCache=new Map;async executePreToolHooks(O,S,q){if(O.length===0)return{decision:"allow"};let Q="tool_input"in S?S.tool_input:{},Y=[];for(let Z of O)try{let W={...S,...Q&&{tool_input:Q}},$=await this.executeHook(Z,W,q);if(!$.success){if($.blocking)return{decision:"deny",reason:$.error};if($.needsConfirmation)return{decision:"ask",reason:$.warning||$.error};if($.warning)Y.push($.warning);continue}let R=$.output?.hookSpecificOutput;if(R&&"permissionDecision"in R){switch(R.permissionDecision){case"deny":return{decision:"deny",reason:R.permissionDecisionReason};case"ask":return{decision:"ask",reason:R.permissionDecisionReason};case"allow":break}if("updatedInput"in R&&R.updatedInput)Q={...Q,...R.updatedInput}}}catch(W){let $=W instanceof Error?W.message:String(W);if(Y.push(`Hook failed: ${$}`),q.config.failureBehavior==="deny")return{decision:"deny",reason:$};else if(q.config.failureBehavior==="ask")return{decision:"ask",reason:`Hook failed: ${$}. Continue?`}}return{decision:"allow",modifiedInput:Q,warning:Y.length>0?Y.join(`
|
|
1
|
+
import{Cb as d,xb as h,zb as X}from"./chunk-x548f12z.js";import{rc as n}from"./chunk-w3me85va.js";import{vc as s}from"./chunk-2fbwmdvg.js";import{Hc as B}from"./chunk-ppyg431d.js";import{nanoid as V}from"nanoid";var g;((G)=>{G.PreToolUse="PreToolUse";G.PostToolUse="PostToolUse";G.PostToolUseFailure="PostToolUseFailure";G.PermissionRequest="PermissionRequest";G.UserPromptSubmit="UserPromptSubmit";G.SessionStart="SessionStart";G.SessionEnd="SessionEnd";G.Stop="Stop";G.SubagentStop="SubagentStop";G.Notification="Notification";G.Compaction="Compaction"})(g||={});var T;((Q)=>{Q.Approve="approve";Q.Block="block";Q.Async="async"})(T||={});var N;((Q)=>{Q.Allow="allow";Q.Deny="deny";Q.Ask="ask"})(N||={});var y={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 M(O,S){return{...O,...S,PreToolUse:S.PreToolUse??O.PreToolUse,PostToolUse:S.PostToolUse??O.PostToolUse,PostToolUseFailure:S.PostToolUseFailure??O.PostToolUseFailure,PermissionRequest:S.PermissionRequest??O.PermissionRequest,UserPromptSubmit:S.UserPromptSubmit??O.UserPromptSubmit,SessionStart:S.SessionStart??O.SessionStart,SessionEnd:S.SessionEnd??O.SessionEnd,Stop:S.Stop??O.Stop,SubagentStop:S.SubagentStop??O.SubagentStop,Notification:S.Notification??O.Notification,Compaction:S.Compaction??O.Compaction}}function k(){let O={};if(process.env.BLADE_DISABLE_HOOKS==="true")O.enabled=!1;if(process.env.BLADE_HOOK_TIMEOUT){let S=parseInt(process.env.BLADE_HOOK_TIMEOUT,10);if(!isNaN(S)&&S>0)O.defaultTimeout=S}return O}class C{executedHooks=new Map;canExecute(O,S){if(!this.executedHooks.has(O))this.executedHooks.set(O,new Set);if(this.executedHooks.get(O).has(S))return console.warn(`[HookGuard] Hook ${S} for tool ${O} already executed, skipping`),!1;return!0}markExecuted(O,S){let q=this.executedHooks.get(O);if(q)q.add(S)}cleanup(O){this.executedHooks.delete(O)}cleanupAll(){this.executedHooks.clear()}}var r=X.Object({hookEventName:X.Literal("PreToolUse"),permissionDecision:X.Optional(X.Enum(N)),permissionDecisionReason:X.Optional(X.String()),updatedInput:X.Optional(X.Record(X.String(),X.Unknown()))}),o=X.Object({hookEventName:X.Literal("PostToolUse"),additionalContext:X.Optional(X.String()),updatedOutput:X.Optional(X.Unknown())}),e=X.Object({hookEventName:X.Literal("Stop"),continue:X.Optional(X.Boolean()),continueReason:X.Optional(X.String())}),t=X.Object({hookEventName:X.Literal("SubagentStop"),continue:X.Optional(X.Boolean()),continueReason:X.Optional(X.String()),additionalContext:X.Optional(X.String())}),OO=X.Object({hookEventName:X.Literal("PermissionRequest"),permissionDecision:X.Optional(d(["approve","deny","ask"])),permissionDecisionReason:X.Optional(X.String())}),SO=X.Object({hookEventName:X.Literal("UserPromptSubmit"),updatedPrompt:X.Optional(X.String()),contextInjection:X.Optional(X.String())}),qO=X.Object({hookEventName:X.Literal("SessionStart"),env:X.Optional(X.Record(X.String(),X.String()))}),QO=X.Object({hookEventName:X.Literal("Compaction"),blockCompaction:X.Optional(X.Boolean()),blockReason:X.Optional(X.String())}),YO=X.Object({decision:X.Optional(X.Object({behavior:X.Enum(T)})),systemMessage:X.Optional(X.String()),hookSpecificOutput:X.Optional(X.Union([r,o,e,t,OO,SO,qO,QO])),suppressOutput:X.Optional(X.Boolean())});function p(O){return h(YO,O)}class w{parse(O,S,q){if(O.timedOut){let Y=q?.timeoutBehavior||"ignore",Z="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}let Q=this.tryParseJSON(O.stdout);if(Q){let Y=p(Q);if(!Y.success){let W="error"in Y?Y.error.message:"Unknown validation error",$=q?.failureBehavior||"ignore",R=`Invalid hook output JSON: ${W}`;if($==="deny")return{success:!1,blocking:!0,error:R,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else if($==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${R}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};else return{success:!1,blocking:!1,warning:R,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}let Z=Y.data;if(Z.decision?.behavior==="block")return{success:!1,blocking:!0,error:Z.systemMessage||"Hook blocked execution",output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};if(Z.decision?.behavior==="async")return{success:!0,output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S};return{success:!0,output:Z,stdout:O.stdout,stderr:O.stderr,exitCode:O.exitCode,hook:S}}return this.parseByExitCode(O,S,q)}parseByExitCode(O,S,q){let Q=O.exitCode;switch(Q){case 0:return{success:!0,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};case 2:return{success:!1,blocking:!0,error:O.stderr||O.stdout||"Hook returned exit code 2",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};case 124:{let Y=q?.timeoutBehavior||"ignore",Z="Hook timeout";if(Y==="deny")return{success:!1,blocking:!0,error:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:"Hook timeout. Continue?",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else return{success:!1,blocking:!1,warning:"Hook timeout",stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S}}default:{let Y=q?.failureBehavior||"ignore",Z=O.stderr||O.stdout||`Hook failed with exit code ${Q}`;if(Y==="deny")return{success:!1,blocking:!0,error:Z,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else if(Y==="ask")return{success:!1,blocking:!1,needsConfirmation:!0,warning:`${Z}. Continue?`,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S};else return{success:!1,blocking:!1,warning:Z,stdout:O.stdout,stderr:O.stderr,exitCode:Q,hook:S}}}}tryParseJSON(O){try{let S=O.trim();if(!S)return null;let q=S.match(/^\s*(\{[\s\S]*\})\s*$/);if(!q)return null;return JSON.parse(q[1])}catch{return null}}}import{spawn as u}from"node:child_process";var ZO=500;function WO(O){return new Promise((S)=>setTimeout(S,O))}function x(O){return O&&typeof O==="object"&&"code"in O?String(O.code):void 0}function $O(O,S){return new Promise((q)=>{let Q=["/PID",String(O),"/T"];if(S)Q.push("/F");let Y=u("taskkill",Q,{stdio:"ignore",windowsHide:!0}),Z=!1,W=($)=>{if(Z)return;Z=!0,q($)};Y.once("error",()=>W(!1)),Y.once("close",($)=>W($===0))})}class a{child;state="owned";terminationPromise;terminationResult;platform;gracePeriodMs;killProcess;taskkill;wait;constructor(O,S={}){this.child=O;this.platform=S.platform??process.platform,this.gracePeriodMs=S.gracePeriodMs??ZO,this.killProcess=S.killProcess??process.kill.bind(process),this.taskkill=S.taskkill??$O,this.wait=S.wait??WO;let q=()=>{if(this.state==="owned")this.state="released"};O.once("close",q),O.once("error",q)}release(){if(this.state==="owned")this.state="released"}terminate(){if(this.terminationPromise)return this.terminationPromise;if(this.terminationResult)return Promise.resolve(this.terminationResult);if(this.state==="released")return this.terminationResult={success:!0,alreadyExited:!0,forced:!1},Promise.resolve(this.terminationResult);return this.state="terminating",this.terminationPromise=this.terminateOwnedTree().then((O)=>{return this.state="released",this.terminationResult=O,O}),this.terminationPromise}async terminateOwnedTree(){let O=this.child.pid;if(!O)return{success:!1,alreadyExited:!0,forced:!1};if(this.platform==="win32"){let Q=await this.taskkill(O,!1);await this.wait(this.gracePeriodMs);let Y=await this.taskkill(O,!0);if(!Q&&!Y)return{success:this.signalDirectChild("SIGKILL"),alreadyExited:!1,forced:!0};return{success:!0,alreadyExited:!1,forced:!0}}let S=this.signalPosixTree(O,"SIGTERM");await this.wait(this.gracePeriodMs);let q=this.signalPosixTree(O,"SIGKILL");return{success:S||q,alreadyExited:!1,forced:q}}signalPosixTree(O,S){if(O<=1||O===process.pid)return this.signalDirectChild(S);try{return this.killProcess(-O,S)}catch(q){if(x(q)==="ESRCH")return!0;return this.signalDirectChild(S)}}signalDirectChild(O){try{return this.child.kill(O)}catch(S){return x(S)==="ESRCH"}}}function l(O,S,q={}){let Q=u(O,S,{...q,detached:process.platform==="win32"?q.detached:!0,windowsHide:q.windowsHide??!0});return{child:Q,processTree:new a(Q)}}class E{content="";maxSize;constructor(O){this.maxSize=O}append(O){if(this.content.length<this.maxSize){let S=this.maxSize-this.content.length;this.content+=O.substring(0,S)}}getContent(){return this.content}isFull(){return this.content.length>=this.maxSize}}class I{MAX_STDOUT_SIZE=1048576;MAX_STDERR_SIZE=1048576;MAX_INPUT_SIZE=102400;async execute(O,S,q,Q){let Y=JSON.stringify(S);if(Y.length>this.MAX_INPUT_SIZE)throw Error(`Hook input too large: ${Y.length} bytes (max ${this.MAX_INPUT_SIZE})`);let Z=this.createSafeEnv(S),{child:W,processTree:$}=l(O,[],{shell:!0,env:Z,cwd:q.projectDir}),R=new E(this.MAX_STDOUT_SIZE),J=new E(this.MAX_STDERR_SIZE);W.stdout?.setEncoding("utf8"),W.stderr?.setEncoding("utf8"),W.stdout?.on("data",(F)=>{R.append(F)}),W.stderr?.on("data",(F)=>{J.append(F)});try{W.stdin?.write(Y),W.stdin?.end()}catch(F){throw await $.terminate(),Error(`Failed to write hook input: ${F}`)}return new Promise((F,G)=>{let K=!1,z=!1,D,L=()=>{return D??=$.terminate(),D},j=null,A=()=>{if(j&&q.abortSignal)q.abortSignal.removeEventListener("abort",j),j=null},U=setTimeout(()=>{K=!0,L()},Q);if(W.on("close",async(b)=>{if(z)return;if(z=!0,clearTimeout(U),A(),K)await L();F({stdout:R.getContent(),stderr:J.getContent(),exitCode:K?124:b??1,timedOut:K})}),W.on("error",(b)=>{if(z)return;z=!0,clearTimeout(U),A(),G(b)}),q.abortSignal){if(j=()=>{if(z)return;z=!0,clearTimeout(U),A(),L().then(()=>{F({stdout:R.getContent(),stderr:"Hook cancelled by abort signal",exitCode:1,timedOut:!1})})},q.abortSignal.addEventListener("abort",j),q.abortSignal.aborted)j()}})}createSafeEnv(O){return{BLADE_PROJECT_DIR:O.project_dir,BLADE_SESSION_ID:O.session_id,BLADE_HOOK_EVENT:O.hook_event_name,BLADE_TOOL_NAME:"tool_name"in O?O.tool_name:"",BLADE_TOOL_USE_ID:"tool_use_id"in O?O.tool_use_id:"",PATH:process.env.PATH||"",HOME:process.env.HOME||"",USER:process.env.USER||"",SHELL:process.env.SHELL||"/bin/sh"}}}class _ extends Error{constructor(O){super(O);this.name="HttpHookSecurityError"}}function i(O,S={}){let q;try{q=new URL(O)}catch{throw new _(`Invalid URL: ${O}`)}if(q.protocol!=="https:"&&q.protocol!=="http:")throw new _(`Only http/https supported, got: ${q.protocol}`);let Q=q.hostname.toLowerCase();if(RO(Q,S.allowedHosts))return;if(q.protocol==="http:"&&!S.allowHttp)throw new _(`HTTP (non-TLS) blocked for ${Q}; use https:// or add to allowedHosts`);if(XO(Q)&&!S.allowLoopback)throw new _(`Loopback address blocked: ${Q}; enable policy.allowLoopback or add to allowedHosts`);if(JO(Q)&&!S.allowPrivateRanges)throw new _(`Private/link-local address blocked: ${Q}; enable policy.allowPrivateRanges or add to allowedHosts`)}function RO(O,S){if(!S||S.length===0)return!1;return S.some((q)=>{let Q=q.toLowerCase();if(Q===O)return!0;if(Q.startsWith("*.")){let Y=Q.slice(1);return O.endsWith(Y)&&O.length>Y.length}return!1})}function XO(O){if(O==="localhost")return!0;if(O==="::1"||O==="[::1]")return!0;if(/^127\.\d+\.\d+\.\d+$/.test(O))return!0;return!1}function JO(O){let S=O.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);if(!S)return!1;let[q,Q]=S.slice(1).map(Number);if(q===10)return!0;if(q===172&&Q>=16&&Q<=31)return!0;if(q===192&&Q===168)return!0;if(q===169&&Q===254)return!0;return!1}function c(O){if(!O)return{};let S={};for(let[q,Q]of Object.entries(O))S[q]=Q.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/gi,(Y,Z)=>{return process.env[Z]??`\${${Z}}`});return S}var zO=s("Execution"),FO={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 f{processExecutor=new I;outputParser=new w;chatServiceCache=new Map;async executePreToolHooks(O,S,q){if(O.length===0)return{decision:"allow"};let Q="tool_input"in S?S.tool_input:{},Y=[];for(let Z of O)try{let W={...S,...Q&&{tool_input:Q}},$=await this.executeHook(Z,W,q);if(!$.success){if($.blocking)return{decision:"deny",reason:$.error};if($.needsConfirmation)return{decision:"ask",reason:$.warning||$.error};if($.warning)Y.push($.warning);continue}let R=$.output?.hookSpecificOutput;if(R&&"permissionDecision"in R){switch(R.permissionDecision){case"deny":return{decision:"deny",reason:R.permissionDecisionReason};case"ask":return{decision:"ask",reason:R.permissionDecisionReason};case"allow":break}if("updatedInput"in R&&R.updatedInput)Q={...Q,...R.updatedInput}}}catch(W){let $=W instanceof Error?W.message:String(W);if(Y.push(`Hook failed: ${$}`),q.config.failureBehavior==="deny")return{decision:"deny",reason:$};else if(q.config.failureBehavior==="ask")return{decision:"ask",reason:`Hook failed: ${$}. Continue?`}}return{decision:"allow",modifiedInput:Q,warning:Y.length>0?Y.join(`
|
|
2
2
|
`):void 0}}async executePostToolHooks(O,S,q){if(O.length===0)return{};let Q=q.config.maxConcurrentHooks||5,Y=await this.executeHooksConcurrently(O,S,q,Q),Z=[],W=void 0,$=[];for(let R of Y){if(!R.success&&R.warning){$.push(R.warning);continue}let J=R.output?.hookSpecificOutput;if(J&&"additionalContext"in J){if(J.additionalContext)Z.push(J.additionalContext);if("updatedOutput"in J&&J.updatedOutput!==void 0)W=J.updatedOutput}}return{additionalContext:Z.length>0?Z.join(`
|
|
3
3
|
|
|
4
4
|
`):void 0,modifiedOutput:W,warning:$.length>0?$.join(`
|
|
@@ -21,7 +21,7 @@ import{Ab as X,Db as d,yb as h}from"./chunk-0z5qe4m2.js";import{Kb as n}from"./c
|
|
|
21
21
|
`):void 0}}async executeNotificationHooks(O,S,q){let Q="message"in S?S.message:"";if(O.length===0)return{suppress:!1,message:Q};let Y=[],Z=!1,W=Q;for(let $ of O)try{let R=await this.executeHook($,S,q);if(!R.success){if(R.warning)Y.push(R.warning);continue}if(R.output?.suppressOutput){Z=!0;break}if(R.stdout&&R.stdout.trim())W=R.stdout.trim()}catch(R){let J=R instanceof Error?R.message:String(R);Y.push(`Hook failed: ${J}`)}return{suppress:Z,message:W,warning:Y.length>0?Y.join(`
|
|
22
22
|
`):void 0}}async executeCompactionHooks(O,S,q){if(O.length===0)return{blockCompaction:!1};let Q=[];for(let Y of O)try{let Z=await this.executeHook(Y,S,q);if(!Z.success){if(Z.warning)Q.push(Z.warning);continue}let W=Z.output?.hookSpecificOutput;if(W&&"blockCompaction"in W&&W.blockCompaction)return{blockCompaction:!0,blockReason:W.blockReason,warning:Q.length>0?Q.join(`
|
|
23
23
|
`):void 0}}catch(Z){let W=Z instanceof Error?Z.message:String(Z);Q.push(`Hook failed: ${W}`)}return{blockCompaction:!1,warning:Q.length>0?Q.join(`
|
|
24
|
-
`):void 0}}async executeHook(O,S,q){if(O.type==="command")return this.executeCommandHook(O,S,q);if(O.type==="prompt")return this.executePromptHook(O,S,q);if(O.type==="function")return this.executeFunctionHook(O,S,q);if(O.type==="http")return this.executeHttpHook(O,S,q);throw Error(`Hook type ${O.type} not supported`)}async executeCommandHook(O,S,q){let Q=(O.timeout??q.config.defaultTimeout??60)*1000;try{let Y=await this.processExecutor.execute(O.command,S,q,Q);return this.outputParser.parse(Y,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executePromptHook(O,S,q){let Q=(O.timeout??q.config.defaultTimeout??60)*1000;try{let Y=await this.getOrCreateChatService(O.model),Z="hook_event_name"in S?String(S.hook_event_name):"Unknown",W=this.buildPromptHookSystemMessage(O,Z),$=JSON.stringify(S,null,2),R=new AbortController,J=setTimeout(()=>R.abort(),Q),F;try{F=(await Y.chat([{role:"system",content:W},{role:"user",content:$}],void 0,R.signal)).content}catch(K){if(R.signal.aborted||K instanceof Error&&K.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior});throw K}finally{clearTimeout(J)}let G=this.extractJsonFromLLMResponse(F);return this.outputParser.parse({stdout:G,stderr:"",exitCode:0,timedOut:!1},O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){return zO.warn(`[PromptHook] 执行失败: ${Y instanceof Error?Y.message:String(Y)}`),{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executeFunctionHook(O,S,q){let Q=(O.timeout??10)*1000;try{let Y=await this.runFunctionWithTimeout(O.handler,S,q,Q);if(Y===void 0||Y===null)return{success:!0,hook:O};let Z={stdout:JSON.stringify(Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(Z,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){if(Y.isTimeout){let Z={stdout:"",stderr:`Function hook timeout after ${Q}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse(Z,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}runFunctionWithTimeout(O,S,q,Q){return new Promise((Y,Z)=>{let W=!1,$=setTimeout(()=>{if(W)return;W=!0;let J=Object.assign(Error(`Function hook timed out after ${Q}ms`),{isTimeout:!0});Z(J)},Q),R=()=>{if(W)return;W=!0,clearTimeout($),Z(Error("Function hook aborted"))};q.abortSignal?.addEventListener("abort",R,{once:!0}),Promise.resolve().then(()=>O(S,q)).then((J)=>{if(W)return;W=!0,clearTimeout($),q.abortSignal?.removeEventListener("abort",R),Y(J)},(J)=>{if(W)return;W=!0,clearTimeout($),q.abortSignal?.removeEventListener("abort",R),Z(J)})})}async executeHttpHook(O,S,q){let Q=(O.timeout??10)*1000,Y=O.maxResponseBytes??262144,Z=Math.max(1,(O.retries??0)+1);try{i(O.url,q.config.httpPolicy)}catch(J){return{success:!1,blocking:!0,error:J instanceof Error?J.message:String(J),hook:O}}let W={"Content-Type":"application/json",...c(O.headers)},$=JSON.stringify(S),R;for(let J=0;J<Z;J++){if(J>0){let z=Math.min(2**J*200,5000);await new Promise((D)=>setTimeout(D,z))}let F=new AbortController,G=setTimeout(()=>F.abort(),Q),K=()=>F.abort();q.abortSignal?.addEventListener("abort",K,{once:!0});try{let z=await fetch(O.url,{method:"POST",headers:W,body:$,redirect:"manual",signal:F.signal});if(z.status>=300&&z.status<400){R=Error(`HTTP hook received redirect (${z.status}); redirects are disabled`);continue}if(!z.ok){if(R=Error(`HTTP hook returned ${z.status} ${z.statusText}`),z.status>=400&&z.status<500)break;continue}let L={stdout:await GO(z,Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(L,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(z){let D=z.name==="AbortError"||z.code==="ABORT_ERR";if(D&&q.abortSignal?.aborted){R=Error("HTTP hook aborted by caller");break}if(D){let L={stdout:"",stderr:`HTTP hook timeout after ${Q}ms`,exitCode:124,timedOut:!0};if(J===Z-1)return this.outputParser.parse(L,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior});R=Error(`HTTP hook timeout attempt ${J+1}`);continue}R=z}finally{clearTimeout(G),q.abortSignal?.removeEventListener("abort",K)}}return{success:!1,blocking:!1,error:R?.message??"HTTP hook failed",hook:O}}async getOrCreateChatService(O){let S=O||"__default__",q=this.chatServiceCache.get(S);if(q)return q;let{ensureStoreInitialized:Q,getCurrentModel:Y,getModelById:Z}=await import("./chunk-
|
|
24
|
+
`):void 0}}async executeHook(O,S,q){if(O.type==="command")return this.executeCommandHook(O,S,q);if(O.type==="prompt")return this.executePromptHook(O,S,q);if(O.type==="function")return this.executeFunctionHook(O,S,q);if(O.type==="http")return this.executeHttpHook(O,S,q);throw Error(`Hook type ${O.type} not supported`)}async executeCommandHook(O,S,q){let Q=(O.timeout??q.config.defaultTimeout??60)*1000;try{let Y=await this.processExecutor.execute(O.command,S,q,Q);return this.outputParser.parse(Y,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executePromptHook(O,S,q){let Q=(O.timeout??q.config.defaultTimeout??60)*1000;try{let Y=await this.getOrCreateChatService(O.model),Z="hook_event_name"in S?String(S.hook_event_name):"Unknown",W=this.buildPromptHookSystemMessage(O,Z),$=JSON.stringify(S,null,2),R=new AbortController,J=setTimeout(()=>R.abort(),Q),F;try{F=(await Y.chat([{role:"system",content:W},{role:"user",content:$}],void 0,R.signal)).content}catch(K){if(R.signal.aborted||K instanceof Error&&K.name==="AbortError")return this.outputParser.parse({stdout:"",stderr:"",exitCode:0,timedOut:!0},O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior});throw K}finally{clearTimeout(J)}let G=this.extractJsonFromLLMResponse(F);return this.outputParser.parse({stdout:G,stderr:"",exitCode:0,timedOut:!1},O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){return zO.warn(`[PromptHook] 执行失败: ${Y instanceof Error?Y.message:String(Y)}`),{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}async executeFunctionHook(O,S,q){let Q=(O.timeout??10)*1000;try{let Y=await this.runFunctionWithTimeout(O.handler,S,q,Q);if(Y===void 0||Y===null)return{success:!0,hook:O};let Z={stdout:JSON.stringify(Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(Z,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(Y){if(Y.isTimeout){let Z={stdout:"",stderr:`Function hook timeout after ${Q}ms`,exitCode:124,timedOut:!0};return this.outputParser.parse(Z,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}return{success:!1,blocking:!1,error:Y instanceof Error?Y.message:String(Y),hook:O}}}runFunctionWithTimeout(O,S,q,Q){return new Promise((Y,Z)=>{let W=!1,$=setTimeout(()=>{if(W)return;W=!0;let J=Object.assign(Error(`Function hook timed out after ${Q}ms`),{isTimeout:!0});Z(J)},Q),R=()=>{if(W)return;W=!0,clearTimeout($),Z(Error("Function hook aborted"))};q.abortSignal?.addEventListener("abort",R,{once:!0}),Promise.resolve().then(()=>O(S,q)).then((J)=>{if(W)return;W=!0,clearTimeout($),q.abortSignal?.removeEventListener("abort",R),Y(J)},(J)=>{if(W)return;W=!0,clearTimeout($),q.abortSignal?.removeEventListener("abort",R),Z(J)})})}async executeHttpHook(O,S,q){let Q=(O.timeout??10)*1000,Y=O.maxResponseBytes??262144,Z=Math.max(1,(O.retries??0)+1);try{i(O.url,q.config.httpPolicy)}catch(J){return{success:!1,blocking:!0,error:J instanceof Error?J.message:String(J),hook:O}}let W={"Content-Type":"application/json",...c(O.headers)},$=JSON.stringify(S),R;for(let J=0;J<Z;J++){if(J>0){let z=Math.min(2**J*200,5000);await new Promise((D)=>setTimeout(D,z))}let F=new AbortController,G=setTimeout(()=>F.abort(),Q),K=()=>F.abort();q.abortSignal?.addEventListener("abort",K,{once:!0});try{let z=await fetch(O.url,{method:"POST",headers:W,body:$,redirect:"manual",signal:F.signal});if(z.status>=300&&z.status<400){R=Error(`HTTP hook received redirect (${z.status}); redirects are disabled`);continue}if(!z.ok){if(R=Error(`HTTP hook returned ${z.status} ${z.statusText}`),z.status>=400&&z.status<500)break;continue}let L={stdout:await GO(z,Y),stderr:"",exitCode:0,timedOut:!1};return this.outputParser.parse(L,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior})}catch(z){let D=z.name==="AbortError"||z.code==="ABORT_ERR";if(D&&q.abortSignal?.aborted){R=Error("HTTP hook aborted by caller");break}if(D){let L={stdout:"",stderr:`HTTP hook timeout after ${Q}ms`,exitCode:124,timedOut:!0};if(J===Z-1)return this.outputParser.parse(L,O,{timeoutBehavior:q.config.timeoutBehavior,failureBehavior:q.config.failureBehavior});R=Error(`HTTP hook timeout attempt ${J+1}`);continue}R=z}finally{clearTimeout(G),q.abortSignal?.removeEventListener("abort",K)}}return{success:!1,blocking:!1,error:R?.message??"HTTP hook failed",hook:O}}async getOrCreateChatService(O){let S=O||"__default__",q=this.chatServiceCache.get(S);if(q)return q;let{ensureStoreInitialized:Q,getCurrentModel:Y,getModelById:Z}=await import("./chunk-8edsvxf3.js"),{createChatServiceAsync:W}=await import("./chunk-h3bjmkvz.js"),{resolveModelConfig:$}=await import("./chunk-0zkhjsbv.js");await Q();let R=O?Z(O)||Y():Y();if(!R)throw Error("PromptHook: 无法获取模型配置。请确保至少配置了一个模型。");let J=(await import("./chunk-8edsvxf3.js")).getConfig();if(!J)throw Error("PromptHook: 配置未初始化");let F=await W($(R,J,!1).chat);return this.chatServiceCache.set(S,F),F}buildPromptHookSystemMessage(O,S){let q=FO[S]||"{ ... 根据事件类型返回相应字段 }";return`你是一个代码质量评估器,作为 Hook 在 ${S} 事件中被触发。
|
|
25
25
|
|
|
26
26
|
`+`## 评估指令
|
|
27
27
|
${O.prompt}
|
|
@@ -38,4 +38,4 @@ ${O.prompt}
|
|
|
38
38
|
`+`- 只输出 JSON,不要包含 markdown 代码块或其他文本
|
|
39
39
|
`+`- 如果没有发现问题,使用 "approve"
|
|
40
40
|
`+'- 只在发现严重问题时使用 "block"'}extractJsonFromLLMResponse(O){let S=O.trim(),q=S.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);if(q)return q[1].trim();return S}async executeHooksConcurrently(O,S,q,Q){let Y=[],Z=new Set;for(let W of O){if(Z.size>=Q)await Promise.race(Z);let $=this.executeHook(W,S,q).catch((J)=>({success:!1,blocking:!1,error:J instanceof Error?J.message:String(J),hook:W})),R=$.then(()=>{Z.delete(R)}).catch(()=>{Z.delete(R)});Z.add(R),Y.push($)}return Promise.all(Y)}}async function GO(O,S){let q=O.body?.getReader();if(!q)return"";let Q=new TextDecoder,Y=0,Z="";while(!0){let{value:W,done:$}=await q.read();if($)break;if(Y+=W.byteLength,Y>S){try{q.cancel()}catch{}Z+=Q.decode(W.slice(0,S-(Y-W.byteLength)));break}Z+=Q.decode(W,{stream:!0})}return Z+=Q.decode(),Z}import H from"picomatch";var KO=/^([A-Za-z0-9_|]+)\((.+)\)$/;class v{matches(O,S){if(!O)return!0;if(O.tools&&S.toolName){if(!this.matchTools(O.tools,S))return!1}if(O.paths&&S.filePath){if(!this.matchPaths(O.paths,S.filePath))return!1}if(O.commands&&S.command){if(!this.matchCommands(O.commands,S.command))return!1}return!0}matchTools(O,S){if(Array.isArray(O))return O.some((q)=>this.matchToolWithParams(q,S));return this.matchToolWithParams(O,S)}matchPaths(O,S){if(Array.isArray(O))return O.some((Q)=>{return H(Q)(S)});return H(O)(S)}matchCommands(O,S){if(Array.isArray(O))return O.some((q)=>this.matchPattern(S,q));return this.matchPattern(S,O)}matchToolWithParams(O,S){let{toolName:q,command:Q,filePath:Y}=S,Z=KO.exec(O);if(!Z)return this.matchPattern(q,O);let[,W,$]=Z;if(!this.matchPattern(q,W))return!1;let R=this.getArgValue(q,Q,Y);if(!R)return!1;return this.matchGlobOrPattern(R,$)}getArgValue(O,S,q){if(O==="Bash"||O==="BashTool")return S;if(["Read","Edit","Write","Glob","Grep"].includes(O))return q;return S||q}matchGlobOrPattern(O,S){if(/[*?[\]{}!]/.test(S))try{return H(S,{bash:!0,dot:!0})(O)}catch{}if(S.endsWith("*")){let q=S.slice(0,-1);return O.startsWith(q)}return O===S}matchPattern(O,S){if(S==="*")return!0;if(!S.includes("|")&&!/[.*+?^${}()|[\]\\]/.test(S))return O===S;if(S.includes("|"))return S.split("|").map((Q)=>Q.trim()).includes(O);try{return new RegExp(S).test(O)}catch{return O===S}}}class P{static instance=null;config=y;executor=new f;guard=new C;matcher=new v;sessionDisabled=!1;constructor(){}static getInstance(){if(!P.instance)P.instance=new P;return P.instance}loadConfig(O){let S=M(y,O),q=k();S=M(S,q),this.config=S}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(O,S,q,Q){let Y={type:"function",handler:q,timeout:Q?.timeout},Z={name:Q?.name??`inline-${O}-${Date.now()}`,matcher:S,hooks:[Y]},W=this.config[O]??[];return this.config[O]=[...W,Z],()=>{let $=this.config[O];if(!$)return;this.config[O]=$.filter((R)=>R!==Z)}}async reloadConfig(){let O=await import("node:fs/promises"),S=await import("node:path");try{let q=S.join(n(),".blade","settings.local.json"),Q=await O.readFile(q,"utf-8"),Y=JSON.parse(Q);if(Y.hooks)this.loadConfig(Y.hooks)}catch{}}async executePreToolHooks(O,S,q,Q){if(!this.isEnabled())return{decision:"allow"};if(Q.permissionMode==="plan")return{decision:"allow"};if(!this.guard.canExecute(S,"PreToolUse"))return{decision:"allow"};let Y={hook_event_name:"PreToolUse",hook_execution_id:V(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:S,tool_input:q,project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode},Z=this.getMatchingHooks("PreToolUse",{toolName:O,filePath:this.extractFilePath(q),command:this.extractCommand(O,q)});if(Z.length===0)return{decision:"allow"};let W={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:this.config,abortSignal:Q.abortSignal};try{let $=await this.executor.executePreToolHooks(Z,Y,W);if(this.guard.markExecuted(S,"PreToolUse"),Q.permissionMode==="yolo"){if($.decision==="deny")return $;return{decision:"allow",modifiedInput:$.modifiedInput,warning:$.warning,reason:$.reason}}return $}catch($){return console.error("[HookManager] Error executing PreToolUse hooks:",$),{decision:"allow",warning:`Hook execution failed: ${$ instanceof Error?$.message:String($)}`}}}async executePostToolHooks(O,S,q,Q,Y){if(!this.isEnabled())return{};if(Y.permissionMode==="plan")return{};if(!this.guard.canExecute(S,"PostToolUse"))return{};let Z={hook_event_name:"PostToolUse",hook_execution_id:V(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:S,tool_input:q,tool_response:Q,project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode},W=this.getMatchingHooks("PostToolUse",{toolName:O,filePath:this.extractFilePath(q),command:this.extractCommand(O,q)});if(W.length===0)return{};let $={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{let R=await this.executor.executePostToolHooks(W,Z,$);return this.guard.markExecuted(S,"PostToolUse"),R}catch(R){return console.error("[HookManager] Error executing PostToolUse hooks:",R),{warning:`Hook execution failed: ${R instanceof Error?R.message:String(R)}`}}finally{this.guard.cleanup(S)}}async executeStopHooks(O){if(!this.isEnabled())return{shouldStop:!0};let S={hook_event_name:"Stop",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:O.projectDir,session_id:O.sessionId,permission_mode:O.permissionMode,reason:O.reason},q=this.getMatchingHooks("Stop",{});if(q.length===0)return{shouldStop:!0};let Q={projectDir:O.projectDir,sessionId:O.sessionId,permissionMode:O.permissionMode,config:this.config,abortSignal:O.abortSignal};try{return await this.executor.executeStopHooks(q,S,Q)}catch(Y){return console.error("[HookManager] Error executing Stop hooks:",Y),{shouldStop:!0,warning:`Hook execution failed: ${Y instanceof Error?Y.message:String(Y)}`}}}async executeSubagentStopHooks(O,S){if(!this.isEnabled())return{shouldStop:!0};let q={hook_event_name:"SubagentStop",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:S.projectDir,session_id:S.sessionId,permission_mode:S.permissionMode,agent_type:O,task_description:S.taskDescription,success:S.success,result_summary:S.resultSummary,error:S.error},Q=this.getMatchingHooks("SubagentStop",{});if(Q.length===0)return{shouldStop:!0};let Y={projectDir:S.projectDir,sessionId:S.sessionId,permissionMode:S.permissionMode,config:this.config,abortSignal:S.abortSignal};try{return await this.executor.executeSubagentStopHooks(Q,q,Y)}catch(Z){return console.error("[HookManager] Error executing SubagentStop hooks:",Z),{shouldStop:!0,warning:`Hook execution failed: ${Z instanceof Error?Z.message:String(Z)}`}}}async executePermissionRequestHooks(O,S,q,Q){if(!this.isEnabled())return{decision:"ask"};let Y={hook_event_name:"PermissionRequest",hook_execution_id:V(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:S,tool_input:q,project_dir:Q.projectDir,session_id:Q.sessionId,permission_mode:Q.permissionMode},Z=this.getMatchingHooks("PermissionRequest",{toolName:O,filePath:this.extractFilePath(q),command:this.extractCommand(O,q)});if(Z.length===0)return{decision:"ask"};let W={projectDir:Q.projectDir,sessionId:Q.sessionId,permissionMode:Q.permissionMode,config:this.config,abortSignal:Q.abortSignal};try{return await this.executor.executePermissionRequestHooks(Z,Y,W)}catch($){return console.error("[HookManager] Error executing PermissionRequest hooks:",$),{decision:"ask",warning:`Hook execution failed: ${$ instanceof Error?$.message:String($)}`}}}async executeUserPromptSubmitHooks(O,S){if(!this.isEnabled())return{proceed:!0};let q={hook_event_name:"UserPromptSubmit",hook_execution_id:V(),timestamp:new Date().toISOString(),user_prompt:O,has_images:S.hasImages,image_count:S.imageCount,project_dir:S.projectDir,session_id:S.sessionId,permission_mode:S.permissionMode},Q=this.getMatchingHooks("UserPromptSubmit",{});if(Q.length===0)return{proceed:!0};let Y={projectDir:S.projectDir,sessionId:S.sessionId,permissionMode:S.permissionMode,config:this.config,abortSignal:S.abortSignal};try{return await this.executor.executeUserPromptSubmitHooks(Q,q,Y)}catch(Z){return console.error("[HookManager] Error executing UserPromptSubmit hooks:",Z),{proceed:!0,warning:`Hook execution failed: ${Z instanceof Error?Z.message:String(Z)}`}}}async executeSessionStartHooks(O){if(!this.isEnabled())return{proceed:!0};let S={hook_event_name:"SessionStart",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:O.projectDir,session_id:O.sessionId,permission_mode:O.permissionMode,is_resume:O.isResume,resume_session_id:O.resumeSessionId},q=this.getMatchingHooks("SessionStart",{});if(q.length===0)return{proceed:!0};let Q={projectDir:O.projectDir,sessionId:O.sessionId,permissionMode:O.permissionMode,config:this.config,abortSignal:O.abortSignal};try{return await this.executor.executeSessionStartHooks(q,S,Q)}catch(Y){return console.error("[HookManager] Error executing SessionStart hooks:",Y),{proceed:!0,warning:`Hook execution failed: ${Y instanceof Error?Y.message:String(Y)}`}}}async executeSessionEndHooks(O,S){if(!this.isEnabled())return{};let q={hook_event_name:"SessionEnd",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:S.projectDir,session_id:S.sessionId,permission_mode:S.permissionMode,reason:O},Q=this.getMatchingHooks("SessionEnd",{});if(Q.length===0)return{};let Y={projectDir:S.projectDir,sessionId:S.sessionId,permissionMode:S.permissionMode,config:this.config,abortSignal:S.abortSignal};try{return await this.executor.executeSessionEndHooks(Q,q,Y),{}}catch(Z){return console.error("[HookManager] Error executing SessionEnd hooks:",Z),{warning:`Hook execution failed: ${Z instanceof Error?Z.message:String(Z)}`}}}async executePostToolUseFailureHooks(O,S,q,Q,Y){if(!this.isEnabled())return{};let Z={hook_event_name:"PostToolUseFailure",hook_execution_id:V(),timestamp:new Date().toISOString(),tool_name:O,tool_use_id:S,tool_input:q,error:Q,error_type:Y.errorType,is_interrupt:Y.isInterrupt,is_timeout:Y.isTimeout,project_dir:Y.projectDir,session_id:Y.sessionId,permission_mode:Y.permissionMode},W=this.getMatchingHooks("PostToolUseFailure",{toolName:O,filePath:this.extractFilePath(q),command:this.extractCommand(O,q)});if(W.length===0)return{};let $={projectDir:Y.projectDir,sessionId:Y.sessionId,permissionMode:Y.permissionMode,config:this.config,abortSignal:Y.abortSignal};try{return await this.executor.executePostToolUseFailureHooks(W,Z,$)}catch(R){return console.error("[HookManager] Error executing PostToolUseFailure hooks:",R),{warning:`Hook execution failed: ${R instanceof Error?R.message:String(R)}`}}}async executeNotificationHooks(O,S,q){if(!this.isEnabled())return{suppress:!1,message:S};let Q={hook_event_name:"Notification",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:q.projectDir,session_id:q.sessionId,permission_mode:q.permissionMode,notification_type:O,title:q.title,message:S},Y=this.getMatchingHooks("Notification",{});if(Y.length===0)return{suppress:!1,message:S};let Z={projectDir:q.projectDir,sessionId:q.sessionId,permissionMode:q.permissionMode,config:this.config,abortSignal:q.abortSignal};try{return await this.executor.executeNotificationHooks(Y,Q,Z)}catch(W){return console.error("[HookManager] Error executing Notification hooks:",W),{suppress:!1,message:S,warning:`Hook execution failed: ${W instanceof Error?W.message:String(W)}`}}}async executeCompactionHooks(O,S){if(!this.isEnabled())return{blockCompaction:!1};let q={hook_event_name:"Compaction",hook_execution_id:V(),timestamp:new Date().toISOString(),project_dir:S.projectDir,session_id:S.sessionId,permission_mode:S.permissionMode,trigger:O,messages_before:S.messagesBefore,tokens_before:S.tokensBefore},Q=this.getMatchingHooks("Compaction",{});if(Q.length===0)return{blockCompaction:!1};let Y={projectDir:S.projectDir,sessionId:S.sessionId,permissionMode:S.permissionMode,config:this.config,abortSignal:S.abortSignal};try{return await this.executor.executeCompactionHooks(Q,q,Y)}catch(Z){return console.error("[HookManager] Error executing Compaction hooks:",Z),{blockCompaction:!1,warning:`Hook execution failed: ${Z instanceof Error?Z.message:String(Z)}`}}}getMatchingHooks(O,S){let q=this.config[O]||[],Q=[];for(let Y of q)if(this.matcher.matches(Y.matcher,S))Q.push(...Y.hooks);return Q}extractFilePath(O){let S=["file_path","path","filePath","source","target"];for(let q of S){let Q=O[q];if(typeof Q==="string")return Q}return}extractCommand(O,S){if(O==="Bash"||O==="BashTool"){let q=S.command;if(typeof q==="string")return q}return}cleanup(){this.guard.cleanupAll()}}
|
|
41
|
-
export{g as
|
|
41
|
+
export{g as ub,l as vb,P as wb};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ua as Q}from"./chunk-rrg9bw8r.js";import{wb as U}from"./chunk-wtxwny0p.js";import{rc as O}from"./chunk-w3me85va.js";import{tc as K,vc as N}from"./chunk-2fbwmdvg.js";function Y(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var A=N("Service");function Z(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class D{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!D.instance)D.instance=new D;return D.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
|
|
2
2
|
再按一次 Ctrl+C 退出
|
|
3
3
|
`)}),this.initialized=!0,A.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup(b){return this.cleanupHandlers.push(b),A.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let q=this.cleanupHandlers.indexOf(b);if(q!==-1)this.cleanupHandlers.splice(q,1),A.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError(b,q){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${b}):`,q);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${b})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",q.message),console.error(""),q.stack)console.error("堆栈跟踪:"),console.error(q.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown(b,1)}async shutdown(b,q=0){if(this.isShuttingDown){A.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,A.info(`[GracefulShutdown] 开始优雅退出 (原因: ${b})`);try{await K()}catch(z){}try{let z=U.getInstance();if(z.isEnabled()){let F=Q(),W=F.session?.sessionId||"unknown",X=F.config?.config?.permissionMode||"default";await z.executeSessionEndHooks(Z(b),{projectDir:O(),sessionId:W,permissionMode:X})}}catch(z){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",z)}let B=5000,V=new Promise((z,F)=>{setTimeout(()=>{F(Error(`清理超时 (${B}ms)`))},B)});try{let z=this.runCleanupHandlers();await Promise.race([z,V])}catch(z){console.error("[GracefulShutdown] 清理过程中发生错误:",z)}finally{Y(),setTimeout(()=>{process.exit(q)},100)}}async runCleanupHandlers(){let b=[...this.cleanupHandlers].reverse();for(let q of b)try{let B=q();if(B instanceof Promise)await B}catch(B){console.error("[GracefulShutdown] 清理函数执行失败:",B)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var J=()=>{return D.getInstance()},H=(b)=>{return J().registerCleanup(b)},P=()=>{J().initialize()},L=(b=0)=>{J().shutdown("normal",b)};
|
|
4
|
-
export{J as
|
|
4
|
+
export{J as ca,H as da,P as ea,L as fa};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import d from"typebox/schema";import o from"typebox/value";class u extends Error{issues;constructor(r){super(r.map((t)=>{return`${t.path.length>0?t.path.join("."):"root"}: ${t.message}`}).join("; "));this.issues=r;this.name="SchemaValidationError"}}function p(r){if(!r)return[];return r.split("/").slice(1).map((t)=>t.replace(/~1/g,"/").replace(/~0/g,"~")).map((t)=>/^(0|[1-9]\d*)$/.test(t)?Number(t):t)}function g(r,t){let n=r;for(let e of t){if(n===null||typeof n!=="object")return;n=n[e]}return n}function i(r,t){let[,n]=d.Errors(r,t);return n.map((e)=>{let s=p(e.instancePath);return{code:e.keyword,path:s,message:e.message,value:g(t,s)}})}function a(r,t){let n=o.Default(r,o.Clone(t)),e=i(r,n);if(e.length>0)return{success:!1,error:new u(e)};let s=o.Clean(r,n),c=i(r,s);if(c.length>0)return{success:!1,error:new u(c)};return{success:!0,data:s}}function f(r,t){let n=a(r,t);if(!n.success)throw n.error;return n.data}import l from"typebox";function x(r){return Object.defineProperties(r,{parse:{value:(t)=>f(r,t),enumerable:!1},safeParse:{value:(t)=>a(r,t),enumerable:!1}}),r}function b(r,t){return l.Optional({...r,default:t})}function V(r,t={}){return l.Unsafe({type:"string",enum:[...r],...t})}
|
|
2
|
-
export{a as
|
|
2
|
+
export{a as xb,f as yb,l as zb,x as Ab,b as Bb,V as Cb};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{l as o,m as a,n as t,o as e}from"./chunk-5jq01mg6.js";import{p as s}from"./chunk-b10vr4xj.js";import{A as T,G as d,H as v,I as u,K as F,L as m}from"./chunk-bfgm5k3e.js";import{V as p}from"./chunk-rmfk5f9m.js";import{X as r,Y as i,Z as n}from"./chunk-mcnfbhpr.js";import{_ as l}from"./chunk-7pevqbfd.js";import"./chunk-z0qxaky4.js";import"./chunk-jyr9417h.js";import"./chunk-aq7wf2zt.js";import"./chunk-rrg9bw8r.js";import"./chunk-9ax02vtg.js";import"./chunk-8vemqfe4.js";import{bb as y}from"./chunk-n9tgxfvw.js";import"./chunk-5nye3k5w.js";import"./chunk-wtxwny0p.js";import{Ab as O,Cb as z,xb as c,zb as q}from"./chunk-x548f12z.js";import"./chunk-1v2n922p.js";import{Eb as k,Fb as g}from"./chunk-fpr6d8zc.js";import"./chunk-8vtznxpq.js";import"./chunk-acegy4td.js";import"./chunk-mpkr3s6b.js";import"./chunk-45bme7n9.js";import"./chunk-enk621t7.js";import"./chunk-936ft6kq.js";import{rc as J}from"./chunk-w3me85va.js";import"./chunk-2fbwmdvg.js";import"./chunk-gdm1xzvp.js";import"./chunk-ppyg431d.js";import Lq from"yargs";import{hideBin as Nq}from"yargs/helpers";var w=1;function K(Y){return q.Object({event_version:q.Literal(w),...Y})}var Bq=K({type:q.Literal("content_delta"),delta:q.String()}),Uq=K({type:q.Literal("thinking_delta"),delta:q.String()}),Vq=K({type:q.Literal("thinking"),content:q.String()}),Dq=K({type:q.Literal("stream_end")}),Kq=K({type:q.Literal("content"),content:q.String()}),E=z(["readonly","write","execute"]),jq=K({type:q.Literal("tool_start"),tool_name:q.String(),summary:q.String(),target:q.Optional(q.String()),tool_kind:q.Optional(E)}),_q=K({type:q.Literal("tool_result"),tool_name:q.String(),summary:q.String(),target:q.Optional(q.String()),tool_kind:q.Optional(E),success:q.Optional(q.Boolean()),error_type:q.Optional(q.String()),error_message:q.Optional(q.String())}),zq=K({type:q.Literal("phase"),phase:z(["turn","searching","inspecting","target_hit","executing","completed"]),status:z(["ongoing","hit","done"]),message:q.String(),turn:q.Optional(q.Number()),tool_name:q.Optional(q.String()),target:q.Optional(q.String())}),Mq=K({type:q.Literal("tool_detail"),tool_name:q.String(),detail:q.String()}),bq=K({type:q.Literal("task_update"),tasks:q.Array(F)}),Aq=K({type:q.Literal("subagent"),state:z(["spawned","completed"]),session_id:q.String(),subagent_type:q.Optional(q.String()),success:q.Optional(q.Boolean()),summary:q.Optional(q.String()),resumed_from:q.Optional(q.String()),root_agent_id:q.Optional(q.String()),resume_depth:q.Optional(q.Integer({minimum:0}))}),Hq=K({type:q.Literal("token_usage"),input_tokens:q.Number(),output_tokens:q.Number(),total_tokens:q.Number(),max_context_tokens:q.Number(),cache_read_tokens:q.Optional(q.Number()),cache_write_tokens:q.Optional(q.Number()),cost_usd:q.Optional(q.Number())}),fq=K({type:q.Literal("compacting"),state:z(["started","completed"])}),Rq=K({type:q.Literal("turn_limit"),turns_count:q.Number(),action:q.Literal("continue")}),xq=K({type:q.Literal("task_session"),session_id:q.String(),project_path:q.String(),source_project_path:q.String(),isolation:z(["local","worktree"]),worktree_branch:q.Optional(q.String()),base_commit:q.Optional(q.String())}),Pq=K({type:q.Literal("task_admission"),state:z(["queued","running"]),queue_position:q.Optional(q.Integer({minimum:1})),queue_depth:q.Integer({minimum:0}),in_flight:q.Integer({minimum:0}),max_concurrent_tasks:q.Integer({minimum:1})}),Iq=K({type:q.Literal("output"),content:q.String(),exit_code:q.Number()}),Jq=K({type:q.Literal("error"),message:q.String()}),uq=O(q.Union([Bq,Uq,Vq,Dq,Kq,jq,_q,zq,Mq,bq,Aq,Hq,fq,Rq,xq,Pq,Iq,Jq]));function C(Y,$){return{event_version:w,type:Y,...$}}function Wq(Y){if(Y?.signal)return{signal:Y.signal,dispose:()=>{return}};let $=new AbortController,G=()=>$.abort("interrupt");return process.once("SIGINT",G),process.once("SIGTERM",G),{signal:$.signal,dispose:()=>{process.removeListener("SIGINT",G),process.removeListener("SIGTERM",G)}}}var Oq=z(["text","jsonl"]),Fq=q.Object({headless:q.Optional(q.Boolean()),message:q.Optional(q.String()),_:q.Optional(q.Array(q.Union([q.String(),q.Number()]))),model:q.Optional(q.String()),systemPrompt:q.Optional(q.String()),appendSystemPrompt:q.Optional(q.String()),maxTurns:q.Optional(q.Refine(q.Integer({maximum:g}),(Y)=>Y===-1||Y>0,()=>"must be -1 or a positive integer")),permissionMode:q.Optional(q.Enum(k)),mcpConfig:q.Optional(q.Array(q.String())),strictMcpConfig:q.Optional(q.Boolean()),sessionId:q.Optional(q.String()),allowedTools:q.Optional(q.Array(q.String())),disallowedTools:q.Optional(q.Array(q.String())),agents:q.Optional(q.String()),continue:q.Optional(q.Boolean()),resume:q.Optional(q.Union([q.String(),q.Boolean()])),forkSession:q.Optional(q.Boolean()),taskIsolation:q.Optional(z(["local","worktree"])),outputFormat:q.Optional(Oq)});class qq{openedThinking=!1;wroteAssistantContent=!1;markAssistantContent(){this.wroteAssistantContent=!0}setThinkingOpened(Y){this.openedThinking=Y}hasOpenThinking(){return this.openedThinking}completeStream(){let Y={openedThinking:this.openedThinking,wroteAssistantContent:this.wroteAssistantContent};return this.openedThinking=!1,this.wroteAssistantContent=!1,Y}}function wq(Y){return Y.issues.map(($)=>`${$.path.join(".")||"options"}: ${$.message}`).join("; ")}function Eq(Y){let $=c(Fq,Y);if(!$.success)throw Error(`Invalid headless options: ${wq($.error)}`);return $.data}function Cq(Y){return Y.command("* [message]","Run full agent loop without Ink UI and print events to the terminal",($)=>$.positional("message",{describe:"Message to process",type:"string"}).option("headless",{type:"boolean",describe:"Run full agent loop without Ink UI and print events to the terminal"}).option("model",{describe:"Model ID for this run",type:"string"}).option("system-prompt",{describe:"Replace the default system prompt",type:"string"}).option("append-system-prompt",{describe:"Append a system prompt to the default system prompt",type:"string"}).option("max-turns",{alias:["maxTurns"],describe:"Maximum conversation turns (-1: unlimited, N>0: limit to N turns)",type:"number"}).option("output-format",{alias:["outputFormat"],choices:["text","jsonl"],describe:"Headless output format",type:"string"}).option("task-isolation",{alias:["taskIsolation"],choices:["local","worktree"],describe:"Dispatch a new durable task in the selected workspace mode",type:"string"}),async($)=>{if(!$.headless)return;let G=await yq($);process.exit(G)})}function j(Y,$=""){Y.write(`${$}
|
|
2
|
+
`)}function hq(Y){return`[task] [${Y.status}] ${Y.subject}`}function Sq(){return{requestConfirmation:async(Y)=>({approved:!0,reason:"headless-auto-approved",scope:"session"})}}function kq(Y){if(!(Y instanceof Error))return"Unknown error";let Q=Y.lastError??Y;if(Q.responseBody)try{let V=JSON.parse(Q.responseBody)?.error?.message;if(V)return Q.statusCode?`${V} (HTTP ${Q.statusCode})`:V}catch{}let Z=Y.message.match(/Last error:\s*(.+)$/);if(Z)return Z[1];return Y.message}function cq(Y){return Y==="jsonl"?"jsonl":"text"}function h(Y,$){let G=(...Q)=>{for(let Z of Q){let D=$[Z];if(typeof D==="string"&&D.trim()!=="")return D}return};switch(Y){case"Read":case"Edit":case"Write":case"UndoEdit":return G("file_path");case"NotebookEdit":return G("notebook_path");case"Grep":return G("path","pattern");case"Glob":return G("pattern");case"WebFetch":return G("url");case"WebSearch":return G("query");case"Bash":return G("command","description");case"Task":return G("description");case"LSP":return G("filePath","operation");case"EnterWorktree":return G("name");case"ExitWorktree":return G("action");default:return}}function gq(Y,$,G,Q){let Z=new Set(["Glob","Grep","WebSearch","LS"]),D=new Set(["Read","WebFetch"]);if(new Set(["Edit","Write","NotebookEdit","Bash","LSP","UndoEdit","EnterWorktree","ExitWorktree"]).has(Y)&&!Q.targetLocked)return{phase:"target_hit",status:"hit",message:`Target locked: ${$}`,shouldLockTarget:!0};if(Q.targetLocked)return{phase:"executing",status:"hit",message:G?`Working within target: ${$}`:`Executing: ${$}`,shouldLockTarget:!1};if(Z.has(Y))return{phase:"searching",status:"ongoing",message:`Still searching: ${$}`,shouldLockTarget:!1};if(D.has(Y))return{phase:"inspecting",status:"ongoing",message:`Inspecting candidate: ${$}`,shouldLockTarget:!1};return{phase:"executing",status:Q.targetLocked?"hit":"ongoing",message:`Executing: ${$}`,shouldLockTarget:!1}}function S(Y,$){let G=(Q,Z)=>{Y.stdout.write(`${JSON.stringify(C(Q,Z))}
|
|
3
|
+
`)};return{contentDelta(Q){if($==="jsonl"){G("content_delta",{delta:Q});return}Y.stdout.write(Q)},thinkingDelta(Q,Z){if($==="jsonl")return G("thinking_delta",{delta:Q}),Z;if(!Z)Y.stderr.write("[thinking] ");return Y.stderr.write(Q),!0},thinking(Q){if($==="jsonl"){G("thinking",{content:Q});return}j(Y.stderr,`[thinking] ${Q}`)},streamEnd(Q,Z){if($==="jsonl"){G("stream_end",{});return}if(Z)Y.stderr.write(`
|
|
4
|
+
`);if(Q)Y.stdout.write(`
|
|
5
|
+
`)},content(Q){if($==="jsonl"){G("content",{content:Q});return}j(Y.stdout,Q)},toolStart(Q,Z,D,V){if($==="jsonl"){G("tool_start",{tool_name:Q,summary:Z,target:D,tool_kind:V});return}j(Y.stderr,`[tool:start] ${Z}`)},toolResult(Q,Z,D,V,M){if($==="jsonl"){G("tool_result",{tool_name:Q,summary:Z,target:D,tool_kind:V,success:M?.success,error_type:M?.errorType,error_message:M?.errorMessage});return}j(Y.stderr,`[tool:result] ${Z}`)},phase(Q,Z,D,V={}){if($==="jsonl"){G("phase",{phase:Q,status:Z,message:D,turn:V.turn,tool_name:V.toolName,target:V.target});return}j(Y.stderr,`[phase:${Q}] ${D}`)},toolDetail(Q,Z){if($==="jsonl"){G("tool_detail",{tool_name:Q,detail:Z});return}j(Y.stderr,Z)},taskUpdate(Q){if($==="jsonl"){G("task_update",{tasks:Q});return}for(let Z of Q)j(Y.stderr,hq(Z))},subagent(Q){let Z=Q.kind==="subagent_spawned";if($==="jsonl"){G("subagent",{state:Z?"spawned":"completed",session_id:Q.sessionId,subagent_type:Z?Q.type:void 0,success:Z?void 0:Q.success,summary:Z?void 0:Q.summary,resumed_from:Q.resumedFrom,root_agent_id:Q.rootAgentId,resume_depth:Q.resumeDepth});return}j(Y.stderr,`[subagent:${Z?"spawned":"completed"}] ${Q.sessionId}${Q.resumedFrom?` resumed from ${Q.resumedFrom}`:""}`)},tokenUsage(Q){if($==="jsonl"){G("token_usage",{input_tokens:Q.inputTokens,output_tokens:Q.outputTokens,total_tokens:Q.totalTokens,max_context_tokens:Q.maxContextTokens,cache_read_tokens:Q.cacheReadTokens,cache_write_tokens:Q.cacheWriteTokens,cost_usd:Q.costUsd});return}j(Y.stderr,`[tokens] in=${Q.inputTokens} out=${Q.outputTokens} total=${Q.totalTokens} / ${Q.maxContextTokens}`)},compacting(Q){if($==="jsonl"){G("compacting",{state:Q?"started":"completed"});return}j(Y.stderr,Q?"[context] compacting started":"[context] compacting completed")},turnLimit(Q){if($==="jsonl"){G("turn_limit",{turns_count:Q,action:"continue"});return}j(Y.stderr,`[turn-limit] continuing after ${Q} turns`)},taskSession(Q){if($==="jsonl"){G("task_session",{session_id:Q.sessionId,project_path:Q.projectPath,source_project_path:Q.sourceProjectPath,isolation:Q.isolation,worktree_branch:Q.worktreeBranch,base_commit:Q.baseCommit});return}j(Y.stderr,`[task:${Q.isolation}] ${Q.sessionId} ${Q.sourceProjectPath} -> ${Q.projectPath}${Q.worktreeBranch?` (${Q.worktreeBranch})`:""}`)},taskAdmission(Q){if($==="jsonl"){G("task_admission",{state:Q.state,queue_position:Q.queuePosition,queue_depth:Q.queueDepth,in_flight:Q.inFlight,max_concurrent_tasks:Q.maxConcurrentTasks});return}j(Y.stderr,Q.state==="queued"?`[task:queued] position ${Q.queuePosition??1}/${Q.queueDepth} (running ${Q.inFlight}/${Q.maxConcurrentTasks})`:`[task:running] admitted (running ${Q.inFlight}/${Q.maxConcurrentTasks})`)},output(Q,Z=0){if($==="jsonl"){G("output",{content:Q,exit_code:Z});return}j(Z===0?Y.stdout:Y.stderr,Q)},error(Q){if($==="jsonl"){G("error",{message:Q});return}j(Y.stderr,Q)}}}async function yq(Y,$={stdout:process.stdout,stderr:process.stderr},G){let Q="text",Z=S($,Q),D=new qq,V={targetLocked:!1},M,R,L=Wq(G);try{let B=Eq(Y);Q=cq(B.outputFormat),Z=S($,Q),await o();let Qq=await a(B),b=await t(Qq);if(b.mode==="output"){if(b.content)Z.output(b.content,b.exitCode??0);return b.exitCode??0}let W=B.permissionMode??"yolo";if(B.taskIsolation&&(B.continue||B.resume||B.forkSession))throw Error("--task-isolation cannot be combined with --continue, --resume, or --fork-session");let{sessionId:A,messages:Yq}=await e({sessionId:B.sessionId,continue:B.continue,resume:B.resume,forkSession:B.forkSession,fallbackSessionPrefix:"headless"}),_=B.taskIsolation?await s.createSessionTask({sessionId:A,prompt:b.content,sourceProjectPath:J(),isolation:B.taskIsolation}):void 0,P=_?.metadata.projectPath??J();if(_)Z.taskSession({sessionId:A,projectPath:P,sourceProjectPath:_.metadata.taskSourceProjectPath??J(),isolation:B.taskIsolation,worktreeBranch:_.metadata.taskWorktreeBranch,baseCommit:_.metadata.taskBaseCommit}),R=T.subscribe((X)=>{if(X.type!=="task.status"||X.sessionId!==A||X.projectPath!==P||!["queued","running"].includes(String(X.properties.taskStatus))||typeof X.properties.taskQueueDepth!=="number"||typeof X.properties.taskInFlight!=="number"||typeof X.properties.taskConcurrencyLimit!=="number")return;Z.taskAdmission({state:X.properties.taskStatus,queuePosition:typeof X.properties.taskQueuePosition==="number"?X.properties.taskQueuePosition:void 0,queueDepth:X.properties.taskQueueDepth,inFlight:X.properties.taskInFlight,maxConcurrentTasks:X.properties.taskConcurrencyLimit})});let Zq={messages:[...Yq],userId:"cli-user",sessionId:A,workspaceRoot:P,permissionMode:W,signal:L.signal,..._?.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:Sq()};M=await d.create({sessionId:A,workspaceRoot:P,modelId:B.model,mcpConfig:B.mcpConfig,strictMcpConfig:B.strictMcpConfig,agents:B.agents?l(B.agents):void 0,..._?.taskWorktree?{taskWorktree:_.taskWorktree}:{},..._?.metadata.taskIsolation?{taskIsolation:_.metadata.taskIsolation}:{}});let $q=B.maxTurns??M.getConfig().maxTurns,Gq=_?.taskWorktree?[...new Set([...B.disallowedTools??[],"EnterWorktree","ExitWorktree"])]:B.disallowedTools,Xq=await m.createWithRuntime(M,{sessionId:A,systemPrompt:B.systemPrompt,appendSystemPrompt:B.appendSystemPrompt,maxTurns:B.maxTurns,modelId:B.model,permissionMode:W,toolWhitelist:B.allowedTools,toolBlacklist:Gq,mcpConfig:B.mcpConfig,strictMcpConfig:B.strictMcpConfig}),N=await y(Xq.chatStream(b.content,Zq,{stream:!0,signal:L.signal,maxTurns:B.maxTurns,...$q===-1?{onTurnLimitReached:async(X)=>{return Z.turnLimit(X.turnsCount),{continue:!0,reason:"headless-auto-continue"}}}:{}}),async(X)=>{switch(X.kind){case"content_delta":D.markAssistantContent(),Z.contentDelta(X.delta);break;case"thinking_delta":D.setThinkingOpened(Z.thinkingDelta(X.delta,D.hasOpenThinking()));break;case"stream_end":{let U=D.completeStream();Z.streamEnd(U.wroteAssistantContent,U.openedThinking);break}case"tool_start":{let U=X.toolCall;if(!("function"in U))break;if(["TaskCreate","TaskUpdate","TaskList"].includes(U.function.name))break;try{let H=JSON.parse(U.function.arguments),f=v(U.function.name,H),x=h(U.function.name,H),I=gq(U.function.name,f,x,V);if(I.shouldLockTarget)V.targetLocked=!0;Z.phase(I.phase,I.status,I.message,{toolName:U.function.name,target:x}),Z.toolStart(U.function.name,f,x,X.toolKind)}catch{Z.phase(V.targetLocked?"executing":"searching",V.targetLocked?"hit":"ongoing",V.targetLocked?`Working within target: ${U.function.name}`:`Still searching: ${U.function.name}`,{toolName:U.function.name}),Z.toolStart(U.function.name,U.function.name,void 0,X.toolKind)}break}case"tool_result":{let U=X.toolCall;if(!("function"in U))break;let H;try{let x=JSON.parse(U.function.arguments);H=h(U.function.name,x)}catch{H=void 0}let f=u(U.function.name,X.result);if(Z.toolResult(U.function.name,f.summary,H,void 0,{success:X.result.success,errorType:X.result.error?.type,errorMessage:X.result.error?.message}),f.detail)Z.toolDetail(U.function.name,f.detail);break}case"token_usage":Z.tokenUsage(X.usage);break;case"compaction":Z.compacting(X.phase==="start");break;case"task_update":Z.taskUpdate(X.tasks);break;case"steering_applied":case"follow_up_started":case"goal_updated":case"goal_continuation_started":break;case"subagent_spawned":case"subagent_completed":Z.subagent(X);break;case"model_fallback":break;case"turn_start":if(X.turn===1)V.targetLocked=!1;Z.phase("turn",V.targetLocked?"hit":"ongoing",`Turn ${X.turn} started`,{turn:X.turn});break;default:{let U=X}}});if(N.metadata?.outputTruncated)Z.error("[warning] 输出因达到 token 上限被截断,部分内容可能不完整。");if(!N.success)return Z.error(`Error: ${N.error?.message??"Agent execution failed"}`),1;return Z.phase("completed","done","Headless run completed"),0}catch(B){if(D.hasOpenThinking()&&Q==="text")$.stderr.write(`
|
|
6
|
+
`);return Z.error(`Error: ${kq(B)}`),1}finally{R?.();try{await M?.dispose()}finally{L.dispose()}}}async function UQ(){if(!process.argv.slice(2).includes("--headless"))return!1;let{headless:G,"output-format":Q,"system-prompt":Z,"append-system-prompt":D,"max-turns":V,...M}=p,R=Lq(Nq(process.argv)).scriptName("blade").strict(!1).options(M).middleware([i,r,n]);return Cq(R),await R.parse(),!0}export{yq as runHeadless,UQ as handleHeadlessMode,Fq as HeadlessOptionsSchema};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
function v(b){switch(b){case"default":case"ignore":case void 0:return"default";case"acceptEdits":return"autoEdit";case"dontAsk":case"bypassPermissions":return"yolo";case"plan":return"plan";default:return"default"}}
|
|
2
|
-
export{v as
|
|
2
|
+
export{v as $};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as ye}from"./vendor-markdown-b9iCqZWK.js";import{r as d,j as e}from"./vendor-react-FPIC4Czm.js";import{c as D,u as _e,e as _,s as z,f as Ie,B as qe,g as fe}from"./index-BC0ssrep.js";import{n as Pe,L as ke,o as ve,p as Ee}from"./vendor-radix-DyP_DOwV.js";import{u as ze}from"./SettingsStore-CjvkbtuZ.js";import{X as We,b as ue,d as xe,a as je,I as Ge,J as Oe}from"./vendor-icons-DBM55KTG.js";import"./vendor-monaco-w6PwaWGP.js";const Je=Pe,we=d.forwardRef(({className:t,...n},a)=>e.jsx(ke,{ref:a,className:D("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...n}));we.displayName=ke.displayName;const W=d.forwardRef(({className:t,...n},a)=>e.jsx(ve,{ref:a,className:D("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",t),...n}));W.displayName=ve.displayName;const G=d.forwardRef(({className:t,...n},a)=>e.jsx(Ee,{ref:a,className:D("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...n}));G.displayName=Ee.displayName;const Ve={"ayu-dark":{background:{primary:"#0f1419",secondary:"#14191f"},text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773"},border:{light:"#2d323b"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},dracula:{background:{primary:"#282a36",secondary:"#44475a"},text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4"},border:{light:"#44475a"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},monokai:{background:{primary:"#272822",secondary:"#3e3d32"},text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e"},border:{light:"#3e3d32"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},nord:{background:{primary:"#2e3440",secondary:"#3b4252"},text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a"},border:{light:"#434c5e"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},"solarized-light":{background:{primary:"#fdf6e3",secondary:"#eee8d5"},text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1"},border:{light:"#eee8d5"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},"solarized-dark":{background:{primary:"#002b36",secondary:"#073642"},text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75"},border:{light:"#073642"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},"tokyo-night":{background:{primary:"#1a1b26",secondary:"#292e42"},text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89"},border:{light:"#292e42"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},github:{background:{primary:"#ffffff",secondary:"#f6f8fa"},text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781"},border:{light:"#d0d7de"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},gruvbox:{background:{primary:"#282828",secondary:"#3c3836"},text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374"},border:{light:"#3c3836"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#b8bb26",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#fabd2f",default:"#ebdbb2"}},"one-dark":{background:{primary:"#282c34",secondary:"#21252b"},text:{primary:"#abb2bf",secondary:"#e5c07b",muted:"#5c6370"},border:{light:"#3e4451"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},catppuccin:{background:{primary:"#1e1e2e",secondary:"#313244"},text:{primary:"#cdd6f4",secondary:"#f5e0dc",muted:"#6c7086"},border:{light:"#313244"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#f5e0dc",operator:"#89dceb",type:"#f9e2af",tag:"#f38ba8",attr:"#f9e2af",default:"#cdd6f4"}},"rose-pine":{background:{primary:"#191724",secondary:"#1f1d2e"},text:{primary:"#e0def4",secondary:"#908caa",muted:"#6e6a86"},border:{light:"#26233a"},syntax:{comment:"#6e6a86",string:"#f6c177",number:"#ebbcba",keyword:"#c4a7e7",function:"#9ccfd8",variable:"#e0def4",operator:"#31748f",type:"#eb6f92",tag:"#eb6f92",attr:"#c4a7e7",default:"#e0def4"}},kanagawa:{background:{primary:"#1f1f28",secondary:"#2a2a37"},text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169"},border:{light:"#2a2a37"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#e46876",attr:"#ffa066",default:"#dcd7ba"}}};function He(t){const n=t.replace("#",""),a=parseInt(n.substring(0,2),16),s=parseInt(n.substring(2,4),16),o=parseInt(n.substring(4,6),16);return(.299*a+.587*s+.114*o)/255<.5}function Ke(t){return{base:He(t.background.primary)?"vs-dark":"vs",inherit:!0,rules:[{token:"",foreground:t.text.primary.replace("#",""),background:t.background.primary.replace("#","")},{token:"comment",foreground:t.syntax.comment.replace("#",""),fontStyle:"italic"},{token:"string",foreground:t.syntax.string.replace("#","")},{token:"number",foreground:t.syntax.number.replace("#","")},{token:"keyword",foreground:t.syntax.keyword.replace("#","")},{token:"type",foreground:t.syntax.type.replace("#","")},{token:"identifier",foreground:t.syntax.variable.replace("#","")},{token:"function",foreground:t.syntax.function.replace("#","")},{token:"variable",foreground:t.syntax.variable.replace("#","")},{token:"operator",foreground:t.syntax.operator.replace("#","")},{token:"delimiter",foreground:t.syntax.operator.replace("#","")},{token:"tag",foreground:t.syntax.tag.replace("#","")},{token:"attribute.name",foreground:t.syntax.attr.replace("#","")},{token:"attribute.value",foreground:t.syntax.string.replace("#","")}],colors:{"editor.background":t.background.primary,"editor.foreground":t.text.primary,"editor.lineHighlightBackground":t.background.secondary,"editor.selectionBackground":`${t.syntax.function}40`,"editorLineNumber.foreground":t.text.muted,"editorLineNumber.activeForeground":t.text.secondary,"editorCursor.foreground":t.text.primary,"editorIndentGuide.background":t.border.light,"editorWidget.background":t.background.secondary,"editorWidget.border":t.border.light,"scrollbarSlider.background":`${t.text.muted}40`,"scrollbarSlider.hoverBackground":`${t.text.muted}60`}}}const me=new Set;function pe(t,n){const a=n.toLowerCase().replace(/\s+/g,"-"),s=Ve[a];if(!s)return"vs-dark";if(!me.has(a)){const o=Ke(s);t.editor.defineTheme(a,o),me.add(a)}return a}d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).DiffEditor}));const Ue=d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).Editor}));function te(t,n){return t instanceof Error?t.message:n}function dt(){const{toggleFilePreview:t}=_e(),{messages:n,currentSessionRef:a,sessions:s}=_(),[o,f]=d.useState("diff"),[c,i]=d.useState([]),[p,b]=d.useState({}),[x,y]=d.useState(!1),[m,R]=d.useState(null),[w,N]=d.useState({}),[O,J]=d.useState({}),[E,ae]=d.useState(null),[Fe,V]=d.useState(""),[H,K]=d.useState(!1),[U,X]=d.useState(null),[re,M]=d.useState(!1),ne=d.useRef(a),T=d.useRef(0),I=d.useRef(0),q=d.useRef({}),Q=d.useRef(0),F=d.useRef(0),A=d.useRef({}),C=d.useRef({}),Y=d.useRef(null);d.useLayoutEffect(()=>{z(ne.current,a)||(T.current+=1),ne.current=a},[a]);const Z=(r,l)=>l===T.current&&z(_.getState().currentSessionRef,r),se=async(r,l="")=>{const g=l?`/suggestions/files/tree?path=${encodeURIComponent(l)}`:"/suggestions/files/tree",u=await fetch(g,{headers:fe(r)});if(!u.ok)throw new Error("Failed to load tree");return(await u.json()).map(h=>({...h,children:h.type==="dir"?[]:void 0}))};d.useEffect(()=>{const r=++I.current;return(async()=>{if(!a){i([]),y(!1),R(null);return}const g={...a},u=T.current,k=()=>r===I.current&&Z(g,u);if(k()){i([]),y(!0),R(null);try{const h=await se(g);k()&&i(h)}catch(h){k()&&R(te(h,"Failed to load tree"))}finally{k()&&y(!1)}}})(),()=>{I.current===r&&(I.current+=1)}},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]),d.useEffect(()=>{Y.current=null,A.current={},C.current={},q.current={},Q.current+=1,ae(null),V(""),K(!1),X(null),M(!1),N({}),b({})},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]);const v=d.useMemo(()=>s.find(r=>z({sessionId:r.sessionId,projectPath:r.projectPath},a)),[a,s]),Ce=d.useMemo(()=>Qe(n),[n]),[Se,oe]=d.useState(null),[Be,ee]=d.useState(!1),[ie,de]=d.useState(null),S=Se??Ce,ce=d.useMemo(()=>Me(n),[n]),[Le,De]=d.useState({});d.useEffect(()=>{const r=++F.current;if(oe(null),de(null),ee(!1),!a||(v==null?void 0:v.taskIsolation)!=="worktree"||!v.taskDiffStat||v.taskDiffStat.changedFiles===0)return;const l={...a};return ee(!0),Ie.getTaskDiff(l).then(g=>{r!==F.current||!z(_.getState().currentSessionRef,l)||oe(g.files.map(u=>({filePath:u.path,diff:{patch:u.patch},summary:u.binary?"binary":`+${u.additions} -${u.deletions}${u.truncated?" (truncated)":""}`})))}).catch(g=>{r===F.current&&de(te(g,"Failed to load task diff"))}).finally(()=>{r===F.current&&ee(!1)}),()=>{F.current===r&&(F.current+=1)}},[v==null?void 0:v.taskCompletedAt,v==null?void 0:v.taskDiffStat,v==null?void 0:v.taskIsolation,a]);const Re=r=>{De(l=>({...l,[r]:!l[r]}))},Te=async r=>{const l=_.getState().currentSessionRef;if(!l)return;const g=T.current,u=++Q.current,k=()=>u===Q.current&&Y.current===r&&Z(l,g);Y.current=r,ae(r),V(""),K(!0),X(null),M(!1);try{const h=await fetch(`/suggestions/files/content?path=${encodeURIComponent(r)}`,{headers:fe(l)});if(!h.ok)throw new Error("Failed to load file");const $=await h.json();k()&&(V($.content||""),M(!!$.truncated))}catch(h){k()&&X(te(h,"Failed to load file"))}finally{k()&&K(!1)}},Ae=async r=>{const l=(q.current[r]??0)+1;q.current[r]=l;const g=!A.current[r],u={...A.current,[r]:g};if(A.current=u,N(u),!g||C.current[r])return;const k=_.getState().currentSessionRef;if(!k)return;const h=T.current,$=()=>q.current[r]===l&&A.current[r]===!0&&Z(k,h);try{const P=await se(k,r);if($()){const le={...C.current,[r]:P};C.current=le,b(le)}}catch{if($()){const P={...C.current,[r]:[]};C.current=P,b(P)}}},$e=r=>{J(l=>({...l,[r]:!l[r]}))};return e.jsxs("div",{className:"w-[55%] min-w-[420px] max-w-[860px] border-l border-[#E5E7EB] dark:border-zinc-800 bg-white dark:bg-[#09090b] flex flex-col h-full shadow-xl shrink-0",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 h-12 border-b border-[#E5E7EB] dark:border-zinc-800 shrink-0",children:[e.jsx("span",{className:"font-normal text-[13px] text-[#6B7280] dark:text-zinc-400 font-mono",children:"Preview"}),e.jsx(qe,{variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-zinc-500 dark:hover:text-zinc-300 dark:hover:bg-zinc-800/50",children:e.jsx(We,{className:"w-4 h-4"})})]}),e.jsxs(Je,{value:o,onValueChange:r=>f(r),className:"flex flex-col flex-1 min-h-0",children:[e.jsx("div",{className:"px-4 py-3 border-b border-[#E5E7EB] dark:border-zinc-800",children:e.jsxs(we,{className:"bg-white dark:bg-[#111113] border border-[#E5E7EB] dark:border-[#27272a] h-9 p-1 rounded-md w-full justify-start",children:[e.jsx(W,{value:"diff",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Diff"}),e.jsx(W,{value:"files",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Files"}),e.jsx(W,{value:"logs",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Logs"})]})}),e.jsx(G,{value:"diff",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:Be&&S.length===0?e.jsx(j,{title:"Loading task diff…",subtitle:"Reading the durable worktree artifact."}):ie&&S.length===0?e.jsx(j,{title:"Failed to load task diff",subtitle:ie}):S.length===0?e.jsx(j,{title:"No patch yet",subtitle:"Run a tool that changes files to see diffs here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mb-2",children:[S.length," changed file",S.length>1?"s":""]}),S.map(r=>{var u;const l=((u=r.filePath)==null?void 0:u.split("/").pop())||"unknown",g=Le[r.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>Re(r.filePath||""),className:"w-full flex items-center gap-2 px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:[g?e.jsx(ue,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(xe,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(je,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono flex-1 text-left truncate",children:l}),r.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:r.summary})]}),g&&e.jsxs("div",{className:"border-t border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("div",{className:"px-3 py-1 text-[11px] text-[#9CA3AF] dark:text-[#52525b] font-mono truncate",children:r.filePath}),e.jsx(et,{diff:r.diff})]})]},r.filePath)})]})})}),e.jsx(G,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(j,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&m&&e.jsx(j,{title:"Failed to load files",subtitle:m}),!x&&!m&&c.length===0&&e.jsx(j,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!m&&c.length>0&&e.jsxs("div",{className:"h-full grid grid-cols-[220px_1fr] gap-4 min-h-0",children:[e.jsx("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-2 overflow-y-auto min-h-0",children:c.map(r=>e.jsx(Ne,{node:r,depth:0,expandedDirs:w,childrenCache:p,toggleDir:Ae,selectedPath:E,onSelectFile:Te},r.path))}),e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden flex flex-col min-h-0",children:[e.jsxs("div",{className:"px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono flex items-center justify-between",children:[e.jsx("span",{children:E||"Select a file to preview"}),E&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:H?"Loading…":re?"Truncated":"Ready"})]}),re&&!H&&e.jsx("div",{className:"px-3 py-2 bg-[#FEF3C7] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[11px] text-[#b45309] dark:text-[#facc15] font-mono",children:"Preview truncated to 200k characters."}),e.jsxs("div",{className:"flex-1 min-h-0",children:[!E&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Pick a file from the tree to preview."}),E&&U&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:U}),E&&!U&&e.jsx("div",{className:"h-full",children:H?e.jsx(he,{}):e.jsx(d.Suspense,{fallback:e.jsx(he,{}),children:e.jsx(Ye,{content:Fe,filename:E})})})]})]})]})]})}),e.jsx(G,{value:"logs",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:ce.length===0?e.jsx(j,{title:"No logs yet",subtitle:"Tool runs will appear here."}):ce.map(r=>{var h;const l=O[r.id],g=(r.content||"").split(`
|
|
1
|
+
import{_ as ye}from"./vendor-markdown-b9iCqZWK.js";import{r as d,j as e}from"./vendor-react-FPIC4Czm.js";import{c as D,u as _e,e as _,s as z,f as Ie,B as qe,g as fe}from"./index-DIWzaS2_.js";import{n as Pe,L as ke,o as ve,p as Ee}from"./vendor-radix-DyP_DOwV.js";import{u as ze}from"./SettingsStore-C8YBWQPS.js";import{X as We,b as ue,d as xe,a as je,I as Ge,J as Oe}from"./vendor-icons-DBM55KTG.js";import"./vendor-monaco-w6PwaWGP.js";const Je=Pe,we=d.forwardRef(({className:t,...n},a)=>e.jsx(ke,{ref:a,className:D("inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",t),...n}));we.displayName=ke.displayName;const W=d.forwardRef(({className:t,...n},a)=>e.jsx(ve,{ref:a,className:D("inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",t),...n}));W.displayName=ve.displayName;const G=d.forwardRef(({className:t,...n},a)=>e.jsx(Ee,{ref:a,className:D("mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",t),...n}));G.displayName=Ee.displayName;const Ve={"ayu-dark":{background:{primary:"#0f1419",secondary:"#14191f"},text:{primary:"#e6e1cf",secondary:"#bae67e",muted:"#5c6773"},border:{light:"#2d323b"},syntax:{comment:"#5c6773",string:"#bae67e",number:"#ffcc66",keyword:"#ff8f40",function:"#73d0ff",variable:"#e6e1cf",operator:"#f29e74",type:"#73d0ff",tag:"#ff8f40",attr:"#ffd580",default:"#e6e1cf"}},dracula:{background:{primary:"#282a36",secondary:"#44475a"},text:{primary:"#f8f8f2",secondary:"#f1fa8c",muted:"#6272a4"},border:{light:"#44475a"},syntax:{comment:"#6272a4",string:"#f1fa8c",number:"#bd93f9",keyword:"#ff79c6",function:"#50fa7b",variable:"#f8f8f2",operator:"#ff79c6",type:"#8be9fd",tag:"#ff79c6",attr:"#50fa7b",default:"#f8f8f2"}},monokai:{background:{primary:"#272822",secondary:"#3e3d32"},text:{primary:"#f8f8f2",secondary:"#e6db74",muted:"#75715e"},border:{light:"#3e3d32"},syntax:{comment:"#75715e",string:"#e6db74",number:"#ae81ff",keyword:"#f92672",function:"#a6e22e",variable:"#f8f8f2",operator:"#f92672",type:"#66d9ef",tag:"#f92672",attr:"#a6e22e",default:"#f8f8f2"}},nord:{background:{primary:"#2e3440",secondary:"#3b4252"},text:{primary:"#eceff4",secondary:"#d8dee9",muted:"#4c566a"},border:{light:"#434c5e"},syntax:{comment:"#616e88",string:"#a3be8c",number:"#b48ead",keyword:"#81a1c1",function:"#88c0d0",variable:"#d8dee9",operator:"#81a1c1",type:"#8fbcbb",tag:"#81a1c1",attr:"#8fbcbb",default:"#eceff4"}},"solarized-light":{background:{primary:"#fdf6e3",secondary:"#eee8d5"},text:{primary:"#586e75",secondary:"#657b83",muted:"#93a1a1"},border:{light:"#eee8d5"},syntax:{comment:"#93a1a1",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#657b83",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#657b83"}},"solarized-dark":{background:{primary:"#002b36",secondary:"#073642"},text:{primary:"#839496",secondary:"#93a1a1",muted:"#586e75"},border:{light:"#073642"},syntax:{comment:"#586e75",string:"#2aa198",number:"#d33682",keyword:"#859900",function:"#268bd2",variable:"#839496",operator:"#859900",type:"#b58900",tag:"#268bd2",attr:"#93a1a1",default:"#839496"}},"tokyo-night":{background:{primary:"#1a1b26",secondary:"#292e42"},text:{primary:"#a9b1d6",secondary:"#c0caf5",muted:"#565f89"},border:{light:"#292e42"},syntax:{comment:"#565f89",string:"#9ece6a",number:"#ff9e64",keyword:"#bb9af7",function:"#7aa2f7",variable:"#c0caf5",operator:"#89ddff",type:"#7dcfff",tag:"#f7768e",attr:"#7aa2f7",default:"#a9b1d6"}},github:{background:{primary:"#ffffff",secondary:"#f6f8fa"},text:{primary:"#24292f",secondary:"#57606a",muted:"#6e7781"},border:{light:"#d0d7de"},syntax:{comment:"#6e7781",string:"#0a3069",number:"#0550ae",keyword:"#cf222e",function:"#8250df",variable:"#24292f",operator:"#cf222e",type:"#0550ae",tag:"#116329",attr:"#0550ae",default:"#24292f"}},gruvbox:{background:{primary:"#282828",secondary:"#3c3836"},text:{primary:"#ebdbb2",secondary:"#d5c4a1",muted:"#928374"},border:{light:"#3c3836"},syntax:{comment:"#928374",string:"#b8bb26",number:"#d3869b",keyword:"#fb4934",function:"#b8bb26",variable:"#ebdbb2",operator:"#fe8019",type:"#fabd2f",tag:"#fb4934",attr:"#fabd2f",default:"#ebdbb2"}},"one-dark":{background:{primary:"#282c34",secondary:"#21252b"},text:{primary:"#abb2bf",secondary:"#e5c07b",muted:"#5c6370"},border:{light:"#3e4451"},syntax:{comment:"#5c6370",string:"#98c379",number:"#d19a66",keyword:"#c678dd",function:"#61afef",variable:"#e06c75",operator:"#56b6c2",type:"#e5c07b",tag:"#e06c75",attr:"#d19a66",default:"#abb2bf"}},catppuccin:{background:{primary:"#1e1e2e",secondary:"#313244"},text:{primary:"#cdd6f4",secondary:"#f5e0dc",muted:"#6c7086"},border:{light:"#313244"},syntax:{comment:"#6c7086",string:"#a6e3a1",number:"#fab387",keyword:"#cba6f7",function:"#89b4fa",variable:"#f5e0dc",operator:"#89dceb",type:"#f9e2af",tag:"#f38ba8",attr:"#f9e2af",default:"#cdd6f4"}},"rose-pine":{background:{primary:"#191724",secondary:"#1f1d2e"},text:{primary:"#e0def4",secondary:"#908caa",muted:"#6e6a86"},border:{light:"#26233a"},syntax:{comment:"#6e6a86",string:"#f6c177",number:"#ebbcba",keyword:"#c4a7e7",function:"#9ccfd8",variable:"#e0def4",operator:"#31748f",type:"#eb6f92",tag:"#eb6f92",attr:"#c4a7e7",default:"#e0def4"}},kanagawa:{background:{primary:"#1f1f28",secondary:"#2a2a37"},text:{primary:"#dcd7ba",secondary:"#c8c093",muted:"#727169"},border:{light:"#2a2a37"},syntax:{comment:"#727169",string:"#98bb6c",number:"#d27e99",keyword:"#957fb8",function:"#7e9cd8",variable:"#dcd7ba",operator:"#c0a36e",type:"#7aa89f",tag:"#e46876",attr:"#ffa066",default:"#dcd7ba"}}};function He(t){const n=t.replace("#",""),a=parseInt(n.substring(0,2),16),s=parseInt(n.substring(2,4),16),o=parseInt(n.substring(4,6),16);return(.299*a+.587*s+.114*o)/255<.5}function Ke(t){return{base:He(t.background.primary)?"vs-dark":"vs",inherit:!0,rules:[{token:"",foreground:t.text.primary.replace("#",""),background:t.background.primary.replace("#","")},{token:"comment",foreground:t.syntax.comment.replace("#",""),fontStyle:"italic"},{token:"string",foreground:t.syntax.string.replace("#","")},{token:"number",foreground:t.syntax.number.replace("#","")},{token:"keyword",foreground:t.syntax.keyword.replace("#","")},{token:"type",foreground:t.syntax.type.replace("#","")},{token:"identifier",foreground:t.syntax.variable.replace("#","")},{token:"function",foreground:t.syntax.function.replace("#","")},{token:"variable",foreground:t.syntax.variable.replace("#","")},{token:"operator",foreground:t.syntax.operator.replace("#","")},{token:"delimiter",foreground:t.syntax.operator.replace("#","")},{token:"tag",foreground:t.syntax.tag.replace("#","")},{token:"attribute.name",foreground:t.syntax.attr.replace("#","")},{token:"attribute.value",foreground:t.syntax.string.replace("#","")}],colors:{"editor.background":t.background.primary,"editor.foreground":t.text.primary,"editor.lineHighlightBackground":t.background.secondary,"editor.selectionBackground":`${t.syntax.function}40`,"editorLineNumber.foreground":t.text.muted,"editorLineNumber.activeForeground":t.text.secondary,"editorCursor.foreground":t.text.primary,"editorIndentGuide.background":t.border.light,"editorWidget.background":t.background.secondary,"editorWidget.border":t.border.light,"scrollbarSlider.background":`${t.text.muted}40`,"scrollbarSlider.hoverBackground":`${t.text.muted}60`}}}const me=new Set;function pe(t,n){const a=n.toLowerCase().replace(/\s+/g,"-"),s=Ve[a];if(!s)return"vs-dark";if(!me.has(a)){const o=Ke(s);t.editor.defineTheme(a,o),me.add(a)}return a}d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).DiffEditor}));const Ue=d.lazy(async()=>({default:(await ye(()=>import("./vendor-react-FPIC4Czm.js").then(n=>n.i),[])).Editor}));function te(t,n){return t instanceof Error?t.message:n}function dt(){const{toggleFilePreview:t}=_e(),{messages:n,currentSessionRef:a,sessions:s}=_(),[o,f]=d.useState("diff"),[c,i]=d.useState([]),[p,b]=d.useState({}),[x,y]=d.useState(!1),[m,R]=d.useState(null),[w,N]=d.useState({}),[O,J]=d.useState({}),[E,ae]=d.useState(null),[Fe,V]=d.useState(""),[H,K]=d.useState(!1),[U,X]=d.useState(null),[re,M]=d.useState(!1),ne=d.useRef(a),T=d.useRef(0),I=d.useRef(0),q=d.useRef({}),Q=d.useRef(0),F=d.useRef(0),A=d.useRef({}),C=d.useRef({}),Y=d.useRef(null);d.useLayoutEffect(()=>{z(ne.current,a)||(T.current+=1),ne.current=a},[a]);const Z=(r,l)=>l===T.current&&z(_.getState().currentSessionRef,r),se=async(r,l="")=>{const g=l?`/suggestions/files/tree?path=${encodeURIComponent(l)}`:"/suggestions/files/tree",u=await fetch(g,{headers:fe(r)});if(!u.ok)throw new Error("Failed to load tree");return(await u.json()).map(h=>({...h,children:h.type==="dir"?[]:void 0}))};d.useEffect(()=>{const r=++I.current;return(async()=>{if(!a){i([]),y(!1),R(null);return}const g={...a},u=T.current,k=()=>r===I.current&&Z(g,u);if(k()){i([]),y(!0),R(null);try{const h=await se(g);k()&&i(h)}catch(h){k()&&R(te(h,"Failed to load tree"))}finally{k()&&y(!1)}}})(),()=>{I.current===r&&(I.current+=1)}},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]),d.useEffect(()=>{Y.current=null,A.current={},C.current={},q.current={},Q.current+=1,ae(null),V(""),K(!1),X(null),M(!1),N({}),b({})},[a==null?void 0:a.projectPath,a==null?void 0:a.sessionId]);const v=d.useMemo(()=>s.find(r=>z({sessionId:r.sessionId,projectPath:r.projectPath},a)),[a,s]),Ce=d.useMemo(()=>Qe(n),[n]),[Se,oe]=d.useState(null),[Be,ee]=d.useState(!1),[ie,de]=d.useState(null),S=Se??Ce,ce=d.useMemo(()=>Me(n),[n]),[Le,De]=d.useState({});d.useEffect(()=>{const r=++F.current;if(oe(null),de(null),ee(!1),!a||(v==null?void 0:v.taskIsolation)!=="worktree"||!v.taskDiffStat||v.taskDiffStat.changedFiles===0)return;const l={...a};return ee(!0),Ie.getTaskDiff(l).then(g=>{r!==F.current||!z(_.getState().currentSessionRef,l)||oe(g.files.map(u=>({filePath:u.path,diff:{patch:u.patch},summary:u.binary?"binary":`+${u.additions} -${u.deletions}${u.truncated?" (truncated)":""}`})))}).catch(g=>{r===F.current&&de(te(g,"Failed to load task diff"))}).finally(()=>{r===F.current&&ee(!1)}),()=>{F.current===r&&(F.current+=1)}},[v==null?void 0:v.taskCompletedAt,v==null?void 0:v.taskDiffStat,v==null?void 0:v.taskIsolation,a]);const Re=r=>{De(l=>({...l,[r]:!l[r]}))},Te=async r=>{const l=_.getState().currentSessionRef;if(!l)return;const g=T.current,u=++Q.current,k=()=>u===Q.current&&Y.current===r&&Z(l,g);Y.current=r,ae(r),V(""),K(!0),X(null),M(!1);try{const h=await fetch(`/suggestions/files/content?path=${encodeURIComponent(r)}`,{headers:fe(l)});if(!h.ok)throw new Error("Failed to load file");const $=await h.json();k()&&(V($.content||""),M(!!$.truncated))}catch(h){k()&&X(te(h,"Failed to load file"))}finally{k()&&K(!1)}},Ae=async r=>{const l=(q.current[r]??0)+1;q.current[r]=l;const g=!A.current[r],u={...A.current,[r]:g};if(A.current=u,N(u),!g||C.current[r])return;const k=_.getState().currentSessionRef;if(!k)return;const h=T.current,$=()=>q.current[r]===l&&A.current[r]===!0&&Z(k,h);try{const P=await se(k,r);if($()){const le={...C.current,[r]:P};C.current=le,b(le)}}catch{if($()){const P={...C.current,[r]:[]};C.current=P,b(P)}}},$e=r=>{J(l=>({...l,[r]:!l[r]}))};return e.jsxs("div",{className:"w-[55%] min-w-[420px] max-w-[860px] border-l border-[#E5E7EB] dark:border-zinc-800 bg-white dark:bg-[#09090b] flex flex-col h-full shadow-xl shrink-0",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 h-12 border-b border-[#E5E7EB] dark:border-zinc-800 shrink-0",children:[e.jsx("span",{className:"font-normal text-[13px] text-[#6B7280] dark:text-zinc-400 font-mono",children:"Preview"}),e.jsx(qe,{variant:"ghost",size:"icon",onClick:t,className:"h-8 w-8 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-zinc-500 dark:hover:text-zinc-300 dark:hover:bg-zinc-800/50",children:e.jsx(We,{className:"w-4 h-4"})})]}),e.jsxs(Je,{value:o,onValueChange:r=>f(r),className:"flex flex-col flex-1 min-h-0",children:[e.jsx("div",{className:"px-4 py-3 border-b border-[#E5E7EB] dark:border-zinc-800",children:e.jsxs(we,{className:"bg-white dark:bg-[#111113] border border-[#E5E7EB] dark:border-[#27272a] h-9 p-1 rounded-md w-full justify-start",children:[e.jsx(W,{value:"diff",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Diff"}),e.jsx(W,{value:"files",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Files"}),e.jsx(W,{value:"logs",className:"text-[12px] font-mono px-3 text-[#6B7280] dark:text-[#a1a1aa] data-[state=active]:bg-[#E5E7EB] data-[state=active]:text-[#111827] dark:data-[state=active]:bg-[#27272a] dark:data-[state=active]:text-white",children:"Logs"})]})}),e.jsx(G,{value:"diff",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:Be&&S.length===0?e.jsx(j,{title:"Loading task diff…",subtitle:"Reading the durable worktree artifact."}):ie&&S.length===0?e.jsx(j,{title:"Failed to load task diff",subtitle:ie}):S.length===0?e.jsx(j,{title:"No patch yet",subtitle:"Run a tool that changes files to see diffs here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mb-2",children:[S.length," changed file",S.length>1?"s":""]}),S.map(r=>{var u;const l=((u=r.filePath)==null?void 0:u.split("/").pop())||"unknown",g=Le[r.filePath||""]!==!1;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>Re(r.filePath||""),className:"w-full flex items-center gap-2 px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b] transition-colors",children:[g?e.jsx(ue,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}):e.jsx(xe,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx(je,{className:"w-4 h-4 text-[#6B7280] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono flex-1 text-left truncate",children:l}),r.summary&&e.jsx("span",{className:"text-[11px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:r.summary})]}),g&&e.jsxs("div",{className:"border-t border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("div",{className:"px-3 py-1 text-[11px] text-[#9CA3AF] dark:text-[#52525b] font-mono truncate",children:r.filePath}),e.jsx(et,{diff:r.diff})]})]},r.filePath)})]})})}),e.jsx(G,{value:"files",className:"overflow-hidden flex-1 mt-0",children:e.jsxs("div",{className:"px-4 py-4 h-full",children:[x&&e.jsx(j,{title:"Loading files…",subtitle:"Fetching workspace tree."}),!x&&m&&e.jsx(j,{title:"Failed to load files",subtitle:m}),!x&&!m&&c.length===0&&e.jsx(j,{title:"No files yet",subtitle:"Start a session to load the workspace tree."}),!x&&!m&&c.length>0&&e.jsxs("div",{className:"h-full grid grid-cols-[220px_1fr] gap-4 min-h-0",children:[e.jsx("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-2 overflow-y-auto min-h-0",children:c.map(r=>e.jsx(Ne,{node:r,depth:0,expandedDirs:w,childrenCache:p,toggleDir:Ae,selectedPath:E,onSelectFile:Te},r.path))}),e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden flex flex-col min-h-0",children:[e.jsxs("div",{className:"px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono flex items-center justify-between",children:[e.jsx("span",{children:E||"Select a file to preview"}),E&&e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#a1a1aa] font-mono",children:H?"Loading…":re?"Truncated":"Ready"})]}),re&&!H&&e.jsx("div",{className:"px-3 py-2 bg-[#FEF3C7] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a] text-[11px] text-[#b45309] dark:text-[#facc15] font-mono",children:"Preview truncated to 200k characters."}),e.jsxs("div",{className:"flex-1 min-h-0",children:[!E&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Pick a file from the tree to preview."}),E&&U&&e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#DC2626] dark:text-[#fca5a5] font-mono",children:U}),E&&!U&&e.jsx("div",{className:"h-full",children:H?e.jsx(he,{}):e.jsx(d.Suspense,{fallback:e.jsx(he,{}),children:e.jsx(Ye,{content:Fe,filename:E})})})]})]})]})]})}),e.jsx(G,{value:"logs",className:"overflow-hidden flex-1 mt-0",children:e.jsx("div",{className:"overflow-y-auto px-4 py-4 space-y-3 h-full",children:ce.length===0?e.jsx(j,{title:"No logs yet",subtitle:"Tool runs will appear here."}):ce.map(r=>{var h;const l=O[r.id],g=(r.content||"").split(`
|
|
2
2
|
`),u=g.length>10||(((h=r.content)==null?void 0:h.length)||0)>800,k=l||!u?g:g.slice(0,8);return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-lg overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 bg-[#F9FAFB] dark:bg-[#111113] border-b border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsxs("div",{className:"space-y-0.5",children:[e.jsx("div",{className:"text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:r.title}),r.subtitle&&e.jsx("div",{className:"text-[11px] text-[#6B7280] dark:text-[#71717a] font-mono",children:r.subtitle})]}),e.jsx(Xe,{status:r.status})]}),r.content&&e.jsxs("div",{className:"px-3 py-3 space-y-2",children:[e.jsxs("pre",{className:"text-[12px] text-[#374151] dark:text-[#d4d4d8] bg-[#F3F4F6] dark:bg-[#09090b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md p-3 overflow-x-auto whitespace-pre-wrap font-mono",children:[k.join(`
|
|
3
3
|
`),!l&&u&&`
|
|
4
4
|
…`]}),u&&e.jsxs("button",{onClick:()=>$e(r.id),className:"flex items-center gap-1 text-[12px] text-[#6B7280] dark:text-[#a1a1aa] font-mono hover:text-[#111827] dark:hover:text-[#E5E5E5] transition-colors",children:[l?e.jsx(ue,{className:"w-3 h-3"}):e.jsx(xe,{className:"w-3 h-3"}),l?"Collapse":"Expand"]})]})]},r.id)})})})]})]})}function j({title:t,subtitle:n}){return e.jsxs("div",{className:"border border-dashed border-[#E5E7EB] dark:border-[#27272a] rounded-lg p-6 text-center",children:[e.jsx("div",{className:"text-[13px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:t}),e.jsx("div",{className:"text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono mt-1",children:n})]})}function Xe({status:t}){const n=t==="success"?"Success":t==="error"?"Failed":"Running",a=t==="success"?"bg-[#22C55E] text-white":t==="error"?"bg-[#FEE2E2] text-[#b91c1c] dark:bg-[#EF4444]/20 dark:text-[#fca5a5]":"bg-[#E5E7EB] text-[#6B7280] dark:bg-[#27272a] dark:text-[#a1a1aa]";return e.jsx("span",{className:D("text-[11px] px-2 py-0.5 rounded-full font-mono",a),children:n})}function Ne({node:t,depth:n,expandedDirs:a,childrenCache:s,toggleDir:o,onSelectFile:f,selectedPath:c}){const i=t.type==="dir",p=a[t.path],b=!i&&c===t.path,x=s[t.path]||[];return e.jsxs("div",{children:[e.jsx("button",{onClick:()=>{i?o(t.path):f(t.path)},className:D("flex items-center gap-2 w-full text-left text-[12px] font-mono px-2 py-1 rounded-md transition-colors",b?"bg-[#16A34A]/10 text-[#111827] dark:bg-[#22C55E]/10 dark:text-[#E5E5E5]":"hover:bg-[#F3F4F6] text-[#6B7280] dark:hover:bg-[#111113] dark:text-[#a1a1aa]",i&&"cursor-pointer",b&&"border border-[#16A34A]/30 dark:border-[#22C55E]/30"),style:{paddingLeft:n*14+8},children:i?e.jsxs(e.Fragment,{children:[p?e.jsx(Ge,{className:"h-3.5 w-3.5 shrink-0 text-[#111827] dark:text-[#E5E5E5]"}):e.jsx(Oe,{className:"h-3.5 w-3.5 shrink-0 text-[#6B7280] dark:text-[#a1a1aa]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]}):e.jsxs(e.Fragment,{children:[e.jsx(je,{className:"h-3.5 w-3.5 shrink-0 text-[#9CA3AF] dark:text-[#71717a]"}),e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name})]})}),i&&p&&e.jsx("div",{children:x.map(y=>e.jsx(Ne,{node:y,depth:n+1,expandedDirs:a,childrenCache:s,toggleDir:o,onSelectFile:f,selectedPath:c},y.path))})]})}function Me(t){return t.flatMap(n=>{var o,f,c;const a=[];if((o=n.agentContent)!=null&&o.toolCalls)for(const i of n.agentContent.toolCalls){const p=ge(i.arguments),b=i.output,x=b?(f=L(b))!=null&&f.diff?be(b):b:void 0;a.push({id:`${n.id}-${i.toolCallId}`,title:i.toolName||"Tool",subtitle:i.summary,status:i.status==="success"?"success":i.status==="error"?"error":"running",content:x||(p?`Arguments:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as p,r as h,_ as j}from"./vendor-markdown-b9iCqZWK.js";import{r as o,j as r}from"./vendor-react-FPIC4Czm.js";import{c as b}from"./index-
|
|
1
|
+
import{M as p,r as h,_ as j}from"./vendor-markdown-b9iCqZWK.js";import{r as o,j as r}from"./vendor-react-FPIC4Czm.js";import{c as b}from"./index-DIWzaS2_.js";import{a as f}from"./SettingsStore-C8YBWQPS.js";import{k as g,Q as N}from"./vendor-icons-DBM55KTG.js";import"./vendor-monaco-w6PwaWGP.js";import"./vendor-radix-DyP_DOwV.js";const v=[h],y=o.lazy(()=>j(()=>import("./CodeBlockHighlighter-D8_cOYpG.js"),[]).then(t=>({default:t.CodeBlockHighlighter}))),R=o.memo(function({content:s,className:a,syntaxHighlight:d=!0}){const i=f(),E=o.useMemo(()=>({code({className:e,children:n,...x}){const c=/language-(\w+)/.exec(e||""),k=!c,m=c?c[1]:"",l=String(n).replace(/\n$/,"");return k?r.jsx("code",{className:b("bg-[#F3F4F6] dark:bg-[#27272a] px-1.5 py-0.5 rounded text-[#111827] dark:text-[#E5E5E5] font-mono text-[13px]",e),...x,children:n}):d?r.jsxs("div",{className:"relative my-4 rounded-lg overflow-hidden border border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#1e1e1e]",children:[r.jsxs("div",{className:"flex items-center justify-between px-4 py-2 bg-[#F3F4F6] dark:bg-[#27272a] border-b border-[#E5E7EB] dark:border-[#27272a]",children:[r.jsx("span",{className:"text-xs text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:m||"text"}),r.jsx(F,{content:l})]}),r.jsx(o.Suspense,{fallback:r.jsx(u,{className:e,code:l,props:x}),children:r.jsx(y,{code:l,language:m,isDark:i})})]}):r.jsx(u,{className:e,code:l,props:x})},p({children:e}){return r.jsx("p",{className:"mb-4 leading-relaxed last:mb-0",children:e})},ul({children:e}){return r.jsx("ul",{className:"pl-4 mb-4 space-y-1 list-disc last:mb-0",children:e})},ol({children:e}){return r.jsx("ol",{className:"pl-4 mb-4 space-y-1 list-decimal last:mb-0",children:e})},li({children:e}){return r.jsx("li",{className:"leading-relaxed",children:e})},h1({children:e}){return r.jsx("h1",{className:"text-2xl font-bold mb-4 mt-6 text-[#111827] dark:text-[#E5E5E5]",children:e})},h2({children:e}){return r.jsx("h2",{className:"text-xl font-bold mb-3 mt-5 text-[#111827] dark:text-[#E5E5E5]",children:e})},h3({children:e}){return r.jsx("h3",{className:"text-lg font-bold mb-2 mt-4 text-[#111827] dark:text-[#E5E5E5]",children:e})},blockquote({children:e}){return r.jsx("blockquote",{className:"border-l-2 border-[#22C55E] pl-4 italic text-[#6B7280] dark:text-[#a1a1aa] mb-4",children:e})},a({href:e,children:n}){return r.jsx("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"text-[#22C55E] hover:underline transition-colors",children:n})},table({children:e}){return r.jsx("div",{className:"overflow-x-auto mb-4 border border-[#E5E7EB] dark:border-[#27272a] rounded-lg",children:r.jsx("table",{className:"w-full text-sm text-left",children:e})})},thead({children:e}){return r.jsx("thead",{className:"bg-[#F3F4F6] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5]",children:e})},tbody({children:e}){return r.jsx("tbody",{className:"divide-y divide-[#E5E7EB] dark:divide-[#27272a]",children:e})},tr({children:e}){return r.jsx("tr",{className:"hover:bg-[#F3F4F6] dark:hover:bg-[#27272a]/50 transition-colors",children:e})},th({children:e}){return r.jsx("th",{className:"px-4 py-3 font-medium whitespace-nowrap",children:e})},td({children:e}){return r.jsx("td",{className:"px-4 py-3 text-[#374151] dark:text-[#d4d4d8]",children:e})},hr(){return r.jsx("hr",{className:"my-6 border-[#E5E7EB] dark:border-[#27272a]"})}}),[i,d]);return r.jsx("div",{className:b("text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono break-words min-w-0 w-full",a),children:r.jsx(p,{remarkPlugins:v,components:E,children:s})})});function u({className:t,code:s,props:a}){return r.jsx("pre",{className:"my-4 overflow-x-auto rounded-lg border border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#1e1e1e] p-4 text-[13px] leading-normal",children:r.jsx("code",{className:t,...a,children:s})})}function F({content:t}){const[s,a]=o.useState(!1),d=async()=>{await navigator.clipboard.writeText(t),a(!0),setTimeout(()=>a(!1),2e3)};return r.jsx("button",{onClick:d,className:"p-1 hover:bg-[#E5E7EB] dark:hover:bg-[#3f3f46] rounded-md transition-colors text-[#9CA3AF] dark:text-[#a1a1aa] hover:text-[#111827] dark:hover:text-[#E5E5E5]",title:"Copy code",children:s?r.jsx(g,{className:"h-3.5 w-3.5 text-[#22C55E]"}):r.jsx(N,{className:"h-3.5 w-3.5"})})}export{R as MarkdownRenderer};
|