import { RUNTIME_CARD_FIELD_TYPES, RUNTIME_CARD_LIMITS, RUNTIME_CARD_LINE_ITEM_COLUMN_TYPES, validateRuntimeCardFieldValues, type RuntimeCardField, type RuntimeCardFieldChoice, type RuntimeCardFieldType, type RuntimeCardLineItemColumn, type RuntimeCardLineItemColumnType, type VerbNativeMetadata } from '@canonmsg/backend-contracts'; export { RUNTIME_CARD_FIELD_TYPES, RUNTIME_CARD_LIMITS, RUNTIME_CARD_LINE_ITEM_COLUMN_TYPES, validateRuntimeCardFieldValues, }; export type { RuntimeCardField, RuntimeCardFieldChoice, RuntimeCardFieldType, RuntimeCardLineItemColumn, RuntimeCardLineItemColumnType, }; export interface PlanApprovalMetadata { type: 'plan_approval'; planId: string; /** Canon user who should answer this card. UI hint only; reply APIs still enforce authorization. */ responseUserId?: string; title?: string; summary?: string; body?: string; allowedPrompts?: ReadonlyArray<{ tool: string; prompt: string; }>; } /** * Plan approval decision. * - `approve`: proceed with the plan. * - `revise`: request changes (carries free-text `feedback`). * - `reject`: decline / keep planning — the Mac-app "No, keep planning" path, * distinct from a feedback-bearing revision. */ export type PlanApprovalDecision = 'approve' | 'revise' | 'reject'; export interface PlanApprovalReplyMetadata { type: 'plan_approval_reply'; planId: string; decision: PlanApprovalDecision; feedback?: string; /** * When the plan card showed `allowedPrompts`, the subset the user granted on * approval. The host pre-approves these as session rules. Absent = grant all * (legacy/full-approve behavior). */ grantedPrompts?: ReadonlyArray<{ tool: string; prompt: string; }>; } export type RuntimeInputKind = 'clarify' | 'sudo' | 'secret'; export type RuntimeInputReplyStatus = 'submitted' | 'cancelled'; export type RuntimeInputResolutionStatus = RuntimeInputReplyStatus | 'timeout'; export interface RuntimeInputChoice { label: string; value?: string; description?: string; /** * Optional preview content rendered when this option is focused/expanded — * mockups, code snippets, or comparisons. Matches the Mac-app * AskUserQuestion option preview. */ preview?: string; } export interface RuntimeInputQuestion { id: string; question: string; header?: string; choices?: RuntimeInputChoice[]; allowOther?: boolean; isSecret?: boolean; multiSelect?: boolean; } export type RuntimeInputAnswers = Record; export type RuntimeInputNativeMetadata = Pick; export interface RuntimeInputRequestMetadata { type: 'runtime_input_request'; inputId: string; /** Canon user who should answer this card. UI hint only; reply APIs still enforce authorization. */ responseUserId?: string; kind: RuntimeInputKind; prompt: string; title?: string; choices?: RuntimeInputChoice[]; questions?: RuntimeInputQuestion[]; secretName?: string; native?: RuntimeInputNativeMetadata; expiresAt: string; sensitive?: boolean; } export interface RuntimeInputReplyMetadata { type: 'runtime_input_reply'; inputId: string; kind?: RuntimeInputKind; status: RuntimeInputReplyStatus; answerSummary?: string; answersSummary?: string; sensitive?: boolean; } export interface RuntimeInputOutcomeMetadata { type: 'runtime_input_outcome'; inputId: string; kind?: RuntimeInputKind; status: RuntimeInputResolutionStatus; reason?: 'submitted' | 'cancelled' | 'timeout' | 'expired' | 'interrupted'; } export declare const RUNTIME_CARD_SCHEMA_V1: "canon.card.v1"; export declare const RUNTIME_CARD_PUBLIC_REQUEST_TEXT: "Action requested"; export type RuntimeCardSchemaV1 = typeof RUNTIME_CARD_SCHEMA_V1; export type RuntimeCardBlockKind = 'summary' | 'metricGrid' | 'chart' | 'table' | 'list' | 'callout' | 'actions' | 'mediaPreview' | 'details'; export type RuntimeCardTone = 'neutral' | 'primary' | 'positive' | 'warning' | 'negative' | 'danger' | 'critical' | 'welcome'; export type RuntimeCardReplyStatus = 'submitted' | 'cancelled'; export type RuntimeCardResolutionStatus = RuntimeCardReplyStatus | 'timeout'; export interface RuntimeCardSummaryBlock { kind: 'summary'; title?: string; text: string; } export interface RuntimeCardMetric { label: string; value: string; delta?: string; tone?: RuntimeCardTone; } export interface RuntimeCardMetricGridBlock { kind: 'metricGrid'; title?: string; metrics: RuntimeCardMetric[]; } export interface RuntimeCardChartPoint { x: string; y: number; } export interface RuntimeCardChartSeries { name?: string; points: RuntimeCardChartPoint[]; } export interface RuntimeCardChartBlock { kind: 'chart'; chart: 'line' | 'bar'; title?: string; yLabel?: string; series: RuntimeCardChartSeries[]; } export interface RuntimeCardTableBlock { kind: 'table'; title?: string; columns: string[]; rows: string[][]; } export interface RuntimeCardListItem { label: string; detail?: string; status?: 'pending' | 'done' | 'blocked' | 'warning'; } export interface RuntimeCardListBlock { kind: 'list'; title?: string; items: RuntimeCardListItem[]; } export interface RuntimeCardCalloutBlock { kind: 'callout'; title?: string; text: string; tone?: RuntimeCardTone; } export type RuntimeCardMediaKind = 'image' | 'file'; export interface RuntimeCardMediaPreviewMedia { /** 'file' covers application/pdf and other documents. */ kind: RuntimeCardMediaKind; /** REQUIRED. Canon Storage URL only (server enforces). */ url: string; /** Resumable-upload identity for the primary media, when applicable. */ uploadId?: string; /** REQUIRED. Allowlist enforced server-side: image/*, application/pdf. */ mimeType: string; fileName?: string; sizeBytes?: number; /** Canon Storage URL; inline preview for non-image media (e.g. pdf page render). */ thumbnailUrl?: string; /** Resumable-upload identity for thumbnailUrl, when it is a separate upload. */ thumbnailUploadId?: string; /** 1-based page the thumbnail shows. */ page?: number; pageCount?: number; } export interface RuntimeCardMediaPreviewBlock { kind: 'mediaPreview'; title?: string; media: RuntimeCardMediaPreviewMedia; /** Recommended — old clients render this; should contain the open-link text. */ fallbackText?: string; } export interface RuntimeCardDetailsRow { label: string; value: string; tone?: RuntimeCardTone; /** 0..1 inclusive. */ confidence?: number; hint?: string; } export interface RuntimeCardDetailsBlock { kind: 'details'; title?: string; rows: RuntimeCardDetailsRow[]; } /** * Block preserved when a renderer/normalizer does not recognize `kind`. Forward * compatibility: unknown blocks are kept (not dropped) so renderers can degrade * to `fallbackText` instead of silently losing content. */ export interface RuntimeCardUnknownBlock { kind: string; fallbackText?: string; } export interface RuntimeCardAction { id: string; label: string; tone?: RuntimeCardTone; fields?: RuntimeCardField[]; } export interface RuntimeCardActionsBlock { kind: 'actions'; title?: string; actions: RuntimeCardAction[]; } export type RuntimeCardBlock = RuntimeCardSummaryBlock | RuntimeCardMetricGridBlock | RuntimeCardChartBlock | RuntimeCardTableBlock | RuntimeCardListBlock | RuntimeCardCalloutBlock | RuntimeCardActionsBlock | RuntimeCardMediaPreviewBlock | RuntimeCardDetailsBlock | RuntimeCardUnknownBlock; export interface RuntimeCardV1 { schema: RuntimeCardSchemaV1; cardId?: string; template?: string; tone?: RuntimeCardTone; title: string; fallbackText: string; blocks: RuntimeCardBlock[]; } export interface RuntimeCardPreview { title?: string; tone?: RuntimeCardTone; template?: string; blockKinds: RuntimeCardBlockKind[]; } export type RuntimeCardNativeMetadata = RuntimeInputNativeMetadata; export interface RuntimeCardRequestMetadata { type: 'runtime_card_request'; cardId: string; cardKind: string; schemaVersion: RuntimeCardSchemaV1; fallbackText: string; responseUserId?: string; expiresAt: string; runtimeId?: string; turnId?: string; native?: RuntimeCardNativeMetadata; /** True when the card carries an actions block (the agent waits for a * response); false/absent for display/report cards shown to all members. */ interactive?: boolean; cardPreview: RuntimeCardPreview; turnSemantics: 'control'; replyBehavior: 'suppress_auto_reply'; } export interface RuntimeCardReplyMetadata { type: 'runtime_card_reply'; cardId: string; status: RuntimeCardReplyStatus; actionId?: string; answerSummary?: string; sensitive?: boolean; turnSemantics: 'control'; replyBehavior: 'suppress_auto_reply'; } export interface RuntimeCardOutcomeMetadata { type: 'runtime_card_outcome'; cardId: string; status: RuntimeCardResolutionStatus; reason?: 'submitted' | 'cancelled' | 'timeout' | 'expired' | 'interrupted'; turnSemantics: 'control'; replyBehavior: 'suppress_auto_reply'; } /** * Mac-app parity: a choice-bearing question always offers a free-text "Other" * escape hatch unless the producing agent explicitly opts out. Shared by every * runtime's question mapper so the fallback is consistent across agents. */ export declare function resolveQuestionAllowOther(hasChoices: boolean, explicit?: unknown): boolean; /** Block kinds this version of core knows how to fully normalize/render. */ export type RuntimeCardKnownBlockKind = 'summary' | 'metricGrid' | 'chart' | 'table' | 'list' | 'callout' | 'actions' | 'mediaPreview' | 'details'; export declare function parseRuntimeCardV1(value: unknown): RuntimeCardV1 | null; export declare function buildRuntimeCardPreview(card: RuntimeCardV1): RuntimeCardPreview; export declare function buildRuntimeInputRequest(inputId: string, input: Omit): { text: string; metadata: RuntimeInputRequestMetadata; }; export declare function buildRuntimeInputReply(inputId: string, status: RuntimeInputReplyStatus, details?: { kind?: RuntimeInputKind; answerSummary?: string; answersSummary?: string; sensitive?: boolean; }): { text: string; metadata: RuntimeInputReplyMetadata; }; export declare function buildRuntimeInputOutcome(inputId: string, status: RuntimeInputResolutionStatus, details?: { kind?: RuntimeInputKind; reason?: RuntimeInputOutcomeMetadata['reason']; }): { text: string; metadata: RuntimeInputOutcomeMetadata; }; export declare function buildRuntimeCardRequest(card: RuntimeCardV1, input: { cardId?: string; responseUserId?: string; expiresAt: string | number | Date; runtimeId?: string; turnId?: string; native?: RuntimeCardNativeMetadata; }): { text: string; metadata: RuntimeCardRequestMetadata; }; export declare function buildRuntimeCardReply(cardId: string, status: RuntimeCardReplyStatus, details?: { actionId?: string; answerSummary?: string; sensitive?: boolean; }): { text: string; metadata: RuntimeCardReplyMetadata; }; export declare function buildRuntimeCardOutcome(cardId: string, status: RuntimeCardResolutionStatus, details?: { reason?: RuntimeCardOutcomeMetadata['reason']; }): { text: string; metadata: RuntimeCardOutcomeMetadata; }; export declare function parseRuntimeInputRequestMetadata(value: unknown): RuntimeInputRequestMetadata | null; export declare function parseRuntimeCardRequestMetadata(value: unknown): RuntimeCardRequestMetadata | null; export declare function parseRuntimeCardReplyMetadata(value: unknown): RuntimeCardReplyMetadata | null; export declare function parseRuntimeCardOutcomeMetadata(value: unknown): RuntimeCardOutcomeMetadata | null; export declare function parseRuntimeInputReplyMetadata(value: unknown): RuntimeInputReplyMetadata | null; export declare function parseRuntimeInputOutcomeMetadata(value: unknown): RuntimeInputOutcomeMetadata | null;