






















@@ -162,6 +162,14 @@ const loadSessionEntryMock = runtimeMocks.loadSessionEntry;
162162const registerApnsRegistrationVi = runtimeMocks.registerApnsRegistration;
163163const normalizeChannelIdVi = runtimeMocks.normalizeChannelId;
164164165+const execEventHeartbeatOptions = (sessionKey?: string) => ({
166+source: "exec-event",
167+intent: "event",
168+reason: "exec-event",
169+coalesceMs: 0,
170+ ...(sessionKey ? { sessionKey } : {}),
171+});
172+165173function buildCtx(
166174opts: { authorizeNodeSystemRunEvent?: NodeEventContext["authorizeNodeSystemRunEvent"] } = {},
167175): NodeEventContext {
@@ -289,10 +297,7 @@ describe("node exec events", () => {
289297contextKey: "exec:run-1",
290298},
291299);
292-expect(requestHeartbeatMock).toHaveBeenCalledWith({
293-reason: "exec-event",
294-sessionKey: "agent:main:main",
295-});
300+expect(requestHeartbeatMock).toHaveBeenCalledWith(execEventHeartbeatOptions("agent:main:main"));
296301});
297302298303it("rejects exec lifecycle events without a pending node run", async () => {
@@ -383,14 +388,14 @@ describe("node exec events", () => {
383388contextKey: "exec:run-seq",
384389},
385390);
386-expect(requestHeartbeatMock).toHaveBeenNthCalledWith(1, {
387-reason: "exec-event",
388-sessionKey: "agent:main:main",
389-});
390-expect(requestHeartbeatMock).toHaveBeenNthCalledWith(2, {
391-reason: "exec-event",
392-sessionKey: "agent:main:main",
393-});
391+expect(requestHeartbeatMock).toHaveBeenNthCalledWith(
392+1,
393+execEventHeartbeatOptions("agent:main:main"),
394+);
395+expect(requestHeartbeatMock).toHaveBeenNthCalledWith(
396+2,
397+execEventHeartbeatOptions("agent:main:main"),
398+);
394399expect(
395400registry.authorizeSystemRunEvent({
396401nodeId: "node-1",
@@ -424,7 +429,7 @@ describe("node exec events", () => {
424429contextKey: "exec:run-2",
425430},
426431);
427-expect(requestHeartbeatMock).toHaveBeenCalledWith({ reason: "exec-event" });
432+expect(requestHeartbeatMock).toHaveBeenCalledWith(execEventHeartbeatOptions());
428433});
429434430435it("accepts legacy exec.finished events when authorization matches without runId", async () => {
@@ -458,10 +463,7 @@ describe("node exec events", () => {
458463contextKey: "exec",
459464},
460465);
461-expect(requestHeartbeatMock).toHaveBeenCalledWith({
462-reason: "exec-event",
463-sessionKey: "agent:main:main",
464-});
466+expect(requestHeartbeatMock).toHaveBeenCalledWith(execEventHeartbeatOptions("agent:main:main"));
465467});
466468467469it("dedupes duplicate exec.finished events for the same runId on the same session", async () => {
@@ -518,10 +520,9 @@ describe("node exec events", () => {
518520contextKey: "exec:run-2",
519521},
520522);
521-expect(requestHeartbeatMock).toHaveBeenCalledWith({
522-reason: "exec-event",
523-sessionKey: "agent:main:node-node-2",
524-});
523+expect(requestHeartbeatMock).toHaveBeenCalledWith(
524+execEventHeartbeatOptions("agent:main:node-node-2"),
525+);
525526});
526527527528it("suppresses noisy exec.finished success events with empty output", async () => {
@@ -557,7 +558,7 @@ describe("node exec events", () => {
557558expect(text.startsWith("Exec finished (node=node-2 id=run-long, code 0)\n")).toBe(true);
558559expect(text.endsWith("…")).toBe(true);
559560expect(text.length).toBeLessThan(280);
560-expect(requestHeartbeatMock).toHaveBeenCalledWith({ reason: "exec-event" });
561+expect(requestHeartbeatMock).toHaveBeenCalledWith(execEventHeartbeatOptions());
561562});
562563563564it("does not enqueue or wake agent work for exec.denied events", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。