@opensoha/contracts 0.1.16 → 0.1.17

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 (139) hide show
  1. package/COMPATIBILITY.md +46 -0
  2. package/README.md +12 -3
  3. package/auth/catalog_generated.go +2 -2
  4. package/auth/catalog_test.go +32 -0
  5. package/auth/permission-catalog.json +529 -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/fixtures/json-schema/network-ingest-event/invalid/duplicate-event.json +33 -0
  9. package/fixtures/json-schema/network-ingest-event/invalid/message-payload-mismatch.json +23 -0
  10. package/fixtures/json-schema/network-ingest-event/invalid/password.json +22 -0
  11. package/fixtures/json-schema/network-ingest-event/invalid/proxy-flow-destination.json +28 -0
  12. package/fixtures/json-schema/network-ingest-event/valid/endpoint-proxy-flow.json +27 -0
  13. package/fixtures/json-schema/network-ingest-event/valid/freeradius-accounting.json +25 -0
  14. package/fixtures/json-schema/network-ingest-event/valid/gateway.json +53 -0
  15. package/fixtures/json-schema/network-radius-accounting/invalid/password.json +9 -0
  16. package/fixtures/json-schema/network-radius-accounting/valid/accounting.json +16 -0
  17. package/fixtures/json-schema/network-runtime-protocol/invalid/invalid-cidr.json +31 -0
  18. package/fixtures/json-schema/network-runtime-protocol/invalid/message-payload-mismatch.json +19 -0
  19. package/fixtures/json-schema/network-runtime-protocol/invalid/mihomo-raw-subscription.json +33 -0
  20. package/fixtures/json-schema/network-runtime-protocol/invalid/nas-authorization-password.json +18 -0
  21. package/fixtures/json-schema/network-runtime-protocol/invalid/nas-eap-without-certificate.json +17 -0
  22. package/fixtures/json-schema/network-runtime-protocol/invalid/private-key.json +20 -0
  23. package/fixtures/json-schema/network-runtime-protocol/invalid/raw-credential-reference.json +16 -0
  24. package/fixtures/json-schema/network-runtime-protocol/invalid/runtime-interval-too-short.json +23 -0
  25. package/fixtures/json-schema/network-runtime-protocol/invalid/wireguard-capability-without-key.json +19 -0
  26. package/fixtures/json-schema/network-runtime-protocol/invalid/wireguard-default-route.json +31 -0
  27. package/fixtures/json-schema/network-runtime-protocol/invalid/ztna-without-access-grant.json +17 -0
  28. package/fixtures/json-schema/network-runtime-protocol/valid/configuration-desired.json +86 -0
  29. package/fixtures/json-schema/network-runtime-protocol/valid/direct-ztna-connect.json +19 -0
  30. package/fixtures/json-schema/network-runtime-protocol/valid/direct-ztna-result.json +33 -0
  31. package/fixtures/json-schema/network-runtime-protocol/valid/internal-ztna-connect.json +19 -0
  32. package/fixtures/json-schema/network-runtime-protocol/valid/mihomo-app-subscription-configuration.json +32 -0
  33. package/fixtures/json-schema/network-runtime-protocol/valid/mihomo-manual-node-configuration.json +32 -0
  34. package/fixtures/json-schema/network-runtime-protocol/valid/mihomo-wireguard-configuration.json +70 -0
  35. package/fixtures/json-schema/network-runtime-protocol/valid/nas-authorization-request.json +19 -0
  36. package/fixtures/json-schema/network-runtime-protocol/valid/nas-authorization-result.json +24 -0
  37. package/fixtures/json-schema/network-runtime-protocol/valid/nas-session-command-result.json +17 -0
  38. package/fixtures/json-schema/network-runtime-protocol/valid/nas-session-command.json +27 -0
  39. package/fixtures/json-schema/network-runtime-protocol/valid/vpn-connect-request.json +17 -0
  40. package/fixtures/json-schema/network-runtime-protocol/valid/vpn-connect-result.json +34 -0
  41. package/fixtures/json-schema/network-runtime-protocol/valid/wireguard-enrollment.json +20 -0
  42. package/fixtures/json-schema/network-runtime-protocol/valid/wireguard-site-link.json +48 -0
  43. package/fixtures/openapi/AnnouncementReceiptPageEnvelope/invalid/missing-read-count.json +9 -0
  44. package/fixtures/openapi/AnnouncementReceiptPageEnvelope/valid/read-and-unread.json +28 -0
  45. package/fixtures/openapi/EndpointDevice/invalid/missing-owner.json +8 -0
  46. package/fixtures/openapi/EndpointDevice/valid/active.json +35 -0
  47. package/fixtures/openapi/EndpointDeviceRegistrationInput/invalid/client-owned-status.json +5 -0
  48. package/fixtures/openapi/EndpointDeviceRegistrationInput/invalid/oversized-network-inventory.json +18 -0
  49. package/fixtures/openapi/EndpointDeviceRegistrationInput/valid/macos.json +28 -0
  50. package/fixtures/openapi/LLMUpstreamTestResultEnvelope/invalid/models-not-array.json +9 -0
  51. package/fixtures/openapi/LLMUpstreamTestResultEnvelope/valid/discovered-models.json +11 -0
  52. package/fixtures/openapi/NetworkAccessGrant/invalid/token-digest.json +15 -0
  53. package/fixtures/openapi/NetworkAccessGrant/valid/issued.json +14 -0
  54. package/fixtures/openapi/NetworkAccessGrantInput/invalid/no-resources.json +7 -0
  55. package/fixtures/openapi/NetworkAccessGrantInput/valid/direct-ztna.json +8 -0
  56. package/fixtures/openapi/NetworkAccessGrantSecret/invalid/short-token.json +17 -0
  57. package/fixtures/openapi/NetworkAccessGrantSecret/valid/issued.json +17 -0
  58. package/fixtures/openapi/NetworkAccessPolicy/invalid/missing-version.json +20 -0
  59. package/fixtures/openapi/NetworkAccessPolicy/valid/published-draft.json +21 -0
  60. package/fixtures/openapi/NetworkAccessPolicyInput/invalid/duplicate-team.json +17 -0
  61. package/fixtures/openapi/NetworkAccessPolicyInput/valid/team-and-tag-allow.json +17 -0
  62. package/fixtures/openapi/NetworkConflictAnalysisRequest/invalid/ipv6-range.json +9 -0
  63. package/fixtures/openapi/NetworkConflictAnalysisRequest/valid/runtime-ranges.json +15 -0
  64. package/fixtures/openapi/NetworkConnectionOption/invalid/secret.json +10 -0
  65. package/fixtures/openapi/NetworkConnectionOption/valid/wifi.json +9 -0
  66. package/fixtures/openapi/NetworkConnectionOption/valid/wired.json +8 -0
  67. package/fixtures/openapi/NetworkGateway/invalid/missing-site.json +7 -0
  68. package/fixtures/openapi/NetworkGateway/valid/online.json +23 -0
  69. package/fixtures/openapi/NetworkGatewayInput/invalid/default-route-overlay.json +13 -0
  70. package/fixtures/openapi/NetworkGatewayInput/valid/routed.json +14 -0
  71. package/fixtures/openapi/NetworkLease/invalid/empty-cidrs.json +12 -0
  72. package/fixtures/openapi/NetworkLease/valid/active.json +12 -0
  73. package/fixtures/openapi/NetworkMihomoProfile/invalid/subscription-leak.json +20 -0
  74. package/fixtures/openapi/NetworkMihomoProfile/valid/managed.json +21 -0
  75. package/fixtures/openapi/NetworkMihomoProfileInput/invalid/app-subscription-secret.json +14 -0
  76. package/fixtures/openapi/NetworkMihomoProfileInput/invalid/manual-node-with-subscription.json +20 -0
  77. package/fixtures/openapi/NetworkMihomoProfileInput/valid/app-subscription.json +14 -0
  78. package/fixtures/openapi/NetworkMihomoProfileInput/valid/managed.json +16 -0
  79. package/fixtures/openapi/NetworkMihomoProfileInput/valid/manual-node.json +21 -0
  80. package/fixtures/openapi/NetworkNASBinding/invalid/secret.json +13 -0
  81. package/fixtures/openapi/NetworkNASBinding/valid/default.json +16 -0
  82. package/fixtures/openapi/NetworkNASBindingInput/invalid/secret.json +10 -0
  83. package/fixtures/openapi/NetworkNASBindingInput/valid/default.json +13 -0
  84. package/fixtures/openapi/NetworkPolicyPreviewRequest/invalid/unknown-mode.json +6 -0
  85. package/fixtures/openapi/NetworkPolicyPreviewRequest/valid/external-direct-ztna.json +6 -0
  86. package/fixtures/openapi/NetworkPolicyPreviewRequest/valid/external-vpn-ztna.json +6 -0
  87. package/fixtures/openapi/NetworkPolicyPreviewRequest/valid/external-vpn.json +6 -0
  88. package/fixtures/openapi/NetworkPolicyPreviewRequest/valid/internal-direct.json +7 -0
  89. package/fixtures/openapi/NetworkPolicyPreviewRequest/valid/internal-ztna.json +7 -0
  90. package/fixtures/openapi/NetworkPolicyPreviewResult/invalid/bypass-path.json +9 -0
  91. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/onboarding.json +10 -0
  92. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/protected-broad-path-denied.json +9 -0
  93. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/protected-resource.json +9 -0
  94. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/quarantine.json +10 -0
  95. package/fixtures/openapi/NetworkPolicyPreviewResult/valid/restricted.json +10 -0
  96. package/fixtures/openapi/NetworkPolicySnapshot/invalid/zero-version.json +7 -0
  97. package/fixtures/openapi/NetworkPolicySnapshot/valid/published.json +7 -0
  98. package/fixtures/openapi/NetworkResourceInput/invalid/invalid-port.json +10 -0
  99. package/fixtures/openapi/NetworkResourceInput/valid/protected-cidr.json +10 -0
  100. package/fixtures/openapi/NetworkRuntimeEnrollmentInput/invalid/excessive-ttl.json +7 -0
  101. package/fixtures/openapi/NetworkRuntimeEnrollmentInput/valid/endpoint.json +7 -0
  102. package/fixtures/openapi/NetworkRuntimeEnrollmentSecret/invalid/short-token.json +15 -0
  103. package/fixtures/openapi/NetworkRuntimeEnrollmentSecret/valid/pending.json +15 -0
  104. package/fixtures/openapi/NetworkSession/invalid/unknown-status.json +14 -0
  105. package/fixtures/openapi/NetworkSession/valid/restricted-vpn-ztna.json +16 -0
  106. package/fixtures/openapi/NetworkSessionActionExecuteInput/invalid/short-hash.json +6 -0
  107. package/fixtures/openapi/NetworkSessionActionExecuteInput/valid/restrict.json +6 -0
  108. package/fixtures/openapi/NetworkSessionActionInput/invalid/unknown-action.json +5 -0
  109. package/fixtures/openapi/NetworkSessionActionInput/valid/restrict.json +5 -0
  110. package/fixtures/openapi/NetworkSessionActionPlan/invalid/missing-hash.json +12 -0
  111. package/fixtures/openapi/NetworkSessionActionPlan/valid/fallback-disconnect.json +13 -0
  112. package/fixtures/openapi/NetworkSessionCommand/invalid/unknown-status.json +14 -0
  113. package/fixtures/openapi/NetworkSessionCommand/valid/pending.json +14 -0
  114. package/fixtures/openapi/NetworkSiteInput/invalid/unknown-status.json +4 -0
  115. package/fixtures/openapi/NetworkSiteInput/valid/shanghai.json +5 -0
  116. package/fixtures/openapi/NetworkSiteProfileBinding/invalid/vlan.json +9 -0
  117. package/fixtures/openapi/NetworkSiteProfileBinding/valid/default.json +10 -0
  118. package/fixtures/openapi/NetworkSiteProfileBindingInput/invalid/timeout.json +7 -0
  119. package/fixtures/openapi/NetworkSiteProfileBindingInput/valid/default.json +7 -0
  120. package/fixtures/openapi/NetworkSpaceInput/invalid/empty-cidrs.json +6 -0
  121. package/fixtures/openapi/NetworkSpaceInput/invalid/malformed-cidr.json +6 -0
  122. package/fixtures/openapi/NetworkSpaceInput/valid/corp.json +6 -0
  123. package/fixtures/openapi/NetworkTelemetrySummary/invalid/raw-destination.json +29 -0
  124. package/fixtures/openapi/NetworkTelemetrySummary/valid/proxy-flow.json +36 -0
  125. package/fixtures/openapi/ResourceLease/invalid/missing-session.json +10 -0
  126. package/fixtures/openapi/ResourceLease/valid/active.json +11 -0
  127. package/gen/go/sohaapi/client.go +1 -1
  128. package/gen/go/sohaapi/types.go +2042 -58
  129. package/gen/ts/sohaapi/index.ts +3160 -0
  130. package/network/README.md +116 -0
  131. package/network/network-ingest-event.schema.json +187 -0
  132. package/network/network-radius-accounting.schema.json +41 -0
  133. package/network/network-runtime-protocol.schema.json +752 -0
  134. package/network/schema.go +26 -0
  135. package/network/schema_test.go +22 -0
  136. package/openapi/soha-api.json +27021 -19780
  137. package/openapi/soha-api.yaml +11422 -8749
  138. package/openapi/spec_generated.go +3 -3
  139. package/package.json +5 -1
package/COMPATIBILITY.md CHANGED
@@ -281,6 +281,52 @@ rename `operationId`, `operationKind`, `runnerId`, `state`, `occurredAt`,
281
281
  `evidence`, `finalState`, or `callback`; must not add new required fields; and
282
282
  must not narrow existing lifecycle state names or final status values.
283
283
 
284
+ ## Network Runtime Protocol
285
+
286
+ `network/network-runtime-protocol.schema.json` owns messages exchanged by
287
+ network-control, endpoint services and network gateways. The contract carries
288
+ runtime identity, configuration and policy versions, bounded lease grants and
289
+ apply/revoke acknowledgements. It must never carry WireGuard private keys,
290
+ RADIUS shared secrets, passwords, EAP private material or mihomo subscription
291
+ credentials.
292
+
293
+ For `0.1.x`, patch releases may add optional fields and new message types with
294
+ strict payload definitions. They must not remove or rename `schemaVersion`,
295
+ `messageId`, `messageType`, `producerId`, `runtimeId`, `runtimeKind`,
296
+ `occurredAt`, `expiresAt` or `payload`; must not remove existing message,
297
+ runtime-kind, access-profile or status enum values; and must not loosen unknown
298
+ field rejection. Existing lease identity, subject/device binding, policy
299
+ version and expiry fields must remain required.
300
+
301
+ NAS authorization and session control use the same versioned envelope. Their
302
+ payloads contain only Soha identity references, bounded standard RADIUS
303
+ attributes and command acknowledgements. Public management bindings map a NAS
304
+ to one registered runtime/site and an access profile to site enforcement
305
+ attributes; neither contract may add RADIUS shared secrets or authentication
306
+ credential material.
307
+
308
+ WireGuard enrollment carries only a public key. VPN connection authorization
309
+ creates a session-scoped NetworkLease; desired configuration may add a strict
310
+ WireGuard block with overlay addresses, peers, split routes and default-deny
311
+ firewall rules. Private keys never cross this contract. Existing consumers
312
+ must ignore no fields because runtime messages remain closed; therefore a
313
+ consumer advertises `wireguard` only after it supports the full block and its
314
+ configuration version/readback semantics.
315
+
316
+ ## Network Ingest Event
317
+
318
+ `network/network-ingest-event.schema.json` owns bounded, replayable telemetry
319
+ batches sent to `/api/ingest/v1/**`. Heartbeat, RADIUS Accounting, flow
320
+ aggregate and connection summary payloads remain typed and cannot be treated
321
+ as authorization state.
322
+
323
+ For `0.1.x`, patch releases may add optional fields, producer kinds and event
324
+ types with strict payload definitions. They must not remove or rename
325
+ `schemaVersion`, `batchId`, `producerId`, `producerKind`, `sentAt`, `events`,
326
+ event `id`, `type`, `sequence`, `occurredAt` or `payload`; must not remove
327
+ existing enum values; must not raise the 1,000-event batch maximum without a
328
+ resource-limit review; and must not introduce an open provider payload object.
329
+
284
330
  ## Permission Catalog
285
331
 
286
332
  `auth/permission-catalog.json` owns grantable OpenSoha resource/action keys,
package/README.md CHANGED
@@ -32,6 +32,8 @@ auth/token-claims.schema.json Token/JWT claims contract
32
32
  auth/permission-catalog.json Canonical resource/action permission catalog
33
33
  auth/permission-catalog.schema.json Permission definition and migration metadata
34
34
  connectors/connector-event-envelope.schema.json Connector runtime event batch envelope
35
+ network/network-runtime-protocol.schema.json Network control/runtime message contract
36
+ network/network-ingest-event.schema.json Bounded heartbeat, Accounting and flow event batches
35
37
  gen/go/sohaapi Go SDK types for stable cross-repo contracts
36
38
  gen/ts/sohaapi TypeScript SDK types for stable Web contracts
37
39
  ```
@@ -147,6 +149,12 @@ failure.
147
149
 
148
150
  ## Consumer Matrix
149
151
 
152
+ Network runtime schemas and network-access DTOs require `0.1.17` or later;
153
+ they are absent from npm `0.1.16` and Go `v0.1.15`. For unpublished changes,
154
+ use the local consumer matrix below: it packs this checkout for Web and
155
+ supplies an isolated Go workspace. After publishing, update consumer versions
156
+ and lockfiles and verify them without the local override.
157
+
150
158
  The cross-repository consumer gate is:
151
159
 
152
160
  ```sh
@@ -163,9 +171,10 @@ npm run check:consumers -- --consumer soha-cli --require-all
163
171
  npm run check:consumers -- --consumer soha-agent --require-all
164
172
  ```
165
173
 
166
- Go consumers run in a temporary `go.work` that includes this checkout, so
167
- changes are tested against the local contracts module. `soha-web` runs
168
- `npm ci` and `npm run build` against its `file:../soha-contracts` dependency.
174
+ Go consumers run in a temporary `go.work` that replaces the contracts module
175
+ with this checkout. `soha-web` runs `npm ci`, installs a packed copy of this
176
+ checkout without changing its dependency manifest or lockfile, and builds
177
+ against that package.
169
178
 
170
179
  Use `--dry-run` to inspect the discovered commands without executing consumer
171
180
  builds.
@@ -6,8 +6,8 @@ import _ "embed"
6
6
 
7
7
  const (
8
8
  PermissionCatalogVersion = "2.0.0"
9
- PermissionCatalogContentSHA256 = "5aa6fa361c2ab8d987415fb1eb93218510deb9359a68212dfe86655dbfaeea5e"
10
- PermissionCatalogSHA256 = "01c80a71427e3d7f4898212fb1667405c27f1b798318d9eac86ece8262cd188c"
9
+ PermissionCatalogContentSHA256 = "f744896d362070a1e7cdc1eda89c046bee8132f37c6f323dafdd05644e2dbd3c"
10
+ PermissionCatalogSHA256 = "354ad414691ff0578d805036bbbe80da28d242d0bbabe4699e490af1b6bd87bb"
11
11
  )
12
12
 
13
13
  //go:embed permission-catalog.json
@@ -52,6 +52,38 @@ func TestPermissionCatalogIncludesVirtualizationStorageView(t *testing.T) {
52
52
  t.Fatal("virtualization.storage.view is missing")
53
53
  }
54
54
 
55
+ func TestPermissionCatalogIncludesDeliveryEnvironmentApproval(t *testing.T) {
56
+ var catalog struct {
57
+ Permissions []struct {
58
+ Key string `json:"key"`
59
+ Domain string `json:"domain"`
60
+ Resource string `json:"resource"`
61
+ Action string `json:"action"`
62
+ RiskLevel string `json:"riskLevel"`
63
+ ScopeKinds []string `json:"scopeKinds"`
64
+ ApprovalPolicy string `json:"approvalPolicy"`
65
+ Status string `json:"status"`
66
+ Assignable bool `json:"assignable"`
67
+ } `json:"permissions"`
68
+ }
69
+ if err := json.Unmarshal(PermissionCatalogJSON(), &catalog); err != nil {
70
+ t.Fatalf("decode permission catalog: %v", err)
71
+ }
72
+ for _, permission := range catalog.Permissions {
73
+ if permission.Key != "delivery.application-environments.approve" {
74
+ continue
75
+ }
76
+ if permission.Domain != "delivery" || permission.Resource != "application-environments" || permission.Action != "approve" ||
77
+ permission.RiskLevel != "high" || permission.ApprovalPolicy != "eligible" || permission.Status != "active" ||
78
+ !permission.Assignable || len(permission.ScopeKinds) != 3 || permission.ScopeKinds[0] != "workspace" ||
79
+ permission.ScopeKinds[1] != "project" || permission.ScopeKinds[2] != "resource" {
80
+ t.Fatalf("unexpected delivery environment approval permission: %#v", permission)
81
+ }
82
+ return
83
+ }
84
+ t.Fatal("delivery.application-environments.approve is missing")
85
+ }
86
+
55
87
  func TestPermissionCatalogIncludesIndependentResourceCreationEntry(t *testing.T) {
56
88
  var catalog struct {
57
89
  Permissions []struct {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "authorization.opensoha.io/v1",
3
3
  "catalogVersion": "2.0.0",
4
- "contentHash": "sha256:5aa6fa361c2ab8d987415fb1eb93218510deb9359a68212dfe86655dbfaeea5e",
4
+ "contentHash": "sha256:f744896d362070a1e7cdc1eda89c046bee8132f37c6f323dafdd05644e2dbd3c",
5
5
  "permissions": [
6
6
  {
7
7
  "key": "access.directory.create",
@@ -2468,6 +2468,22 @@
2468
2468
  "status": "active",
2469
2469
  "assignable": true
2470
2470
  },
2471
+ {
2472
+ "key": "delivery.application-environments.approve",
2473
+ "domain": "delivery",
2474
+ "resource": "application-environments",
2475
+ "action": "approve",
2476
+ "displayName": "审批应用环境发布",
2477
+ "riskLevel": "high",
2478
+ "scopeKinds": [
2479
+ "workspace",
2480
+ "project",
2481
+ "resource"
2482
+ ],
2483
+ "approvalPolicy": "eligible",
2484
+ "status": "active",
2485
+ "assignable": true
2486
+ },
2471
2487
  {
2472
2488
  "key": "delivery.application-environments.create",
2473
2489
  "domain": "delivery",
@@ -4502,6 +4518,518 @@
4502
4518
  "status": "active",
4503
4519
  "assignable": true
4504
4520
  },
4521
+ {
4522
+ "key": "network_access.access_grants.create",
4523
+ "domain": "network_access",
4524
+ "resource": "access_grants",
4525
+ "action": "create",
4526
+ "displayName": "申请受保护网络资源访问",
4527
+ "riskLevel": "high",
4528
+ "scopeKinds": [
4529
+ "tenant",
4530
+ "workspace",
4531
+ "resource"
4532
+ ],
4533
+ "approvalPolicy": "eligible",
4534
+ "status": "active",
4535
+ "assignable": true
4536
+ },
4537
+ {
4538
+ "key": "network_access.access_grants.revoke",
4539
+ "domain": "network_access",
4540
+ "resource": "access_grants",
4541
+ "action": "revoke",
4542
+ "displayName": "撤销受保护网络资源访问凭证",
4543
+ "riskLevel": "high",
4544
+ "scopeKinds": [
4545
+ "tenant",
4546
+ "workspace",
4547
+ "resource"
4548
+ ],
4549
+ "approvalPolicy": "eligible",
4550
+ "status": "active",
4551
+ "assignable": true
4552
+ },
4553
+ {
4554
+ "key": "network_access.access_grants.view",
4555
+ "domain": "network_access",
4556
+ "resource": "access_grants",
4557
+ "action": "view",
4558
+ "displayName": "查看受保护网络资源访问凭证",
4559
+ "riskLevel": "read",
4560
+ "scopeKinds": [
4561
+ "tenant",
4562
+ "workspace",
4563
+ "resource"
4564
+ ],
4565
+ "approvalPolicy": "never",
4566
+ "status": "active",
4567
+ "assignable": true
4568
+ },
4569
+ {
4570
+ "key": "network_access.endpoint_devices.update",
4571
+ "domain": "network_access",
4572
+ "resource": "endpoint_devices",
4573
+ "action": "update",
4574
+ "displayName": "修改网络接入设备",
4575
+ "riskLevel": "mutate",
4576
+ "scopeKinds": [
4577
+ "tenant",
4578
+ "workspace",
4579
+ "resource"
4580
+ ],
4581
+ "approvalPolicy": "never",
4582
+ "status": "active",
4583
+ "assignable": true
4584
+ },
4585
+ {
4586
+ "key": "network_access.endpoint_devices.view",
4587
+ "domain": "network_access",
4588
+ "resource": "endpoint_devices",
4589
+ "action": "view",
4590
+ "displayName": "查看网络接入设备",
4591
+ "riskLevel": "read",
4592
+ "scopeKinds": [
4593
+ "tenant",
4594
+ "workspace",
4595
+ "resource"
4596
+ ],
4597
+ "approvalPolicy": "never",
4598
+ "status": "active",
4599
+ "assignable": true
4600
+ },
4601
+ {
4602
+ "key": "network_access.enrollments.create",
4603
+ "domain": "network_access",
4604
+ "resource": "enrollments",
4605
+ "action": "create",
4606
+ "displayName": "创建网络运行时注册令牌",
4607
+ "riskLevel": "high",
4608
+ "scopeKinds": [
4609
+ "tenant",
4610
+ "workspace",
4611
+ "resource"
4612
+ ],
4613
+ "approvalPolicy": "eligible",
4614
+ "status": "active",
4615
+ "assignable": true
4616
+ },
4617
+ {
4618
+ "key": "network_access.enrollments.revoke",
4619
+ "domain": "network_access",
4620
+ "resource": "enrollments",
4621
+ "action": "revoke",
4622
+ "displayName": "撤销网络运行时注册",
4623
+ "riskLevel": "high",
4624
+ "scopeKinds": [
4625
+ "tenant",
4626
+ "workspace",
4627
+ "resource"
4628
+ ],
4629
+ "approvalPolicy": "eligible",
4630
+ "status": "active",
4631
+ "assignable": true
4632
+ },
4633
+ {
4634
+ "key": "network_access.enrollments.view",
4635
+ "domain": "network_access",
4636
+ "resource": "enrollments",
4637
+ "action": "view",
4638
+ "displayName": "查看网络运行时注册",
4639
+ "riskLevel": "read",
4640
+ "scopeKinds": [
4641
+ "tenant",
4642
+ "workspace",
4643
+ "resource"
4644
+ ],
4645
+ "approvalPolicy": "never",
4646
+ "status": "active",
4647
+ "assignable": true
4648
+ },
4649
+ {
4650
+ "key": "network_access.gateways.create",
4651
+ "domain": "network_access",
4652
+ "resource": "gateways",
4653
+ "action": "create",
4654
+ "displayName": "创建网络接入网关",
4655
+ "riskLevel": "high",
4656
+ "scopeKinds": [
4657
+ "tenant",
4658
+ "workspace",
4659
+ "resource"
4660
+ ],
4661
+ "approvalPolicy": "eligible",
4662
+ "status": "active",
4663
+ "assignable": true
4664
+ },
4665
+ {
4666
+ "key": "network_access.gateways.update",
4667
+ "domain": "network_access",
4668
+ "resource": "gateways",
4669
+ "action": "update",
4670
+ "displayName": "更新网络接入网关",
4671
+ "riskLevel": "high",
4672
+ "scopeKinds": [
4673
+ "tenant",
4674
+ "workspace",
4675
+ "resource"
4676
+ ],
4677
+ "approvalPolicy": "eligible",
4678
+ "status": "active",
4679
+ "assignable": true
4680
+ },
4681
+ {
4682
+ "key": "network_access.gateways.view",
4683
+ "domain": "network_access",
4684
+ "resource": "gateways",
4685
+ "action": "view",
4686
+ "displayName": "查看网络接入网关",
4687
+ "riskLevel": "read",
4688
+ "scopeKinds": [
4689
+ "tenant",
4690
+ "workspace",
4691
+ "resource"
4692
+ ],
4693
+ "approvalPolicy": "never",
4694
+ "status": "active",
4695
+ "assignable": true
4696
+ },
4697
+ {
4698
+ "key": "network_access.mihomo_profiles.create",
4699
+ "domain": "network_access",
4700
+ "resource": "mihomo_profiles",
4701
+ "action": "create",
4702
+ "displayName": "创建 mihomo 代理配置",
4703
+ "riskLevel": "high",
4704
+ "scopeKinds": [
4705
+ "tenant",
4706
+ "workspace",
4707
+ "resource"
4708
+ ],
4709
+ "approvalPolicy": "eligible",
4710
+ "status": "active",
4711
+ "assignable": true
4712
+ },
4713
+ {
4714
+ "key": "network_access.mihomo_profiles.delete",
4715
+ "domain": "network_access",
4716
+ "resource": "mihomo_profiles",
4717
+ "action": "delete",
4718
+ "displayName": "删除 mihomo 代理配置",
4719
+ "riskLevel": "high",
4720
+ "scopeKinds": [
4721
+ "tenant",
4722
+ "workspace",
4723
+ "resource"
4724
+ ],
4725
+ "approvalPolicy": "eligible",
4726
+ "status": "active",
4727
+ "assignable": true
4728
+ },
4729
+ {
4730
+ "key": "network_access.mihomo_profiles.update",
4731
+ "domain": "network_access",
4732
+ "resource": "mihomo_profiles",
4733
+ "action": "update",
4734
+ "displayName": "更新 mihomo 代理配置",
4735
+ "riskLevel": "high",
4736
+ "scopeKinds": [
4737
+ "tenant",
4738
+ "workspace",
4739
+ "resource"
4740
+ ],
4741
+ "approvalPolicy": "eligible",
4742
+ "status": "active",
4743
+ "assignable": true
4744
+ },
4745
+ {
4746
+ "key": "network_access.mihomo_profiles.view",
4747
+ "domain": "network_access",
4748
+ "resource": "mihomo_profiles",
4749
+ "action": "view",
4750
+ "displayName": "查看 mihomo 代理配置",
4751
+ "riskLevel": "read",
4752
+ "scopeKinds": [
4753
+ "tenant",
4754
+ "workspace",
4755
+ "resource"
4756
+ ],
4757
+ "approvalPolicy": "never",
4758
+ "status": "active",
4759
+ "assignable": true
4760
+ },
4761
+ {
4762
+ "key": "network_access.policy.create",
4763
+ "domain": "network_access",
4764
+ "resource": "policy",
4765
+ "action": "create",
4766
+ "displayName": "创建网络访问策略",
4767
+ "riskLevel": "mutate",
4768
+ "scopeKinds": [
4769
+ "tenant",
4770
+ "workspace",
4771
+ "resource"
4772
+ ],
4773
+ "approvalPolicy": "never",
4774
+ "status": "active",
4775
+ "assignable": true
4776
+ },
4777
+ {
4778
+ "key": "network_access.policy.delete",
4779
+ "domain": "network_access",
4780
+ "resource": "policy",
4781
+ "action": "delete",
4782
+ "displayName": "删除网络访问策略",
4783
+ "riskLevel": "high",
4784
+ "scopeKinds": [
4785
+ "tenant",
4786
+ "workspace",
4787
+ "resource"
4788
+ ],
4789
+ "approvalPolicy": "eligible",
4790
+ "status": "active",
4791
+ "assignable": true
4792
+ },
4793
+ {
4794
+ "key": "network_access.policy.update",
4795
+ "domain": "network_access",
4796
+ "resource": "policy",
4797
+ "action": "update",
4798
+ "displayName": "修改和发布网络访问策略",
4799
+ "riskLevel": "mutate",
4800
+ "scopeKinds": [
4801
+ "tenant",
4802
+ "workspace",
4803
+ "resource"
4804
+ ],
4805
+ "approvalPolicy": "never",
4806
+ "status": "active",
4807
+ "assignable": true
4808
+ },
4809
+ {
4810
+ "key": "network_access.policy.view",
4811
+ "domain": "network_access",
4812
+ "resource": "policy",
4813
+ "action": "view",
4814
+ "displayName": "查看和预演网络访问策略",
4815
+ "riskLevel": "read",
4816
+ "scopeKinds": [
4817
+ "tenant",
4818
+ "workspace",
4819
+ "resource"
4820
+ ],
4821
+ "approvalPolicy": "never",
4822
+ "status": "active",
4823
+ "assignable": true
4824
+ },
4825
+ {
4826
+ "key": "network_access.resources.create",
4827
+ "domain": "network_access",
4828
+ "resource": "resources",
4829
+ "action": "create",
4830
+ "displayName": "创建网络资源",
4831
+ "riskLevel": "mutate",
4832
+ "scopeKinds": [
4833
+ "tenant",
4834
+ "workspace",
4835
+ "resource"
4836
+ ],
4837
+ "approvalPolicy": "never",
4838
+ "status": "active",
4839
+ "assignable": true
4840
+ },
4841
+ {
4842
+ "key": "network_access.resources.delete",
4843
+ "domain": "network_access",
4844
+ "resource": "resources",
4845
+ "action": "delete",
4846
+ "displayName": "删除网络资源",
4847
+ "riskLevel": "mutate",
4848
+ "scopeKinds": [
4849
+ "tenant",
4850
+ "workspace",
4851
+ "resource"
4852
+ ],
4853
+ "approvalPolicy": "never",
4854
+ "status": "active",
4855
+ "assignable": true
4856
+ },
4857
+ {
4858
+ "key": "network_access.resources.update",
4859
+ "domain": "network_access",
4860
+ "resource": "resources",
4861
+ "action": "update",
4862
+ "displayName": "修改网络资源",
4863
+ "riskLevel": "mutate",
4864
+ "scopeKinds": [
4865
+ "tenant",
4866
+ "workspace",
4867
+ "resource"
4868
+ ],
4869
+ "approvalPolicy": "never",
4870
+ "status": "active",
4871
+ "assignable": true
4872
+ },
4873
+ {
4874
+ "key": "network_access.resources.view",
4875
+ "domain": "network_access",
4876
+ "resource": "resources",
4877
+ "action": "view",
4878
+ "displayName": "查看网络资源",
4879
+ "riskLevel": "read",
4880
+ "scopeKinds": [
4881
+ "tenant",
4882
+ "workspace",
4883
+ "resource"
4884
+ ],
4885
+ "approvalPolicy": "never",
4886
+ "status": "active",
4887
+ "assignable": true
4888
+ },
4889
+ {
4890
+ "key": "network_access.sites.create",
4891
+ "domain": "network_access",
4892
+ "resource": "sites",
4893
+ "action": "create",
4894
+ "displayName": "创建网络站点",
4895
+ "riskLevel": "mutate",
4896
+ "scopeKinds": [
4897
+ "tenant",
4898
+ "workspace",
4899
+ "resource"
4900
+ ],
4901
+ "approvalPolicy": "never",
4902
+ "status": "active",
4903
+ "assignable": true
4904
+ },
4905
+ {
4906
+ "key": "network_access.sites.delete",
4907
+ "domain": "network_access",
4908
+ "resource": "sites",
4909
+ "action": "delete",
4910
+ "displayName": "删除网络站点",
4911
+ "riskLevel": "mutate",
4912
+ "scopeKinds": [
4913
+ "tenant",
4914
+ "workspace",
4915
+ "resource"
4916
+ ],
4917
+ "approvalPolicy": "never",
4918
+ "status": "active",
4919
+ "assignable": true
4920
+ },
4921
+ {
4922
+ "key": "network_access.sites.update",
4923
+ "domain": "network_access",
4924
+ "resource": "sites",
4925
+ "action": "update",
4926
+ "displayName": "修改网络站点",
4927
+ "riskLevel": "mutate",
4928
+ "scopeKinds": [
4929
+ "tenant",
4930
+ "workspace",
4931
+ "resource"
4932
+ ],
4933
+ "approvalPolicy": "never",
4934
+ "status": "active",
4935
+ "assignable": true
4936
+ },
4937
+ {
4938
+ "key": "network_access.sites.view",
4939
+ "domain": "network_access",
4940
+ "resource": "sites",
4941
+ "action": "view",
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.spaces.create",
4955
+ "domain": "network_access",
4956
+ "resource": "spaces",
4957
+ "action": "create",
4958
+ "displayName": "创建网络空间",
4959
+ "riskLevel": "mutate",
4960
+ "scopeKinds": [
4961
+ "tenant",
4962
+ "workspace",
4963
+ "resource"
4964
+ ],
4965
+ "approvalPolicy": "never",
4966
+ "status": "active",
4967
+ "assignable": true
4968
+ },
4969
+ {
4970
+ "key": "network_access.spaces.delete",
4971
+ "domain": "network_access",
4972
+ "resource": "spaces",
4973
+ "action": "delete",
4974
+ "displayName": "删除网络空间",
4975
+ "riskLevel": "mutate",
4976
+ "scopeKinds": [
4977
+ "tenant",
4978
+ "workspace",
4979
+ "resource"
4980
+ ],
4981
+ "approvalPolicy": "never",
4982
+ "status": "active",
4983
+ "assignable": true
4984
+ },
4985
+ {
4986
+ "key": "network_access.spaces.update",
4987
+ "domain": "network_access",
4988
+ "resource": "spaces",
4989
+ "action": "update",
4990
+ "displayName": "修改网络空间",
4991
+ "riskLevel": "mutate",
4992
+ "scopeKinds": [
4993
+ "tenant",
4994
+ "workspace",
4995
+ "resource"
4996
+ ],
4997
+ "approvalPolicy": "never",
4998
+ "status": "active",
4999
+ "assignable": true
5000
+ },
5001
+ {
5002
+ "key": "network_access.spaces.view",
5003
+ "domain": "network_access",
5004
+ "resource": "spaces",
5005
+ "action": "view",
5006
+ "displayName": "查看网络空间",
5007
+ "riskLevel": "read",
5008
+ "scopeKinds": [
5009
+ "tenant",
5010
+ "workspace",
5011
+ "resource"
5012
+ ],
5013
+ "approvalPolicy": "never",
5014
+ "status": "active",
5015
+ "assignable": true
5016
+ },
5017
+ {
5018
+ "key": "network_access.telemetry.view",
5019
+ "domain": "network_access",
5020
+ "resource": "telemetry",
5021
+ "action": "view",
5022
+ "displayName": "查看网络遥测汇总",
5023
+ "riskLevel": "read",
5024
+ "scopeKinds": [
5025
+ "tenant",
5026
+ "workspace",
5027
+ "resource"
5028
+ ],
5029
+ "approvalPolicy": "never",
5030
+ "status": "active",
5031
+ "assignable": true
5032
+ },
4505
5033
  {
4506
5034
  "key": "observe.ai.chat",
4507
5035
  "domain": "observe",