@jonathanleelx/meddle 0.5.0-beta.24 → 0.5.0-beta.26

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 (39) hide show
  1. package/README.md +1 -1
  2. package/bin/commands/route/add.js +98 -86
  3. package/bin/commands/route/delete.js +48 -25
  4. package/bin/commands/route/index.js +16 -2
  5. package/bin/commands/route/update.js +118 -87
  6. package/bin/index.js +7 -3
  7. package/bin/lib/output.js +4 -2
  8. package/bin/lib/route-write-args.js +150 -0
  9. package/dist/core/browser.d.ts +8 -1
  10. package/dist/core/browser.d.ts.map +1 -1
  11. package/dist/core/browser.js +239 -36
  12. package/dist/core/browser.js.map +1 -1
  13. package/dist/server/agent/tools.d.ts.map +1 -1
  14. package/dist/server/agent/tools.js +2 -1
  15. package/dist/server/agent/tools.js.map +1 -1
  16. package/index.js +3 -2
  17. package/package.json +1 -1
  18. package/web/dist/assets/{detail-panel-D56nCma2.js → detail-panel-CyOc7gn8.js} +1 -1
  19. package/web/dist/assets/{global-panel-shell-SKPshqTf.js → global-panel-shell-jXQTb9nw.js} +1 -1
  20. package/web/dist/assets/{health-panel-CvI-VsvG.js → health-panel-CSV7OqBv.js} +1 -1
  21. package/web/dist/assets/{index-Dcm171u1.js → index-CSXxaYkG.js} +2 -2
  22. package/web/dist/assets/{mobile-proxy-panel-cpkvsdBT.js → mobile-proxy-panel-a09S-R79.js} +1 -1
  23. package/web/dist/assets/{mock-config-CtZ866iI.js → mock-config-D_E5YOE_.js} +1 -1
  24. package/web/dist/assets/{mock-editor-panel-CweYBdeM.js → mock-editor-panel-t4TDXeaR.js} +1 -1
  25. package/web/dist/assets/{mocks-file-missing-note-C-QJ8Bpm.js → mocks-file-missing-note-Ddy1TdMX.js} +1 -1
  26. package/web/dist/assets/{monaco-editor-Cge8h-Ca.js → monaco-editor-GpPLOKA5.js} +1 -1
  27. package/web/dist/assets/{pane-bar-Dvi-MHuB.js → pane-bar-zJmE3xI5.js} +1 -1
  28. package/web/dist/assets/{pane-split-ChCHxR7K.js → pane-split-CJ1VXJDy.js} +1 -1
  29. package/web/dist/assets/{panel-heading-Crmy9fo0.js → panel-heading-DlFWoYAR.js} +1 -1
  30. package/web/dist/assets/{plugin-code-editor-VaL2lVyD.js → plugin-code-editor-CtaamKWJ.js} +1 -1
  31. package/web/dist/assets/{plugin-config-DSiOk77l.js → plugin-config-Dg_FCb-L.js} +2 -2
  32. package/web/dist/assets/{plugin-generator-iAksMY2Q.js → plugin-generator-CVREuZs7.js} +1 -1
  33. package/web/dist/assets/{plugin-test-dialog-Cx6ifDnm.js → plugin-test-dialog-B-iV8ocm.js} +1 -1
  34. package/web/dist/assets/{route-preview-T0s6si4V.js → route-preview-CLJeg_9v.js} +1 -1
  35. package/web/dist/assets/{rule-ai-assistant-panel-DzfobTWM.js → rule-ai-assistant-panel-BvTqm4zV.js} +1 -1
  36. package/web/dist/assets/{rule-config-ESpfkJg6.js → rule-config-DmNPaKxc.js} +1 -1
  37. package/web/dist/assets/{rule-overview-panel-BswSByar.js → rule-overview-panel-CB9b-b0t.js} +1 -1
  38. package/web/dist/assets/{settings-panel-Cj-1Z8Ow.js → settings-panel-DLdeJ8ox.js} +1 -1
  39. package/web/dist/index.html +1 -1
package/bin/index.js CHANGED
@@ -59,7 +59,7 @@ if (command === 'mock' || command === 'route' || command === 'session') {
59
59
  // No command or only flags - start proxy (default behavior)
60
60
  require('../index.js')
61
61
  } else {
62
- console.log(`Unknown command: ${command}`)
62
+ console.error(`Unknown command: ${command}`)
63
63
  showHelp()
64
64
  process.exit(1)
65
65
  }
@@ -106,8 +106,10 @@ Route 命令:
106
106
  meddle route active 查看当前激活的路由文件
107
107
  meddle route active set <file> 设置激活的路由文件
108
108
  meddle route create <name> 创建路由文件
109
- meddle route add <file> <pattern> <target> 添加路由规则
110
- meddle route update <file> <pattern> <target> 更新路由规则
109
+ meddle route add <file> <pattern> <target> [--exclusions=]
110
+ 添加路由规则;--exclusions= 清空排除项
111
+ meddle route update <file> <pattern> [<target>] [--exclusions=]
112
+ 更新路由规则;--exclusions= 清空排除项
111
113
  meddle route delete <file> <pattern> 删除路由规则
112
114
 
113
115
  全局选项:
@@ -137,6 +139,8 @@ Route 命令:
137
139
  meddle route preview "https://api.example.com/v1/users" # 预览转发目标
138
140
  meddle route preview "https://cdn.com/assets/js/app.js" --file dev-rules --json
139
141
  meddle route add dev-rules "api.test.com" "localhost:3000"
142
+ meddle route add dev-rules "api.test.com" "localhost:3000" --exclusions=
143
+ meddle route update dev-rules "api.test.com" --exclusions=
140
144
  meddle route active set beta-rules
141
145
 
142
146
  更多信息请访问: https://github.com/JonathanLee-LX/meddle
package/bin/lib/output.js CHANGED
@@ -51,11 +51,13 @@ function success(message) {
51
51
  }
52
52
 
53
53
  /**
54
- * Print error message
54
+ * Print a command failure. Human-readable text goes to stderr so stdout stays
55
+ * empty on error. In --json mode this is a no-op; the caller prints the
56
+ * `{ success: false }` object on stdout.
55
57
  */
56
58
  function error(message) {
57
59
  if (jsonMode) return
58
- console.log(chalk.red(' ✗'), message)
60
+ console.error(chalk.red(' ✗'), message)
59
61
  }
60
62
 
61
63
  /**
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Argument parsing for `meddle route add|update|delete` (issue #149).
3
+ *
4
+ * `--exclusions=` clears a rule's exclusions. `--exclusions=/a,/b` replaces
5
+ * them. A bare `--exclusions`, an unknown flag, or an empty `!` token used to
6
+ * be ignored and the command still exited 0 without changing exclusions.
7
+ */
8
+
9
+ const { splitPatternArg } = require('./rule-file-edit')
10
+
11
+ class RouteArgError extends Error {
12
+ constructor(message) {
13
+ super(message)
14
+ this.name = 'RouteArgError'
15
+ }
16
+ }
17
+
18
+ const CLEAR_HINT = 'To clear exclusions, pass --exclusions= (empty). To replace them, pass --exclusions=/a,/b.'
19
+
20
+ /**
21
+ * @param {string} raw value after `=`
22
+ * @returns {string[]}
23
+ */
24
+ function parseExclusionList(raw) {
25
+ const value = String(raw).trim()
26
+ if (value === '') return []
27
+ const pieces = value.includes(',') ? value.split(',') : value.split(/\s+/)
28
+ const out = []
29
+ for (const piece of pieces) {
30
+ const token = piece.trim()
31
+ if (!token) {
32
+ throw new RouteArgError(`Invalid --exclusions: empty entry. ${CLEAR_HINT}`)
33
+ }
34
+ const body = token.startsWith('!') ? token.slice(1).trim() : token
35
+ if (!body) {
36
+ throw new RouteArgError(`Invalid --exclusions: "!" needs a path, for example --exclusions=/health. ${CLEAR_HINT}`)
37
+ }
38
+ out.push(body)
39
+ }
40
+ return out
41
+ }
42
+
43
+ /**
44
+ * @param {string[]} args argv after the subcommand
45
+ * @param {{ allowExclusions?: boolean }} [options]
46
+ * @returns {{ help: boolean, json: boolean, positional: string[], exclusions: string[] | undefined }}
47
+ * `exclusions` is undefined when the flag was not passed. `[]` means clear.
48
+ */
49
+ function parseRouteWriteArgs(args, { allowExclusions = true } = {}) {
50
+ let help = false
51
+ let json = false
52
+ /** @type {string[] | undefined} */
53
+ let exclusions
54
+ let sawExclusions = false
55
+ const positional = []
56
+
57
+ for (let i = 0; i < args.length; i++) {
58
+ const arg = args[i]
59
+ if (arg === '--help' || arg === '-h') {
60
+ help = true
61
+ continue
62
+ }
63
+ if (arg === '--json') {
64
+ json = true
65
+ continue
66
+ }
67
+ if (arg === '--exclusions' || arg.startsWith('--exclusions=')) {
68
+ if (!allowExclusions) {
69
+ throw new RouteArgError(`Unsupported option: ${arg === '--exclusions' ? '--exclusions' : '--exclusions='}. route delete does not change exclusions.`)
70
+ }
71
+ if (arg === '--exclusions') {
72
+ throw new RouteArgError(`Unsupported option: --exclusions. ${CLEAR_HINT}`)
73
+ }
74
+ if (sawExclusions) throw new RouteArgError('--exclusions was given more than once.')
75
+ sawExclusions = true
76
+ exclusions = parseExclusionList(arg.slice('--exclusions='.length))
77
+ continue
78
+ }
79
+ if (arg.startsWith('-')) {
80
+ throw new RouteArgError(`Unsupported option: ${arg}.`)
81
+ }
82
+ positional.push(arg)
83
+ }
84
+
85
+ return { help, json, positional, exclusions: sawExclusions ? exclusions : undefined }
86
+ }
87
+
88
+ /**
89
+ * Split a pattern argument the way the CLI always has (`"host !/api"`), but
90
+ * refuse a bare `!` — that used to be dropped and looked like a successful clear.
91
+ * @returns {{ patterns: string[], exclusions: string[] }}
92
+ */
93
+ function parsePatternArg(raw) {
94
+ const parts = String(raw).trim().split(/\s+/).filter(Boolean)
95
+ for (const part of parts) {
96
+ if (part.startsWith('!') && part.slice(1).trim() === '') {
97
+ throw new RouteArgError('Invalid exclusion "!": a "!" token needs a path such as "!/api". To clear exclusions, pass --exclusions=.')
98
+ }
99
+ }
100
+ return splitPatternArg(raw)
101
+ }
102
+
103
+ /**
104
+ * @param {string[]} patternExclusions exclusions parsed from !path tokens
105
+ * @param {string[] | undefined} flagExclusions undefined when --exclusions was omitted
106
+ * @returns {{ explicit: boolean, exclusions: string[] | undefined }}
107
+ */
108
+ function resolveExclusions(patternExclusions, flagExclusions) {
109
+ if (flagExclusions !== undefined && patternExclusions.length > 0) {
110
+ throw new RouteArgError('Pass exclusions either as !path tokens in the pattern or with --exclusions, not both.')
111
+ }
112
+ if (flagExclusions !== undefined) return { explicit: true, exclusions: flagExclusions }
113
+ if (patternExclusions.length > 0) return { explicit: true, exclusions: patternExclusions }
114
+ return { explicit: false, exclusions: undefined }
115
+ }
116
+
117
+ const UPDATE_HELP = `
118
+ meddle route update <file> <pattern> [<target>] [--exclusions=<list>] [--json]
119
+
120
+ Update a rule. Edits only the line(s) that hold the pattern; every other line
121
+ stays byte-for-byte, including comments, blank lines and other rules' !path.
122
+
123
+ --exclusions= Clear this rule's exclusions (the line loses !path).
124
+ --exclusions=/a,/b Replace exclusions. Spaces work inside quotes
125
+ (--exclusions="/a /b"). A leading ! is optional.
126
+ "pattern !/a !/b" Replace exclusions (same as before). Omit both
127
+ --exclusions and !path to keep existing exclusions.
128
+
129
+ The <target> may be omitted when --exclusions is set; the current target stays.
130
+ A bare --exclusions, an empty "!" token, an unknown flag, or both exclusion
131
+ forms at once exits 1 and does not change the file.
132
+
133
+ A "#" comments out a whole line only when it is the first non-space character.
134
+ A "#" later on a rule line is a pattern token, not a trailing comment.
135
+
136
+ Examples:
137
+ meddle route update dev "api.example.com" "localhost:4000"
138
+ meddle route update dev "api.example.com" --exclusions=
139
+ meddle route update dev "api.example.com" "localhost:4000" --exclusions=/health
140
+ `
141
+
142
+ module.exports = {
143
+ CLEAR_HINT,
144
+ RouteArgError,
145
+ UPDATE_HELP,
146
+ parseExclusionList,
147
+ parsePatternArg,
148
+ parseRouteWriteArgs,
149
+ resolveExclusions,
150
+ }
@@ -1,2 +1,9 @@
1
- export declare function openBrowserWithProxy(url: string, proxyServer: string, meddleDir: string, remoteDebuggingPort?: number): boolean;
1
+ import * as os from 'os';
2
+ type Platform = ReturnType<typeof os.platform>;
3
+ /** Name of a browser this machine can launch (`google-chrome`, `Google Chrome`, …), or null. */
4
+ export declare function findInstalledBrowser(platform?: Platform): string | null;
5
+ /** Stop browsers opened by this process. Tests call this from afterAll. */
6
+ export declare function closeLaunchedBrowsers(): void;
7
+ export declare function openBrowserWithProxy(url: string, proxyServer: string, meddleDir: string, remoteDebuggingPort?: number): Promise<boolean>;
8
+ export {};
2
9
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":"AAMA,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAuC/H"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAmBxB,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;AAgC9C,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,QAAwB,GAAG,MAAM,GAAG,IAAI,CAStF;AAwCD,2EAA2E;AAC3E,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C;AA2GD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB9I"}
@@ -36,57 +36,260 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.findInstalledBrowser = findInstalledBrowser;
40
+ exports.closeLaunchedBrowsers = closeLaunchedBrowsers;
39
41
  exports.openBrowserWithProxy = openBrowserWithProxy;
40
42
  const os = __importStar(require("os"));
41
43
  const path = __importStar(require("path"));
42
44
  const fs = __importStar(require("fs"));
43
45
  const child_process_1 = require("child_process");
44
46
  const chalk_1 = __importDefault(require("chalk"));
45
- function openBrowserWithProxy(url, proxyServer, meddleDir, remoteDebuggingPort) {
46
- const platform = os.platform();
47
- const userDataDir = path.join(meddleDir, 'chrome-proxy');
48
- if (!fs.existsSync(userDataDir))
49
- fs.mkdirSync(userDataDir, { recursive: true });
50
- const browsers = platform === 'darwin'
51
- ? ['Google Chrome', 'Microsoft Edge', 'Chromium']
52
- : platform === 'win32'
53
- ? ['chrome', 'msedge', 'chromium']
54
- : ['google-chrome', 'chromium', 'chromium-browser'];
55
- let proxyArgs = `--user-data-dir="${userDataDir}" --proxy-server=${proxyServer} --window-size=1920,1080`;
56
- if (remoteDebuggingPort)
57
- proxyArgs += ` --remote-debugging-port=${remoteDebuggingPort}`;
58
- for (const app of browsers) {
59
- try {
60
- if (platform === 'darwin') {
61
- (0, child_process_1.execSync)(`open -a "${app}" --args ${proxyArgs} "${url}"`, { stdio: 'ignore' });
62
- return true;
63
- }
64
- else if (platform === 'win32') {
65
- (0, child_process_1.execSync)(`start "" "${app}" ${proxyArgs} "${url}"`, { stdio: 'ignore' });
66
- return true;
47
+ // Linux `execSync('google-chrome …')` waits until Chrome exits. Chrome does not
48
+ // exit, so the caller — including the Vitest worker in tests/browser.spec.ts —
49
+ // blocks forever and the test timeout never fires (#130). Spawn instead. A
50
+ // process that is still alive after a short grace period is open. Exit 0 is
51
+ // also success: Chrome hands the URL to an existing window with the same
52
+ // profile and quits. A non-zero exit is a failed start. Kill anything that
53
+ // fails to start or that tests ask us to close.
54
+ const BROWSER_GRACE_MS = 500;
55
+ const LAUNCHER_TIMEOUT_MS = 2000;
56
+ const launched = [];
57
+ const profiles = [];
58
+ function browserCandidates(platform) {
59
+ if (platform === 'darwin')
60
+ return ['Google Chrome', 'Microsoft Edge', 'Chromium'];
61
+ if (platform === 'win32')
62
+ return ['chrome', 'msedge', 'chromium'];
63
+ return ['google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser'];
64
+ }
65
+ function commandOnPath(name) {
66
+ const directories = (process.env.PATH || '').split(path.delimiter).filter(Boolean);
67
+ const suffixes = process.platform === 'win32'
68
+ ? (process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';')
69
+ : [''];
70
+ for (const directory of directories) {
71
+ for (const suffix of suffixes) {
72
+ const candidate = path.join(directory, name + suffix);
73
+ try {
74
+ fs.accessSync(candidate, fs.constants.X_OK);
75
+ return candidate;
67
76
  }
68
- else {
69
- (0, child_process_1.execSync)(`${app} ${proxyArgs} "${url}"`, { stdio: 'ignore' });
70
- return true;
77
+ catch {
78
+ // try the next directory
71
79
  }
72
80
  }
73
- catch (_) {
81
+ }
82
+ return null;
83
+ }
84
+ function darwinAppExists(app) {
85
+ const roots = ['/Applications', path.join(os.homedir(), 'Applications')];
86
+ return roots.some((root) => fs.existsSync(path.join(root, `${app}.app`)));
87
+ }
88
+ /** Name of a browser this machine can launch (`google-chrome`, `Google Chrome`, …), or null. */
89
+ function findInstalledBrowser(platform = os.platform()) {
90
+ for (const app of browserCandidates(platform)) {
91
+ if (platform === 'darwin') {
92
+ if (darwinAppExists(app))
93
+ return app;
74
94
  continue;
75
95
  }
96
+ if (commandOnPath(app))
97
+ return app;
76
98
  }
99
+ return null;
100
+ }
101
+ function killPid(pid) {
77
102
  try {
78
- if (platform === 'darwin')
79
- (0, child_process_1.execSync)(`open "${url}"`, { stdio: 'ignore' });
80
- else if (platform === 'win32')
81
- (0, child_process_1.execSync)(`start "" "${url}"`, { stdio: 'ignore' });
82
- else
83
- (0, child_process_1.execSync)(`xdg-open "${url}"`, { stdio: 'ignore' });
84
- console.log(chalk_1.default.yellow('未找到 Chrome/Edge,已用默认浏览器打开,请手动设置代理:', proxyServer));
85
- return true;
103
+ // detached: true puts the child in its own process group, so this also
104
+ // stops Chrome helpers spawned from it.
105
+ process.kill(-pid, 'SIGKILL');
86
106
  }
87
- catch (err) {
88
- console.error(chalk_1.default.red('浏览器并未启动:'), err.message);
107
+ catch {
108
+ try {
109
+ process.kill(pid, 'SIGKILL');
110
+ }
111
+ catch { /* already exited */ }
112
+ }
113
+ }
114
+ function forget(child) {
115
+ const index = launched.indexOf(child);
116
+ if (index >= 0)
117
+ launched.splice(index, 1);
118
+ if (child.pid)
119
+ killPid(child.pid);
120
+ }
121
+ function killProcessesUsingProfile(dir) {
122
+ if (process.platform === 'win32')
123
+ return;
124
+ let output = '';
125
+ try {
126
+ output = (0, child_process_1.execFileSync)('ps', ['-Aww', '-o', 'pid=', '-o', 'args='], {
127
+ encoding: 'utf8',
128
+ timeout: 2000,
129
+ stdio: ['ignore', 'pipe', 'ignore'],
130
+ });
131
+ }
132
+ catch {
133
+ return;
134
+ }
135
+ for (const line of output.split('\n')) {
136
+ if (!line.includes(dir))
137
+ continue;
138
+ const match = /^\s*(\d+)\s/.exec(line);
139
+ if (!match)
140
+ continue;
141
+ const pid = Number(match[1]);
142
+ if (!pid || pid === process.pid)
143
+ continue;
144
+ try {
145
+ process.kill(pid, 'SIGKILL');
146
+ }
147
+ catch { /* already exited */ }
148
+ }
149
+ }
150
+ /** Stop browsers opened by this process. Tests call this from afterAll. */
151
+ function closeLaunchedBrowsers() {
152
+ for (const child of launched.splice(0)) {
153
+ if (!child.pid || child.exitCode !== null || child.signalCode !== null)
154
+ continue;
155
+ killPid(child.pid);
156
+ }
157
+ for (const dir of profiles.splice(0))
158
+ killProcessesUsingProfile(dir);
159
+ }
160
+ function spawnTracked(command, args, shell = false) {
161
+ try {
162
+ const child = (0, child_process_1.spawn)(command, args, {
163
+ detached: true,
164
+ stdio: 'ignore',
165
+ windowsHide: true,
166
+ shell,
167
+ });
168
+ // 'error' is async (ENOENT). A listener is required so Node does not
169
+ // throw it as an unhandled error after we have already moved on.
170
+ child.on('error', () => { });
171
+ launched.push(child);
172
+ return child;
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ }
178
+ /**
179
+ * Browser binaries stay in the foreground. Still running after the grace
180
+ * period means opened. Exit 0 also means opened: a second Chrome with the
181
+ * same profile hands the URL to the existing window and quits.
182
+ */
183
+ function launchDetached(command, args) {
184
+ return new Promise((resolve) => {
185
+ const child = spawnTracked(command, args);
186
+ if (!child) {
187
+ resolve(false);
188
+ return;
189
+ }
190
+ let settled = false;
191
+ let timer;
192
+ const finish = (ok) => {
193
+ if (settled)
194
+ return;
195
+ settled = true;
196
+ if (timer)
197
+ clearTimeout(timer);
198
+ if (ok) {
199
+ // Already exited (handoff). Drop it so a later cleanup cannot
200
+ // signal a recycled pid. A process that is still running stays
201
+ // tracked so tests can close it.
202
+ if (child.exitCode !== null || child.signalCode !== null) {
203
+ const index = launched.indexOf(child);
204
+ if (index >= 0)
205
+ launched.splice(index, 1);
206
+ }
207
+ child.unref();
208
+ }
209
+ else {
210
+ forget(child);
211
+ }
212
+ resolve(ok);
213
+ };
214
+ timer = setTimeout(() => {
215
+ finish(child.exitCode === null && child.signalCode === null);
216
+ }, BROWSER_GRACE_MS);
217
+ child.once('error', () => finish(false));
218
+ child.once('exit', (code) => finish(code === 0));
219
+ });
220
+ }
221
+ /** `open`, `start`, and `xdg-open` are supposed to exit. Kill them if they do not. */
222
+ function launchExiting(command, args, shell = false) {
223
+ return new Promise((resolve) => {
224
+ const child = spawnTracked(command, args, shell);
225
+ if (!child) {
226
+ resolve(false);
227
+ return;
228
+ }
229
+ let settled = false;
230
+ let timer;
231
+ const finish = (ok) => {
232
+ if (settled)
233
+ return;
234
+ settled = true;
235
+ if (timer)
236
+ clearTimeout(timer);
237
+ if (ok) {
238
+ const index = launched.indexOf(child);
239
+ if (index >= 0)
240
+ launched.splice(index, 1);
241
+ child.unref();
242
+ }
243
+ else {
244
+ forget(child);
245
+ }
246
+ resolve(ok);
247
+ };
248
+ timer = setTimeout(() => finish(false), LAUNCHER_TIMEOUT_MS);
249
+ child.once('error', () => finish(false));
250
+ child.once('exit', (code) => finish(code === 0));
251
+ });
252
+ }
253
+ async function launchCandidate(platform, app, argList, url) {
254
+ if (platform === 'darwin') {
255
+ return launchExiting('open', ['-a', app, '--args', ...argList, url]);
256
+ }
257
+ if (platform === 'win32') {
258
+ return launchExiting('cmd.exe', ['/c', 'start', '', app, ...argList, url]);
259
+ }
260
+ const command = commandOnPath(app);
261
+ if (!command)
89
262
  return false;
263
+ return launchDetached(command, [...argList, url]);
264
+ }
265
+ function launchFallback(platform, url) {
266
+ if (platform === 'darwin')
267
+ return launchExiting('open', [url]);
268
+ if (platform === 'win32')
269
+ return launchExiting('cmd.exe', ['/c', 'start', '', url]);
270
+ return launchExiting('xdg-open', [url]);
271
+ }
272
+ async function openBrowserWithProxy(url, proxyServer, meddleDir, remoteDebuggingPort) {
273
+ const platform = os.platform();
274
+ const userDataDir = path.join(meddleDir, 'chrome-proxy');
275
+ fs.mkdirSync(userDataDir, { recursive: true });
276
+ profiles.push(userDataDir);
277
+ const argList = [
278
+ `--user-data-dir=${userDataDir}`,
279
+ `--proxy-server=${proxyServer}`,
280
+ '--window-size=1920,1080',
281
+ ];
282
+ if (remoteDebuggingPort)
283
+ argList.push(`--remote-debugging-port=${remoteDebuggingPort}`);
284
+ for (const app of browserCandidates(platform)) {
285
+ if (await launchCandidate(platform, app, argList, url))
286
+ return true;
287
+ }
288
+ if (await launchFallback(platform, url)) {
289
+ console.log(chalk_1.default.yellow('未找到 Chrome/Edge,已用默认浏览器打开,请手动设置代理:', proxyServer));
290
+ return true;
90
291
  }
292
+ console.error(chalk_1.default.red('浏览器并未启动:'), 'no supported browser found');
293
+ return false;
91
294
  }
92
295
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oDAuCC;AA7CD,uCAAwB;AACxB,2CAA4B;AAC5B,uCAAwB;AACxB,iDAAwC;AACxC,kDAAyB;AAEzB,SAAgB,oBAAoB,CAAC,GAAW,EAAE,WAAmB,EAAE,SAAiB,EAAE,mBAA4B;IAClH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE/E,MAAM,QAAQ,GAAa,QAAQ,KAAK,QAAQ;QAC5C,CAAC,CAAC,CAAC,eAAe,EAAE,gBAAgB,EAAE,UAAU,CAAC;QACjD,CAAC,CAAC,QAAQ,KAAK,OAAO;YAClB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;YAClC,CAAC,CAAC,CAAC,eAAe,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAA;IAE3D,IAAI,SAAS,GAAG,oBAAoB,WAAW,oBAAoB,WAAW,0BAA0B,CAAA;IACxG,IAAI,mBAAmB;QAAE,SAAS,IAAI,4BAA4B,mBAAmB,EAAE,CAAA;IAEvF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACxB,IAAA,wBAAQ,EAAC,YAAY,GAAG,YAAY,SAAS,KAAK,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAC9E,OAAO,IAAI,CAAA;YACf,CAAC;iBAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC9B,IAAA,wBAAQ,EAAC,aAAa,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;gBACxE,OAAO,IAAI,CAAA;YACf,CAAC;iBAAM,CAAC;gBACJ,IAAA,wBAAQ,EAAC,GAAG,GAAG,IAAI,SAAS,KAAK,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAC7D,OAAO,IAAI,CAAA;YACf,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC;QACD,IAAI,QAAQ,KAAK,QAAQ;YAAE,IAAA,wBAAQ,EAAC,SAAS,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;aACpE,IAAI,QAAQ,KAAK,OAAO;YAAE,IAAA,wBAAQ,EAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;;YAC5E,IAAA,wBAAQ,EAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,oCAAoC,EAAE,WAAW,CAAC,CAAC,CAAA;QAC5E,OAAO,IAAI,CAAA;IACf,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;QACjD,OAAO,KAAK,CAAA;IAChB,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../core/browser.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../server/agent/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAoB,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE/E,KAAK,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AA8qC1C,wBAAgB,gBAAgB,IAAI,YAAY,CA2B/C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,mBAAmB,EAAE,CAS5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY;;;;;;IAQrD"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../server/agent/tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAoB,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAE/E,KAAK,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AA+qC1C,wBAAgB,gBAAgB,IAAI,YAAY,CA2B/C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,mBAAmB,EAAE,CAS5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY;;;;;;IAQrD"}
@@ -526,12 +526,13 @@ function createRouteRuleUpdateTool() {
526
526
  const normalized = normalizeRouteRuleUpdateInput(input);
527
527
  const next = buildRouteRuleUpdateContent(normalized, ctx);
528
528
  return {
529
- summary: `更新路由规则:${normalized.pattern}`,
529
+ summary: `更新路由规则:${normalized.pattern} -> ${next.newTarget}`,
530
530
  diff: buildRouteRuleUpdateDiff(normalized, next),
531
531
  preview: {
532
532
  ruleFile: normalized.ruleFile,
533
533
  pattern: normalized.pattern,
534
534
  target: next.newTarget,
535
+ newTarget: next.newTarget,
535
536
  exclusions: next.exclusions,
536
537
  },
537
538
  input: normalized,