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
65 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|