feat(agent): Agent 工作台 - 计划插话记忆、统一模型选择器并修复摘要与视频入库

将计划清单、运行中插话和个人记忆接入云端 Agent;全站模型选择器统一为左右二级菜单。画布摘要按预算截断不再整轮拒绝,首页视频未知宽高可入库。README 补充贡献者 morrow。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ddCat
2026-09-17 20:21:25 +08:00
parent b6bae4f957
commit 6892732b06
80 changed files with 7364 additions and 182 deletions

View File

@@ -39,6 +39,7 @@ func (w *taskWorkerCoordinator) start(ctx context.Context) {
s.startTextReplayCleanup(ctx)
s.startProviderCancellationReconciliation(ctx)
s.startBillingReviewAudit(ctx)
s.startAgentMemoryCompactScheduler()
s.runWorkerLoop(func(ctx context.Context) {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
@@ -185,6 +186,7 @@ func (w *taskWorkerCoordinator) processClaimedTask(task *model.Task, globalSlot
return w.processTimelineRender(task, ctx)
}
s.markAgentMemoryCompactRunning(*task)
task.Stage = "调用生成模型"
task.Progress = 35
if taskUsesUpstreamReportedProgress(task.Type) {
@@ -252,6 +254,7 @@ func (w *taskWorkerCoordinator) processClaimedTask(task *model.Task, globalSlot
if errors.Is(err, context.DeadlineExceeded) {
err = errors.New(taskTimeoutMessage(task.Type))
}
s.noteAgentMemoryCompactTask(*task, nil, err)
return terminal.handleExecutionFailure(task, err, providerSucceeded, channelSlotFailedBeforeRequest)
}
latest, err := s.repo.Task(task.ID)
@@ -259,22 +262,27 @@ func (w *taskWorkerCoordinator) processClaimedTask(task *model.Task, globalSlot
return err
}
if latest.Status == model.TaskStatusCancelled {
s.noteAgentMemoryCompactTask(*task, nil, errors.New("压缩任务已取消"))
return terminal.handleCancelledResult(*latest)
}
resultJSON, err := json.Marshal(result)
if err != nil {
s.noteAgentMemoryCompactTask(*task, nil, err)
_, terminalErr := terminal.handleResultPersistenceFailure(task, fmt.Errorf("序列化任务结果失败:%w", err))
return terminalErr
}
opsJSON, err := json.Marshal(canvasOps)
if err != nil {
s.noteAgentMemoryCompactTask(*task, nil, err)
_, terminalErr := terminal.handleResultPersistenceFailure(task, fmt.Errorf("序列化画布操作失败:%w", err))
return terminalErr
}
if err := s.saveTaskCompletionWithinStorageQuota(task, resultJSON, opsJSON, len(canvasOps) > 0); err != nil {
s.noteAgentMemoryCompactTask(*task, nil, err)
_, terminalErr := terminal.handleResultPersistenceFailure(task, err)
return terminalErr
}
s.noteAgentMemoryCompactTask(*task, result, nil)
return terminal.handleSuccess(task)
}