/** * Ideas API client * Used for conversation persistence */ import { apiGet, apiPost, apiPatch } from "./client"; export enum IdeaStatus { CAPTURED = "CAPTURED", REVIEWING = "REVIEWING", APPROVED = "APPROVED", IN_PROGRESS = "IN_PROGRESS", COMPLETED = "COMPLETED", ARCHIVED = "ARCHIVED", } export interface Idea { id: string; workspaceId: string; domainId?: string | null; projectId?: string | null; title?: string | null; content: string; status: IdeaStatus; priority: string; category?: string | null; tags: string[]; metadata: Record; creatorId: string; createdAt: string; updatedAt: string; } export interface CreateIdeaRequest { title?: string; content: string; domainId?: string; projectId?: string; status?: IdeaStatus; priority?: string; category?: string; tags?: string[]; metadata?: Record; } export interface UpdateIdeaRequest { title?: string; content?: string; domainId?: string; projectId?: string; status?: IdeaStatus; priority?: string; category?: string; tags?: string[]; metadata?: Record; } export interface QueryIdeasRequest { page?: number; limit?: number; status?: IdeaStatus; domainId?: string; projectId?: string; category?: string; search?: string; } export interface QueryIdeasResponse { data: Idea[]; meta: { total: number; page: number; limit: number; totalPages: number; }; } /** * Create a new idea (conversation) */ export async function createIdea(request: CreateIdeaRequest): Promise { return apiPost("/api/ideas", request); } /** * Quick capture an idea */ export async function captureIdea(content: string, title?: string): Promise { return apiPost("/api/ideas/capture", { content, title }); } /** * Get all ideas with optional filters */ export async function queryIdeas(params: QueryIdeasRequest = {}): Promise { const queryParams = new URLSearchParams(); if (params.page) queryParams.set("page", params.page.toString()); if (params.limit) queryParams.set("limit", params.limit.toString()); if (params.status) queryParams.set("status", params.status); if (params.domainId) queryParams.set("domainId", params.domainId); if (params.projectId) queryParams.set("projectId", params.projectId); if (params.category) queryParams.set("category", params.category); if (params.search) queryParams.set("search", params.search); const query = queryParams.toString(); const endpoint = query ? `/api/ideas?${query}` : "/api/ideas"; return apiGet(endpoint); } /** * Get a single idea by ID */ export async function getIdea(id: string): Promise { return apiGet(`/api/ideas/${id}`); } /** * Update an idea */ export async function updateIdea(id: string, request: UpdateIdeaRequest): Promise { return apiPatch(`/api/ideas/${id}`, request); } /** * Get conversations (ideas with category='conversation') */ export async function getConversations( params: Omit = {} ): Promise { return queryIdeas({ ...params, category: "conversation" }); } /** * Create a conversation */ export async function createConversation( title: string, content: string, projectId?: string ): Promise { return createIdea({ title, content, ...(projectId !== undefined && { projectId }), category: "conversation", tags: ["chat"], metadata: { conversationType: "chat" }, }); } /** * Update conversation content */ export async function updateConversation( id: string, content: string, title?: string ): Promise { return updateIdea(id, { content, ...(title !== undefined && { title }), }); }