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

183 lines
5.4 KiB
Go

package tuttimodeexecution_test
import (
"context"
"database/sql"
"fmt"
"testing"
agentactivitybiz "github.com/tutti-os/tutti/packages/agent/store-sqlite"
workspaceissues "github.com/tutti-os/tutti/packages/workspace/issues"
tuttimodeexecutionconformance "github.com/tutti-os/tutti/services/tuttid/service/tuttimodeexecution/conformance"
)
func (driver *sqliteConformanceDriver) SeedLegacyExecution(
ctx context.Context,
input tuttimodeexecutionconformance.LegacyExecutionInput,
) (tuttimodeexecutionconformance.LegacyExecution, error) {
issueID, err := driver.AcceptPlan(ctx, input.Plan)
if err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
switch input.SourceState {
case "active", "tombstoned":
if _, err := driver.store.ReportSessionState(ctx, agentactivitybiz.SessionStateReport{
WorkspaceID: input.Plan.WorkspaceID,
AgentSessionID: input.Plan.SourceSessionID,
Provider: "codex",
Status: "completed",
OccurredAtUnixMS: driver.clock.Now().UnixMilli(),
}); err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
if input.SourceState == "tombstoned" {
if _, err := driver.store.AgentCanonicalStore().DeleteSession(
ctx, input.Plan.WorkspaceID, input.Plan.SourceSessionID,
); err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
}
case "missing":
default:
return tuttimodeexecutionconformance.LegacyExecution{}, fmt.Errorf(
"unsupported legacy source state %q", input.SourceState,
)
}
legacyDB, err := sql.Open("sqlite", driver.dbPath)
if err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
legacyDB.SetMaxOpenConns(1)
defer legacyDB.Close()
if _, err := legacyDB.ExecContext(ctx, `PRAGMA foreign_keys = ON`); err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
if _, err := legacyDB.ExecContext(ctx, `
DELETE FROM workspace_tutti_executions
WHERE workspace_id = ? AND issue_id = ?
`, input.Plan.WorkspaceID, issueID); err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
result := tuttimodeexecutionconformance.LegacyExecution{IssueID: issueID}
if input.RunningTaskID != "" {
result.RunID = "legacy-run:" + issueID + ":" + input.RunningTaskID
run, err := driver.seedLegacyRun(
ctx, input.Plan.WorkspaceID, issueID, input.RunningTaskID, result.RunID,
)
if err != nil {
return tuttimodeexecutionconformance.LegacyExecution{}, err
}
result.RunID = run.RunID
}
return result, nil
}
func (driver *sqliteConformanceDriver) seedLegacyRun(
ctx context.Context,
workspaceID string,
issueID string,
taskID string,
runID string,
) (workspaceissues.Run, error) {
issue, err := driver.store.GetIssue(ctx, workspaceID, issueID)
if err != nil {
return workspaceissues.Run{}, err
}
task, err := driver.store.GetTask(ctx, workspaceID, issueID, taskID)
if err != nil {
return workspaceissues.Run{}, err
}
now := driver.clock.Now().UnixMilli()
run, err := driver.store.CreateRun(ctx, workspaceissues.Run{
RunID: runID,
TaskID: taskID,
IssueID: issueID,
WorkspaceID: workspaceID,
RequesterUserID: "local",
AgentUserID: "local",
AgentTargetID: "local:codex",
AgentSessionID: "legacy-run-session:" + taskID,
AgentProvider: "codex",
ModelPlanID: task.ModelPlanID,
Model: task.Model,
ReasoningIntensity: issue.ExecutionProfile.ReasoningIntensity,
Status: workspaceissues.StatusRunning,
ExecutionDirectory: task.ExecutionDirectory,
CreatedAtUnixMS: now,
StartedAtUnixMS: now,
UpdatedAtUnixMS: now,
})
if err != nil {
return workspaceissues.Run{}, err
}
task.Status = workspaceissues.StatusRunning
task.AcceptanceState = workspaceissues.AcceptanceAgentClaimed
task.AcceptanceSummary = ""
task.LatestRunID = run.RunID
task.UpdatedAtUnixMS = now
if _, err := driver.store.UpdateTask(ctx, task); err != nil {
return workspaceissues.Run{}, err
}
if _, err := driver.store.RecalculateIssueProjection(ctx, workspaceID, issueID); err != nil {
return workspaceissues.Run{}, err
}
return run, nil
}
func (driver *sqliteConformanceDriver) StartupRepairLegacyExecutions(
ctx context.Context,
) error {
legacyDB, err := sql.Open("sqlite", driver.dbPath)
if err != nil {
return err
}
legacyDB.SetMaxOpenConns(1)
defer legacyDB.Close()
if _, err := legacyDB.ExecContext(ctx, `
DELETE FROM tuttid_schema_migrations
WHERE id = 'workspace_tutti_mode_legacy_repair_v5'
`); err != nil {
return err
}
return driver.store.Migrate(ctx)
}
func (driver *sqliteConformanceDriver) SourceSessionState(
ctx context.Context,
workspaceID string,
sessionID string,
) (string, error) {
if _, found, err := driver.store.GetSession(
ctx, workspaceID, sessionID,
); err != nil {
return "", err
} else if found {
return "active", nil
}
deleted, err := driver.store.SessionDeleted(ctx, workspaceID, sessionID)
if err != nil {
return "", err
}
if deleted {
return "tombstoned", nil
}
return "missing", nil
}
func TestMigrationSQLiteServiceConformance(t *testing.T) {
for _, scenario := range tuttimodeexecutionconformance.MigrationCatalog() {
scenario := scenario
t.Run(scenario.Name, func(t *testing.T) {
if err := tuttimodeexecutionconformance.Run(
context.Background(),
newSQLiteConformanceDriver(t),
scenario,
); err != nil {
t.Fatal(err)
}
})
}
}