@aifabrix/builder 2.7.0 → 2.9.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/.cursor/rules/project-rules.mdc +680 -0
- package/integration/hubspot/README.md +136 -0
- package/integration/hubspot/env.template +9 -0
- package/integration/hubspot/hubspot-deploy-company.json +200 -0
- package/integration/hubspot/hubspot-deploy-contact.json +228 -0
- package/integration/hubspot/hubspot-deploy-deal.json +248 -0
- package/integration/hubspot/hubspot-deploy.json +91 -0
- package/integration/hubspot/variables.yaml +17 -0
- package/lib/app-config.js +13 -2
- package/lib/app-deploy.js +9 -3
- package/lib/app-dockerfile.js +14 -1
- package/lib/app-prompts.js +177 -13
- package/lib/app-push.js +16 -1
- package/lib/app-register.js +37 -5
- package/lib/app-rotate-secret.js +10 -0
- package/lib/app-run.js +19 -0
- package/lib/app.js +70 -25
- package/lib/audit-logger.js +9 -4
- package/lib/build.js +25 -13
- package/lib/cli.js +109 -2
- package/lib/commands/login.js +40 -3
- package/lib/config.js +121 -114
- package/lib/datasource-deploy.js +14 -20
- package/lib/environment-deploy.js +305 -0
- package/lib/external-system-deploy.js +345 -0
- package/lib/external-system-download.js +431 -0
- package/lib/external-system-generator.js +190 -0
- package/lib/external-system-test.js +446 -0
- package/lib/generator-builders.js +323 -0
- package/lib/generator.js +200 -292
- package/lib/schema/application-schema.json +830 -800
- package/lib/schema/external-datasource.schema.json +868 -46
- package/lib/schema/external-system.schema.json +98 -80
- package/lib/schema/infrastructure-schema.json +1 -1
- package/lib/templates.js +32 -1
- package/lib/utils/cli-utils.js +4 -4
- package/lib/utils/device-code.js +10 -2
- package/lib/utils/external-system-display.js +159 -0
- package/lib/utils/external-system-validators.js +245 -0
- package/lib/utils/paths.js +151 -1
- package/lib/utils/schema-resolver.js +7 -2
- package/lib/utils/token-encryption.js +68 -0
- package/lib/validator.js +52 -5
- package/package.json +1 -1
- package/tatus +181 -0
- package/templates/external-system/external-datasource.json.hbs +55 -0
- package/templates/external-system/external-system.json.hbs +37 -0
|
@@ -1,867 +1,897 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"key":"application-schema",
|
|
8
|
-
"name":"Application Configuration Schema",
|
|
9
|
-
"description":"JSON schema for validating AI Fabrix application configuration files",
|
|
10
|
-
"version":"1.
|
|
11
|
-
"type":"schema",
|
|
12
|
-
"category":"infrastructure",
|
|
13
|
-
"author":"AI Fabrix Team",
|
|
14
|
-
"createdAt":"2024-01-01T00:00:00Z",
|
|
15
|
-
"updatedAt":"2025-
|
|
16
|
-
"compatibility":{
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/esystemsdev/aifabrix-builder/refs/heads/main/lib/schema/application-schema.json",
|
|
4
|
+
"title": "AI Fabrix Application Configuration Schema",
|
|
5
|
+
"description": "Schema for AI Fabrix applications deployed via the API-Driven Deployment System",
|
|
6
|
+
"metadata": {
|
|
7
|
+
"key": "application-schema",
|
|
8
|
+
"name": "Application Configuration Schema",
|
|
9
|
+
"description": "JSON schema for validating AI Fabrix application configuration files",
|
|
10
|
+
"version": "1.2.0",
|
|
11
|
+
"type": "schema",
|
|
12
|
+
"category": "infrastructure",
|
|
13
|
+
"author": "AI Fabrix Team",
|
|
14
|
+
"createdAt": "2024-01-01T00:00:00Z",
|
|
15
|
+
"updatedAt": "2025-12-01T00:00:00Z",
|
|
16
|
+
"compatibility": {
|
|
17
|
+
"minVersion": "1.0.0",
|
|
18
|
+
"maxVersion": "2.0.0",
|
|
19
|
+
"deprecated": false
|
|
20
20
|
},
|
|
21
|
-
"tags":[
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
"tags": [
|
|
22
|
+
"schema",
|
|
23
|
+
"application",
|
|
24
|
+
"validation",
|
|
25
|
+
"configuration",
|
|
26
|
+
"external-integration"
|
|
27
27
|
],
|
|
28
|
-
"dependencies":[
|
|
29
|
-
|
|
28
|
+
"dependencies": [
|
|
29
|
+
"external-system.schema.json",
|
|
30
|
+
"external-datasource.schema.json"
|
|
30
31
|
],
|
|
31
|
-
"changelog":[
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
|
|
32
|
+
"changelog": [
|
|
33
|
+
{
|
|
34
|
+
"version": "1.2.0",
|
|
35
|
+
"date": "2025-12-01T00:00:00Z",
|
|
36
|
+
"changes": [
|
|
37
|
+
"Added schema references to external-system.schema.json and external-datasource.schema.json",
|
|
38
|
+
"Added optional inline system and dataSources properties using $ref for atomic deployment",
|
|
39
|
+
"Replaces application-deployment.schema.json functionality",
|
|
40
|
+
"Supports both file-based and inline external integration definitions"
|
|
41
|
+
],
|
|
42
|
+
"breaking": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"version": "1.1.0",
|
|
46
|
+
"date": "2025-11-26T00:00:00Z",
|
|
47
|
+
"changes": [
|
|
48
|
+
"Added externalIntegration block for ExternalSystem + ExternalDataSource pipeline deployments",
|
|
49
|
+
"Added schemaBasePath, systems, dataSources and autopublish fields"
|
|
50
|
+
],
|
|
51
|
+
"breaking": false
|
|
52
|
+
}
|
|
41
53
|
]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
54
|
+
},
|
|
55
|
+
"type": "object",
|
|
56
|
+
"required": [
|
|
45
57
|
"key",
|
|
46
58
|
"displayName",
|
|
47
59
|
"description",
|
|
48
60
|
"type",
|
|
49
|
-
"image",
|
|
50
|
-
"registryMode",
|
|
51
|
-
"port",
|
|
52
61
|
"deploymentKey"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"key":{
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
],
|
|
63
|
+
"properties": {
|
|
64
|
+
"key": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"description": "Unique application identifier (cannot be changed after registration)",
|
|
67
|
+
"pattern": "^[a-z0-9-]+$",
|
|
68
|
+
"minLength": 3,
|
|
69
|
+
"maxLength": 40
|
|
61
70
|
},
|
|
62
|
-
"displayName":{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
71
|
+
"displayName": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"description": "Human-readable application name",
|
|
74
|
+
"minLength": 1,
|
|
75
|
+
"maxLength": 100
|
|
67
76
|
},
|
|
68
|
-
"description":{
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
"description": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"description": "Application description",
|
|
80
|
+
"minLength": 1,
|
|
81
|
+
"maxLength": 500
|
|
73
82
|
},
|
|
74
|
-
"type":{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
+
"type": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Azure application type",
|
|
86
|
+
"enum": [
|
|
87
|
+
"webapp",
|
|
88
|
+
"functionapp",
|
|
89
|
+
"api",
|
|
90
|
+
"service",
|
|
91
|
+
"external"
|
|
92
|
+
]
|
|
83
93
|
},
|
|
84
|
-
"image":{
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
94
|
+
"image": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "Container image reference",
|
|
97
|
+
"pattern": "^[a-zA-Z0-9._/-]+:[a-zA-Z0-9._-]+$"
|
|
88
98
|
},
|
|
89
|
-
"registryMode":{
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
99
|
+
"registryMode": {
|
|
100
|
+
"type": "string",
|
|
101
|
+
"description": "Registry mode for image authentication",
|
|
102
|
+
"enum": [
|
|
103
|
+
"acr",
|
|
104
|
+
"external",
|
|
105
|
+
"public"
|
|
106
|
+
]
|
|
97
107
|
},
|
|
98
|
-
"port":{
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
108
|
+
"port": {
|
|
109
|
+
"type": "integer",
|
|
110
|
+
"description": "Application port number",
|
|
111
|
+
"minimum": 1,
|
|
112
|
+
"maximum": 65535
|
|
103
113
|
},
|
|
104
|
-
"deploymentKey":{
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
114
|
+
"deploymentKey": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"description": "SHA256 hash of deployment manifest (excluding deploymentKey field)",
|
|
117
|
+
"pattern": "^[a-f0-9]{64}$"
|
|
108
118
|
},
|
|
109
|
-
"requiresDatabase":{
|
|
110
|
-
|
|
111
|
-
|
|
119
|
+
"requiresDatabase": {
|
|
120
|
+
"type": "boolean",
|
|
121
|
+
"description": "Whether application requires database"
|
|
112
122
|
},
|
|
113
|
-
"databases":{
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
123
|
+
"databases": {
|
|
124
|
+
"type": "array",
|
|
125
|
+
"description": "Database configurations",
|
|
126
|
+
"items": {
|
|
127
|
+
"type": "object",
|
|
128
|
+
"required": [
|
|
129
|
+
"name"
|
|
130
|
+
],
|
|
131
|
+
"properties": {
|
|
132
|
+
"name": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"description": "Database name",
|
|
135
|
+
"pattern": "^[a-z0-9_-]+$"
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"additionalProperties": false
|
|
139
|
+
}
|
|
130
140
|
},
|
|
131
|
-
"requiresRedis":{
|
|
132
|
-
|
|
133
|
-
|
|
141
|
+
"requiresRedis": {
|
|
142
|
+
"type": "boolean",
|
|
143
|
+
"description": "Whether application requires Redis"
|
|
134
144
|
},
|
|
135
|
-
"requiresStorage":{
|
|
136
|
-
|
|
137
|
-
|
|
145
|
+
"requiresStorage": {
|
|
146
|
+
"type": "boolean",
|
|
147
|
+
"description": "Whether application requires storage.Physical storage is mapped to /mnt/data/. Blob storage is mapped to SMB File share /data/{app-key}/."
|
|
138
148
|
},
|
|
139
|
-
"configuration":{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
149
|
+
"configuration": {
|
|
150
|
+
"type": "array",
|
|
151
|
+
"description": "Core application configuration",
|
|
152
|
+
"items": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"required": [
|
|
155
|
+
"name",
|
|
156
|
+
"value",
|
|
157
|
+
"location",
|
|
158
|
+
"required"
|
|
159
|
+
],
|
|
160
|
+
"properties": {
|
|
161
|
+
"name": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"description": "Configuration variable name",
|
|
164
|
+
"pattern": "^[A-Z_][A-Z0-9_]*$"
|
|
165
|
+
},
|
|
166
|
+
"value": {
|
|
167
|
+
"type": "string",
|
|
168
|
+
"description": "Configuration value (literal or ready-made parameter reference)"
|
|
169
|
+
},
|
|
170
|
+
"location": {
|
|
171
|
+
"type": "string",
|
|
172
|
+
"description": "Where the value is stored",
|
|
173
|
+
"enum": [
|
|
174
|
+
"variable",
|
|
175
|
+
"keyvault"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
"required": {
|
|
179
|
+
"type": "boolean",
|
|
180
|
+
"description": "Whether this configuration is required"
|
|
181
|
+
},
|
|
182
|
+
"portalInput": {
|
|
183
|
+
"type": "object",
|
|
184
|
+
"description": "Portal input configuration for user-provided values",
|
|
185
|
+
"properties": {
|
|
186
|
+
"field": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"enum": [
|
|
189
|
+
"password",
|
|
190
|
+
"text",
|
|
191
|
+
"textarea",
|
|
192
|
+
"select"
|
|
166
193
|
]
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
"type":"
|
|
170
|
-
"description":"
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
"type":"
|
|
174
|
-
"description":"
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
"type":"object",
|
|
199
|
-
"properties":{
|
|
200
|
-
"minLength":{
|
|
201
|
-
"type":"integer",
|
|
202
|
-
"minimum":1
|
|
203
|
-
},
|
|
204
|
-
"maxLength":{
|
|
205
|
-
"type":"integer",
|
|
206
|
-
"minimum":1
|
|
207
|
-
},
|
|
208
|
-
"pattern":{
|
|
209
|
-
"type":"string",
|
|
210
|
-
"description":"Regex pattern for validation"
|
|
211
|
-
},
|
|
212
|
-
"required":{
|
|
213
|
-
"type":"boolean"
|
|
214
|
-
}
|
|
215
|
-
},
|
|
216
|
-
"additionalProperties":false
|
|
217
|
-
},
|
|
218
|
-
"options":{
|
|
219
|
-
"type":"array",
|
|
220
|
-
"description":"Options for select fields",
|
|
221
|
-
"items":{
|
|
222
|
-
"type":"string"
|
|
223
|
-
}
|
|
224
|
-
}
|
|
194
|
+
},
|
|
195
|
+
"label": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"description": "Display label for the input field"
|
|
198
|
+
},
|
|
199
|
+
"placeholder": {
|
|
200
|
+
"type": "string",
|
|
201
|
+
"description": "Placeholder text for the input field"
|
|
202
|
+
},
|
|
203
|
+
"masked": {
|
|
204
|
+
"type": "boolean",
|
|
205
|
+
"description": "Whether to mask the input (for passwords)"
|
|
206
|
+
},
|
|
207
|
+
"validation": {
|
|
208
|
+
"type": "object",
|
|
209
|
+
"properties": {
|
|
210
|
+
"minLength": {
|
|
211
|
+
"type": "integer",
|
|
212
|
+
"minimum": 1
|
|
213
|
+
},
|
|
214
|
+
"maxLength": {
|
|
215
|
+
"type": "integer",
|
|
216
|
+
"minimum": 1
|
|
217
|
+
},
|
|
218
|
+
"pattern": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"description": "Regex pattern for validation"
|
|
221
|
+
},
|
|
222
|
+
"required": {
|
|
223
|
+
"type": "boolean"
|
|
224
|
+
}
|
|
225
225
|
},
|
|
226
|
-
"
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
"
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
226
|
+
"additionalProperties": false
|
|
227
|
+
},
|
|
228
|
+
"options": {
|
|
229
|
+
"type": "array",
|
|
230
|
+
"description": "Options for select fields",
|
|
231
|
+
"items": {
|
|
232
|
+
"type": "string"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
"required": [
|
|
237
|
+
"field",
|
|
238
|
+
"label"
|
|
239
|
+
],
|
|
240
|
+
"additionalProperties": false
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"additionalProperties": false
|
|
244
|
+
}
|
|
235
245
|
},
|
|
236
|
-
"conditionalConfiguration":{
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
246
|
+
"conditionalConfiguration": {
|
|
247
|
+
"type": "array",
|
|
248
|
+
"description": "Conditional configuration based on service requirements",
|
|
249
|
+
"items": {
|
|
250
|
+
"type": "object",
|
|
251
|
+
"required": [
|
|
252
|
+
"condition",
|
|
253
|
+
"configuration"
|
|
254
|
+
],
|
|
255
|
+
"properties": {
|
|
256
|
+
"condition": {
|
|
257
|
+
"type": "string",
|
|
258
|
+
"description": "Condition for including this configuration",
|
|
259
|
+
"pattern": "^\\{\\{.*\\}\\}$"
|
|
260
|
+
},
|
|
261
|
+
"configuration": {
|
|
262
|
+
"type": "array",
|
|
263
|
+
"description": "Configuration items to include when condition is true",
|
|
264
|
+
"items": {
|
|
265
|
+
"type": "object",
|
|
266
|
+
"required": [
|
|
267
|
+
"name",
|
|
268
|
+
"value",
|
|
269
|
+
"location",
|
|
270
|
+
"required"
|
|
271
|
+
],
|
|
272
|
+
"properties": {
|
|
273
|
+
"name": {
|
|
274
|
+
"type": "string",
|
|
275
|
+
"description": "Configuration variable name",
|
|
276
|
+
"pattern": "^[A-Z_][A-Z0-9_]*$"
|
|
277
|
+
},
|
|
278
|
+
"value": {
|
|
279
|
+
"type": "string",
|
|
280
|
+
"description": "Configuration value (literal or ready-made parameter reference)"
|
|
281
|
+
},
|
|
282
|
+
"location": {
|
|
283
|
+
"type": "string",
|
|
284
|
+
"description": "Where the value is stored",
|
|
285
|
+
"enum": [
|
|
286
|
+
"variable",
|
|
287
|
+
"keyvault"
|
|
288
|
+
]
|
|
289
|
+
},
|
|
290
|
+
"required": {
|
|
291
|
+
"type": "boolean",
|
|
292
|
+
"description": "Whether this configuration is required"
|
|
293
|
+
},
|
|
294
|
+
"portalInput": {
|
|
295
|
+
"type": "object",
|
|
296
|
+
"description": "Portal input configuration for user-provided values",
|
|
297
|
+
"properties": {
|
|
298
|
+
"field": {
|
|
299
|
+
"type": "string",
|
|
300
|
+
"enum": [
|
|
301
|
+
"password",
|
|
302
|
+
"text",
|
|
303
|
+
"textarea",
|
|
304
|
+
"select"
|
|
305
|
+
]
|
|
306
|
+
},
|
|
307
|
+
"label": {
|
|
308
|
+
"type": "string",
|
|
309
|
+
"description": "Display label for the input field"
|
|
310
|
+
},
|
|
311
|
+
"placeholder": {
|
|
312
|
+
"type": "string",
|
|
313
|
+
"description": "Placeholder text for the input field"
|
|
314
|
+
},
|
|
315
|
+
"masked": {
|
|
316
|
+
"type": "boolean",
|
|
317
|
+
"description": "Whether to mask the input (for passwords)"
|
|
318
|
+
},
|
|
319
|
+
"validation": {
|
|
320
|
+
"type": "object",
|
|
321
|
+
"properties": {
|
|
322
|
+
"minLength": {
|
|
323
|
+
"type": "integer",
|
|
324
|
+
"minimum": 1
|
|
325
|
+
},
|
|
326
|
+
"maxLength": {
|
|
327
|
+
"type": "integer",
|
|
328
|
+
"minimum": 1
|
|
329
|
+
},
|
|
330
|
+
"pattern": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"description": "Regex pattern for validation"
|
|
333
|
+
},
|
|
334
|
+
"required": {
|
|
335
|
+
"type": "boolean"
|
|
336
|
+
}
|
|
283
337
|
},
|
|
284
|
-
"
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
"password",
|
|
292
|
-
"text",
|
|
293
|
-
"textarea",
|
|
294
|
-
"select"
|
|
295
|
-
]
|
|
296
|
-
},
|
|
297
|
-
"label":{
|
|
298
|
-
"type":"string",
|
|
299
|
-
"description":"Display label for the input field"
|
|
300
|
-
},
|
|
301
|
-
"placeholder":{
|
|
302
|
-
"type":"string",
|
|
303
|
-
"description":"Placeholder text for the input field"
|
|
304
|
-
},
|
|
305
|
-
"masked":{
|
|
306
|
-
"type":"boolean",
|
|
307
|
-
"description":"Whether to mask the input (for passwords)"
|
|
308
|
-
},
|
|
309
|
-
"validation":{
|
|
310
|
-
"type":"object",
|
|
311
|
-
"properties":{
|
|
312
|
-
"minLength":{
|
|
313
|
-
"type":"integer",
|
|
314
|
-
"minimum":1
|
|
315
|
-
},
|
|
316
|
-
"maxLength":{
|
|
317
|
-
"type":"integer",
|
|
318
|
-
"minimum":1
|
|
319
|
-
},
|
|
320
|
-
"pattern":{
|
|
321
|
-
"type":"string",
|
|
322
|
-
"description":"Regex pattern for validation"
|
|
323
|
-
},
|
|
324
|
-
"required":{
|
|
325
|
-
"type":"boolean"
|
|
326
|
-
}
|
|
327
|
-
},
|
|
328
|
-
"additionalProperties":false
|
|
329
|
-
},
|
|
330
|
-
"options":{
|
|
331
|
-
"type":"array",
|
|
332
|
-
"description":"Options for select fields",
|
|
333
|
-
"items":{
|
|
334
|
-
"type":"string"
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
},
|
|
338
|
-
"required":[
|
|
339
|
-
"field",
|
|
340
|
-
"label"
|
|
341
|
-
],
|
|
342
|
-
"additionalProperties":false
|
|
338
|
+
"additionalProperties": false
|
|
339
|
+
},
|
|
340
|
+
"options": {
|
|
341
|
+
"type": "array",
|
|
342
|
+
"description": "Options for select fields",
|
|
343
|
+
"items": {
|
|
344
|
+
"type": "string"
|
|
343
345
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"required": [
|
|
349
|
+
"field",
|
|
350
|
+
"label"
|
|
351
|
+
],
|
|
352
|
+
"additionalProperties": false
|
|
346
353
|
}
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
354
|
+
},
|
|
355
|
+
"additionalProperties": false
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
"additionalProperties": false
|
|
360
|
+
}
|
|
351
361
|
},
|
|
352
|
-
"healthCheck":{
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
362
|
+
"healthCheck": {
|
|
363
|
+
"type": "object",
|
|
364
|
+
"description": "Health check configuration. The health check endpoint must return HTTP 200 and a JSON response with one of the following formats: {\"status\": \"UP\"} (Keycloak format), {\"status\": \"ok\"} (standard format, optionally with {\"database\": \"connected\"}), {\"status\": \"healthy\"} (alternative format), or {\"success\": true} (success-based format). For non-JSON responses, HTTP 200 status code is sufficient.",
|
|
365
|
+
"required": [
|
|
366
|
+
"path",
|
|
367
|
+
"interval"
|
|
368
|
+
],
|
|
369
|
+
"properties": {
|
|
370
|
+
"path": {
|
|
371
|
+
"type": "string",
|
|
372
|
+
"description": "Health check endpoint path",
|
|
373
|
+
"pattern": "^/"
|
|
374
|
+
},
|
|
375
|
+
"interval": {
|
|
376
|
+
"type": "integer",
|
|
377
|
+
"description": "Health check interval in seconds",
|
|
378
|
+
"minimum": 10,
|
|
379
|
+
"maximum": 300
|
|
380
|
+
},
|
|
381
|
+
"probePath": {
|
|
382
|
+
"type": "string",
|
|
383
|
+
"description": "Front Door health probe path (defaults to path if not specified)",
|
|
384
|
+
"pattern": "^/"
|
|
385
|
+
},
|
|
386
|
+
"probeRequestType": {
|
|
387
|
+
"type": "string",
|
|
388
|
+
"description": "HTTP method for Front Door probe",
|
|
389
|
+
"enum": [
|
|
390
|
+
"GET",
|
|
391
|
+
"POST",
|
|
392
|
+
"HEAD",
|
|
393
|
+
"PUT",
|
|
394
|
+
"DELETE"
|
|
395
|
+
]
|
|
396
|
+
},
|
|
397
|
+
"probeProtocol": {
|
|
398
|
+
"type": "string",
|
|
399
|
+
"description": "Protocol for Front Door probe",
|
|
400
|
+
"enum": [
|
|
401
|
+
"Http",
|
|
402
|
+
"Https"
|
|
403
|
+
]
|
|
404
|
+
},
|
|
405
|
+
"probeIntervalInSeconds": {
|
|
406
|
+
"type": "integer",
|
|
407
|
+
"description": "Front Door probe interval in seconds (default 120)",
|
|
408
|
+
"minimum": 60,
|
|
409
|
+
"maximum": 600
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
"additionalProperties": false,
|
|
413
|
+
"examples": [
|
|
414
|
+
{
|
|
415
|
+
"path": "/health",
|
|
416
|
+
"interval": 30
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"path": "/api/health",
|
|
420
|
+
"interval": 60,
|
|
421
|
+
"probePath": "/api/health",
|
|
422
|
+
"probeRequestType": "GET",
|
|
423
|
+
"probeProtocol": "Http",
|
|
424
|
+
"probeIntervalInSeconds": 120
|
|
425
|
+
}
|
|
426
|
+
],
|
|
427
|
+
"responseFormats": {
|
|
428
|
+
"description": "Valid health check response formats",
|
|
429
|
+
"formats": [
|
|
430
|
+
{
|
|
431
|
+
"format": "Keycloak",
|
|
432
|
+
"example": "{\"status\": \"UP\", \"checks\": []}",
|
|
433
|
+
"validation": "status === 'UP'"
|
|
375
434
|
},
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
"GET",
|
|
381
|
-
"POST",
|
|
382
|
-
"HEAD",
|
|
383
|
-
"PUT",
|
|
384
|
-
"DELETE"
|
|
385
|
-
]
|
|
435
|
+
{
|
|
436
|
+
"format": "Standard",
|
|
437
|
+
"example": "{\"status\": \"ok\", \"database\": \"connected\"}",
|
|
438
|
+
"validation": "status === 'ok' && (database === 'connected' || !database)"
|
|
386
439
|
},
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
"Http",
|
|
392
|
-
"Https"
|
|
393
|
-
]
|
|
440
|
+
{
|
|
441
|
+
"format": "Alternative",
|
|
442
|
+
"example": "{\"status\": \"healthy\", \"service\": \"dataplane\"}",
|
|
443
|
+
"validation": "status === 'healthy'"
|
|
394
444
|
},
|
|
395
|
-
"probeIntervalInSeconds":{
|
|
396
|
-
"type":"integer",
|
|
397
|
-
"description":"Front Door probe interval in seconds (default 120)",
|
|
398
|
-
"minimum":60,
|
|
399
|
-
"maximum":600
|
|
400
|
-
}
|
|
401
|
-
},
|
|
402
|
-
"additionalProperties":false,
|
|
403
|
-
"examples":[
|
|
404
445
|
{
|
|
405
|
-
|
|
406
|
-
|
|
446
|
+
"format": "Success-based",
|
|
447
|
+
"example": "{\"success\": true, \"message\": \"Service is running\"}",
|
|
448
|
+
"validation": "success === true"
|
|
407
449
|
},
|
|
408
450
|
{
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
"probeRequestType":"GET",
|
|
413
|
-
"probeProtocol":"Http",
|
|
414
|
-
"probeIntervalInSeconds":120
|
|
451
|
+
"format": "Non-JSON",
|
|
452
|
+
"example": "OK",
|
|
453
|
+
"validation": "HTTP status code === 200"
|
|
415
454
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
"description":"Valid health check response formats",
|
|
419
|
-
"formats":[
|
|
420
|
-
{
|
|
421
|
-
"format":"Keycloak",
|
|
422
|
-
"example":"{\"status\": \"UP\", \"checks\": []}",
|
|
423
|
-
"validation":"status === 'UP'"
|
|
424
|
-
},
|
|
425
|
-
{
|
|
426
|
-
"format":"Standard",
|
|
427
|
-
"example":"{\"status\": \"ok\", \"database\": \"connected\"}",
|
|
428
|
-
"validation":"status === 'ok' && (database === 'connected' || !database)"
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
"format":"Alternative",
|
|
432
|
-
"example":"{\"status\": \"healthy\", \"service\": \"dataplane\"}",
|
|
433
|
-
"validation":"status === 'healthy'"
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
"format":"Success-based",
|
|
437
|
-
"example":"{\"success\": true, \"message\": \"Service is running\"}",
|
|
438
|
-
"validation":"success === true"
|
|
439
|
-
},
|
|
440
|
-
{
|
|
441
|
-
"format":"Non-JSON",
|
|
442
|
-
"example":"OK",
|
|
443
|
-
"validation":"HTTP status code === 200"
|
|
444
|
-
}
|
|
445
|
-
]
|
|
446
|
-
}
|
|
455
|
+
]
|
|
456
|
+
}
|
|
447
457
|
},
|
|
448
|
-
"frontDoorRouting":{
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
480
|
-
}
|
|
458
|
+
"frontDoorRouting": {
|
|
459
|
+
"type": "object",
|
|
460
|
+
"description": "Front Door routing configuration",
|
|
461
|
+
"properties": {
|
|
462
|
+
"pattern": {
|
|
463
|
+
"type": "string",
|
|
464
|
+
"description": "URL pattern for routing (e.g., '/app/*')",
|
|
465
|
+
"pattern": "^/.+"
|
|
466
|
+
},
|
|
467
|
+
"requiresRuleSet": {
|
|
468
|
+
"type": "boolean",
|
|
469
|
+
"description": "Whether URL rewriting rule set is required"
|
|
470
|
+
},
|
|
471
|
+
"ruleSetConditions": {
|
|
472
|
+
"type": "array",
|
|
473
|
+
"description": "Rule set conditions for URL rewriting",
|
|
474
|
+
"items": {
|
|
475
|
+
"type": "object",
|
|
476
|
+
"properties": {
|
|
477
|
+
"type": {
|
|
478
|
+
"type": "string",
|
|
479
|
+
"description": "Condition type (e.g., 'UrlPath')"
|
|
480
|
+
},
|
|
481
|
+
"operator": {
|
|
482
|
+
"type": "string",
|
|
483
|
+
"description": "Condition operator (e.g., 'BeginsWith')"
|
|
484
|
+
},
|
|
485
|
+
"matchValues": {
|
|
486
|
+
"type": "array",
|
|
487
|
+
"items": {
|
|
488
|
+
"type": "string"
|
|
481
489
|
}
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
"ruleSetActions":{
|
|
485
|
-
"type":"array",
|
|
486
|
-
"description":"Rule set actions for URL rewriting",
|
|
487
|
-
"items":{
|
|
488
|
-
"type":"object",
|
|
489
|
-
"properties":{
|
|
490
|
-
"type":{
|
|
491
|
-
"type":"string",
|
|
492
|
-
"description":"Action type (e.g., 'UrlRewrite')"
|
|
493
|
-
},
|
|
494
|
-
"sourcePattern":{
|
|
495
|
-
"type":"string",
|
|
496
|
-
"description":"Source URL pattern for rewriting"
|
|
497
|
-
},
|
|
498
|
-
"destination":{
|
|
499
|
-
"type":"string",
|
|
500
|
-
"description":"Destination URL pattern"
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
504
492
|
}
|
|
505
|
-
|
|
506
|
-
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
"additionalProperties": false
|
|
507
496
|
},
|
|
508
|
-
"authentication":{
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
}
|
|
535
|
-
},
|
|
536
|
-
"endpoints":{
|
|
537
|
-
"type":"object",
|
|
538
|
-
"description":"Authentication endpoints",
|
|
539
|
-
"properties":{
|
|
540
|
-
"local":{
|
|
541
|
-
"type":"string",
|
|
542
|
-
"description":"Local authentication endpoint",
|
|
543
|
-
"pattern":"^(http|https)://.*$"
|
|
544
|
-
},
|
|
545
|
-
"custom":{
|
|
546
|
-
"type":"string",
|
|
547
|
-
"description":"Custom authentication endpoint",
|
|
548
|
-
"pattern":"^(http|https)://.*$"
|
|
549
|
-
}
|
|
550
|
-
},
|
|
551
|
-
"additionalProperties":false
|
|
497
|
+
"authentication": {
|
|
498
|
+
"type": "object",
|
|
499
|
+
"description": "Authentication configuration. When enableSSO is true, type and requiredRoles are required. When enableSSO is false, type and requiredRoles are optional.",
|
|
500
|
+
"required": [
|
|
501
|
+
"enableSSO"
|
|
502
|
+
],
|
|
503
|
+
"properties": {
|
|
504
|
+
"type": {
|
|
505
|
+
"type": "string",
|
|
506
|
+
"description": "Authentication type",
|
|
507
|
+
"enum": [
|
|
508
|
+
"azure",
|
|
509
|
+
"local",
|
|
510
|
+
"none"
|
|
511
|
+
]
|
|
512
|
+
},
|
|
513
|
+
"enableSSO": {
|
|
514
|
+
"type": "boolean",
|
|
515
|
+
"description": "Whether to enable SSO"
|
|
516
|
+
},
|
|
517
|
+
"requiredRoles": {
|
|
518
|
+
"type": "array",
|
|
519
|
+
"description": "Required roles for access",
|
|
520
|
+
"items": {
|
|
521
|
+
"type": "string",
|
|
522
|
+
"pattern": "^[a-z-]+$"
|
|
552
523
|
}
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
524
|
+
},
|
|
525
|
+
"endpoints": {
|
|
526
|
+
"type": "object",
|
|
527
|
+
"description": "Authentication endpoints",
|
|
528
|
+
"properties": {
|
|
529
|
+
"local": {
|
|
530
|
+
"type": "string",
|
|
531
|
+
"description": "Local authentication endpoint",
|
|
532
|
+
"pattern": "^(http|https)://.*$"
|
|
533
|
+
},
|
|
534
|
+
"custom": {
|
|
535
|
+
"type": "string",
|
|
536
|
+
"description": "Custom authentication endpoint",
|
|
537
|
+
"pattern": "^(http|https)://.*$"
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
"additionalProperties": false
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
"if": {
|
|
544
|
+
"properties": {
|
|
545
|
+
"enableSSO": {
|
|
546
|
+
"const": true
|
|
571
547
|
}
|
|
572
|
-
|
|
548
|
+
}
|
|
549
|
+
},
|
|
550
|
+
"then": {
|
|
551
|
+
"required": [
|
|
552
|
+
"type",
|
|
553
|
+
"requiredRoles"
|
|
554
|
+
]
|
|
555
|
+
},
|
|
556
|
+
"additionalProperties": false
|
|
573
557
|
},
|
|
574
|
-
"roles":{
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
},
|
|
591
|
-
"value":{
|
|
592
|
-
"type":"string",
|
|
593
|
-
"description":"Role identifier (used in JWT and ACL)",
|
|
594
|
-
"pattern":"^[a-z-]+$"
|
|
595
|
-
},
|
|
596
|
-
"description":{
|
|
597
|
-
"type":"string",
|
|
598
|
-
"description":"Role description",
|
|
599
|
-
"minLength":1,
|
|
600
|
-
"maxLength":500
|
|
601
|
-
},
|
|
602
|
-
"Groups":{
|
|
603
|
-
"type":"array",
|
|
604
|
-
"description":"Azure AD groups mapped to this role",
|
|
605
|
-
"items":{
|
|
606
|
-
"type":"string",
|
|
607
|
-
"minLength":1,
|
|
608
|
-
"maxLength":100
|
|
609
|
-
}
|
|
610
|
-
}
|
|
558
|
+
"roles": {
|
|
559
|
+
"type": "array",
|
|
560
|
+
"description": "Application roles for Azure AD group mapping",
|
|
561
|
+
"items": {
|
|
562
|
+
"type": "object",
|
|
563
|
+
"required": [
|
|
564
|
+
"name",
|
|
565
|
+
"value",
|
|
566
|
+
"description"
|
|
567
|
+
],
|
|
568
|
+
"properties": {
|
|
569
|
+
"name": {
|
|
570
|
+
"type": "string",
|
|
571
|
+
"description": "Human-readable role name",
|
|
572
|
+
"minLength": 1,
|
|
573
|
+
"maxLength": 100
|
|
611
574
|
},
|
|
612
|
-
"
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
"type":"array",
|
|
617
|
-
"description":"Application permissions with role mappings for access control",
|
|
618
|
-
"items":{
|
|
619
|
-
"type":"object",
|
|
620
|
-
"required":[
|
|
621
|
-
"name",
|
|
622
|
-
"roles",
|
|
623
|
-
"description"
|
|
624
|
-
],
|
|
625
|
-
"properties":{
|
|
626
|
-
"name":{
|
|
627
|
-
"type":"string",
|
|
628
|
-
"description":"Permission identifier (e.g., 'documentstore:read', 'flowise:dev:access')",
|
|
629
|
-
"pattern":"^[a-z0-9-:]+$",
|
|
630
|
-
"minLength":1,
|
|
631
|
-
"maxLength":100
|
|
632
|
-
},
|
|
633
|
-
"roles":{
|
|
634
|
-
"type":"array",
|
|
635
|
-
"description":"Roles that have this permission",
|
|
636
|
-
"items":{
|
|
637
|
-
"type":"string",
|
|
638
|
-
"pattern":"^[a-z-]+$",
|
|
639
|
-
"minLength":1,
|
|
640
|
-
"maxLength":50
|
|
641
|
-
},
|
|
642
|
-
"minItems":1
|
|
643
|
-
},
|
|
644
|
-
"description":{
|
|
645
|
-
"type":"string",
|
|
646
|
-
"description":"Permission description",
|
|
647
|
-
"minLength":1,
|
|
648
|
-
"maxLength":500
|
|
649
|
-
}
|
|
575
|
+
"value": {
|
|
576
|
+
"type": "string",
|
|
577
|
+
"description": "Role identifier (used in JWT and ACL)",
|
|
578
|
+
"pattern": "^[a-z-]+$"
|
|
650
579
|
},
|
|
651
|
-
"
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
"description":"Repository deployment configuration",
|
|
657
|
-
"properties":{
|
|
658
|
-
"enabled":{
|
|
659
|
-
"type":"boolean",
|
|
660
|
-
"description":"Whether repository deployment is enabled"
|
|
580
|
+
"description": {
|
|
581
|
+
"type": "string",
|
|
582
|
+
"description": "Role description",
|
|
583
|
+
"minLength": 1,
|
|
584
|
+
"maxLength": 500
|
|
661
585
|
},
|
|
662
|
-
"
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
586
|
+
"Groups": {
|
|
587
|
+
"type": "array",
|
|
588
|
+
"description": "Azure AD groups mapped to this role",
|
|
589
|
+
"items": {
|
|
590
|
+
"type": "string",
|
|
591
|
+
"minLength": 1,
|
|
592
|
+
"maxLength": 100
|
|
593
|
+
}
|
|
666
594
|
}
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
],
|
|
671
|
-
"additionalProperties":false
|
|
672
|
-
},
|
|
673
|
-
"startupCommand":{
|
|
674
|
-
"type":"string",
|
|
675
|
-
"description":"Application startup command (e.g., 'pnpm start', 'python app.py')",
|
|
676
|
-
"minLength":1,
|
|
677
|
-
"maxLength":200
|
|
595
|
+
},
|
|
596
|
+
"additionalProperties": false
|
|
597
|
+
}
|
|
678
598
|
},
|
|
679
|
-
"
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
599
|
+
"permissions": {
|
|
600
|
+
"type": "array",
|
|
601
|
+
"description": "Application permissions with role mappings for access control",
|
|
602
|
+
"items": {
|
|
603
|
+
"type": "object",
|
|
604
|
+
"required": [
|
|
605
|
+
"name",
|
|
606
|
+
"roles",
|
|
607
|
+
"description"
|
|
608
|
+
],
|
|
609
|
+
"properties": {
|
|
610
|
+
"name": {
|
|
611
|
+
"type": "string",
|
|
612
|
+
"description": "Permission identifier (e.g., 'documentstore:read', 'flowise:dev:access')",
|
|
613
|
+
"pattern": "^[a-z0-9-:]+$",
|
|
614
|
+
"minLength": 1,
|
|
615
|
+
"maxLength": 100
|
|
687
616
|
},
|
|
688
|
-
"
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
617
|
+
"roles": {
|
|
618
|
+
"type": "array",
|
|
619
|
+
"description": "Roles that have this permission",
|
|
620
|
+
"items": {
|
|
621
|
+
"type": "string",
|
|
622
|
+
"pattern": "^[a-z-]+$",
|
|
623
|
+
"minLength": 1,
|
|
624
|
+
"maxLength": 50
|
|
625
|
+
},
|
|
626
|
+
"minItems": 1
|
|
692
627
|
},
|
|
693
|
-
"
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
628
|
+
"description": {
|
|
629
|
+
"type": "string",
|
|
630
|
+
"description": "Permission description",
|
|
631
|
+
"minLength": 1,
|
|
632
|
+
"maxLength": 500
|
|
697
633
|
}
|
|
698
|
-
|
|
699
|
-
|
|
634
|
+
},
|
|
635
|
+
"additionalProperties": false
|
|
636
|
+
}
|
|
700
637
|
},
|
|
701
|
-
"
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
"
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
"description":"CPU threshold for scaling (percentage)",
|
|
720
|
-
"minimum":10,
|
|
721
|
-
"maximum":90
|
|
722
|
-
}
|
|
723
|
-
},
|
|
724
|
-
"additionalProperties":false
|
|
638
|
+
"repository": {
|
|
639
|
+
"type": "object",
|
|
640
|
+
"description": "Repository deployment configuration",
|
|
641
|
+
"properties": {
|
|
642
|
+
"enabled": {
|
|
643
|
+
"type": "boolean",
|
|
644
|
+
"description": "Whether repository deployment is enabled"
|
|
645
|
+
},
|
|
646
|
+
"repositoryUrl": {
|
|
647
|
+
"type": "string",
|
|
648
|
+
"description": "Full repository URL for pipeline validation (same as OAuth callback)",
|
|
649
|
+
"pattern": "^(https://github.com/[^/]+/[^/]+|https://gitlab.com/[^/]+/[^/]+|https://dev.azure.com/[^/]+/[^/]+/[^/]+)$"
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
"required": [
|
|
653
|
+
"enabled"
|
|
654
|
+
],
|
|
655
|
+
"additionalProperties": false
|
|
725
656
|
},
|
|
726
|
-
"
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
"
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
657
|
+
"startupCommand": {
|
|
658
|
+
"type": "string",
|
|
659
|
+
"description": "Application startup command (e.g., 'pnpm start', 'python app.py')",
|
|
660
|
+
"minLength": 1,
|
|
661
|
+
"maxLength": 200
|
|
662
|
+
},
|
|
663
|
+
"runtimeVersion": {
|
|
664
|
+
"type": "object",
|
|
665
|
+
"description": "Runtime version configuration",
|
|
666
|
+
"properties": {
|
|
667
|
+
"node": {
|
|
668
|
+
"type": "string",
|
|
669
|
+
"description": "Node.js version (e.g., '18.17.0')",
|
|
670
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
671
|
+
},
|
|
672
|
+
"python": {
|
|
673
|
+
"type": "string",
|
|
674
|
+
"description": "Python version (e.g., '3.11')",
|
|
675
|
+
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
676
|
+
},
|
|
677
|
+
"dotnet": {
|
|
678
|
+
"type": "string",
|
|
679
|
+
"description": ".NET version (e.g., '8.0')",
|
|
680
|
+
"pattern": "^[0-9]+\\.[0-9]+$"
|
|
681
|
+
}
|
|
682
|
+
},
|
|
683
|
+
"additionalProperties": false
|
|
684
|
+
},
|
|
685
|
+
"scaling": {
|
|
686
|
+
"type": "object",
|
|
687
|
+
"description": "Application scaling configuration",
|
|
688
|
+
"properties": {
|
|
689
|
+
"minInstances": {
|
|
690
|
+
"type": "integer",
|
|
691
|
+
"description": "Minimum number of instances",
|
|
692
|
+
"minimum": 1,
|
|
693
|
+
"maximum": 20
|
|
694
|
+
},
|
|
695
|
+
"maxInstances": {
|
|
696
|
+
"type": "integer",
|
|
697
|
+
"description": "Maximum number of instances",
|
|
698
|
+
"minimum": 1,
|
|
699
|
+
"maximum": 20
|
|
700
|
+
},
|
|
701
|
+
"cpuThreshold": {
|
|
702
|
+
"type": "number",
|
|
703
|
+
"description": "CPU threshold for scaling (percentage)",
|
|
704
|
+
"minimum": 10,
|
|
705
|
+
"maximum": 90
|
|
706
|
+
}
|
|
707
|
+
},
|
|
708
|
+
"additionalProperties": false
|
|
709
|
+
},
|
|
710
|
+
"build": {
|
|
711
|
+
"type": "object",
|
|
712
|
+
"description": "Build and local development configuration",
|
|
713
|
+
"properties": {
|
|
714
|
+
"envOutputPath": {
|
|
715
|
+
"type": "string",
|
|
716
|
+
"description": "Path where .env file is copied for local development (relative to builder/)",
|
|
717
|
+
"pattern": "^[^/].*"
|
|
718
|
+
},
|
|
719
|
+
"localPort": {
|
|
720
|
+
"type": "integer",
|
|
721
|
+
"description": "Port for local development (different from Docker port)",
|
|
722
|
+
"minimum": 1000,
|
|
723
|
+
"maximum": 65535
|
|
724
|
+
},
|
|
725
|
+
"containerPort": {
|
|
726
|
+
"type": "integer",
|
|
727
|
+
"description": "Container internal port (defaults to port if not specified)",
|
|
728
|
+
"minimum": 1,
|
|
729
|
+
"maximum": 65535
|
|
730
|
+
},
|
|
731
|
+
"language": {
|
|
732
|
+
"type": "string",
|
|
733
|
+
"description": "Runtime language for template selection",
|
|
734
|
+
"enum": [
|
|
735
|
+
"typescript",
|
|
736
|
+
"python"
|
|
737
|
+
]
|
|
738
|
+
},
|
|
739
|
+
"context": {
|
|
740
|
+
"type": "string",
|
|
741
|
+
"description": "Docker build context path (relative to builder/)",
|
|
742
|
+
"pattern": "^[^/].*"
|
|
743
|
+
},
|
|
744
|
+
"dockerfile": {
|
|
745
|
+
"type": "string",
|
|
746
|
+
"description": "Dockerfile name (empty or missing = use auto-generated template)",
|
|
747
|
+
"pattern": "^[^/].*"
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
"additionalProperties": false
|
|
751
|
+
},
|
|
752
|
+
"deployment": {
|
|
753
|
+
"type": "object",
|
|
754
|
+
"description": "Deployment configuration for pipeline API",
|
|
755
|
+
"properties": {
|
|
756
|
+
"controllerUrl": {
|
|
757
|
+
"type": "string",
|
|
758
|
+
"description": "Controller API URL for deployment",
|
|
759
|
+
"pattern": "^https://.*$"
|
|
760
|
+
}
|
|
761
|
+
},
|
|
762
|
+
"additionalProperties": false
|
|
763
|
+
},
|
|
764
|
+
"system": {
|
|
765
|
+
"type": "object",
|
|
766
|
+
"description": "Optional: Inline external system configuration for atomic deployment. Uses external-system.schema.json structure via $ref. Alternative to externalIntegration.systems file-based approach.",
|
|
767
|
+
"$ref": "https://raw.githubusercontent.com/esystemsdev/aifabrix-builder/refs/heads/main/lib/schema/external-system.schema.json"
|
|
768
|
+
},
|
|
769
|
+
"dataSources": {
|
|
770
|
+
"type": "array",
|
|
771
|
+
"description": "Optional: Inline external data source configurations for atomic deployment. Uses external-datasource.schema.json structure via $ref. Alternative to externalIntegration.dataSources file-based approach.",
|
|
772
|
+
"minItems": 0,
|
|
773
|
+
"items": {
|
|
774
|
+
"$ref": "https://raw.githubusercontent.com/esystemsdev/aifabrix-builder/refs/heads/main/lib/schema/external-datasource.schema.json"
|
|
775
|
+
}
|
|
776
|
+
},
|
|
777
|
+
"externalIntegration": {
|
|
778
|
+
"type": "object",
|
|
779
|
+
"description": "Defines External Systems & External Data Sources shipped with this application. Pipeline registers these in Miso-Controller and publishes schemas to Dataplane. Supports both file-based references and inline definitions.",
|
|
780
|
+
"required": [
|
|
781
|
+
"schemaBasePath"
|
|
782
|
+
],
|
|
783
|
+
"properties": {
|
|
784
|
+
"schemaBasePath": {
|
|
785
|
+
"type": "string",
|
|
786
|
+
"description": "Base folder path containing external-system.json and external-datasource.json files (used when systems/dataSources are file references).",
|
|
787
|
+
"pattern": "^[^ ].*$"
|
|
788
|
+
},
|
|
789
|
+
"systems": {
|
|
790
|
+
"type": "array",
|
|
791
|
+
"description": "List of external-system JSON files to deploy via pipeline.",
|
|
792
|
+
"items": {
|
|
793
|
+
"type": "string",
|
|
794
|
+
"pattern": "^[^ ].+\\.json$"
|
|
754
795
|
},
|
|
755
|
-
"
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
796
|
+
"uniqueItems": true
|
|
797
|
+
},
|
|
798
|
+
"dataSources": {
|
|
799
|
+
"type": "array",
|
|
800
|
+
"description": "List of external-datasource JSON files belonging to this app.",
|
|
801
|
+
"items": {
|
|
802
|
+
"type": "string",
|
|
803
|
+
"pattern": "^[^ ].+\\.json$"
|
|
759
804
|
},
|
|
760
|
-
"
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
805
|
+
"uniqueItems": true
|
|
806
|
+
},
|
|
807
|
+
"autopublish": {
|
|
808
|
+
"type": "boolean",
|
|
809
|
+
"default": true,
|
|
810
|
+
"description": "If true, pipeline automatically publishes ExternalSystems + ExternalDataSources to Dataplane after deployment."
|
|
811
|
+
},
|
|
812
|
+
"version": {
|
|
813
|
+
"type": "string",
|
|
814
|
+
"description": "Version of the integration set (used for schema diffing & migrations).",
|
|
815
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
816
|
+
}
|
|
817
|
+
},
|
|
818
|
+
"additionalProperties": false
|
|
819
|
+
}
|
|
820
|
+
},
|
|
821
|
+
"additionalProperties": false,
|
|
822
|
+
"allOf": [
|
|
823
|
+
{
|
|
824
|
+
"if": {
|
|
825
|
+
"properties": {
|
|
826
|
+
"type": {
|
|
827
|
+
"const": "external"
|
|
764
828
|
}
|
|
765
|
-
|
|
766
|
-
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
"then": {
|
|
832
|
+
"required": [
|
|
833
|
+
"externalIntegration"
|
|
834
|
+
]
|
|
835
|
+
}
|
|
767
836
|
},
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
"pattern":"^https://.*$"
|
|
837
|
+
{
|
|
838
|
+
"if": {
|
|
839
|
+
"properties": {
|
|
840
|
+
"type": {
|
|
841
|
+
"not": {
|
|
842
|
+
"const": "external"
|
|
843
|
+
}
|
|
776
844
|
}
|
|
777
|
-
|
|
778
|
-
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
"then": {
|
|
848
|
+
"required": [
|
|
849
|
+
"image",
|
|
850
|
+
"registryMode",
|
|
851
|
+
"port"
|
|
852
|
+
]
|
|
853
|
+
}
|
|
779
854
|
},
|
|
780
|
-
"externalIntegration":{
|
|
781
|
-
"type":"object",
|
|
782
|
-
"description":"Defines External Systems & External Data Sources shipped with this application. Pipeline registers these in Miso-Controller and publishes schemas to Dataplane.",
|
|
783
|
-
"required":[
|
|
784
|
-
"schemaBasePath"
|
|
785
|
-
],
|
|
786
|
-
"properties":{
|
|
787
|
-
"schemaBasePath":{
|
|
788
|
-
"type":"string",
|
|
789
|
-
"description":"Base folder path containing external-system.json and external-datasource.json files.",
|
|
790
|
-
"pattern":"^[^ ].*$"
|
|
791
|
-
},
|
|
792
|
-
"systems":{
|
|
793
|
-
"type":"array",
|
|
794
|
-
"description":"List of external-system JSON files to deploy via pipeline.",
|
|
795
|
-
"items":{
|
|
796
|
-
"type":"string",
|
|
797
|
-
"pattern":"^[^ ].+\\.json$"
|
|
798
|
-
},
|
|
799
|
-
"uniqueItems":true
|
|
800
|
-
},
|
|
801
|
-
"dataSources":{
|
|
802
|
-
"type":"array",
|
|
803
|
-
"description":"List of external-datasource JSON files belonging to this app.",
|
|
804
|
-
"items":{
|
|
805
|
-
"type":"string",
|
|
806
|
-
"pattern":"^[^ ].+\\.json$"
|
|
807
|
-
},
|
|
808
|
-
"uniqueItems":true
|
|
809
|
-
},
|
|
810
|
-
"autopublish":{
|
|
811
|
-
"type":"boolean",
|
|
812
|
-
"default":true,
|
|
813
|
-
"description":"If true, pipeline automatically publishes ExternalSystems + ExternalDataSources to Dataplane after deployment."
|
|
814
|
-
},
|
|
815
|
-
"version":{
|
|
816
|
-
"type":"string",
|
|
817
|
-
"description":"Version of the integration set (used for schema diffing & migrations).",
|
|
818
|
-
"pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+$"
|
|
819
|
-
}
|
|
820
|
-
},
|
|
821
|
-
"additionalProperties":false
|
|
822
|
-
}
|
|
823
|
-
},
|
|
824
|
-
"additionalProperties":false,
|
|
825
|
-
"allOf":[
|
|
826
855
|
{
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
}
|
|
856
|
+
"if": {
|
|
857
|
+
"properties": {
|
|
858
|
+
"requiresDatabase": {
|
|
859
|
+
"const": true
|
|
832
860
|
}
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
861
|
+
}
|
|
862
|
+
},
|
|
863
|
+
"then": {
|
|
864
|
+
"required": [
|
|
865
|
+
"databases"
|
|
866
|
+
]
|
|
867
|
+
}
|
|
839
868
|
},
|
|
840
869
|
{
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
}
|
|
870
|
+
"if": {
|
|
871
|
+
"properties": {
|
|
872
|
+
"registryMode": {
|
|
873
|
+
"const": "external"
|
|
846
874
|
}
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
}
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
"then": {
|
|
878
|
+
"properties": {
|
|
879
|
+
"configuration": {
|
|
880
|
+
"items": {
|
|
881
|
+
"properties": {
|
|
882
|
+
"name": {
|
|
883
|
+
"enum": [
|
|
884
|
+
"DOCKER_REGISTRY_SERVER_URL",
|
|
885
|
+
"DOCKER_REGISTRY_SERVER_USERNAME",
|
|
886
|
+
"DOCKER_REGISTRY_SERVER_PASSWORD"
|
|
887
|
+
]
|
|
861
888
|
}
|
|
862
|
-
|
|
889
|
+
}
|
|
890
|
+
}
|
|
863
891
|
}
|
|
864
|
-
|
|
892
|
+
}
|
|
893
|
+
}
|
|
865
894
|
}
|
|
866
|
-
|
|
867
|
-
}
|
|
895
|
+
]
|
|
896
|
+
}
|
|
897
|
+
|