@tom2012/cc-web 2026.5.20-a → 2026.5.24-a

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 (40) hide show
  1. package/README.md +1 -1
  2. package/backend/dist/__tests__/browser-proxy.test.d.ts +2 -0
  3. package/backend/dist/__tests__/browser-proxy.test.d.ts.map +1 -0
  4. package/backend/dist/__tests__/browser-proxy.test.js +306 -0
  5. package/backend/dist/__tests__/browser-proxy.test.js.map +1 -0
  6. package/backend/dist/__tests__/cli-prompt-detector.test.js +31 -0
  7. package/backend/dist/__tests__/cli-prompt-detector.test.js.map +1 -1
  8. package/backend/dist/cli-prompt-detector.d.ts.map +1 -1
  9. package/backend/dist/cli-prompt-detector.js +23 -4
  10. package/backend/dist/cli-prompt-detector.js.map +1 -1
  11. package/backend/dist/index.d.ts.map +1 -1
  12. package/backend/dist/index.js +5 -0
  13. package/backend/dist/index.js.map +1 -1
  14. package/backend/dist/notify-service.d.ts +1 -0
  15. package/backend/dist/notify-service.d.ts.map +1 -1
  16. package/backend/dist/notify-service.js +1 -0
  17. package/backend/dist/notify-service.js.map +1 -1
  18. package/backend/dist/routes/browser-proxy.d.ts +31 -0
  19. package/backend/dist/routes/browser-proxy.d.ts.map +1 -0
  20. package/backend/dist/routes/browser-proxy.js +363 -0
  21. package/backend/dist/routes/browser-proxy.js.map +1 -0
  22. package/frontend/dist/assets/{ChatOverlay-CGyDxUxJ.js → ChatOverlay-W-pSFHsV.js} +1 -1
  23. package/frontend/dist/assets/{GraphPreview-B9kooQxE.js → GraphPreview-CcuxUzQH.js} +1 -1
  24. package/frontend/dist/assets/{MobilePage-3uMLckd9.js → MobilePage-DEBO3i1o.js} +3 -3
  25. package/frontend/dist/assets/{OfficePreview-l1O2K0sM.js → OfficePreview-DY-ew_ex.js} +2 -2
  26. package/frontend/dist/assets/{PdfPreview-fZPK_FeM.js → PdfPreview-Bl0MS_5m.js} +1 -1
  27. package/frontend/dist/assets/{ProjectPage-CBFQ2TQC.js → ProjectPage-tcwSSEFX.js} +5 -5
  28. package/frontend/dist/assets/SettingsPage-DU649aEa.js +13 -0
  29. package/frontend/dist/assets/{SkillHubPage-DfsO4OIa.js → SkillHubPage-hH5XcB57.js} +2 -2
  30. package/frontend/dist/assets/{chevron-down-C53vkdK1.js → chevron-down-B3q2CU-d.js} +1 -1
  31. package/frontend/dist/assets/{index-BbEFdJn-.js → index-CZOz50el.js} +1 -1
  32. package/frontend/dist/assets/{index-3NT40D4Y.js → index-DsYny3RQ.js} +1 -1
  33. package/frontend/dist/assets/{index-BnxUVJSG.js → index-nYsy3LMF.js} +3 -3
  34. package/frontend/dist/assets/{jszip.min-D5b8OJpG.js → jszip.min-9o6zKk8v.js} +1 -1
  35. package/frontend/dist/assets/{search-F_MnOHbB.js → search-B9B3Cq4V.js} +1 -1
  36. package/frontend/dist/assets/select-BOLkADQv.js +13 -0
  37. package/frontend/dist/index.html +1 -1
  38. package/package.json +1 -1
  39. package/frontend/dist/assets/SettingsPage-BZ3vBlYj.js +0 -13
  40. package/frontend/dist/assets/select-MFyjPNJE.js +0 -13
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A self-hosted web application (distributed as npm package) that provides a browser-based interface for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI sessions. Create projects, each with a persistent terminal running Claude Code, and interact with them through a real-time terminal UI.
4
4
 
5
- **Current version**: v2026.5.20-a | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
5
+ **Current version**: v2026.5.24-a | [GitHub](https://github.com/zbc0315/cc-web) | MIT License
6
6
 
7
7
  ## Features
8
8
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser-proxy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-proxy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/browser-proxy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const vitest_1 = require("vitest");
40
+ const express_1 = __importDefault(require("express"));
41
+ const http = __importStar(require("http"));
42
+ const jwt = __importStar(require("jsonwebtoken"));
43
+ const browser_proxy_1 = __importStar(require("../routes/browser-proxy"));
44
+ const config_1 = require("../config");
45
+ // Mint a valid browser-proxy session cookie using the real jwt secret —
46
+ // the test machine has a config.json so getConfig() works. CI without
47
+ // config would skip these e2e tests.
48
+ function mintProxyCookie() {
49
+ const config = (0, config_1.getConfig)();
50
+ const token = jwt.sign({ username: 'test', typ: 'browser-proxy' }, config.jwtSecret, { expiresIn: '1h' });
51
+ return `ccweb_bp=${encodeURIComponent(token)}`;
52
+ }
53
+ (0, vitest_1.describe)('parseHostport', () => {
54
+ (0, vitest_1.it)('接受 host:port (http only)', () => {
55
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:8080')).toEqual({ host: '127.0.0.1', port: 8080 });
56
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('localhost:3000')).toEqual({ host: 'localhost', port: 3000 });
57
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('192.168.50.247:5173')).toEqual({ host: '192.168.50.247', port: 5173 });
58
+ });
59
+ (0, vitest_1.it)('拒绝 s: 前缀 (v0 仅 http)', () => {
60
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('s:127.0.0.1:8443')).toBeNull();
61
+ });
62
+ (0, vitest_1.it)('拒绝缺端口 / 非法端口 / 黑名单端口', () => {
63
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1')).toBeNull();
64
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:')).toBeNull();
65
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:0')).toBeNull();
66
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:99999')).toBeNull();
67
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:22')).toBeNull();
68
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:3389')).toBeNull();
69
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('127.0.0.1:6379')).toBeNull();
70
+ });
71
+ (0, vitest_1.it)('拒绝非法字符 (IPv6 brackets / 空格 / @ )', () => {
72
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('[::1]:8080')).toBeNull();
73
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('user@host:8080')).toBeNull();
74
+ (0, vitest_1.expect)((0, browser_proxy_1.parseHostport)('host with space:8080')).toBeNull();
75
+ });
76
+ });
77
+ (0, vitest_1.describe)('isAllowedProxyIp', () => {
78
+ (0, vitest_1.it)('IPv4 字面量 RFC1918 / loopback 放行', () => {
79
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('127.0.0.1')).toBe(true);
80
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('127.5.5.5')).toBe(true);
81
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('0.0.0.0')).toBe(true);
82
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('10.0.0.5')).toBe(true);
83
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('192.168.1.1')).toBe(true);
84
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('172.16.5.5')).toBe(true);
85
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('172.31.255.255')).toBe(true);
86
+ });
87
+ (0, vitest_1.it)('IPv4 公网 IP 拒绝', () => {
88
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('1.1.1.1')).toBe(false);
89
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('8.8.8.8')).toBe(false);
90
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('172.32.0.1')).toBe(false);
91
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('172.15.0.1')).toBe(false);
92
+ });
93
+ (0, vitest_1.it)('Cloud metadata IP 拒绝(即便是 link-local 段)', () => {
94
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('169.254.169.254')).toBe(false);
95
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('169.254.170.2')).toBe(false);
96
+ });
97
+ (0, vitest_1.it)('IPv4-mapped IPv6 不能绕过', () => {
98
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('::ffff:8.8.8.8')).toBe(false);
99
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('::ffff:127.0.0.1')).toBe(true);
100
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('::ffff:169.254.169.254')).toBe(false);
101
+ });
102
+ (0, vitest_1.it)('IPv6 ULA / loopback 放行', () => {
103
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('::1')).toBe(true);
104
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('fc00::1')).toBe(true);
105
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('fd00::1')).toBe(true);
106
+ });
107
+ (0, vitest_1.it)('Hostname 字符串不当 IP 判断(防 10.evil.com 绕过)', () => {
108
+ // Pure-string hostnames must be rejected here; allowance only happens
109
+ // after DNS resolution in resolveAllowedTarget.
110
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('10.evil.com')).toBe(false);
111
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('192.168.evil.com')).toBe(false);
112
+ (0, vitest_1.expect)((0, browser_proxy_1.isAllowedProxyIp)('fc.evil.com')).toBe(false);
113
+ });
114
+ });
115
+ (0, vitest_1.describe)('resolveAllowedTarget', () => {
116
+ (0, vitest_1.it)('字面量 IP 放行返回原 IP', async () => {
117
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('127.0.0.1')).toBe('127.0.0.1');
118
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('192.168.1.1')).toBe('192.168.1.1');
119
+ });
120
+ (0, vitest_1.it)('字面量公网 IP 返回 null', async () => {
121
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('1.1.1.1')).toBeNull();
122
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('8.8.8.8')).toBeNull();
123
+ });
124
+ (0, vitest_1.it)('localhost 直接映射 127.0.0.1', async () => {
125
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('localhost')).toBe('127.0.0.1');
126
+ });
127
+ (0, vitest_1.it)('cloud metadata hostname 字面拒绝', async () => {
128
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('metadata.google.internal')).toBeNull();
129
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('metadata')).toBeNull();
130
+ });
131
+ (0, vitest_1.it)('cloud metadata IP 拒绝', async () => {
132
+ (0, vitest_1.expect)(await (0, browser_proxy_1.resolveAllowedTarget)('169.254.169.254')).toBeNull();
133
+ });
134
+ });
135
+ (0, vitest_1.describe)('rewriteHtml', () => {
136
+ const prefix = '/api/browser-proxy/127.0.0.1:8080';
137
+ (0, vitest_1.it)('重写 src/href/action 的 root-absolute path', () => {
138
+ const input = '<script src="/main.js"></script><a href="/about">x</a><form action="/login">';
139
+ const out = (0, browser_proxy_1.rewriteHtml)(input, prefix);
140
+ (0, vitest_1.expect)(out).toContain('src="/api/browser-proxy/127.0.0.1:8080/main.js"');
141
+ (0, vitest_1.expect)(out).toContain('href="/api/browser-proxy/127.0.0.1:8080/about"');
142
+ (0, vitest_1.expect)(out).toContain('action="/api/browser-proxy/127.0.0.1:8080/login"');
143
+ });
144
+ (0, vitest_1.it)('strip 上游 <base href> 避免覆盖代理路径', () => {
145
+ const input = '<head><base href="/"><base href="https://other.example/"></head><body></body>';
146
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteHtml)(input, prefix)).toBe('<head></head><body></body>');
147
+ });
148
+ (0, vitest_1.it)('protocol-relative (//) 不改', () => {
149
+ const input = '<img src="//cdn.example.com/x.png">';
150
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteHtml)(input, prefix)).toBe(input);
151
+ });
152
+ (0, vitest_1.it)('相对路径不改', () => {
153
+ const input = '<img src="foo/bar.png"><a href="../other">x</a>';
154
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteHtml)(input, prefix)).toBe(input);
155
+ });
156
+ (0, vitest_1.it)('绝对 URL 不改', () => {
157
+ const input = '<a href="https://example.com/path">x</a>';
158
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteHtml)(input, prefix)).toBe(input);
159
+ });
160
+ (0, vitest_1.it)('单引号 attribute 也支持', () => {
161
+ const input = "<a href='/foo'>";
162
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteHtml)(input, prefix)).toContain("href='/api/browser-proxy/127.0.0.1:8080/foo'");
163
+ });
164
+ });
165
+ (0, vitest_1.describe)('rewriteLocationHeader', () => {
166
+ const parsed = { host: '127.0.0.1', port: 8080 };
167
+ const prefix = '/api/browser-proxy/127.0.0.1:8080';
168
+ (0, vitest_1.it)('absolute redirect 同 scheme/host/port → 重写为 proxy URL', () => {
169
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('http://127.0.0.1:8080/new-path?x=1', parsed, prefix))
170
+ .toBe('/api/browser-proxy/127.0.0.1:8080/new-path?x=1');
171
+ });
172
+ (0, vitest_1.it)('absolute redirect 不同 scheme → 原样保留(防协议混淆)', () => {
173
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('https://127.0.0.1:8080/foo', parsed, prefix))
174
+ .toBe('https://127.0.0.1:8080/foo');
175
+ });
176
+ (0, vitest_1.it)('absolute redirect 不同 host → 原样保留', () => {
177
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('http://other.example/foo', parsed, prefix))
178
+ .toBe('http://other.example/foo');
179
+ });
180
+ (0, vitest_1.it)('root-relative redirect → 加前缀', () => {
181
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('/foo?x=1', parsed, prefix))
182
+ .toBe('/api/browser-proxy/127.0.0.1:8080/foo?x=1');
183
+ });
184
+ (0, vitest_1.it)('protocol-relative (//) → 不改', () => {
185
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('//cdn.example/x', parsed, prefix))
186
+ .toBe('//cdn.example/x');
187
+ });
188
+ (0, vitest_1.it)('纯相对路径 → 不改', () => {
189
+ (0, vitest_1.expect)((0, browser_proxy_1.rewriteLocationHeader)('foo/bar', parsed, prefix))
190
+ .toBe('foo/bar');
191
+ });
192
+ });
193
+ (0, vitest_1.describe)('e2e: browser-proxy router 跑通本地 dummy server', () => {
194
+ let upstream;
195
+ let upstreamPort = 0;
196
+ let proxy;
197
+ let proxyPort = 0;
198
+ (0, vitest_1.beforeAll)(async () => {
199
+ upstream = http.createServer((req, res) => {
200
+ if (req.url === '/index.html') {
201
+ res.writeHead(200, {
202
+ 'Content-Type': 'text/html; charset=utf-8',
203
+ 'X-Frame-Options': 'DENY',
204
+ 'Content-Security-Policy': "frame-ancestors 'none'",
205
+ 'Clear-Site-Data': '"cookies"',
206
+ });
207
+ res.end('<!doctype html><base href="/"><body><a href="/about">x</a><script src="/m.js"></script></body>');
208
+ }
209
+ else if (req.url === '/m.js') {
210
+ res.writeHead(200, { 'Content-Type': 'application/javascript' });
211
+ res.end('console.log(1);');
212
+ }
213
+ else if (req.url === '/redir') {
214
+ res.writeHead(302, { 'Location': '/landed' });
215
+ res.end();
216
+ }
217
+ else {
218
+ res.writeHead(404);
219
+ res.end('nope');
220
+ }
221
+ });
222
+ await new Promise((resolve) => upstream.listen(0, '127.0.0.1', resolve));
223
+ upstreamPort = upstream.address().port;
224
+ const app = (0, express_1.default)();
225
+ // Router handles its own auth (cookie-only); no middleware needed.
226
+ app.use('/api/browser-proxy', browser_proxy_1.default);
227
+ proxy = http.createServer(app);
228
+ await new Promise((resolve) => proxy.listen(0, '127.0.0.1', resolve));
229
+ proxyPort = proxy.address().port;
230
+ });
231
+ (0, vitest_1.afterAll)(async () => {
232
+ await new Promise((resolve) => upstream.close(() => resolve()));
233
+ await new Promise((resolve) => proxy.close(() => resolve()));
234
+ });
235
+ const withCookie = (path, init) => fetch(`http://127.0.0.1:${proxyPort}${path}`, { ...(init ?? {}), headers: { ...(init?.headers ?? {}), Cookie: mintProxyCookie() } });
236
+ (0, vitest_1.it)('无 cookie → 403 (session required)', async () => {
237
+ const r = await fetch(`http://127.0.0.1:${proxyPort}/api/browser-proxy/127.0.0.1:${upstreamPort}/index.html`);
238
+ (0, vitest_1.expect)(r.status).toBe(403);
239
+ });
240
+ (0, vitest_1.it)('伪造的 cookie (错 typ 或错 secret) → 403', async () => {
241
+ const config = (0, config_1.getConfig)();
242
+ const wrongTyp = jwt.sign({ username: 'x', typ: 'user' }, config.jwtSecret, { expiresIn: '1h' });
243
+ const r1 = await fetch(`http://127.0.0.1:${proxyPort}/api/browser-proxy/127.0.0.1:${upstreamPort}/index.html`, {
244
+ headers: { Cookie: `ccweb_bp=${encodeURIComponent(wrongTyp)}` },
245
+ });
246
+ (0, vitest_1.expect)(r1.status).toBe(403);
247
+ const wrongSecret = jwt.sign({ username: 'x', typ: 'browser-proxy' }, 'not-the-secret', { expiresIn: '1h' });
248
+ const r2 = await fetch(`http://127.0.0.1:${proxyPort}/api/browser-proxy/127.0.0.1:${upstreamPort}/index.html`, {
249
+ headers: { Cookie: `ccweb_bp=${encodeURIComponent(wrongSecret)}` },
250
+ });
251
+ (0, vitest_1.expect)(r2.status).toBe(403);
252
+ });
253
+ (0, vitest_1.it)('代理 HTML:strip X-Frame / CSP / Clear-Site-Data + rewrite path + 注入 CSP sandbox', async () => {
254
+ const r = await withCookie(`/api/browser-proxy/127.0.0.1:${upstreamPort}/index.html`);
255
+ (0, vitest_1.expect)(r.status).toBe(200);
256
+ (0, vitest_1.expect)(r.headers.get('x-frame-options')).toBeNull();
257
+ (0, vitest_1.expect)(r.headers.get('content-security-policy')).toContain('sandbox');
258
+ (0, vitest_1.expect)(r.headers.get('content-security-policy')).not.toContain('allow-same-origin');
259
+ (0, vitest_1.expect)(r.headers.get('content-security-policy')).not.toContain('allow-popups-to-escape-sandbox');
260
+ (0, vitest_1.expect)(r.headers.get('clear-site-data')).toBeNull();
261
+ const body = await r.text();
262
+ (0, vitest_1.expect)(body).toContain(`href="/api/browser-proxy/127.0.0.1:${upstreamPort}/about"`);
263
+ (0, vitest_1.expect)(body).toContain(`src="/api/browser-proxy/127.0.0.1:${upstreamPort}/m.js"`);
264
+ (0, vitest_1.expect)(body).not.toContain('<base');
265
+ });
266
+ (0, vitest_1.it)('代理 JS:原样透传不重写', async () => {
267
+ const r = await withCookie(`/api/browser-proxy/127.0.0.1:${upstreamPort}/m.js`);
268
+ (0, vitest_1.expect)(r.status).toBe(200);
269
+ (0, vitest_1.expect)(await r.text()).toBe('console.log(1);');
270
+ });
271
+ (0, vitest_1.it)('代理 redirect:root-relative Location 加前缀', async () => {
272
+ const r = await withCookie(`/api/browser-proxy/127.0.0.1:${upstreamPort}/redir`, { redirect: 'manual' });
273
+ (0, vitest_1.expect)(r.status).toBe(302);
274
+ (0, vitest_1.expect)(r.headers.get('location')).toBe(`/api/browser-proxy/127.0.0.1:${upstreamPort}/landed`);
275
+ });
276
+ (0, vitest_1.it)('拒绝公网字面量 IP (403)', async () => {
277
+ const r = await withCookie('/api/browser-proxy/1.1.1.1:80/');
278
+ (0, vitest_1.expect)(r.status).toBe(403);
279
+ });
280
+ (0, vitest_1.it)('拒绝 cloud metadata IP (403)', async () => {
281
+ const r = await withCookie('/api/browser-proxy/169.254.169.254:80/');
282
+ (0, vitest_1.expect)(r.status).toBe(403);
283
+ });
284
+ (0, vitest_1.it)('拒绝非法 hostport (400)', async () => {
285
+ const r = await withCookie('/api/browser-proxy/not-a-host');
286
+ (0, vitest_1.expect)(r.status).toBe(400);
287
+ });
288
+ (0, vitest_1.it)('拒绝黑名单端口 (400)', async () => {
289
+ const r = await withCookie('/api/browser-proxy/127.0.0.1:22/');
290
+ (0, vitest_1.expect)(r.status).toBe(400);
291
+ });
292
+ (0, vitest_1.it)('_session 无 Bearer token → 401', async () => {
293
+ const r = await fetch(`http://127.0.0.1:${proxyPort}/api/browser-proxy/_session`, { method: 'POST' });
294
+ (0, vitest_1.expect)(r.status).toBe(401);
295
+ });
296
+ (0, vitest_1.it)('_session 非 admin Bearer → 403', async () => {
297
+ const config = (0, config_1.getConfig)();
298
+ const userToken = jwt.sign({ username: 'definitely-not-admin', typ: 'user' }, config.jwtSecret, { expiresIn: '1h' });
299
+ const r = await fetch(`http://127.0.0.1:${proxyPort}/api/browser-proxy/_session`, {
300
+ method: 'POST',
301
+ headers: { Authorization: `Bearer ${userToken}` },
302
+ });
303
+ (0, vitest_1.expect)(r.status).toBe(403);
304
+ });
305
+ });
306
+ //# sourceMappingURL=browser-proxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-proxy.test.js","sourceRoot":"","sources":["../../src/__tests__/browser-proxy.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAmE;AACnE,sDAA8B;AAC9B,2CAA6B;AAC7B,kDAAoC;AAEpC,yEAMiC;AACjC,sCAAsC;AAEtC,wEAAwE;AACxE,sEAAsE;AACtE,qCAAqC;AACrC,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1G,OAAO,YAAY,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,IAAA,iBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,6BAAa,EAAC,sBAAsB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,eAAe,EAAE,GAAG,EAAE;QACvB,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,sEAAsE;QACtE,gDAAgD;QAChD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,IAAA,eAAM,EAAC,IAAA,gCAAgB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,WAAE,EAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzD,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1E,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,IAAA,eAAM,EAAC,MAAM,IAAA,oCAAoB,EAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,MAAM,GAAG,mCAAmC,CAAC;IAEnD,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,8EAA8E,CAAC;QAC7F,MAAM,GAAG,GAAG,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QACzE,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG,+EAA+E,CAAC;QAC9F,IAAA,eAAM,EAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,KAAK,GAAG,qCAAqC,CAAC;QACpD,IAAA,eAAM,EAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,QAAQ,EAAE,GAAG,EAAE;QAChB,MAAM,KAAK,GAAG,iDAAiD,CAAC;QAChE,IAAA,eAAM,EAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,WAAW,EAAE,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,0CAA0C,CAAC;QACzD,IAAA,eAAM,EAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAChC,IAAA,eAAM,EAAC,IAAA,2BAAW,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,mCAAmC,CAAC;IAEnD,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,oCAAoC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aAChF,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,4BAA4B,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aACxE,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,0BAA0B,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aACtE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aACtD,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aAC7D,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,YAAY,EAAE,GAAG,EAAE;QACpB,IAAA,eAAM,EAAC,IAAA,qCAAqB,EAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;aACrD,IAAI,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,6CAA6C,EAAE,GAAG,EAAE;IAC3D,IAAI,QAAqB,CAAC;IAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,KAAkB,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAA,kBAAS,EAAC,KAAK,IAAI,EAAE;QACnB,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxC,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,cAAc,EAAE,0BAA0B;oBAC1C,iBAAiB,EAAE,MAAM;oBACzB,yBAAyB,EAAE,wBAAwB;oBACnD,iBAAiB,EAAE,WAAW;iBAC/B,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,gGAAgG,CAAC,CAAC;YAC5G,CAAC;iBAAM,IAAI,GAAG,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,wBAAwB,EAAE,CAAC,CAAC;gBACjE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC7B,CAAC;iBAAM,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAChC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,YAAY,GAAI,QAAQ,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;QAExD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;QACtB,mEAAmE;QACnE,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,uBAAkB,CAAC,CAAC;QAClD,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5E,SAAS,GAAI,KAAK,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAkB,EAAE,EAAE,CAAC,KAAK,CAC5D,oBAAoB,SAAS,GAAG,IAAI,EAAE,EACtC,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,EAAE,CACtF,CAAC;IAEF,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,oBAAoB,SAAS,gCAAgC,YAAY,aAAa,CAAC,CAAC;QAC9G,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjG,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,oBAAoB,SAAS,gCAAgC,YAAY,aAAa,EAAE;YAC7G,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;SAChE,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5B,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7G,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,oBAAoB,SAAS,gCAAgC,YAAY,aAAa,EAAE;YAC7G,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE;SACnE,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,gCAAgC,YAAY,aAAa,CAAC,CAAC;QACtF,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtE,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACpF,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACjG,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sCAAsC,YAAY,SAAS,CAAC,CAAC;QACpF,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qCAAqC,YAAY,QAAQ,CAAC,CAAC;QAClF,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,gCAAgC,YAAY,OAAO,CAAC,CAAC;QAChF,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,gCAAgC,YAAY,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzG,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAA,eAAM,EAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,YAAY,SAAS,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAChC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,gCAAgC,CAAC,CAAC;QAC7D,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,wCAAwC,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,+BAA+B,CAAC,CAAC;QAC5D,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,eAAe,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC,kCAAkC,CAAC,CAAC;QAC/D,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,oBAAoB,SAAS,6BAA6B,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtG,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,oBAAoB,SAAS,6BAA6B,EAAE;YAChF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,SAAS,EAAE,EAAE;SAClD,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -85,6 +85,37 @@ const FULL_MENU = [
85
85
  (0, vitest_1.expect)(detected[0].options).toHaveLength(3);
86
86
  }
87
87
  });
88
+ (0, vitest_1.it)('v-20-b 根因:Ink TUI 用 CHA `\\x1b[<n>G` 替代字面空格,正确还原', () => {
89
+ const { events } = collect();
90
+ // Real Ink TUI output captured from Claude CLI 2.1.144 PTY (see investigation notes).
91
+ // 每个单词间用 CHA 序列定位列号,没有任何字面空格字符 —— 旧 stripAnsi 会得到
92
+ // "Resumefromsummary" 永远匹配不到 fingerprint。
93
+ const inkReal = '\x1b[3G\x1b[38;2;87;105;247m❯\x1b[5G\x1b[38;2;102;102;102m1.\x1b[8G' +
94
+ '\x1b[38;2;87;105;247mResume\x1b[15Gfrom\x1b[20Gsummary\x1b[28G(recommended)\x1b[39m\r\r\n' +
95
+ '\x1b[5G\x1b[38;2;102;102;102m2.\x1b[8G\x1b[39mResume\x1b[15Gfull\x1b[20Gsession\x1b[28Gas-is\r\r\n' +
96
+ "\x1b[5G\x1b[38;2;102;102;102m3.\x1b[8G\x1b[39mDon't\x1b[14Gask\x1b[18Gme\x1b[21Gagain\r\r\n";
97
+ cli_prompt_detector_1.cliPromptDetector.feed('p_ink', inkReal);
98
+ const detected = events.filter((e) => e.projectId === 'p_ink' && e.type === 'cli_prompt_detected');
99
+ (0, vitest_1.expect)(detected).toHaveLength(1);
100
+ if (detected[0]?.type === 'cli_prompt_detected') {
101
+ (0, vitest_1.expect)(detected[0].options).toEqual([
102
+ { digit: 1, label: 'Resume from summary', recommended: true },
103
+ { digit: 2, label: 'Resume full session as-is', recommended: false },
104
+ { digit: 3, label: "Don't ask me again", recommended: false },
105
+ ]);
106
+ }
107
+ cli_prompt_detector_1.cliPromptDetector.reset('p_ink');
108
+ });
109
+ (0, vitest_1.it)('CUF `\\x1b[<n>C` 替换为 n 个空格', () => {
110
+ const { events } = collect();
111
+ // Hypothetical CLI using CUF instead of CHA to advance the cursor.
112
+ // The detector should still see well-spaced text after strip.
113
+ const cuf = "Resume\x1b[1Cfrom\x1b[1Csummary\nResume\x1b[1Cfull\x1b[1Csession\n 1. Resume from summary\n 2. Resume full session\n 3. Don't ask me again";
114
+ cli_prompt_detector_1.cliPromptDetector.feed('p_cuf', cuf);
115
+ const detected = events.filter((e) => e.projectId === 'p_cuf' && e.type === 'cli_prompt_detected');
116
+ (0, vitest_1.expect)(detected.length).toBeGreaterThanOrEqual(1);
117
+ cli_prompt_detector_1.cliPromptDetector.reset('p_cuf');
118
+ });
88
119
  (0, vitest_1.it)('已 detected 状态下 options 未变 → 不重复 emit(debounced)', () => {
89
120
  const { events } = collect();
90
121
  cli_prompt_detector_1.cliPromptDetector.feed('p_idem', FULL_MENU);
@@ -1 +1 @@
1
- {"version":3,"file":"cli-prompt-detector.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-prompt-detector.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-prompt-detector.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-prompt-detector.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-prompt-detector.d.ts","sourceRoot":"","sources":["../src/cli-prompt-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAC;CACtB;AAqCD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CAmB9D;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAOD,cAAM,iBAAkB,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAE1D;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAmE1C,6EAA6E;IAC7E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAY9B;;;;;OAKG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIhD,OAAO,CAAC,gBAAgB;CAMzB;AAYD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
1
+ {"version":3,"file":"cli-prompt-detector.d.ts","sourceRoot":"","sources":["../src/cli-prompt-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,2DAA2D;AAC3D,MAAM,MAAM,cAAc,GACtB;IACE,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;CACrB,CAAC;AAEN,MAAM,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,WAAW,EAAE,OAAO,CAAC;CACtB;AAwDD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE,CAmB9D;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAOD,cAAM,iBAAkB,SAAQ,YAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAE1D;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAmE1C,6EAA6E;IAC7E,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAY9B;;;;;OAKG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAIhD,OAAO,CAAC,gBAAgB;CAMzB;AAYD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
@@ -48,13 +48,32 @@ const FINGERPRINTS = [
48
48
  },
49
49
  ];
50
50
  /**
51
- * Strip ANSI CSI sequences (\x1b[...m / \x1b[...K / \x1b[...A / etc.)
52
- * Doesn't try to interpret cursor movement — Ink redraws the whole menu
53
- * every keystroke so the latest text always lands in the buffer anyway.
51
+ * Strip ANSI CSI sequences down to plain text that fingerprint phrases can be
52
+ * matched against.
53
+ *
54
+ * v-20-b root-cause fix: Ink TUI (used by Claude CLI) lays out text via
55
+ * column-positioning escapes (CHA = `\x1b[<n>G`, CUF = `\x1b[<n>C`) instead of
56
+ * literal whitespace, so "Resume from summary" arrives on the PTY as
57
+ * `Resume\x1b[15Gfrom\x1b[20Gsummary`. The previous strip dropped CHA/CUF
58
+ * outright, collapsing the line to "Resumefromsummary" and making the
59
+ * fingerprint phrases impossible to match. We now replace those two cursor-
60
+ * advance escapes with a single space — that's enough whitespace for fingerprint
61
+ * phrases and the digit-label option regex to find their normal-looking text,
62
+ * without trying to reconstruct exact column alignment (which we don't need).
63
+ *
64
+ * Order matters: CHA / CUF must be handled BEFORE the generic CSI sweep,
65
+ * otherwise the generic regex eats them first and the replacement never runs.
54
66
  */
55
67
  function stripAnsi(s) {
56
68
  // eslint-disable-next-line no-control-regex
57
- return s.replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, '').replace(/\x1b\][^\x07]*\x07/g, '');
69
+ return s
70
+ .replace(/\x1b\[\d*G/g, ' ')
71
+ .replace(/\x1b\[(\d*)C/g, (_m, n) => {
72
+ const count = Number(n || 1);
73
+ return ' '.repeat(Number.isFinite(count) && count > 0 && count <= 200 ? count : 1);
74
+ })
75
+ .replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g, '')
76
+ .replace(/\x1b\][^\x07]*\x07/g, '');
58
77
  }
59
78
  /**
60
79
  * Parse menu options out of the ANSI-stripped buffer.
@@ -1 +1 @@
1
- {"version":3,"file":"cli-prompt-detector.js","sourceRoot":"","sources":["../src/cli-prompt-detector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-prompt-detector.js","sourceRoot":"","sources":["../src/cli-prompt-detector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuFA,QAAA,MAAM,GAAG,6CAAY,CAAC;AAw0BtB,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwFA,QAAA,MAAM,GAAG,6CAAY,CAAC;AA40BtB,eAAe,GAAG,CAAC"}
@@ -81,6 +81,7 @@ const plugin_manager_1 = require("./plugin-manager");
81
81
  const plugins_1 = __importDefault(require("./routes/plugins"));
82
82
  const plugin_bridge_1 = __importDefault(require("./routes/plugin-bridge"));
83
83
  const sync_1 = __importDefault(require("./routes/sync"));
84
+ const browser_proxy_1 = __importDefault(require("./routes/browser-proxy"));
84
85
  const sync_scheduler_1 = require("./sync-scheduler");
85
86
  const chat_backup_1 = require("./chat-backup");
86
87
  const sync_service_1 = require("./sync-service");
@@ -224,6 +225,10 @@ app.use('/api/tool', auth_1.authMiddleware, claude_1.default);
224
225
  app.use('/api/plugins', auth_1.authMiddleware, plugins_1.default);
225
226
  app.use('/api/plugin-bridge', auth_1.authMiddleware, plugin_bridge_1.default);
226
227
  app.use('/api/sync', auth_1.authMiddleware, sync_1.default);
228
+ // NOT wrapped in authMiddleware — browser-proxy.ts handles its own
229
+ // auth (explicit Bearer admin for /_session, cookie for proxy GETs) so
230
+ // localhost auto-auth cannot blind-trigger SSRF via CSRF.
231
+ app.use('/api/browser-proxy', browser_proxy_1.default);
227
232
  // Serve plugin SDK: /plugin-sdk/ccweb-plugin-sdk.js
228
233
  app.use('/plugin-sdk', express_1.default.static(path.join(__dirname, '../../plugin-sdk')));
229
234
  // Serve plugin frontend files: /plugins/:id/* → ~/.ccweb/plugins/:id/frontend/*