@aifabrix/builder 2.58.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 (120) hide show
  1. package/lib/agent-kit/codex-app-server.js +44 -0
  2. package/lib/agent-kit/git-identity.js +180 -0
  3. package/lib/agent-kit/init.js +4 -17
  4. package/lib/agent-kit/session-report.js +15 -10
  5. package/lib/agent-kit/setup-auth.js +131 -0
  6. package/lib/agent-kit/setup-context.js +118 -0
  7. package/lib/agent-kit/setup-github.js +70 -0
  8. package/lib/agent-kit/setup-managed.js +79 -0
  9. package/lib/agent-kit/setup-process.js +42 -0
  10. package/lib/agent-kit/setup-session.js +53 -0
  11. package/lib/agent-kit/setup-state.js +52 -0
  12. package/lib/agent-kit/setup-workspace.js +113 -0
  13. package/lib/agent-kit/setup.js +87 -0
  14. package/lib/agent-kit/start.js +48 -3
  15. package/lib/agent-kit/tmux-sessions.js +20 -3
  16. package/lib/api/dev.api.js +1 -1
  17. package/lib/api/miso-health.api.js +26 -0
  18. package/lib/api/role-assistant-test-job.api.js +60 -0
  19. package/lib/api/types/dev.types.js +3 -3
  20. package/lib/api/work-search.api.js +13 -6
  21. package/lib/app/deploy.js +8 -103
  22. package/lib/app/show-display.js +1 -0
  23. package/lib/app/show-online.js +15 -0
  24. package/lib/build/standard-docker-build.js +4 -1
  25. package/lib/cli/index.js +4 -0
  26. package/lib/cli/setup-app.js +14 -1
  27. package/lib/cli/setup-dev-path-commands.js +4 -0
  28. package/lib/cli/setup-dev.js +7 -4
  29. package/lib/cli/setup-help.js +86 -0
  30. package/lib/cli/setup-onboarding.js +37 -0
  31. package/lib/cli/setup-utility-repair.js +7 -5
  32. package/lib/cli/setup-utility.js +24 -1
  33. package/lib/commands/agent-kit-help.js +21 -7
  34. package/lib/commands/agent-kit-sessions.js +126 -0
  35. package/lib/commands/agent-kit-setup.js +44 -0
  36. package/lib/commands/agent-kit.js +5 -79
  37. package/lib/commands/dev-init.js +21 -23
  38. package/lib/commands/dev-refresh.js +2 -2
  39. package/lib/commands/governance-verify-external.js +12 -5
  40. package/lib/commands/repair-datasource.js +9 -9
  41. package/lib/commands/repair.js +45 -8
  42. package/lib/commands/role-assistant.js +7 -0
  43. package/lib/commands/upload-qualification-client.js +56 -11
  44. package/lib/commands/upload-qualification-poll.js +51 -22
  45. package/lib/commands/wizard-dataplane.js +16 -52
  46. package/lib/core/env-platform-expand.js +93 -0
  47. package/lib/core/secrets-env-content.js +37 -3
  48. package/lib/datasource/datasource-validate-summary.js +8 -5
  49. package/lib/datasource/sync-defaults.js +53 -0
  50. package/lib/deployment/installation/azure-infra-stage.js +13 -1
  51. package/lib/deployment/installation/azure-preflight.js +13 -2
  52. package/lib/deployment/installation/azure-readiness.js +24 -2
  53. package/lib/deployment/installation/environment-auth.js +60 -20
  54. package/lib/deployment/installation/environment-stage.js +9 -5
  55. package/lib/deployment/installation/infra-catalog.js +10 -7
  56. package/lib/deployment/installation/infra-manifest.js +5 -0
  57. package/lib/deployment/installation/registry-auth-mode.js +33 -10
  58. package/lib/deployment/marketplace-environment.js +26 -1
  59. package/lib/generator/builders.js +17 -0
  60. package/lib/generator/helpers.js +23 -2
  61. package/lib/generator/index.js +33 -18
  62. package/lib/integration-definition/apply.js +2 -2
  63. package/lib/internal/fs-real-sync.js +4 -1
  64. package/lib/programmatic/bearer-auth.js +3 -62
  65. package/lib/programmatic/builder-api-startup.js +51 -0
  66. package/lib/programmatic/builder-miso-runtime.js +167 -0
  67. package/lib/programmatic/openapi-descriptions.js +3 -3
  68. package/lib/programmatic/openapi-schema-descriptions-core.js +3 -3
  69. package/lib/programmatic/openapi-spec.js +2 -1
  70. package/lib/programmatic/route-handler-map.js +3 -2
  71. package/lib/role-assistant/test-cases-search.js +3 -0
  72. package/lib/role-assistant/test-job-runner.js +125 -0
  73. package/lib/role-assistant/test-runner-search.js +44 -2
  74. package/lib/schema/application-schema.json +193 -2
  75. package/lib/schema/environment-deploy-request.schema.json +1 -1
  76. package/lib/schema/external-datasource.schema.json +20 -5
  77. package/lib/schema/infra-parameter.schema.json +140 -34
  78. package/lib/schema/infra.parameter.yaml +30 -29
  79. package/lib/schema/infrastructure-schema.json +133 -14
  80. package/lib/schema/installation-environment.schema.json +1 -1
  81. package/lib/schema/wizard-config.schema.json +1 -1
  82. package/lib/utils/compose-generate-docker-compose.js +12 -0
  83. package/lib/utils/config-paths.js +24 -29
  84. package/lib/utils/config-registry-preference.js +13 -6
  85. package/lib/utils/dev-init-ssh-merge.js +5 -4
  86. package/lib/utils/dev-user-groups.js +2 -1
  87. package/lib/utils/docker-build.js +29 -8
  88. package/lib/utils/docker-daemon-tls-ca.js +2 -2
  89. package/lib/utils/docker-manifest-public-port.js +36 -0
  90. package/lib/utils/error-formatters/validation-errors.js +25 -5
  91. package/lib/utils/help-builder.js +4 -3
  92. package/lib/utils/platform-resolution.js +226 -0
  93. package/lib/utils/resolve-docker-image-ref.js +8 -3
  94. package/lib/utils/token-manager.js +29 -36
  95. package/package.json +4 -3
  96. package/templates/README.md +2 -1
  97. package/templates/agent-kit/agent-kit.yaml +4 -1
  98. package/templates/agent-kit/instructions/AGENTKIT.md +40 -3
  99. package/templates/agent-kit/instructions/root.AGENTS.md +42 -1
  100. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +33 -1
  101. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/delivery-verdict.js +176 -0
  102. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +3 -0
  103. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +10 -3
  104. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +22 -0
  105. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +21 -0
  106. package/templates/agent-kit/skills/shared/feedback.md +31 -0
  107. package/templates/agent-kit/skills/shared/hosts.md +35 -7
  108. package/templates/agent-kit/skills/shared/status.md +85 -0
  109. package/templates/agent-kit/workspace/BUILDER_IMPROVEMENT_FINDINGS.md +27 -0
  110. package/templates/agent-kit/workspace/README.md +14 -1
  111. package/templates/applications/builder-api/application.yaml +1 -1
  112. package/templates/applications/dataplane/application.yaml +30 -2
  113. package/templates/applications/dataplane/env.template +37 -4
  114. package/templates/applications/miso-controller/application.yaml +24 -1
  115. package/templates/applications/miso-controller/env.template +22 -35
  116. package/templates/external-system/external-datasource.yaml.hbs +7 -6
  117. package/templates/marketplace/main.json +281 -75
  118. package/templates/python/Dockerfile.hbs +2 -0
  119. package/templates/typescript/Dockerfile.hbs +2 -0
  120. package/templates/typescript/docker-compose.hbs +12 -0
@@ -7,12 +7,12 @@
7
7
  "key": "application-schema",
8
8
  "name": "Application Configuration Schema",
9
9
  "description": "JSON schema for validating AI Fabrix application configuration files",
10
- "version": "1.7.0",
10
+ "version": "1.9.0",
11
11
  "type": "schema",
12
12
  "category": "infrastructure",
13
13
  "author": "AI Fabrix Team",
14
14
  "createdAt": "2024-01-01T00:00:00Z",
15
- "updatedAt": "2026-09-16T00:00:00Z",
15
+ "updatedAt": "2026-09-23T00:00:00Z",
16
16
  "compatibility": {
17
17
  "minVersion": "1.0.0",
18
18
  "maxVersion": "2.0.0",
@@ -30,6 +30,27 @@
30
30
  "external-datasource.schema.json"
31
31
  ],
32
32
  "changelog": [
33
+ {
34
+ "version": "1.9.0",
35
+ "date": "2026-09-23T00:00:00Z",
36
+ "breaking": false,
37
+ "changes": [
38
+ "Added optional platforms: the target Azure resource group is matched against resource patterns to yield {platform} and {platform.name}, and that entry's configuration resolves from them.",
39
+ "Added optional environments: per-environment configuration layered over the platform match, overriding by name.",
40
+ "Added optional portalInput.visible (default true) so a resolved or derived value stays out of the portal form.",
41
+ "Both sections are optional and independent; manifests without them are unchanged."
42
+ ]
43
+ },
44
+ {
45
+ "version": "1.8.0",
46
+ "date": "2026-09-21T00:00:00Z",
47
+ "changes": [
48
+ "Added optional build.target: the multi-stage Dockerfile stage to build (docker build --target). Omitted, Docker builds the final stage as before, so existing manifests are unaffected. Lets one Dockerfile and one source tree produce more than one image.",
49
+ "Added optional top-level runAsRoot: run the container as the image user (root) rather than the invoking host user. Absent or false keeps the existing behavior. Only for an application that administers its own operating system, such as creating Linux accounts or running sshd.",
50
+ "Added optional top-level additionalPorts: extra container ports to publish beside the main port, for an application serving a second protocol such as SSH from the same container. Each host port is derived as hostPort + developerId * 100, the same formula as the main port. A base below 1024 is permitted so a well-known port keeps its number. Absent keeps the existing single-port behavior."
51
+ ],
52
+ "breaking": false
53
+ },
33
54
  {
34
55
  "version": "1.7.0",
35
56
  "date": "2026-09-16T00:00:00Z",
@@ -210,6 +231,124 @@
210
231
  "type": "boolean",
211
232
  "description": "Whether application requires storage.Physical storage is mapped to /mnt/data/. Blob storage is mapped to SMB File share /data/{app-key}/."
212
233
  },
234
+ "platforms": {
235
+ "type": "array",
236
+ "description": "Platform resolution: the target Azure resource group is matched against these entries, yielding {platform} and {platform.name}. Optional and independent of environments.",
237
+ "items": {
238
+ "type": "object",
239
+ "required": ["resource", "name", "configuration"],
240
+ "additionalProperties": false,
241
+ "properties": {
242
+ "resource": {
243
+ "type": "string",
244
+ "description": "Resource-group pattern; {platform} marks the platform segment and * captures a name segment",
245
+ "minLength": 1
246
+ },
247
+ "name": {
248
+ "type": "string",
249
+ "description": "Platform name: a literal, or * to take the captured segment",
250
+ "minLength": 1
251
+ },
252
+ "options": {
253
+ "type": "array",
254
+ "description": "Allowed platform values; required when resource contains {platform}",
255
+ "minItems": 1,
256
+ "items": { "type": "string", "minLength": 1 }
257
+ },
258
+ "platform": {
259
+ "type": "string",
260
+ "description": "Declared platform for a resource pattern with no {platform} token; mutually exclusive with options",
261
+ "minLength": 1
262
+ },
263
+ "configuration": {
264
+ "type": "array",
265
+ "description": "Values resolved when this platform matches",
266
+ "items": {
267
+ "type": "object",
268
+ "required": ["name", "value"],
269
+ "additionalProperties": false,
270
+ "properties": {
271
+ "name": {
272
+ "type": "string",
273
+ "description": "Configuration variable name",
274
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
275
+ },
276
+ "value": {
277
+ "type": "string",
278
+ "description": "Literal, or a value containing {platform}, {platform.name} or {resourceGroup} tokens"
279
+ },
280
+ "location": {
281
+ "type": "string",
282
+ "description": "Where the value is stored",
283
+ "enum": ["variable", "keyvault"]
284
+ },
285
+ "required": {
286
+ "type": "boolean",
287
+ "description": "Whether this configuration is required"
288
+ },
289
+ "category": {
290
+ "type": "string",
291
+ "description": "Optional UI grouping label for portal/deployment wizard Configuration tab",
292
+ "minLength": 1,
293
+ "maxLength": 100
294
+ }
295
+ }
296
+ }
297
+ }
298
+ }
299
+ }
300
+ },
301
+ "environments": {
302
+ "type": "array",
303
+ "description": "Per-environment values layered over the platform match, overriding by name. Optional and independent of platforms.",
304
+ "items": {
305
+ "type": "object",
306
+ "required": ["environment", "configuration"],
307
+ "additionalProperties": false,
308
+ "properties": {
309
+ "environment": {
310
+ "type": "string",
311
+ "description": "Deployment environment key (for example miso, dev, tst, pro)",
312
+ "minLength": 1
313
+ },
314
+ "configuration": {
315
+ "type": "array",
316
+ "description": "Values resolved for this environment",
317
+ "items": {
318
+ "type": "object",
319
+ "required": ["name", "value"],
320
+ "additionalProperties": false,
321
+ "properties": {
322
+ "name": {
323
+ "type": "string",
324
+ "description": "Configuration variable name",
325
+ "pattern": "^[A-Z_][A-Z0-9_]*$"
326
+ },
327
+ "value": {
328
+ "type": "string",
329
+ "description": "Literal, or a value containing {platform}, {platform.name} or {resourceGroup} tokens"
330
+ },
331
+ "location": {
332
+ "type": "string",
333
+ "description": "Where the value is stored",
334
+ "enum": ["variable", "keyvault"]
335
+ },
336
+ "required": {
337
+ "type": "boolean",
338
+ "description": "Whether this configuration is required"
339
+ },
340
+ "category": {
341
+ "type": "string",
342
+ "description": "Optional UI grouping label for portal/deployment wizard Configuration tab",
343
+ "minLength": 1,
344
+ "maxLength": 100
345
+ }
346
+ }
347
+ }
348
+ }
349
+ }
350
+ }
351
+ },
213
352
  "configuration": {
214
353
  "type": "array",
215
354
  "description": "Core application configuration",
@@ -274,6 +413,10 @@
274
413
  "type": "boolean",
275
414
  "description": "Whether to mask the input (for passwords)"
276
415
  },
416
+ "visible": {
417
+ "type": "boolean",
418
+ "description": "Whether the portal shows this input. Default true; false keeps a resolved or derived value out of the form."
419
+ },
277
420
  "validation": {
278
421
  "type": "object",
279
422
  "properties": {
@@ -413,6 +556,10 @@
413
556
  "type": "boolean",
414
557
  "description": "Whether to mask the input (for passwords)"
415
558
  },
559
+ "visible": {
560
+ "type": "boolean",
561
+ "description": "Whether the portal shows this input. Default true; false keeps a resolved or derived value out of the form."
562
+ },
416
563
  "validation": {
417
564
  "type": "object",
418
565
  "properties": {
@@ -806,6 +953,43 @@
806
953
  "minLength": 1,
807
954
  "maxLength": 200
808
955
  },
956
+ "additionalPorts": {
957
+ "type": "array",
958
+ "description": "Extra container ports to publish beside the main port. For an application that serves a second protocol from the same container, such as SSH alongside HTTP. Each host port is derived the same way as the main one: hostPort + developerId * 100 (developer id 0 keeps hostPort).",
959
+ "maxItems": 5,
960
+ "items": {
961
+ "type": "object",
962
+ "required": ["name", "containerPort", "hostPort"],
963
+ "additionalProperties": false,
964
+ "properties": {
965
+ "name": {
966
+ "type": "string",
967
+ "description": "What the port is for, e.g. 'ssh'. Used in generated compose comments and diagnostics.",
968
+ "pattern": "^[a-z][a-z0-9-]*$",
969
+ "minLength": 1,
970
+ "maxLength": 30
971
+ },
972
+ "containerPort": {
973
+ "type": "integer",
974
+ "description": "Port the process listens on inside the container.",
975
+ "minimum": 1,
976
+ "maximum": 65535
977
+ },
978
+ "hostPort": {
979
+ "type": "integer",
980
+ "description": "Base host port. The published port is hostPort + developerId * 100, so developers on one host do not collide. A base below 1024 is allowed so a well-known port can keep its number (SSH as 22, giving 122 for developer 1); the container engine binds it, not the application.",
981
+ "minimum": 1,
982
+ "maximum": 65535
983
+ }
984
+ }
985
+ }
986
+ },
987
+ "runAsRoot": {
988
+ "type": "boolean",
989
+ "default": false,
990
+ "description": "Run the container as the image user (root) instead of the invoking host user. Only for an application that administers its own operating system, such as creating Linux accounts or running sshd; files it writes to a bind mount will be root-owned. Absent or false keeps the existing behavior.",
991
+ "examples": [false]
992
+ },
809
993
  "runtimeVersion": {
810
994
  "type": "object",
811
995
  "description": "Runtime version configuration",
@@ -886,6 +1070,13 @@
886
1070
  "description": "Dockerfile name (empty or missing = use auto-generated template)",
887
1071
  "pattern": "^[^/].*"
888
1072
  },
1073
+ "target": {
1074
+ "type": "string",
1075
+ "description": "Multi-stage Dockerfile stage to build (docker build --target). Omit to build the final stage, which is the default. Lets one Dockerfile and one source tree produce more than one image, e.g. an application shipped in two installation variants.",
1076
+ "minLength": 1,
1077
+ "maxLength": 100,
1078
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]*$"
1079
+ },
889
1080
  "remoteSyncPath": {
890
1081
  "type": "string",
891
1082
  "description": "Relative path under user-mutagen-folder for remote sync and Docker -v; when unset, defaults to dev/<appKey>. No leading slash.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://raw.githubusercontent.com/esystemsdev/aifabrix-builder/refs/heads/main/lib/schema/environment-deploy-request.schema.json",
3
+ "$id": "aifabrix://schema/environment-deploy-request.schema.json",
4
4
  "title": "Environment Deploy Request",
5
5
  "description": "Request body for POST /api/v1/environments/{envKey}/deploy",
6
6
  "type": "object",
@@ -7,12 +7,12 @@
7
7
  "key":"external-datasource-schema",
8
8
  "name":"External Data Source Configuration Schema",
9
9
  "description":"JSON schema for validating ExternalDataSource configuration files",
10
- "version":"2.9.11",
10
+ "version":"2.9.12",
11
11
  "type":"schema",
12
12
  "category":"integration",
13
13
  "author":"AI Fabrix Team",
14
14
  "createdAt":"2024-01-01T00:00:00Z",
15
- "updatedAt":"2026-08-30T00:00:00Z",
15
+ "updatedAt":"2026-09-17T00:00:00Z",
16
16
  "compatibility":{
17
17
  "minVersion":"1.0.0",
18
18
  "maxVersion":"3.0.0",
@@ -31,6 +31,15 @@
31
31
  "external-system.schema.json"
32
32
  ],
33
33
  "changelog":[
34
+ {
35
+ "version":"2.9.12",
36
+ "date":"2026-09-17T00:00:00Z",
37
+ "changes":[
38
+ "Added cipOperation.shape enum value 'upsert' (manifest-declared only; composes the datasource's standard create + update via fetch.source datasource; existence-resolved branch with fail-closed per-action permissions). COM writeShape and published x-ai-intent gain the same value. 543 O-SHAPE updated.",
39
+ "Added optional sync.enabled (default true) to disable scheduled, manual, webhook, and syncBridge synchronization without disabling datasource reads. Added @monthly as the authoring default for new full-set schedules; existing schedule-less manifests remain valid and are not migrated. CIP $defs unchanged (543 visual N/A)."
40
+ ],
41
+ "breaking":false
42
+ },
34
43
  {
35
44
  "version":"2.9.11",
36
45
  "date":"2026-08-30T00:00:00Z",
@@ -862,6 +871,11 @@
862
871
  "type":"object",
863
872
  "description":"Record synchronization rules.",
864
873
  "properties":{
874
+ "enabled":{
875
+ "type":"boolean",
876
+ "description":"Whether synchronization is enabled for this datasource. False blocks scheduled, manual, webhook, and syncBridge synchronization while preserving normal datasource access.",
877
+ "default":true
878
+ },
865
879
  "mode":{
866
880
  "type":"string",
867
881
  "enum":[
@@ -874,6 +888,7 @@
874
888
  "schedule":{
875
889
  "type":"string",
876
890
  "description":"Cron for full-set (sync all) jobs. Supports 5-field cron syntax or @hourly/@daily/@weekly/@monthly.",
891
+ "default":"@monthly",
877
892
  "pattern":"^(@hourly|@daily|@weekly|@monthly|([0-9*/,-]+\\s+){4}[0-9*/,-]+)$"
878
893
  },
879
894
  "batchSize":{
@@ -2547,9 +2562,10 @@
2547
2562
  "enum":[
2548
2563
  "create",
2549
2564
  "update",
2550
- "delete"
2565
+ "delete",
2566
+ "upsert"
2551
2567
  ],
2552
- "description":"Manifest classification for custom operations when fetch step inference is insufficient. Resolved by resolve_cip_write_shape (precedence over fetch inference) and drives x-ai-intent, x-ai-sideEffects, and x-ai-contract.riskLevel on published OpenAPI. shape delete marks the operation as dangerous for agent policy (with core capability delete)."
2568
+ "description":"Manifest classification for custom operations when fetch step inference is insufficient. Resolved by resolve_cip_write_shape (precedence over fetch inference) and drives x-ai-intent, x-ai-sideEffects, and x-ai-contract.riskLevel on published OpenAPI. shape delete marks the operation as dangerous for agent policy (with core capability delete). shape upsert is never inferred: the operation must compose exactly this datasource's standard create and update operations as two fetch.source 'datasource' steps; at execution the generic CIP branch resolves record existence from validation.repeatingValues reject fields and runs exactly one half, enforcing that half's permissions fail-closed (no cross-action fallback)."
2553
2569
  },
2554
2570
  "steps":{
2555
2571
  "type":"array",
@@ -3467,4 +3483,3 @@
3467
3483
  },
3468
3484
  "additionalProperties":false
3469
3485
  }
3470
-
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://aifabrix.dev/schemas/infra-parameter.schema.json",
3
+ "$id": "aifabrix://schema/infra-parameter.schema.json",
4
4
  "title": "Infra parameter catalog",
5
5
  "type": "object",
6
- "required": ["version", "parameters"],
6
+ "required": [
7
+ "version",
8
+ "parameters"
9
+ ],
7
10
  "additionalProperties": false,
8
11
  "properties": {
9
12
  "version": {
@@ -12,7 +15,10 @@
12
15
  },
13
16
  "standardUpInfraEnsureKeys": {
14
17
  "type": "array",
15
- "items": { "type": "string", "minLength": 1 },
18
+ "items": {
19
+ "type": "string",
20
+ "minLength": 1
21
+ },
16
22
  "description": "Extra keys always merged on up-infra (e.g. default miso-controller DB pair when no workspace template lists them)."
17
23
  },
18
24
  "defaults": {
@@ -20,28 +26,47 @@
20
26
  "additionalProperties": false,
21
27
  "description": "Default values for {{adminPassword}}, {{adminEmail}}, {{userPassword}} in literal generator values; overridden by aifabrix up-infra flags.",
22
28
  "properties": {
23
- "adminEmail": { "type": "string" },
24
- "adminPassword": { "type": "string" },
25
- "userPassword": { "type": "string" }
29
+ "adminEmail": {
30
+ "type": "string"
31
+ },
32
+ "adminPassword": {
33
+ "type": "string"
34
+ },
35
+ "userPassword": {
36
+ "type": "string"
37
+ }
26
38
  }
27
39
  },
28
40
  "parameters": {
29
41
  "type": "array",
30
- "items": { "$ref": "#/definitions/parameterEntry" }
42
+ "items": {
43
+ "$ref": "#/definitions/parameterEntry"
44
+ }
31
45
  }
32
46
  },
33
47
  "definitions": {
34
48
  "ensureOnEnum": {
35
49
  "type": "string",
36
- "enum": ["upInfra", "resolveApp", "appRegister"]
50
+ "enum": [
51
+ "upInfra",
52
+ "resolveApp",
53
+ "appRegister"
54
+ ]
37
55
  },
38
56
  "scopeEnum": {
39
57
  "type": "string",
40
- "enum": ["infra", "app", "shared-service", "system"]
58
+ "enum": [
59
+ "infra",
60
+ "app",
61
+ "shared-service",
62
+ "system"
63
+ ]
41
64
  },
42
65
  "generator": {
43
66
  "type": "object",
44
- "required": ["type"],
67
+ "required": [
68
+ "type"
69
+ ],
45
70
  "additionalProperties": false,
46
71
  "properties": {
47
72
  "type": {
@@ -67,17 +92,47 @@
67
92
  "maximum": 512,
68
93
  "description": "For randomAlphanumeric: character count (default 32). For password: default 8. Charset [a-zA-Z0-9]."
69
94
  },
70
- "pairId": { "type": "string", "minLength": 1 },
71
- "part": { "type": "string", "enum": ["private", "public"] }
95
+ "pairId": {
96
+ "type": "string",
97
+ "minLength": 1
98
+ },
99
+ "part": {
100
+ "type": "string",
101
+ "enum": [
102
+ "private",
103
+ "public"
104
+ ]
105
+ }
72
106
  },
73
107
  "allOf": [
74
108
  {
75
- "if": { "properties": { "type": { "const": "literal" } } },
76
- "then": { "required": ["value"] }
109
+ "if": {
110
+ "properties": {
111
+ "type": {
112
+ "const": "literal"
113
+ }
114
+ }
115
+ },
116
+ "then": {
117
+ "required": [
118
+ "value"
119
+ ]
120
+ }
77
121
  },
78
122
  {
79
- "if": { "properties": { "type": { "const": "rsaKeyPair" } } },
80
- "then": { "required": ["pairId", "part"] }
123
+ "if": {
124
+ "properties": {
125
+ "type": {
126
+ "const": "rsaKeyPair"
127
+ }
128
+ }
129
+ },
130
+ "then": {
131
+ "required": [
132
+ "pairId",
133
+ "part"
134
+ ]
135
+ }
81
136
  }
82
137
  ]
83
138
  },
@@ -85,19 +140,32 @@
85
140
  "type": "object",
86
141
  "additionalProperties": false,
87
142
  "properties": {
88
- "vaultSecretName": { "type": "string" },
89
- "vaultSecretNamePattern": { "type": "string" },
143
+ "vaultSecretName": {
144
+ "type": "string"
145
+ },
146
+ "vaultSecretNamePattern": {
147
+ "type": "string"
148
+ },
90
149
  "legacyVaultSecretNames": {
91
150
  "type": "array",
92
- "items": { "type": "string", "minLength": 1 },
151
+ "items": {
152
+ "type": "string",
153
+ "minLength": 1
154
+ },
93
155
  "uniqueItems": true
94
156
  },
95
- "notes": { "type": "string" }
157
+ "notes": {
158
+ "type": "string"
159
+ }
96
160
  }
97
161
  },
98
162
  "parameterEntry": {
99
163
  "type": "object",
100
- "required": ["scope", "generator", "ensureOn"],
164
+ "required": [
165
+ "scope",
166
+ "generator",
167
+ "ensureOn"
168
+ ],
101
169
  "additionalProperties": false,
102
170
  "properties": {
103
171
  "key": {
@@ -108,8 +176,13 @@
108
176
  "type": "string",
109
177
  "minLength": 1
110
178
  },
111
- "category": { "type": "string", "minLength": 1 },
112
- "sensitive": { "type": "boolean" },
179
+ "category": {
180
+ "type": "string",
181
+ "minLength": 1
182
+ },
183
+ "sensitive": {
184
+ "type": "boolean"
185
+ },
113
186
  "valueSource": {
114
187
  "type": "string",
115
188
  "enum": [
@@ -120,31 +193,64 @@
120
193
  "optionalInput"
121
194
  ]
122
195
  },
123
- "requiredOnSystemOnboarding": { "type": "boolean" },
124
- "ownerAppKey": { "type": "string", "minLength": 1 },
196
+ "requiredOnSystemOnboarding": {
197
+ "type": "boolean"
198
+ },
199
+ "ownerAppKey": {
200
+ "type": "string",
201
+ "minLength": 1
202
+ },
125
203
  "sharedWithAppKeys": {
126
204
  "type": "array",
127
- "items": { "type": "string", "minLength": 1 },
205
+ "items": {
206
+ "type": "string",
207
+ "minLength": 1
208
+ },
128
209
  "minItems": 1,
129
210
  "uniqueItems": true,
130
211
  "description": "Named applications, other than ownerAppKey, that may read this value."
131
212
  },
132
- "scope": { "$ref": "#/definitions/scopeEnum" },
133
- "generator": { "$ref": "#/definitions/generator" },
213
+ "visibility": {
214
+ "type": "array",
215
+ "items": {
216
+ "type": "string"
217
+ },
218
+ "description": "App keys allowed to read this parameter. Canonical field in the Miso catalog that lib/schema/infra.parameter.yaml mirrors; sharedWithAppKeys is the older Builder spelling."
219
+ },
220
+ "scope": {
221
+ "$ref": "#/definitions/scopeEnum"
222
+ },
223
+ "generator": {
224
+ "$ref": "#/definitions/generator"
225
+ },
134
226
  "ensureOn": {
135
227
  "type": "array",
136
228
  "minItems": 1,
137
- "items": { "$ref": "#/definitions/ensureOnEnum" }
229
+ "items": {
230
+ "$ref": "#/definitions/ensureOnEnum"
231
+ }
232
+ },
233
+ "requiredForLocal": {
234
+ "type": "boolean"
235
+ },
236
+ "azure": {
237
+ "$ref": "#/definitions/azureBlock"
138
238
  },
139
- "requiredForLocal": { "type": "boolean" },
140
- "azure": { "$ref": "#/definitions/azureBlock" },
141
- "notes": { "type": "string" }
239
+ "notes": {
240
+ "type": "string"
241
+ }
142
242
  },
143
243
  "allOf": [
144
244
  {
145
245
  "if": {
146
- "required": ["scope"],
147
- "properties": { "scope": { "const": "system" } }
246
+ "required": [
247
+ "scope"
248
+ ],
249
+ "properties": {
250
+ "scope": {
251
+ "const": "system"
252
+ }
253
+ }
148
254
  },
149
255
  "then": {
150
256
  "required": [