慣性聚合 高效追讀感興趣之博客、新聞、科技資訊
閱原文 以慣性聚合開啟

推薦訂閱源

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

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): harden postpublish verification · openclaw/openclaw@ef17bba ci(release): accept main full-validation proof · openclaw/openclaw@1e67af7 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): validate directory limits before resolution · openclaw/openclaw@513a223 fix(cli): reject loose webhook and directory numeric options · openclaw/openclaw@0889106 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 feat(pixverse): add video generation provider · openclaw/openclaw@c183705 feat(pixverse): add api region selection · openclaw/openclaw@b3083de chore(pixverse): publish as external plugin · openclaw/openclaw@5366209 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 perf(gateway): cache stable plugin index fingerprints · openclaw/openclaw@2babe03 test(codex): align provider claim expectation · openclaw/openclaw@42387af 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
修(诸器):分离心跳运行模板(#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

});