feat(FN-2232): check mailbox on every heartbeat run

- Fetch unread inbox messages whenever messageStore is available, not only wake-on-message triggers
- Include pending messages in execution prompts for task and no-task heartbeat runs across timer, assignment, and on-demand sources
- Extend heartbeat messaging tests to cover run-wide mailbox prefetch and read-marking behavior
- Document heartbeat mailbox checking semantics and messageResponseMode behavior in agents docs
- Replace Header mailbox badge class with existing header-badge style token
This commit is contained in:
Fusion
2026-04-22 02:22:52 -07:00
committed by gsxdsm
parent e2b69409be
commit 3afa378594
5 changed files with 273 additions and 34 deletions

View File

@@ -85,28 +85,32 @@ describe("build-exe", () => {
expect(existsSync(join(cliRoot, "dist", "package.json"))).toBe(false);
});
it("binary runs --help without a co-located package.json", () => {
const { binary, dir, cleanup } = createIsolatedDir();
try {
// Verify no package.json in the isolated dir
expect(existsSync(join(dir, "package.json"))).toBe(false);
it(
"binary runs --help without a co-located package.json",
() => {
const { binary, dir, cleanup } = createIsolatedDir();
try {
// Verify no package.json in the isolated dir
expect(existsSync(join(dir, "package.json"))).toBe(false);
const result = spawnSync(binary, ["--help"], {
encoding: "utf-8",
timeout: 15_000,
});
if (hasKnownBunSqliteLimitation(result)) {
return;
const result = spawnSync(binary, ["--help"], {
encoding: "utf-8",
timeout: 15_000,
});
if (hasKnownBunSqliteLimitation(result)) {
return;
}
expect(result.status).toBe(0);
expect(result.stdout).toContain("fn — AI-orchestrated task board");
expect(result.stdout).toContain("dashboard");
expect(result.stdout).toContain("task create");
expect(result.stdout).toContain("task list");
} finally {
cleanup();
}
expect(result.status).toBe(0);
expect(result.stdout).toContain("fn — AI-orchestrated task board");
expect(result.stdout).toContain("dashboard");
expect(result.stdout).toContain("task create");
expect(result.stdout).toContain("task list");
} finally {
cleanup();
}
});
},
20_000,
);
it("binary runs 'task list' without crashing", () => {
const { binary, cleanup } = createIsolatedDir();