export type BlenderOperatorPropertyType = "boolean" | "number" | "enum" | "string"; export type BlenderOperatorPropertyValue = string | number | boolean; export interface BlenderOperatorEnumItem { value: string; label: string; } export interface BlenderOperatorPropertySpec { name: string; type: BlenderOperatorPropertyType; required: boolean; label?: string; description?: string; defaultValue?: BlenderOperatorPropertyValue; min?: number; max?: number; enumItems?: BlenderOperatorEnumItem[]; } export interface BlenderOperatorDescriptor { id: string; label: string; description?: string; family: string; context: "scene" | "object" | "main"; backgroundSafe: true; properties: BlenderOperatorPropertySpec[]; } export interface BlenderServerOperatorSchema { operator: BlenderOperatorDescriptor; blenderBuild: { version: string; buildSha256: string }; } export interface BlenderOperatorInvocation { operator: string; properties?: Record; baseRevision?: number; } export type BlenderFeatureRoute = "WEB_MAIN" | "SERVER_NATIVE" | "BROWSER_EQUIVALENT" | "UNAVAILABLE"; /** Browser-owned replacements for desktop context/window operators. */ export type BlenderBrowserActionGroup = "OPEN" | "SAVE" | "WORKSPACE" | "SELECTION" | "VIEW" | "EDITOR"; export interface BlenderBrowserEquivalentInvocation { command: "invokeBrowserEquivalent"; route: string; actionGroup: BlenderBrowserActionGroup; browserCommand: string; } export interface BlenderFeatureRouteRuntimeAudit { command: "featureRouteRuntimeAudit"; status: "PASS" | "FAILED" | "STATIC_DECLARATION"; behavioralEvidence: { separate: true }; } export interface BlenderFeatureRouteLocation { path: string; line?: number; evidence?: string; } /** Source-unit route metadata used by the F3 feature palette. */ export interface BlenderFeatureRouteEntry { id: string; kind: string; identifier: string; family: string; route: BlenderFeatureRoute; reason: string; /** HTTP provider used by SERVER_NATIVE routes. */ httpRoute?: string; /** Existing browser workflow used by BROWSER_EQUIVALENT routes. */ browserActionGroup?: BlenderBrowserActionGroup; label?: string; description?: string; properties?: BlenderOperatorPropertySpec[]; locations?: BlenderFeatureRouteLocation[]; } export interface BlenderFeatureRouteInvocation { route: BlenderFeatureRouteEntry; properties?: Record; baseRevision?: number; } /** SERVER_NATIVE jobs deliberately carry only typed scalar operator properties. */ export const BLENDER_OPERATOR_BACKGROUND_CONTEXT = "BACKGROUND" as const; export type BlenderMacroStepKind = "MAIN_COMMAND" | "SERVER_NATIVE" | "CONTEXT_DEPENDENT"; export interface BlenderMacroStep { id: string; kind: BlenderMacroStepKind; context: "MAIN" | "BACKGROUND" | "UI"; operator?: string; command?: Record; source: BlenderFeatureRouteLocation[]; } /** A bounded, source-backed native plan assembled from Blender operator units. */ export interface BlenderMacroDescriptor { id: string; label: string; description?: string; family: string; route: BlenderFeatureRoute; contextDependent: boolean; source: BlenderFeatureRouteLocation[]; steps: BlenderMacroStep[]; properties?: BlenderOperatorPropertySpec[]; } export interface BlenderMacroInvocation { macro: string; properties?: Record; baseRevision?: number; serverJob?: Record; }