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

推荐订阅源

F
Full Disclosure
Recorded Future
Recorded Future
T
Tenable Blog
S
Securelist
C
CERT Recently Published Vulnerability Notes
T
Threatpost
S
Schneier on Security
A
Arctic Wolf
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
K
Kaspersky official blog
T
True Tiger Recordings
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Spread Privacy
Spread Privacy
Malwarebytes
Malwarebytes
P
Proofpoint News Feed
F
Fox-IT International blog
F
Fortinet All Blogs
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
量子位
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Project Zero
Project Zero
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
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
I
Intezer
博客园_首页
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security

Recent Commits to openclaw:main

fix(e2e): bound upgrade survivor probes · openclaw/openclaw@981ae13 fix(doctor): keep hooks model checks read-only (#86101) · openclaw/openclaw@371c4d6 fix(installer): tighten nonroot smoke node preflight · openclaw/openclaw@340f480 fix(e2e): bound HTTP readiness probes · openclaw/openclaw@d58f864 fix(daemon): keep node tasks off gateway listener cleanup · openclaw/openclaw@a4e0b6e perf(gateway): reuse prepared auth stores · openclaw/openclaw@d2711c9 test: speed up codex app server run attempts · openclaw/openclaw@1ce3637 build(codex): update Codex CLI to 0.134.0 · openclaw/openclaw@231a812 docs(skills): omit advisory ids from changelog notes · openclaw/openclaw@989a369 Fix stale approval prompts in Control UI (#86270) · openclaw/openclaw@5297eeb fix(installer): reject stale cli node runtimes · openclaw/openclaw@49d605e test: harden e2e harness isolation · openclaw/openclaw@acbb06e fix: keep approval runtime token local-only · openclaw/openclaw@96c5766 perf(gateway): defer skipped-channel sidecars · openclaw/openclaw@145b57c docs(changelog): omit advisory id from release notes · openclaw/openclaw@d606881 docs(changelog): refresh 2026.5.26 notes · openclaw/openclaw@26c0c19 docs(skills): add release changelog update workflow · openclaw/openclaw@c8d20ae fix(e2e): bound upgrade survivor cli checks · openclaw/openclaw@c965b3a test: speed up doctor config flow tests · openclaw/openclaw@5177180 fix(events): sanitize queued system markers (#87094) · openclaw/openclaw@c1151ea fix(gateway): remove redundant unknown union · openclaw/openclaw@f393ebe test: speed up model fallback tests · openclaw/openclaw@e7f644c fix(imessage): stage remote media before understanding · openclaw/openclaw@ae52be9 fix(gateway): drop stale subagent announce history · openclaw/openclaw@982e888 fix: repair local approval resolution (#86771) · openclaw/openclaw@13cfb77 fix(e2e): bound codex media plugin setup · openclaw/openclaw@f89fcdd fix(gateway): stop chat timeout fallback cascade · openclaw/openclaw@b4f6928 perf(gateway): defer scheduled service imports · openclaw/openclaw@b74cd69 test: speed up capability cli tests · openclaw/openclaw@0126aba perf(gateway): defer startup warning fallback imports · openclaw/openclaw@0ee4ccf fix(gateway): bound watch regression teardown · openclaw/openclaw@7014bd0 fix(codex): keep WebChat delivery hints out of user requests · openclaw/openclaw@0cfccdb test: type current plugin metadata snapshot mock · openclaw/openclaw@a43cf2b test: align WebChat delivery hint expectations · openclaw/openclaw@1242931 test: speed up command secret gateway tests · openclaw/openclaw@657f9d1 fix(status): show explicit fast mode state (#87115) · openclaw/openclaw@41962ed fix: preserve plugin LLM command auth (#85936) · openclaw/openclaw@9119492 test: align loopback prompt metadata · openclaw/openclaw@f7a39f4 perf(gateway): reuse metadata for startup warnings · openclaw/openclaw@166097e fix(plugin-sdk): stabilize diagnostic event root alias · openclaw/openclaw@53f36a8 fix(tui): queue prompts submitted while busy (#86722) · openclaw/openclaw@6842d72 test: speed up tooling tests · openclaw/openclaw@f34a527 fix(plugin-sdk): use Function.name to find onDiagnosticEvent export (… · openclaw/openclaw@b3f8a0e Suppress transient runner failures in channels (#87069) · openclaw/openclaw@df6ec28 fix(e2e): bound telegram live hot path · openclaw/openclaw@698c40e test: speed up crabbox wrapper tests · openclaw/openclaw@5aaad5f refactor(telegram): encode conversation binding mode · openclaw/openclaw@df659d1 fix(agents): correlate pathless read diagnostics (#86977) · openclaw/openclaw@cecb076 perf: trim gateway session cache churn · openclaw/openclaw@cdfb1b4 test: speed up update cli tests · openclaw/openclaw@9065377 fix(doctor): map runtime tool schema health · openclaw/openclaw@27ad3d7 fix(e2e): bound update channel CLI checks · openclaw/openclaw@8fa5ecb test: speed up run-node tests · openclaw/openclaw@c8364b4 fix(browser): validate current tab before snapshots (#78526) · openclaw/openclaw@0604700 fix(media): require staged sandbox media refs · openclaw/openclaw@42d6cf6 perf: trim gateway startup planning · openclaw/openclaw@8d6b599 fix(codex): quarantine unsupported dynamic tool schemas · openclaw/openclaw@d7d037b fix(e2e): bound package cli scenarios · openclaw/openclaw@d0cb7ba ci: prepare pnpm for crabbox hydrate · openclaw/openclaw@716d719 fix(e2e): bound kitchen sink gateway teardown · openclaw/openclaw@81d22e8 test: speed up test routing and parallels smoke tests · openclaw/openclaw@9754117 fix(onboard): preserve configured default model (#87000) · openclaw/openclaw@5304682 fix(telegram): route plugin-bound topic messages · openclaw/openclaw@b8ea6d2 fix(gateway): bound benchmark teardown waits · openclaw/openclaw@1baab3b fix(diagnostics): recover orphaned session activity · openclaw/openclaw@286964c perf: avoid redundant runtime postbuild sync · openclaw/openclaw@a67ee0f fix(media): resolve inbound media refs consistently · openclaw/openclaw@6290ed5 fix(e2e): bound logged onboard commands · openclaw/openclaw@b74984d fix(ollama): normalize greedy top_p (#87049) · openclaw/openclaw@dfadc7b test: speed up crabbox wrapper tests · openclaw/openclaw@1954468 test: speed up crabbox config shim · openclaw/openclaw@1d2bf82 clickclack: enforce inbound sender allowlist [AI] (#83741) · openclaw/openclaw@10546e5 fix: isolate chat transcript fallback failures · openclaw/openclaw@fafed25 refactor: centralize prepared user turn merge · openclaw/openclaw@481f432 fix: preserve inline image routing with staged media · openclaw/openclaw@9263e38 test: wait for initial session task cleanup · openclaw/openclaw@00ab2f2 fix: keep user turn replay hooks idempotent · openclaw/openclaw@91cb042 refactor: carry prepared user turns on recorder · openclaw/openclaw@44bdc52 fix: preserve provenance through user turn hooks · openclaw/openclaw@223655d fix: use cleaned user turn transcript text · openclaw/openclaw@b9c2590 fix: preserve user turn provenance metadata · openclaw/openclaw@2e8f1d4 fix: keep user turn enrichment off dispatch · openclaw/openclaw@c862143 refactor: trim user turn transcript API · openclaw/openclaw@8bbd4ba fix: mark final codex mirror user persistence · openclaw/openclaw@2bd38da fix: resolve final codex mirror prompt · openclaw/openclaw@c0f8224 fix: use selected user transcript text · openclaw/openclaw@e4c42ae fix: restore user turn persistence checks · openclaw/openclaw@696fb41 fix: persist cli user turns to admitted session target · openclaw/openclaw@d55fe4b refactor: trim duplicated transcript tests · openclaw/openclaw@fe44ecd test: trim duplicate user turn persistence coverage · openclaw/openclaw@ffb8350 refactor: remove duplicate user turn handoff · openclaw/openclaw@20d7bf7 refactor: drop unused user turn update mode · openclaw/openclaw@848c389 fix(filefetch): wrap fetched text as external content (#87062) · openclaw/openclaw@42b8898 fix(ci): satisfy script oxlint sort rule · openclaw/openclaw@ffe1213 ci: tolerate gateway status help probe hangs fix(memory-core): close providers created during shutdown · openclaw/openclaw@e982302 fix(gateway): bound e2e HTTP helper responses · openclaw/openclaw@6509da7 fix(agents): honor per-agent thinking defaults for ingress runs (#86689) · openclaw/openclaw@bba4298 perf: trim gateway runtime hotspots · openclaw/openclaw@2035f38 test(cli): allow mac startup memory overhead · openclaw/openclaw@978cb6a
test: speed up test project routing · openclaw/openclaw@140892c
steipete · 2026-05-27 · via Recent Commits to openclaw:main

@@ -351,6 +351,7 @@ const PRECISE_SOURCE_TEST_TARGETS = new Map([

351351

],

352352

],

353353

]);

354+

const BROAD_ONLY_TEST_HELPERS = new Set(["test/helpers/poll.ts"]);

354355

const TOOLING_SOURCE_TEST_TARGETS = new Map([

355356

["scripts/github/barnacle-auto-response.mjs", ["test/scripts/barnacle-auto-response.test.ts"]],

356357

["scripts/changed-lanes.mjs", ["test/scripts/changed-lanes.test.ts"]],

@@ -593,6 +594,9 @@ const SOURCE_ROOTS_FOR_IMPORT_GRAPH = [

593594

"test",

594595

];

595596

const IMPORTABLE_FILE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts"];

597+

const IMPORT_GRAPH_GREP_PATHS = SOURCE_ROOTS_FOR_IMPORT_GRAPH.flatMap((root) =>

598+

IMPORTABLE_FILE_EXTENSIONS.map((ext) => `:(glob)${root}/**/*${ext}`),

599+

);

596600

const IMPORT_SPECIFIER_PATTERN =

597601

/\b(?:import|export)\s+(?:type\s+)?(?:[^'"]*?\s+from\s+)?["']([^"']+)["']|\bimport\s*\(\s*["']([^"']+)["']\s*\)/gu;

598602

const BROAD_CHANGED_ENV_KEY = "OPENCLAW_TEST_CHANGED_BROAD";

@@ -768,7 +772,7 @@ function isPathLikeTargetArg(arg, cwd) {

768772

if (!arg || arg === "--" || arg.startsWith("-")) {

769773

return false;

770774

}

771-

return isExistingPathTarget(arg, cwd) || isGlobTarget(arg) || isFileLikeTarget(arg);

775+

return isGlobTarget(arg) || isFileLikeTarget(arg) || isExistingPathTarget(arg, cwd);

772776

}

773777774778

function toRepoRelativeTarget(arg, cwd) {

@@ -844,7 +848,11 @@ export function findUnmatchedExplicitTestTargets(args, cwd = process.cwd()) {

844848

return [];

845849

}

846850847-

const candidateFiles = listExplicitTestTargetFilesForCwd(cwd);

851+

let candidateFiles = null;

852+

const getCandidateFiles = () => {

853+

candidateFiles ??= listExplicitTestTargetFilesForCwd(cwd);

854+

return candidateFiles;

855+

};

848856

const unmatched = [];

849857

for (const targetArg of targetArgs) {

850858

const relative = toRepoRelativeTarget(targetArg, cwd);

@@ -856,7 +864,7 @@ export function findUnmatchedExplicitTestTargets(args, cwd = process.cwd()) {

856864

continue;

857865

}

858866

if (isGlobTarget(relative)) {

859-

if (!includePatternMatchesAnyFile(relative, candidateFiles)) {

867+

if (!includePatternMatchesAnyFile(relative, getCandidateFiles())) {

860868

unmatched.push({

861869

target: targetArg,

862870

reason: "glob-matched-no-files",

@@ -879,7 +887,7 @@ export function findUnmatchedExplicitTestTargets(args, cwd = process.cwd()) {

879887

}

880888881889

const includePattern = toScopedIncludePattern(targetArg, cwd);

882-

if (!includePatternMatchesAnyFile(includePattern, candidateFiles)) {

890+

if (!includePatternMatchesAnyFile(includePattern, getCandidateFiles())) {

883891

unmatched.push({

884892

target: targetArg,

885893

reason: "target-matched-no-test-files",

@@ -991,12 +999,22 @@ function stripImportableGraphExtension(relative) {

991999

return relative;

9921000

}

9931001994-

function resolveImportGraphSearchTerm(relative) {

1002+

function resolveImportGraphSearchTerms(relative) {

1003+

const withoutExtension = stripImportableGraphExtension(relative);

9951004

const basename = path.posix.basename(stripImportableGraphExtension(relative));

9961005

if (basename === "index" || basename.length < 3) {

997-

return null;

1006+

return [];

1007+

}

1008+

const terms = [];

1009+

const segments = withoutExtension.split("/");

1010+

if (segments.length > 1) {

1011+

terms.push(segments.slice(-2).join("/"), withoutExtension);

1012+

}

1013+

if (relative.startsWith("test/helpers/")) {

1014+

return [...new Set(terms)];

9981015

}

999-

return basename;

1016+

terms.push(basename);

1017+

return [...new Set(terms)];

10001018

}

1001101910021020

function listImportGraphGrepMatches(cwd, term) {

@@ -1007,7 +1025,7 @@ function listImportGraphGrepMatches(cwd, term) {

1007102510081026

const result = spawnSync(

10091027

"git",

1010-

["grep", "-l", "--fixed-strings", term, "--", ...SOURCE_ROOTS_FOR_IMPORT_GRAPH],

1028+

["grep", "-l", "--fixed-strings", term, "--", ...IMPORT_GRAPH_GREP_PATHS],

10111029

{

10121030

cwd,

10131031

encoding: "utf8",

@@ -1036,39 +1054,52 @@ function findDirectImportersWithGitGrep(cwd, importedFile, fileSet) {

10361054

return cachedDirectImporters.get(cacheKey);

10371055

}

103810561039-

const term = resolveImportGraphSearchTerm(importedFile);

1040-

if (!term) {

1041-

cachedDirectImporters.set(cacheKey, null);

1042-

return null;

1043-

}

1044-1045-

const candidates = listImportGraphGrepMatches(cwd, term);

1046-

if (!candidates || candidates.length > 800) {

1057+

const terms = resolveImportGraphSearchTerms(importedFile);

1058+

if (terms.length === 0) {

10471059

cachedDirectImporters.set(cacheKey, null);

10481060

return null;

10491061

}

105010621063+

let skippedBroadTerm = false;

10511064

const importers = [];

1052-

for (const file of candidates) {

1053-

if (file === importedFile || !fileSet.has(file)) {

1054-

continue;

1065+

for (const term of terms) {

1066+

const candidates = listImportGraphGrepMatches(cwd, term);

1067+

if (!candidates) {

1068+

cachedDirectImporters.set(cacheKey, null);

1069+

return null;

10551070

}

1056-

let source = "";

1057-

try {

1058-

source = fs.readFileSync(path.join(cwd, file), "utf8");

1059-

} catch {

1071+

if (candidates.length > 800) {

1072+

skippedBroadTerm = true;

10601073

continue;

10611074

}

1062-

for (const match of source.matchAll(IMPORT_SPECIFIER_PATTERN)) {

1063-

const imported = resolveImportSpecifier(file, match[1] ?? match[2] ?? "", fileSet);

1064-

if (imported === importedFile) {

1065-

importers.push(file);

1066-

break;

1075+

for (const file of candidates) {

1076+

if (file === importedFile || !fileSet.has(file) || importers.includes(file)) {

1077+

continue;

1078+

}

1079+

let source = "";

1080+

try {

1081+

source = fs.readFileSync(path.join(cwd, file), "utf8");

1082+

} catch {

1083+

continue;

1084+

}

1085+

for (const match of source.matchAll(IMPORT_SPECIFIER_PATTERN)) {

1086+

const imported = resolveImportSpecifier(file, match[1] ?? match[2] ?? "", fileSet);

1087+

if (imported === importedFile) {

1088+

importers.push(file);

1089+

break;

1090+

}

10671091

}

10681092

}

1093+

if (importedFile.startsWith("test/helpers/") && importers.length > 0 && term.includes("/")) {

1094+

break;

1095+

}

10691096

}

1070-

cachedDirectImporters.set(cacheKey, importers);

1071-

return importers;

1097+

const result =

1098+

skippedBroadTerm && importers.length === 0 && !importedFile.startsWith("test/helpers/")

1099+

? null

1100+

: importers;

1101+

cachedDirectImporters.set(cacheKey, result);

1102+

return result;

10721103

}

1073110410741105

function resolveAffectedTestsFromTargetedImportScan(changedPath, cwd) {

@@ -1099,6 +1130,7 @@ function resolveAffectedTestsFromTargetedImportScan(changedPath, cwd) {

10991130

seen.add(importer);

11001131

if (testFiles.has(importer)) {

11011132

targets.push(importer);

1133+

continue;

11021134

}

11031135

queue.push(importer);

11041136

}

@@ -1323,6 +1355,13 @@ function resolveSiblingTestTarget(changedPath, cwd) {

13231355

return fs.existsSync(path.join(cwd, sibling)) ? sibling : null;

13241356

}

132513571358+

function shouldRouteChangedTargetWithoutImportGraph(changedPath) {

1359+

return (

1360+

changedPath.endsWith(".live.test.ts") ||

1361+

(changedPath.startsWith("ui/src/") && !changedPath.startsWith("ui/src/ui/"))

1362+

);

1363+

}

1364+13261365

function resolvePreciseChangedTestTargets(changedPath, options) {

13271366

const cwd = options.cwd ?? process.cwd();

13281367

const mappedTargets =

@@ -1337,6 +1376,12 @@ function resolvePreciseChangedTestTargets(changedPath, options) {

13371376

if (siblingTest) {

13381377

return [siblingTest];

13391378

}

1379+

if (BROAD_ONLY_TEST_HELPERS.has(changedPath)) {

1380+

return null;

1381+

}

1382+

if (shouldRouteChangedTargetWithoutImportGraph(changedPath)) {

1383+

return changedPath.startsWith("ui/src/") ? [changedPath] : null;

1384+

}

13401385

if (/^(?:src|test\/helpers|extensions|packages|ui\/src|ui\/config)\//u.test(changedPath)) {

13411386

const affectedTests = resolveAffectedTestsFromImportGraph(changedPath, cwd);

13421387

if (affectedTests.length > 0) {

@@ -1415,12 +1460,15 @@ function classifyTarget(arg, cwd) {

14151460

if (configTargetKind) {

14161461

return configTargetKind;

14171462

}

1418-

if (resolveUnitFastTestIncludePattern(relative)) {

1419-

return "unitFast";

1420-

}

14211463

if (isControlUiE2eTarget(relative)) {

14221464

return "uiE2e";

14231465

}

1466+

if (relative.startsWith("ui/src/")) {

1467+

if (isUnitUiTestTarget(relative)) {

1468+

return "unitUi";

1469+

}

1470+

return "ui";

1471+

}

14241472

if (relative.startsWith("src/tui/tui-pty-")) {

14251473

return "tuiPty";

14261474

}

@@ -1434,6 +1482,16 @@ function classifyTarget(arg, cwd) {

14341482

) {

14351483

return "e2e";

14361484

}

1485+

const channelContractKind = resolveChannelContractTargetKind(relative);

1486+

if (channelContractKind) {

1487+

return channelContractKind;

1488+

}

1489+

if (relative.startsWith("src/plugins/contracts/")) {

1490+

return "contractsPlugin";

1491+

}

1492+

if (resolveUnitFastTestIncludePattern(relative)) {

1493+

return "unitFast";

1494+

}

14371495

if (relative === "extensions") {

14381496

return "extensionFull";

14391497

}

@@ -1508,13 +1566,6 @@ function classifyTarget(arg, cwd) {

15081566

}

15091567

return isProviderExtensionRoot(extensionRoot) ? "extensionProvider" : "extension";

15101568

}

1511-

const channelContractKind = resolveChannelContractTargetKind(relative);

1512-

if (channelContractKind) {

1513-

return channelContractKind;

1514-

}

1515-

if (relative.startsWith("src/plugins/contracts/")) {

1516-

return "contractsPlugin";

1517-

}

15181569

if (isChannelSurfaceTestFile(relative)) {

15191570

return "channel";

15201571

}

@@ -1599,15 +1650,6 @@ function classifyTarget(arg, cwd) {

15991650

if (relative.startsWith("src/plugins/")) {

16001651

return "plugin";

16011652

}

1602-

if (relative.startsWith("ui/src/")) {

1603-

if (isControlUiE2eTarget(relative)) {

1604-

return "uiE2e";

1605-

}

1606-

if (isUnitUiTestTarget(relative)) {

1607-

return "unitUi";

1608-

}

1609-

return "ui";

1610-

}

16111653

if (relative.startsWith("src/utils/")) {

16121654

return "utils";

16131655

}