Files
aiagent/frontend/src/api/companies.ts
renjianbo f2e65a8fbb feat: virtual company module, team projects, PWA dishes app, and startup scripts overhaul
- Add company module (3-tier org, CEO planning, parallel departments)
- Add company orchestrator, knowledge extractor, presets, scheduler
- Add company API endpoints, models, and frontend views
- Add 今天吃啥 PWA app (69 dishes, real images, offline support)
- Add team_projects output directory structure
- Add unified manage.ps1 for service lifecycle
- Add Windows startup guide v1.0
- Add TTS troubleshooting doc
- Update frontend (AgentChat UX overhaul, new views)
- Update backend (voice engine fix, multi-tenant, RBAC)
- Remove deprecated startup scripts and old docs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-10 22:37:56 +08:00

278 lines
8.8 KiB
TypeScript

import api from '@/api'
export interface Company {
id: string
name: string
description: string | null
industry: string | null
department_count: number
ceo_agent_id: string | null
status: string
created_at: string | null
}
export interface Department {
id: string
name: string
description: string | null
department_type: string | null
members: DepartmentMember[] | null
}
export interface DepartmentMember {
id: string
agent_id: string
role: string
is_lead: boolean
agent?: any
}
export interface CompanyProject {
id: string
company_id: string
name: string
description: string | null
status: string
ceo_plan: any
created_at: string | null
}
export interface CompanyDetail extends Company {
departments: Department[]
}
export async function listCompanies(): Promise<Company[]> {
const resp = await api.get('/api/v1/companies')
return resp.data.companies || []
}
export async function getCompany(id: string): Promise<CompanyDetail> {
const resp = await api.get(`/api/v1/companies/${id}`)
return resp.data
}
export async function createCompanyFromPreset(presetType: string, companyName?: string): Promise<any> {
const params = companyName ? { company_name: companyName } : {}
const resp = await api.post(`/api/v1/companies/template/${presetType}`, null, { params })
return resp.data
}
export async function createCompany(data: { name: string; description?: string; industry?: string }): Promise<any> {
const resp = await api.post('/api/v1/companies', data)
return resp.data
}
export async function updateCompany(id: string, data: { name?: string; description?: string; industry?: string }): Promise<any> {
const resp = await api.put(`/api/v1/companies/${id}`, data)
return resp.data
}
export async function deleteCompany(id: string): Promise<void> {
await api.delete(`/api/v1/companies/${id}`)
}
export async function executeCompany(companyId: string, projectDescription: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/execute`, { project_description: projectDescription })
return resp.data
}
export async function addDepartment(companyId: string, teamId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/departments`, { team_id: teamId })
return resp.data
}
export async function removeDepartment(companyId: string, departmentId: string): Promise<void> {
await api.delete(`/api/v1/companies/${companyId}/departments/${departmentId}`)
}
export async function listProjects(companyId: string): Promise<CompanyProject[]> {
const resp = await api.get(`/api/v1/companies/${companyId}/projects`)
return resp.data.projects || []
}
export async function exportCompany(companyId: string): Promise<void> {
const token = localStorage.getItem('access_token') || ''
const resp = await fetch(`/api/v1/companies/${companyId}/export`, {
headers: { Authorization: `Bearer ${token}` },
})
if (!resp.ok) throw new Error('Export failed')
const blob = await resp.blob()
const disposition = resp.headers.get('Content-Disposition') || ''
const match = disposition.match(/filename="?(.+)"?/)
const filename = match ? match[1] : 'company_export.md'
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = filename
a.click()
URL.revokeObjectURL(url)
}
export async function getCompanyStats(companyId: string): Promise<{
total_projects: number
completed_projects: number
success_rate: number
last_active_at: string | null
}> {
const resp = await api.get(`/api/v1/companies/${companyId}/stats`)
return resp.data
}
// ─── Schedules ───
export interface CompanySchedule {
id: string
company_id: string
name: string
project_goal: string
cron_expression: string
interval_minutes: number | null
enabled: boolean
last_run_at: string | null
next_run_at: string | null
}
export async function listSchedules(companyId: string): Promise<CompanySchedule[]> {
const resp = await api.get(`/api/v1/companies/${companyId}/schedules`)
return resp.data.schedules || []
}
export async function createSchedule(companyId: string, data: {
name: string; project_goal: string; cron_expression: string; interval_minutes?: number
}): Promise<any> {
const payload: any = { ...data }
if (payload.interval_minutes !== undefined) payload.interval_minutes = String(payload.interval_minutes)
const resp = await api.post(`/api/v1/companies/${companyId}/schedules`, payload)
return resp.data
}
export async function updateSchedule(scheduleId: string, data: {
name?: string; project_goal?: string; cron_expression?: string; interval_minutes?: number; enabled?: boolean
}): Promise<any> {
const payload: any = { ...data }
if (payload.interval_minutes !== undefined) payload.interval_minutes = String(payload.interval_minutes)
const resp = await api.put(`/api/v1/companies/schedules/${scheduleId}`, payload)
return resp.data
}
export async function deleteSchedule(scheduleId: string): Promise<void> {
await api.delete(`/api/v1/companies/schedules/${scheduleId}`)
}
export async function triggerSchedule(scheduleId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/schedules/${scheduleId}/trigger`)
return resp.data
}
// ─── Knowledge ───
export interface CompanyKnowledge {
id: string
company_id: string
project_id: string | null
title: string
content: string
category: string
tags: string[]
source_dept: string
created_at: string
}
export async function listKnowledge(companyId: string, params?: { search?: string; category?: string; limit?: number }): Promise<CompanyKnowledge[]> {
const resp = await api.get(`/api/v1/companies/${companyId}/knowledge`, { params })
return resp.data.knowledge || []
}
export async function generateKnowledge(companyId: string, projectId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/knowledge/generate`, { project_id: projectId })
return resp.data
}
export async function deleteKnowledge(companyId: string, knowledgeId: string): Promise<void> {
await api.delete(`/api/v1/companies/${companyId}/knowledge/${knowledgeId}`)
}
// ─── Insights ───
export interface CompanyInsights {
total_projects: number
completed_projects: number
failed_projects: number
success_rate: number
dept_stats: { name: string; execution_count: number; success_count: number; avg_score: number; success_rate: number }[]
collaboration_pairs: { pair: string; count: number }[]
avg_rounds: number
avg_cost: number
failure_reasons: { project: string; department: string; score: number; feedback: string }[]
recommendations: string[]
}
export async function getCompanyInsights(companyId: string): Promise<CompanyInsights> {
const resp = await api.get(`/api/v1/companies/${companyId}/insights`)
return resp.data
}
// ─── Template Marketplace ───
export interface ProjectTemplate {
id: string
company_id: string
name: string
description: string | null
ceo_plan: any
is_public: boolean
}
export async function listTemplates(params?: { search?: string }): Promise<ProjectTemplate[]> {
const resp = await api.get('/api/v1/companies/templates/list', { params })
return resp.data.templates || []
}
export async function publishProject(companyId: string, projectId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/projects/${projectId}/publish`)
return resp.data
}
export async function unpublishProject(companyId: string, projectId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/projects/${projectId}/unpublish`)
return resp.data
}
// ─── Project Supervisor / 项目监管 ───
export interface ZombieProject {
project_id: string
name: string
company_id: string
status: string
idle_minutes: number
last_updated: string | null
created_at: string | null
}
export interface InProgressProject {
project_id: string
name: string
company_id: string
status: string
idle_minutes: number
is_at_risk: boolean
will_become_zombie_in_minutes: number
last_updated: string | null
}
export async function getZombieProjects(): Promise<{ zombie_count: number; projects: ZombieProject[]; scanned_at: string | null }> {
const resp = await api.get('/api/v1/companies/supervisor/zombies')
return resp.data
}
export async function getInProgressProjects(): Promise<{ projects: InProgressProject[] }> {
const resp = await api.get('/api/v1/companies/supervisor/in-progress')
return resp.data
}
export async function triggerSupervisorScan(): Promise<any> {
const resp = await api.post('/api/v1/companies/supervisor/scan')
return resp.data
}
export async function recoverProject(companyId: string, projectId: string): Promise<any> {
const resp = await api.post(`/api/v1/companies/${companyId}/projects/${projectId}/recover`)
return resp.data
}