Files
tutti/packages/agent/host/stale_turn_settlement_test.go
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

65 lines
2.5 KiB
Go

package agenthost
import (
"context"
"testing"
storesqlite "github.com/tutti-os/tutti/packages/agent/store-sqlite"
)
type recordingStaleTurnFailureObserver struct {
failures []TerminalFailure
}
func (o *recordingStaleTurnFailureObserver) ObserveTerminalFailure(_ context.Context, failure TerminalFailure) {
o.failures = append(o.failures, failure)
}
func TestStaleTurnSettlementDeltaDoesNotReportInterruptedAsFailure(t *testing.T) {
delta := StaleTurnSettlementDelta([]storesqlite.StaleTurnSettlement{
{
WorkspaceID: "ws-1", AgentSessionID: "session-1", TurnID: "turn-stale",
Turn: storesqlite.Turn{
WorkspaceID: "ws-1", AgentSessionID: "session-1", TurnID: "turn-stale",
Phase: storesqlite.TurnPhaseSettled, Outcome: storesqlite.TurnOutcomeInterrupted,
Origin: storesqlite.TurnOriginUserPrompt, Backfilled: true,
},
},
{WorkspaceID: "ws-1", AgentSessionID: "session-2", TurnID: ""},
})
if len(delta.RootTurnsSettled) != 1 {
t.Fatalf("root turns settled = %#v, want only the settlement carrying a turn", delta.RootTurnsSettled)
}
settled := delta.RootTurnsSettled[0]
if settled.Turn.Phase != storesqlite.TurnPhaseSettled || settled.Turn.Outcome != storesqlite.TurnOutcomeInterrupted {
t.Fatalf("settled turn = %#v, want settled phase with interrupted outcome", settled.Turn)
}
if !settled.StartupReconciled {
t.Fatalf("settled turn = %#v, want the startup reconciliation marker", settled)
}
if settled.Turn.Origin != storesqlite.TurnOriginUserPrompt || !settled.Turn.Backfilled {
t.Fatalf("settled turn provenance = %#v, want canonical origin and backfilled marker", settled.Turn)
}
observer := &recordingStaleTurnFailureObserver{}
ObserveTerminalFailuresFromDelta(context.Background(), observer, delta)
if len(observer.failures) != 0 {
t.Fatalf("terminal failures = %#v, want interrupted settlement excluded", observer.failures)
}
}
func TestStaleTurnSettlementDeltaKeepsChildSessionIdentityFromStore(t *testing.T) {
delta := StaleTurnSettlementDelta([]storesqlite.StaleTurnSettlement{
{WorkspaceID: "ws-1", AgentSessionID: "child-1", TurnID: "turn-stale", IsChildSession: true},
})
if len(delta.RootTurnsSettled) != 1 || !delta.RootTurnsSettled[0].IsChildSession {
t.Fatalf("root turns settled = %#v, want persisted child identity", delta.RootTurnsSettled)
}
observer := &recordingStaleTurnFailureObserver{}
ObserveTerminalFailuresFromDelta(context.Background(), observer, delta)
if len(observer.failures) != 0 {
t.Fatalf("terminal failures = %#v, want interrupted child settlement excluded", observer.failures)
}
}