diff --git a/AgentCompany-New/src/main/services/onboarding-service.ts b/AgentCompany-New/src/main/services/onboarding-service.ts index cfb47d60..4c3722dd 100644 --- a/AgentCompany-New/src/main/services/onboarding-service.ts +++ b/AgentCompany-New/src/main/services/onboarding-service.ts @@ -9,6 +9,7 @@ import { PROVIDER_CATALOG } from "../../shared/provider-catalog"; import { createId } from "../../shared/ids"; import { AuditService } from "./audit-service"; import { OrganizationService } from "./organization-service"; +import { ChatService } from "./chat-service"; interface OnboardingServiceDeps { db: DatabaseSync; @@ -18,10 +19,12 @@ interface OnboardingServiceDeps { export class OnboardingService { private readonly audit: AuditService; private readonly organization: OrganizationService; + private readonly chat: ChatService; constructor(private readonly deps: OnboardingServiceDeps) { this.audit = new AuditService(deps.db); this.organization = new OrganizationService(deps.db); + this.chat = new ChatService(deps.db); } bootstrap(input: BootstrapOnboardingInput): BootstrapOnboardingSummary { @@ -65,6 +68,7 @@ export class OnboardingService { }); const goalId = this.createGoal(orgId, ceoAgentId, input, now); const projectId = this.createProject(orgId, goalId, ceoAgentId, input, now); + this.createProjectChatSpace(orgId, projectName(input)); if (workspaceId) this.bindWorkspaceToProject(workspaceId, projectId, now); const taskId = this.createKickoffTask(orgId, goalId, projectId, workspaceId, ceoAgentId, input, now); const runId = this.createTaskRun(orgId, taskId, ceoAgentId, providerId, workspaceId, now); @@ -143,7 +147,7 @@ export class OnboardingService { projectId, orgId, goalId, - `Execution plan: ${input.goalTitle.trim()}`, + projectName(input), input.companyDescription.trim(), ceoAgentId, "in_progress", @@ -153,6 +157,16 @@ export class OnboardingService { return projectId; } + private createProjectChatSpace(orgId: string, name: string): string { + return this.chat.createSpace({ + orgId, + spaceType: "project", + name: projectSpaceName(name), + topic: name, + visibility: "workspace", + }); + } + private bindWorkspaceToProject(workspaceId: string, projectId: string, now: string): void { this.deps.db.prepare("update workspaces set project_id = ?, updated_at = ? where id = ?") .run(projectId, now, workspaceId); @@ -250,3 +264,12 @@ export class OnboardingService { ].filter((line) => line.length > 0).join("\n\n"); } } + +function projectName(input: BootstrapOnboardingInput): string { + return `Execution plan: ${input.goalTitle.trim()}`; +} + +function projectSpaceName(name: string): string { + const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 48).replace(/-+$/g, ""); + return slug || "project"; +} diff --git a/AgentCompany-New/src/renderer/src/pages/WorkPage.tsx b/AgentCompany-New/src/renderer/src/pages/WorkPage.tsx index 492b04be..6a42e305 100644 --- a/AgentCompany-New/src/renderer/src/pages/WorkPage.tsx +++ b/AgentCompany-New/src/renderer/src/pages/WorkPage.tsx @@ -17,6 +17,7 @@ import { } from "../../../shared/domain"; import { NewTaskDialog } from "./NewTaskDialog"; import { TaskDetailDialog } from "./work/TaskDetailDialog"; +import { ProjectOverview } from "./work/ProjectOverview"; import { canRun, latestTaskRun, nextStatus, prettyRunState, prettyStatus, providerFor, runTone } from "./work/task-helpers"; import type { PageProps } from "./types"; import { activeOrgId } from "./types"; @@ -64,6 +65,7 @@ export function WorkPage({ snapshot, actions }: PageProps) { const workspaces = useMemo(() => snapshot.workspaces.filter((workspace) => workspace.orgId === orgId), [snapshot.workspaces, orgId]); const providers = useMemo(() => snapshot.providers.filter((provider) => provider.orgId === orgId), [snapshot.providers, orgId]); const taskRuns = useMemo(() => snapshot.taskRuns.filter((run) => run.orgId === orgId), [snapshot.taskRuns, orgId]); + const chatSpaces = useMemo(() => snapshot.chatSpaces.filter((space) => space.orgId === orgId), [snapshot.chatSpaces, orgId]); const advance = (task: TaskRecord) => { const next = nextStatus(task.status); @@ -93,6 +95,8 @@ export function WorkPage({ snapshot, actions }: PageProps) { {tasks.length} {tasks.length === 1 ? "task" : "tasks"} ยท {assigneeCount} {assigneeCount === 1 ? "assignee" : "assignees"}
+