Files
tutti/packages/agent/gui/shared/agentConversation/planImplementationAwaiting.spec.ts
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

191 lines
5.1 KiB
TypeScript

import {
normalizeAgentActivitySession,
type AgentActivitySessionCapabilities,
type AgentActivityTurn
} from "@tutti-os/agent-activity-core";
import { describe, expect, it } from "vitest";
import { createTestAgentSessionEngine } from "../testing/createTestAgentSessionEngine";
import {
consumerAwaitingPlanImplementation,
selectRootAgentSessionIdsAwaitingPlanImplementation
} from "./planImplementationAwaiting";
describe("planImplementationAwaiting", () => {
it("matches a settled plan turn that still needs implementation confirmation", () => {
expect(
consumerAwaitingPlanImplementation({
capabilities: planCapabilities(),
dismissed: false,
latestTurn: settledPlanTurn("turn-plan"),
messages: [
{
turnId: "turn-plan",
occurredAtUnixMs: 20,
payload: { messageKind: "plan" }
}
]
})
).toBe(true);
});
it("fails closed for dismissals, missing plan messages, or explicit capability denial", () => {
const messages = [
{
turnId: "turn-plan",
occurredAtUnixMs: 20,
payload: { messageKind: "plan" }
}
];
expect(
consumerAwaitingPlanImplementation({
capabilities: planCapabilities(),
dismissed: true,
latestTurn: settledPlanTurn("turn-plan"),
messages
})
).toBe(false);
expect(
consumerAwaitingPlanImplementation({
capabilities: planCapabilities({ planImplementation: false }),
dismissed: false,
latestTurn: settledPlanTurn("turn-plan"),
messages
})
).toBe(false);
expect(
consumerAwaitingPlanImplementation({
capabilities: planCapabilities({ planMode: false }),
dismissed: false,
latestTurn: settledPlanTurn("turn-plan"),
messages
})
).toBe(false);
expect(
consumerAwaitingPlanImplementation({
capabilities: planCapabilities(),
dismissed: false,
latestTurn: settledPlanTurn("turn-plan"),
messages: [
{
turnId: "turn-plan",
occurredAtUnixMs: 20,
payload: { messageKind: "text" }
}
]
})
).toBe(false);
});
it("keeps waiting when session capabilities are not projected yet", () => {
expect(
consumerAwaitingPlanImplementation({
capabilities: null,
dismissed: false,
latestTurn: settledPlanTurn("turn-plan"),
messages: [
{
turnId: "turn-plan",
occurredAtUnixMs: 20,
payload: { messageKind: "plan" }
}
]
})
).toBe(true);
});
it("selects every root session awaiting plan implementation from engine state", () => {
const engine = createTestAgentSessionEngine("workspace-1");
engine.dispatch({
type: "session/snapshotReceived",
sessions: [
normalizeAgentActivitySession({
activeTurnId: null,
agentSessionId: "plan-session",
capabilities: planCapabilities(),
cwd: "/workspace",
latestTurn: settledPlanTurn("turn-plan", "plan-session"),
latestTurnInteractions: [],
pendingInteractions: [],
provider: "codex",
title: "Plan session",
workspaceId: "workspace-1"
}),
normalizeAgentActivitySession({
activeTurnId: null,
agentSessionId: "idle-session",
capabilities: planCapabilities(),
cwd: "/workspace",
latestTurnInteractions: [],
pendingInteractions: [],
provider: "codex",
title: "Idle session",
workspaceId: "workspace-1"
})
]
});
engine.dispatch({
type: "message/snapshotReceived",
messages: [
{
agentSessionId: "plan-session",
kind: "message",
messageId: "plan-message",
occurredAtUnixMs: 20,
payload: { messageKind: "plan" },
role: "agent",
turnId: "turn-plan",
version: 1,
workspaceId: "workspace-1"
}
]
});
expect(
selectRootAgentSessionIdsAwaitingPlanImplementation(engine.getSnapshot())
).toEqual(["plan-session"]);
});
});
function settledPlanTurn(
turnId: string,
agentSessionId = "session-1"
): AgentActivityTurn {
return {
turnId,
agentSessionId,
origin: "user_prompt",
phase: "settled",
outcome: "completed",
startedAtUnixMs: 10,
settledAtUnixMs: 20,
updatedAtUnixMs: 20
};
}
function planCapabilities(
overrides: Partial<AgentActivitySessionCapabilities> = {}
): AgentActivitySessionCapabilities {
return {
imageInput: false,
modelImageInputRequired: false,
modelPlanBinding: false,
modelSwitch: false,
skills: false,
compact: false,
tokenUsage: false,
rateLimits: false,
planMode: true,
interrupt: false,
activeTurnGuidance: false,
browserUse: false,
computerUse: false,
goalPause: false,
planImplementation: true,
permissionModeChangeDuringTurn: false,
permissionModeChangeDeferred: false,
review: false,
resumeRunningTurn: false,
...overrides
};
}