@opensoha/contracts 0.1.20 → 0.1.21

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 (32) hide show
  1. package/auth/catalog_generated.go +2 -2
  2. package/auth/permission-catalog.json +81 -1
  3. package/compat/json-schema-ecosystem-0.1.0.json +1 -1
  4. package/compat/openapi-loose-boundaries-0.1.0.json +1 -1
  5. package/fixtures/json-schema/network-ingest-event/invalid/proxy-runtime-negative-total.json +19 -0
  6. package/fixtures/json-schema/network-ingest-event/valid/proxy-runtime-sample.json +20 -0
  7. package/fixtures/json-schema/proxy-runtime/invalid/v2ray-connection-snapshot.json +10 -0
  8. package/fixtures/json-schema/proxy-runtime/valid/mihomo-observation.json +16 -0
  9. package/fixtures/openapi/KubernetesCustomResourceDefinition/invalid/empty-uid.json +1 -0
  10. package/fixtures/openapi/KubernetesCustomResourceDefinition/valid/deleting-definition.json +1 -0
  11. package/fixtures/openapi/KubernetesResourceUpdatePlanRequest/valid/range-kind.json +5 -0
  12. package/fixtures/openapi/KubernetesResourceYaml/valid/range-kind.json +5 -0
  13. package/fixtures/openapi/NetworkProxyConfigurationInput/invalid/empty-content.json +1 -0
  14. package/fixtures/openapi/NetworkProxyConfigurationInput/valid/enabled.json +1 -0
  15. package/fixtures/openapi/NetworkProxyInstanceInput/invalid/unknown-engine.json +1 -0
  16. package/fixtures/openapi/NetworkProxyInstanceInput/valid/mihomo.json +1 -0
  17. package/gen/go/sohaapi/client.go +1 -1
  18. package/gen/go/sohaapi/client_test.go +25 -0
  19. package/gen/go/sohaapi/types.go +40 -11
  20. package/gen/ts/sohaapi/index.ts +264 -156
  21. package/go.mod +4 -4
  22. package/go.sum +4 -4
  23. package/network/README.md +12 -0
  24. package/network/network-ingest-event.schema.json +21 -3
  25. package/network/network-runtime-protocol.schema.json +2 -2
  26. package/network/proxy-runtime.schema.json +113 -0
  27. package/network/schema.go +7 -0
  28. package/openapi/soha-api.json +412 -4
  29. package/openapi/soha-api.yaml +381 -251
  30. package/openapi/spec_generated.go +3 -3
  31. package/package.json +2 -1
  32. package/resource/models.go +2 -0
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "producerId": { "$ref": "#/$defs/Identifier" },
44
44
  "runtimeId": { "$ref": "#/$defs/Identifier" },
45
- "runtimeKind": { "enum": ["endpoint", "gateway", "nas"] },
45
+ "runtimeKind": { "enum": ["endpoint", "gateway", "nas", "proxy"] },
46
46
  "occurredAt": { "type": "string", "format": "date-time" },
47
47
  "expiresAt": { "type": "string", "format": "date-time" },
48
48
  "payload": {
@@ -712,7 +712,7 @@
712
712
  "minItems": 1,
713
713
  "maxItems": 32,
714
714
  "uniqueItems": true,
715
- "items": { "enum": ["wireguard", "mihomo", "route-coordinator", "dns-coordinator", "managed-vpn-v1", "vpn-probe-v1", "vpn-metrics-v1"] }
715
+ "items": { "enum": ["wireguard", "mihomo", "route-coordinator", "dns-coordinator", "managed-vpn-v1", "vpn-probe-v1", "vpn-metrics-v1", "proxy-runtime-v1"] }
716
716
  }
717
717
  },
718
718
  "allOf": [{
@@ -0,0 +1,113 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://contracts.opensoha.dev/network/proxy-runtime.schema.json",
4
+ "title": "OpenSoha Proxy Runtime Message",
5
+ "description": "Messages on the authenticated proxy runtime channel. Configuration content is delivered only to the enrolled runtime and is never returned by management reads.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schemaVersion", "runtimeId", "messageType", "occurredAt", "payload"],
9
+ "properties": {
10
+ "schemaVersion": { "const": "proxy-runtime/v1alpha1" },
11
+ "runtimeId": { "$ref": "#/$defs/Identifier" },
12
+ "messageType": { "enum": ["configuration.desired", "configuration.applied", "observation", "connections.snapshot", "connection.close.request", "connection.close.result"] },
13
+ "occurredAt": { "type": "string", "format": "date-time" },
14
+ "payload": {
15
+ "oneOf": [
16
+ { "$ref": "#/$defs/ConfigurationDesired" },
17
+ { "$ref": "#/$defs/ConfigurationApplied" },
18
+ { "$ref": "#/$defs/Observation" },
19
+ { "$ref": "#/$defs/ConnectionsSnapshot" },
20
+ { "$ref": "#/$defs/ConnectionCloseRequest" },
21
+ { "$ref": "#/$defs/ConnectionCloseResult" }
22
+ ]
23
+ }
24
+ },
25
+ "allOf": [
26
+ { "if": { "properties": { "messageType": { "const": "configuration.desired" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/ConfigurationDesired" } } } },
27
+ { "if": { "properties": { "messageType": { "const": "configuration.applied" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/ConfigurationApplied" } } } },
28
+ { "if": { "properties": { "messageType": { "const": "observation" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/Observation" } } } },
29
+ { "if": { "properties": { "messageType": { "const": "connections.snapshot" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/ConnectionsSnapshot" } } } },
30
+ { "if": { "properties": { "messageType": { "const": "connection.close.request" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/ConnectionCloseRequest" } } } },
31
+ { "if": { "properties": { "messageType": { "const": "connection.close.result" } }, "required": ["messageType"] }, "then": { "properties": { "payload": { "$ref": "#/$defs/ConnectionCloseResult" } } } }
32
+ ],
33
+ "$defs": {
34
+ "Identifier": { "type": "string", "minLength": 1, "maxLength": 128, "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$" },
35
+ "Engine": { "enum": ["mihomo", "sing-box", "v2ray"] },
36
+ "Hash": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
37
+ "ConfigurationDesired": {
38
+ "type": "object", "additionalProperties": false,
39
+ "required": ["revision", "engine", "enabled", "contentHash", "content", "validUntil"],
40
+ "properties": {
41
+ "revision": { "type": "integer", "minimum": 1 },
42
+ "engine": { "$ref": "#/$defs/Engine" },
43
+ "enabled": { "type": "boolean" },
44
+ "contentHash": { "$ref": "#/$defs/Hash" },
45
+ "content": { "type": "string", "minLength": 1, "maxLength": 1048576, "writeOnly": true },
46
+ "validUntil": { "type": "string", "format": "date-time" }
47
+ }
48
+ },
49
+ "ConfigurationApplied": {
50
+ "type": "object", "additionalProperties": false,
51
+ "required": ["revision", "status", "readbackHash"],
52
+ "properties": {
53
+ "revision": { "type": "integer", "minimum": 1 },
54
+ "status": { "enum": ["applied", "rejected", "rolled-back"] },
55
+ "readbackHash": { "$ref": "#/$defs/Hash" },
56
+ "reasonCode": { "type": "string", "minLength": 1, "maxLength": 128 }
57
+ }
58
+ },
59
+ "Observation": {
60
+ "type": "object", "additionalProperties": false,
61
+ "required": ["engine", "engineVersion", "health", "capabilities", "uptimeSeconds", "uploadTotal", "downloadTotal"],
62
+ "properties": {
63
+ "engine": { "$ref": "#/$defs/Engine" },
64
+ "engineVersion": { "type": "string", "minLength": 1, "maxLength": 64 },
65
+ "health": { "enum": ["healthy", "degraded", "unhealthy"] },
66
+ "capabilities": { "type": "array", "maxItems": 3, "uniqueItems": true, "items": { "enum": ["traffic", "connections", "close_connection"] } },
67
+ "reasonCode": { "type": "string", "minLength": 1, "maxLength": 128 },
68
+ "uptimeSeconds": { "type": "integer", "minimum": 0 },
69
+ "uploadTotal": { "type": "integer", "minimum": 0, "maximum": 9223372036854775807 },
70
+ "downloadTotal": { "type": "integer", "minimum": 0, "maximum": 9223372036854775807 },
71
+ "activeConnections": { "type": "integer", "minimum": 0, "maximum": 1000000 }
72
+ }
73
+ },
74
+ "Connection": {
75
+ "type": "object", "additionalProperties": false,
76
+ "required": ["id", "destination", "network", "uploadBytes", "downloadBytes"],
77
+ "properties": {
78
+ "id": { "$ref": "#/$defs/Identifier" },
79
+ "destination": { "type": "string", "minLength": 1, "maxLength": 253 },
80
+ "network": { "enum": ["tcp", "udp", "other"] },
81
+ "uploadBytes": { "type": "integer", "minimum": 0 },
82
+ "downloadBytes": { "type": "integer", "minimum": 0 },
83
+ "startedAt": { "type": "string", "format": "date-time" }
84
+ }
85
+ },
86
+ "ConnectionsSnapshot": {
87
+ "type": "object", "additionalProperties": false,
88
+ "required": ["engine", "connections"],
89
+ "properties": {
90
+ "engine": { "enum": ["mihomo", "sing-box"] },
91
+ "connections": { "type": "array", "maxItems": 200, "items": { "$ref": "#/$defs/Connection" } }
92
+ }
93
+ },
94
+ "ConnectionCloseRequest": {
95
+ "type": "object", "additionalProperties": false,
96
+ "required": ["commandId", "connectionId", "expiresAt"],
97
+ "properties": {
98
+ "commandId": { "$ref": "#/$defs/Identifier" },
99
+ "connectionId": { "$ref": "#/$defs/Identifier" },
100
+ "expiresAt": { "type": "string", "format": "date-time" }
101
+ }
102
+ },
103
+ "ConnectionCloseResult": {
104
+ "type": "object", "additionalProperties": false,
105
+ "required": ["commandId", "status"],
106
+ "properties": {
107
+ "commandId": { "$ref": "#/$defs/Identifier" },
108
+ "status": { "enum": ["closed", "not-found", "failed"] },
109
+ "reasonCode": { "type": "string", "minLength": 1, "maxLength": 128 }
110
+ }
111
+ }
112
+ }
113
+ }
package/network/schema.go CHANGED
@@ -11,6 +11,9 @@ var (
11
11
 
12
12
  //go:embed network-radius-accounting.schema.json
13
13
  radiusAccountingSchema []byte
14
+
15
+ //go:embed proxy-runtime.schema.json
16
+ proxyRuntimeSchema []byte
14
17
  )
15
18
 
16
19
  func RuntimeProtocolSchema() []byte {
@@ -24,3 +27,7 @@ func IngestEventSchema() []byte {
24
27
  func RadiusAccountingSchema() []byte {
25
28
  return append([]byte(nil), radiusAccountingSchema...)
26
29
  }
30
+
31
+ func ProxyRuntimeSchema() []byte {
32
+ return append([]byte(nil), proxyRuntimeSchema...)
33
+ }
@@ -24933,7 +24933,14 @@
24933
24933
  "update",
24934
24934
  "delete"
24935
24935
  ],
24936
- "type": "string"
24936
+ "type": "string",
24937
+ "x-enum-varnames": [
24938
+ "CustomResourceAccessList",
24939
+ "CustomResourceAccessView",
24940
+ "CustomResourceAccessCreate",
24941
+ "CustomResourceAccessUpdate",
24942
+ "CustomResourceAccessDelete"
24943
+ ]
24937
24944
  },
24938
24945
  "type": "array"
24939
24946
  }
@@ -24972,6 +24979,10 @@
24972
24979
  "createdAt": {
24973
24980
  "type": "string"
24974
24981
  },
24982
+ "deletingAt": {
24983
+ "format": "date-time",
24984
+ "type": "string"
24985
+ },
24975
24986
  "group": {
24976
24987
  "type": "string"
24977
24988
  },
@@ -24987,6 +24998,11 @@
24987
24998
  "scope": {
24988
24999
  "type": "string"
24989
25000
  },
25001
+ "uid": {
25002
+ "maxLength": 128,
25003
+ "minLength": 1,
25004
+ "type": "string"
25005
+ },
24990
25006
  "version": {
24991
25007
  "type": "string"
24992
25008
  },
@@ -41707,6 +41723,173 @@
41707
41723
  ],
41708
41724
  "type": "object"
41709
41725
  },
41726
+ "NetworkProxyCapability": {
41727
+ "enum": [
41728
+ "traffic",
41729
+ "connections",
41730
+ "close_connection"
41731
+ ],
41732
+ "type": "string",
41733
+ "x-enum-varnames": [
41734
+ "NetworkProxyCapabilityTraffic",
41735
+ "NetworkProxyCapabilityConnections",
41736
+ "NetworkProxyCapabilityCloseConnection"
41737
+ ]
41738
+ },
41739
+ "NetworkProxyCloseCommandEnvelope": {
41740
+ "additionalProperties": false,
41741
+ "properties": {
41742
+ "commandId": {
41743
+ "maxLength": 128,
41744
+ "minLength": 1,
41745
+ "type": "string"
41746
+ },
41747
+ "expiresAt": {
41748
+ "format": "date-time",
41749
+ "type": "string"
41750
+ },
41751
+ "status": {
41752
+ "enum": [
41753
+ "pending",
41754
+ "closed",
41755
+ "not-found",
41756
+ "failed",
41757
+ "expired"
41758
+ ],
41759
+ "type": "string"
41760
+ }
41761
+ },
41762
+ "required": [
41763
+ "commandId",
41764
+ "status",
41765
+ "expiresAt"
41766
+ ],
41767
+ "type": "object"
41768
+ },
41769
+ "NetworkProxyConfigurationInput": {
41770
+ "additionalProperties": false,
41771
+ "properties": {
41772
+ "content": {
41773
+ "format": "password",
41774
+ "maxLength": 1048576,
41775
+ "minLength": 1,
41776
+ "type": "string",
41777
+ "writeOnly": true
41778
+ },
41779
+ "enabled": {
41780
+ "type": "boolean"
41781
+ },
41782
+ "expectedRevision": {
41783
+ "format": "int64",
41784
+ "minimum": 0,
41785
+ "type": "integer"
41786
+ }
41787
+ },
41788
+ "required": [
41789
+ "expectedRevision",
41790
+ "enabled",
41791
+ "content"
41792
+ ],
41793
+ "type": "object"
41794
+ },
41795
+ "NetworkProxyConnection": {
41796
+ "additionalProperties": false,
41797
+ "properties": {
41798
+ "destination": {
41799
+ "maxLength": 253,
41800
+ "minLength": 1,
41801
+ "type": "string"
41802
+ },
41803
+ "downloadBytes": {
41804
+ "format": "int64",
41805
+ "minimum": 0,
41806
+ "type": "integer"
41807
+ },
41808
+ "id": {
41809
+ "maxLength": 128,
41810
+ "minLength": 1,
41811
+ "type": "string"
41812
+ },
41813
+ "network": {
41814
+ "enum": [
41815
+ "tcp",
41816
+ "udp",
41817
+ "other"
41818
+ ],
41819
+ "type": "string",
41820
+ "x-enum-varnames": [
41821
+ "NetworkProxyConnectionNetworkTCP",
41822
+ "NetworkProxyConnectionNetworkUDP",
41823
+ "NetworkProxyConnectionNetworkOther"
41824
+ ]
41825
+ },
41826
+ "startedAt": {
41827
+ "format": "date-time",
41828
+ "type": "string"
41829
+ },
41830
+ "uploadBytes": {
41831
+ "format": "int64",
41832
+ "minimum": 0,
41833
+ "type": "integer"
41834
+ }
41835
+ },
41836
+ "required": [
41837
+ "id",
41838
+ "destination",
41839
+ "network",
41840
+ "uploadBytes",
41841
+ "downloadBytes"
41842
+ ],
41843
+ "type": "object"
41844
+ },
41845
+ "NetworkProxyConnectionsEnvelope": {
41846
+ "additionalProperties": false,
41847
+ "properties": {
41848
+ "connections": {
41849
+ "items": {
41850
+ "$ref": "#/components/schemas/NetworkProxyConnection"
41851
+ },
41852
+ "maxItems": 200,
41853
+ "type": "array"
41854
+ },
41855
+ "instanceId": {
41856
+ "maxLength": 128,
41857
+ "minLength": 1,
41858
+ "type": "string"
41859
+ },
41860
+ "observedAt": {
41861
+ "format": "date-time",
41862
+ "type": "string"
41863
+ },
41864
+ "state": {
41865
+ "enum": [
41866
+ "available",
41867
+ "unsupported",
41868
+ "unavailable"
41869
+ ],
41870
+ "type": "string"
41871
+ }
41872
+ },
41873
+ "required": [
41874
+ "instanceId",
41875
+ "state",
41876
+ "connections"
41877
+ ],
41878
+ "type": "object"
41879
+ },
41880
+ "NetworkProxyEngine": {
41881
+ "enum": [
41882
+ "mihomo",
41883
+ "sing-box",
41884
+ "v2ray"
41885
+ ],
41886
+ "type": "string",
41887
+ "x-enum-varnames": [
41888
+ "NetworkProxyEngineMihomo",
41889
+ "NetworkProxyEngineSingBox",
41890
+ "NetworkProxyEngineV2Ray"
41891
+ ]
41892
+ },
41710
41893
  "NetworkProxyFlowSummary": {
41711
41894
  "additionalProperties": false,
41712
41895
  "properties": {
@@ -41770,6 +41953,228 @@
41770
41953
  ],
41771
41954
  "type": "object"
41772
41955
  },
41956
+ "NetworkProxyInstance": {
41957
+ "additionalProperties": false,
41958
+ "properties": {
41959
+ "capabilities": {
41960
+ "items": {
41961
+ "$ref": "#/components/schemas/NetworkProxyCapability"
41962
+ },
41963
+ "maxItems": 3,
41964
+ "type": "array",
41965
+ "uniqueItems": true
41966
+ },
41967
+ "createdAt": {
41968
+ "format": "date-time",
41969
+ "type": "string"
41970
+ },
41971
+ "desiredRevision": {
41972
+ "format": "int64",
41973
+ "minimum": 0,
41974
+ "type": "integer"
41975
+ },
41976
+ "enabled": {
41977
+ "type": "boolean"
41978
+ },
41979
+ "engine": {
41980
+ "$ref": "#/components/schemas/NetworkProxyEngine"
41981
+ },
41982
+ "engineVersion": {
41983
+ "maxLength": 64,
41984
+ "type": "string"
41985
+ },
41986
+ "host": {
41987
+ "maxLength": 128,
41988
+ "type": "string"
41989
+ },
41990
+ "id": {
41991
+ "maxLength": 128,
41992
+ "minLength": 1,
41993
+ "type": "string"
41994
+ },
41995
+ "lastSampleAt": {
41996
+ "format": "date-time",
41997
+ "type": "string"
41998
+ },
41999
+ "lastSeenAt": {
42000
+ "format": "date-time",
42001
+ "type": "string"
42002
+ },
42003
+ "name": {
42004
+ "maxLength": 128,
42005
+ "minLength": 1,
42006
+ "type": "string"
42007
+ },
42008
+ "observedRevision": {
42009
+ "format": "int64",
42010
+ "minimum": 0,
42011
+ "type": "integer"
42012
+ },
42013
+ "reasonCode": {
42014
+ "maxLength": 128,
42015
+ "type": "string"
42016
+ },
42017
+ "status": {
42018
+ "$ref": "#/components/schemas/NetworkProxyInstanceStatus"
42019
+ },
42020
+ "updatedAt": {
42021
+ "format": "date-time",
42022
+ "type": "string"
42023
+ }
42024
+ },
42025
+ "required": [
42026
+ "id",
42027
+ "name",
42028
+ "engine",
42029
+ "enabled",
42030
+ "status",
42031
+ "capabilities",
42032
+ "desiredRevision",
42033
+ "observedRevision",
42034
+ "createdAt",
42035
+ "updatedAt"
42036
+ ],
42037
+ "type": "object"
42038
+ },
42039
+ "NetworkProxyInstanceEnvelope": {
42040
+ "additionalProperties": false,
42041
+ "properties": {
42042
+ "data": {
42043
+ "$ref": "#/components/schemas/NetworkProxyInstance"
42044
+ }
42045
+ },
42046
+ "required": [
42047
+ "data"
42048
+ ],
42049
+ "type": "object"
42050
+ },
42051
+ "NetworkProxyInstanceInput": {
42052
+ "additionalProperties": false,
42053
+ "properties": {
42054
+ "engine": {
42055
+ "$ref": "#/components/schemas/NetworkProxyEngine"
42056
+ },
42057
+ "host": {
42058
+ "maxLength": 128,
42059
+ "type": "string"
42060
+ },
42061
+ "id": {
42062
+ "maxLength": 128,
42063
+ "minLength": 1,
42064
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$",
42065
+ "type": "string"
42066
+ },
42067
+ "name": {
42068
+ "maxLength": 128,
42069
+ "minLength": 1,
42070
+ "type": "string"
42071
+ }
42072
+ },
42073
+ "required": [
42074
+ "id",
42075
+ "name",
42076
+ "engine"
42077
+ ],
42078
+ "type": "object"
42079
+ },
42080
+ "NetworkProxyInstanceListEnvelope": {
42081
+ "additionalProperties": false,
42082
+ "properties": {
42083
+ "items": {
42084
+ "items": {
42085
+ "$ref": "#/components/schemas/NetworkProxyInstance"
42086
+ },
42087
+ "maxItems": 200,
42088
+ "type": "array"
42089
+ }
42090
+ },
42091
+ "required": [
42092
+ "items"
42093
+ ],
42094
+ "type": "object"
42095
+ },
42096
+ "NetworkProxyInstanceStatus": {
42097
+ "enum": [
42098
+ "unregistered",
42099
+ "online",
42100
+ "degraded",
42101
+ "offline",
42102
+ "disabled"
42103
+ ],
42104
+ "type": "string",
42105
+ "x-enum-varnames": [
42106
+ "NetworkProxyInstanceStatusUnregistered",
42107
+ "NetworkProxyInstanceStatusOnline",
42108
+ "NetworkProxyInstanceStatusDegraded",
42109
+ "NetworkProxyInstanceStatusOffline",
42110
+ "NetworkProxyInstanceStatusDisabled"
42111
+ ]
42112
+ },
42113
+ "NetworkProxyTrafficEnvelope": {
42114
+ "additionalProperties": false,
42115
+ "properties": {
42116
+ "instanceId": {
42117
+ "maxLength": 128,
42118
+ "minLength": 1,
42119
+ "type": "string"
42120
+ },
42121
+ "samples": {
42122
+ "items": {
42123
+ "$ref": "#/components/schemas/NetworkProxyTrafficSample"
42124
+ },
42125
+ "maxItems": 1440,
42126
+ "type": "array"
42127
+ },
42128
+ "supported": {
42129
+ "type": "boolean"
42130
+ }
42131
+ },
42132
+ "required": [
42133
+ "instanceId",
42134
+ "supported",
42135
+ "samples"
42136
+ ],
42137
+ "type": "object"
42138
+ },
42139
+ "NetworkProxyTrafficSample": {
42140
+ "additionalProperties": false,
42141
+ "properties": {
42142
+ "activeConnections": {
42143
+ "minimum": 0,
42144
+ "type": "integer"
42145
+ },
42146
+ "downloadBytesPerSecond": {
42147
+ "minimum": 0,
42148
+ "type": "number"
42149
+ },
42150
+ "downloadTotal": {
42151
+ "format": "int64",
42152
+ "minimum": 0,
42153
+ "type": "integer"
42154
+ },
42155
+ "observedAt": {
42156
+ "format": "date-time",
42157
+ "type": "string"
42158
+ },
42159
+ "uploadBytesPerSecond": {
42160
+ "minimum": 0,
42161
+ "type": "number"
42162
+ },
42163
+ "uploadTotal": {
42164
+ "format": "int64",
42165
+ "minimum": 0,
42166
+ "type": "integer"
42167
+ }
42168
+ },
42169
+ "required": [
42170
+ "observedAt",
42171
+ "uploadTotal",
42172
+ "downloadTotal",
42173
+ "uploadBytesPerSecond",
42174
+ "downloadBytesPerSecond"
42175
+ ],
42176
+ "type": "object"
42177
+ },
41773
42178
  "NetworkResource": {
41774
42179
  "additionalProperties": false,
41775
42180
  "properties": {
@@ -42030,6 +42435,7 @@
42030
42435
  },
42031
42436
  "NetworkRuntimeEnrollmentInput": {
42032
42437
  "additionalProperties": false,
42438
+ "description": "For proxy runtimes, runtimeId identifies an existing proxy instance and deviceId and subjectId must equal runtimeId.",
42033
42439
  "properties": {
42034
42440
  "deviceId": {
42035
42441
  "maxLength": 128,
@@ -42129,13 +42535,15 @@
42129
42535
  "enum": [
42130
42536
  "endpoint",
42131
42537
  "gateway",
42132
- "nas"
42538
+ "nas",
42539
+ "proxy"
42133
42540
  ],
42134
42541
  "type": "string",
42135
42542
  "x-enum-varnames": [
42136
42543
  "NetworkRuntimeKindEndpoint",
42137
42544
  "NetworkRuntimeKindGateway",
42138
- "NetworkRuntimeKindNAS"
42545
+ "NetworkRuntimeKindNAS",
42546
+ "NetworkRuntimeKindProxy"
42139
42547
  ]
42140
42548
  },
42141
42549
  "NetworkSession": {
@@ -61322,7 +61730,7 @@
61322
61730
  "info": {
61323
61731
  "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",
61324
61732
  "title": "Soha API",
61325
- "version": "0.1.20"
61733
+ "version": "0.1.21"
61326
61734
  },
61327
61735
  "openapi": "3.1.0",
61328
61736
  "paths": {