{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "definitions": {
    "ApplicationModuleContexts": {
      "description": "Authentication context types for application-level modules. Determines when application modules are active based on auth state.",
      "enum": [
        "Application::Unauthenticated",
        "Application::Authenticated"
      ],
      "type": "string"
    },
    "ConfiguredOutlets": {
      "additionalProperties": {
        "anyOf": [
          {
            "items": {
              "$ref": "#/definitions/ModuleLookup"
            },
            "type": "array"
          },
          {
            "items": {
              "$ref": "#/definitions/TabLookup"
            },
            "type": "array"
          },
          {
            "items": {
              "$ref": "#/definitions/MenuLookup"
            },
            "type": "array"
          }
        ]
      },
      "description": "Dictionary mapping outlet names to their module, tab, or menu lookup configurations. Used within module configs to define nested outlet content resolution.",
      "type": "object"
    },
    "DeclaredMenuItem": {
      "additionalProperties": false,
      "description": "Menu item declaration for outlets that support menu content. Specifies the menu item label.",
      "properties": {
        "itemLabel": {
          "type": "string"
        }
      },
      "required": [
        "itemLabel"
      ],
      "type": "object"
    },
    "DeclaredTab": {
      "additionalProperties": false,
      "description": "Tab declaration for outlets that support tabbed content. Specifies the tab label for the declared tab.",
      "properties": {
        "tabLabel": {
          "type": "string"
        }
      },
      "required": [
        "tabLabel"
      ],
      "type": "object"
    },
    "DynamicContentConfigInput": {
      "additionalProperties": {},
      "description": "Dynamic content configuration for a module. Tecton passes this through opaquely — it is consumed by DCM, not by the platform.",
      "properties": {
        "description": {
          "type": "string"
        },
        "height": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "name",
        "description",
        "height"
      ],
      "type": "object"
    },
    "Loader": {
      "additionalProperties": false,
      "description": "Individual loader element configuration. Defines the visual appearance of a single skeleton loader element.",
      "properties": {
        "ariaLabel": {
          "type": "string"
        },
        "classList": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "counts": {
          "type": "string"
        },
        "modifiers": {
          "type": "string"
        },
        "row": {
          "type": "number"
        },
        "shape": {
          "type": "string"
        },
        "style": {
          "type": "string"
        },
        "type": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "shape",
        "row"
      ],
      "type": "object"
    },
    "LoadingOptions": {
      "additionalProperties": false,
      "description": "Configuration for skeleton loading states. Defines outlet styling and loader elements to display during content loading.",
      "properties": {
        "loaders": {
          "items": {
            "$ref": "#/definitions/Loader"
          },
          "type": "array"
        },
        "outlet": {
          "additionalProperties": false,
          "properties": {
            "classList": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "style": {
              "type": "string"
            }
          },
          "type": "object"
        }
      },
      "required": [
        "loaders"
      ],
      "type": "object"
    },
    "MenuLookup": {
      "additionalProperties": false,
      "description": "Menu lookup configuration for resolving menu outlets. Associates a menu item with its action, modules, and context parameter name.",
      "properties": {
        "action": {
          "type": "string"
        },
        "contextIdParamName": {
          "type": "string"
        },
        "itemLabel": {
          "type": "string"
        },
        "modules": {
          "items": {
            "$ref": "#/definitions/ModuleLookup"
          },
          "type": "array"
        }
      },
      "required": [
        "itemLabel",
        "action",
        "modules",
        "contextIdParamName"
      ],
      "type": "object"
    },
    "ModuleConfig": {
      "additionalProperties": false,
      "description": "Complete configuration for a Tecton module instance. Contains identity, outlet configuration, security domains, and access rights. Used throughout the platform for module resolution and rendering decisions.",
      "properties": {
        "additionalDomains": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "allowDirectives": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "configuredOutlets": {
          "$ref": "#/definitions/ConfiguredOutlets"
        },
        "featureName": {
          "type": "string"
        },
        "moduleName": {
          "type": "string"
        },
        "rightsEnabled": {
          "type": "boolean"
        },
        "tabLabelOverride": {
          "type": "string"
        }
      },
      "required": [
        "moduleName",
        "featureName",
        "configuredOutlets"
      ],
      "type": "object"
    },
    "ModuleContext": {
      "anyOf": [
        {
          "$ref": "#/definitions/TectonDataTypes"
        },
        {
          "const": "None",
          "type": "string"
        }
      ],
      "description": "Context specifier for modules and outlets. Controls when modules are rendered based on data context or 'None' for context-free modules."
    },
    "ModuleFeatureManifestInput": {
      "additionalProperties": false,
      "description": "Input shape for a module manifest entry as authored in Antilles or q2 config files. routeConfig is omitted — adaptConfig synthesizes it from the feature/module key names. meta uses ModuleMetaInput to reflect the same partial state.",
      "properties": {
        "additionalContextRequirements": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "dynamicContent": {
          "$ref": "#/definitions/DynamicContentConfigInput"
        },
        "formPostAuth": {
          "type": "boolean"
        },
        "loadingOptions": {
          "$ref": "#/definitions/LoadingOptions"
        },
        "meta": {
          "$ref": "#/definitions/ModuleMetaInput"
        },
        "navigable": {
          "type": "boolean"
        },
        "overpanel": {
          "type": "boolean"
        },
        "primary": {
          "type": "boolean"
        },
        "requiredUserCapabilities": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "rightsEnabled": {
          "type": "boolean"
        },
        "routeConfig": {
          "$ref": "#/definitions/ModuleConfig"
        },
        "url": {
          "type": "string"
        }
      },
      "required": [
        "meta",
        "overpanel",
        "primary",
        "url"
      ],
      "type": "object"
    },
    "ModuleLookup": {
      "additionalProperties": false,
      "description": "Module lookup configuration for resolving feature outlets. Contains the feature and module names plus nested outlet configurations. Used by the feature resolver to find and render the appropriate module.",
      "properties": {
        "configuredOutlets": {
          "$ref": "#/definitions/ConfiguredOutlets"
        },
        "featureName": {
          "type": "string"
        },
        "moduleName": {
          "type": "string"
        }
      },
      "required": [
        "featureName",
        "moduleName",
        "configuredOutlets"
      ],
      "type": "object"
    },
    "ModuleMetaInput": {
      "additionalProperties": false,
      "description": "Input shape for module metadata as authored in Antilles or q2 config files. featureName and moduleName are omitted — adaptConfig injects them from the feature/module key names at runtime.",
      "properties": {
        "featureName": {
          "type": "string"
        },
        "moduleName": {
          "type": "string"
        },
        "outlets": {
          "additionalProperties": {
            "$ref": "#/definitions/OutletType"
          },
          "type": "object"
        },
        "params": {
          "additionalProperties": {
            "$ref": "#/definitions/ParamOptions"
          },
          "type": "object"
        },
        "type": {
          "$ref": "#/definitions/ModuleType"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "ModuleType": {
      "additionalProperties": false,
      "description": "Module type definition specifying context and optional minimum height.",
      "properties": {
        "context": {
          "$ref": "#/definitions/ModuleContext"
        },
        "minHeight": {
          "type": "string"
        }
      },
      "required": [
        "context"
      ],
      "type": "object"
    },
    "OutletResolveType": {
      "description": "Resolution strategy for outlet content. Determines how the platform resolves outlet content to modules.",
      "enum": [
        "Feature",
        "Tabs",
        "Menu"
      ],
      "type": "string"
    },
    "OutletType": {
      "additionalProperties": false,
      "description": "Outlet type definition extending module type with resolution configuration. Specifies how outlets resolve their content and what content is declared.",
      "properties": {
        "context": {
          "$ref": "#/definitions/ModuleContext"
        },
        "declaredMenuItems": {
          "items": {
            "$ref": "#/definitions/DeclaredMenuItem"
          },
          "type": "array"
        },
        "declaredTabs": {
          "items": {
            "$ref": "#/definitions/DeclaredTab"
          },
          "type": "array"
        },
        "minHeight": {
          "type": "string"
        },
        "required": {
          "type": "boolean"
        },
        "resolveType": {
          "$ref": "#/definitions/OutletResolveType"
        }
      },
      "required": [
        "context",
        "required",
        "resolveType"
      ],
      "type": "object"
    },
    "OverpanelConfigInput": {
      "additionalProperties": false,
      "description": "Input shape for an overpanel config entry as authored in Antilles or q2 config files. featureName and configuredOutlets are omitted — adaptConfig injects featureName from the feature key name, and configuredOutlets defaults to {}.",
      "properties": {
        "additionalDomains": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "allowDirectives": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "configuredOutlets": {
          "$ref": "#/definitions/ConfiguredOutlets"
        },
        "featureName": {
          "type": "string"
        },
        "moduleName": {
          "type": "string"
        },
        "options": {
          "$ref": "#/definitions/OverpanelOptions"
        },
        "public": {
          "type": "boolean"
        },
        "rightsEnabled": {
          "type": "boolean"
        },
        "tabLabelOverride": {
          "type": "string"
        }
      },
      "required": [
        "moduleName"
      ],
      "type": "object"
    },
    "OverpanelOptions": {
      "additionalProperties": false,
      "description": "Display configuration options for overpanels. Controls the visual presentation and behavior of overpanel dialogs.",
      "properties": {
        "fullWidth": {
          "type": "boolean"
        },
        "height": {
          "type": "string"
        },
        "isBlocking": {
          "type": "boolean"
        },
        "size": {
          "type": "string"
        },
        "testId": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "ParamOptions": {
      "additionalProperties": false,
      "description": "Parameter configuration options for module parameters. Specifies type validation and URL replacement behavior. Used by both SDK and platform for parameter handling.",
      "properties": {
        "replace": {
          "type": "boolean"
        },
        "type": {
          "enum": [
            "string",
            "number",
            "boolean"
          ],
          "type": "string"
        }
      },
      "required": [
        "replace",
        "type"
      ],
      "type": "object"
    },
    "TabLookup": {
      "additionalProperties": false,
      "description": "Tab lookup configuration for resolving tabbed outlets. Associates a tab label with an array of module lookups for that tab's content.",
      "properties": {
        "modules": {
          "items": {
            "$ref": "#/definitions/ModuleLookup"
          },
          "type": "array"
        },
        "tabLabel": {
          "type": "string"
        }
      },
      "required": [
        "tabLabel",
        "modules"
      ],
      "type": "object"
    },
    "TectonDataTypes": {
      "anyOf": [
        {
          "$ref": "#/definitions/ApplicationModuleContexts"
        },
        {
          "type": "string"
        }
      ],
      "description": "Union of application contexts and arbitrary context strings. Allows for custom context types beyond the standard application contexts."
    }
  },
  "description": "Input shape for a feature manifest as authored in Antilles or q2 config files. Uses input types so that adaptConfig-injected fields are optional.",
  "properties": {
    "additionalDomains": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "allowDirectives": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "configuredOverpanels": {
      "additionalProperties": {
        "$ref": "#/definitions/OverpanelConfigInput"
      },
      "type": "object"
    },
    "configuredSystemVariables": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "core": {
      "type": "boolean"
    },
    "isMFA": {
      "type": "boolean"
    },
    "legacy": {
      "type": "boolean"
    },
    "legacyOverpanelName": {
      "type": "string"
    },
    "legacyRouteName": {
      "type": "string"
    },
    "modules": {
      "additionalProperties": {
        "$ref": "#/definitions/ModuleFeatureManifestInput"
      },
      "type": "object"
    },
    "requiredUserCapabilities": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "rightsEnabled": {
      "type": "boolean"
    },
    "routeName": {
      "type": "string"
    }
  },
  "required": [
    "core",
    "modules"
  ],
  "type": "object"
}