@opensoha/contracts 0.1.26 → 0.1.29

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 (213) hide show
  1. package/COMPATIBILITY.md +14 -3
  2. package/README.md +8 -9
  3. package/auth/catalog_generated.go +2 -2
  4. package/auth/permission-catalog.json +481 -1
  5. package/compat/consumer-revisions.json +1 -1
  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/endpointcontrol/decode.go +64 -0
  9. package/endpointcontrol/models.go +138 -0
  10. package/endpointcontrol/models_test.go +51 -0
  11. package/endpointcontrol/protocol.schema.json +397 -0
  12. package/fixtures/json-schema/endpoint-controls/invalid/controls.json +16 -0
  13. package/fixtures/json-schema/endpoint-controls/invalid/missing-channel-decision.json +15 -0
  14. package/fixtures/json-schema/endpoint-controls/invalid/receipt-content.json +36 -0
  15. package/fixtures/json-schema/endpoint-controls/valid/controls.json +16 -0
  16. package/fixtures/json-schema/endpoint-controls/valid/receipt.json +35 -0
  17. package/fixtures/json-schema/network-runtime-protocol/invalid/eap-activate-bad-fingerprint.json +14 -0
  18. package/fixtures/json-schema/network-runtime-protocol/invalid/eap-gateway-request.json +14 -0
  19. package/fixtures/json-schema/network-runtime-protocol/invalid/eap-private-key-request.json +15 -0
  20. package/fixtures/json-schema/network-runtime-protocol/invalid/eap-profile-without-eap-credential.json +22 -0
  21. package/fixtures/json-schema/network-runtime-protocol/invalid/endpoint-dns-observation.json +25 -0
  22. package/fixtures/json-schema/network-runtime-protocol/invalid/gateway-presence.json +22 -0
  23. package/fixtures/json-schema/network-runtime-protocol/invalid/mihomo-protection-zero-version.json +45 -0
  24. package/fixtures/json-schema/network-runtime-protocol/invalid/presence-raw-key.json +23 -0
  25. package/fixtures/json-schema/network-runtime-protocol/invalid/presence-zero-sequence.json +22 -0
  26. package/fixtures/json-schema/network-runtime-protocol/invalid/workload-wide-vpn.json +17 -0
  27. package/fixtures/json-schema/network-runtime-protocol/valid/eap-certificate-activate.json +14 -0
  28. package/fixtures/json-schema/network-runtime-protocol/valid/eap-certificate-request.json +14 -0
  29. package/fixtures/json-schema/network-runtime-protocol/valid/eap-profile-enrollment.json +24 -0
  30. package/fixtures/json-schema/network-runtime-protocol/valid/endpoint-presence.json +22 -0
  31. package/fixtures/json-schema/network-runtime-protocol/valid/ipv6-configuration.json +102 -0
  32. package/fixtures/json-schema/network-runtime-protocol/valid/mihomo-protected-policy.json +45 -0
  33. package/fixtures/json-schema/network-runtime-protocol/valid/site-dns-ipv6.json +25 -0
  34. package/fixtures/json-schema/network-runtime-protocol/valid/workload-direct-ztna.json +20 -0
  35. package/fixtures/openapi/DLPShadowDecision/invalid/step-up-type.json +14 -0
  36. package/fixtures/openapi/DLPShadowDecision/valid/archive-v2.json +14 -0
  37. package/fixtures/openapi/DLPShadowDecision/valid/step-up.json +14 -0
  38. package/fixtures/openapi/DLPShadowInput/invalid/self-reported-result.json +7 -0
  39. package/fixtures/openapi/DLPShadowInput/invalid/too-many-samples.json +14 -0
  40. package/fixtures/openapi/DLPShadowInput/valid/bounded.json +7 -0
  41. package/fixtures/openapi/DockerVolumeDLPAppealInput/invalid/p4-response.json +3 -0
  42. package/fixtures/openapi/DockerVolumeDLPAppealInput/valid/p4-response.json +3 -0
  43. package/fixtures/openapi/DockerVolumeDLPAppealReviewInput/invalid/p4-response.json +5 -0
  44. package/fixtures/openapi/DockerVolumeDLPAppealReviewInput/valid/p4-response.json +5 -0
  45. package/fixtures/openapi/DockerVolumeDLPAuthorizationInput/invalid/p4-response.json +3 -0
  46. package/fixtures/openapi/DockerVolumeDLPAuthorizationInput/valid/p4-response.json +3 -0
  47. package/fixtures/openapi/DockerVolumeDLPContent/invalid/archive-unsupported-channel.json +9 -0
  48. package/fixtures/openapi/DockerVolumeDLPContent/invalid/p4.json +6 -0
  49. package/fixtures/openapi/DockerVolumeDLPContent/invalid/step-up-audit.json +9 -0
  50. package/fixtures/openapi/DockerVolumeDLPContent/invalid/unavailable-engine.json +9 -0
  51. package/fixtures/openapi/DockerVolumeDLPContent/invalid/unknown-data-level.json +12 -0
  52. package/fixtures/openapi/DockerVolumeDLPContent/valid/classified-rule.json +16 -0
  53. package/fixtures/openapi/DockerVolumeDLPContent/valid/p4.json +8 -0
  54. package/fixtures/openapi/DockerVolumeDLPContent/valid/step-up.json +9 -0
  55. package/fixtures/openapi/DockerVolumeDLPDecision/invalid/p4.json +9 -0
  56. package/fixtures/openapi/DockerVolumeDLPDecision/invalid/step-up-type.json +12 -0
  57. package/fixtures/openapi/DockerVolumeDLPDecision/valid/archive-v2.json +12 -0
  58. package/fixtures/openapi/DockerVolumeDLPDecision/valid/p4.json +11 -0
  59. package/fixtures/openapi/DockerVolumeDLPDecision/valid/step-up.json +12 -0
  60. package/fixtures/openapi/DockerVolumeDLPSaveInput/invalid/p4.json +11 -0
  61. package/fixtures/openapi/DockerVolumeDLPSaveInput/valid/p4.json +11 -0
  62. package/fixtures/openapi/DockerVolumeFileReadInput/invalid/p4-response.json +5 -0
  63. package/fixtures/openapi/DockerVolumeFileReadInput/valid/p4-response.json +4 -0
  64. package/fixtures/openapi/EndpointDeviceInput/invalid/reported-management.json +5 -0
  65. package/fixtures/openapi/EndpointDeviceInput/valid/management-state.json +5 -0
  66. package/fixtures/openapi/EndpointDeviceRegistrationInput/invalid/self-promote-management.json +5 -0
  67. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-length.json +3 -0
  68. package/fixtures/openapi/KubernetesClusterRegistrationRequest/invalid/metric-cluster-value-type.json +3 -0
  69. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-alias.json +5 -0
  70. package/fixtures/openapi/KubernetesClusterRegistrationRequest/valid/metric-cluster-reset.json +3 -0
  71. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/invalid/revision-overflow.json +4 -0
  72. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/legacy.json +3 -0
  73. package/fixtures/openapi/KubernetesHelmReleaseValuesUpdateInput/valid/observed-revision.json +4 -0
  74. package/fixtures/openapi/KubernetesJobDetail/invalid/execution-observation.json +23 -0
  75. package/fixtures/openapi/KubernetesJobDetail/valid/execution-observation.json +23 -0
  76. package/fixtures/openapi/KubernetesNode/invalid/labels.json +10 -0
  77. package/fixtures/openapi/KubernetesNode/valid/labels.json +11 -0
  78. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/empty-uid.json +13 -0
  79. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/invalid-container-state.json +20 -0
  80. package/fixtures/openapi/KubernetesPodListEnvelope/invalid/missing-container-ready.json +19 -0
  81. package/fixtures/openapi/KubernetesPodListEnvelope/valid/container-statuses.json +67 -0
  82. package/fixtures/openapi/KubernetesPodListEnvelope/valid/running-pod.json +1 -0
  83. package/fixtures/openapi/KubernetesPrometheusDetail/invalid/metric-cluster-value-type.json +4 -0
  84. package/fixtures/openapi/KubernetesPrometheusDetail/valid/metric-cluster-alias.json +5 -0
  85. package/fixtures/openapi/KubernetesResourceGraphEnvelope/invalid/network-edge-source-payload.json +73 -0
  86. package/fixtures/openapi/KubernetesResourceGraphEnvelope/valid/network-edge-facts.json +67 -0
  87. package/fixtures/openapi/KubernetesSecretCertificate/invalid/secret-data.json +1 -0
  88. package/fixtures/openapi/KubernetesSecretCertificate/invalid/status.json +1 -0
  89. package/fixtures/openapi/KubernetesSecretCertificate/valid/available.json +1 -0
  90. package/fixtures/openapi/KubernetesSecretCertificate/valid/missing.json +1 -0
  91. package/fixtures/openapi/ManagedContentPasteInput/invalid/boundary.json +5 -0
  92. package/fixtures/openapi/ManagedContentPasteInput/valid/boundary.json +6 -0
  93. package/fixtures/openapi/ManagedContentPolicy/invalid/self-reported-allow.json +8 -0
  94. package/fixtures/openapi/ManagedContentPolicy/invalid/step-up-audit.json +8 -0
  95. package/fixtures/openapi/ManagedContentPolicy/invalid/unknown-extractor.json +8 -0
  96. package/fixtures/openapi/ManagedContentPolicy/valid/archive-v2.json +8 -0
  97. package/fixtures/openapi/ManagedContentPolicy/valid/network-and-level.json +10 -0
  98. package/fixtures/openapi/ManagedContentPolicy/valid/step-up.json +8 -0
  99. package/fixtures/openapi/ManagedContentReviewInput/invalid/boundary.json +5 -0
  100. package/fixtures/openapi/ManagedContentReviewInput/valid/boundary.json +5 -0
  101. package/fixtures/openapi/ManagedContentSaveInput/invalid/boundary.json +14 -0
  102. package/fixtures/openapi/ManagedContentSaveInput/valid/boundary.json +16 -0
  103. package/fixtures/openapi/ManagedContentUploadInput/invalid/boundary.json +7 -0
  104. package/fixtures/openapi/ManagedContentUploadInput/valid/boundary.json +6 -0
  105. package/fixtures/openapi/NetworkAccessPolicyInput/invalid/unknown-management-state.json +35 -0
  106. package/fixtures/openapi/NetworkAccessPolicyInput/valid/managed-device.json +35 -0
  107. package/fixtures/openapi/NetworkAdmissionPreviewRequest/invalid/deviceId-characters.json +4 -0
  108. package/fixtures/openapi/NetworkAdmissionPreviewRequest/invalid/nasBindingId-characters.json +4 -0
  109. package/fixtures/openapi/NetworkAdmissionPreviewRequest/invalid/subject-override.json +1 -0
  110. package/fixtures/openapi/NetworkAdmissionPreviewRequest/valid/device-nas.json +1 -0
  111. package/fixtures/openapi/NetworkAdmissionPreviewResult/invalid/missing-attributeVersion.json +13 -0
  112. package/fixtures/openapi/NetworkAdmissionPreviewResult/invalid/missing-evaluatedAt.json +13 -0
  113. package/fixtures/openapi/NetworkAdmissionPreviewResult/valid/versioned.json +14 -0
  114. package/fixtures/openapi/NetworkConflictAnalysisRequest/invalid/missing-runtime-ranges.json +1 -0
  115. package/fixtures/openapi/NetworkConflictAnalysisRequest/invalid/unknown-source-type.json +9 -0
  116. package/fixtures/openapi/NetworkConflictAnalysisRequest/valid/empty-runtime-ranges.json +3 -0
  117. package/fixtures/openapi/NetworkConflictAnalysisRequest/{invalid → valid}/ipv6-range.json +1 -1
  118. package/fixtures/openapi/NetworkEAPServerTrust/invalid/no-server-validation.json +5 -0
  119. package/fixtures/openapi/NetworkEAPServerTrust/valid/named-server.json +9 -0
  120. package/fixtures/openapi/NetworkEndpointResponsePolicyInput/invalid/all-sites-implicit.json +45 -0
  121. package/fixtures/openapi/NetworkEndpointResponsePolicyInput/invalid/unbounded-stages.json +54 -0
  122. package/fixtures/openapi/NetworkEndpointResponsePolicyInput/invalid/zero-heartbeat.json +47 -0
  123. package/fixtures/openapi/NetworkEndpointResponsePolicyInput/valid/staged-protection.json +47 -0
  124. package/fixtures/openapi/NetworkEndpointResponseRestoreInput/invalid/missing-reason.json +3 -0
  125. package/fixtures/openapi/NetworkEndpointResponseRestoreInput/valid/expected-current.json +4 -0
  126. package/fixtures/openapi/NetworkPolicyPreviewResult/invalid/attribute-version.json +1 -0
  127. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/admission-version.json +1 -0
  128. package/fixtures/openapi/NetworkPolicySubjects/invalid/duplicate-role.json +1 -0
  129. package/fixtures/openapi/NetworkPolicySubjects/invalid/role-characters.json +5 -0
  130. package/fixtures/openapi/NetworkPolicySubjects/valid/role-bound.json +1 -0
  131. package/fixtures/openapi/NetworkProxyConfigurationInput/invalid/missing-content.json +1 -0
  132. package/fixtures/openapi/NetworkProxyConfigurationPatchInput/invalid/bad-binding-id.json +9 -0
  133. package/fixtures/openapi/NetworkProxyConfigurationPatchInput/invalid/empty-content.json +1 -0
  134. package/fixtures/openapi/NetworkProxyConfigurationPatchInput/valid/binding-only.json +11 -0
  135. package/fixtures/openapi/NetworkProxyConfigurationPatchInput/valid/clear-binding-disabled.json +5 -0
  136. package/fixtures/openapi/NetworkProxyConfigurationPatchInput/valid/enabled.json +1 -0
  137. package/fixtures/openapi/NetworkSiteInput/invalid/unknown-governance.json +6 -0
  138. package/fixtures/openapi/NetworkSiteInput/valid/restricted-unmanaged.json +6 -0
  139. package/gen/go/sohaapi/client.go +1 -1
  140. package/gen/go/sohaapi/client_test.go +13 -0
  141. package/gen/go/sohaapi/kubernetes_workload_optional_test.go +40 -0
  142. package/gen/go/sohaapi/pod_status_compat_test.go +36 -0
  143. package/gen/go/sohaapi/proxy_configuration_test.go +38 -0
  144. package/gen/go/sohaapi/types.go +3222 -260
  145. package/gen/ts/sohaapi/index.ts +15506 -10104
  146. package/helmrelease/runtime/values_upgrade.go +78 -0
  147. package/helmrelease/runtime/values_upgrade_test.go +123 -0
  148. package/helmrelease/values_update.go +31 -0
  149. package/network/README.md +34 -0
  150. package/network/network-radius-accounting.schema.json +4 -1
  151. package/network/network-runtime-protocol.schema.json +2166 -317
  152. package/network/proxy-runtime.schema.json +482 -67
  153. package/openapi/network_control_test.go +64 -0
  154. package/openapi/soha-api.json +50412 -41310
  155. package/openapi/soha-api.yaml +16859 -10699
  156. package/openapi/spec_generated.go +3 -3
  157. package/package.json +6 -3
  158. package/proxytransport/handler.go +271 -0
  159. package/proxytransport/probe.go +30 -0
  160. package/proxytransport/scope.go +89 -0
  161. package/proxytransport/transport_test.go +60 -0
  162. package/resource/agent_profiles.go +9 -15
  163. package/resource/agent_profiles_test.go +9 -3
  164. package/resource/custom_graph_page.go +18 -0
  165. package/resource/models.go +102 -57
  166. package/resource/network_topology.go +22 -0
  167. package/resource/network_topology_projection.go +36 -22
  168. package/resource/network_topology_projection_test.go +4 -0
  169. package/resource/network_topology_test.go +20 -0
  170. package/resource/network_topology_validation.go +5 -0
  171. package/resource/observed_workload.go +18 -0
  172. package/resource/pod_status_test.go +22 -0
  173. package/resource/rbac_graph.go +4 -0
  174. package/resource/rollout_optional_test.go +33 -0
  175. package/resource/runtime/network_relationship_primitives.go +66 -0
  176. package/resource/runtime/network_relationship_primitives_test.go +147 -0
  177. package/resource/runtime/network_topology.go +17 -5
  178. package/resource/runtime/network_topology_builder.go +405 -0
  179. package/resource/runtime/network_topology_builder_backends.go +195 -0
  180. package/resource/runtime/network_topology_builder_gateway_l4_test.go +86 -0
  181. package/resource/runtime/network_topology_builder_ingress.go +302 -0
  182. package/resource/runtime/network_topology_builder_legacy.go +66 -0
  183. package/resource/runtime/network_topology_builder_providers.go +242 -0
  184. package/resource/runtime/network_topology_builder_test.go +186 -0
  185. package/resource/runtime/network_topology_declarations.go +329 -0
  186. package/resource/runtime/resource_edit.go +22 -0
  187. package/resource/runtime/resource_edit_test.go +32 -0
  188. package/resource/runtime/resource_graph_collect.go +325 -0
  189. package/resource/runtime/resource_graph_configuration.go +59 -0
  190. package/resource/runtime/resource_graph_configuration_collect.go +198 -0
  191. package/resource/runtime/resource_graph_configuration_test.go +470 -0
  192. package/resource/runtime/resource_graph_custom_page.go +159 -0
  193. package/resource/runtime/resource_graph_custom_root.go +132 -0
  194. package/resource/runtime/resource_graph_custom_root_test.go +197 -0
  195. package/resource/runtime/resource_graph_enrichment.go +417 -0
  196. package/resource/runtime/resource_graph_enrichment_hpa_test.go +117 -0
  197. package/resource/runtime/resource_graph_enrichment_test.go +201 -0
  198. package/resource/runtime/resource_graph_metadata.go +125 -0
  199. package/resource/runtime/resource_graph_metadata_test.go +204 -0
  200. package/resource/runtime/resource_graph_network.go +224 -0
  201. package/resource/runtime/resource_graph_network_collect.go +174 -0
  202. package/resource/runtime/resource_graph_network_collect_test.go +147 -0
  203. package/resource/runtime/resource_graph_network_test.go +342 -0
  204. package/resource/runtime/resource_graph_rbac.go +278 -0
  205. package/resource/runtime/resource_graph_rbac_test.go +372 -0
  206. package/resource/runtime/resource_graph_rules.go +834 -0
  207. package/resource/runtime/resource_graph_storage.go +144 -0
  208. package/resource/runtime/resource_graph_storage_collect.go +163 -0
  209. package/resource/runtime/resource_graph_storage_test.go +397 -0
  210. package/resource/runtime/resource_graph_test.go +627 -0
  211. package/resource/runtime/secret_certificate.go +44 -0
  212. package/resource/runtime/secret_certificate_test.go +87 -0
  213. package/resource/storage_graph.go +4 -0
package/COMPATIBILITY.md CHANGED
@@ -22,6 +22,16 @@ Current stream: `0.1.x`.
22
22
  - `1.0.0` starts the stable contract line. After `1.0.0`, breaking changes
23
23
  require a major version bump, a migration note, and consumer coordination.
24
24
 
25
+ ## Proxy Configuration Inputs
26
+
27
+ The proxy configuration endpoint accepts partial updates through
28
+ `NetworkProxyConfigurationPatchInput`. Its optional `content` distinguishes omission
29
+ from an explicit empty value. Existing Go consumers retain
30
+ `NetworkProxyConfigurationInput.Content` as a string and the full-input
31
+ `UpdateNetworkProxyConfigurationJSONRequestBody` alias. New Go consumers that omit
32
+ encrypted content must explicitly use the Patch input. TypeScript operation types
33
+ follow the partial HTTP schema. Both full and partial requests use the same endpoint.
34
+
25
35
  ## Version Synchronization
26
36
 
27
37
  Each release must keep these values aligned:
@@ -52,9 +62,10 @@ Release order for `0.1.x`:
52
62
  3. Run `npm test`, `npm pack --dry-run`, `npm run release:artifacts`, and
53
63
  the consumer matrix.
54
64
  4. Create tag `v<version>`.
55
- 5. Let the release workflow publish npm when `NPM_TOKEN` is configured and
56
- create the GitHub release with the npm tarball, `.sha256` checksum, and
57
- release manifest attached.
65
+ 5. Let the release workflow stage the npm package with `NPM_TOKEN`. After a
66
+ maintainer approves the stage with 2FA, dispatch recovery for the same tag.
67
+ The workflow verifies the public npm package and Go tag before attaching
68
+ the tarball, checksums, and release manifest to the GitHub release.
58
69
 
59
70
  ## Compatibility Baseline
60
71
 
package/README.md CHANGED
@@ -232,17 +232,16 @@ the tarball checksum, manifest metadata, packed `package.json`, every exported
232
232
  package entrypoint, both OpenAPI artifact hashes, the SBOM identity and
233
233
  checksum, the provenance policy and checksum, and the consumer matrix summary.
234
234
 
235
- The tag workflow runs `npm test`, `npm pack --dry-run`, the strict consumer
236
- matrix, requires `NPM_TOKEN`, publishes npm with provenance, verifies the npm
237
- package and Go module tag after publish, and attaches the tarball, checksum,
238
- SBOM, SBOM checksum, provenance policy, provenance policy checksum, manifest,
239
- and consumer matrix to the GitHub release. It then downloads the published
240
- release assets and runs `release:verify` against the downloaded tarball.
235
+ The tag workflow runs `npm test`, `npm pack --dry-run`, and the strict consumer
236
+ matrix, then uses `NPM_TOKEN` to stage the npm tarball with provenance. A
237
+ maintainer approves the stage on npmjs.com with 2FA. Dispatch the release
238
+ workflow with the same tag and `publish_mode=recover` after approval. Recovery
239
+ verifies the public npm package and Go module tag, attaches the release
240
+ artifacts to GitHub, and verifies the downloaded tarball.
241
241
 
242
242
  The local release manifest records the provenance policy expected from the tag
243
- workflow. It does not prove a remote npm registry attestation by itself; that
244
- evidence is produced and checked only after the tag workflow publishes with
245
- `npm publish --provenance`.
243
+ workflow. Verify the registry attestation's artifact digest and source revision
244
+ after approval makes the package public.
246
245
 
247
246
  During private staging, consumers intentionally use sibling repository
248
247
  checkouts, `go.work` / `replace` entries, and `file:../soha-contracts` package
@@ -6,8 +6,8 @@ import _ "embed"
6
6
 
7
7
  const (
8
8
  PermissionCatalogVersion = "2.0.0"
9
- PermissionCatalogContentSHA256 = "2d98b53189afa67c09a2917325e3b1b1b70aafe00d370bdabaef7d6b11ef493c"
10
- PermissionCatalogSHA256 = "ae344007ad96fa0b24a0bf74121e1db762a1b904e58b8c8b53a8ac9168abea80"
9
+ PermissionCatalogContentSHA256 = "bd4a7240d34750d3fcf38b4649f6dbe67b17fb0f6ebeb96a32f8d874685e5150"
10
+ PermissionCatalogSHA256 = "835ccdfccfa955ae3ee9377fffb4c523b53d2eb647d01840f79cce5524d72c36"
11
11
  )
12
12
 
13
13
  //go:embed permission-catalog.json
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "authorization.opensoha.io/v1",
3
3
  "catalogVersion": "2.0.0",
4
- "contentHash": "sha256:2d98b53189afa67c09a2917325e3b1b1b70aafe00d370bdabaef7d6b11ef493c",
4
+ "contentHash": "sha256:bd4a7240d34750d3fcf38b4649f6dbe67b17fb0f6ebeb96a32f8d874685e5150",
5
5
  "permissions": [
6
6
  {
7
7
  "key": "access.directory.create",
@@ -3624,6 +3624,86 @@
3624
3624
  "status": "active",
3625
3625
  "assignable": true
3626
3626
  },
3627
+ {
3628
+ "key": "docker.dlp-appeals.review",
3629
+ "domain": "docker",
3630
+ "resource": "dlp-appeals",
3631
+ "action": "approve",
3632
+ "displayName": "审查卷文件 DLP 申诉",
3633
+ "riskLevel": "high",
3634
+ "scopeKinds": [
3635
+ "tenant",
3636
+ "workspace",
3637
+ "resource"
3638
+ ],
3639
+ "approvalPolicy": "eligible",
3640
+ "status": "active",
3641
+ "assignable": true
3642
+ },
3643
+ {
3644
+ "key": "docker.dlp-events.view",
3645
+ "domain": "docker",
3646
+ "resource": "dlp-events",
3647
+ "action": "view",
3648
+ "displayName": "查看卷文件 DLP 事件",
3649
+ "riskLevel": "read",
3650
+ "scopeKinds": [
3651
+ "tenant",
3652
+ "workspace",
3653
+ "resource"
3654
+ ],
3655
+ "approvalPolicy": "never",
3656
+ "status": "active",
3657
+ "assignable": true
3658
+ },
3659
+ {
3660
+ "key": "docker.dlp-policy.publish",
3661
+ "domain": "docker",
3662
+ "resource": "dlp-policy",
3663
+ "action": "trigger",
3664
+ "displayName": "发布卷文件 DLP 策略",
3665
+ "riskLevel": "high",
3666
+ "scopeKinds": [
3667
+ "tenant",
3668
+ "workspace",
3669
+ "resource"
3670
+ ],
3671
+ "approvalPolicy": "eligible",
3672
+ "status": "active",
3673
+ "assignable": true
3674
+ },
3675
+ {
3676
+ "key": "docker.dlp-policy.update",
3677
+ "domain": "docker",
3678
+ "resource": "dlp-policy",
3679
+ "action": "update",
3680
+ "displayName": "编辑卷文件 DLP 草稿",
3681
+ "riskLevel": "high",
3682
+ "scopeKinds": [
3683
+ "tenant",
3684
+ "workspace",
3685
+ "resource"
3686
+ ],
3687
+ "approvalPolicy": "eligible",
3688
+ "status": "active",
3689
+ "assignable": true
3690
+ },
3691
+ {
3692
+ "key": "docker.dlp-policy.view",
3693
+ "domain": "docker",
3694
+ "resource": "dlp-policy",
3695
+ "action": "view",
3696
+ "displayName": "查看卷文件 DLP 策略",
3697
+ "riskLevel": "read",
3698
+ "scopeKinds": [
3699
+ "tenant",
3700
+ "workspace",
3701
+ "resource"
3702
+ ],
3703
+ "approvalPolicy": "never",
3704
+ "status": "active",
3705
+ "assignable": true
3706
+ },
3627
3707
  {
3628
3708
  "key": "docker.hosts.create",
3629
3709
  "domain": "docker",
@@ -4742,6 +4822,214 @@
4742
4822
  "status": "active",
4743
4823
  "assignable": true
4744
4824
  },
4825
+ {
4826
+ "key": "network_access.content_destinations.publish",
4827
+ "domain": "network_access",
4828
+ "resource": "content_destinations",
4829
+ "action": "publish",
4830
+ "displayName": "发布受管内容目的连接",
4831
+ "riskLevel": "high",
4832
+ "scopeKinds": [
4833
+ "tenant",
4834
+ "workspace",
4835
+ "resource"
4836
+ ],
4837
+ "approvalPolicy": "eligible",
4838
+ "status": "active",
4839
+ "assignable": true
4840
+ },
4841
+ {
4842
+ "key": "network_access.content_destinations.update",
4843
+ "domain": "network_access",
4844
+ "resource": "content_destinations",
4845
+ "action": "update",
4846
+ "displayName": "编辑受管内容目的连接",
4847
+ "riskLevel": "high",
4848
+ "scopeKinds": [
4849
+ "tenant",
4850
+ "workspace",
4851
+ "resource"
4852
+ ],
4853
+ "approvalPolicy": "eligible",
4854
+ "status": "active",
4855
+ "assignable": true
4856
+ },
4857
+ {
4858
+ "key": "network_access.content_destinations.view",
4859
+ "domain": "network_access",
4860
+ "resource": "content_destinations",
4861
+ "action": "view",
4862
+ "displayName": "查看受管内容目的连接",
4863
+ "riskLevel": "read",
4864
+ "scopeKinds": [
4865
+ "tenant",
4866
+ "workspace",
4867
+ "resource"
4868
+ ],
4869
+ "approvalPolicy": "never",
4870
+ "status": "active",
4871
+ "assignable": true
4872
+ },
4873
+ {
4874
+ "key": "network_access.content_transfer_appeals.review",
4875
+ "domain": "network_access",
4876
+ "resource": "content_transfer_appeals",
4877
+ "action": "review",
4878
+ "displayName": "审查受管内容申诉",
4879
+ "riskLevel": "high",
4880
+ "scopeKinds": [
4881
+ "tenant",
4882
+ "workspace",
4883
+ "resource"
4884
+ ],
4885
+ "approvalPolicy": "eligible",
4886
+ "status": "active",
4887
+ "assignable": true
4888
+ },
4889
+ {
4890
+ "key": "network_access.content_transfer_events.view",
4891
+ "domain": "network_access",
4892
+ "resource": "content_transfer_events",
4893
+ "action": "view",
4894
+ "displayName": "查看受管内容安全事件",
4895
+ "riskLevel": "read",
4896
+ "scopeKinds": [
4897
+ "tenant",
4898
+ "workspace",
4899
+ "resource"
4900
+ ],
4901
+ "approvalPolicy": "never",
4902
+ "status": "active",
4903
+ "assignable": true
4904
+ },
4905
+ {
4906
+ "key": "network_access.content_transfers.create",
4907
+ "domain": "network_access",
4908
+ "resource": "content_transfers",
4909
+ "action": "create",
4910
+ "displayName": "提交受管内容传输",
4911
+ "riskLevel": "mutate",
4912
+ "scopeKinds": [
4913
+ "tenant",
4914
+ "workspace",
4915
+ "resource"
4916
+ ],
4917
+ "approvalPolicy": "eligible",
4918
+ "status": "active",
4919
+ "assignable": true
4920
+ },
4921
+ {
4922
+ "key": "network_access.content_transfers.delete",
4923
+ "domain": "network_access",
4924
+ "resource": "content_transfers",
4925
+ "action": "delete",
4926
+ "displayName": "删除自己的受管文件",
4927
+ "riskLevel": "high",
4928
+ "scopeKinds": [
4929
+ "tenant",
4930
+ "workspace",
4931
+ "resource"
4932
+ ],
4933
+ "approvalPolicy": "eligible",
4934
+ "status": "active",
4935
+ "assignable": true
4936
+ },
4937
+ {
4938
+ "key": "network_access.content_transfers.download",
4939
+ "domain": "network_access",
4940
+ "resource": "content_transfers",
4941
+ "action": "download",
4942
+ "displayName": "下载自己的受管文件",
4943
+ "riskLevel": "read",
4944
+ "scopeKinds": [
4945
+ "tenant",
4946
+ "workspace",
4947
+ "resource"
4948
+ ],
4949
+ "approvalPolicy": "never",
4950
+ "status": "active",
4951
+ "assignable": true
4952
+ },
4953
+ {
4954
+ "key": "network_access.content_transfers.view",
4955
+ "domain": "network_access",
4956
+ "resource": "content_transfers",
4957
+ "action": "view",
4958
+ "displayName": "查看自己的受管内容记录",
4959
+ "riskLevel": "read",
4960
+ "scopeKinds": [
4961
+ "tenant",
4962
+ "workspace",
4963
+ "resource"
4964
+ ],
4965
+ "approvalPolicy": "never",
4966
+ "status": "active",
4967
+ "assignable": true
4968
+ },
4969
+ {
4970
+ "key": "network_access.dlp_linkage.manage",
4971
+ "domain": "network_access",
4972
+ "resource": "dlp_linkage",
4973
+ "action": "update",
4974
+ "displayName": "管理全主体 DLP 网络联动",
4975
+ "riskLevel": "high",
4976
+ "scopeKinds": [
4977
+ "tenant",
4978
+ "workspace",
4979
+ "resource"
4980
+ ],
4981
+ "approvalPolicy": "eligible",
4982
+ "status": "active",
4983
+ "assignable": true
4984
+ },
4985
+ {
4986
+ "key": "network_access.endpoint_controls.publish",
4987
+ "domain": "network_access",
4988
+ "resource": "endpoint_controls",
4989
+ "action": "publish",
4990
+ "displayName": "发布端点通道控制",
4991
+ "riskLevel": "high",
4992
+ "scopeKinds": [
4993
+ "tenant",
4994
+ "workspace",
4995
+ "resource"
4996
+ ],
4997
+ "approvalPolicy": "eligible",
4998
+ "status": "active",
4999
+ "assignable": true
5000
+ },
5001
+ {
5002
+ "key": "network_access.endpoint_controls.update",
5003
+ "domain": "network_access",
5004
+ "resource": "endpoint_controls",
5005
+ "action": "update",
5006
+ "displayName": "编辑端点通道策略",
5007
+ "riskLevel": "high",
5008
+ "scopeKinds": [
5009
+ "tenant",
5010
+ "workspace",
5011
+ "resource"
5012
+ ],
5013
+ "approvalPolicy": "eligible",
5014
+ "status": "active",
5015
+ "assignable": true
5016
+ },
5017
+ {
5018
+ "key": "network_access.endpoint_controls.view",
5019
+ "domain": "network_access",
5020
+ "resource": "endpoint_controls",
5021
+ "action": "view",
5022
+ "displayName": "查看端点通道策略与回执",
5023
+ "riskLevel": "read",
5024
+ "scopeKinds": [
5025
+ "tenant",
5026
+ "workspace",
5027
+ "resource"
5028
+ ],
5029
+ "approvalPolicy": "eligible",
5030
+ "status": "active",
5031
+ "assignable": true
5032
+ },
4745
5033
  {
4746
5034
  "key": "network_access.endpoint_devices.update",
4747
5035
  "domain": "network_access",
@@ -4774,6 +5062,150 @@
4774
5062
  "status": "active",
4775
5063
  "assignable": true
4776
5064
  },
5065
+ {
5066
+ "key": "network_access.endpoint_response_events.maintenance",
5067
+ "domain": "network_access",
5068
+ "resource": "endpoint_response_events",
5069
+ "action": "maintenance",
5070
+ "displayName": "管理终端维护例外",
5071
+ "riskLevel": "mutate",
5072
+ "scopeKinds": [
5073
+ "tenant",
5074
+ "workspace",
5075
+ "resource"
5076
+ ],
5077
+ "approvalPolicy": "never",
5078
+ "status": "active",
5079
+ "assignable": true
5080
+ },
5081
+ {
5082
+ "key": "network_access.endpoint_response_events.restore",
5083
+ "domain": "network_access",
5084
+ "resource": "endpoint_response_events",
5085
+ "action": "restore",
5086
+ "displayName": "解除终端联动限制",
5087
+ "riskLevel": "mutate",
5088
+ "scopeKinds": [
5089
+ "tenant",
5090
+ "workspace",
5091
+ "resource"
5092
+ ],
5093
+ "approvalPolicy": "never",
5094
+ "status": "active",
5095
+ "assignable": true
5096
+ },
5097
+ {
5098
+ "key": "network_access.endpoint_response_events.view",
5099
+ "domain": "network_access",
5100
+ "resource": "endpoint_response_events",
5101
+ "action": "view",
5102
+ "displayName": "查看终端联动事件",
5103
+ "riskLevel": "read",
5104
+ "scopeKinds": [
5105
+ "tenant",
5106
+ "workspace",
5107
+ "resource"
5108
+ ],
5109
+ "approvalPolicy": "never",
5110
+ "status": "active",
5111
+ "assignable": true
5112
+ },
5113
+ {
5114
+ "key": "network_access.endpoint_response_policies.create",
5115
+ "domain": "network_access",
5116
+ "resource": "endpoint_response_policies",
5117
+ "action": "create",
5118
+ "displayName": "创建终端联动策略",
5119
+ "riskLevel": "mutate",
5120
+ "scopeKinds": [
5121
+ "tenant",
5122
+ "workspace",
5123
+ "resource"
5124
+ ],
5125
+ "approvalPolicy": "never",
5126
+ "status": "active",
5127
+ "assignable": true
5128
+ },
5129
+ {
5130
+ "key": "network_access.endpoint_response_policies.delete",
5131
+ "domain": "network_access",
5132
+ "resource": "endpoint_response_policies",
5133
+ "action": "delete",
5134
+ "displayName": "停用终端联动策略",
5135
+ "riskLevel": "mutate",
5136
+ "scopeKinds": [
5137
+ "tenant",
5138
+ "workspace",
5139
+ "resource"
5140
+ ],
5141
+ "approvalPolicy": "never",
5142
+ "status": "active",
5143
+ "assignable": true
5144
+ },
5145
+ {
5146
+ "key": "network_access.endpoint_response_policies.preview",
5147
+ "domain": "network_access",
5148
+ "resource": "endpoint_response_policies",
5149
+ "action": "preview",
5150
+ "displayName": "预览终端联动策略",
5151
+ "riskLevel": "read",
5152
+ "scopeKinds": [
5153
+ "tenant",
5154
+ "workspace",
5155
+ "resource"
5156
+ ],
5157
+ "approvalPolicy": "never",
5158
+ "status": "active",
5159
+ "assignable": true
5160
+ },
5161
+ {
5162
+ "key": "network_access.endpoint_response_policies.publish",
5163
+ "domain": "network_access",
5164
+ "resource": "endpoint_response_policies",
5165
+ "action": "publish",
5166
+ "displayName": "发布终端联动策略",
5167
+ "riskLevel": "mutate",
5168
+ "scopeKinds": [
5169
+ "tenant",
5170
+ "workspace",
5171
+ "resource"
5172
+ ],
5173
+ "approvalPolicy": "never",
5174
+ "status": "active",
5175
+ "assignable": true
5176
+ },
5177
+ {
5178
+ "key": "network_access.endpoint_response_policies.update",
5179
+ "domain": "network_access",
5180
+ "resource": "endpoint_response_policies",
5181
+ "action": "update",
5182
+ "displayName": "修改终端联动策略",
5183
+ "riskLevel": "mutate",
5184
+ "scopeKinds": [
5185
+ "tenant",
5186
+ "workspace",
5187
+ "resource"
5188
+ ],
5189
+ "approvalPolicy": "never",
5190
+ "status": "active",
5191
+ "assignable": true
5192
+ },
5193
+ {
5194
+ "key": "network_access.endpoint_response_policies.view",
5195
+ "domain": "network_access",
5196
+ "resource": "endpoint_response_policies",
5197
+ "action": "view",
5198
+ "displayName": "查看终端联动策略",
5199
+ "riskLevel": "read",
5200
+ "scopeKinds": [
5201
+ "tenant",
5202
+ "workspace",
5203
+ "resource"
5204
+ ],
5205
+ "approvalPolicy": "never",
5206
+ "status": "active",
5207
+ "assignable": true
5208
+ },
4777
5209
  {
4778
5210
  "key": "network_access.enrollments.create",
4779
5211
  "domain": "network_access",
@@ -5478,6 +5910,54 @@
5478
5910
  "status": "active",
5479
5911
  "assignable": true
5480
5912
  },
5913
+ {
5914
+ "key": "network_access.vpn_sessions.release",
5915
+ "domain": "network_access",
5916
+ "resource": "vpn_sessions",
5917
+ "action": "release",
5918
+ "displayName": "解除 VPN 重连限制",
5919
+ "riskLevel": "mutate",
5920
+ "scopeKinds": [
5921
+ "tenant",
5922
+ "workspace",
5923
+ "resource"
5924
+ ],
5925
+ "approvalPolicy": "never",
5926
+ "status": "active",
5927
+ "assignable": true
5928
+ },
5929
+ {
5930
+ "key": "network_access.vpn_sessions.revoke",
5931
+ "domain": "network_access",
5932
+ "resource": "vpn_sessions",
5933
+ "action": "revoke",
5934
+ "displayName": "撤销 VPN 会话与重连",
5935
+ "riskLevel": "execute",
5936
+ "scopeKinds": [
5937
+ "tenant",
5938
+ "workspace",
5939
+ "resource"
5940
+ ],
5941
+ "approvalPolicy": "never",
5942
+ "status": "active",
5943
+ "assignable": true
5944
+ },
5945
+ {
5946
+ "key": "network_access.vpn_sessions.view",
5947
+ "domain": "network_access",
5948
+ "resource": "vpn_sessions",
5949
+ "action": "view",
5950
+ "displayName": "查看 VPN 会话限制",
5951
+ "riskLevel": "read",
5952
+ "scopeKinds": [
5953
+ "tenant",
5954
+ "workspace",
5955
+ "resource"
5956
+ ],
5957
+ "approvalPolicy": "never",
5958
+ "status": "active",
5959
+ "assignable": true
5960
+ },
5481
5961
  {
5482
5962
  "key": "observe.ai.chat",
5483
5963
  "domain": "observe",
@@ -1,5 +1,5 @@
1
1
  {
2
- "soha": "57bfa94873ff2825bccc6312842859011c1ec23a",
2
+ "soha": "59e929046927eecf1977bc50a446fd5d823d1d31",
3
3
  "soha-web": "447cbe5358802ef40d86ac67b7b59c5afe9c846a",
4
4
  "soha-app": "0c3c76c373246f7d2218b48f68b89bf3097f777b",
5
5
  "soha-cli": "1c9b760c986a9c1a5148db55b72ab99d23edd7a3",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.26",
2
+ "version": "0.1.29",
3
3
  "schemas": {
4
4
  "plugins/plugin-manifest.schema.json": {
5
5
  "rootRequired": ["id", "name", "publisher", "type", "version"],
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.26",
2
+ "version": "0.1.29",
3
3
  "generatedFrom": "openapi/soha-api.yaml",
4
4
  "entries": [
5
5
  {
@@ -0,0 +1,64 @@
1
+ package endpointcontrol
2
+
3
+ import (
4
+ "errors"
5
+ "time"
6
+ )
7
+
8
+ // Required booleans must be present, including explicit false. Missing input
9
+ // must never become a newer all-off policy through Go zero values.
10
+ func (c *Controls) UnmarshalJSON(raw []byte) error {
11
+ var w struct {
12
+ USB *bool `json:"usb"`
13
+ Print *bool `json:"print"`
14
+ Clipboard *bool `json:"clipboard"`
15
+ }
16
+ if err := Decode(raw, &w); err != nil {
17
+ return err
18
+ }
19
+ if w.USB == nil || w.Print == nil || w.Clipboard == nil {
20
+ return errors.New("all native channel decisions are required")
21
+ }
22
+ *c = Controls{USB: *w.USB, Print: *w.Print, Clipboard: *w.Clipboard}
23
+ return nil
24
+ }
25
+ func (d *Desired) UnmarshalJSON(raw []byte) error {
26
+ var w struct {
27
+ Configured *bool `json:"configured"`
28
+ SchemaVersion string `json:"schemaVersion"`
29
+ DeviceID string `json:"deviceId"`
30
+ RuntimeID string `json:"runtimeId"`
31
+ CredentialID string `json:"credentialId"`
32
+ PolicyVersion *int64 `json:"policyVersion"`
33
+ Controls *Controls `json:"controls"`
34
+ Challenge string `json:"challenge"`
35
+ IssuedAt *time.Time `json:"issuedAt"`
36
+ ValidUntil *time.Time `json:"validUntil"`
37
+ }
38
+ if err := Decode(raw, &w); err != nil {
39
+ return err
40
+ }
41
+ if w.Configured == nil || w.PolicyVersion == nil || w.Controls == nil || w.IssuedAt == nil || w.ValidUntil == nil {
42
+ return errors.New("native channel envelope has missing required fields")
43
+ }
44
+ *d = Desired{Configured: *w.Configured, SchemaVersion: w.SchemaVersion, DeviceID: w.DeviceID, RuntimeID: w.RuntimeID, CredentialID: w.CredentialID, PolicyVersion: *w.PolicyVersion, Controls: *w.Controls, Challenge: w.Challenge, IssuedAt: *w.IssuedAt, ValidUntil: *w.ValidUntil}
45
+ return nil
46
+ }
47
+ func (c *Channel) UnmarshalJSON(raw []byte) error {
48
+ var w struct {
49
+ Name string `json:"name"`
50
+ Scope string `json:"scope"`
51
+ State string `json:"state"`
52
+ Targets *int `json:"targets"`
53
+ Controlled *int `json:"controlled"`
54
+ ReasonCode string `json:"reasonCode"`
55
+ }
56
+ if err := Decode(raw, &w); err != nil {
57
+ return err
58
+ }
59
+ if w.Targets == nil || w.Controlled == nil {
60
+ return errors.New("native channel counts are required")
61
+ }
62
+ *c = Channel{Name: w.Name, Scope: w.Scope, State: w.State, Targets: *w.Targets, Controlled: *w.Controlled, ReasonCode: w.ReasonCode}
63
+ return nil
64
+ }