@lowdefy/build 5.6.0 → 6.1.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/dist/build/buildAgents.js +61 -16
- package/dist/build/buildApi/buildApi.js +4 -1
- package/dist/build/buildApi/buildEndpoint.js +8 -2
- package/dist/build/buildApi/buildRoutine/countStepTypes.js +1 -1
- package/dist/build/buildApi/buildRoutine/setStepId.js +2 -0
- package/dist/build/buildApi/buildRoutine/validateStep.js +61 -0
- package/dist/build/buildApi/resolveEndpointSchedules.js +40 -0
- package/dist/build/buildApi/validateEndpoint.js +96 -1
- package/dist/build/buildApp.js +13 -20
- package/dist/build/buildAppMeta.js +138 -0
- package/dist/build/buildAuth/buildAgentAuth.js +14 -1
- package/dist/build/buildAuth/buildAuth.js +8 -3
- package/dist/build/buildAuth/buildAuthPlugins.js +6 -0
- package/dist/build/buildAuth/buildAuthStrategies.js +117 -0
- package/dist/build/buildAuth/buildWebsocketAuth.js +55 -0
- package/dist/build/buildAuth/getProtectedWebsockets.js +29 -0
- package/dist/build/buildAuth/getWebsocketRoles.js +39 -0
- package/dist/build/buildAuth/validateAuthConfig.js +15 -3
- package/dist/build/buildEnvironments.js +261 -0
- package/dist/build/buildImports/buildImportsDev.js +15 -0
- package/dist/build/buildImports/buildImportsProd.js +4 -1
- package/dist/build/buildJs/generateClientJsModule.js +27 -0
- package/dist/build/buildJs/writeJs.js +3 -5
- package/dist/build/buildLogger.js +22 -6
- package/dist/build/buildMcp.js +73 -0
- package/dist/build/buildModuleDefs.js +90 -48
- package/dist/build/buildModules.js +61 -14
- package/dist/build/buildNotifications.js +98 -0
- package/dist/build/buildPages/buildBlock/buildBlock.js +3 -1
- package/dist/build/buildPages/buildBlock/buildDynamicBlock.js +131 -0
- package/dist/build/buildPages/buildBlock/buildEvents.js +186 -21
- package/dist/build/buildPages/buildBlock/buildRequests.js +9 -0
- package/dist/build/buildPages/buildBlock/normalizeClassAndStyles.js +2 -11
- package/dist/build/buildPages/buildBlock/setBlockId.js +5 -2
- package/dist/build/buildPages/buildBlock/validateBlock.js +7 -0
- package/dist/build/buildPages/buildPage.js +27 -3
- package/dist/build/buildPages/buildSubscriptions.js +145 -0
- package/dist/build/buildPages/validateDynamicBlockRefs.js +30 -0
- package/dist/build/buildPages/validateStateReferences.js +4 -2
- package/dist/build/buildPages/validateWebsocketRefs.js +30 -0
- package/dist/build/buildRefs/buildRefs.js +21 -12
- package/dist/build/buildRefs/cloneWithMarkers.js +57 -0
- package/dist/build/buildRefs/deferredRegions.js +80 -0
- package/dist/build/buildRefs/deferredRegistry.js +292 -0
- package/dist/build/buildRefs/getModuleRefContent.js +21 -6
- package/dist/build/buildRefs/getUserJavascriptFunction.js +1 -1
- package/dist/build/buildRefs/parseRefContent.js +24 -0
- package/dist/build/buildRefs/{evaluateStaticOperators.js → precomputeRuntimeOperators.js} +7 -6
- package/dist/build/buildRefs/walker.js +471 -207
- package/dist/build/buildTypes.js +22 -1
- package/dist/build/buildWebsockets.js +99 -0
- package/dist/build/collectPageContent.js +7 -1
- package/dist/build/copyAgentFileSystems.js +2 -2
- package/dist/build/full/buildPages.js +16 -0
- package/dist/build/full/updateServerPackageJson.js +21 -0
- package/dist/build/jit/buildPageJit.js +46 -6
- package/dist/build/jit/collectSkeletonSourceFiles.js +14 -0
- package/dist/build/jit/pageContentKeys.js +1 -0
- package/dist/build/jit/shallowBuild.js +84 -3
- package/dist/build/jit/writePageJit.js +11 -8
- package/dist/build/registerModules.js +125 -24
- package/dist/build/validateCallAgentSteps.js +58 -0
- package/dist/build/validateConfig.js +6 -1
- package/dist/build/validateEnvironmentGuards.js +69 -0
- package/dist/build/validateRenderNotificationSteps.js +50 -0
- package/dist/build/writeApi.js +98 -1
- package/dist/build/writeMcp.js +21 -0
- package/dist/build/writeNotifications.js +30 -0
- package/dist/build/writePluginImports/importPluginModule.js +39 -0
- package/dist/build/writePluginImports/writeActionSchemaMap.js +6 -7
- package/dist/build/writePluginImports/writeAuthImports.js +4 -0
- package/dist/build/writePluginImports/writeAvailableTypes.js +99 -0
- package/dist/build/writePluginImports/writeBlockSchemaMap.js +10 -9
- package/dist/build/writePluginImports/writeConnectionSchemaMap.js +101 -0
- package/dist/build/writePluginImports/writeGlobalsCss.js +20 -10
- package/dist/build/writePluginImports/writeNotificationImports.js +31 -0
- package/dist/build/writePluginImports/writeOperatorSchemaMap.js +6 -7
- package/dist/build/writePluginImports/writePluginImports.js +18 -4
- package/dist/build/writePluginImports/writeWebsocketImports.js +22 -0
- package/dist/build/writeWebsockets.js +30 -0
- package/dist/createContext.js +6 -1
- package/dist/defaultPackages.js +7 -1
- package/dist/defaultTypesMap.js +688 -388
- package/dist/dynamic/buildDynamicBlocks.js +120 -0
- package/dist/index.js +81 -10
- package/dist/indexDev.js +4 -0
- package/dist/lowdefySchema.js +969 -6
- package/dist/scripts/generateDefaultTypes.js +5 -2
- package/dist/test-utils/expectTerminates.js +33 -0
- package/dist/test-utils/runBuild.js +15 -1
- package/dist/test-utils/runBuildForSnapshots.js +37 -4
- package/dist/test-utils/testContext.js +8 -2
- package/dist/utils/countOperators.js +5 -17
- package/dist/utils/createPluginTypesMap.js +21 -0
- package/dist/utils/getEnvironmentNames.js +26 -0
- package/dist/utils/logCollectedErrors.js +15 -9
- package/dist/utils/serializeBuildException.js +29 -0
- package/dist/utils/validateCronExpression.js +131 -0
- package/dist/utils/writeBuildArtifact.js +5 -2
- package/package.json +67 -60
- package/dist/build/writePluginImports/writeServerExternalPackages.js +0 -121
- /package/dist/build/{resolveModuleOperators.js → buildRefs/scopeMenuItemIds.js} +0 -0
package/dist/lowdefySchema.js
CHANGED
|
@@ -1,3 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2020-2026 Lowdefy, Inc
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
you may not use this file except in compliance with the License.
|
|
6
|
+
You may obtain a copy of the License at
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
See the License for the specific language governing permissions and
|
|
14
|
+
limitations under the License.
|
|
15
|
+
*/ const apiScheduleSchema = {
|
|
16
|
+
type: 'object',
|
|
17
|
+
additionalProperties: false,
|
|
18
|
+
required: [
|
|
19
|
+
'cron'
|
|
20
|
+
],
|
|
21
|
+
properties: {
|
|
22
|
+
'~k': {},
|
|
23
|
+
'~r': {},
|
|
24
|
+
'~l': {},
|
|
25
|
+
cron: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
errorMessage: {
|
|
28
|
+
type: 'Api endpoint "schedules[].cron" should be a cron expression string.'
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
payload: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
errorMessage: {
|
|
34
|
+
type: 'Api endpoint "schedules[].payload" should be an object.'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
errorMessage: {
|
|
39
|
+
type: 'Api endpoint "schedules[]" should be an object.',
|
|
40
|
+
required: {
|
|
41
|
+
cron: 'Api endpoint schedule should have required property "cron".'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
1
45
|
export default {
|
|
2
46
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
3
47
|
$id: 'http://lowdefy.com/appSchema.json',
|
|
@@ -67,6 +111,132 @@ export default {
|
|
|
67
111
|
}
|
|
68
112
|
}
|
|
69
113
|
},
|
|
114
|
+
actionOrControl: {
|
|
115
|
+
anyOf: [
|
|
116
|
+
{
|
|
117
|
+
$ref: '#/definitions/action'
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
$ref: '#/definitions/controlIf'
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
$ref: '#/definitions/controlSwitch'
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
$ref: '#/definitions/controlReturn'
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
controlIf: {
|
|
131
|
+
type: 'object',
|
|
132
|
+
additionalProperties: false,
|
|
133
|
+
required: [
|
|
134
|
+
':if',
|
|
135
|
+
':then'
|
|
136
|
+
],
|
|
137
|
+
properties: {
|
|
138
|
+
'~r': {},
|
|
139
|
+
'~l': {},
|
|
140
|
+
':if': {},
|
|
141
|
+
':then': {
|
|
142
|
+
type: 'array',
|
|
143
|
+
items: {
|
|
144
|
+
$ref: '#/definitions/actionOrControl'
|
|
145
|
+
},
|
|
146
|
+
errorMessage: {
|
|
147
|
+
type: 'Control ":then" should be an array of actions.'
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
':else': {
|
|
151
|
+
type: 'array',
|
|
152
|
+
items: {
|
|
153
|
+
$ref: '#/definitions/actionOrControl'
|
|
154
|
+
},
|
|
155
|
+
errorMessage: {
|
|
156
|
+
type: 'Control ":else" should be an array of actions.'
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
errorMessage: {
|
|
161
|
+
type: 'Control ":if" should be an object.',
|
|
162
|
+
required: {
|
|
163
|
+
':then': 'Control ":if" should have required property ":then".'
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
controlReturn: {
|
|
168
|
+
type: 'object',
|
|
169
|
+
additionalProperties: false,
|
|
170
|
+
required: [
|
|
171
|
+
':return'
|
|
172
|
+
],
|
|
173
|
+
properties: {
|
|
174
|
+
'~r': {},
|
|
175
|
+
'~l': {},
|
|
176
|
+
':return': {}
|
|
177
|
+
},
|
|
178
|
+
errorMessage: {
|
|
179
|
+
type: 'Control ":return" should be an object.'
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
controlSwitch: {
|
|
183
|
+
type: 'object',
|
|
184
|
+
additionalProperties: false,
|
|
185
|
+
required: [
|
|
186
|
+
':switch'
|
|
187
|
+
],
|
|
188
|
+
properties: {
|
|
189
|
+
'~r': {},
|
|
190
|
+
'~l': {},
|
|
191
|
+
':switch': {
|
|
192
|
+
type: 'array',
|
|
193
|
+
items: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
additionalProperties: false,
|
|
196
|
+
required: [
|
|
197
|
+
':case',
|
|
198
|
+
':then'
|
|
199
|
+
],
|
|
200
|
+
properties: {
|
|
201
|
+
'~r': {},
|
|
202
|
+
'~l': {},
|
|
203
|
+
':case': {},
|
|
204
|
+
':then': {
|
|
205
|
+
type: 'array',
|
|
206
|
+
items: {
|
|
207
|
+
$ref: '#/definitions/actionOrControl'
|
|
208
|
+
},
|
|
209
|
+
errorMessage: {
|
|
210
|
+
type: 'Control ":then" should be an array of actions.'
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
errorMessage: {
|
|
215
|
+
type: 'Control ":switch" cases should be objects.',
|
|
216
|
+
required: {
|
|
217
|
+
':case': 'Control ":switch" case should have required property ":case".',
|
|
218
|
+
':then': 'Control ":switch" case should have required property ":then".'
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
errorMessage: {
|
|
223
|
+
type: 'Control ":switch" should be an array of case objects.'
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
':default': {
|
|
227
|
+
type: 'array',
|
|
228
|
+
items: {
|
|
229
|
+
$ref: '#/definitions/actionOrControl'
|
|
230
|
+
},
|
|
231
|
+
errorMessage: {
|
|
232
|
+
type: 'Control ":default" should be an array of actions.'
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
errorMessage: {
|
|
237
|
+
type: 'Control ":switch" should be an object.'
|
|
238
|
+
}
|
|
239
|
+
},
|
|
70
240
|
agent: {
|
|
71
241
|
type: 'object',
|
|
72
242
|
additionalProperties: false,
|
|
@@ -141,6 +311,9 @@ export default {
|
|
|
141
311
|
endpointId: {
|
|
142
312
|
type: 'string'
|
|
143
313
|
},
|
|
314
|
+
name: {
|
|
315
|
+
type: 'string'
|
|
316
|
+
},
|
|
144
317
|
confirm: {
|
|
145
318
|
const: true
|
|
146
319
|
}
|
|
@@ -265,6 +438,9 @@ export default {
|
|
|
265
438
|
agentId: {
|
|
266
439
|
type: 'string'
|
|
267
440
|
},
|
|
441
|
+
name: {
|
|
442
|
+
type: 'string'
|
|
443
|
+
},
|
|
268
444
|
description: {
|
|
269
445
|
type: 'string'
|
|
270
446
|
},
|
|
@@ -319,6 +495,44 @@ export default {
|
|
|
319
495
|
},
|
|
320
496
|
'~r': {},
|
|
321
497
|
'~l': {},
|
|
498
|
+
email: {
|
|
499
|
+
type: 'object',
|
|
500
|
+
errorMessage: {
|
|
501
|
+
type: 'App "app.email" should be an object.'
|
|
502
|
+
},
|
|
503
|
+
properties: {
|
|
504
|
+
logo: {
|
|
505
|
+
type: 'string',
|
|
506
|
+
errorMessage: {
|
|
507
|
+
type: 'App "app.email.logo" should be a string.'
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
companyName: {
|
|
511
|
+
type: 'string',
|
|
512
|
+
errorMessage: {
|
|
513
|
+
type: 'App "app.email.companyName" should be a string.'
|
|
514
|
+
}
|
|
515
|
+
},
|
|
516
|
+
primaryColor: {
|
|
517
|
+
type: 'string',
|
|
518
|
+
errorMessage: {
|
|
519
|
+
type: 'App "app.email.primaryColor" should be a string.'
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
signature: {
|
|
523
|
+
type: 'string',
|
|
524
|
+
errorMessage: {
|
|
525
|
+
type: 'App "app.email.signature" should be a string.'
|
|
526
|
+
}
|
|
527
|
+
},
|
|
528
|
+
footer: {
|
|
529
|
+
type: 'string',
|
|
530
|
+
errorMessage: {
|
|
531
|
+
type: 'App "app.email.footer" should be a string.'
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
},
|
|
322
536
|
html: {
|
|
323
537
|
type: 'object',
|
|
324
538
|
errorMessage: {
|
|
@@ -376,6 +590,12 @@ export default {
|
|
|
376
590
|
advanced: {
|
|
377
591
|
type: 'object',
|
|
378
592
|
properties: {
|
|
593
|
+
cookiePrefix: {
|
|
594
|
+
type: 'string',
|
|
595
|
+
errorMessage: {
|
|
596
|
+
type: 'Auth "advanced.cookiePrefix" should be a string.'
|
|
597
|
+
}
|
|
598
|
+
},
|
|
379
599
|
cookies: {
|
|
380
600
|
type: 'object'
|
|
381
601
|
}
|
|
@@ -495,6 +715,89 @@ export default {
|
|
|
495
715
|
}
|
|
496
716
|
}
|
|
497
717
|
},
|
|
718
|
+
websockets: {
|
|
719
|
+
type: 'object',
|
|
720
|
+
additionalProperties: false,
|
|
721
|
+
errorMessage: {
|
|
722
|
+
type: 'App "config.auth.websockets" should be an object.'
|
|
723
|
+
},
|
|
724
|
+
properties: {
|
|
725
|
+
'~ignoreBuildChecks': {
|
|
726
|
+
oneOf: [
|
|
727
|
+
{
|
|
728
|
+
const: true
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
type: 'array',
|
|
732
|
+
items: {
|
|
733
|
+
type: 'string',
|
|
734
|
+
enum: [
|
|
735
|
+
'state-refs',
|
|
736
|
+
'payload-refs',
|
|
737
|
+
'step-refs',
|
|
738
|
+
'link-refs',
|
|
739
|
+
'request-refs',
|
|
740
|
+
'connection-refs',
|
|
741
|
+
'types',
|
|
742
|
+
'schema'
|
|
743
|
+
]
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
]
|
|
747
|
+
},
|
|
748
|
+
'~r': {},
|
|
749
|
+
'~l': {},
|
|
750
|
+
protected: {
|
|
751
|
+
type: [
|
|
752
|
+
'array',
|
|
753
|
+
'boolean'
|
|
754
|
+
],
|
|
755
|
+
errorMessage: {
|
|
756
|
+
type: 'App "auth.websockets.protected.$" should be an array of strings.'
|
|
757
|
+
},
|
|
758
|
+
items: {
|
|
759
|
+
type: 'string',
|
|
760
|
+
description: 'Websocket ids for which authentication is required. When specified, all unspecified websockets will be public.',
|
|
761
|
+
errorMessage: {
|
|
762
|
+
type: 'App "auth.websockets.protected.$" should be an array of strings.'
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
},
|
|
766
|
+
public: {
|
|
767
|
+
type: [
|
|
768
|
+
'array',
|
|
769
|
+
'boolean'
|
|
770
|
+
],
|
|
771
|
+
errorMessage: {
|
|
772
|
+
type: 'App "auth.websockets.public.$" should be an array of strings.'
|
|
773
|
+
},
|
|
774
|
+
items: {
|
|
775
|
+
type: 'string',
|
|
776
|
+
description: 'Websocket ids for which authentication is not required. When specified, all unspecified websockets will be protected.',
|
|
777
|
+
errorMessage: {
|
|
778
|
+
type: 'App "auth.websockets.public.$" should be an array of strings.'
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
},
|
|
782
|
+
roles: {
|
|
783
|
+
type: 'object',
|
|
784
|
+
patternProperties: {
|
|
785
|
+
'^.*$': {
|
|
786
|
+
type: 'array',
|
|
787
|
+
items: {
|
|
788
|
+
type: 'string'
|
|
789
|
+
},
|
|
790
|
+
errorMessage: {
|
|
791
|
+
type: 'App "auth.websockets.roles.[role]" should be an array of strings.'
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
},
|
|
795
|
+
errorMessage: {
|
|
796
|
+
type: 'App "auth.websockets.roles" should be an object.'
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
},
|
|
498
801
|
authPages: {
|
|
499
802
|
type: 'object',
|
|
500
803
|
additionalProperties: false,
|
|
@@ -743,6 +1046,68 @@ export default {
|
|
|
743
1046
|
session: {
|
|
744
1047
|
type: 'object'
|
|
745
1048
|
},
|
|
1049
|
+
strategies: {
|
|
1050
|
+
type: 'array',
|
|
1051
|
+
errorMessage: {
|
|
1052
|
+
type: 'Auth "strategies" should be an array.'
|
|
1053
|
+
},
|
|
1054
|
+
items: {
|
|
1055
|
+
type: 'object',
|
|
1056
|
+
additionalProperties: false,
|
|
1057
|
+
required: [
|
|
1058
|
+
'id',
|
|
1059
|
+
'type'
|
|
1060
|
+
],
|
|
1061
|
+
properties: {
|
|
1062
|
+
'~ignoreBuildChecks': {},
|
|
1063
|
+
'~r': {},
|
|
1064
|
+
'~l': {},
|
|
1065
|
+
id: {
|
|
1066
|
+
type: 'string',
|
|
1067
|
+
errorMessage: {
|
|
1068
|
+
type: 'Auth strategy "id" should be a string.'
|
|
1069
|
+
}
|
|
1070
|
+
},
|
|
1071
|
+
type: {
|
|
1072
|
+
type: 'string',
|
|
1073
|
+
errorMessage: {
|
|
1074
|
+
type: 'Auth strategy "type" should be a string.'
|
|
1075
|
+
}
|
|
1076
|
+
},
|
|
1077
|
+
properties: {
|
|
1078
|
+
type: 'object',
|
|
1079
|
+
errorMessage: {
|
|
1080
|
+
type: 'Auth strategy "properties" should be an object.'
|
|
1081
|
+
}
|
|
1082
|
+
},
|
|
1083
|
+
roles: {
|
|
1084
|
+
type: 'array',
|
|
1085
|
+
items: {
|
|
1086
|
+
type: 'string',
|
|
1087
|
+
errorMessage: {
|
|
1088
|
+
type: 'Auth strategy "roles" should be an array of role names.'
|
|
1089
|
+
}
|
|
1090
|
+
},
|
|
1091
|
+
errorMessage: {
|
|
1092
|
+
type: 'Auth strategy "roles" should be an array of role names.'
|
|
1093
|
+
}
|
|
1094
|
+
},
|
|
1095
|
+
attributes: {
|
|
1096
|
+
type: 'object',
|
|
1097
|
+
errorMessage: {
|
|
1098
|
+
type: 'Auth strategy "attributes" should be an object.'
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
},
|
|
1102
|
+
errorMessage: {
|
|
1103
|
+
type: 'Auth strategy should be an object.',
|
|
1104
|
+
required: {
|
|
1105
|
+
id: 'Auth strategy should have required property "id".',
|
|
1106
|
+
type: 'Auth strategy should have required property "type".'
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
},
|
|
746
1111
|
theme: {
|
|
747
1112
|
type: 'object'
|
|
748
1113
|
},
|
|
@@ -888,11 +1253,20 @@ export default {
|
|
|
888
1253
|
type: 'Block "requests" should be an array.'
|
|
889
1254
|
}
|
|
890
1255
|
},
|
|
891
|
-
|
|
892
|
-
validate: {
|
|
1256
|
+
subscriptions: {
|
|
893
1257
|
type: 'array',
|
|
894
1258
|
items: {
|
|
895
|
-
|
|
1259
|
+
$ref: '#/definitions/subscription'
|
|
1260
|
+
},
|
|
1261
|
+
errorMessage: {
|
|
1262
|
+
type: 'Page "subscriptions" should be an array.'
|
|
1263
|
+
}
|
|
1264
|
+
},
|
|
1265
|
+
required: {},
|
|
1266
|
+
validate: {
|
|
1267
|
+
type: 'array',
|
|
1268
|
+
items: {
|
|
1269
|
+
type: 'object',
|
|
896
1270
|
errorMessage: {
|
|
897
1271
|
type: 'Block "validate" should be an array of objects.'
|
|
898
1272
|
}
|
|
@@ -909,7 +1283,7 @@ export default {
|
|
|
909
1283
|
{
|
|
910
1284
|
type: 'array',
|
|
911
1285
|
items: {
|
|
912
|
-
$ref: '#/definitions/
|
|
1286
|
+
$ref: '#/definitions/actionOrControl'
|
|
913
1287
|
}
|
|
914
1288
|
},
|
|
915
1289
|
{
|
|
@@ -944,13 +1318,13 @@ export default {
|
|
|
944
1318
|
try: {
|
|
945
1319
|
type: 'array',
|
|
946
1320
|
items: {
|
|
947
|
-
$ref: '#/definitions/
|
|
1321
|
+
$ref: '#/definitions/actionOrControl'
|
|
948
1322
|
}
|
|
949
1323
|
},
|
|
950
1324
|
catch: {
|
|
951
1325
|
type: 'array',
|
|
952
1326
|
items: {
|
|
953
|
-
$ref: '#/definitions/
|
|
1327
|
+
$ref: '#/definitions/actionOrControl'
|
|
954
1328
|
}
|
|
955
1329
|
},
|
|
956
1330
|
debounce: {
|
|
@@ -1155,6 +1529,270 @@ export default {
|
|
|
1155
1529
|
}
|
|
1156
1530
|
}
|
|
1157
1531
|
]
|
|
1532
|
+
},
|
|
1533
|
+
async: {
|
|
1534
|
+
type: 'boolean',
|
|
1535
|
+
description: 'Run the endpoint routine in the background. The endpoint returns { accepted: true } immediately and the routine runs after the response (kept alive via the platform request context on Vercel fluid compute, still bounded by the function maxDuration); the outcome is observable only through logs and whatever the routine writes.',
|
|
1536
|
+
errorMessage: {
|
|
1537
|
+
type: 'Api endpoint "async" should be a boolean.'
|
|
1538
|
+
}
|
|
1539
|
+
},
|
|
1540
|
+
webhook: {
|
|
1541
|
+
type: 'boolean',
|
|
1542
|
+
description: 'Make this endpoint a third-party webhook receiver (SNS, Event Grid, Stripe, ...). It stays on the standard POST /api/endpoints/<endpointId> route but takes the request RAW: the routine receives { body, query, headers } as payload (no { payload } envelope), runs as a system context, must authenticate the caller itself (shared-secret query param or signature), and its return value is sent back verbatim as the response body — webhook handshakes require exact response shapes.',
|
|
1543
|
+
errorMessage: {
|
|
1544
|
+
type: 'Api endpoint "webhook" should be a boolean.'
|
|
1545
|
+
}
|
|
1546
|
+
},
|
|
1547
|
+
schedules: {
|
|
1548
|
+
description: 'Cron schedules that run the routine on a timer: an array (the same in every environment), or with config.environments declared an object keyed by environment name with an optional "default" key that every other environment inherits ("staging: []" turns crons off for staging).',
|
|
1549
|
+
anyOf: [
|
|
1550
|
+
{
|
|
1551
|
+
type: 'array',
|
|
1552
|
+
items: apiScheduleSchema,
|
|
1553
|
+
errorMessage: {
|
|
1554
|
+
type: 'Api endpoint "schedules" should be an array or an object keyed by environment.'
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
type: 'object',
|
|
1559
|
+
properties: {
|
|
1560
|
+
'~k': {},
|
|
1561
|
+
'~r': {},
|
|
1562
|
+
'~l': {}
|
|
1563
|
+
},
|
|
1564
|
+
additionalProperties: {
|
|
1565
|
+
type: 'array',
|
|
1566
|
+
items: apiScheduleSchema,
|
|
1567
|
+
errorMessage: {
|
|
1568
|
+
type: 'Api endpoint "schedules.<environment>" should be an array.'
|
|
1569
|
+
}
|
|
1570
|
+
},
|
|
1571
|
+
errorMessage: {
|
|
1572
|
+
type: 'Api endpoint "schedules" should be an array or an object keyed by environment.'
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
]
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
},
|
|
1579
|
+
websocket: {
|
|
1580
|
+
type: 'object',
|
|
1581
|
+
additionalProperties: false,
|
|
1582
|
+
required: [
|
|
1583
|
+
'id',
|
|
1584
|
+
'type'
|
|
1585
|
+
],
|
|
1586
|
+
properties: {
|
|
1587
|
+
'~ignoreBuildChecks': {
|
|
1588
|
+
oneOf: [
|
|
1589
|
+
{
|
|
1590
|
+
const: true
|
|
1591
|
+
},
|
|
1592
|
+
{
|
|
1593
|
+
type: 'array',
|
|
1594
|
+
items: {
|
|
1595
|
+
type: 'string',
|
|
1596
|
+
enum: [
|
|
1597
|
+
'state-refs',
|
|
1598
|
+
'payload-refs',
|
|
1599
|
+
'step-refs',
|
|
1600
|
+
'link-refs',
|
|
1601
|
+
'request-refs',
|
|
1602
|
+
'connection-refs',
|
|
1603
|
+
'types',
|
|
1604
|
+
'schema'
|
|
1605
|
+
]
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
]
|
|
1609
|
+
},
|
|
1610
|
+
'~r': {},
|
|
1611
|
+
'~l': {},
|
|
1612
|
+
id: {
|
|
1613
|
+
type: 'string',
|
|
1614
|
+
errorMessage: {
|
|
1615
|
+
type: 'Websocket "id" should be a string.'
|
|
1616
|
+
}
|
|
1617
|
+
},
|
|
1618
|
+
type: {
|
|
1619
|
+
type: 'string',
|
|
1620
|
+
errorMessage: {
|
|
1621
|
+
type: 'Websocket "type" should be a string.'
|
|
1622
|
+
}
|
|
1623
|
+
},
|
|
1624
|
+
connectionId: {
|
|
1625
|
+
type: 'string',
|
|
1626
|
+
errorMessage: {
|
|
1627
|
+
type: 'Websocket "connectionId" should be a string.'
|
|
1628
|
+
}
|
|
1629
|
+
},
|
|
1630
|
+
properties: {
|
|
1631
|
+
type: 'object',
|
|
1632
|
+
errorMessage: {
|
|
1633
|
+
type: 'Websocket "properties" should be an object.'
|
|
1634
|
+
}
|
|
1635
|
+
}
|
|
1636
|
+
},
|
|
1637
|
+
errorMessage: {
|
|
1638
|
+
type: 'Websocket should be an object.',
|
|
1639
|
+
required: {
|
|
1640
|
+
id: 'Websocket should have required property "id".',
|
|
1641
|
+
type: 'Websocket should have required property "type".'
|
|
1642
|
+
}
|
|
1643
|
+
}
|
|
1644
|
+
},
|
|
1645
|
+
notification: {
|
|
1646
|
+
type: 'object',
|
|
1647
|
+
additionalProperties: false,
|
|
1648
|
+
required: [
|
|
1649
|
+
'id',
|
|
1650
|
+
'type'
|
|
1651
|
+
],
|
|
1652
|
+
properties: {
|
|
1653
|
+
'~ignoreBuildChecks': {
|
|
1654
|
+
oneOf: [
|
|
1655
|
+
{
|
|
1656
|
+
const: true
|
|
1657
|
+
},
|
|
1658
|
+
{
|
|
1659
|
+
type: 'array',
|
|
1660
|
+
items: {
|
|
1661
|
+
type: 'string',
|
|
1662
|
+
enum: [
|
|
1663
|
+
'state-refs',
|
|
1664
|
+
'payload-refs',
|
|
1665
|
+
'step-refs',
|
|
1666
|
+
'link-refs',
|
|
1667
|
+
'request-refs',
|
|
1668
|
+
'connection-refs',
|
|
1669
|
+
'types',
|
|
1670
|
+
'schema'
|
|
1671
|
+
]
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
]
|
|
1675
|
+
},
|
|
1676
|
+
'~r': {},
|
|
1677
|
+
'~l': {},
|
|
1678
|
+
id: {
|
|
1679
|
+
type: 'string',
|
|
1680
|
+
errorMessage: {
|
|
1681
|
+
type: 'Notification "id" should be a string.'
|
|
1682
|
+
}
|
|
1683
|
+
},
|
|
1684
|
+
type: {
|
|
1685
|
+
type: 'string',
|
|
1686
|
+
errorMessage: {
|
|
1687
|
+
type: 'Notification "type" should be a string.'
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1690
|
+
theme: {
|
|
1691
|
+
type: 'object',
|
|
1692
|
+
errorMessage: {
|
|
1693
|
+
type: 'Notification "theme" should be an object.'
|
|
1694
|
+
}
|
|
1695
|
+
},
|
|
1696
|
+
testData: {
|
|
1697
|
+
type: 'object',
|
|
1698
|
+
errorMessage: {
|
|
1699
|
+
type: 'Notification "testData" should be an object.'
|
|
1700
|
+
}
|
|
1701
|
+
},
|
|
1702
|
+
properties: {
|
|
1703
|
+
type: 'object',
|
|
1704
|
+
errorMessage: {
|
|
1705
|
+
type: 'Notification "properties" should be an object.'
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
},
|
|
1709
|
+
errorMessage: {
|
|
1710
|
+
type: 'Notification should be an object.',
|
|
1711
|
+
required: {
|
|
1712
|
+
id: 'Notification should have required property "id".',
|
|
1713
|
+
type: 'Notification should have required property "type".'
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
},
|
|
1717
|
+
subscription: {
|
|
1718
|
+
type: 'object',
|
|
1719
|
+
additionalProperties: false,
|
|
1720
|
+
required: [
|
|
1721
|
+
'websocketId'
|
|
1722
|
+
],
|
|
1723
|
+
properties: {
|
|
1724
|
+
'~ignoreBuildChecks': {
|
|
1725
|
+
oneOf: [
|
|
1726
|
+
{
|
|
1727
|
+
const: true
|
|
1728
|
+
},
|
|
1729
|
+
{
|
|
1730
|
+
type: 'array',
|
|
1731
|
+
items: {
|
|
1732
|
+
type: 'string',
|
|
1733
|
+
enum: [
|
|
1734
|
+
'state-refs',
|
|
1735
|
+
'payload-refs',
|
|
1736
|
+
'step-refs',
|
|
1737
|
+
'link-refs',
|
|
1738
|
+
'request-refs',
|
|
1739
|
+
'connection-refs',
|
|
1740
|
+
'types',
|
|
1741
|
+
'schema'
|
|
1742
|
+
]
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
]
|
|
1746
|
+
},
|
|
1747
|
+
'~r': {},
|
|
1748
|
+
'~l': {},
|
|
1749
|
+
websocketId: {
|
|
1750
|
+
type: 'string',
|
|
1751
|
+
errorMessage: {
|
|
1752
|
+
type: 'Subscription "websocketId" should be a string.'
|
|
1753
|
+
}
|
|
1754
|
+
},
|
|
1755
|
+
payload: {
|
|
1756
|
+
type: 'object',
|
|
1757
|
+
errorMessage: {
|
|
1758
|
+
type: 'Subscription "payload" should be an object.'
|
|
1759
|
+
}
|
|
1760
|
+
},
|
|
1761
|
+
events: {
|
|
1762
|
+
type: 'object',
|
|
1763
|
+
errorMessage: {
|
|
1764
|
+
type: 'Subscription "events" should be an object.'
|
|
1765
|
+
}
|
|
1766
|
+
},
|
|
1767
|
+
client: {
|
|
1768
|
+
type: 'object',
|
|
1769
|
+
additionalProperties: false,
|
|
1770
|
+
properties: {
|
|
1771
|
+
'~r': {},
|
|
1772
|
+
'~l': {},
|
|
1773
|
+
maxMessages: {
|
|
1774
|
+
type: 'integer',
|
|
1775
|
+
minimum: 1,
|
|
1776
|
+
errorMessage: {
|
|
1777
|
+
type: 'Subscription "client.maxMessages" should be a positive integer.'
|
|
1778
|
+
}
|
|
1779
|
+
},
|
|
1780
|
+
throttleRender: {
|
|
1781
|
+
type: 'number',
|
|
1782
|
+
errorMessage: {
|
|
1783
|
+
type: 'Subscription "client.throttleRender" should be a number.'
|
|
1784
|
+
}
|
|
1785
|
+
}
|
|
1786
|
+
},
|
|
1787
|
+
errorMessage: {
|
|
1788
|
+
type: 'Subscription "client" should be an object.'
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
},
|
|
1792
|
+
errorMessage: {
|
|
1793
|
+
type: 'Subscription should be an object.',
|
|
1794
|
+
required: {
|
|
1795
|
+
websocketId: 'Subscription should have required property "websocketId".'
|
|
1158
1796
|
}
|
|
1159
1797
|
}
|
|
1160
1798
|
},
|
|
@@ -1789,6 +2427,206 @@ export default {
|
|
|
1789
2427
|
type: 'App "config.basePath" should be a string.'
|
|
1790
2428
|
}
|
|
1791
2429
|
},
|
|
2430
|
+
vercel: {
|
|
2431
|
+
type: 'object',
|
|
2432
|
+
additionalProperties: false,
|
|
2433
|
+
description: 'Vercel deployment function settings, applied by the CLI vercelOutput assembly.',
|
|
2434
|
+
errorMessage: {
|
|
2435
|
+
type: 'App "config.vercel" should be an object.'
|
|
2436
|
+
},
|
|
2437
|
+
properties: {
|
|
2438
|
+
maxDuration: {
|
|
2439
|
+
type: 'number',
|
|
2440
|
+
minimum: 1,
|
|
2441
|
+
description: 'Maximum function execution time in seconds for the deployed serverless function. Defaults to 60. Plan limits apply (Vercel rejects over-limit values at deploy).',
|
|
2442
|
+
errorMessage: {
|
|
2443
|
+
type: 'App "config.vercel.maxDuration" should be a number.'
|
|
2444
|
+
}
|
|
2445
|
+
},
|
|
2446
|
+
memory: {
|
|
2447
|
+
type: 'number',
|
|
2448
|
+
description: 'Function memory in MB. Omit to use the Vercel default.',
|
|
2449
|
+
errorMessage: {
|
|
2450
|
+
type: 'App "config.vercel.memory" should be a number.'
|
|
2451
|
+
}
|
|
2452
|
+
}
|
|
2453
|
+
}
|
|
2454
|
+
},
|
|
2455
|
+
environment: {
|
|
2456
|
+
type: 'string',
|
|
2457
|
+
description: 'The environment this build is for, one of the names in "config.environments". Used when the LOWDEFY_ENVIRONMENT environment variable is not set; the variable always wins.',
|
|
2458
|
+
errorMessage: {
|
|
2459
|
+
type: 'App "config.environment" should be a string.'
|
|
2460
|
+
}
|
|
2461
|
+
},
|
|
2462
|
+
environments: {
|
|
2463
|
+
type: 'object',
|
|
2464
|
+
description: 'The deployment environments of the app, keyed by name. The current environment (LOWDEFY_ENVIRONMENT) supplies the defaults for everything environment-specific: the app url (auth, notification links), cron forwarding, the email delivery filter and the Sentry environment. Endpoint "schedules" can be keyed by these names.',
|
|
2465
|
+
additionalProperties: {
|
|
2466
|
+
type: 'object',
|
|
2467
|
+
additionalProperties: false,
|
|
2468
|
+
properties: {
|
|
2469
|
+
'~k': {},
|
|
2470
|
+
'~r': {},
|
|
2471
|
+
'~l': {},
|
|
2472
|
+
url: {
|
|
2473
|
+
type: 'string',
|
|
2474
|
+
description: 'The environment deployment origin, e.g. https://staging.example.com. Default for the auth base URL and notification links, and where crons are forwarded to.',
|
|
2475
|
+
errorMessage: {
|
|
2476
|
+
type: 'App "config.environments.<name>.url" should be a string.'
|
|
2477
|
+
}
|
|
2478
|
+
},
|
|
2479
|
+
cron: {
|
|
2480
|
+
type: 'object',
|
|
2481
|
+
additionalProperties: false,
|
|
2482
|
+
properties: {
|
|
2483
|
+
'~k': {},
|
|
2484
|
+
'~r': {},
|
|
2485
|
+
'~l': {},
|
|
2486
|
+
secret: {
|
|
2487
|
+
type: 'string',
|
|
2488
|
+
description: "The NAME of the Lowdefy secret (a plain string, not a _secret operator; read from the LOWDEFY_SECRET_<name> env var on the deployment that forwards) holding this environment's CRON_SECRET. An environment with a secret is forwarded to: the environment Vercel fires crons on pings its /api/cron route when one of its schedules fires.",
|
|
2489
|
+
errorMessage: {
|
|
2490
|
+
type: 'App "config.environments.<name>.cron.secret" should be a string.'
|
|
2491
|
+
}
|
|
2492
|
+
},
|
|
2493
|
+
enabled: {
|
|
2494
|
+
type: 'boolean',
|
|
2495
|
+
description: 'Set false to register no cron jobs for this environment. Defaults to true.',
|
|
2496
|
+
errorMessage: {
|
|
2497
|
+
type: 'App "config.environments.<name>.cron.enabled" should be a boolean.'
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
},
|
|
2501
|
+
errorMessage: {
|
|
2502
|
+
type: 'App "config.environments.<name>.cron" should be an object.'
|
|
2503
|
+
}
|
|
2504
|
+
},
|
|
2505
|
+
email: {
|
|
2506
|
+
type: 'object',
|
|
2507
|
+
additionalProperties: false,
|
|
2508
|
+
properties: {
|
|
2509
|
+
'~k': {},
|
|
2510
|
+
'~r': {},
|
|
2511
|
+
'~l': {},
|
|
2512
|
+
enabled: {
|
|
2513
|
+
type: 'boolean',
|
|
2514
|
+
description: 'Set false to send no email from SMTPMailSend and SendGridMailSend requests in this environment. Auth emails still send. Defaults to true.',
|
|
2515
|
+
errorMessage: {
|
|
2516
|
+
type: 'App "config.environments.<name>.email.enabled" should be a boolean.'
|
|
2517
|
+
}
|
|
2518
|
+
},
|
|
2519
|
+
filter: {
|
|
2520
|
+
type: 'object',
|
|
2521
|
+
description: 'Delivery filter applied to every SMTPMailSend and SendGridMailSend request in this environment, unless the connection sets its own "filter" (false turns filtering off for that connection). Auth emails are not filtered.',
|
|
2522
|
+
additionalProperties: false,
|
|
2523
|
+
properties: {
|
|
2524
|
+
'~k': {},
|
|
2525
|
+
'~r': {},
|
|
2526
|
+
'~l': {},
|
|
2527
|
+
replaceAddress: {
|
|
2528
|
+
type: [
|
|
2529
|
+
'string',
|
|
2530
|
+
'null'
|
|
2531
|
+
],
|
|
2532
|
+
description: 'Send every email to this address instead of its recipients.'
|
|
2533
|
+
},
|
|
2534
|
+
allowlist: {
|
|
2535
|
+
type: 'array',
|
|
2536
|
+
items: {
|
|
2537
|
+
type: 'string'
|
|
2538
|
+
},
|
|
2539
|
+
description: 'Only deliver to recipients on these domains.'
|
|
2540
|
+
},
|
|
2541
|
+
regex: {
|
|
2542
|
+
type: 'string',
|
|
2543
|
+
description: 'Only deliver to recipients matching this regular expression.'
|
|
2544
|
+
}
|
|
2545
|
+
},
|
|
2546
|
+
errorMessage: {
|
|
2547
|
+
type: 'App "config.environments.<name>.email.filter" should be an object.'
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
},
|
|
2551
|
+
errorMessage: {
|
|
2552
|
+
type: 'App "config.environments.<name>.email" should be an object.'
|
|
2553
|
+
}
|
|
2554
|
+
},
|
|
2555
|
+
guards: {
|
|
2556
|
+
type: 'object',
|
|
2557
|
+
additionalProperties: false,
|
|
2558
|
+
description: 'Pin secrets and environment variables to a regular expression kept in config: in this environment the build fails unless each value matches (a missing value fails too). Changing a guarded value then takes a config change as well. Values are never printed.',
|
|
2559
|
+
properties: {
|
|
2560
|
+
'~k': {},
|
|
2561
|
+
'~r': {},
|
|
2562
|
+
'~l': {},
|
|
2563
|
+
secrets: {
|
|
2564
|
+
type: 'object',
|
|
2565
|
+
description: 'Lowdefy secret name (LOWDEFY_SECRET_<name>) to the regular expression its value must match.',
|
|
2566
|
+
additionalProperties: {
|
|
2567
|
+
type: 'string',
|
|
2568
|
+
errorMessage: {
|
|
2569
|
+
type: 'App "config.environments.<name>.guards.secrets.<name>" should be a regular expression string.'
|
|
2570
|
+
}
|
|
2571
|
+
},
|
|
2572
|
+
errorMessage: {
|
|
2573
|
+
type: 'App "config.environments.<name>.guards.secrets" should be an object.'
|
|
2574
|
+
}
|
|
2575
|
+
},
|
|
2576
|
+
env: {
|
|
2577
|
+
type: 'object',
|
|
2578
|
+
description: 'Environment variable name to the regular expression its value must match.',
|
|
2579
|
+
additionalProperties: {
|
|
2580
|
+
type: 'string',
|
|
2581
|
+
errorMessage: {
|
|
2582
|
+
type: 'App "config.environments.<name>.guards.env.<name>" should be a regular expression string.'
|
|
2583
|
+
}
|
|
2584
|
+
},
|
|
2585
|
+
errorMessage: {
|
|
2586
|
+
type: 'App "config.environments.<name>.guards.env" should be an object.'
|
|
2587
|
+
}
|
|
2588
|
+
}
|
|
2589
|
+
},
|
|
2590
|
+
errorMessage: {
|
|
2591
|
+
type: 'App "config.environments.<name>.guards" should be an object.'
|
|
2592
|
+
}
|
|
2593
|
+
},
|
|
2594
|
+
sentry: {
|
|
2595
|
+
type: 'object',
|
|
2596
|
+
additionalProperties: false,
|
|
2597
|
+
properties: {
|
|
2598
|
+
'~k': {},
|
|
2599
|
+
'~r': {},
|
|
2600
|
+
'~l': {},
|
|
2601
|
+
enabled: {
|
|
2602
|
+
type: 'boolean',
|
|
2603
|
+
description: 'Set false to turn Sentry off (server and client) in this environment. Defaults to true.',
|
|
2604
|
+
errorMessage: {
|
|
2605
|
+
type: 'App "config.environments.<name>.sentry.enabled" should be a boolean.'
|
|
2606
|
+
}
|
|
2607
|
+
}
|
|
2608
|
+
},
|
|
2609
|
+
errorMessage: {
|
|
2610
|
+
type: 'App "config.environments.<name>.sentry" should be an object.'
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
},
|
|
2614
|
+
errorMessage: {
|
|
2615
|
+
type: 'App "config.environments.<name>" should be an object.'
|
|
2616
|
+
}
|
|
2617
|
+
},
|
|
2618
|
+
errorMessage: {
|
|
2619
|
+
type: 'App "config.environments" should be an object.'
|
|
2620
|
+
}
|
|
2621
|
+
},
|
|
2622
|
+
requestTimeout: {
|
|
2623
|
+
type: 'number',
|
|
2624
|
+
minimum: 0,
|
|
2625
|
+
description: 'Maximum time in milliseconds a request may run before the server returns a timeout. Protects against hung upstream calls (database, SMTP, external APIs) running to the platform function limit — important on serverless hosts billed by duration. Defaults to 30000 (30s). Set to 0 to disable. Agent streaming routes are exempt.',
|
|
2626
|
+
errorMessage: {
|
|
2627
|
+
type: 'App "config.requestTimeout" should be a number.'
|
|
2628
|
+
}
|
|
2629
|
+
},
|
|
1792
2630
|
homePageId: {
|
|
1793
2631
|
type: 'string',
|
|
1794
2632
|
description: 'Page id to use as homepage. When visiting home route "/", the router will redirect to this page. If not provided, the first page in default or first menu will be used as the homePageId.',
|
|
@@ -1927,6 +2765,131 @@ export default {
|
|
|
1927
2765
|
type: 'App "api" should be an array.'
|
|
1928
2766
|
}
|
|
1929
2767
|
},
|
|
2768
|
+
mcp: {
|
|
2769
|
+
type: 'object',
|
|
2770
|
+
additionalProperties: false,
|
|
2771
|
+
errorMessage: {
|
|
2772
|
+
type: 'App "mcp" should be an object.',
|
|
2773
|
+
additionalProperties: 'App "mcp" contains an unknown property. The known properties are "name", "version", "title", "websiteUrl", "icons" and "endpoints".'
|
|
2774
|
+
},
|
|
2775
|
+
properties: {
|
|
2776
|
+
'~ignoreBuildChecks': {},
|
|
2777
|
+
'~r': {},
|
|
2778
|
+
'~l': {},
|
|
2779
|
+
name: {
|
|
2780
|
+
type: 'string',
|
|
2781
|
+
errorMessage: {
|
|
2782
|
+
type: 'MCP "name" should be a string.'
|
|
2783
|
+
}
|
|
2784
|
+
},
|
|
2785
|
+
version: {
|
|
2786
|
+
type: 'string',
|
|
2787
|
+
errorMessage: {
|
|
2788
|
+
type: 'MCP "version" should be a string.'
|
|
2789
|
+
}
|
|
2790
|
+
},
|
|
2791
|
+
// Server branding advertised in the initialize result's serverInfo
|
|
2792
|
+
// (MCP Implementation: title, websiteUrl, icons). Clients that render
|
|
2793
|
+
// a connector card prefer these over guessing from the host's favicon.
|
|
2794
|
+
title: {
|
|
2795
|
+
type: 'string',
|
|
2796
|
+
errorMessage: {
|
|
2797
|
+
type: 'MCP "title" should be a string.'
|
|
2798
|
+
}
|
|
2799
|
+
},
|
|
2800
|
+
websiteUrl: {
|
|
2801
|
+
type: 'string',
|
|
2802
|
+
errorMessage: {
|
|
2803
|
+
type: 'MCP "websiteUrl" should be a string.'
|
|
2804
|
+
}
|
|
2805
|
+
},
|
|
2806
|
+
icons: {
|
|
2807
|
+
type: 'array',
|
|
2808
|
+
items: {
|
|
2809
|
+
type: 'object',
|
|
2810
|
+
additionalProperties: false,
|
|
2811
|
+
required: [
|
|
2812
|
+
'src'
|
|
2813
|
+
],
|
|
2814
|
+
properties: {
|
|
2815
|
+
'~ignoreBuildChecks': {},
|
|
2816
|
+
'~r': {},
|
|
2817
|
+
'~l': {},
|
|
2818
|
+
src: {
|
|
2819
|
+
type: 'string',
|
|
2820
|
+
errorMessage: {
|
|
2821
|
+
type: 'MCP icon "src" should be a string.'
|
|
2822
|
+
}
|
|
2823
|
+
},
|
|
2824
|
+
mimeType: {
|
|
2825
|
+
type: 'string',
|
|
2826
|
+
errorMessage: {
|
|
2827
|
+
type: 'MCP icon "mimeType" should be a string.'
|
|
2828
|
+
}
|
|
2829
|
+
},
|
|
2830
|
+
sizes: {
|
|
2831
|
+
type: 'array',
|
|
2832
|
+
items: {
|
|
2833
|
+
type: 'string'
|
|
2834
|
+
},
|
|
2835
|
+
errorMessage: {
|
|
2836
|
+
type: 'MCP icon "sizes" should be an array of strings like "512x512".'
|
|
2837
|
+
}
|
|
2838
|
+
},
|
|
2839
|
+
theme: {
|
|
2840
|
+
type: 'string',
|
|
2841
|
+
enum: [
|
|
2842
|
+
'light',
|
|
2843
|
+
'dark'
|
|
2844
|
+
],
|
|
2845
|
+
errorMessage: {
|
|
2846
|
+
type: 'MCP icon "theme" should be a string.',
|
|
2847
|
+
enum: 'MCP icon "theme" should be "light" or "dark".'
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2850
|
+
},
|
|
2851
|
+
errorMessage: {
|
|
2852
|
+
type: 'MCP "icons" items should be objects with a "src" property.',
|
|
2853
|
+
required: {
|
|
2854
|
+
src: 'MCP icon should have required property "src".'
|
|
2855
|
+
},
|
|
2856
|
+
additionalProperties: 'MCP icon contains an unknown property. The known properties are "src", "mimeType", "sizes" and "theme".'
|
|
2857
|
+
}
|
|
2858
|
+
},
|
|
2859
|
+
errorMessage: {
|
|
2860
|
+
type: 'MCP "icons" should be an array.'
|
|
2861
|
+
}
|
|
2862
|
+
},
|
|
2863
|
+
endpoints: {
|
|
2864
|
+
type: 'array',
|
|
2865
|
+
items: {
|
|
2866
|
+
type: 'string',
|
|
2867
|
+
description: 'Api endpoint ids exposed as MCP tools.'
|
|
2868
|
+
},
|
|
2869
|
+
errorMessage: {
|
|
2870
|
+
type: 'MCP "endpoints" should be an array of endpoint id strings.'
|
|
2871
|
+
}
|
|
2872
|
+
}
|
|
2873
|
+
}
|
|
2874
|
+
},
|
|
2875
|
+
websockets: {
|
|
2876
|
+
type: 'array',
|
|
2877
|
+
items: {
|
|
2878
|
+
$ref: '#/definitions/websocket'
|
|
2879
|
+
},
|
|
2880
|
+
errorMessage: {
|
|
2881
|
+
type: 'App "websockets" should be an array.'
|
|
2882
|
+
}
|
|
2883
|
+
},
|
|
2884
|
+
notifications: {
|
|
2885
|
+
type: 'array',
|
|
2886
|
+
items: {
|
|
2887
|
+
$ref: '#/definitions/notification'
|
|
2888
|
+
},
|
|
2889
|
+
errorMessage: {
|
|
2890
|
+
type: 'App "notifications" should be an array.'
|
|
2891
|
+
}
|
|
2892
|
+
},
|
|
1930
2893
|
menus: {
|
|
1931
2894
|
type: 'array',
|
|
1932
2895
|
items: {
|