@mhome/app-facade-protocol 1.10.0 → 1.10.2

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.
package/README.md CHANGED
@@ -88,3 +88,7 @@ from the Foundation root; omit `--write` to check conformance. Resource paths ar
88
88
  ## Shared messaging codes (1.10)
89
89
 
90
90
  Code creation may omit bot/account and group/surface identifiers. The receiving authenticated provider determines the bot; shared candidates are confirmed in the App. The existing actor link claim status/confirm/event endpoints carry both kinds, distinguished by `kind` (`link` by default, or `bind`). Bind code responses include `challengeId`; completed bind claims omit `linkId`. Private link completes on receipt. A code is single-use within its provider and service deployment, never a cross-provider or cross-Hub credential.
91
+
92
+ ## System inventory
93
+
94
+ The system facade is executed by the local Space Hub, with Cloud relay allowed. All Space members may read it. The Hub reads its Host discovery snapshot and queries LAN Host info, service inventory and metrics. Host does not aggregate remote machines. Instances are derived exclusively from the authenticated tenant/Space commissioned records; disconnected does not mean unloaded. Client sessions use a separate endpoint. No remote Space lifecycle queries or graph coordinates are part of this contract. Legacy topology is deprecated; consumers migrate to system inventory.
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.v1",
3
- "contractVersion": "1.10.0",
3
+ "contractVersion": "1.10.2",
4
4
  "callSchema": "schema/facade-call.v1.schema.json",
5
5
  "routing": "manifest/routing.v1.json",
6
6
  "routingSchema": "schema/routing.v1.schema.json",
7
7
  "domains": {
8
8
  "artifact": {
9
9
  "contract": "mhome.artifact.v1",
10
- "requestTargets": ["/app/artifact/resolve"]
10
+ "requestTargets": [
11
+ "/app/artifact/resolve"
12
+ ]
11
13
  },
12
14
  "hub": {
13
15
  "targets": "manifest/hub-targets.v1.json",
@@ -33,26 +35,31 @@
33
35
  "/app/plugin/remove",
34
36
  "/app/plugin/profile/update"
35
37
  ],
36
- "eventTargets": ["/app/plugin/settings/changed"],
38
+ "eventTargets": [
39
+ "/app/plugin/settings/changed"
40
+ ],
37
41
  "extensionFamily": "/app/plugin/{nodeType}/{route...}",
38
42
  "extensionPriority": "after_exact"
39
43
  },
40
44
  "runtime": {
41
45
  "contract": "mhome.runtime.status.v1",
42
- "resourceTypes": ["nodeInstance", "nodeRuntime"],
43
- "requestTargets": ["/app/runtime/status/list"],
44
- "eventTargets": ["/app/runtime/status/changed"]
45
- },
46
- "topology": {
47
- "contract": "mhome.space.topology.v1",
48
- "schema": "schema/topology.v1.schema.json",
49
- "requestTargets": ["/app/topology/get"],
50
- "eventTargets": ["/app/topology/changed"]
46
+ "resourceTypes": [
47
+ "nodeInstance",
48
+ "nodeRuntime"
49
+ ],
50
+ "requestTargets": [
51
+ "/app/runtime/status/list"
52
+ ],
53
+ "eventTargets": [
54
+ "/app/runtime/status/changed"
55
+ ]
51
56
  },
52
57
  "deviceTopology": {
53
58
  "contract": "mhome.device.topology.v1",
54
59
  "schema": "schema/device-topology.v1.schema.json",
55
- "requestTargets": ["/app/device/topology/get"],
60
+ "requestTargets": [
61
+ "/app/device/topology/get"
62
+ ],
56
63
  "eventTargets": []
57
64
  },
58
65
  "interactionFlow": {
@@ -66,6 +73,20 @@
66
73
  "/app/interaction-flow/cancel"
67
74
  ],
68
75
  "sessionPersistence": "memory"
76
+ },
77
+ "system": {
78
+ "contract": "mhome.system.inventory.v1",
79
+ "schema": "schema/system-inventory.v1.schema.json",
80
+ "requestTargets": [
81
+ "/app/system/inventory/get",
82
+ "/app/system/clients/get",
83
+ "/app/system/host/metrics/get",
84
+ "/app/system/host/inspect",
85
+ "/app/system/host/plan",
86
+ "/app/system/host/start",
87
+ "/app/system/host/operation/get",
88
+ "/app/system/host/restart"
89
+ ]
69
90
  }
70
91
  }
71
92
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.app-facade.routing.v1",
3
- "contractVersion": "1.10.0",
3
+ "contractVersion": "1.10.2",
4
4
  "targetPrefix": "/app/",
5
5
  "default": {
6
6
  "execution": "scopeMode",
@@ -32,7 +32,9 @@
32
32
  "/app/interaction-flow/",
33
33
  "/app/object-storage/",
34
34
  "/app/runtime/",
35
- "/app/topology/"
35
+ "/app/system/inventory/",
36
+ "/app/system/clients/",
37
+ "/app/system/host/"
36
38
  ],
37
39
  "requestPlacementPrefixes": [
38
40
  "/app/messaging/"
@@ -47,7 +49,14 @@
47
49
  "/app/object-storage/folders/update",
48
50
  "/app/object-storage/folders/list",
49
51
  "/app/object-storage/settings/update",
50
- "/app/topology/get"
52
+ "/app/system/inventory/get",
53
+ "/app/system/clients/get",
54
+ "/app/system/host/metrics/get",
55
+ "/app/system/host/inspect",
56
+ "/app/system/host/plan",
57
+ "/app/system/host/start",
58
+ "/app/system/host/operation/get",
59
+ "/app/system/host/restart"
51
60
  ]
52
61
  }
53
62
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest": "mhome.messaging.targets.v1",
3
- "contractVersion": "1.10.0",
3
+ "contractVersion": "1.10.2",
4
4
  "requestTargets": [
5
5
  "/app/messaging/provider/list",
6
6
  "/app/messaging/provider-account/list",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhome/app-facade-protocol",
3
- "version": "1.10.0",
3
+ "version": "1.10.2",
4
4
  "description": "Build-time protocol artifacts for mhome.app-facade",
5
5
  "license": "MIT",
6
6
  "repository": {
package/protocol.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "protocol": "mhome.app-facade",
3
- "contractVersion": "1.10.0",
3
+ "contractVersion": "1.10.2",
4
4
  "manifest": "manifest/app-facade.v1.json",
5
5
  "schemas": {
6
6
  "call": "schema/facade-call.v1.schema.json",
@@ -9,6 +9,9 @@
9
9
  "routing": "schema/routing.v1.schema.json",
10
10
  "hubState": "schema/hub-state.v1.schema.json",
11
11
  "localHubState": "schema/local-hub-state.v1.schema.json",
12
+ "systemClients": "schema/system-clients.v1.schema.json",
13
+ "systemMetrics": "schema/system-metrics.v1.schema.json",
14
+ "systemInventory": "schema/system-inventory.v1.schema.json",
12
15
  "topology": "schema/topology.v1.schema.json",
13
16
  "deviceTopology": "schema/device-topology.v1.schema.json"
14
17
  },
@@ -0,0 +1,67 @@
1
+ {
2
+ "type": "object",
3
+ "additionalProperties": false,
4
+ "required": [
5
+ "contract",
6
+ "scopeId",
7
+ "observedAtMs",
8
+ "sessions"
9
+ ],
10
+ "properties": {
11
+ "contract": {
12
+ "const": "mhome.system.clients.v1"
13
+ },
14
+ "scopeId": {
15
+ "type": "string"
16
+ },
17
+ "observedAtMs": {
18
+ "type": "integer",
19
+ "minimum": 0
20
+ },
21
+ "sessions": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "object",
25
+ "additionalProperties": false,
26
+ "required": [
27
+ "appClientId",
28
+ "sessionId",
29
+ "source",
30
+ "deviceType",
31
+ "isCurrent",
32
+ "routeKind"
33
+ ],
34
+ "properties": {
35
+ "appClientId": {
36
+ "type": "string"
37
+ },
38
+ "sessionId": {
39
+ "type": "string"
40
+ },
41
+ "source": {
42
+ "type": "string"
43
+ },
44
+ "deviceType": {
45
+ "type": "string"
46
+ },
47
+ "isCurrent": {
48
+ "type": "boolean"
49
+ },
50
+ "routeKind": {
51
+ "anyOf": [
52
+ {
53
+ "enum": [
54
+ "localDirect",
55
+ "cloudBridgeShadow"
56
+ ]
57
+ },
58
+ {
59
+ "type": "null"
60
+ }
61
+ ]
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,517 @@
1
+ {
2
+ "type": "object",
3
+ "additionalProperties": false,
4
+ "required": [
5
+ "contract",
6
+ "scopeId",
7
+ "observedAtMs",
8
+ "discoveryError",
9
+ "hosts",
10
+ "instances"
11
+ ],
12
+ "properties": {
13
+ "contract": {
14
+ "const": "mhome.system.inventory.v1"
15
+ },
16
+ "scopeId": {
17
+ "type": "string"
18
+ },
19
+ "observedAtMs": {
20
+ "type": "integer",
21
+ "minimum": 0
22
+ },
23
+ "discoveryError": {
24
+ "anyOf": [
25
+ {
26
+ "type": "string"
27
+ },
28
+ {
29
+ "type": "null"
30
+ }
31
+ ]
32
+ },
33
+ "hosts": {
34
+ "type": "array",
35
+ "items": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": [
39
+ "hostId",
40
+ "hostName",
41
+ "hostType",
42
+ "isHubHost",
43
+ "source",
44
+ "reachable",
45
+ "info",
46
+ "services"
47
+ ],
48
+ "properties": {
49
+ "hostId": {
50
+ "type": "string"
51
+ },
52
+ "hostName": {
53
+ "type": "string"
54
+ },
55
+ "hostType": {
56
+ "type": "string"
57
+ },
58
+ "isHubHost": {
59
+ "type": "boolean"
60
+ },
61
+ "source": {
62
+ "enum": [
63
+ "local",
64
+ "mdns",
65
+ "commissioned"
66
+ ]
67
+ },
68
+ "reachable": {
69
+ "type": "boolean"
70
+ },
71
+ "info": {
72
+ "type": "object",
73
+ "additionalProperties": false,
74
+ "required": [
75
+ "status",
76
+ "data",
77
+ "observedAtMs",
78
+ "lastAttemptAtMs",
79
+ "stale",
80
+ "errorCode"
81
+ ],
82
+ "properties": {
83
+ "status": {
84
+ "enum": [
85
+ "ok",
86
+ "unavailable",
87
+ "unsupported",
88
+ "notQueried"
89
+ ]
90
+ },
91
+ "data": {
92
+ "anyOf": [
93
+ {
94
+ "type": "object",
95
+ "additionalProperties": false,
96
+ "required": [
97
+ "hostId",
98
+ "hostName",
99
+ "hostType",
100
+ "os",
101
+ "osVersion",
102
+ "cpu",
103
+ "memory",
104
+ "disk",
105
+ "gpus"
106
+ ],
107
+ "properties": {
108
+ "hostId": {
109
+ "type": "string"
110
+ },
111
+ "hostName": {
112
+ "type": "string"
113
+ },
114
+ "hostType": {
115
+ "type": "string"
116
+ },
117
+ "os": {
118
+ "type": "string"
119
+ },
120
+ "osVersion": {
121
+ "anyOf": [
122
+ {
123
+ "type": "string"
124
+ },
125
+ {
126
+ "type": "null"
127
+ }
128
+ ]
129
+ },
130
+ "cpu": {
131
+ "type": "object",
132
+ "additionalProperties": false,
133
+ "required": [
134
+ "arch",
135
+ "logicalCores",
136
+ "model"
137
+ ],
138
+ "properties": {
139
+ "arch": {
140
+ "type": "string"
141
+ },
142
+ "logicalCores": {
143
+ "type": "integer",
144
+ "minimum": 0
145
+ },
146
+ "model": {
147
+ "type": "string"
148
+ }
149
+ }
150
+ },
151
+ "memory": {
152
+ "type": "object",
153
+ "additionalProperties": false,
154
+ "required": [
155
+ "totalBytes"
156
+ ],
157
+ "properties": {
158
+ "totalBytes": {
159
+ "type": "integer",
160
+ "minimum": 0
161
+ }
162
+ }
163
+ },
164
+ "disk": {
165
+ "anyOf": [
166
+ {
167
+ "type": "object",
168
+ "additionalProperties": false,
169
+ "required": [
170
+ "totalBytes"
171
+ ],
172
+ "properties": {
173
+ "totalBytes": {
174
+ "type": "integer",
175
+ "minimum": 0
176
+ }
177
+ }
178
+ },
179
+ {
180
+ "type": "null"
181
+ }
182
+ ]
183
+ },
184
+ "gpus": {
185
+ "type": "array",
186
+ "items": {
187
+ "type": "object",
188
+ "additionalProperties": false,
189
+ "required": [
190
+ "vendor",
191
+ "name",
192
+ "memoryBytes"
193
+ ],
194
+ "properties": {
195
+ "vendor": {
196
+ "type": "string"
197
+ },
198
+ "name": {
199
+ "type": "string"
200
+ },
201
+ "memoryBytes": {
202
+ "anyOf": [
203
+ {
204
+ "type": "integer",
205
+ "minimum": 0
206
+ },
207
+ {
208
+ "type": "null"
209
+ }
210
+ ]
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ },
217
+ {
218
+ "type": "null"
219
+ }
220
+ ]
221
+ },
222
+ "observedAtMs": {
223
+ "anyOf": [
224
+ {
225
+ "type": "integer",
226
+ "minimum": 0
227
+ },
228
+ {
229
+ "type": "null"
230
+ }
231
+ ]
232
+ },
233
+ "lastAttemptAtMs": {
234
+ "anyOf": [
235
+ {
236
+ "type": "integer",
237
+ "minimum": 0
238
+ },
239
+ {
240
+ "type": "null"
241
+ }
242
+ ]
243
+ },
244
+ "stale": {
245
+ "type": "boolean"
246
+ },
247
+ "errorCode": {
248
+ "anyOf": [
249
+ {
250
+ "type": "string"
251
+ },
252
+ {
253
+ "type": "null"
254
+ }
255
+ ]
256
+ }
257
+ }
258
+ },
259
+ "services": {
260
+ "type": "object",
261
+ "additionalProperties": false,
262
+ "required": [
263
+ "status",
264
+ "data",
265
+ "observedAtMs",
266
+ "lastAttemptAtMs",
267
+ "stale",
268
+ "errorCode"
269
+ ],
270
+ "properties": {
271
+ "status": {
272
+ "enum": [
273
+ "ok",
274
+ "unavailable",
275
+ "unsupported",
276
+ "notQueried"
277
+ ]
278
+ },
279
+ "data": {
280
+ "anyOf": [
281
+ {
282
+ "type": "array",
283
+ "items": {
284
+ "type": "object",
285
+ "additionalProperties": false,
286
+ "required": [
287
+ "serviceId",
288
+ "version",
289
+ "kind",
290
+ "status"
291
+ ],
292
+ "properties": {
293
+ "serviceId": {
294
+ "type": "string"
295
+ },
296
+ "version": {
297
+ "type": "string"
298
+ },
299
+ "kind": {
300
+ "type": "string"
301
+ },
302
+ "status": {
303
+ "type": "string"
304
+ }
305
+ }
306
+ }
307
+ },
308
+ {
309
+ "type": "null"
310
+ }
311
+ ]
312
+ },
313
+ "observedAtMs": {
314
+ "anyOf": [
315
+ {
316
+ "type": "integer",
317
+ "minimum": 0
318
+ },
319
+ {
320
+ "type": "null"
321
+ }
322
+ ]
323
+ },
324
+ "lastAttemptAtMs": {
325
+ "anyOf": [
326
+ {
327
+ "type": "integer",
328
+ "minimum": 0
329
+ },
330
+ {
331
+ "type": "null"
332
+ }
333
+ ]
334
+ },
335
+ "stale": {
336
+ "type": "boolean"
337
+ },
338
+ "errorCode": {
339
+ "anyOf": [
340
+ {
341
+ "type": "string"
342
+ },
343
+ {
344
+ "type": "null"
345
+ }
346
+ ]
347
+ }
348
+ }
349
+ }
350
+ }
351
+ }
352
+ },
353
+ "instances": {
354
+ "type": "array",
355
+ "items": {
356
+ "type": "object",
357
+ "additionalProperties": false,
358
+ "required": [
359
+ "id",
360
+ "kind",
361
+ "hostId",
362
+ "serviceId",
363
+ "displayName",
364
+ "nodeType",
365
+ "hubId",
366
+ "commissioned",
367
+ "lifecycle",
368
+ "hubConnection",
369
+ "cloudConnection",
370
+ "health"
371
+ ],
372
+ "properties": {
373
+ "id": {
374
+ "type": "string"
375
+ },
376
+ "kind": {
377
+ "enum": [
378
+ "hub",
379
+ "node"
380
+ ]
381
+ },
382
+ "hostId": {
383
+ "type": "string"
384
+ },
385
+ "serviceId": {
386
+ "type": "string"
387
+ },
388
+ "displayName": {
389
+ "type": "string"
390
+ },
391
+ "nodeType": {
392
+ "anyOf": [
393
+ {
394
+ "type": "string"
395
+ },
396
+ {
397
+ "type": "null"
398
+ }
399
+ ]
400
+ },
401
+ "hubId": {
402
+ "type": "string"
403
+ },
404
+ "commissioned": {
405
+ "type": "boolean"
406
+ },
407
+ "lifecycle": {
408
+ "anyOf": [
409
+ {
410
+ "enum": [
411
+ "active",
412
+ "inactive"
413
+ ]
414
+ },
415
+ {
416
+ "type": "null"
417
+ }
418
+ ]
419
+ },
420
+ "hubConnection": {
421
+ "anyOf": [
422
+ {
423
+ "enum": [
424
+ "connected",
425
+ "disconnected"
426
+ ]
427
+ },
428
+ {
429
+ "type": "null"
430
+ }
431
+ ]
432
+ },
433
+ "cloudConnection": {
434
+ "anyOf": [
435
+ {
436
+ "enum": [
437
+ "connected",
438
+ "disconnected"
439
+ ]
440
+ },
441
+ {
442
+ "type": "null"
443
+ }
444
+ ]
445
+ },
446
+ "health": {
447
+ "type": "object",
448
+ "additionalProperties": false,
449
+ "required": [
450
+ "status",
451
+ "data",
452
+ "observedAtMs",
453
+ "lastAttemptAtMs",
454
+ "stale",
455
+ "errorCode"
456
+ ],
457
+ "properties": {
458
+ "status": {
459
+ "enum": [
460
+ "ok",
461
+ "unavailable",
462
+ "unsupported",
463
+ "notQueried"
464
+ ]
465
+ },
466
+ "data": {
467
+ "anyOf": [
468
+ {
469
+ "type": "string"
470
+ },
471
+ {
472
+ "type": "null"
473
+ }
474
+ ]
475
+ },
476
+ "observedAtMs": {
477
+ "anyOf": [
478
+ {
479
+ "type": "integer",
480
+ "minimum": 0
481
+ },
482
+ {
483
+ "type": "null"
484
+ }
485
+ ]
486
+ },
487
+ "lastAttemptAtMs": {
488
+ "anyOf": [
489
+ {
490
+ "type": "integer",
491
+ "minimum": 0
492
+ },
493
+ {
494
+ "type": "null"
495
+ }
496
+ ]
497
+ },
498
+ "stale": {
499
+ "type": "boolean"
500
+ },
501
+ "errorCode": {
502
+ "anyOf": [
503
+ {
504
+ "type": "string"
505
+ },
506
+ {
507
+ "type": "null"
508
+ }
509
+ ]
510
+ }
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
516
+ }
517
+ }
@@ -0,0 +1,225 @@
1
+ {
2
+ "type": "object",
3
+ "additionalProperties": false,
4
+ "required": [
5
+ "hostId",
6
+ "sample"
7
+ ],
8
+ "properties": {
9
+ "hostId": {
10
+ "type": "string"
11
+ },
12
+ "sample": {
13
+ "type": "object",
14
+ "additionalProperties": false,
15
+ "required": [
16
+ "status",
17
+ "data",
18
+ "observedAtMs",
19
+ "lastAttemptAtMs",
20
+ "stale",
21
+ "errorCode"
22
+ ],
23
+ "properties": {
24
+ "status": {
25
+ "enum": [
26
+ "ok",
27
+ "unavailable",
28
+ "unsupported",
29
+ "notQueried"
30
+ ]
31
+ },
32
+ "data": {
33
+ "anyOf": [
34
+ {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": [
38
+ "hostId",
39
+ "sampledAtMs",
40
+ "cpuUsagePercent",
41
+ "memoryAvailableBytes",
42
+ "diskAvailableBytes",
43
+ "networkReceivedBytesPerSecond",
44
+ "networkSentBytesPerSecond",
45
+ "services"
46
+ ],
47
+ "properties": {
48
+ "hostId": {
49
+ "type": "string"
50
+ },
51
+ "sampledAtMs": {
52
+ "type": "integer",
53
+ "minimum": 0
54
+ },
55
+ "cpuUsagePercent": {
56
+ "anyOf": [
57
+ {
58
+ "type": "number"
59
+ },
60
+ {
61
+ "type": "null"
62
+ }
63
+ ]
64
+ },
65
+ "memoryAvailableBytes": {
66
+ "anyOf": [
67
+ {
68
+ "type": "integer",
69
+ "minimum": 0
70
+ },
71
+ {
72
+ "type": "null"
73
+ }
74
+ ]
75
+ },
76
+ "diskAvailableBytes": {
77
+ "anyOf": [
78
+ {
79
+ "type": "integer",
80
+ "minimum": 0
81
+ },
82
+ {
83
+ "type": "null"
84
+ }
85
+ ]
86
+ },
87
+ "networkReceivedBytesPerSecond": {
88
+ "anyOf": [
89
+ {
90
+ "type": "number"
91
+ },
92
+ {
93
+ "type": "null"
94
+ }
95
+ ]
96
+ },
97
+ "networkSentBytesPerSecond": {
98
+ "anyOf": [
99
+ {
100
+ "type": "number"
101
+ },
102
+ {
103
+ "type": "null"
104
+ }
105
+ ]
106
+ },
107
+ "services": {
108
+ "type": "array",
109
+ "items": {
110
+ "type": "object",
111
+ "additionalProperties": false,
112
+ "required": [
113
+ "serviceId",
114
+ "status",
115
+ "sampleState",
116
+ "processCount",
117
+ "cpuUsagePercent",
118
+ "memoryResidentBytes",
119
+ "diskReadBytesPerSecond",
120
+ "diskWrittenBytesPerSecond"
121
+ ],
122
+ "properties": {
123
+ "serviceId": {
124
+ "type": "string"
125
+ },
126
+ "status": {
127
+ "type": "string"
128
+ },
129
+ "sampleState": {
130
+ "type": "string"
131
+ },
132
+ "processCount": {
133
+ "type": "integer",
134
+ "minimum": 0
135
+ },
136
+ "cpuUsagePercent": {
137
+ "anyOf": [
138
+ {
139
+ "type": "number"
140
+ },
141
+ {
142
+ "type": "null"
143
+ }
144
+ ]
145
+ },
146
+ "memoryResidentBytes": {
147
+ "anyOf": [
148
+ {
149
+ "type": "integer",
150
+ "minimum": 0
151
+ },
152
+ {
153
+ "type": "null"
154
+ }
155
+ ]
156
+ },
157
+ "diskReadBytesPerSecond": {
158
+ "anyOf": [
159
+ {
160
+ "type": "number"
161
+ },
162
+ {
163
+ "type": "null"
164
+ }
165
+ ]
166
+ },
167
+ "diskWrittenBytesPerSecond": {
168
+ "anyOf": [
169
+ {
170
+ "type": "number"
171
+ },
172
+ {
173
+ "type": "null"
174
+ }
175
+ ]
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ },
182
+ {
183
+ "type": "null"
184
+ }
185
+ ]
186
+ },
187
+ "observedAtMs": {
188
+ "anyOf": [
189
+ {
190
+ "type": "integer",
191
+ "minimum": 0
192
+ },
193
+ {
194
+ "type": "null"
195
+ }
196
+ ]
197
+ },
198
+ "lastAttemptAtMs": {
199
+ "anyOf": [
200
+ {
201
+ "type": "integer",
202
+ "minimum": 0
203
+ },
204
+ {
205
+ "type": "null"
206
+ }
207
+ ]
208
+ },
209
+ "stale": {
210
+ "type": "boolean"
211
+ },
212
+ "errorCode": {
213
+ "anyOf": [
214
+ {
215
+ "type": "string"
216
+ },
217
+ {
218
+ "type": "null"
219
+ }
220
+ ]
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }