





















@@ -7,6 +7,8 @@ const TMUX_DISABLE_VALUES = new Set(["0", "false", "no", "off"]);
77const TMUX_ATTACH_DISABLE_VALUES = new Set(["0", "false", "no", "off"]);
88const TMUX_ATTACH_FORCE_VALUES = new Set(["1", "true", "yes", "on"]);
99const DEFAULT_PROFILE_NAME = "main";
10+const DEFAULT_BENCHMARK_PROFILE_DIR = ".artifacts/gateway-watch-profiles";
11+const RUN_NODE_CPU_PROF_DIR_ENV = "OPENCLAW_RUN_NODE_CPU_PROF_DIR";
1012const RAW_WATCH_SCRIPT = "scripts/watch-node.mjs";
1113const TMUX_CWD_ENV_KEY = "OPENCLAW_GATEWAY_WATCH_CWD";
1214const TMUX_CWD_OPTION_KEY = "@openclaw.gateway_watch.cwd";
@@ -16,6 +18,7 @@ const TMUX_CHILD_ENV_KEYS = [
1618"OPENCLAW_GATEWAY_PORT",
1719"OPENCLAW_HOME",
1820"OPENCLAW_PROFILE",
21+RUN_NODE_CPU_PROF_DIR_ENV,
1922"OPENCLAW_SKIP_CHANNELS",
2023"OPENCLAW_STATE_DIR",
2124];
@@ -46,6 +49,54 @@ const readArgValue = (args, flag) => {
4649return null;
4750};
485152+const resolveGatewayWatchBenchmarkArgs = ({ args = [], env = process.env } = {}) => {
53+const passthroughArgs = [];
54+let benchmarkDir = null;
55+let benchmarkFlagSeen = false;
56+57+for (let index = 0; index < args.length; index += 1) {
58+const arg = args[index];
59+if (arg === "--benchmark") {
60+benchmarkFlagSeen = true;
61+benchmarkDir ??= DEFAULT_BENCHMARK_PROFILE_DIR;
62+continue;
63+}
64+if (typeof arg === "string" && arg.startsWith("--benchmark=")) {
65+benchmarkFlagSeen = true;
66+benchmarkDir = arg.slice("--benchmark=".length) || DEFAULT_BENCHMARK_PROFILE_DIR;
67+continue;
68+}
69+if (arg === "--benchmark-dir") {
70+benchmarkFlagSeen = true;
71+const next = args[index + 1];
72+if (typeof next === "string" && !next.startsWith("-")) {
73+benchmarkDir = next;
74+index += 1;
75+} else {
76+benchmarkDir ??= DEFAULT_BENCHMARK_PROFILE_DIR;
77+}
78+continue;
79+}
80+if (typeof arg === "string" && arg.startsWith("--benchmark-dir=")) {
81+benchmarkFlagSeen = true;
82+benchmarkDir = arg.slice("--benchmark-dir=".length) || DEFAULT_BENCHMARK_PROFILE_DIR;
83+continue;
84+}
85+passthroughArgs.push(arg);
86+}
87+88+const nextEnv = { ...env };
89+if (benchmarkFlagSeen) {
90+nextEnv[RUN_NODE_CPU_PROF_DIR_ENV] =
91+benchmarkDir || nextEnv[RUN_NODE_CPU_PROF_DIR_ENV] || DEFAULT_BENCHMARK_PROFILE_DIR;
92+}
93+return {
94+args: passthroughArgs,
95+benchmarkProfileDir: nextEnv[RUN_NODE_CPU_PROF_DIR_ENV] || null,
96+env: nextEnv,
97+};
98+};
99+49100export const resolveGatewayWatchTmuxSessionName = ({ args = [], env = process.env } = {}) => {
50101const profile =
51102env.OPENCLAW_PROFILE ||
@@ -168,10 +219,14 @@ const setTmuxSessionMetadata = ({ cwd, sessionName, spawnSyncImpl, stderr }) =>
168219};
169220170221export const runGatewayWatchTmuxMain = (params = {}) => {
171-const deps = {
222+const resolvedArgs = resolveGatewayWatchBenchmarkArgs({
172223args: params.args ?? process.argv.slice(2),
173-cwd: params.cwd ?? process.cwd(),
174224env: params.env ? { ...params.env } : { ...process.env },
225+});
226+const deps = {
227+args: resolvedArgs.args,
228+cwd: params.cwd ?? process.cwd(),
229+env: resolvedArgs.env,
175230nodePath: params.nodePath ?? process.execPath,
176231spawnSync: params.spawnSync ?? spawnSync,
177232stderr: params.stderr ?? process.stderr,
@@ -180,6 +235,10 @@ export const runGatewayWatchTmuxMain = (params = {}) => {
180235stdoutIsTTY: params.stdoutIsTTY ?? process.stdout.isTTY,
181236};
182237238+if (resolvedArgs.benchmarkProfileDir) {
239+log(deps.stderr, `gateway:watch benchmark CPU profiles: ${resolvedArgs.benchmarkProfileDir}`);
240+}
241+183242if (TMUX_DISABLE_VALUES.has(String(deps.env.OPENCLAW_GATEWAY_WATCH_TMUX ?? "").toLowerCase())) {
184243return runForegroundWatcher({
185244args: deps.args,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。