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

推荐订阅源

Google DeepMind News
Google DeepMind News
C
Comments on: Blog
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
Martin Fowler
Martin Fowler
A
About on SuperTechFans
H
Help Net Security
美团技术团队
I
InfoQ
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
I
Intezer
Microsoft Azure Blog
Microsoft Azure Blog
T
ThreatConnect
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Spread Privacy
Spread Privacy
Know Your Adversary
Know Your Adversary
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
T
Tenable Blog
爱范儿
爱范儿
F
Full Disclosure
L
Lohrmann on Cybersecurity
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
P
Privacy International News Feed
T
True Tiger Recordings
O
OpenAI News
MyScale Blog
MyScale Blog
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
Y
Y Combinator Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
N
News | PayPal Newsroom
T
Tailwind CSS Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
Google Online Security Blog
Google Online Security Blog

Recent Commits to openclaw:main

fix(e2e): bound kitchen sink log scans · openclaw/openclaw@4d099c3 fix(qa): force Matrix mention progress search · openclaw/openclaw@e2f6734 Deprecate memory-specific embedding provider registration (#85072) · openclaw/openclaw@c9d4f7e fix(ci): bound real behavior proof API waits · openclaw/openclaw@4a8d89f fix(gateway): reject no-auth tailscale exposure · openclaw/openclaw@dc5954b fix(agents): avoid false Codex runtime live switches perf(gateway): trust current metadata lifecycle cache chore(release): update appcast for 2026.5.26 · openclaw/openclaw@c95b51f refactor: move channel message sdk compat into core · openclaw/openclaw@8e5183c ci(release): accept main full-validation proof · openclaw/openclaw@1e67af7 ci(release): harden postpublish verification · openclaw/openclaw@ef17bba fix(cli): reject malformed gateway timeouts · openclaw/openclaw@e61f175 fix(dev): bound issue labeler OpenAI waits fix(openai): normalize responses replay tool ids fix(status): keep default status fast path bounded · openclaw/openclaw@7121f67 feat(embeddings): add OpenAI-compatible core provider (#85269) · openclaw/openclaw@4d89e00 Make Telegram sendMessage actions durable (#87261) · openclaw/openclaw@f3fe48e fix(dev): bound gh-read API waits · openclaw/openclaw@5fb57b5 fix(vllm): wire configured thinking params · openclaw/openclaw@e153ece fix(agents): honor OpenAI-compatible cache retention · openclaw/openclaw@3e351b7 fix: require admin for node device approvals · openclaw/openclaw@517ce3d fix(qa): create Matrix mention progress target · openclaw/openclaw@983759b fix(dev): bound Claude usage debug fetches · openclaw/openclaw@d09eb43 fix(cli): validate message numeric options · openclaw/openclaw@5fdaf6b perf(gateway): cache current plugin metadata fingerprints · openclaw/openclaw@7efbaf7 fix(dev): bound realtime smoke HTTP waits · openclaw/openclaw@e2cebe8 fix(qa): accept Matrix tool error final races · openclaw/openclaw@a275ce8 fix(qa): cap Matrix readiness polling · openclaw/openclaw@099b0f8 fix(cli): reject loose webhook and directory numeric options · openclaw/openclaw@0889106 fix(cli): validate directory limits before resolution · openclaw/openclaw@513a223 fix(agents): keep runtime context before active user turns · openclaw/openclaw@0503853 fix(qa): stop Matrix phases after run timeout · openclaw/openclaw@f4b9d24 fix(agents): strip stale Anthropic thinking · openclaw/openclaw@66965f5 fix(doctor): validate bundled MCP tool schemas · openclaw/openclaw@a02fe52 fix(qa): kill timed out Matrix CLI runs · openclaw/openclaw@b8fc2f6 fix(dev): bound discord smoke waits · openclaw/openclaw@545ad7f chore(pixverse): publish as external plugin · openclaw/openclaw@5366209 feat(pixverse): add api region selection · openclaw/openclaw@b3083de feat(pixverse): add video generation provider · openclaw/openclaw@c183705 fix(qa): tolerate fast Matrix tool replies · openclaw/openclaw@a46e839 refactor: remove channel turn runtime aliases · openclaw/openclaw@6c37402 fix(test): bound qa otel receiver bodies · openclaw/openclaw@83ab0ba fix(lint): clean manifest registry installed checks · openclaw/openclaw@fd648ed fix(scripts): resolve npm package candidates through npm runner · openclaw/openclaw@7a7d9de fix(qa): hide Matrix tool progress marker in workspace · openclaw/openclaw@42f3550 fix(usage): forward cached token usage in chat completions (#82062) · openclaw/openclaw@12e5876 test(codex): align provider claim expectation · openclaw/openclaw@42387af perf(gateway): cache stable plugin index fingerprints · openclaw/openclaw@2babe03 fix(test): scan kitchen rpc readiness logs incrementally · openclaw/openclaw@1d4537a fix(test): fail startup bench on bad samples · openclaw/openclaw@8c6da93 fix(onboard): preserve agents.list and bindings on rerun · openclaw/openclaw@bbdff39 fix: send bare direct Anthropic model ids · openclaw/openclaw@aa0a290 fix(deepinfra): load all DeepInfra models when user wants to browse t… fix(package): honor dist package exclusions in inventory · openclaw/openclaw@296fbde fix(qa): harden Matrix tool progress scenario · openclaw/openclaw@32b3fb6 fix(package): match npm globstar exclusions · openclaw/openclaw@f4bcd61 fix: preserve channel runResolved mock compatibility · openclaw/openclaw@c89298f fix(test): bound config reload log polling · openclaw/openclaw@329dad2 fix(lint): preserve JSONL parse cause · openclaw/openclaw@d6949d5 test(e2e): preserve macos smoke entrypoint path · openclaw/openclaw@5eba765 fix(test): await mcp timeout cleanup · openclaw/openclaw@109ba23 fix(test): harden mcp channel ws timeout · openclaw/openclaw@a4a75a8 fix(test): harden gateway network ws timeout · openclaw/openclaw@e50b20f fix(agents/harness): validate forced plugin harness support before pi… · openclaw/openclaw@730ac1a fix(test): bound codex media path log polling · openclaw/openclaw@40a2600 test: align extension inbound context assertions · openclaw/openclaw@98c0ad8 fix(install): skip Homebrew until macOS packages need it · openclaw/openclaw@527b7c2 fix(ci): bound additional boundary checks · openclaw/openclaw@351aac9 fix(release): reject empty beta smoke runs · openclaw/openclaw@4dfc2cf fix(build): cap tsdown heap in containers · openclaw/openclaw@e8dde30 fix(docker): skip declarations in runtime packages · openclaw/openclaw@cc662ba fix(package): omit unpacked test helpers from inventory · openclaw/openclaw@6c42fea fix(crabbox): reinitialize invalid changed-gate git dirs · openclaw/openclaw@ecdc925 fix(lint): shard core lint checks · openclaw/openclaw@1ba4448 fix(lint): cap oxlint helper memory locally · openclaw/openclaw@8caa44f fix(lint): split source lint shards · openclaw/openclaw@158bc69 fix(crabbox): full-sync local sparse container runs · openclaw/openclaw@b3e3b1b fix(test): enable live cache script gates · openclaw/openclaw@72c6813 fix(test): reject unknown live media providers · openclaw/openclaw@51dd548 fix(cli): reject loose model and gateway numeric options · openclaw/openclaw@6b391ef refactor: centralize inbound supplemental context · openclaw/openclaw@1507a97 fix(test): reject empty gateway cpu runs · openclaw/openclaw@ad3d197 fix(test): fail empty plugin gauntlet runs · openclaw/openclaw@b460ee4 fix: load Claude CLI OAuth for PI auth profiles (#87167) · openclaw/openclaw@cc704ca fix(agents): ignore failed subagent placeholders fix(agents): report approval resolutions in bridge mode · openclaw/openclaw@88bbc5b fix(qa): keep fallback delivery on latest targets fix(agents): preserve bridge hook context · openclaw/openclaw@2c3190d fix(qa): close remaining mock qa e2e regressions · openclaw/openclaw@14198a1 fix(qa): isolate mock bridge hook state · openclaw/openclaw@35248be fix(qa): stabilize mock QA scenario contracts · openclaw/openclaw@81c1892 fix(agents): classify direct fallback targets by channel grammar · openclaw/openclaw@79f7b93 fix(qa): scope mock image prompts to latest turn · openclaw/openclaw@c2d059d fix(agents): suppress Write/Edit failed warning on response-timeout f… · openclaw/openclaw@7e702bb fix(cron): surface classified run failure causes · openclaw/openclaw@3104f36 fix(test): fail empty extension test requests · openclaw/openclaw@57b1c0b fix(cli): reject loose numeric options · openclaw/openclaw@c95d348 docs(providers/openai): clarify OpenAI Realtime Platform credits · openclaw/openclaw@717003a fix(codex): keep attempt watchdog for queued terminal turns · openclaw/openclaw@ca990f2 fix(qqbot): gate fallback approval buttons (#87154) · openclaw/openclaw@08a73db
fix(agents): separate heartbeat runtime template (#85416) · openclaw/openclaw@75221e0
hxy91819 · 2026-05-27 · via Recent Commits to openclaw:main

@@ -3,9 +3,11 @@ import os from "node:os";

33

import path from "node:path";

44

import { pathToFileURL } from "node:url";

55

import { afterEach, describe, expect, it } from "vitest";

6+

import { isHeartbeatContentEffectivelyEmpty } from "../auto-reply/heartbeat.js";

67

import {

78

resetWorkspaceTemplateDirCache,

89

resolveWorkspaceTemplateDir,

10+

resolveWorkspaceTemplateSearchDirs,

911

} from "./workspace-templates.js";

10121113

const tempDirs: string[] = [];

@@ -28,9 +30,9 @@ describe("resolveWorkspaceTemplateDir", () => {

2830

const root = await makeTempRoot();

2931

await fs.writeFile(path.join(root, "package.json"), JSON.stringify({ name: "openclaw" }));

303231-

const templatesDir = path.join(root, "docs", "reference", "templates");

33+

const templatesDir = path.join(root, "src", "agents", "templates");

3234

await fs.mkdir(templatesDir, { recursive: true });

33-

await fs.writeFile(path.join(templatesDir, "AGENTS.md"), "# ok\n");

35+

await fs.writeFile(path.join(templatesDir, "HEARTBEAT.md"), "# ok\n");

34363537

const distDir = path.join(root, "dist");

3638

await fs.mkdir(distDir, { recursive: true });

@@ -40,7 +42,7 @@ describe("resolveWorkspaceTemplateDir", () => {

4042

expect(resolved).toBe(templatesDir);

4143

});

424443-

it("falls back to package-root docs path when templates directory is missing", async () => {

45+

it("falls back to package-root runtime path when templates directory is missing", async () => {

4446

const root = await makeTempRoot();

4547

await fs.writeFile(path.join(root, "package.json"), JSON.stringify({ name: "openclaw" }));

4648

@@ -49,6 +51,42 @@ describe("resolveWorkspaceTemplateDir", () => {

4951

const moduleUrl = pathToFileURL(path.join(distDir, "model-selection.mjs")).toString();

50525153

const resolved = await resolveWorkspaceTemplateDir({ cwd: distDir, moduleUrl });

52-

expect(path.normalize(resolved)).toBe(path.resolve("docs", "reference", "templates"));

54+

expect(path.normalize(resolved)).toBe(path.resolve("src", "agents", "templates"));

55+

});

56+57+

it("includes docs templates as secondary search roots", async () => {

58+

const root = await makeTempRoot();

59+

await fs.writeFile(path.join(root, "package.json"), JSON.stringify({ name: "openclaw" }));

60+61+

const runtimeTemplatesDir = path.join(root, "src", "agents", "templates");

62+

const docsTemplatesDir = path.join(root, "docs", "reference", "templates");

63+

await fs.mkdir(runtimeTemplatesDir, { recursive: true });

64+

await fs.mkdir(docsTemplatesDir, { recursive: true });

65+66+

const distDir = path.join(root, "dist");

67+

await fs.mkdir(distDir, { recursive: true });

68+

const moduleUrl = pathToFileURL(path.join(distDir, "model-selection.mjs")).toString();

69+70+

const resolved = await resolveWorkspaceTemplateSearchDirs({ cwd: distDir, moduleUrl });

71+

expect(resolved.slice(0, 2)).toEqual([runtimeTemplatesDir, docsTemplatesDir]);

72+

});

73+74+

it("keeps runtime templates free of docs frontmatter", async () => {

75+

const runtimeTemplatesDir = path.resolve("src", "agents", "templates");

76+

const entries = await fs.readdir(runtimeTemplatesDir);

77+

const markdownFiles = entries.filter((entry) => entry.endsWith(".md"));

78+79+

expect(markdownFiles).toContain("HEARTBEAT.md");

80+

for (const fileName of markdownFiles) {

81+

const content = await fs.readFile(path.join(runtimeTemplatesDir, fileName), "utf-8");

82+

expect(content.startsWith("---")).toBe(false);

83+

}

84+

});

85+86+

it("keeps the runtime HEARTBEAT.md template effectively empty", async () => {

87+

const runtimeTemplatesDir = path.resolve("src", "agents", "templates");

88+

const content = await fs.readFile(path.join(runtimeTemplatesDir, "HEARTBEAT.md"), "utf-8");

89+90+

expect(isHeartbeatContentEffectivelyEmpty(content)).toBe(true);

5391

});

5492

});