import type { DashboardDocument, DashboardFilter, DashboardGridItem, DashboardGridLayout } from './dashboard-document.js'; export type AppBuildAuthoringMode = 'ai' | 'manual'; export type AppBuildSourcePolicy = 'governed_only' | 'include_review_required'; export type AppBuildTemplateId = 'executive_brief' | 'operational_dashboard' | 'investigation' | 'blank'; export interface AppBuildClarification { id: string; question: string; choices: Array<{ id: string; label: string; description?: string; }>; required: boolean; answerId?: string; } export interface AppBuildFrame { goal: string; decision?: string; audience?: string; metrics: string[]; dimensions: string[]; grain?: string; timeRange?: string; comparison?: string; filters: string[]; desiredOutput?: string; clarificationQuestions?: AppBuildClarification[]; } export interface AppBuildRequirement { id: string; question: string; role: 'kpi' | 'trend' | 'breakdown' | 'detail' | 'narrative' | 'evidence'; required: boolean; measures: string[]; dimensions: string[]; filters: string[]; grain?: string; } export interface AppBuildRequirementCoverage { requirementId: string; status: 'covered' | 'partial' | 'gap'; sourceIds: string[]; componentIds: string[]; reasons: string[]; } export type AppBuildDraftSourceKind = 'block' | 'certified_block' | 'governed_semantic' | 'review_block' | 'review_dql' | 'text' /** v1 read compatibility; new drafts use governed_semantic. */ | 'semantic_query' /** v1 read compatibility; generated exploration is materialized as review_dql. */ | 'exploratory_sql'; export type AppBuildSourceLifecycle = 'certified' | 'review' | 'draft' | 'pending_recertification' | 'deprecated' | 'unknown'; export interface AppBuildSourceCapabilities { measures: string[]; dimensions: string[]; outputs: string[]; filters: string[]; grain?: string; chartType?: string; allowedVisualizations?: string[]; parameters: Array<{ name: string; type?: string; required: boolean; hasDefault: boolean; }>; } export type AppBuildDraftSource = { /** Canonical, path-disambiguated source id used by tiles and coverage. */ id: string; kind: AppBuildDraftSourceKind; /** Legacy display/execution reference retained for v1/v2 readers. */ sourceRef: string; qualifiedIdentity?: string; sourcePath?: string; executionRef?: string; snapshotId?: string; sourceRevision?: string; sourceFingerprint?: string; receiptId?: string; lifecycle?: AppBuildSourceLifecycle; capabilities?: AppBuildSourceCapabilities; trustState: 'certified' | 'review_required' | 'draft_ready'; reviewStatus: 'not_required' | 'required' | 'approved'; }; export interface AppBuildReviewTask { id: string; message: string; status: 'open' | 'resolved'; sourceId?: string; pageId?: string; tileId?: string; } export interface AppBuildRunReceipt { id: string; pageId: string; revision: number; snapshotId: string; filterFingerprint: string; resultFingerprint: string; createdAt: string; } export interface AppBuildPreflightReceipt { id: string; revision: number; proposalHash: string; sourceFingerprint: string; createdAt: string; } /** * The one durable authoring aggregate for AI, manual, CLI, and Copilot work. * Drafts are local-only. Git-owned App source is produced only by explicit * Publish to Project and is never used as the mutable editor backing store. */ export interface AppBuildDraft { version: 3; id: string; appId: string; name: string; baseApp?: { appId: string; fingerprint: string; }; revision: number; proposalHash: string; authoringMode: AppBuildAuthoringMode; template: AppBuildTemplateId; sourcePolicy: AppBuildSourcePolicy; state: 'local_draft' | 'clarification_required' | 'preflight_ready' | 'project_published'; frame: AppBuildFrame; requirements: AppBuildRequirement[]; coverage: AppBuildRequirementCoverage[]; sources: AppBuildDraftSource[]; pages: DashboardDocument[]; reviewTasks: AppBuildReviewTask[]; /** One settled run receipt per page. Any content edit invalidates the set. */ previewReceipts?: AppBuildRunReceipt[]; /** @deprecated Early v2 alias for the most recently run page. */ previewReceipt?: AppBuildRunReceipt; preflightReceipt?: AppBuildPreflightReceipt; publishedFingerprint?: string; createdAt: string; updatedAt: string; } export type AppBuildDraftOperation = { type: 'set_name'; name: string; } | { type: 'set_template'; template: AppBuildTemplateId; } | { type: 'set_frame'; frame: AppBuildFrame; } | { type: 'set_source_policy'; sourcePolicy: AppBuildSourcePolicy; } | { type: 'set_requirements'; requirements: AppBuildRequirement[]; coverage?: AppBuildRequirementCoverage[]; } | { type: 'set_coverage'; coverage: AppBuildRequirementCoverage[]; } | { type: 'upsert_source'; source: AppBuildDraftSource; } | { type: 'remove_source'; sourceId: string; } | { type: 'upsert_page'; page: DashboardDocument; } | { type: 'remove_page'; pageId: string; } | { type: 'add_tile'; pageId: string; tile: DashboardGridItem; } | { type: 'update_tile'; pageId: string; tileId: string; patch: Partial; } | { type: 'remove_tile'; pageId: string; tileId: string; } | { type: 'set_filter'; pageId: string; filter: DashboardFilter; } | { type: 'remove_filter'; pageId: string; filterId: string; } | { type: 'set_layout'; pageId: string; layout: DashboardGridLayout & { responsive?: DashboardDocument['layout']['responsive']; }; } | { type: 'set_review_task'; task: AppBuildReviewTask; } | { type: 'remove_review_task'; taskId: string; } | { type: 'set_preview_receipt'; receipt: AppBuildRunReceipt; }; export declare function createAppBuildDraft(input: { id: string; appId: string; name?: string; baseApp?: AppBuildDraft['baseApp']; authoringMode: AppBuildAuthoringMode; template?: AppBuildTemplateId; sourcePolicy?: AppBuildSourcePolicy; frame: AppBuildFrame; requirements?: AppBuildRequirement[]; coverage?: AppBuildRequirementCoverage[]; sources?: AppBuildDraftSource[]; pages?: DashboardDocument[]; reviewTasks?: AppBuildReviewTask[]; now?: string; }): AppBuildDraft; export declare function applyAppBuildDraftOperations(draft: AppBuildDraft, expectedRevision: number, operations: AppBuildDraftOperation[], now?: string): AppBuildDraft; export declare function appBuildDraftHash(value: unknown): string; /** * Produce a compact, non-overlapping row layout while preserving the author's * visual reading order. App Studio uses this after every explicit edit so * imported or stale geometry can never place a tile outside the active grid. */ export declare function packDashboardLayoutItems(items: DashboardDocument['layout']['items'], cols: number): DashboardDocument['layout']['items']; //# sourceMappingURL=app-build-draft.d.ts.map