@praxisui/files-upload 9.0.0-beta.71 → 9.0.0-beta.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-11T00:12:06.404Z",
3
+ "generatedAt": "2026-07-12T01:34:40.567Z",
4
4
  "packageName": "@praxisui/files-upload",
5
- "packageVersion": "9.0.0-beta.71",
5
+ "packageVersion": "9.0.0-beta.73",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -14,109 +14,153 @@
14
14
  {
15
15
  "name": "config",
16
16
  "type": "FilesUploadConfig",
17
- "required": false
17
+ "required": false,
18
+ "description": "Configuracao do upload (tipos aceitos, limites, endpoints, comportamento).",
19
+ "label": "Configuracao"
18
20
  },
19
21
  {
20
22
  "name": "filesUploadId",
21
23
  "type": "string",
22
- "required": false
24
+ "required": false,
25
+ "description": "Identificador logico do upload para persistencia e rastreamento.",
26
+ "label": "Upload ID"
23
27
  },
24
28
  {
25
29
  "name": "componentInstanceId",
26
30
  "type": "string",
27
- "required": false
31
+ "required": false,
32
+ "description": "Identificador opcional para diferenciar multiplas instancias na mesma tela.",
33
+ "label": "ID da instancia"
28
34
  },
29
35
  {
30
36
  "name": "baseUrl",
31
37
  "type": "string",
32
- "required": false
38
+ "required": false,
39
+ "description": "Base URL da API de arquivos.",
40
+ "label": "Base URL"
33
41
  },
34
42
  {
35
43
  "name": "displayMode",
36
44
  "type": "'full' | 'compact'",
37
- "required": false
45
+ "required": false,
46
+ "description": "Define o modo de exibicao do componente.",
47
+ "label": "Modo de exibicao",
48
+ "default": "full"
38
49
  },
39
50
  {
40
51
  "name": "context",
41
52
  "type": "Record<string, unknown>",
42
- "required": false
53
+ "required": false,
54
+ "description": "Contexto usado para resolver expressoes em metadados.",
55
+ "label": "Contexto"
43
56
  },
44
57
  {
45
58
  "name": "enableCustomization",
46
59
  "type": "boolean",
47
- "required": false
60
+ "required": false,
61
+ "description": "Habilita a UI de customizacao/configuracao no runtime.",
62
+ "label": "Modo de customizacao",
63
+ "default": false
48
64
  }
49
65
  ],
50
66
  "outputs": [
51
67
  {
52
68
  "name": "uploadSuccess",
53
69
  "type": "FileMetadata",
54
- "required": false
70
+ "required": false,
71
+ "description": "Disparado quando o upload e finalizado com sucesso.",
72
+ "label": "Upload concluido"
55
73
  },
56
74
  {
57
75
  "name": "bulkComplete",
58
76
  "type": "BulkUploadResponseData",
59
- "required": false
77
+ "required": false,
78
+ "description": "Disparado quando o upload em lote e finalizado.",
79
+ "label": "Upload em lote concluido"
60
80
  },
61
81
  {
62
82
  "name": "error",
63
83
  "type": "ErrorResponse",
64
- "required": false
84
+ "required": false,
85
+ "description": "Disparado quando ocorre erro durante o upload.",
86
+ "label": "Erro no upload"
65
87
  },
66
88
  {
67
89
  "name": "rateLimited",
68
90
  "type": "RateLimitInfo",
69
- "required": false
91
+ "required": false,
92
+ "description": "Disparado quando ocorre rate limiting.",
93
+ "label": "Rate limit"
70
94
  },
71
95
  {
72
96
  "name": "uploadStart",
73
97
  "type": "UploadStartEvent",
74
- "required": false
98
+ "required": false,
99
+ "description": "Disparado quando o upload inicia com contexto do envio.",
100
+ "label": "Inicio do upload"
75
101
  },
76
102
  {
77
103
  "name": "uploadProgress",
78
104
  "type": "UploadProgressEvent",
79
- "required": false
105
+ "required": false,
106
+ "description": "Disparado conforme o progresso de upload.",
107
+ "label": "Progresso"
80
108
  },
81
109
  {
82
110
  "name": "retry",
83
111
  "type": "BulkUploadFileResult",
84
- "required": false
112
+ "required": false,
113
+ "description": "Disparado quando o usuario aciona reenvio.",
114
+ "label": "Reenvio"
85
115
  },
86
116
  {
87
117
  "name": "download",
88
118
  "type": "BulkUploadFileResult",
89
- "required": false
119
+ "required": false,
120
+ "description": "Disparado quando o usuario solicita download.",
121
+ "label": "Download"
90
122
  },
91
123
  {
92
124
  "name": "copyLink",
93
125
  "type": "BulkUploadFileResult",
94
- "required": false
126
+ "required": false,
127
+ "description": "Disparado quando o usuario copia o link.",
128
+ "label": "Copiar link"
95
129
  },
96
130
  {
97
131
  "name": "detailsOpened",
98
132
  "type": "BulkUploadFileResult",
99
- "required": false
133
+ "required": false,
134
+ "description": "Disparado quando os detalhes do item sao abertos.",
135
+ "label": "Detalhes abertos"
100
136
  },
101
137
  {
102
138
  "name": "detailsClosed",
103
139
  "type": "BulkUploadFileResult",
104
- "required": false
140
+ "required": false,
141
+ "description": "Disparado quando os detalhes do item sao fechados.",
142
+ "label": "Detalhes fechados"
105
143
  },
106
144
  {
107
145
  "name": "pendingStateChange",
108
146
  "type": "PendingFilesState",
109
- "required": false
147
+ "required": false,
148
+ "description": "Disparado quando o estado de selecao pendente muda.",
149
+ "label": "Arquivos pendentes"
110
150
  },
111
151
  {
112
152
  "name": "readinessChange",
113
153
  "type": "FilesUploadReadinessEvent",
114
- "required": false
154
+ "required": false,
155
+ "description": "Disparado quando o componente alterna entre configuracao local, servidor ou fallback.",
156
+ "label": "Prontidao"
115
157
  },
116
158
  {
117
159
  "name": "proximityChange",
118
160
  "type": "boolean",
119
- "required": false
161
+ "required": false,
162
+ "description": "Disparado quando muda o estado de proximidade do drag.",
163
+ "label": "Proximidade"
120
164
  }
121
165
  ],
122
166
  "configSchemaId": null,
@@ -130,6 +174,201 @@
130
174
  "configurable"
131
175
  ],
132
176
  "lib": "@praxisui/files-upload",
177
+ "actions": [
178
+ {
179
+ "id": "retry",
180
+ "label": "Reenviar",
181
+ "icon": "refresh",
182
+ "description": "Emite evento de reenvio do item",
183
+ "emit": "retry",
184
+ "payloadSchema": {
185
+ "type": "object",
186
+ "properties": {
187
+ "fileName": {
188
+ "type": "string",
189
+ "description": "Nome do arquivo"
190
+ },
191
+ "status": {
192
+ "type": "string",
193
+ "description": "Status do upload"
194
+ },
195
+ "file": {
196
+ "type": "object",
197
+ "description": "Metadados do arquivo"
198
+ },
199
+ "error": {
200
+ "type": "object",
201
+ "description": "Erro do upload"
202
+ }
203
+ },
204
+ "required": [
205
+ "fileName",
206
+ "status"
207
+ ],
208
+ "example": {
209
+ "fileName": "documento.pdf",
210
+ "status": "failed"
211
+ }
212
+ },
213
+ "scope": "context"
214
+ },
215
+ {
216
+ "id": "download",
217
+ "label": "Download",
218
+ "icon": "file_download",
219
+ "description": "Emite evento de download do item",
220
+ "emit": "download",
221
+ "payloadSchema": {
222
+ "type": "object",
223
+ "properties": {
224
+ "fileName": {
225
+ "type": "string",
226
+ "description": "Nome do arquivo"
227
+ },
228
+ "status": {
229
+ "type": "string",
230
+ "description": "Status do upload"
231
+ },
232
+ "file": {
233
+ "type": "object",
234
+ "description": "Metadados do arquivo"
235
+ },
236
+ "error": {
237
+ "type": "object",
238
+ "description": "Erro do upload"
239
+ }
240
+ },
241
+ "required": [
242
+ "fileName",
243
+ "status"
244
+ ],
245
+ "example": {
246
+ "fileName": "documento.pdf",
247
+ "status": "succeeded"
248
+ }
249
+ },
250
+ "scope": "context"
251
+ },
252
+ {
253
+ "id": "copy-link",
254
+ "label": "Copiar link",
255
+ "icon": "link",
256
+ "description": "Emite evento ao copiar o link do item",
257
+ "emit": "copyLink",
258
+ "payloadSchema": {
259
+ "type": "object",
260
+ "properties": {
261
+ "fileName": {
262
+ "type": "string",
263
+ "description": "Nome do arquivo"
264
+ },
265
+ "status": {
266
+ "type": "string",
267
+ "description": "Status do upload"
268
+ },
269
+ "file": {
270
+ "type": "object",
271
+ "description": "Metadados do arquivo"
272
+ },
273
+ "error": {
274
+ "type": "object",
275
+ "description": "Erro do upload"
276
+ }
277
+ },
278
+ "required": [
279
+ "fileName",
280
+ "status"
281
+ ],
282
+ "example": {
283
+ "fileName": "documento.pdf",
284
+ "status": "succeeded"
285
+ }
286
+ },
287
+ "scope": "context"
288
+ },
289
+ {
290
+ "id": "details-opened",
291
+ "label": "Abrir detalhes",
292
+ "icon": "info",
293
+ "description": "Emite evento ao abrir detalhes do item",
294
+ "emit": "detailsOpened",
295
+ "payloadSchema": {
296
+ "type": "object",
297
+ "properties": {
298
+ "fileName": {
299
+ "type": "string",
300
+ "description": "Nome do arquivo"
301
+ },
302
+ "status": {
303
+ "type": "string",
304
+ "description": "Status do upload"
305
+ },
306
+ "file": {
307
+ "type": "object",
308
+ "description": "Metadados do arquivo"
309
+ },
310
+ "error": {
311
+ "type": "object",
312
+ "description": "Erro do upload"
313
+ }
314
+ },
315
+ "required": [
316
+ "fileName",
317
+ "status"
318
+ ],
319
+ "example": {
320
+ "fileName": "documento.pdf",
321
+ "status": "succeeded"
322
+ }
323
+ },
324
+ "scope": "context"
325
+ },
326
+ {
327
+ "id": "details-closed",
328
+ "label": "Fechar detalhes",
329
+ "icon": "info_outline",
330
+ "description": "Emite evento ao fechar detalhes do item",
331
+ "emit": "detailsClosed",
332
+ "payloadSchema": {
333
+ "type": "object",
334
+ "properties": {
335
+ "fileName": {
336
+ "type": "string",
337
+ "description": "Nome do arquivo"
338
+ },
339
+ "status": {
340
+ "type": "string",
341
+ "description": "Status do upload"
342
+ },
343
+ "file": {
344
+ "type": "object",
345
+ "description": "Metadados do arquivo"
346
+ },
347
+ "error": {
348
+ "type": "object",
349
+ "description": "Erro do upload"
350
+ }
351
+ },
352
+ "required": [
353
+ "fileName",
354
+ "status"
355
+ ],
356
+ "example": {
357
+ "fileName": "documento.pdf",
358
+ "status": "succeeded"
359
+ }
360
+ },
361
+ "scope": "context"
362
+ }
363
+ ],
364
+ "configEditor": {
365
+ "component": "[ref:PraxisFilesUploadWidgetConfigEditor]",
366
+ "title": "Configurar upload de arquivos"
367
+ },
368
+ "authoringManifestRef": {
369
+ "componentId": "praxis-files-upload",
370
+ "source": "PRAXIS_FILES_UPLOAD_AUTHORING_MANIFEST"
371
+ },
133
372
  "source": "projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts",
134
373
  "exportName": "PRAXIS_FILES_UPLOAD_COMPONENT_METADATA",
135
374
  "componentCapabilities": [
@@ -1723,7 +1962,7 @@
1723
1962
  "chunkIndex": 0,
1724
1963
  "chunkKind": "summary",
1725
1964
  "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",
1726
- "sourcePointer": "praxis-ui-angular/projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts",
1965
+ "sourcePointer": "projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts",
1727
1966
  "contentHash": "ac9de9f88b3b6c41731da2106436647af09e3f2e469e8df223afeb1d30de9c8e",
1728
1967
  "sourceKind": "component_definition",
1729
1968
  "sourceId": "praxis-files-upload",
@@ -1733,7 +1972,7 @@
1733
1972
  "chunkIndex": 1,
1734
1973
  "chunkKind": "capabilities",
1735
1974
  "content": "Component Capabilities:\n - Path: strategy\n Category: strategy\n Kind: enum\n Description: Upload strategy.\n - Path: ui\n Category: ui\n Kind: object\n Description: UI configuration.\n - Path: ui.showDropzone\n Category: ui\n Kind: boolean\n Description: Show drag-and-drop dropzone.\n - Path: ui.accept\n Category: ui\n Kind: array\n Description: Accept attribute hints (extensions or mime types).\n - Path: ui.accept[]\n Category: ui\n Kind: string\n Description: Single accept entry.\n - Path: ui.dense\n Category: ui\n Kind: boolean\n Description: Dense layout.\n - Path: ui.showConflictPolicySelector\n Category: ui\n Kind: boolean\n Description: Show conflict policy selector.\n - Path: ui.showMetadataForm\n Category: ui\n Kind: boolean\n Description: Show metadata form for each file.\n - Path: ui.showProgress\n Category: ui\n Kind: boolean\n Description: Show progress UI.\n - Path: ui.manualUpload\n Category: ui\n Kind: boolean\n Description: Require manual start for uploads.\n - Path: ui.dropzone\n Category: ui\n Kind: object\n Description: Dropzone interaction options.\n - Path: ui.dropzone.expandOnDragProximity\n Category: ui\n Kind: boolean\n Description: Expand dropzone on drag proximity.\n - Path: ui.dropzone.proximityPx\n Category: ui\n Kind: number\n Description: Proximity radius in pixels.\n - Path: ui.dropzone.expandMode\n Category: ui\n Kind: enum\n Description: Dropzone expansion mode.\n - Path: ui.dropzone.expandHeight\n Category: ui\n Kind: number\n Description: Expanded height (px).\n - Path: ui.dropzone.expandDebounceMs\n Category: ui\n Kind: number\n Description: Drag debounce (ms).\n - Path: ui.list\n Category: ui\n Kind: object\n Description: Uploaded files list options.\n - Path: ui.list.collapseAfter\n Category: ui\n Kind: number\n Description: Collapse list after N items.\n - Path: ui.list.detailsMode\n Category: ui\n Kind: enum\n Description: Details panel mode.\n - Path: ui.list.detailsMaxWidth\n Category: ui\n Kind: number\n Description: Details panel max width (px).\n - Path: ui.list.detailsShowTechnical\n Category: ui\n Kind: boolean\n Description: Show technical details by default.\n - Path: ui.list.detailsFields\n Category: ui\n Kind: array\n Description: Allowed metadata fields to display.\n - Path: ui.list.detailsFields[]\n Category: ui\n Kind: string\n Description: Single metadata field name.\n - Path: ui.list.detailsAnchor\n Category: ui\n Kind: enum\n Description: Details overlay anchor.\n - Path: limits\n Category: limits\n Kind: object\n Description: Upload limits.\n - Path: limits.maxFileSizeBytes\n Category: limits\n Kind: number\n Description: Max file size (bytes).\n - Path: limits.maxFilesPerBulk\n Category: limits\n Kind: number\n Description: Max files per bulk upload.\n - Path: limits.maxBulkSizeBytes\n Category: limits\n Kind: number\n Description: Max bulk size (bytes).\n - Path: options\n Category: options\n Kind: object\n Description: Backend options sent as JSON.\n - Path: options.defaultConflictPolicy\n Category: options\n Kind: enum\n Description: Default conflict policy.\n - Path: options.strictValidation\n Category: options\n Kind: boolean\n Description: Strict backend validation.\n - Path: options.maxUploadSizeMb\n Category: options\n Kind: number\n Description: Max upload size in MB.\n - Path: options.allowedExtensions\n Category: options\n Kind: array\n Description: Allowed file extensions.\n - Path: options.allowedExtensions[]\n Category: options\n Kind: string\n Description: Single extension (e.g., pdf).\n - Path: options.acceptMimeTypes\n Category: options\n Kind: array\n Description: Allowed mime types.\n - Path: options.acceptMimeTypes[]\n Category: options\n Kind: string\n Description: Single mime type.\n - Path: options.targetDirectory\n Category: options\n Kind: string\n Description: Target directory on backend.\n - Path: options.enableVirusScanning\n Category: options\n Kind: boolean\n Description: Enable virus scanning.\n - Path: bulk\n Category: bulk\n Kind: object\n Description: Bulk upload tuning.\n - Path: bulk.failFast\n Category: bulk\n Kind: boolean\n Description: Abort on first error.\n - Path: bulk.parallelUploads\n Category: bulk\n Kind: number\n Description: Parallel uploads count.\n - Path: bulk.retryCount\n Category: bulk\n Kind: number\n Description: Retry count.\n - Path: bulk.retryBackoffMs\n Category: bulk\n Kind: number\n Description: Retry backoff (ms).\n - Path: quotas\n Category: quotas\n Kind: object\n Description: Quota UX behavior.\n - Path: quotas.showQuotaWarnings\n Category: quotas\n Kind: boolean\n Description: Show quota warnings.\n - Path: quotas.blockOnExceed\n Category: quotas\n Kind: boolean\n Description: Block uploads when exceeded.\n - Path: rateLimit\n Category: rateLimit\n Kind: object\n Description: 429 handling.\n - Path: rateLimit.autoRetryOn429\n Category: rateLimit\n Kind: boolean\n Description: Auto retry on 429.\n - Path: rateLimit.showBannerOn429\n Category: rateLimit\n Kind: boolean\n Description: Show rate limit banner.\n - Path: rateLimit.maxAutoRetry\n Category: rateLimit\n Kind: number\n Description: Max auto retry attempts.\n - Path: rateLimit.baseBackoffMs\n Category: rateLimit\n Kind: number\n Description: Base backoff (ms).\n - Path: headers\n Category: headers\n Kind: object\n Description: Header mapping for backend.\n - Path: headers.tenantHeader\n Category: headers\n Kind: string\n Description: Tenant header name.\n - Path: headers.userHeader\n Category: headers\n Kind: string\n Description: User header name.\n - Path: messages\n Category: messages\n Kind: object\n Description: User-facing text overrides.\n - Path: messages.successSingle\n Category: messages\n Kind: string\n Description: Single upload success message.\n - Path: messages.successBulk\n Category: messages\n Kind: string\n Description: Bulk upload success message.\n - Path: messages.errors\n Category: messages\n Kind: object\n Description: Error message map.\n - Path: messages.errors.[code]\n Category: messages\n Kind: string\n Description: Message for a specific error code.\nCapability Notes:\n - limits.maxFileSizeBytes and limits.maxBulkSizeBytes are bytes (e.g., 10485760 for 10MB).\n - options.allowedExtensions is enforced by backend validation; ui.accept is only a client hint.\n - Use options.defaultConflictPolicy to control name collisions on upload.\n",
1736
- "sourcePointer": "praxis-ui-angular/projects/praxis-files-upload/src/lib/ai/files-upload-ai-capabilities.ts",
1975
+ "sourcePointer": "projects/praxis-files-upload/src/lib/ai/files-upload-ai-capabilities.ts",
1737
1976
  "contentHash": "c66760435308ecfd846ae8a2d1ef17f6d264d4e6615e00a6595fd527c536bfb5",
1738
1977
  "sourceKind": "component_definition",
1739
1978
  "sourceId": "praxis-files-upload",
@@ -1743,7 +1982,7 @@
1743
1982
  "chunkIndex": 2,
1744
1983
  "chunkKind": "authoring_manifest",
1745
1984
  "content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-files-upload\",\n \"ownerPackage\": \"@praxisui/files-upload\",\n \"configSchemaId\": \"FilesUploadConfig\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"config\",\n \"type\": \"FilesUploadConfig\",\n \"description\": \"Upload strategy, UI, limits, backend options, bulk execution, quota/rate feedback, headers and messages.\"\n },\n {\n \"name\": \"filesUploadId\",\n \"type\": \"string\",\n \"description\": \"Stable upload id used for config persistence and telemetry correlation.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional instance discriminator when the same upload id appears more than once.\"\n },\n {\n \"name\": \"baseUrl\",\n \"type\": \"string\",\n \"description\": \"Canonical files API base URL. Direct upload uses baseUrl/upload, bulk uses baseUrl/bulk and presign uses baseUrl/upload/presign.\"\n },\n {\n \"name\": \"displayMode\",\n \"type\": \"'full' | 'compact'\",\n \"allowedValues\": [\n \"full\",\n \"compact\"\n ],\n \"description\": \"Runtime display mode input.\"\n },\n {\n \"name\": \"context\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Host context available to metadata and event consumers.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables the Settings Panel configuration editor.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"acceptedTypes\",\n \"resolver\": \"files-accept-list\",\n \"description\": \"Allowed file extensions and MIME types projected to ui.accept, options.allowedExtensions and options.acceptMimeTypes.\"\n },\n {\n \"kind\": \"sizeLimit\",\n \"resolver\": \"max-file-size-policy\",\n \"description\": \"Maximum single-file size in limits.maxFileSizeBytes and backend-facing options.maxUploadSizeMb.\"\n },\n {\n \"kind\": \"fileCountLimit\",\n \"resolver\": \"max-files-per-bulk-policy\",\n \"description\": \"Maximum number of files accepted in a bulk selection.\"\n },\n {\n \"kind\": \"presignEndpoint\",\n \"resolver\": \"files-api-base-url-presign-contract\",\n \"description\": \"Presign operation endpoint derived from baseUrl + /upload/presign; arbitrary per-operation URLs are not accepted.\"\n },\n {\n \"kind\": \"uploadEndpoint\",\n \"resolver\": \"files-api-base-url-upload-contract\",\n \"description\": \"Direct and bulk upload endpoints derived from baseUrl + /upload and /bulk.\"\n },\n {\n \"kind\": \"securityPolicy\",\n \"resolver\": \"upload-security-policy\",\n \"description\": \"Strict validation, virus scanning, conflict policy, target directory, quotas, rate limit and contextual headers.\"\n },\n {\n \"kind\": \"errorMessages\",\n \"resolver\": \"upload-error-code-message\",\n \"description\": \"Host-provided message overrides under messages.errors keyed by backend error code.\"\n },\n {\n \"kind\": \"display\",\n \"resolver\": \"files-upload-display-mode-and-ui\",\n \"description\": \"Runtime displayMode plus non-backend visual UI flags.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"accept.types.set\",\n \"title\": \"Set accepted file types\",\n \"scope\": \"global\",\n \"targetKind\": \"acceptedTypes\",\n \"target\": {\n \"kind\": \"acceptedTypes\",\n \"resolver\": \"files-accept-list\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"accept\"\n ],\n \"properties\": {\n \"accept\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allowedExtensions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"acceptMimeTypes\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"ui.accept\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"options.allowedExtensions\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"options.acceptMimeTypes\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"file-type-list-explicit\",\n \"file-type-entry-valid\",\n \"backend-accept-options-consistent\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"ui.accept\",\n \"options.allowedExtensions\",\n \"options.acceptMimeTypes\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"limit.fileSize.set\",\n \"title\": \"Set max file size\",\n \"scope\": \"global\",\n \"targetKind\": \"sizeLimit\",\n \"target\": {\n \"kind\": \"sizeLimit\",\n \"resolver\": \"max-file-size-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"maxFileSizeBytes\"\n ],\n \"properties\": {\n \"maxFileSizeBytes\": {\n \"type\": \"number\"\n },\n \"maxUploadSizeMb\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"limits.maxFileSizeBytes\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"options.maxUploadSizeMb\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"size-limit-numeric\",\n \"size-limit-within-platform-policy\",\n \"size-limit-client-backend-consistent\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"limits.maxFileSizeBytes\",\n \"options.maxUploadSizeMb\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"limit.fileCount.set\",\n \"title\": \"Set max file count\",\n \"scope\": \"global\",\n \"targetKind\": \"fileCountLimit\",\n \"target\": {\n \"kind\": \"fileCountLimit\",\n \"resolver\": \"max-files-per-bulk-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"maxFilesPerBulk\"\n ],\n \"properties\": {\n \"maxFilesPerBulk\": {\n \"type\": \"number\"\n },\n \"maxBulkSizeBytes\": {\n \"type\": \"number\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"limits.maxFilesPerBulk\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"limits.maxBulkSizeBytes\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"file-count-limit-numeric\",\n \"bulk-size-limit-numeric\",\n \"bulk-limit-within-platform-policy\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"limits.maxFilesPerBulk\",\n \"limits.maxBulkSizeBytes\"\n ],\n \"submissionImpact\": \"affects-submission\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"endpoint.presign.set\",\n \"title\": \"Set presign endpoint\",\n \"scope\": \"global\",\n \"targetKind\": \"presignEndpoint\",\n \"target\": {\n \"kind\": \"presignEndpoint\",\n \"resolver\": \"files-api-base-url-presign-contract\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"baseUrl\"\n ],\n \"properties\": {\n \"baseUrl\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"direct\",\n \"presign\",\n \"auto\"\n ]\n },\n \"allowCrossOriginPresignedTarget\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"files-upload-presign-base-url\",\n \"handlerContract\": {\n \"reads\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"writes\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"identityKeys\": [\n \"baseUrl\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"baseUrl\"\n ],\n \"properties\": {\n \"baseUrl\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"direct\",\n \"presign\",\n \"auto\"\n ]\n },\n \"allowCrossOriginPresignedTarget\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"unsafe-url\",\n \"non-praxis-backend-surface\",\n \"presign-path-override\",\n \"cross-origin-presigned-fields-leak\"\n ],\n \"description\": \"Validates the files API base URL and preserves the canonical POST baseUrl/upload/presign?filename=... contract; arbitrary presign URLs are rejected.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"endpoint-url-safe\",\n \"endpoint-uses-praxis-backend-surface\",\n \"presign-endpoint-fixed-contract\",\n \"presign-cross-origin-fields-safe\",\n \"security-change-confirmed\"\n ],\n \"affectedPaths\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"endpoint.upload.set\",\n \"title\": \"Set upload endpoint\",\n \"scope\": \"global\",\n \"targetKind\": \"uploadEndpoint\",\n \"target\": {\n \"kind\": \"uploadEndpoint\",\n \"resolver\": \"files-api-base-url-upload-contract\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"baseUrl\"\n ],\n \"properties\": {\n \"baseUrl\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"direct\",\n \"presign\",\n \"auto\"\n ]\n },\n \"allowCrossOriginPresignedTarget\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"files-upload-direct-base-url\",\n \"handlerContract\": {\n \"reads\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"writes\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"identityKeys\": [\n \"baseUrl\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"baseUrl\"\n ],\n \"properties\": {\n \"baseUrl\": {\n \"type\": \"string\"\n },\n \"strategy\": {\n \"enum\": [\n \"direct\",\n \"presign\",\n \"auto\"\n ]\n },\n \"allowCrossOriginPresignedTarget\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"unsafe-url\",\n \"non-praxis-backend-surface\",\n \"upload-path-override\",\n \"bulk-path-override\"\n ],\n \"description\": \"Validates the files API base URL and preserves the canonical POST baseUrl/upload and POST baseUrl/bulk contracts.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"endpoint-url-safe\",\n \"endpoint-uses-praxis-backend-surface\",\n \"upload-endpoint-fixed-contract\",\n \"bulk-endpoint-fixed-contract\",\n \"security-change-confirmed\"\n ],\n \"affectedPaths\": [\n \"baseUrl\",\n \"strategy\"\n ],\n \"submissionImpact\": \"affects-remote-binding\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"security.policy.set\",\n \"title\": \"Set upload security policy\",\n \"scope\": \"global\",\n \"targetKind\": \"securityPolicy\",\n \"target\": {\n \"kind\": \"securityPolicy\",\n \"resolver\": \"upload-security-policy\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"strictValidation\": {\n \"type\": \"boolean\"\n },\n \"enableVirusScanning\": {\n \"type\": \"boolean\"\n },\n \"defaultConflictPolicy\": {\n \"enum\": [\n \"ERROR\",\n \"SKIP\",\n \"OVERWRITE\",\n \"MAKE_UNIQUE\",\n \"RENAME\"\n ]\n },\n \"targetDirectory\": {\n \"type\": \"string\"\n },\n \"showQuotaWarnings\": {\n \"type\": \"boolean\"\n },\n \"blockOnExceed\": {\n \"type\": \"boolean\"\n },\n \"autoRetryOn429\": {\n \"type\": \"boolean\"\n },\n \"showBannerOn429\": {\n \"type\": \"boolean\"\n },\n \"maxAutoRetry\": {\n \"type\": \"number\"\n },\n \"baseBackoffMs\": {\n \"type\": \"number\"\n },\n \"tenantHeader\": {\n \"type\": \"string\"\n },\n \"userHeader\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"options\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"quotas\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"rateLimit\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"headers\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"security-change-confirmed\",\n \"security-policy-compatible\",\n \"target-directory-safe\",\n \"conflict-policy-valid\",\n \"quota-rate-policy-valid\",\n \"header-names-safe\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"options.strictValidation\",\n \"options.enableVirusScanning\",\n \"options.defaultConflictPolicy\",\n \"options.targetDirectory\",\n \"quotas\",\n \"rateLimit\",\n \"headers\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"message.error.set\",\n \"title\": \"Set error message override\",\n \"scope\": \"global\",\n \"targetKind\": \"errorMessages\",\n \"target\": {\n \"kind\": \"errorMessages\",\n \"resolver\": \"upload-error-code-message\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"code\",\n \"message\"\n ],\n \"properties\": {\n \"code\": {\n \"type\": \"string\"\n },\n \"message\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"messages.errors\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"error-code-known\",\n \"error-message-i18n-compatible\",\n \"message-not-empty\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"messages.errors\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"display.mode.set\",\n \"title\": \"Set display mode\",\n \"scope\": \"global\",\n \"targetKind\": \"display\",\n \"target\": {\n \"kind\": \"display\",\n \"resolver\": \"files-upload-display-mode-and-ui\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"displayMode\": {\n \"enum\": [\n \"full\",\n \"compact\"\n ]\n },\n \"dense\": {\n \"type\": \"boolean\"\n },\n \"showDropzone\": {\n \"type\": \"boolean\"\n },\n \"showProgress\": {\n \"type\": \"boolean\"\n },\n \"manualUpload\": {\n \"type\": \"boolean\"\n },\n \"showMetadataForm\": {\n \"type\": \"boolean\"\n },\n \"showConflictPolicySelector\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"displayMode\"\n },\n {\n \"kind\": \"merge-object\",\n \"path\": \"ui\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"display-mode-valid\",\n \"display-ui-compatible\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"displayMode\",\n \"ui.dense\",\n \"ui.showDropzone\",\n \"ui.showProgress\",\n \"ui.manualUpload\",\n \"ui.showMetadataForm\",\n \"ui.showConflictPolicySelector\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"file-type-list-explicit\",\n \"level\": \"error\",\n \"code\": \"PFU001\",\n \"description\": \"Accepted type edits must provide a non-empty explicit list and may not rely on wildcard-only policy.\"\n },\n {\n \"validatorId\": \"file-type-entry-valid\",\n \"level\": \"error\",\n \"code\": \"PFU002\",\n \"description\": \"Each accepted type must be a valid extension, exact MIME type or controlled subtype wildcard.\"\n },\n {\n \"validatorId\": \"backend-accept-options-consistent\",\n \"level\": \"error\",\n \"code\": \"PFU003\",\n \"description\": \"ui.accept hints must remain consistent with options.allowedExtensions and options.acceptMimeTypes when backend validation is configured.\"\n },\n {\n \"validatorId\": \"size-limit-numeric\",\n \"level\": \"error\",\n \"code\": \"PFU004\",\n \"description\": \"Single file size limits must be positive numeric byte and MB values.\"\n },\n {\n \"validatorId\": \"size-limit-within-platform-policy\",\n \"level\": \"error\",\n \"code\": \"PFU005\",\n \"description\": \"Single file size limits must not exceed the platform upload policy for the selected backend surface.\"\n },\n {\n \"validatorId\": \"size-limit-client-backend-consistent\",\n \"level\": \"error\",\n \"code\": \"PFU006\",\n \"description\": \"limits.maxFileSizeBytes and options.maxUploadSizeMb must describe the same effective maximum when both are present.\"\n },\n {\n \"validatorId\": \"file-count-limit-numeric\",\n \"level\": \"error\",\n \"code\": \"PFU007\",\n \"description\": \"Bulk file count limits must be positive integers.\"\n },\n {\n \"validatorId\": \"bulk-size-limit-numeric\",\n \"level\": \"error\",\n \"code\": \"PFU008\",\n \"description\": \"Bulk size limits must be positive numeric byte values when provided.\"\n },\n {\n \"validatorId\": \"bulk-limit-within-platform-policy\",\n \"level\": \"error\",\n \"code\": \"PFU009\",\n \"description\": \"Bulk count and aggregate size limits must not exceed backend batch policy.\"\n },\n {\n \"validatorId\": \"endpoint-url-safe\",\n \"level\": \"error\",\n \"code\": \"PFU010\",\n \"description\": \"Endpoint edits must use a safe absolute or approved relative baseUrl and reject javascript:, data:, credentials-in-URL and path traversal.\"\n },\n {\n \"validatorId\": \"endpoint-uses-praxis-backend-surface\",\n \"level\": \"error\",\n \"code\": \"PFU011\",\n \"description\": \"Endpoint edits must resolve to the approved Praxis files backend surface for the host environment.\"\n },\n {\n \"validatorId\": \"presign-endpoint-fixed-contract\",\n \"level\": \"error\",\n \"code\": \"PFU012\",\n \"description\": \"Presign authoring may change baseUrl but must preserve POST baseUrl/upload/presign?filename=... as the runtime contract.\"\n },\n {\n \"validatorId\": \"upload-endpoint-fixed-contract\",\n \"level\": \"error\",\n \"code\": \"PFU013\",\n \"description\": \"Direct upload authoring may change baseUrl but must preserve POST baseUrl/upload as the runtime contract.\"\n },\n {\n \"validatorId\": \"bulk-endpoint-fixed-contract\",\n \"level\": \"error\",\n \"code\": \"PFU014\",\n \"description\": \"Bulk upload authoring may change baseUrl but must preserve POST baseUrl/bulk as the runtime contract.\"\n },\n {\n \"validatorId\": \"presign-cross-origin-fields-safe\",\n \"level\": \"error\",\n \"code\": \"PFU015\",\n \"description\": \"Cross-origin presigned upload targets must not receive Praxis metadata/options fields unless explicitly approved by the presign response contract.\"\n },\n {\n \"validatorId\": \"security-change-confirmed\",\n \"level\": \"error\",\n \"code\": \"PFU016\",\n \"description\": \"Endpoint and security policy edits require explicit confirmation before patch compilation.\"\n },\n {\n \"validatorId\": \"security-policy-compatible\",\n \"level\": \"error\",\n \"code\": \"PFU017\",\n \"description\": \"Strict validation, virus scanning, conflict policy, target directory, quota and rate-limit settings must be compatible with backend effective config.\"\n },\n {\n \"validatorId\": \"target-directory-safe\",\n \"level\": \"error\",\n \"code\": \"PFU018\",\n \"description\": \"Target directory values must be normalized backend paths and must reject traversal or absolute filesystem paths.\"\n },\n {\n \"validatorId\": \"conflict-policy-valid\",\n \"level\": \"error\",\n \"code\": \"PFU019\",\n \"description\": \"Default conflict policy must be one of ERROR, SKIP, OVERWRITE, MAKE_UNIQUE or RENAME.\"\n },\n {\n \"validatorId\": \"quota-rate-policy-valid\",\n \"level\": \"error\",\n \"code\": \"PFU020\",\n \"description\": \"Quota and rate-limit UX settings must use non-negative retry counts/backoffs and cannot silently bypass backend enforcement.\"\n },\n {\n \"validatorId\": \"header-names-safe\",\n \"level\": \"warning\",\n \"code\": \"PFU021\",\n \"description\": \"Contextual header names must be explicit HTTP token names and must not override authorization, cookie or content-type headers.\"\n },\n {\n \"validatorId\": \"error-code-known\",\n \"level\": \"warning\",\n \"code\": \"PFU022\",\n \"description\": \"Error message overrides should target known backend error catalog codes or documented host-specific extensions.\"\n },\n {\n \"validatorId\": \"error-message-i18n-compatible\",\n \"level\": \"warning\",\n \"code\": \"PFU023\",\n \"description\": \"User-facing error messages must remain compatible with the host i18n/editor flow and not expose raw technical exception text.\"\n },\n {\n \"validatorId\": \"message-not-empty\",\n \"level\": \"error\",\n \"code\": \"PFU024\",\n \"description\": \"Error message overrides must be non-empty user-facing text.\"\n },\n {\n \"validatorId\": \"display-mode-valid\",\n \"level\": \"error\",\n \"code\": \"PFU025\",\n \"description\": \"Display mode must be full or compact.\"\n },\n {\n \"validatorId\": \"display-ui-compatible\",\n \"level\": \"warning\",\n \"code\": \"PFU026\",\n \"description\": \"Display changes must keep progress, manual upload and metadata form affordances reachable for the selected mode.\"\n },\n {\n \"validatorId\": \"editor-runtime-round-trip\",\n \"level\": \"error\",\n \"code\": \"PFU027\",\n \"description\": \"Settings Panel editor, AI adapter snapshot and runtime inputs must round-trip config, baseUrl and displayMode without changing upload behavior.\"\n }\n ],\n \"roundTripRequirements\": [\n \"Accepted type authoring must keep UI hints and backend-facing validation options aligned; ui.accept alone is not the canonical server policy.\",\n \"Endpoint authoring changes only the canonical files API baseUrl and strategy; direct, bulk and presign paths remain fixed by FilesApiClient.\",\n \"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.\",\n \"Error message overrides remain keyed by backend error catalog code and must stay user-facing/i18n-compatible.\",\n \"Display authoring may change displayMode and UI flags, but must not mutate backend options or upload submission payload.\"\n ],\n \"examples\": [\n {\n \"id\": \"accept-pdf-images\",\n \"request\": \"Accept only PDF and image uploads.\",\n \"operationId\": \"accept.types.set\",\n \"params\": {\n \"accept\": [\n \"application/pdf\",\n \"image/*\"\n ],\n \"allowedExtensions\": [\n \"pdf\",\n \"png\",\n \"jpg\",\n \"jpeg\"\n ],\n \"acceptMimeTypes\": [\n \"application/pdf\",\n \"image/png\",\n \"image/jpeg\"\n ]\n },\n \"isPositive\": true\n },\n {\n \"id\": \"max-five-mb\",\n \"request\": \"Limit each file to 5 MB.\",\n \"operationId\": \"limit.fileSize.set\",\n \"params\": {\n \"maxFileSizeBytes\": 5242880,\n \"maxUploadSizeMb\": 5\n },\n \"isPositive\": true\n },\n {\n \"id\": \"max-three-files\",\n \"request\": \"Allow at most three files per upload batch.\",\n \"operationId\": \"limit.fileCount.set\",\n \"params\": {\n \"maxFilesPerBulk\": 3\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-presign-base-url\",\n \"request\": \"Use the official files API for presigned uploads.\",\n \"operationId\": \"endpoint.presign.set\",\n \"params\": {\n \"baseUrl\": \"https://api.praxis.example/files\",\n \"strategy\": \"presign\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-direct-base-url\",\n \"request\": \"Use the official files API for direct uploads.\",\n \"operationId\": \"endpoint.upload.set\",\n \"params\": {\n \"baseUrl\": \"https://api.praxis.example/files\",\n \"strategy\": \"direct\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unsafe-endpoint\",\n \"request\": \"Set upload endpoint to javascript:alert(1).\",\n \"operationId\": \"endpoint.upload.set\",\n \"params\": {\n \"baseUrl\": \"javascript:alert(1)\",\n \"strategy\": \"direct\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"tighten-security-policy\",\n \"request\": \"Enable strict validation and virus scanning for uploads.\",\n \"operationId\": \"security.policy.set\",\n \"params\": {\n \"strictValidation\": true,\n \"enableVirusScanning\": true,\n \"defaultConflictPolicy\": \"ERROR\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-unconfirmed-security-policy\",\n \"request\": \"Disable strict validation without confirmation.\",\n \"operationId\": \"security.policy.set\",\n \"params\": {\n \"strictValidation\": false,\n \"enableVirusScanning\": false\n },\n \"isPositive\": false\n },\n {\n \"id\": \"quota-message\",\n \"request\": \"Show a friendly message when quota is exceeded.\",\n \"operationId\": \"message.error.set\",\n \"params\": {\n \"code\": \"QUOTA_EXCEEDED\",\n \"message\": \"Upload quota reached for this period.\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"compact-display\",\n \"request\": \"Use compact upload display and keep progress visible.\",\n \"operationId\": \"display.mode.set\",\n \"params\": {\n \"displayMode\": \"compact\",\n \"dense\": true,\n \"showProgress\": true\n },\n \"isPositive\": true\n }\n ]\n}",
1746
- "sourcePointer": "praxis-ui-angular/projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
1985
+ "sourcePointer": "projects/praxis-files-upload/src/lib/ai/praxis-files-upload-authoring-manifest.ts",
1747
1986
  "contentHash": "b9d1c1169ded284421d4a18e3b6227cc963b1aaa8a19d1ebd02cf61280ffbc68",
1748
1987
  "sourceKind": "component_definition",
1749
1988
  "sourceId": "praxis-files-upload",
@@ -1753,7 +1992,7 @@
1753
1992
  "chunkIndex": 3,
1754
1993
  "chunkKind": "context_pack",
1755
1994
  "content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"strategy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"direct\",\n \"label\": \"Direct\"\n },\n {\n \"value\": \"presign\",\n \"label\": \"Presign\"\n },\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n }\n ]\n },\n \"ui.dropzone.expandMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"overlay\",\n \"label\": \"Overlay\"\n },\n {\n \"value\": \"inline\",\n \"label\": \"Inline\"\n }\n ]\n },\n \"ui.list.detailsMode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"card\",\n \"label\": \"Card\"\n },\n {\n \"value\": \"sidesheet\",\n \"label\": \"Side sheet\"\n },\n {\n \"value\": \"auto\",\n \"label\": \"Auto\"\n }\n ]\n },\n \"ui.list.detailsAnchor\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"item\",\n \"label\": \"Item\"\n },\n {\n \"value\": \"field\",\n \"label\": \"Field\"\n }\n ]\n },\n \"options.defaultConflictPolicy\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"ERROR\",\n \"label\": \"Error\"\n },\n {\n \"value\": \"SKIP\",\n \"label\": \"Skip\"\n },\n {\n \"value\": \"OVERWRITE\",\n \"label\": \"Overwrite\"\n },\n {\n \"value\": \"MAKE_UNIQUE\",\n \"label\": \"Make unique\"\n },\n {\n \"value\": \"RENAME\",\n \"label\": \"Rename\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"strategy.set\",\n \"intentExamples\": [\n \"strategy\",\n \"upload strategy\"\n ],\n \"patchTemplate\": {\n \"strategy\": \"{{value}}\"\n }\n },\n {\n \"id\": \"ui.showDropzone.enable\",\n \"intentExamples\": [\n \"show dropzone\",\n \"enable dropzone\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"showDropzone\": true\n }\n }\n },\n {\n \"id\": \"ui.showDropzone.disable\",\n \"intentExamples\": [\n \"hide dropzone\",\n \"disable dropzone\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"showDropzone\": false\n }\n }\n },\n {\n \"id\": \"ui.manualUpload.enable\",\n \"intentExamples\": [\n \"manual upload\",\n \"upload button\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"manualUpload\": true\n }\n }\n },\n {\n \"id\": \"ui.manualUpload.disable\",\n \"intentExamples\": [\n \"auto upload\",\n \"instant upload\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"manualUpload\": false\n }\n }\n },\n {\n \"id\": \"ui.showProgress.enable\",\n \"intentExamples\": [\n \"show progress\",\n \"progress bar\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"showProgress\": true\n }\n }\n },\n {\n \"id\": \"ui.showProgress.disable\",\n \"intentExamples\": [\n \"hide progress\",\n \"no progress\"\n ],\n \"patchTemplate\": {\n \"ui\": {\n \"showProgress\": false\n }\n }\n },\n {\n \"id\": \"limits.maxFileSizeBytes.set\",\n \"intentExamples\": [\n \"max file size\",\n \"size limit\"\n ],\n \"patchTemplate\": {\n \"limits\": {\n \"maxFileSizeBytes\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"limits.maxFilesPerBulk.set\",\n \"intentExamples\": [\n \"max files\",\n \"files per upload\"\n ],\n \"patchTemplate\": {\n \"limits\": {\n \"maxFilesPerBulk\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"options.defaultConflictPolicy.set\",\n \"intentExamples\": [\n \"conflict policy\",\n \"overwrite\",\n \"rename\"\n ],\n \"patchTemplate\": {\n \"options\": {\n \"defaultConflictPolicy\": \"{{value}}\"\n }\n }\n },\n {\n \"id\": \"options.allowedExtensions.add\",\n \"intentExamples\": [\n \"allowed extensions\",\n \"extensions\",\n \"file types\"\n ],\n \"patchTemplate\": {\n \"options\": {\n \"allowedExtensions\": [\n \"{{value}}\"\n ]\n }\n }\n }\n ],\n \"fieldResolvers\": {},\n \"hints\": [\n \"limits.maxFileSizeBytes expects bytes (e.g., 10485760 for 10MB).\",\n \"Use options.allowedExtensions for backend validation and ui.accept for input hints.\"\n ]\n }\n}",
1756
- "sourcePointer": "praxis-ui-angular/projects/praxis-files-upload/src/lib/ai/files-upload-context-pack.ts",
1995
+ "sourcePointer": "projects/praxis-files-upload/src/lib/ai/files-upload-context-pack.ts",
1757
1996
  "contentHash": "5ffa84516ca618908b0795e584de1b6adc21e3072cd1ad5dafa241ff07b184e5",
1758
1997
  "sourceKind": "component_definition",
1759
1998
  "sourceId": "praxis-files-upload",
@@ -1763,7 +2002,7 @@
1763
2002
  "chunkIndex": 4,
1764
2003
  "chunkKind": "recipe",
1765
2004
  "content": "{\n \"_comment\": \"Recipe for advanced file upload configuration with Praxis Files Upload.\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-files-upload\",\n \"variantId\": \"base\",\n \"useWhen\": \"Base files upload configuration aligned with the current @praxisui/files-upload contract.\",\n \"examplePrompts\": [\n \"configure file upload limits\",\n \"set allowed file types for upload\",\n \"create an evidence upload flow with metadata and validation\"\n ]\n },\n \"config\": {\n \"strategy\": \"direct\",\n \"ui\": {\n \"showDropzone\": true,\n \"accept\": [\"application/pdf\", \"image/png\", \"image/jpeg\", \".pdf\", \".png\", \".jpg\"],\n \"dense\": false,\n \"showConflictPolicySelector\": true,\n \"showMetadataForm\": true,\n \"showProgress\": true,\n \"manualUpload\": true,\n \"dropzone\": {\n \"expandOnDragProximity\": true,\n \"proximityPx\": 96,\n \"expandMode\": \"inline\",\n \"expandHeight\": 180,\n \"expandDebounceMs\": 120\n },\n \"list\": {\n \"collapseAfter\": 4,\n \"detailsMode\": \"card\",\n \"detailsShowTechnical\": true,\n \"detailsFields\": [\"id\", \"fileName\", \"contentType\", \"fileSize\", \"uploadedAt\", \"scanStatus\"]\n }\n },\n \"limits\": {\n \"maxFileSizeBytes\": 10485760,\n \"maxFilesPerBulk\": 6,\n \"maxBulkSizeBytes\": 52428800\n },\n \"options\": {\n \"defaultConflictPolicy\": \"MAKE_UNIQUE\",\n \"strictValidation\": true,\n \"maxUploadSizeMb\": 10,\n \"allowedExtensions\": [\"pdf\", \"png\", \"jpg\", \"jpeg\"],\n \"acceptMimeTypes\": [\"application/pdf\", \"image/png\", \"image/jpeg\"],\n \"targetDirectory\": \"mission-evidence\",\n \"enableVirusScanning\": true\n },\n \"bulk\": {\n \"failFast\": false,\n \"parallelUploads\": 2,\n \"retryCount\": 2,\n \"retryBackoffMs\": 600\n },\n \"quotas\": {\n \"showQuotaWarnings\": true,\n \"blockOnExceed\": true\n },\n \"rateLimit\": {\n \"autoRetryOn429\": true,\n \"showBannerOn429\": true,\n \"maxAutoRetry\": 2,\n \"baseBackoffMs\": 1000\n },\n \"headers\": {\n \"tenantHeader\": \"X-Tenant-Id\",\n \"userHeader\": \"X-User-Id\"\n },\n \"messages\": {\n \"successSingle\": \"Evidence uploaded and ready for review.\",\n \"successBulk\": \"Evidence batch processed.\",\n \"errors\": {\n \"QUOTA_EXCEEDED\": \"Evidence quota reached.\",\n \"TIPO_ARQUIVO_INVALIDO\": \"Only PDF, PNG and JPEG files are accepted.\",\n \"FILE_TOO_LARGE\": \"File exceeds the configured size limit.\"\n }\n }\n }\n}\n",
1766
- "sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-files-upload.json",
2005
+ "sourcePointer": "examples/ai-recipes/praxis-files-upload.json",
1767
2006
  "contentHash": "0571f31320873a9c01859005967efcd5e15c08ddb12dfb020e8003a90d52f7c4",
1768
2007
  "sourceKind": "component_definition",
1769
2008
  "sourceId": "praxis-files-upload",
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@praxisui/files-upload",
3
- "version": "9.0.0-beta.71",
3
+ "version": "9.0.0-beta.73",
4
4
  "description": "File upload components and services for Praxis UI with presigned and direct strategies, quotas and rate-limit handling.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/cdk": "^21.0.0",
8
8
  "@angular/core": "^21.0.0",
9
9
  "@angular/material": "^21.0.0",
10
- "@praxisui/core": "^9.0.0-beta.71",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.71",
12
- "@praxisui/settings-panel": "^9.0.0-beta.71",
10
+ "@praxisui/core": "^9.0.0-beta.73",
11
+ "@praxisui/dynamic-fields": "^9.0.0-beta.73",
12
+ "@praxisui/settings-panel": "^9.0.0-beta.73",
13
13
  "@angular/forms": "^21.0.0",
14
14
  "@angular/router": "^21.0.0",
15
- "@praxisui/ai": "^9.0.0-beta.71",
15
+ "@praxisui/ai": "^9.0.0-beta.73",
16
16
  "rxjs": "~7.8.0"
17
17
  },
18
18
  "dependencies": {