@opensoha/contracts 0.1.24 → 0.1.26

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 (137) hide show
  1. package/COMPATIBILITY.md +24 -0
  2. package/README.md +1 -1
  3. package/agent/environment/export.go +1 -0
  4. package/agent/environment/protocol_test.go +1 -1
  5. package/agent/guest/protocol_test.go +2 -2
  6. package/auth/catalog_generated.go +2 -2
  7. package/auth/gateway_permissions_test.go +48 -0
  8. package/auth/permission-catalog.json +300 -1
  9. package/compat/consumer-revisions.json +1 -1
  10. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  11. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  12. package/delivery/document.schema.json +127 -9
  13. package/examples/relations_compat_test.go +18 -0
  14. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-build-template.json +30 -0
  15. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-deployment-template.json +30 -0
  16. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-workflow-template.json +27 -0
  17. package/fixtures/openapi/DeliveryDocument/valid/migration-build-template.json +31 -0
  18. package/fixtures/openapi/DeliveryDocument/valid/migration-deployment-template.json +31 -0
  19. package/fixtures/openapi/DeliveryDocument/valid/migration-workflow-template.json +28 -0
  20. package/fixtures/openapi/DeliveryPlanInput/invalid/manual-plan.json +7 -0
  21. package/fixtures/openapi/DeliveryPlanInput/valid/manual-plan.json +6 -0
  22. package/fixtures/openapi/DeliveryTargetInput/invalid/candidate-on-runtime-deploy.json +9 -0
  23. package/fixtures/openapi/DeliveryTargetInput/invalid/config-update-missing-service.json +7 -0
  24. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-only.json +8 -0
  25. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-without-runtime-environment.json +1 -0
  26. package/fixtures/openapi/KubernetesAgentActionCheck/invalid/unproven-state.json +6 -0
  27. package/fixtures/openapi/KubernetesAgentActionCheck/valid/configured-denied.json +9 -0
  28. package/fixtures/openapi/KubernetesAgentActionProfile/invalid/wildcard.json +1 -0
  29. package/fixtures/openapi/KubernetesAgentActionProfile/valid/workbench.json +1 -0
  30. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/action-profile.json +3 -0
  31. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/action-profile.json +5 -0
  32. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-with-spec.json +33 -0
  33. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-without-uid.json +29 -0
  34. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/valid/stable-source.json +30 -0
  35. package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/condition-status-boolean.json +17 -0
  36. package/fixtures/openapi/KubernetesNodeListEnvelope/invalid/taint-effect-missing.json +16 -0
  37. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/legacy-fields-absent.json +11 -0
  38. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/no-taints.json +13 -0
  39. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/ready-cordoned-tainted.json +28 -0
  40. package/fixtures/openapi/KubernetesNodeListEnvelope/valid/unknown-fields-null.json +13 -0
  41. package/fixtures/openapi/KubernetesPod/invalid/pod-uid.json +9 -0
  42. package/fixtures/openapi/KubernetesPod/valid/pod-uid.json +9 -0
  43. package/fixtures/openapi/KubernetesPodDetail/invalid/pod-uid.json +6 -0
  44. package/fixtures/openapi/KubernetesPodDetail/valid/pod-uid.json +6 -0
  45. package/fixtures/openapi/KubernetesServiceImportRequest/invalid/empty-source-uid.json +48 -0
  46. package/fixtures/openapi/KubernetesServiceImportRequest/valid/pinned-workloads-and-cr.json +48 -0
  47. package/fixtures/openapi/KubernetesTopologyCoverage/invalid/empty-as-success.json +5 -0
  48. package/fixtures/openapi/KubernetesTopologyCoverage/valid/not-installed.json +6 -0
  49. package/fixtures/openapi/KubernetesTopologyGraphEdge/invalid/negative-weight.json +8 -0
  50. package/fixtures/openapi/KubernetesTopologyGraphEdge/valid/zero-weight.json +20 -0
  51. package/fixtures/openapi/KubernetesTopologyGraphNode/invalid/fake-flow-kind.json +42 -0
  52. package/fixtures/openapi/KubernetesTopologyGraphNode/valid/rule.json +42 -0
  53. package/fixtures/openapi/KubernetesTopologySnapshot/invalid/raw-source-field.json +33 -0
  54. package/fixtures/openapi/KubernetesTopologySnapshot/valid/projected-source.json +32 -0
  55. package/fixtures/openapi/KubernetesTopologySnapshotRequest/invalid/arbitrary-gvr.json +8 -0
  56. package/fixtures/openapi/KubernetesTopologySnapshotRequest/valid/bounded-sources.json +11 -0
  57. package/fixtures/openapi/KubernetesTopologySourceQuery/invalid/cluster-namespace.json +4 -0
  58. package/fixtures/openapi/KubernetesTopologySourceQuery/valid/all-namespaces.json +4 -0
  59. package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/initialization.json +7 -0
  60. package/fixtures/openapi/ManifestExecutionTaskPayload/valid/initialization.json +7 -0
  61. package/fixtures/openapi/ManifestRootResource/invalid/root.json +1 -0
  62. package/fixtures/openapi/ManifestRootResource/valid/root.json +1 -0
  63. package/fixtures/openapi/ResourceMonitoringPanel/invalid/unknown-quality.json +7 -0
  64. package/fixtures/openapi/ResourceMonitoringPanel/valid/not-collected.json +7 -0
  65. package/fixtures/openapi/ResourceMonitoringPoint/invalid/string-zero.json +4 -0
  66. package/fixtures/openapi/ResourceMonitoringPoint/valid/missing.json +4 -0
  67. package/fixtures/openapi/ResourceMonitoringPoint/valid/zero.json +4 -0
  68. package/fixtures/openapi/ResourceMonitoringView/invalid/raw-query.json +12 -0
  69. package/fixtures/openapi/ResourceMonitoringView/valid/unconfigured.json +12 -0
  70. package/fixtures/openapi/ResourceRelationConfig/invalid/executable-rule.json +17 -0
  71. package/fixtures/openapi/ResourceRelationConfig/valid/unknown-kind.json +13 -0
  72. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/migration-missing-guide-valid-yaml.json +38 -0
  73. package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/migration-valid-yaml.json +39 -0
  74. package/fixtures/openapi/TemplateMigrationAssessment/invalid/initialization.json +9 -0
  75. package/fixtures/openapi/TemplateMigrationAssessment/valid/initialization.json +9 -0
  76. package/fixtures/openapi/TemplateMigrationPolicy/invalid/blank-guide.json +5 -0
  77. package/fixtures/openapi/TemplateMigrationPolicy/invalid/missing-guide.json +4 -0
  78. package/fixtures/openapi/TemplateMigrationPolicy/invalid/unknown-escape-hatch.json +6 -0
  79. package/fixtures/openapi/TemplateMigrationPolicy/valid/legacy-safe.json +4 -0
  80. package/fixtures/openapi/TemplateMigrationPolicy/valid/ordered-data-change.json +5 -0
  81. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/duplicate-candidates.json +11 -0
  82. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/empty-identities.json +10 -0
  83. package/fixtures/openapi/TemplateUpdateBatchInput/valid/staged-adoption.json +10 -0
  84. package/fixtures/openapi/TemplateUpdatePolicyInput/invalid/unknown-mode.json +8 -0
  85. package/fixtures/openapi/TemplateUpdatePolicyInput/valid/explicit-automatic.json +8 -0
  86. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-identities.json +10 -0
  87. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-targets.json +6 -0
  88. package/fixtures/openapi/TemplateUpdatePreviewInput/valid/cross-version-manual.json +14 -0
  89. package/gen/go/sohaapi/client.go +1 -1
  90. package/gen/go/sohaapi/client_test.go +2 -2
  91. package/gen/go/sohaapi/import_source_compat_test.go +12 -0
  92. package/gen/go/sohaapi/kubernetes_monitoring_test.go +67 -0
  93. package/gen/go/sohaapi/types.go +2210 -387
  94. package/gen/ts/sohaapi/index.ts +1862 -5
  95. package/go.mod +2 -2
  96. package/helmrelease/delivery.go +4 -1
  97. package/helmrelease/initialization.go +10 -0
  98. package/helmrelease/runtime/delivery.go +40 -10
  99. package/helmrelease/runtime/delivery_test.go +4 -0
  100. package/helmrelease/runtime/initialization.go +186 -0
  101. package/helmrelease/runtime/initialization_test.go +203 -0
  102. package/openapi/soha-api.json +5514 -1179
  103. package/openapi/soha-api.yaml +1080 -11
  104. package/openapi/spec_generated.go +3 -3
  105. package/openapi/spec_test.go +76 -0
  106. package/package.json +1 -1
  107. package/resource/agent_access.go +12 -0
  108. package/resource/agent_profiles.go +62 -0
  109. package/resource/agent_profiles_test.go +36 -0
  110. package/resource/kubernetes_kinds.go +73 -0
  111. package/resource/kubernetes_kinds_test.go +38 -0
  112. package/resource/models.go +25 -14
  113. package/resource/network_topology.go +166 -0
  114. package/resource/network_topology_projection.go +208 -0
  115. package/resource/network_topology_projection_test.go +53 -0
  116. package/resource/network_topology_test.go +51 -0
  117. package/resource/network_topology_validation.go +29 -0
  118. package/resource/node_drain.go +34 -0
  119. package/resource/relations.go +225 -0
  120. package/resource/relations_test.go +47 -0
  121. package/resource/resource_monitoring.go +99 -0
  122. package/resource/root_cr.go +38 -0
  123. package/resource/runtime/argocd_integration_test.go +1 -1
  124. package/resource/runtime/initialization.go +66 -0
  125. package/resource/runtime/initialization_test.go +80 -0
  126. package/resource/runtime/network_topology.go +232 -0
  127. package/resource/runtime/network_topology_test.go +62 -0
  128. package/resource/runtime/node_drain.go +124 -0
  129. package/resource/runtime/node_drain_test.go +95 -0
  130. package/resource/runtime/relations.go +161 -0
  131. package/resource/runtime/relations_test.go +100 -0
  132. package/resource/runtime/resource_edit.go +128 -0
  133. package/resource/runtime/resource_edit_test.go +183 -0
  134. package/resource/runtime/resource_monitoring.go +243 -0
  135. package/resource/runtime/resource_monitoring_test.go +88 -0
  136. package/resource/runtime/root_cr.go +79 -0
  137. package/resource/runtime/root_cr_test.go +118 -0
@@ -1,11 +1,13 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: Soha API
4
- version: 0.1.24
4
+ version: 0.1.26
5
5
  description: >
6
6
  Public OpenSoha core API contract. This first contract focuses on stable
7
7
  cross-repository boundaries: auth, health, runner-facing control-plane
8
8
  callbacks, AI Gateway, and MCP capability discovery.
9
+ Pod session WebSocket targets and their UID-aware ticket requirements are
10
+ described separately in x-soha-websocket-paths to preserve HTTP client generation.
9
11
  servers:
10
12
  - url: /api/v1
11
13
  description: Soha API v1
@@ -40,6 +42,78 @@ tags:
40
42
  - name: Portal
41
43
  - name: Directory
42
44
  - name: Network Access
45
+ x-soha-websocket-paths:
46
+ /clusters/{clusterID}/workloads/pods/{podName}/logs/stream:
47
+ get:
48
+ tags: [Platform]
49
+ operationId: streamKubernetesPodLogs
50
+ x-soha-permissions:
51
+ mode: all
52
+ keys: [platform.pods.logs]
53
+ x-soha-implementation-status: implemented
54
+ description: >-
55
+ Existing WebSocket logs endpoint. Saved sessions must provide expectedUid.
56
+ Each upstream open checks the current Pod UID and current action authorization.
57
+ A stream ticket issued with expectedUid binds namespace, container and shell too.
58
+ parameters:
59
+ - $ref: "#/components/parameters/ClusterID"
60
+ - $ref: "#/components/parameters/KubernetesPodName"
61
+ - $ref: "#/components/parameters/KubernetesNamespaceDefaultQuery"
62
+ - name: expectedUid
63
+ in: query
64
+ schema: { type: string, minLength: 1 }
65
+ - name: container
66
+ in: query
67
+ schema: { type: string, minLength: 1 }
68
+ - name: stream_ticket
69
+ in: query
70
+ schema: { type: string, minLength: 1 }
71
+ - name: tailLines
72
+ in: query
73
+ schema: { type: integer, minimum: 0, default: 200 }
74
+ - name: sinceSeconds
75
+ in: query
76
+ schema: { type: integer, minimum: 0, default: 0 }
77
+ responses:
78
+ "101":
79
+ description: WebSocket opened; terminalMessage envelopes carry stream output and safe exit status. Authentication, UID, permission or provider failures terminate the stream without attaching to a replacement Pod.
80
+ "401": { $ref: "#/components/responses/Error" }
81
+ "403": { $ref: "#/components/responses/Error" }
82
+ "503": { $ref: "#/components/responses/Error" }
83
+ /clusters/{clusterID}/workloads/pods/{podName}/terminal:
84
+ get:
85
+ tags: [Platform]
86
+ operationId: streamKubernetesPodTerminal
87
+ x-soha-permissions:
88
+ mode: all
89
+ keys: [platform.pods.exec]
90
+ x-soha-implementation-status: implemented
91
+ description: >-
92
+ Existing WebSocket exec endpoint. Saved sessions must provide expectedUid.
93
+ Each upstream open checks the current Pod UID and current action authorization.
94
+ A stream ticket issued with expectedUid binds namespace, container and shell too.
95
+ parameters:
96
+ - $ref: "#/components/parameters/ClusterID"
97
+ - $ref: "#/components/parameters/KubernetesPodName"
98
+ - $ref: "#/components/parameters/KubernetesNamespaceDefaultQuery"
99
+ - name: expectedUid
100
+ in: query
101
+ schema: { type: string, minLength: 1 }
102
+ - name: container
103
+ in: query
104
+ schema: { type: string, minLength: 1 }
105
+ - name: stream_ticket
106
+ in: query
107
+ schema: { type: string, minLength: 1 }
108
+ - name: shell
109
+ in: query
110
+ schema: { type: string, default: /bin/sh }
111
+ responses:
112
+ "101":
113
+ description: WebSocket opened; terminalMessage envelopes carry stream output and safe exit status. Authentication, UID, permission or provider failures terminate the stream without attaching to a replacement Pod.
114
+ "401": { $ref: "#/components/responses/Error" }
115
+ "403": { $ref: "#/components/responses/Error" }
116
+ "503": { $ref: "#/components/responses/Error" }
43
117
  paths:
44
118
  /network-access/vpn/profiles:
45
119
  get:
@@ -2640,11 +2714,81 @@ paths:
2640
2714
  $ref: "#/components/schemas/ApplicationEnvironmentEnvelope"
2641
2715
  "400":
2642
2716
  $ref: "#/components/responses/Error"
2717
+ /application-environments/{applicationEnvironmentID}/targets/{targetID}/source:
2718
+ get:
2719
+ tags: [Delivery]
2720
+ operationId: getApplicationEnvironmentTargetSource
2721
+ description: Read a linked source through existing Kubernetes authorization. Rejects replaced UIDs. Custom resource YAML additionally requires sensitive-data read permission. Responses must not be persisted in browser caches.
2722
+ parameters:
2723
+ - name: applicationEnvironmentID
2724
+ in: path
2725
+ required: true
2726
+ schema: { type: string, minLength: 1 }
2727
+ - name: targetID
2728
+ in: path
2729
+ required: true
2730
+ schema: { type: string, minLength: 1 }
2731
+ responses:
2732
+ "200":
2733
+ description: Current cluster YAML for the linked resource, never a fabricated source file.
2734
+ headers:
2735
+ Cache-Control:
2736
+ required: true
2737
+ schema: { type: string, const: no-store }
2738
+ content:
2739
+ application/json:
2740
+ schema:
2741
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
2742
+ "403":
2743
+ $ref: "#/components/responses/Error"
2744
+ "404":
2745
+ $ref: "#/components/responses/Error"
2746
+ "409":
2747
+ $ref: "#/components/responses/Error"
2748
+ /application-environments/{applicationEnvironmentID}/targets/{targetID}/relations:
2749
+ get:
2750
+ tags: [Delivery]
2751
+ operationId: getApplicationEnvironmentTargetRelations
2752
+ description: Read UID-verified metadata relationships for an imported root. Every source retains Kubernetes and Soha authorization. Rules are observational metadata, never permission grants. Partial coverage is explicit; no provider configuration values are returned.
2753
+ parameters:
2754
+ - name: applicationEnvironmentID
2755
+ in: path
2756
+ required: true
2757
+ schema: { type: string, minLength: 1 }
2758
+ - name: targetID
2759
+ in: path
2760
+ required: true
2761
+ schema: { type: string, minLength: 1 }
2762
+ responses:
2763
+ "200":
2764
+ description: Bounded observed relations, including coverage gaps.
2765
+ headers:
2766
+ Cache-Control:
2767
+ required: true
2768
+ schema: { type: string, const: no-store }
2769
+ content:
2770
+ application/json:
2771
+ schema: { $ref: "#/components/schemas/ResourceRelationsEnvelope" }
2772
+ "400": { $ref: "#/components/responses/Error" }
2773
+ "403": { $ref: "#/components/responses/Error" }
2774
+ "404": { $ref: "#/components/responses/Error" }
2775
+ "409": { $ref: "#/components/responses/Error" }
2643
2776
  /application-environments/target-candidates:
2644
2777
  get:
2645
2778
  tags: [Delivery]
2646
2779
  operationId: listApplicationEnvironmentTargetCandidates
2647
2780
  parameters:
2781
+ - name: workloadKind
2782
+ in: query
2783
+ required: false
2784
+ schema:
2785
+ type: string
2786
+ enum: [Deployment, StatefulSet, DaemonSet, Job, CronJob, CustomResource]
2787
+ - name: crdName
2788
+ in: query
2789
+ required: false
2790
+ description: Explicit CRD selection for CustomResource discovery. Only this served resource and namespace are queried.
2791
+ schema: { type: string, minLength: 1 }
2648
2792
  - name: clusterId
2649
2793
  in: query
2650
2794
  required: true
@@ -4196,6 +4340,23 @@ paths:
4196
4340
  $ref: "#/components/schemas/DeliveryEnvironmentListEnvelope"
4197
4341
  "403":
4198
4342
  $ref: "#/components/responses/Error"
4343
+ /delivery/template-updates/targets:
4344
+ get:
4345
+ {"tags": ["Delivery"], "operationId": "listTemplateUpdateTargets", "summary": "Preview affected application bindings with honest paginated totals", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdateTargetPageEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "parameters": [{"in": "query", "name": "kind", "required": true, "schema": {"$ref": "#/components/schemas/TemplateUpdateKind"}}, {"in": "query", "name": "templateId", "required": true, "schema": {"type": "string", "maxLength": 256}}, {"in": "query", "name": "applicationId", "required": false, "schema": {"type": "string", "maxLength": 256}}, {"in": "query", "name": "page", "required": false, "schema": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}}, {"in": "query", "name": "pageSize", "required": false, "schema": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 100}}, {"name": "serviceId", "in": "query", "required": false, "schema": {"type": "string", "maxLength": 256}}, {"name": "applicationEnvironmentId", "in": "query", "required": false, "schema": {"type": "string", "maxLength": 256}}]}
4346
+ /delivery/template-updates/previews:
4347
+ post:
4348
+ {"tags": ["Delivery"], "operationId": "createTemplateUpdatePreview", "summary": "Freeze final template adoption and cumulative plus adjacent-version differences", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePreviewEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePreviewInput"}}}}}
4349
+ /delivery/template-updates/previews/{previewID}:
4350
+ get:
4351
+ {"tags": ["Delivery"], "operationId": "getTemplateUpdatePreview", "summary": "Read a frozen adoption preview with current scope revalidation", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePreviewEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "parameters": [{"in": "path", "name": "previewID", "required": true, "schema": {"type": "string", "maxLength": 256}}]}
4352
+ /delivery/template-updates/previews/{previewID}/batches:
4353
+ post:
4354
+ {"tags": ["Delivery"], "operationId": "createTemplateUpdateBatch", "summary": "Adopt selected candidates in waves through existing DeliveryBatch and Plan approvals", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeliveryBatchEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "parameters": [{"in": "path", "name": "previewID", "required": true, "schema": {"type": "string", "maxLength": 256}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdateBatchInput"}}}}}
4355
+ /delivery/template-updates/policies:
4356
+ get:
4357
+ {"tags": ["Delivery"], "operationId": "listTemplateUpdatePolicies", "summary": "List explicit adoption policies visible to the current principal", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePolicyListEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "parameters": [{"in": "query", "name": "kind", "required": true, "schema": {"$ref": "#/components/schemas/TemplateUpdateKind"}}, {"in": "query", "name": "templateId", "required": true, "schema": {"type": "string", "maxLength": 256}}, {"in": "query", "name": "applicationId", "required": false, "schema": {"type": "string", "maxLength": 256}}]}
4358
+ put:
4359
+ {"tags": ["Delivery"], "operationId": "saveTemplateUpdatePolicy", "summary": "Save fixed manual automatic or approval policy using a binding-scoped CAS", "description": "Uses current application and environment permissions. Published immutable template versions only; adoption changes configuration and never deploys resources. Fixed and detached bindings are excluded from automatic propagation. Concurrent changes return 409.", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePolicyEnvelope"}}}}, "400": {"$ref": "#/components/responses/Error"}, "403": {"$ref": "#/components/responses/Error"}, "404": {"$ref": "#/components/responses/Error"}, "409": {"$ref": "#/components/responses/Error"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TemplateUpdatePolicyInput"}}}}}
4199
4360
  /delivery/manifest-packages:
4200
4361
  get:
4201
4362
  tags: [Delivery]
@@ -8661,6 +8822,10 @@ paths:
8661
8822
  - $ref: "#/components/parameters/ClusterID"
8662
8823
  - $ref: "#/components/parameters/KubernetesPodName"
8663
8824
  - $ref: "#/components/parameters/KubernetesNamespaceDefaultQuery"
8825
+ - name: expectedUid
8826
+ in: query
8827
+ description: Reject the request if the live Pod UID differs. Omit only for legacy clients, never when restoring a saved session.
8828
+ schema: { type: string, minLength: 1 }
8664
8829
  - name: container
8665
8830
  in: query
8666
8831
  schema: { type: string, minLength: 1 }
@@ -8682,6 +8847,11 @@ paths:
8682
8847
  $ref: "#/components/schemas/KubernetesPodLogsEnvelope"
8683
8848
  "403": { $ref: "#/components/responses/Error" }
8684
8849
  "404": { $ref: "#/components/responses/Error" }
8850
+ "409":
8851
+ description: The current Pod UID differs from expectedUid; open the current Pod instead of adopting it by name.
8852
+ content:
8853
+ application/json:
8854
+ schema: { $ref: "#/components/schemas/ErrorEnvelope" }
8685
8855
  "503": { $ref: "#/components/responses/Error" }
8686
8856
  /clusters/{clusterID}/workloads/pods/{podName}/yaml:
8687
8857
  get:
@@ -10086,6 +10256,36 @@ paths:
10086
10256
  "403": { $ref: "#/components/responses/Error" }
10087
10257
  "404": { $ref: "#/components/responses/Error" }
10088
10258
  "503": { $ref: "#/components/responses/Error" }
10259
+ /clusters/{clusterID}/resource-monitoring:
10260
+ get:
10261
+ tags: [Platform]
10262
+ operationId: getKubernetesResourceMonitoring
10263
+ description: Fixed bounded monitoring templates. The selected view requires its exact permission plus cluster-wide nodes.view. Raw PromQL is never accepted. Current snapshots and historical series have separate observation times.
10264
+ x-soha-permissions:
10265
+ mode: all
10266
+ keys: [platform.nodes.view]
10267
+ byQuery:
10268
+ view:
10269
+ overview: platform.resource-monitoring.overview.view
10270
+ cpu: platform.resource-monitoring.cpu.view
10271
+ memory: platform.resource-monitoring.memory.view
10272
+ conntrack: platform.resource-monitoring.conntrack.view
10273
+ pods: platform.resource-monitoring.pods.view
10274
+ x-soha-implementation-status: implemented
10275
+ parameters:
10276
+ - { $ref: "#/components/parameters/ClusterID" }
10277
+ - { name: view, in: query, required: true, schema: { $ref: "#/components/schemas/ResourceMonitoringViewName" } }
10278
+ - { name: node, in: query, schema: { type: string, maxLength: 253 } }
10279
+ - { name: from, in: query, schema: { type: string, format: date-time } }
10280
+ - { name: to, in: query, schema: { type: string, format: date-time } }
10281
+ - { name: rangeMinutes, in: query, schema: { type: integer, minimum: 1, maximum: 1440, default: 60 } }
10282
+ - { name: stepSeconds, in: query, schema: { type: integer, minimum: 15, maximum: 3600, default: 60 } }
10283
+ responses:
10284
+ "200": { description: Per-panel quality and bounded node series., content: { application/json: { schema: { $ref: "#/components/schemas/ResourceMonitoringEnvelope" } } } }
10285
+ "400": { $ref: "#/components/responses/Error" }
10286
+ "403": { $ref: "#/components/responses/Error" }
10287
+ "404": { $ref: "#/components/responses/Error" }
10288
+ "503": { $ref: "#/components/responses/Error" }
10089
10289
  /clusters/{clusterID}/network/topology:
10090
10290
  get:
10091
10291
  tags: [Platform]
@@ -10097,7 +10297,7 @@ paths:
10097
10297
  x-soha-implementation-status: implemented
10098
10298
  parameters: [{ $ref: "#/components/parameters/ClusterID" }, { $ref: "#/components/parameters/KubernetesNamespaceQuery" }]
10099
10299
  responses:
10100
- "200": { description: Resolved ingress and Gateway API topology for the selected scope., content: { application/json: { schema: { $ref: "#/components/schemas/KubernetesNetworkTopologyEnvelope" } } } }
10300
+ "200": { description: "Bounded permission-filtered Kubernetes, Gateway API, Traefik and APISIX topology, with per-source coverage and explicit unresolved relationships.", content: { application/json: { schema: { $ref: "#/components/schemas/KubernetesNetworkTopologyEnvelope" } } } }
10101
10301
  "403": { $ref: "#/components/responses/Error" }
10102
10302
  "404": { $ref: "#/components/responses/Error" }
10103
10303
  "503": { $ref: "#/components/responses/Error" }
@@ -19764,6 +19964,12 @@ paths:
19764
19964
  tags:
19765
19965
  - Platform
19766
19966
  operationId: drainKubernetesNode
19967
+ description: >-
19968
+ Cordon the node and evict eligible pods. A 409 with node_drain_pdb_blocked,
19969
+ node_drain_eviction_blocked, node_drain_timeout, node_drain_canceled,
19970
+ node_drain_pod_selection or node_drain_failed means this drain did not complete.
19971
+ Inspect current node schedulability and remaining pods before retrying or
19972
+ explicitly restoring scheduling. Transport failure leaves the outcome unknown.
19767
19973
  x-soha-permissions:
19768
19974
  mode: all
19769
19975
  keys:
@@ -20027,6 +20233,458 @@ paths:
20027
20233
  $ref: "#/components/responses/Error"
20028
20234
  "503":
20029
20235
  $ref: "#/components/responses/Error"
20236
+ /clusters/{clusterID}/network/httproutes/{name}:
20237
+ delete:
20238
+ tags: [Platform]
20239
+ operationId: deleteKubernetesHTTPRoute
20240
+ x-soha-permissions:
20241
+ mode: all
20242
+ keys: [platform.network.http-routes.delete]
20243
+ x-soha-implementation-status: implemented
20244
+ parameters:
20245
+ - $ref: "#/components/parameters/ClusterID"
20246
+ - $ref: "#/components/parameters/KubernetesResourceName"
20247
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20248
+ responses:
20249
+ "204": { description: Resource deleted. }
20250
+ "400": { $ref: "#/components/responses/Error" }
20251
+ "403": { $ref: "#/components/responses/Error" }
20252
+ "404": { $ref: "#/components/responses/Error" }
20253
+ "409": { $ref: "#/components/responses/Error" }
20254
+ "503": { $ref: "#/components/responses/Error" }
20255
+ /clusters/{clusterID}/network/httproutes/{name}/yaml:
20256
+ get:
20257
+ tags: [Platform]
20258
+ operationId: getKubernetesHTTPRouteYaml
20259
+ x-soha-permissions:
20260
+ mode: all
20261
+ keys: [platform.network.http-routes.view]
20262
+ x-soha-implementation-status: implemented
20263
+ parameters:
20264
+ - $ref: "#/components/parameters/ClusterID"
20265
+ - $ref: "#/components/parameters/KubernetesResourceName"
20266
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20267
+ responses:
20268
+ "200":
20269
+ description: Authorized Kubernetes resource YAML.
20270
+ content:
20271
+ application/json:
20272
+ schema:
20273
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20274
+ "400": { $ref: "#/components/responses/Error" }
20275
+ "403": { $ref: "#/components/responses/Error" }
20276
+ "404": { $ref: "#/components/responses/Error" }
20277
+ "409": { $ref: "#/components/responses/Error" }
20278
+ "503": { $ref: "#/components/responses/Error" }
20279
+ put:
20280
+ tags: [Platform]
20281
+ operationId: applyKubernetesHTTPRouteYaml
20282
+ x-soha-permissions:
20283
+ mode: all
20284
+ keys: [platform.network.http-routes.update]
20285
+ x-soha-implementation-status: implemented
20286
+ parameters:
20287
+ - $ref: "#/components/parameters/ClusterID"
20288
+ - $ref: "#/components/parameters/KubernetesResourceName"
20289
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20290
+ requestBody:
20291
+ required: true
20292
+ content:
20293
+ application/json:
20294
+ schema:
20295
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20296
+ responses:
20297
+ "200":
20298
+ description: Authorized Kubernetes resource YAML.
20299
+ content:
20300
+ application/json:
20301
+ schema:
20302
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20303
+ "400": { $ref: "#/components/responses/Error" }
20304
+ "403": { $ref: "#/components/responses/Error" }
20305
+ "404": { $ref: "#/components/responses/Error" }
20306
+ "409": { $ref: "#/components/responses/Error" }
20307
+ "503": { $ref: "#/components/responses/Error" }
20308
+ /clusters/{clusterID}/network/grpcroutes/{name}:
20309
+ delete:
20310
+ tags: [Platform]
20311
+ operationId: deleteKubernetesGRPCRoute
20312
+ x-soha-permissions:
20313
+ mode: all
20314
+ keys: [platform.network.grpc-routes.delete]
20315
+ x-soha-implementation-status: implemented
20316
+ parameters:
20317
+ - $ref: "#/components/parameters/ClusterID"
20318
+ - $ref: "#/components/parameters/KubernetesResourceName"
20319
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20320
+ responses:
20321
+ "204": { description: Resource deleted. }
20322
+ "400": { $ref: "#/components/responses/Error" }
20323
+ "403": { $ref: "#/components/responses/Error" }
20324
+ "404": { $ref: "#/components/responses/Error" }
20325
+ "409": { $ref: "#/components/responses/Error" }
20326
+ "503": { $ref: "#/components/responses/Error" }
20327
+ /clusters/{clusterID}/network/grpcroutes/{name}/yaml:
20328
+ get:
20329
+ tags: [Platform]
20330
+ operationId: getKubernetesGRPCRouteYaml
20331
+ x-soha-permissions:
20332
+ mode: all
20333
+ keys: [platform.network.grpc-routes.view]
20334
+ x-soha-implementation-status: implemented
20335
+ parameters:
20336
+ - $ref: "#/components/parameters/ClusterID"
20337
+ - $ref: "#/components/parameters/KubernetesResourceName"
20338
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20339
+ responses:
20340
+ "200":
20341
+ description: Authorized Kubernetes resource YAML.
20342
+ content:
20343
+ application/json:
20344
+ schema:
20345
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20346
+ "400": { $ref: "#/components/responses/Error" }
20347
+ "403": { $ref: "#/components/responses/Error" }
20348
+ "404": { $ref: "#/components/responses/Error" }
20349
+ "409": { $ref: "#/components/responses/Error" }
20350
+ "503": { $ref: "#/components/responses/Error" }
20351
+ put:
20352
+ tags: [Platform]
20353
+ operationId: applyKubernetesGRPCRouteYaml
20354
+ x-soha-permissions:
20355
+ mode: all
20356
+ keys: [platform.network.grpc-routes.update]
20357
+ x-soha-implementation-status: implemented
20358
+ parameters:
20359
+ - $ref: "#/components/parameters/ClusterID"
20360
+ - $ref: "#/components/parameters/KubernetesResourceName"
20361
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20362
+ requestBody:
20363
+ required: true
20364
+ content:
20365
+ application/json:
20366
+ schema:
20367
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20368
+ responses:
20369
+ "200":
20370
+ description: Authorized Kubernetes resource YAML.
20371
+ content:
20372
+ application/json:
20373
+ schema:
20374
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20375
+ "400": { $ref: "#/components/responses/Error" }
20376
+ "403": { $ref: "#/components/responses/Error" }
20377
+ "404": { $ref: "#/components/responses/Error" }
20378
+ "409": { $ref: "#/components/responses/Error" }
20379
+ "503": { $ref: "#/components/responses/Error" }
20380
+ /clusters/{clusterID}/network/backendtlspolicies/{name}:
20381
+ delete:
20382
+ tags: [Platform]
20383
+ operationId: deleteKubernetesBackendTLSPolicy
20384
+ x-soha-permissions:
20385
+ mode: all
20386
+ keys: [platform.network.backend-tls-policies.delete]
20387
+ x-soha-implementation-status: implemented
20388
+ parameters:
20389
+ - $ref: "#/components/parameters/ClusterID"
20390
+ - $ref: "#/components/parameters/KubernetesResourceName"
20391
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20392
+ responses:
20393
+ "204": { description: Resource deleted. }
20394
+ "400": { $ref: "#/components/responses/Error" }
20395
+ "403": { $ref: "#/components/responses/Error" }
20396
+ "404": { $ref: "#/components/responses/Error" }
20397
+ "409": { $ref: "#/components/responses/Error" }
20398
+ "503": { $ref: "#/components/responses/Error" }
20399
+ /clusters/{clusterID}/network/backendtlspolicies/{name}/yaml:
20400
+ get:
20401
+ tags: [Platform]
20402
+ operationId: getKubernetesBackendTLSPolicyYaml
20403
+ x-soha-permissions:
20404
+ mode: all
20405
+ keys: [platform.network.backend-tls-policies.view]
20406
+ x-soha-implementation-status: implemented
20407
+ parameters:
20408
+ - $ref: "#/components/parameters/ClusterID"
20409
+ - $ref: "#/components/parameters/KubernetesResourceName"
20410
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20411
+ responses:
20412
+ "200":
20413
+ description: Authorized Kubernetes resource YAML.
20414
+ content:
20415
+ application/json:
20416
+ schema:
20417
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20418
+ "400": { $ref: "#/components/responses/Error" }
20419
+ "403": { $ref: "#/components/responses/Error" }
20420
+ "404": { $ref: "#/components/responses/Error" }
20421
+ "409": { $ref: "#/components/responses/Error" }
20422
+ "503": { $ref: "#/components/responses/Error" }
20423
+ put:
20424
+ tags: [Platform]
20425
+ operationId: applyKubernetesBackendTLSPolicyYaml
20426
+ x-soha-permissions:
20427
+ mode: all
20428
+ keys: [platform.network.backend-tls-policies.update]
20429
+ x-soha-implementation-status: implemented
20430
+ parameters:
20431
+ - $ref: "#/components/parameters/ClusterID"
20432
+ - $ref: "#/components/parameters/KubernetesResourceName"
20433
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20434
+ requestBody:
20435
+ required: true
20436
+ content:
20437
+ application/json:
20438
+ schema:
20439
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20440
+ responses:
20441
+ "200":
20442
+ description: Authorized Kubernetes resource YAML.
20443
+ content:
20444
+ application/json:
20445
+ schema:
20446
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20447
+ "400": { $ref: "#/components/responses/Error" }
20448
+ "403": { $ref: "#/components/responses/Error" }
20449
+ "404": { $ref: "#/components/responses/Error" }
20450
+ "409": { $ref: "#/components/responses/Error" }
20451
+ "503": { $ref: "#/components/responses/Error" }
20452
+ /clusters/{clusterID}/network/referencegrants/{name}:
20453
+ delete:
20454
+ tags: [Platform]
20455
+ operationId: deleteKubernetesReferenceGrant
20456
+ x-soha-permissions:
20457
+ mode: all
20458
+ keys: [platform.network.reference-grants.delete]
20459
+ x-soha-implementation-status: implemented
20460
+ parameters:
20461
+ - $ref: "#/components/parameters/ClusterID"
20462
+ - $ref: "#/components/parameters/KubernetesResourceName"
20463
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20464
+ responses:
20465
+ "204": { description: Resource deleted. }
20466
+ "400": { $ref: "#/components/responses/Error" }
20467
+ "403": { $ref: "#/components/responses/Error" }
20468
+ "404": { $ref: "#/components/responses/Error" }
20469
+ "409": { $ref: "#/components/responses/Error" }
20470
+ "503": { $ref: "#/components/responses/Error" }
20471
+ /clusters/{clusterID}/network/referencegrants/{name}/yaml:
20472
+ get:
20473
+ tags: [Platform]
20474
+ operationId: getKubernetesReferenceGrantYaml
20475
+ x-soha-permissions:
20476
+ mode: all
20477
+ keys: [platform.network.reference-grants.view]
20478
+ x-soha-implementation-status: implemented
20479
+ parameters:
20480
+ - $ref: "#/components/parameters/ClusterID"
20481
+ - $ref: "#/components/parameters/KubernetesResourceName"
20482
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20483
+ responses:
20484
+ "200":
20485
+ description: Authorized Kubernetes resource YAML.
20486
+ content:
20487
+ application/json:
20488
+ schema:
20489
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20490
+ "400": { $ref: "#/components/responses/Error" }
20491
+ "403": { $ref: "#/components/responses/Error" }
20492
+ "404": { $ref: "#/components/responses/Error" }
20493
+ "409": { $ref: "#/components/responses/Error" }
20494
+ "503": { $ref: "#/components/responses/Error" }
20495
+ put:
20496
+ tags: [Platform]
20497
+ operationId: applyKubernetesReferenceGrantYaml
20498
+ x-soha-permissions:
20499
+ mode: all
20500
+ keys: [platform.network.reference-grants.update]
20501
+ x-soha-implementation-status: implemented
20502
+ parameters:
20503
+ - $ref: "#/components/parameters/ClusterID"
20504
+ - $ref: "#/components/parameters/KubernetesResourceName"
20505
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20506
+ requestBody:
20507
+ required: true
20508
+ content:
20509
+ application/json:
20510
+ schema:
20511
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20512
+ responses:
20513
+ "200":
20514
+ description: Authorized Kubernetes resource YAML.
20515
+ content:
20516
+ application/json:
20517
+ schema:
20518
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20519
+ "400": { $ref: "#/components/responses/Error" }
20520
+ "403": { $ref: "#/components/responses/Error" }
20521
+ "404": { $ref: "#/components/responses/Error" }
20522
+ "409": { $ref: "#/components/responses/Error" }
20523
+ "503": { $ref: "#/components/responses/Error" }
20524
+ /clusters/{clusterID}/configuration/hpas/{name}:
20525
+ delete:
20526
+ tags: [Platform]
20527
+ operationId: deleteKubernetesHorizontalPodAutoscaler
20528
+ x-soha-permissions:
20529
+ mode: all
20530
+ keys: [platform.configuration.horizontal-pod-autoscalers.delete]
20531
+ x-soha-implementation-status: implemented
20532
+ parameters:
20533
+ - $ref: "#/components/parameters/ClusterID"
20534
+ - $ref: "#/components/parameters/KubernetesResourceName"
20535
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20536
+ responses:
20537
+ "204": { description: Resource deleted. }
20538
+ "400": { $ref: "#/components/responses/Error" }
20539
+ "403": { $ref: "#/components/responses/Error" }
20540
+ "404": { $ref: "#/components/responses/Error" }
20541
+ "409": { $ref: "#/components/responses/Error" }
20542
+ "503": { $ref: "#/components/responses/Error" }
20543
+ /clusters/{clusterID}/configuration/hpas/{name}/yaml:
20544
+ get:
20545
+ tags: [Platform]
20546
+ operationId: getKubernetesHorizontalPodAutoscalerYaml
20547
+ x-soha-permissions:
20548
+ mode: all
20549
+ keys: [platform.configuration.horizontal-pod-autoscalers.view]
20550
+ x-soha-implementation-status: implemented
20551
+ parameters:
20552
+ - $ref: "#/components/parameters/ClusterID"
20553
+ - $ref: "#/components/parameters/KubernetesResourceName"
20554
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20555
+ responses:
20556
+ "200":
20557
+ description: Authorized Kubernetes resource YAML.
20558
+ content:
20559
+ application/json:
20560
+ schema:
20561
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20562
+ "400": { $ref: "#/components/responses/Error" }
20563
+ "403": { $ref: "#/components/responses/Error" }
20564
+ "404": { $ref: "#/components/responses/Error" }
20565
+ "409": { $ref: "#/components/responses/Error" }
20566
+ "503": { $ref: "#/components/responses/Error" }
20567
+ put:
20568
+ tags: [Platform]
20569
+ operationId: applyKubernetesHorizontalPodAutoscalerYaml
20570
+ x-soha-permissions:
20571
+ mode: all
20572
+ keys: [platform.configuration.horizontal-pod-autoscalers.update]
20573
+ x-soha-implementation-status: implemented
20574
+ parameters:
20575
+ - $ref: "#/components/parameters/ClusterID"
20576
+ - $ref: "#/components/parameters/KubernetesResourceName"
20577
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20578
+ requestBody:
20579
+ required: true
20580
+ content:
20581
+ application/json:
20582
+ schema:
20583
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20584
+ responses:
20585
+ "200":
20586
+ description: Authorized Kubernetes resource YAML.
20587
+ content:
20588
+ application/json:
20589
+ schema:
20590
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20591
+ "400": { $ref: "#/components/responses/Error" }
20592
+ "403": { $ref: "#/components/responses/Error" }
20593
+ "404": { $ref: "#/components/responses/Error" }
20594
+ "409": { $ref: "#/components/responses/Error" }
20595
+ "503": { $ref: "#/components/responses/Error" }
20596
+ /clusters/{clusterID}/configuration/poddisruptionbudgets/{name}:
20597
+ delete:
20598
+ tags: [Platform]
20599
+ operationId: deleteKubernetesPodDisruptionBudget
20600
+ x-soha-permissions:
20601
+ mode: all
20602
+ keys: [platform.configuration.pod-disruption-budgets.delete]
20603
+ x-soha-implementation-status: implemented
20604
+ parameters:
20605
+ - $ref: "#/components/parameters/ClusterID"
20606
+ - $ref: "#/components/parameters/KubernetesResourceName"
20607
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20608
+ responses:
20609
+ "204": { description: Resource deleted. }
20610
+ "400": { $ref: "#/components/responses/Error" }
20611
+ "403": { $ref: "#/components/responses/Error" }
20612
+ "404": { $ref: "#/components/responses/Error" }
20613
+ "409": { $ref: "#/components/responses/Error" }
20614
+ "503": { $ref: "#/components/responses/Error" }
20615
+ /clusters/{clusterID}/configuration/poddisruptionbudgets/{name}/yaml:
20616
+ get:
20617
+ tags: [Platform]
20618
+ operationId: getKubernetesPodDisruptionBudgetYaml
20619
+ x-soha-permissions:
20620
+ mode: all
20621
+ keys: [platform.configuration.pod-disruption-budgets.view]
20622
+ x-soha-implementation-status: implemented
20623
+ parameters:
20624
+ - $ref: "#/components/parameters/ClusterID"
20625
+ - $ref: "#/components/parameters/KubernetesResourceName"
20626
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20627
+ responses:
20628
+ "200":
20629
+ description: Authorized Kubernetes resource YAML.
20630
+ content:
20631
+ application/json:
20632
+ schema:
20633
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20634
+ "400": { $ref: "#/components/responses/Error" }
20635
+ "403": { $ref: "#/components/responses/Error" }
20636
+ "404": { $ref: "#/components/responses/Error" }
20637
+ "409": { $ref: "#/components/responses/Error" }
20638
+ "503": { $ref: "#/components/responses/Error" }
20639
+ put:
20640
+ tags: [Platform]
20641
+ operationId: applyKubernetesPodDisruptionBudgetYaml
20642
+ x-soha-permissions:
20643
+ mode: all
20644
+ keys: [platform.configuration.pod-disruption-budgets.update]
20645
+ x-soha-implementation-status: implemented
20646
+ parameters:
20647
+ - $ref: "#/components/parameters/ClusterID"
20648
+ - $ref: "#/components/parameters/KubernetesResourceName"
20649
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20650
+ requestBody:
20651
+ required: true
20652
+ content:
20653
+ application/json:
20654
+ schema:
20655
+ $ref: "#/components/schemas/KubernetesResourceYamlInput"
20656
+ responses:
20657
+ "200":
20658
+ description: Authorized Kubernetes resource YAML.
20659
+ content:
20660
+ application/json:
20661
+ schema:
20662
+ $ref: "#/components/schemas/KubernetesResourceYamlEnvelope"
20663
+ "400": { $ref: "#/components/responses/Error" }
20664
+ "403": { $ref: "#/components/responses/Error" }
20665
+ "404": { $ref: "#/components/responses/Error" }
20666
+ "409": { $ref: "#/components/responses/Error" }
20667
+ "503": { $ref: "#/components/responses/Error" }
20668
+ /clusters/{clusterID}/workloads/replicationcontrollers/{name}:
20669
+ delete:
20670
+ tags: [Platform]
20671
+ operationId: deleteKubernetesReplicationController
20672
+ x-soha-permissions:
20673
+ mode: all
20674
+ keys: [platform.workloads.replication-controllers.delete]
20675
+ x-soha-implementation-status: implemented
20676
+ parameters:
20677
+ - $ref: "#/components/parameters/ClusterID"
20678
+ - $ref: "#/components/parameters/KubernetesResourceName"
20679
+ - $ref: "#/components/parameters/KubernetesNamespaceQuery"
20680
+ responses:
20681
+ "204": { description: Resource deleted. }
20682
+ "400": { $ref: "#/components/responses/Error" }
20683
+ "403": { $ref: "#/components/responses/Error" }
20684
+ "404": { $ref: "#/components/responses/Error" }
20685
+ "409": { $ref: "#/components/responses/Error" }
20686
+ "503": { $ref: "#/components/responses/Error" }
20687
+
20030
20688
  components:
20031
20689
  securitySchemes:
20032
20690
  bearerAuth:
@@ -20942,6 +21600,7 @@ components:
20942
21600
  schema:
20943
21601
  type: string
20944
21602
  enum: [default, bypass, read-only, refresh]
21603
+ x-enum-varnames: [CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeDefault, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeBypass, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeReadOnly, CreateAIGatewayOpenAICompatibleProviderResponseParamsXSohaCacheModeRefresh]
20945
21604
  description: Optional relay cache behavior hint.
20946
21605
  headers:
20947
21606
  SohaRouteIDHeader:
@@ -27105,7 +27764,10 @@ components:
27105
27764
  type: object
27106
27765
  properties:
27107
27766
  publicModel: { type: string, maxLength: 200 }
27108
- reasoningEffort: { type: string, enum: [auto, low, medium, high] }
27767
+ reasoningEffort:
27768
+ type: string
27769
+ enum: [auto, low, medium, high]
27770
+ x-enum-varnames: [WorkbenchModelPreferencesReasoningEffortAuto, WorkbenchModelPreferencesReasoningEffortLow, WorkbenchModelPreferencesReasoningEffortMedium, WorkbenchModelPreferencesReasoningEffortHigh]
27109
27771
  additionalProperties: false
27110
27772
  WorkbenchModelOption:
27111
27773
  type: object
@@ -29614,6 +30276,7 @@ components:
29614
30276
  properties:
29615
30277
  path:
29616
30278
  type: string
30279
+ description: Same-origin stream pathname. UID-aware Pod sessions include expectedUid, namespace, container and shell query fields to bind the one-use ticket to that exact target; other query fields are not part of the binding.
29617
30280
  additionalProperties: false
29618
30281
  StreamTicket:
29619
30282
  type: object
@@ -30611,6 +31274,14 @@ components:
30611
31274
  type: string
30612
31275
  format: date-time
30613
31276
  additionalProperties: false
31277
+ ResourceRelationSource: {"type": "object", "required": ["apiVersion", "resource", "kind", "namespace"], "properties": {"apiVersion": {"type": "string", "minLength": 1}, "resource": {"type": "string", "minLength": 1}, "kind": {"type": "string", "minLength": 1}, "namespace": {"type": "string", "minLength": 1}}, "additionalProperties": false}
31278
+ ResourceRelationRule: {"type": "object", "required": ["id", "type", "target"], "properties": {"id": {"type": "string", "minLength": 1}, "type": {"type": "string", "enum": ["reference", "manual", "selector"]}, "target": {"$ref": "#/components/schemas/ResourceRelationSource"}, "name": {"type": "string"}, "uid": {"type": "string"}, "selector": {"type": "object", "additionalProperties": {"type": "string"}, "maxProperties": 16}}, "additionalProperties": false}
31279
+ ResourceRelationConfig: {"type": "object", "required": ["version", "rootUid", "sources", "rules"], "properties": {"version": {"type": "string", "const": "v1"}, "rootUid": {"type": "string", "minLength": 1}, "sources": {"type": "array", "items": {"$ref": "#/components/schemas/ResourceRelationSource"}, "maxItems": 8}, "rules": {"type": "array", "items": {"$ref": "#/components/schemas/ResourceRelationRule"}, "maxItems": 8}}, "additionalProperties": false}
31280
+ ResourceRelationNode: {"type": "object", "required": ["resource", "role", "depth"], "properties": {"resource": {"$ref": "#/components/schemas/KubernetesResourceRef"}, "role": {"type": "string", "enum": ["root", "owned", "manual", "reference", "candidate"]}, "depth": {"type": "integer", "minimum": 0, "maximum": 8}}, "additionalProperties": false}
31281
+ ResourceRelationEdge: {"type": "object", "required": ["fromUid", "toUid", "type"], "properties": {"fromUid": {"type": "string", "minLength": 1}, "toUid": {"type": "string", "minLength": 1}, "type": {"type": "string", "enum": ["owns", "manual", "references", "selector_candidate"]}, "ruleId": {"type": "string"}}, "additionalProperties": false}
31282
+ ResourceRelationCoverage: {"type": "object", "required": ["queryId", "state", "truncated"], "properties": {"queryId": {"type": "string", "minLength": 1}, "state": {"type": "string", "enum": ["available", "partial", "denied", "error", "not_installed", "unsupported"]}, "reasonCode": {"type": "string"}, "truncated": {"type": "boolean"}}, "additionalProperties": false}
31283
+ ResourceRelationsView: {"type": "object", "required": ["root", "config", "nodes", "edges", "coverage", "partial", "observedAt"], "properties": {"root": {"$ref": "#/components/schemas/KubernetesResourceRef"}, "config": {"$ref": "#/components/schemas/ResourceRelationConfig"}, "nodes": {"type": "array", "items": {"$ref": "#/components/schemas/ResourceRelationNode"}, "maxItems": 500}, "edges": {"type": "array", "items": {"$ref": "#/components/schemas/ResourceRelationEdge"}}, "coverage": {"type": "array", "items": {"$ref": "#/components/schemas/ResourceRelationCoverage"}}, "partial": {"type": "boolean"}, "observedAt": {"type": "string"}}, "additionalProperties": false}
31284
+ ResourceRelationsEnvelope: {"type": "object", "required": ["data"], "properties": {"data": {"$ref": "#/components/schemas/ResourceRelationsView"}}, "additionalProperties": false}
30614
31285
  ReleaseTarget:
30615
31286
  type: object
30616
31287
  required: [id, applicationEnvironmentId, clusterId, namespace, workloadKind, workloadName, enabled]
@@ -30996,6 +31667,8 @@ components:
30996
31667
  type: object
30997
31668
  required: [deliveryPlanId, targetId, applicationId, applicationEnvironmentId, serviceId, serviceVersion, clusterId, namespace, releaseName, operation, chart, chartVersion, chartDigest, configurationDigest, valuesDigest, renderedDigest, expectedRevision, resources, preflightTaskId]
30998
31669
  properties:
31670
+ templateInputs: {"$ref": "#/components/schemas/TemplateVersionReference"}
31671
+ migration: {"$ref": "#/components/schemas/TemplateMigrationAssessment"}
30999
31672
  deliveryPlanId: { type: string, minLength: 1 }
31000
31673
  targetId: { type: string, minLength: 1 }
31001
31674
  applicationId: { type: string, minLength: 1 }
@@ -31043,6 +31716,11 @@ components:
31043
31716
  action: { type: string, enum: [preflight, apply, observe] }
31044
31717
  snapshot: { $ref: "#/components/schemas/HelmDeliverySnapshot" }
31045
31718
  prepared: { $ref: "#/components/schemas/HelmPreparedRelease" }
31719
+ initializationResources:
31720
+ type: array
31721
+ maxItems: 300
31722
+ description: Server-derived original successful initialization apply receipt. Required for initialization observation or already-applied recovery; current same-name objects cannot establish original ownership.
31723
+ items: { $ref: "#/components/schemas/ManifestResourceInventory" }
31046
31724
  additionalProperties: false
31047
31725
  HelmExecutionTaskResult:
31048
31726
  type: object
@@ -31118,6 +31796,7 @@ components:
31118
31796
  type: object
31119
31797
  required: [key, name, source, parameterSchema, defaults, health, enabled]
31120
31798
  properties:
31799
+ migrationPolicy: { $ref: "#/components/schemas/TemplateMigrationPolicy" }
31121
31800
  copiedFrom: { $ref: '#/components/schemas/TemplateCopyOrigin' }
31122
31801
  key: { type: string, minLength: 1, maxLength: 128, pattern: '^[a-z0-9][a-z0-9._-]*$' }
31123
31802
  name: { type: string, minLength: 1, maxLength: 200 }
@@ -31143,6 +31822,7 @@ components:
31143
31822
  type: object
31144
31823
  required: [id, key, name, source, parameterSchema, defaults, health, enabled, revision, publishedVersion, publicationState, createdAt, updatedAt]
31145
31824
  properties:
31825
+ migrationPolicy: { $ref: "#/components/schemas/TemplateMigrationPolicy" }
31146
31826
  id: { type: string, minLength: 1 }
31147
31827
  key: { type: string, minLength: 1 }
31148
31828
  name: { type: string, minLength: 1 }
@@ -31236,6 +31916,7 @@ components:
31236
31916
  type: object
31237
31917
  required: [id, key, name, enabled, createdAt, updatedAt]
31238
31918
  properties:
31919
+ migrationPolicy: {"$ref": "#/components/schemas/TemplateMigrationPolicy"}
31239
31920
  revision:
31240
31921
  type: integer
31241
31922
  minimum: 1
@@ -31277,6 +31958,7 @@ components:
31277
31958
  type: object
31278
31959
  required: [key, name, enabled]
31279
31960
  properties:
31961
+ migrationPolicy: {"$ref": "#/components/schemas/TemplateMigrationPolicy"}
31280
31962
  copiedFrom: { $ref: '#/components/schemas/TemplateCopyOrigin' }
31281
31963
  expectedRevision:
31282
31964
  type: integer
@@ -31433,10 +32115,44 @@ components:
31433
32115
  type: string
31434
32116
  minLength: 1
31435
32117
  additionalProperties: false
32118
+ KubernetesImportOwnerReference:
32119
+ type: object
32120
+ required: [apiVersion, kind, name, uid]
32121
+ properties:
32122
+ apiVersion: { type: string, minLength: 1 }
32123
+ kind: { type: string, minLength: 1 }
32124
+ name: { type: string, minLength: 1 }
32125
+ uid: { type: string, minLength: 1 }
32126
+ controller: { type: boolean }
32127
+ blockOwnerDeletion: { type: boolean }
32128
+ additionalProperties: false
32129
+ KubernetesImportSource:
32130
+ type: object
32131
+ description: Safe source identity captured from an authorized live read. No YAML, spec values, annotations or status are persisted here. For native workloads specDigest covers configuration and ownership metadata excluding status/resourceVersion. For CRs it fences the public UID, generation and owner references without hashing secret content; metadata-only edits are outside that fence. CRs without a positive generation are rejected. UID identifies recreation.
32132
+ required: [resource, specDigest, observedAt]
32133
+ properties:
32134
+ resource:
32135
+ allOf:
32136
+ - $ref: "#/components/schemas/KubernetesResourceRef"
32137
+ - type: object
32138
+ required: [uid]
32139
+ properties:
32140
+ uid: { type: string, minLength: 1 }
32141
+ specDigest: { type: string, pattern: '^[a-f0-9]{64}$' }
32142
+ generation: { type: integer, format: int64, minimum: 0 }
32143
+ crdName: { type: string, minLength: 1 }
32144
+ plural: { type: string, minLength: 1 }
32145
+ observedAt: { type: string, format: date-time }
32146
+ owners:
32147
+ type: array
32148
+ maxItems: 32
32149
+ items: { $ref: "#/components/schemas/KubernetesImportOwnerReference" }
32150
+ additionalProperties: false
31436
32151
  KubernetesImportCandidate:
31437
32152
  type: object
31438
32153
  required: [clusterId, namespace, workloadKind, workloadName, desiredReplicas, readyReplicas, relatedResources]
31439
32154
  properties:
32155
+ source: { $ref: "#/components/schemas/KubernetesImportSource" }
31440
32156
  clusterId:
31441
32157
  type: string
31442
32158
  minLength: 1
@@ -31445,7 +32161,7 @@ components:
31445
32161
  minLength: 1
31446
32162
  workloadKind:
31447
32163
  type: string
31448
- enum: [Deployment, StatefulSet, DaemonSet]
32164
+ enum: [Deployment, StatefulSet, DaemonSet, Job, CronJob, CustomResource]
31449
32165
  workloadName:
31450
32166
  type: string
31451
32167
  minLength: 1
@@ -31484,14 +32200,21 @@ components:
31484
32200
  type: object
31485
32201
  required: [workloadKind, workloadName]
31486
32202
  properties:
32203
+ expectedUid: { type: string, minLength: 1 }
32204
+ expectedSpecDigest: { type: string, pattern: '^[a-f0-9]{64}$' }
32205
+ crdName:
32206
+ type: string
32207
+ minLength: 1
32208
+ description: Required for CustomResource. Resolve the served GVR and scope from this CRD; never infer API group or plural from Kind.
31487
32209
  workloadKind:
31488
32210
  type: string
31489
- enum: [Deployment, StatefulSet, DaemonSet]
32211
+ enum: [Deployment, StatefulSet, DaemonSet, Job, CronJob, CustomResource]
31490
32212
  workloadName:
31491
32213
  type: string
31492
32214
  minLength: 1
31493
32215
  additionalProperties: false
31494
32216
  KubernetesServiceImportRequest:
32217
+ description: Initial association is observe_only. A managed request is rejected until a separate UID-aware ownership handoff and release preflight are available; it must never silently enable publishing.
31495
32218
  type: object
31496
32219
  required: [clusterId, namespace, applicationKey, applicationName, environmentKey, environmentName, ownershipMode, workloads]
31497
32220
  properties:
@@ -31549,7 +32272,7 @@ components:
31549
32272
  type: string
31550
32273
  workloadKind:
31551
32274
  type: string
31552
- enum: [Deployment, StatefulSet, DaemonSet]
32275
+ enum: [Deployment, StatefulSet, DaemonSet, Job, CronJob, CustomResource]
31553
32276
  workloadName:
31554
32277
  type: string
31555
32278
  created:
@@ -31559,11 +32282,12 @@ components:
31559
32282
  type: object
31560
32283
  required: [id, workloadKind, workloadName, created]
31561
32284
  properties:
32285
+ source: { $ref: "#/components/schemas/KubernetesImportSource" }
31562
32286
  id:
31563
32287
  type: string
31564
32288
  workloadKind:
31565
32289
  type: string
31566
- enum: [Deployment, StatefulSet, DaemonSet]
32290
+ enum: [Deployment, StatefulSet, DaemonSet, Job, CronJob, CustomResource]
31567
32291
  workloadName:
31568
32292
  type: string
31569
32293
  created:
@@ -31702,6 +32426,7 @@ components:
31702
32426
  type: object
31703
32427
  required: [id, key, name, enabled, createdAt, updatedAt]
31704
32428
  properties:
32429
+ migrationPolicy: {"$ref": "#/components/schemas/TemplateMigrationPolicy"}
31705
32430
  revision:
31706
32431
  type: integer
31707
32432
  minimum: 1
@@ -31753,6 +32478,7 @@ components:
31753
32478
  type: object
31754
32479
  required: [key, name, enabled]
31755
32480
  properties:
32481
+ migrationPolicy: {"$ref": "#/components/schemas/TemplateMigrationPolicy"}
31756
32482
  copiedFrom: { $ref: '#/components/schemas/TemplateCopyOrigin' }
31757
32483
  expectedRevision:
31758
32484
  type: integer
@@ -31855,9 +32581,10 @@ components:
31855
32581
  type: object
31856
32582
  required: [id, applicationId, serviceId, action]
31857
32583
  properties:
32584
+ templateCandidateId: { type: string, minLength: 1, maxLength: 256 }
31858
32585
  id: { type: string, pattern: '^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$' }
31859
32586
  applicationId: { type: string, minLength: 1 }
31860
- serviceId: { type: string, minLength: 1 }
32587
+ serviceId: { type: string }
31861
32588
  applicationEnvironmentId: { type: string, minLength: 1 }
31862
32589
  releaseTargetId: { type: string }
31863
32590
  helmRevision: { type: integer, minimum: 1, description: Existing owned Helm revision to restore through a new config_update batch. }
@@ -31878,10 +32605,25 @@ components:
31878
32605
  items: { type: string }
31879
32606
  allOf:
31880
32607
  - if:
31881
- properties:
31882
- action: { enum: [build_deploy, deploy, config_update] }
32608
+ required: [templateCandidateId]
31883
32609
  then:
31884
- required: [applicationEnvironmentId]
32610
+ properties:
32611
+ action: { const: config_update }
32612
+ releaseBundleId: { type: string, maxLength: 0 }
32613
+ not:
32614
+ anyOf:
32615
+ - required: [helmRevision]
32616
+ - required: [buildArgs]
32617
+ - required: [repositoryRefs]
32618
+ else:
32619
+ properties:
32620
+ serviceId: { type: string, minLength: 1 }
32621
+ allOf:
32622
+ - if:
32623
+ properties:
32624
+ action: { enum: [build_deploy, deploy, config_update] }
32625
+ then:
32626
+ required: [applicationEnvironmentId]
31885
32627
  - if:
31886
32628
  properties:
31887
32629
  action: { const: deploy }
@@ -31929,6 +32671,7 @@ components:
31929
32671
  type: object
31930
32672
  additionalProperties: false
31931
32673
  properties:
32674
+ migrationPolicy: { $ref: "#/components/schemas/TemplateMigrationPolicy" }
31932
32675
  builderKind: { type: string, minLength: 1, maxLength: 128, default: custom }
31933
32676
  dockerfileTemplate: { type: string, maxLength: 1048576 }
31934
32677
  buildCommands:
@@ -31961,6 +32704,7 @@ components:
31961
32704
  additionalProperties: false
31962
32705
  required: [source, parameterSchema, defaults, health]
31963
32706
  properties:
32707
+ migrationPolicy: {"$ref": "#/components/schemas/TemplateMigrationPolicy"}
31964
32708
  source: { $ref: '#/components/schemas/DeploymentTemplateSource' }
31965
32709
  parameterSchema: { $ref: '#/components/schemas/TemplateParameterSchema' }
31966
32710
  defaults: { $ref: '#/components/schemas/TemplateParameterValues' }
@@ -32117,6 +32861,7 @@ components:
32117
32861
  additionalProperties: false
32118
32862
  required: [definition]
32119
32863
  properties:
32864
+ migrationPolicy: { $ref: "#/components/schemas/TemplateMigrationPolicy" }
32120
32865
  category: { type: string, minLength: 1, maxLength: 128, not: { pattern: '^application:' }, default: release }
32121
32866
  definition:
32122
32867
  oneOf:
@@ -32837,6 +33582,7 @@ components:
32837
33582
  type: object
32838
33583
  required: [target, applicationName, serviceName, serviceVersion, configurationDigest]
32839
33584
  properties:
33585
+ templateUpdate: { $ref: "#/components/schemas/TemplateUpdateReceipt" }
32840
33586
  target: { $ref: "#/components/schemas/DeliveryTargetInput" }
32841
33587
  applicationName: { type: string }
32842
33588
  serviceName: { type: string }
@@ -33198,6 +33944,13 @@ components:
33198
33944
  type: object
33199
33945
  required: [applicationEnvironmentId, clusterId, namespace, workloadKind, workloadName, desiredReplicas, readyReplicas, updatedReplicas, availableReplicas]
33200
33946
  properties:
33947
+ targetId:
33948
+ type: string
33949
+ source:
33950
+ $ref: "#/components/schemas/KubernetesImportSource"
33951
+ sourceStatus:
33952
+ type: string
33953
+ enum: [linked, changed, replaced, missing, unavailable, forbidden]
33201
33954
  applicationEnvironmentId:
33202
33955
  type: string
33203
33956
  clusterId:
@@ -33747,11 +34500,28 @@ components:
33747
34500
  type: string
33748
34501
  enum: [preflight, apply, observe, repair, adopt, rollback, sync, rollout_control]
33749
34502
  x-enum-varnames: [ManifestTaskActionPreflight, ManifestTaskActionApply, ManifestTaskActionObserve, ManifestTaskActionRepair, ManifestTaskActionAdopt, ManifestTaskActionRollback, ManifestTaskActionSync, ManifestTaskActionRolloutControl]
34503
+ ManifestRootResource:
34504
+ type: object
34505
+ description: Server-frozen imported namespaced CR identity and user-reviewed generation. Publication requires the original imported target with metadata ownershipMode=managed, rootCRGeneration matching the reviewed generation, and configRef selecting its Manifest binding. Only spec may be updated; missing roots are never created. Current user or token permissions, external ownership and UID are rechecked. Requires manifest.root-cr.v1 Agent capability and manifest_root_cr_v1 provider. Configuration copies, revisions, plans and deployments retain the sensitive configuration read permission; ordinary task summaries omit root documents.
34506
+ required: [apiVersion, kind, namespace, name, uid, generation, crdName, targetId, deliveryPlanId]
34507
+ properties:
34508
+ targetId: { type: string, minLength: 1 }
34509
+ deliveryPlanId: { type: string, minLength: 1 }
34510
+ apiVersion: { type: string, minLength: 3 }
34511
+ kind: { type: string, minLength: 1 }
34512
+ namespace: { type: string, minLength: 1 }
34513
+ name: { type: string, minLength: 1 }
34514
+ uid: { type: string, minLength: 1 }
34515
+ generation: { type: integer, format: int64, minimum: 1 }
34516
+ crdName: { type: string, minLength: 1 }
34517
+ additionalProperties: false
33750
34518
  ManifestExecutionTaskPayload:
33751
34519
  type: object
33752
34520
  description: Controller-aware tasks use providerKind manifest_agent_v3.<clusterId> and require manifest.execution.v3. Older runners must not claim these tasks or bypass GitOps and Rollout ownership.
33753
34521
  required: [action, packageId, generation, idempotencyKey]
33754
34522
  properties:
34523
+ initializationPlanId: { type: string, minLength: 1, maxLength: 128, description: "Server-frozen initialization Plan identity. Requires manifest.initialize.v1 and its dedicated provider; preflight uses create dry-run, apply creates only, and observation verifies the created UIDs. Never a force or adoption flag." }
34524
+ rootResource: { $ref: "#/components/schemas/ManifestRootResource" }
33755
34525
  rolloutControl: { $ref: "#/components/schemas/ProgressiveRolloutControlInput" }
33756
34526
  gitOpsDocuments:
33757
34527
  type: array
@@ -33814,6 +34584,7 @@ components:
33814
34584
  type: object
33815
34585
  required: [ready, capability, renderedDigest, resourceCount, diagnostics]
33816
34586
  properties:
34587
+ initializationPlanId: { type: string, minLength: 1, maxLength: 128, description: "Server-frozen initialization Plan identity. Requires manifest.initialize.v1 and its dedicated provider; preflight uses create dry-run, apply creates only, and observation verifies the created UIDs. Never a force or adoption flag." }
33817
34588
  ready: { type: boolean }
33818
34589
  capability: { type: string, enum: [available, degraded, unsupported] }
33819
34590
  renderedDigest: { type: string }
@@ -33860,6 +34631,7 @@ components:
33860
34631
  type: object
33861
34632
  required: [action, generation, stale, diagnostics, inventory]
33862
34633
  properties:
34634
+ initializationPlanId: { type: string, minLength: 1, maxLength: 128, description: "Server-frozen initialization Plan identity. Requires manifest.initialize.v1 and its dedicated provider; preflight uses create dry-run, apply creates only, and observation verifies the created UIDs. Never a force or adoption flag." }
33863
34635
  rollout: { $ref: "#/components/schemas/ProgressiveRolloutStatus" }
33864
34636
  action: { $ref: "#/components/schemas/ManifestTaskAction" }
33865
34637
  deploymentId: { type: string }
@@ -33972,6 +34744,7 @@ components:
33972
34744
  type: object
33973
34745
  required: [id, packageId, applicationEnvironmentId, environmentKey, clusterId, namespace, overlay, driftPolicy, deletionPolicy, enabled, version, createdAt, updatedAt]
33974
34746
  properties:
34747
+ templateSelection: { $ref: "#/components/schemas/ManifestTemplateSelection" }
33975
34748
  templateParameters: { $ref: "#/components/schemas/TemplateParameterValues" }
33976
34749
  id: { type: string, minLength: 1 }
33977
34750
  packageId: { type: string, minLength: 1 }
@@ -34109,6 +34882,7 @@ components:
34109
34882
  type: object
34110
34883
  required: [observedGeneration, phase, conditions, inventory]
34111
34884
  properties:
34885
+ appliedTemplate: {"$ref": "#/components/schemas/TemplateVersionReference"}
34112
34886
  observedGeneration: { type: integer, format: int64, minimum: 0 }
34113
34887
  appliedRevision: { type: integer, minimum: 1 }
34114
34888
  appliedDigest: { type: string }
@@ -34653,6 +35427,7 @@ components:
34653
35427
  type: object
34654
35428
  required: [id, source, status, applicationId, applicationEnvironmentId, action, requiresApproval, createdAt, updatedAt]
34655
35429
  properties:
35430
+ templateCandidateId: { type: string, minLength: 1, maxLength: 256 }
34656
35431
  dockerSnapshots:
34657
35432
  type: array
34658
35433
  maxItems: 50
@@ -34751,6 +35526,8 @@ components:
34751
35526
  type: object
34752
35527
  required: [deliveryPlanId, targetId, packageId, bindingId, bindingVersion, applicationEnvironmentId, clusterId, namespace, revision, revisionDigest, packageUpdatedAt, rendererVersion, inputDigest, renderedDigest, documents, preflightTaskId, expectedGeneration]
34753
35528
  properties:
35529
+ migration: {"$ref": "#/components/schemas/TemplateMigrationAssessment"}
35530
+ rootResource: { $ref: "#/components/schemas/ManifestRootResource" }
34754
35531
  gitOpsDocuments:
34755
35532
  type: array
34756
35533
  minItems: 1
@@ -36979,6 +37756,10 @@ components:
36979
37756
  type: object
36980
37757
  required: [transport, syncStrategy, cacheStatus, cacheReady, connectionState]
36981
37758
  properties:
37759
+ actionChecks:
37760
+ type: array
37761
+ maxItems: 64
37762
+ items: { $ref: "#/components/schemas/KubernetesAgentActionCheck" }
36982
37763
  transport:
36983
37764
  type: string
36984
37765
  syncStrategy:
@@ -36999,6 +37780,22 @@ components:
36999
37780
  message:
37000
37781
  type: string
37001
37782
  additionalProperties: false
37783
+ KubernetesAgentActionCheck:
37784
+ type: object
37785
+ required: [action, implementation, configured, kubernetesRBAC]
37786
+ properties:
37787
+ action: { type: string }
37788
+ implementation: { type: string, enum: [supported, unsupported, unknown] }
37789
+ configured: { type: string, enum: [allowed, denied, unknown] }
37790
+ kubernetesRBAC: { type: string, enum: [allowed, denied, unknown, not_applicable] }
37791
+ checkedAt: { type: string, format: date-time }
37792
+ reasonCode: { type: string }
37793
+ scope: { type: string, enum: [cluster], x-enum-varnames: [KubernetesAgentActionCheckScopeCluster] }
37794
+ additionalProperties: false
37795
+ KubernetesAgentActionProfile:
37796
+ type: string
37797
+ enum: [legacy, workbench, read-only]
37798
+ description: Installation preset only. Legacy preserves existing permissions; selecting workbench or read-only requires regenerating and reviewing the installation manifest.
37002
37799
  KubernetesClusterConnectionDetail:
37003
37800
  type: object
37004
37801
  required: [mode, credentialType, sourceType, hasInlineKubeconfig, hasToken, usesInformerCache]
@@ -37021,6 +37818,7 @@ components:
37021
37818
  type: boolean
37022
37819
  usesInformerCache:
37023
37820
  type: boolean
37821
+ actionProfile: { $ref: "#/components/schemas/KubernetesAgentActionProfile" }
37024
37822
  customResourceRules:
37025
37823
  type: array
37026
37824
  maxItems: 50
@@ -37062,6 +37860,7 @@ components:
37062
37860
  prometheusClusterLabel: { type: string }
37063
37861
  grafanaBaseUrl: { type: string }
37064
37862
  prometheusTransport: { $ref: "#/components/schemas/KubernetesPrometheusTransport" }
37863
+ agentActionProfile: { $ref: "#/components/schemas/KubernetesAgentActionProfile" }
37065
37864
  agentCustomResourceRules:
37066
37865
  type: array
37067
37866
  maxItems: 50
@@ -37249,6 +38048,18 @@ components:
37249
38048
  type: string
37250
38049
  unschedulable:
37251
38050
  type: boolean
38051
+ taints:
38052
+ type: array
38053
+ nullable: true
38054
+ description: Current Node spec taints. Empty means none; null or absent means not reported.
38055
+ items:
38056
+ $ref: "#/components/schemas/KubernetesNodeTaint"
38057
+ conditions:
38058
+ type: array
38059
+ nullable: true
38060
+ description: Current Node conditions, independent of scheduling and drain operations.
38061
+ items:
38062
+ $ref: "#/components/schemas/KubernetesWorkloadCondition"
37252
38063
  roles:
37253
38064
  type: array
37254
38065
  items:
@@ -37496,6 +38307,10 @@ components:
37496
38307
  type: object
37497
38308
  required: [name, namespace, phase, readyContainers, restarts, ageSeconds]
37498
38309
  properties:
38310
+ uid:
38311
+ type: string
38312
+ minLength: 1
38313
+ description: Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.
37499
38314
  name:
37500
38315
  type: string
37501
38316
  namespace:
@@ -37655,6 +38470,10 @@ components:
37655
38470
  type: object
37656
38471
  required: [name, namespace, phase]
37657
38472
  properties:
38473
+ uid:
38474
+ type: string
38475
+ minLength: 1
38476
+ description: Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.
37658
38477
  name:
37659
38478
  type: string
37660
38479
  namespace:
@@ -39689,6 +40508,193 @@ components:
39689
40508
  properties:
39690
40509
  data: { $ref: "#/components/schemas/KubernetesNetworkPolicyDetail" }
39691
40510
  additionalProperties: false
40511
+ KubernetesTopologyProvider:
40512
+ type: string
40513
+ enum: [kubernetes, gateway, traefik, apisix]
40514
+ x-enum-varnames: [KubernetesTopologyProviderKubernetes, KubernetesTopologyProviderGateway, KubernetesTopologyProviderTraefik, KubernetesTopologyProviderApisix]
40515
+ KubernetesTopologyResolution:
40516
+ type: string
40517
+ enum: [resolved, unresolved, not_found, not_visible, no_ready_endpoints, external, unsupported_fragment, unknown]
40518
+ x-enum-varnames: [KubernetesTopologyResolutionResolved, KubernetesTopologyResolutionUnresolved, KubernetesTopologyResolutionNotFound, KubernetesTopologyResolutionNotVisible, KubernetesTopologyResolutionNoReadyEndpoints, KubernetesTopologyResolutionExternal, KubernetesTopologyResolutionUnsupportedFragment, KubernetesTopologyResolutionUnknown]
40519
+ KubernetesTopologyProperty:
40520
+ type: object
40521
+ required: [name, value]
40522
+ properties:
40523
+ name: { type: string, maxLength: 64 }
40524
+ value: { type: string, maxLength: 1024 }
40525
+ additionalProperties: false
40526
+ KubernetesTopologyMatch:
40527
+ type: object
40528
+ required: [type]
40529
+ properties:
40530
+ type: { type: string, maxLength: 32 }
40531
+ name: { type: string, maxLength: 128 }
40532
+ operator: { type: string, maxLength: 32 }
40533
+ value: { type: string, maxLength: 1024 }
40534
+ additionalProperties: false
40535
+ KubernetesTopologyRule:
40536
+ type: object
40537
+ required: [index]
40538
+ properties:
40539
+ name: { type: string, maxLength: 253 }
40540
+ index: { type: integer, minimum: 0 }
40541
+ matchGroups:
40542
+ description: Groups are ORed; matches inside each group are ANDed. Opaque expressions remain a bounded summary and are marked unsupported_fragment.
40543
+ type: array
40544
+ maxItems: 64
40545
+ items:
40546
+ type: array
40547
+ maxItems: 64
40548
+ items: { $ref: "#/components/schemas/KubernetesTopologyMatch" }
40549
+ matchSummary: { type: string, maxLength: 2048 }
40550
+ priority: { type: integer, format: int64 }
40551
+ tlsMode: { type: string, maxLength: 64 }
40552
+ additionalProperties: false
40553
+ KubernetesTopologyCondition:
40554
+ type: object
40555
+ required: [type, status]
40556
+ properties:
40557
+ type: { type: string, maxLength: 128 }
40558
+ status: { type: string, maxLength: 32 }
40559
+ reason: { type: string, maxLength: 128 }
40560
+ observedGeneration: { type: integer, format: int64 }
40561
+ lastTransitionTime: { type: string, format: date-time }
40562
+ additionalProperties: false
40563
+ KubernetesTopologyGraphNode:
40564
+ type: object
40565
+ required: [id, type, label, provider, resolutionState]
40566
+ properties:
40567
+ id: { type: string, minLength: 1, maxLength: 2048 }
40568
+ type:
40569
+ type: string
40570
+ enum: [entry, rule, processor, backend-group, service, endpoint-group, pod, external]
40571
+ x-enum-varnames: [KubernetesTopologyGraphNodeTypeEntry, KubernetesTopologyGraphNodeTypeRule, KubernetesTopologyGraphNodeTypeProcessor, KubernetesTopologyGraphNodeTypeBackendGroup, KubernetesTopologyGraphNodeTypeService, KubernetesTopologyGraphNodeTypeEndpointGroup, KubernetesTopologyGraphNodeTypePod, KubernetesTopologyGraphNodeTypeExternal]
40572
+ label: { type: string, maxLength: 1024 }
40573
+ provider: { $ref: "#/components/schemas/KubernetesTopologyProvider" }
40574
+ protocol: { type: string, maxLength: 16 }
40575
+ resolutionState: { $ref: "#/components/schemas/KubernetesTopologyResolution" }
40576
+ resource: { $ref: "#/components/schemas/KubernetesResourceRef" }
40577
+ rule: { $ref: "#/components/schemas/KubernetesTopologyRule" }
40578
+ generation: { type: integer, format: int64 }
40579
+ properties:
40580
+ type: array
40581
+ maxItems: 64
40582
+ items: { $ref: "#/components/schemas/KubernetesTopologyProperty" }
40583
+ conditions:
40584
+ type: array
40585
+ maxItems: 64
40586
+ items: { $ref: "#/components/schemas/KubernetesTopologyCondition" }
40587
+ additionalProperties: false
40588
+ KubernetesTopologyGraphEdge:
40589
+ type: object
40590
+ required: [id, source, target, relation, resolutionState]
40591
+ properties:
40592
+ id: { type: string, minLength: 1, maxLength: 2048 }
40593
+ source: { type: string, minLength: 1, maxLength: 2048 }
40594
+ target: { type: string, minLength: 1, maxLength: 2048 }
40595
+ relation:
40596
+ type: string
40597
+ enum: [matches, processes, forwards, weights, mirrors, resolves, selects]
40598
+ x-enum-varnames: [KubernetesTopologyGraphEdgeRelationMatches, KubernetesTopologyGraphEdgeRelationProcesses, KubernetesTopologyGraphEdgeRelationForwards, KubernetesTopologyGraphEdgeRelationWeights, KubernetesTopologyGraphEdgeRelationMirrors, KubernetesTopologyGraphEdgeRelationResolves, KubernetesTopologyGraphEdgeRelationSelects]
40599
+ resolutionState: { $ref: "#/components/schemas/KubernetesTopologyResolution" }
40600
+ protocol: { type: string, maxLength: 16 }
40601
+ port: { type: string, maxLength: 64 }
40602
+ weight: { type: integer, format: int64, minimum: 0 }
40603
+ totalWeight: { type: integer, format: int64, minimum: 0 }
40604
+ mirrorPercent: { type: number, minimum: 0, maximum: 100 }
40605
+ ruleRef: { type: string, maxLength: 2048 }
40606
+ sourceRef: { $ref: "#/components/schemas/KubernetesResourceRef" }
40607
+ note: { type: string, maxLength: 2048 }
40608
+ additionalProperties: false
40609
+ KubernetesTopologyCoverage:
40610
+ type: object
40611
+ required: [provider, sourceId, state]
40612
+ properties:
40613
+ provider: { $ref: "#/components/schemas/KubernetesTopologyProvider" }
40614
+ sourceId: { type: string, maxLength: 128 }
40615
+ state:
40616
+ type: string
40617
+ enum: [available, not_installed, unsupported, denied, error, partial]
40618
+ x-enum-varnames: [KubernetesTopologyCoverageStateAvailable, KubernetesTopologyCoverageStateNotInstalled, KubernetesTopologyCoverageStateUnsupported, KubernetesTopologyCoverageStateDenied, KubernetesTopologyCoverageStateError, KubernetesTopologyCoverageStatePartial]
40619
+ namespace: { type: string, maxLength: 63 }
40620
+ supportedKinds:
40621
+ type: array
40622
+ maxItems: 32
40623
+ items: { type: string, maxLength: 128 }
40624
+ reasonCode: { type: string, maxLength: 128 }
40625
+ checkedAt: { type: string, format: date-time }
40626
+ observedAt: { type: string, format: date-time }
40627
+ truncated: { type: boolean }
40628
+ additionalProperties: false
40629
+ KubernetesTopologySourceQuery:
40630
+ type: object
40631
+ required: [sourceId]
40632
+ properties:
40633
+ sourceId:
40634
+ type: string
40635
+ enum: [kubernetes.services, kubernetes.pods, kubernetes.endpointslices, kubernetes.ingresses, kubernetes.ingressclasses, gateway.gateways, gateway.gatewayclasses, gateway.httproutes, gateway.grpcroutes, gateway.tcproutes, gateway.tlsroutes, gateway.udproutes, gateway.referencegrants, traefik.ingressroutes, traefik.ingressroutetcps, traefik.ingressrouteudps, traefik.traefikservices, traefik.middlewares, traefik.middlewaretcps, apisix.apisixroutes, apisix.apisixupstreams, apisix.apisixtls]
40636
+ x-enum-varnames: [KubernetesTopologySourceKubernetesServices, KubernetesTopologySourceKubernetesPods, KubernetesTopologySourceKubernetesEndpointslices, KubernetesTopologySourceKubernetesIngresses, KubernetesTopologySourceKubernetesIngressclasses, KubernetesTopologySourceGatewayGateways, KubernetesTopologySourceGatewayGatewayclasses, KubernetesTopologySourceGatewayHttproutes, KubernetesTopologySourceGatewayGrpcroutes, KubernetesTopologySourceGatewayTcproutes, KubernetesTopologySourceGatewayTlsroutes, KubernetesTopologySourceGatewayUdproutes, KubernetesTopologySourceGatewayReferencegrants, KubernetesTopologySourceTraefikIngressroutes, KubernetesTopologySourceTraefikIngressroutetcps, KubernetesTopologySourceTraefikIngressrouteudps, KubernetesTopologySourceTraefikTraefikservices, KubernetesTopologySourceTraefikMiddlewares, KubernetesTopologySourceTraefikMiddlewaretcps, KubernetesTopologySourceApisixApisixroutes, KubernetesTopologySourceApisixApisixupstreams, KubernetesTopologySourceApisixApisixtls]
40637
+ namespace: { type: string, maxLength: 63, pattern: '^$|^[a-z0-9]([a-z0-9-]*[a-z0-9])?$' }
40638
+ allOf:
40639
+ - if:
40640
+ properties:
40641
+ sourceId: { enum: [kubernetes.ingressclasses, gateway.gatewayclasses] }
40642
+ required: [sourceId]
40643
+ then:
40644
+ properties:
40645
+ namespace: { type: string, maxLength: 0 }
40646
+ additionalProperties: false
40647
+ KubernetesTopologySnapshotRequest:
40648
+ type: object
40649
+ required: [queries]
40650
+ properties:
40651
+ queries:
40652
+ type: array
40653
+ minItems: 1
40654
+ maxItems: 64
40655
+ uniqueItems: true
40656
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceQuery" }
40657
+ additionalProperties: false
40658
+ KubernetesTopologySourceObject:
40659
+ type: object
40660
+ required: [resource, content]
40661
+ properties:
40662
+ resource: { $ref: "#/components/schemas/KubernetesResourceRef" }
40663
+ generation: { type: integer, format: int64 }
40664
+ content:
40665
+ type: string
40666
+ maxLength: 65536
40667
+ description: Fixed source-schema projection encoded as JSON. Unknown fields, raw annotations, Secret values, plugin configuration and credential material are removed before transport. This is not an original Kubernetes manifest.
40668
+ additionalProperties: false
40669
+ KubernetesTopologySourceResult:
40670
+ type: object
40671
+ required: [coverage, objects]
40672
+ properties:
40673
+ coverage: { $ref: "#/components/schemas/KubernetesTopologyCoverage" }
40674
+ objects:
40675
+ type: array
40676
+ maxItems: 200
40677
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceObject" }
40678
+ additionalProperties: false
40679
+ KubernetesTopologySnapshot:
40680
+ type: object
40681
+ required: [version, sources]
40682
+ properties:
40683
+ version: { type: string, pattern: '^v1$' }
40684
+ sources:
40685
+ type: array
40686
+ maxItems: 64
40687
+ items: { $ref: "#/components/schemas/KubernetesTopologySourceResult" }
40688
+ additionalProperties: false
40689
+ ResourceMonitoringQuality: {"type":"string","enum":["valid","partial","stale","not_configured","not_collected","unsupported","denied","error","empty"],"x-enum-varnames":["ResourceMonitoringQualityValid","ResourceMonitoringQualityPartial","ResourceMonitoringQualityStale","ResourceMonitoringQualityNotConfigured","ResourceMonitoringQualityNotCollected","ResourceMonitoringQualityUnsupported","ResourceMonitoringQualityDenied","ResourceMonitoringQualityError","ResourceMonitoringQualityEmpty"]}
40690
+ ResourceMonitoringViewName: {"type":"string","enum":["overview","cpu","memory","conntrack","pods"],"x-enum-varnames":["ResourceMonitoringViewOverview","ResourceMonitoringViewCPU","ResourceMonitoringViewMemory","ResourceMonitoringViewConntrack","ResourceMonitoringViewPods"]}
40691
+ ResourceMonitoringQuantity: {"type":"object","additionalProperties":false,"required":["cpuCores","memoryBytes","podSlots"],"properties":{"cpuCores":{"type":"number","format":"double","nullable":true},"memoryBytes":{"type":"number","format":"double","nullable":true},"podSlots":{"type":"number","format":"double","nullable":true}}}
40692
+ ResourceMonitoringNode: {"type":"object","additionalProperties":false,"required":["nodeRef","ready","cordoned","memoryPressure","diskPressure","pidPressure","capacity","allocatable","requests","limits","cpuLimitsComplete","memoryLimitsComplete","boundPods","pendingPods","remainingPodSlots","overflowPodSlots","quality"],"properties":{"nodeRef":{"$ref":"#/components/schemas/KubernetesResourceRef"},"internalIP":{"type":"string"},"os":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"ready":{"type":"string"},"cordoned":{"type":"boolean"},"memoryPressure":{"type":"string"},"diskPressure":{"type":"string"},"pidPressure":{"type":"string"},"capacity":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"allocatable":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"requests":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"limits":{"$ref":"#/components/schemas/ResourceMonitoringQuantity"},"cpuLimitsComplete":{"type":"boolean"},"memoryLimitsComplete":{"type":"boolean"},"boundPods":{"type":"number","format":"double","nullable":true},"pendingPods":{"type":"number","format":"double","nullable":true},"remainingPodSlots":{"type":"number","format":"double","nullable":true},"overflowPodSlots":{"type":"number","format":"double","nullable":true},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"observedAt":{"type":"string","format":"date-time"}}}
40693
+ ResourceMonitoringPoint: {"type":"object","additionalProperties":false,"required":["timestamp","value"],"properties":{"timestamp":{"type":"string","format":"date-time"},"value":{"type":"number","format":"double","nullable":true}}}
40694
+ ResourceMonitoringSeries: {"type":"object","additionalProperties":false,"required":["nodeRef","metricKey","unit","quality","source","latest","points"],"properties":{"nodeRef":{"$ref":"#/components/schemas/KubernetesResourceRef"},"metricKey":{"type":"string","maxLength":64},"unit":{"type":"string","enum":["cores","bytes","count","events/s","events","percent"],"x-enum-varnames":["ResourceMonitoringUnitCores","ResourceMonitoringUnitBytes","ResourceMonitoringUnitCount","ResourceMonitoringUnitEventsPerSecond","ResourceMonitoringUnitEvents","ResourceMonitoringUnitPercent"]},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"reasonCode":{"type":"string","maxLength":64},"source":{"type":"string"},"sampledAt":{"type":"string","format":"date-time"},"latest":{"type":"number","format":"double","nullable":true},"points":{"type":"array","maxItems":1440,"items":{"$ref":"#/components/schemas/ResourceMonitoringPoint"}}}}
40695
+ ResourceMonitoringPanel: {"type":"object","additionalProperties":false,"required":["key","label","unit","quality","series"],"properties":{"key":{"type":"string","maxLength":64},"label":{"type":"string"},"unit":{"type":"string"},"quality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"reasonCode":{"type":"string","maxLength":64},"estimated":{"type":"boolean"},"windowSeconds":{"type":"integer","minimum":300,"maximum":3600},"series":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/ResourceMonitoringSeries"}}}}
40696
+ ResourceMonitoringView: {"type":"object","additionalProperties":false,"required":["clusterId","view","from","to","stepSeconds","generatedAt","snapshotQuality","unscheduledPendingPods","nodes","panels"],"properties":{"clusterId":{"type":"string"},"view":{"$ref":"#/components/schemas/ResourceMonitoringViewName"},"node":{"type":"string"},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"stepSeconds":{"type":"integer","minimum":15,"maximum":3600},"generatedAt":{"type":"string","format":"date-time"},"snapshotObservedAt":{"type":"string","format":"date-time"},"snapshotQuality":{"$ref":"#/components/schemas/ResourceMonitoringQuality"},"unscheduledPendingPods":{"type":"number","format":"double","nullable":true},"nodes":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/ResourceMonitoringNode"}},"panels":{"type":"array","maxItems":32,"items":{"$ref":"#/components/schemas/ResourceMonitoringPanel"}},"truncated":{"type":"boolean"},"nodeOptions":{"type":"array","maxItems":500,"items":{"$ref":"#/components/schemas/KubernetesResourceRef"}}}}
40697
+ ResourceMonitoringEnvelope: {"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ResourceMonitoringView"}}}
39692
40698
  KubernetesNetworkTopologySummary:
39693
40699
  type: object
39694
40700
  required: [entryCount, routeCount, serviceCount, missingServiceCount, backendPodCount, pendingRouteCount]
@@ -39737,6 +40743,21 @@ components:
39737
40743
  source: { type: string }
39738
40744
  generatedAt: { type: string }
39739
40745
  summary: { $ref: "#/components/schemas/KubernetesNetworkTopologySummary" }
40746
+ graphVersion: { type: string, pattern: '^v1$' }
40747
+ nodes:
40748
+ type: array
40749
+ maxItems: 500
40750
+ items: { $ref: "#/components/schemas/KubernetesTopologyGraphNode" }
40751
+ edges:
40752
+ type: array
40753
+ maxItems: 1000
40754
+ items: { $ref: "#/components/schemas/KubernetesTopologyGraphEdge" }
40755
+ coverage:
40756
+ type: array
40757
+ maxItems: 128
40758
+ items: { $ref: "#/components/schemas/KubernetesTopologyCoverage" }
40759
+ observedAt: { type: string, format: date-time }
40760
+ truncated: { type: boolean }
39740
40761
  traces:
39741
40762
  type: array
39742
40763
  items: { $ref: "#/components/schemas/KubernetesNetworkTopologyTrace" }
@@ -43187,6 +44208,7 @@ components:
43187
44208
  namespace: { type: string, minLength: 1 }
43188
44209
  scopeMode: { $ref: "#/components/schemas/KubernetesResourceScopeMode" }
43189
44210
  uid: { type: string }
44211
+ resourceVersion: { type: string }
43190
44212
  additionalProperties: false
43191
44213
  KubernetesResourceStreamEventType:
43192
44214
  type: string
@@ -49791,3 +50813,50 @@ components:
49791
50813
  properties:
49792
50814
  data: { $ref: "#/components/schemas/NetworkPolicyPreviewResult" }
49793
50815
  additionalProperties: false
50816
+
50817
+ TemplateUpdateKind:
50818
+ {"type": "string", "enum": ["deployment", "build", "workflow", "blueprint"]}
50819
+ TemplateUpdateMode:
50820
+ {"type": "string", "enum": ["fixed", "manual", "automatic", "approval"]}
50821
+ ManifestTemplateSelection:
50822
+ {"type": "object", "properties": {"templateId": {"type": "string", "maxLength": 256}, "version": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "parameters": {"$ref": "#/components/schemas/TemplateParameterValues"}, "baseFilesDigest": {"type": "string", "maxLength": 80}, "adoptionId": {"type": "string", "maxLength": 256}}, "required": ["templateId", "version", "parameters", "baseFilesDigest", "adoptionId"], "additionalProperties": false}
50823
+ TemplateUpdateTarget:
50824
+ {"type": "object", "properties": {"id": {"type": "string", "maxLength": 256}, "kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "maxLength": 256}, "applicationId": {"type": "string", "maxLength": 256}, "applicationName": {"type": "string", "maxLength": 256}, "serviceId": {"type": "string", "maxLength": 256}, "serviceName": {"type": "string", "maxLength": 256}, "applicationEnvironmentId": {"type": "string", "maxLength": 256}, "environmentName": {"type": "string", "maxLength": 256}, "releaseTargetId": {"type": "string", "maxLength": 256}, "fromVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "mode": {"$ref": "#/components/schemas/TemplateUpdateMode"}, "requiresApproval": {"type": "boolean"}, "eligible": {"type": "boolean"}, "reason": {"type": "string", "maxLength": 1024}, "independentOverrides": {"type": "array", "items": {"type": "string", "maxLength": 256}, "maxItems": 100}, "bindingRevision": {"type": "string", "maxLength": 256}, "scope": {"type": "string", "enum": ["environment", "application", "creation_only"]}}, "required": ["id", "kind", "templateId", "applicationId", "applicationName", "serviceId", "serviceName", "applicationEnvironmentId", "environmentName", "releaseTargetId", "fromVersion", "mode", "requiresApproval", "eligible", "reason", "independentOverrides", "bindingRevision", "scope"], "additionalProperties": false}
50825
+ TemplateUpdateTargetPage:
50826
+ {"type": "object", "properties": {"items": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdateTarget"}, "maxItems": 100}, "total": {"type": "integer", "format": "int64", "minimum": 0, "maximum": 2147483647}, "page": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "pageSize": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 100}}, "required": ["items", "total", "page", "pageSize"], "additionalProperties": false}
50827
+ TemplateUpdateSelection:
50828
+ {"type": "object", "properties": {"targetId": {"type": "string", "maxLength": 256, "minLength": 1}, "parameters": {"$ref": "#/components/schemas/TemplateParameterValues"}, "useNewDefaults": {"type": "array", "items": {"type": "string", "maxLength": 256}, "maxItems": 100, "uniqueItems": true}, "wave": {"type": "integer", "format": "int64", "minimum": 0, "maximum": 199}}, "required": ["targetId"], "additionalProperties": false}
50829
+ TemplateUpdatePreviewInput:
50830
+ {"type": "object", "properties": {"kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "maxLength": 256, "minLength": 1}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "targets": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdateSelection"}, "maxItems": 100, "minItems": 1}, "applicationId": {"type": "string", "minLength": 1, "maxLength": 256}}, "required": ["kind", "templateId", "toVersion", "targets"], "additionalProperties": false}
50831
+ TemplateUpdateChange:
50832
+ {"type": "object", "properties": {"section": {"type": "string", "enum": ["source", "schema", "defaults", "parameters", "resources"]}, "path": {"type": "string", "maxLength": 1024}, "before": {"type": "string", "maxLength": 32768}, "after": {"type": "string", "maxLength": 32768}}, "required": ["section", "path", "before", "after"], "additionalProperties": false}
50833
+ TemplateUpdateDiff:
50834
+ {"type": "object", "properties": {"fromVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "changes": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdateChange"}, "maxItems": 500}, "renderStatus": {"type": "string", "enum": ["available", "unavailable", "invalid"]}, "diagnostics": {"type": "array", "items": {"type": "string", "maxLength": 2048}, "maxItems": 32}, "historyGap": {"type": "boolean"}, "migration": {"$ref": "#/components/schemas/TemplateMigrationAssessment"}}, "required": ["fromVersion", "toVersion", "changes", "renderStatus", "diagnostics", "historyGap"], "additionalProperties": false}
50835
+ TemplateUpdateCandidate:
50836
+ {"type": "object", "properties": {"id": {"type": "string", "maxLength": 256}, "target": {"$ref": "#/components/schemas/TemplateUpdateTarget"}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "digest": {"type": "string", "maxLength": 80}, "parameters": {"$ref": "#/components/schemas/TemplateParameterValues"}, "cumulative": {"$ref": "#/components/schemas/TemplateUpdateDiff"}, "versions": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdateDiff"}, "maxItems": 200}, "eligible": {"type": "boolean"}, "reason": {"type": "string", "maxLength": 1024}, "requiresApproval": {"type": "boolean"}, "wave": {"type": "integer", "format": "int64", "minimum": 0, "maximum": 199}}, "required": ["id", "target", "toVersion", "digest", "parameters", "cumulative", "versions", "eligible", "reason", "requiresApproval", "wave"], "additionalProperties": false}
50837
+ TemplateUpdatePreview:
50838
+ {"type": "object", "properties": {"id": {"type": "string", "maxLength": 256}, "kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "maxLength": 256}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "digest": {"type": "string", "maxLength": 80}, "candidates": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdateCandidate"}, "maxItems": 100}, "createdAt": {"type": "string", "format": "date-time"}, "expiresAt": {"type": "string", "format": "date-time"}, "configurationOnly": {"type": "boolean", "const": true}}, "required": ["id", "kind", "templateId", "toVersion", "digest", "candidates", "createdAt", "expiresAt", "configurationOnly"], "additionalProperties": false}
50839
+ TemplateUpdateBatchInput:
50840
+ {"type": "object", "properties": {"previewDigest": {"type": "string", "maxLength": 80, "minLength": 1}, "candidateIds": {"type": "array", "items": {"type": "string", "maxLength": 256, "minLength": 1}, "maxItems": 100, "minItems": 1, "uniqueItems": true}, "waveSize": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 100}, "stopOnFailure": {"type": "boolean"}, "acknowledgeHistoryGaps": {"type": "boolean"}, "idempotencyKey": {"type": "string", "maxLength": 128, "minLength": 8}}, "required": ["previewDigest", "candidateIds", "waveSize", "stopOnFailure", "acknowledgeHistoryGaps", "idempotencyKey"], "additionalProperties": false}
50841
+ TemplateUpdatePolicyInput:
50842
+ {"type": "object", "properties": {"kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "maxLength": 256, "minLength": 1}, "targetId": {"type": "string", "maxLength": 256, "minLength": 1}, "mode": {"$ref": "#/components/schemas/TemplateUpdateMode"}, "paused": {"type": "boolean"}, "expectedVersion": {"type": "integer", "format": "int64", "minimum": 0, "maximum": 2147483647}}, "required": ["kind", "templateId", "targetId", "mode", "paused", "expectedVersion"], "additionalProperties": false}
50843
+ TemplateUpdatePolicy:
50844
+ {"type": "object", "properties": {"id": {"type": "string", "maxLength": 256}, "kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "maxLength": 256}, "targetId": {"type": "string", "maxLength": 256}, "mode": {"$ref": "#/components/schemas/TemplateUpdateMode"}, "paused": {"type": "boolean"}, "version": {"type": "integer", "format": "int64", "minimum": 1, "maximum": 2147483647}, "lastBatchId": {"type": "string", "maxLength": 256}, "lastError": {"type": "string", "maxLength": 1024}, "updatedAt": {"type": "string", "format": "date-time"}}, "required": ["id", "kind", "templateId", "targetId", "mode", "paused", "version", "lastBatchId", "lastError", "updatedAt"], "additionalProperties": false}
50845
+ TemplateUpdateTargetPageEnvelope:
50846
+ {"type": "object", "properties": {"data": {"$ref": "#/components/schemas/TemplateUpdateTargetPage"}}, "required": ["data"], "additionalProperties": false}
50847
+ TemplateUpdatePreviewEnvelope:
50848
+ {"type": "object", "properties": {"data": {"$ref": "#/components/schemas/TemplateUpdatePreview"}}, "required": ["data"], "additionalProperties": false}
50849
+ TemplateUpdatePolicyEnvelope:
50850
+ {"type": "object", "properties": {"data": {"$ref": "#/components/schemas/TemplateUpdatePolicy"}}, "required": ["data"], "additionalProperties": false}
50851
+ TemplateUpdatePolicyListEnvelope:
50852
+ {"type": "object", "properties": {"data": {"type": "array", "items": {"$ref": "#/components/schemas/TemplateUpdatePolicy"}, "maxItems": 2000}}, "required": ["data"], "additionalProperties": false}
50853
+ TemplateUpdateReceipt:
50854
+ {"type": "object", "required": ["kind", "templateId", "bindingId", "previewId", "candidateId", "fromVersion", "toVersion", "requiresApproval"], "properties": {"kind": {"$ref": "#/components/schemas/TemplateUpdateKind"}, "templateId": {"type": "string", "minLength": 1, "maxLength": 256}, "bindingId": {"type": "string", "minLength": 1, "maxLength": 256}, "previewId": {"type": "string", "minLength": 1, "maxLength": 256}, "candidateId": {"type": "string", "minLength": 1, "maxLength": 256}, "fromVersion": {"type": "integer", "format": "int64", "minimum": 1}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1}, "requiresApproval": {"type": "boolean"}}, "additionalProperties": false}
50855
+ TemplateMigrationPolicy:
50856
+ {"type": "object", "additionalProperties": false, "properties": {"sequential": {"type": "boolean", "description": "Must cross this boundary as adjacent published versions; approval cannot waive it."}, "irreversible": {"type": "boolean", "description": "Forward changes require approval; ordinary rollback across this boundary is forbidden."}, "guide": {"type": "string", "maxLength": 2000, "description": "Human migration/recovery instructions. Never executed as a script."}}, "required": ["sequential", "irreversible"], "if": {"anyOf": [{"required": ["sequential"], "properties": {"sequential": {"const": true}}}, {"required": ["irreversible"], "properties": {"irreversible": {"const": true}}}]}, "then": {"required": ["guide"], "properties": {"guide": {"minLength": 1, "pattern": "\\S"}}}}
50857
+ TemplateVersionReference:
50858
+ {"type": "object", "additionalProperties": false, "properties": {"templateId": {"type": "string", "maxLength": 128, "minLength": 1}, "templateVersion": {"type": "integer", "format": "int64", "minimum": 1}, "templateDigest": {"type": "string", "maxLength": 80, "minLength": 1}}, "required": ["templateId", "templateVersion", "templateDigest"]}
50859
+ TemplateMigrationStep:
50860
+ {"type": "object", "additionalProperties": false, "properties": {"version": {"type": "integer", "format": "int64", "minimum": 1}, "contentDigest": {"type": "string", "maxLength": 80}, "policy": {"$ref": "#/components/schemas/TemplateMigrationPolicy"}}, "required": ["version", "contentDigest", "policy"]}
50861
+ TemplateMigrationAssessment:
50862
+ {"type": "object", "additionalProperties": false, "properties": {"initialization": {"type": "boolean", "description": "Server-classified first-deployment candidate; requires create-only preflight and explicit Plan approval. It is not a successful runtime baseline or proof that external data is empty."}, "fromVersion": {"type": "integer", "format": "int64", "minimum": 0}, "toVersion": {"type": "integer", "format": "int64", "minimum": 1}, "blocked": {"type": "boolean"}, "requiresApproval": {"type": "boolean"}, "reason": {"type": "string", "maxLength": 1024}, "steps": {"type": "array", "maxItems": 200, "items": {"$ref": "#/components/schemas/TemplateMigrationStep"}}}, "required": ["fromVersion", "toVersion", "blocked", "requiresApproval", "reason", "steps"]}