blade-code 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -5
- package/dist/blade.js +4 -4
- package/dist/chunk-0aj7gp37.js +2 -0
- package/dist/{chunk-1v2n922p.js → chunk-0h81hxkw.js} +1 -1
- package/dist/chunk-2beq0syt.js +2 -0
- package/dist/chunk-2fdjn926.js +1 -0
- package/dist/chunk-3c5gvxr6.js +1 -0
- package/dist/chunk-44wkjs2j.js +114 -0
- package/dist/chunk-4vaywb2r.js +2 -0
- package/dist/{chunk-x40fkg4z.js → chunk-61087jc8.js} +2 -2
- package/dist/chunk-6g21dh3n.js +1 -0
- package/dist/chunk-6hj2dk75.js +3 -0
- package/dist/chunk-6n5xdf2r.js +2 -0
- package/dist/{chunk-d7y2mf7c.js → chunk-6qe5k7dw.js} +2 -2
- package/dist/chunk-7dcm1aqd.js +1 -0
- package/dist/chunk-7eptyk20.js +1 -0
- package/dist/chunk-88vy9hh0.js +4 -0
- package/dist/{chunk-gdm1xzvp.js → chunk-8nm1hqr1.js} +2 -2
- package/dist/chunk-8rg05w47.js +174 -0
- package/dist/chunk-93ptxa5p.js +4 -0
- package/dist/chunk-949btxxx.js +1485 -0
- package/dist/chunk-9jy87d0y.js +3 -0
- package/dist/chunk-9kd14cwq.js +1 -0
- package/dist/chunk-a7nbn5kf.js +3 -0
- package/dist/chunk-af49jmns.js +5 -0
- package/dist/chunk-asbp4cv4.js +1 -0
- package/dist/chunk-beqaxytd.js +2 -0
- package/dist/chunk-bqdc3m0p.js +6 -0
- package/dist/chunk-bx50res5.js +99 -0
- package/dist/chunk-cznge1n7.js +1 -0
- package/dist/{chunk-ax7bx0j8.js → chunk-d3236505.js} +1 -1
- package/dist/chunk-d9ddpapp.js +18 -0
- package/dist/chunk-e3tk2jna.js +636 -0
- package/dist/chunk-f8db8ftd.js +10 -0
- package/dist/chunk-fjp5tvh8.js +1 -0
- package/dist/chunk-fjw32ex5.js +2 -0
- package/dist/chunk-gafbzeyk.js +1 -0
- package/dist/chunk-hh3xw391.js +6 -0
- package/dist/chunk-hzvp3bc1.js +44 -0
- package/dist/chunk-jv4nkkb5.js +1 -0
- package/dist/{chunk-2fbwmdvg.js → chunk-jxv6r0c7.js} +2 -2
- package/dist/{chunk-aq7wf2zt.js → chunk-kq5my0yy.js} +2 -2
- package/dist/chunk-m3tx1k0s.js +1 -0
- package/dist/chunk-m78ceafk.js +1 -0
- package/dist/{chunk-ppyg431d.js → chunk-mjp61rqd.js} +1 -1
- package/dist/chunk-mvwp3c11.js +45 -0
- package/dist/chunk-mwrn7mcr.js +1 -0
- package/dist/chunk-mxhg6jt9.js +25 -0
- package/dist/chunk-nah0cbnp.js +2 -0
- package/dist/chunk-px5ck9pf.js +2 -0
- package/dist/chunk-qev36qrb.js +2 -0
- package/dist/{chunk-z0qxaky4.js → chunk-sndbq5xt.js} +1 -1
- package/dist/chunk-t8q9ks7e.js +3 -0
- package/dist/{chunk-mns8e65q.js → chunk-th7sxjtk.js} +2 -2
- package/dist/{chunk-rmfk5f9m.js → chunk-ty2kc6kg.js} +2 -2
- package/dist/chunk-v4mr98vm.js +1 -0
- package/dist/chunk-vb0t2hhd.js +25 -0
- package/dist/{chunk-w3me85va.js → chunk-vjpd3nee.js} +2 -2
- package/dist/chunk-vvy506b3.js +3 -0
- package/dist/chunk-vyq9r31h.js +22 -0
- package/dist/chunk-w4qsayn6.js +9 -0
- package/dist/chunk-wsqz3x2e.js +161 -0
- package/dist/{chunk-bc6wbcrs.js → chunk-wvj9h7mb.js} +1 -1
- package/dist/chunk-yvah5h4x.js +13 -0
- package/dist/chunk-z5ae4qvf.js +2 -0
- package/dist/chunk-zcw7kyf4.js +2 -0
- package/dist/{chunk-j8en7x02.js → chunk-zkbf8n6y.js} +1 -1
- package/dist/web/assets/ChatView-CnwNosSG.js +7 -0
- package/dist/web/assets/CodeBlockHighlighter-CBo_AxjZ.js +8 -0
- package/dist/web/assets/FilePreview-hNo6RCNY.js +8 -0
- package/dist/web/assets/MarkdownRenderer-BON4fqSr.js +30 -0
- package/dist/web/assets/McpModal-Go_8v1Vu.js +5 -0
- package/dist/web/assets/SettingsModal-CRu1zGQf.js +1 -0
- package/dist/web/assets/TaskSwitcher-Ds8CBVtp.js +1 -0
- package/dist/web/assets/TerminalPanel-Dm4bu6ib.js +1 -0
- package/dist/web/assets/index-BNsnHxlt.js +32 -0
- package/dist/web/assets/index-DI8ZWdWH.js +11 -0
- package/dist/web/assets/index-DVTiq-7u.css +1 -0
- package/dist/web/assets/vendor-icons-CsBKlDXT.js +381 -0
- package/dist/web/assets/vendor-radix-DXRuAJHH.js +45 -0
- package/dist/web/assets/vendor-react-DG5dkZ_t.js +49 -0
- package/dist/web/index.html +5 -2
- package/package.json +36 -34
- package/dist/chunk-0abtfzm6.js +0 -1
- package/dist/chunk-0zkhjsbv.js +0 -1
- package/dist/chunk-119fhp5q.js +0 -9
- package/dist/chunk-1rpgvk3r.js +0 -10
- package/dist/chunk-3qgj2y5r.js +0 -1
- package/dist/chunk-45bme7n9.js +0 -2
- package/dist/chunk-5jq01mg6.js +0 -4
- package/dist/chunk-5nye3k5w.js +0 -1
- package/dist/chunk-7pevqbfd.js +0 -2
- package/dist/chunk-8dqvnx7n.js +0 -2
- package/dist/chunk-8edsvxf3.js +0 -1
- package/dist/chunk-8vemqfe4.js +0 -2
- package/dist/chunk-8vtznxpq.js +0 -5
- package/dist/chunk-936ft6kq.js +0 -2
- package/dist/chunk-9ax02vtg.js +0 -22
- package/dist/chunk-9qknesxs.js +0 -6
- package/dist/chunk-acegy4td.js +0 -3
- package/dist/chunk-aewrn5xp.js +0 -1
- package/dist/chunk-b10vr4xj.js +0 -2
- package/dist/chunk-bfgm5k3e.js +0 -1566
- package/dist/chunk-cf3fhs7j.js +0 -1
- package/dist/chunk-e1586s4t.js +0 -1
- package/dist/chunk-enk621t7.js +0 -98
- package/dist/chunk-fpr6d8zc.js +0 -2
- package/dist/chunk-gagt42k2.js +0 -13
- package/dist/chunk-gm62cfjw.js +0 -1
- package/dist/chunk-h3bjmkvz.js +0 -1
- package/dist/chunk-jyr9417h.js +0 -34
- package/dist/chunk-mcnfbhpr.js +0 -6
- package/dist/chunk-mpkr3s6b.js +0 -3
- package/dist/chunk-n9tgxfvw.js +0 -615
- package/dist/chunk-qxhrzws6.js +0 -1
- package/dist/chunk-r6h7eja3.js +0 -151
- package/dist/chunk-r8pjwjt6.js +0 -1
- package/dist/chunk-rrg9bw8r.js +0 -25
- package/dist/chunk-wtxwny0p.js +0 -41
- package/dist/chunk-x548f12z.js +0 -2
- package/dist/chunk-xtfzjb72.js +0 -6
- package/dist/web/assets/CodeBlockHighlighter-D8_cOYpG.js +0 -1
- package/dist/web/assets/FilePreview-DpovIbME.js +0 -7
- package/dist/web/assets/MarkdownRenderer-73wC_SGk.js +0 -1
- package/dist/web/assets/McpModal-CIpxuyTG.js +0 -5
- package/dist/web/assets/SettingsModal-BBa1libe.js +0 -1
- package/dist/web/assets/SettingsStore-C8YBWQPS.js +0 -1
- package/dist/web/assets/SkillsModal-DArZ-nCX.js +0 -1
- package/dist/web/assets/TerminalPanel-BX7C7qiD.js +0 -1
- package/dist/web/assets/index-Ch0eqSLM.css +0 -1
- package/dist/web/assets/index-DIWzaS2_.js +0 -16
- package/dist/web/assets/useRequest-B4kP-cmG.js +0 -1
- package/dist/web/assets/vendor-icons-DBM55KTG.js +0 -251
- package/dist/web/assets/vendor-markdown-b9iCqZWK.js +0 -36
- package/dist/web/assets/vendor-monaco-w6PwaWGP.js +0 -11
- package/dist/web/assets/vendor-radix-DyP_DOwV.js +0 -45
- package/dist/web/assets/vendor-react-FPIC4Czm.js +0 -49
package/dist/chunk-r8pjwjt6.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
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};
|
package/dist/chunk-rrg9bw8r.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
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};
|
package/dist/chunk-wtxwny0p.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
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
|
-
`):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
|
-
|
|
4
|
-
`):void 0,modifiedOutput:W,warning:$.length>0?$.join(`
|
|
5
|
-
`):void 0}}async executeStopHooks(O,S,q){if(O.length===0)return{shouldStop:!0};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&&"continue"in W&&W.continue===!1)return{shouldStop:!1,continueReason:W.continueReason,warning:Q.length>0?Q.join(`
|
|
6
|
-
`):void 0}}catch(Z){let W=Z instanceof Error?Z.message:String(Z);Q.push(`Hook failed: ${W}`)}return{shouldStop:!0,warning:Q.length>0?Q.join(`
|
|
7
|
-
`):void 0}}async executeSubagentStopHooks(O,S,q){if(O.length===0)return{shouldStop:!0};let Q=[],Y=[];for(let Z of O)try{let W=await this.executeHook(Z,S,q);if(!W.success){if(W.warning)Q.push(W.warning);continue}let $=W.output?.hookSpecificOutput;if($&&"continue"in $){if($.continue===!1)return{shouldStop:!1,continueReason:$.continueReason,warning:Q.length>0?Q.join(`
|
|
8
|
-
`):void 0};if("additionalContext"in $&&$.additionalContext)Y.push($.additionalContext)}}catch(W){let $=W instanceof Error?W.message:String(W);Q.push(`Hook failed: ${$}`)}return{shouldStop:!0,additionalContext:Y.length>0?Y.join(`
|
|
9
|
-
|
|
10
|
-
`):void 0,warning:Q.length>0?Q.join(`
|
|
11
|
-
`):void 0}}async executePermissionRequestHooks(O,S,q){if(O.length===0)return{decision:"ask"};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&&"permissionDecision"in W){let $=W.permissionDecision;if($==="approve"||$==="deny")return{decision:$,reason:W.permissionDecisionReason,warning:Q.length>0?Q.join(`
|
|
12
|
-
`):void 0}}}catch(Z){let W=Z instanceof Error?Z.message:String(Z);Q.push(`Hook failed: ${W}`)}return{decision:"ask",warning:Q.length>0?Q.join(`
|
|
13
|
-
`):void 0}}async executeUserPromptSubmitHooks(O,S,q){if(O.length===0)return{proceed:!0};let Q=[],Y=[],Z;for(let W of O)try{let $=await this.executeHook(W,S,q);if(!$.success){if($.blocking)return{proceed:!1,warning:$.error};if($.warning)Q.push($.warning);continue}if($.stdout&&$.stdout.trim())Y.push($.stdout.trim());let R=$.output?.hookSpecificOutput;if(R&&"updatedPrompt"in R){if(R.updatedPrompt)Z=R.updatedPrompt;if(R.contextInjection)Y.push(R.contextInjection)}}catch($){let R=$ instanceof Error?$.message:String($);Q.push(`Hook failed: ${R}`)}return{proceed:!0,updatedPrompt:Z,contextInjection:Y.length>0?Y.join(`
|
|
14
|
-
|
|
15
|
-
`):void 0,warning:Q.length>0?Q.join(`
|
|
16
|
-
`):void 0}}async executeSessionStartHooks(O,S,q){if(O.length===0)return{proceed:!0};let Q=[],Y={};for(let Z of O)try{let W=await this.executeHook(Z,S,q);if(!W.success){if(W.blocking)return{proceed:!1,warning:W.error};if(W.warning)Q.push(W.warning);continue}let $=W.output?.hookSpecificOutput;if($&&"env"in $&&$.env)Object.assign(Y,$.env)}catch(W){let $=W instanceof Error?W.message:String(W);Q.push(`Hook failed: ${$}`)}return{proceed:!0,env:Object.keys(Y).length>0?Y:void 0,warning:Q.length>0?Q.join(`
|
|
17
|
-
`):void 0}}async executeSessionEndHooks(O,S,q){if(O.length===0)return{};let Q=[],Y=q.config.maxConcurrentHooks||5,Z=await this.executeHooksConcurrently(O,S,q,Y);for(let W of Z)if(!W.success&&W.warning)Q.push(W.warning);return{warning:Q.length>0?Q.join(`
|
|
18
|
-
`):void 0}}async executePostToolUseFailureHooks(O,S,q){if(O.length===0)return{};let Q=[],Y=[],Z=q.config.maxConcurrentHooks||5,W=await this.executeHooksConcurrently(O,S,q,Z);for(let $ of W){if(!$.success&&$.warning){Q.push($.warning);continue}if($.stdout&&$.stdout.trim())Y.push($.stdout.trim())}return{additionalContext:Y.length>0?Y.join(`
|
|
19
|
-
|
|
20
|
-
`):void 0,warning:Q.length>0?Q.join(`
|
|
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
|
-
`):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
|
-
`):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-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
|
-
|
|
26
|
-
`+`## 评估指令
|
|
27
|
-
${O.prompt}
|
|
28
|
-
|
|
29
|
-
`+`## 输出格式
|
|
30
|
-
`+`必须返回一个 JSON 对象(不要包含任何其他文本):
|
|
31
|
-
`+`{
|
|
32
|
-
"decision": { "behavior": "approve" | "block" },
|
|
33
|
-
`+` "systemMessage": "可选的说明信息",
|
|
34
|
-
`+` "hookSpecificOutput": ${q}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
`+`重要规则:
|
|
38
|
-
`+`- 只输出 JSON,不要包含 markdown 代码块或其他文本
|
|
39
|
-
`+`- 如果没有发现问题,使用 "approve"
|
|
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 ub,l as vb,P as wb};
|
package/dist/chunk-x548f12z.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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 xb,f as yb,l as zb,x as Ab,b as Bb,V as Cb};
|
package/dist/chunk-xtfzjb72.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
import{j as L}from"./vendor-react-FPIC4Czm.js";import{S as e,v as p,o as l,b as s,s as h,a as m,d as c,j as a,e as d,f as y,m as g,p as r,h as j,t as x,i as t,y as i}from"./vendor-markdown-b9iCqZWK.js";import"./vendor-monaco-w6PwaWGP.js";e.registerLanguage("bash",s);e.registerLanguage("sh",s);e.registerLanguage("shell",s);e.registerLanguage("shell-session",h);e.registerLanguage("css",m);e.registerLanguage("diff",c);e.registerLanguage("javascript",a);e.registerLanguage("js",a);e.registerLanguage("json",d);e.registerLanguage("jsx",y);e.registerLanguage("markdown",g);e.registerLanguage("md",g);e.registerLanguage("python",r);e.registerLanguage("py",r);e.registerLanguage("scss",j);e.registerLanguage("tsx",x);e.registerLanguage("typescript",t);e.registerLanguage("ts",t);e.registerLanguage("yaml",i);e.registerLanguage("yml",i);function S({code:n,language:u,isDark:o}){return L.jsx(e,{style:o?p:l,language:u,PreTag:"div",wrapLongLines:!0,customStyle:{margin:0,padding:"16px",background:"transparent",fontSize:"13px",lineHeight:"1.5"},children:n})}export{S as CodeBlockHighlighter};
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
`),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
|
-
`),!l&&u&&`
|
|
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:
|
|
5
|
-
${p}`:void 0),timestamp:n.timestamp})}const s=n.metadata;if(s){if(s.kind==="tool_call"){const i=s.toolName||"Tool",p=ge(s.arguments);a.push({id:n.id,title:`Tool Call · ${i}`,subtitle:s.toolKind?String(s.toolKind):void 0,status:s.status==="success"?"success":s.status==="error"?"error":"running",content:p?`Arguments:
|
|
6
|
-
${p}`:void 0,timestamp:n.timestamp})}if(s.kind==="tool_result"){const i=s.toolName||"Tool",p=s.success,b=s.summary,x=s.output,y=x?(c=L(x))!=null&&c.diff?be(x):x:void 0;a.push({id:n.id,title:`Tool Result · ${i}`,subtitle:b,status:p===void 0?"running":p?"success":"error",content:y,timestamp:n.timestamp})}}return a})}function Qe(t){var s;const n=[],a=new Set;for(let o=t.length-1;o>=0;o-=1){const f=t[o];if((s=f.agentContent)!=null&&s.toolCalls)for(let x=f.agentContent.toolCalls.length-1;x>=0;x-=1){const y=f.agentContent.toolCalls[x],m=y.metadata,R=y.output||"",w=L(R)||L((m==null?void 0:m.diff_snippet)||"");if(w!=null&&w.diff){const N=(m==null?void 0:m.file_path)||y.toolName||"unknown";if(!a.has(N)){a.add(N);const O=typeof(m==null?void 0:m.oldContent)=="string"?m.oldContent:void 0,J=typeof(m==null?void 0:m.newContent)=="string"?m.newContent:void 0;n.push({diff:w.diff,filePath:N,summary:y.summary,oldContent:O,newContent:J})}}}const c=f.metadata;if(!c||c.kind!=="tool_result")continue;const i=c.metadata,p=c.output||(typeof f.content=="string"?f.content:"")||"",b=L(p)||L((i==null?void 0:i.diff_snippet)||"");if(b!=null&&b.diff){const x=(i==null?void 0:i.file_path)||c.toolName||"unknown";if(!a.has(x)){a.add(x);const y=typeof(i==null?void 0:i.oldContent)=="string"?i.oldContent:void 0,m=typeof(i==null?void 0:i.newContent)=="string"?i.newContent:void 0;n.push({diff:b.diff,filePath:x,summary:c.summary,oldContent:y,newContent:m})}}}return n.reverse()}function L(t){if(!t)return null;const n=/<<<DIFF>>>\s*([\s\S]*?)\s*<<<\/DIFF>>>/m,a=t.match(n);if(!a)return null;try{return{diff:JSON.parse(a[1])}}catch{return null}}function be(t){return t?t.replace(/<<<DIFF>>>[\s\S]*?<<<\/DIFF>>>/m,"").trim():""}function ge(t){if(!t)return"";if(typeof t=="string")try{return JSON.stringify(JSON.parse(t),null,2)}catch{return t}return JSON.stringify(t,null,2)}function he(){return e.jsx("div",{className:"h-full flex items-center justify-center text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:"Loading editor…"})}function Ye({content:t,filename:n}){const{theme:a}=ze(),s=d.useRef(null),[o,f]=d.useState("vs-dark"),c=Ze(n),i=p=>{s.current=p;const b=pe(p,a);f(b)};return d.useEffect(()=>{if(s.current){const p=pe(s.current,a);f(p)}},[a]),e.jsx(Ue,{value:t,language:c,theme:o,height:"100%",beforeMount:i,options:{readOnly:!0,minimap:{enabled:!1},fontSize:12,lineNumbers:"on",wordWrap:"on",scrollBeyondLastLine:!1,automaticLayout:!0}},n)}function Ze(t){var s;const n=((s=t.split(".").pop())==null?void 0:s.toLowerCase())||"";return{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",json:"json",md:"markdown",css:"css",scss:"scss",html:"html",yml:"yaml",yaml:"yaml",go:"go",rs:"rust",py:"python",java:"java",c:"c",cpp:"cpp",h:"cpp",hpp:"cpp",sh:"shell",zsh:"shell",toml:"toml",xml:"xml"}[n]||"plaintext"}function et({diff:t}){const n=t.patch.split(`
|
|
7
|
-
`);let a=0,s=0;return e.jsxs("div",{className:"border border-[#E5E7EB] dark:border-[#27272a] rounded-md overflow-hidden bg-white dark:bg-[#111113]",children:[e.jsxs("div",{className:"flex items-center justify-between px-3 py-2 border-b border-[#E5E7EB] dark:border-[#27272a] bg-[#F9FAFB] dark:bg-[#111113] text-[12px] text-[#6B7280] dark:text-[#71717a] font-mono",children:[e.jsx("span",{children:"Patch"}),t.matchLine&&e.jsxs("span",{children:["Line ",t.matchLine]})]}),e.jsx("div",{className:"text-[12px] font-mono",children:n.map((o,f)=>{if(o.startsWith("@@")){const c=/@@ -(?<old>\d+),?(?<oldCount>\d*) \+(?<new>\d+),?(?<newCount>\d*) @@/.exec(o);return c!=null&&c.groups&&(a=parseInt(c.groups.old,10),s=parseInt(c.groups.new,10)),e.jsx(B,{line:o},`${o}-${f}`)}if(o.startsWith("---")||o.startsWith("+++")||o.startsWith("Index:")||o.startsWith("==="))return e.jsx(B,{line:o},`${o}-${f}`);if(o.startsWith("+")){const c=s;return s+=1,e.jsx(B,{line:o,oldLine:null,newLine:c},`${o}-${f}`)}if(o.startsWith("-")){const c=a;return a+=1,e.jsx(B,{line:o,oldLine:c,newLine:null},`${o}-${f}`)}if(o.startsWith(" ")){const c=a,i=s;return a+=1,s+=1,e.jsx(B,{line:o,oldLine:c,newLine:i},`${o}-${f}`)}return e.jsx(B,{line:o},`${o}-${f}`)})})]})}function B({line:t,oldLine:n,newLine:a}){const s=t.startsWith("---")||t.startsWith("+++")||t.startsWith("Index:")||t.startsWith("==="),o=t.startsWith("@@"),f=t[0],c=s||o?t:t.slice(1),i=s?"text-[#6B7280] dark:text-[#a1a1aa]":f==="+"?"text-[#166534] bg-[#22C55E]/10 dark:text-[#86efac] dark:bg-[#22C55E]/10":f==="-"?"text-[#b91c1c] bg-[#EF4444]/10 dark:text-[#fca5a5] dark:bg-[#EF4444]/10":o?"text-[#1d4ed8] bg-[#DBEAFE] dark:text-[#93c5fd] dark:bg-[#1e3a8a]/30":"text-[#374151] dark:text-[#d4d4d8]";return e.jsxs("div",{className:D("grid grid-cols-[40px_40px_1fr] gap-2 px-3 py-0.5",i),children:[e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:n?String(n).padStart(2," "):""}),e.jsx("span",{className:"text-right text-[#9CA3AF] dark:text-[#71717a]",children:a?String(a).padStart(2," "):""}),e.jsx("span",{className:"whitespace-pre",children:c})]})}export{dt as FilePreview};
|
|
@@ -1 +0,0 @@
|
|
|
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};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{r as o,j as e}from"./vendor-react-FPIC4Czm.js";import{u as ge,D as V,a as ee,b as te,c as A}from"./index-DIWzaS2_.js";import{_ as T,q as w,r as se,s as oe,t as W}from"./vendor-radix-DyP_DOwV.js";import{i as ve,a as Ee,d as le,u as pe,b as be,c as je,e as O,f as G,g as ke}from"./useRequest-B4kP-cmG.js";import{K as Ne,q as Ce,X as ae,y as ye,L as ce,N as de,k as we,O as Ae}from"./vendor-icons-DBM55KTG.js";import"./vendor-markdown-b9iCqZWK.js";import"./vendor-monaco-w6PwaWGP.js";function q(a,n){if(ve){if(!a)return n;var r;return Ee(a)?r=a():"current"in a?r=a.current:r=a,r}}var Se=function(a){var n=function(r,c,d){var l=o.useRef(!1),s=o.useRef([]),m=o.useRef([]),h=o.useRef(void 0);a(function(){var i,k=Array.isArray(d)?d:[d],v=k.map(function(N){return q(N)});if(!l.current){l.current=!0,s.current=v,m.current=c,h.current=r();return}(v.length!==s.current.length||!le(s.current,v)||!le(m.current,c))&&((i=h.current)===null||i===void 0||i.call(h),s.current=v,m.current=c,h.current=r())}),pe(function(){var i;(i=h.current)===null||i===void 0||i.call(h),l.current=!1})};return n},Fe=Se(o.useEffect);function Be(){var a=(typeof global>"u"?"undefined":typeof global)=="object"&&global&&global.Object===Object&&global,n=typeof self=="object"&&self&&self.Object===Object&&self;return a||n}Be()||(global.Date=Date);function Me(a,n){var r,c=be(a),d=(r=n==null?void 0:n.wait)!==null&&r!==void 0?r:1e3,l=o.useMemo(function(){return je(function(){for(var s=[],m=0;m<arguments.length;m++)s[m]=arguments[m];return c.current.apply(c,T([],w(s),!1))},d,n)},[]);return pe(function(){l.cancel()}),{run:l,cancel:l.cancel,flush:l.flush}}function De(a,n,r){r===void 0&&(r={});var c=r.enable,d=c===void 0?!0:c,l=be(n);Fe(function(){if(d){var s=q(r.target,window);if(s!=null&&s.addEventListener){var m=function(i){return l.current(i)},h=Array.isArray(a)?a:[a];return h.forEach(function(i){s.addEventListener(i,m,{capture:r.capture,once:r.once,passive:r.passive})}),function(){h.forEach(function(i){s.removeEventListener(i,m,{capture:r.capture})})}}}},[a,r.capture,r.once,r.passive,d],r.target)}var Te=function(a){return a===document||a===document.documentElement||a===document.body?Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop):a.scrollTop},ie=function(a){return a.scrollHeight||Math.max(document.documentElement.scrollHeight,document.body.scrollHeight)},_e=function(a){return a.clientHeight||Math.max(document.documentElement.clientHeight,document.body.clientHeight)},Ie=function(a,n){n===void 0&&(n={});var r=n.target,c=n.isNoMore,d=n.threshold,l=d===void 0?100:d,s=n.direction,m=s===void 0?"bottom":s,h=n.reloadDeps,i=h===void 0?[]:h,k=n.manual,v=n.onBefore,N=n.onSuccess,S=n.onError,p=n.onFinally,_=w(o.useState(),2),C=_[0],F=_[1],R=w(o.useState(!1),2),P=R[0],g=R[1],B=m==="top",y=o.useRef(void 0),E=o.useRef(0),L=o.useMemo(function(){return c?c(C):!1},[C]),M=O(function(x){return se(void 0,void 0,void 0,function(){var f;return oe(this,function(t){switch(t.label){case 0:return[4,a(x)];case 1:return f=t.sent(),[2,{currentData:f,lastData:x}]}})})},{manual:k,onFinally:function(x,f,t){g(!1),p==null||p(f==null?void 0:f.currentData,t)},onBefore:function(){return v==null?void 0:v()},onSuccess:function(x){var f,t,j;x.lastData?F(W(W({},x.currentData),{list:B?T(T([],w(x.currentData.list),!1),w((t=x.lastData.list)!==null&&t!==void 0?t:[]),!1):T(T([],w((j=x.lastData.list)!==null&&j!==void 0?j:[]),!1),w(x.currentData.list),!1)})):F(W(W({},x.currentData),{list:T([],w((f=x.currentData.list)!==null&&f!==void 0?f:[]),!1)})),setTimeout(function(){if(B){var b=q(r);if(b=b===document?document.documentElement:b,b){var z=ie(b);b.scrollTo(0,z-E.current)}}else J()}),N==null||N(x.currentData)},onError:function(x){return S==null?void 0:S(x)}}),$=M.loading,Y=M.error,H=M.run,Q=M.runAsync,K=M.cancel,I=G(function(){L||(g(!0),H(C))}),u=function(x){return se(void 0,void 0,void 0,function(){var f;return oe(this,function(t){switch(t.label){case 0:return[4,Q(x)];case 1:return f=t.sent(),[2,f.currentData]}})})},D=G(function(){return L?Promise.reject():(g(!0),u(C))}),U=function(){return g(!1),H()},X=function(){return g(!1),u()},J=function(){var x=q(r);if(x){var f=x===document?document.documentElement:x,t=Te(f),j=ie(f),b=_e(f);B?(y.current!==void 0&&y.current>t&&t<=l&&I(),y.current=t,E.current=j-t):j-t<=b+l&&I()}};return De("scroll",function(){$||P||J()},{target:r}),ke(function(){H()},T([],w(i),!1)),{data:C,loading:!P&&$,error:Y,loadingMore:P,noMore:L,loadMore:I,loadMoreAsync:D,reload:G(U),reloadAsync:G(X),mutate:F,cancel:K}};const xe={connected:"text-[#16A34A] dark:text-[#22C55E]",connecting:"text-[#2563eb] dark:text-[#3b82f6]",offline:"text-[#f59e0b]",error:"text-[#ef4444]"},me={connected:"Connected",connecting:"Connecting...",offline:"Offline",error:"Error"},ue=20,Oe=async()=>{const a=await fetch("/mcp");if(!a.ok)throw new Error("Failed to fetch servers");return a.json()},Re="mcp server @modelcontextprotocol",Pe=3,Le=async(a,n)=>{const r=a&&a.length>=Pe?a:Re,c=`https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(r)}&size=${ue}&from=${n}`,d=await fetch(c);if(!d.ok)throw new Error("Failed to fetch packages");const l=await d.json();return{list:l.objects.map(s=>s.package),total:l.total,hasMore:n+ue<l.total}};function Ke(){const{isMcpOpen:a,toggleMcp:n}=ge(),[r,c]=o.useState("installed"),[d,l]=o.useState(!1),[s,m]=o.useState(null),[h,i]=o.useState({}),[k,v]=o.useState(""),[N,S]=o.useState(""),[p,_]=o.useState(null),[C,F]=o.useState(null),R=o.useRef(null),{run:P}=Me(t=>{S(t)},{wait:500}),{data:g=[],loading:B,run:y}=O(Oe,{refreshDeps:[a],ready:a,onSuccess:t=>{t.length>0&&!s&&m(t[0].id)}}),{data:E,loading:L,loadingMore:M,noMore:$,reload:Y}=Ie(async t=>{var b;const j=((b=t==null?void 0:t.list)==null?void 0:b.length)??0;return Le(N,j)},{target:R,isNoMore:t=>!(t!=null&&t.hasMore),reloadDeps:[N],manual:!a||r!=="catalog"}),{runAsync:H}=O(async t=>{await fetch(`/mcp/${encodeURIComponent(t)}/connect`,{method:"POST"})},{manual:!0,onSuccess:y}),{runAsync:Q}=O(async t=>{await fetch(`/mcp/${encodeURIComponent(t)}/disconnect`,{method:"POST"})},{manual:!0,onSuccess:y}),{runAsync:K}=O(async t=>{await fetch(`/mcp/${encodeURIComponent(t)}`,{method:"DELETE"})},{manual:!0,onSuccess:y}),{runAsync:I}=O(async t=>{await fetch("/mcp",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t.name,config:t})})},{manual:!0,onSuccess:()=>{y(),l(!1),F(null),_(null)},onError:()=>{_(null)}}),u=o.useMemo(()=>g.find(t=>t.id===s)??g[0],[g,s]),D=u?h[u.id]??{read:!0,write:!1,shell:!1}:{read:!0,write:!1,shell:!1},U=t=>{u&&i(j=>({...j,[u.id]:{...D,[t]:!D[t]}}))},X=o.useMemo(()=>new Set(g.map(t=>t.name.toLowerCase())),[g]),J=t=>{F(t)},x=t=>t.startsWith("@modelcontextprotocol/"),f=t=>x(t.name)?"Official":"Community";return e.jsxs(e.Fragment,{children:[e.jsx(V,{open:a,onOpenChange:n,children:e.jsxs(ee,{className:"sm:max-w-[900px] h-[680px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl flex flex-col","aria-describedby":void 0,hideCloseButton:!0,children:[e.jsx(te,{className:"sr-only",children:"MCP"}),e.jsx("div",{className:"flex flex-1 min-h-0",children:e.jsxs("div",{className:"flex-1 p-8 flex flex-col gap-5 min-h-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[e.jsx("h2",{className:"text-lg font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:"MCP"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:y,className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",disabled:B,children:e.jsx(Ne,{className:A("h-4 w-4",B&&"animate-spin")})}),e.jsxs("button",{onClick:()=>l(!0),className:"h-8 px-3 rounded-md bg-[#E5E7EB] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5] text-xs font-mono font-semibold flex items-center gap-1 hover:bg-[#D1D5DB] dark:hover:bg-[#32323a]",children:[e.jsx(Ce,{className:"h-3.5 w-3.5"}),"Add server"]}),e.jsx("button",{onClick:n,className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",children:e.jsx(ae,{className:"h-4 w-4"})})]})]}),e.jsxs("div",{className:"flex items-center gap-2 p-1 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] w-fit shrink-0",children:[e.jsxs(fe,{active:r==="installed",onClick:()=>c("installed"),children:["Installed (",g.length,")"]}),e.jsx(fe,{active:r==="catalog",onClick:()=>{c("catalog"),E||Y()},children:"Catalog"})]}),r==="installed"?e.jsxs("div",{className:"flex gap-5 flex-1 min-h-0 overflow-hidden",children:[e.jsxs("div",{className:"w-[220px] flex flex-col gap-3 min-h-0 overflow-hidden",children:[e.jsx("span",{className:"text-sm font-mono font-semibold text-[#111827] dark:text-[#E5E5E5] shrink-0",children:"Servers"}),e.jsx("div",{className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] flex items-center px-3 text-[12px] text-[#9CA3AF] dark:text-[#71717a] font-mono shrink-0",children:"Search servers..."}),e.jsxs("div",{className:"flex flex-col gap-2 overflow-y-auto flex-1 min-h-0 pr-1",children:[g.length===0&&!B&&e.jsx("div",{className:"text-center py-8 text-[#9CA3AF] dark:text-[#71717a] text-sm font-mono",children:"No MCP servers configured"}),g.map(t=>e.jsxs("button",{onClick:()=>m(t.id),className:A("text-left rounded-lg px-3 py-2 flex flex-col gap-1 transition-colors shrink-0",t.id===s?"bg-[#E5E7EB] dark:bg-[#111827]":"bg-white dark:bg-[#0C0C0C] hover:bg-[#F3F4F6] dark:hover:bg-[#18181b]"),children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[13px] font-mono font-semibold text-[#111827] dark:text-[#E5E5E5]",children:t.name}),e.jsx("span",{className:A("text-[11px] font-mono font-semibold",xe[t.status]),children:me[t.status]})]}),e.jsx("span",{className:"text-[11px] font-mono text-[#6B7280] dark:text-[#94a3b8] truncate",children:t.endpoint})]},t.id))]})]}),u?e.jsxs("div",{className:"flex-1 flex flex-col gap-3 overflow-y-auto pr-2 min-h-0",children:[e.jsxs("div",{className:"flex items-center justify-between shrink-0",children:[e.jsx("span",{className:"text-base font-mono font-semibold text-[#111827] dark:text-[#E5E5E5]",children:u.name}),e.jsx("span",{className:A("text-xs font-mono font-semibold",xe[u.status]),children:me[u.status]})]}),e.jsx("p",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#94a3b8]",children:u.description}),u.error&&e.jsxs("p",{className:"text-[12px] font-mono text-[#ef4444]",children:["Error: ",u.error]}),e.jsxs("div",{className:"flex items-center gap-2",children:[u.status==="connected"?e.jsx("button",{onClick:()=>Q(u.name),className:"h-7 px-3 rounded-md bg-[#E5E7EB] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5] text-[11px] font-mono font-semibold",children:"Disconnect"}):e.jsx("button",{onClick:()=>H(u.name),className:"h-7 px-3 rounded-md bg-[#16A34A] dark:bg-[#22C55E] text-white dark:text-[#0C0C0C] text-[11px] font-mono font-semibold",children:"Connect"}),e.jsx("button",{onClick:()=>K(u.name),className:"h-7 px-3 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] text-[#ef4444] text-[11px] font-mono font-semibold",children:"Delete"})]}),e.jsx("div",{className:"h-px bg-[#E5E7EB] dark:bg-[#1f2937]"}),e.jsx("span",{className:"text-sm font-mono font-semibold text-[#111827] dark:text-[#E5E5E5]",children:"Permissions"}),e.jsx(Z,{label:"File read",enabled:D.read,onToggle:()=>U("read")}),e.jsx(Z,{label:"File write",enabled:D.write,onToggle:()=>U("write")}),e.jsx(Z,{label:"Shell exec",enabled:D.shell,onToggle:()=>U("shell")}),e.jsxs("span",{className:"text-sm font-mono font-semibold text-[#111827] dark:text-[#E5E5E5]",children:["Tools (",u.tools.length,")"]}),e.jsx("div",{className:"flex flex-wrap gap-2",children:u.tools.length===0?e.jsx("span",{className:"text-[12px] font-mono text-[#9CA3AF] dark:text-[#71717a]",children:"No tools available"}):u.tools.map(t=>e.jsx("span",{className:"px-2 py-1 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] text-[11px] font-mono text-[#111827] dark:text-[#E5E5E5]",children:t},t))})]}):e.jsx("div",{className:"flex-1 flex items-center justify-center",children:e.jsx("span",{className:"text-[#9CA3AF] dark:text-[#71717a] text-sm font-mono",children:"Select a server to view details"})})]}):e.jsxs("div",{className:"flex flex-col gap-4 flex-1 min-h-0",children:[e.jsx("div",{className:"flex items-center gap-3 shrink-0",children:e.jsxs("div",{className:"flex-1 h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] flex items-center px-3 gap-2",children:[e.jsx(ye,{className:"h-3.5 w-3.5 text-[#9CA3AF] dark:text-[#71717a]"}),e.jsx("input",{type:"text",value:k,onChange:t=>{v(t.target.value),P(t.target.value)},placeholder:"Search MCP servers on npm (min 3 chars)...",className:"flex-1 bg-transparent text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] placeholder:text-[#9CA3AF] dark:placeholder:text-[#71717a] focus:outline-none"})]})}),e.jsxs("div",{ref:R,className:"flex-1 overflow-y-auto min-h-0",children:[L&&!E?e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(ce,{className:"h-6 w-6 text-[#9CA3AF] dark:text-[#71717a] animate-spin"})}):e.jsx("div",{className:"grid grid-cols-2 gap-3 pb-4",children:E==null?void 0:E.list.map(t=>{var ne,re;const j=X.has(t.name.toLowerCase().replace(/\s+/g,"-")),b=p===t.name,z=f(t);return e.jsxs("div",{className:"rounded-lg bg-white dark:bg-[#0C0C0C] p-4 flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-[13px] font-mono font-semibold text-[#111827] dark:text-[#E5E5E5] truncate",children:t.name}),e.jsx("span",{className:A("text-[10px] font-mono px-2 py-0.5 rounded shrink-0",z==="Official"?"bg-[#16A34A]/20 dark:bg-[#22C55E]/20 text-[#16A34A] dark:text-[#22C55E]":"bg-[#3b82f6]/20 text-[#3b82f6]"),children:z})]}),e.jsx("p",{className:"text-[11px] font-mono text-[#6B7280] dark:text-[#94a3b8] line-clamp-2",children:t.description||"No description"}),e.jsxs("div",{className:"flex items-center gap-2 text-[10px] font-mono text-[#9CA3AF] dark:text-[#71717a]",children:[e.jsxs("span",{children:["v",t.version]}),((ne=t.publisher)==null?void 0:ne.username)&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"•"}),e.jsxs("span",{children:["by ",t.publisher.username]})]})]}),e.jsxs("div",{className:"flex items-center justify-between mt-auto pt-2",children:[e.jsxs("a",{href:((re=t.links)==null?void 0:re.npm)||`https://www.npmjs.com/package/${t.name}`,target:"_blank",rel:"noopener noreferrer",className:"text-[10px] font-mono text-[#9CA3AF] dark:text-[#71717a] hover:text-[#111827] dark:hover:text-[#E5E5E5] flex items-center gap-1",children:[e.jsx(de,{className:"h-3 w-3"}),"npm"]}),j?e.jsxs("span",{className:"text-[11px] font-mono text-[#16A34A] dark:text-[#22C55E] flex items-center gap-1",children:[e.jsx(we,{className:"h-3 w-3"}),"Installed"]}):e.jsxs("button",{onClick:()=>J(t),disabled:b,className:"h-6 px-2 rounded-md bg-[#E5E7EB] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5] text-[10px] font-mono font-semibold flex items-center gap-1 hover:bg-[#D1D5DB] dark:hover:bg-[#32323a] disabled:opacity-50",children:[e.jsx(Ae,{className:A("h-3 w-3",b&&"animate-pulse")}),b?"Installing...":"Install"]})]})]},t.name)})}),M&&e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(ce,{className:"h-5 w-5 text-[#9CA3AF] dark:text-[#71717a] animate-spin"})}),$&&E&&E.list.length>0&&e.jsx("div",{className:"text-center py-4 text-[11px] font-mono text-[#9CA3AF] dark:text-[#71717a]",children:"No more packages"})]}),e.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-[#E5E7EB] dark:border-[#1f2937] shrink-0",children:[e.jsxs("span",{className:"text-[11px] font-mono text-[#9CA3AF] dark:text-[#71717a]",children:[(E==null?void 0:E.total)??0," packages found"]}),e.jsxs("a",{href:"https://glama.ai/mcp/servers",target:"_blank",rel:"noopener noreferrer",className:"text-[11px] font-mono text-[#3b82f6] hover:underline flex items-center gap-1",children:["Browse more on Glama",e.jsx(de,{className:"h-3 w-3"})]})]})]})]})})]})}),e.jsx(Ue,{open:d,onOpenChange:l,onAdd:I}),C&&e.jsx($e,{pkg:C,onClose:()=>F(null),onInstall:t=>{_(C.name),I(t)}})]})}function fe({active:a,children:n,onClick:r}){return e.jsx("button",{onClick:r,className:A("px-3 py-1 rounded text-[12px] font-mono font-semibold transition-colors",a?"bg-[#E5E7EB] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5]":"text-[#6B7280] dark:text-[#a1a1aa]"),children:n})}function Z({label:a,enabled:n,onToggle:r}){return e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[13px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:a}),e.jsx(He,{enabled:n,onChange:r})]})}function He({enabled:a,onChange:n}){return e.jsx("button",{onClick:n,className:A("w-9 h-5 rounded-full px-0.5 flex items-center transition-colors",a?"bg-[#16A34A] dark:bg-[#22C55E] justify-end":"bg-[#E5E7EB] dark:bg-[#27272a] justify-start"),children:e.jsx("span",{className:"h-4 w-4 rounded-full bg-white"})})}function Ue({open:a,onOpenChange:n,onAdd:r}){const[c,d]=o.useState("form"),[l,s]=o.useState(""),[m,h]=o.useState(""),[i,k]=o.useState(""),[v,N]=o.useState(`{
|
|
2
|
-
"name": "my-server",
|
|
3
|
-
"command": "npx",
|
|
4
|
-
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
5
|
-
}`),S=()=>{if(c==="json")try{const p=JSON.parse(v);r(p)}catch{alert("Invalid JSON")}else{if(!l||!m){alert("Name and command are required");return}r({name:l,command:m,args:i.split(" ").filter(Boolean)})}};return e.jsx(V,{open:a,onOpenChange:n,children:e.jsxs(ee,{className:"sm:max-w-[540px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl","aria-describedby":void 0,hideCloseButton:!0,children:[e.jsx(te,{className:"sr-only",children:"Add MCP Server"}),e.jsxs("div",{className:"p-6 flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-base font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:"Add MCP Server"}),e.jsx("button",{onClick:()=>n(!1),className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",children:e.jsx(ae,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"flex items-center gap-2 p-1 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] w-fit",children:[e.jsx(he,{active:c==="form",onClick:()=>d("form"),children:"Form"}),e.jsx(he,{active:c==="json",onClick:()=>d("json"),children:"JSON"})]}),c==="json"?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"JSON config"}),e.jsx("textarea",{className:"min-h-[140px] rounded-md bg-white dark:bg-[#0C0C0C] text-[#111827] dark:text-[#E5E5E5] font-mono text-[12px] p-3 border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]",value:v,onChange:p=>N(p.target.value)})]}):e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"Server name"}),e.jsx("input",{type:"text",value:l,onChange:p=>s(p.target.value),placeholder:"my-server",className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] px-3 text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"Command"}),e.jsx("input",{type:"text",value:m,onChange:p=>h(p.target.value),placeholder:"npx",className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] px-3 text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"Arguments (space separated)"}),e.jsx("input",{type:"text",value:i,onChange:p=>k(p.target.value),placeholder:"-y @modelcontextprotocol/server-filesystem /tmp",className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] px-3 text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]"})]})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 pt-2",children:[e.jsx("button",{onClick:()=>n(!1),className:"h-7 px-3 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[11px] font-mono font-semibold",children:"Cancel"}),e.jsx("button",{onClick:S,className:"h-7 px-3 rounded-md bg-[#16A34A] dark:bg-[#22C55E] text-white dark:text-[#0C0C0C] text-[11px] font-mono font-semibold",children:"Add Server"})]})]})]})})}function $e({pkg:a,onClose:n,onInstall:r}){var i;const c=((i=a.name.split("/").pop())==null?void 0:i.replace(/^server-/,""))||a.name,[d,l]=o.useState(c),[s,m]=o.useState(`-y ${a.name}`),h=()=>{if(!d.trim()){alert("Server name is required");return}r({name:d.trim(),command:"npx",args:s.split(" ").filter(Boolean)})};return e.jsx(V,{open:!0,onOpenChange:n,children:e.jsxs(ee,{className:"sm:max-w-[480px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl","aria-describedby":void 0,hideCloseButton:!0,children:[e.jsxs(te,{className:"sr-only",children:["Install ",a.name]}),e.jsxs("div",{className:"p-6 flex flex-col gap-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h3",{className:"text-base font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:"Install MCP Server"}),e.jsx("button",{onClick:n,className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",children:e.jsx(ae,{className:"h-4 w-4"})})]}),e.jsxs("div",{className:"rounded-md bg-white dark:bg-[#0C0C0C] p-3",children:[e.jsx("span",{className:"text-[13px] font-mono font-semibold text-[#111827] dark:text-[#E5E5E5]",children:a.name}),e.jsx("p",{className:"text-[11px] font-mono text-[#6B7280] dark:text-[#94a3b8] mt-1",children:a.description||"No description"})]}),e.jsx("div",{className:"h-px bg-[#E5E7EB] dark:bg-[#1f2937]"}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"Server name"}),e.jsx("input",{type:"text",value:d,onChange:k=>l(k.target.value),placeholder:"my-server",className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] px-3 text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[12px] font-mono text-[#6B7280] dark:text-[#a1a1aa]",children:"Arguments"}),e.jsx("input",{type:"text",value:s,onChange:k=>m(k.target.value),placeholder:"-y package-name",className:"h-8 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] px-3 text-[12px] font-mono text-[#111827] dark:text-[#E5E5E5] border border-transparent focus:outline-none focus:border-[#E5E7EB] dark:border-[#27272a]"}),e.jsxs("span",{className:"text-[10px] font-mono text-[#9CA3AF] dark:text-[#71717a]",children:["Command: npx ",s]})]})]}),e.jsxs("div",{className:"flex items-center justify-end gap-2 pt-2",children:[e.jsx("button",{onClick:n,className:"h-7 px-3 rounded-md bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[11px] font-mono font-semibold",children:"Cancel"}),e.jsx("button",{onClick:h,className:"h-7 px-3 rounded-md bg-[#16A34A] dark:bg-[#22C55E] text-white dark:text-[#0C0C0C] text-[11px] font-mono font-semibold",children:"Install"})]})]})]})})}function he({active:a,children:n,onClick:r}){return e.jsx("button",{onClick:r,className:A("px-3 py-1 rounded text-[12px] font-mono font-semibold transition-colors",a?"bg-[#E5E7EB] text-[#111827] dark:bg-[#27272a] dark:text-[#E5E5E5]":"text-[#6B7280] dark:text-[#a1a1aa]"),children:n})}export{Ke as McpModal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as l,j as e}from"./vendor-react-FPIC4Czm.js";import{D as O,a as M,b as T,c as u,u as _,d as H}from"./index-DIWzaS2_.js";import{u as J}from"./SettingsStore-C8YBWQPS.js";import{X as P,E as Q,D as W,b as L,f as q,i as V}from"./vendor-icons-DBM55KTG.js";import"./vendor-markdown-b9iCqZWK.js";import"./vendor-monaco-w6PwaWGP.js";import"./vendor-radix-DyP_DOwV.js";function X({open:a,onOpenChange:r,onSave:j}){const[f,v]=l.useState([]),[h,n]=l.useState([]),[s,c]=l.useState(),[i,m]=l.useState(),[k,w]=l.useState(""),[b,C]=l.useState(""),[F,E]=l.useState(!1),[S,N]=l.useState(!1),[y,B]=l.useState(!1);l.useEffect(()=>{a&&(n([]),c(void 0),m(void 0),w(""),C(""),E(!1),N(!1),B(!1),fetch("/providers").then(o=>o.json()).then(v))},[a]),l.useEffect(()=>{s&&fetch(`/providers/${s.id}/models`).then(o=>o.json()).then(n)},[s]);const A=()=>{!s||!i||!s.configured&&!b||(j({provider:s.id,model:i.id,displayName:k||i.name,apiKey:b||void 0}),r(!1))};return e.jsx(O,{open:a,onOpenChange:r,children:e.jsxs(M,{className:"sm:max-w-[480px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl [&>button]:hidden","aria-describedby":void 0,children:[e.jsx(T,{className:"sr-only",children:"Add Model"}),e.jsxs("div",{className:"flex flex-col gap-6 p-6",children:[e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx("h2",{className:"font-mono text-base font-semibold",children:"Add Model"}),e.jsx("button",{type:"button",onClick:()=>r(!1),children:e.jsx(P,{className:"w-4 h-4"})})]}),e.jsx($,{label:"Provider",value:(s==null?void 0:s.name)??"Select provider",open:F,setOpen:E,options:f.map(o=>({id:o.id,label:`${o.name} (${o.modelCount})${o.configured?" · configured":""}`,selected:(s==null?void 0:s.id)===o.id,select:()=>{c(o),m(void 0),E(!1)}}))}),e.jsx($,{label:"Model",value:(i==null?void 0:i.name)??"Select model",open:S,setOpen:N,options:h.map(o=>({id:o.id,label:`${o.name} · ${Math.round(o.contextWindow/1e3)}K${o.reasoning?" · reasoning":""}${o.input.includes("image")?" · vision":""}`,selected:(i==null?void 0:i.id)===o.id,select:()=>{m(o),w(o.name),N(!1)}}))}),e.jsx(Y,{label:"Display name",value:k,onChange:w,placeholder:(i==null?void 0:i.name)??"Optional alias"}),(s==null?void 0:s.supportsApiKey)&&!s.configured&&e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-zinc-500 font-mono",children:"API Key"}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:y?"text":"password",value:b,onChange:o=>C(o.target.value),className:"pr-10 field",placeholder:"Stored separately in auth.json"}),e.jsx("button",{type:"button",onClick:()=>B(!y),className:"absolute right-3 top-1/2 -translate-y-1/2",children:y?e.jsx(Q,{className:"w-4 h-4"}):e.jsx(W,{className:"w-4 h-4"})})]})]}),s&&!s.configured&&!s.supportsApiKey&&e.jsx("p",{className:"font-mono text-sm text-amber-600",children:"This provider requires OAuth or ambient credentials. Configure it externally before selecting the model."}),e.jsx("button",{type:"button",disabled:!s||!i||!s.configured&&(!s.supportsApiKey||b.trim().length===0),onClick:A,className:"px-4 py-2 font-mono text-sm font-semibold text-white bg-green-600 rounded-md disabled:opacity-50",children:"Save Model"})]})]})})}function $(a){return e.jsxs("div",{className:"flex relative flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-zinc-500 font-mono",children:a.label}),e.jsxs("button",{type:"button",onClick:()=>a.setOpen(!a.open),className:"flex justify-between field",children:[a.value,e.jsx(L,{className:"w-4 h-4"})]}),a.open&&e.jsx("div",{className:"overflow-y-auto absolute right-0 left-0 top-full z-50 max-h-64 bg-white rounded-md border dark:bg-zinc-900",children:a.options.map(r=>e.jsx("button",{type:"button",onClick:r.select,className:u("w-full text-left px-3 py-2 text-sm font-mono",r.selected&&"bg-zinc-100 dark:bg-zinc-800"),children:r.label},r.id))})]})}function Y(a){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("label",{className:"text-[13px] text-zinc-500 font-mono",children:a.label}),e.jsx("input",{value:a.value,onChange:r=>a.onChange(r.target.value),placeholder:a.placeholder,className:"field"})]})}function Z(a){const[r,j]=l.useState(""),[f,v]=l.useState(""),[h,n]=l.useState("");l.useEffect(()=>{var c,i,m;j(((c=a.model)==null?void 0:c.displayName)??""),v(((m=(i=a.model)==null?void 0:i.overrides)==null?void 0:m.baseUrl)??"")},[a.model]);const s=async()=>{if(a.model){if(h.trim()&&!(await fetch(`/providers/${a.model.provider}/credential`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:h.trim()})})).ok)throw new Error("Failed to update provider credential");a.onSave(a.model.id,{displayName:r||void 0,overrides:f?{...a.model.overrides,baseUrl:f}:void 0}),a.onOpenChange(!1)}};return e.jsx(O,{open:a.open,onOpenChange:a.onOpenChange,children:e.jsxs(M,{className:"sm:max-w-[480px] p-6 bg-white dark:bg-[#09090b]","aria-describedby":void 0,children:[e.jsx(T,{className:"sr-only",children:"Edit Model"}),e.jsxs("div",{className:"flex justify-between",children:[e.jsx("h2",{className:"font-semibold font-mono",children:"Edit Model Overrides"}),e.jsx("button",{type:"button",onClick:()=>a.onOpenChange(!1),children:e.jsx(P,{className:"h-4 w-4"})})]}),e.jsx("label",{className:"font-mono text-sm",children:"Display name"}),e.jsx("input",{value:r,onChange:c=>j(c.target.value),className:"field"}),e.jsx("label",{className:"font-mono text-sm",children:"Replace provider API key"}),e.jsx("input",{type:"password",value:h,onChange:c=>n(c.target.value),placeholder:"Leave empty to keep current credential",className:"field"}),e.jsx("label",{className:"font-mono text-sm",children:"Base URL override"}),e.jsx("input",{value:f,onChange:c=>v(c.target.value),placeholder:"Leave empty to use default endpoint",className:"field"}),e.jsx("button",{type:"button",onClick:()=>void s(),className:"px-4 py-2 rounded-md text-white bg-green-600",children:"Save"})]})})}const ee={anthropic:{bg:"#d97757",label:"A"},gemini:{bg:"#4285f4",label:"G"},"azure-openai":{bg:"#0078d4",label:"Az"},"gpt-openai-platform":{bg:"#10a37f",label:"GP"}};function ie(){var z;const{isSettingsOpen:a,toggleSettings:r,isSidebarOpen:j,setSidebarOpen:f}=_(),{configuredModels:v,loadModels:h}=H(),n=J(),[s,c]=l.useState("general"),[i,m]=l.useState(!1),[k,w]=l.useState(null),[b,C]=l.useState(null),[F,E]=l.useState(""),[S,N]=l.useState("all"),y=[{value:"general",label:"General"},{value:"models",label:"Models"},{value:"shortcuts",label:"Shortcuts"}],A=l.useMemo(()=>[{action:"Open command palette",combo:["Ctrl","K"],scope:"Global"},{action:"New chat",combo:["Ctrl","N"],scope:"Chat"},{action:"Focus input",combo:["Ctrl","L"],scope:"Chat"},{action:"Toggle sidebar",combo:["Ctrl","B"],scope:"Layout"},{action:"Search history",combo:["Ctrl","H"],scope:"History"}],[]).filter(t=>{const d=t.action.toLowerCase().includes(F.toLowerCase()),x=S==="all"||t.scope.toLowerCase()===S;return d&&x}),o=v.reduce((t,d)=>{const x=d.provider||"unknown";return t[x]||(t[x]=[]),t[x].push(d),t},{});l.useEffect(()=>{a&&(h(),n.loadSettings())},[a,h,n.loadSettings]);const R=async t=>{try{if(!(await fetch("/models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t.provider,displayName:t.displayName,model:t.model,apiKey:t.apiKey})})).ok)throw new Error("Failed to save model");await h()}catch(d){console.error("Failed to save model:",d)}},U=async t=>{try{if(!(await fetch(`/models/${t}`,{method:"DELETE"})).ok)throw new Error("Failed to delete model");await h()}catch(d){console.error("Failed to delete model:",d)}},G=async(t,d)=>{try{if(!(await fetch(`/models/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).ok)throw new Error("Failed to update model");await h()}catch(x){console.error("Failed to update model:",x)}},I=t=>{w(k===t?null:t)};return e.jsxs(e.Fragment,{children:[e.jsx(O,{open:a,onOpenChange:r,children:e.jsxs(M,{className:"sm:max-w-[800px] h-[600px] p-0 overflow-hidden gap-0 bg-white dark:bg-[#09090b] border border-[#E5E7EB] dark:border-zinc-800 rounded-xl flex flex-col","aria-describedby":void 0,hideCloseButton:!0,children:[e.jsx(T,{className:"sr-only",children:"Settings"}),e.jsxs("div",{className:"flex h-full",children:[e.jsx("div",{className:"w-[200px] h-full bg-[#F3F4F6] dark:bg-[#18181b] p-6 flex flex-col gap-2",children:y.map(t=>e.jsx("button",{onClick:()=>c(t.value),className:u("w-full text-left px-3 py-2 rounded-md text-sm font-mono transition-colors",s===t.value?"bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5] font-medium":"text-[#6B7280] hover:text-[#111827] hover:bg-[#E5E7EB]/60 dark:text-[#a1a1aa] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a]/50"),children:t.label},t.value))}),e.jsxs("div",{className:"flex-1 p-8 flex flex-col gap-6 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("h2",{className:"text-lg font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono",children:s==="general"?"Settings":(z=y.find(t=>t.value===s))==null?void 0:z.label}),e.jsx("button",{onClick:r,className:"h-8 w-8 rounded-md text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] transition-colors flex items-center justify-center",children:e.jsx(P,{className:"h-4 w-4"})})]}),s==="models"&&e.jsxs("div",{className:"flex flex-col gap-6 flex-1 min-h-0 overflow-hidden",children:[e.jsx("p",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono shrink-0",children:"Configure API keys and model settings for different providers."}),e.jsx("div",{className:"flex-1 overflow-y-auto min-h-0",children:e.jsxs("div",{className:"flex flex-col gap-2 pr-2",children:[Object.entries(o).map(([t,d])=>{const x=ee[t]||{bg:"#71717a",label:"?"},K=k===t;return e.jsxs("div",{className:"w-full bg-[#F3F4F6] dark:bg-[#18181b] rounded-lg overflow-hidden",children:[e.jsxs("button",{onClick:()=>I(t),className:"w-full p-4 flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#1f1f23] transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"w-8 h-8 rounded flex items-center justify-center text-white text-xs font-bold",style:{backgroundColor:x.bg},children:x.label}),e.jsxs("div",{className:"flex flex-col gap-0.5 text-left",children:[e.jsx("span",{className:"text-sm font-semibold text-[#111827] dark:text-[#E5E5E5] font-mono capitalize",children:t.replace(/-/g," ")}),e.jsxs("span",{className:"text-xs text-[#9CA3AF] dark:text-[#71717a] font-mono",children:[d.length," model",d.length>1?"s":""]})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:u("text-xs font-mono","text-[#16A34A]"),children:"● Connected"}),e.jsx(L,{className:u("h-4 w-4 text-[#9CA3AF] dark:text-[#71717a] transition-transform",K&&"rotate-180")})]})]}),K&&e.jsx("div",{className:"border-t border-[#E5E7EB] dark:border-zinc-800",children:d.map(p=>{var D;return e.jsxs("div",{className:"px-4 py-3 flex items-center justify-between hover:bg-[#E5E7EB] dark:hover:bg-[#1f1f23] group",children:[e.jsxs("div",{className:"flex flex-col gap-0.5 flex-1 min-w-0",children:[e.jsx("span",{className:"text-sm text-[#111827] dark:text-[#E5E5E5] font-mono truncate",children:p.displayName||p.model}),e.jsxs("span",{className:"text-xs text-[#9CA3AF] dark:text-[#71717a] font-mono truncate",children:[p.displayName&&`${p.model} · `,((D=p.overrides)==null?void 0:D.baseUrl)||"default endpoint"]})]}),e.jsxs("div",{className:"flex items-center gap-2 opacity-0 group-hover:opacity-100 transition-opacity",children:[e.jsx("button",{onClick:()=>C(p),className:"p-1.5 text-[#9CA3AF] hover:text-[#111827] hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-[#E5E5E5] dark:hover:bg-[#27272a] rounded transition-colors",children:e.jsx(q,{className:"h-3.5 w-3.5"})}),e.jsx("button",{onClick:()=>U(p.id),className:"p-1.5 text-[#9CA3AF] hover:text-red-500 hover:bg-[#E5E7EB] dark:text-[#71717a] dark:hover:text-red-400 dark:hover:bg-[#27272a] rounded transition-colors",children:e.jsx(V,{className:"h-3.5 w-3.5"})})]})]},p.id)})})]},t)}),Object.keys(o).length===0&&e.jsx("div",{className:"text-center py-8 text-[#9CA3AF] dark:text-[#71717a] text-sm font-mono",children:"No models configured yet"})]})}),e.jsx("button",{onClick:()=>m(!0),className:"w-full py-3 rounded-md text-[#6B7280] dark:text-[#a1a1aa] text-[13px] font-mono hover:bg-[#F3F4F6] dark:bg-[#18181b] transition-colors shrink-0",children:"+ Add New Model"})]}),s==="general"&&e.jsxs("div",{className:"flex flex-col gap-6 overflow-y-auto pr-2",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"General"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Response Language"}),e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#71717a] font-mono",children:"AI will respond in this language"})]}),e.jsxs("select",{value:n.language,onChange:t=>n.updateSettings({language:t.target.value}),className:"h-8 bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono rounded-md px-3 border border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("option",{value:"en-US",children:"English (US)"}),e.jsx("option",{value:"zh-CN",children:"简体中文"}),e.jsx("option",{value:"zh-TW",children:"繁體中文"}),e.jsx("option",{value:"ja-JP",children:"日本語"}),e.jsx("option",{value:"ko-KR",children:"한국어"}),e.jsx("option",{value:"es-ES",children:"Español"}),e.jsx("option",{value:"fr-FR",children:"Français"}),e.jsx("option",{value:"de-DE",children:"Deutsch"}),e.jsx("option",{value:"pt-BR",children:"Português (BR)"}),e.jsx("option",{value:"ru-RU",children:"Русский"})]})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Auto-save sessions"}),e.jsx(g,{enabled:n.autoSaveSessions,onChange:t=>n.updateSettings({autoSaveSessions:t})})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Appearance"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Theme Preference"}),e.jsx("div",{className:"flex items-center gap-2 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md p-1",children:["dark","light","system"].map(t=>e.jsx("button",{onClick:()=>n.updateSettings({uiTheme:t}),className:u("px-3 py-1 rounded text-[12px] font-mono transition-colors",n.uiTheme===t?"bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5]":"text-[#9CA3AF] dark:text-[#71717a] hover:text-[#111827] dark:hover:text-[#E5E5E5]"),children:t==="dark"?"Dark":t==="light"?"Light":"System"},t))})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Compact sidebar"}),e.jsx(g,{enabled:!j,onChange:t=>f(!t)})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Code theme"}),e.jsx("span",{className:"text-[11px] text-[#9CA3AF] dark:text-[#71717a] font-mono",children:"Syntax highlighting colors"})]}),e.jsxs("select",{value:n.theme,onChange:t=>n.updateSettings({theme:t.target.value}),className:"h-8 bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono rounded-md px-3 border border-[#E5E7EB] dark:border-[#27272a]",children:[e.jsx("option",{value:"dracula",children:"Dracula"}),e.jsx("option",{value:"monokai",children:"Monokai"}),e.jsx("option",{value:"nord",children:"Nord"}),e.jsx("option",{value:"tokyo-night",children:"Tokyo Night"}),e.jsx("option",{value:"one-dark",children:"One Dark"}),e.jsx("option",{value:"catppuccin",children:"Catppuccin"}),e.jsx("option",{value:"gruvbox",children:"Gruvbox"}),e.jsx("option",{value:"github",children:"GitHub"}),e.jsx("option",{value:"solarized-light",children:"Solarized Light"}),e.jsx("option",{value:"solarized-dark",children:"Solarized Dark"}),e.jsx("option",{value:"ayu-dark",children:"Ayu Dark"}),e.jsx("option",{value:"rose-pine",children:"Rose Pine"}),e.jsx("option",{value:"kanagawa",children:"Kanagawa"})]})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Notifications"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Build finished"}),e.jsx(g,{enabled:n.notifyBuild,onChange:t=>n.updateSettings({notifyBuild:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Errors only"}),e.jsx(g,{enabled:n.notifyErrors,onChange:t=>n.updateSettings({notifyErrors:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"System sounds"}),e.jsx(g,{enabled:n.notifySounds,onChange:t=>n.updateSettings({notifySounds:t})})]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h3",{className:"text-[14px] text-[#111827] dark:text-[#E5E5E5] font-mono font-semibold",children:"Privacy"}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Telemetry"}),e.jsx(g,{enabled:n.privacyTelemetry,onChange:t=>n.updateSettings({privacyTelemetry:t})})]}),e.jsxs("div",{className:"flex items-center justify-between py-2",children:[e.jsx("span",{className:"text-[13px] text-[#6B7280] dark:text-[#a1a1aa] font-mono",children:"Crash reports"}),e.jsx(g,{enabled:n.privacyCrash,onChange:t=>n.updateSettings({privacyCrash:t})})]})]})]}),s==="shortcuts"&&e.jsxs("div",{className:"flex flex-col gap-4 flex-1 min-h-0 overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-3 shrink-0",children:[e.jsx("input",{value:F,onChange:t=>E(t.target.value),placeholder:"Search actions...",className:"flex-1 h-9 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono"}),e.jsxs("select",{value:S,onChange:t=>N(t.target.value),className:"h-9 bg-[#F3F4F6] dark:bg-[#18181b] border border-[#E5E7EB] dark:border-[#27272a] rounded-md px-3 text-[12px] text-[#111827] dark:text-[#E5E5E5] font-mono",children:[e.jsx("option",{value:"all",children:"All scopes"}),e.jsx("option",{value:"global",children:"Global"}),e.jsx("option",{value:"chat",children:"Chat"}),e.jsx("option",{value:"layout",children:"Layout"}),e.jsx("option",{value:"history",children:"History"})]}),e.jsx("button",{onClick:()=>{E(""),N("all")},className:"h-9 px-3 rounded-md bg-[#E5E7EB] dark:bg-[#27272a] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono font-semibold",children:"Reset"})]}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto border border-[#E5E7EB] dark:border-[#27272a] rounded-lg bg-[#E5E7EB] dark:bg-[#111827]",children:[e.jsxs("div",{className:"grid grid-cols-[1fr_180px_120px] gap-2 px-3 py-2 bg-white dark:bg-[#0C0C0C] text-[12px] text-[#6B7280] dark:text-[#94a3b8] font-mono font-semibold",children:[e.jsx("span",{children:"Action"}),e.jsx("span",{children:"Shortcut"}),e.jsx("span",{children:"Scope"})]}),A.map((t,d)=>e.jsxs("div",{className:u("grid grid-cols-[1fr_180px_120px] gap-2 px-3 py-2 text-[13px] font-mono",d%2===0?"bg-[#E5E7EB] dark:bg-[#111827]":"bg-white dark:bg-[#0C0C0C]"),children:[e.jsx("span",{className:"text-[#111827] dark:text-[#E5E5E5]",children:t.action}),e.jsx("div",{className:"flex items-center gap-1",children:t.combo.map(x=>e.jsx("span",{className:"px-2 py-0.5 rounded bg-[#F3F4F6] dark:bg-[#18181b] text-[#111827] dark:text-[#E5E5E5] text-[12px] font-mono font-semibold",children:x},x))}),e.jsx("span",{className:"text-[#6B7280] dark:text-[#94a3b8] text-[12px]",children:t.scope})]},`${t.action}-${t.scope}`)),A.length===0&&e.jsx("div",{className:"px-3 py-6 text-center text-[12px] text-[#6B7280] dark:text-[#94a3b8] font-mono",children:"No shortcuts found."})]})]})]})]})]})}),e.jsx(X,{open:i,onOpenChange:m,onSave:R}),e.jsx(Z,{open:!!b,onOpenChange:t=>!t&&C(null),model:b,onSave:G})]})}function g({enabled:a,onChange:r}){return e.jsx("button",{onClick:()=>r(!a),className:u("w-10 h-5 rounded-full px-0.5 flex items-center transition-colors",a?"bg-[#22C55E]":"bg-[#E5E7EB] dark:bg-[#27272a]"),children:e.jsx("span",{className:u("h-4 w-4 rounded-full transition-transform",a?"translate-x-5 bg-white":"translate-x-0 bg-white dark:bg-[#a1a1aa]")})})}export{ie as SettingsModal};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{h as n}from"./index-DIWzaS2_.js";const c=s=>s==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:s==="dark",i=s=>{const t=document.documentElement;if(t.classList.remove("light","dark"),s==="system"){const r=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";t.classList.add(r)}else t.classList.add(s)},o={language:"zh-CN",theme:"dracula",uiTheme:"system",autoSaveSessions:!0,notifyBuild:!0,notifyErrors:!1,notifySounds:!1,privacyTelemetry:!1,privacyCrash:!0},l=n((s,t)=>({...o,isLoading:!1,error:null,loadSettings:async()=>{s({isLoading:!0,error:null});try{const r=await fetch("/configs");if(!r.ok)throw new Error("Failed to load settings");const e=await r.json(),a=e.uiTheme??o.uiTheme;s({language:e.language??o.language,theme:e.theme??o.theme,uiTheme:a,autoSaveSessions:e.autoSaveSessions??o.autoSaveSessions,notifyBuild:e.notifyBuild??o.notifyBuild,notifyErrors:e.notifyErrors??o.notifyErrors,notifySounds:e.notifySounds??o.notifySounds,privacyTelemetry:e.privacyTelemetry??o.privacyTelemetry,privacyCrash:e.privacyCrash??o.privacyCrash,isLoading:!1}),i(a)}catch(r){s({error:r.message,isLoading:!1})}},updateSettings:async r=>{const e=t();s({...r,error:null}),r.uiTheme&&i(r.uiTheme);try{if(!(await fetch("/configs",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({updates:r,options:{scope:"global"}})})).ok)throw new Error("Failed to save settings")}catch(a){s({language:e.language,theme:e.theme,uiTheme:e.uiTheme,autoSaveSessions:e.autoSaveSessions,notifyBuild:e.notifyBuild,notifyErrors:e.notifyErrors,notifySounds:e.notifySounds,privacyTelemetry:e.privacyTelemetry,privacyCrash:e.privacyCrash,error:a.message}),r.uiTheme&&i(e.uiTheme)}}}));i(o.uiTheme);const u=()=>l(s=>c(s.uiTheme));export{u as a,l as u};
|