feat: step artifacts framework

- Add Artifact type to Step (name, path, artifact_type, description)
- step_done tool accepts optional artifacts parameter
- Save artifacts to step_artifacts DB table
- Display artifacts in frontend PlanSection (tag style)
- Show artifacts in step context for sub-agents and coordinator
- Add LLM client retry with exponential backoff
This commit is contained in:
Fam Zheng
2026-03-09 12:01:29 +00:00
parent 29f026e383
commit fa800b1601
7 changed files with 273 additions and 47 deletions

View File

@@ -59,6 +59,11 @@ function quoteStep(e: Event, step: PlanStepInfo) {
<div v-if="step.command && expandedSteps.has(step.order)" class="step-detail">
{{ step.command }}
</div>
<div v-if="step.artifacts?.length" class="step-artifacts">
<span v-for="a in step.artifacts" :key="a.path" class="artifact-tag">
📄 {{ a.name }} <span class="artifact-type">{{ a.artifact_type }}</span>
</span>
</div>
</div>
<div v-if="!steps.length" class="empty-state">
AI 将在这里展示执行计划
@@ -188,6 +193,30 @@ function quoteStep(e: Event, step: PlanStepInfo) {
border-top: 1px solid var(--border);
}
.step-artifacts {
padding: 4px 10px 8px 44px;
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.artifact-tag {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--text-secondary);
background: var(--bg-tertiary);
padding: 2px 8px;
border-radius: 4px;
}
.artifact-type {
font-size: 10px;
color: var(--accent);
opacity: 0.8;
}
.empty-state {
color: var(--text-secondary);
font-size: 13px;

View File

@@ -26,11 +26,19 @@ export interface ExecutionLogEntry {
created_at: string
}
export interface StepArtifact {
name: string
path: string
artifact_type: string
description: string
}
export interface PlanStepInfo {
order: number
description: string
command: string
status?: 'pending' | 'running' | 'done' | 'failed'
artifacts?: StepArtifact[]
}
export interface Comment {