feat(agent): unify agnet→agent and implement client/runtime unification spec v0.1 core
按桌面客户端统一方案 v0.1 + agent_management Sub Mode Runtime 对接,强制全量统一,不留兼容。
命名统一(强制,无兼容):
- 全仓 agnet/Agnet/AGNET → agent/Agent/AGENT:后端 Go(路由 /api/agent/*、env AGENT_*、
结构体/函数、19 个文件改名)、前端(agent-console/agent-hub、/api/agent 调用、i18n)、
DB(表 agent_*、列 agent_id)、compose/.env、文档、脚本。
- DB 加幂等迁移 renameAgnetTablesToAgent():启动时 rename 老 agnet_* 表/列,保住生产数据。
统一方案核心(10 项):
- callback 统一 /api/agent/callbacks/runtime-events(路由/广播URL/函数名)。
- artifact 兜底判定改用 Runtime 权威信号 metadata.synthesized(§7.2)+ 结构化 artifact_type。
- Manager→Runtime 路径对齐 /api/agent/sub-agile/deployments(§2.2),{deployment_id} 回退 swarm_id。
- 状态裁决 display_status:Manager 唯一裁判,completed 无有效产物→needs_codegen/
completed_without_deliverable(§10.6),接入 detail/timeline/workflow。
- GET /api/heicode/capabilities 能力发现(§6)。
- 模型策略 per_role(role_models)+ 收集 allowed_model_ids(§9)。
- resource_binding_id→secret_ref 服务端解析,客户端不再 inline secret_ref(§17.6)。
- 客户端统一路由层 /api/heicode/sub-agile|swarm/*(task≡deployment,复用控制面)+ workflow 投影。
- 日志分层 user_logs/debug_logs(§13)。
验证:go build ./... + go test(controller/router/model/middleware)全绿;前端 tsc -b + rsbuild build 通过。
待部署:VM .env 的 AGNET_*→AGENT_*;启动迁移自动 rename 表;其他三仓库需同步切到 /api/agent。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package model
|
||||
|
||||
import "errors"
|
||||
|
||||
type AgentCallbackEvent struct {
|
||||
Id int `gorm:"primaryKey" json:"id"`
|
||||
EventID string `gorm:"type:varchar(128);uniqueIndex" json:"event_id"`
|
||||
IdempotencyKey string `gorm:"type:varchar(128);index" json:"idempotency_key"`
|
||||
CallbackType string `gorm:"type:varchar(64);index" json:"callback_type"`
|
||||
EventType string `gorm:"type:varchar(64);index" json:"event_type"`
|
||||
DeploymentID string `gorm:"type:varchar(64);index" json:"deployment_id"`
|
||||
SwarmID string `gorm:"type:varchar(128);index" json:"swarm_id"`
|
||||
AgentInstanceID string `gorm:"type:varchar(128);index" json:"agent_instance_id"`
|
||||
TaskID string `gorm:"type:varchar(128);index" json:"task_id"`
|
||||
UserID string `gorm:"type:varchar(64);index" json:"user_id"`
|
||||
BindingScope string `gorm:"type:varchar(512);index" json:"binding_scope"`
|
||||
CorrelationID string `gorm:"type:varchar(64);index" json:"correlation_id"`
|
||||
Source string `gorm:"type:varchar(64)" json:"source"`
|
||||
Result string `gorm:"type:varchar(32)" json:"result"`
|
||||
PayloadJSON string `gorm:"type:text" json:"payload_json"`
|
||||
OccurredAt string `gorm:"type:varchar(32)" json:"occurred_at"`
|
||||
CreatedAtMs int64 `gorm:"bigint;index" json:"created_at_ms"`
|
||||
}
|
||||
|
||||
func (AgentCallbackEvent) TableName() string {
|
||||
return "agent_callback_events"
|
||||
}
|
||||
|
||||
type ListAgentCallbackEventsFilter struct {
|
||||
DeploymentID string
|
||||
TaskID string
|
||||
CorrelationID string
|
||||
Limit int
|
||||
}
|
||||
|
||||
func InsertAgentCallbackEvent(row *AgentCallbackEvent) (bool, error) {
|
||||
if DB == nil || row == nil {
|
||||
return false, nil
|
||||
}
|
||||
if row.EventID == "" {
|
||||
return false, errors.New("event_id is required")
|
||||
}
|
||||
var existing AgentCallbackEvent
|
||||
if err := DB.Where("event_id = ?", row.EventID).First(&existing).Error; err == nil {
|
||||
return false, nil
|
||||
}
|
||||
if row.IdempotencyKey != "" {
|
||||
if err := DB.Where("idempotency_key = ?", row.IdempotencyKey).First(&existing).Error; err == nil {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
if err := DB.Create(row).Error; err != nil {
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func ListAgentCallbackEvents(f ListAgentCallbackEventsFilter) ([]AgentCallbackEvent, error) {
|
||||
if DB == nil {
|
||||
return nil, nil
|
||||
}
|
||||
q := DB.Model(&AgentCallbackEvent{})
|
||||
if f.DeploymentID != "" {
|
||||
q = q.Where("deployment_id = ?", f.DeploymentID)
|
||||
}
|
||||
if f.TaskID != "" {
|
||||
q = q.Where("task_id = ?", f.TaskID)
|
||||
}
|
||||
if f.CorrelationID != "" {
|
||||
q = q.Where("correlation_id = ?", f.CorrelationID)
|
||||
}
|
||||
limit := f.Limit
|
||||
if limit <= 0 || limit > 1000 {
|
||||
limit = 200
|
||||
}
|
||||
var items []AgentCallbackEvent
|
||||
err := q.Order("created_at_ms asc, id asc").Limit(limit).Find(&items).Error
|
||||
return items, err
|
||||
}
|
||||
Reference in New Issue
Block a user