pi-web-ui 0.91.0 → 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 (37) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/bin/pi-web-ui.mjs +21 -2
  3. package/dist/server/agent-service.js +443 -45
  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 +49 -0
  7. package/dist/server/conversation-read-tool.js +369 -27
  8. package/dist/server/conversation-touches.js +357 -0
  9. package/dist/server/dsh/dsh-agent-service.js +7 -0
  10. package/dist/server/index.js +32 -4
  11. package/dist/server/model-admin.js +124 -2
  12. package/dist/server/model-enrich.js +478 -0
  13. package/dist/server/plugin-schedule.js +27 -2
  14. package/dist/server/plugins.js +65 -10
  15. package/dist/server/present-files-tool.js +303 -0
  16. package/dist/server/read-tool.js +91 -0
  17. package/dist/server/serialize.js +21 -1
  18. package/dist/server/settings-service.js +7 -0
  19. package/dist/server/text-sniff.js +15 -0
  20. package/dist/server/themes.js +17 -2
  21. package/dist/server/tool-manager.js +7 -1
  22. package/package.json +1 -1
  23. package/plugin-sdk/README.md +1 -0
  24. package/plugins/catalog.json +10 -0
  25. package/themes/catppuccin-latte.css +136 -0
  26. package/themes/catppuccin.css +140 -0
  27. package/themes/nord.css +130 -0
  28. package/themes/one-dark.css +131 -0
  29. package/themes/paper.css +12 -12
  30. package/themes/solarized-light.css +131 -0
  31. package/themes/tokyo-night.css +140 -0
  32. package/web/dist/assets/{TerminalPanel-GtDQ1h85.js → TerminalPanel-RACpk6AX.js} +1 -1
  33. package/web/dist/assets/index-BgrnP9Jz.js +364 -0
  34. package/web/dist/assets/index-Cy8dSTZt.css +1 -0
  35. package/web/dist/index.html +2 -2
  36. package/web/dist/assets/index-CdsKltOS.css +0 -1
  37. package/web/dist/assets/index-OoULNF70.js +0 -363
package/themes/paper.css CHANGED
@@ -6,10 +6,10 @@
6
6
  --bg-elev: #fffdf6;
7
7
  --bg-elev2: #efe7d3;
8
8
  --border: #ddcfae;
9
- --border-soft: #e7dcc2;
9
+ --border-soft: #ded1b3;
10
10
  --text: #3f372c;
11
11
  --text-dim: #6f6250;
12
- --text-faint: #a2937a;
12
+ --text-faint: #6c5a41;
13
13
  --accent: #b45309;
14
14
  --accent-soft: rgba(180, 83, 9, 0.12);
15
15
  --green: #15803d;
@@ -30,7 +30,7 @@
30
30
  --term-magenta: #9333ea;
31
31
  --term-cyan: #0e7490;
32
32
  --term-white: #3f372c;
33
- --term-bright-black: #a2937a;
33
+ --term-bright-black: #6c5a41;
34
34
  --term-bright-red: #b91c1c;
35
35
  --term-bright-green: #15803d;
36
36
  --term-bright-yellow: #a16207;
@@ -89,14 +89,14 @@
89
89
  --bg-image: none;
90
90
  --bg-image-dim: 0.78;
91
91
  --bg-image-blur: 0px;
92
- --wallpaper-panel-alpha: 62%;
93
- --topbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
94
- --statusbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
95
- --panel-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
96
- --card-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
97
- --chip-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 62%), transparent);
98
- --msgs-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
99
- --inputbox-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 62%), transparent);
92
+ --wallpaper-panel-alpha: 100%;
93
+ --topbar-bg: #fffdf6;
94
+ --statusbar-bg: #fffdf6;
95
+ --panel-bg: #fffdf6;
96
+ --card-bg: #fffdf6;
97
+ --chip-bg: #efe7d3;
98
+ --msgs-bg: #fffdf6;
99
+ --inputbox-bg: #efe7d3;
100
100
  --menu-bg: var(--bg-elev2);
101
101
  }
102
102
 
@@ -144,7 +144,7 @@
144
144
  .hljs-comment,
145
145
  .hljs-code,
146
146
  .hljs-formula {
147
- color: #8a7d64;
147
+ color: #5f533e;
148
148
  }
149
149
  .hljs-name,
150
150
  .hljs-quote,
@@ -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-OoULNF70.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};