@aifabrix/builder 2.59.0 → 2.60.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.
Files changed (55) hide show
  1. package/lib/agent-kit/git-identity.js +180 -0
  2. package/lib/agent-kit/setup.js +3 -0
  3. package/lib/agent-kit/start.js +45 -1
  4. package/lib/api/role-assistant-test-job.api.js +60 -0
  5. package/lib/api/work-search.api.js +13 -6
  6. package/lib/app/deploy.js +8 -1
  7. package/lib/app/show-display.js +1 -0
  8. package/lib/app/show-online.js +15 -0
  9. package/lib/build/standard-docker-build.js +4 -1
  10. package/lib/cli/setup-app.js +14 -1
  11. package/lib/cli/setup-utility.js +24 -1
  12. package/lib/commands/role-assistant.js +7 -0
  13. package/lib/core/env-platform-expand.js +93 -0
  14. package/lib/core/secrets-env-content.js +37 -3
  15. package/lib/deployment/installation/azure-infra-stage.js +3 -1
  16. package/lib/deployment/installation/infra-catalog.js +2 -5
  17. package/lib/generator/builders.js +17 -0
  18. package/lib/generator/helpers.js +23 -2
  19. package/lib/generator/index.js +10 -6
  20. package/lib/role-assistant/test-cases-search.js +3 -0
  21. package/lib/role-assistant/test-job-runner.js +125 -0
  22. package/lib/role-assistant/test-runner-search.js +44 -2
  23. package/lib/schema/application-schema.json +193 -2
  24. package/lib/schema/infra-parameter.schema.json +139 -33
  25. package/lib/schema/infra.parameter.yaml +28 -28
  26. package/lib/schema/infrastructure-schema.json +10 -35
  27. package/lib/utils/compose-generate-docker-compose.js +12 -0
  28. package/lib/utils/docker-build.js +29 -8
  29. package/lib/utils/docker-manifest-public-port.js +36 -0
  30. package/lib/utils/platform-resolution.js +226 -0
  31. package/lib/utils/resolve-docker-image-ref.js +8 -3
  32. package/package.json +2 -2
  33. package/templates/README.md +2 -1
  34. package/templates/agent-kit/agent-kit.yaml +4 -1
  35. package/templates/agent-kit/instructions/AGENTKIT.md +1 -1
  36. package/templates/agent-kit/instructions/root.AGENTS.md +2 -0
  37. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +33 -1
  38. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/delivery-verdict.js +176 -0
  39. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -0
  40. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +10 -3
  41. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +22 -0
  42. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +21 -0
  43. package/templates/agent-kit/skills/shared/feedback.md +31 -0
  44. package/templates/agent-kit/skills/shared/hosts.md +13 -3
  45. package/templates/agent-kit/skills/shared/status.md +85 -0
  46. package/templates/agent-kit/workspace/BUILDER_IMPROVEMENT_FINDINGS.md +27 -0
  47. package/templates/applications/builder-api/application.yaml +1 -1
  48. package/templates/applications/dataplane/application.yaml +30 -2
  49. package/templates/applications/dataplane/env.template +37 -4
  50. package/templates/applications/miso-controller/application.yaml +24 -1
  51. package/templates/applications/miso-controller/env.template +21 -34
  52. package/templates/marketplace/main.json +70 -222
  53. package/templates/python/Dockerfile.hbs +2 -0
  54. package/templates/typescript/Dockerfile.hbs +2 -0
  55. package/templates/typescript/docker-compose.hbs +12 -0
@@ -5,7 +5,7 @@
5
5
  "_generator": {
6
6
  "name": "bicep",
7
7
  "version": "0.47.16.16243",
8
- "templateHash": "15679444522742934591"
8
+ "templateHash": "6752412774681258733"
9
9
  }
10
10
  },
11
11
  "parameters": {
@@ -26,12 +26,7 @@
26
26
  "capacityProfile": {
27
27
  "type": "string",
28
28
  "defaultValue": "s",
29
- "allowedValues": [
30
- "s",
31
- "m",
32
- "l",
33
- "xl"
34
- ],
29
+ "allowedValues": ["s", "m", "l", "xl"],
35
30
  "metadata": {
36
31
  "description": "Baseline capacity of the Miso/Keycloak foundation: s (B3), m (P2v3), l (P3v3), xl (P3mv3). One compute instance for every profile. Select the purchased capacity independently of licenseEdition; this does not provision workload environment topology."
37
32
  }
@@ -95,11 +90,7 @@
95
90
  "deploymentEnvironment": {
96
91
  "type": "string",
97
92
  "defaultValue": "evaluation",
98
- "allowedValues": [
99
- "prod",
100
- "nonprod",
101
- "evaluation"
102
- ],
93
+ "allowedValues": ["prod", "nonprod", "evaluation"],
103
94
  "metadata": {
104
95
  "description": "Deployment environment used for app runtime defaults. MP UI hardcodes evaluation for now."
105
96
  }
@@ -181,20 +172,6 @@
181
172
  "description": "Expected `iss` claim on a Mori licence."
182
173
  }
183
174
  },
184
- "moriCallbackApiKey": {
185
- "type": "securestring",
186
- "defaultValue": "",
187
- "metadata": {
188
- "description": "Optional shared secret for Mori → controller callback. Configure through the Miso installation/application contract."
189
- }
190
- },
191
- "entraCallbackStateSecret": {
192
- "type": "securestring",
193
- "defaultValue": "",
194
- "metadata": {
195
- "description": "Optional shared HMAC secret for Entra consent OAuth state. Configure through the Miso installation contract."
196
- }
197
- },
198
175
  "entraIdClientId": {
199
176
  "type": "string",
200
177
  "defaultValue": "481251f2-a318-47ba-9ad8-40c36f790df1",
@@ -240,10 +217,7 @@
240
217
  "onboardingMode": {
241
218
  "type": "string",
242
219
  "defaultValue": "customerOwned",
243
- "allowedValues": [
244
- "customerOwned",
245
- "saasDirect"
246
- ],
220
+ "allowedValues": ["customerOwned", "saasDirect"],
247
221
  "metadata": {
248
222
  "description": "Tenant onboarding mode for Miso (ONBOARDING_MODE). customerOwned = portal/Marketplace wizard; saasDirect = Builder SaaS installation. Not exposed in createUiDefinition."
249
223
  }
@@ -439,9 +413,7 @@
439
413
  "tags": "[parameters('tags')]",
440
414
  "properties": {
441
415
  "addressSpace": {
442
- "addressPrefixes": [
443
- "[parameters('vnetAddressSpace')]"
444
- ]
416
+ "addressPrefixes": ["[parameters('vnetAddressSpace')]"]
445
417
  },
446
418
  "subnets": [
447
419
  {
@@ -793,9 +765,7 @@
793
765
  "value": "[reference(resourceId('Microsoft.Resources/deployments', 'network'), '2025-04-01').outputs.keyVaultPrivateDnsZoneId.value]"
794
766
  },
795
767
  "allowedIPs": {
796
- "value": [
797
- "*"
798
- ]
768
+ "value": ["*"]
799
769
  },
800
770
  "currentUserObjectId": {
801
771
  "value": ""
@@ -875,10 +845,7 @@
875
845
  "sku": {
876
846
  "type": "string",
877
847
  "defaultValue": "standard",
878
- "allowedValues": [
879
- "standard",
880
- "premium"
881
- ],
848
+ "allowedValues": ["standard", "premium"],
882
849
  "metadata": {
883
850
  "description": "Key Vault SKU (standard or premium)"
884
851
  }
@@ -900,11 +867,7 @@
900
867
  "tenantId": "[subscription().tenantId]",
901
868
  "objectId": "[parameters('deploymentIdentityObjectIds')[copyIndex('deploymentIdentityPolicies')]]",
902
869
  "permissions": {
903
- "secrets": [
904
- "get",
905
- "list",
906
- "set"
907
- ],
870
+ "secrets": ["get", "list", "set"],
908
871
  "keys": [],
909
872
  "certificates": [],
910
873
  "storage": []
@@ -959,9 +922,7 @@
959
922
  "properties": {
960
923
  "accessPolicies": "[variables('currentUserPolicy')]"
961
924
  },
962
- "dependsOn": [
963
- "[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"
964
- ]
925
+ "dependsOn": ["[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"]
965
926
  },
966
927
  {
967
928
  "condition": "[and(not(empty(variables('deploymentIdentityPolicies'))), not(variables('shouldGrantCurrentUserPolicy')))]",
@@ -971,9 +932,7 @@
971
932
  "properties": {
972
933
  "accessPolicies": "[variables('deploymentIdentityPolicies')]"
973
934
  },
974
- "dependsOn": [
975
- "[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"
976
- ]
935
+ "dependsOn": ["[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"]
977
936
  },
978
937
  {
979
938
  "condition": "[and(variables('shouldGrantCurrentUserPolicy'), not(empty(variables('deploymentIdentityPolicies'))))]",
@@ -983,9 +942,7 @@
983
942
  "properties": {
984
943
  "accessPolicies": "[concat(variables('currentUserPolicy'), variables('deploymentIdentityPolicies'))]"
985
944
  },
986
- "dependsOn": [
987
- "[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"
988
- ]
945
+ "dependsOn": ["[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"]
989
946
  },
990
947
  {
991
948
  "type": "Microsoft.Network/privateEndpoints",
@@ -1003,16 +960,12 @@
1003
960
  "name": "kv-pls",
1004
961
  "properties": {
1005
962
  "privateLinkServiceId": "[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]",
1006
- "groupIds": [
1007
- "vault"
1008
- ]
963
+ "groupIds": ["vault"]
1009
964
  }
1010
965
  }
1011
966
  ]
1012
967
  },
1013
- "dependsOn": [
1014
- "[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"
1015
- ]
968
+ "dependsOn": ["[resourceId('Microsoft.KeyVault/vaults', parameters('name'))]"]
1016
969
  },
1017
970
  {
1018
971
  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
@@ -1178,9 +1131,7 @@
1178
1131
  }
1179
1132
  }
1180
1133
  },
1181
- "dependsOn": [
1182
- "[resourceId('Microsoft.Resources/deployments', 'keyVault')]"
1183
- ]
1134
+ "dependsOn": ["[resourceId('Microsoft.Resources/deployments', 'keyVault')]"]
1184
1135
  },
1185
1136
  {
1186
1137
  "type": "Microsoft.Resources/deployments",
@@ -1244,12 +1195,7 @@
1244
1195
  "sku": {
1245
1196
  "type": "string",
1246
1197
  "defaultValue": "Standard_LRS",
1247
- "allowedValues": [
1248
- "Standard_LRS",
1249
- "Standard_GRS",
1250
- "Standard_RAGRS",
1251
- "Premium_LRS"
1252
- ],
1198
+ "allowedValues": ["Standard_LRS", "Standard_GRS", "Standard_RAGRS", "Premium_LRS"],
1253
1199
  "metadata": {
1254
1200
  "description": "Storage account SKU (e.g., Standard_LRS, Standard_GRS, Premium_LRS)"
1255
1201
  }
@@ -1353,9 +1299,7 @@
1353
1299
  "apiVersion": "2024-01-01",
1354
1300
  "name": "[format('{0}/{1}', parameters('name'), 'default')]",
1355
1301
  "properties": {},
1356
- "dependsOn": [
1357
- "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
1358
- ]
1302
+ "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"]
1359
1303
  },
1360
1304
  {
1361
1305
  "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
@@ -1373,9 +1317,7 @@
1373
1317
  "type": "Microsoft.Storage/storageAccounts/fileServices",
1374
1318
  "apiVersion": "2021-04-01",
1375
1319
  "name": "[format('{0}/{1}', parameters('name'), 'default')]",
1376
- "dependsOn": [
1377
- "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
1378
- ]
1320
+ "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"]
1379
1321
  },
1380
1322
  {
1381
1323
  "type": "Microsoft.Storage/storageAccounts/fileServices/shares",
@@ -1404,16 +1346,12 @@
1404
1346
  "name": "blob-pls",
1405
1347
  "properties": {
1406
1348
  "privateLinkServiceId": "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]",
1407
- "groupIds": [
1408
- "blob"
1409
- ]
1349
+ "groupIds": ["blob"]
1410
1350
  }
1411
1351
  }
1412
1352
  ]
1413
1353
  },
1414
- "dependsOn": [
1415
- "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
1416
- ]
1354
+ "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"]
1417
1355
  },
1418
1356
  {
1419
1357
  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
@@ -1449,16 +1387,12 @@
1449
1387
  "name": "file-pls",
1450
1388
  "properties": {
1451
1389
  "privateLinkServiceId": "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]",
1452
- "groupIds": [
1453
- "file"
1454
- ]
1390
+ "groupIds": ["file"]
1455
1391
  }
1456
1392
  }
1457
1393
  ]
1458
1394
  },
1459
- "dependsOn": [
1460
- "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
1461
- ]
1395
+ "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"]
1462
1396
  },
1463
1397
  {
1464
1398
  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
@@ -1485,9 +1419,7 @@
1485
1419
  "properties": {
1486
1420
  "value": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('name')), '2024-01-01').keys[0].value]"
1487
1421
  },
1488
- "dependsOn": [
1489
- "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"
1490
- ]
1422
+ "dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]"]
1491
1423
  }
1492
1424
  ],
1493
1425
  "outputs": {
@@ -1579,15 +1511,7 @@
1579
1511
  },
1580
1512
  "skuDisplay": {
1581
1513
  "type": "string",
1582
- "allowedValues": [
1583
- "B1",
1584
- "B2",
1585
- "B3",
1586
- "P1v3",
1587
- "P2v3",
1588
- "P3v3",
1589
- "P3mv3"
1590
- ],
1514
+ "allowedValues": ["B1", "B2", "B3", "P1v3", "P2v3", "P3v3", "P3mv3"],
1591
1515
  "metadata": {
1592
1516
  "description": "Select a Linux-compatible App Service Plan SKU with details"
1593
1517
  }
@@ -1829,9 +1753,7 @@
1829
1753
  }
1830
1754
  }
1831
1755
  },
1832
- "dependsOn": [
1833
- "[resourceId('Microsoft.Resources/deployments', 'keyVault')]"
1834
- ]
1756
+ "dependsOn": ["[resourceId('Microsoft.Resources/deployments', 'keyVault')]"]
1835
1757
  },
1836
1758
  {
1837
1759
  "type": "Microsoft.Resources/deployments",
@@ -1955,11 +1877,7 @@
1955
1877
  "skuTier": {
1956
1878
  "type": "string",
1957
1879
  "defaultValue": "Burstable",
1958
- "allowedValues": [
1959
- "Burstable",
1960
- "GeneralPurpose",
1961
- "MemoryOptimized"
1962
- ],
1880
+ "allowedValues": ["Burstable", "GeneralPurpose", "MemoryOptimized"],
1963
1881
  "metadata": {
1964
1882
  "description": "SKU tier for PostgreSQL Flexible Server"
1965
1883
  }
@@ -2526,9 +2444,7 @@
2526
2444
  "enabled": true
2527
2445
  }
2528
2446
  },
2529
- "dependsOn": [
2530
- "[resourceId('Microsoft.Web/sites', parameters('name'))]"
2531
- ]
2447
+ "dependsOn": ["[resourceId('Microsoft.Web/sites', parameters('name'))]"]
2532
2448
  }
2533
2449
  ],
2534
2450
  "outputs": {
@@ -2602,9 +2518,6 @@
2602
2518
  "encryptionKey": {
2603
2519
  "value": "[reference(resourceId('Microsoft.Resources/deployments', 'bootstrapSecrets'), '2025-04-01').outputs.encryptionKey.value]"
2604
2520
  },
2605
- "entraCallbackStateSecret": {
2606
- "value": "[parameters('entraCallbackStateSecret')]"
2607
- },
2608
2521
  "entraIdClientSecret": {
2609
2522
  "value": "[parameters('entraIdClientSecret')]"
2610
2523
  },
@@ -2613,9 +2526,6 @@
2613
2526
  },
2614
2527
  "moriBaseUrl": {
2615
2528
  "value": "[parameters('moriBaseUrl')]"
2616
- },
2617
- "moriCallbackApiKey": {
2618
- "value": "[parameters('moriCallbackApiKey')]"
2619
2529
  }
2620
2530
  },
2621
2531
  "template": {
@@ -2625,7 +2535,7 @@
2625
2535
  "_generator": {
2626
2536
  "name": "bicep",
2627
2537
  "version": "0.47.16.16243",
2628
- "templateHash": "9634353332764264230"
2538
+ "templateHash": "445562478593270876"
2629
2539
  }
2630
2540
  },
2631
2541
  "parameters": {
@@ -2694,13 +2604,6 @@
2694
2604
  "description": "MISO Client Secret (auto-generated if not provided)"
2695
2605
  }
2696
2606
  },
2697
- "entraCallbackStateSecret": {
2698
- "type": "securestring",
2699
- "defaultValue": "",
2700
- "metadata": {
2701
- "description": "Shared HMAC secret for Entra consent OAuth state (ENTRA_CALLBACK_STATE_SECRET). Generated when empty."
2702
- }
2703
- },
2704
2607
  "entraIdClientSecret": {
2705
2608
  "type": "securestring",
2706
2609
  "defaultValue": "",
@@ -2721,17 +2624,9 @@
2721
2624
  "metadata": {
2722
2625
  "description": "Mori base URL, stored so App Service can reference it instead of holding a literal."
2723
2626
  }
2724
- },
2725
- "moriCallbackApiKey": {
2726
- "type": "securestring",
2727
- "defaultValue": "",
2728
- "metadata": {
2729
- "description": "Mori callback API key, shared by the Miso Controller and Mori."
2730
- }
2731
2627
  }
2732
2628
  },
2733
2629
  "variables": {
2734
- "resolvedEntraCallbackStateSecret": "[if(not(empty(parameters('entraCallbackStateSecret'))), parameters('entraCallbackStateSecret'), format('ecs_{0}{1}', uniqueString(resourceGroup().id, parameters('prefix'), 'entra-callback-state-v1'), uniqueString(parameters('prefix'), 'entra-cb-b')))]",
2735
2630
  "resolvedEntraIdClientSecret": "[if(not(empty(parameters('entraIdClientSecret'))), parameters('entraIdClientSecret'), format('PLACEHOLDER_ENTRA_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]",
2736
2631
  "misoWebAppOrigin": "[if(endsWith(parameters('misoWebAppUrl'), '/'), substring(parameters('misoWebAppUrl'), 0, max(0, sub(length(parameters('misoWebAppUrl')), 1))), parameters('misoWebAppUrl'))]",
2737
2632
  "misoVdirSegment": "[if(or(equals(parameters('misoVdirPublic'), ''), equals(parameters('misoVdirPublic'), '/')), '', if(startsWith(parameters('misoVdirPublic'), '/'), parameters('misoVdirPublic'), format('/{0}', parameters('misoVdirPublic'))))]",
@@ -2823,14 +2718,6 @@
2823
2718
  "value": "[if(not(empty(parameters('misoClientSecret'))), parameters('misoClientSecret'), format('PLACEHOLDER_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]"
2824
2719
  }
2825
2720
  },
2826
- {
2827
- "type": "Microsoft.KeyVault/vaults/secrets",
2828
- "apiVersion": "2023-07-01",
2829
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'entra-callback-state-secret')]",
2830
- "properties": {
2831
- "value": "[variables('resolvedEntraCallbackStateSecret')]"
2832
- }
2833
- },
2834
2721
  {
2835
2722
  "type": "Microsoft.KeyVault/vaults/secrets",
2836
2723
  "apiVersion": "2023-07-01",
@@ -2856,15 +2743,6 @@
2856
2743
  "properties": {
2857
2744
  "value": "[parameters('moriBaseUrl')]"
2858
2745
  }
2859
- },
2860
- {
2861
- "condition": "[not(empty(parameters('moriCallbackApiKey')))]",
2862
- "type": "Microsoft.KeyVault/vaults/secrets",
2863
- "apiVersion": "2023-07-01",
2864
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-callback-api-keyKeyVault')]",
2865
- "properties": {
2866
- "value": "[parameters('moriCallbackApiKey')]"
2867
- }
2868
2746
  }
2869
2747
  ]
2870
2748
  }
@@ -2972,9 +2850,6 @@
2972
2850
  "moriLicenseIssuer": {
2973
2851
  "value": "[parameters('moriLicenseIssuer')]"
2974
2852
  },
2975
- "moriCallbackApiKey": {
2976
- "value": "[parameters('moriCallbackApiKey')]"
2977
- },
2978
2853
  "entraIdClientId": {
2979
2854
  "value": "[parameters('entraIdClientId')]"
2980
2855
  },
@@ -2987,6 +2862,9 @@
2987
2862
  "onboardingMode": {
2988
2863
  "value": "[parameters('onboardingMode')]"
2989
2864
  },
2865
+ "capacityProfile": {
2866
+ "value": "[parameters('capacityProfile')]"
2867
+ },
2990
2868
  "resourceGroupName": {
2991
2869
  "value": "[resourceGroup().name]"
2992
2870
  },
@@ -3001,7 +2879,7 @@
3001
2879
  "_generator": {
3002
2880
  "name": "bicep",
3003
2881
  "version": "0.47.16.16243",
3004
- "templateHash": "2563187238594401937"
2882
+ "templateHash": "13342696621269025420"
3005
2883
  }
3006
2884
  },
3007
2885
  "parameters": {
@@ -3178,11 +3056,7 @@
3178
3056
  "deploymentEnvironment": {
3179
3057
  "type": "string",
3180
3058
  "defaultValue": "nonprod",
3181
- "allowedValues": [
3182
- "prod",
3183
- "nonprod",
3184
- "evaluation"
3185
- ],
3059
+ "allowedValues": ["prod", "nonprod", "evaluation"],
3186
3060
  "metadata": {
3187
3061
  "description": "Deployment environment. Use prod for production; non-prod disables API rate limiting by default"
3188
3062
  }
@@ -3201,13 +3075,6 @@
3201
3075
  "description": "Mori base URL (no trailing slash); used for tenant activation / handoff"
3202
3076
  }
3203
3077
  },
3204
- "moriCallbackApiKey": {
3205
- "type": "securestring",
3206
- "defaultValue": "",
3207
- "metadata": {
3208
- "description": "Optional shared secret for Mori → controller callback, supplied through the Miso installation/application contract."
3209
- }
3210
- },
3211
3078
  "moriLicensePublicKey": {
3212
3079
  "type": "string",
3213
3080
  "defaultValue": "",
@@ -3226,7 +3093,7 @@
3226
3093
  "type": "string",
3227
3094
  "defaultValue": "481251f2-a318-47ba-9ad8-40c36f790df1",
3228
3095
  "metadata": {
3229
- "description": "Vendor multi-tenant Entra app client ID."
3096
+ "description": "Vendor multi-tenant Entra app client ID. No longer emitted as an app setting — Miso does not hold provider credentials; Mori does. Retained so the marketplace parameter surface is unchanged."
3230
3097
  }
3231
3098
  },
3232
3099
  "entraIdTenantId": {
@@ -3246,14 +3113,18 @@
3246
3113
  "onboardingMode": {
3247
3114
  "type": "string",
3248
3115
  "defaultValue": "customerOwned",
3249
- "allowedValues": [
3250
- "customerOwned",
3251
- "saasDirect"
3252
- ],
3116
+ "allowedValues": ["customerOwned", "saasDirect"],
3253
3117
  "metadata": {
3254
3118
  "description": "Tenant onboarding mode (ONBOARDING_MODE)."
3255
3119
  }
3256
3120
  },
3121
+ "capacityProfile": {
3122
+ "type": "string",
3123
+ "defaultValue": "s",
3124
+ "metadata": {
3125
+ "description": "Capacity the installation was provisioned at (s/m/l/xl). Emitted as INSTALLATION_CAPACITY_PROFILE so the controller sizes the platform environment from the installation rather than guessing; without it the controller assumed m and rewrote an S App Service Plan to P2v3."
3126
+ }
3127
+ },
3257
3128
  "resourceGroupName": {
3258
3129
  "type": "string",
3259
3130
  "defaultValue": "[resourceGroup().name]",
@@ -3335,7 +3206,7 @@
3335
3206
  "acrUseManagedIdentityCreds": "[not(parameters('registryPasswordConfigured'))]",
3336
3207
  "healthCheckPath": "/health",
3337
3208
  "alwaysOn": true,
3338
- "appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', 'ALLOWED_ORIGINS', 'value', format('http://localhost:*,http://127.0.0.1:*,https://{0}.azurewebsites.net', parameters('name'))), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'DATABASELOG_URL', 'value', variables('databaseLogUrlAppSettingValue')), createObject('name', 'KEY_VAULT_ENABLED', 'value', 'true'), createObject('name', 'SECURITY_STORAGE_MODE', 'value', 'keyvault'), createObject('name', 'KEY_VAULT_URL', 'value', format('https://{0}.vault.azure.net/', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENCRYPTION_KEY', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-encryption-keyKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'AUTO_CREATE_TABLES', 'value', if(parameters('autoCreateTables'), 'true', 'false')), createObject('name', 'KEYCLOAK_REALM', 'value', parameters('keycloakRealm')), createObject('name', 'KEYCLOAK_CLIENT_ID', 'value', parameters('keycloakClientId')), createObject('name', 'KEYCLOAK_ADMIN_USERNAME', 'value', parameters('keycloakAdminUsername')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-keycloak-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-onboarding-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'KEYCLOAK_SERVER_URL', 'value', variables('keycloakPublicUrl')), createObject('name', 'KEYCLOAK_INTERNAL_SERVER_URL', 'value', variables('keycloakInternalUrl')), createObject('name', 'KEYCLOAK_TOKEN_TIMEOUT', 'value', '5000'), createObject('name', 'KEYCLOAK_VERIFY_AUDIENCE', 'value', if(parameters('keycloakVerifyAudience'), 'true', 'false')), createObject('name', 'DISABLE_RATE_LIMIT', 'value', variables('shouldDisableRateLimit')), createObject('name', 'SKIP_DB_REDEPLOY', 'value', 'true'), createObject('name', 'MISO_WEB_SERVER_URL', 'value', variables('misoPublicUrl')), createObject('name', 'MISO_CONTROLLER_URL', 'value', variables('misoInternalUrl')), createObject('name', 'MISO_RELATIVE_PATH', 'value', variables('misoVdirValue')), createObject('name', 'CONTROLLER_BASE_URL', 'value', if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))), createObject('name', 'AZURE_SUBSCRIPTION_ID', 'value', subscription().subscriptionId), createObject('name', 'TENANT_ID', 'value', subscription().tenantId), createObject('name', 'AZURE_RESOURCE_GROUP_NAME', 'value', parameters('resourceGroupName')), createObject('name', 'INFRASTRUCTURE_NAME', 'value', parameters('prefix')), createObject('name', 'ENTRA_ID_CLIENT_ID', 'value', parameters('entraIdClientId')), createObject('name', 'ENTRA_ID_CLIENT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=entra-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENTRA_ID_TENANT_ID', 'value', parameters('entraIdTenantId')), createObject('name', 'MISO_CLIENTID', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-miso-clientIdKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'MISO_CLIENTSECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=miso-controller-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_BASE_URL', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-base-urlKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_LICENSE_PUBLIC_KEY', 'value', if(empty(parameters('moriLicensePublicKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-license-public-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'MORI_LICENSE_ISSUER', 'value', parameters('moriLicenseIssuer')), createObject('name', 'MORI_CALLBACK_API_KEY', 'value', if(empty(parameters('moriCallbackApiKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-callback-api-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'ENTRA_GRAPH_DELEGATED_REDIRECT_URI', 'value', variables('moriEntraGraphDelegatedRedirectUri')), createObject('name', 'ENTRA_ID_CENTRAL_CALLBACK_URI', 'value', variables('moriEntraCentralCallbackUri')), createObject('name', 'ENTRA_CALLBACK_STATE_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=entra-callback-state-secret)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'DOCKER_ENABLE_CI', 'value', 'true'), createObject('name', 'DOCKER_REGISTRY_SERVER_URL', 'value', if(not(empty(parameters('acrLoginServer'))), format('https://{0}', parameters('acrLoginServer')), '')), createObject('name', 'ONBOARDING_CREATE_PIPELINE_CREDENTIALS', 'value', 'true'), createObject('name', 'BOOTSTRAP_APPKEYS', 'value', parameters('bootstrapAppKeys')), createObject('name', 'LICENSE_JWT', 'value', parameters('licenseJwt')), createObject('name', 'LICENSE_EDITION', 'value', parameters('licenseEdition')), createObject('name', 'ONBOARDING_MODE', 'value', parameters('onboardingMode'))), variables('registryCredentialAppSettings'))]",
3209
+ "appSettings": "[concat(createArray(createObject('name', 'WEBSITES_ENABLE_APP_SERVICE_STORAGE', 'value', 'false'), createObject('name', 'WEBSITES_CONTAINER_START_TIME_LIMIT', 'value', '1800'), createObject('name', 'DATABASE_URL', 'value', variables('databaseUrlAppSettingValue')), createObject('name', 'JWT_SECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-secrets-jwtKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'NODE_ENV', 'value', 'production'), createObject('name', 'LOCATION', 'value', parameters('location')), createObject('name', 'PORT', 'value', '3000'), createObject('name', 'ALLOWED_ORIGINS', 'value', format('http://localhost:*,http://127.0.0.1:*,https://{0}.azurewebsites.net', parameters('name'))), createObject('name', 'WEBSITE_VNET_ROUTE_ALL', 'value', if(parameters('enablePostgresPublicAccess'), '0', '1')), createObject('name', 'WEBSITE_DNS_SERVER', 'value', '168.63.129.16'), createObject('name', 'DATABASELOG_URL', 'value', variables('databaseLogUrlAppSettingValue')), createObject('name', 'KEY_VAULT_ENABLED', 'value', 'true'), createObject('name', 'SECURITY_STORAGE_MODE', 'value', 'keyvault'), createObject('name', 'KEY_VAULT_URL', 'value', format('https://{0}.vault.azure.net/', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'ENCRYPTION_KEY', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-encryption-keyKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'AUTO_CREATE_TABLES', 'value', if(parameters('autoCreateTables'), 'true', 'false')), createObject('name', 'KEYCLOAK_REALM', 'value', parameters('keycloakRealm')), createObject('name', 'KEYCLOAK_CLIENT_ID', 'value', parameters('keycloakClientId')), createObject('name', 'KEYCLOAK_ADMIN_USERNAME', 'value', parameters('keycloakAdminUsername')), createObject('name', 'KEYCLOAK_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-keycloak-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'ONBOARDING_ADMIN_PASSWORD', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-onboarding-admin-password)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'KEYCLOAK_SERVER_URL', 'value', variables('keycloakPublicUrl')), createObject('name', 'KEYCLOAK_INTERNAL_SERVER_URL', 'value', variables('keycloakInternalUrl')), createObject('name', 'KEYCLOAK_TOKEN_TIMEOUT', 'value', '5000'), createObject('name', 'KEYCLOAK_VERIFY_AUDIENCE', 'value', if(parameters('keycloakVerifyAudience'), 'true', 'false')), createObject('name', 'DISABLE_RATE_LIMIT', 'value', variables('shouldDisableRateLimit')), createObject('name', 'SKIP_DB_REDEPLOY', 'value', 'true'), createObject('name', 'MISO_WEB_SERVER_URL', 'value', variables('misoPublicUrl')), createObject('name', 'MISO_CONTROLLER_URL', 'value', variables('misoInternalUrl')), createObject('name', 'MISO_RELATIVE_PATH', 'value', variables('misoVdirValue')), createObject('name', 'CONTROLLER_BASE_URL', 'value', if(not(empty(parameters('misoControllerUrl'))), parameters('misoControllerUrl'), format('https://{0}.azurewebsites.net', parameters('name')))), createObject('name', 'AZURE_SUBSCRIPTION_ID', 'value', subscription().subscriptionId), createObject('name', 'TENANT_ID', 'value', subscription().tenantId), createObject('name', 'DEPLOYMENT', 'value', 'azure'), createObject('name', 'AZURE_RESOURCE_GROUP_NAME', 'value', parameters('resourceGroupName')), createObject('name', 'INFRASTRUCTURE_NAME', 'value', parameters('prefix')), createObject('name', 'ENTRA_ID_TENANT_ID', 'value', parameters('entraIdTenantId')), createObject('name', 'MISO_CLIENTID', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName={1}-miso-clientIdKeyVault)', last(split(parameters('keyVaultId'), '/')), parameters('prefix'))), createObject('name', 'MISO_CLIENTSECRET', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=miso-controller-client-secretKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_BASE_URL', 'value', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-base-urlKeyVault)', last(split(parameters('keyVaultId'), '/')))), createObject('name', 'MORI_LICENSE_PUBLIC_KEY', 'value', if(empty(parameters('moriLicensePublicKey')), '', format('@Microsoft.KeyVault(VaultName={0};SecretName=mori-license-public-keyKeyVault)', last(split(parameters('keyVaultId'), '/'))))), createObject('name', 'MORI_LICENSE_ISSUER', 'value', parameters('moriLicenseIssuer')), createObject('name', 'ENTRA_GRAPH_DELEGATED_REDIRECT_URI', 'value', variables('moriEntraGraphDelegatedRedirectUri')), createObject('name', 'ENTRA_ID_CENTRAL_CALLBACK_URI', 'value', variables('moriEntraCentralCallbackUri')), createObject('name', 'DOCKER_ENABLE_CI', 'value', 'true'), createObject('name', 'DOCKER_REGISTRY_SERVER_URL', 'value', if(not(empty(parameters('acrLoginServer'))), format('https://{0}', parameters('acrLoginServer')), '')), createObject('name', 'ONBOARDING_CREATE_PIPELINE_CREDENTIALS', 'value', 'true'), createObject('name', 'BOOTSTRAP_APPKEYS', 'value', parameters('bootstrapAppKeys')), createObject('name', 'LICENSE_JWT', 'value', parameters('licenseJwt')), createObject('name', 'LICENSE_EDITION', 'value', parameters('licenseEdition')), createObject('name', 'ONBOARDING_MODE', 'value', parameters('onboardingMode')), createObject('name', 'INSTALLATION_CAPACITY_PROFILE', 'value', parameters('capacityProfile'))), variables('registryCredentialAppSettings'))]",
3339
3210
  "vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
3340
3211
  },
3341
3212
  "vnetRouteAllEnabled": "[not(parameters('enablePostgresPublicAccess'))]"
@@ -3365,9 +3236,7 @@
3365
3236
  "enabled": true
3366
3237
  }
3367
3238
  },
3368
- "dependsOn": [
3369
- "[resourceId('Microsoft.Web/sites', parameters('name'))]"
3370
- ]
3239
+ "dependsOn": ["[resourceId('Microsoft.Web/sites', parameters('name'))]"]
3371
3240
  },
3372
3241
  {
3373
3242
  "type": "Microsoft.Web/sites/config",
@@ -3382,9 +3251,7 @@
3382
3251
  "mountPath": "/data"
3383
3252
  }
3384
3253
  },
3385
- "dependsOn": [
3386
- "[resourceId('Microsoft.Web/sites', parameters('name'))]"
3387
- ]
3254
+ "dependsOn": ["[resourceId('Microsoft.Web/sites', parameters('name'))]"]
3388
3255
  }
3389
3256
  ],
3390
3257
  "outputs": {
@@ -3445,7 +3312,7 @@
3445
3312
  "_generator": {
3446
3313
  "name": "bicep",
3447
3314
  "version": "0.47.16.16243",
3448
- "templateHash": "1560535279661158869"
3315
+ "templateHash": "7505559434659026911"
3449
3316
  }
3450
3317
  },
3451
3318
  "parameters": {
@@ -3463,8 +3330,28 @@
3463
3330
  "metadata": {
3464
3331
  "description": "Object IDs (principalId) of web apps that use Key Vault references"
3465
3332
  }
3333
+ },
3334
+ "grantWorkloadVaultAccess": {
3335
+ "type": "bool",
3336
+ "defaultValue": false,
3337
+ "metadata": {
3338
+ "description": "Grant workload web apps direct Key Vault access. Default false: workloads fetch parameters through Miso. Set true only to restore the pre-227.6 behaviour for an installation that needs it."
3339
+ }
3340
+ },
3341
+ "platformPrincipalIds": {
3342
+ "type": "array",
3343
+ "items": {
3344
+ "type": "string"
3345
+ },
3346
+ "defaultValue": [],
3347
+ "metadata": {
3348
+ "description": "Object IDs of platform principals (Miso, Keycloak) that always retain vault access"
3349
+ }
3466
3350
  }
3467
3351
  },
3352
+ "variables": {
3353
+ "effectivePrincipalIds": "[if(parameters('grantWorkloadVaultAccess'), union(parameters('webAppPrincipalIds'), parameters('platformPrincipalIds')), parameters('platformPrincipalIds'))]"
3354
+ },
3468
3355
  "resources": {
3469
3356
  "kv": {
3470
3357
  "existing": true,
@@ -3480,16 +3367,12 @@
3480
3367
  "copy": [
3481
3368
  {
3482
3369
  "name": "accessPolicies",
3483
- "count": "[length(parameters('webAppPrincipalIds'))]",
3370
+ "count": "[length(variables('effectivePrincipalIds'))]",
3484
3371
  "input": {
3485
3372
  "tenantId": "[subscription().tenantId]",
3486
- "objectId": "[parameters('webAppPrincipalIds')[copyIndex('accessPolicies')]]",
3373
+ "objectId": "[variables('effectivePrincipalIds')[copyIndex('accessPolicies')]]",
3487
3374
  "permissions": {
3488
- "secrets": [
3489
- "get",
3490
- "list",
3491
- "set"
3492
- ],
3375
+ "secrets": ["get", "list", "set"],
3493
3376
  "keys": [],
3494
3377
  "certificates": [],
3495
3378
  "storage": []
@@ -3719,9 +3602,6 @@
3719
3602
  "encryptionKey": {
3720
3603
  "value": "[reference(resourceId('Microsoft.Resources/deployments', 'bootstrapSecrets'), '2025-04-01').outputs.encryptionKey.value]"
3721
3604
  },
3722
- "entraCallbackStateSecret": {
3723
- "value": "[parameters('entraCallbackStateSecret')]"
3724
- },
3725
3605
  "entraIdClientSecret": {
3726
3606
  "value": "[parameters('entraIdClientSecret')]"
3727
3607
  }
@@ -3733,7 +3613,7 @@
3733
3613
  "_generator": {
3734
3614
  "name": "bicep",
3735
3615
  "version": "0.47.16.16243",
3736
- "templateHash": "9634353332764264230"
3616
+ "templateHash": "445562478593270876"
3737
3617
  }
3738
3618
  },
3739
3619
  "parameters": {
@@ -3802,13 +3682,6 @@
3802
3682
  "description": "MISO Client Secret (auto-generated if not provided)"
3803
3683
  }
3804
3684
  },
3805
- "entraCallbackStateSecret": {
3806
- "type": "securestring",
3807
- "defaultValue": "",
3808
- "metadata": {
3809
- "description": "Shared HMAC secret for Entra consent OAuth state (ENTRA_CALLBACK_STATE_SECRET). Generated when empty."
3810
- }
3811
- },
3812
3685
  "entraIdClientSecret": {
3813
3686
  "type": "securestring",
3814
3687
  "defaultValue": "",
@@ -3829,17 +3702,9 @@
3829
3702
  "metadata": {
3830
3703
  "description": "Mori base URL, stored so App Service can reference it instead of holding a literal."
3831
3704
  }
3832
- },
3833
- "moriCallbackApiKey": {
3834
- "type": "securestring",
3835
- "defaultValue": "",
3836
- "metadata": {
3837
- "description": "Mori callback API key, shared by the Miso Controller and Mori."
3838
- }
3839
3705
  }
3840
3706
  },
3841
3707
  "variables": {
3842
- "resolvedEntraCallbackStateSecret": "[if(not(empty(parameters('entraCallbackStateSecret'))), parameters('entraCallbackStateSecret'), format('ecs_{0}{1}', uniqueString(resourceGroup().id, parameters('prefix'), 'entra-callback-state-v1'), uniqueString(parameters('prefix'), 'entra-cb-b')))]",
3843
3708
  "resolvedEntraIdClientSecret": "[if(not(empty(parameters('entraIdClientSecret'))), parameters('entraIdClientSecret'), format('PLACEHOLDER_ENTRA_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]",
3844
3709
  "misoWebAppOrigin": "[if(endsWith(parameters('misoWebAppUrl'), '/'), substring(parameters('misoWebAppUrl'), 0, max(0, sub(length(parameters('misoWebAppUrl')), 1))), parameters('misoWebAppUrl'))]",
3845
3710
  "misoVdirSegment": "[if(or(equals(parameters('misoVdirPublic'), ''), equals(parameters('misoVdirPublic'), '/')), '', if(startsWith(parameters('misoVdirPublic'), '/'), parameters('misoVdirPublic'), format('/{0}', parameters('misoVdirPublic'))))]",
@@ -3931,14 +3796,6 @@
3931
3796
  "value": "[if(not(empty(parameters('misoClientSecret'))), parameters('misoClientSecret'), format('PLACEHOLDER_CLIENT_SECRET_MUST_BE_REPLACED_{0}', uniqueString(resourceGroup().id, parameters('prefix'))))]"
3932
3797
  }
3933
3798
  },
3934
- {
3935
- "type": "Microsoft.KeyVault/vaults/secrets",
3936
- "apiVersion": "2023-07-01",
3937
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'entra-callback-state-secret')]",
3938
- "properties": {
3939
- "value": "[variables('resolvedEntraCallbackStateSecret')]"
3940
- }
3941
- },
3942
3799
  {
3943
3800
  "type": "Microsoft.KeyVault/vaults/secrets",
3944
3801
  "apiVersion": "2023-07-01",
@@ -3964,15 +3821,6 @@
3964
3821
  "properties": {
3965
3822
  "value": "[parameters('moriBaseUrl')]"
3966
3823
  }
3967
- },
3968
- {
3969
- "condition": "[not(empty(parameters('moriCallbackApiKey')))]",
3970
- "type": "Microsoft.KeyVault/vaults/secrets",
3971
- "apiVersion": "2023-07-01",
3972
- "name": "[format('{0}/{1}', parameters('keyVaultName'), 'mori-callback-api-keyKeyVault')]",
3973
- "properties": {
3974
- "value": "[parameters('moriCallbackApiKey')]"
3975
- }
3976
3824
  }
3977
3825
  ]
3978
3826
  }
@@ -4442,4 +4290,4 @@
4442
4290
  "value": "[if(variables('createAzureOpenAI'), '', if(parameters('enableAzureOpenAI'), format('Azure OpenAI is not offered in {0}, and it is not relocated to another region automatically. The installation is complete without it: create the account in a supported region yourself, or supply an existing endpoint as an external provider.', variables('deploymentLocation')), 'Azure OpenAI creation was disabled for this installation (enableAzureOpenAI=false).'))]"
4443
4291
  }
4444
4292
  }
4445
- }
4293
+ }