@opensoha/contracts 0.1.25 → 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 (81) 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/compat/json-schema-ecosystem-0.1.0.json +1 -1
  7. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  8. package/delivery/document.schema.json +127 -9
  9. package/examples/relations_compat_test.go +18 -0
  10. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-build-template.json +30 -0
  11. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-deployment-template.json +30 -0
  12. package/fixtures/openapi/DeliveryDocument/invalid/migration-missing-guide-workflow-template.json +27 -0
  13. package/fixtures/openapi/DeliveryDocument/valid/migration-build-template.json +31 -0
  14. package/fixtures/openapi/DeliveryDocument/valid/migration-deployment-template.json +31 -0
  15. package/fixtures/openapi/DeliveryDocument/valid/migration-workflow-template.json +28 -0
  16. package/fixtures/openapi/DeliveryPlanInput/invalid/manual-plan.json +7 -0
  17. package/fixtures/openapi/DeliveryPlanInput/valid/manual-plan.json +6 -0
  18. package/fixtures/openapi/DeliveryTargetInput/invalid/candidate-on-runtime-deploy.json +9 -0
  19. package/fixtures/openapi/DeliveryTargetInput/invalid/config-update-missing-service.json +7 -0
  20. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-only.json +8 -0
  21. package/fixtures/openapi/DeliveryTargetInput/valid/template-configuration-without-runtime-environment.json +1 -0
  22. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-with-spec.json +33 -0
  23. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/invalid/source-without-uid.json +29 -0
  24. package/fixtures/openapi/KubernetesImportCandidateListEnvelope/valid/stable-source.json +30 -0
  25. package/fixtures/openapi/KubernetesPod/invalid/pod-uid.json +9 -0
  26. package/fixtures/openapi/KubernetesPod/valid/pod-uid.json +9 -0
  27. package/fixtures/openapi/KubernetesPodDetail/invalid/pod-uid.json +6 -0
  28. package/fixtures/openapi/KubernetesPodDetail/valid/pod-uid.json +6 -0
  29. package/fixtures/openapi/KubernetesServiceImportRequest/invalid/empty-source-uid.json +48 -0
  30. package/fixtures/openapi/KubernetesServiceImportRequest/valid/pinned-workloads-and-cr.json +48 -0
  31. package/fixtures/openapi/ManifestExecutionTaskPayload/invalid/initialization.json +7 -0
  32. package/fixtures/openapi/ManifestExecutionTaskPayload/valid/initialization.json +7 -0
  33. package/fixtures/openapi/ManifestRootResource/invalid/root.json +1 -0
  34. package/fixtures/openapi/ManifestRootResource/valid/root.json +1 -0
  35. package/fixtures/openapi/ResourceRelationConfig/invalid/executable-rule.json +17 -0
  36. package/fixtures/openapi/ResourceRelationConfig/valid/unknown-kind.json +13 -0
  37. package/fixtures/openapi/ServiceDeploymentTemplateInput/invalid/migration-missing-guide-valid-yaml.json +38 -0
  38. package/fixtures/openapi/ServiceDeploymentTemplateInput/valid/migration-valid-yaml.json +39 -0
  39. package/fixtures/openapi/TemplateMigrationAssessment/invalid/initialization.json +9 -0
  40. package/fixtures/openapi/TemplateMigrationAssessment/valid/initialization.json +9 -0
  41. package/fixtures/openapi/TemplateMigrationPolicy/invalid/blank-guide.json +5 -0
  42. package/fixtures/openapi/TemplateMigrationPolicy/invalid/missing-guide.json +4 -0
  43. package/fixtures/openapi/TemplateMigrationPolicy/invalid/unknown-escape-hatch.json +6 -0
  44. package/fixtures/openapi/TemplateMigrationPolicy/valid/legacy-safe.json +4 -0
  45. package/fixtures/openapi/TemplateMigrationPolicy/valid/ordered-data-change.json +5 -0
  46. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/duplicate-candidates.json +11 -0
  47. package/fixtures/openapi/TemplateUpdateBatchInput/invalid/empty-identities.json +10 -0
  48. package/fixtures/openapi/TemplateUpdateBatchInput/valid/staged-adoption.json +10 -0
  49. package/fixtures/openapi/TemplateUpdatePolicyInput/invalid/unknown-mode.json +8 -0
  50. package/fixtures/openapi/TemplateUpdatePolicyInput/valid/explicit-automatic.json +8 -0
  51. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-identities.json +10 -0
  52. package/fixtures/openapi/TemplateUpdatePreviewInput/invalid/empty-targets.json +6 -0
  53. package/fixtures/openapi/TemplateUpdatePreviewInput/valid/cross-version-manual.json +14 -0
  54. package/gen/go/sohaapi/client.go +1 -1
  55. package/gen/go/sohaapi/client_test.go +2 -2
  56. package/gen/go/sohaapi/import_source_compat_test.go +12 -0
  57. package/gen/go/sohaapi/types.go +945 -159
  58. package/gen/ts/sohaapi/index.ts +746 -4
  59. package/go.mod +2 -2
  60. package/helmrelease/delivery.go +4 -1
  61. package/helmrelease/initialization.go +10 -0
  62. package/helmrelease/runtime/delivery.go +40 -10
  63. package/helmrelease/runtime/delivery_test.go +4 -0
  64. package/helmrelease/runtime/initialization.go +186 -0
  65. package/helmrelease/runtime/initialization_test.go +203 -0
  66. package/openapi/soha-api.json +2195 -55
  67. package/openapi/soha-api.yaml +349 -9
  68. package/openapi/spec_generated.go +3 -3
  69. package/openapi/spec_test.go +42 -0
  70. package/package.json +1 -1
  71. package/resource/models.go +2 -0
  72. package/resource/relations.go +225 -0
  73. package/resource/relations_test.go +47 -0
  74. package/resource/root_cr.go +38 -0
  75. package/resource/runtime/argocd_integration_test.go +1 -1
  76. package/resource/runtime/initialization.go +66 -0
  77. package/resource/runtime/initialization_test.go +80 -0
  78. package/resource/runtime/relations.go +161 -0
  79. package/resource/runtime/relations_test.go +100 -0
  80. package/resource/runtime/root_cr.go +79 -0
  81. package/resource/runtime/root_cr_test.go +118 -0
@@ -6126,6 +6126,23 @@
6126
6126
  },
6127
6127
  "type": "object"
6128
6128
  },
6129
+ "source": {
6130
+ "$ref": "#/components/schemas/KubernetesImportSource"
6131
+ },
6132
+ "sourceStatus": {
6133
+ "enum": [
6134
+ "linked",
6135
+ "changed",
6136
+ "replaced",
6137
+ "missing",
6138
+ "unavailable",
6139
+ "forbidden"
6140
+ ],
6141
+ "type": "string"
6142
+ },
6143
+ "targetId": {
6144
+ "type": "string"
6145
+ },
6129
6146
  "updatedReplicas": {
6130
6147
  "type": "integer"
6131
6148
  },
@@ -7951,6 +7968,9 @@
7951
7968
  "key": {
7952
7969
  "type": "string"
7953
7970
  },
7971
+ "migrationPolicy": {
7972
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
7973
+ },
7954
7974
  "name": {
7955
7975
  "type": "string"
7956
7976
  },
@@ -8039,6 +8059,9 @@
8039
8059
  "key": {
8040
8060
  "type": "string"
8041
8061
  },
8062
+ "migrationPolicy": {
8063
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
8064
+ },
8042
8065
  "name": {
8043
8066
  "type": "string"
8044
8067
  },
@@ -12249,6 +12272,9 @@
12249
12272
  "default": true,
12250
12273
  "type": "boolean"
12251
12274
  },
12275
+ "migrationPolicy": {
12276
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
12277
+ },
12252
12278
  "variableSchema": {
12253
12279
  "additionalProperties": {
12254
12280
  "$ref": "#/components/schemas/DeliveryBuildVariableSchema"
@@ -12389,6 +12415,9 @@
12389
12415
  "health": {
12390
12416
  "$ref": "#/components/schemas/DeploymentTemplateHealth"
12391
12417
  },
12418
+ "migrationPolicy": {
12419
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
12420
+ },
12392
12421
  "parameterSchema": {
12393
12422
  "$ref": "#/components/schemas/TemplateParameterSchema"
12394
12423
  },
@@ -13982,6 +14011,11 @@
13982
14011
  "targetSummary": {
13983
14012
  "type": "string"
13984
14013
  },
14014
+ "templateCandidateId": {
14015
+ "maxLength": 256,
14016
+ "minLength": 1,
14017
+ "type": "string"
14018
+ },
13985
14019
  "updatedAt": {
13986
14020
  "format": "date-time",
13987
14021
  "type": "string"
@@ -14206,21 +14240,68 @@
14206
14240
  "additionalProperties": false,
14207
14241
  "allOf": [
14208
14242
  {
14209
- "if": {
14243
+ "else": {
14244
+ "allOf": [
14245
+ {
14246
+ "if": {
14247
+ "properties": {
14248
+ "action": {
14249
+ "enum": [
14250
+ "build_deploy",
14251
+ "deploy",
14252
+ "config_update"
14253
+ ]
14254
+ }
14255
+ }
14256
+ },
14257
+ "then": {
14258
+ "required": [
14259
+ "applicationEnvironmentId"
14260
+ ]
14261
+ }
14262
+ }
14263
+ ],
14210
14264
  "properties": {
14211
- "action": {
14212
- "enum": [
14213
- "build_deploy",
14214
- "deploy",
14215
- "config_update"
14216
- ]
14265
+ "serviceId": {
14266
+ "minLength": 1,
14267
+ "type": "string"
14217
14268
  }
14218
14269
  }
14219
14270
  },
14220
- "then": {
14271
+ "if": {
14221
14272
  "required": [
14222
- "applicationEnvironmentId"
14273
+ "templateCandidateId"
14223
14274
  ]
14275
+ },
14276
+ "then": {
14277
+ "not": {
14278
+ "anyOf": [
14279
+ {
14280
+ "required": [
14281
+ "helmRevision"
14282
+ ]
14283
+ },
14284
+ {
14285
+ "required": [
14286
+ "buildArgs"
14287
+ ]
14288
+ },
14289
+ {
14290
+ "required": [
14291
+ "repositoryRefs"
14292
+ ]
14293
+ }
14294
+ ]
14295
+ },
14296
+ "properties": {
14297
+ "action": {
14298
+ "const": "config_update"
14299
+ },
14300
+ "releaseBundleId": {
14301
+ "maxLength": 0,
14302
+ "type": "string"
14303
+ }
14304
+ }
14224
14305
  }
14225
14306
  },
14226
14307
  {
@@ -14299,6 +14380,10 @@
14299
14380
  "type": "array"
14300
14381
  },
14301
14382
  "serviceId": {
14383
+ "type": "string"
14384
+ },
14385
+ "templateCandidateId": {
14386
+ "maxLength": 256,
14302
14387
  "minLength": 1,
14303
14388
  "type": "string"
14304
14389
  }
@@ -14361,6 +14446,9 @@
14361
14446
  },
14362
14447
  "target": {
14363
14448
  "$ref": "#/components/schemas/DeliveryTargetInput"
14449
+ },
14450
+ "templateUpdate": {
14451
+ "$ref": "#/components/schemas/TemplateUpdateReceipt"
14364
14452
  }
14365
14453
  },
14366
14454
  "required": [
@@ -15543,6 +15631,9 @@
15543
15631
  "enabled": {
15544
15632
  "default": true,
15545
15633
  "type": "boolean"
15634
+ },
15635
+ "migrationPolicy": {
15636
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
15546
15637
  }
15547
15638
  },
15548
15639
  "required": [
@@ -20200,6 +20291,9 @@
20200
20291
  "minimum": 0,
20201
20292
  "type": "integer"
20202
20293
  },
20294
+ "migration": {
20295
+ "$ref": "#/components/schemas/TemplateMigrationAssessment"
20296
+ },
20203
20297
  "namespace": {
20204
20298
  "minLength": 1,
20205
20299
  "type": "string"
@@ -20253,6 +20347,9 @@
20253
20347
  "minLength": 1,
20254
20348
  "type": "string"
20255
20349
  },
20350
+ "templateInputs": {
20351
+ "$ref": "#/components/schemas/TemplateVersionReference"
20352
+ },
20256
20353
  "timeoutSeconds": {
20257
20354
  "maximum": 3600,
20258
20355
  "minimum": 1,
@@ -20297,6 +20394,14 @@
20297
20394
  ],
20298
20395
  "type": "string"
20299
20396
  },
20397
+ "initializationResources": {
20398
+ "description": "Server-derived original successful initialization apply receipt. Required for initialization observation or already-applied recovery; current same-name objects cannot establish original ownership.",
20399
+ "items": {
20400
+ "$ref": "#/components/schemas/ManifestResourceInventory"
20401
+ },
20402
+ "maxItems": 300,
20403
+ "type": "array"
20404
+ },
20300
20405
  "prepared": {
20301
20406
  "$ref": "#/components/schemas/HelmPreparedRelease"
20302
20407
  },
@@ -27826,11 +27931,17 @@
27826
27931
  },
27827
27932
  "type": "array"
27828
27933
  },
27934
+ "source": {
27935
+ "$ref": "#/components/schemas/KubernetesImportSource"
27936
+ },
27829
27937
  "workloadKind": {
27830
27938
  "enum": [
27831
27939
  "Deployment",
27832
27940
  "StatefulSet",
27833
- "DaemonSet"
27941
+ "DaemonSet",
27942
+ "Job",
27943
+ "CronJob",
27944
+ "CustomResource"
27834
27945
  ],
27835
27946
  "type": "string"
27836
27947
  },
@@ -27888,7 +27999,10 @@
27888
27999
  "enum": [
27889
28000
  "Deployment",
27890
28001
  "StatefulSet",
27891
- "DaemonSet"
28002
+ "DaemonSet",
28003
+ "Job",
28004
+ "CronJob",
28005
+ "CustomResource"
27892
28006
  ],
27893
28007
  "type": "string"
27894
28008
  },
@@ -27915,11 +28029,17 @@
27915
28029
  "id": {
27916
28030
  "type": "string"
27917
28031
  },
28032
+ "source": {
28033
+ "$ref": "#/components/schemas/KubernetesImportSource"
28034
+ },
27918
28035
  "workloadKind": {
27919
28036
  "enum": [
27920
28037
  "Deployment",
27921
28038
  "StatefulSet",
27922
- "DaemonSet"
28039
+ "DaemonSet",
28040
+ "Job",
28041
+ "CronJob",
28042
+ "CustomResource"
27923
28043
  ],
27924
28044
  "type": "string"
27925
28045
  },
@@ -27959,6 +28079,99 @@
27959
28079
  ],
27960
28080
  "type": "object"
27961
28081
  },
28082
+ "KubernetesImportOwnerReference": {
28083
+ "additionalProperties": false,
28084
+ "properties": {
28085
+ "apiVersion": {
28086
+ "minLength": 1,
28087
+ "type": "string"
28088
+ },
28089
+ "blockOwnerDeletion": {
28090
+ "type": "boolean"
28091
+ },
28092
+ "controller": {
28093
+ "type": "boolean"
28094
+ },
28095
+ "kind": {
28096
+ "minLength": 1,
28097
+ "type": "string"
28098
+ },
28099
+ "name": {
28100
+ "minLength": 1,
28101
+ "type": "string"
28102
+ },
28103
+ "uid": {
28104
+ "minLength": 1,
28105
+ "type": "string"
28106
+ }
28107
+ },
28108
+ "required": [
28109
+ "apiVersion",
28110
+ "kind",
28111
+ "name",
28112
+ "uid"
28113
+ ],
28114
+ "type": "object"
28115
+ },
28116
+ "KubernetesImportSource": {
28117
+ "additionalProperties": false,
28118
+ "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.",
28119
+ "properties": {
28120
+ "crdName": {
28121
+ "minLength": 1,
28122
+ "type": "string"
28123
+ },
28124
+ "generation": {
28125
+ "format": "int64",
28126
+ "minimum": 0,
28127
+ "type": "integer"
28128
+ },
28129
+ "observedAt": {
28130
+ "format": "date-time",
28131
+ "type": "string"
28132
+ },
28133
+ "owners": {
28134
+ "items": {
28135
+ "$ref": "#/components/schemas/KubernetesImportOwnerReference"
28136
+ },
28137
+ "maxItems": 32,
28138
+ "type": "array"
28139
+ },
28140
+ "plural": {
28141
+ "minLength": 1,
28142
+ "type": "string"
28143
+ },
28144
+ "resource": {
28145
+ "allOf": [
28146
+ {
28147
+ "$ref": "#/components/schemas/KubernetesResourceRef"
28148
+ },
28149
+ {
28150
+ "properties": {
28151
+ "uid": {
28152
+ "minLength": 1,
28153
+ "type": "string"
28154
+ }
28155
+ },
28156
+ "required": [
28157
+ "uid"
28158
+ ],
28159
+ "type": "object"
28160
+ }
28161
+ ]
28162
+ },
28163
+ "specDigest": {
28164
+ "pattern": "^[a-f0-9]{64}$",
28165
+ "type": "string"
28166
+ }
28167
+ },
28168
+ "required": [
28169
+ "resource",
28170
+ "specDigest",
28171
+ "observedAt"
28172
+ ],
28173
+ "type": "object"
28174
+ },
27962
28175
  "KubernetesIngress": {
27963
28176
  "additionalProperties": false,
27964
28177
  "properties": {
@@ -29880,6 +30093,11 @@
29880
30093
  "format": "int32",
29881
30094
  "minimum": 0,
29882
30095
  "type": "integer"
30096
+ },
30097
+ "uid": {
30098
+ "description": "Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.",
30099
+ "minLength": 1,
30100
+ "type": "string"
29883
30101
  }
29884
30102
  },
29885
30103
  "required": [
@@ -29961,6 +30179,11 @@
29961
30179
  "startTime": {
29962
30180
  "type": "string"
29963
30181
  },
30182
+ "uid": {
30183
+ "description": "Immutable Pod identity. Required by clients restoring a saved live session; absent on older providers.",
30184
+ "minLength": 1,
30185
+ "type": "string"
30186
+ },
29964
30187
  "volumes": {
29965
30188
  "items": {
29966
30189
  "$ref": "#/components/schemas/KubernetesPodVolume"
@@ -33156,6 +33379,7 @@
33156
33379
  },
33157
33380
  "KubernetesServiceImportRequest": {
33158
33381
  "additionalProperties": false,
33382
+ "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.",
33159
33383
  "properties": {
33160
33384
  "applicationKey": {
33161
33385
  "minLength": 1,
@@ -34313,11 +34537,27 @@
34313
34537
  "KubernetesWorkloadImportInput": {
34314
34538
  "additionalProperties": false,
34315
34539
  "properties": {
34540
+ "crdName": {
34541
+ "description": "Required for CustomResource. Resolve the served GVR and scope from this CRD; never infer API group or plural from Kind.",
34542
+ "minLength": 1,
34543
+ "type": "string"
34544
+ },
34545
+ "expectedSpecDigest": {
34546
+ "pattern": "^[a-f0-9]{64}$",
34547
+ "type": "string"
34548
+ },
34549
+ "expectedUid": {
34550
+ "minLength": 1,
34551
+ "type": "string"
34552
+ },
34316
34553
  "workloadKind": {
34317
34554
  "enum": [
34318
34555
  "Deployment",
34319
34556
  "StatefulSet",
34320
- "DaemonSet"
34557
+ "DaemonSet",
34558
+ "Job",
34559
+ "CronJob",
34560
+ "CustomResource"
34321
34561
  ],
34322
34562
  "type": "string"
34323
34563
  },
@@ -37147,6 +37387,9 @@
37147
37387
  "templateParameters": {
37148
37388
  "$ref": "#/components/schemas/TemplateParameterValues"
37149
37389
  },
37390
+ "templateSelection": {
37391
+ "$ref": "#/components/schemas/ManifestTemplateSelection"
37392
+ },
37150
37393
  "updatedAt": {
37151
37394
  "format": "date-time",
37152
37395
  "type": "string"
@@ -37662,6 +37905,9 @@
37662
37905
  "minLength": 1,
37663
37906
  "type": "string"
37664
37907
  },
37908
+ "migration": {
37909
+ "$ref": "#/components/schemas/TemplateMigrationAssessment"
37910
+ },
37665
37911
  "namespace": {
37666
37912
  "minLength": 1,
37667
37913
  "type": "string"
@@ -37694,6 +37940,9 @@
37694
37940
  "minLength": 1,
37695
37941
  "type": "string"
37696
37942
  },
37943
+ "rootResource": {
37944
+ "$ref": "#/components/schemas/ManifestRootResource"
37945
+ },
37697
37946
  "serviceId": {
37698
37947
  "type": "string"
37699
37948
  },
@@ -37945,6 +38194,9 @@
37945
38194
  "minimum": 1,
37946
38195
  "type": "integer"
37947
38196
  },
38197
+ "appliedTemplate": {
38198
+ "$ref": "#/components/schemas/TemplateVersionReference"
38199
+ },
37948
38200
  "conditions": {
37949
38201
  "items": {
37950
38202
  "$ref": "#/components/schemas/ManifestCondition"
@@ -38273,6 +38525,12 @@
38273
38525
  },
38274
38526
  "type": "array"
38275
38527
  },
38528
+ "initializationPlanId": {
38529
+ "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.",
38530
+ "maxLength": 128,
38531
+ "minLength": 1,
38532
+ "type": "string"
38533
+ },
38276
38534
  "inventory": {
38277
38535
  "items": {
38278
38536
  "$ref": "#/components/schemas/ManifestResourceInventory"
@@ -38325,6 +38583,9 @@
38325
38583
  "rolloutControl": {
38326
38584
  "$ref": "#/components/schemas/ProgressiveRolloutControlInput"
38327
38585
  },
38586
+ "rootResource": {
38587
+ "$ref": "#/components/schemas/ManifestRootResource"
38588
+ },
38328
38589
  "sourceId": {
38329
38590
  "type": "string"
38330
38591
  }
@@ -38375,6 +38636,12 @@
38375
38636
  "minimum": 1,
38376
38637
  "type": "integer"
38377
38638
  },
38639
+ "initializationPlanId": {
38640
+ "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.",
38641
+ "maxLength": 128,
38642
+ "minLength": 1,
38643
+ "type": "string"
38644
+ },
38378
38645
  "inventory": {
38379
38646
  "items": {
38380
38647
  "$ref": "#/components/schemas/ManifestResourceInventory"
@@ -38764,6 +39031,12 @@
38764
39031
  },
38765
39032
  "type": "array"
38766
39033
  },
39034
+ "initializationPlanId": {
39035
+ "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.",
39036
+ "maxLength": 128,
39037
+ "minLength": 1,
39038
+ "type": "string"
39039
+ },
38767
39040
  "ready": {
38768
39041
  "type": "boolean"
38769
39042
  },
@@ -39047,6 +39320,61 @@
39047
39320
  ],
39048
39321
  "type": "object"
39049
39322
  },
39323
+ "ManifestRootResource": {
39324
+ "additionalProperties": false,
39325
+ "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.",
39326
+ "properties": {
39327
+ "apiVersion": {
39328
+ "minLength": 3,
39329
+ "type": "string"
39330
+ },
39331
+ "crdName": {
39332
+ "minLength": 1,
39333
+ "type": "string"
39334
+ },
39335
+ "deliveryPlanId": {
39336
+ "minLength": 1,
39337
+ "type": "string"
39338
+ },
39339
+ "generation": {
39340
+ "format": "int64",
39341
+ "minimum": 1,
39342
+ "type": "integer"
39343
+ },
39344
+ "kind": {
39345
+ "minLength": 1,
39346
+ "type": "string"
39347
+ },
39348
+ "name": {
39349
+ "minLength": 1,
39350
+ "type": "string"
39351
+ },
39352
+ "namespace": {
39353
+ "minLength": 1,
39354
+ "type": "string"
39355
+ },
39356
+ "targetId": {
39357
+ "minLength": 1,
39358
+ "type": "string"
39359
+ },
39360
+ "uid": {
39361
+ "minLength": 1,
39362
+ "type": "string"
39363
+ }
39364
+ },
39365
+ "required": [
39366
+ "apiVersion",
39367
+ "kind",
39368
+ "namespace",
39369
+ "name",
39370
+ "uid",
39371
+ "generation",
39372
+ "crdName",
39373
+ "targetId",
39374
+ "deliveryPlanId"
39375
+ ],
39376
+ "type": "object"
39377
+ },
39050
39378
  "ManifestServiceTemplateInputs": {
39051
39379
  "additionalProperties": false,
39052
39380
  "properties": {
@@ -39528,6 +39856,40 @@
39528
39856
  "ManifestTaskActionRolloutControl"
39529
39857
  ]
39530
39858
  },
39859
+ "ManifestTemplateSelection": {
39860
+ "additionalProperties": false,
39861
+ "properties": {
39862
+ "adoptionId": {
39863
+ "maxLength": 256,
39864
+ "type": "string"
39865
+ },
39866
+ "baseFilesDigest": {
39867
+ "maxLength": 80,
39868
+ "type": "string"
39869
+ },
39870
+ "parameters": {
39871
+ "$ref": "#/components/schemas/TemplateParameterValues"
39872
+ },
39873
+ "templateId": {
39874
+ "maxLength": 256,
39875
+ "type": "string"
39876
+ },
39877
+ "version": {
39878
+ "format": "int64",
39879
+ "maximum": 2147483647,
39880
+ "minimum": 1,
39881
+ "type": "integer"
39882
+ }
39883
+ },
39884
+ "required": [
39885
+ "templateId",
39886
+ "version",
39887
+ "parameters",
39888
+ "baseFilesDigest",
39889
+ "adoptionId"
39890
+ ],
39891
+ "type": "object"
39892
+ },
39531
39893
  "ManifestValidationStage": {
39532
39894
  "enum": [
39533
39895
  "syntax",
@@ -54212,6 +54574,257 @@
54212
54574
  ],
54213
54575
  "type": "object"
54214
54576
  },
54577
+ "ResourceRelationConfig": {
54578
+ "additionalProperties": false,
54579
+ "properties": {
54580
+ "rootUid": {
54581
+ "minLength": 1,
54582
+ "type": "string"
54583
+ },
54584
+ "rules": {
54585
+ "items": {
54586
+ "$ref": "#/components/schemas/ResourceRelationRule"
54587
+ },
54588
+ "maxItems": 8,
54589
+ "type": "array"
54590
+ },
54591
+ "sources": {
54592
+ "items": {
54593
+ "$ref": "#/components/schemas/ResourceRelationSource"
54594
+ },
54595
+ "maxItems": 8,
54596
+ "type": "array"
54597
+ },
54598
+ "version": {
54599
+ "const": "v1",
54600
+ "type": "string"
54601
+ }
54602
+ },
54603
+ "required": [
54604
+ "version",
54605
+ "rootUid",
54606
+ "sources",
54607
+ "rules"
54608
+ ],
54609
+ "type": "object"
54610
+ },
54611
+ "ResourceRelationCoverage": {
54612
+ "additionalProperties": false,
54613
+ "properties": {
54614
+ "queryId": {
54615
+ "minLength": 1,
54616
+ "type": "string"
54617
+ },
54618
+ "reasonCode": {
54619
+ "type": "string"
54620
+ },
54621
+ "state": {
54622
+ "enum": [
54623
+ "available",
54624
+ "partial",
54625
+ "denied",
54626
+ "error",
54627
+ "not_installed",
54628
+ "unsupported"
54629
+ ],
54630
+ "type": "string"
54631
+ },
54632
+ "truncated": {
54633
+ "type": "boolean"
54634
+ }
54635
+ },
54636
+ "required": [
54637
+ "queryId",
54638
+ "state",
54639
+ "truncated"
54640
+ ],
54641
+ "type": "object"
54642
+ },
54643
+ "ResourceRelationEdge": {
54644
+ "additionalProperties": false,
54645
+ "properties": {
54646
+ "fromUid": {
54647
+ "minLength": 1,
54648
+ "type": "string"
54649
+ },
54650
+ "ruleId": {
54651
+ "type": "string"
54652
+ },
54653
+ "toUid": {
54654
+ "minLength": 1,
54655
+ "type": "string"
54656
+ },
54657
+ "type": {
54658
+ "enum": [
54659
+ "owns",
54660
+ "manual",
54661
+ "references",
54662
+ "selector_candidate"
54663
+ ],
54664
+ "type": "string"
54665
+ }
54666
+ },
54667
+ "required": [
54668
+ "fromUid",
54669
+ "toUid",
54670
+ "type"
54671
+ ],
54672
+ "type": "object"
54673
+ },
54674
+ "ResourceRelationNode": {
54675
+ "additionalProperties": false,
54676
+ "properties": {
54677
+ "depth": {
54678
+ "maximum": 8,
54679
+ "minimum": 0,
54680
+ "type": "integer"
54681
+ },
54682
+ "resource": {
54683
+ "$ref": "#/components/schemas/KubernetesResourceRef"
54684
+ },
54685
+ "role": {
54686
+ "enum": [
54687
+ "root",
54688
+ "owned",
54689
+ "manual",
54690
+ "reference",
54691
+ "candidate"
54692
+ ],
54693
+ "type": "string"
54694
+ }
54695
+ },
54696
+ "required": [
54697
+ "resource",
54698
+ "role",
54699
+ "depth"
54700
+ ],
54701
+ "type": "object"
54702
+ },
54703
+ "ResourceRelationRule": {
54704
+ "additionalProperties": false,
54705
+ "properties": {
54706
+ "id": {
54707
+ "minLength": 1,
54708
+ "type": "string"
54709
+ },
54710
+ "name": {
54711
+ "type": "string"
54712
+ },
54713
+ "selector": {
54714
+ "additionalProperties": {
54715
+ "type": "string"
54716
+ },
54717
+ "maxProperties": 16,
54718
+ "type": "object"
54719
+ },
54720
+ "target": {
54721
+ "$ref": "#/components/schemas/ResourceRelationSource"
54722
+ },
54723
+ "type": {
54724
+ "enum": [
54725
+ "reference",
54726
+ "manual",
54727
+ "selector"
54728
+ ],
54729
+ "type": "string"
54730
+ },
54731
+ "uid": {
54732
+ "type": "string"
54733
+ }
54734
+ },
54735
+ "required": [
54736
+ "id",
54737
+ "type",
54738
+ "target"
54739
+ ],
54740
+ "type": "object"
54741
+ },
54742
+ "ResourceRelationsEnvelope": {
54743
+ "additionalProperties": false,
54744
+ "properties": {
54745
+ "data": {
54746
+ "$ref": "#/components/schemas/ResourceRelationsView"
54747
+ }
54748
+ },
54749
+ "required": [
54750
+ "data"
54751
+ ],
54752
+ "type": "object"
54753
+ },
54754
+ "ResourceRelationSource": {
54755
+ "additionalProperties": false,
54756
+ "properties": {
54757
+ "apiVersion": {
54758
+ "minLength": 1,
54759
+ "type": "string"
54760
+ },
54761
+ "kind": {
54762
+ "minLength": 1,
54763
+ "type": "string"
54764
+ },
54765
+ "namespace": {
54766
+ "minLength": 1,
54767
+ "type": "string"
54768
+ },
54769
+ "resource": {
54770
+ "minLength": 1,
54771
+ "type": "string"
54772
+ }
54773
+ },
54774
+ "required": [
54775
+ "apiVersion",
54776
+ "resource",
54777
+ "kind",
54778
+ "namespace"
54779
+ ],
54780
+ "type": "object"
54781
+ },
54782
+ "ResourceRelationsView": {
54783
+ "additionalProperties": false,
54784
+ "properties": {
54785
+ "config": {
54786
+ "$ref": "#/components/schemas/ResourceRelationConfig"
54787
+ },
54788
+ "coverage": {
54789
+ "items": {
54790
+ "$ref": "#/components/schemas/ResourceRelationCoverage"
54791
+ },
54792
+ "type": "array"
54793
+ },
54794
+ "edges": {
54795
+ "items": {
54796
+ "$ref": "#/components/schemas/ResourceRelationEdge"
54797
+ },
54798
+ "type": "array"
54799
+ },
54800
+ "nodes": {
54801
+ "items": {
54802
+ "$ref": "#/components/schemas/ResourceRelationNode"
54803
+ },
54804
+ "maxItems": 500,
54805
+ "type": "array"
54806
+ },
54807
+ "observedAt": {
54808
+ "type": "string"
54809
+ },
54810
+ "partial": {
54811
+ "type": "boolean"
54812
+ },
54813
+ "root": {
54814
+ "$ref": "#/components/schemas/KubernetesResourceRef"
54815
+ }
54816
+ },
54817
+ "required": [
54818
+ "root",
54819
+ "config",
54820
+ "nodes",
54821
+ "edges",
54822
+ "coverage",
54823
+ "partial",
54824
+ "observedAt"
54825
+ ],
54826
+ "type": "object"
54827
+ },
54215
54828
  "ResourceSelector": {
54216
54829
  "additionalProperties": false,
54217
54830
  "properties": {
@@ -56770,6 +57383,9 @@
56770
57383
  "minLength": 1,
56771
57384
  "type": "string"
56772
57385
  },
57386
+ "migrationPolicy": {
57387
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
57388
+ },
56773
57389
  "name": {
56774
57390
  "minLength": 1,
56775
57391
  "type": "string"
@@ -56913,6 +57529,9 @@
56913
57529
  "pattern": "^[a-z0-9][a-z0-9._-]*$",
56914
57530
  "type": "string"
56915
57531
  },
57532
+ "migrationPolicy": {
57533
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
57534
+ },
56916
57535
  "name": {
56917
57536
  "maxLength": 200,
56918
57537
  "minLength": 1,
@@ -57739,6 +58358,7 @@
57739
58358
  "additionalProperties": false,
57740
58359
  "properties": {
57741
58360
  "path": {
58361
+ "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.",
57742
58362
  "type": "string"
57743
58363
  }
57744
58364
  },
@@ -58146,6 +58766,132 @@
58146
58766
  ],
58147
58767
  "type": "object"
58148
58768
  },
58769
+ "TemplateMigrationAssessment": {
58770
+ "additionalProperties": false,
58771
+ "properties": {
58772
+ "blocked": {
58773
+ "type": "boolean"
58774
+ },
58775
+ "fromVersion": {
58776
+ "format": "int64",
58777
+ "minimum": 0,
58778
+ "type": "integer"
58779
+ },
58780
+ "initialization": {
58781
+ "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.",
58782
+ "type": "boolean"
58783
+ },
58784
+ "reason": {
58785
+ "maxLength": 1024,
58786
+ "type": "string"
58787
+ },
58788
+ "requiresApproval": {
58789
+ "type": "boolean"
58790
+ },
58791
+ "steps": {
58792
+ "items": {
58793
+ "$ref": "#/components/schemas/TemplateMigrationStep"
58794
+ },
58795
+ "maxItems": 200,
58796
+ "type": "array"
58797
+ },
58798
+ "toVersion": {
58799
+ "format": "int64",
58800
+ "minimum": 1,
58801
+ "type": "integer"
58802
+ }
58803
+ },
58804
+ "required": [
58805
+ "fromVersion",
58806
+ "toVersion",
58807
+ "blocked",
58808
+ "requiresApproval",
58809
+ "reason",
58810
+ "steps"
58811
+ ],
58812
+ "type": "object"
58813
+ },
58814
+ "TemplateMigrationPolicy": {
58815
+ "additionalProperties": false,
58816
+ "if": {
58817
+ "anyOf": [
58818
+ {
58819
+ "properties": {
58820
+ "sequential": {
58821
+ "const": true
58822
+ }
58823
+ },
58824
+ "required": [
58825
+ "sequential"
58826
+ ]
58827
+ },
58828
+ {
58829
+ "properties": {
58830
+ "irreversible": {
58831
+ "const": true
58832
+ }
58833
+ },
58834
+ "required": [
58835
+ "irreversible"
58836
+ ]
58837
+ }
58838
+ ]
58839
+ },
58840
+ "properties": {
58841
+ "guide": {
58842
+ "description": "Human migration/recovery instructions. Never executed as a script.",
58843
+ "maxLength": 2000,
58844
+ "type": "string"
58845
+ },
58846
+ "irreversible": {
58847
+ "description": "Forward changes require approval; ordinary rollback across this boundary is forbidden.",
58848
+ "type": "boolean"
58849
+ },
58850
+ "sequential": {
58851
+ "description": "Must cross this boundary as adjacent published versions; approval cannot waive it.",
58852
+ "type": "boolean"
58853
+ }
58854
+ },
58855
+ "required": [
58856
+ "sequential",
58857
+ "irreversible"
58858
+ ],
58859
+ "then": {
58860
+ "properties": {
58861
+ "guide": {
58862
+ "minLength": 1,
58863
+ "pattern": "\\S"
58864
+ }
58865
+ },
58866
+ "required": [
58867
+ "guide"
58868
+ ]
58869
+ },
58870
+ "type": "object"
58871
+ },
58872
+ "TemplateMigrationStep": {
58873
+ "additionalProperties": false,
58874
+ "properties": {
58875
+ "contentDigest": {
58876
+ "maxLength": 80,
58877
+ "type": "string"
58878
+ },
58879
+ "policy": {
58880
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
58881
+ },
58882
+ "version": {
58883
+ "format": "int64",
58884
+ "minimum": 1,
58885
+ "type": "integer"
58886
+ }
58887
+ },
58888
+ "required": [
58889
+ "version",
58890
+ "contentDigest",
58891
+ "policy"
58892
+ ],
58893
+ "type": "object"
58894
+ },
58149
58895
  "TemplateParameterSchema": {
58150
58896
  "additionalProperties": false,
58151
58897
  "description": "Restricted JSON Schema. Objects reject undeclared keys unless mapValues specifies their schema. secret_reference accepts only a namespaced Secret name/key reference, never a plaintext credential. External references and executable expressions are unsupported.",
@@ -58315,6 +59061,720 @@
58315
59061
  ],
58316
59062
  "type": "object"
58317
59063
  },
59064
+ "TemplateUpdateBatchInput": {
59065
+ "additionalProperties": false,
59066
+ "properties": {
59067
+ "acknowledgeHistoryGaps": {
59068
+ "type": "boolean"
59069
+ },
59070
+ "candidateIds": {
59071
+ "items": {
59072
+ "maxLength": 256,
59073
+ "minLength": 1,
59074
+ "type": "string"
59075
+ },
59076
+ "maxItems": 100,
59077
+ "minItems": 1,
59078
+ "type": "array",
59079
+ "uniqueItems": true
59080
+ },
59081
+ "idempotencyKey": {
59082
+ "maxLength": 128,
59083
+ "minLength": 8,
59084
+ "type": "string"
59085
+ },
59086
+ "previewDigest": {
59087
+ "maxLength": 80,
59088
+ "minLength": 1,
59089
+ "type": "string"
59090
+ },
59091
+ "stopOnFailure": {
59092
+ "type": "boolean"
59093
+ },
59094
+ "waveSize": {
59095
+ "format": "int64",
59096
+ "maximum": 100,
59097
+ "minimum": 1,
59098
+ "type": "integer"
59099
+ }
59100
+ },
59101
+ "required": [
59102
+ "previewDigest",
59103
+ "candidateIds",
59104
+ "waveSize",
59105
+ "stopOnFailure",
59106
+ "acknowledgeHistoryGaps",
59107
+ "idempotencyKey"
59108
+ ],
59109
+ "type": "object"
59110
+ },
59111
+ "TemplateUpdateCandidate": {
59112
+ "additionalProperties": false,
59113
+ "properties": {
59114
+ "cumulative": {
59115
+ "$ref": "#/components/schemas/TemplateUpdateDiff"
59116
+ },
59117
+ "digest": {
59118
+ "maxLength": 80,
59119
+ "type": "string"
59120
+ },
59121
+ "eligible": {
59122
+ "type": "boolean"
59123
+ },
59124
+ "id": {
59125
+ "maxLength": 256,
59126
+ "type": "string"
59127
+ },
59128
+ "parameters": {
59129
+ "$ref": "#/components/schemas/TemplateParameterValues"
59130
+ },
59131
+ "reason": {
59132
+ "maxLength": 1024,
59133
+ "type": "string"
59134
+ },
59135
+ "requiresApproval": {
59136
+ "type": "boolean"
59137
+ },
59138
+ "target": {
59139
+ "$ref": "#/components/schemas/TemplateUpdateTarget"
59140
+ },
59141
+ "toVersion": {
59142
+ "format": "int64",
59143
+ "maximum": 2147483647,
59144
+ "minimum": 1,
59145
+ "type": "integer"
59146
+ },
59147
+ "versions": {
59148
+ "items": {
59149
+ "$ref": "#/components/schemas/TemplateUpdateDiff"
59150
+ },
59151
+ "maxItems": 200,
59152
+ "type": "array"
59153
+ },
59154
+ "wave": {
59155
+ "format": "int64",
59156
+ "maximum": 199,
59157
+ "minimum": 0,
59158
+ "type": "integer"
59159
+ }
59160
+ },
59161
+ "required": [
59162
+ "id",
59163
+ "target",
59164
+ "toVersion",
59165
+ "digest",
59166
+ "parameters",
59167
+ "cumulative",
59168
+ "versions",
59169
+ "eligible",
59170
+ "reason",
59171
+ "requiresApproval",
59172
+ "wave"
59173
+ ],
59174
+ "type": "object"
59175
+ },
59176
+ "TemplateUpdateChange": {
59177
+ "additionalProperties": false,
59178
+ "properties": {
59179
+ "after": {
59180
+ "maxLength": 32768,
59181
+ "type": "string"
59182
+ },
59183
+ "before": {
59184
+ "maxLength": 32768,
59185
+ "type": "string"
59186
+ },
59187
+ "path": {
59188
+ "maxLength": 1024,
59189
+ "type": "string"
59190
+ },
59191
+ "section": {
59192
+ "enum": [
59193
+ "source",
59194
+ "schema",
59195
+ "defaults",
59196
+ "parameters",
59197
+ "resources"
59198
+ ],
59199
+ "type": "string"
59200
+ }
59201
+ },
59202
+ "required": [
59203
+ "section",
59204
+ "path",
59205
+ "before",
59206
+ "after"
59207
+ ],
59208
+ "type": "object"
59209
+ },
59210
+ "TemplateUpdateDiff": {
59211
+ "additionalProperties": false,
59212
+ "properties": {
59213
+ "changes": {
59214
+ "items": {
59215
+ "$ref": "#/components/schemas/TemplateUpdateChange"
59216
+ },
59217
+ "maxItems": 500,
59218
+ "type": "array"
59219
+ },
59220
+ "diagnostics": {
59221
+ "items": {
59222
+ "maxLength": 2048,
59223
+ "type": "string"
59224
+ },
59225
+ "maxItems": 32,
59226
+ "type": "array"
59227
+ },
59228
+ "fromVersion": {
59229
+ "format": "int64",
59230
+ "maximum": 2147483647,
59231
+ "minimum": 1,
59232
+ "type": "integer"
59233
+ },
59234
+ "historyGap": {
59235
+ "type": "boolean"
59236
+ },
59237
+ "migration": {
59238
+ "$ref": "#/components/schemas/TemplateMigrationAssessment"
59239
+ },
59240
+ "renderStatus": {
59241
+ "enum": [
59242
+ "available",
59243
+ "unavailable",
59244
+ "invalid"
59245
+ ],
59246
+ "type": "string"
59247
+ },
59248
+ "toVersion": {
59249
+ "format": "int64",
59250
+ "maximum": 2147483647,
59251
+ "minimum": 1,
59252
+ "type": "integer"
59253
+ }
59254
+ },
59255
+ "required": [
59256
+ "fromVersion",
59257
+ "toVersion",
59258
+ "changes",
59259
+ "renderStatus",
59260
+ "diagnostics",
59261
+ "historyGap"
59262
+ ],
59263
+ "type": "object"
59264
+ },
59265
+ "TemplateUpdateKind": {
59266
+ "enum": [
59267
+ "deployment",
59268
+ "build",
59269
+ "workflow",
59270
+ "blueprint"
59271
+ ],
59272
+ "type": "string"
59273
+ },
59274
+ "TemplateUpdateMode": {
59275
+ "enum": [
59276
+ "fixed",
59277
+ "manual",
59278
+ "automatic",
59279
+ "approval"
59280
+ ],
59281
+ "type": "string"
59282
+ },
59283
+ "TemplateUpdatePolicy": {
59284
+ "additionalProperties": false,
59285
+ "properties": {
59286
+ "id": {
59287
+ "maxLength": 256,
59288
+ "type": "string"
59289
+ },
59290
+ "kind": {
59291
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59292
+ },
59293
+ "lastBatchId": {
59294
+ "maxLength": 256,
59295
+ "type": "string"
59296
+ },
59297
+ "lastError": {
59298
+ "maxLength": 1024,
59299
+ "type": "string"
59300
+ },
59301
+ "mode": {
59302
+ "$ref": "#/components/schemas/TemplateUpdateMode"
59303
+ },
59304
+ "paused": {
59305
+ "type": "boolean"
59306
+ },
59307
+ "targetId": {
59308
+ "maxLength": 256,
59309
+ "type": "string"
59310
+ },
59311
+ "templateId": {
59312
+ "maxLength": 256,
59313
+ "type": "string"
59314
+ },
59315
+ "updatedAt": {
59316
+ "format": "date-time",
59317
+ "type": "string"
59318
+ },
59319
+ "version": {
59320
+ "format": "int64",
59321
+ "maximum": 2147483647,
59322
+ "minimum": 1,
59323
+ "type": "integer"
59324
+ }
59325
+ },
59326
+ "required": [
59327
+ "id",
59328
+ "kind",
59329
+ "templateId",
59330
+ "targetId",
59331
+ "mode",
59332
+ "paused",
59333
+ "version",
59334
+ "lastBatchId",
59335
+ "lastError",
59336
+ "updatedAt"
59337
+ ],
59338
+ "type": "object"
59339
+ },
59340
+ "TemplateUpdatePolicyEnvelope": {
59341
+ "additionalProperties": false,
59342
+ "properties": {
59343
+ "data": {
59344
+ "$ref": "#/components/schemas/TemplateUpdatePolicy"
59345
+ }
59346
+ },
59347
+ "required": [
59348
+ "data"
59349
+ ],
59350
+ "type": "object"
59351
+ },
59352
+ "TemplateUpdatePolicyInput": {
59353
+ "additionalProperties": false,
59354
+ "properties": {
59355
+ "expectedVersion": {
59356
+ "format": "int64",
59357
+ "maximum": 2147483647,
59358
+ "minimum": 0,
59359
+ "type": "integer"
59360
+ },
59361
+ "kind": {
59362
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59363
+ },
59364
+ "mode": {
59365
+ "$ref": "#/components/schemas/TemplateUpdateMode"
59366
+ },
59367
+ "paused": {
59368
+ "type": "boolean"
59369
+ },
59370
+ "targetId": {
59371
+ "maxLength": 256,
59372
+ "minLength": 1,
59373
+ "type": "string"
59374
+ },
59375
+ "templateId": {
59376
+ "maxLength": 256,
59377
+ "minLength": 1,
59378
+ "type": "string"
59379
+ }
59380
+ },
59381
+ "required": [
59382
+ "kind",
59383
+ "templateId",
59384
+ "targetId",
59385
+ "mode",
59386
+ "paused",
59387
+ "expectedVersion"
59388
+ ],
59389
+ "type": "object"
59390
+ },
59391
+ "TemplateUpdatePolicyListEnvelope": {
59392
+ "additionalProperties": false,
59393
+ "properties": {
59394
+ "data": {
59395
+ "items": {
59396
+ "$ref": "#/components/schemas/TemplateUpdatePolicy"
59397
+ },
59398
+ "maxItems": 2000,
59399
+ "type": "array"
59400
+ }
59401
+ },
59402
+ "required": [
59403
+ "data"
59404
+ ],
59405
+ "type": "object"
59406
+ },
59407
+ "TemplateUpdatePreview": {
59408
+ "additionalProperties": false,
59409
+ "properties": {
59410
+ "candidates": {
59411
+ "items": {
59412
+ "$ref": "#/components/schemas/TemplateUpdateCandidate"
59413
+ },
59414
+ "maxItems": 100,
59415
+ "type": "array"
59416
+ },
59417
+ "configurationOnly": {
59418
+ "const": true,
59419
+ "type": "boolean"
59420
+ },
59421
+ "createdAt": {
59422
+ "format": "date-time",
59423
+ "type": "string"
59424
+ },
59425
+ "digest": {
59426
+ "maxLength": 80,
59427
+ "type": "string"
59428
+ },
59429
+ "expiresAt": {
59430
+ "format": "date-time",
59431
+ "type": "string"
59432
+ },
59433
+ "id": {
59434
+ "maxLength": 256,
59435
+ "type": "string"
59436
+ },
59437
+ "kind": {
59438
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59439
+ },
59440
+ "templateId": {
59441
+ "maxLength": 256,
59442
+ "type": "string"
59443
+ },
59444
+ "toVersion": {
59445
+ "format": "int64",
59446
+ "maximum": 2147483647,
59447
+ "minimum": 1,
59448
+ "type": "integer"
59449
+ }
59450
+ },
59451
+ "required": [
59452
+ "id",
59453
+ "kind",
59454
+ "templateId",
59455
+ "toVersion",
59456
+ "digest",
59457
+ "candidates",
59458
+ "createdAt",
59459
+ "expiresAt",
59460
+ "configurationOnly"
59461
+ ],
59462
+ "type": "object"
59463
+ },
59464
+ "TemplateUpdatePreviewEnvelope": {
59465
+ "additionalProperties": false,
59466
+ "properties": {
59467
+ "data": {
59468
+ "$ref": "#/components/schemas/TemplateUpdatePreview"
59469
+ }
59470
+ },
59471
+ "required": [
59472
+ "data"
59473
+ ],
59474
+ "type": "object"
59475
+ },
59476
+ "TemplateUpdatePreviewInput": {
59477
+ "additionalProperties": false,
59478
+ "properties": {
59479
+ "applicationId": {
59480
+ "maxLength": 256,
59481
+ "minLength": 1,
59482
+ "type": "string"
59483
+ },
59484
+ "kind": {
59485
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59486
+ },
59487
+ "targets": {
59488
+ "items": {
59489
+ "$ref": "#/components/schemas/TemplateUpdateSelection"
59490
+ },
59491
+ "maxItems": 100,
59492
+ "minItems": 1,
59493
+ "type": "array"
59494
+ },
59495
+ "templateId": {
59496
+ "maxLength": 256,
59497
+ "minLength": 1,
59498
+ "type": "string"
59499
+ },
59500
+ "toVersion": {
59501
+ "format": "int64",
59502
+ "maximum": 2147483647,
59503
+ "minimum": 1,
59504
+ "type": "integer"
59505
+ }
59506
+ },
59507
+ "required": [
59508
+ "kind",
59509
+ "templateId",
59510
+ "toVersion",
59511
+ "targets"
59512
+ ],
59513
+ "type": "object"
59514
+ },
59515
+ "TemplateUpdateReceipt": {
59516
+ "additionalProperties": false,
59517
+ "properties": {
59518
+ "bindingId": {
59519
+ "maxLength": 256,
59520
+ "minLength": 1,
59521
+ "type": "string"
59522
+ },
59523
+ "candidateId": {
59524
+ "maxLength": 256,
59525
+ "minLength": 1,
59526
+ "type": "string"
59527
+ },
59528
+ "fromVersion": {
59529
+ "format": "int64",
59530
+ "minimum": 1,
59531
+ "type": "integer"
59532
+ },
59533
+ "kind": {
59534
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59535
+ },
59536
+ "previewId": {
59537
+ "maxLength": 256,
59538
+ "minLength": 1,
59539
+ "type": "string"
59540
+ },
59541
+ "requiresApproval": {
59542
+ "type": "boolean"
59543
+ },
59544
+ "templateId": {
59545
+ "maxLength": 256,
59546
+ "minLength": 1,
59547
+ "type": "string"
59548
+ },
59549
+ "toVersion": {
59550
+ "format": "int64",
59551
+ "minimum": 1,
59552
+ "type": "integer"
59553
+ }
59554
+ },
59555
+ "required": [
59556
+ "kind",
59557
+ "templateId",
59558
+ "bindingId",
59559
+ "previewId",
59560
+ "candidateId",
59561
+ "fromVersion",
59562
+ "toVersion",
59563
+ "requiresApproval"
59564
+ ],
59565
+ "type": "object"
59566
+ },
59567
+ "TemplateUpdateSelection": {
59568
+ "additionalProperties": false,
59569
+ "properties": {
59570
+ "parameters": {
59571
+ "$ref": "#/components/schemas/TemplateParameterValues"
59572
+ },
59573
+ "targetId": {
59574
+ "maxLength": 256,
59575
+ "minLength": 1,
59576
+ "type": "string"
59577
+ },
59578
+ "useNewDefaults": {
59579
+ "items": {
59580
+ "maxLength": 256,
59581
+ "type": "string"
59582
+ },
59583
+ "maxItems": 100,
59584
+ "type": "array",
59585
+ "uniqueItems": true
59586
+ },
59587
+ "wave": {
59588
+ "format": "int64",
59589
+ "maximum": 199,
59590
+ "minimum": 0,
59591
+ "type": "integer"
59592
+ }
59593
+ },
59594
+ "required": [
59595
+ "targetId"
59596
+ ],
59597
+ "type": "object"
59598
+ },
59599
+ "TemplateUpdateTarget": {
59600
+ "additionalProperties": false,
59601
+ "properties": {
59602
+ "applicationEnvironmentId": {
59603
+ "maxLength": 256,
59604
+ "type": "string"
59605
+ },
59606
+ "applicationId": {
59607
+ "maxLength": 256,
59608
+ "type": "string"
59609
+ },
59610
+ "applicationName": {
59611
+ "maxLength": 256,
59612
+ "type": "string"
59613
+ },
59614
+ "bindingRevision": {
59615
+ "maxLength": 256,
59616
+ "type": "string"
59617
+ },
59618
+ "eligible": {
59619
+ "type": "boolean"
59620
+ },
59621
+ "environmentName": {
59622
+ "maxLength": 256,
59623
+ "type": "string"
59624
+ },
59625
+ "fromVersion": {
59626
+ "format": "int64",
59627
+ "maximum": 2147483647,
59628
+ "minimum": 1,
59629
+ "type": "integer"
59630
+ },
59631
+ "id": {
59632
+ "maxLength": 256,
59633
+ "type": "string"
59634
+ },
59635
+ "independentOverrides": {
59636
+ "items": {
59637
+ "maxLength": 256,
59638
+ "type": "string"
59639
+ },
59640
+ "maxItems": 100,
59641
+ "type": "array"
59642
+ },
59643
+ "kind": {
59644
+ "$ref": "#/components/schemas/TemplateUpdateKind"
59645
+ },
59646
+ "mode": {
59647
+ "$ref": "#/components/schemas/TemplateUpdateMode"
59648
+ },
59649
+ "reason": {
59650
+ "maxLength": 1024,
59651
+ "type": "string"
59652
+ },
59653
+ "releaseTargetId": {
59654
+ "maxLength": 256,
59655
+ "type": "string"
59656
+ },
59657
+ "requiresApproval": {
59658
+ "type": "boolean"
59659
+ },
59660
+ "scope": {
59661
+ "enum": [
59662
+ "environment",
59663
+ "application",
59664
+ "creation_only"
59665
+ ],
59666
+ "type": "string"
59667
+ },
59668
+ "serviceId": {
59669
+ "maxLength": 256,
59670
+ "type": "string"
59671
+ },
59672
+ "serviceName": {
59673
+ "maxLength": 256,
59674
+ "type": "string"
59675
+ },
59676
+ "templateId": {
59677
+ "maxLength": 256,
59678
+ "type": "string"
59679
+ }
59680
+ },
59681
+ "required": [
59682
+ "id",
59683
+ "kind",
59684
+ "templateId",
59685
+ "applicationId",
59686
+ "applicationName",
59687
+ "serviceId",
59688
+ "serviceName",
59689
+ "applicationEnvironmentId",
59690
+ "environmentName",
59691
+ "releaseTargetId",
59692
+ "fromVersion",
59693
+ "mode",
59694
+ "requiresApproval",
59695
+ "eligible",
59696
+ "reason",
59697
+ "independentOverrides",
59698
+ "bindingRevision",
59699
+ "scope"
59700
+ ],
59701
+ "type": "object"
59702
+ },
59703
+ "TemplateUpdateTargetPage": {
59704
+ "additionalProperties": false,
59705
+ "properties": {
59706
+ "items": {
59707
+ "items": {
59708
+ "$ref": "#/components/schemas/TemplateUpdateTarget"
59709
+ },
59710
+ "maxItems": 100,
59711
+ "type": "array"
59712
+ },
59713
+ "page": {
59714
+ "format": "int64",
59715
+ "maximum": 2147483647,
59716
+ "minimum": 1,
59717
+ "type": "integer"
59718
+ },
59719
+ "pageSize": {
59720
+ "format": "int64",
59721
+ "maximum": 100,
59722
+ "minimum": 1,
59723
+ "type": "integer"
59724
+ },
59725
+ "total": {
59726
+ "format": "int64",
59727
+ "maximum": 2147483647,
59728
+ "minimum": 0,
59729
+ "type": "integer"
59730
+ }
59731
+ },
59732
+ "required": [
59733
+ "items",
59734
+ "total",
59735
+ "page",
59736
+ "pageSize"
59737
+ ],
59738
+ "type": "object"
59739
+ },
59740
+ "TemplateUpdateTargetPageEnvelope": {
59741
+ "additionalProperties": false,
59742
+ "properties": {
59743
+ "data": {
59744
+ "$ref": "#/components/schemas/TemplateUpdateTargetPage"
59745
+ }
59746
+ },
59747
+ "required": [
59748
+ "data"
59749
+ ],
59750
+ "type": "object"
59751
+ },
59752
+ "TemplateVersionReference": {
59753
+ "additionalProperties": false,
59754
+ "properties": {
59755
+ "templateDigest": {
59756
+ "maxLength": 80,
59757
+ "minLength": 1,
59758
+ "type": "string"
59759
+ },
59760
+ "templateId": {
59761
+ "maxLength": 128,
59762
+ "minLength": 1,
59763
+ "type": "string"
59764
+ },
59765
+ "templateVersion": {
59766
+ "format": "int64",
59767
+ "minimum": 1,
59768
+ "type": "integer"
59769
+ }
59770
+ },
59771
+ "required": [
59772
+ "templateId",
59773
+ "templateVersion",
59774
+ "templateDigest"
59775
+ ],
59776
+ "type": "object"
59777
+ },
58318
59778
  "TokenRotationInput": {
58319
59779
  "additionalProperties": false,
58320
59780
  "properties": {
@@ -65672,6 +67132,9 @@
65672
67132
  "key": {
65673
67133
  "type": "string"
65674
67134
  },
67135
+ "migrationPolicy": {
67136
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
67137
+ },
65675
67138
  "name": {
65676
67139
  "type": "string"
65677
67140
  },
@@ -65746,6 +67209,9 @@
65746
67209
  "key": {
65747
67210
  "type": "string"
65748
67211
  },
67212
+ "migrationPolicy": {
67213
+ "$ref": "#/components/schemas/TemplateMigrationPolicy"
67214
+ },
65749
67215
  "name": {
65750
67216
  "type": "string"
65751
67217
  },
@@ -65803,9 +67269,9 @@
65803
67269
  }
65804
67270
  },
65805
67271
  "info": {
65806
- "description": "Public OpenSoha core API contract. This first contract focuses on stable cross-repository boundaries: auth, health, runner-facing control-plane callbacks, AI Gateway, and MCP capability discovery.\n",
67272
+ "description": "Public OpenSoha core API contract. This first contract focuses on stable cross-repository boundaries: auth, health, runner-facing control-plane callbacks, AI Gateway, and MCP capability discovery. Pod session WebSocket targets and their UID-aware ticket requirements are described separately in x-soha-websocket-paths to preserve HTTP client generation.\n",
65807
67273
  "title": "Soha API",
65808
- "version": "0.1.25"
67274
+ "version": "0.1.26"
65809
67275
  },
65810
67276
  "openapi": "3.1.0",
65811
67277
  "paths": {
@@ -73842,6 +75308,127 @@
73842
75308
  ]
73843
75309
  }
73844
75310
  },
75311
+ "/application-environments/{applicationEnvironmentID}/targets/{targetID}/relations": {
75312
+ "get": {
75313
+ "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.",
75314
+ "operationId": "getApplicationEnvironmentTargetRelations",
75315
+ "parameters": [
75316
+ {
75317
+ "in": "path",
75318
+ "name": "applicationEnvironmentID",
75319
+ "required": true,
75320
+ "schema": {
75321
+ "minLength": 1,
75322
+ "type": "string"
75323
+ }
75324
+ },
75325
+ {
75326
+ "in": "path",
75327
+ "name": "targetID",
75328
+ "required": true,
75329
+ "schema": {
75330
+ "minLength": 1,
75331
+ "type": "string"
75332
+ }
75333
+ }
75334
+ ],
75335
+ "responses": {
75336
+ "200": {
75337
+ "content": {
75338
+ "application/json": {
75339
+ "schema": {
75340
+ "$ref": "#/components/schemas/ResourceRelationsEnvelope"
75341
+ }
75342
+ }
75343
+ },
75344
+ "description": "Bounded observed relations, including coverage gaps.",
75345
+ "headers": {
75346
+ "Cache-Control": {
75347
+ "required": true,
75348
+ "schema": {
75349
+ "const": "no-store",
75350
+ "type": "string"
75351
+ }
75352
+ }
75353
+ }
75354
+ },
75355
+ "400": {
75356
+ "$ref": "#/components/responses/Error"
75357
+ },
75358
+ "403": {
75359
+ "$ref": "#/components/responses/Error"
75360
+ },
75361
+ "404": {
75362
+ "$ref": "#/components/responses/Error"
75363
+ },
75364
+ "409": {
75365
+ "$ref": "#/components/responses/Error"
75366
+ }
75367
+ },
75368
+ "tags": [
75369
+ "Delivery"
75370
+ ]
75371
+ }
75372
+ },
75373
+ "/application-environments/{applicationEnvironmentID}/targets/{targetID}/source": {
75374
+ "get": {
75375
+ "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.",
75376
+ "operationId": "getApplicationEnvironmentTargetSource",
75377
+ "parameters": [
75378
+ {
75379
+ "in": "path",
75380
+ "name": "applicationEnvironmentID",
75381
+ "required": true,
75382
+ "schema": {
75383
+ "minLength": 1,
75384
+ "type": "string"
75385
+ }
75386
+ },
75387
+ {
75388
+ "in": "path",
75389
+ "name": "targetID",
75390
+ "required": true,
75391
+ "schema": {
75392
+ "minLength": 1,
75393
+ "type": "string"
75394
+ }
75395
+ }
75396
+ ],
75397
+ "responses": {
75398
+ "200": {
75399
+ "content": {
75400
+ "application/json": {
75401
+ "schema": {
75402
+ "$ref": "#/components/schemas/KubernetesResourceYamlEnvelope"
75403
+ }
75404
+ }
75405
+ },
75406
+ "description": "Current cluster YAML for the linked resource, never a fabricated source file.",
75407
+ "headers": {
75408
+ "Cache-Control": {
75409
+ "required": true,
75410
+ "schema": {
75411
+ "const": "no-store",
75412
+ "type": "string"
75413
+ }
75414
+ }
75415
+ }
75416
+ },
75417
+ "403": {
75418
+ "$ref": "#/components/responses/Error"
75419
+ },
75420
+ "404": {
75421
+ "$ref": "#/components/responses/Error"
75422
+ },
75423
+ "409": {
75424
+ "$ref": "#/components/responses/Error"
75425
+ }
75426
+ },
75427
+ "tags": [
75428
+ "Delivery"
75429
+ ]
75430
+ }
75431
+ },
73845
75432
  "/application-environments/helm-release-imports": {
73846
75433
  "post": {
73847
75434
  "operationId": "importHelmReleases",
@@ -73924,6 +75511,32 @@
73924
75511
  "get": {
73925
75512
  "operationId": "listApplicationEnvironmentTargetCandidates",
73926
75513
  "parameters": [
75514
+ {
75515
+ "in": "query",
75516
+ "name": "workloadKind",
75517
+ "required": false,
75518
+ "schema": {
75519
+ "enum": [
75520
+ "Deployment",
75521
+ "StatefulSet",
75522
+ "DaemonSet",
75523
+ "Job",
75524
+ "CronJob",
75525
+ "CustomResource"
75526
+ ],
75527
+ "type": "string"
75528
+ }
75529
+ },
75530
+ {
75531
+ "description": "Explicit CRD selection for CustomResource discovery. Only this served resource and namespace are queried.",
75532
+ "in": "query",
75533
+ "name": "crdName",
75534
+ "required": false,
75535
+ "schema": {
75536
+ "minLength": 1,
75537
+ "type": "string"
75538
+ }
75539
+ },
73927
75540
  {
73928
75541
  "in": "query",
73929
75542
  "name": "clusterId",
@@ -83571,6 +85184,15 @@
83571
85184
  {
83572
85185
  "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
83573
85186
  },
85187
+ {
85188
+ "description": "Reject the request if the live Pod UID differs. Omit only for legacy clients, never when restoring a saved session.",
85189
+ "in": "query",
85190
+ "name": "expectedUid",
85191
+ "schema": {
85192
+ "minLength": 1,
85193
+ "type": "string"
85194
+ }
85195
+ },
83574
85196
  {
83575
85197
  "in": "query",
83576
85198
  "name": "container",
@@ -83623,6 +85245,16 @@
83623
85245
  "404": {
83624
85246
  "$ref": "#/components/responses/Error"
83625
85247
  },
85248
+ "409": {
85249
+ "content": {
85250
+ "application/json": {
85251
+ "schema": {
85252
+ "$ref": "#/components/schemas/ErrorEnvelope"
85253
+ }
85254
+ }
85255
+ },
85256
+ "description": "The current Pod UID differs from expectedUid; open the current Pod instead of adopting it by name."
85257
+ },
83626
85258
  "503": {
83627
85259
  "$ref": "#/components/responses/Error"
83628
85260
  }
@@ -91792,32 +93424,174 @@
91792
93424
  ],
91793
93425
  "x-soha-permissions": {
91794
93426
  "keys": [
91795
- "delivery.template-sources.view"
93427
+ "delivery.template-sources.view"
93428
+ ],
93429
+ "mode": "all"
93430
+ }
93431
+ }
93432
+ },
93433
+ "/delivery/template-sources/{sourceID}/sync-runs/{runID}": {
93434
+ "get": {
93435
+ "description": "Read an attempt and, for its initiating actor with current object permissions, the stored candidates and removed-file impact.",
93436
+ "operationId": "getDeliveryTemplateSyncRun",
93437
+ "parameters": [
93438
+ {
93439
+ "in": "path",
93440
+ "name": "sourceID",
93441
+ "required": true,
93442
+ "schema": {
93443
+ "minLength": 1,
93444
+ "type": "string"
93445
+ }
93446
+ },
93447
+ {
93448
+ "in": "path",
93449
+ "name": "runID",
93450
+ "required": true,
93451
+ "schema": {
93452
+ "minLength": 1,
93453
+ "type": "string"
93454
+ }
93455
+ }
93456
+ ],
93457
+ "responses": {
93458
+ "200": {
93459
+ "content": {
93460
+ "application/json": {
93461
+ "schema": {
93462
+ "$ref": "#/components/schemas/DeliveryTemplateSyncRunEnvelope"
93463
+ }
93464
+ }
93465
+ },
93466
+ "description": "Result"
93467
+ },
93468
+ "400": {
93469
+ "$ref": "#/components/responses/Error"
93470
+ },
93471
+ "401": {
93472
+ "$ref": "#/components/responses/Error"
93473
+ },
93474
+ "403": {
93475
+ "$ref": "#/components/responses/Error"
93476
+ },
93477
+ "404": {
93478
+ "$ref": "#/components/responses/Error"
93479
+ },
93480
+ "409": {
93481
+ "$ref": "#/components/responses/Error"
93482
+ }
93483
+ },
93484
+ "tags": [
93485
+ "Delivery"
93486
+ ],
93487
+ "x-soha-permissions": {
93488
+ "keys": [
93489
+ "delivery.template-sources.view"
93490
+ ],
93491
+ "mode": "all"
93492
+ }
93493
+ }
93494
+ },
93495
+ "/delivery/template-sources/{sourceID}/sync-runs/{runID}/apply": {
93496
+ "post": {
93497
+ "description": "Accept only the stored candidate commit, generation and digest. Recheck source, repository and all object permissions; atomically import drafts and source associations, marking missing files removed. Never fetch a newer ref or execute a workflow during apply.",
93498
+ "operationId": "applyDeliveryTemplateSync",
93499
+ "parameters": [
93500
+ {
93501
+ "in": "path",
93502
+ "name": "sourceID",
93503
+ "required": true,
93504
+ "schema": {
93505
+ "minLength": 1,
93506
+ "type": "string"
93507
+ }
93508
+ },
93509
+ {
93510
+ "in": "path",
93511
+ "name": "runID",
93512
+ "required": true,
93513
+ "schema": {
93514
+ "minLength": 1,
93515
+ "type": "string"
93516
+ }
93517
+ }
93518
+ ],
93519
+ "requestBody": {
93520
+ "content": {
93521
+ "application/json": {
93522
+ "schema": {
93523
+ "$ref": "#/components/schemas/DeliveryTemplateSyncApplyInput"
93524
+ }
93525
+ }
93526
+ },
93527
+ "required": true
93528
+ },
93529
+ "responses": {
93530
+ "200": {
93531
+ "content": {
93532
+ "application/json": {
93533
+ "schema": {
93534
+ "$ref": "#/components/schemas/DeliveryTemplateSyncRunEnvelope"
93535
+ }
93536
+ }
93537
+ },
93538
+ "description": "Result"
93539
+ },
93540
+ "400": {
93541
+ "$ref": "#/components/responses/Error"
93542
+ },
93543
+ "401": {
93544
+ "$ref": "#/components/responses/Error"
93545
+ },
93546
+ "403": {
93547
+ "$ref": "#/components/responses/Error"
93548
+ },
93549
+ "404": {
93550
+ "$ref": "#/components/responses/Error"
93551
+ },
93552
+ "409": {
93553
+ "$ref": "#/components/responses/Error"
93554
+ }
93555
+ },
93556
+ "tags": [
93557
+ "Delivery"
93558
+ ],
93559
+ "x-soha-permissions": {
93560
+ "keys": [
93561
+ "delivery.template-sources.sync"
91796
93562
  ],
91797
93563
  "mode": "all"
91798
93564
  }
91799
93565
  }
91800
93566
  },
91801
- "/delivery/template-sources/{sourceID}/sync-runs/{runID}": {
93567
+ "/delivery/template-updates/policies": {
91802
93568
  "get": {
91803
- "description": "Read an attempt and, for its initiating actor with current object permissions, the stored candidates and removed-file impact.",
91804
- "operationId": "getDeliveryTemplateSyncRun",
93569
+ "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.",
93570
+ "operationId": "listTemplateUpdatePolicies",
91805
93571
  "parameters": [
91806
93572
  {
91807
- "in": "path",
91808
- "name": "sourceID",
93573
+ "in": "query",
93574
+ "name": "kind",
91809
93575
  "required": true,
91810
93576
  "schema": {
91811
- "minLength": 1,
91812
- "type": "string"
93577
+ "$ref": "#/components/schemas/TemplateUpdateKind"
91813
93578
  }
91814
93579
  },
91815
93580
  {
91816
- "in": "path",
91817
- "name": "runID",
93581
+ "in": "query",
93582
+ "name": "templateId",
91818
93583
  "required": true,
91819
93584
  "schema": {
91820
- "minLength": 1,
93585
+ "maxLength": 256,
93586
+ "type": "string"
93587
+ }
93588
+ },
93589
+ {
93590
+ "in": "query",
93591
+ "name": "applicationId",
93592
+ "required": false,
93593
+ "schema": {
93594
+ "maxLength": 256,
91821
93595
  "type": "string"
91822
93596
  }
91823
93597
  }
@@ -91827,16 +93601,55 @@
91827
93601
  "content": {
91828
93602
  "application/json": {
91829
93603
  "schema": {
91830
- "$ref": "#/components/schemas/DeliveryTemplateSyncRunEnvelope"
93604
+ "$ref": "#/components/schemas/TemplateUpdatePolicyListEnvelope"
91831
93605
  }
91832
93606
  }
91833
93607
  },
91834
- "description": "Result"
93608
+ "description": "Success"
91835
93609
  },
91836
93610
  "400": {
91837
93611
  "$ref": "#/components/responses/Error"
91838
93612
  },
91839
- "401": {
93613
+ "403": {
93614
+ "$ref": "#/components/responses/Error"
93615
+ },
93616
+ "404": {
93617
+ "$ref": "#/components/responses/Error"
93618
+ },
93619
+ "409": {
93620
+ "$ref": "#/components/responses/Error"
93621
+ }
93622
+ },
93623
+ "summary": "List explicit adoption policies visible to the current principal",
93624
+ "tags": [
93625
+ "Delivery"
93626
+ ]
93627
+ },
93628
+ "put": {
93629
+ "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.",
93630
+ "operationId": "saveTemplateUpdatePolicy",
93631
+ "requestBody": {
93632
+ "content": {
93633
+ "application/json": {
93634
+ "schema": {
93635
+ "$ref": "#/components/schemas/TemplateUpdatePolicyInput"
93636
+ }
93637
+ }
93638
+ },
93639
+ "required": true
93640
+ },
93641
+ "responses": {
93642
+ "200": {
93643
+ "content": {
93644
+ "application/json": {
93645
+ "schema": {
93646
+ "$ref": "#/components/schemas/TemplateUpdatePolicyEnvelope"
93647
+ }
93648
+ }
93649
+ },
93650
+ "description": "Success"
93651
+ },
93652
+ "400": {
91840
93653
  "$ref": "#/components/responses/Error"
91841
93654
  },
91842
93655
  "403": {
@@ -91849,37 +93662,112 @@
91849
93662
  "$ref": "#/components/responses/Error"
91850
93663
  }
91851
93664
  },
93665
+ "summary": "Save fixed manual automatic or approval policy using a binding-scoped CAS",
91852
93666
  "tags": [
91853
93667
  "Delivery"
91854
- ],
91855
- "x-soha-permissions": {
91856
- "keys": [
91857
- "delivery.template-sources.view"
91858
- ],
91859
- "mode": "all"
91860
- }
93668
+ ]
91861
93669
  }
91862
93670
  },
91863
- "/delivery/template-sources/{sourceID}/sync-runs/{runID}/apply": {
93671
+ "/delivery/template-updates/previews": {
91864
93672
  "post": {
91865
- "description": "Accept only the stored candidate commit, generation and digest. Recheck source, repository and all object permissions; atomically import drafts and source associations, marking missing files removed. Never fetch a newer ref or execute a workflow during apply.",
91866
- "operationId": "applyDeliveryTemplateSync",
93673
+ "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.",
93674
+ "operationId": "createTemplateUpdatePreview",
93675
+ "requestBody": {
93676
+ "content": {
93677
+ "application/json": {
93678
+ "schema": {
93679
+ "$ref": "#/components/schemas/TemplateUpdatePreviewInput"
93680
+ }
93681
+ }
93682
+ },
93683
+ "required": true
93684
+ },
93685
+ "responses": {
93686
+ "200": {
93687
+ "content": {
93688
+ "application/json": {
93689
+ "schema": {
93690
+ "$ref": "#/components/schemas/TemplateUpdatePreviewEnvelope"
93691
+ }
93692
+ }
93693
+ },
93694
+ "description": "Success"
93695
+ },
93696
+ "400": {
93697
+ "$ref": "#/components/responses/Error"
93698
+ },
93699
+ "403": {
93700
+ "$ref": "#/components/responses/Error"
93701
+ },
93702
+ "404": {
93703
+ "$ref": "#/components/responses/Error"
93704
+ },
93705
+ "409": {
93706
+ "$ref": "#/components/responses/Error"
93707
+ }
93708
+ },
93709
+ "summary": "Freeze final template adoption and cumulative plus adjacent-version differences",
93710
+ "tags": [
93711
+ "Delivery"
93712
+ ]
93713
+ }
93714
+ },
93715
+ "/delivery/template-updates/previews/{previewID}": {
93716
+ "get": {
93717
+ "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.",
93718
+ "operationId": "getTemplateUpdatePreview",
91867
93719
  "parameters": [
91868
93720
  {
91869
93721
  "in": "path",
91870
- "name": "sourceID",
93722
+ "name": "previewID",
91871
93723
  "required": true,
91872
93724
  "schema": {
91873
- "minLength": 1,
93725
+ "maxLength": 256,
91874
93726
  "type": "string"
91875
93727
  }
93728
+ }
93729
+ ],
93730
+ "responses": {
93731
+ "200": {
93732
+ "content": {
93733
+ "application/json": {
93734
+ "schema": {
93735
+ "$ref": "#/components/schemas/TemplateUpdatePreviewEnvelope"
93736
+ }
93737
+ }
93738
+ },
93739
+ "description": "Success"
93740
+ },
93741
+ "400": {
93742
+ "$ref": "#/components/responses/Error"
93743
+ },
93744
+ "403": {
93745
+ "$ref": "#/components/responses/Error"
91876
93746
  },
93747
+ "404": {
93748
+ "$ref": "#/components/responses/Error"
93749
+ },
93750
+ "409": {
93751
+ "$ref": "#/components/responses/Error"
93752
+ }
93753
+ },
93754
+ "summary": "Read a frozen adoption preview with current scope revalidation",
93755
+ "tags": [
93756
+ "Delivery"
93757
+ ]
93758
+ }
93759
+ },
93760
+ "/delivery/template-updates/previews/{previewID}/batches": {
93761
+ "post": {
93762
+ "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.",
93763
+ "operationId": "createTemplateUpdateBatch",
93764
+ "parameters": [
91877
93765
  {
91878
93766
  "in": "path",
91879
- "name": "runID",
93767
+ "name": "previewID",
91880
93768
  "required": true,
91881
93769
  "schema": {
91882
- "minLength": 1,
93770
+ "maxLength": 256,
91883
93771
  "type": "string"
91884
93772
  }
91885
93773
  }
@@ -91888,7 +93776,7 @@
91888
93776
  "content": {
91889
93777
  "application/json": {
91890
93778
  "schema": {
91891
- "$ref": "#/components/schemas/DeliveryTemplateSyncApplyInput"
93779
+ "$ref": "#/components/schemas/TemplateUpdateBatchInput"
91892
93780
  }
91893
93781
  }
91894
93782
  },
@@ -91899,16 +93787,115 @@
91899
93787
  "content": {
91900
93788
  "application/json": {
91901
93789
  "schema": {
91902
- "$ref": "#/components/schemas/DeliveryTemplateSyncRunEnvelope"
93790
+ "$ref": "#/components/schemas/DeliveryBatchEnvelope"
91903
93791
  }
91904
93792
  }
91905
93793
  },
91906
- "description": "Result"
93794
+ "description": "Success"
91907
93795
  },
91908
93796
  "400": {
91909
93797
  "$ref": "#/components/responses/Error"
91910
93798
  },
91911
- "401": {
93799
+ "403": {
93800
+ "$ref": "#/components/responses/Error"
93801
+ },
93802
+ "404": {
93803
+ "$ref": "#/components/responses/Error"
93804
+ },
93805
+ "409": {
93806
+ "$ref": "#/components/responses/Error"
93807
+ }
93808
+ },
93809
+ "summary": "Adopt selected candidates in waves through existing DeliveryBatch and Plan approvals",
93810
+ "tags": [
93811
+ "Delivery"
93812
+ ]
93813
+ }
93814
+ },
93815
+ "/delivery/template-updates/targets": {
93816
+ "get": {
93817
+ "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.",
93818
+ "operationId": "listTemplateUpdateTargets",
93819
+ "parameters": [
93820
+ {
93821
+ "in": "query",
93822
+ "name": "kind",
93823
+ "required": true,
93824
+ "schema": {
93825
+ "$ref": "#/components/schemas/TemplateUpdateKind"
93826
+ }
93827
+ },
93828
+ {
93829
+ "in": "query",
93830
+ "name": "templateId",
93831
+ "required": true,
93832
+ "schema": {
93833
+ "maxLength": 256,
93834
+ "type": "string"
93835
+ }
93836
+ },
93837
+ {
93838
+ "in": "query",
93839
+ "name": "applicationId",
93840
+ "required": false,
93841
+ "schema": {
93842
+ "maxLength": 256,
93843
+ "type": "string"
93844
+ }
93845
+ },
93846
+ {
93847
+ "in": "query",
93848
+ "name": "page",
93849
+ "required": false,
93850
+ "schema": {
93851
+ "format": "int64",
93852
+ "maximum": 2147483647,
93853
+ "minimum": 1,
93854
+ "type": "integer"
93855
+ }
93856
+ },
93857
+ {
93858
+ "in": "query",
93859
+ "name": "pageSize",
93860
+ "required": false,
93861
+ "schema": {
93862
+ "format": "int64",
93863
+ "maximum": 100,
93864
+ "minimum": 1,
93865
+ "type": "integer"
93866
+ }
93867
+ },
93868
+ {
93869
+ "in": "query",
93870
+ "name": "serviceId",
93871
+ "required": false,
93872
+ "schema": {
93873
+ "maxLength": 256,
93874
+ "type": "string"
93875
+ }
93876
+ },
93877
+ {
93878
+ "in": "query",
93879
+ "name": "applicationEnvironmentId",
93880
+ "required": false,
93881
+ "schema": {
93882
+ "maxLength": 256,
93883
+ "type": "string"
93884
+ }
93885
+ }
93886
+ ],
93887
+ "responses": {
93888
+ "200": {
93889
+ "content": {
93890
+ "application/json": {
93891
+ "schema": {
93892
+ "$ref": "#/components/schemas/TemplateUpdateTargetPageEnvelope"
93893
+ }
93894
+ }
93895
+ },
93896
+ "description": "Success"
93897
+ },
93898
+ "400": {
91912
93899
  "$ref": "#/components/responses/Error"
91913
93900
  },
91914
93901
  "403": {
@@ -91921,15 +93908,10 @@
91921
93908
  "$ref": "#/components/responses/Error"
91922
93909
  }
91923
93910
  },
93911
+ "summary": "Preview affected application bindings with honest paginated totals",
91924
93912
  "tags": [
91925
93913
  "Delivery"
91926
- ],
91927
- "x-soha-permissions": {
91928
- "keys": [
91929
- "delivery.template-sources.sync"
91930
- ],
91931
- "mode": "all"
91932
- }
93914
+ ]
91933
93915
  }
91934
93916
  },
91935
93917
  "/delivery/triggers": {
@@ -108039,5 +110021,163 @@
108039
110021
  {
108040
110022
  "name": "Network Access"
108041
110023
  }
108042
- ]
110024
+ ],
110025
+ "x-soha-websocket-paths": {
110026
+ "/clusters/{clusterID}/workloads/pods/{podName}/logs/stream": {
110027
+ "get": {
110028
+ "description": "Existing WebSocket logs endpoint. Saved sessions must provide expectedUid. Each upstream open checks the current Pod UID and current action authorization. A stream ticket issued with expectedUid binds namespace, container and shell too.",
110029
+ "operationId": "streamKubernetesPodLogs",
110030
+ "parameters": [
110031
+ {
110032
+ "$ref": "#/components/parameters/ClusterID"
110033
+ },
110034
+ {
110035
+ "$ref": "#/components/parameters/KubernetesPodName"
110036
+ },
110037
+ {
110038
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
110039
+ },
110040
+ {
110041
+ "in": "query",
110042
+ "name": "expectedUid",
110043
+ "schema": {
110044
+ "minLength": 1,
110045
+ "type": "string"
110046
+ }
110047
+ },
110048
+ {
110049
+ "in": "query",
110050
+ "name": "container",
110051
+ "schema": {
110052
+ "minLength": 1,
110053
+ "type": "string"
110054
+ }
110055
+ },
110056
+ {
110057
+ "in": "query",
110058
+ "name": "stream_ticket",
110059
+ "schema": {
110060
+ "minLength": 1,
110061
+ "type": "string"
110062
+ }
110063
+ },
110064
+ {
110065
+ "in": "query",
110066
+ "name": "tailLines",
110067
+ "schema": {
110068
+ "default": 200,
110069
+ "minimum": 0,
110070
+ "type": "integer"
110071
+ }
110072
+ },
110073
+ {
110074
+ "in": "query",
110075
+ "name": "sinceSeconds",
110076
+ "schema": {
110077
+ "default": 0,
110078
+ "minimum": 0,
110079
+ "type": "integer"
110080
+ }
110081
+ }
110082
+ ],
110083
+ "responses": {
110084
+ "101": {
110085
+ "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."
110086
+ },
110087
+ "401": {
110088
+ "$ref": "#/components/responses/Error"
110089
+ },
110090
+ "403": {
110091
+ "$ref": "#/components/responses/Error"
110092
+ },
110093
+ "503": {
110094
+ "$ref": "#/components/responses/Error"
110095
+ }
110096
+ },
110097
+ "tags": [
110098
+ "Platform"
110099
+ ],
110100
+ "x-soha-implementation-status": "implemented",
110101
+ "x-soha-permissions": {
110102
+ "keys": [
110103
+ "platform.pods.logs"
110104
+ ],
110105
+ "mode": "all"
110106
+ }
110107
+ }
110108
+ },
110109
+ "/clusters/{clusterID}/workloads/pods/{podName}/terminal": {
110110
+ "get": {
110111
+ "description": "Existing WebSocket exec endpoint. Saved sessions must provide expectedUid. Each upstream open checks the current Pod UID and current action authorization. A stream ticket issued with expectedUid binds namespace, container and shell too.",
110112
+ "operationId": "streamKubernetesPodTerminal",
110113
+ "parameters": [
110114
+ {
110115
+ "$ref": "#/components/parameters/ClusterID"
110116
+ },
110117
+ {
110118
+ "$ref": "#/components/parameters/KubernetesPodName"
110119
+ },
110120
+ {
110121
+ "$ref": "#/components/parameters/KubernetesNamespaceDefaultQuery"
110122
+ },
110123
+ {
110124
+ "in": "query",
110125
+ "name": "expectedUid",
110126
+ "schema": {
110127
+ "minLength": 1,
110128
+ "type": "string"
110129
+ }
110130
+ },
110131
+ {
110132
+ "in": "query",
110133
+ "name": "container",
110134
+ "schema": {
110135
+ "minLength": 1,
110136
+ "type": "string"
110137
+ }
110138
+ },
110139
+ {
110140
+ "in": "query",
110141
+ "name": "stream_ticket",
110142
+ "schema": {
110143
+ "minLength": 1,
110144
+ "type": "string"
110145
+ }
110146
+ },
110147
+ {
110148
+ "in": "query",
110149
+ "name": "shell",
110150
+ "schema": {
110151
+ "default": "/bin/sh",
110152
+ "type": "string"
110153
+ }
110154
+ }
110155
+ ],
110156
+ "responses": {
110157
+ "101": {
110158
+ "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."
110159
+ },
110160
+ "401": {
110161
+ "$ref": "#/components/responses/Error"
110162
+ },
110163
+ "403": {
110164
+ "$ref": "#/components/responses/Error"
110165
+ },
110166
+ "503": {
110167
+ "$ref": "#/components/responses/Error"
110168
+ }
110169
+ },
110170
+ "tags": [
110171
+ "Platform"
110172
+ ],
110173
+ "x-soha-implementation-status": "implemented",
110174
+ "x-soha-permissions": {
110175
+ "keys": [
110176
+ "platform.pods.exec"
110177
+ ],
110178
+ "mode": "all"
110179
+ }
110180
+ }
110181
+ }
110182
+ }
108043
110183
  }