{
  "schemaVersion": "1.0.0",
  "generatedAt": "2026-08-24T20:08:13.959Z",
  "packageName": "@praxisui/files-upload",
  "packageVersion": "9.0.17",
  "sourceRegistry": "praxis-component-registry-ingestion",
  "sourceRegistryVersion": "1.0.0",
  "componentCount": 1,
  "components": {
    "praxis-files-upload": {
      "id": "praxis-files-upload",
      "description": "Componente para upload de arquivos com suporte a configuracao dinamica, eventos e integracao com backend.",
      "inputs": [
        {
          "name": "config",
          "type": "FilesUploadConfig",
          "required": false,
          "description": "Configuracao do upload (tipos aceitos, limites, endpoints, comportamento).",
          "label": "Configuracao"
        },
        {
          "name": "filesUploadId",
          "type": "string",
          "required": false,
          "description": "Identificador logico do upload para persistencia e rastreamento.",
          "label": "Upload ID"
        },
        {
          "name": "componentInstanceId",
          "type": "string",
          "required": false,
          "description": "Identificador opcional para diferenciar multiplas instancias na mesma tela.",
          "label": "ID da instancia"
        },
        {
          "name": "baseUrl",
          "type": "string",
          "required": false,
          "description": "Base URL da API de arquivos.",
          "label": "Base URL"
        },
        {
          "name": "displayMode",
          "type": "'full' | 'compact'",
          "required": false,
          "description": "Define o modo de exibicao do componente.",
          "label": "Modo de exibicao",
          "default": "full"
        },
        {
          "name": "context",
          "type": "Record<string, unknown>",
          "required": false,
          "description": "Contexto usado para resolver expressoes em metadados.",
          "label": "Contexto"
        },
        {
          "name": "enableCustomization",
          "type": "boolean",
          "required": false,
          "description": "Habilita a UI de customizacao/configuracao no runtime.",
          "label": "Modo de customizacao",
          "default": false
        }
      ],
      "outputs": [
        {
          "name": "uploadSuccess",
          "type": "FileMetadata",
          "required": false,
          "description": "Disparado quando o upload e finalizado com sucesso.",
          "label": "Upload concluido"
        },
        {
          "name": "bulkComplete",
          "type": "BulkUploadResponseData",
          "required": false,
          "description": "Disparado quando o upload em lote e finalizado.",
          "label": "Upload em lote concluido"
        },
        {
          "name": "error",
          "type": "ErrorResponse",
          "required": false,
          "description": "Disparado quando ocorre erro durante o upload.",
          "label": "Erro no upload"
        },
        {
          "name": "rateLimited",
          "type": "RateLimitInfo",
          "required": false,
          "description": "Disparado quando ocorre rate limiting.",
          "label": "Rate limit"
        },
        {
          "name": "uploadStart",
          "type": "UploadStartEvent",
          "required": false,
          "description": "Disparado quando o upload inicia com contexto do envio.",
          "label": "Inicio do upload"
        },
        {
          "name": "uploadProgress",
          "type": "UploadProgressEvent",
          "required": false,
          "description": "Disparado conforme o progresso de upload.",
          "label": "Progresso"
        },
        {
          "name": "retry",
          "type": "BulkUploadFileResult",
          "required": false,
          "description": "Disparado quando o usuario aciona reenvio.",
          "label": "Reenvio"
        },
        {
          "name": "download",
          "type": "BulkUploadFileResult",
          "required": false,
          "description": "Disparado quando o usuario solicita download.",
          "label": "Download"
        },
        {
          "name": "copyLink",
          "type": "BulkUploadFileResult",
          "required": false,
          "description": "Disparado quando o usuario copia o link.",
          "label": "Copiar link"
        },
        {
          "name": "detailsOpened",
          "type": "BulkUploadFileResult",
          "required": false,
          "description": "Disparado quando os detalhes do item sao abertos.",
          "label": "Detalhes abertos"
        },
        {
          "name": "detailsClosed",
          "type": "BulkUploadFileResult",
          "required": false,
          "description": "Disparado quando os detalhes do item sao fechados.",
          "label": "Detalhes fechados"
        },
        {
          "name": "pendingStateChange",
          "type": "PendingFilesState",
          "required": false,
          "description": "Disparado quando o estado de selecao pendente muda.",
          "label": "Arquivos pendentes"
        },
        {
          "name": "readinessChange",
          "type": "FilesUploadReadinessEvent",
          "required": false,
          "description": "Disparado quando o componente alterna entre configuracao local, servidor ou fallback.",
          "label": "Prontidao"
        },
        {
          "name": "proximityChange",
          "type": "boolean",
          "required": false,
          "description": "Disparado quando muda o estado de proximidade do drag.",
          "label": "Proximidade"
        }
      ],
      "configSchemaId": null,
      "selector": "praxis-files-upload",
      "friendlyName": "Praxis Files Upload",
      "icon": "upload_file",
      "tags": [
        "files",
        "upload",
        "widget",
        "configurable"
      ],
      "lib": "@praxisui/files-upload",
      "actions": [
        {
          "id": "retry",
          "label": "Reenviar",
          "icon": "refresh",
          "description": "Emite evento de reenvio do item",
          "emit": "retry",
          "payloadSchema": {
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "description": "Nome do arquivo"
              },
              "status": {
                "type": "string",
                "description": "Status do upload"
              },
              "file": {
                "type": "object",
                "description": "Metadados do arquivo"
              },
              "error": {
                "type": "object",
                "description": "Erro do upload"
              }
            },
            "required": [
              "fileName",
              "status"
            ],
            "example": {
              "fileName": "documento.pdf",
              "status": "failed"
            }
          },
          "scope": "context"
        },
        {
          "id": "download",
          "label": "Download",
          "icon": "file_download",
          "description": "Emite evento de download do item",
          "emit": "download",
          "payloadSchema": {
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "description": "Nome do arquivo"
              },
              "status": {
                "type": "string",
                "description": "Status do upload"
              },
              "file": {
                "type": "object",
                "description": "Metadados do arquivo"
              },
              "error": {
                "type": "object",
                "description": "Erro do upload"
              }
            },
            "required": [
              "fileName",
              "status"
            ],
            "example": {
              "fileName": "documento.pdf",
              "status": "succeeded"
            }
          },
          "scope": "context"
        },
        {
          "id": "copy-link",
          "label": "Copiar link",
          "icon": "link",
          "description": "Emite evento ao copiar o link do item",
          "emit": "copyLink",
          "payloadSchema": {
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "description": "Nome do arquivo"
              },
              "status": {
                "type": "string",
                "description": "Status do upload"
              },
              "file": {
                "type": "object",
                "description": "Metadados do arquivo"
              },
              "error": {
                "type": "object",
                "description": "Erro do upload"
              }
            },
            "required": [
              "fileName",
              "status"
            ],
            "example": {
              "fileName": "documento.pdf",
              "status": "succeeded"
            }
          },
          "scope": "context"
        },
        {
          "id": "details-opened",
          "label": "Abrir detalhes",
          "icon": "info",
          "description": "Emite evento ao abrir detalhes do item",
          "emit": "detailsOpened",
          "payloadSchema": {
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "description": "Nome do arquivo"
              },
              "status": {
                "type": "string",
                "description": "Status do upload"
              },
              "file": {
                "type": "object",
                "description": "Metadados do arquivo"
              },
              "error": {
                "type": "object",
                "description": "Erro do upload"
              }
            },
            "required": [
              "fileName",
              "status"
            ],
            "example": {
              "fileName": "documento.pdf",
              "status": "succeeded"
            }
          },
          "scope": "context"
        },
        {
          "id": "details-closed",
          "label": "Fechar detalhes",
          "icon": "info_outline",
          "description": "Emite evento ao fechar detalhes do item",
          "emit": "detailsClosed",
          "payloadSchema": {
            "type": "object",
            "properties": {
              "fileName": {
                "type": "string",
                "description": "Nome do arquivo"
              },
              "status": {
                "type": "string",
                "description": "Status do upload"
              },
              "file": {
                "type": "object",
                "description": "Metadados do arquivo"
              },
              "error": {
                "type": "object",
                "description": "Erro do upload"
              }
            },
            "required": [
              "fileName",
              "status"
            ],
            "example": {
              "fileName": "documento.pdf",
              "status": "succeeded"
            }
          },
          "scope": "context"
        }
      ],
      "configEditor": {
        "component": "[ref:PraxisFilesUploadWidgetConfigEditor]",
        "title": "Configurar upload de arquivos"
      },
      "authoringManifestRef": {
        "componentId": "praxis-files-upload",
        "source": "PRAXIS_FILES_UPLOAD_AUTHORING_MANIFEST"
      },
      "source": "projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts",
      "exportName": "PRAXIS_FILES_UPLOAD_COMPONENT_METADATA",
      "componentCapabilities": [
        {
          "path": "strategy",
          "category": "strategy",
          "valueKind": "enum",
          "allowedValues": [
            "direct",
            "presign",
            "auto"
          ],
          "description": "Upload strategy."
        },
        {
          "path": "ui",
          "category": "ui",
          "valueKind": "object",
          "description": "UI configuration."
        },
        {
          "path": "ui.showDropzone",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Show drag-and-drop dropzone."
        },
        {
          "path": "ui.accept",
          "category": "ui",
          "valueKind": "array",
          "description": "Accept attribute hints (extensions or mime types)."
        },
        {
          "path": "ui.accept[]",
          "category": "ui",
          "valueKind": "string",
          "description": "Single accept entry."
        },
        {
          "path": "ui.dense",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Dense layout."
        },
        {
          "path": "ui.showConflictPolicySelector",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Show conflict policy selector."
        },
        {
          "path": "ui.showMetadataForm",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Show metadata form for each file."
        },
        {
          "path": "ui.showProgress",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Show progress UI."
        },
        {
          "path": "ui.manualUpload",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Require manual start for uploads."
        },
        {
          "path": "ui.dropzone",
          "category": "ui",
          "valueKind": "object",
          "description": "Dropzone interaction options."
        },
        {
          "path": "ui.dropzone.expandOnDragProximity",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Expand dropzone on drag proximity."
        },
        {
          "path": "ui.dropzone.proximityPx",
          "category": "ui",
          "valueKind": "number",
          "description": "Proximity radius in pixels."
        },
        {
          "path": "ui.dropzone.expandMode",
          "category": "ui",
          "valueKind": "enum",
          "allowedValues": [
            "overlay",
            "inline"
          ],
          "description": "Dropzone expansion mode."
        },
        {
          "path": "ui.dropzone.expandHeight",
          "category": "ui",
          "valueKind": "number",
          "description": "Expanded height (px)."
        },
        {
          "path": "ui.dropzone.expandDebounceMs",
          "category": "ui",
          "valueKind": "number",
          "description": "Drag debounce (ms)."
        },
        {
          "path": "ui.list",
          "category": "ui",
          "valueKind": "object",
          "description": "Uploaded files list options."
        },
        {
          "path": "ui.list.collapseAfter",
          "category": "ui",
          "valueKind": "number",
          "description": "Collapse list after N items."
        },
        {
          "path": "ui.list.detailsMode",
          "category": "ui",
          "valueKind": "enum",
          "allowedValues": [
            "card",
            "sidesheet",
            "auto"
          ],
          "description": "Details panel mode."
        },
        {
          "path": "ui.list.detailsMaxWidth",
          "category": "ui",
          "valueKind": "number",
          "description": "Details panel max width (px)."
        },
        {
          "path": "ui.list.detailsShowTechnical",
          "category": "ui",
          "valueKind": "boolean",
          "description": "Show technical details by default."
        },
        {
          "path": "ui.list.detailsFields",
          "category": "ui",
          "valueKind": "array",
          "description": "Allowed metadata fields to display."
        },
        {
          "path": "ui.list.detailsFields[]",
          "category": "ui",
          "valueKind": "string",
          "description": "Single metadata field name."
        },
        {
          "path": "ui.list.detailsAnchor",
          "category": "ui",
          "valueKind": "enum",
          "allowedValues": [
            "item",
            "field"
          ],
          "description": "Details overlay anchor."
        },
        {
          "path": "limits",
          "category": "limits",
          "valueKind": "object",
          "description": "Upload limits."
        },
        {
          "path": "limits.maxFileSizeBytes",
          "category": "limits",
          "valueKind": "number",
          "description": "Max file size (bytes)."
        },
        {
          "path": "limits.maxFilesPerBulk",
          "category": "limits",
          "valueKind": "number",
          "description": "Max files per bulk upload."
        },
        {
          "path": "limits.maxBulkSizeBytes",
          "category": "limits",
          "valueKind": "number",
          "description": "Max bulk size (bytes)."
        },
        {
          "path": "options",
          "category": "options",
          "valueKind": "object",
          "description": "Backend options sent as JSON."
        },
        {
          "path": "options.defaultConflictPolicy",
          "category": "options",
          "valueKind": "enum",
          "allowedValues": [
            "ERROR",
            "SKIP",
            "OVERWRITE",
            "MAKE_UNIQUE",
            "RENAME"
          ],
          "description": "Default conflict policy."
        },
        {
          "path": "options.strictValidation",
          "category": "options",
          "valueKind": "boolean",
          "description": "Strict backend validation."
        },
        {
          "path": "options.maxUploadSizeMb",
          "category": "options",
          "valueKind": "number",
          "description": "Max upload size in MB."
        },
        {
          "path": "options.allowedExtensions",
          "category": "options",
          "valueKind": "array",
          "description": "Allowed file extensions."
        },
        {
          "path": "options.allowedExtensions[]",
          "category": "options",
          "valueKind": "string",
          "description": "Single extension (e.g., pdf)."
        },
        {
          "path": "options.acceptMimeTypes",
          "category": "options",
          "valueKind": "array",
          "description": "Allowed mime types."
        },
        {
          "path": "options.acceptMimeTypes[]",
          "category": "options",
          "valueKind": "string",
          "description": "Single mime type."
        },
        {
          "path": "options.targetDirectory",
          "category": "options",
          "valueKind": "string",
          "description": "Target directory on backend."
        },
        {
          "path": "options.enableVirusScanning",
          "category": "options",
          "valueKind": "boolean",
          "description": "Enable virus scanning."
        },
        {
          "path": "bulk",
          "category": "bulk",
          "valueKind": "object",
          "description": "Bulk upload tuning."
        },
        {
          "path": "bulk.failFast",
          "category": "bulk",
          "valueKind": "boolean",
          "description": "Abort on first error."
        },
        {
          "path": "bulk.parallelUploads",
          "category": "bulk",
          "valueKind": "number",
          "description": "Parallel uploads count."
        },
        {
          "path": "bulk.retryCount",
          "category": "bulk",
          "valueKind": "number",
          "description": "Retry count."
        },
        {
          "path": "bulk.retryBackoffMs",
          "category": "bulk",
          "valueKind": "number",
          "description": "Retry backoff (ms)."
        },
        {
          "path": "quotas",
          "category": "quotas",
          "valueKind": "object",
          "description": "Quota UX behavior."
        },
        {
          "path": "quotas.showQuotaWarnings",
          "category": "quotas",
          "valueKind": "boolean",
          "description": "Show quota warnings."
        },
        {
          "path": "quotas.blockOnExceed",
          "category": "quotas",
          "valueKind": "boolean",
          "description": "Block uploads when exceeded."
        },
        {
          "path": "rateLimit",
          "category": "rateLimit",
          "valueKind": "object",
          "description": "429 handling."
        },
        {
          "path": "rateLimit.autoRetryOn429",
          "category": "rateLimit",
          "valueKind": "boolean",
          "description": "Auto retry on 429."
        },
        {
          "path": "rateLimit.showBannerOn429",
          "category": "rateLimit",
          "valueKind": "boolean",
          "description": "Show rate limit banner."
        },
        {
          "path": "rateLimit.maxAutoRetry",
          "category": "rateLimit",
          "valueKind": "number",
          "description": "Max auto retry attempts."
        },
        {
          "path": "rateLimit.baseBackoffMs",
          "category": "rateLimit",
          "valueKind": "number",
          "description": "Base backoff (ms)."
        },
        {
          "path": "headers",
          "category": "headers",
          "valueKind": "object",
          "description": "Header mapping for backend."
        },
        {
          "path": "headers.tenantHeader",
          "category": "headers",
          "valueKind": "string",
          "description": "Tenant header name."
        },
        {
          "path": "headers.userHeader",
          "category": "headers",
          "valueKind": "string",
          "description": "User header name."
        },
        {
          "path": "messages",
          "category": "messages",
          "valueKind": "object",
          "description": "User-facing text overrides."
        },
        {
          "path": "messages.successSingle",
          "category": "messages",
          "valueKind": "string",
          "description": "Single upload success message."
        },
        {
          "path": "messages.successBulk",
          "category": "messages",
          "valueKind": "string",
          "description": "Bulk upload success message."
        },
        {
          "path": "messages.errors",
          "category": "messages",
          "valueKind": "object",
          "description": "Error message map."
        },
        {
          "path": "messages.errors.[code]",
          "category": "messages",
          "valueKind": "string",
          "description": "Message for a specific error code."
        }
      ],
      "componentCapabilityNotes": [
        "limits.maxFileSizeBytes and limits.maxBulkSizeBytes are bytes (e.g., 10485760 for 10MB).",
        "options.allowedExtensions is enforced by backend validation; ui.accept is only a client hint.",
        "Use options.defaultConflictPolicy to control name collisions on upload."
      ],
      "componentContext": {
        "version": "v1",
        "optionsByPath": {
          "strategy": {
            "mode": "enum",
            "options": [
              {
                "value": "direct",
                "label": "Direct"
              },
              {
                "value": "presign",
                "label": "Presign"
              },
              {
                "value": "auto",
                "label": "Auto"
              }
            ]
          },
          "ui.dropzone.expandMode": {
            "mode": "enum",
            "options": [
              {
                "value": "overlay",
                "label": "Overlay"
              },
              {
                "value": "inline",
                "label": "Inline"
              }
            ]
          },
          "ui.list.detailsMode": {
            "mode": "enum",
            "options": [
              {
                "value": "card",
                "label": "Card"
              },
              {
                "value": "sidesheet",
                "label": "Side sheet"
              },
              {
                "value": "auto",
                "label": "Auto"
              }
            ]
          },
          "ui.list.detailsAnchor": {
            "mode": "enum",
            "options": [
              {
                "value": "item",
                "label": "Item"
              },
              {
                "value": "field",
                "label": "Field"
              }
            ]
          },
          "options.defaultConflictPolicy": {
            "mode": "enum",
            "options": [
              {
                "value": "ERROR",
                "label": "Error"
              },
              {
                "value": "SKIP",
                "label": "Skip"
              },
              {
                "value": "OVERWRITE",
                "label": "Overwrite"
              },
              {
                "value": "MAKE_UNIQUE",
                "label": "Make unique"
              },
              {
                "value": "RENAME",
                "label": "Rename"
              }
            ]
          }
        },
        "actionCatalog": [
          {
            "id": "strategy.set",
            "intentExamples": [
              "strategy",
              "upload strategy"
            ],
            "patchTemplate": {
              "strategy": "{{value}}"
            }
          },
          {
            "id": "ui.showDropzone.enable",
            "intentExamples": [
              "show dropzone",
              "enable dropzone"
            ],
            "patchTemplate": {
              "ui": {
                "showDropzone": true
              }
            }
          },
          {
            "id": "ui.showDropzone.disable",
            "intentExamples": [
              "hide dropzone",
              "disable dropzone"
            ],
            "patchTemplate": {
              "ui": {
                "showDropzone": false
              }
            }
          },
          {
            "id": "ui.manualUpload.enable",
            "intentExamples": [
              "manual upload",
              "upload button"
            ],
            "patchTemplate": {
              "ui": {
                "manualUpload": true
              }
            }
          },
          {
            "id": "ui.manualUpload.disable",
            "intentExamples": [
              "auto upload",
              "instant upload"
            ],
            "patchTemplate": {
              "ui": {
                "manualUpload": false
              }
            }
          },
          {
            "id": "ui.showProgress.enable",
            "intentExamples": [
              "show progress",
              "progress bar"
            ],
            "patchTemplate": {
              "ui": {
                "showProgress": true
              }
            }
          },
          {
            "id": "ui.showProgress.disable",
            "intentExamples": [
              "hide progress",
              "no progress"
            ],
            "patchTemplate": {
              "ui": {
                "showProgress": false
              }
            }
          },
          {
            "id": "limits.maxFileSizeBytes.set",
            "intentExamples": [
              "max file size",
              "size limit"
            ],
            "patchTemplate": {
              "limits": {
                "maxFileSizeBytes": "{{value}}"
              }
            }
          },
          {
            "id": "limits.maxFilesPerBulk.set",
            "intentExamples": [
              "max files",
              "files per upload"
            ],
            "patchTemplate": {
              "limits": {
                "maxFilesPerBulk": "{{value}}"
              }
            }
          },
          {
            "id": "options.defaultConflictPolicy.set",
            "intentExamples": [
              "conflict policy",
              "overwrite",
              "rename"
            ],
            "patchTemplate": {
              "options": {
                "defaultConflictPolicy": "{{value}}"
              }
            }
          },
          {
            "id": "options.allowedExtensions.add",
            "intentExamples": [
              "allowed extensions",
              "extensions",
              "file types"
            ],
            "patchTemplate": {
              "options": {
                "allowedExtensions": [
                  "{{value}}"
                ]
              }
            }
          }
        ],
        "fieldResolvers": {},
        "hints": [
          "limits.maxFileSizeBytes expects bytes (e.g., 10485760 for 10MB).",
          "Use options.allowedExtensions for backend validation and ui.accept for input hints."
        ]
      },
      "authoringManifest": {
        "schemaVersion": "1.0.0",
        "componentId": "praxis-files-upload",
        "ownerPackage": "@praxisui/files-upload",
        "configSchemaId": "FilesUploadConfig",
        "manifestVersion": "1.0.0",
        "runtimeInputs": [
          {
            "name": "config",
            "type": "FilesUploadConfig",
            "description": "Upload strategy, UI, limits, backend options, bulk execution, quota/rate feedback, headers and messages."
          },
          {
            "name": "filesUploadId",
            "type": "string",
            "description": "Stable upload id used for config persistence and telemetry correlation."
          },
          {
            "name": "componentInstanceId",
            "type": "string",
            "description": "Optional instance discriminator when the same upload id appears more than once."
          },
          {
            "name": "baseUrl",
            "type": "string",
            "description": "Canonical files API base URL. Direct upload uses baseUrl/upload, bulk uses baseUrl/bulk and presign uses baseUrl/upload/presign."
          },
          {
            "name": "displayMode",
            "type": "'full' | 'compact'",
            "allowedValues": [
              "full",
              "compact"
            ],
            "description": "Runtime display mode input."
          },
          {
            "name": "context",
            "type": "Record<string, unknown>",
            "description": "Host context available to metadata and event consumers."
          },
          {
            "name": "enableCustomization",
            "type": "boolean",
            "description": "Enables the Settings Panel configuration editor."
          }
        ],
        "editableTargets": [
          {
            "kind": "acceptedTypes",
            "resolver": "files-accept-list",
            "description": "Allowed file extensions and MIME types projected to ui.accept, options.allowedExtensions and options.acceptMimeTypes."
          },
          {
            "kind": "sizeLimit",
            "resolver": "max-file-size-policy",
            "description": "Maximum single-file size in limits.maxFileSizeBytes and backend-facing options.maxUploadSizeMb."
          },
          {
            "kind": "fileCountLimit",
            "resolver": "max-files-per-bulk-policy",
            "description": "Maximum number of files accepted in a bulk selection."
          },
          {
            "kind": "presignEndpoint",
            "resolver": "files-api-base-url-presign-contract",
            "description": "Presign operation endpoint derived from baseUrl + /upload/presign; arbitrary per-operation URLs are not accepted."
          },
          {
            "kind": "uploadEndpoint",
            "resolver": "files-api-base-url-upload-contract",
            "description": "Direct and bulk upload endpoints derived from baseUrl + /upload and /bulk."
          },
          {
            "kind": "securityPolicy",
            "resolver": "upload-security-policy",
            "description": "Strict validation, virus scanning, conflict policy, target directory, quotas, rate limit and contextual headers."
          },
          {
            "kind": "errorMessages",
            "resolver": "upload-error-code-message",
            "description": "Host-provided message overrides under messages.errors keyed by backend error code."
          },
          {
            "kind": "display",
            "resolver": "files-upload-display-mode-and-ui",
            "description": "Runtime displayMode plus non-backend visual UI flags."
          }
        ],
        "operations": [
          {
            "operationId": "accept.types.set",
            "title": "Set accepted file types",
            "scope": "global",
            "targetKind": "acceptedTypes",
            "target": {
              "kind": "acceptedTypes",
              "resolver": "files-accept-list",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "accept"
              ],
              "properties": {
                "accept": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "allowedExtensions": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "acceptMimeTypes": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            },
            "effects": [
              {
                "kind": "set-value",
                "path": "ui.accept"
              },
              {
                "kind": "set-value",
                "path": "options.allowedExtensions"
              },
              {
                "kind": "set-value",
                "path": "options.acceptMimeTypes"
              }
            ],
            "destructive": false,
            "requiresConfirmation": false,
            "validators": [
              "file-type-list-explicit",
              "file-type-entry-valid",
              "backend-accept-options-consistent",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "ui.accept",
              "options.allowedExtensions",
              "options.acceptMimeTypes"
            ],
            "submissionImpact": "affects-submission",
            "preconditions": [
              "config-initialized"
            ]
          },
          {
            "operationId": "limit.fileSize.set",
            "title": "Set max file size",
            "scope": "global",
            "targetKind": "sizeLimit",
            "target": {
              "kind": "sizeLimit",
              "resolver": "max-file-size-policy",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "maxFileSizeBytes"
              ],
              "properties": {
                "maxFileSizeBytes": {
                  "type": "number"
                },
                "maxUploadSizeMb": {
                  "type": "number"
                }
              }
            },
            "effects": [
              {
                "kind": "set-value",
                "path": "limits.maxFileSizeBytes"
              },
              {
                "kind": "set-value",
                "path": "options.maxUploadSizeMb"
              }
            ],
            "destructive": false,
            "requiresConfirmation": false,
            "validators": [
              "size-limit-numeric",
              "size-limit-within-platform-policy",
              "size-limit-client-backend-consistent",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "limits.maxFileSizeBytes",
              "options.maxUploadSizeMb"
            ],
            "submissionImpact": "affects-submission",
            "preconditions": [
              "config-initialized"
            ]
          },
          {
            "operationId": "limit.fileCount.set",
            "title": "Set max file count",
            "scope": "global",
            "targetKind": "fileCountLimit",
            "target": {
              "kind": "fileCountLimit",
              "resolver": "max-files-per-bulk-policy",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "maxFilesPerBulk"
              ],
              "properties": {
                "maxFilesPerBulk": {
                  "type": "number"
                },
                "maxBulkSizeBytes": {
                  "type": "number"
                }
              }
            },
            "effects": [
              {
                "kind": "set-value",
                "path": "limits.maxFilesPerBulk"
              },
              {
                "kind": "set-value",
                "path": "limits.maxBulkSizeBytes"
              }
            ],
            "destructive": false,
            "requiresConfirmation": false,
            "validators": [
              "file-count-limit-numeric",
              "bulk-size-limit-numeric",
              "bulk-limit-within-platform-policy",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "limits.maxFilesPerBulk",
              "limits.maxBulkSizeBytes"
            ],
            "submissionImpact": "affects-submission",
            "preconditions": [
              "config-initialized"
            ]
          },
          {
            "operationId": "endpoint.presign.set",
            "title": "Set presign endpoint",
            "scope": "global",
            "targetKind": "presignEndpoint",
            "target": {
              "kind": "presignEndpoint",
              "resolver": "files-api-base-url-presign-contract",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "baseUrl"
              ],
              "properties": {
                "baseUrl": {
                  "type": "string"
                },
                "strategy": {
                  "enum": [
                    "direct",
                    "presign",
                    "auto"
                  ]
                },
                "allowCrossOriginPresignedTarget": {
                  "type": "boolean"
                }
              }
            },
            "effects": [
              {
                "kind": "compile-domain-patch",
                "handler": "files-upload-presign-base-url",
                "handlerContract": {
                  "reads": [
                    "baseUrl",
                    "strategy"
                  ],
                  "writes": [
                    "baseUrl",
                    "strategy"
                  ],
                  "identityKeys": [
                    "baseUrl"
                  ],
                  "inputSchema": {
                    "type": "object",
                    "required": [
                      "baseUrl"
                    ],
                    "properties": {
                      "baseUrl": {
                        "type": "string"
                      },
                      "strategy": {
                        "enum": [
                          "direct",
                          "presign",
                          "auto"
                        ]
                      },
                      "allowCrossOriginPresignedTarget": {
                        "type": "boolean"
                      }
                    }
                  },
                  "failureModes": [
                    "unsafe-url",
                    "non-praxis-backend-surface",
                    "presign-path-override",
                    "cross-origin-presigned-fields-leak"
                  ],
                  "description": "Validates the files API base URL and preserves the canonical POST baseUrl/upload/presign?filename=... contract; arbitrary presign URLs are rejected."
                }
              }
            ],
            "destructive": true,
            "requiresConfirmation": true,
            "validators": [
              "endpoint-url-safe",
              "endpoint-uses-praxis-backend-surface",
              "presign-endpoint-fixed-contract",
              "presign-cross-origin-fields-safe",
              "security-change-confirmed"
            ],
            "affectedPaths": [
              "baseUrl",
              "strategy"
            ],
            "submissionImpact": "affects-remote-binding",
            "preconditions": [
              "config-initialized",
              "confirmation-collected"
            ]
          },
          {
            "operationId": "endpoint.upload.set",
            "title": "Set upload endpoint",
            "scope": "global",
            "targetKind": "uploadEndpoint",
            "target": {
              "kind": "uploadEndpoint",
              "resolver": "files-api-base-url-upload-contract",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "baseUrl"
              ],
              "properties": {
                "baseUrl": {
                  "type": "string"
                },
                "strategy": {
                  "enum": [
                    "direct",
                    "presign",
                    "auto"
                  ]
                },
                "allowCrossOriginPresignedTarget": {
                  "type": "boolean"
                }
              }
            },
            "effects": [
              {
                "kind": "compile-domain-patch",
                "handler": "files-upload-direct-base-url",
                "handlerContract": {
                  "reads": [
                    "baseUrl",
                    "strategy"
                  ],
                  "writes": [
                    "baseUrl",
                    "strategy"
                  ],
                  "identityKeys": [
                    "baseUrl"
                  ],
                  "inputSchema": {
                    "type": "object",
                    "required": [
                      "baseUrl"
                    ],
                    "properties": {
                      "baseUrl": {
                        "type": "string"
                      },
                      "strategy": {
                        "enum": [
                          "direct",
                          "presign",
                          "auto"
                        ]
                      },
                      "allowCrossOriginPresignedTarget": {
                        "type": "boolean"
                      }
                    }
                  },
                  "failureModes": [
                    "unsafe-url",
                    "non-praxis-backend-surface",
                    "upload-path-override",
                    "bulk-path-override"
                  ],
                  "description": "Validates the files API base URL and preserves the canonical POST baseUrl/upload and POST baseUrl/bulk contracts."
                }
              }
            ],
            "destructive": true,
            "requiresConfirmation": true,
            "validators": [
              "endpoint-url-safe",
              "endpoint-uses-praxis-backend-surface",
              "upload-endpoint-fixed-contract",
              "bulk-endpoint-fixed-contract",
              "security-change-confirmed"
            ],
            "affectedPaths": [
              "baseUrl",
              "strategy"
            ],
            "submissionImpact": "affects-remote-binding",
            "preconditions": [
              "config-initialized",
              "confirmation-collected"
            ]
          },
          {
            "operationId": "security.policy.set",
            "title": "Set upload security policy",
            "scope": "global",
            "targetKind": "securityPolicy",
            "target": {
              "kind": "securityPolicy",
              "resolver": "upload-security-policy",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "properties": {
                "strictValidation": {
                  "type": "boolean"
                },
                "enableVirusScanning": {
                  "type": "boolean"
                },
                "defaultConflictPolicy": {
                  "enum": [
                    "ERROR",
                    "SKIP",
                    "OVERWRITE",
                    "MAKE_UNIQUE",
                    "RENAME"
                  ]
                },
                "targetDirectory": {
                  "type": "string"
                },
                "showQuotaWarnings": {
                  "type": "boolean"
                },
                "blockOnExceed": {
                  "type": "boolean"
                },
                "autoRetryOn429": {
                  "type": "boolean"
                },
                "showBannerOn429": {
                  "type": "boolean"
                },
                "maxAutoRetry": {
                  "type": "number"
                },
                "baseBackoffMs": {
                  "type": "number"
                },
                "tenantHeader": {
                  "type": "string"
                },
                "userHeader": {
                  "type": "string"
                }
              }
            },
            "effects": [
              {
                "kind": "merge-object",
                "path": "options"
              },
              {
                "kind": "merge-object",
                "path": "quotas"
              },
              {
                "kind": "merge-object",
                "path": "rateLimit"
              },
              {
                "kind": "merge-object",
                "path": "headers"
              }
            ],
            "destructive": true,
            "requiresConfirmation": true,
            "validators": [
              "security-change-confirmed",
              "security-policy-compatible",
              "target-directory-safe",
              "conflict-policy-valid",
              "quota-rate-policy-valid",
              "header-names-safe",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "options.strictValidation",
              "options.enableVirusScanning",
              "options.defaultConflictPolicy",
              "options.targetDirectory",
              "quotas",
              "rateLimit",
              "headers"
            ],
            "submissionImpact": "config-only",
            "preconditions": [
              "config-initialized",
              "confirmation-collected"
            ]
          },
          {
            "operationId": "message.error.set",
            "title": "Set error message override",
            "scope": "global",
            "targetKind": "errorMessages",
            "target": {
              "kind": "errorMessages",
              "resolver": "upload-error-code-message",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "required": [
                "code",
                "message"
              ],
              "properties": {
                "code": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            },
            "effects": [
              {
                "kind": "merge-object",
                "path": "messages.errors"
              }
            ],
            "destructive": false,
            "requiresConfirmation": false,
            "validators": [
              "error-code-known",
              "error-message-i18n-compatible",
              "message-not-empty",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "messages.errors"
            ],
            "submissionImpact": "config-only",
            "preconditions": [
              "config-initialized"
            ]
          },
          {
            "operationId": "display.mode.set",
            "title": "Set display mode",
            "scope": "global",
            "targetKind": "display",
            "target": {
              "kind": "display",
              "resolver": "files-upload-display-mode-and-ui",
              "ambiguityPolicy": "fail",
              "required": false
            },
            "inputSchema": {
              "type": "object",
              "properties": {
                "displayMode": {
                  "enum": [
                    "full",
                    "compact"
                  ]
                },
                "dense": {
                  "type": "boolean"
                },
                "showDropzone": {
                  "type": "boolean"
                },
                "showProgress": {
                  "type": "boolean"
                },
                "manualUpload": {
                  "type": "boolean"
                },
                "showMetadataForm": {
                  "type": "boolean"
                },
                "showConflictPolicySelector": {
                  "type": "boolean"
                }
              }
            },
            "effects": [
              {
                "kind": "set-value",
                "path": "displayMode"
              },
              {
                "kind": "merge-object",
                "path": "ui"
              }
            ],
            "destructive": false,
            "requiresConfirmation": false,
            "validators": [
              "display-mode-valid",
              "display-ui-compatible",
              "editor-runtime-round-trip"
            ],
            "affectedPaths": [
              "displayMode",
              "ui.dense",
              "ui.showDropzone",
              "ui.showProgress",
              "ui.manualUpload",
              "ui.showMetadataForm",
              "ui.showConflictPolicySelector"
            ],
            "submissionImpact": "visual-only",
            "preconditions": [
              "config-initialized"
            ]
          }
        ],
        "validators": [
          {
            "validatorId": "file-type-list-explicit",
            "level": "error",
            "code": "PFU001",
            "description": "Accepted type edits must provide a non-empty explicit list and may not rely on wildcard-only policy."
          },
          {
            "validatorId": "file-type-entry-valid",
            "level": "error",
            "code": "PFU002",
            "description": "Each accepted type must be a valid extension, exact MIME type or controlled subtype wildcard."
          },
          {
            "validatorId": "backend-accept-options-consistent",
            "level": "error",
            "code": "PFU003",
            "description": "ui.accept hints must remain consistent with options.allowedExtensions and options.acceptMimeTypes when backend validation is configured."
          },
          {
            "validatorId": "size-limit-numeric",
            "level": "error",
            "code": "PFU004",
            "description": "Single file size limits must be positive numeric byte and MB values."
          },
          {
            "validatorId": "size-limit-within-platform-policy",
            "level": "error",
            "code": "PFU005",
            "description": "Single file size limits must not exceed the platform upload policy for the selected backend surface."
          },
          {
            "validatorId": "size-limit-client-backend-consistent",
            "level": "error",
            "code": "PFU006",
            "description": "limits.maxFileSizeBytes and options.maxUploadSizeMb must describe the same effective maximum when both are present."
          },
          {
            "validatorId": "file-count-limit-numeric",
            "level": "error",
            "code": "PFU007",
            "description": "Bulk file count limits must be positive integers."
          },
          {
            "validatorId": "bulk-size-limit-numeric",
            "level": "error",
            "code": "PFU008",
            "description": "Bulk size limits must be positive numeric byte values when provided."
          },
          {
            "validatorId": "bulk-limit-within-platform-policy",
            "level": "error",
            "code": "PFU009",
            "description": "Bulk count and aggregate size limits must not exceed backend batch policy."
          },
          {
            "validatorId": "endpoint-url-safe",
            "level": "error",
            "code": "PFU010",
            "description": "Endpoint edits must use a safe absolute or approved relative baseUrl and reject javascript:, data:, credentials-in-URL and path traversal."
          },
          {
            "validatorId": "endpoint-uses-praxis-backend-surface",
            "level": "error",
            "code": "PFU011",
            "description": "Endpoint edits must resolve to the approved Praxis files backend surface for the host environment."
          },
          {
            "validatorId": "presign-endpoint-fixed-contract",
            "level": "error",
            "code": "PFU012",
            "description": "Presign authoring may change baseUrl but must preserve POST baseUrl/upload/presign?filename=... as the runtime contract."
          },
          {
            "validatorId": "upload-endpoint-fixed-contract",
            "level": "error",
            "code": "PFU013",
            "description": "Direct upload authoring may change baseUrl but must preserve POST baseUrl/upload as the runtime contract."
          },
          {
            "validatorId": "bulk-endpoint-fixed-contract",
            "level": "error",
            "code": "PFU014",
            "description": "Bulk upload authoring may change baseUrl but must preserve POST baseUrl/bulk as the runtime contract."
          },
          {
            "validatorId": "presign-cross-origin-fields-safe",
            "level": "error",
            "code": "PFU015",
            "description": "Cross-origin presigned upload targets must not receive Praxis metadata/options fields unless explicitly approved by the presign response contract."
          },
          {
            "validatorId": "security-change-confirmed",
            "level": "error",
            "code": "PFU016",
            "description": "Endpoint and security policy edits require explicit confirmation before patch compilation."
          },
          {
            "validatorId": "security-policy-compatible",
            "level": "error",
            "code": "PFU017",
            "description": "Strict validation, virus scanning, conflict policy, target directory, quota and rate-limit settings must be compatible with backend effective config."
          },
          {
            "validatorId": "target-directory-safe",
            "level": "error",
            "code": "PFU018",
            "description": "Target directory values must be normalized backend paths and must reject traversal or absolute filesystem paths."
          },
          {
            "validatorId": "conflict-policy-valid",
            "level": "error",
            "code": "PFU019",
            "description": "Default conflict policy must be one of ERROR, SKIP, OVERWRITE, MAKE_UNIQUE or RENAME."
          },
          {
            "validatorId": "quota-rate-policy-valid",
            "level": "error",
            "code": "PFU020",
            "description": "Quota and rate-limit UX settings must use non-negative retry counts/backoffs and cannot silently bypass backend enforcement."
          },
          {
            "validatorId": "header-names-safe",
            "level": "warning",
            "code": "PFU021",
            "description": "Contextual header names must be explicit HTTP token names and must not override authorization, cookie or content-type headers."
          },
          {
            "validatorId": "error-code-known",
            "level": "warning",
            "code": "PFU022",
            "description": "Error message overrides should target known backend error catalog codes or documented host-specific extensions."
          },
          {
            "validatorId": "error-message-i18n-compatible",
            "level": "warning",
            "code": "PFU023",
            "description": "User-facing error messages must remain compatible with the host i18n/editor flow and not expose raw technical exception text."
          },
          {
            "validatorId": "message-not-empty",
            "level": "error",
            "code": "PFU024",
            "description": "Error message overrides must be non-empty user-facing text."
          },
          {
            "validatorId": "display-mode-valid",
            "level": "error",
            "code": "PFU025",
            "description": "Display mode must be full or compact."
          },
          {
            "validatorId": "display-ui-compatible",
            "level": "warning",
            "code": "PFU026",
            "description": "Display changes must keep progress, manual upload and metadata form affordances reachable for the selected mode."
          },
          {
            "validatorId": "editor-runtime-round-trip",
            "level": "error",
            "code": "PFU027",
            "description": "Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior."
          }
        ],
        "roundTripRequirements": [
          "Accepted type authoring must keep UI hints and backend-facing validation options aligned; ui.accept alone is not the canonical server policy.",
          "Endpoint authoring changes only the canonical files API baseUrl and strategy; direct, bulk and presign paths remain fixed by FilesApiClient.",
          "Security-affecting edits require confirmation and must round-trip through Settings Panel persistence without weakening strict validation, virus scanning, quota or rate-limit policy by omission.",
          "Error message overrides remain keyed by backend error catalog code and must stay user-facing/i18n-compatible.",
          "Display authoring may change displayMode and UI flags, but must not mutate backend options or upload submission payload."
        ],
        "examples": [
          {
            "id": "accept-pdf-images",
            "request": "Accept only PDF and image uploads.",
            "operationId": "accept.types.set",
            "params": {
              "accept": [
                "application/pdf",
                "image/*"
              ],
              "allowedExtensions": [
                "pdf",
                "png",
                "jpg",
                "jpeg"
              ],
              "acceptMimeTypes": [
                "application/pdf",
                "image/png",
                "image/jpeg"
              ]
            },
            "isPositive": true
          },
          {
            "id": "max-five-mb",
            "request": "Limit each file to 5 MB.",
            "operationId": "limit.fileSize.set",
            "params": {
              "maxFileSizeBytes": 5242880,
              "maxUploadSizeMb": 5
            },
            "isPositive": true
          },
          {
            "id": "max-three-files",
            "request": "Allow at most three files per upload batch.",
            "operationId": "limit.fileCount.set",
            "params": {
              "maxFilesPerBulk": 3
            },
            "isPositive": true
          },
          {
            "id": "set-presign-base-url",
            "request": "Use the official files API for presigned uploads.",
            "operationId": "endpoint.presign.set",
            "params": {
              "baseUrl": "https://api.praxis.example/files",
              "strategy": "presign"
            },
            "isPositive": true
          },
          {
            "id": "set-direct-base-url",
            "request": "Use the official files API for direct uploads.",
            "operationId": "endpoint.upload.set",
            "params": {
              "baseUrl": "https://api.praxis.example/files",
              "strategy": "direct"
            },
            "isPositive": true
          },
          {
            "id": "reject-unsafe-endpoint",
            "request": "Set upload endpoint to javascript:alert(1).",
            "operationId": "endpoint.upload.set",
            "params": {
              "baseUrl": "javascript:alert(1)",
              "strategy": "direct"
            },
            "isPositive": false
          },
          {
            "id": "tighten-security-policy",
            "request": "Enable strict validation and virus scanning for uploads.",
            "operationId": "security.policy.set",
            "params": {
              "strictValidation": true,
              "enableVirusScanning": true,
              "defaultConflictPolicy": "ERROR"
            },
            "isPositive": true
          },
          {
            "id": "reject-unconfirmed-security-policy",
            "request": "Disable strict validation without confirmation.",
            "operationId": "security.policy.set",
            "params": {
              "strictValidation": false,
              "enableVirusScanning": false
            },
            "isPositive": false
          },
          {
            "id": "quota-message",
            "request": "Show a friendly message when quota is exceeded.",
            "operationId": "message.error.set",
            "params": {
              "code": "QUOTA_EXCEEDED",
              "message": "Upload quota reached for this period."
            },
            "isPositive": true
          },
          {
            "id": "compact-display",
            "request": "Use compact upload display and keep progress visible.",
            "operationId": "display.mode.set",
            "params": {
              "displayMode": "compact",
              "dense": true,
              "showProgress": true
            },
            "isPositive": true
          }
        ]
      },
      "chunks": [
        {
          "chunkIndex": 0,
          "chunkKind": "summary",
          "content": "Component ID: praxis-files-upload\nSelector: praxis-files-upload\nFriendly Name: Praxis Files Upload\nDescription: Componente para upload de arquivos com suporte a configuracao dinamica, eventos e integracao com backend.\nLib/Package: @praxisui/files-upload\nTags: files, upload, widget, configurable\nInputs:\n  - config (FilesUploadConfig)\n  - filesUploadId (string)\n  - componentInstanceId (string)\n  - baseUrl (string)\n  - displayMode ('full' | 'compact')\n  - context (Record<string, unknown>)\n  - enableCustomization (boolean)\nOutputs:\n  - uploadSuccess (FileMetadata)\n  - bulkComplete (BulkUploadResponseData)\n  - error (ErrorResponse)\n  - rateLimited (RateLimitInfo)\n  - uploadStart (UploadStartEvent)\n  - uploadProgress (UploadProgressEvent)\n  - retry (BulkUploadFileResult)\n  - download (BulkUploadFileResult)\n  - copyLink (BulkUploadFileResult)\n  - detailsOpened (BulkUploadFileResult)\n  - detailsClosed (BulkUploadFileResult)\n  - pendingStateChange (PendingFilesState)\n  - readinessChange (FilesUploadReadinessEvent)\n  - proximityChange (boolean)\n",
          "sourcePointer": "projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts",
          "contentHash": "ac9de9f88b3b6c41731da2106436647af09e3f2e469e8df223afeb1d30de9c8e",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 1,
          "chunkKind": "capabilities",
          "content": "Component Capability:\n  - Path: strategy\n    Category: strategy\n    Kind: enum\n    Description: Upload strategy.\n\nComponent Capability:\n  - Path: ui\n    Category: ui\n    Kind: object\n    Description: UI configuration.\n\nComponent Capability:\n  - Path: ui.showDropzone\n    Category: ui\n    Kind: boolean\n    Description: Show drag-and-drop dropzone.\n\nComponent Capability:\n  - Path: ui.accept\n    Category: ui\n    Kind: array\n    Description: Accept attribute hints (extensions or mime types).\n\nComponent Capability:\n  - Path: ui.accept[]\n    Category: ui\n    Kind: string\n    Description: Single accept entry.\n\nComponent Capability:\n  - Path: ui.dense\n    Category: ui\n    Kind: boolean\n    Description: Dense layout.\n\nComponent Capability:\n  - Path: ui.showConflictPolicySelector\n    Category: ui\n    Kind: boolean\n    Description: Show conflict policy selector.\n\nComponent Capability:\n  - Path: ui.showMetadataForm\n    Category: ui\n    Kind: boolean\n    Description: Show metadata form for each file.\n\nComponent Capability:\n  - Path: ui.showProgress\n    Category: ui\n    Kind: boolean\n    Description: Show progress UI.\n\nComponent Capability:\n  - Path: ui.manualUpload\n    Category: ui\n    Kind: boolean\n    Description: Require manual start for uploads.\n\nComponent Capability:\n  - Path: ui.dropzone\n    Category: ui\n    Kind: object\n    Description: Dropzone interaction options.\n\nComponent Capability:\n  - Path: ui.dropzone.expandOnDragProximity\n    Category: ui\n    Kind: boolean\n    Description: Expand dropzone on drag proximity.\n\nComponent Capability:\n  - Path: ui.dropzone.proximityPx\n    Category: ui\n    Kind: number\n    Description: Proximity radius in pixels.\n\nComponent Capability:\n  - Path: ui.dropzone.expandMode\n    Category: ui\n    Kind: enum\n    Description: Dropzone expansion mode.\n\nComponent Capability:\n  - Path: ui.dropzone.expandHeight\n    Category: ui\n    Kind: number\n    Description: Expanded height (px).\n\nComponent Capability:\n  - Path: ui.dropzone.expandDebounceMs\n    Category: ui\n    Kind: number\n    Description: Drag debounce (ms).\n\nComponent Capability:\n  - Path: ui.list\n    Category: ui\n    Kind: object\n    Description: Uploaded files list options.\n\nComponent Capability:\n  - Path: ui.list.collapseAfter\n    Category: ui\n    Kind: number\n    Description: Collapse list after N items.\n\nComponent Capability:\n  - Path: ui.list.detailsMode\n    Category: ui\n    Kind: enum\n    Description: Details panel mode.\n\nComponent Capability:\n  - Path: ui.list.detailsMaxWidth\n    Category: ui\n    Kind: number\n    Description: Details panel max width (px).\n\nComponent Capability:\n  - Path: ui.list.detailsShowTechnical\n    Category: ui\n    Kind: boolean\n    Description: Show technical details by default.\n\nComponent Capability:\n  - Path: ui.list.detailsFields\n    Category: ui\n    Kind: array\n    Description: Allowed metadata fields to display.\n\nComponent Capability:\n  - Path: ui.list.detailsFields[]\n    Category: ui\n    Kind: string\n    Description: Single metadata field name.\n\nComponent Capability:\n  - Path: ui.list.detailsAnchor\n    Category: ui\n    Kind: enum\n    Description: Details overlay anchor.\n\nComponent Capability:\n  - Path: limits\n    Category: limits\n    Kind: object\n    Description: Upload limits.\n\nComponent Capability:\n  - Path: limits.maxFileSizeBytes\n    Category: limits\n    Kind: number\n    Description: Max file size (bytes).\n\nComponent Capability:\n  - Path: limits.maxFilesPerBulk\n    Category: limits\n    Kind: number\n    Description: Max files per bulk upload.\n\nComponent Capability:\n  - Path: limits.maxBulkSizeBytes\n    Category: limits\n    Kind: number\n    Description: Max bulk size (bytes).\n\nComponent Capability:\n  - Path: options\n    Category: options\n    Kind: object\n    Description: Backend options sent as JSON.\n\nComponent Capability:\n  - Path: options.defaultConflictPolicy\n    Category: options\n    Kind: enum\n    Description: Default conflict policy.\n\nComponent Capability:\n  - Path: options.strictValidation\n    Category: options\n    Kind: boolean\n    Description: Strict backend validation.\n\nComponent Capability:\n  - Path: options.maxUploadSizeMb\n    Category: options\n    Kind: number\n    Description: Max upload size in MB.\n\nComponent Capability:\n  - Path: options.allowedExtensions\n    Category: options\n    Kind: array\n    Description: Allowed file extensions.\n\nComponent Capability:\n  - Path: options.allowedExtensions[]\n    Category: options\n    Kind: string\n    Description: Single extension (e.g., pdf).\n\nComponent Capability:\n  - Path: options.acceptMimeTypes\n    Category: options\n    Kind: array\n    Description: Allowed mime types.\n\nComponent Capability:\n  - Path: options.acceptMimeTypes[]\n    Category: options\n    Kind: string\n    Description: Single mime type.\n\nComponent Capability:\n  - Path: options.targetDirectory\n    Category: options\n    Kind: string\n    Description: Target directory on backend.\n\nComponent Capability:\n  - Path: options.enableVirusScanning\n    Category: options\n    Kind: boolean\n    Description: Enable virus scanning.\n\nComponent Capability:\n  - Path: bulk\n    Category: bulk\n    Kind: object\n    Description: Bulk upload tuning.\n\nComponent Capability:\n  - Path: bulk.failFast\n    Category: bulk\n    Kind: boolean\n    Description: Abort on first error.\n\nComponent Capability:\n  - Path: bulk.parallelUploads\n    Category: bulk\n    Kind: number\n    Description: Parallel uploads count.\n\nComponent Capability:\n  - Path: bulk.retryCount\n    Category: bulk\n    Kind: number\n    Description: Retry count.\n\nComponent Capability:\n  - Path: bulk.retryBackoffMs\n    Category: bulk\n    Kind: number\n    Description: Retry backoff (ms).\n\nComponent Capability:\n  - Path: quotas\n    Category: quotas\n    Kind: object\n    Description: Quota UX behavior.\n\nComponent Capability:\n  - Path: quotas.showQuotaWarnings\n    Category: quotas\n    Kind: boolean\n    Description: Show quota warnings.\n\nComponent Capability:\n  - Path: quotas.blockOnExceed\n    Category: quotas\n    Kind: boolean\n    Description: Block uploads when exceeded.\n\nComponent Capability:\n  - Path: rateLimit\n    Category: rateLimit\n    Kind: object\n    Description: 429 handling.\n\nComponent Capability:\n  - Path: rateLimit.autoRetryOn429\n    Category: rateLimit\n    Kind: boolean\n    Description: Auto retry on 429.\n\nComponent Capability:\n  - Path: rateLimit.showBannerOn429\n    Category: rateLimit\n    Kind: boolean\n    Description: Show rate limit banner.\n\nComponent Capability:\n  - Path: rateLimit.maxAutoRetry\n    Category: rateLimit\n    Kind: number\n    Description: Max auto retry attempts.\n\nComponent Capability:\n  - Path: rateLimit.baseBackoffMs\n    Category: rateLimit\n    Kind: number\n    Description: Base backoff (ms).\n\nComponent Capability:\n  - Path: headers\n    Category: headers\n    Kind: object\n    Description: Header mapping for backend.\n\nComponent Capability:\n  - Path: headers.tenantHeader\n    Category: headers\n    Kind: string\n    Description: Tenant header name.\n\nComponent Capability:\n  - Path: headers.userHeader\n    Category: headers\n    Kind: string\n    Description: User header name.\n\nComponent Capability:\n  - Path: messages\n    Category: messages\n    Kind: object\n    Description: User-facing text overrides.\n\nComponent Capability:\n  - Path: messages.successSingle\n    Category: messages\n    Kind: string\n    Description: Single upload success message.\n\nComponent Capability:\n  - Path: messages.successBulk\n    Category: messages\n    Kind: string\n    Description: Bulk upload success message.\n\nComponent Capability:\n  - Path: messages.errors\n    Category: messages\n    Kind: object\n    Description: Error message map.\n\nComponent Capability:\n  - Path: messages.errors.[code]\n    Category: messages\n    Kind: string\n    Description: Message for a specific error code.\n\nCapability Note:\n  - limits.maxFileSizeBytes and limits.maxBulkSizeBytes are bytes (e.g., 10485760 for 10MB).\n\nCapability Note:\n  - options.allowedExtensions is enforced by backend validation; ui.accept is only a client hint.",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/files-upload-ai-capabilities.ts",
          "contentHash": "a1429c417c4000a31254f7f3648a6a740a1334ff9783768587b2245a0427d810",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 2,
          "chunkKind": "capabilities",
          "content": "Capability Note:\n  - Use options.defaultConflictPolicy to control name collisions on upload.",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/files-upload-ai-capabilities.ts",
          "contentHash": "e2225703fbbf03ba9f6c1522214050bf5ea6b819306463bc5a0195be085f1be7",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 3,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"accept.types.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set accepted file types Effects: set-value, set-value, set-value. Accept only PDF and image uploads.\",\"scope\":\"global\",\"target\":{\"kind\":\"acceptedTypes\",\"resolver\":\"files-accept-list\",\"required\":false},\"inputContract\":{\"required\":[\"accept\"],\"properties\":[\"accept\",\"allowedExtensions\",\"acceptMimeTypes\"],\"semanticTerms\":[\"accept\",\"allowedExtensions\",\"acceptMimeTypes\"]},\"effects\":[\"set-value\",\"set-value\",\"set-value\"],\"affectedPaths\":[\"ui.accept\",\"options.allowedExtensions\",\"options.acceptMimeTypes\"],\"validators\":[{\"validatorId\":\"file-type-list-explicit\",\"level\":\"error\",\"code\":\"PFU001\",\"description\":\"Accepted type edits must provide a non-empty explicit list and may not rely on wildcard-only policy.\"},{\"validatorId\":\"file-type-entry-valid\",\"level\":\"error\",\"code\":\"PFU002\",\"description\":\"Each accepted type must be a valid extension, exact MIME type or controlled subtype wildcard.\"},{\"validatorId\":\"backend-accept-options-consistent\",\"level\":\"error\",\"code\":\"PFU003\",\"description\":\"ui.accept hints must remain consistent with options.allowedExtensions and options.acceptMimeTypes when backend validation is configured.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"accept-pdf-images\",\"request\":\"Accept only PDF and image uploads.\",\"operationId\":\"accept.types.set\",\"params\":{\"accept\":[\"application/pdf\",\"image/*\"],\"allowedExtensions\":[\"pdf\",\"png\",\"jpg\",\"jpeg\"],\"acceptMimeTypes\":[\"application/pdf\",\"image/png\",\"image/jpeg\"]},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "73fd96d72058e15c43956b8555c4995c9d948cbf55f62b77371e3aa49c5bc447",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 4,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"limit.fileSize.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set max file size Effects: set-value, set-value. Limit each file to 5 MB.\",\"scope\":\"global\",\"target\":{\"kind\":\"sizeLimit\",\"resolver\":\"max-file-size-policy\",\"required\":false},\"inputContract\":{\"required\":[\"maxFileSizeBytes\"],\"properties\":[\"maxFileSizeBytes\",\"maxUploadSizeMb\"],\"semanticTerms\":[\"maxFileSizeBytes\",\"maxUploadSizeMb\"]},\"effects\":[\"set-value\",\"set-value\"],\"affectedPaths\":[\"limits.maxFileSizeBytes\",\"options.maxUploadSizeMb\"],\"validators\":[{\"validatorId\":\"size-limit-numeric\",\"level\":\"error\",\"code\":\"PFU004\",\"description\":\"Single file size limits must be positive numeric byte and MB values.\"},{\"validatorId\":\"size-limit-within-platform-policy\",\"level\":\"error\",\"code\":\"PFU005\",\"description\":\"Single file size limits must not exceed the platform upload policy for the selected backend surface.\"},{\"validatorId\":\"size-limit-client-backend-consistent\",\"level\":\"error\",\"code\":\"PFU006\",\"description\":\"limits.maxFileSizeBytes and options.maxUploadSizeMb must describe the same effective maximum when both are present.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"max-five-mb\",\"request\":\"Limit each file to 5 MB.\",\"operationId\":\"limit.fileSize.set\",\"params\":{\"maxFileSizeBytes\":5242880,\"maxUploadSizeMb\":5},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "926dd13e6a3d911a65e2adc5fa7173bb61bd78e49a26622499c2d9ee2d32381b",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 5,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"limit.fileCount.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set max file count Effects: set-value, set-value. Allow at most three files per upload batch.\",\"scope\":\"global\",\"target\":{\"kind\":\"fileCountLimit\",\"resolver\":\"max-files-per-bulk-policy\",\"required\":false},\"inputContract\":{\"required\":[\"maxFilesPerBulk\"],\"properties\":[\"maxFilesPerBulk\",\"maxBulkSizeBytes\"],\"semanticTerms\":[\"maxFilesPerBulk\",\"maxBulkSizeBytes\"]},\"effects\":[\"set-value\",\"set-value\"],\"affectedPaths\":[\"limits.maxFilesPerBulk\",\"limits.maxBulkSizeBytes\"],\"validators\":[{\"validatorId\":\"file-count-limit-numeric\",\"level\":\"error\",\"code\":\"PFU007\",\"description\":\"Bulk file count limits must be positive integers.\"},{\"validatorId\":\"bulk-size-limit-numeric\",\"level\":\"error\",\"code\":\"PFU008\",\"description\":\"Bulk size limits must be positive numeric byte values when provided.\"},{\"validatorId\":\"bulk-limit-within-platform-policy\",\"level\":\"error\",\"code\":\"PFU009\",\"description\":\"Bulk count and aggregate size limits must not exceed backend batch policy.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-submission\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"max-three-files\",\"request\":\"Allow at most three files per upload batch.\",\"operationId\":\"limit.fileCount.set\",\"params\":{\"maxFilesPerBulk\":3},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "a4b18cb01284b389a3f400e372e8cf84b75c36074e9dae40428af725052e9031",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 6,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"endpoint.presign.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set presign endpoint Effects: compile-domain-patch. Use the official files API for presigned uploads.\",\"scope\":\"global\",\"target\":{\"kind\":\"presignEndpoint\",\"resolver\":\"files-api-base-url-presign-contract\",\"required\":false},\"inputContract\":{\"required\":[\"baseUrl\"],\"properties\":[\"baseUrl\",\"strategy\",\"allowCrossOriginPresignedTarget\"],\"semanticTerms\":[\"baseUrl\",\"strategy\",\"allowCrossOriginPresignedTarget\",\"direct\",\"presign\",\"auto\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"baseUrl\",\"strategy\"],\"validators\":[{\"validatorId\":\"endpoint-url-safe\",\"level\":\"error\",\"code\":\"PFU010\",\"description\":\"Endpoint edits must use a safe absolute or approved relative baseUrl and reject javascript:, data:, credentials-in-URL and path traversal.\"},{\"validatorId\":\"endpoint-uses-praxis-backend-surface\",\"level\":\"error\",\"code\":\"PFU011\",\"description\":\"Endpoint edits must resolve to the approved Praxis files backend surface for the host environment.\"},{\"validatorId\":\"presign-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU012\",\"description\":\"Presign authoring may change baseUrl but must preserve POST baseUrl/upload/presign?filename=... as the runtime contract.\"},{\"validatorId\":\"presign-cross-origin-fields-safe\",\"level\":\"error\",\"code\":\"PFU015\",\"description\":\"Cross-origin presigned upload targets must not receive Praxis metadata/options fields unless explicitly approved by the presign response contract.\"},{\"validatorId\":\"security-change-confirmed\",\"level\":\"error\",\"code\":\"PFU016\",\"description\":\"Endpoint and security policy edits require explicit confirmation before patch compilation.\"}],\"preconditions\":[\"config-initialized\",\"confirmation-collected\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-presign-base-url\",\"request\":\"Use the official files API for presigned uploads.\",\"operationId\":\"endpoint.presign.set\",\"params\":{\"baseUrl\":\"https://api.praxis.example/files\",\"strategy\":\"presign\"},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "8afeff9e779f8e526bbfc0272ced28d67534986b041018f5adca7b3bc29a4cb8",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 7,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"endpoint.upload.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set upload endpoint Effects: compile-domain-patch. Use the official files API for direct uploads. Set upload endpoint to javascript:alert(1).\",\"scope\":\"global\",\"target\":{\"kind\":\"uploadEndpoint\",\"resolver\":\"files-api-base-url-upload-contract\",\"required\":false},\"inputContract\":{\"required\":[\"baseUrl\"],\"properties\":[\"baseUrl\",\"strategy\",\"allowCrossOriginPresignedTarget\"],\"semanticTerms\":[\"baseUrl\",\"strategy\",\"allowCrossOriginPresignedTarget\",\"direct\",\"presign\",\"auto\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"baseUrl\",\"strategy\"],\"validators\":[{\"validatorId\":\"endpoint-url-safe\",\"level\":\"error\",\"code\":\"PFU010\",\"description\":\"Endpoint edits must use a safe absolute or approved relative baseUrl and reject javascript:, data:, credentials-in-URL and path traversal.\"},{\"validatorId\":\"endpoint-uses-praxis-backend-surface\",\"level\":\"error\",\"code\":\"PFU011\",\"description\":\"Endpoint edits must resolve to the approved Praxis files backend surface for the host environment.\"},{\"validatorId\":\"upload-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU013\",\"description\":\"Direct upload authoring may change baseUrl but must preserve POST baseUrl/upload as the runtime contract.\"},{\"validatorId\":\"bulk-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU014\",\"description\":\"Bulk upload authoring may change baseUrl but must preserve POST baseUrl/bulk as the runtime contract.\"},{\"validatorId\":\"security-change-confirmed\",\"level\":\"error\",\"code\":\"PFU016\",\"description\":\"Endpoint and security policy edits require explicit confirmation before patch compilation.\"}],\"preconditions\":[\"config-initialized\",\"confirmation-collected\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-direct-base-url\",\"request\":\"Use the official files API for direct uploads.\",\"operationId\":\"endpoint.upload.set\",\"params\":{\"baseUrl\":\"https://api.praxis.example/files\",\"strategy\":\"direct\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unsafe-endpoint\",\"request\":\"Set upload endpoint to javascript:alert(1).\",\"operationId\":\"endpoint.upload.set\",\"params\":{\"baseUrl\":\"javascript:alert(1)\",\"strategy\":\"direct\"},\"isPositive\":false}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "1cb3038d9b6f27d318fd5eb6780f6ee551b339bbccf807fab31ad86dbda32c80",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 8,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"security.policy.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set upload security policy Effects: merge-object, merge-object, merge-object, merge-object. Enable strict validation and virus scanning for uploads. Disable strict validation without confirmation.\",\"scope\":\"global\",\"target\":{\"kind\":\"securityPolicy\",\"resolver\":\"upload-security-policy\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"strictValidation\",\"enableVirusScanning\",\"defaultConflictPolicy\",\"targetDirectory\",\"showQuotaWarnings\",\"blockOnExceed\",\"autoRetryOn429\",\"showBannerOn429\",\"maxAutoRetry\",\"baseBackoffMs\",\"tenantHeader\",\"userHeader\"],\"semanticTerms\":[\"strictValidation\",\"enableVirusScanning\",\"defaultConflictPolicy\",\"targetDirectory\",\"showQuotaWarnings\",\"blockOnExceed\",\"autoRetryOn429\",\"showBannerOn429\",\"maxAutoRetry\",\"baseBackoffMs\",\"tenantHeader\",\"userHeader\",\"ERROR\",\"SKIP\",\"OVERWRITE\",\"MAKE_UNIQUE\",\"RENAME\"]},\"effects\":[\"merge-object\",\"merge-object\",\"merge-object\",\"merge-object\"],\"affectedPaths\":[\"options.strictValidation\",\"options.enableVirusScanning\",\"options.defaultConflictPolicy\",\"options.targetDirectory\",\"quotas\",\"rateLimit\",\"headers\"],\"validators\":[{\"validatorId\":\"security-change-confirmed\",\"level\":\"error\",\"code\":\"PFU016\",\"description\":\"Endpoint and security policy edits require explicit confirmation before patch compilation.\"},{\"validatorId\":\"security-policy-compatible\",\"level\":\"error\",\"code\":\"PFU017\",\"description\":\"Strict validation, virus scanning, conflict policy, target directory, quota and rate-limit settings must be compatible with backend effective config.\"},{\"validatorId\":\"target-directory-safe\",\"level\":\"error\",\"code\":\"PFU018\",\"description\":\"Target directory values must be normalized backend paths and must reject traversal or absolute filesystem paths.\"},{\"validatorId\":\"conflict-policy-valid\",\"level\":\"error\",\"code\":\"PFU019\",\"description\":\"Default conflict policy must be one of ERROR, SKIP, OVERWRITE, MAKE_UNIQUE or RENAME.\"},{\"validatorId\":\"quota-rate-policy-valid\",\"level\":\"error\",\"code\":\"PFU020\",\"description\":\"Quota and rate-limit UX settings must use non-negative retry counts/backoffs and cannot silently bypass backend enforcement.\"},{\"validatorId\":\"header-names-safe\",\"level\":\"warning\",\"code\":\"PFU021\",\"description\":\"Contextual header names must be explicit HTTP token names and must not override authorization, cookie or content-type headers.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\",\"confirmation-collected\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"tighten-security-policy\",\"request\":\"Enable strict validation and virus scanning for uploads.\",\"operationId\":\"security.policy.set\",\"params\":{\"strictValidation\":true,\"enableVirusScanning\":true,\"defaultConflictPolicy\":\"ERROR\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unconfirmed-security-policy\",\"request\":\"Disable strict validation without confirmation.\",\"operationId\":\"security.policy.set\",\"params\":{\"strictValidation\":false,\"enableVirusScanning\":false},\"isPositive\":false}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "171a8156d374765277cd075608a7a81573ba8b4dce5d7a4072c80756ce6a7350",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 9,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"message.error.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set error message override Effects: merge-object. Show a friendly message when quota is exceeded.\",\"scope\":\"global\",\"target\":{\"kind\":\"errorMessages\",\"resolver\":\"upload-error-code-message\",\"required\":false},\"inputContract\":{\"required\":[\"code\",\"message\"],\"properties\":[\"code\",\"message\"],\"semanticTerms\":[\"code\",\"message\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"messages.errors\"],\"validators\":[{\"validatorId\":\"error-code-known\",\"level\":\"warning\",\"code\":\"PFU022\",\"description\":\"Error message overrides should target known backend error catalog codes or documented host-specific extensions.\"},{\"validatorId\":\"error-message-i18n-compatible\",\"level\":\"warning\",\"code\":\"PFU023\",\"description\":\"User-facing error messages must remain compatible with the host i18n/editor flow and not expose raw technical exception text.\"},{\"validatorId\":\"message-not-empty\",\"level\":\"error\",\"code\":\"PFU024\",\"description\":\"Error message overrides must be non-empty user-facing text.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"quota-message\",\"request\":\"Show a friendly message when quota is exceeded.\",\"operationId\":\"message.error.set\",\"params\":{\"code\":\"QUOTA_EXCEEDED\",\"message\":\"Upload quota reached for this period.\"},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "248eff8fe3424d2e5d6af67c9cac6226cf7bac61ea85c0b589e67442239e6158",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 10,
          "chunkKind": "authoring_manifest",
          "content": "{\"operationId\":\"display.mode.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set display mode Effects: set-value, merge-object. Use compact upload display and keep progress visible.\",\"scope\":\"global\",\"target\":{\"kind\":\"display\",\"resolver\":\"files-upload-display-mode-and-ui\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"displayMode\",\"dense\",\"showDropzone\",\"showProgress\",\"manualUpload\",\"showMetadataForm\",\"showConflictPolicySelector\"],\"semanticTerms\":[\"displayMode\",\"dense\",\"showDropzone\",\"showProgress\",\"manualUpload\",\"showMetadataForm\",\"showConflictPolicySelector\",\"full\",\"compact\"]},\"effects\":[\"set-value\",\"merge-object\"],\"affectedPaths\":[\"displayMode\",\"ui.dense\",\"ui.showDropzone\",\"ui.showProgress\",\"ui.manualUpload\",\"ui.showMetadataForm\",\"ui.showConflictPolicySelector\"],\"validators\":[{\"validatorId\":\"display-mode-valid\",\"level\":\"error\",\"code\":\"PFU025\",\"description\":\"Display mode must be full or compact.\"},{\"validatorId\":\"display-ui-compatible\",\"level\":\"warning\",\"code\":\"PFU026\",\"description\":\"Display changes must keep progress, manual upload and metadata form affordances reachable for the selected mode.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"compact-display\",\"request\":\"Use compact upload display and keep progress visible.\",\"operationId\":\"display.mode.set\",\"params\":{\"displayMode\":\"compact\",\"dense\":true,\"showProgress\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "638f082a63eb121050f4c886fbd893d303d8a1cd46940784090b86b04f155f7c",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 11,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"identity\"}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "3cbffe9d28399566cb29828986a8474ca3db3c86395088eb94fc30379283a6f6",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 12,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"config\",\"type\":\"FilesUploadConfig\",\"description\":\"Upload strategy, UI, limits, backend options, bulk execution, quota/rate feedback, headers and messages.\"},{\"name\":\"filesUploadId\",\"type\":\"string\",\"description\":\"Stable upload id used for config persistence and telemetry correlation.\"},{\"name\":\"componentInstanceId\",\"type\":\"string\",\"description\":\"Optional instance discriminator when the same upload id appears more than once.\"},{\"name\":\"baseUrl\",\"type\":\"string\",\"description\":\"Canonical files API base URL. Direct upload uses baseUrl/upload, bulk uses baseUrl/bulk and presign uses baseUrl/upload/presign.\"},{\"name\":\"displayMode\",\"type\":\"'full' | 'compact'\",\"allowedValues\":[\"full\",\"compact\"],\"description\":\"Runtime display mode input.\"},{\"name\":\"context\",\"type\":\"Record<string, unknown>\",\"description\":\"Host context available to metadata and event consumers.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables the Settings Panel configuration editor.\"}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "0ecf1df663d7d2195f89e4e3e6d585f3bb0e29a7a40352d555ab4369c92467b3",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 13,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"acceptedTypes\",\"resolver\":\"files-accept-list\",\"description\":\"Allowed file extensions and MIME types projected to ui.accept, options.allowedExtensions and options.acceptMimeTypes.\"},{\"kind\":\"sizeLimit\",\"resolver\":\"max-file-size-policy\",\"description\":\"Maximum single-file size in limits.maxFileSizeBytes and backend-facing options.maxUploadSizeMb.\"},{\"kind\":\"fileCountLimit\",\"resolver\":\"max-files-per-bulk-policy\",\"description\":\"Maximum number of files accepted in a bulk selection.\"},{\"kind\":\"presignEndpoint\",\"resolver\":\"files-api-base-url-presign-contract\",\"description\":\"Presign operation endpoint derived from baseUrl + /upload/presign; arbitrary per-operation URLs are not accepted.\"},{\"kind\":\"uploadEndpoint\",\"resolver\":\"files-api-base-url-upload-contract\",\"description\":\"Direct and bulk upload endpoints derived from baseUrl + /upload and /bulk.\"},{\"kind\":\"securityPolicy\",\"resolver\":\"upload-security-policy\",\"description\":\"Strict validation, virus scanning, conflict policy, target directory, quotas, rate limit and contextual headers.\"},{\"kind\":\"errorMessages\",\"resolver\":\"upload-error-code-message\",\"description\":\"Host-provided message overrides under messages.errors keyed by backend error code.\"},{\"kind\":\"display\",\"resolver\":\"files-upload-display-mode-and-ui\",\"description\":\"Runtime displayMode plus non-backend visual UI flags.\"}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "d56e86874e06e3203f9927f2700afe97efa5c8f068a31e3c33be3a697d4270d2",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 14,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"accept.types.set\",\"title\":\"Set accepted file types\",\"scope\":\"global\",\"targetKind\":\"acceptedTypes\",\"target\":{\"kind\":\"acceptedTypes\",\"resolver\":\"files-accept-list\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"accept\"],\"properties\":{\"accept\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"allowedExtensions\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"acceptMimeTypes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"ui.accept\"},{\"kind\":\"set-value\",\"path\":\"options.allowedExtensions\"},{\"kind\":\"set-value\",\"path\":\"options.acceptMimeTypes\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"file-type-list-explicit\",\"file-type-entry-valid\",\"backend-accept-options-consistent\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"ui.accept\",\"options.allowedExtensions\",\"options.acceptMimeTypes\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"limit.fileSize.set\",\"title\":\"Set max file size\",\"scope\":\"global\",\"targetKind\":\"sizeLimit\",\"target\":{\"kind\":\"sizeLimit\",\"resolver\":\"max-file-size-policy\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"maxFileSizeBytes\"],\"properties\":{\"maxFileSizeBytes\":{\"type\":\"number\"},\"maxUploadSizeMb\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"limits.maxFileSizeBytes\"},{\"kind\":\"set-value\",\"path\":\"options.maxUploadSizeMb\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"size-limit-numeric\",\"size-limit-within-platform-policy\",\"size-limit-client-backend-consistent\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"limits.maxFileSizeBytes\",\"options.maxUploadSizeMb\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"limit.fileCount.set\",\"title\":\"Set max file count\",\"scope\":\"global\",\"targetKind\":\"fileCountLimit\",\"target\":{\"kind\":\"fileCountLimit\",\"resolver\":\"max-files-per-bulk-policy\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"maxFilesPerBulk\"],\"properties\":{\"maxFilesPerBulk\":{\"type\":\"number\"},\"maxBulkSizeBytes\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"limits.maxFilesPerBulk\"},{\"kind\":\"set-value\",\"path\":\"limits.maxBulkSizeBytes\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"file-count-limit-numeric\",\"bulk-size-limit-numeric\",\"bulk-limit-within-platform-policy\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"limits.maxFilesPerBulk\",\"limits.maxBulkSizeBytes\"],\"submissionImpact\":\"affects-submission\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"endpoint.presign.set\",\"title\":\"Set presign endpoint\",\"scope\":\"global\",\"targetKind\":\"presignEndpoint\",\"target\":{\"kind\":\"presignEndpoint\",\"resolver\":\"files-api-base-url-presign-contract\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"baseUrl\"],\"properties\":{\"baseUrl\":{\"type\":\"string\"},\"strategy\":{\"enum\":[\"direct\",\"presign\",\"auto\"]},\"allowCrossOriginPresignedTarget\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"files-upload-presign-base-url\",\"handlerContract\":{\"reads\":[\"baseUrl\",\"strategy\"],\"writes\":[\"baseUrl\",\"strategy\"],\"identityKeys\":[\"baseUrl\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"baseUrl\"],\"properties\":{\"baseUrl\":{\"type\":\"string\"},\"strategy\":{\"enum\":[\"direct\",\"presign\",\"auto\"]},\"allowCrossOriginPresignedTarget\":{\"type\":\"boolean\"}}},\"failureModes\":[\"unsafe-url\",\"non-praxis-backend-surface\",\"presign-path-override\",\"cross-origin-presigned-fields-leak\"],\"description\":\"Validates the files API base URL and preserves the canonical POST baseUrl/upload/presign?filename=... contract; arbitrary presign URLs are rejected.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"endpoint-url-safe\",\"endpoint-uses-praxis-backend-surface\",\"presign-endpoint-fixed-contract\",\"presign-cross-origin-fields-safe\",\"security-change-confirmed\"],\"affectedPaths\":[\"baseUrl\",\"strategy\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\",\"confirmation-collected\"]},{\"operationId\":\"endpoint.upload.set\",\"title\":\"Set upload endpoint\",\"scope\":\"global\",\"targetKind\":\"uploadEndpoint\",\"target\":{\"kind\":\"uploadEndpoint\",\"resolver\":\"files-api-base-url-upload-contract\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"baseUrl\"],\"properties\":{\"baseUrl\":{\"type\":\"string\"},\"strategy\":{\"enum\":[\"direct\",\"presign\",\"auto\"]},\"allowCrossOriginPresignedTarget\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"files-upload-direct-base-url\",\"handlerContract\":{\"reads\":[\"baseUrl\",\"strategy\"],\"writes\":[\"baseUrl\",\"strategy\"],\"identityKeys\":[\"baseUrl\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"baseUrl\"],\"properties\":{\"baseUrl\":{\"type\":\"string\"},\"strategy\":{\"enum\":[\"direct\",\"presign\",\"auto\"]},\"allowCrossOriginPresignedTarget\":{\"type\":\"boolean\"}}},\"failureModes\":[\"unsafe-url\",\"non-praxis-backend-surface\",\"upload-path-override\",\"bulk-path-override\"],\"description\":\"Validates the files API base URL and preserves the canonical POST baseUrl/upload and POST baseUrl/bulk contracts.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"endpoint-url-safe\",\"endpoint-uses-praxis-backend-surface\",\"upload-endpoint-fixed-contract\",\"bulk-endpoint-fixed-contract\",\"security-change-confirmed\"],\"affectedPaths\":[\"baseUrl\",\"strategy\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\",\"confirmation-collected\"]},{\"operationId\":\"security.policy.set\",\"title\":\"Set upload security policy\",\"scope\":\"global\",\"targetKind\":\"securityPolicy\",\"target\":{\"kind\":\"securityPolicy\",\"resolver\":\"upload-security-policy\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"strictValidation\":{\"type\":\"boolean\"},\"enableVirusScanning\":{\"type\":\"boolean\"},\"defaultConflictPolicy\":{\"enum\":[\"ERROR\",\"SKIP\",\"OVERWRITE\",\"MAKE_UNIQUE\",\"RENAME\"]},\"targetDirectory\":{\"type\":\"string\"},\"showQuotaWarnings\":{\"type\":\"boolean\"},\"blockOnExceed\":{\"type\":\"boolean\"},\"autoRetryOn429\":{\"type\":\"boolean\"},\"showBannerOn429\":{\"type\":\"boolean\"},\"maxAutoRetry\":{\"type\":\"number\"},\"baseBackoffMs\":{\"type\":\"number\"},\"tenantHeader\":{\"type\":\"string\"},\"userHeader\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"options\"},{\"kind\":\"merge-object\",\"path\":\"quotas\"},{\"kind\":\"merge-object\",\"path\":\"rateLimit\"},{\"kind\":\"merge-object\",\"path\":\"headers\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"security-change-confirmed\",\"security-policy-compatible\",\"target-directory-safe\",\"conflict-policy-valid\",\"quota-rate-policy-valid\",\"header-names-safe\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"options.strictValidation\",\"options.enableVirusScanning\",\"options.defaultConflictPolicy\",\"options.targetDirectory\",\"quotas\",\"rateLimit\",\"headers\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"confirmation-collected\"]},{\"operationId\":\"message.error.set\",\"title\":\"Set error message override\",\"scope\":\"global\",\"targetKind\":\"errorMessages\",\"target\":{\"kind\":\"errorMessages\",\"resolver\":\"upload-error-code-message\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"code\",\"message\"],\"properties\":{\"code\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"messages.errors\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"error-code-known\",\"error-message-i18n-compatible\",\"message-not-empty\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"messages.errors\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "748ade50ce20a63b7a4a0f33f48403634b30f2024fb74483d7e6eb58a2f661dd",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 15,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"display.mode.set\",\"title\":\"Set display mode\",\"scope\":\"global\",\"targetKind\":\"display\",\"target\":{\"kind\":\"display\",\"resolver\":\"files-upload-display-mode-and-ui\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"displayMode\":{\"enum\":[\"full\",\"compact\"]},\"dense\":{\"type\":\"boolean\"},\"showDropzone\":{\"type\":\"boolean\"},\"showProgress\":{\"type\":\"boolean\"},\"manualUpload\":{\"type\":\"boolean\"},\"showMetadataForm\":{\"type\":\"boolean\"},\"showConflictPolicySelector\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"displayMode\"},{\"kind\":\"merge-object\",\"path\":\"ui\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"display-mode-valid\",\"display-ui-compatible\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"displayMode\",\"ui.dense\",\"ui.showDropzone\",\"ui.showProgress\",\"ui.manualUpload\",\"ui.showMetadataForm\",\"ui.showConflictPolicySelector\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "a4c48e5fd068aaefc44e3dd0e5e7dfb45716902cffe740115062f44cfa5ad5c3",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 16,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"file-type-list-explicit\",\"level\":\"error\",\"code\":\"PFU001\",\"description\":\"Accepted type edits must provide a non-empty explicit list and may not rely on wildcard-only policy.\"},{\"validatorId\":\"file-type-entry-valid\",\"level\":\"error\",\"code\":\"PFU002\",\"description\":\"Each accepted type must be a valid extension, exact MIME type or controlled subtype wildcard.\"},{\"validatorId\":\"backend-accept-options-consistent\",\"level\":\"error\",\"code\":\"PFU003\",\"description\":\"ui.accept hints must remain consistent with options.allowedExtensions and options.acceptMimeTypes when backend validation is configured.\"},{\"validatorId\":\"size-limit-numeric\",\"level\":\"error\",\"code\":\"PFU004\",\"description\":\"Single file size limits must be positive numeric byte and MB values.\"},{\"validatorId\":\"size-limit-within-platform-policy\",\"level\":\"error\",\"code\":\"PFU005\",\"description\":\"Single file size limits must not exceed the platform upload policy for the selected backend surface.\"},{\"validatorId\":\"size-limit-client-backend-consistent\",\"level\":\"error\",\"code\":\"PFU006\",\"description\":\"limits.maxFileSizeBytes and options.maxUploadSizeMb must describe the same effective maximum when both are present.\"},{\"validatorId\":\"file-count-limit-numeric\",\"level\":\"error\",\"code\":\"PFU007\",\"description\":\"Bulk file count limits must be positive integers.\"},{\"validatorId\":\"bulk-size-limit-numeric\",\"level\":\"error\",\"code\":\"PFU008\",\"description\":\"Bulk size limits must be positive numeric byte values when provided.\"},{\"validatorId\":\"bulk-limit-within-platform-policy\",\"level\":\"error\",\"code\":\"PFU009\",\"description\":\"Bulk count and aggregate size limits must not exceed backend batch policy.\"},{\"validatorId\":\"endpoint-url-safe\",\"level\":\"error\",\"code\":\"PFU010\",\"description\":\"Endpoint edits must use a safe absolute or approved relative baseUrl and reject javascript:, data:, credentials-in-URL and path traversal.\"},{\"validatorId\":\"endpoint-uses-praxis-backend-surface\",\"level\":\"error\",\"code\":\"PFU011\",\"description\":\"Endpoint edits must resolve to the approved Praxis files backend surface for the host environment.\"},{\"validatorId\":\"presign-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU012\",\"description\":\"Presign authoring may change baseUrl but must preserve POST baseUrl/upload/presign?filename=... as the runtime contract.\"},{\"validatorId\":\"upload-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU013\",\"description\":\"Direct upload authoring may change baseUrl but must preserve POST baseUrl/upload as the runtime contract.\"},{\"validatorId\":\"bulk-endpoint-fixed-contract\",\"level\":\"error\",\"code\":\"PFU014\",\"description\":\"Bulk upload authoring may change baseUrl but must preserve POST baseUrl/bulk as the runtime contract.\"},{\"validatorId\":\"presign-cross-origin-fields-safe\",\"level\":\"error\",\"code\":\"PFU015\",\"description\":\"Cross-origin presigned upload targets must not receive Praxis metadata/options fields unless explicitly approved by the presign response contract.\"},{\"validatorId\":\"security-change-confirmed\",\"level\":\"error\",\"code\":\"PFU016\",\"description\":\"Endpoint and security policy edits require explicit confirmation before patch compilation.\"},{\"validatorId\":\"security-policy-compatible\",\"level\":\"error\",\"code\":\"PFU017\",\"description\":\"Strict validation, virus scanning, conflict policy, target directory, quota and rate-limit settings must be compatible with backend effective config.\"},{\"validatorId\":\"target-directory-safe\",\"level\":\"error\",\"code\":\"PFU018\",\"description\":\"Target directory values must be normalized backend paths and must reject traversal or absolute filesystem paths.\"},{\"validatorId\":\"conflict-policy-valid\",\"level\":\"error\",\"code\":\"PFU019\",\"description\":\"Default conflict policy must be one of ERROR, SKIP, OVERWRITE, MAKE_UNIQUE or RENAME.\"},{\"validatorId\":\"quota-rate-policy-valid\",\"level\":\"error\",\"code\":\"PFU020\",\"description\":\"Quota and rate-limit UX settings must use non-negative retry counts/backoffs and cannot silently bypass backend enforcement.\"},{\"validatorId\":\"header-names-safe\",\"level\":\"warning\",\"code\":\"PFU021\",\"description\":\"Contextual header names must be explicit HTTP token names and must not override authorization, cookie or content-type headers.\"},{\"validatorId\":\"error-code-known\",\"level\":\"warning\",\"code\":\"PFU022\",\"description\":\"Error message overrides should target known backend error catalog codes or documented host-specific extensions.\"},{\"validatorId\":\"error-message-i18n-compatible\",\"level\":\"warning\",\"code\":\"PFU023\",\"description\":\"User-facing error messages must remain compatible with the host i18n/editor flow and not expose raw technical exception text.\"},{\"validatorId\":\"message-not-empty\",\"level\":\"error\",\"code\":\"PFU024\",\"description\":\"Error message overrides must be non-empty user-facing text.\"},{\"validatorId\":\"display-mode-valid\",\"level\":\"error\",\"code\":\"PFU025\",\"description\":\"Display mode must be full or compact.\"},{\"validatorId\":\"display-ui-compatible\",\"level\":\"warning\",\"code\":\"PFU026\",\"description\":\"Display changes must keep progress, manual upload and metadata form affordances reachable for the selected mode.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PFU027\",\"description\":\"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "403da2cbdf20d564ca38e257e951e6da580424488cc436108147821199d06cb2",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 17,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"Accepted type authoring must keep UI hints and backend-facing validation options aligned; ui.accept alone is not the canonical server policy.\",\"Endpoint authoring changes only the canonical files API baseUrl and strategy; direct, bulk and presign paths remain fixed by FilesApiClient.\",\"Security-affecting edits require confirmation and must round-trip through Settings Panel persistence without weakening strict validation, virus scanning, quota or rate-limit policy by omission.\",\"Error message overrides remain keyed by backend error catalog code and must stay user-facing/i18n-compatible.\",\"Display authoring may change displayMode and UI flags, but must not mutate backend options or upload submission payload.\"]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "bf3ec6292ff957aac7e9e4abccfd399336653850bdc70ca60c218c6e6b2fbf37",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 18,
          "chunkKind": "authoring_manifest",
          "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-files-upload\",\"ownerPackage\":\"@praxisui/files-upload\",\"configSchemaId\":\"FilesUploadConfig\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"accept-pdf-images\",\"request\":\"Accept only PDF and image uploads.\",\"operationId\":\"accept.types.set\",\"params\":{\"accept\":[\"application/pdf\",\"image/*\"],\"allowedExtensions\":[\"pdf\",\"png\",\"jpg\",\"jpeg\"],\"acceptMimeTypes\":[\"application/pdf\",\"image/png\",\"image/jpeg\"]},\"isPositive\":true},{\"id\":\"max-five-mb\",\"request\":\"Limit each file to 5 MB.\",\"operationId\":\"limit.fileSize.set\",\"params\":{\"maxFileSizeBytes\":5242880,\"maxUploadSizeMb\":5},\"isPositive\":true},{\"id\":\"max-three-files\",\"request\":\"Allow at most three files per upload batch.\",\"operationId\":\"limit.fileCount.set\",\"params\":{\"maxFilesPerBulk\":3},\"isPositive\":true},{\"id\":\"set-presign-base-url\",\"request\":\"Use the official files API for presigned uploads.\",\"operationId\":\"endpoint.presign.set\",\"params\":{\"baseUrl\":\"https://api.praxis.example/files\",\"strategy\":\"presign\"},\"isPositive\":true},{\"id\":\"set-direct-base-url\",\"request\":\"Use the official files API for direct uploads.\",\"operationId\":\"endpoint.upload.set\",\"params\":{\"baseUrl\":\"https://api.praxis.example/files\",\"strategy\":\"direct\"},\"isPositive\":true},{\"id\":\"reject-unsafe-endpoint\",\"request\":\"Set upload endpoint to javascript:alert(1).\",\"operationId\":\"endpoint.upload.set\",\"params\":{\"baseUrl\":\"javascript:alert(1)\",\"strategy\":\"direct\"},\"isPositive\":false},{\"id\":\"tighten-security-policy\",\"request\":\"Enable strict validation and virus scanning for uploads.\",\"operationId\":\"security.policy.set\",\"params\":{\"strictValidation\":true,\"enableVirusScanning\":true,\"defaultConflictPolicy\":\"ERROR\"},\"isPositive\":true},{\"id\":\"reject-unconfirmed-security-policy\",\"request\":\"Disable strict validation without confirmation.\",\"operationId\":\"security.policy.set\",\"params\":{\"strictValidation\":false,\"enableVirusScanning\":false},\"isPositive\":false},{\"id\":\"quota-message\",\"request\":\"Show a friendly message when quota is exceeded.\",\"operationId\":\"message.error.set\",\"params\":{\"code\":\"QUOTA_EXCEEDED\",\"message\":\"Upload quota reached for this period.\"},\"isPositive\":true},{\"id\":\"compact-display\",\"request\":\"Use compact upload display and keep progress visible.\",\"operationId\":\"display.mode.set\",\"params\":{\"displayMode\":\"compact\",\"dense\":true,\"showProgress\":true},\"isPositive\":true}]}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
          "contentHash": "659a1bb3b07c81a05e74a8c37811e11b43d827942fed226fc9cda2972a4747e5",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 19,
          "chunkKind": "context_pack",
          "content": "{\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"strategy\":{\"mode\":\"enum\",\"options\":[{\"value\":\"direct\",\"label\":\"Direct\"},{\"value\":\"presign\",\"label\":\"Presign\"},{\"value\":\"auto\",\"label\":\"Auto\"}]},\"ui.dropzone.expandMode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"overlay\",\"label\":\"Overlay\"},{\"value\":\"inline\",\"label\":\"Inline\"}]},\"ui.list.detailsMode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"card\",\"label\":\"Card\"},{\"value\":\"sidesheet\",\"label\":\"Side sheet\"},{\"value\":\"auto\",\"label\":\"Auto\"}]},\"ui.list.detailsAnchor\":{\"mode\":\"enum\",\"options\":[{\"value\":\"item\",\"label\":\"Item\"},{\"value\":\"field\",\"label\":\"Field\"}]},\"options.defaultConflictPolicy\":{\"mode\":\"enum\",\"options\":[{\"value\":\"ERROR\",\"label\":\"Error\"},{\"value\":\"SKIP\",\"label\":\"Skip\"},{\"value\":\"OVERWRITE\",\"label\":\"Overwrite\"},{\"value\":\"MAKE_UNIQUE\",\"label\":\"Make unique\"},{\"value\":\"RENAME\",\"label\":\"Rename\"}]}},\"actionCatalog\":[{\"id\":\"strategy.set\",\"intentExamples\":[\"strategy\",\"upload strategy\"],\"patchTemplate\":{\"strategy\":\"{{value}}\"}},{\"id\":\"ui.showDropzone.enable\",\"intentExamples\":[\"show dropzone\",\"enable dropzone\"],\"patchTemplate\":{\"ui\":{\"showDropzone\":true}}},{\"id\":\"ui.showDropzone.disable\",\"intentExamples\":[\"hide dropzone\",\"disable dropzone\"],\"patchTemplate\":{\"ui\":{\"showDropzone\":false}}},{\"id\":\"ui.manualUpload.enable\",\"intentExamples\":[\"manual upload\",\"upload button\"],\"patchTemplate\":{\"ui\":{\"manualUpload\":true}}},{\"id\":\"ui.manualUpload.disable\",\"intentExamples\":[\"auto upload\",\"instant upload\"],\"patchTemplate\":{\"ui\":{\"manualUpload\":false}}},{\"id\":\"ui.showProgress.enable\",\"intentExamples\":[\"show progress\",\"progress bar\"],\"patchTemplate\":{\"ui\":{\"showProgress\":true}}},{\"id\":\"ui.showProgress.disable\",\"intentExamples\":[\"hide progress\",\"no progress\"],\"patchTemplate\":{\"ui\":{\"showProgress\":false}}},{\"id\":\"limits.maxFileSizeBytes.set\",\"intentExamples\":[\"max file size\",\"size limit\"],\"patchTemplate\":{\"limits\":{\"maxFileSizeBytes\":\"{{value}}\"}}},{\"id\":\"limits.maxFilesPerBulk.set\",\"intentExamples\":[\"max files\",\"files per upload\"],\"patchTemplate\":{\"limits\":{\"maxFilesPerBulk\":\"{{value}}\"}}},{\"id\":\"options.defaultConflictPolicy.set\",\"intentExamples\":[\"conflict policy\",\"overwrite\",\"rename\"],\"patchTemplate\":{\"options\":{\"defaultConflictPolicy\":\"{{value}}\"}}},{\"id\":\"options.allowedExtensions.add\",\"intentExamples\":[\"allowed extensions\",\"extensions\",\"file types\"],\"patchTemplate\":{\"options\":{\"allowedExtensions\":[\"{{value}}\"]}}}],\"fieldResolvers\":{},\"hints\":[\"limits.maxFileSizeBytes expects bytes (e.g., 10485760 for 10MB).\",\"Use options.allowedExtensions for backend validation and ui.accept for input hints.\"]}}",
          "sourcePointer": "projects/praxis-files-upload/src/lib/ai/files-upload-context-pack.ts",
          "contentHash": "1d4372ba4ac4735e62aa23b7d43ef94e0c6b51cb0bc83e33d61f7381edc0cd39",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        },
        {
          "chunkIndex": 20,
          "chunkKind": "recipe",
          "content": "{\"_comment\":\"Recipe for advanced file upload configuration with Praxis Files Upload.\",\"templateMeta\":{\"registryKey\":\"praxis-files-upload\",\"variantId\":\"base\",\"useWhen\":\"Base files upload configuration aligned with the current @praxisui/files-upload contract.\",\"examplePrompts\":[\"configure file upload limits\",\"set allowed file types for upload\",\"create an evidence upload flow with metadata and validation\"]},\"config\":{\"strategy\":\"direct\",\"ui\":{\"showDropzone\":true,\"accept\":[\"application/pdf\",\"image/png\",\"image/jpeg\",\".pdf\",\".png\",\".jpg\"],\"dense\":false,\"showConflictPolicySelector\":true,\"showMetadataForm\":true,\"showProgress\":true,\"manualUpload\":true,\"dropzone\":{\"expandOnDragProximity\":true,\"proximityPx\":96,\"expandMode\":\"inline\",\"expandHeight\":180,\"expandDebounceMs\":120},\"list\":{\"collapseAfter\":4,\"detailsMode\":\"card\",\"detailsShowTechnical\":true,\"detailsFields\":[\"id\",\"fileName\",\"contentType\",\"fileSize\",\"uploadedAt\",\"scanStatus\"]}},\"limits\":{\"maxFileSizeBytes\":10485760,\"maxFilesPerBulk\":6,\"maxBulkSizeBytes\":52428800},\"options\":{\"defaultConflictPolicy\":\"MAKE_UNIQUE\",\"strictValidation\":true,\"maxUploadSizeMb\":10,\"allowedExtensions\":[\"pdf\",\"png\",\"jpg\",\"jpeg\"],\"acceptMimeTypes\":[\"application/pdf\",\"image/png\",\"image/jpeg\"],\"targetDirectory\":\"mission-evidence\",\"enableVirusScanning\":true},\"bulk\":{\"failFast\":false,\"parallelUploads\":2,\"retryCount\":2,\"retryBackoffMs\":600},\"quotas\":{\"showQuotaWarnings\":true,\"blockOnExceed\":true},\"rateLimit\":{\"autoRetryOn429\":true,\"showBannerOn429\":true,\"maxAutoRetry\":2,\"baseBackoffMs\":1000},\"headers\":{\"tenantHeader\":\"X-Tenant-Id\",\"userHeader\":\"X-User-Id\"},\"messages\":{\"successSingle\":\"Evidence uploaded and ready for review.\",\"successBulk\":\"Evidence batch processed.\",\"errors\":{\"QUOTA_EXCEEDED\":\"Evidence quota reached.\",\"TIPO_ARQUIVO_INVALIDO\":\"Only PDF, PNG and JPEG files are accepted.\",\"FILE_TOO_LARGE\":\"File exceeds the configured size limit.\"}}}}",
          "sourcePointer": "examples/ai-recipes/praxis-files-upload.json",
          "contentHash": "471b1f9698fdac44097c7f9ab78a50cbbea0fd8daba76cdab820ffe856838bf7",
          "sourceKind": "component_definition",
          "sourceId": "praxis-files-upload",
          "corpusVersion": "1.0.0"
        }
      ]
    }
  },
  "note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
}
