@trentapps/manager-protocol 1.1.2 → 1.2.0
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.
- package/README.md +29 -1
- package/dist/analyzers/CSSAnalyzer.d.ts +188 -8
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/CSSAnalyzer.js +794 -192
- package/dist/analyzers/CSSAnalyzer.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/config/dashboard.d.ts +55 -0
- package/dist/config/dashboard.d.ts.map +1 -0
- package/dist/config/dashboard.js +103 -0
- package/dist/config/dashboard.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/dashboard/httpDashboard.d.ts +100 -0
- package/dist/dashboard/httpDashboard.d.ts.map +1 -0
- package/dist/dashboard/httpDashboard.js +1276 -0
- package/dist/dashboard/httpDashboard.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +370 -2
- package/dist/engine/AuditLogger.d.ts.map +1 -1
- package/dist/engine/AuditLogger.js +1067 -24
- package/dist/engine/AuditLogger.js.map +1 -1
- package/dist/engine/GitHubApprovalManager.d.ts +13 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -1
- package/dist/engine/GitHubApprovalManager.js +72 -46
- package/dist/engine/GitHubApprovalManager.js.map +1 -1
- package/dist/engine/GitHubClient.d.ts +183 -0
- package/dist/engine/GitHubClient.d.ts.map +1 -0
- package/dist/engine/GitHubClient.js +411 -0
- package/dist/engine/GitHubClient.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +5 -3
- package/dist/engine/RateLimiter.d.ts.map +1 -1
- package/dist/engine/RateLimiter.js +53 -70
- package/dist/engine/RateLimiter.js.map +1 -1
- package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.js +475 -0
- package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +102 -3
- package/dist/engine/RulesEngine.d.ts.map +1 -1
- package/dist/engine/RulesEngine.js +326 -21
- package/dist/engine/RulesEngine.js.map +1 -1
- package/dist/engine/TaskManager.d.ts +11 -10
- package/dist/engine/TaskManager.d.ts.map +1 -1
- package/dist/engine/TaskManager.js +180 -195
- package/dist/engine/TaskManager.js.map +1 -1
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +5 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/rules/azure.d.ts.map +1 -1
- package/dist/rules/azure.js +12 -14
- package/dist/rules/azure.js.map +1 -1
- package/dist/rules/compliance.d.ts.map +1 -1
- package/dist/rules/compliance.js +23 -41
- package/dist/rules/compliance.js.map +1 -1
- package/dist/rules/condition-optimizer.d.ts +151 -0
- package/dist/rules/condition-optimizer.d.ts.map +1 -0
- package/dist/rules/condition-optimizer.js +479 -0
- package/dist/rules/condition-optimizer.js.map +1 -0
- package/dist/rules/css.d.ts.map +1 -1
- package/dist/rules/css.js +538 -0
- package/dist/rules/css.js.map +1 -1
- package/dist/rules/field-standards.d.ts +1172 -0
- package/dist/rules/field-standards.d.ts.map +1 -0
- package/dist/rules/field-standards.js +908 -0
- package/dist/rules/field-standards.js.map +1 -0
- package/dist/rules/flask.d.ts.map +1 -1
- package/dist/rules/flask.js +18 -31
- package/dist/rules/flask.js.map +1 -1
- package/dist/rules/index.d.ts +220 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +155 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ml-ai.d.ts.map +1 -1
- package/dist/rules/ml-ai.js +11 -13
- package/dist/rules/ml-ai.js.map +1 -1
- package/dist/rules/patterns.d.ts +568 -0
- package/dist/rules/patterns.d.ts.map +1 -0
- package/dist/rules/patterns.js +1359 -0
- package/dist/rules/patterns.js.map +1 -0
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +580 -19
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/shared-patterns.d.ts +268 -0
- package/dist/rules/shared-patterns.d.ts.map +1 -0
- package/dist/rules/shared-patterns.js +556 -0
- package/dist/rules/shared-patterns.js.map +1 -0
- package/dist/rules/storage.d.ts +8 -2
- package/dist/rules/storage.d.ts.map +1 -1
- package/dist/rules/storage.js +541 -3
- package/dist/rules/storage.js.map +1 -1
- package/dist/rules/stripe.d.ts.map +1 -1
- package/dist/rules/stripe.js +19 -26
- package/dist/rules/stripe.js.map +1 -1
- package/dist/rules/websocket.d.ts.map +1 -1
- package/dist/rules/websocket.js +32 -40
- package/dist/rules/websocket.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +96 -17
- package/dist/server.js.map +1 -1
- package/dist/supervisor/AgentSupervisor.d.ts +52 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
- package/dist/supervisor/AgentSupervisor.js +120 -1
- package/dist/supervisor/AgentSupervisor.js.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.js +590 -6
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
- package/dist/supervisor/ProjectTracker.d.ts +24 -2
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
- package/dist/supervisor/ProjectTracker.js +151 -59
- package/dist/supervisor/ProjectTracker.js.map +1 -1
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/rule-tester.d.ts +217 -0
- package/dist/testing/rule-tester.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.d.ts +57 -0
- package/dist/testing/rule-tester.examples.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.js +375 -0
- package/dist/testing/rule-tester.examples.js.map +1 -0
- package/dist/testing/rule-tester.js +381 -0
- package/dist/testing/rule-tester.js.map +1 -0
- package/dist/testing/rule-validator.d.ts +141 -0
- package/dist/testing/rule-validator.d.ts.map +1 -0
- package/dist/testing/rule-validator.js +640 -0
- package/dist/testing/rule-validator.js.map +1 -0
- package/dist/types/index.d.ts +265 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +57 -2
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/rate-limiting.d.ts +268 -0
- package/dist/utils/rate-limiting.d.ts.map +1 -0
- package/dist/utils/rate-limiting.js +403 -0
- package/dist/utils/rate-limiting.js.map +1 -0
- package/dist/utils/shared.d.ts +306 -0
- package/dist/utils/shared.d.ts.map +1 -0
- package/dist/utils/shared.js +464 -0
- package/dist/utils/shared.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,908 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Field Standards
|
|
3
|
+
* Task #33: Standardize Condition Naming and Field References
|
|
4
|
+
*
|
|
5
|
+
* This module defines standard field names for rule conditions to ensure
|
|
6
|
+
* consistency across all rule files. Use these constants when defining
|
|
7
|
+
* rule conditions instead of string literals.
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// STANDARD FIELD PATHS - Use these constants in rule conditions
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Action-related fields
|
|
14
|
+
* These fields describe the action being evaluated
|
|
15
|
+
*/
|
|
16
|
+
export const ActionFields = {
|
|
17
|
+
/** The name/identifier of the action (e.g., 'deploy', 'export', 'webhook') */
|
|
18
|
+
NAME: 'action.name',
|
|
19
|
+
/** The category of action (data_access, data_modification, etc.) */
|
|
20
|
+
CATEGORY: 'action.category',
|
|
21
|
+
/** Action parameters object */
|
|
22
|
+
PARAMETERS: 'action.parameters',
|
|
23
|
+
/** Action metadata */
|
|
24
|
+
METADATA: 'action.metadata',
|
|
25
|
+
/** Description of the action */
|
|
26
|
+
DESCRIPTION: 'action.description',
|
|
27
|
+
// Legacy aliases (for backward compatibility during migration)
|
|
28
|
+
/** @deprecated Use ActionFields.NAME instead */
|
|
29
|
+
LEGACY_ACTION_NAME: 'actionName',
|
|
30
|
+
/** @deprecated Use ActionFields.CATEGORY instead */
|
|
31
|
+
LEGACY_ACTION_CATEGORY: 'actionCategory',
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Environment fields
|
|
35
|
+
* Fields describing the execution environment
|
|
36
|
+
*/
|
|
37
|
+
export const EnvironmentFields = {
|
|
38
|
+
/** The deployment environment (development, staging, production) */
|
|
39
|
+
ENVIRONMENT: 'context.environment',
|
|
40
|
+
/** The platform/framework (flask, azure-functions, etc.) */
|
|
41
|
+
PLATFORM: 'context.platform',
|
|
42
|
+
/** The framework in use */
|
|
43
|
+
FRAMEWORK: 'context.framework',
|
|
44
|
+
// Legacy aliases
|
|
45
|
+
/** @deprecated Use EnvironmentFields.ENVIRONMENT instead */
|
|
46
|
+
LEGACY_ENVIRONMENT: 'environment',
|
|
47
|
+
/** @deprecated Use EnvironmentFields.PLATFORM instead */
|
|
48
|
+
LEGACY_PLATFORM: 'platform',
|
|
49
|
+
/** @deprecated Use EnvironmentFields.FRAMEWORK instead */
|
|
50
|
+
LEGACY_FRAMEWORK: 'framework',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* User and authentication fields
|
|
54
|
+
* Fields related to the user or agent performing the action
|
|
55
|
+
*/
|
|
56
|
+
export const UserFields = {
|
|
57
|
+
/** User's unique identifier */
|
|
58
|
+
USER_ID: 'context.userId',
|
|
59
|
+
/** User's role (admin, data_officer, etc.) */
|
|
60
|
+
USER_ROLE: 'context.userRole',
|
|
61
|
+
/** Agent's unique identifier */
|
|
62
|
+
AGENT_ID: 'context.agentId',
|
|
63
|
+
/** Agent's type classification */
|
|
64
|
+
AGENT_TYPE: 'context.agentType',
|
|
65
|
+
/** Session identifier */
|
|
66
|
+
SESSION_ID: 'context.sessionId',
|
|
67
|
+
/** Organization identifier */
|
|
68
|
+
ORG_ID: 'context.organizationId',
|
|
69
|
+
/** Department within organization */
|
|
70
|
+
DEPARTMENT: 'context.department',
|
|
71
|
+
// Legacy aliases
|
|
72
|
+
/** @deprecated Use UserFields.USER_ID instead */
|
|
73
|
+
LEGACY_USER_ID: 'userId',
|
|
74
|
+
/** @deprecated Use UserFields.USER_ROLE instead */
|
|
75
|
+
LEGACY_USER_ROLE: 'userRole',
|
|
76
|
+
/** @deprecated Use UserFields.AGENT_ID instead */
|
|
77
|
+
LEGACY_AGENT_ID: 'agentId',
|
|
78
|
+
/** @deprecated Use UserFields.SESSION_ID instead */
|
|
79
|
+
LEGACY_SESSION_ID: 'sessionId',
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Data classification and handling fields
|
|
83
|
+
* Fields describing the data being accessed or modified
|
|
84
|
+
*/
|
|
85
|
+
export const DataFields = {
|
|
86
|
+
/** Data classification level (public, internal, confidential, restricted) */
|
|
87
|
+
CLASSIFICATION: 'data.classification',
|
|
88
|
+
/** Type of data (phi, cardholder, pan, cvv, pii, etc.) */
|
|
89
|
+
TYPE: 'data.type',
|
|
90
|
+
/** Whether data contains PII */
|
|
91
|
+
CONTAINS_PII: 'data.containsPii',
|
|
92
|
+
/** Number of records affected */
|
|
93
|
+
RECORD_COUNT: 'data.recordCount',
|
|
94
|
+
/** Size of data in bytes */
|
|
95
|
+
SIZE: 'data.size',
|
|
96
|
+
/** Data retention exceeded flag */
|
|
97
|
+
RETENTION_EXCEEDED: 'data.retentionExceeded',
|
|
98
|
+
/** Storage type (localStorage, sessionStorage, indexedDB) */
|
|
99
|
+
STORAGE_TYPE: 'data.storageType',
|
|
100
|
+
// Legacy aliases
|
|
101
|
+
/** @deprecated Use DataFields.CLASSIFICATION instead */
|
|
102
|
+
LEGACY_DATA_CLASSIFICATION: 'dataClassification',
|
|
103
|
+
/** @deprecated Use DataFields.TYPE instead */
|
|
104
|
+
LEGACY_DATA_TYPE: 'dataType',
|
|
105
|
+
/** @deprecated Use DataFields.CONTAINS_PII instead */
|
|
106
|
+
LEGACY_DATA_CONTAINS_PII: 'dataContainsPII',
|
|
107
|
+
/** @deprecated Use DataFields.RECORD_COUNT instead */
|
|
108
|
+
LEGACY_RECORD_COUNT: 'recordCount',
|
|
109
|
+
/** @deprecated Use DataFields.RETENTION_EXCEEDED instead */
|
|
110
|
+
LEGACY_DATA_RETENTION_EXCEEDED: 'dataRetentionExceeded',
|
|
111
|
+
/** @deprecated Use DataFields.STORAGE_TYPE instead */
|
|
112
|
+
LEGACY_STORAGE_TYPE: 'storageType',
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Operation and request fields
|
|
116
|
+
* Fields describing the operation being performed
|
|
117
|
+
*/
|
|
118
|
+
export const OperationFields = {
|
|
119
|
+
/** The operation type (read, write, delete, upload, etc.) */
|
|
120
|
+
OPERATION: 'operation.type',
|
|
121
|
+
/** HTTP method for API calls */
|
|
122
|
+
HTTP_METHOD: 'operation.httpMethod',
|
|
123
|
+
/** Protocol being used (https, websocket, etc.) */
|
|
124
|
+
PROTOCOL: 'operation.protocol',
|
|
125
|
+
/** File path for file system operations */
|
|
126
|
+
FILE_PATH: 'operation.filePath',
|
|
127
|
+
/** Query string for data access */
|
|
128
|
+
QUERY: 'operation.query',
|
|
129
|
+
/** Request type */
|
|
130
|
+
REQUEST_TYPE: 'operation.requestType',
|
|
131
|
+
/** Target role for authorization operations */
|
|
132
|
+
TARGET_ROLE: 'operation.targetRole',
|
|
133
|
+
/** Destination region for data transfers */
|
|
134
|
+
DESTINATION_REGION: 'operation.destinationRegion',
|
|
135
|
+
// Legacy aliases
|
|
136
|
+
/** @deprecated Use OperationFields.OPERATION instead */
|
|
137
|
+
LEGACY_OPERATION: 'operation',
|
|
138
|
+
/** @deprecated Use OperationFields.HTTP_METHOD instead */
|
|
139
|
+
LEGACY_HTTP_METHOD: 'httpMethod',
|
|
140
|
+
/** @deprecated Use OperationFields.PROTOCOL instead */
|
|
141
|
+
LEGACY_PROTOCOL: 'protocol',
|
|
142
|
+
/** @deprecated Use OperationFields.FILE_PATH instead */
|
|
143
|
+
LEGACY_FILE_PATH: 'filePath',
|
|
144
|
+
/** @deprecated Use OperationFields.QUERY instead */
|
|
145
|
+
LEGACY_QUERY: 'query',
|
|
146
|
+
/** @deprecated Use OperationFields.REQUEST_TYPE instead */
|
|
147
|
+
LEGACY_REQUEST_TYPE: 'requestType',
|
|
148
|
+
/** @deprecated Use OperationFields.TARGET_ROLE instead */
|
|
149
|
+
LEGACY_TARGET_ROLE: 'targetRole',
|
|
150
|
+
/** @deprecated Use OperationFields.DESTINATION_REGION instead */
|
|
151
|
+
LEGACY_DESTINATION_REGION: 'destinationRegion',
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Security and authentication fields
|
|
155
|
+
* Fields related to security state and verification
|
|
156
|
+
*/
|
|
157
|
+
export const SecurityFields = {
|
|
158
|
+
/** Authentication token present */
|
|
159
|
+
AUTH_TOKEN: 'security.authToken',
|
|
160
|
+
/** Whether the request is authenticated */
|
|
161
|
+
AUTHENTICATED: 'security.authenticated',
|
|
162
|
+
/** Whether code has been validated */
|
|
163
|
+
CODE_VALIDATED: 'security.codeValidated',
|
|
164
|
+
/** Whether request is sandboxed */
|
|
165
|
+
SANDBOXED: 'security.sandboxed',
|
|
166
|
+
/** Whether host is whitelisted */
|
|
167
|
+
HOST_WHITELISTED: 'security.hostWhitelisted',
|
|
168
|
+
/** Whether encryption is enabled */
|
|
169
|
+
ENCRYPTION_ENABLED: 'security.encryptionEnabled',
|
|
170
|
+
/** Session anomaly score (0-1) */
|
|
171
|
+
SESSION_ANOMALY_SCORE: 'security.sessionAnomalyScore',
|
|
172
|
+
/** Webhook signature validation status */
|
|
173
|
+
SIGNATURE_VALIDATED: 'security.signatureValidated',
|
|
174
|
+
/** Input validation status */
|
|
175
|
+
INPUT_VALIDATED: 'security.inputValidated',
|
|
176
|
+
/** File validation status */
|
|
177
|
+
FILE_VALIDATED: 'security.fileValidated',
|
|
178
|
+
/** Whether TLS is enabled */
|
|
179
|
+
TLS_ENABLED: 'security.tlsEnabled',
|
|
180
|
+
// Legacy aliases
|
|
181
|
+
/** @deprecated Use SecurityFields.AUTH_TOKEN instead */
|
|
182
|
+
LEGACY_AUTH_TOKEN: 'authToken',
|
|
183
|
+
/** @deprecated Use SecurityFields.AUTHENTICATED instead */
|
|
184
|
+
LEGACY_AUTHENTICATED: 'authenticated',
|
|
185
|
+
/** @deprecated Use SecurityFields.CODE_VALIDATED instead */
|
|
186
|
+
LEGACY_CODE_VALIDATED: 'codeValidated',
|
|
187
|
+
/** @deprecated Use SecurityFields.SANDBOXED instead */
|
|
188
|
+
LEGACY_SANDBOXED: 'sandboxed',
|
|
189
|
+
/** @deprecated Use SecurityFields.HOST_WHITELISTED instead */
|
|
190
|
+
LEGACY_HOST_WHITELISTED: 'hostWhitelisted',
|
|
191
|
+
/** @deprecated Use SecurityFields.ENCRYPTION_ENABLED instead */
|
|
192
|
+
LEGACY_ENCRYPTION_ENABLED: 'encryptionEnabled',
|
|
193
|
+
/** @deprecated Use SecurityFields.SESSION_ANOMALY_SCORE instead */
|
|
194
|
+
LEGACY_SESSION_ANOMALY_SCORE: 'sessionAnomalyScore',
|
|
195
|
+
/** @deprecated Use SecurityFields.SIGNATURE_VALIDATED instead */
|
|
196
|
+
LEGACY_SIGNATURE_VALIDATED: 'signatureValidated',
|
|
197
|
+
/** @deprecated Use SecurityFields.INPUT_VALIDATED instead */
|
|
198
|
+
LEGACY_INPUT_VALIDATION: 'inputValidation',
|
|
199
|
+
/** @deprecated Use SecurityFields.FILE_VALIDATED instead */
|
|
200
|
+
LEGACY_FILE_VALIDATION: 'fileValidation',
|
|
201
|
+
/** @deprecated Use SecurityFields.TLS_ENABLED instead */
|
|
202
|
+
LEGACY_TLS_ENABLED: 'tlsEnabled',
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Compliance and consent fields
|
|
206
|
+
* Fields related to regulatory compliance
|
|
207
|
+
*/
|
|
208
|
+
export const ComplianceFields = {
|
|
209
|
+
/** Verification completed status */
|
|
210
|
+
VERIFICATION_COMPLETED: 'compliance.verificationCompleted',
|
|
211
|
+
/** Processing basis (consent, legitimate_interest, etc.) */
|
|
212
|
+
PROCESSING_BASIS: 'compliance.processingBasis',
|
|
213
|
+
/** Consent validity status */
|
|
214
|
+
CONSENT_VALID: 'compliance.consentValid',
|
|
215
|
+
/** Whether data is masked */
|
|
216
|
+
DATA_MASKED: 'compliance.dataMasked',
|
|
217
|
+
/** Business justification provided */
|
|
218
|
+
BUSINESS_JUSTIFICATION: 'compliance.businessJustification',
|
|
219
|
+
/** Number of fields requested */
|
|
220
|
+
FIELDS_REQUESTED: 'compliance.fieldsRequested',
|
|
221
|
+
/** Initiator ID for segregation of duties */
|
|
222
|
+
INITIATOR_ID: 'compliance.initiatorId',
|
|
223
|
+
/** Whether account requirements are validated */
|
|
224
|
+
ACCOUNT_REQUIREMENTS_VALIDATED: 'compliance.accountRequirementsValidated',
|
|
225
|
+
/** SCA enabled for EU payments */
|
|
226
|
+
SCA_ENABLED: 'compliance.scaEnabled',
|
|
227
|
+
/** Customer region */
|
|
228
|
+
CUSTOMER_REGION: 'compliance.customerRegion',
|
|
229
|
+
// Legacy aliases
|
|
230
|
+
/** @deprecated Use ComplianceFields.VERIFICATION_COMPLETED instead */
|
|
231
|
+
LEGACY_VERIFICATION_COMPLETED: 'verificationCompleted',
|
|
232
|
+
/** @deprecated Use ComplianceFields.PROCESSING_BASIS instead */
|
|
233
|
+
LEGACY_PROCESSING_BASIS: 'processingBasis',
|
|
234
|
+
/** @deprecated Use ComplianceFields.CONSENT_VALID instead */
|
|
235
|
+
LEGACY_CONSENT_VALID: 'consentValid',
|
|
236
|
+
/** @deprecated Use ComplianceFields.DATA_MASKED instead */
|
|
237
|
+
LEGACY_MASKED: 'masked',
|
|
238
|
+
/** @deprecated Use ComplianceFields.BUSINESS_JUSTIFICATION instead */
|
|
239
|
+
LEGACY_BUSINESS_JUSTIFICATION: 'businessJustification',
|
|
240
|
+
/** @deprecated Use ComplianceFields.FIELDS_REQUESTED instead */
|
|
241
|
+
LEGACY_FIELDS_REQUESTED: 'fieldsRequested',
|
|
242
|
+
/** @deprecated Use ComplianceFields.INITIATOR_ID instead */
|
|
243
|
+
LEGACY_INITIATOR_ID: 'initiatorId',
|
|
244
|
+
/** @deprecated Use ComplianceFields.ACCOUNT_REQUIREMENTS_VALIDATED instead */
|
|
245
|
+
LEGACY_ACCOUNT_REQUIREMENTS_VALIDATED: 'accountRequirementsValidated',
|
|
246
|
+
/** @deprecated Use ComplianceFields.SCA_ENABLED instead */
|
|
247
|
+
LEGACY_SCA_ENABLED: 'scaEnabled',
|
|
248
|
+
/** @deprecated Use ComplianceFields.CUSTOMER_REGION instead */
|
|
249
|
+
LEGACY_CUSTOMER_REGION: 'customerRegion',
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Operational and system fields
|
|
253
|
+
* Fields related to system operations and limits
|
|
254
|
+
*/
|
|
255
|
+
export const OperationalFields = {
|
|
256
|
+
/** Estimated cost of operation */
|
|
257
|
+
ESTIMATED_COST: 'operational.estimatedCost',
|
|
258
|
+
/** Resource cost in dollars */
|
|
259
|
+
RESOURCE_COST: 'operational.resourceCost',
|
|
260
|
+
/** Estimated memory usage in MB */
|
|
261
|
+
ESTIMATED_MEMORY_MB: 'operational.estimatedMemoryMb',
|
|
262
|
+
/** Token count for LLM operations */
|
|
263
|
+
TOKEN_COUNT: 'operational.tokenCount',
|
|
264
|
+
/** Daily spend amount */
|
|
265
|
+
DAILY_SPEND: 'operational.dailySpend',
|
|
266
|
+
/** Budget override approved */
|
|
267
|
+
BUDGET_OVERRIDE_APPROVED: 'operational.budgetOverrideApproved',
|
|
268
|
+
/** Deployment window status */
|
|
269
|
+
DEPLOYMENT_WINDOW_OPEN: 'operational.deploymentWindowOpen',
|
|
270
|
+
/** Rollback plan defined */
|
|
271
|
+
ROLLBACK_PLAN_DEFINED: 'operational.rollbackPlanDefined',
|
|
272
|
+
/** Change freeze active */
|
|
273
|
+
CHANGE_FREEZE_ACTIVE: 'operational.changeFreezeActive',
|
|
274
|
+
/** Maintenance window active */
|
|
275
|
+
MAINTENANCE_WINDOW_ACTIVE: 'operational.maintenanceWindowActive',
|
|
276
|
+
/** Backup verified */
|
|
277
|
+
BACKUP_VERIFIED: 'operational.backupVerified',
|
|
278
|
+
/** Incident severity */
|
|
279
|
+
INCIDENT_SEVERITY: 'operational.incidentSeverity',
|
|
280
|
+
/** Session action count */
|
|
281
|
+
SESSION_ACTION_COUNT: 'operational.sessionActionCount',
|
|
282
|
+
/** Retry count */
|
|
283
|
+
RETRY_COUNT: 'operational.retryCount',
|
|
284
|
+
/** Action pattern (loop detection) */
|
|
285
|
+
ACTION_PATTERN: 'operational.actionPattern',
|
|
286
|
+
/** Concurrent count */
|
|
287
|
+
CONCURRENT_COUNT: 'operational.concurrentCount',
|
|
288
|
+
/** Operation type */
|
|
289
|
+
OPERATION_TYPE: 'operational.operationType',
|
|
290
|
+
/** Timeout configuration in ms */
|
|
291
|
+
TIMEOUT_MS: 'operational.timeoutMs',
|
|
292
|
+
// Legacy aliases
|
|
293
|
+
/** @deprecated Use OperationalFields.ESTIMATED_COST instead */
|
|
294
|
+
LEGACY_ESTIMATED_COST: 'estimatedCost',
|
|
295
|
+
/** @deprecated Use OperationalFields.RESOURCE_COST instead */
|
|
296
|
+
LEGACY_RESOURCE_COST: 'resourceCost',
|
|
297
|
+
/** @deprecated Use OperationalFields.ESTIMATED_MEMORY_MB instead */
|
|
298
|
+
LEGACY_ESTIMATED_MEMORY_MB: 'estimatedMemoryMb',
|
|
299
|
+
/** @deprecated Use OperationalFields.TOKEN_COUNT instead */
|
|
300
|
+
LEGACY_TOKEN_COUNT: 'tokenCount',
|
|
301
|
+
/** @deprecated Use OperationalFields.DAILY_SPEND instead */
|
|
302
|
+
LEGACY_DAILY_SPEND: 'dailySpend',
|
|
303
|
+
/** @deprecated Use OperationalFields.DEPLOYMENT_WINDOW_OPEN instead */
|
|
304
|
+
LEGACY_DEPLOYMENT_WINDOW_OPEN: 'deploymentWindowOpen',
|
|
305
|
+
/** @deprecated Use OperationalFields.ROLLBACK_PLAN_DEFINED instead */
|
|
306
|
+
LEGACY_ROLLBACK_PLAN_DEFINED: 'rollbackPlanDefined',
|
|
307
|
+
/** @deprecated Use OperationalFields.CHANGE_FREEZE_ACTIVE instead */
|
|
308
|
+
LEGACY_CHANGE_FREEZE_ACTIVE: 'changeFreezeActive',
|
|
309
|
+
/** @deprecated Use OperationalFields.MAINTENANCE_WINDOW_ACTIVE instead */
|
|
310
|
+
LEGACY_MAINTENANCE_WINDOW_ACTIVE: 'maintenanceWindowActive',
|
|
311
|
+
/** @deprecated Use OperationalFields.BACKUP_VERIFIED instead */
|
|
312
|
+
LEGACY_BACKUP_VERIFIED: 'backupVerified',
|
|
313
|
+
/** @deprecated Use OperationalFields.INCIDENT_SEVERITY instead */
|
|
314
|
+
LEGACY_INCIDENT_SEVERITY: 'incidentSeverity',
|
|
315
|
+
/** @deprecated Use OperationalFields.SESSION_ACTION_COUNT instead */
|
|
316
|
+
LEGACY_SESSION_ACTION_COUNT: 'sessionActionCount',
|
|
317
|
+
/** @deprecated Use OperationalFields.RETRY_COUNT instead */
|
|
318
|
+
LEGACY_RETRY_COUNT: 'retryCount',
|
|
319
|
+
/** @deprecated Use OperationalFields.ACTION_PATTERN instead */
|
|
320
|
+
LEGACY_ACTION_PATTERN: 'actionPattern',
|
|
321
|
+
/** @deprecated Use OperationalFields.CONCURRENT_COUNT instead */
|
|
322
|
+
LEGACY_CONCURRENT_COUNT: 'concurrentCount',
|
|
323
|
+
/** @deprecated Use OperationalFields.TIMEOUT_MS instead */
|
|
324
|
+
LEGACY_TIMEOUT: 'timeout',
|
|
325
|
+
};
|
|
326
|
+
/**
|
|
327
|
+
* Testing and QA fields
|
|
328
|
+
* Fields specific to testing operations
|
|
329
|
+
*/
|
|
330
|
+
export const TestingFields = {
|
|
331
|
+
/** Whether the operation is a test */
|
|
332
|
+
IS_TEST: 'testing.isTest',
|
|
333
|
+
/** Test type (unit, integration, e2e) */
|
|
334
|
+
TEST_TYPE: 'testing.testType',
|
|
335
|
+
/** Test isolation status */
|
|
336
|
+
TEST_ISOLATION: 'testing.testIsolation',
|
|
337
|
+
/** Test cleanup status */
|
|
338
|
+
HAS_CLEANUP: 'testing.hasCleanup',
|
|
339
|
+
/** Execution time in ms */
|
|
340
|
+
EXECUTION_TIME_MS: 'testing.executionTimeMs',
|
|
341
|
+
/** Uses random wait (anti-pattern) */
|
|
342
|
+
USES_RANDOM_WAIT: 'testing.usesRandomWait',
|
|
343
|
+
/** Runs in parallel */
|
|
344
|
+
RUNS_IN_PARALLEL: 'testing.runsInParallel',
|
|
345
|
+
/** Parallel safe */
|
|
346
|
+
PARALLEL_SAFE: 'testing.parallelSafe',
|
|
347
|
+
/** Screenshot retention days */
|
|
348
|
+
SCREENSHOT_RETENTION_DAYS: 'testing.screenshotRetentionDays',
|
|
349
|
+
// Legacy aliases
|
|
350
|
+
/** @deprecated Use TestingFields.IS_TEST instead */
|
|
351
|
+
LEGACY_IS_TEST: 'isTest',
|
|
352
|
+
/** @deprecated Use TestingFields.TEST_TYPE instead */
|
|
353
|
+
LEGACY_TEST_TYPE: 'testType',
|
|
354
|
+
/** @deprecated Use TestingFields.TEST_ISOLATION instead */
|
|
355
|
+
LEGACY_TEST_ISOLATION: 'testIsolation',
|
|
356
|
+
/** @deprecated Use TestingFields.HAS_CLEANUP instead */
|
|
357
|
+
LEGACY_HAS_CLEANUP: 'hasCleanup',
|
|
358
|
+
/** @deprecated Use TestingFields.EXECUTION_TIME_MS instead */
|
|
359
|
+
LEGACY_EXECUTION_TIME_MS: 'executionTimeMs',
|
|
360
|
+
/** @deprecated Use TestingFields.USES_RANDOM_WAIT instead */
|
|
361
|
+
LEGACY_USES_RANDOM_WAIT: 'usesRandomWait',
|
|
362
|
+
/** @deprecated Use TestingFields.RUNS_IN_PARALLEL instead */
|
|
363
|
+
LEGACY_RUNS_IN_PARALLEL: 'runsInParallel',
|
|
364
|
+
/** @deprecated Use TestingFields.PARALLEL_SAFE instead */
|
|
365
|
+
LEGACY_PARALLEL_SAFE: 'parallelSafe',
|
|
366
|
+
};
|
|
367
|
+
/**
|
|
368
|
+
* API and external service fields
|
|
369
|
+
* Fields related to API calls and external integrations
|
|
370
|
+
*/
|
|
371
|
+
export const ApiFields = {
|
|
372
|
+
/** API version */
|
|
373
|
+
API_VERSION: 'api.version',
|
|
374
|
+
/** Rate limit headers included */
|
|
375
|
+
RATE_LIMIT_HEADERS_INCLUDED: 'api.rateLimitHeadersIncluded',
|
|
376
|
+
/** Idempotency key */
|
|
377
|
+
IDEMPOTENCY_KEY: 'api.idempotencyKey',
|
|
378
|
+
/** Circuit breaker enabled */
|
|
379
|
+
CIRCUIT_BREAKER_ENABLED: 'api.circuitBreakerEnabled',
|
|
380
|
+
/** Retry policy defined */
|
|
381
|
+
RETRY_POLICY: 'api.retryPolicy',
|
|
382
|
+
/** Whether operation is idempotent */
|
|
383
|
+
IS_IDEMPOTENT: 'api.isIdempotent',
|
|
384
|
+
/** Provider name (stripe, azure-openai, etc.) */
|
|
385
|
+
PROVIDER: 'api.provider',
|
|
386
|
+
/** Respects rate limits */
|
|
387
|
+
RESPECTS_RATE_LIMITS: 'api.respectsRateLimits',
|
|
388
|
+
// Legacy aliases
|
|
389
|
+
/** @deprecated Use ApiFields.API_VERSION instead */
|
|
390
|
+
LEGACY_API_VERSION: 'apiVersion',
|
|
391
|
+
/** @deprecated Use ApiFields.RATE_LIMIT_HEADERS_INCLUDED instead */
|
|
392
|
+
LEGACY_RATE_LIMIT_HEADERS_INCLUDED: 'rateLimitHeadersIncluded',
|
|
393
|
+
/** @deprecated Use ApiFields.IDEMPOTENCY_KEY instead */
|
|
394
|
+
LEGACY_IDEMPOTENCY_KEY: 'idempotencyKey',
|
|
395
|
+
/** @deprecated Use ApiFields.CIRCUIT_BREAKER_ENABLED instead */
|
|
396
|
+
LEGACY_CIRCUIT_BREAKER_ENABLED: 'circuitBreakerEnabled',
|
|
397
|
+
/** @deprecated Use ApiFields.RETRY_POLICY instead */
|
|
398
|
+
LEGACY_RETRY_POLICY: 'retryPolicy',
|
|
399
|
+
/** @deprecated Use ApiFields.IS_IDEMPOTENT instead */
|
|
400
|
+
LEGACY_IS_IDEMPOTENT: 'isIdempotent',
|
|
401
|
+
/** @deprecated Use ApiFields.PROVIDER instead */
|
|
402
|
+
LEGACY_PROVIDER: 'provider',
|
|
403
|
+
/** @deprecated Use ApiFields.RESPECTS_RATE_LIMITS instead */
|
|
404
|
+
LEGACY_RESPECTS_RATE_LIMITS: 'respectsRateLimits',
|
|
405
|
+
};
|
|
406
|
+
/**
|
|
407
|
+
* UX and communication fields
|
|
408
|
+
* Fields related to user experience
|
|
409
|
+
*/
|
|
410
|
+
export const UxFields = {
|
|
411
|
+
/** Response length in characters */
|
|
412
|
+
RESPONSE_LENGTH: 'ux.responseLength',
|
|
413
|
+
/** User type (technical, non_technical) */
|
|
414
|
+
USER_TYPE: 'ux.userType',
|
|
415
|
+
/** Technical term count */
|
|
416
|
+
TECHNICAL_TERM_COUNT: 'ux.technicalTermCount',
|
|
417
|
+
/** Recovery steps included */
|
|
418
|
+
INCLUDES_RECOVERY_STEPS: 'ux.includesRecoverySteps',
|
|
419
|
+
/** Confirmation required */
|
|
420
|
+
CONFIRMATION_REQUIRED: 'ux.confirmationRequired',
|
|
421
|
+
/** Estimated duration in ms */
|
|
422
|
+
ESTIMATED_DURATION_MS: 'ux.estimatedDurationMs',
|
|
423
|
+
/** Progress callback enabled */
|
|
424
|
+
PROGRESS_CALLBACK_ENABLED: 'ux.progressCallbackEnabled',
|
|
425
|
+
/** Undo supported */
|
|
426
|
+
UNDO_SUPPORTED: 'ux.undoSupported',
|
|
427
|
+
/** User initiated */
|
|
428
|
+
USER_INITIATED: 'ux.userInitiated',
|
|
429
|
+
/** Notifications in last hour */
|
|
430
|
+
NOTIFICATIONS_LAST_HOUR: 'ux.notificationsLastHour',
|
|
431
|
+
/** Prompts in last minute */
|
|
432
|
+
PROMPTS_LAST_MINUTE: 'ux.promptsLastMinute',
|
|
433
|
+
/** Loading indicator enabled */
|
|
434
|
+
LOADING_INDICATOR_ENABLED: 'ux.loadingIndicatorEnabled',
|
|
435
|
+
/** Timeout warning enabled */
|
|
436
|
+
TIMEOUT_WARNING_ENABLED: 'ux.timeoutWarningEnabled',
|
|
437
|
+
/** Alt text exists */
|
|
438
|
+
ALT_TEXT: 'ux.altText',
|
|
439
|
+
/** Contrast ratio met */
|
|
440
|
+
CONTRAST_RATIO_MET: 'ux.contrastRatioMet',
|
|
441
|
+
/** Keyboard accessible */
|
|
442
|
+
KEYBOARD_ACCESSIBLE: 'ux.keyboardAccessible',
|
|
443
|
+
/** Result count */
|
|
444
|
+
RESULT_COUNT: 'ux.resultCount',
|
|
445
|
+
/** Empty state message */
|
|
446
|
+
EMPTY_STATE_MESSAGE: 'ux.emptyStateMessage',
|
|
447
|
+
/** Is async operation */
|
|
448
|
+
IS_ASYNC: 'ux.isAsync',
|
|
449
|
+
/** Has timeout */
|
|
450
|
+
HAS_TIMEOUT: 'ux.hasTimeout',
|
|
451
|
+
/** Content type */
|
|
452
|
+
CONTENT_TYPE: 'ux.contentType',
|
|
453
|
+
/** Has color content */
|
|
454
|
+
HAS_COLOR_CONTENT: 'ux.hasColorContent',
|
|
455
|
+
// Legacy aliases
|
|
456
|
+
/** @deprecated Use UxFields.RESPONSE_LENGTH instead */
|
|
457
|
+
LEGACY_RESPONSE_LENGTH: 'responseLength',
|
|
458
|
+
/** @deprecated Use UxFields.USER_TYPE instead */
|
|
459
|
+
LEGACY_USER_TYPE: 'userType',
|
|
460
|
+
/** @deprecated Use UxFields.TECHNICAL_TERM_COUNT instead */
|
|
461
|
+
LEGACY_TECHNICAL_TERM_COUNT: 'technicalTermCount',
|
|
462
|
+
/** @deprecated Use UxFields.INCLUDES_RECOVERY_STEPS instead */
|
|
463
|
+
LEGACY_INCLUDES_RECOVERY_STEPS: 'includesRecoverySteps',
|
|
464
|
+
/** @deprecated Use UxFields.CONFIRMATION_REQUIRED instead */
|
|
465
|
+
LEGACY_CONFIRMATION_REQUIRED: 'confirmationRequired',
|
|
466
|
+
/** @deprecated Use UxFields.ESTIMATED_DURATION_MS instead */
|
|
467
|
+
LEGACY_ESTIMATED_DURATION_MS: 'estimatedDurationMs',
|
|
468
|
+
/** @deprecated Use UxFields.PROGRESS_CALLBACK_ENABLED instead */
|
|
469
|
+
LEGACY_PROGRESS_CALLBACK_ENABLED: 'progressCallbackEnabled',
|
|
470
|
+
/** @deprecated Use UxFields.UNDO_SUPPORTED instead */
|
|
471
|
+
LEGACY_UNDO_SUPPORTED: 'undoSupported',
|
|
472
|
+
/** @deprecated Use UxFields.USER_INITIATED instead */
|
|
473
|
+
LEGACY_USER_INITIATED: 'userInitiated',
|
|
474
|
+
/** @deprecated Use UxFields.NOTIFICATIONS_LAST_HOUR instead */
|
|
475
|
+
LEGACY_NOTIFICATIONS_LAST_HOUR: 'notificationsLastHour',
|
|
476
|
+
/** @deprecated Use UxFields.IS_ASYNC instead */
|
|
477
|
+
LEGACY_IS_ASYNC: 'isAsync',
|
|
478
|
+
/** @deprecated Use UxFields.CONTENT_TYPE instead */
|
|
479
|
+
LEGACY_CONTENT_TYPE: 'contentType',
|
|
480
|
+
};
|
|
481
|
+
/**
|
|
482
|
+
* WebSocket and real-time fields
|
|
483
|
+
*/
|
|
484
|
+
export const WebSocketFields = {
|
|
485
|
+
/** WebSocket protocol */
|
|
486
|
+
PROTOCOL: 'websocket.protocol',
|
|
487
|
+
/** Message rate limit enabled */
|
|
488
|
+
MESSAGE_RATE_LIMIT_ENABLED: 'websocket.messageRateLimitEnabled',
|
|
489
|
+
/** Message type (text, binary) */
|
|
490
|
+
MESSAGE_TYPE: 'websocket.messageType',
|
|
491
|
+
/** Max message size */
|
|
492
|
+
MAX_MESSAGE_SIZE: 'websocket.maxMessageSize',
|
|
493
|
+
/** Heartbeat enabled */
|
|
494
|
+
HEARTBEAT_ENABLED: 'websocket.heartbeatEnabled',
|
|
495
|
+
/** Concurrent connections */
|
|
496
|
+
CONCURRENT_CONNECTIONS: 'websocket.concurrentConnections',
|
|
497
|
+
/** Message validation enabled */
|
|
498
|
+
MESSAGE_VALIDATION: 'websocket.messageValidation',
|
|
499
|
+
// Legacy aliases
|
|
500
|
+
/** @deprecated Use WebSocketFields.MESSAGE_RATE_LIMIT_ENABLED instead */
|
|
501
|
+
LEGACY_MESSAGE_RATE_LIMIT_ENABLED: 'messageRateLimitEnabled',
|
|
502
|
+
/** @deprecated Use WebSocketFields.MAX_MESSAGE_SIZE instead */
|
|
503
|
+
LEGACY_MAX_MESSAGE_SIZE: 'maxMessageSize',
|
|
504
|
+
/** @deprecated Use WebSocketFields.HEARTBEAT_ENABLED instead */
|
|
505
|
+
LEGACY_HEARTBEAT_ENABLED: 'heartbeatEnabled',
|
|
506
|
+
/** @deprecated Use WebSocketFields.CONCURRENT_CONNECTIONS instead */
|
|
507
|
+
LEGACY_CONCURRENT_CONNECTIONS: 'concurrentConnections',
|
|
508
|
+
/** @deprecated Use WebSocketFields.MESSAGE_VALIDATION instead */
|
|
509
|
+
LEGACY_MESSAGE_VALIDATION: 'messageValidation',
|
|
510
|
+
};
|
|
511
|
+
/**
|
|
512
|
+
* ML/AI specific fields
|
|
513
|
+
*/
|
|
514
|
+
export const MlAiFields = {
|
|
515
|
+
/** OOM handling configured */
|
|
516
|
+
OOM_HANDLING: 'mlai.oomHandling',
|
|
517
|
+
/** Unload strategy defined */
|
|
518
|
+
UNLOAD_STRATEGY: 'mlai.unloadStrategy',
|
|
519
|
+
/** Inference batch size */
|
|
520
|
+
BATCH_SIZE: 'mlai.batchSize',
|
|
521
|
+
/** Content safety filter enabled */
|
|
522
|
+
CONTENT_SAFETY_FILTER: 'mlai.contentSafetyFilter',
|
|
523
|
+
/** GPU memory usage (0-1) */
|
|
524
|
+
GPU_MEMORY_USAGE: 'mlai.gpuMemoryUsage',
|
|
525
|
+
/** Model version */
|
|
526
|
+
MODEL_VERSION: 'mlai.modelVersion',
|
|
527
|
+
// Legacy aliases
|
|
528
|
+
/** @deprecated Use MlAiFields.OOM_HANDLING instead */
|
|
529
|
+
LEGACY_OOM_HANDLING: 'oomHandling',
|
|
530
|
+
/** @deprecated Use MlAiFields.UNLOAD_STRATEGY instead */
|
|
531
|
+
LEGACY_UNLOAD_STRATEGY: 'unloadStrategy',
|
|
532
|
+
/** @deprecated Use MlAiFields.BATCH_SIZE instead */
|
|
533
|
+
LEGACY_BATCH_SIZE: 'batchSize',
|
|
534
|
+
/** @deprecated Use MlAiFields.CONTENT_SAFETY_FILTER instead */
|
|
535
|
+
LEGACY_CONTENT_SAFETY_FILTER: 'contentSafetyFilter',
|
|
536
|
+
/** @deprecated Use MlAiFields.GPU_MEMORY_USAGE instead */
|
|
537
|
+
LEGACY_GPU_MEMORY_USAGE: 'gpuMemoryUsage',
|
|
538
|
+
/** @deprecated Use MlAiFields.MODEL_VERSION instead */
|
|
539
|
+
LEGACY_MODEL_VERSION: 'modelVersion',
|
|
540
|
+
};
|
|
541
|
+
/**
|
|
542
|
+
* Framework-specific fields (Flask, Azure, etc.)
|
|
543
|
+
*/
|
|
544
|
+
export const FrameworkFields = {
|
|
545
|
+
// Flask
|
|
546
|
+
/** Flask debug mode enabled */
|
|
547
|
+
FLASK_DEBUG_ENABLED: 'flask.debugEnabled',
|
|
548
|
+
/** CORS origins setting */
|
|
549
|
+
CORS_ORIGINS: 'flask.corsOrigins',
|
|
550
|
+
/** Max content length */
|
|
551
|
+
MAX_CONTENT_LENGTH: 'flask.maxContentLength',
|
|
552
|
+
/** Secret key strength */
|
|
553
|
+
SECRET_KEY_STRENGTH: 'flask.secretKeyStrength',
|
|
554
|
+
/** Jinja auto escape enabled */
|
|
555
|
+
JINJA_AUTO_ESCAPE: 'flask.jinjaAutoEscape',
|
|
556
|
+
/** HTTPS enforced */
|
|
557
|
+
HTTPS_ENFORCED: 'flask.httpsEnforced',
|
|
558
|
+
/** Session cookie secure */
|
|
559
|
+
SESSION_COOKIE_SECURE: 'flask.sessionCookieSecure',
|
|
560
|
+
// Azure
|
|
561
|
+
/** Azure database type (cosmos-db) */
|
|
562
|
+
DATABASE: 'azure.database',
|
|
563
|
+
/** RU usage percent */
|
|
564
|
+
RU_USAGE_PERCENT: 'azure.ruUsagePercent',
|
|
565
|
+
/** Uses connection string */
|
|
566
|
+
USES_CONNECTION_STRING: 'azure.usesConnectionString',
|
|
567
|
+
/** App Insights enabled */
|
|
568
|
+
APP_INSIGHTS_ENABLED: 'azure.appInsightsEnabled',
|
|
569
|
+
/** Partition key optimized */
|
|
570
|
+
PARTITION_KEY_OPTIMIZED: 'azure.partitionKeyOptimized',
|
|
571
|
+
/** CORS configured */
|
|
572
|
+
CORS_CONFIGURED: 'azure.corsConfigured',
|
|
573
|
+
// Legacy aliases
|
|
574
|
+
/** @deprecated Use FrameworkFields.FLASK_DEBUG_ENABLED instead */
|
|
575
|
+
LEGACY_FLASK_DEBUG_ENABLED: 'flaskDebugEnabled',
|
|
576
|
+
/** @deprecated Use FrameworkFields.CORS_ORIGINS instead */
|
|
577
|
+
LEGACY_CORS_ORIGINS: 'corsOrigins',
|
|
578
|
+
/** @deprecated Use FrameworkFields.MAX_CONTENT_LENGTH instead */
|
|
579
|
+
LEGACY_MAX_CONTENT_LENGTH: 'maxContentLength',
|
|
580
|
+
/** @deprecated Use FrameworkFields.SECRET_KEY_STRENGTH instead */
|
|
581
|
+
LEGACY_SECRET_KEY_STRENGTH: 'secretKeyStrength',
|
|
582
|
+
/** @deprecated Use FrameworkFields.JINJA_AUTO_ESCAPE instead */
|
|
583
|
+
LEGACY_JINJA_AUTO_ESCAPE: 'jinjaAutoEscape',
|
|
584
|
+
/** @deprecated Use FrameworkFields.HTTPS_ENFORCED instead */
|
|
585
|
+
LEGACY_HTTPS_ENFORCED: 'httpsEnforced',
|
|
586
|
+
/** @deprecated Use FrameworkFields.SESSION_COOKIE_SECURE instead */
|
|
587
|
+
LEGACY_SESSION_COOKIE_SECURE: 'sessionCookieSecure',
|
|
588
|
+
/** @deprecated Use FrameworkFields.DATABASE instead */
|
|
589
|
+
LEGACY_DATABASE: 'database',
|
|
590
|
+
/** @deprecated Use FrameworkFields.RU_USAGE_PERCENT instead */
|
|
591
|
+
LEGACY_RU_USAGE_PERCENT: 'ruUsagePercent',
|
|
592
|
+
/** @deprecated Use FrameworkFields.USES_CONNECTION_STRING instead */
|
|
593
|
+
LEGACY_USES_CONNECTION_STRING: 'usesConnectionString',
|
|
594
|
+
/** @deprecated Use FrameworkFields.APP_INSIGHTS_ENABLED instead */
|
|
595
|
+
LEGACY_APP_INSIGHTS_ENABLED: 'appInsightsEnabled',
|
|
596
|
+
/** @deprecated Use FrameworkFields.PARTITION_KEY_OPTIMIZED instead */
|
|
597
|
+
LEGACY_PARTITION_KEY_OPTIMIZED: 'partitionKeyOptimized',
|
|
598
|
+
/** @deprecated Use FrameworkFields.CORS_CONFIGURED instead */
|
|
599
|
+
LEGACY_CORS_CONFIGURED: 'corsConfigured',
|
|
600
|
+
};
|
|
601
|
+
// ============================================================================
|
|
602
|
+
// LEGACY FIELD MAPPINGS
|
|
603
|
+
// ============================================================================
|
|
604
|
+
/**
|
|
605
|
+
* Mapping from legacy field names to standard field paths
|
|
606
|
+
* Used for migration and backward compatibility
|
|
607
|
+
*/
|
|
608
|
+
export const LegacyFieldMappings = {
|
|
609
|
+
// Action fields
|
|
610
|
+
'actionName': ActionFields.NAME,
|
|
611
|
+
'actionCategory': ActionFields.CATEGORY,
|
|
612
|
+
// Environment fields
|
|
613
|
+
'environment': EnvironmentFields.ENVIRONMENT,
|
|
614
|
+
'platform': EnvironmentFields.PLATFORM,
|
|
615
|
+
'framework': EnvironmentFields.FRAMEWORK,
|
|
616
|
+
// User fields
|
|
617
|
+
'userId': UserFields.USER_ID,
|
|
618
|
+
'userRole': UserFields.USER_ROLE,
|
|
619
|
+
'agentId': UserFields.AGENT_ID,
|
|
620
|
+
'sessionId': UserFields.SESSION_ID,
|
|
621
|
+
// Data fields
|
|
622
|
+
'dataClassification': DataFields.CLASSIFICATION,
|
|
623
|
+
'dataType': DataFields.TYPE,
|
|
624
|
+
'dataContainsPII': DataFields.CONTAINS_PII,
|
|
625
|
+
'recordCount': DataFields.RECORD_COUNT,
|
|
626
|
+
'dataRetentionExceeded': DataFields.RETENTION_EXCEEDED,
|
|
627
|
+
'storageType': DataFields.STORAGE_TYPE,
|
|
628
|
+
// Operation fields
|
|
629
|
+
'operation': OperationFields.OPERATION,
|
|
630
|
+
'httpMethod': OperationFields.HTTP_METHOD,
|
|
631
|
+
'protocol': OperationFields.PROTOCOL,
|
|
632
|
+
'filePath': OperationFields.FILE_PATH,
|
|
633
|
+
'query': OperationFields.QUERY,
|
|
634
|
+
'requestType': OperationFields.REQUEST_TYPE,
|
|
635
|
+
'targetRole': OperationFields.TARGET_ROLE,
|
|
636
|
+
'destinationRegion': OperationFields.DESTINATION_REGION,
|
|
637
|
+
// Security fields
|
|
638
|
+
'authToken': SecurityFields.AUTH_TOKEN,
|
|
639
|
+
'authenticated': SecurityFields.AUTHENTICATED,
|
|
640
|
+
'codeValidated': SecurityFields.CODE_VALIDATED,
|
|
641
|
+
'sandboxed': SecurityFields.SANDBOXED,
|
|
642
|
+
'hostWhitelisted': SecurityFields.HOST_WHITELISTED,
|
|
643
|
+
'encryptionEnabled': SecurityFields.ENCRYPTION_ENABLED,
|
|
644
|
+
'sessionAnomalyScore': SecurityFields.SESSION_ANOMALY_SCORE,
|
|
645
|
+
'signatureValidated': SecurityFields.SIGNATURE_VALIDATED,
|
|
646
|
+
'inputValidation': SecurityFields.INPUT_VALIDATED,
|
|
647
|
+
'fileValidation': SecurityFields.FILE_VALIDATED,
|
|
648
|
+
'tlsEnabled': SecurityFields.TLS_ENABLED,
|
|
649
|
+
// Compliance fields
|
|
650
|
+
'verificationCompleted': ComplianceFields.VERIFICATION_COMPLETED,
|
|
651
|
+
'processingBasis': ComplianceFields.PROCESSING_BASIS,
|
|
652
|
+
'consentValid': ComplianceFields.CONSENT_VALID,
|
|
653
|
+
'masked': ComplianceFields.DATA_MASKED,
|
|
654
|
+
'businessJustification': ComplianceFields.BUSINESS_JUSTIFICATION,
|
|
655
|
+
'fieldsRequested': ComplianceFields.FIELDS_REQUESTED,
|
|
656
|
+
'initiatorId': ComplianceFields.INITIATOR_ID,
|
|
657
|
+
'accountRequirementsValidated': ComplianceFields.ACCOUNT_REQUIREMENTS_VALIDATED,
|
|
658
|
+
'scaEnabled': ComplianceFields.SCA_ENABLED,
|
|
659
|
+
'customerRegion': ComplianceFields.CUSTOMER_REGION,
|
|
660
|
+
// Operational fields
|
|
661
|
+
'estimatedCost': OperationalFields.ESTIMATED_COST,
|
|
662
|
+
'resourceCost': OperationalFields.RESOURCE_COST,
|
|
663
|
+
'estimatedMemoryMb': OperationalFields.ESTIMATED_MEMORY_MB,
|
|
664
|
+
'tokenCount': OperationalFields.TOKEN_COUNT,
|
|
665
|
+
'dailySpend': OperationalFields.DAILY_SPEND,
|
|
666
|
+
'deploymentWindowOpen': OperationalFields.DEPLOYMENT_WINDOW_OPEN,
|
|
667
|
+
'rollbackPlanDefined': OperationalFields.ROLLBACK_PLAN_DEFINED,
|
|
668
|
+
'changeFreezeActive': OperationalFields.CHANGE_FREEZE_ACTIVE,
|
|
669
|
+
'maintenanceWindowActive': OperationalFields.MAINTENANCE_WINDOW_ACTIVE,
|
|
670
|
+
'backupVerified': OperationalFields.BACKUP_VERIFIED,
|
|
671
|
+
'incidentSeverity': OperationalFields.INCIDENT_SEVERITY,
|
|
672
|
+
'sessionActionCount': OperationalFields.SESSION_ACTION_COUNT,
|
|
673
|
+
'retryCount': OperationalFields.RETRY_COUNT,
|
|
674
|
+
'actionPattern': OperationalFields.ACTION_PATTERN,
|
|
675
|
+
'concurrentCount': OperationalFields.CONCURRENT_COUNT,
|
|
676
|
+
'timeout': OperationalFields.TIMEOUT_MS,
|
|
677
|
+
// Testing fields
|
|
678
|
+
'isTest': TestingFields.IS_TEST,
|
|
679
|
+
'testType': TestingFields.TEST_TYPE,
|
|
680
|
+
'testIsolation': TestingFields.TEST_ISOLATION,
|
|
681
|
+
'hasCleanup': TestingFields.HAS_CLEANUP,
|
|
682
|
+
'executionTimeMs': TestingFields.EXECUTION_TIME_MS,
|
|
683
|
+
'usesRandomWait': TestingFields.USES_RANDOM_WAIT,
|
|
684
|
+
'runsInParallel': TestingFields.RUNS_IN_PARALLEL,
|
|
685
|
+
'parallelSafe': TestingFields.PARALLEL_SAFE,
|
|
686
|
+
// API fields
|
|
687
|
+
'apiVersion': ApiFields.API_VERSION,
|
|
688
|
+
'rateLimitHeadersIncluded': ApiFields.RATE_LIMIT_HEADERS_INCLUDED,
|
|
689
|
+
'idempotencyKey': ApiFields.IDEMPOTENCY_KEY,
|
|
690
|
+
'circuitBreakerEnabled': ApiFields.CIRCUIT_BREAKER_ENABLED,
|
|
691
|
+
'retryPolicy': ApiFields.RETRY_POLICY,
|
|
692
|
+
'isIdempotent': ApiFields.IS_IDEMPOTENT,
|
|
693
|
+
'provider': ApiFields.PROVIDER,
|
|
694
|
+
'respectsRateLimits': ApiFields.RESPECTS_RATE_LIMITS,
|
|
695
|
+
// UX fields
|
|
696
|
+
'responseLength': UxFields.RESPONSE_LENGTH,
|
|
697
|
+
'userType': UxFields.USER_TYPE,
|
|
698
|
+
'technicalTermCount': UxFields.TECHNICAL_TERM_COUNT,
|
|
699
|
+
'includesRecoverySteps': UxFields.INCLUDES_RECOVERY_STEPS,
|
|
700
|
+
'confirmationRequired': UxFields.CONFIRMATION_REQUIRED,
|
|
701
|
+
'estimatedDurationMs': UxFields.ESTIMATED_DURATION_MS,
|
|
702
|
+
'progressCallbackEnabled': UxFields.PROGRESS_CALLBACK_ENABLED,
|
|
703
|
+
'undoSupported': UxFields.UNDO_SUPPORTED,
|
|
704
|
+
'userInitiated': UxFields.USER_INITIATED,
|
|
705
|
+
'notificationsLastHour': UxFields.NOTIFICATIONS_LAST_HOUR,
|
|
706
|
+
'isAsync': UxFields.IS_ASYNC,
|
|
707
|
+
'contentType': UxFields.CONTENT_TYPE,
|
|
708
|
+
// WebSocket fields
|
|
709
|
+
'messageRateLimitEnabled': WebSocketFields.MESSAGE_RATE_LIMIT_ENABLED,
|
|
710
|
+
'maxMessageSize': WebSocketFields.MAX_MESSAGE_SIZE,
|
|
711
|
+
'heartbeatEnabled': WebSocketFields.HEARTBEAT_ENABLED,
|
|
712
|
+
'concurrentConnections': WebSocketFields.CONCURRENT_CONNECTIONS,
|
|
713
|
+
'messageValidation': WebSocketFields.MESSAGE_VALIDATION,
|
|
714
|
+
// ML/AI fields
|
|
715
|
+
'oomHandling': MlAiFields.OOM_HANDLING,
|
|
716
|
+
'unloadStrategy': MlAiFields.UNLOAD_STRATEGY,
|
|
717
|
+
'batchSize': MlAiFields.BATCH_SIZE,
|
|
718
|
+
'contentSafetyFilter': MlAiFields.CONTENT_SAFETY_FILTER,
|
|
719
|
+
'gpuMemoryUsage': MlAiFields.GPU_MEMORY_USAGE,
|
|
720
|
+
'modelVersion': MlAiFields.MODEL_VERSION,
|
|
721
|
+
// Framework fields
|
|
722
|
+
'flaskDebugEnabled': FrameworkFields.FLASK_DEBUG_ENABLED,
|
|
723
|
+
'corsOrigins': FrameworkFields.CORS_ORIGINS,
|
|
724
|
+
'maxContentLength': FrameworkFields.MAX_CONTENT_LENGTH,
|
|
725
|
+
'secretKeyStrength': FrameworkFields.SECRET_KEY_STRENGTH,
|
|
726
|
+
'jinjaAutoEscape': FrameworkFields.JINJA_AUTO_ESCAPE,
|
|
727
|
+
'httpsEnforced': FrameworkFields.HTTPS_ENFORCED,
|
|
728
|
+
'sessionCookieSecure': FrameworkFields.SESSION_COOKIE_SECURE,
|
|
729
|
+
'database': FrameworkFields.DATABASE,
|
|
730
|
+
'ruUsagePercent': FrameworkFields.RU_USAGE_PERCENT,
|
|
731
|
+
'usesConnectionString': FrameworkFields.USES_CONNECTION_STRING,
|
|
732
|
+
'appInsightsEnabled': FrameworkFields.APP_INSIGHTS_ENABLED,
|
|
733
|
+
'partitionKeyOptimized': FrameworkFields.PARTITION_KEY_OPTIMIZED,
|
|
734
|
+
'corsConfigured': FrameworkFields.CORS_CONFIGURED,
|
|
735
|
+
};
|
|
736
|
+
// ============================================================================
|
|
737
|
+
// VALIDATION UTILITIES
|
|
738
|
+
// ============================================================================
|
|
739
|
+
/**
|
|
740
|
+
* Set of all known legacy field names for validation
|
|
741
|
+
*/
|
|
742
|
+
const knownLegacyFields = new Set(Object.keys(LegacyFieldMappings));
|
|
743
|
+
/**
|
|
744
|
+
* Set of all standard field paths
|
|
745
|
+
*/
|
|
746
|
+
const standardFields = new Set();
|
|
747
|
+
// Populate standard fields from all field constants
|
|
748
|
+
[
|
|
749
|
+
ActionFields, EnvironmentFields, UserFields, DataFields, OperationFields,
|
|
750
|
+
SecurityFields, ComplianceFields, OperationalFields, TestingFields,
|
|
751
|
+
ApiFields, UxFields, WebSocketFields, MlAiFields, FrameworkFields
|
|
752
|
+
].forEach(fieldSet => {
|
|
753
|
+
Object.values(fieldSet).forEach(value => {
|
|
754
|
+
if (!value.startsWith('LEGACY_')) {
|
|
755
|
+
standardFields.add(value);
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
});
|
|
759
|
+
/**
|
|
760
|
+
* Validate a field name and provide migration guidance
|
|
761
|
+
*
|
|
762
|
+
* @param field - The field name to validate
|
|
763
|
+
* @returns Validation result with migration guidance
|
|
764
|
+
*/
|
|
765
|
+
export function validateFieldName(field) {
|
|
766
|
+
// Check if it's a standard field path
|
|
767
|
+
if (standardFields.has(field)) {
|
|
768
|
+
return { valid: true, isLegacy: false };
|
|
769
|
+
}
|
|
770
|
+
// Check if it's a known legacy field
|
|
771
|
+
if (knownLegacyFields.has(field)) {
|
|
772
|
+
const standardPath = LegacyFieldMappings[field];
|
|
773
|
+
return {
|
|
774
|
+
valid: true,
|
|
775
|
+
isLegacy: true,
|
|
776
|
+
standardPath,
|
|
777
|
+
warning: `Field '${field}' is using legacy naming. Consider migrating to '${standardPath}'`
|
|
778
|
+
};
|
|
779
|
+
}
|
|
780
|
+
// CSS-specific fields are handled separately and are valid
|
|
781
|
+
if (field.startsWith('css') || field.startsWith('has') || field.startsWith('is') || field.startsWith('uses')) {
|
|
782
|
+
// These are domain-specific fields that may not have standard paths
|
|
783
|
+
return {
|
|
784
|
+
valid: true,
|
|
785
|
+
isLegacy: false,
|
|
786
|
+
suggestion: `Field '${field}' appears to be domain-specific. Consider adding to field-standards.ts if used across multiple rules.`
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
// Unknown field - provide suggestions
|
|
790
|
+
const possibleMatches = findSimilarFields(field);
|
|
791
|
+
return {
|
|
792
|
+
valid: false,
|
|
793
|
+
isLegacy: false,
|
|
794
|
+
warning: `Unknown field '${field}'`,
|
|
795
|
+
suggestion: possibleMatches.length > 0
|
|
796
|
+
? `Did you mean: ${possibleMatches.join(', ')}?`
|
|
797
|
+
: 'Consider adding this field to field-standards.ts'
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Find similar field names using Levenshtein distance
|
|
802
|
+
*/
|
|
803
|
+
function findSimilarFields(field, maxDistance = 3) {
|
|
804
|
+
const similar = [];
|
|
805
|
+
const allFields = [...knownLegacyFields, ...standardFields];
|
|
806
|
+
for (const knownField of allFields) {
|
|
807
|
+
const distance = levenshteinDistance(field.toLowerCase(), knownField.toLowerCase());
|
|
808
|
+
if (distance <= maxDistance) {
|
|
809
|
+
similar.push(knownField);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
return similar.slice(0, 3);
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Calculate Levenshtein distance between two strings
|
|
816
|
+
*/
|
|
817
|
+
function levenshteinDistance(a, b) {
|
|
818
|
+
if (a.length === 0)
|
|
819
|
+
return b.length;
|
|
820
|
+
if (b.length === 0)
|
|
821
|
+
return a.length;
|
|
822
|
+
const matrix = [];
|
|
823
|
+
for (let i = 0; i <= b.length; i++) {
|
|
824
|
+
matrix[i] = [i];
|
|
825
|
+
}
|
|
826
|
+
for (let j = 0; j <= a.length; j++) {
|
|
827
|
+
matrix[0][j] = j;
|
|
828
|
+
}
|
|
829
|
+
for (let i = 1; i <= b.length; i++) {
|
|
830
|
+
for (let j = 1; j <= a.length; j++) {
|
|
831
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
832
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
833
|
+
}
|
|
834
|
+
else {
|
|
835
|
+
matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
|
|
836
|
+
matrix[i][j - 1] + 1, // insertion
|
|
837
|
+
matrix[i - 1][j] + 1 // deletion
|
|
838
|
+
);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
return matrix[b.length][a.length];
|
|
843
|
+
}
|
|
844
|
+
/**
|
|
845
|
+
* Validate all fields in a rule's conditions
|
|
846
|
+
*
|
|
847
|
+
* @param conditions - Array of rule conditions to validate
|
|
848
|
+
* @returns Array of validation results for each condition
|
|
849
|
+
*/
|
|
850
|
+
export function validateRuleConditions(conditions) {
|
|
851
|
+
return conditions.map(condition => validateFieldName(condition.field));
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Get all legacy field warnings for a set of rules
|
|
855
|
+
*
|
|
856
|
+
* @param rules - Array of rules to check
|
|
857
|
+
* @returns Array of warnings about legacy field usage
|
|
858
|
+
*/
|
|
859
|
+
export function getLegacyFieldWarnings(rules) {
|
|
860
|
+
const warnings = [];
|
|
861
|
+
for (const rule of rules) {
|
|
862
|
+
for (const condition of rule.conditions) {
|
|
863
|
+
const result = validateFieldName(condition.field);
|
|
864
|
+
if (result.isLegacy && result.standardPath && result.warning) {
|
|
865
|
+
warnings.push({
|
|
866
|
+
ruleId: rule.id,
|
|
867
|
+
field: condition.field,
|
|
868
|
+
warning: result.warning,
|
|
869
|
+
standardPath: result.standardPath
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
return warnings;
|
|
875
|
+
}
|
|
876
|
+
/**
|
|
877
|
+
* Convert a legacy field name to its standard path
|
|
878
|
+
*
|
|
879
|
+
* @param legacyField - The legacy field name
|
|
880
|
+
* @returns The standard field path, or the original if not found
|
|
881
|
+
*/
|
|
882
|
+
export function toStandardFieldPath(legacyField) {
|
|
883
|
+
return LegacyFieldMappings[legacyField] || legacyField;
|
|
884
|
+
}
|
|
885
|
+
// ============================================================================
|
|
886
|
+
// EXPORT CONVENIENCE OBJECT
|
|
887
|
+
// ============================================================================
|
|
888
|
+
/**
|
|
889
|
+
* All field constants organized by category
|
|
890
|
+
*/
|
|
891
|
+
export const Fields = {
|
|
892
|
+
Action: ActionFields,
|
|
893
|
+
Environment: EnvironmentFields,
|
|
894
|
+
User: UserFields,
|
|
895
|
+
Data: DataFields,
|
|
896
|
+
Operation: OperationFields,
|
|
897
|
+
Security: SecurityFields,
|
|
898
|
+
Compliance: ComplianceFields,
|
|
899
|
+
Operational: OperationalFields,
|
|
900
|
+
Testing: TestingFields,
|
|
901
|
+
Api: ApiFields,
|
|
902
|
+
Ux: UxFields,
|
|
903
|
+
WebSocket: WebSocketFields,
|
|
904
|
+
MlAi: MlAiFields,
|
|
905
|
+
Framework: FrameworkFields,
|
|
906
|
+
};
|
|
907
|
+
export default Fields;
|
|
908
|
+
//# sourceMappingURL=field-standards.js.map
|