pi-web-ui 0.64.0 → 0.64.2

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 (45) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +504 -504
  3. package/README.zh-CN.md +427 -427
  4. package/bin/pi-web-ui.mjs +1809 -1809
  5. package/deploy/com.xingshuyin.pi-web-ui.plist +48 -48
  6. package/deploy/nginx-subpath.conf +88 -88
  7. package/deploy/pi-web-ui-task.xml +54 -54
  8. package/deploy/pi-web-ui.service +31 -31
  9. package/dist/server/agent-service.js +45 -22
  10. package/dist/server/attachments.js +16 -11
  11. package/dist/server/dsh/dsh-agent-service.js +27 -7
  12. package/dist/server/dsh/runtime/cordis.yml +1 -1
  13. package/dist/server/dsh/runtime/goal-rpc.mjs +645 -645
  14. package/dist/server/dsh/runtime/launcher.mjs +164 -164
  15. package/dist/server/dsh/runtime/override.patch.yml +71 -71
  16. package/dist/server/dsh/runtime/runtime-root.mjs +86 -86
  17. package/dist/server/files-service.js +235 -43
  18. package/dist/server/goal-service.js +4 -1
  19. package/dist/server/index.js +48 -13
  20. package/dist/server/marker-service.js +8 -3
  21. package/dist/server/markers/builtins/rename.js +3 -3
  22. package/dist/server/model-admin.js +12 -6
  23. package/dist/server/plugins.js +4 -4
  24. package/dist/server/slash-commands.js +3 -0
  25. package/dist/server/terminals.js +25 -15
  26. package/dist/server/vision-bridge.js +9 -9
  27. package/dist/server/webui-context.js +2 -2
  28. package/extensions/webui.ts +190 -190
  29. package/package.json +109 -109
  30. package/themes/cyberpunk.css +81 -81
  31. package/themes/dazzle.css +81 -81
  32. package/themes/md-preview.css +98 -98
  33. package/themes/white.css +160 -160
  34. package/web/dist/assets/TerminalPanel-BXISCcrQ.js +6 -0
  35. package/web/dist/assets/index-BxuvIAJQ.js +326 -0
  36. package/web/dist/assets/{index-CMgDryBL.css → index-DVnuQrK5.css} +1 -1
  37. package/web/dist/favicon.svg +8 -8
  38. package/web/dist/index.html +21 -21
  39. package/web/dist/manifest.webmanifest +50 -50
  40. package/web/dist/sw.js +126 -126
  41. package/web/public/favicon.svg +8 -8
  42. package/web/public/manifest.webmanifest +50 -50
  43. package/web/public/sw.js +126 -126
  44. package/web/dist/assets/TerminalPanel-DNkAT34Z.js +0 -2
  45. package/web/dist/assets/index-_1vyEugI.js +0 -326
@@ -1,98 +1,98 @@
1
- /* theme-name: 紫晕 */
2
- /* theme-name-en: Purple Haze */
3
- :root {
4
- color-scheme: dark;
5
- --bg: #0d0e12;
6
- --bg-elev: #14161c;
7
- --bg-elev2: #1a1d26;
8
- --border: #262a35;
9
- --border-soft: #1e2230;
10
- --text: #e6e8ef;
11
- --text-dim: #9aa1b4;
12
- --text-faint: #6b7284;
13
- --accent: #8b5cf6;
14
- --accent-soft: rgba(139, 92, 246, 0.14);
15
- --green: #34d399;
16
- --green-soft: rgba(52, 211, 153, 0.12);
17
- --red: #f87171;
18
- --red-soft: rgba(248, 113, 113, 0.12);
19
- --amber: #fbbf24;
20
- --term-bg: #0b0d12;
21
- --term-fg: #e6e8ef;
22
- --term-cursor: #8b5cf6;
23
- --term-cursor-accent: #0b0d12;
24
- --term-selection: rgba(139, 92, 246, 0.35);
25
- --term-black: #1a1d26;
26
- --term-red: #f87171;
27
- --term-green: #34d399;
28
- --term-yellow: #fbbf24;
29
- --term-blue: #60a5fa;
30
- --term-magenta: #c084fc;
31
- --term-cyan: #22d3ee;
32
- --term-white: #e6e8ef;
33
- --term-bright-black: #6b7284;
34
- --term-bright-red: #f87171;
35
- --term-bright-green: #34d399;
36
- --term-bright-yellow: #fbbf24;
37
- --term-bright-blue: #60a5fa;
38
- --term-bright-magenta: #c084fc;
39
- --term-bright-cyan: #22d3ee;
40
- --term-bright-white: #ffffff;
41
- --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
42
- --tooltip-bg: #232733;
43
- --code-bg: #0b0d12;
44
- --code-text: #c9d1d9;
45
- --err-text: #f0a5a5;
46
- --red-text: #fca5a5;
47
- --amber-text: #fcd34d;
48
- --info-blue: #60a5fa;
49
- --link: #a78bfa;
50
- --link-hover: #c4b5fd;
51
- --link-soft: #ddd6fe;
52
- --md-strong: #f3f4f6;
53
- --skill-blue: #5eb3ff;
54
- --plugin-purple: #b58cff;
55
- --auth-green: #6ee7a0;
56
- --scroll-thumb: #2a2f3d;
57
- --scroll-thumb-hover: #3a4152;
58
- --notice-err-bg: #401d23;
59
- --notice-warn-bg: #38251f;
60
- --notice-info-bg: #1b2544;
61
- --notice-err-border: #ef4444;
62
- --notice-warn-border: #f59e0b;
63
- --notice-info-border: #3b82f6;
64
- --send-blue: #3b82f6;
65
- --send-blue-hover: #2563eb;
66
- --brand-grad-a: #8b5cf6;
67
- --brand-grad-b: #6366f1;
68
- --on-amber: #1a1a1a;
69
- --search-active-fg: #1a1d26;
70
- --switch-knob: #ffffff;
71
- --bg-elev3: rgba(255, 255, 255, 0.06);
72
- --glow-015: rgba(255, 255, 255, 0.015);
73
- --glow-025: rgba(255, 255, 255, 0.025);
74
- --glow-03: rgba(255, 255, 255, 0.03);
75
- --glow-04: rgba(255, 255, 255, 0.04);
76
- --glow-05: rgba(255, 255, 255, 0.05);
77
- --glow-12: rgba(255, 255, 255, 0.12);
78
- --glow-18: rgba(255, 255, 255, 0.18);
79
- --glow-22: rgba(255, 255, 255, 0.22);
80
- --glow-38: rgba(255, 255, 255, 0.38);
81
- }
82
-
83
- /* ---- ambient gradient(镜像 .fp-markdown 预览底色,覆盖整个窗口)---- */
84
- :root {
85
- --bg: #0a0b10;
86
- }
87
- body {
88
- background:
89
- radial-gradient(circle at 10% 0%, rgba(139, 92, 246, 0.14), transparent 38%),
90
- radial-gradient(circle at 88% 100%, rgba(139, 92, 246, 0.07), transparent 44%),
91
- #0a0b10;
92
- }
93
- /* 让渐变直接成为整个窗口的底色:铬件全部透明,只留边框定结构 */
94
- .topbar,
95
- .panel,
96
- .statusbar {
97
- background: transparent;
98
- }
1
+ /* theme-name: 紫晕 */
2
+ /* theme-name-en: Purple Haze */
3
+ :root {
4
+ color-scheme: dark;
5
+ --bg: #0d0e12;
6
+ --bg-elev: #14161c;
7
+ --bg-elev2: #1a1d26;
8
+ --border: #262a35;
9
+ --border-soft: #1e2230;
10
+ --text: #e6e8ef;
11
+ --text-dim: #9aa1b4;
12
+ --text-faint: #6b7284;
13
+ --accent: #8b5cf6;
14
+ --accent-soft: rgba(139, 92, 246, 0.14);
15
+ --green: #34d399;
16
+ --green-soft: rgba(52, 211, 153, 0.12);
17
+ --red: #f87171;
18
+ --red-soft: rgba(248, 113, 113, 0.12);
19
+ --amber: #fbbf24;
20
+ --term-bg: #0b0d12;
21
+ --term-fg: #e6e8ef;
22
+ --term-cursor: #8b5cf6;
23
+ --term-cursor-accent: #0b0d12;
24
+ --term-selection: rgba(139, 92, 246, 0.35);
25
+ --term-black: #1a1d26;
26
+ --term-red: #f87171;
27
+ --term-green: #34d399;
28
+ --term-yellow: #fbbf24;
29
+ --term-blue: #60a5fa;
30
+ --term-magenta: #c084fc;
31
+ --term-cyan: #22d3ee;
32
+ --term-white: #e6e8ef;
33
+ --term-bright-black: #6b7284;
34
+ --term-bright-red: #f87171;
35
+ --term-bright-green: #34d399;
36
+ --term-bright-yellow: #fbbf24;
37
+ --term-bright-blue: #60a5fa;
38
+ --term-bright-magenta: #c084fc;
39
+ --term-bright-cyan: #22d3ee;
40
+ --term-bright-white: #ffffff;
41
+ --mono: "SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace;
42
+ --tooltip-bg: #232733;
43
+ --code-bg: #0b0d12;
44
+ --code-text: #c9d1d9;
45
+ --err-text: #f0a5a5;
46
+ --red-text: #fca5a5;
47
+ --amber-text: #fcd34d;
48
+ --info-blue: #60a5fa;
49
+ --link: #a78bfa;
50
+ --link-hover: #c4b5fd;
51
+ --link-soft: #ddd6fe;
52
+ --md-strong: #f3f4f6;
53
+ --skill-blue: #5eb3ff;
54
+ --plugin-purple: #b58cff;
55
+ --auth-green: #6ee7a0;
56
+ --scroll-thumb: #2a2f3d;
57
+ --scroll-thumb-hover: #3a4152;
58
+ --notice-err-bg: #401d23;
59
+ --notice-warn-bg: #38251f;
60
+ --notice-info-bg: #1b2544;
61
+ --notice-err-border: #ef4444;
62
+ --notice-warn-border: #f59e0b;
63
+ --notice-info-border: #3b82f6;
64
+ --send-blue: #3b82f6;
65
+ --send-blue-hover: #2563eb;
66
+ --brand-grad-a: #8b5cf6;
67
+ --brand-grad-b: #6366f1;
68
+ --on-amber: #1a1a1a;
69
+ --search-active-fg: #1a1d26;
70
+ --switch-knob: #ffffff;
71
+ --bg-elev3: rgba(255, 255, 255, 0.06);
72
+ --glow-015: rgba(255, 255, 255, 0.015);
73
+ --glow-025: rgba(255, 255, 255, 0.025);
74
+ --glow-03: rgba(255, 255, 255, 0.03);
75
+ --glow-04: rgba(255, 255, 255, 0.04);
76
+ --glow-05: rgba(255, 255, 255, 0.05);
77
+ --glow-12: rgba(255, 255, 255, 0.12);
78
+ --glow-18: rgba(255, 255, 255, 0.18);
79
+ --glow-22: rgba(255, 255, 255, 0.22);
80
+ --glow-38: rgba(255, 255, 255, 0.38);
81
+ }
82
+
83
+ /* ---- ambient gradient(镜像 .fp-markdown 预览底色,覆盖整个窗口)---- */
84
+ :root {
85
+ --bg: #0a0b10;
86
+ }
87
+ body {
88
+ background:
89
+ radial-gradient(circle at 10% 0%, rgba(139, 92, 246, 0.14), transparent 38%),
90
+ radial-gradient(circle at 88% 100%, rgba(139, 92, 246, 0.07), transparent 44%),
91
+ #0a0b10;
92
+ }
93
+ /* 让渐变直接成为整个窗口的底色:铬件全部透明,只留边框定结构 */
94
+ .topbar,
95
+ .panel,
96
+ .statusbar {
97
+ background: transparent;
98
+ }
package/themes/white.css CHANGED
@@ -1,160 +1,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
- --tooltip-bg: #ffffff;
43
- --code-bg: #f6f8fa;
44
- --code-text: #1f2937;
45
- --err-text: #dc2626;
46
- --red-text: #dc2626;
47
- --amber-text: #b45309;
48
- --info-blue: #2563eb;
49
- --link: #0969da;
50
- --link-hover: #0550ae;
51
- --link-soft: #0969da;
52
- --md-strong: #111827;
53
- --skill-blue: #2563eb;
54
- --plugin-purple: #b58cff;
55
- --auth-green: #059669;
56
- --scroll-thumb: #c7ccd8;
57
- --scroll-thumb-hover: #aab2c0;
58
- --notice-err-bg: #eadadf;
59
- --notice-warn-bg: #eae2dc;
60
- --notice-info-bg: #d8e0f3;
61
- --notice-err-border: #dc2626;
62
- --notice-warn-border: #b45309;
63
- --notice-info-border: #2563eb;
64
- --send-blue: #0969da;
65
- --send-blue-hover: #0550ae;
66
- --brand-grad-a: #8b5cf6;
67
- --brand-grad-b: #6366f1;
68
- --on-amber: #1a1a1a;
69
- --search-active-fg: #1a1d26;
70
- --switch-knob: #ffffff;
71
- --bg-elev3: rgba(0, 0, 0, 0.03);
72
- --glow-015: rgba(0, 0, 0, 0.02);
73
- --glow-025: rgba(0, 0, 0, 0.02);
74
- --glow-03: rgba(0, 0, 0, 0.02);
75
- --glow-04: rgba(0, 0, 0, 0.03);
76
- --glow-05: rgba(0, 0, 0, 0.03);
77
- --glow-12: rgba(0, 0, 0, 0.08);
78
- --glow-18: rgba(0, 0, 0, 0.12);
79
- --glow-22: rgba(0, 0, 0, 0.15);
80
- --glow-38: rgba(0, 0, 0, 0.25);
81
- }
82
-
83
- /* ---- syntax highlighting (overrides static github-dark import) ---- */
84
- .hljs {
85
- color: #1f2328;
86
- background: #f6f8fa;
87
- }
88
- .hljs-doctag,
89
- .hljs-keyword,
90
- .hljs-meta .hljs-keyword,
91
- .hljs-template-tag,
92
- .hljs-template-variable,
93
- .hljs-type,
94
- .hljs-variable.language_ {
95
- color: #cf222e;
96
- }
97
- .hljs-title,
98
- .hljs-title.class_,
99
- .hljs-title.class_.inherited__,
100
- .hljs-title.function_ {
101
- color: #8250df;
102
- }
103
- .hljs-attr,
104
- .hljs-attribute,
105
- .hljs-literal,
106
- .hljs-meta,
107
- .hljs-number,
108
- .hljs-operator,
109
- .hljs-variable,
110
- .hljs-selector-attr,
111
- .hljs-selector-class,
112
- .hljs-selector-id {
113
- color: #0550ae;
114
- }
115
- .hljs-regexp,
116
- .hljs-string,
117
- .hljs-meta .hljs-string {
118
- color: #0a3069;
119
- }
120
- .hljs-built_in,
121
- .hljs-symbol {
122
- color: #953800;
123
- }
124
- .hljs-comment,
125
- .hljs-code,
126
- .hljs-formula {
127
- color: #6e7781;
128
- }
129
- .hljs-name,
130
- .hljs-quote,
131
- .hljs-selector-tag,
132
- .hljs-selector-pseudo {
133
- color: #116329;
134
- }
135
- .hljs-subst {
136
- color: #24292f;
137
- }
138
- .hljs-section {
139
- color: #0550ae;
140
- font-weight: 700;
141
- }
142
- .hljs-bullet {
143
- color: #0550ae;
144
- }
145
- .hljs-emphasis {
146
- color: #24292f;
147
- font-style: italic;
148
- }
149
- .hljs-strong {
150
- color: #24292f;
151
- font-weight: 700;
152
- }
153
- .hljs-addition {
154
- color: #116329;
155
- background: #dafbe1;
156
- }
157
- .hljs-deletion {
158
- color: #82071e;
159
- background: #ffebe9;
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
+ --tooltip-bg: #ffffff;
43
+ --code-bg: #f6f8fa;
44
+ --code-text: #1f2937;
45
+ --err-text: #dc2626;
46
+ --red-text: #dc2626;
47
+ --amber-text: #b45309;
48
+ --info-blue: #2563eb;
49
+ --link: #0969da;
50
+ --link-hover: #0550ae;
51
+ --link-soft: #0969da;
52
+ --md-strong: #111827;
53
+ --skill-blue: #2563eb;
54
+ --plugin-purple: #b58cff;
55
+ --auth-green: #059669;
56
+ --scroll-thumb: #c7ccd8;
57
+ --scroll-thumb-hover: #aab2c0;
58
+ --notice-err-bg: #eadadf;
59
+ --notice-warn-bg: #eae2dc;
60
+ --notice-info-bg: #d8e0f3;
61
+ --notice-err-border: #dc2626;
62
+ --notice-warn-border: #b45309;
63
+ --notice-info-border: #2563eb;
64
+ --send-blue: #0969da;
65
+ --send-blue-hover: #0550ae;
66
+ --brand-grad-a: #8b5cf6;
67
+ --brand-grad-b: #6366f1;
68
+ --on-amber: #1a1a1a;
69
+ --search-active-fg: #1a1d26;
70
+ --switch-knob: #ffffff;
71
+ --bg-elev3: rgba(0, 0, 0, 0.03);
72
+ --glow-015: rgba(0, 0, 0, 0.02);
73
+ --glow-025: rgba(0, 0, 0, 0.02);
74
+ --glow-03: rgba(0, 0, 0, 0.02);
75
+ --glow-04: rgba(0, 0, 0, 0.03);
76
+ --glow-05: rgba(0, 0, 0, 0.03);
77
+ --glow-12: rgba(0, 0, 0, 0.08);
78
+ --glow-18: rgba(0, 0, 0, 0.12);
79
+ --glow-22: rgba(0, 0, 0, 0.15);
80
+ --glow-38: rgba(0, 0, 0, 0.25);
81
+ }
82
+
83
+ /* ---- syntax highlighting (overrides static github-dark import) ---- */
84
+ .hljs {
85
+ color: #1f2328;
86
+ background: #f6f8fa;
87
+ }
88
+ .hljs-doctag,
89
+ .hljs-keyword,
90
+ .hljs-meta .hljs-keyword,
91
+ .hljs-template-tag,
92
+ .hljs-template-variable,
93
+ .hljs-type,
94
+ .hljs-variable.language_ {
95
+ color: #cf222e;
96
+ }
97
+ .hljs-title,
98
+ .hljs-title.class_,
99
+ .hljs-title.class_.inherited__,
100
+ .hljs-title.function_ {
101
+ color: #8250df;
102
+ }
103
+ .hljs-attr,
104
+ .hljs-attribute,
105
+ .hljs-literal,
106
+ .hljs-meta,
107
+ .hljs-number,
108
+ .hljs-operator,
109
+ .hljs-variable,
110
+ .hljs-selector-attr,
111
+ .hljs-selector-class,
112
+ .hljs-selector-id {
113
+ color: #0550ae;
114
+ }
115
+ .hljs-regexp,
116
+ .hljs-string,
117
+ .hljs-meta .hljs-string {
118
+ color: #0a3069;
119
+ }
120
+ .hljs-built_in,
121
+ .hljs-symbol {
122
+ color: #953800;
123
+ }
124
+ .hljs-comment,
125
+ .hljs-code,
126
+ .hljs-formula {
127
+ color: #6e7781;
128
+ }
129
+ .hljs-name,
130
+ .hljs-quote,
131
+ .hljs-selector-tag,
132
+ .hljs-selector-pseudo {
133
+ color: #116329;
134
+ }
135
+ .hljs-subst {
136
+ color: #24292f;
137
+ }
138
+ .hljs-section {
139
+ color: #0550ae;
140
+ font-weight: 700;
141
+ }
142
+ .hljs-bullet {
143
+ color: #0550ae;
144
+ }
145
+ .hljs-emphasis {
146
+ color: #24292f;
147
+ font-style: italic;
148
+ }
149
+ .hljs-strong {
150
+ color: #24292f;
151
+ font-weight: 700;
152
+ }
153
+ .hljs-addition {
154
+ color: #116329;
155
+ background: #dafbe1;
156
+ }
157
+ .hljs-deletion {
158
+ color: #82071e;
159
+ background: #ffebe9;
160
+ }
@@ -0,0 +1,6 @@
1
+ import{a as l,j as n}from"./markdown-DRBrS2Nf.js";import{u as O,b as M,T as z,a as W,F as Y,c as H,d as Z,e as q,f as ee,g as ne,h as te,i as se,r as ae}from"./index-BxuvIAJQ.js";import{D as re,o as ie}from"./xterm-D1D2FVe3.js";import"./react-C9ovnpIm.js";function le(t){let c=null;return{clean:t.replace(/\r?\n?\[pi-term-exit:(-?\d+)\]\r?\n?/g,(a,h)=>(c=Number(h),`\r
2
+ `)).replace(/\r?\n?\x1b\[90m\[(?:进程已退出,退出码 |Process exited with code )-?\d+\]\x1b\[0m\r?\n?/g,`\r
3
+ `),exitCode:c}}function ce({conversationId:t,terminalId:c,command:f,cwd:a,title:h,active:u,running:b,exitCode:y,send:j,register:T}){const k=l.useRef(null),N=l.useRef(null),{locale:o}=O(),w=l.useRef(o);w.current=o;const F=f?JSON.stringify(f):"";l.useEffect(()=>{const m=k.current;if(!m)return;const r=new re({theme:M(),fontFamily:'"SF Mono", "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace',fontSize:13,cursorBlink:!0,scrollback:8e3}),g=new ie;r.loadAddon(g),r.open(m),N.current={term:r,fit:g},u&&r.focus();const C=()=>{r.options.theme=M()};window.addEventListener(z,C),r.attachCustomKeyEventHandler(d=>{var A;if(d.type!=="keydown")return!0;const D=(A=d.key)==null?void 0:A.toLowerCase();if((d.ctrlKey||d.metaKey)&&D==="v")return!1;if(d.ctrlKey&&!d.shiftKey&&!d.altKey&&D==="c"&&r.hasSelection()){const E=r.textarea;return E&&(E.value=r.getSelection(),E.select()),!1}return!0});const _=T(t,c,{write:d=>r.write(le(d).clean),dispose:()=>r.dispose()}),$=()=>{try{g.fit(),j({type:"terminal_resize",terminalId:c,conversationId:t,cols:r.cols,rows:r.rows})}catch{}},B=requestAnimationFrame(()=>{try{g.fit()}catch{}j(f?{type:"run_command",terminalId:c,conversationId:t,command:f,cols:r.cols,rows:r.rows}:{type:"terminal_create",terminalId:c,title:h,locale:w.current,conversationId:t,cwd:a,cols:r.cols,rows:r.rows})}),S=r.onData(d=>{j({type:"terminal_input",terminalId:c,conversationId:t,data:d})});let v=null;return typeof ResizeObserver<"u"&&(v=new ResizeObserver(()=>{m.offsetWidth>0&&m.offsetHeight>0&&$()}),v.observe(m)),()=>{cancelAnimationFrame(B),S.dispose(),window.removeEventListener(z,C),v==null||v.disconnect(),_(),r.dispose(),N.current=null}},[t,c,F,j,T]),l.useEffect(()=>{if(!u)return;const m=requestAnimationFrame(()=>{const r=N.current;if(r){try{r.fit.fit(),j({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:R}=O(),x=l.useRef(void 0);return l.useEffect(()=>{if(b===x.current||(x.current=b,b!==!1))return;const m=N.current;m&&m.term.write(`\r
4
+ \x1B[90m${R("exitBanner",{code:y??""})}\x1B[0m\r
5
+ `)},[b,c,y]),n.jsx("div",{ref:k,className:`term-xterm ${u?"":"hidden"}`})}const G={name:"",command:"",cwd:"${pwd}"};function pe({chat:t,send:c,terminal:f}){const a=W(),[h,u]=l.useState(null),[b,y]=l.useState(!1),[j,T]=l.useState(!1),[k,N]=l.useState(null),[o,w]=l.useState(G),[F,R]=l.useState(null),x=l.useRef(null),[m,r]=l.useState(!0),[g,C]=l.useState(null),[_,$]=l.useState("");l.useEffect(()=>{t.terminals.length===0?u(null):t.terminals.some(e=>e.id===h)||u(t.terminals[t.terminals.length-1].id)},[t.terminals,h]),l.useEffect(()=>{t.terminalActiveId&&(u(t.terminalActiveId),y(!1))},[t.terminalActiveId]),l.useEffect(()=>()=>{x.current&&clearTimeout(x.current)},[]);const B=t.terminals.filter(e=>!e.agentBash),S=t.terminals.filter(e=>e.agentBash),v=e=>{var p;if(!t.ready)return;const s=ae(),i=t.activeConversationId||((p=t.state)==null?void 0:p.conversationId)||"";f.create({...e,id:s,conversationId:i,cols:e.cols??80,rows:e.rows??24,running:!0,exitCode:null}),u(s),y(!1)},d=()=>{var e;return v({title:a("terminalTitle",{n:B.length+1}),cwd:((e=t.state)==null?void 0:e.cwd)??""})},D=e=>{var p;const s=e.name||e.command,i=t.terminals.find(K=>K.title===s);if(i){f.restart(i.id),u(i.id),c({type:"run_command",terminalId:i.id,conversationId:i.conversationId,command:e,cols:80,rows:24});return}v({title:s,cwd:((p=t.state)==null?void 0:p.cwd)??"",command:e})},A=e=>{const s=t.terminals.find(i=>i.id===e);if(s&&c({type:"terminal_kill",terminalId:e,conversationId:s.conversationId}),f.close(e),h===e){const i=t.terminals.filter(p=>p.id!==e);u(i.length>0?i[i.length-1].id:null)}},E=e=>n.jsxs("div",{className:`term-tab ${e.id===h?"active":""}`,children:[n.jsxs("button",{type:"button",className:"term-tab-main",title:`${e.cwd}${e.command?`
6
+ > ${e.command.command}`:""}`,onClick:()=>{g||(u(e.id),y(!1))},children:[n.jsx("span",{className:`term-tab-dot ${e.running?"run":"exit"}`}),n.jsxs("span",{className:"term-tab-title",children:[g===e.id?n.jsx("input",{autoFocus:!0,className:"term-tab-rename-input",value:_,placeholder:e.title,onClick:s=>s.stopPropagation(),onChange:s=>$(s.target.value),onKeyDown:s=>{if(s.stopPropagation(),s.key==="Enter"&&!s.nativeEvent.isComposing){const i=_.trim();i&&c({type:"rename_terminal",terminalId:e.id,conversationId:e.conversationId,title:i}),C(null)}else s.key==="Escape"&&C(null)},onBlur:()=>C(null)}):e.title,!e.running&&n.jsx("span",{className:"term-tab-exit",children:a("exited",{code:e.exitCode===null?"":` ${e.exitCode}`})})]})]}),n.jsx("button",{type:"button",className:"term-tab-close term-tab-rename",title:a("renameTerminal"),onClick:s=>{s.stopPropagation(),$(e.title),C(e.id)},children:n.jsx(q,{})}),n.jsx("button",{type:"button",className:"term-tab-close",title:a("closeTerminal"),onClick:()=>A(e.id),children:n.jsx(se,{})})]},e.id),L=()=>{T(!0),N(null),w(G)},J=e=>{const s=t.commands[e];s&&(T(!1),N(e),w({name:s.name,command:s.command,cwd:s.cwd??""}))},P=()=>{T(!1),N(null)},I=()=>{const e=o.name.trim(),s=o.command.trim();if(!e||!s)return;const i=o.cwd.trim(),p={name:e,command:s,cwd:i||void 0},K=j?[...t.commands,p]:k!==null?t.commands.map((U,V)=>V===k?p:U):t.commands;c({type:"save_commands",commands:K}),P()},X=e=>{if(F===e){const s=t.commands.filter((i,p)=>p!==e);c({type:"save_commands",commands:s}),R(null),x.current&&clearTimeout(x.current)}else R(e),x.current&&clearTimeout(x.current),x.current=setTimeout(()=>R(null),2500)},Q=j||k!==null;return n.jsxs("div",{className:"terminal-view",children:[n.jsxs("aside",{className:`term-side term-commands ${b?"open":""}`,children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:a("commands")}),n.jsxs("div",{className:"panel-header-actions",children:[n.jsx("button",{type:"button",className:"panel-refresh",title:a("rerun"),onClick:()=>c({type:"list_commands"}),children:n.jsx(Y,{})}),n.jsx("button",{type:"button",className:"panel-new",title:a("newCommand"),onClick:L,children:n.jsx(H,{})})]})]}),n.jsx("div",{className:"panel-body",children:Q?n.jsxs("div",{className:"cmd-form",children:[n.jsx("label",{htmlFor:"cmd-name",children:a("name")}),n.jsx("input",{id:"cmd-name",className:"cmd-input",value:o.name,placeholder:a("exampleName"),autoFocus:!0,onChange:e=>w({...o,name:e.target.value})}),n.jsx("label",{htmlFor:"cmd-command",children:a("command")}),n.jsx("input",{id:"cmd-command",className:"cmd-input",value:o.command,placeholder:a("exampleCommand"),onChange:e=>w({...o,command:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&I()}}),n.jsxs("label",{htmlFor:"cmd-cwd",children:[a("directory")," ",n.jsx("span",{className:"cmd-hint",children:a("cwdHint")})]}),n.jsx("input",{id:"cmd-cwd",className:"cmd-input",value:o.cwd,placeholder:"${pwd}",onChange:e=>w({...o,cwd:e.target.value}),onKeyDown:e=>{e.key==="Enter"&&!e.nativeEvent.isComposing&&I()}}),n.jsxs("div",{className:"cmd-form-actions",children:[n.jsx("button",{type:"button",className:"btn",onClick:P,children:a("cancel")}),n.jsx("button",{type:"button",className:"btn primary",disabled:!o.name.trim()||!o.command.trim(),onClick:I,children:a("save")})]})]}):n.jsxs(n.Fragment,{children:[t.commands.length===0&&n.jsx("div",{className:"panel-empty",children:a("noCommands")}),t.commands.map((e,s)=>n.jsxs("div",{className:"cmd-item",children:[n.jsx("button",{type:"button",className:"cmd-run",title:a("clickToRun"),onClick:()=>D(e),children:n.jsx(Z,{})}),n.jsxs("button",{type:"button",className:"cmd-main",title:a("clickToRun"),onClick:()=>D(e),children:[n.jsx("span",{className:"cmd-name",children:e.name}),n.jsx("span",{className:"cmd-command",children:e.command}),e.cwd&&n.jsx("span",{className:"cmd-cwd",children:e.cwd})]}),n.jsx("button",{type:"button",className:"cmd-act",title:a("edit"),onClick:()=>J(s),children:n.jsx(q,{})}),n.jsx("button",{type:"button",className:`cmd-act del ${F===s?"confirm":""}`,title:a("delete"),onClick:()=>X(s),children:F===s?a("confirmQ"):n.jsx(ee,{})})]},s))]})}),n.jsxs("div",{className:"term-tabs-block",children:[n.jsxs("div",{className:"panel-header",children:[n.jsx("span",{className:"panel-title",children:a("terminal")}),n.jsx("button",{type:"button",className:"panel-new",title:a("newTerminal"),onClick:d,children:n.jsx(H,{})})]}),n.jsxs("div",{className:"panel-body",children:[t.terminals.length===0&&n.jsx("div",{className:"panel-empty",children:a("noTerminal")}),B.map(E),S.length>0&&n.jsxs("div",{className:"term-folder",children:[n.jsxs("button",{type:"button",className:`term-folder-header ${m?"open":""}`,title:a("aiBashGroup"),onClick:()=>r(e=>!e),children:[n.jsx("span",{className:"term-folder-caret",children:m?"▾":"▸"}),n.jsx("span",{className:"term-folder-title",children:a("aiBashGroup")}),n.jsx("span",{className:"term-folder-count",children:S.length})]}),m&&n.jsx("div",{className:"term-folder-body",children:S.map(E)})]})]})]})]}),n.jsxs("div",{className:"term-main",children:[b&&n.jsx("div",{className:"drawer-backdrop",onClick:()=>y(!1)}),n.jsx("button",{type:"button",className:"term-side-toggle",title:a("commands"),onClick:()=>y(e=>!e),children:n.jsx(ne,{})}),t.terminals.length===0?n.jsxs("div",{className:"term-empty",children:[n.jsx(te,{className:"term-empty-icon"}),n.jsx("div",{className:"term-empty-title",children:a("builtinTerminal")}),n.jsx("div",{className:"term-empty-sub",children:a("termEmptySub")})]}):t.terminals.map(e=>n.jsx(ce,{conversationId:e.conversationId,terminalId:e.id,command:e.command,cwd:e.cwd,title:e.title,active:e.id===h,running:e.running,exitCode:e.exitCode,send:c,register:f.register},`${e.conversationId}:${e.id}`))]})]})}export{pe as TerminalPanel};