diff --git a/src/main/api-server/routes-files.ts b/src/main/api-server/routes-files.ts index db5a8545..bae02baf 100644 --- a/src/main/api-server/routes-files.ts +++ b/src/main/api-server/routes-files.ts @@ -1,4 +1,5 @@ import { z } from "zod"; +import { IMPORTANT_DOC_TYPE_SET } from "@shared/document-categories"; import { requireParam, type AgentApiServer } from "./server-core"; type DocumentRow = { @@ -133,8 +134,7 @@ export function registerFileRoutes(server: AgentApiServer) { // Deliverable review gate: check at document creation time (most reliable). // In ai_cofounder mode, checkpoint-engine handles document reviews via the // onDocumentCreated callback, so skip the direct approval here to avoid duplicates. - const IMPORTANT_DOC_TYPES = new Set(["prd","technical_spec","design_doc","project_brief","proposal","budget_proposal","architecture_decision","contract","sop"]); - if (IMPORTANT_DOC_TYPES.has(docType)) { + if (IMPORTANT_DOC_TYPE_SET.has(docType)) { try { const companySettings = db.getCompanyApprovalSettings(token.companyId); const company = companySettings ? { reviewDeliverables: companySettings.reviewDeliverables } : null; diff --git a/src/main/api-server/routes-tasks.ts b/src/main/api-server/routes-tasks.ts index 6bd08edc..4370fd81 100644 --- a/src/main/api-server/routes-tasks.ts +++ b/src/main/api-server/routes-tasks.ts @@ -1,5 +1,6 @@ import { z } from "zod"; import { taskInputSchema } from "@shared/contracts"; +import { IMPORTANT_DOC_TYPES } from "@shared/document-categories"; import { canAssignTask, canUpdateTask } from "../agent-permissions"; import { inferTaskType } from "../connector-matching"; import { validateTaskCreation } from "../task-quality-gates"; @@ -138,7 +139,7 @@ export function registerTaskRoutes(server: AgentApiServer) { // Deliverable review gate: intercept agent trying to advance a flagged task to "done". // This MUST succeed — silently skipping review would let unreviewed work advance. if (update.status === "done" && task.requiresUserReview) { - const importantTypes = ["prd","technical_spec","design_doc","project_brief","proposal","budget_proposal","architecture_decision","contract","sop"]; + const importantTypes = IMPORTANT_DOC_TYPES; const placeholders = importantTypes.map(() => "?").join(", "); const docs = db.queryAll<{ id: string; type: string; title: string }>( `select id, type, title from documents where company_id = ? and type in (${placeholders}) diff --git a/src/shared/document-categories.ts b/src/shared/document-categories.ts new file mode 100644 index 00000000..8fb83230 --- /dev/null +++ b/src/shared/document-categories.ts @@ -0,0 +1,22 @@ +/** + * Document type categories shared between db, route handlers, and clients. + * + * IMPORTANT_DOC_TYPES are the document types that trigger deliverable-review + * approvals (PRDs, specs, design docs, contracts, etc.). The ordering matters + * for some lookup queries; keep this in sync with database/documents.ts. + */ +export const IMPORTANT_DOC_TYPES = [ + "prd", + "technical_spec", + "design_doc", + "project_brief", + "proposal", + "budget_proposal", + "architecture_decision", + "contract", + "sop", +] as const; + +export type ImportantDocType = (typeof IMPORTANT_DOC_TYPES)[number]; + +export const IMPORTANT_DOC_TYPE_SET: ReadonlySet = new Set(IMPORTANT_DOC_TYPES);