Files
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

95 lines
3.5 KiB
Go

package agentruntime
import (
"context"
"testing"
agentsessionstore "github.com/tutti-os/tutti/packages/agent/daemon/activity"
"github.com/tutti-os/tutti/packages/agent/store-sqlite/canonical"
)
type captureActivityClient struct {
stateInputs []canonical.ReportSessionStateInput
messagesInputs []canonical.ReportSessionMessagesInput
rejectMessages bool
}
func (c *captureActivityClient) ReportSessionState(_ context.Context, input canonical.ReportSessionStateInput) (canonical.ReportSessionStateReply, error) {
c.stateInputs = append(c.stateInputs, input)
return canonical.ReportSessionStateReply{Accepted: true}, nil
}
func (c *captureActivityClient) ReportSessionMessages(_ context.Context, input canonical.ReportSessionMessagesInput) (canonical.ReportSessionMessagesReply, error) {
c.messagesInputs = append(c.messagesInputs, input)
if c.rejectMessages {
return canonical.ReportSessionMessagesReply{}, nil
}
return canonical.ReportSessionMessagesReply{AcceptedCount: len(input.Updates)}, nil
}
func TestQueuedReporterRejectsUnacceptedControlActivity(t *testing.T) {
t.Parallel()
client := &captureActivityClient{rejectMessages: true}
reporter := QueuedReporter{ClientProvider: func() ActivityClient { return client }}
err := reporter.Report(context.Background(), agentsessionstore.ReportActivityInput{
WorkspaceID: "room-1",
Source: canonical.EventSource{Provider: "codex", AgentID: "agent-1"},
SessionAudits: []agentsessionstore.WorkspaceAgentSessionAuditUpdate{{AuditID: "audit-1", Role: "user"}},
})
if err == nil {
t.Fatal("Report accepted an audit rejected by the durable client")
}
}
func TestQueuedReporterCallsClientWithNormalizedRuntimeInput(t *testing.T) {
t.Parallel()
client := &captureActivityClient{}
reporter := QueuedReporter{
ClientProvider: func() ActivityClient {
return client
},
}
err := reporter.Report(context.Background(), agentsessionstore.ReportActivityInput{
WorkspaceID: "room-1",
Source: canonical.EventSource{
Provider: "codex",
AgentID: "agent-1",
},
StatePatches: []agentsessionstore.WorkspaceAgentStatePatch{{
AgentSessionID: "agent-1",
Provider: "codex",
Title: "Task",
}},
MessageUpdates: []agentsessionstore.WorkspaceAgentMessageUpdate{{
AgentSessionID: "agent-1",
MessageID: "message-1",
TurnID: "turn-1",
Role: "assistant",
Kind: "text",
}},
})
if err != nil {
t.Fatalf("Report: %v", err)
}
if len(client.stateInputs) != 1 {
t.Fatalf("state calls = %d, want 1", len(client.stateInputs))
}
if len(client.messagesInputs) != 1 {
t.Fatalf("messages calls = %d, want 1", len(client.messagesInputs))
}
if client.stateInputs[0].Source.SessionOrigin != agentsessionstore.WorkspaceAgentSessionOriginRuntime {
t.Fatalf("state session origin = %q, want runtime", client.stateInputs[0].Source.SessionOrigin)
}
if client.messagesInputs[0].Source.SessionOrigin != agentsessionstore.WorkspaceAgentSessionOriginRuntime {
t.Fatalf("messages session origin = %q, want runtime", client.messagesInputs[0].Source.SessionOrigin)
}
if client.stateInputs[0].Connector == nil || client.stateInputs[0].Connector.ID != "codex" {
t.Fatalf("state connector = %#v, want provider-backed connector", client.stateInputs[0].Connector)
}
if client.messagesInputs[0].Connector == nil || client.messagesInputs[0].Connector.ID != "codex" {
t.Fatalf("messages connector = %#v, want provider-backed connector", client.messagesInputs[0].Connector)
}
}