
















@@ -1435,6 +1435,8 @@ tasks:
14351435 prompt: Check calendar changes
1436143614371437Some global directive after tasks.
1438+1439+- Keep this top-level directive too.
14381440`,
14391441"utf-8",
14401442);
@@ -1481,8 +1483,80 @@ Some global directive after tasks.
14811483expect(calledCtx.Body).toContain("# Keep this header");
14821484expect(calledCtx.Body).toContain("Remember escalation policy.");
14831485expect(calledCtx.Body).toContain("Some global directive after tasks.");
1486+expect(calledCtx.Body).toContain("- Keep this top-level directive too.");
1487+expect(calledCtx.Body).not.toContain("name: inbox");
1488+expect(calledCtx.Body).not.toContain("name: calendar");
1489+replySpy.mockReset();
1490+});
1491+1492+it("strips documented unindented task entries while keeping following top-level bullets", async () => {
1493+const tmpDir = await createCaseDir("openclaw-hb-unindented-tasks-context");
1494+const storePath = path.join(tmpDir, "sessions.json");
1495+const workspaceDir = path.join(tmpDir, "workspace");
1496+await fs.mkdir(workspaceDir, { recursive: true });
1497+await fs.writeFile(
1498+path.join(workspaceDir, "HEARTBEAT.md"),
1499+`# Keep this header
1500+1501+tasks:
1502+- name: inbox
1503+ interval: 5m
1504+ prompt: Check urgent inbox items
1505+1506+- name: calendar
1507+ interval: 5m
1508+ prompt: Check calendar changes
1509+1510+- Keep this top-level directive after tasks.
1511+`,
1512+"utf-8",
1513+);
1514+1515+const cfg: OpenClawConfig = {
1516+agents: {
1517+defaults: {
1518+workspace: workspaceDir,
1519+heartbeat: { every: "5m", target: "whatsapp" },
1520+},
1521+},
1522+channels: { whatsapp: { allowFrom: ["*"] } },
1523+session: { store: storePath },
1524+};
1525+await fs.writeFile(
1526+storePath,
1527+JSON.stringify({
1528+[resolveMainSessionKey(cfg)]: {
1529+sessionId: "sid",
1530+updatedAt: Date.now(),
1531+lastChannel: "whatsapp",
1532+lastTo: "120363401234567890@g.us",
1533+},
1534+}),
1535+);
1536+const replySpy = vi.fn().mockResolvedValue({ text: "Handled due heartbeat tasks" });
1537+const sendWhatsApp = vi
1538+.fn<
1539+(to: string, text: string, opts?: unknown) => Promise<{ messageId: string; toJid: string }>
1540+>()
1541+.mockResolvedValue({ messageId: "m1", toJid: "jid" });
1542+1543+const res = await runHeartbeatOnce({
1544+ cfg,
1545+deps: createHeartbeatDeps(sendWhatsApp, { getReplyFromConfig: replySpy }),
1546+});
1547+1548+expect(res.status).toBe("ran");
1549+expect(replySpy).toHaveBeenCalledTimes(1);
1550+const calledCtx = replySpy.mock.calls[0]?.[0] as { Body?: string };
1551+expect(calledCtx.Body).toContain("- inbox: Check urgent inbox items");
1552+expect(calledCtx.Body).toContain("- calendar: Check calendar changes");
1553+expect(calledCtx.Body).toContain("Additional context from HEARTBEAT.md");
1554+expect(calledCtx.Body).toContain("# Keep this header");
1555+expect(calledCtx.Body).toContain("- Keep this top-level directive after tasks.");
14841556expect(calledCtx.Body).not.toContain("name: inbox");
14851557expect(calledCtx.Body).not.toContain("name: calendar");
1558+expect(calledCtx.Body).not.toContain("interval: 5m");
1559+expect(calledCtx.Body).not.toContain("prompt: Check urgent");
14861560replySpy.mockReset();
14871561});
14881562此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。