kin: KIN-016 Агенты должны уметь говорить 'не могу'. Если агент не может выполнить задачу (нет доступа, не понимает, выходит за компетенцию) — он должен вернуть status: blocked с причиной, а не пытаться угадывать. PM при получении blocked от агента — эскалирует к человеку через GUI (уведомление) и Telegram (когда будет).
This commit is contained in:
parent
a605e9d110
commit
d9172fc17c
35 changed files with 2375 additions and 23 deletions
|
|
@ -49,6 +49,12 @@ export interface Project {
|
|||
active_tasks: number
|
||||
blocked_tasks: number
|
||||
review_tasks: number
|
||||
project_type: string | null
|
||||
ssh_host: string | null
|
||||
ssh_user: string | null
|
||||
ssh_key_path: string | null
|
||||
ssh_proxy_jump: string | null
|
||||
description: string | null
|
||||
}
|
||||
|
||||
export interface ObsidianSyncResult {
|
||||
|
|
@ -148,6 +154,40 @@ export interface CostEntry {
|
|||
total_duration_seconds: number
|
||||
}
|
||||
|
||||
export interface Phase {
|
||||
id: number
|
||||
project_id: string
|
||||
role: string
|
||||
phase_order: number
|
||||
status: string
|
||||
task_id: string | null
|
||||
revise_count: number
|
||||
created_at: string
|
||||
updated_at: string
|
||||
task?: Task | null
|
||||
}
|
||||
|
||||
export interface NewProjectPayload {
|
||||
id: string
|
||||
name: string
|
||||
path: string
|
||||
description: string
|
||||
roles: string[]
|
||||
tech_stack?: string[]
|
||||
priority?: number
|
||||
language?: string
|
||||
project_type?: string
|
||||
ssh_host?: string
|
||||
ssh_user?: string
|
||||
ssh_key_path?: string
|
||||
ssh_proxy_jump?: string
|
||||
}
|
||||
|
||||
export interface NewProjectResult {
|
||||
project: Project
|
||||
phases: Phase[]
|
||||
}
|
||||
|
||||
export interface AuditItem {
|
||||
id: string
|
||||
reason: string
|
||||
|
|
@ -163,6 +203,16 @@ export interface AuditResult {
|
|||
error?: string
|
||||
}
|
||||
|
||||
export interface EscalationNotification {
|
||||
task_id: string
|
||||
project_id: string
|
||||
agent_role: string
|
||||
reason: string
|
||||
pipeline_step: string | null
|
||||
blocked_at: string
|
||||
telegram_sent: boolean
|
||||
}
|
||||
|
||||
export const api = {
|
||||
projects: () => get<Project[]>('/projects'),
|
||||
project: (id: string) => get<ProjectDetail>(`/projects/${id}`),
|
||||
|
|
@ -170,7 +220,7 @@ export const api = {
|
|||
taskFull: (id: string) => get<TaskFull>(`/tasks/${id}/full`),
|
||||
taskPipeline: (id: string) => get<PipelineStep[]>(`/tasks/${id}/pipeline`),
|
||||
cost: (days = 7) => get<CostEntry[]>(`/cost?days=${days}`),
|
||||
createProject: (data: { id: string; name: string; path: string; tech_stack?: string[]; priority?: number }) =>
|
||||
createProject: (data: { id: string; name: string; path?: string; tech_stack?: string[]; priority?: number; project_type?: string; ssh_host?: string; ssh_user?: string; ssh_key_path?: string; ssh_proxy_jump?: string }) =>
|
||||
post<Project>('/projects', data),
|
||||
createTask: (data: { project_id: string; title: string; priority?: number; route_type?: string; category?: string }) =>
|
||||
post<Task>('/tasks', data),
|
||||
|
|
@ -192,7 +242,7 @@ export const api = {
|
|||
post<{ updated: string[]; count: number }>(`/projects/${projectId}/audit/apply`, { task_ids: taskIds }),
|
||||
patchTask: (id: string, data: { status?: string; execution_mode?: string; priority?: number; route_type?: string; title?: string; brief_text?: string }) =>
|
||||
patch<Task>(`/tasks/${id}`, data),
|
||||
patchProject: (id: string, data: { execution_mode?: string; autocommit_enabled?: boolean; obsidian_vault_path?: string; deploy_command?: string }) =>
|
||||
patchProject: (id: string, data: { execution_mode?: string; autocommit_enabled?: boolean; obsidian_vault_path?: string; deploy_command?: string; project_type?: string; ssh_host?: string; ssh_user?: string; ssh_key_path?: string; ssh_proxy_jump?: string }) =>
|
||||
patch<Project>(`/projects/${id}`, data),
|
||||
deployProject: (projectId: string) =>
|
||||
post<DeployResult>(`/projects/${projectId}/deploy`, {}),
|
||||
|
|
@ -202,4 +252,16 @@ export const api = {
|
|||
del<{ deleted: number }>(`/projects/${projectId}/decisions/${decisionId}`),
|
||||
createDecision: (data: { project_id: string; type: string; title: string; description: string; category?: string; tags?: string[] }) =>
|
||||
post<Decision>('/decisions', data),
|
||||
newProject: (data: NewProjectPayload) =>
|
||||
post<NewProjectResult>('/projects/new', data),
|
||||
getPhases: (projectId: string) =>
|
||||
get<Phase[]>(`/projects/${projectId}/phases`),
|
||||
notifications: (projectId?: string) =>
|
||||
get<EscalationNotification[]>(`/notifications${projectId ? `?project_id=${projectId}` : ''}`),
|
||||
approvePhase: (phaseId: number, comment?: string) =>
|
||||
post<{ phase: Phase; next_phase: Phase | null }>(`/phases/${phaseId}/approve`, { comment }),
|
||||
rejectPhase: (phaseId: number, reason: string) =>
|
||||
post<Phase>(`/phases/${phaseId}/reject`, { reason }),
|
||||
revisePhase: (phaseId: number, comment: string) =>
|
||||
post<{ phase: Phase; new_task: Task }>(`/phases/${phaseId}/revise`, { comment }),
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue