@claudexor/schema 3.5.0 → 3.8.0

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 (106) hide show
  1. package/dist/accounts-migration.d.ts +112 -0
  2. package/dist/accounts-migration.d.ts.map +1 -0
  3. package/dist/accounts-migration.js +74 -0
  4. package/dist/accounts-migration.js.map +1 -0
  5. package/dist/agent-capabilities.d.ts +32 -0
  6. package/dist/agent-capabilities.d.ts.map +1 -1
  7. package/dist/agent-capabilities.js +4 -0
  8. package/dist/agent-capabilities.js.map +1 -1
  9. package/dist/config.d.ts +48 -30
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +32 -11
  12. package/dist/config.js.map +1 -1
  13. package/dist/control-harness-list.d.ts +197 -1
  14. package/dist/control-harness-list.d.ts.map +1 -1
  15. package/dist/control-operation-responses.d.ts +7 -7
  16. package/dist/control-run-detail.d.ts +19 -19
  17. package/dist/control-run-failure.d.ts +4 -4
  18. package/dist/control-run-failure.d.ts.map +1 -1
  19. package/dist/control-run-failure.js +7 -1
  20. package/dist/control-run-failure.js.map +1 -1
  21. package/dist/control.d.ts +23 -23
  22. package/dist/control.d.ts.map +1 -1
  23. package/dist/control.js +8 -8
  24. package/dist/control.js.map +1 -1
  25. package/dist/credential-profile-snapshot.d.ts +644 -30
  26. package/dist/credential-profile-snapshot.d.ts.map +1 -1
  27. package/dist/credential-profile.d.ts +365 -38
  28. package/dist/credential-profile.d.ts.map +1 -1
  29. package/dist/credential-profile.js +140 -28
  30. package/dist/credential-profile.js.map +1 -1
  31. package/dist/credential-store.d.ts +19 -6
  32. package/dist/credential-store.d.ts.map +1 -1
  33. package/dist/credential-store.js +21 -6
  34. package/dist/credential-store.js.map +1 -1
  35. package/dist/events.d.ts +44 -4
  36. package/dist/events.d.ts.map +1 -1
  37. package/dist/events.js +34 -0
  38. package/dist/events.js.map +1 -1
  39. package/dist/harness.d.ts +252 -59
  40. package/dist/harness.d.ts.map +1 -1
  41. package/dist/harness.js +2 -32
  42. package/dist/harness.js.map +1 -1
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/mcp-run-result.d.ts +10 -10
  48. package/dist/platform-auth.d.ts +196 -0
  49. package/dist/platform-auth.d.ts.map +1 -0
  50. package/dist/platform-auth.js +142 -0
  51. package/dist/platform-auth.js.map +1 -0
  52. package/dist/quota.d.ts +42 -21
  53. package/dist/quota.d.ts.map +1 -1
  54. package/dist/quota.js +35 -0
  55. package/dist/quota.js.map +1 -1
  56. package/dist/rate-limit.d.ts +9 -0
  57. package/dist/rate-limit.d.ts.map +1 -1
  58. package/dist/rate-limit.js +21 -0
  59. package/dist/rate-limit.js.map +1 -1
  60. package/dist/readiness.d.ts +178 -1
  61. package/dist/readiness.d.ts.map +1 -1
  62. package/dist/readiness.js +12 -0
  63. package/dist/readiness.js.map +1 -1
  64. package/dist/setup-login.d.ts +5 -5
  65. package/dist/setup.d.ts +102 -95
  66. package/dist/setup.d.ts.map +1 -1
  67. package/dist/setup.js +29 -5
  68. package/dist/setup.js.map +1 -1
  69. package/generated/AccountsUnifiedMigrationFile.schema.json +61 -0
  70. package/generated/AgentCapabilityCatalog.schema.json +26 -0
  71. package/generated/ControlAccountPoolsResponse.schema.json +93 -0
  72. package/generated/ControlAccountsMigrationRollbackRequest.schema.json +18 -0
  73. package/generated/ControlAccountsMigrationRollbackResponse.schema.json +63 -0
  74. package/generated/ControlCredentialProfileCreateRequest.schema.json +1 -1
  75. package/generated/ControlCredentialProfileCreateResponse.schema.json +4 -4
  76. package/generated/ControlCredentialProfileDeleteResponse.schema.json +28 -4
  77. package/generated/ControlCredentialProfileUpdateResponse.schema.json +4 -4
  78. package/generated/ControlCredentialProfilesQueryResponse.schema.json +212 -7
  79. package/generated/ControlCredentialProfilesResponse.schema.json +81 -5
  80. package/generated/ControlCredentialProfilesSnapshotResponse.schema.json +209 -7
  81. package/generated/ControlHarnessAccountPool.schema.json +79 -0
  82. package/generated/ControlHarnessListResponse.schema.json +124 -0
  83. package/generated/ControlHarnessSettingsPatch.schema.json +2 -1
  84. package/generated/ControlPoolNextUp.schema.json +63 -0
  85. package/generated/ControlQuotaResponse.schema.json +4 -2
  86. package/generated/ControlRunDetail.schema.json +2 -1
  87. package/generated/ControlRunListResponse.schema.json +2 -1
  88. package/generated/ControlRunSummary.schema.json +2 -1
  89. package/generated/ControlSettingsSnapshot.schema.json +3 -2
  90. package/generated/ControlSettingsUpdateRequest.schema.json +2 -1
  91. package/generated/ControlSetupJob.schema.json +5 -1
  92. package/generated/ControlSetupJobCreateRequest.schema.json +1 -1
  93. package/generated/ControlSetupJobEvent.schema.json +5 -1
  94. package/generated/ControlSetupJobListResponse.schema.json +5 -1
  95. package/generated/ControlSetupJobSnapshot.schema.json +5 -1
  96. package/generated/CredentialProfile.schema.json +3 -3
  97. package/generated/CredentialProfileStatus.schema.json +1 -1
  98. package/generated/GlobalConfig.schema.json +7 -6
  99. package/generated/HarnessEvent.schema.json +2 -1
  100. package/generated/HarnessManifest.schema.json +98 -0
  101. package/generated/HarnessStatusDto.schema.json +124 -0
  102. package/generated/McpRunHandleResult.schema.json +2 -1
  103. package/generated/McpRunToolResult.schema.json +2 -1
  104. package/generated/RunEvent.schema.json +4 -0
  105. package/generated/RunFailure.schema.json +2 -1
  106. package/package.json +2 -2
@@ -29,7 +29,7 @@
29
29
  "oauth_token",
30
30
  "api_key"
31
31
  ],
32
- "description": "Credential transport a profile isolates: a scoped vendor config-dir login, a stored OAuth token, or a stored API key."
32
+ "description": "Binding kind for a profile: Claudexor-owned scoped vendor state, a managed OAuth secret, or a managed API-key secret; a vendor OS-user credential may remain outside that state."
33
33
  },
34
34
  "isolation_locator": {
35
35
  "type": [
@@ -37,7 +37,7 @@
37
37
  "null"
38
38
  ],
39
39
  "default": null,
40
- "description": "Canonical absolute config-dir path for config_dir_login profiles; null for secret-ref kinds."
40
+ "description": "Canonical absolute path to Claudexor-owned scoped vendor state for config_dir_login bindings; null for secret-ref kinds."
41
41
  },
42
42
  "secret_ref": {
43
43
  "type": [
@@ -74,7 +74,7 @@
74
74
  "credential_kind"
75
75
  ],
76
76
  "additionalProperties": false,
77
- "description": "Durable non-secret registry entry for one credential identity of one harness; secret material lives in the vendor dir or the secret store, never here."
77
+ "description": "Durable non-secret named binding for one harness; credential material may live in Claudexor-owned scoped state, a managed secret store, or a platform-declared vendor/OS-user store, never in this row."
78
78
  },
79
79
  "status": {
80
80
  "type": "object",
@@ -110,7 +110,7 @@
110
110
  "vendor"
111
111
  ],
112
112
  "default": "local_store",
113
- "description": "How the verification verdict was reached: local_store = the profile's credential material is present locally (says nothing about the token being live); vendor = the vendor answered a request made with this profile's own credential."
113
+ "description": "How the verification verdict was reached: local_store = the binding's required local state or managed secret is present (says nothing about a token being live); vendor = the vendor answered under the exact binding environment and effective platform credential policy."
114
114
  },
115
115
  "detail": {
116
116
  "type": "string",
@@ -36,7 +36,7 @@
36
36
  "oauth_token",
37
37
  "api_key"
38
38
  ],
39
- "description": "Credential transport a profile isolates: a scoped vendor config-dir login, a stored OAuth token, or a stored API key."
39
+ "description": "Binding kind for a profile: Claudexor-owned scoped vendor state, a managed OAuth secret, or a managed API-key secret; a vendor OS-user credential may remain outside that state."
40
40
  },
41
41
  "isolation_locator": {
42
42
  "type": [
@@ -44,7 +44,7 @@
44
44
  "null"
45
45
  ],
46
46
  "default": null,
47
- "description": "Canonical absolute config-dir path for config_dir_login profiles; null for secret-ref kinds."
47
+ "description": "Canonical absolute path to Claudexor-owned scoped vendor state for config_dir_login bindings; null for secret-ref kinds."
48
48
  },
49
49
  "secret_ref": {
50
50
  "type": [
@@ -81,7 +81,7 @@
81
81
  "credential_kind"
82
82
  ],
83
83
  "additionalProperties": false,
84
- "description": "Durable non-secret registry entry for one credential identity of one harness; secret material lives in the vendor dir or the secret store, never here."
84
+ "description": "Durable non-secret named binding for one harness; credential material may live in Claudexor-owned scoped state, a managed secret store, or a platform-declared vendor/OS-user store, never in this row."
85
85
  },
86
86
  "status": {
87
87
  "type": "object",
@@ -117,7 +117,7 @@
117
117
  "vendor"
118
118
  ],
119
119
  "default": "local_store",
120
- "description": "How the verification verdict was reached: local_store = the profile's credential material is present locally (says nothing about the token being live); vendor = the vendor answered a request made with this profile's own credential."
120
+ "description": "How the verification verdict was reached: local_store = the binding's required local state or managed secret is present (says nothing about a token being live); vendor = the vendor answered under the exact binding environment and effective platform credential policy."
121
121
  },
122
122
  "detail": {
123
123
  "type": "string",
@@ -284,7 +284,83 @@
284
284
  "description": "Per-harness accounts authority: native CLI-login state + the informational next-up identity."
285
285
  },
286
286
  "default": [],
287
- "description": "Per-harness accounts authority (INV-135): the native CLI-login pseudo-row state and the server-computed Active identity, so no surface re-derives the accounts symmetry."
287
+ "description": "Per-harness accounts authority (INV-135): the native CLI-login pseudo-row state and the server-computed Active identity, so no surface re-derives the accounts symmetry. A unified-model engine emits [] here (the key must stay present for legacy strict clients) and carries routing facts in accountPools instead."
288
+ },
289
+ "accountPools": {
290
+ "type": "array",
291
+ "items": {
292
+ "type": "object",
293
+ "properties": {
294
+ "harness_id": {
295
+ "type": "string",
296
+ "minLength": 1,
297
+ "description": "Harness family this pool verdict belongs to."
298
+ },
299
+ "next_up": {
300
+ "anyOf": [
301
+ {
302
+ "type": "object",
303
+ "properties": {
304
+ "kind": {
305
+ "type": "string",
306
+ "const": "profile"
307
+ },
308
+ "profileId": {
309
+ "$ref": "#/definitions/ControlCredentialProfilesQueryResponse/anyOf/0/properties/profiles/items/properties/status/properties/profile_id"
310
+ }
311
+ },
312
+ "required": [
313
+ "kind",
314
+ "profileId"
315
+ ],
316
+ "additionalProperties": false,
317
+ "description": "An enabled account row is who an unpinned run routes to next."
318
+ },
319
+ {
320
+ "type": "object",
321
+ "properties": {
322
+ "kind": {
323
+ "type": "string",
324
+ "const": "api_key_route"
325
+ }
326
+ },
327
+ "required": [
328
+ "kind"
329
+ ],
330
+ "additionalProperties": false,
331
+ "description": "The account pool is empty or exhausted; the unpinned route is the policy-governed API key (INV-061) — a route, never an account row."
332
+ },
333
+ {
334
+ "type": "object",
335
+ "properties": {
336
+ "kind": {
337
+ "type": "string",
338
+ "const": "none"
339
+ },
340
+ "reason": {
341
+ "type": "string"
342
+ }
343
+ },
344
+ "required": [
345
+ "kind",
346
+ "reason"
347
+ ],
348
+ "additionalProperties": false,
349
+ "description": "An unpinned run has nothing routable, with a human reason."
350
+ }
351
+ ],
352
+ "description": "Server-computed pool routing verdict for one harness's unpinned runs (unified account model)."
353
+ }
354
+ },
355
+ "required": [
356
+ "harness_id",
357
+ "next_up"
358
+ ],
359
+ "additionalProperties": false,
360
+ "description": "Per-harness pool authority (unified account model): who an unpinned run routes to next."
361
+ },
362
+ "default": [],
363
+ "description": "Additive per-harness pool authority of the unified account model: routing facts (next_up incl. the api_key_route kind) live here so legacy strict next_up decoders never see unknown kinds. Old clients ignore this key."
288
364
  }
289
365
  },
290
366
  "required": [
@@ -302,6 +378,9 @@
302
378
  "harnessAccounts": {
303
379
  "$ref": "#/definitions/ControlCredentialProfilesQueryResponse/anyOf/0/properties/harnessAccounts"
304
380
  },
381
+ "accountPools": {
382
+ "$ref": "#/definitions/ControlCredentialProfilesQueryResponse/anyOf/0/properties/accountPools"
383
+ },
305
384
  "harnesses": {
306
385
  "type": "array",
307
386
  "items": {
@@ -435,6 +514,20 @@
435
514
  },
436
515
  "default": [],
437
516
  "description": "Relocation levers that can move this transport into a scoped environment."
517
+ },
518
+ "platforms": {
519
+ "type": "array",
520
+ "items": {
521
+ "type": "string",
522
+ "enum": [
523
+ "darwin",
524
+ "linux",
525
+ "win32"
526
+ ],
527
+ "description": "Host platform used to resolve credential and managed-login policy."
528
+ },
529
+ "minItems": 1,
530
+ "description": "Host platforms on which this physical credential transport applies; absent means every supported platform for backward compatibility."
438
531
  }
439
532
  },
440
533
  "required": [
@@ -446,6 +539,90 @@
446
539
  },
447
540
  "default": [],
448
541
  "description": "Declared credential transports per auth source."
542
+ },
543
+ "credential_profile_policies": {
544
+ "type": "array",
545
+ "items": {
546
+ "type": "object",
547
+ "properties": {
548
+ "source": {
549
+ "$ref": "#/definitions/ControlCredentialProfilesQueryResponse/anyOf/1/properties/harnesses/items/properties/manifest/anyOf/0/properties/capability_profile/properties/auth/properties/supported_sources/items"
550
+ },
551
+ "platforms": {
552
+ "type": "array",
553
+ "items": {
554
+ "$ref": "#/definitions/ControlCredentialProfilesQueryResponse/anyOf/1/properties/harnesses/items/properties/manifest/anyOf/0/properties/capability_profile/properties/auth/properties/credential_transports/items/properties/platforms/items"
555
+ },
556
+ "minItems": 1,
557
+ "description": "Nonempty host-platform set governed by this policy row."
558
+ },
559
+ "identity_scope": {
560
+ "type": "string",
561
+ "enum": [
562
+ "profile",
563
+ "os_user"
564
+ ],
565
+ "description": "Identity boundary selected by a credential profile: the named profile itself or the host OS user/login vault."
566
+ },
567
+ "max_enabled_profiles": {
568
+ "anyOf": [
569
+ {
570
+ "type": "integer",
571
+ "exclusiveMinimum": 0
572
+ },
573
+ {
574
+ "type": "null"
575
+ }
576
+ ],
577
+ "description": "Maximum enabled profile bindings on these platforms; null means unbounded."
578
+ },
579
+ "cleanup_owner": {
580
+ "type": "string",
581
+ "enum": [
582
+ "claudexor",
583
+ "vendor"
584
+ ],
585
+ "description": "Who owns cleanup of the credential when its Claudexor profile binding is removed."
586
+ }
587
+ },
588
+ "required": [
589
+ "source",
590
+ "platforms",
591
+ "identity_scope",
592
+ "max_enabled_profiles",
593
+ "cleanup_owner"
594
+ ],
595
+ "additionalProperties": false,
596
+ "description": "Platform-specific identity scope, enabled-profile cardinality, and credential cleanup ownership for one auth source."
597
+ },
598
+ "description": "Platform-specific profile identity/cardinality/cleanup policy; absent uses the backward-compatible profile-scoped, unbounded, Claudexor-owned defaults."
599
+ },
600
+ "managed_login": {
601
+ "anyOf": [
602
+ {
603
+ "type": "object",
604
+ "properties": {
605
+ "stdin": {
606
+ "type": "string",
607
+ "enum": [
608
+ "none",
609
+ "pipe",
610
+ "terminal"
611
+ ],
612
+ "description": "Input transport the vendor login command requires."
613
+ }
614
+ },
615
+ "required": [
616
+ "stdin"
617
+ ],
618
+ "additionalProperties": false,
619
+ "description": "Managed-login input requirement; command, argv, flow, and time window remain owned by the native-login registry."
620
+ },
621
+ {
622
+ "type": "null"
623
+ }
624
+ ],
625
+ "description": "Managed subscription-login input requirement; null means this harness defines no managed login, absent is a legacy manifest."
449
626
  }
450
627
  },
451
628
  "additionalProperties": false,
@@ -1055,6 +1232,32 @@
1055
1232
  ],
1056
1233
  "description": "Engine-owned Delegate capability for this harness and installed runtime; null on legacy status rows.",
1057
1234
  "default": null
1235
+ },
1236
+ "setupLogin": {
1237
+ "anyOf": [
1238
+ {
1239
+ "type": "object",
1240
+ "properties": {
1241
+ "mode": {
1242
+ "type": "string",
1243
+ "enum": [
1244
+ "in_app",
1245
+ "external_terminal"
1246
+ ],
1247
+ "description": "in_app requests the daemon-hosted login flow; external_terminal requests the existing client PTY flow."
1248
+ }
1249
+ },
1250
+ "required": [
1251
+ "mode"
1252
+ ],
1253
+ "additionalProperties": false,
1254
+ "description": "Effective setup-login flow for this harness on the current host."
1255
+ },
1256
+ {
1257
+ "type": "null"
1258
+ }
1259
+ ],
1260
+ "description": "Effective setup-login flow for this harness on the current host; current producers emit null or an object, while omission identifies a legacy row."
1058
1261
  }
1059
1262
  },
1060
1263
  "required": [
@@ -1244,7 +1447,8 @@
1244
1447
  "claude_statusline",
1245
1448
  "claude_api_retry",
1246
1449
  "claude_oauth_usage",
1247
- "agy_command_usage"
1450
+ "agy_command_usage",
1451
+ "cursor_rate_limit"
1248
1452
  ],
1249
1453
  "description": "Machine-readable source of quota evidence, classified by schema-owned traits."
1250
1454
  },
@@ -1367,7 +1571,8 @@
1367
1571
  "platform_unsupported",
1368
1572
  "refresh_failed",
1369
1573
  "no_source",
1370
- "auth_revoked"
1574
+ "auth_revoked",
1575
+ "credential_profile_ambiguous"
1371
1576
  ],
1372
1577
  "description": "Why a registered subject has no quota snapshot, in the source's own vocabulary."
1373
1578
  },
@@ -34,7 +34,7 @@
34
34
  "oauth_token",
35
35
  "api_key"
36
36
  ],
37
- "description": "Credential transport a profile isolates: a scoped vendor config-dir login, a stored OAuth token, or a stored API key."
37
+ "description": "Binding kind for a profile: Claudexor-owned scoped vendor state, a managed OAuth secret, or a managed API-key secret; a vendor OS-user credential may remain outside that state."
38
38
  },
39
39
  "isolation_locator": {
40
40
  "type": [
@@ -42,7 +42,7 @@
42
42
  "null"
43
43
  ],
44
44
  "default": null,
45
- "description": "Canonical absolute config-dir path for config_dir_login profiles; null for secret-ref kinds."
45
+ "description": "Canonical absolute path to Claudexor-owned scoped vendor state for config_dir_login bindings; null for secret-ref kinds."
46
46
  },
47
47
  "secret_ref": {
48
48
  "type": [
@@ -79,7 +79,7 @@
79
79
  "credential_kind"
80
80
  ],
81
81
  "additionalProperties": false,
82
- "description": "Durable non-secret registry entry for one credential identity of one harness; secret material lives in the vendor dir or the secret store, never here."
82
+ "description": "Durable non-secret named binding for one harness; credential material may live in Claudexor-owned scoped state, a managed secret store, or a platform-declared vendor/OS-user store, never in this row."
83
83
  },
84
84
  "status": {
85
85
  "type": "object",
@@ -115,7 +115,7 @@
115
115
  "vendor"
116
116
  ],
117
117
  "default": "local_store",
118
- "description": "How the verification verdict was reached: local_store = the profile's credential material is present locally (says nothing about the token being live); vendor = the vendor answered a request made with this profile's own credential."
118
+ "description": "How the verification verdict was reached: local_store = the binding's required local state or managed secret is present (says nothing about a token being live); vendor = the vendor answered under the exact binding environment and effective platform credential policy."
119
119
  },
120
120
  "detail": {
121
121
  "type": "string",
@@ -282,7 +282,83 @@
282
282
  "description": "Per-harness accounts authority: native CLI-login state + the informational next-up identity."
283
283
  },
284
284
  "default": [],
285
- "description": "Per-harness accounts authority (INV-135): the native CLI-login pseudo-row state and the server-computed Active identity, so no surface re-derives the accounts symmetry."
285
+ "description": "Per-harness accounts authority (INV-135): the native CLI-login pseudo-row state and the server-computed Active identity, so no surface re-derives the accounts symmetry. A unified-model engine emits [] here (the key must stay present for legacy strict clients) and carries routing facts in accountPools instead."
286
+ },
287
+ "accountPools": {
288
+ "type": "array",
289
+ "items": {
290
+ "type": "object",
291
+ "properties": {
292
+ "harness_id": {
293
+ "type": "string",
294
+ "minLength": 1,
295
+ "description": "Harness family this pool verdict belongs to."
296
+ },
297
+ "next_up": {
298
+ "anyOf": [
299
+ {
300
+ "type": "object",
301
+ "properties": {
302
+ "kind": {
303
+ "type": "string",
304
+ "const": "profile"
305
+ },
306
+ "profileId": {
307
+ "$ref": "#/definitions/ControlCredentialProfilesResponse/properties/profiles/items/properties/status/properties/profile_id"
308
+ }
309
+ },
310
+ "required": [
311
+ "kind",
312
+ "profileId"
313
+ ],
314
+ "additionalProperties": false,
315
+ "description": "An enabled account row is who an unpinned run routes to next."
316
+ },
317
+ {
318
+ "type": "object",
319
+ "properties": {
320
+ "kind": {
321
+ "type": "string",
322
+ "const": "api_key_route"
323
+ }
324
+ },
325
+ "required": [
326
+ "kind"
327
+ ],
328
+ "additionalProperties": false,
329
+ "description": "The account pool is empty or exhausted; the unpinned route is the policy-governed API key (INV-061) — a route, never an account row."
330
+ },
331
+ {
332
+ "type": "object",
333
+ "properties": {
334
+ "kind": {
335
+ "type": "string",
336
+ "const": "none"
337
+ },
338
+ "reason": {
339
+ "type": "string"
340
+ }
341
+ },
342
+ "required": [
343
+ "kind",
344
+ "reason"
345
+ ],
346
+ "additionalProperties": false,
347
+ "description": "An unpinned run has nothing routable, with a human reason."
348
+ }
349
+ ],
350
+ "description": "Server-computed pool routing verdict for one harness's unpinned runs (unified account model)."
351
+ }
352
+ },
353
+ "required": [
354
+ "harness_id",
355
+ "next_up"
356
+ ],
357
+ "additionalProperties": false,
358
+ "description": "Per-harness pool authority (unified account model): who an unpinned run routes to next."
359
+ },
360
+ "default": [],
361
+ "description": "Additive per-harness pool authority of the unified account model: routing facts (next_up incl. the api_key_route kind) live here so legacy strict next_up decoders never see unknown kinds. Old clients ignore this key."
286
362
  }
287
363
  },
288
364
  "required": [