feat(canvas): 云端 Agent - 完成策略分层、节点能力注册与可解释审批改造

This commit is contained in:
ddCat
2026-09-14 17:58:21 +08:00
parent 4b0e9d8965
commit 01486872c4
65 changed files with 5347 additions and 918 deletions

View File

@@ -11,7 +11,7 @@ import (
"gorm.io/gorm"
)
const CurrentSchemaVersion int64 = 14
const CurrentSchemaVersion int64 = 15
const baselineSchemaChecksum = "sha256:open-ai-canvas-schema-v1-20260830"
const schemaMigrationAppliedAtIndexChecksum = "sha256:schema-migrations-applied-at-index-v2-20260830"
@@ -64,6 +64,9 @@ var schemaMigrations = []migration{
return tx.AutoMigrate(&model.CloudAgentCanvasMutation{})
}},
{version: 14, name: "cloud_agent_recovery_control", checksum: "sha256:cloud-agent-recovery-control-v14", apply: migrateSchemaV14},
{version: 15, name: "agent_profiles", checksum: "sha256:agent-profiles-v15-20260914", apply: func(tx *gorm.DB) error {
return tx.AutoMigrate(&model.AgentProfile{})
}},
}
func migrateSchemaV14(tx *gorm.DB) error {

View File

@@ -32,11 +32,40 @@ func TestMigrateSchemaRecordsAndValidatesVersion(t *testing.T) {
if !db.Migrator().HasIndex(&model.ProjectAssetCandidate{}, "idx_project_asset_candidates_pending_identity") {
t.Fatal("schema migration v3 did not create candidate identity index")
}
if !db.Migrator().HasTable(&model.AgentProfile{}) || !db.Migrator().HasIndex(&model.AgentProfile{}, "idx_agent_profiles_scope") {
t.Fatal("schema migration v15 did not create scoped Agent profiles")
}
if err := MigrateSchema(db); err != nil {
t.Fatalf("migration should be idempotent: %v", err)
}
}
func TestMigrateSchemaV15UpgradesExistingDatabase(t *testing.T) {
db, err := Open(Config{Driver: "sqlite", DSN: "file:migration-agent-profiles-v15?mode=memory&cache=shared"})
if err != nil {
t.Fatal(err)
}
if err := MigrateSchema(db); err != nil {
t.Fatal(err)
}
if err := db.Migrator().DropTable(&model.AgentProfile{}); err != nil {
t.Fatal(err)
}
if err := db.Where("version = ?", 15).Delete(&schemaMigration{}).Error; err != nil {
t.Fatal(err)
}
if err := MigrateSchema(db); err != nil {
t.Fatalf("upgrade from v14: %v", err)
}
if !db.Migrator().HasTable(&model.AgentProfile{}) || !db.Migrator().HasIndex(&model.AgentProfile{}, "idx_agent_profiles_scope") {
t.Fatal("v15 upgrade did not install Agent profile table and scope index")
}
status, err := ReadSchemaStatus(db)
if err != nil || !status.Ready || status.Current != 15 {
t.Fatalf("unexpected upgraded schema status: %+v, %v", status, err)
}
}
func TestMigrateSchemaV8AllowsReusingArchivedLogicalModelCode(t *testing.T) {
db, err := Open(Config{Driver: "sqlite", DSN: "file:migration-logical-model-active-code?mode=memory&cache=shared"})
if err != nil {

View File

@@ -18,6 +18,7 @@ func Models() []any {
return []any{
&model.CloudAgentExecution{},
&model.CloudAgentCanvasMutation{},
&model.AgentProfile{},
&model.User{},
&model.AuthSession{},
&model.UserIdentity{},