@opensoha/contracts 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPATIBILITY.md +72 -0
- package/README.md +38 -0
- package/auth/catalog_generated.go +2 -2
- package/auth/outpost_headers.go +17 -0
- package/auth/outpost_headers_test.go +16 -0
- package/auth/permission-catalog.json +383 -1
- package/compat/consumer-revisions.json +7 -0
- package/compat/json-schema-ecosystem-0.1.0.json +1 -1
- package/compat/openapi-loose-boundaries-0.1.0.json +78 -46
- package/delivery/canonical.go +136 -0
- package/delivery/document.go +203 -0
- package/delivery/document.schema.json +1527 -0
- package/delivery/document_test.go +191 -0
- package/delivery/parser.go +155 -0
- package/evaluation/evaluation-run.schema.json +64 -10
- package/fixtures/json-schema/gateway-manifest/invalid/bad-execution-mode.json +73 -0
- package/fixtures/json-schema/gateway-manifest/invalid/unversioned-check.json +85 -0
- package/fixtures/json-schema/gateway-manifest/valid/checks.json +86 -0
- package/fixtures/json-schema/gateway-manifest/valid/versioned-task.json +73 -0
- package/fixtures/json-schema/network-ingest-event/invalid/vpn-probe-negative-rtt.json +34 -0
- package/fixtures/json-schema/network-ingest-event/invalid/vpn-stats-secret.json +27 -0
- package/fixtures/json-schema/network-ingest-event/valid/vpn-probe-batch.json +45 -0
- package/fixtures/json-schema/network-ingest-event/valid/vpn-tunnel-stats.json +26 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/vpn-managed-bad-token.json +15 -0
- package/fixtures/json-schema/network-runtime-protocol/invalid/vpn-managed-mode-override.json +16 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/managed-vpn-macos-enrollment.json +27 -0
- package/fixtures/json-schema/network-runtime-protocol/valid/vpn-managed-connect.json +15 -0
- package/fixtures/openapi/AgentChatInput/invalid/empty-question.json +4 -0
- package/fixtures/openapi/AgentChatInput/invalid/system-role.json +9 -0
- package/fixtures/openapi/AgentChatInput/valid/authorized-background.json +5 -0
- package/fixtures/openapi/AgentChatInput/valid/conversation.json +15 -0
- package/fixtures/openapi/AgentRunnerToolCallRequest/invalid/model-identity.json +1 -0
- package/fixtures/openapi/AgentRunnerToolCallRequest/valid/search.json +1 -0
- package/fixtures/openapi/ApplicationInput/invalid/negative-version.json +6 -0
- package/fixtures/openapi/ApplicationInput/invalid/zero-version.json +6 -0
- package/fixtures/openapi/ApplicationInput/valid/versioned.json +6 -0
- package/fixtures/openapi/ApprovalRequest/invalid/resolved-scopes.json +20 -0
- package/fixtures/openapi/ApprovalRequest/valid/resolved-scopes.json +21 -0
- package/fixtures/openapi/BuildTemplateInput/invalid/negative-revision.json +6 -0
- package/fixtures/openapi/BuildTemplateInput/valid/draft.json +11 -0
- package/fixtures/openapi/BuildTriggerRequest/invalid/no-ref.json +1 -0
- package/fixtures/openapi/BuildTriggerRequest/valid/no-environment.json +1 -0
- package/fixtures/openapi/BuildpacksConfiguration/invalid/mutable-builder.json +5 -0
- package/fixtures/openapi/BuildpacksConfiguration/invalid/privilege-override.json +6 -0
- package/fixtures/openapi/BuildpacksConfiguration/invalid/unsupported-platform.json +5 -0
- package/fixtures/openapi/BuildpacksConfiguration/valid/pinned.json +5 -0
- package/fixtures/openapi/CapabilityAssessment/invalid/contract.json +16 -0
- package/fixtures/openapi/CapabilityAssessment/valid/contract.json +16 -0
- package/fixtures/openapi/CapabilityPlan/invalid/contract.json +16 -0
- package/fixtures/openapi/CapabilityPlan/valid/contract.json +19 -0
- package/fixtures/openapi/CapabilityPlanValidation/invalid/contract.json +5 -0
- package/fixtures/openapi/CapabilityPlanValidation/valid/contract.json +11 -0
- package/fixtures/openapi/CapabilityTask/invalid/contract.json +33 -0
- package/fixtures/openapi/CapabilityTask/valid/contract.json +34 -0
- package/fixtures/openapi/CapabilityTaskInput/invalid/contract.json +22 -0
- package/fixtures/openapi/CapabilityTaskInput/valid/contract.json +22 -0
- package/fixtures/openapi/CapabilityValueSemantic/invalid/contract.json +4 -0
- package/fixtures/openapi/CapabilityValueSemantic/valid/contract.json +7 -0
- package/fixtures/openapi/ConnectionCheckResult/invalid/missing-health.json +1 -0
- package/fixtures/openapi/ConnectionCheckResult/invalid/task-id.json +1 -0
- package/fixtures/openapi/ConnectionCheckResult/valid/failure.json +1 -0
- package/fixtures/openapi/ConnectionCheckResult/valid/healthy.json +1 -0
- package/fixtures/openapi/DeliveryAccessResult/invalid/release-verification.json +8 -0
- package/fixtures/openapi/DeliveryAccessResult/valid/release-verification.json +8 -0
- package/fixtures/openapi/DeliveryBatchAssessment/invalid/release-verification.json +11 -0
- package/fixtures/openapi/DeliveryBatchAssessment/valid/release-verification.json +11 -0
- package/fixtures/openapi/DeliveryBatchAssessmentInput/invalid/release-verification.json +9 -0
- package/fixtures/openapi/DeliveryBatchAssessmentInput/valid/release-verification.json +8 -0
- package/fixtures/openapi/DeliveryBatchInput/invalid/ambiguous-source.json +19 -0
- package/fixtures/openapi/DeliveryBatchInput/invalid/missing-idempotency.json +16 -0
- package/fixtures/openapi/DeliveryBatchInput/valid/quick-deploy.json +17 -0
- package/fixtures/openapi/DeliveryBatchInput/valid/saved-workflow.json +5 -0
- package/fixtures/openapi/DeliveryBlueprintInput/invalid/unversioned-preset.json +31 -0
- package/fixtures/openapi/DeliveryBlueprintInput/valid/service-preset.json +32 -0
- package/fixtures/openapi/DeliveryDocument/invalid/unknown-field.json +24 -0
- package/fixtures/openapi/DeliveryDocument/invalid/unknown-kind.json +23 -0
- package/fixtures/openapi/DeliveryDocument/invalid/unknown-version.json +23 -0
- package/fixtures/openapi/DeliveryDocument/valid/build-template.json +26 -0
- package/fixtures/openapi/DeliveryDocument/valid/deployment-template.json +26 -0
- package/fixtures/openapi/DeliveryDocument/valid/legacy-dag.json +39 -0
- package/fixtures/openapi/DeliveryDocument/valid/workflow-template.json +23 -0
- package/fixtures/openapi/DeliveryDocument/valid/workflow.json +20 -0
- package/fixtures/openapi/DeliveryDraftInput/invalid/short-idempotency-key.json +30 -0
- package/fixtures/openapi/DeliveryDraftInput/valid/idempotent-create.json +30 -0
- package/fixtures/openapi/DeliveryDraftService/invalid/zero-version.json +7 -0
- package/fixtures/openapi/DeliveryDraftService/valid/versioned-template.json +9 -0
- package/fixtures/openapi/DeliveryExecutionHistoryPage/invalid-kind.json +9 -0
- package/fixtures/openapi/DeliveryExecutionHistoryPage/valid-build.json +16 -0
- package/fixtures/openapi/DeliveryExecutionHistoryPage/valid-empty.json +3 -0
- package/fixtures/openapi/DeliveryPlanApprovalInput/invalid/confirm.json +1 -0
- package/fixtures/openapi/DeliveryPlanApprovalInput/valid/approve.json +1 -0
- package/fixtures/openapi/DeliveryPlanInput/invalid/draft-manifest-revision.json +1 -0
- package/fixtures/openapi/DeliveryPlanInput/valid/manifest-revision.json +1 -0
- package/fixtures/openapi/DeliveryTargetInput/invalid/deploy-without-environment.json +7 -0
- package/fixtures/openapi/DeliveryTargetInput/valid/build-without-environment.json +6 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/duplicate-kind.json +13 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/embedded-credentials.json +16 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/empty-kinds.json +10 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/negative-generation.json +15 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/invalid/unknown-kind.json +12 -0
- package/fixtures/openapi/DeliveryTemplateSourceInput/valid/manual-source.json +15 -0
- package/fixtures/openapi/DeliveryWorkflowDefinition/invalid/unversioned-template.json +15 -0
- package/fixtures/openapi/DeliveryWorkflowDefinition/valid/cross-app.json +24 -0
- package/fixtures/openapi/DeliveryWorkflowInput/invalid/short-key.json +1 -0
- package/fixtures/openapi/DeliveryWorkflowInput/valid/idempotent-create.json +1 -0
- package/fixtures/openapi/DeploymentTemplatePreviewInput/invalid/invalid-target-override.json +7 -0
- package/fixtures/openapi/DeploymentTemplatePreviewInput/invalid/invalid-zero-version.json +6 -0
- package/fixtures/openapi/DeploymentTemplatePreviewInput/valid/valid.json +6 -0
- package/fixtures/openapi/DockerDeliveryConfiguration/invalid/empty-mappings.json +5 -0
- package/fixtures/openapi/DockerDeliveryConfiguration/valid/compose.json +7 -0
- package/fixtures/openapi/DockerDeliverySnapshot/invalid/missing-required-field.json +19 -0
- package/fixtures/openapi/DockerDeliverySnapshot/valid/frozen-project.json +20 -0
- package/fixtures/openapi/DockerOperationCallbackRequest/invalid/cancellation-acknowledged-not-boolean.json +13 -0
- package/fixtures/openapi/DockerOperationCallbackRequest/valid/cancellation-acknowledged.json +13 -0
- package/fixtures/openapi/DockerProjectInput/invalid/empty-host.json +4 -0
- package/fixtures/openapi/DockerProjectInput/valid/inline-idempotent.json +7 -0
- package/fixtures/openapi/DockerQuickCreateHostInput/invalid/capacity-type.json +1 -0
- package/fixtures/openapi/DockerQuickCreateHostInput/valid/capacity.json +1 -0
- package/fixtures/openapi/HelmDeliveryConfiguration/invalid/plain-credential.json +21 -0
- package/fixtures/openapi/HelmDeliveryConfiguration/invalid/release-name.json +20 -0
- package/fixtures/openapi/HelmDeliveryConfiguration/valid/private-oci.json +20 -0
- package/fixtures/openapi/HelmDeliverySnapshot/invalid/secret-plan.json +31 -0
- package/fixtures/openapi/HelmDeliverySnapshot/invalid/unknown-operation.json +28 -0
- package/fixtures/openapi/HelmDeliverySnapshot/valid/first-install.json +28 -0
- package/fixtures/openapi/IdentityApplication/invalid/outpost-status.json +1 -0
- package/fixtures/openapi/IdentityApplicationOnboardingInput/invalid/missing-access.json +12 -0
- package/fixtures/openapi/IdentityApplicationOnboardingInput/valid/link.json +13 -0
- package/fixtures/openapi/IdentityOutpost/invalid/missing-runtime-status.json +9 -0
- package/fixtures/openapi/IdentityOutpost/valid/healthy.json +17 -0
- package/fixtures/openapi/IdentityOutpost/valid/unregistered.json +12 -0
- package/fixtures/openapi/IdentityOutpostDeployment/invalid/missing-protocol.json +3 -0
- package/fixtures/openapi/IdentityOutpostDeployment/valid/remote.json +6 -0
- package/fixtures/openapi/IdentityOutpostInput/invalid/forged-observation.json +7 -0
- package/fixtures/openapi/IdentityOutpostInput/valid/forward-auth.json +6 -0
- package/fixtures/openapi/IdentityOutpostInput/valid/legacy.json +8 -0
- package/fixtures/openapi/IdentityProviderSetup/invalid/fake-verification.json +1 -0
- package/fixtures/openapi/IdentityProviderSetup/valid/incomplete.json +1 -0
- package/fixtures/openapi/IdentityProviderSetup/valid/remote.json +1 -0
- package/fixtures/openapi/IdentityProviderUserMetadata/invalid/attributes.json +8 -0
- package/fixtures/openapi/IdentityProviderUserMetadata/valid/attributes.json +13 -0
- package/fixtures/openapi/KubernetesCustomResource/invalid/negative-generation.json +1 -0
- package/fixtures/openapi/KubernetesCustomResource/valid/deleting-operator.json +1 -0
- package/fixtures/openapi/KubernetesResourceCreationReceipt/invalid/manifest-content.json +20 -0
- package/fixtures/openapi/KubernetesResourceCreationReceipt/valid/confirmed.json +20 -0
- package/fixtures/openapi/KubernetesResourceCreationReceipt/valid/unknown.json +19 -0
- package/fixtures/openapi/ManifestDeploymentEnvelope/invalid/negative-resource-observation.json +57 -0
- package/fixtures/openapi/ManifestDeploymentEnvelope/valid/operator-deleting.json +57 -0
- package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/gitops-empty.json +7 -0
- package/fixtures/openapi/ManifestExecutionTaskPayload/valid/gitops-frozen-children.json +18 -0
- package/fixtures/openapi/ManifestKustomizeOptions/invalid/escaping-entry.json +1 -0
- package/fixtures/openapi/ManifestKustomizeOptions/invalid/mutable-image.json +1 -0
- package/fixtures/openapi/ManifestKustomizeOptions/valid/overlay-images.json +7 -0
- package/fixtures/openapi/ManifestRevisionInput/invalid/missing-version.json +1 -0
- package/fixtures/openapi/ManifestRevisionInput/valid/current-draft.json +1 -0
- package/fixtures/openapi/ManifestServiceTemplateInputs/invalid/mutable-image.json +8 -0
- package/fixtures/openapi/ManifestServiceTemplateInputs/valid/frozen-service-image.json +9 -0
- package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/auto-with-gateway.json +6 -0
- package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/missing-manual-gateway.json +5 -0
- package/fixtures/openapi/NetworkVPNConnectionIntentInput/invalid/mode-override.json +7 -0
- package/fixtures/openapi/NetworkVPNConnectionIntentInput/valid/auto-intent.json +5 -0
- package/fixtures/openapi/NetworkVPNConnectionIntentInput/valid/manual-intent.json +6 -0
- package/fixtures/openapi/NetworkVPNProfileInput/invalid/unknown-private-key.json +25 -0
- package/fixtures/openapi/NetworkVPNProfileInput/valid/assigned-profile.json +24 -0
- package/fixtures/openapi/NetworkVPNSelectionPolicyInput/invalid/unbounded-attempts.json +21 -0
- package/fixtures/openapi/NetworkVPNSelectionPolicyInput/valid/provider-policy.json +21 -0
- package/fixtures/openapi/ObservabilityMetricAssessmentInput/invalid/arbitrary-expression.json +10 -0
- package/fixtures/openapi/ObservabilityMetricAssessmentInput/valid/metric-window.json +10 -0
- package/fixtures/openapi/PluginManifest/valid/hermes-api.json +53 -0
- package/fixtures/openapi/ProgressiveRolloutControlInput/invalid/missing-identity.json +5 -0
- package/fixtures/openapi/ProgressiveRolloutControlInput/invalid/skip-analysis.json +5 -0
- package/fixtures/openapi/ProgressiveRolloutControlInput/valid/pause.json +5 -0
- package/fixtures/openapi/ReleaseTargetInput/invalid/missing-required-field.json +15 -0
- package/fixtures/openapi/ReleaseTargetInput/valid/docker-compose.json +16 -0
- package/fixtures/openapi/RepositoryAnalysis/invalid/moving-ref.json +11 -0
- package/fixtures/openapi/RepositoryAnalysis/valid/go.json +29 -0
- package/fixtures/openapi/RepositoryAnalysisInput/invalid/arbitrary-source-url.json +6 -0
- package/fixtures/openapi/RepositoryAnalysisInput/invalid/missing-ref.json +4 -0
- package/fixtures/openapi/RepositoryAnalysisInput/valid/nested-project.json +6 -0
- package/fixtures/openapi/ServiceDeploymentTemplateBinding/invalid/invalid-unpinned.json +4 -0
- package/fixtures/openapi/ServiceDeploymentTemplateBinding/valid/valid.json +7 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-executable-schema.json +25 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-missing-schema.json +21 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/invalid-mixed-renderers.json +40 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/valid-nested-parameters.json +41 -0
- package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/valid-yaml.json +34 -0
- package/fixtures/openapi/TemplatePublishInput/invalid/missing-revision.json +1 -0
- package/fixtures/openapi/TemplatePublishInput/invalid/unknown-field.json +4 -0
- package/fixtures/openapi/TemplatePublishInput/invalid/zero-revision.json +3 -0
- package/fixtures/openapi/TemplatePublishInput/valid/revision.json +3 -0
- package/fixtures/openapi/ToolCapability/invalid/bad-idempotency.json +35 -0
- package/fixtures/openapi/ToolCapability/invalid/unversioned-check.json +47 -0
- package/fixtures/openapi/ToolCapability/valid/checks.json +48 -0
- package/fixtures/openapi/ToolCapability/valid/versioned-task.json +35 -0
- package/fixtures/openapi/ToolInvocationRequest/invalid/empty-version.json +8 -0
- package/fixtures/openapi/ToolInvocationRequest/valid/versioned.json +8 -0
- package/fixtures/openapi/ToolInvocationResult/invalid/missing-status-call.json +13 -0
- package/fixtures/openapi/ToolInvocationResult/valid/task.json +20 -0
- package/fixtures/openapi/UpdateBrandingSettingsRequest/invalid/dark-logo-type.json +9 -0
- package/fixtures/openapi/UpdateBrandingSettingsRequest/valid/dark-logos.json +10 -0
- package/fixtures/openapi/VirtualMachineCreateInput/invalid/capacity-type.json +1 -0
- package/fixtures/openapi/VirtualMachineCreateInput/valid/capacity.json +1 -0
- package/fixtures/openapi/VirtualizationCapacityInput/invalid/missing-disk.json +1 -0
- package/fixtures/openapi/VirtualizationCapacityInput/valid/running-vm.json +1 -0
- package/fixtures/openapi/VirtualizationCapacityResult/invalid/invented-status.json +1 -0
- package/fixtures/openapi/VirtualizationCapacityResult/valid/available.json +1 -0
- package/fixtures/openapi/VirtualizationWorkerCreateInput/invalid/secret-input.json +5 -0
- package/fixtures/openapi/VirtualizationWorkerCreateInput/valid/one-worker.json +4 -0
- package/fixtures/openapi/VirtualizationWorkerPoolInput/invalid/external-owner.json +27 -0
- package/fixtures/openapi/VirtualizationWorkerPoolInput/invalid/zero-budget.json +27 -0
- package/fixtures/openapi/VirtualizationWorkerPoolInput/valid/registered.json +27 -0
- package/fixtures/openapi/VirtualizationWorkerPoolListEnvelope/invalid/nested-data.json +5 -0
- package/fixtures/openapi/VirtualizationWorkerPoolListEnvelope/valid/empty.json +3 -0
- package/fixtures/openapi/WorkbenchContextSelection/invalid/missing-file-content.json +8 -0
- package/fixtures/openapi/WorkbenchContextSelection/invalid/unknown-reference-kind.json +8 -0
- package/fixtures/openapi/WorkbenchContextSelection/valid/text-and-resource.json +17 -0
- package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/trigger-without-plan.json +10 -0
- package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/unknown-trigger.json +28 -0
- package/fixtures/openapi/WorkbenchInspectionTaskInput/invalid/zero-interval.json +28 -0
- package/fixtures/openapi/WorkbenchInspectionTaskInput/valid/alert-capability.json +30 -0
- package/fixtures/openapi/WorkbenchInspectionTaskInput/valid/scheduled-capability.json +28 -0
- package/fixtures/openapi/WorkbenchInspectionTrigger/invalid/missing-rule.json +3 -0
- package/fixtures/openapi/WorkbenchInspectionTrigger/invalid/schedule-alert-selector.json +4 -0
- package/fixtures/openapi/WorkbenchInspectionTrigger/valid/schedule.json +3 -0
- package/fixtures/openapi/WorkbenchModelPreferences/invalid/unknown-effort.json +1 -0
- package/fixtures/openapi/WorkbenchModelPreferences/valid/selected.json +1 -0
- package/fixtures/openapi/WorkflowCatalogPage/invalid/unsupported-kind.json +6 -0
- package/fixtures/openapi/WorkflowCatalogPage/valid/build-without-environment.json +6 -0
- package/fixtures/openapi/WorkflowTemplateInput/invalid/zero-revision.json +6 -0
- package/fixtures/openapi/WorkflowTemplateInput/valid/draft.json +10 -0
- package/gen/go/sohaapi/client.go +11 -3
- package/gen/go/sohaapi/client_test.go +26 -3
- package/gen/go/sohaapi/types.go +8103 -863
- package/gen/go/sohaapi/types_test.go +100 -1
- package/gen/go/sohaapi/vpn_models_test.go +21 -0
- package/gen/ts/sohaapi/index.ts +20390 -13160
- package/go.mod +107 -5
- package/go.sum +379 -16
- package/helmrelease/delivery.go +283 -0
- package/helmrelease/delivery_test.go +102 -0
- package/helmrelease/frozen_chart.go +91 -0
- package/helmrelease/result.go +27 -0
- package/helmrelease/runtime/delivery.go +508 -0
- package/helmrelease/runtime/delivery_test.go +236 -0
- package/helmrelease/runtime/resources_test.go +60 -0
- package/helmrelease/values.go +99 -0
- package/knowledge/context-envelope.schema.json +1 -0
- package/mcp/gateway-manifest.schema.json +387 -72
- package/network/README.md +40 -0
- package/network/network-ingest-event.schema.json +228 -0
- package/network/network-runtime-protocol.schema.json +457 -1
- package/openapi/soha-api.json +54874 -38722
- package/openapi/soha-api.yaml +12199 -4982
- package/openapi/spec_generated.go +3 -3
- package/package.json +3 -1
- package/resource/manifest_health.go +155 -0
- package/resource/manifest_health_test.go +37 -0
- package/resource/models.go +14 -0
- package/resource/runtime/argocd.go +166 -0
- package/resource/runtime/argocd_integration_test.go +142 -0
- package/resource/runtime/argocd_observation.go +143 -0
- package/resource/runtime/argocd_operation.go +253 -0
- package/resource/runtime/argocd_resources.go +115 -0
- package/resource/runtime/argocd_resources_test.go +107 -0
- package/resource/runtime/argocd_test.go +386 -0
- package/resource/runtime/health.go +115 -0
- package/resource/runtime/health_test.go +78 -0
- package/resource/runtime/operator_integration_test.go +174 -0
- package/resource/runtime/ownership.go +178 -0
- package/resource/runtime/ownership_test.go +178 -0
- package/resource/runtime/rollout_integration_test.go +287 -0
- package/resource/runtime/rollout_observation.go +252 -0
- package/resource/runtime/rollout_operation.go +398 -0
- package/resource/runtime/rollout_resources.go +385 -0
- package/resource/runtime/rollout_task.go +165 -0
- package/resource/runtime/rollout_test.go +450 -0
|
@@ -1,102 +1,98 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.1.
|
|
2
|
+
"version": "0.1.19",
|
|
3
3
|
"generatedFrom": "openapi/soha-api.yaml",
|
|
4
4
|
"entries": [
|
|
5
5
|
{
|
|
6
6
|
"kind": "additionalPropertiesTrue",
|
|
7
|
-
"path": "components/schemas/
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"kind": "additionalPropertiesTrue",
|
|
11
|
-
"path": "components/schemas/AgentRun/properties/analysisArtifacts/items/additionalProperties"
|
|
7
|
+
"path": "components/schemas/AIEnvironmentTemplate/properties/networkPolicy/additionalProperties"
|
|
12
8
|
},
|
|
13
9
|
{
|
|
14
10
|
"kind": "additionalPropertiesTrue",
|
|
15
|
-
"path": "components/schemas/
|
|
11
|
+
"path": "components/schemas/AIEnvironmentTemplate/properties/resourcePolicy/additionalProperties"
|
|
16
12
|
},
|
|
17
13
|
{
|
|
18
14
|
"kind": "additionalPropertiesTrue",
|
|
19
|
-
"path": "components/schemas/
|
|
15
|
+
"path": "components/schemas/AIEnvironmentTemplateInput/properties/networkPolicy/additionalProperties"
|
|
20
16
|
},
|
|
21
17
|
{
|
|
22
18
|
"kind": "additionalPropertiesTrue",
|
|
23
|
-
"path": "components/schemas/
|
|
19
|
+
"path": "components/schemas/AIEnvironmentTemplateInput/properties/resourcePolicy/additionalProperties"
|
|
24
20
|
},
|
|
25
21
|
{
|
|
26
22
|
"kind": "additionalPropertiesTrue",
|
|
27
|
-
"path": "components/schemas/
|
|
23
|
+
"path": "components/schemas/AISkillSettings/properties/inputSchema/additionalProperties"
|
|
28
24
|
},
|
|
29
25
|
{
|
|
30
26
|
"kind": "additionalPropertiesTrue",
|
|
31
|
-
"path": "components/schemas/
|
|
27
|
+
"path": "components/schemas/AISkillSettings/properties/outputSchema/additionalProperties"
|
|
32
28
|
},
|
|
33
29
|
{
|
|
34
30
|
"kind": "additionalPropertiesTrue",
|
|
35
|
-
"path": "components/schemas/
|
|
31
|
+
"path": "components/schemas/AgentProviderConformanceRun/properties/results/items/additionalProperties"
|
|
36
32
|
},
|
|
37
33
|
{
|
|
38
34
|
"kind": "additionalPropertiesTrue",
|
|
39
|
-
"path": "components/schemas/
|
|
35
|
+
"path": "components/schemas/AgentRun/additionalProperties"
|
|
40
36
|
},
|
|
41
37
|
{
|
|
42
38
|
"kind": "additionalPropertiesTrue",
|
|
43
|
-
"path": "components/schemas/
|
|
39
|
+
"path": "components/schemas/AgentRun/properties/analysisArtifacts/items/additionalProperties"
|
|
44
40
|
},
|
|
45
41
|
{
|
|
46
42
|
"kind": "additionalPropertiesTrue",
|
|
47
|
-
"path": "components/schemas/
|
|
43
|
+
"path": "components/schemas/AgentRun/properties/input/additionalProperties"
|
|
48
44
|
},
|
|
49
45
|
{
|
|
50
46
|
"kind": "additionalPropertiesTrue",
|
|
51
|
-
"path": "components/schemas/
|
|
47
|
+
"path": "components/schemas/AgentRun/properties/output/additionalProperties"
|
|
52
48
|
},
|
|
53
49
|
{
|
|
54
50
|
"kind": "additionalPropertiesTrue",
|
|
55
|
-
"path": "components/schemas/
|
|
51
|
+
"path": "components/schemas/AgentRun/properties/scope/additionalProperties"
|
|
56
52
|
},
|
|
57
53
|
{
|
|
58
54
|
"kind": "additionalPropertiesTrue",
|
|
59
|
-
"path": "components/schemas/
|
|
55
|
+
"path": "components/schemas/AgentRun/properties/skillBindings/items/additionalProperties"
|
|
60
56
|
},
|
|
61
57
|
{
|
|
62
58
|
"kind": "additionalPropertiesTrue",
|
|
63
|
-
"path": "components/schemas/
|
|
59
|
+
"path": "components/schemas/AgentRun/properties/toolBindings/items/additionalProperties"
|
|
64
60
|
},
|
|
65
61
|
{
|
|
66
62
|
"kind": "additionalPropertiesTrue",
|
|
67
|
-
"path": "components/schemas/
|
|
63
|
+
"path": "components/schemas/AgentRun/properties/toolset/additionalProperties"
|
|
68
64
|
},
|
|
69
65
|
{
|
|
70
66
|
"kind": "additionalPropertiesTrue",
|
|
71
|
-
"path": "components/schemas/
|
|
67
|
+
"path": "components/schemas/AgentRunCallbackRequest/properties/analysisArtifacts/items/additionalProperties"
|
|
72
68
|
},
|
|
73
69
|
{
|
|
74
70
|
"kind": "additionalPropertiesTrue",
|
|
75
|
-
"path": "components/schemas/
|
|
71
|
+
"path": "components/schemas/AgentRunCallbackRequest/properties/payload/additionalProperties"
|
|
76
72
|
},
|
|
77
73
|
{
|
|
78
74
|
"kind": "additionalPropertiesTrue",
|
|
79
|
-
"path": "components/schemas/
|
|
75
|
+
"path": "components/schemas/AgentRunCallbackRequest/properties/toolExecutions/items/additionalProperties"
|
|
80
76
|
},
|
|
81
77
|
{
|
|
82
78
|
"kind": "additionalPropertiesTrue",
|
|
83
|
-
"path": "components/schemas/
|
|
79
|
+
"path": "components/schemas/AgentRunCallbackWorkbenchMessageDoneEvent/allOf/1/properties/metadata/additionalProperties"
|
|
84
80
|
},
|
|
85
81
|
{
|
|
86
82
|
"kind": "additionalPropertiesTrue",
|
|
87
|
-
"path": "components/schemas/
|
|
83
|
+
"path": "components/schemas/AgentRunToolCallRequest/properties/input/additionalProperties"
|
|
88
84
|
},
|
|
89
85
|
{
|
|
90
86
|
"kind": "additionalPropertiesTrue",
|
|
91
|
-
"path": "components/schemas/
|
|
87
|
+
"path": "components/schemas/AgentToolCallResult/additionalProperties"
|
|
92
88
|
},
|
|
93
89
|
{
|
|
94
90
|
"kind": "additionalPropertiesTrue",
|
|
95
|
-
"path": "components/schemas/
|
|
91
|
+
"path": "components/schemas/AgentToolCallResult/properties/output/additionalProperties"
|
|
96
92
|
},
|
|
97
93
|
{
|
|
98
94
|
"kind": "additionalPropertiesTrue",
|
|
99
|
-
"path": "components/schemas/
|
|
95
|
+
"path": "components/schemas/AgentToolCallResult/properties/toolExecution/additionalProperties"
|
|
100
96
|
},
|
|
101
97
|
{
|
|
102
98
|
"kind": "additionalPropertiesTrue",
|
|
@@ -210,14 +206,6 @@
|
|
|
210
206
|
"kind": "additionalPropertiesTrue",
|
|
211
207
|
"path": "components/schemas/AuthBootstrapEnvelope/properties/data/properties/permissionSnapshot/additionalProperties"
|
|
212
208
|
},
|
|
213
|
-
{
|
|
214
|
-
"kind": "additionalPropertiesTrue",
|
|
215
|
-
"path": "components/schemas/IdentityApplication/properties/metadata/additionalProperties"
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
"kind": "additionalPropertiesTrue",
|
|
219
|
-
"path": "components/schemas/IdentityApplicationInput/properties/metadata/additionalProperties"
|
|
220
|
-
},
|
|
221
209
|
{
|
|
222
210
|
"kind": "additionalPropertiesTrue",
|
|
223
211
|
"path": "components/schemas/BuildPolicy/properties/buildArgs/additionalProperties"
|
|
@@ -246,6 +234,10 @@
|
|
|
246
234
|
"kind": "additionalPropertiesTrue",
|
|
247
235
|
"path": "components/schemas/BuildTemplateInput/properties/variableSchema/additionalProperties"
|
|
248
236
|
},
|
|
237
|
+
{
|
|
238
|
+
"kind": "additionalPropertiesTrue",
|
|
239
|
+
"path": "components/schemas/CapabilityCall/properties/input/additionalProperties"
|
|
240
|
+
},
|
|
249
241
|
{
|
|
250
242
|
"kind": "additionalPropertiesTrue",
|
|
251
243
|
"path": "components/schemas/CohereRerankRequest/additionalProperties"
|
|
@@ -254,6 +246,14 @@
|
|
|
254
246
|
"kind": "additionalPropertiesTrue",
|
|
255
247
|
"path": "components/schemas/CohereRerankRequest/properties/documents/items/oneOf/1/additionalProperties"
|
|
256
248
|
},
|
|
249
|
+
{
|
|
250
|
+
"kind": "additionalPropertiesTrue",
|
|
251
|
+
"path": "components/schemas/DeliveryGitLabPushEvent/additionalProperties"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"kind": "additionalPropertiesTrue",
|
|
255
|
+
"path": "components/schemas/DeliveryGitLabPushEvent/properties/project/additionalProperties"
|
|
256
|
+
},
|
|
257
257
|
{
|
|
258
258
|
"kind": "additionalPropertiesTrue",
|
|
259
259
|
"path": "components/schemas/DeliveryPlan/properties/buildArgs/additionalProperties"
|
|
@@ -354,6 +354,14 @@
|
|
|
354
354
|
"kind": "additionalPropertiesTrue",
|
|
355
355
|
"path": "components/schemas/GovernanceStatus/properties/metadata/additionalProperties"
|
|
356
356
|
},
|
|
357
|
+
{
|
|
358
|
+
"kind": "additionalPropertiesTrue",
|
|
359
|
+
"path": "components/schemas/IdentityApplication/properties/metadata/additionalProperties"
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
"kind": "additionalPropertiesTrue",
|
|
363
|
+
"path": "components/schemas/IdentityApplicationInput/properties/metadata/additionalProperties"
|
|
364
|
+
},
|
|
357
365
|
{
|
|
358
366
|
"kind": "additionalPropertiesTrue",
|
|
359
367
|
"path": "components/schemas/IdentityProvider/properties/config/additionalProperties"
|
|
@@ -374,6 +382,10 @@
|
|
|
374
382
|
"kind": "additionalPropertiesTrue",
|
|
375
383
|
"path": "components/schemas/JSONSchema/additionalProperties"
|
|
376
384
|
},
|
|
385
|
+
{
|
|
386
|
+
"kind": "additionalPropertiesTrue",
|
|
387
|
+
"path": "components/schemas/KnowledgeConnectorInput/properties/config/additionalProperties"
|
|
388
|
+
},
|
|
377
389
|
{
|
|
378
390
|
"kind": "additionalPropertiesTrue",
|
|
379
391
|
"path": "components/schemas/LLMCallLog/properties/metadata/additionalProperties"
|
|
@@ -668,16 +680,6 @@
|
|
|
668
680
|
"path": "components/schemas/AgentRunCallbackWorkbenchCardCommandEvent/allOf/1/properties/command",
|
|
669
681
|
"target": "#/components/schemas/AnyValue"
|
|
670
682
|
},
|
|
671
|
-
{
|
|
672
|
-
"kind": "schemaRef",
|
|
673
|
-
"path": "components/schemas/AnthropicMessagesRequest/properties/system",
|
|
674
|
-
"target": "#/components/schemas/AnyValue"
|
|
675
|
-
},
|
|
676
|
-
{
|
|
677
|
-
"kind": "schemaRef",
|
|
678
|
-
"path": "components/schemas/ApprovalRequest/properties/output",
|
|
679
|
-
"target": "#/components/schemas/AnyValue"
|
|
680
|
-
},
|
|
681
683
|
{
|
|
682
684
|
"kind": "schemaRef",
|
|
683
685
|
"path": "components/schemas/AlertRule/properties/datasourceSelector",
|
|
@@ -723,6 +725,26 @@
|
|
|
723
725
|
"path": "components/schemas/AlertRuleTestResult/properties/samples/items",
|
|
724
726
|
"target": "#/components/schemas/GenericObject"
|
|
725
727
|
},
|
|
728
|
+
{
|
|
729
|
+
"kind": "schemaRef",
|
|
730
|
+
"path": "components/schemas/AnthropicMessagesRequest/properties/system",
|
|
731
|
+
"target": "#/components/schemas/AnyValue"
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
"kind": "schemaRef",
|
|
735
|
+
"path": "components/schemas/ApprovalRequest/properties/output",
|
|
736
|
+
"target": "#/components/schemas/AnyValue"
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"kind": "schemaRef",
|
|
740
|
+
"path": "components/schemas/DeliveryBlueprint/properties/executionHints",
|
|
741
|
+
"target": "#/components/schemas/GenericObject"
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
"kind": "schemaRef",
|
|
745
|
+
"path": "components/schemas/DeliveryBlueprintInput/properties/executionHints",
|
|
746
|
+
"target": "#/components/schemas/GenericObject"
|
|
747
|
+
},
|
|
726
748
|
{
|
|
727
749
|
"kind": "schemaRef",
|
|
728
750
|
"path": "components/schemas/DeliveryDraft/properties/executionHints",
|
|
@@ -753,6 +775,16 @@
|
|
|
753
775
|
"path": "components/schemas/GenericItemsEnvelope/properties/items/items",
|
|
754
776
|
"target": "#/components/schemas/AnyValue"
|
|
755
777
|
},
|
|
778
|
+
{
|
|
779
|
+
"kind": "schemaRef",
|
|
780
|
+
"path": "components/schemas/IdentityOutpost/properties/metadata",
|
|
781
|
+
"target": "#/components/schemas/GenericObject"
|
|
782
|
+
},
|
|
783
|
+
{
|
|
784
|
+
"kind": "schemaRef",
|
|
785
|
+
"path": "components/schemas/IdentityOutpostInput/properties/metadata",
|
|
786
|
+
"target": "#/components/schemas/GenericObject"
|
|
787
|
+
},
|
|
756
788
|
{
|
|
757
789
|
"kind": "schemaRef",
|
|
758
790
|
"path": "components/schemas/OpenAIEmbeddingRequest/properties/input",
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
package delivery
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"crypto/sha256"
|
|
6
|
+
"encoding/hex"
|
|
7
|
+
"fmt"
|
|
8
|
+
"math"
|
|
9
|
+
"slices"
|
|
10
|
+
"strconv"
|
|
11
|
+
"strings"
|
|
12
|
+
"unicode/utf16"
|
|
13
|
+
"unicode/utf8"
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
func Digest(data []byte) string {
|
|
17
|
+
digest := sha256.Sum256(data)
|
|
18
|
+
return "sha256:" + hex.EncodeToString(digest[:])
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// CanonicalJSON implements RFC 8785 for parsed JSON values. Integers outside the
|
|
22
|
+
// interoperable range are rejected by the document parser before reaching here.
|
|
23
|
+
func CanonicalJSON(value any) ([]byte, error) {
|
|
24
|
+
var output bytes.Buffer
|
|
25
|
+
if err := appendCanonical(&output, value, 0); err != nil {
|
|
26
|
+
return nil, err
|
|
27
|
+
}
|
|
28
|
+
return output.Bytes(), nil
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func appendCanonical(output *bytes.Buffer, value any, depth int) error {
|
|
32
|
+
if depth > 64 {
|
|
33
|
+
return fmt.Errorf("canonical value exceeds nesting limit")
|
|
34
|
+
}
|
|
35
|
+
switch value := value.(type) {
|
|
36
|
+
case nil:
|
|
37
|
+
output.WriteString("null")
|
|
38
|
+
case bool:
|
|
39
|
+
output.WriteString(strconv.FormatBool(value))
|
|
40
|
+
case string:
|
|
41
|
+
return appendJSONString(output, value)
|
|
42
|
+
case float64:
|
|
43
|
+
return appendJSONNumber(output, value)
|
|
44
|
+
case []any:
|
|
45
|
+
output.WriteByte('[')
|
|
46
|
+
for index, child := range value {
|
|
47
|
+
if index > 0 {
|
|
48
|
+
output.WriteByte(',')
|
|
49
|
+
}
|
|
50
|
+
if err := appendCanonical(output, child, depth+1); err != nil {
|
|
51
|
+
return err
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
output.WriteByte(']')
|
|
55
|
+
case map[string]any:
|
|
56
|
+
return appendJSONObject(output, value, depth)
|
|
57
|
+
default:
|
|
58
|
+
return fmt.Errorf("canonical value must be a parsed JSON value")
|
|
59
|
+
}
|
|
60
|
+
return nil
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func appendJSONObject(output *bytes.Buffer, value map[string]any, depth int) error {
|
|
64
|
+
keys := make([]string, 0, len(value))
|
|
65
|
+
for key := range value {
|
|
66
|
+
keys = append(keys, key)
|
|
67
|
+
}
|
|
68
|
+
slices.SortFunc(keys, func(a, b string) int {
|
|
69
|
+
return slices.Compare(utf16.Encode([]rune(a)), utf16.Encode([]rune(b)))
|
|
70
|
+
})
|
|
71
|
+
output.WriteByte('{')
|
|
72
|
+
for index, key := range keys {
|
|
73
|
+
if index > 0 {
|
|
74
|
+
output.WriteByte(',')
|
|
75
|
+
}
|
|
76
|
+
if err := appendJSONString(output, key); err != nil {
|
|
77
|
+
return err
|
|
78
|
+
}
|
|
79
|
+
output.WriteByte(':')
|
|
80
|
+
if err := appendCanonical(output, value[key], depth+1); err != nil {
|
|
81
|
+
return err
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
output.WriteByte('}')
|
|
85
|
+
return nil
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
func appendJSONString(output *bytes.Buffer, value string) error {
|
|
89
|
+
if !utf8.ValidString(value) {
|
|
90
|
+
return fmt.Errorf("canonical strings must be valid Unicode")
|
|
91
|
+
}
|
|
92
|
+
output.WriteByte('"')
|
|
93
|
+
for _, r := range value {
|
|
94
|
+
switch r {
|
|
95
|
+
case '"', '\\':
|
|
96
|
+
output.WriteByte('\\')
|
|
97
|
+
output.WriteRune(r)
|
|
98
|
+
case '\b':
|
|
99
|
+
output.WriteString(`\b`)
|
|
100
|
+
case '\t':
|
|
101
|
+
output.WriteString(`\t`)
|
|
102
|
+
case '\n':
|
|
103
|
+
output.WriteString(`\n`)
|
|
104
|
+
case '\f':
|
|
105
|
+
output.WriteString(`\f`)
|
|
106
|
+
case '\r':
|
|
107
|
+
output.WriteString(`\r`)
|
|
108
|
+
default:
|
|
109
|
+
if r < 0x20 {
|
|
110
|
+
fmt.Fprintf(output, `\u%04x`, r)
|
|
111
|
+
} else {
|
|
112
|
+
output.WriteRune(r)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
output.WriteByte('"')
|
|
117
|
+
return nil
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
func appendJSONNumber(output *bytes.Buffer, value float64) error {
|
|
121
|
+
if math.IsInf(value, 0) || math.IsNaN(value) {
|
|
122
|
+
return fmt.Errorf("canonical numbers must be finite")
|
|
123
|
+
}
|
|
124
|
+
if value == 0 {
|
|
125
|
+
output.WriteByte('0')
|
|
126
|
+
return nil
|
|
127
|
+
}
|
|
128
|
+
format := byte('f')
|
|
129
|
+
if math.Abs(value) < 1e-6 || math.Abs(value) >= 1e21 {
|
|
130
|
+
format = 'e'
|
|
131
|
+
}
|
|
132
|
+
text := strconv.FormatFloat(value, format, -1, 64)
|
|
133
|
+
text = strings.ReplaceAll(strings.ReplaceAll(text, "e-0", "e-"), "e+0", "e+")
|
|
134
|
+
output.WriteString(text)
|
|
135
|
+
return nil
|
|
136
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// Package delivery implements the versioned delivery document boundary shared
|
|
2
|
+
// by the server and CLI. It does not resolve references or authorize imports.
|
|
3
|
+
package delivery
|
|
4
|
+
|
|
5
|
+
import (
|
|
6
|
+
"bytes"
|
|
7
|
+
_ "embed"
|
|
8
|
+
"encoding/json"
|
|
9
|
+
"errors"
|
|
10
|
+
"fmt"
|
|
11
|
+
"strings"
|
|
12
|
+
"sync"
|
|
13
|
+
|
|
14
|
+
"github.com/santhosh-tekuri/jsonschema/v6"
|
|
15
|
+
"go.yaml.in/yaml/v3"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const APIVersion = "delivery.soha.io/v1alpha1"
|
|
19
|
+
const MaxFileBytes = 1 << 20
|
|
20
|
+
const MaxTotalBytes = 2 << 20
|
|
21
|
+
const MaxFiles = 100
|
|
22
|
+
|
|
23
|
+
//go:embed document.schema.json
|
|
24
|
+
var documentSchema []byte
|
|
25
|
+
|
|
26
|
+
func Schema() []byte { return bytes.Clone(documentSchema) }
|
|
27
|
+
|
|
28
|
+
type Metadata struct {
|
|
29
|
+
Name string `json:"name"`
|
|
30
|
+
DisplayName string `json:"displayName,omitempty"`
|
|
31
|
+
Description string `json:"description,omitempty"`
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type Document struct {
|
|
35
|
+
APIVersion string `json:"apiVersion"`
|
|
36
|
+
Kind string `json:"kind"`
|
|
37
|
+
Metadata Metadata `json:"metadata"`
|
|
38
|
+
Spec map[string]any `json:"spec"`
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type Diagnostic struct {
|
|
42
|
+
Path string `json:"path"`
|
|
43
|
+
Document int `json:"document"`
|
|
44
|
+
Pointer string `json:"pointer"`
|
|
45
|
+
Line int `json:"line,omitempty"`
|
|
46
|
+
Column int `json:"column,omitempty"`
|
|
47
|
+
Code string `json:"code"`
|
|
48
|
+
Message string `json:"message"`
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func (d Diagnostic) Error() string { return fmt.Sprintf("%s%s: %s", d.Path, d.Pointer, d.Message) }
|
|
52
|
+
|
|
53
|
+
var compiledSchemas = sync.OnceValues(func() (map[string]*jsonschema.Schema, error) {
|
|
54
|
+
resource, err := jsonschema.UnmarshalJSON(bytes.NewReader(documentSchema))
|
|
55
|
+
if err != nil {
|
|
56
|
+
return nil, err
|
|
57
|
+
}
|
|
58
|
+
const location = "https://contracts.opensoha.dev/delivery/document.schema.json"
|
|
59
|
+
compiler := jsonschema.NewCompiler()
|
|
60
|
+
compiler.AssertFormat()
|
|
61
|
+
if err := compiler.AddResource(location, resource); err != nil {
|
|
62
|
+
return nil, err
|
|
63
|
+
}
|
|
64
|
+
schemas := map[string]*jsonschema.Schema{}
|
|
65
|
+
for kind, name := range map[string]string{
|
|
66
|
+
"BuildTemplate": "DeliveryBuildTemplateDocument", "DeploymentTemplate": "DeliveryDeploymentTemplateDocument",
|
|
67
|
+
"WorkflowTemplate": "DeliveryWorkflowTemplateDocument", "Workflow": "DeliveryWorkflowDocument",
|
|
68
|
+
} {
|
|
69
|
+
schemas[kind], err = compiler.Compile(location + "#/$defs/" + name)
|
|
70
|
+
if err != nil {
|
|
71
|
+
return nil, err
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return schemas, nil
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
func validateDocument(path string, value any, locations map[string]*yaml.Node) (Document, []Diagnostic) {
|
|
78
|
+
root, ok := value.(map[string]any)
|
|
79
|
+
if !ok {
|
|
80
|
+
return Document{}, []Diagnostic{diagnostic(path, "", "document_object", "document must be an object", locations[""])}
|
|
81
|
+
}
|
|
82
|
+
if root["apiVersion"] != APIVersion {
|
|
83
|
+
return Document{}, []Diagnostic{diagnostic(path, "/apiVersion", "unsupported_version", "unsupported or missing apiVersion", locations["/apiVersion"])}
|
|
84
|
+
}
|
|
85
|
+
schemas, err := compiledSchemas()
|
|
86
|
+
if err != nil {
|
|
87
|
+
return Document{}, []Diagnostic{diagnostic(path, "", "schema_unavailable", "document schema could not be loaded", nil)}
|
|
88
|
+
}
|
|
89
|
+
kind, _ := root["kind"].(string)
|
|
90
|
+
schema, supported := schemas[kind]
|
|
91
|
+
if !supported {
|
|
92
|
+
return Document{}, []Diagnostic{diagnostic(path, "/kind", "unsupported_kind", "unsupported document kind", locations["/kind"])}
|
|
93
|
+
}
|
|
94
|
+
if err := schema.Validate(root); err != nil {
|
|
95
|
+
return Document{}, schemaDiagnostics(path, err, locations)
|
|
96
|
+
}
|
|
97
|
+
data, err := json.Marshal(root)
|
|
98
|
+
if err != nil {
|
|
99
|
+
return Document{}, []Diagnostic{diagnostic(path, "", "invalid_json", "document must contain JSON values", nil)}
|
|
100
|
+
}
|
|
101
|
+
var document Document
|
|
102
|
+
if err := json.Unmarshal(data, &document); err != nil {
|
|
103
|
+
return Document{}, []Diagnostic{diagnostic(path, "", "invalid_document", "document fields are invalid", nil)}
|
|
104
|
+
}
|
|
105
|
+
normalizeDocument(&document)
|
|
106
|
+
return document, nil
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
func schemaDiagnostics(path string, err error, locations map[string]*yaml.Node) []Diagnostic {
|
|
110
|
+
var invalid *jsonschema.ValidationError
|
|
111
|
+
if !errors.As(err, &invalid) {
|
|
112
|
+
return []Diagnostic{diagnostic(path, "", "schema_invalid", "document does not satisfy its schema", nil)}
|
|
113
|
+
}
|
|
114
|
+
var results []Diagnostic
|
|
115
|
+
var visit func(*jsonschema.ValidationError)
|
|
116
|
+
visit = func(item *jsonschema.ValidationError) {
|
|
117
|
+
if len(results) >= 20 {
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
if len(item.Causes) > 0 {
|
|
121
|
+
for _, cause := range item.Causes {
|
|
122
|
+
visit(cause)
|
|
123
|
+
}
|
|
124
|
+
return
|
|
125
|
+
}
|
|
126
|
+
pointer := ""
|
|
127
|
+
for _, part := range item.InstanceLocation {
|
|
128
|
+
pointer += "/" + escapePointer(part)
|
|
129
|
+
}
|
|
130
|
+
keyword := strings.Join(item.ErrorKind.KeywordPath(), ".")
|
|
131
|
+
// The library's formatted errors can contain raw values. Keep diagnostics
|
|
132
|
+
// at the field/constraint boundary, including for legacy executor config.
|
|
133
|
+
results = append(results, diagnostic(path, pointer, "schema_"+keyword, "field does not satisfy "+keyword, locations[pointer]))
|
|
134
|
+
}
|
|
135
|
+
visit(invalid)
|
|
136
|
+
return results
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
func normalizeDocument(document *Document) {
|
|
140
|
+
spec := document.Spec
|
|
141
|
+
if document.Kind != "Workflow" {
|
|
142
|
+
setDefault(spec, "enabled", true)
|
|
143
|
+
if document.Metadata.DisplayName == "" {
|
|
144
|
+
document.Metadata.DisplayName = document.Metadata.Name
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
switch document.Kind {
|
|
148
|
+
case "BuildTemplate":
|
|
149
|
+
setDefault(spec, "builderKind", "custom")
|
|
150
|
+
setDefault(spec, "variableSchema", map[string]any{})
|
|
151
|
+
setDefault(spec, "defaultVariables", map[string]any{})
|
|
152
|
+
case "WorkflowTemplate":
|
|
153
|
+
setDefault(spec, "category", "release")
|
|
154
|
+
definition, _ := spec["definition"].(map[string]any) // Schema-validated before normalization.
|
|
155
|
+
if definition["mode"] != "delivery_batch" {
|
|
156
|
+
setDefault(definition, "mode", "release_dag")
|
|
157
|
+
}
|
|
158
|
+
case "Workflow":
|
|
159
|
+
definition, _ := spec["definition"].(map[string]any) // Schema-validated before normalization.
|
|
160
|
+
// Template defaults are resolved by the server against the pinned version.
|
|
161
|
+
if definition["workflowTemplateId"] == nil {
|
|
162
|
+
setDefault(definition, "mode", "service_serial")
|
|
163
|
+
setDefault(definition, "stopOnFailure", true)
|
|
164
|
+
setDefault(definition, "maxConcurrency", float64(4))
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
func setDefault(object map[string]any, key string, value any) {
|
|
170
|
+
if _, exists := object[key]; !exists {
|
|
171
|
+
object[key] = value
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
func (d Document) Value() map[string]any {
|
|
176
|
+
metadata := map[string]any{"name": d.Metadata.Name}
|
|
177
|
+
if d.Metadata.DisplayName != "" {
|
|
178
|
+
metadata["displayName"] = d.Metadata.DisplayName
|
|
179
|
+
}
|
|
180
|
+
if d.Metadata.Description != "" {
|
|
181
|
+
metadata["description"] = d.Metadata.Description
|
|
182
|
+
}
|
|
183
|
+
return map[string]any{"apiVersion": d.APIVersion, "kind": d.Kind, "metadata": metadata, "spec": d.Spec}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
func (d Document) NormalizedSpecDigest() (string, error) {
|
|
187
|
+
data, err := CanonicalJSON(map[string]any{"apiVersion": d.APIVersion, "kind": d.Kind, "spec": d.Spec})
|
|
188
|
+
if err != nil {
|
|
189
|
+
return "", err
|
|
190
|
+
}
|
|
191
|
+
return Digest(data), nil
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
func (d Document) Encode(format string) ([]byte, error) {
|
|
195
|
+
switch format {
|
|
196
|
+
case "json":
|
|
197
|
+
return json.MarshalIndent(d, "", " ")
|
|
198
|
+
case "yaml":
|
|
199
|
+
return yaml.Marshal(d.Value())
|
|
200
|
+
default:
|
|
201
|
+
return nil, fmt.Errorf("unsupported document format")
|
|
202
|
+
}
|
|
203
|
+
}
|