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

102 lines
3.6 KiB
Go

package storesqlite
import (
"testing"
"github.com/tutti-os/tutti/packages/agent/store-sqlite/canonical"
)
func TestSplitSessionRuntimeContextSeparatesPublicMetadataFromProviderPrivateState(t *testing.T) {
metadata, capabilities, internal, err := splitSessionRuntimeContext(map[string]any{
"visible": false, "imported": true,
"capabilities": []any{"planMode", "interrupt"},
"usage": map[string]any{
"contextWindow": map[string]any{"usedTokens": 33_168, "totalTokens": 400_000},
"quotas": []any{map[string]any{
"quotaType": "weekly", "percentRemaining": 75.5, "resetsAtUnixMs": 1_750_003_600_000,
}},
},
"goal": map[string]any{"objective": "ship", "status": "active"},
"providerConfig": map[string]any{"threadId": "thread-1"},
})
if err != nil {
t.Fatal(err)
}
if metadata.Visible || !metadata.Imported || capabilities == nil || len(capabilities.Values) != 2 ||
metadata.Usage == nil || metadata.Usage.ContextWindow == nil || metadata.Usage.ContextWindow.UsedTokens != 33_168 ||
metadata.Goal == nil || metadata.Goal.Objective != "ship" {
t.Fatalf("metadata=%#v", metadata)
}
providerConfig, _ := internal["providerConfig"].(map[string]any)
if providerConfig["threadId"] != "thread-1" {
t.Fatalf("internal=%#v", internal)
}
for _, key := range sessionMetadataRuntimeContextKeys {
if _, leaked := internal[key]; leaked {
t.Fatalf("typed key %q leaked into internal context %#v", key, internal)
}
}
}
func TestSessionMetadataCapabilitySnapshotBackwardCompatibility(t *testing.T) {
_, legacyUnknown, err := unmarshalSessionMetadata(`{"visible":true,"imported":false,"capabilities":[]}`)
if err != nil {
t.Fatal(err)
}
if legacyUnknown != nil {
t.Fatalf("legacy empty capabilities = %#v, want unknown", legacyUnknown)
}
_, legacyReported, err := unmarshalSessionMetadata(`{"visible":true,"imported":false,"capabilities":["goalPause"]}`)
if err != nil {
t.Fatal(err)
}
if legacyReported == nil || len(legacyReported.Values) != 1 || legacyReported.Values[0] != "goalPause" {
t.Fatalf("legacy non-empty capabilities = %#v, want reported", legacyReported)
}
raw, err := marshalSessionMetadata(SessionMetadata{Visible: true}, canonical.NewCapabilitySnapshot(nil))
if err != nil {
t.Fatal(err)
}
_, reportedEmpty, err := unmarshalSessionMetadata(raw)
if err != nil {
t.Fatal(err)
}
if reportedEmpty == nil || len(reportedEmpty.Values) != 0 {
t.Fatalf("reported empty capabilities = %#v", reportedEmpty)
}
}
func TestSplitSessionRuntimeContextUsesClosedMetadataVocabularies(t *testing.T) {
metadata, capabilities, internal, err := splitSessionRuntimeContext(map[string]any{
"capabilities": []any{" planMode ", "planMode", "provider-private"},
"goal": map[string]any{"objective": "ship", "status": "usageLimited"},
})
if err != nil {
t.Fatal(err)
}
if capabilities == nil || len(capabilities.Values) != 1 || capabilities.Values[0] != "planMode" ||
metadata.Goal.Status != "usageLimited" {
t.Fatalf("metadata=%#v", metadata)
}
if len(internal) != 0 {
t.Fatalf("internal context = %#v, want empty", internal)
}
}
func TestDecodeSessionGoalUsesCanonicalValidation(t *testing.T) {
goal, err := DecodeSessionGoal(map[string]any{
"objective": "ship", "status": "paused", "startedAtUnixMs": 10, "iterations": 2,
})
if err != nil {
t.Fatal(err)
}
if goal.Objective != "ship" || goal.Status != "paused" || goal.StartedAtUnixMS != 10 || goal.Iterations != 2 {
t.Fatalf("goal=%#v", goal)
}
if _, err := DecodeSessionGoal(map[string]any{"objective": "ship", "status": "unknown"}); err == nil {
t.Fatal("DecodeSessionGoal() error=nil, want closed status validation")
}
}