@opensoha/contracts 0.1.17 → 0.1.18

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 (268) hide show
  1. package/COMPATIBILITY.md +45 -0
  2. package/README.md +37 -0
  3. package/auth/catalog_generated.go +2 -2
  4. package/auth/outpost_headers.go +17 -0
  5. package/auth/outpost_headers_test.go +16 -0
  6. package/auth/permission-catalog.json +383 -1
  7. package/compat/consumer-revisions.json +3 -0
  8. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  9. package/compat/openapi-loose-boundaries-0.1.0.json +78 -46
  10. package/delivery/canonical.go +136 -0
  11. package/delivery/document.go +203 -0
  12. package/delivery/document.schema.json +1527 -0
  13. package/delivery/document_test.go +191 -0
  14. package/delivery/parser.go +155 -0
  15. package/evaluation/evaluation-run.schema.json +64 -10
  16. package/fixtures/json-schema/gateway-manifest/invalid/bad-execution-mode.json +73 -0
  17. package/fixtures/json-schema/gateway-manifest/invalid/unversioned-check.json +85 -0
  18. package/fixtures/json-schema/gateway-manifest/valid/checks.json +86 -0
  19. package/fixtures/json-schema/gateway-manifest/valid/versioned-task.json +73 -0
  20. package/fixtures/json-schema/network-ingest-event/invalid/vpn-probe-negative-rtt.json +34 -0
  21. package/fixtures/json-schema/network-ingest-event/invalid/vpn-stats-secret.json +27 -0
  22. package/fixtures/json-schema/network-ingest-event/valid/vpn-probe-batch.json +45 -0
  23. package/fixtures/json-schema/network-ingest-event/valid/vpn-tunnel-stats.json +26 -0
  24. package/fixtures/json-schema/network-runtime-protocol/invalid/vpn-managed-bad-token.json +15 -0
  25. package/fixtures/json-schema/network-runtime-protocol/invalid/vpn-managed-mode-override.json +16 -0
  26. package/fixtures/json-schema/network-runtime-protocol/valid/managed-vpn-macos-enrollment.json +27 -0
  27. package/fixtures/json-schema/network-runtime-protocol/valid/vpn-managed-connect.json +15 -0
  28. package/fixtures/openapi/AgentChatInput/invalid/empty-question.json +4 -0
  29. package/fixtures/openapi/AgentChatInput/invalid/system-role.json +9 -0
  30. package/fixtures/openapi/AgentChatInput/valid/authorized-background.json +5 -0
  31. package/fixtures/openapi/AgentChatInput/valid/conversation.json +15 -0
  32. package/fixtures/openapi/AgentRunnerToolCallRequest/invalid/model-identity.json +1 -0
  33. package/fixtures/openapi/AgentRunnerToolCallRequest/valid/search.json +1 -0
  34. package/fixtures/openapi/ApplicationInput/invalid/negative-version.json +6 -0
  35. package/fixtures/openapi/ApplicationInput/invalid/zero-version.json +6 -0
  36. package/fixtures/openapi/ApplicationInput/valid/versioned.json +6 -0
  37. package/fixtures/openapi/ApprovalRequest/invalid/resolved-scopes.json +20 -0
  38. package/fixtures/openapi/ApprovalRequest/valid/resolved-scopes.json +21 -0
  39. package/fixtures/openapi/BuildTemplateInput/invalid/negative-revision.json +6 -0
  40. package/fixtures/openapi/BuildTemplateInput/valid/draft.json +11 -0
  41. package/fixtures/openapi/BuildTriggerRequest/invalid/no-ref.json +1 -0
  42. package/fixtures/openapi/BuildTriggerRequest/valid/no-environment.json +1 -0
  43. package/fixtures/openapi/BuildpacksConfiguration/invalid/mutable-builder.json +5 -0
  44. package/fixtures/openapi/BuildpacksConfiguration/invalid/privilege-override.json +6 -0
  45. package/fixtures/openapi/BuildpacksConfiguration/invalid/unsupported-platform.json +5 -0
  46. package/fixtures/openapi/BuildpacksConfiguration/valid/pinned.json +5 -0
  47. package/fixtures/openapi/CapabilityAssessment/invalid/contract.json +16 -0
  48. package/fixtures/openapi/CapabilityAssessment/valid/contract.json +16 -0
  49. package/fixtures/openapi/CapabilityPlan/invalid/contract.json +16 -0
  50. package/fixtures/openapi/CapabilityPlan/valid/contract.json +19 -0
  51. package/fixtures/openapi/CapabilityPlanValidation/invalid/contract.json +5 -0
  52. package/fixtures/openapi/CapabilityPlanValidation/valid/contract.json +11 -0
  53. package/fixtures/openapi/CapabilityTask/invalid/contract.json +33 -0
  54. package/fixtures/openapi/CapabilityTask/valid/contract.json +34 -0
  55. package/fixtures/openapi/CapabilityTaskInput/invalid/contract.json +22 -0
  56. package/fixtures/openapi/CapabilityTaskInput/valid/contract.json +22 -0
  57. package/fixtures/openapi/CapabilityValueSemantic/invalid/contract.json +4 -0
  58. package/fixtures/openapi/CapabilityValueSemantic/valid/contract.json +7 -0
  59. package/fixtures/openapi/DeliveryAccessResult/invalid/release-verification.json +8 -0
  60. package/fixtures/openapi/DeliveryAccessResult/valid/release-verification.json +8 -0
  61. package/fixtures/openapi/DeliveryBatchAssessment/invalid/release-verification.json +11 -0
  62. package/fixtures/openapi/DeliveryBatchAssessment/valid/release-verification.json +11 -0
  63. package/fixtures/openapi/DeliveryBatchAssessmentInput/invalid/release-verification.json +9 -0
  64. package/fixtures/openapi/DeliveryBatchAssessmentInput/valid/release-verification.json +8 -0
  65. package/fixtures/openapi/DeliveryBatchInput/invalid/ambiguous-source.json +19 -0
  66. package/fixtures/openapi/DeliveryBatchInput/invalid/missing-idempotency.json +16 -0
  67. package/fixtures/openapi/DeliveryBatchInput/valid/quick-deploy.json +17 -0
  68. package/fixtures/openapi/DeliveryBatchInput/valid/saved-workflow.json +5 -0
  69. package/fixtures/openapi/DeliveryBlueprintInput/invalid/unversioned-preset.json +31 -0
  70. package/fixtures/openapi/DeliveryBlueprintInput/valid/service-preset.json +32 -0
  71. package/fixtures/openapi/DeliveryDocument/invalid/unknown-field.json +24 -0
  72. package/fixtures/openapi/DeliveryDocument/invalid/unknown-kind.json +23 -0
  73. package/fixtures/openapi/DeliveryDocument/invalid/unknown-version.json +23 -0
  74. package/fixtures/openapi/DeliveryDocument/valid/build-template.json +26 -0
  75. package/fixtures/openapi/DeliveryDocument/valid/deployment-template.json +26 -0
  76. package/fixtures/openapi/DeliveryDocument/valid/legacy-dag.json +39 -0
  77. package/fixtures/openapi/DeliveryDocument/valid/workflow-template.json +23 -0
  78. package/fixtures/openapi/DeliveryDocument/valid/workflow.json +20 -0
  79. package/fixtures/openapi/DeliveryDraftInput/invalid/short-idempotency-key.json +30 -0
  80. package/fixtures/openapi/DeliveryDraftInput/valid/idempotent-create.json +30 -0
  81. package/fixtures/openapi/DeliveryDraftService/invalid/zero-version.json +7 -0
  82. package/fixtures/openapi/DeliveryDraftService/valid/versioned-template.json +9 -0
  83. package/fixtures/openapi/DeliveryExecutionHistoryPage/invalid-kind.json +9 -0
  84. package/fixtures/openapi/DeliveryExecutionHistoryPage/valid-build.json +16 -0
  85. package/fixtures/openapi/DeliveryExecutionHistoryPage/valid-empty.json +3 -0
  86. package/fixtures/openapi/DeliveryPlanApprovalInput/invalid/confirm.json +1 -0
  87. package/fixtures/openapi/DeliveryPlanApprovalInput/valid/approve.json +1 -0
  88. package/fixtures/openapi/DeliveryPlanInput/invalid/draft-manifest-revision.json +1 -0
  89. package/fixtures/openapi/DeliveryPlanInput/valid/manifest-revision.json +1 -0
  90. package/fixtures/openapi/DeliveryTargetInput/invalid/deploy-without-environment.json +7 -0
  91. package/fixtures/openapi/DeliveryTargetInput/valid/build-without-environment.json +6 -0
  92. package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/duplicate-kind.json +13 -0
  93. package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/embedded-credentials.json +16 -0
  94. package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/empty-kinds.json +10 -0
  95. package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/negative-generation.json +15 -0
  96. package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/unknown-kind.json +12 -0
  97. package/fixtures/openapi/DeliveryTemplateSourceInput/valid/manual-source.json +15 -0
  98. package/fixtures/openapi/DeliveryWorkflowDefinition/invalid/unversioned-template.json +15 -0
  99. package/fixtures/openapi/DeliveryWorkflowDefinition/valid/cross-app.json +24 -0
  100. package/fixtures/openapi/DeliveryWorkflowInput/invalid/short-key.json +1 -0
  101. package/fixtures/openapi/DeliveryWorkflowInput/valid/idempotent-create.json +1 -0
  102. package/fixtures/openapi/DeploymentTemplatePreviewInput/invalid/invalid-target-override.json +7 -0
  103. package/fixtures/openapi/DeploymentTemplatePreviewInput/invalid/invalid-zero-version.json +6 -0
  104. package/fixtures/openapi/DeploymentTemplatePreviewInput/valid/valid.json +6 -0
  105. package/fixtures/openapi/DockerDeliveryConfiguration/invalid/empty-mappings.json +5 -0
  106. package/fixtures/openapi/DockerDeliveryConfiguration/valid/compose.json +7 -0
  107. package/fixtures/openapi/DockerDeliverySnapshot/invalid/missing-required-field.json +19 -0
  108. package/fixtures/openapi/DockerDeliverySnapshot/valid/frozen-project.json +20 -0
  109. package/fixtures/openapi/DockerOperationCallbackRequest/invalid/cancellation-acknowledged-not-boolean.json +13 -0
  110. package/fixtures/openapi/DockerOperationCallbackRequest/valid/cancellation-acknowledged.json +13 -0
  111. package/fixtures/openapi/DockerProjectInput/invalid/empty-host.json +4 -0
  112. package/fixtures/openapi/DockerProjectInput/valid/inline-idempotent.json +7 -0
  113. package/fixtures/openapi/DockerQuickCreateHostInput/invalid/capacity-type.json +1 -0
  114. package/fixtures/openapi/DockerQuickCreateHostInput/valid/capacity.json +1 -0
  115. package/fixtures/openapi/HelmDeliveryConfiguration/invalid/plain-credential.json +21 -0
  116. package/fixtures/openapi/HelmDeliveryConfiguration/invalid/release-name.json +20 -0
  117. package/fixtures/openapi/HelmDeliveryConfiguration/valid/private-oci.json +20 -0
  118. package/fixtures/openapi/HelmDeliverySnapshot/invalid/secret-plan.json +31 -0
  119. package/fixtures/openapi/HelmDeliverySnapshot/invalid/unknown-operation.json +28 -0
  120. package/fixtures/openapi/HelmDeliverySnapshot/valid/first-install.json +28 -0
  121. package/fixtures/openapi/IdentityApplication/invalid/outpost-status.json +1 -0
  122. package/fixtures/openapi/IdentityApplicationOnboardingInput/invalid/missing-access.json +12 -0
  123. package/fixtures/openapi/IdentityApplicationOnboardingInput/valid/link.json +13 -0
  124. package/fixtures/openapi/IdentityOutpost/invalid/missing-runtime-status.json +9 -0
  125. package/fixtures/openapi/IdentityOutpost/valid/healthy.json +17 -0
  126. package/fixtures/openapi/IdentityOutpost/valid/unregistered.json +12 -0
  127. package/fixtures/openapi/IdentityOutpostDeployment/invalid/missing-protocol.json +3 -0
  128. package/fixtures/openapi/IdentityOutpostDeployment/valid/remote.json +6 -0
  129. package/fixtures/openapi/IdentityOutpostInput/invalid/forged-observation.json +7 -0
  130. package/fixtures/openapi/IdentityOutpostInput/valid/forward-auth.json +6 -0
  131. package/fixtures/openapi/IdentityOutpostInput/valid/legacy.json +8 -0
  132. package/fixtures/openapi/IdentityProviderSetup/invalid/fake-verification.json +1 -0
  133. package/fixtures/openapi/IdentityProviderSetup/valid/incomplete.json +1 -0
  134. package/fixtures/openapi/IdentityProviderSetup/valid/remote.json +1 -0
  135. package/fixtures/openapi/IdentityProviderUserMetadata/invalid/attributes.json +8 -0
  136. package/fixtures/openapi/IdentityProviderUserMetadata/valid/attributes.json +13 -0
  137. package/fixtures/openapi/KubernetesCustomResource/invalid/negative-generation.json +1 -0
  138. package/fixtures/openapi/KubernetesCustomResource/valid/deleting-operator.json +1 -0
  139. package/fixtures/openapi/KubernetesResourceCreationReceipt/invalid/manifest-content.json +20 -0
  140. package/fixtures/openapi/KubernetesResourceCreationReceipt/valid/confirmed.json +20 -0
  141. package/fixtures/openapi/KubernetesResourceCreationReceipt/valid/unknown.json +19 -0
  142. package/fixtures/openapi/ManifestDeploymentEnvelope/invalid/negative-resource-observation.json +57 -0
  143. package/fixtures/openapi/ManifestDeploymentEnvelope/valid/operator-deleting.json +57 -0
  144. package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/gitops-empty.json +7 -0
  145. package/fixtures/openapi/ManifestExecutionTaskPayload/valid/gitops-frozen-children.json +18 -0
  146. package/fixtures/openapi/ManifestKustomizeOptions/invalid/escaping-entry.json +1 -0
  147. package/fixtures/openapi/ManifestKustomizeOptions/invalid/mutable-image.json +1 -0
  148. package/fixtures/openapi/ManifestKustomizeOptions/valid/overlay-images.json +7 -0
  149. package/fixtures/openapi/ManifestRevisionInput/invalid/missing-version.json +1 -0
  150. package/fixtures/openapi/ManifestRevisionInput/valid/current-draft.json +1 -0
  151. package/fixtures/openapi/ManifestServiceTemplateInputs/invalid/mutable-image.json +8 -0
  152. package/fixtures/openapi/ManifestServiceTemplateInputs/valid/frozen-service-image.json +9 -0
  153. package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/auto-with-gateway.json +6 -0
  154. package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/missing-manual-gateway.json +5 -0
  155. package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/mode-override.json +7 -0
  156. package/fixtures/openapi/NetworkVPNConnectionIntentInput/valid/auto-intent.json +5 -0
  157. package/fixtures/openapi/NetworkVPNConnectionIntentInput/valid/manual-intent.json +6 -0
  158. package/fixtures/openapi/NetworkVPNProfileInput/invalid/unknown-private-key.json +25 -0
  159. package/fixtures/openapi/NetworkVPNProfileInput/valid/assigned-profile.json +24 -0
  160. package/fixtures/openapi/NetworkVPNSelectionPolicyInput/invalid/unbounded-attempts.json +21 -0
  161. package/fixtures/openapi/NetworkVPNSelectionPolicyInput/valid/provider-policy.json +21 -0
  162. package/fixtures/openapi/ObservabilityMetricAssessmentInput/invalid/arbitrary-expression.json +10 -0
  163. package/fixtures/openapi/ObservabilityMetricAssessmentInput/valid/metric-window.json +10 -0
  164. package/fixtures/openapi/PluginManifest/valid/hermes-api.json +53 -0
  165. package/fixtures/openapi/ProgressiveRolloutControlInput/invalid/missing-identity.json +5 -0
  166. package/fixtures/openapi/ProgressiveRolloutControlInput/invalid/skip-analysis.json +5 -0
  167. package/fixtures/openapi/ProgressiveRolloutControlInput/valid/pause.json +5 -0
  168. package/fixtures/openapi/ReleaseTargetInput/invalid/missing-required-field.json +15 -0
  169. package/fixtures/openapi/ReleaseTargetInput/valid/docker-compose.json +16 -0
  170. package/fixtures/openapi/RepositoryAnalysis/invalid/moving-ref.json +11 -0
  171. package/fixtures/openapi/RepositoryAnalysis/valid/go.json +29 -0
  172. package/fixtures/openapi/RepositoryAnalysisInput/invalid/arbitrary-source-url.json +6 -0
  173. package/fixtures/openapi/RepositoryAnalysisInput/invalid/missing-ref.json +4 -0
  174. package/fixtures/openapi/RepositoryAnalysisInput/valid/nested-project.json +6 -0
  175. package/fixtures/openapi/ServiceDeploymentTemplateBinding/invalid/invalid-unpinned.json +4 -0
  176. package/fixtures/openapi/ServiceDeploymentTemplateBinding/valid/valid.json +7 -0
  177. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-executable-schema.json +25 -0
  178. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-missing-schema.json +21 -0
  179. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-mixed-renderers.json +40 -0
  180. package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/valid-nested-parameters.json +41 -0
  181. package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/valid-yaml.json +34 -0
  182. package/fixtures/openapi/TemplatePublishInput/invalid/missing-revision.json +1 -0
  183. package/fixtures/openapi/TemplatePublishInput/invalid/unknown-field.json +4 -0
  184. package/fixtures/openapi/TemplatePublishInput/invalid/zero-revision.json +3 -0
  185. package/fixtures/openapi/TemplatePublishInput/valid/revision.json +3 -0
  186. package/fixtures/openapi/ToolCapability/invalid/bad-idempotency.json +35 -0
  187. package/fixtures/openapi/ToolCapability/invalid/unversioned-check.json +47 -0
  188. package/fixtures/openapi/ToolCapability/valid/checks.json +48 -0
  189. package/fixtures/openapi/ToolCapability/valid/versioned-task.json +35 -0
  190. package/fixtures/openapi/ToolInvocationRequest/invalid/empty-version.json +8 -0
  191. package/fixtures/openapi/ToolInvocationRequest/valid/versioned.json +8 -0
  192. package/fixtures/openapi/ToolInvocationResult/invalid/missing-status-call.json +13 -0
  193. package/fixtures/openapi/ToolInvocationResult/valid/task.json +20 -0
  194. package/fixtures/openapi/VirtualMachineCreateInput/invalid/capacity-type.json +1 -0
  195. package/fixtures/openapi/VirtualMachineCreateInput/valid/capacity.json +1 -0
  196. package/fixtures/openapi/VirtualizationCapacityInput/invalid/missing-disk.json +1 -0
  197. package/fixtures/openapi/VirtualizationCapacityInput/valid/running-vm.json +1 -0
  198. package/fixtures/openapi/VirtualizationCapacityResult/invalid/invented-status.json +1 -0
  199. package/fixtures/openapi/VirtualizationCapacityResult/valid/available.json +1 -0
  200. package/fixtures/openapi/VirtualizationWorkerCreateInput/invalid/secret-input.json +5 -0
  201. package/fixtures/openapi/VirtualizationWorkerCreateInput/valid/one-worker.json +4 -0
  202. package/fixtures/openapi/VirtualizationWorkerPoolInput/invalid/external-owner.json +27 -0
  203. package/fixtures/openapi/VirtualizationWorkerPoolInput/invalid/zero-budget.json +27 -0
  204. package/fixtures/openapi/VirtualizationWorkerPoolInput/valid/registered.json +27 -0
  205. package/fixtures/openapi/VirtualizationWorkerPoolListEnvelope/invalid/nested-data.json +5 -0
  206. package/fixtures/openapi/VirtualizationWorkerPoolListEnvelope/valid/empty.json +3 -0
  207. package/fixtures/openapi/WorkbenchContextSelection/invalid/missing-file-content.json +8 -0
  208. package/fixtures/openapi/WorkbenchContextSelection/invalid/unknown-reference-kind.json +8 -0
  209. package/fixtures/openapi/WorkbenchContextSelection/valid/text-and-resource.json +17 -0
  210. package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/trigger-without-plan.json +10 -0
  211. package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/unknown-trigger.json +28 -0
  212. package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/zero-interval.json +28 -0
  213. package/fixtures/openapi/WorkbenchInspectionTaskInput/valid/alert-capability.json +30 -0
  214. package/fixtures/openapi/WorkbenchInspectionTaskInput/valid/scheduled-capability.json +28 -0
  215. package/fixtures/openapi/WorkbenchInspectionTrigger/invalid/missing-rule.json +3 -0
  216. package/fixtures/openapi/WorkbenchInspectionTrigger/invalid/schedule-alert-selector.json +4 -0
  217. package/fixtures/openapi/WorkbenchInspectionTrigger/valid/schedule.json +3 -0
  218. package/fixtures/openapi/WorkbenchModelPreferences/invalid/unknown-effort.json +1 -0
  219. package/fixtures/openapi/WorkbenchModelPreferences/valid/selected.json +1 -0
  220. package/fixtures/openapi/WorkflowCatalogPage/invalid/unsupported-kind.json +6 -0
  221. package/fixtures/openapi/WorkflowCatalogPage/valid/build-without-environment.json +6 -0
  222. package/fixtures/openapi/WorkflowTemplateInput/invalid/zero-revision.json +6 -0
  223. package/fixtures/openapi/WorkflowTemplateInput/valid/draft.json +10 -0
  224. package/gen/go/sohaapi/client.go +1 -1
  225. package/gen/go/sohaapi/types.go +8070 -859
  226. package/gen/go/sohaapi/types_test.go +100 -1
  227. package/gen/go/sohaapi/vpn_models_test.go +21 -0
  228. package/gen/ts/sohaapi/index.ts +20343 -13162
  229. package/go.mod +107 -5
  230. package/go.sum +379 -16
  231. package/helmrelease/delivery.go +283 -0
  232. package/helmrelease/delivery_test.go +102 -0
  233. package/helmrelease/frozen_chart.go +91 -0
  234. package/helmrelease/result.go +27 -0
  235. package/helmrelease/runtime/delivery.go +508 -0
  236. package/helmrelease/runtime/delivery_test.go +236 -0
  237. package/helmrelease/runtime/resources_test.go +60 -0
  238. package/helmrelease/values.go +99 -0
  239. package/knowledge/context-envelope.schema.json +1 -0
  240. package/mcp/gateway-manifest.schema.json +387 -72
  241. package/network/README.md +40 -0
  242. package/network/network-ingest-event.schema.json +228 -0
  243. package/network/network-runtime-protocol.schema.json +457 -1
  244. package/openapi/soha-api.json +54958 -38899
  245. package/openapi/soha-api.yaml +12143 -4984
  246. package/openapi/spec_generated.go +3 -3
  247. package/package.json +3 -1
  248. package/resource/manifest_health.go +155 -0
  249. package/resource/manifest_health_test.go +37 -0
  250. package/resource/models.go +14 -0
  251. package/resource/runtime/argocd.go +166 -0
  252. package/resource/runtime/argocd_integration_test.go +142 -0
  253. package/resource/runtime/argocd_observation.go +143 -0
  254. package/resource/runtime/argocd_operation.go +253 -0
  255. package/resource/runtime/argocd_resources.go +115 -0
  256. package/resource/runtime/argocd_resources_test.go +107 -0
  257. package/resource/runtime/argocd_test.go +386 -0
  258. package/resource/runtime/health.go +115 -0
  259. package/resource/runtime/health_test.go +78 -0
  260. package/resource/runtime/operator_integration_test.go +174 -0
  261. package/resource/runtime/ownership.go +178 -0
  262. package/resource/runtime/ownership_test.go +178 -0
  263. package/resource/runtime/rollout_integration_test.go +287 -0
  264. package/resource/runtime/rollout_observation.go +252 -0
  265. package/resource/runtime/rollout_operation.go +398 -0
  266. package/resource/runtime/rollout_resources.go +385 -0
  267. package/resource/runtime/rollout_task.go +165 -0
  268. package/resource/runtime/rollout_test.go +450 -0
package/COMPATIBILITY.md CHANGED
@@ -100,6 +100,11 @@ requires dynamic JSON, add it to the baseline with an intentional review note.
100
100
  If a loose boundary is tightened, remove it from the baseline in the same
101
101
  change so the contract surface keeps moving toward named schemas.
102
102
 
103
+ `CapabilityCall.input` is intentionally dynamic: a continuation references a
104
+ registered capability whose version and input schema are checked by the Gateway.
105
+ The call envelope and task reference are closed schemas; this input map does not
106
+ permit arbitrary HTTP endpoints, scripts, or bypasses of current authorization.
107
+
103
108
  ## Public Cloud Extension Points
104
109
 
105
110
  `CloudExtensionPoint` OpenAPI DTOs describe only public extension points that
@@ -116,6 +121,23 @@ the Cloud-only exclusion enum.
116
121
 
117
122
  ## Fixture Policy
118
123
 
124
+ ### Outpost management compatibility
125
+
126
+ Outpost management retains the deployed `online/offline/degraded` status values,
127
+ node metadata, endpoint, version and last-contact fields. The shared
128
+ `IdentityResourceStatus` type is preserved for SDK source compatibility; these
129
+ legacy runtime values apply to Outposts, not to other resources' management
130
+ transitions. Management `status` and `version` inputs remain accepted for old
131
+ clients but cannot manufacture runtime observations. New clients use
132
+ `runtimeStatus`, `lastHeartbeatAt`, applied configuration information and the
133
+ explicit `forwardAuthUrl`. A desired configuration version of zero represents
134
+ an unregistered node and must not be displayed as a deployed version.
135
+
136
+ The two Outpost metadata references in the loose-boundary inventory document an
137
+ existing deployed JSON object surface. They preserve legacy clients and do not
138
+ authorize runtime health, configuration versions or lease expiry; those are
139
+ separately typed and recorded by authenticated runtime operations.
140
+
119
141
  Every JSON Schema owned by this repository must have at least one valid and one
120
142
  invalid fixture under `fixtures/json-schema/<contract>/`.
121
143
 
@@ -363,3 +385,26 @@ npm run check:consumers
363
385
  Local runs skip missing sibling checkouts by default. CI and release candidate
364
386
  validation should use `--require-all` or a specific `--consumer <name>` so a
365
387
  missing checkout is a failure.
388
+
389
+ ## Capability lifecycle metadata
390
+
391
+ `execution.checks` adds optional version-pinned references to read-only availability,
392
+ precondition, and assessment capabilities. Discovery filters references using the
393
+ caller-visible catalog before pagination. They are suggestions for explicit plan
394
+ steps, not automatic execution or a replacement for domain admission. No declared
395
+ check means unknown support, not a successful check.
396
+
397
+ `execution.recoveryMode=original_call` declares read-only receipt lookup by the
398
+ managed goal executor with the exact persisted invocation and current authorization.
399
+ It does not promise rollback or authorize a new write. Consumers without these
400
+ optional fields keep the existing version, idempotency, status, and cancellation
401
+ behavior.
402
+
403
+ ## Contracts-first consumer revisions
404
+
405
+ `compat/consumer-revisions.json` pins a reviewed consumer commit when a contracts
406
+ release introduces APIs implemented by that consumer's pending change. Both CI
407
+ and release use the same commit and run the complete existing consumer checks.
408
+ Unlisted consumers use `main`. Replace the pin with `main` (or remove it) once the
409
+ matching consumer changes reach its default branch; do not skip failed checks to
410
+ resolve a release-order dependency.
package/README.md CHANGED
@@ -237,3 +237,40 @@ import paths.
237
237
 
238
238
  This repository is licensed under the Apache License 2.0. See
239
239
  [LICENSE](./LICENSE) for the full license text.
240
+
241
+ ### Workbench model preferences
242
+
243
+ `WorkbenchSendMessageStreamRequest.modelPreferences` selects a public model and
244
+ an optional `auto`, `low`, `medium`, or `high` reasoning effort for internal general
245
+ chat. Preferences persist in session metadata when a message is sent; an empty
246
+ public model follows the global default. External agents and analysis modes manage
247
+ their own models. The workbench catalog exposes only permitted public model names.
248
+
249
+ Gateway routes may declare `metadata.reasoningEfforts: ["low", "medium", "high"]`
250
+ (or a supported subset). Only OpenAI-wire routes without protocol conversion expose
251
+ these levels; every eligible fallback must support a level for it to be offered.
252
+ Unknown capabilities offer automatic reasoning only. Explicit supported efforts map
253
+ to `reasoning_effort` for chat completions and `reasoning.effort` for Responses.
254
+
255
+ ### Shared native Helm task adapter
256
+
257
+ `helmrelease/runtime` applies the versioned Helm execution contract through Helm 4.
258
+ Both core Direct and the standalone Agent supply their own authorized action configuration;
259
+ queueing, approvals, secret resolution and chart downloads remain outside this package.
260
+ SDK-only consumers need not import this optional package. Its native revision and recovery
261
+ checks are tested once for both execution modes.
262
+
263
+ Agent-local authenticated POST endpoints `/api/v1/platform/helm/delivery/prepare`,
264
+ `/api/v1/platform/helm/delivery/preflight` and `/api/v1/platform/helm/delivery/observe` accept `HelmExecutionTaskPayload` and return a
265
+ `data` envelope with the prepared payload or `HelmExecutionTaskResult`, respectively.
266
+ They enforce the configured cluster identity and are read-only; `apply` is accepted
267
+ only by the claimed-task runner. Confidential requests are bounded to 8 MiB,
268
+ rendered manifests plus hooks to 2 MiB and values to 1 MiB, and are never logged.
269
+
270
+ ### Controller-aware Agent execution
271
+
272
+ Manifest tasks emitted by the controller-aware Core use `manifest_agent_v3.<clusterId>` and require the Agent summary capability `manifest.execution.v3`. New Agents also accept legacy `manifest_agent.<clusterId>` and `manifest_agent_v2.<clusterId>` tasks using the protected executor. Old Agents cannot claim the new provider kind; capability checks alone are not a substitute for this claim boundary during rolling upgrades.
273
+
274
+ Native YAML/CR writes and workload restart, scale, rollback and image changes use the existing request/response bodies under `/api/v1/platform/ownership-v2`, with the original route suffix. This endpoint family guarantees live external-owner checks for Operator, Argo CD, and Argo Rollouts resources and optimistic identity fencing; ownership conflicts return HTTP 409. Core must not fall back to older mutations after 404/405. Reads retain their existing routes.
275
+
276
+ `resource/runtime` implements bounded WorkloadCronJob, Argo CD, and Argo Rollouts adapters shared by Direct and Agent. The frozen inventory, operation identity, current generation, resource UID/version, and child-resource evidence determine completion. Blue-green and Traefik canary delivery observe native Service revisions, weights, and complete AnalysisRun metric windows. Promotion only releases manual pauses; analysis failure and cancellation require confirmed stable traffic. Restoring desired configuration uses a new governed operation. Other CRs and traffic plugins are not inferred as supported from a generic Ready condition.
@@ -6,8 +6,8 @@ import _ "embed"
6
6
 
7
7
  const (
8
8
  PermissionCatalogVersion = "2.0.0"
9
- PermissionCatalogContentSHA256 = "f744896d362070a1e7cdc1eda89c046bee8132f37c6f323dafdd05644e2dbd3c"
10
- PermissionCatalogSHA256 = "354ad414691ff0578d805036bbbe80da28d242d0bbabe4699e490af1b6bd87bb"
9
+ PermissionCatalogContentSHA256 = "5b4c9eed71c549d61a6fd538db542681cb2932619d66ab031c74fcbaaa0c9867"
10
+ PermissionCatalogSHA256 = "e1e4bab807f64894c9bbde245394902fb1e82253d5847585102560ea6f853894"
11
11
  )
12
12
 
13
13
  //go:embed permission-catalog.json
@@ -0,0 +1,17 @@
1
+ package auth
2
+
3
+ import "strings"
4
+
5
+ // IsOutpostIdentityHeader identifies the response headers supported by the v1
6
+ // Outpost protocol. Transport, cookie and internal authentication headers are
7
+ // deliberately excluded, including when returned by a configured claim mapping.
8
+ func IsOutpostIdentityHeader(name string) bool {
9
+ switch strings.ToLower(strings.TrimSpace(name)) {
10
+ case "x-auth-request-user", "x-auth-request-email", "x-auth-request-groups",
11
+ "x-soha-user", "x-soha-user-id", "x-soha-email", "x-soha-roles",
12
+ "x-soha-teams", "x-soha-groups", "x-soha-projects", "x-soha-tags":
13
+ return true
14
+ default:
15
+ return false
16
+ }
17
+ }
@@ -0,0 +1,16 @@
1
+ package auth
2
+
3
+ import "testing"
4
+
5
+ func TestOutpostIdentityHeaders(t *testing.T) {
6
+ for _, name := range []string{"X-Soha-User-ID", "X-Soha-Projects", "X-Soha-Tags", " x-auth-request-email "} {
7
+ if !IsOutpostIdentityHeader(name) {
8
+ t.Errorf("supported identity header %q rejected", name)
9
+ }
10
+ }
11
+ for _, name := range []string{"Set-Cookie", "Authorization", "Location", "X-Forwarded-Host", "X-Soha-Outpost-Token", "X-Soha-Session-Token", "X-Auth-Email", "X-Soha-Email\r\nInjected"} {
12
+ if IsOutpostIdentityHeader(name) {
13
+ t.Errorf("unsupported header %q accepted", name)
14
+ }
15
+ }
16
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "authorization.opensoha.io/v1",
3
3
  "catalogVersion": "2.0.0",
4
- "contentHash": "sha256:f744896d362070a1e7cdc1eda89c046bee8132f37c6f323dafdd05644e2dbd3c",
4
+ "contentHash": "sha256:5b4c9eed71c549d61a6fd538db542681cb2932619d66ab031c74fcbaaa0c9867",
5
5
  "permissions": [
6
6
  {
7
7
  "key": "access.directory.create",
@@ -2846,6 +2846,62 @@
2846
2846
  "status": "active",
2847
2847
  "assignable": true
2848
2848
  },
2849
+ {
2850
+ "key": "delivery.deployment-templates.create",
2851
+ "domain": "delivery",
2852
+ "resource": "deployment-templates",
2853
+ "action": "create",
2854
+ "displayName": "创建构建模板",
2855
+ "riskLevel": "mutate",
2856
+ "scopeKinds": [
2857
+ "workspace"
2858
+ ],
2859
+ "approvalPolicy": "never",
2860
+ "status": "active",
2861
+ "assignable": true
2862
+ },
2863
+ {
2864
+ "key": "delivery.deployment-templates.delete",
2865
+ "domain": "delivery",
2866
+ "resource": "deployment-templates",
2867
+ "action": "delete",
2868
+ "displayName": "删除构建模板",
2869
+ "riskLevel": "high",
2870
+ "scopeKinds": [
2871
+ "workspace"
2872
+ ],
2873
+ "approvalPolicy": "eligible",
2874
+ "status": "active",
2875
+ "assignable": true
2876
+ },
2877
+ {
2878
+ "key": "delivery.deployment-templates.update",
2879
+ "domain": "delivery",
2880
+ "resource": "deployment-templates",
2881
+ "action": "update",
2882
+ "displayName": "修改构建模板",
2883
+ "riskLevel": "mutate",
2884
+ "scopeKinds": [
2885
+ "workspace"
2886
+ ],
2887
+ "approvalPolicy": "never",
2888
+ "status": "active",
2889
+ "assignable": true
2890
+ },
2891
+ {
2892
+ "key": "delivery.deployment-templates.view",
2893
+ "domain": "delivery",
2894
+ "resource": "deployment-templates",
2895
+ "action": "view",
2896
+ "displayName": "查看构建模板",
2897
+ "riskLevel": "read",
2898
+ "scopeKinds": [
2899
+ "workspace"
2900
+ ],
2901
+ "approvalPolicy": "never",
2902
+ "status": "active",
2903
+ "assignable": true
2904
+ },
2849
2905
  {
2850
2906
  "key": "delivery.execution-tasks.cancel",
2851
2907
  "domain": "delivery",
@@ -3322,6 +3378,126 @@
3322
3378
  "status": "active",
3323
3379
  "assignable": true
3324
3380
  },
3381
+ {
3382
+ "key": "delivery.template-sources.create",
3383
+ "domain": "delivery",
3384
+ "resource": "template-sources",
3385
+ "action": "create",
3386
+ "displayName": "创建交付模板来源",
3387
+ "riskLevel": "mutate",
3388
+ "scopeKinds": [
3389
+ "workspace",
3390
+ "resource"
3391
+ ],
3392
+ "approvalPolicy": "never",
3393
+ "status": "active",
3394
+ "assignable": true
3395
+ },
3396
+ {
3397
+ "key": "delivery.template-sources.delete",
3398
+ "domain": "delivery",
3399
+ "resource": "template-sources",
3400
+ "action": "delete",
3401
+ "displayName": "移除交付模板来源",
3402
+ "riskLevel": "mutate",
3403
+ "scopeKinds": [
3404
+ "workspace",
3405
+ "resource"
3406
+ ],
3407
+ "approvalPolicy": "never",
3408
+ "status": "active",
3409
+ "assignable": true
3410
+ },
3411
+ {
3412
+ "key": "delivery.template-sources.sync",
3413
+ "domain": "delivery",
3414
+ "resource": "template-sources",
3415
+ "action": "sync",
3416
+ "displayName": "同步交付模板来源",
3417
+ "riskLevel": "mutate",
3418
+ "scopeKinds": [
3419
+ "workspace",
3420
+ "resource"
3421
+ ],
3422
+ "approvalPolicy": "never",
3423
+ "status": "active",
3424
+ "assignable": true
3425
+ },
3426
+ {
3427
+ "key": "delivery.template-sources.update",
3428
+ "domain": "delivery",
3429
+ "resource": "template-sources",
3430
+ "action": "update",
3431
+ "displayName": "修改交付模板来源",
3432
+ "riskLevel": "mutate",
3433
+ "scopeKinds": [
3434
+ "workspace",
3435
+ "resource"
3436
+ ],
3437
+ "approvalPolicy": "never",
3438
+ "status": "active",
3439
+ "assignable": true
3440
+ },
3441
+ {
3442
+ "key": "delivery.template-sources.view",
3443
+ "domain": "delivery",
3444
+ "resource": "template-sources",
3445
+ "action": "view",
3446
+ "displayName": "查看交付模板来源",
3447
+ "riskLevel": "read",
3448
+ "scopeKinds": [
3449
+ "workspace",
3450
+ "resource"
3451
+ ],
3452
+ "approvalPolicy": "never",
3453
+ "status": "active",
3454
+ "assignable": true
3455
+ },
3456
+ {
3457
+ "key": "delivery.triggers.create",
3458
+ "domain": "delivery",
3459
+ "resource": "triggers",
3460
+ "action": "create",
3461
+ "displayName": "创建交付触发器",
3462
+ "riskLevel": "mutate",
3463
+ "scopeKinds": [
3464
+ "workspace",
3465
+ "resource"
3466
+ ],
3467
+ "approvalPolicy": "never",
3468
+ "status": "active",
3469
+ "assignable": true
3470
+ },
3471
+ {
3472
+ "key": "delivery.triggers.update",
3473
+ "domain": "delivery",
3474
+ "resource": "triggers",
3475
+ "action": "update",
3476
+ "displayName": "修改交付触发器",
3477
+ "riskLevel": "mutate",
3478
+ "scopeKinds": [
3479
+ "workspace",
3480
+ "resource"
3481
+ ],
3482
+ "approvalPolicy": "never",
3483
+ "status": "active",
3484
+ "assignable": true
3485
+ },
3486
+ {
3487
+ "key": "delivery.triggers.view",
3488
+ "domain": "delivery",
3489
+ "resource": "triggers",
3490
+ "action": "view",
3491
+ "displayName": "查看交付触发器",
3492
+ "riskLevel": "read",
3493
+ "scopeKinds": [
3494
+ "workspace",
3495
+ "resource"
3496
+ ],
3497
+ "approvalPolicy": "never",
3498
+ "status": "active",
3499
+ "assignable": true
3500
+ },
3325
3501
  {
3326
3502
  "key": "delivery.workflow-templates.create",
3327
3503
  "domain": "delivery",
@@ -5030,6 +5206,198 @@
5030
5206
  "status": "active",
5031
5207
  "assignable": true
5032
5208
  },
5209
+ {
5210
+ "key": "network_access.vpn_dashboard.view",
5211
+ "domain": "network_access",
5212
+ "resource": "vpn_dashboard",
5213
+ "action": "view",
5214
+ "displayName": "查看VPN 连接看板",
5215
+ "riskLevel": "read",
5216
+ "scopeKinds": [
5217
+ "tenant",
5218
+ "workspace",
5219
+ "resource"
5220
+ ],
5221
+ "approvalPolicy": "never",
5222
+ "status": "active",
5223
+ "assignable": true
5224
+ },
5225
+ {
5226
+ "key": "network_access.vpn_profiles.create",
5227
+ "domain": "network_access",
5228
+ "resource": "vpn_profiles",
5229
+ "action": "create",
5230
+ "displayName": "创建VPN 连接方案",
5231
+ "riskLevel": "mutate",
5232
+ "scopeKinds": [
5233
+ "tenant",
5234
+ "workspace",
5235
+ "resource"
5236
+ ],
5237
+ "approvalPolicy": "never",
5238
+ "status": "active",
5239
+ "assignable": true
5240
+ },
5241
+ {
5242
+ "key": "network_access.vpn_profiles.delete",
5243
+ "domain": "network_access",
5244
+ "resource": "vpn_profiles",
5245
+ "action": "delete",
5246
+ "displayName": "删除VPN 连接方案",
5247
+ "riskLevel": "mutate",
5248
+ "scopeKinds": [
5249
+ "tenant",
5250
+ "workspace",
5251
+ "resource"
5252
+ ],
5253
+ "approvalPolicy": "never",
5254
+ "status": "active",
5255
+ "assignable": true
5256
+ },
5257
+ {
5258
+ "key": "network_access.vpn_profiles.publish",
5259
+ "domain": "network_access",
5260
+ "resource": "vpn_profiles",
5261
+ "action": "publish",
5262
+ "displayName": "发布VPN 连接方案",
5263
+ "riskLevel": "mutate",
5264
+ "scopeKinds": [
5265
+ "tenant",
5266
+ "workspace",
5267
+ "resource"
5268
+ ],
5269
+ "approvalPolicy": "never",
5270
+ "status": "active",
5271
+ "assignable": true
5272
+ },
5273
+ {
5274
+ "key": "network_access.vpn_profiles.update",
5275
+ "domain": "network_access",
5276
+ "resource": "vpn_profiles",
5277
+ "action": "update",
5278
+ "displayName": "修改VPN 连接方案",
5279
+ "riskLevel": "mutate",
5280
+ "scopeKinds": [
5281
+ "tenant",
5282
+ "workspace",
5283
+ "resource"
5284
+ ],
5285
+ "approvalPolicy": "never",
5286
+ "status": "active",
5287
+ "assignable": true
5288
+ },
5289
+ {
5290
+ "key": "network_access.vpn_profiles.view",
5291
+ "domain": "network_access",
5292
+ "resource": "vpn_profiles",
5293
+ "action": "view",
5294
+ "displayName": "查看VPN 连接方案",
5295
+ "riskLevel": "read",
5296
+ "scopeKinds": [
5297
+ "tenant",
5298
+ "workspace",
5299
+ "resource"
5300
+ ],
5301
+ "approvalPolicy": "never",
5302
+ "status": "active",
5303
+ "assignable": true
5304
+ },
5305
+ {
5306
+ "key": "network_access.vpn_selection_policies.create",
5307
+ "domain": "network_access",
5308
+ "resource": "vpn_selection_policies",
5309
+ "action": "create",
5310
+ "displayName": "创建VPN 选择策略",
5311
+ "riskLevel": "mutate",
5312
+ "scopeKinds": [
5313
+ "tenant",
5314
+ "workspace",
5315
+ "resource"
5316
+ ],
5317
+ "approvalPolicy": "never",
5318
+ "status": "active",
5319
+ "assignable": true
5320
+ },
5321
+ {
5322
+ "key": "network_access.vpn_selection_policies.delete",
5323
+ "domain": "network_access",
5324
+ "resource": "vpn_selection_policies",
5325
+ "action": "delete",
5326
+ "displayName": "删除VPN 选择策略",
5327
+ "riskLevel": "mutate",
5328
+ "scopeKinds": [
5329
+ "tenant",
5330
+ "workspace",
5331
+ "resource"
5332
+ ],
5333
+ "approvalPolicy": "never",
5334
+ "status": "active",
5335
+ "assignable": true
5336
+ },
5337
+ {
5338
+ "key": "network_access.vpn_selection_policies.preview",
5339
+ "domain": "network_access",
5340
+ "resource": "vpn_selection_policies",
5341
+ "action": "preview",
5342
+ "displayName": "模拟VPN 选择策略",
5343
+ "riskLevel": "read",
5344
+ "scopeKinds": [
5345
+ "tenant",
5346
+ "workspace",
5347
+ "resource"
5348
+ ],
5349
+ "approvalPolicy": "never",
5350
+ "status": "active",
5351
+ "assignable": true
5352
+ },
5353
+ {
5354
+ "key": "network_access.vpn_selection_policies.publish",
5355
+ "domain": "network_access",
5356
+ "resource": "vpn_selection_policies",
5357
+ "action": "publish",
5358
+ "displayName": "发布VPN 选择策略",
5359
+ "riskLevel": "mutate",
5360
+ "scopeKinds": [
5361
+ "tenant",
5362
+ "workspace",
5363
+ "resource"
5364
+ ],
5365
+ "approvalPolicy": "never",
5366
+ "status": "active",
5367
+ "assignable": true
5368
+ },
5369
+ {
5370
+ "key": "network_access.vpn_selection_policies.update",
5371
+ "domain": "network_access",
5372
+ "resource": "vpn_selection_policies",
5373
+ "action": "update",
5374
+ "displayName": "修改VPN 选择策略",
5375
+ "riskLevel": "mutate",
5376
+ "scopeKinds": [
5377
+ "tenant",
5378
+ "workspace",
5379
+ "resource"
5380
+ ],
5381
+ "approvalPolicy": "never",
5382
+ "status": "active",
5383
+ "assignable": true
5384
+ },
5385
+ {
5386
+ "key": "network_access.vpn_selection_policies.view",
5387
+ "domain": "network_access",
5388
+ "resource": "vpn_selection_policies",
5389
+ "action": "view",
5390
+ "displayName": "查看VPN 选择策略",
5391
+ "riskLevel": "read",
5392
+ "scopeKinds": [
5393
+ "tenant",
5394
+ "workspace",
5395
+ "resource"
5396
+ ],
5397
+ "approvalPolicy": "never",
5398
+ "status": "active",
5399
+ "assignable": true
5400
+ },
5033
5401
  {
5034
5402
  "key": "observe.ai.chat",
5035
5403
  "domain": "observe",
@@ -8784,6 +9152,20 @@
8784
9152
  "platform.network.topology.view"
8785
9153
  ]
8786
9154
  },
9155
+ {
9156
+ "key": "platform.nodes.create",
9157
+ "domain": "platform",
9158
+ "resource": "nodes",
9159
+ "action": "create",
9160
+ "displayName": "创建 Kubernetes Node",
9161
+ "riskLevel": "high",
9162
+ "scopeKinds": [
9163
+ "cluster"
9164
+ ],
9165
+ "approvalPolicy": "eligible",
9166
+ "status": "active",
9167
+ "assignable": true
9168
+ },
8787
9169
  {
8788
9170
  "key": "platform.nodes.delete",
8789
9171
  "domain": "platform",
@@ -0,0 +1,3 @@
1
+ {
2
+ "soha": "d675a708806072a2fee42e3c2c00309091a8cfb9"
3
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.17",
2
+ "version": "0.1.18",
3
3
  "schemas": {
4
4
  "plugins/plugin-manifest.schema.json": {
5
5
  "rootRequired": ["id", "name", "publisher", "type", "version"],