pi-web-ui 0.69.0 → 0.71.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/CHANGELOG.md +302 -0
- package/dist/server/agent-service.js +13 -4
- package/dist/server/client-state.js +44 -17
- package/dist/server/dsh/dsh-agent-service.js +3 -0
- package/dist/server/index.js +1 -0
- package/dist/server/locales.js +1 -1
- package/dist/server/marker-service.js +19 -15
- package/dist/server/settings-service.js +1 -0
- package/dist/server/subagents.js +13 -6
- package/dist/server/terminals.js +12 -1
- package/dist/server/webui-context.js +9 -0
- package/package.json +2 -1
- package/themes/cyberpunk.css +97 -81
- package/themes/dazzle.css +97 -81
- package/themes/md-preview.css +114 -98
- package/themes/translucent.css +78 -0
- package/themes/transparent.css +78 -0
- package/themes/white.css +176 -160
- package/web/dist/assets/{TerminalPanel-Cj8zsjx-.js → TerminalPanel-DXNpevIG.js} +1 -1
- package/web/dist/assets/index-4ge_ioPK.css +10 -0
- package/web/dist/assets/index-Cue012aF.js +335 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-DCOcsPFm.js +0 -334
- package/web/dist/assets/index-jH2Bb-0X.css +0 -10
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/* theme-name: 全透明 */
|
|
2
|
+
/* theme-name-en: Transparent */
|
|
3
|
+
/*
|
|
4
|
+
* 全透明主题——「半透明」的极致版(专配壁纸,issue #100):
|
|
5
|
+
* 调色板与默认暗色一致,但把壁纸机制里所有表面变量的透图率压到 0
|
|
6
|
+
* (--wallpaper-panel-alpha: 0% → --topbar-bg / --statusbar-bg / --panel-bg /
|
|
7
|
+
* --card-bg / --chip-bg / --inputbox-bg / --msgs-bg 全部变成 transparent),
|
|
8
|
+
* 顶栏/底栏/左右面板/消息区/输入框/全部气泡/代码块/终端视图统统直接见壁纸,
|
|
9
|
+
* 界面只剩边框与文字定结构。代价是文字全靠 --bg-image-dim 压暗撑着——
|
|
10
|
+
* 这里压暗加重到 0.85(默认 0.78),亮区壁纸下文字仍可读。
|
|
11
|
+
*
|
|
12
|
+
* 全透后 hover/浮动反馈不能依赖容器色(已是 0%),本文件尾段把这些实色
|
|
13
|
+
* hover 统一改成 25% 半透底(折叠摘要、展开条、折叠键、复制键、滚到底按钮);
|
|
14
|
+
* 强调色 hover(accent-soft)与语义按钮(发送/停止/杀进程)不受影响。
|
|
15
|
+
* 下拉弹窗(声音/语言/主题/模型/思考强度等 .dd-menu)保持实色
|
|
16
|
+
* (--menu-bg: var(--bg-elev2)),密集列表不随界面透图。
|
|
17
|
+
* 配壁纸用最佳;不配壁纸时界面直接透出 --bg 纯色(= 默认暗色,无差别)。
|
|
18
|
+
*/
|
|
19
|
+
:root {
|
|
20
|
+
color-scheme: dark;
|
|
21
|
+
--bg: #0d0e12;
|
|
22
|
+
--bg-elev: #14161c;
|
|
23
|
+
--bg-elev2: #1a1d26;
|
|
24
|
+
--border: #262a35;
|
|
25
|
+
--border-soft: #1e2230;
|
|
26
|
+
--text: #e6e8ef;
|
|
27
|
+
--text-dim: #9aa1b4;
|
|
28
|
+
--text-faint: #6b7284;
|
|
29
|
+
--accent: #8b5cf6;
|
|
30
|
+
--accent-soft: rgba(139, 92, 246, 0.14);
|
|
31
|
+
--green: #34d399;
|
|
32
|
+
--green-soft: rgba(52, 211, 153, 0.12);
|
|
33
|
+
--red: #f87171;
|
|
34
|
+
--red-soft: rgba(248, 113, 113, 0.12);
|
|
35
|
+
--amber: #fbbf24;
|
|
36
|
+
--term-bg: transparent;
|
|
37
|
+
--term-fg: #e6e8ef;
|
|
38
|
+
--term-cursor: #8b5cf6;
|
|
39
|
+
--term-cursor-accent: #0b0d12;
|
|
40
|
+
--term-selection: rgba(139, 92, 246, 0.35);
|
|
41
|
+
--term-black: #1a1d26;
|
|
42
|
+
--term-red: #f87171;
|
|
43
|
+
--term-green: #34d399;
|
|
44
|
+
--term-yellow: #fbbf24;
|
|
45
|
+
--term-blue: #60a5fa;
|
|
46
|
+
--term-magenta: #c084fc;
|
|
47
|
+
--term-cyan: #22d3ee;
|
|
48
|
+
--term-white: #e6e8ef;
|
|
49
|
+
--term-bright-black: #6b7284;
|
|
50
|
+
--term-bright-red: #f87171;
|
|
51
|
+
--term-bright-green: #34d399;
|
|
52
|
+
--term-bright-yellow: #fbbf24;
|
|
53
|
+
--term-bright-blue: #60a5fa;
|
|
54
|
+
--term-bright-magenta: #c084fc;
|
|
55
|
+
--term-bright-cyan: #22d3ee;
|
|
56
|
+
--term-bright-white: #ffffff;
|
|
57
|
+
|
|
58
|
+
/* ---- 全透明核心:0% 容器色 = 全部 color-mix 表面(三大区域 / 卡片 /
|
|
59
|
+
控件 / 输入框 / 消息区)直接变 transparent;终端 --term-bg 上面已设
|
|
60
|
+
transparent。想留一点点玻璃感就把这里提到 10~15%。---- */
|
|
61
|
+
--wallpaper-panel-alpha: 0%;
|
|
62
|
+
/* 下拉弹窗(声音/语言/主题/模型/思考强度):实色底保密集列表可读 */
|
|
63
|
+
--menu-bg: var(--bg-elev2);
|
|
64
|
+
/* 压暗加重:全透后没有容器色兜底,文字只靠压暗保可读 */
|
|
65
|
+
--bg-image-dim: 0.85;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* hover / 浮动静置反馈:0% 容器色下这些实色 hover 必消失,统一给 25% 半透
|
|
69
|
+
底(仍透图、可辨反馈)。强调色 hover(accent-soft)与语义按钮不受影响;
|
|
70
|
+
下拉弹窗已在实色菜单内,其 hover 保留 styles.css 默认实色。 */
|
|
71
|
+
.msg-collapsed:hover,
|
|
72
|
+
.panel-rail:hover,
|
|
73
|
+
.chead-toggle:hover,
|
|
74
|
+
.chead-copy:hover,
|
|
75
|
+
.empty-templates-reset:hover,
|
|
76
|
+
.scroll-bottom {
|
|
77
|
+
background: color-mix(in srgb, var(--bg-elev) 25%, transparent);
|
|
78
|
+
}
|
package/themes/white.css
CHANGED
|
@@ -1,160 +1,176 @@
|
|
|
1
|
-
/* theme-name: 白色 */
|
|
2
|
-
/* theme-name-en: White */
|
|
3
|
-
:root {
|
|
4
|
-
color-scheme: light;
|
|
5
|
-
--bg: #ffffff;
|
|
6
|
-
--bg-elev: #ffffff;
|
|
7
|
-
--bg-elev2: #f6f8fa;
|
|
8
|
-
--border: #d0d7de;
|
|
9
|
-
--border-soft: #d8dee4;
|
|
10
|
-
--text: #1f2328;
|
|
11
|
-
--text-dim: #59636e;
|
|
12
|
-
--text-faint: #818b98;
|
|
13
|
-
--accent: #0969da;
|
|
14
|
-
--accent-soft: rgba(9, 105, 218, 0.1);
|
|
15
|
-
--green: #059669;
|
|
16
|
-
--green-soft: rgba(5, 150, 105, 0.12);
|
|
17
|
-
--red: #dc2626;
|
|
18
|
-
--red-soft: rgba(220, 38, 38, 0.1);
|
|
19
|
-
--amber: #d97706;
|
|
20
|
-
--term-bg: #ffffff;
|
|
21
|
-
--term-fg: #1f2328;
|
|
22
|
-
--term-cursor: #0969da;
|
|
23
|
-
--term-cursor-accent: #ffffff;
|
|
24
|
-
--term-selection: rgba(9, 105, 218, 0.32);
|
|
25
|
-
--term-black: #e8eaf0;
|
|
26
|
-
--term-red: #dc2626;
|
|
27
|
-
--term-green: #059669;
|
|
28
|
-
--term-yellow: #d97706;
|
|
29
|
-
--term-blue: #2563eb;
|
|
30
|
-
--term-magenta: #9333ea;
|
|
31
|
-
--term-cyan: #0e7490;
|
|
32
|
-
--term-white: #1f2328;
|
|
33
|
-
--term-bright-black: #8a91a3;
|
|
34
|
-
--term-bright-red: #dc2626;
|
|
35
|
-
--term-bright-green: #059669;
|
|
36
|
-
--term-bright-yellow: #d97706;
|
|
37
|
-
--term-bright-blue: #2563eb;
|
|
38
|
-
--term-bright-magenta: #9333ea;
|
|
39
|
-
--term-bright-cyan: #0e7490;
|
|
40
|
-
--term-bright-white: #000000;
|
|
41
|
-
--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
|
|
42
|
-
--
|
|
43
|
-
--
|
|
44
|
-
--code-
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
49
|
-
--
|
|
50
|
-
--link
|
|
51
|
-
--link-
|
|
52
|
-
--
|
|
53
|
-
--
|
|
54
|
-
--
|
|
55
|
-
--
|
|
56
|
-
--
|
|
57
|
-
--scroll-thumb
|
|
58
|
-
--
|
|
59
|
-
--notice-
|
|
60
|
-
--notice-
|
|
61
|
-
--notice-
|
|
62
|
-
--notice-
|
|
63
|
-
--notice-
|
|
64
|
-
--
|
|
65
|
-
--send-blue
|
|
66
|
-
--
|
|
67
|
-
--brand-grad-
|
|
68
|
-
--
|
|
69
|
-
--
|
|
70
|
-
--
|
|
71
|
-
--
|
|
72
|
-
--
|
|
73
|
-
--glow-
|
|
74
|
-
--glow-
|
|
75
|
-
--glow-
|
|
76
|
-
--glow-
|
|
77
|
-
--glow-
|
|
78
|
-
--glow-
|
|
79
|
-
--glow-
|
|
80
|
-
--glow-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
.hljs
|
|
101
|
-
color: #
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
.hljs-
|
|
105
|
-
.hljs-
|
|
106
|
-
.hljs-meta,
|
|
107
|
-
.hljs-
|
|
108
|
-
.hljs-
|
|
109
|
-
.hljs-
|
|
110
|
-
.hljs-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
.hljs-
|
|
116
|
-
.hljs-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
.hljs-
|
|
121
|
-
.hljs-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
.hljs-
|
|
125
|
-
.hljs-
|
|
126
|
-
.hljs-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
.hljs-
|
|
132
|
-
.hljs-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
.hljs-
|
|
143
|
-
color: #
|
|
144
|
-
}
|
|
145
|
-
.hljs-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
1
|
+
/* theme-name: 白色 */
|
|
2
|
+
/* theme-name-en: White */
|
|
3
|
+
:root {
|
|
4
|
+
color-scheme: light;
|
|
5
|
+
--bg: #ffffff;
|
|
6
|
+
--bg-elev: #ffffff;
|
|
7
|
+
--bg-elev2: #f6f8fa;
|
|
8
|
+
--border: #d0d7de;
|
|
9
|
+
--border-soft: #d8dee4;
|
|
10
|
+
--text: #1f2328;
|
|
11
|
+
--text-dim: #59636e;
|
|
12
|
+
--text-faint: #818b98;
|
|
13
|
+
--accent: #0969da;
|
|
14
|
+
--accent-soft: rgba(9, 105, 218, 0.1);
|
|
15
|
+
--green: #059669;
|
|
16
|
+
--green-soft: rgba(5, 150, 105, 0.12);
|
|
17
|
+
--red: #dc2626;
|
|
18
|
+
--red-soft: rgba(220, 38, 38, 0.1);
|
|
19
|
+
--amber: #d97706;
|
|
20
|
+
--term-bg: #ffffff;
|
|
21
|
+
--term-fg: #1f2328;
|
|
22
|
+
--term-cursor: #0969da;
|
|
23
|
+
--term-cursor-accent: #ffffff;
|
|
24
|
+
--term-selection: rgba(9, 105, 218, 0.32);
|
|
25
|
+
--term-black: #e8eaf0;
|
|
26
|
+
--term-red: #dc2626;
|
|
27
|
+
--term-green: #059669;
|
|
28
|
+
--term-yellow: #d97706;
|
|
29
|
+
--term-blue: #2563eb;
|
|
30
|
+
--term-magenta: #9333ea;
|
|
31
|
+
--term-cyan: #0e7490;
|
|
32
|
+
--term-white: #1f2328;
|
|
33
|
+
--term-bright-black: #8a91a3;
|
|
34
|
+
--term-bright-red: #dc2626;
|
|
35
|
+
--term-bright-green: #059669;
|
|
36
|
+
--term-bright-yellow: #d97706;
|
|
37
|
+
--term-bright-blue: #2563eb;
|
|
38
|
+
--term-bright-magenta: #9333ea;
|
|
39
|
+
--term-bright-cyan: #0e7490;
|
|
40
|
+
--term-bright-white: #000000;
|
|
41
|
+
--mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
|
|
42
|
+
--mermaid-font-size: 12px;
|
|
43
|
+
--tooltip-bg: #ffffff;
|
|
44
|
+
--code-bg: #f6f8fa;
|
|
45
|
+
--code-text: #1f2937;
|
|
46
|
+
--err-text: #dc2626;
|
|
47
|
+
--red-text: #dc2626;
|
|
48
|
+
--amber-text: #b45309;
|
|
49
|
+
--info-blue: #2563eb;
|
|
50
|
+
--link: #0969da;
|
|
51
|
+
--link-hover: #0550ae;
|
|
52
|
+
--link-soft: #0969da;
|
|
53
|
+
--md-strong: #111827;
|
|
54
|
+
--skill-blue: #2563eb;
|
|
55
|
+
--plugin-purple: #b58cff;
|
|
56
|
+
--auth-green: #059669;
|
|
57
|
+
--scroll-thumb: #c7ccd8;
|
|
58
|
+
--scroll-thumb-hover: #aab2c0;
|
|
59
|
+
--notice-err-bg: #eadadf;
|
|
60
|
+
--notice-warn-bg: #eae2dc;
|
|
61
|
+
--notice-info-bg: #d8e0f3;
|
|
62
|
+
--notice-err-border: #dc2626;
|
|
63
|
+
--notice-warn-border: #b45309;
|
|
64
|
+
--notice-info-border: #2563eb;
|
|
65
|
+
--send-blue: #0969da;
|
|
66
|
+
--send-blue-hover: #0550ae;
|
|
67
|
+
--brand-grad-a: #8b5cf6;
|
|
68
|
+
--brand-grad-b: #6366f1;
|
|
69
|
+
--on-amber: #1a1a1a;
|
|
70
|
+
--search-active-fg: #1a1d26;
|
|
71
|
+
--switch-knob: #ffffff;
|
|
72
|
+
--bg-elev3: rgba(0, 0, 0, 0.03);
|
|
73
|
+
--glow-015: rgba(0, 0, 0, 0.02);
|
|
74
|
+
--glow-025: rgba(0, 0, 0, 0.02);
|
|
75
|
+
--glow-03: rgba(0, 0, 0, 0.02);
|
|
76
|
+
--glow-04: rgba(0, 0, 0, 0.03);
|
|
77
|
+
--glow-05: rgba(0, 0, 0, 0.03);
|
|
78
|
+
--glow-12: rgba(0, 0, 0, 0.08);
|
|
79
|
+
--glow-18: rgba(0, 0, 0, 0.12);
|
|
80
|
+
--glow-22: rgba(0, 0, 0, 0.15);
|
|
81
|
+
--glow-38: rgba(0, 0, 0, 0.25);
|
|
82
|
+
--control-fg: #59636e;
|
|
83
|
+
--control-bg: #f6f8fa;
|
|
84
|
+
--control-border: #d0d7de;
|
|
85
|
+
--bg-image: none;
|
|
86
|
+
--bg-image-dim: 0.78;
|
|
87
|
+
--bg-image-blur: 0px;
|
|
88
|
+
--wallpaper-panel-alpha: 62%;
|
|
89
|
+
--topbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
90
|
+
--statusbar-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
91
|
+
--panel-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
92
|
+
--card-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
93
|
+
--chip-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
94
|
+
--msgs-bg: color-mix(in srgb, var(--bg-elev) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
95
|
+
--inputbox-bg: color-mix(in srgb, var(--bg-elev2) var(--wallpaper-panel-alpha, 62%), transparent);
|
|
96
|
+
--menu-bg: var(--chip-bg);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* ---- syntax highlighting (overrides static github-dark import) ---- */
|
|
100
|
+
.hljs {
|
|
101
|
+
color: #1f2328;
|
|
102
|
+
background: #f6f8fa;
|
|
103
|
+
}
|
|
104
|
+
.hljs-doctag,
|
|
105
|
+
.hljs-keyword,
|
|
106
|
+
.hljs-meta .hljs-keyword,
|
|
107
|
+
.hljs-template-tag,
|
|
108
|
+
.hljs-template-variable,
|
|
109
|
+
.hljs-type,
|
|
110
|
+
.hljs-variable.language_ {
|
|
111
|
+
color: #cf222e;
|
|
112
|
+
}
|
|
113
|
+
.hljs-title,
|
|
114
|
+
.hljs-title.class_,
|
|
115
|
+
.hljs-title.class_.inherited__,
|
|
116
|
+
.hljs-title.function_ {
|
|
117
|
+
color: #8250df;
|
|
118
|
+
}
|
|
119
|
+
.hljs-attr,
|
|
120
|
+
.hljs-attribute,
|
|
121
|
+
.hljs-literal,
|
|
122
|
+
.hljs-meta,
|
|
123
|
+
.hljs-number,
|
|
124
|
+
.hljs-operator,
|
|
125
|
+
.hljs-variable,
|
|
126
|
+
.hljs-selector-attr,
|
|
127
|
+
.hljs-selector-class,
|
|
128
|
+
.hljs-selector-id {
|
|
129
|
+
color: #0550ae;
|
|
130
|
+
}
|
|
131
|
+
.hljs-regexp,
|
|
132
|
+
.hljs-string,
|
|
133
|
+
.hljs-meta .hljs-string {
|
|
134
|
+
color: #0a3069;
|
|
135
|
+
}
|
|
136
|
+
.hljs-built_in,
|
|
137
|
+
.hljs-symbol {
|
|
138
|
+
color: #953800;
|
|
139
|
+
}
|
|
140
|
+
.hljs-comment,
|
|
141
|
+
.hljs-code,
|
|
142
|
+
.hljs-formula {
|
|
143
|
+
color: #6e7781;
|
|
144
|
+
}
|
|
145
|
+
.hljs-name,
|
|
146
|
+
.hljs-quote,
|
|
147
|
+
.hljs-selector-tag,
|
|
148
|
+
.hljs-selector-pseudo {
|
|
149
|
+
color: #116329;
|
|
150
|
+
}
|
|
151
|
+
.hljs-subst {
|
|
152
|
+
color: #24292f;
|
|
153
|
+
}
|
|
154
|
+
.hljs-section {
|
|
155
|
+
color: #0550ae;
|
|
156
|
+
font-weight: 700;
|
|
157
|
+
}
|
|
158
|
+
.hljs-bullet {
|
|
159
|
+
color: #0550ae;
|
|
160
|
+
}
|
|
161
|
+
.hljs-emphasis {
|
|
162
|
+
color: #24292f;
|
|
163
|
+
font-style: italic;
|
|
164
|
+
}
|
|
165
|
+
.hljs-strong {
|
|
166
|
+
color: #24292f;
|
|
167
|
+
font-weight: 700;
|
|
168
|
+
}
|
|
169
|
+
.hljs-addition {
|
|
170
|
+
color: #116329;
|
|
171
|
+
background: #dafbe1;
|
|
172
|
+
}
|
|
173
|
+
.hljs-deletion {
|
|
174
|
+
color: #82071e;
|
|
175
|
+
background: #ffebe9;
|
|
176
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as l,j as n}from"./markdown-Cpo0pNcR.js";import{u as P,b as O,T as M,a as W,F as Y,c as z,d as Z,e as H,f as ee,g as ne,h as te,i as se,r as ae}from"./index-
|
|
1
|
+
import{a as l,j as n}from"./markdown-Cpo0pNcR.js";import{u as P,b as O,T as M,a as W,F as Y,c as z,d as Z,e as H,f as ee,g as ne,h as te,i as se,r as ae}from"./index-Cue012aF.js";import{D as re,o as ie}from"./xterm-B96xOxS9.js";import"./react-CtudoG1_.js";function le(t){let c=null;return{clean:t.replace(/\r?\n?\[pi-term-exit:(-?\d+)\]\r?\n?/g,(a,x)=>(c=Number(x),`\r
|
|
2
2
|
`)).replace(/\r?\n?\x1b\[90m\[(?:进程已退出,退出码 |Process exited with code )-?\d+\]\x1b\[0m\r?\n?/g,`\r
|
|
3
3
|
`),exitCode:c}}function ce({conversationId:t,terminalId:c,command:p,cwd:a,title:x,active:u,running:v,exitCode:j,send:h,register:C}){const T=l.useRef(null),y=l.useRef(null),{locale:o}=P(),N=l.useRef(o);N.current=o;const E=p?JSON.stringify(p):"";l.useEffect(()=>{const m=T.current;if(!m)return;const r=new re({theme:O(),fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),b=new ie;r.loadAddon(b),r.open(m),y.current={term:r,fit:b},u&&r.focus();const g=()=>{r.options.theme=O()};window.addEventListener(M,g),r.attachCustomKeyEventHandler(d=>{if(d.type!=="keydown")return!0;const S=d.key?.toLowerCase();if((d.ctrlKey||d.metaKey)&&S==="v")return!1;if(d.ctrlKey&&!d.shiftKey&&!d.altKey&&S==="c"&&r.hasSelection()){const D=r.textarea;return D&&(D.value=r.getSelection(),D.select()),!1}return!0});const _=C(t,c,{write:d=>r.write(le(d).clean),dispose:()=>r.dispose()}),$=()=>{try{b.fit(),h({type:"terminal_resize",terminalId:c,conversationId:t,cols:r.cols,rows:r.rows})}catch{}},B=requestAnimationFrame(()=>{try{b.fit()}catch{}h(p?{type:"run_command",terminalId:c,conversationId:t,command:p,cols:r.cols,rows:r.rows}:{type:"terminal_create",terminalId:c,title:x,locale:N.current,conversationId:t,cwd:a,cols:r.cols,rows:r.rows})}),R=r.onData(d=>{h({type:"terminal_input",terminalId:c,conversationId:t,data:d})});let k=null;return typeof ResizeObserver<"u"&&(k=new ResizeObserver(()=>{m.offsetWidth>0&&m.offsetHeight>0&&$()}),k.observe(m)),()=>{cancelAnimationFrame(B),R.dispose(),window.removeEventListener(M,g),k?.disconnect(),_(),r.dispose(),y.current=null}},[t,c,E,h,C]),l.useEffect(()=>{if(!u)return;const m=requestAnimationFrame(()=>{const r=y.current;if(r){try{r.fit.fit(),h({type:"terminal_resize",terminalId:c,conversationId:t,cols:r.term.cols,rows:r.term.rows})}catch{}r.term.focus()}});return()=>cancelAnimationFrame(m)},[u]);const{t:F}=P(),f=l.useRef(void 0);return l.useEffect(()=>{if(v===f.current||(f.current=v,v!==!1))return;const m=y.current;m&&m.term.write(`\r
|
|
4
4
|
\x1B[90m${F("exitBanner",{code:j??""})}\x1B[0m\r
|