惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
博客园 - 聂微东
IT之家
IT之家
The Cloudflare Blog
L
LangChain Blog
Last Week in AI
Last Week in AI
T
Tailwind CSS Blog
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
I
Intezer
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
ThreatConnect
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
小众软件
小众软件
T
The Exploit Database - CXSecurity.com
H
Help Net Security
T
Tenable Blog
WordPress大学
WordPress大学
F
Future of Privacy Forum
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
NISL@THU
NISL@THU
The Register - Security
The Register - Security
A
About on SuperTechFans
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
Malwarebytes
Malwarebytes
博客园_首页
T
Threatpost
C
CERT Recently Published Vulnerability Notes
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
Blog — PlanetScale
Blog — PlanetScale
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
K
Kaspersky official blog
月光博客
月光博客
Jina AI
Jina AI
S
Securelist
Hugging Face - Blog
Hugging Face - Blog
G
GRAHAM CLULEY
腾讯CDC
S
Secure Thoughts
V
V2EX - 技术

Recent Commits to openclaw:main

Fix local embedding worker safety (#85348) fix(ui): scope chat session picker to active agent (#85965) · openclaw/openclaw@70c7d6f [codex] improve iOS realtime talk mode (#86355) · openclaw/openclaw@9ca52ce fix(scripts): dedupe docker lane resources · openclaw/openclaw@5e94469 docs: add code size guidance · openclaw/openclaw@9a60fcf fix(test): avoid source gateway import in rpc walk · openclaw/openclaw@e9b8a6e docs: add bugfix changelog entries · openclaw/openclaw@f950132 Fix heartbeat response loop guard (#86324) (#86357) · openclaw/openclaw@e2c174e fix(memory-core): filter REM dreaming candidates to light-staged entr… · openclaw/openclaw@8b42771 fix(telegram): propagate forum topic names into agent context (#86299) fix(slack): keep downloaded files out of reply media (#86318) · openclaw/openclaw@2fcd481 fix(cron): accept plus durations for one-shot jobs (#86341) · openclaw/openclaw@9239f94 fix(plugins): clear metadata memo at lifecycle boundaries · openclaw/openclaw@e7c696a chore(skills): normalize release skill routing · openclaw/openclaw@4737e19 docs(release): require early performance regression check · openclaw/openclaw@0336938 fix(qa): capture Windows gateway metrics · openclaw/openclaw@9afbfc1 feat(qa): add coverage scenario matching · openclaw/openclaw@a1fe86a fix(perf): avoid duplicate docker package ui build build: enable modern TypeScript module syntax · openclaw/openclaw@bbc1772 ci: include performance evidence in release validation fix(providers): stream ordinary tool-like prose promptly fix(perf): harden gateway restart bench exits · openclaw/openclaw@82bbcf6 fix(gateway): gate talk secret bootstrap handoff (#85690) · openclaw/openclaw@c791e42 fix: suppress async media incomplete-turn errors (#85933) · openclaw/openclaw@35dcd42 migrate auth credentials · openclaw/openclaw@f036bac fix migrate auth lint · openclaw/openclaw@50e6cb0 fix migrate supported auth imports · openclaw/openclaw@44bb2be fix migrate auth opt-out precedence · openclaw/openclaw@2016a51 honor migrate auth opt-out in plan · openclaw/openclaw@17edec7 address migrate auth review comments · openclaw/openclaw@0a98c2d fix ci blockers for migrate auth docs: add migrate auth changelog (#85667) · openclaw/openclaw@f7fcbdb fix(scripts): avoid duplicate install smoke ui build · openclaw/openclaw@b1b2841 fix(telegram): preserve inbound text entities (#83873) · openclaw/openclaw@b552919 chore: ignore Python bytecode caches · openclaw/openclaw@b6b2755 fix: make autoreview progress visible · openclaw/openclaw@236edb2 ci(release): fix plugin prerelease extension batch invocation test(telegram): provide topic cache store in message context harness · openclaw/openclaw@ff1fde1 test(agents): complete provider runtime test mocks · openclaw/openclaw@be8cd12 test(telegram): type topic cache harness store · openclaw/openclaw@84ab206 test(agents): sync provider runtime mocks · openclaw/openclaw@a289dd9 refactor: keep plain text tool-call promotion private (#86374) · openclaw/openclaw@c3ab2de fix(discord): suppress self-reply prompt echoes (#86238) docs: clarify config migration policy · openclaw/openclaw@c44367f fix(perf): fail startup bench on early gateway exit · openclaw/openclaw@a8fc28c fix: prevent plain text tool call leaks (#86222) · openclaw/openclaw@cd62780 fix: handle npm min-release-age in installers · openclaw/openclaw@316d97c fix(scripts): include ui:build in build-all full and ciArtifacts prof… · openclaw/openclaw@6704d0a fix(e2e): sample Windows kitchen sink gateway RSS · openclaw/openclaw@73189e3 fix(cron): respect isolated target and error on missing remove id (#8… · openclaw/openclaw@6709f4e fix(pi-embedded-runner): propagate trigger-derived priority to the gl… · openclaw/openclaw@0580f57 fix(cli): suppress self-update version warnings · openclaw/openclaw@e2bd20f fix: preserve webchat source reply details · openclaw/openclaw@aa50c51 docs: replace OpenClaw docs skill and add plugin permissions guide · openclaw/openclaw@0dabb70 fix(codex): preserve source reply mode for active runs (#86325) · openclaw/openclaw@b962110 fix: make compaction reinjection opt-in · openclaw/openclaw@ab910f8 fix codex usage-limit recovery copy (#86305) · openclaw/openclaw@c3c8a65 feat(ui): add ephemeral Activity tab · openclaw/openclaw@3dd0e8e fix(tests): harden native macos plugin proof · openclaw/openclaw@a5d5604 fix(commitments): serialize load-modify-save with in-process queue + … · openclaw/openclaw@d3c293d Fail Codex compaction at the Codex boundary (#85958) · openclaw/openclaw@dd47e47 fix(docker): restore config parent ownership · openclaw/openclaw@908b894 docs: clarify config default review policy (#86329) · openclaw/openclaw@3a03dd5 docs: clean changelog script entries · openclaw/openclaw@0eead19 fix(scripts): budget restart benchmark timeouts · openclaw/openclaw@5bd5509 fix: align ui vitest config assertion · openclaw/openclaw@730fd19 fix: route unit ui vitest targets narrowly · openclaw/openclaw@777402e fix: route explicit ui vitest targets narrowly · openclaw/openclaw@56a383c fix(android): harden play media permission removal fix(webchat): stabilize live transcript run state · openclaw/openclaw@119a01c fix(scripts): fail restart benchmark regressions · openclaw/openclaw@95d1b39 fix(openai): scope external codex auth to realtime fix(openai): prefer codex auth for GPT realtime · openclaw/openclaw@48c4f57 fix(openai): discover codex cli auth for provider checks · openclaw/openclaw@4656275 fix(android): keep talk mode on realtime relay · openclaw/openclaw@70614f8 test(android): add gateway connect adb probe · openclaw/openclaw@d7aa1f3 fix(android): stabilize realtime talk connection state · openclaw/openclaw@ffb02a5 test(android): add voice mode adb e2e harness · openclaw/openclaw@e52a3b3 fix(ci): stabilize deadcode and catalog checks · openclaw/openclaw@3db1508 fix(scripts): prebuild gateway cpu bench · openclaw/openclaw@ca70015 fix(e2e): harden bundled lifecycle probe on Windows · openclaw/openclaw@4798264 test(e2e): sample kitchen sink rpc peak rss · openclaw/openclaw@60c0f24 fix(scripts): remove stale deadcode allowlist entries · openclaw/openclaw@ea3bb92 fix(telegram): route polling diagnostics away from errors · openclaw/openclaw@b5c1199 fix(plugins): support linked source checkouts on Windows · openclaw/openclaw@793e300 fix(gateway): back off session tool mirrors under pressure (#84846) · openclaw/openclaw@42bdc94 fix(config): skip shell env fallback on Windows (#85739) · openclaw/openclaw@06bf302 fix(gateway): avoid duplicate session message broadcasts · openclaw/openclaw@1459044 fix: repair anchorless iMessage watch payloads · openclaw/openclaw@f37fbc9 fix(cli): route node status hints to stdout (#85780) · openclaw/openclaw@749692e fix(oc-path): support deep config edits (#86060) · openclaw/openclaw@3a72a30 fix(config): quiet benign metadata anomaly output · openclaw/openclaw@f3f4f29 fix(test): fail multi-node update regressions · openclaw/openclaw@732cf54 fix(google-vertex): support production ADC modes (#83971) · openclaw/openclaw@f09b4eb test(e2e): expose corrupt plugin deps smoke · openclaw/openclaw@fa3ff4d fix(codex): log app-server approval promotion trigger · openclaw/openclaw@d9af23f test(e2e): harden multi-node update smoke Clean up browser MCP subprocess tree (#85832) · openclaw/openclaw@8dc6b4d fix(agents): log warnings instead of swallowing subagent errors (#82943) · openclaw/openclaw@907bc03 fix(compaction): preserve partial summary on mid-chain chunk failure … · openclaw/openclaw@f0061dd
fix(build): support Windows UI builds · openclaw/openclaw@0bb9b42
vincentkoc · 2026-05-25 · via Recent Commits to openclaw:main

@@ -4,6 +4,7 @@ import fs from "node:fs";

44

import { createRequire } from "node:module";

55

import path from "node:path";

66

import { fileURLToPath } from "node:url";

7+

import { resolvePnpmRunner } from "./pnpm-runner.mjs";

78

import { buildCmdExeCommandLine } from "./windows-cmd-helpers.mjs";

89910

const here = path.dirname(fileURLToPath(import.meta.url));

@@ -17,42 +18,6 @@ function usage() {

1718

process.stderr.write("Usage: node scripts/ui.js <install|dev|build|test> [...args]\n");

1819

}

192020-

function which(cmd) {

21-

try {

22-

const key = process.platform === "win32" ? "Path" : "PATH";

23-

const paths = (process.env[key] ?? process.env.PATH ?? "")

24-

.split(path.delimiter)

25-

.filter(Boolean);

26-

const extensions =

27-

process.platform === "win32"

28-

? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)

29-

: [""];

30-

for (const entry of paths) {

31-

for (const ext of extensions) {

32-

const candidate = path.join(entry, process.platform === "win32" ? `${cmd}${ext}` : cmd);

33-

try {

34-

if (fs.existsSync(candidate)) {

35-

return candidate;

36-

}

37-

} catch {

38-

// ignore

39-

}

40-

}

41-

}

42-

} catch {

43-

// ignore

44-

}

45-

return null;

46-

}

47-48-

function resolveRunner() {

49-

const pnpm = which("pnpm");

50-

if (pnpm) {

51-

return { cmd: pnpm, kind: "pnpm" };

52-

}

53-

return null;

54-

}

55-5621

export function shouldUseCmdExeForCommand(cmd, platform = process.platform) {

5722

if (platform !== "win32") {

5823

return false;

@@ -89,19 +54,42 @@ export function resolveSpawnCall(cmd, args, envOverride, params = {}) {

8954

};

9055

}

915692-

function run(cmd, args) {

93-

const { command, args: spawnArgs, options } = resolveSpawnCall(cmd, args);

57+

export function resolvePnpmSpawnCall(pnpmArgs, envOverride, params = {}) {

58+

const env = envOverride ?? process.env;

59+

const platform = params.platform ?? process.platform;

60+

const runner = resolvePnpmRunner({

61+

pnpmArgs,

62+

nodeExecPath: params.nodeExecPath ?? process.execPath,

63+

npmExecPath: params.npmExecPath ?? env.npm_execpath,

64+

comSpec: params.comSpec ?? env.ComSpec,

65+

platform,

66+

});

67+

return {

68+

command: runner.command,

69+

args: runner.args,

70+

options: {

71+

cwd: params.cwd ?? uiDir,

72+

stdio: "inherit",

73+

env,

74+

shell: runner.shell,

75+

windowsVerbatimArguments: runner.windowsVerbatimArguments,

76+

},

77+

};

78+

}

79+80+

function runSpawnCall(spawnCall, label) {

81+

const { command, args: spawnArgs, options } = spawnCall;

9482

let child;

9583

try {

9684

child = spawn(command, spawnArgs, options);

9785

} catch (err) {

98-

console.error(`Failed to launch ${cmd}:`, err);

86+

console.error(`Failed to launch ${label}:`, err);

9987

process.exit(1);

10088

return;

10189

}

1029010391

child.on("error", (err) => {

104-

console.error(`Failed to launch ${cmd}:`, err);

92+

console.error(`Failed to launch ${label}:`, err);

10593

process.exit(1);

10694

});

10795

child.on("exit", (code) => {

@@ -111,13 +99,21 @@ function run(cmd, args) {

11199

});

112100

}

113101114-

function runSync(cmd, args, envOverride) {

115-

const { command, args: spawnArgs, options } = resolveSpawnCall(cmd, args, envOverride);

102+

function run(cmd, args) {

103+

runSpawnCall(resolveSpawnCall(cmd, args), cmd);

104+

}

105+106+

function runPnpm(args, envOverride) {

107+

runSpawnCall(resolvePnpmSpawnCall(args, envOverride), "pnpm");

108+

}

109+110+

function runSpawnCallSync(spawnCall, label) {

111+

const { command, args: spawnArgs, options } = spawnCall;

116112

let result;

117113

try {

118114

result = spawnSync(command, spawnArgs, options);

119115

} catch (err) {

120-

console.error(`Failed to launch ${cmd}:`, err);

116+

console.error(`Failed to launch ${label}:`, err);

121117

process.exit(1);

122118

return;

123119

}

@@ -129,6 +125,10 @@ function runSync(cmd, args, envOverride) {

129125

}

130126

}

131127128+

function runPnpmSync(args, envOverride) {

129+

runSpawnCallSync(resolvePnpmSpawnCall(args, envOverride), "pnpm");

130+

}

131+132132

function depsInstalled(kind) {

133133

try {

134134

const require = createRequire(path.join(uiDir, "package.json"));

@@ -179,24 +179,18 @@ export function main(argv = process.argv.slice(2)) {

179179

return;

180180

}

181181182-

const runner = resolveRunner();

183-

if (!runner) {

184-

process.stderr.write("Missing UI runner: install pnpm, then retry.\n");

185-

process.exit(1);

186-

}

187-188182

if (action === "install") {

189-

run(runner.cmd, ["install", ...rest]);

183+

runPnpm(["install", ...rest]);

190184

return;

191185

}

192186193187

if (!depsInstalled(action === "test" ? "test" : "build")) {

194188

const installEnv = process.env;

195189

const installArgs = ["install"];

196-

runSync(runner.cmd, installArgs, installEnv);

190+

runPnpmSync(installArgs, installEnv);

197191

}

198192199-

run(runner.cmd, ["run", script, ...rest]);

193+

runPnpm(["run", script, ...rest]);

200194

}

201195202196

export function resolveDirectExecutionPath(entry, realpath = fs.realpathSync.native) {