pi-web-ui 0.90.1 → 0.92.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +81 -1
  2. package/bin/pi-web-ui.mjs +21 -2
  3. package/dist/server/agent-service.js +1206 -106
  4. package/dist/server/claim-files-tool.js +116 -0
  5. package/dist/server/claim-store.js +301 -0
  6. package/dist/server/client-state.js +119 -5
  7. package/dist/server/compaction-markers.js +287 -0
  8. package/dist/server/conversation-read-tool.js +369 -27
  9. package/dist/server/conversation-touches.js +357 -0
  10. package/dist/server/delegate-task.js +12 -1
  11. package/dist/server/dsh/dsh-agent-service.js +28 -1
  12. package/dist/server/file-transfer-routes.js +4 -1
  13. package/dist/server/icon-svg.js +35 -0
  14. package/dist/server/index.js +152 -34
  15. package/dist/server/model-admin.js +124 -2
  16. package/dist/server/model-enrich.js +478 -0
  17. package/dist/server/plugin-catalog.js +5 -0
  18. package/dist/server/plugin-facilities.js +42 -11
  19. package/dist/server/plugin-schedule.js +27 -2
  20. package/dist/server/plugins.js +112 -18
  21. package/dist/server/present-files-tool.js +303 -0
  22. package/dist/server/prompt-composer.js +1 -1
  23. package/dist/server/protocol-version.js +1 -1
  24. package/dist/server/read-tool.js +91 -0
  25. package/dist/server/schedule-agent-tool.js +23 -5
  26. package/dist/server/scheduler-tasks.js +60 -1
  27. package/dist/server/scm-commitmsg.js +140 -0
  28. package/dist/server/scm.js +42 -0
  29. package/dist/server/serialize.js +21 -1
  30. package/dist/server/settings-service.js +47 -0
  31. package/dist/server/skill-tool.js +120 -0
  32. package/dist/server/soft-cap.js +68 -0
  33. package/dist/server/subagent-templates.js +6 -0
  34. package/dist/server/subagents.js +157 -16
  35. package/dist/server/text-sniff.js +15 -0
  36. package/dist/server/themes.js +17 -2
  37. package/dist/server/tool-manager.js +13 -1
  38. package/package.json +2 -1
  39. package/plugin-sdk/README.md +1 -0
  40. package/plugins/catalog.json +20 -0
  41. package/themes/catppuccin-latte.css +136 -0
  42. package/themes/catppuccin.css +140 -0
  43. package/themes/nord.css +130 -0
  44. package/themes/one-dark.css +131 -0
  45. package/themes/paper.css +12 -12
  46. package/themes/solarized-light.css +131 -0
  47. package/themes/tokyo-night.css +140 -0
  48. package/web/dist/assets/{TerminalPanel-CkxM4Byl.js → TerminalPanel-RACpk6AX.js} +1 -1
  49. package/web/dist/assets/es-DIDZppIF.js +2 -0
  50. package/web/dist/assets/index-BgrnP9Jz.js +364 -0
  51. package/web/dist/assets/index-Cy8dSTZt.css +1 -0
  52. package/web/dist/index.html +2 -2
  53. package/web/dist/assets/index-DJIV4A-t.js +0 -355
  54. package/web/dist/assets/index-DLdcRBs_.css +0 -1
@@ -0,0 +1,131 @@
1
+ /* theme-name: 日照浅色 */
2
+ /* theme-name-en: Solarized Light */
3
+ /* theme-group: classic */
4
+ :root {
5
+ color-scheme: light;
6
+ --bg: #fdf6e3;
7
+ --bg-elev: #eee8d5;
8
+ --bg-elev2: #e0d8be;
9
+ --border: #d5cbab;
10
+ --border-soft: #e0d8be;
11
+ --text: #586e75;
12
+ --text-dim: #657b83;
13
+ --text-faint: #839496;
14
+ --accent: #268bd2;
15
+ --accent-soft: rgba(38, 139, 210, 0.12);
16
+ --green: #859900;
17
+ --green-soft: rgba(133, 153, 0, 0.12);
18
+ --red: #dc322f;
19
+ --red-soft: rgba(220, 50, 47, 0.1);
20
+ --amber: #b58900;
21
+ --term-bg: #fdf6e3;
22
+ --term-fg: #586e75;
23
+ --term-cursor: #586e75;
24
+ --term-cursor-accent: #fdf6e3;
25
+ --term-selection: rgba(7, 54, 66, 0.18);
26
+ --term-black: #073642;
27
+ --term-red: #dc322f;
28
+ --term-green: #859900;
29
+ --term-yellow: #b58900;
30
+ --term-blue: #268bd2;
31
+ --term-magenta: #d33682;
32
+ --term-cyan: #2aa198;
33
+ --term-white: #eee8d5;
34
+ --term-bright-black: #586e75;
35
+ --term-bright-red: #cb4b16;
36
+ --term-bright-green: #859900;
37
+ --term-bright-yellow: #b58900;
38
+ --term-bright-blue: #268bd2;
39
+ --term-bright-magenta: #6c71c4;
40
+ --term-bright-cyan: #2aa198;
41
+ --term-bright-white: #fdf6e3;
42
+ --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
43
+ --mermaid-font-size: 12px;
44
+ --tooltip-bg: #fdf6e3;
45
+ --code-bg: #eee8d5;
46
+ --code-text: #586e75;
47
+ --code-border: var(--border-soft);
48
+ --code-pad: 8px 10px;
49
+ --card-body-pad: 4px 14px 12px;
50
+ --err-text: #dc322f;
51
+ --red-text: #dc322f;
52
+ --amber-text: #b58900;
53
+ --info-blue: #2aa198;
54
+ --link: #268bd2;
55
+ --link-hover: #2aa198;
56
+ --link-soft: #268bd2;
57
+ --md-strong: #073642;
58
+ --skill-blue: #268bd2;
59
+ --plugin-purple: #b58cff;
60
+ --auth-green: #859900;
61
+ --scroll-thumb: #d5cbab;
62
+ --scroll-thumb-hover: #b7a982;
63
+ --notice-err-bg: #401d23;
64
+ --notice-warn-bg: #38251f;
65
+ --notice-info-bg: #1b2544;
66
+ --notice-err-border: #ef4444;
67
+ --notice-warn-border: #f59e0b;
68
+ --notice-info-border: #3b82f6;
69
+ --send-blue: #268bd2;
70
+ --send-blue-hover: #2aa198;
71
+ --brand-grad-a: #268bd2;
72
+ --brand-grad-b: #2aa198;
73
+ --on-amber: #1a1a1a;
74
+ --search-active-fg: #1a1d26;
75
+ --switch-knob: #ffffff;
76
+ --bg-elev3: rgba(255, 255, 255, 0.06);
77
+ --sunken-bg: rgba(0, 0, 0, 0.15);
78
+ --glow-015: rgba(255, 255, 255, 0.015);
79
+ --glow-025: rgba(255, 255, 255, 0.025);
80
+ --glow-03: rgba(255, 255, 255, 0.03);
81
+ --glow-04: rgba(255, 255, 255, 0.04);
82
+ --glow-05: rgba(255, 255, 255, 0.05);
83
+ --glow-12: rgba(255, 255, 255, 0.12);
84
+ --glow-18: rgba(255, 255, 255, 0.18);
85
+ --glow-22: rgba(255, 255, 255, 0.22);
86
+ --glow-38: rgba(255, 255, 255, 0.38);
87
+ --control-fg: #657b83;
88
+ --control-bg: #eee8d5;
89
+ --control-border: #d5cbab;
90
+ --bg-image: none;
91
+ --bg-image-dim: 0.78;
92
+ --bg-image-blur: 0px;
93
+ --wallpaper-panel-alpha: 100%;
94
+ --topbar-bg: #eee8d5;
95
+ --statusbar-bg: #eee8d5;
96
+ --panel-bg: #eee8d5;
97
+ --card-bg: #eee8d5;
98
+ --chip-bg: #e0d8be;
99
+ --msgs-bg: #fdf6e3;
100
+ --inputbox-bg: #e0d8be;
101
+ --menu-bg: var(--bg-elev2);
102
+ }
103
+
104
+ /* ---- syntax highlighting (Solarized Light) ---- */
105
+ .hljs {
106
+ color: #586e75;
107
+ background: #eee8d5;
108
+ }
109
+ .hljs-keyword,
110
+ .hljs-meta .hljs-keyword {
111
+ color: #859900;
112
+ }
113
+ .hljs-title,
114
+ .hljs-title.function_ {
115
+ color: #268bd2;
116
+ }
117
+ .hljs-number,
118
+ .hljs-literal {
119
+ color: #d33682;
120
+ }
121
+ .hljs-string {
122
+ color: #2aa198;
123
+ }
124
+ .hljs-built_in,
125
+ .hljs-type {
126
+ color: #b58900;
127
+ }
128
+ .hljs-comment {
129
+ color: #93a1a1;
130
+ font-style: italic;
131
+ }
@@ -0,0 +1,140 @@
1
+ /* theme-name: 东京之夜 */
2
+ /* theme-name-en: Tokyo Night */
3
+ /* theme-group: classic */
4
+ :root {
5
+ color-scheme: dark;
6
+ --bg: #1a1b26;
7
+ --bg-elev: #24283b;
8
+ --bg-elev2: #1f2335;
9
+ --border: #414868;
10
+ --border-soft: #292e42;
11
+ --text: #c0caf5;
12
+ --text-dim: #9aa5ce;
13
+ --text-faint: #565f89;
14
+ --accent: #7aa2f7;
15
+ --accent-soft: rgba(122, 162, 247, 0.14);
16
+ --green: #9ece6a;
17
+ --green-soft: rgba(158, 206, 106, 0.12);
18
+ --red: #f7768e;
19
+ --red-soft: rgba(247, 118, 142, 0.12);
20
+ --amber: #e0af68;
21
+ --term-bg: #16161e;
22
+ --term-fg: #c0caf5;
23
+ --term-cursor: #c0caf5;
24
+ --term-cursor-accent: #16161e;
25
+ --term-selection: rgba(81, 92, 138, 0.4);
26
+ --term-black: #414868;
27
+ --term-red: #f7768e;
28
+ --term-green: #9ece6a;
29
+ --term-yellow: #e0af68;
30
+ --term-blue: #7aa2f7;
31
+ --term-magenta: #bb9af7;
32
+ --term-cyan: #7dcfff;
33
+ --term-white: #a9b1d6;
34
+ --term-bright-black: #565f89;
35
+ --term-bright-red: #f7768e;
36
+ --term-bright-green: #9ece6a;
37
+ --term-bright-yellow: #e0af68;
38
+ --term-bright-blue: #7aa2f7;
39
+ --term-bright-magenta: #bb9af7;
40
+ --term-bright-cyan: #7dcfff;
41
+ --term-bright-white: #c0caf5;
42
+ --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
43
+ --mermaid-font-size: 12px;
44
+ --tooltip-bg: #24283b;
45
+ --code-bg: #16161e;
46
+ --code-text: #c0caf5;
47
+ --code-border: var(--border-soft);
48
+ --code-pad: 8px 10px;
49
+ --card-body-pad: 4px 14px 12px;
50
+ --err-text: #f7768e;
51
+ --red-text: #f7768e;
52
+ --amber-text: #e0af68;
53
+ --info-blue: #7dcfff;
54
+ --link: #7aa2f7;
55
+ --link-hover: #89ddff;
56
+ --link-soft: #7aa2f7;
57
+ --md-strong: #c0caf5;
58
+ --skill-blue: #7aa2f7;
59
+ --plugin-purple: #b58cff;
60
+ --auth-green: #9ece6a;
61
+ --scroll-thumb: #3b4261;
62
+ --scroll-thumb-hover: #565f89;
63
+ --notice-err-bg: #401d23;
64
+ --notice-warn-bg: #38251f;
65
+ --notice-info-bg: #1b2544;
66
+ --notice-err-border: #ef4444;
67
+ --notice-warn-border: #f59e0b;
68
+ --notice-info-border: #3b82f6;
69
+ --send-blue: #7aa2f7;
70
+ --send-blue-hover: #89ddff;
71
+ --brand-grad-a: #7aa2f7;
72
+ --brand-grad-b: #bb9af7;
73
+ --on-amber: #1a1a1a;
74
+ --search-active-fg: #1a1d26;
75
+ --switch-knob: #ffffff;
76
+ --bg-elev3: rgba(255, 255, 255, 0.06);
77
+ --sunken-bg: rgba(0, 0, 0, 0.15);
78
+ --glow-015: rgba(255, 255, 255, 0.015);
79
+ --glow-025: rgba(255, 255, 255, 0.025);
80
+ --glow-03: rgba(255, 255, 255, 0.03);
81
+ --glow-04: rgba(255, 255, 255, 0.04);
82
+ --glow-05: rgba(255, 255, 255, 0.05);
83
+ --glow-12: rgba(255, 255, 255, 0.12);
84
+ --glow-18: rgba(255, 255, 255, 0.18);
85
+ --glow-22: rgba(255, 255, 255, 0.22);
86
+ --glow-38: rgba(255, 255, 255, 0.38);
87
+ --control-fg: #9aa5ce;
88
+ --control-bg: #24283b;
89
+ --control-border: #414868;
90
+ --bg-image: none;
91
+ --bg-image-dim: 0.78;
92
+ --bg-image-blur: 0px;
93
+ --wallpaper-panel-alpha: 100%;
94
+ --topbar-bg: #24283b;
95
+ --statusbar-bg: #16161e;
96
+ --panel-bg: #24283b;
97
+ --card-bg: #24283b;
98
+ --chip-bg: #1f2335;
99
+ --msgs-bg: #1a1b26;
100
+ --inputbox-bg: #1f2335;
101
+ --menu-bg: var(--bg-elev2);
102
+ }
103
+
104
+ /* ---- syntax highlighting (Tokyo Night) ---- */
105
+ .hljs {
106
+ color: #c0caf5;
107
+ background: #16161e;
108
+ }
109
+ .hljs-doctag,
110
+ .hljs-keyword,
111
+ .hljs-meta .hljs-keyword {
112
+ color: #bb9af7;
113
+ }
114
+ .hljs-title,
115
+ .hljs-title.class_,
116
+ .hljs-title.function_ {
117
+ color: #7aa2f7;
118
+ }
119
+ .hljs-attr,
120
+ .hljs-attribute,
121
+ .hljs-literal,
122
+ .hljs-number {
123
+ color: #ff9e64;
124
+ }
125
+ .hljs-string,
126
+ .hljs-regexp {
127
+ color: #9ece6a;
128
+ }
129
+ .hljs-built_in,
130
+ .hljs-type {
131
+ color: #2ac3de;
132
+ }
133
+ .hljs-comment,
134
+ .hljs-code {
135
+ color: #565f89;
136
+ }
137
+ .hljs-tag,
138
+ .hljs-name {
139
+ color: #7dcfff;
140
+ }
@@ -1,3 +1,3 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-CR5VJ85Q.js";import{a as r,c as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,o as f,p,r as m,s as h,t as g,u as _}from"./index-DJIV4A-t.js";import{n as v,t as y}from"./xterm-Cf5xxe4g.js";var b=e(t(),1);function x(e,t){return Math.abs(t)>10&&Math.abs(t)>Math.abs(e)*1.2}function S(e,t){return e-t}var C=n();function w(e){let t=null;return{clean:e.replace(/\r?\n?\[pi-term-exit:(-?\d+)\]\r?\n?/g,(e,n)=>(t=Number(n),`\r
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-CR5VJ85Q.js";import{a as r,c as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,o as f,p,r as m,s as h,t as g,u as _}from"./index-BgrnP9Jz.js";import{n as v,t as y}from"./xterm-Cf5xxe4g.js";var b=e(t(),1);function x(e,t){return Math.abs(t)>10&&Math.abs(t)>Math.abs(e)*1.2}function S(e,t){return e-t}var C=n();function w(e){let t=null;return{clean:e.replace(/\r?\n?\[pi-term-exit:(-?\d+)\]\r?\n?/g,(e,n)=>(t=Number(n),`\r
2
2
  `)).replace(/\r?\n?\x1b\[90m\[(?:进程已退出,退出码 |Process exited with code )-?\d+\]\x1b\[0m\r?\n?/g,`\r
3
3
  `),exitCode:t}}function T({conversationId:e,terminalId:t,command:n,cwd:i,title:a,agentBash:o,active:s,running:c,exitCode:u,register:d}){let p=(0,b.useRef)(null),h=(0,b.useRef)(null),{locale:g}=f(),_=(0,b.useRef)(g);_.current=g;let T=n?JSON.stringify(n):``,E=(0,b.useRef)(c===!1);(0,b.useEffect)(()=>{let c=p.current;if(!c)return;let u=new v({theme:l(),fontFamily:`"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace`,fontSize:13,cursorBlink:!0,scrollback:8e3}),f=new y;u.loadAddon(f),u.open(c),h.current={term:u,fit:f},s&&u.focus();let g=()=>{u.options.theme=l()};window.addEventListener(m,g),u.attachCustomKeyEventHandler(e=>{if(e.type!==`keydown`)return!0;let t=e.key?.toLowerCase();if((e.ctrlKey||e.metaKey)&&t===`v`)return!1;if(e.ctrlKey&&!e.shiftKey&&!e.altKey&&t===`c`&&u.hasSelection()){let e=u.textarea;return e&&(e.value=u.getSelection(),e.select()),!1}return!0});let b=d(e,t,{write:e=>u.write(w(e).clean),dispose:()=>u.dispose()}),C=()=>{try{f.fit(),r({type:`terminal_resize`,terminalId:t,conversationId:e,cols:u.cols,rows:u.rows})}catch{}},T=requestAnimationFrame(()=>{try{f.fit()}catch{}E.current||r(n?{type:`run_command`,terminalId:t,conversationId:e,command:n,cols:u.cols,rows:u.rows}:{type:`terminal_create`,terminalId:t,title:a,locale:_.current,agentBash:o,conversationId:e,cwd:i,cols:u.cols,rows:u.rows})}),D=u.onData(n=>{r({type:`terminal_input`,terminalId:t,conversationId:e,data:n})}),O=u.element,k=null,A=0,j=0,M=0,N=!1,P=e=>{if(e.touches.length!==1){k=null,N=!1;return}let t=e.touches[0];k=t.identifier,A=t.clientX,j=t.clientY,M=t.clientY,N=!1},F=e=>{if(k===null||e.touches.length!==1)return;let t=e.touches[0];if(t.identifier!==k)return;if(!N){if(!x(t.clientX-A,t.clientY-j))return;N=!0}e.preventDefault();let n=S(M,t.clientY);M=t.clientY,n!==0&&typeof WheelEvent<`u`&&(c.querySelector(`.xterm-viewport`)??O)?.dispatchEvent(new WheelEvent(`wheel`,{bubbles:!0,cancelable:!0,deltaY:n,deltaMode:0,clientX:t.clientX,clientY:t.clientY}))},I=e=>{if(k!==null){if(e.touches.length>0){k=null,N=!1;return}k=null,N=!1}};O?.addEventListener(`touchstart`,P,{passive:!0}),O?.addEventListener(`touchmove`,F,{passive:!1}),O?.addEventListener(`touchend`,I),O?.addEventListener(`touchcancel`,I);let L=null;return typeof ResizeObserver<`u`&&(L=new ResizeObserver(()=>{c.offsetWidth>0&&c.offsetHeight>0&&C()}),L.observe(c)),()=>{cancelAnimationFrame(T),D.dispose(),O?.removeEventListener(`touchstart`,P),O?.removeEventListener(`touchmove`,F),O?.removeEventListener(`touchend`,I),O?.removeEventListener(`touchcancel`,I),window.removeEventListener(m,g),L?.disconnect(),b(),u.dispose(),h.current=null}},[e,t,T,d]),(0,b.useEffect)(()=>{if(!s)return;let n=requestAnimationFrame(()=>{let n=h.current;if(n){try{n.fit.fit(),r({type:`terminal_resize`,terminalId:t,conversationId:e,cols:n.term.cols,rows:n.term.rows})}catch{}n.term.focus()}});return()=>cancelAnimationFrame(n)},[s]);let{t:D}=f(),O=(0,b.useRef)(void 0);return(0,b.useEffect)(()=>{if(c===O.current||(O.current=c,c!==!1))return;let e=h.current;e&&e.term.write(`\r\n\x1b[90m${D(`exitBanner`,{code:u??``})}\x1b[0m\r\n`)},[c,t,u]),(0,C.jsx)(`div`,{ref:p,className:`term-xterm ${s?``:`hidden`}`})}var E={name:``,command:``,cwd:"${pwd}"};function D({chat:e,terminal:t,uiTerminalToolbar:n,onUiAction:l}){let f=h(),[m,v]=(0,b.useState)(null),[y,x]=(0,b.useState)(!1),[S,w]=(0,b.useState)(!1),[D,O]=(0,b.useState)(null),[k,A]=(0,b.useState)(E),[j,M]=(0,b.useState)(null),N=(0,b.useRef)(null),[P,F]=(0,b.useState)(!0),[I,L]=(0,b.useState)(null),[R,z]=(0,b.useState)(``);(0,b.useEffect)(()=>{e.terminals.length===0?v(null):e.terminals.some(e=>e.id===m)||v(e.terminals[e.terminals.length-1].id)},[e.terminals,m]),(0,b.useEffect)(()=>{e.terminalActiveId&&(v(e.terminalActiveId),x(!1))},[e.terminalActiveId]),(0,b.useEffect)(()=>()=>{N.current&&clearTimeout(N.current)},[]);let B=e.terminals.filter(e=>!e.agentBash),V=e.terminals.filter(e=>e.agentBash),H=n=>{if(!e.ready)return;let r=i(),a=e.activeConversationId||e.state?.conversationId||``;t.create({...n,id:r,conversationId:a,cols:n.cols??80,rows:n.rows??24,running:!0,exitCode:null}),v(r),x(!1)},U=()=>H({title:f(`terminalTitle`,{n:B.length+1}),cwd:e.state?.cwd??``}),W=n=>{let i=n.name||n.command,a=e.terminals.find(e=>e.title===i);if(a){t.restart(a.id),v(a.id),r({type:`run_command`,terminalId:a.id,conversationId:a.conversationId,command:n,cols:80,rows:24});return}H({title:i,cwd:e.state?.cwd??``,command:n})},G=n=>{let i=e.terminals.find(e=>e.id===n);if(i&&r({type:`terminal_kill`,terminalId:n,conversationId:i.conversationId}),t.close(n),m===n){let t=e.terminals.filter(e=>e.id!==n);v(t.length>0?t[t.length-1].id:null)}},K=e=>(0,C.jsxs)(`div`,{className:`term-tab ${e.id===m?`active`:``}`,children:[(0,C.jsxs)(`button`,{type:`button`,className:`term-tab-main`,title:`${e.cwd}${e.command?`\n> ${e.command.command}`:``}`,onClick:()=>{I||(v(e.id),x(!1))},children:[(0,C.jsx)(`span`,{className:`term-tab-dot ${e.running?`run`:`exit`}`}),(0,C.jsxs)(`span`,{className:`term-tab-title`,children:[I===e.id?(0,C.jsx)(`input`,{autoFocus:!0,className:`term-tab-rename-input`,value:R,placeholder:e.title,onClick:e=>e.stopPropagation(),onChange:e=>z(e.target.value),onKeyDown:t=>{if(t.stopPropagation(),t.key===`Enter`&&!t.nativeEvent.isComposing){let t=R.trim();t&&r({type:`rename_terminal`,terminalId:e.id,conversationId:e.conversationId,title:t}),L(null)}else t.key===`Escape`&&L(null)},onBlur:()=>L(null)}):e.title,!e.running&&(0,C.jsx)(`span`,{className:`term-tab-exit`,children:f(`exited`,{code:e.exitCode===null?``:` ${e.exitCode}`})})]})]}),(0,C.jsx)(`button`,{type:`button`,className:`term-tab-close term-tab-rename`,title:f(`renameTerminal`),onClick:t=>{t.stopPropagation(),z(e.title),L(e.id)},children:(0,C.jsx)(u,{})}),(0,C.jsx)(`button`,{type:`button`,className:`term-tab-close`,title:f(`closeTerminal`),onClick:()=>G(e.id),children:(0,C.jsx)(s,{})})]},e.id),q=()=>{w(!0),O(null),A(E)},J=t=>{let n=e.commands[t];n&&(w(!1),O(t),A({name:n.name,command:n.command,cwd:n.cwd??``}))},Y=()=>{w(!1),O(null)},X=()=>{let t=k.name.trim(),n=k.command.trim();if(!t||!n)return;let i={name:t,command:n,cwd:k.cwd.trim()||void 0},a=S?[...e.commands,i]:D===null?e.commands:e.commands.map((e,t)=>t===D?i:e);r({type:`save_commands`,commands:a}),Y()},Z=t=>{if(j===t){let n=e.commands.filter((e,n)=>n!==t);r({type:`save_commands`,commands:n}),M(null),N.current&&clearTimeout(N.current)}else M(t),N.current&&clearTimeout(N.current),N.current=setTimeout(()=>M(null),2500)},ee=S||D!==null,te=n===void 0?[`host:term-cmd-refresh`,`host:term-cmd-new`,`host:term-tab-new`].map(e=>({id:e,source:`host`})):n.filter(e=>!e.hidden),Q=(e,t)=>{let n=new Set(e);return te.filter(e=>n.has(e.id)||t&&e.source!==`host`)},$={"host:term-cmd-refresh":(0,C.jsx)(`button`,{type:`button`,className:`panel-refresh`,title:f(`rerun`),onClick:()=>r({type:`list_commands`}),children:(0,C.jsx)(p,{})}),"host:term-cmd-new":(0,C.jsx)(`button`,{type:`button`,className:`panel-new`,title:f(`newCommand`),onClick:q,children:(0,C.jsx)(o,{})}),"host:term-tab-new":(0,C.jsx)(`button`,{type:`button`,className:`panel-new`,title:f(`newTerminal`),onClick:U,children:(0,C.jsx)(o,{})})};return(0,C.jsxs)(`div`,{className:`terminal-view`,children:[(0,C.jsxs)(`aside`,{className:`term-side term-commands ${y?`open`:``}`,children:[(0,C.jsxs)(`div`,{className:`panel-header`,children:[(0,C.jsx)(`span`,{className:`panel-title`,children:f(`commands`)}),(0,C.jsx)(`div`,{className:`panel-header-actions`,children:g(Q([`host:term-cmd-refresh`,`host:term-cmd-new`],!1),$,l)})]}),(0,C.jsx)(`div`,{className:`panel-body`,children:ee?(0,C.jsxs)(`div`,{className:`cmd-form`,children:[(0,C.jsx)(`label`,{htmlFor:`cmd-name`,children:f(`name`)}),(0,C.jsx)(`input`,{id:`cmd-name`,className:`cmd-input`,value:k.name,placeholder:f(`exampleName`),autoFocus:!0,onChange:e=>A({...k,name:e.target.value})}),(0,C.jsx)(`label`,{htmlFor:`cmd-command`,children:f(`command`)}),(0,C.jsx)(`input`,{id:`cmd-command`,className:`cmd-input`,value:k.command,placeholder:f(`exampleCommand`),onChange:e=>A({...k,command:e.target.value}),onKeyDown:e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&X()}}),(0,C.jsxs)(`label`,{htmlFor:`cmd-cwd`,children:[f(`directory`),` `,(0,C.jsx)(`span`,{className:`cmd-hint`,children:f(`cwdHint`)})]}),(0,C.jsx)(`input`,{id:`cmd-cwd`,className:`cmd-input`,value:k.cwd,placeholder:"${pwd}",onChange:e=>A({...k,cwd:e.target.value}),onKeyDown:e=>{e.key===`Enter`&&!e.nativeEvent.isComposing&&X()}}),(0,C.jsxs)(`div`,{className:`cmd-form-actions`,children:[(0,C.jsx)(`button`,{type:`button`,className:`btn`,onClick:Y,children:f(`cancel`)}),(0,C.jsx)(`button`,{type:`button`,className:`btn primary`,disabled:!k.name.trim()||!k.command.trim(),onClick:X,children:f(`save`)})]})]}):(0,C.jsxs)(C.Fragment,{children:[e.commands.length===0&&(0,C.jsx)(`div`,{className:`panel-empty`,children:f(`noCommands`)}),e.commands.map((e,t)=>(0,C.jsxs)(`div`,{className:`cmd-item`,children:[(0,C.jsx)(`button`,{type:`button`,className:`cmd-run`,title:f(`clickToRun`),onClick:()=>W(e),children:(0,C.jsx)(a,{})}),(0,C.jsxs)(`button`,{type:`button`,className:`cmd-main`,title:f(`clickToRun`),onClick:()=>W(e),children:[(0,C.jsx)(`span`,{className:`cmd-name`,children:e.name}),(0,C.jsx)(`span`,{className:`cmd-command`,children:e.command}),e.cwd&&(0,C.jsx)(`span`,{className:`cmd-cwd`,children:e.cwd})]}),(0,C.jsx)(`button`,{type:`button`,className:`cmd-act`,title:f(`edit`),onClick:()=>J(t),children:(0,C.jsx)(u,{})}),(0,C.jsx)(`button`,{type:`button`,className:`cmd-act del ${j===t?`confirm`:``}`,title:f(`delete`),onClick:()=>Z(t),children:j===t?f(`confirmQ`):(0,C.jsx)(c,{})})]},t))]})}),(0,C.jsxs)(`div`,{className:`term-tabs-block`,children:[(0,C.jsxs)(`div`,{className:`panel-header`,children:[(0,C.jsx)(`span`,{className:`panel-title`,children:f(`terminal`)}),g(Q([`host:term-tab-new`],!0),$,l)]}),(0,C.jsxs)(`div`,{className:`panel-body`,children:[e.terminals.length===0&&(0,C.jsx)(`div`,{className:`panel-empty`,children:f(`noTerminal`)}),B.map(K),V.length>0&&(0,C.jsxs)(`div`,{className:`term-folder`,children:[(0,C.jsxs)(`button`,{type:`button`,className:`term-folder-header ${P?`open`:``}`,title:f(`aiBashGroup`),onClick:()=>F(e=>!e),children:[(0,C.jsx)(`span`,{className:`term-folder-caret`,children:P?`▾`:`▸`}),(0,C.jsx)(`span`,{className:`term-folder-title`,children:f(`aiBashGroup`)}),(0,C.jsx)(`span`,{className:`term-folder-count`,children:V.length})]}),P&&(0,C.jsx)(`div`,{className:`term-folder-body`,children:V.map(K)})]})]})]})]}),(0,C.jsxs)(`div`,{className:`term-main`,children:[y&&(0,C.jsx)(`div`,{className:`drawer-backdrop`,onClick:()=>x(!1)}),(0,C.jsx)(`button`,{type:`button`,className:`term-side-toggle`,title:f(`commands`),onClick:()=>x(e=>!e),children:(0,C.jsx)(_,{})}),e.terminals.length===0?(0,C.jsxs)(`div`,{className:`term-empty`,children:[(0,C.jsx)(d,{className:`term-empty-icon`}),(0,C.jsx)(`div`,{className:`term-empty-title`,children:f(`builtinTerminal`)}),(0,C.jsx)(`div`,{className:`term-empty-sub`,children:f(`termEmptySub`)})]}):e.terminals.map(e=>(0,C.jsx)(T,{conversationId:e.conversationId,terminalId:e.id,command:e.command,cwd:e.cwd,title:e.title,agentBash:e.agentBash,active:e.id===m,running:e.running,exitCode:e.exitCode,register:t.register},`${e.conversationId}:${e.id}`))]})]})}export{D as TerminalPanel};
@@ -0,0 +1,2 @@
1
+ function e(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement(`base`),i=n.createElement(`a`);return n.head.appendChild(r),n.body.appendChild(i),t&&(r.href=t),i.href=e,i.href}var t=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function n(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var r=null;function i(e={}){return r||(e.includeStyleProperties?(r=e.includeStyleProperties,r):(r=n(window.getComputedStyle(document.documentElement)),r))}function a(e,t){let n=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return n?parseFloat(n.replace(`px`,``)):0}function o(e){let t=a(e,`border-left-width`),n=a(e,`border-right-width`);return e.clientWidth+t+n}function s(e){let t=a(e,`border-top-width`),n=a(e,`border-bottom-width`);return e.clientHeight+t+n}function c(e,t={}){return{width:t.width||o(e),height:t.height||s(e)}}function ee(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var l=16384;function te(e){(e.width>l||e.height>l)&&(e.width>l&&e.height>l?e.width>e.height?(e.height*=l/e.width,e.width=l):(e.width*=l/e.height,e.height=l):e.width>l?(e.height*=l/e.width,e.width=l):(e.width*=l/e.height,e.height=l))}function u(e,t={}){return e.toBlob?new Promise(n=>{e.toBlob(n,t.type?t.type:`image/png`,t.quality?t.quality:1)}):new Promise(n=>{let r=window.atob(e.toDataURL(t.type?t.type:void 0,t.quality?t.quality:void 0).split(`,`)[1]),i=r.length,a=new Uint8Array(i);for(let e=0;e<i;e+=1)a[e]=r.charCodeAt(e);n(new Blob([a],{type:t.type?t.type:`image/png`}))})}function d(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin=`anonymous`,r.decoding=`async`,r.src=e})}async function f(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function p(e,t,n){let r=`http://www.w3.org/2000/svg`,i=document.createElementNS(r,`svg`),a=document.createElementNS(r,`foreignObject`);return i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${n}`),i.setAttribute(`viewBox`,`0 0 ${t} ${n}`),a.setAttribute(`width`,`100%`),a.setAttribute(`height`,`100%`),a.setAttribute(`x`,`0`),a.setAttribute(`y`,`0`),a.setAttribute(`externalResourcesRequired`,`true`),i.appendChild(a),a.appendChild(e),f(i)}var m=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||m(n,t)};function ne(e){let t=e.getPropertyValue(`content`);return`${e.cssText} content: '${t.replace(/'|"/g,``)}';`}function re(e,t){return i(t).map(t=>`${t}: ${e.getPropertyValue(t)}${e.getPropertyPriority(t)?` !important`:``};`).join(` `)}function ie(e,t,n,r){let i=`.${e}:${t}`,a=n.cssText?ne(n):re(n,r);return document.createTextNode(`${i}{${a}}`)}function h(e,n,r,i){let a=window.getComputedStyle(e,r),o=a.getPropertyValue(`content`);if(o===``||o===`none`)return;let s=t();try{n.className=`${n.className} ${s}`}catch{return}let c=document.createElement(`style`);c.appendChild(ie(s,r,a,i)),n.appendChild(c)}function ae(e,t,n){h(e,t,`:before`,n),h(e,t,`:after`,n)}var g=`application/font-woff`,_=`image/jpeg`,v={woff:g,woff2:g,ttf:`application/font-truetype`,eot:`application/vnd.ms-fontobject`,png:`image/png`,jpg:_,jpeg:_,gif:`image/gif`,tiff:`image/tiff`,svg:`image/svg+xml`,webp:`image/webp`};function y(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:``}function b(e){return v[y(e).toLowerCase()]||``}function oe(e){return e.split(/,/)[1]}function x(e){return e.search(/^(data:)/)!==-1}function S(e,t){return`data:${t};base64,${e}`}async function C(e,t,n){let r=await fetch(e,t);if(r.status===404)throw Error(`Resource "${r.url}" not found`);let i=await r.blob();return new Promise((e,t)=>{let a=new FileReader;a.onerror=t,a.onloadend=()=>{try{e(n({res:r,result:a.result}))}catch(e){t(e)}},a.readAsDataURL(i)})}var w={};function se(e,t,n){let r=e.replace(/\?.*/,``);return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,``)),t?`[${t}]${r}`:r}async function T(e,t,n){let r=se(e,t,n.includeQueryParams);if(w[r]!=null)return w[r];n.cacheBust&&(e+=(/\?/.test(e)?`&`:`?`)+new Date().getTime());let i;try{i=S(await C(e,n.fetchRequestInit,({res:e,result:n})=>(t||=e.headers.get(`Content-Type`)||``,oe(n))),t)}catch(t){i=n.imagePlaceholder||``;let r=`Failed to fetch resource: ${e}`;t&&(r=typeof t==`string`?t:t.message),r&&console.warn(r)}return w[r]=i,i}async function ce(e){let t=e.toDataURL();return t===`data:,`?e.cloneNode(!1):d(t)}async function le(e,t){if(e.currentSrc){let t=document.createElement(`canvas`),n=t.getContext(`2d`);return t.width=e.clientWidth,t.height=e.clientHeight,n?.drawImage(e,0,0,t.width,t.height),d(t.toDataURL())}let n=e.poster;return d(await T(n,b(n),t))}async function E(e,t){try{if(e?.contentDocument?.body)return await I(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function D(e,t){return m(e,HTMLCanvasElement)?ce(e):m(e,HTMLVideoElement)?le(e,t):m(e,HTMLIFrameElement)?E(e,t):e.cloneNode(k(e))}var O=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SLOT`,k=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SVG`;async function A(e,t,r){if(k(t))return t;let i=[];return i=O(e)&&e.assignedNodes?n(e.assignedNodes()):m(e,HTMLIFrameElement)&&e.contentDocument?.body?n(e.contentDocument.body.childNodes):n((e.shadowRoot??e).childNodes),i.length===0||m(e,HTMLVideoElement)||await i.reduce((e,n)=>e.then(()=>I(n,r)).then(e=>{e&&t.appendChild(e)}),Promise.resolve()),t}function j(e,t,n){let r=t.style;if(!r)return;let a=window.getComputedStyle(e);a.cssText?(r.cssText=a.cssText,r.transformOrigin=a.transformOrigin):i(n).forEach(n=>{let i=a.getPropertyValue(n);n===`font-size`&&i.endsWith(`px`)&&(i=`${Math.floor(parseFloat(i.substring(0,i.length-2)))-.1}px`),m(e,HTMLIFrameElement)&&n===`display`&&i===`inline`&&(i=`block`),n===`d`&&t.getAttribute(`d`)&&(i=`path(${t.getAttribute(`d`)})`),r.setProperty(n,i,a.getPropertyPriority(n))})}function M(e,t){m(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),m(e,HTMLInputElement)&&t.setAttribute(`value`,e.value)}function N(e,t){if(m(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(t=>e.value===t.getAttribute(`value`));r&&r.setAttribute(`selected`,``)}}function P(e,t,n){return m(t,Element)&&(j(e,t,n),ae(e,t,n),M(e,t),N(e,t)),t}async function F(e,t){let n=e.querySelectorAll?e.querySelectorAll(`use`):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let a=n[i].getAttribute(`xlink:href`);if(a){let n=e.querySelector(a),i=document.querySelector(a);!n&&i&&!r[a]&&(r[a]=await I(i,t,!0))}}let i=Object.values(r);if(i.length){let t=`http://www.w3.org/1999/xhtml`,n=document.createElementNS(t,`svg`);n.setAttribute(`xmlns`,t),n.style.position=`absolute`,n.style.width=`0`,n.style.height=`0`,n.style.overflow=`hidden`,n.style.display=`none`;let r=document.createElementNS(t,`defs`);n.appendChild(r);for(let e=0;e<i.length;e++)r.appendChild(i[e]);e.appendChild(n)}return e}async function I(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(e=>D(e,t)).then(n=>A(e,n,t)).then(n=>P(e,n,t)).then(e=>F(e,t))}var L=/url\((['"]?)([^'"]+?)\1\)/g,R=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,z=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function B(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,`\\$1`);return RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,`g`)}function V(e){let t=[];return e.replace(L,(e,n,r)=>(t.push(r),e)),t.filter(e=>!x(e))}async function H(t,n,r,i,a){try{let o=r?e(n,r):n,s=b(n),c;return c=a?S(await a(o),s):await T(o,s,i),t.replace(B(n),`$1${c}$3`)}catch{}return t}function U(e,{preferredFontFormat:t}){return t?e.replace(z,e=>{for(;;){let[n,,r]=R.exec(e)||[];if(!r)return``;if(r===t)return`src: ${n};`}}):e}function W(e){return e.search(L)!==-1}async function G(e,t,n){if(!W(e))return e;let r=U(e,n);return V(r).reduce((e,r)=>e.then(e=>H(e,r,t,n)),Promise.resolve(r))}async function K(e,t,n){let r=t.style?.getPropertyValue(e);if(r){let i=await G(r,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function ue(e,t){await K(`background`,e,t)||await K(`background-image`,e,t),await K(`mask`,e,t)||await K(`-webkit-mask`,e,t)||await K(`mask-image`,e,t)||await K(`-webkit-mask-image`,e,t)}async function de(e,t){let n=m(e,HTMLImageElement);if((!n||x(e.src))&&(!m(e,SVGImageElement)||x(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,i=await T(r,b(r),t);await new Promise((r,a)=>{e.onload=r,e.onerror=t.onImageErrorHandler?(...e)=>{try{r(t.onImageErrorHandler(...e))}catch(e){a(e)}}:a;let o=e;o.decode&&=r,o.loading===`lazy`&&(o.loading=`eager`),n?(e.srcset=``,e.src=i):e.href.baseVal=i})}async function fe(e,t){let r=n(e.childNodes).map(e=>q(e,t));await Promise.all(r).then(()=>e)}async function q(e,t){m(e,Element)&&(await ue(e,t),await de(e,t),await fe(e,t))}function pe(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(e=>{n[e]=r[e]}),e}var J={};async function Y(e){let t=J[e];return t??(t={url:e,cssText:await(await fetch(e)).text()},J[e]=t,t)}async function X(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,`$1`);return a.startsWith(`https://`)||(a=new URL(a,e.url).href),C(a,t.fetchRequestInit,({result:e})=>(n=n.replace(i,`url(${e})`),[i,e]))});return Promise.all(i).then(()=>n)}function Z(e){if(e==null)return[];let t=[],n=e.replace(/(\/\*[\s\S]*?\*\/)/gi,``),r=RegExp(`((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})`,`gi`);for(;;){let e=r.exec(n);if(e===null)break;t.push(e[0])}n=n.replace(r,``);let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a=RegExp(`((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})`,`gi`);for(;;){let e=i.exec(n);if(e===null){if(e=a.exec(n),e===null)break;i.lastIndex=a.lastIndex}else a.lastIndex=i.lastIndex;t.push(e[0])}return t}async function me(e,t){let r=[],i=[];return e.forEach(r=>{if(`cssRules`in r)try{n(r.cssRules||[]).forEach((e,n)=>{if(e.type===CSSRule.IMPORT_RULE){let a=n+1,o=e.href,s=Y(o).then(e=>X(e,t)).then(e=>Z(e).forEach(e=>{try{r.insertRule(e,e.startsWith(`@import`)?a+=1:r.cssRules.length)}catch(t){console.error(`Error inserting rule from remote css`,{rule:e,error:t})}})).catch(e=>{console.error(`Error loading remote css`,e.toString())});i.push(s)}})}catch(n){let a=e.find(e=>e.href==null)||document.styleSheets[0];r.href!=null&&i.push(Y(r.href).then(e=>X(e,t)).then(e=>Z(e).forEach(e=>{a.insertRule(e,a.cssRules.length)})).catch(e=>{console.error(`Error loading remote stylesheet`,e)})),console.error(`Error inlining remote css file`,n)}}),Promise.all(i).then(()=>(e.forEach(e=>{if(`cssRules`in e)try{n(e.cssRules||[]).forEach(e=>{r.push(e)})}catch(t){console.error(`Error while reading CSS rules from ${e.href}`,t)}}),r))}function he(e){return e.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>W(e.style.getPropertyValue(`src`)))}async function ge(e,t){if(e.ownerDocument==null)throw Error(`Provided element is not within a Document`);return he(await me(n(e.ownerDocument.styleSheets),t))}function Q(e){return e.trim().replace(/["']/g,``)}function $(e){let t=new Set;function n(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(`,`).forEach(e=>{t.add(Q(e))}),Array.from(e.children).forEach(e=>{e instanceof HTMLElement&&n(e)})}return n(e),t}async function _e(e,t){let n=await ge(e,t),r=$(e);return(await Promise.all(n.filter(e=>r.has(Q(e.style.fontFamily))).map(e=>{let n=e.parentStyleSheet?e.parentStyleSheet.href:null;return G(e.cssText,n,t)}))).join(`
2
+ `)}async function ve(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await _e(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function ye(e,t={}){let{width:n,height:r}=c(e,t),i=await I(e,t,!0);return await ve(i,t),await q(i,t),pe(i,t),await p(i,n,r)}async function be(e,t={}){let{width:n,height:r}=c(e,t),i=await d(await ye(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||ee(),l=t.canvasWidth||n,u=t.canvasHeight||r;return a.width=l*s,a.height=u*s,t.skipAutoScale||te(a),a.style.width=`${l}`,a.style.height=`${u}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}async function xe(e,t={}){return await u(await be(e,t))}export{xe as toBlob};