@mdbase-dev/connect-protocol 0.1.0-beta.31 → 0.1.0-beta.33

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.
@@ -1,10 +1,12 @@
1
1
  import type { ApplicationFileRequirement } from "./files.js";
2
2
  import type { CollectionOperation } from "./operations.js";
3
+ import type { ConnectContractRequirements } from "./compatibility.js";
3
4
  export type ApplicationAuthorizationFlow = "authorization_code" | "device_code";
4
5
  export interface ApplicationAuthorizationBinding {
5
- protocol_version: 2;
6
+ protocol_version: 4;
6
7
  authorization_id: string;
7
8
  application_id: string;
9
+ application_declaration_id: string;
8
10
  application_manifest_digest: string;
9
11
  application_installation_id: string;
10
12
  installation_signing_public_key: string;
@@ -17,6 +19,7 @@ export interface ApplicationAuthorizationBinding {
17
19
  redirect_uri?: string;
18
20
  state?: string;
19
21
  code_challenge: string;
22
+ contracts: ConnectContractRequirements;
20
23
  requested_operations: CollectionOperation[];
21
24
  requested_files?: ApplicationFileRequirement;
22
25
  collection_id?: string;
@@ -1,5 +1,5 @@
1
1
  const INSTALLATION_ID_DOMAIN = new TextEncoder().encode("mdbase-connect application installation id v2\0");
2
- const AUTHORIZATION_PROOF_DOMAIN = new TextEncoder().encode("mdbase-connect application authorization proof v2\0");
2
+ const AUTHORIZATION_PROOF_DOMAIN = new TextEncoder().encode("mdbase-connect application authorization proof v4\0");
3
3
  export async function applicationInstallationIdFromPublicKey(signingPublicKey) {
4
4
  const signing = publicKey(signingPublicKey);
5
5
  const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", concat([INSTALLATION_ID_DOMAIN, field(signing)])));
@@ -25,12 +25,20 @@ export function authorizationSigningMessage(binding) {
25
25
  }
26
26
  const nonce = canonicalBase64(binding.authorization_nonce);
27
27
  const challenge = canonicalBase64(binding.code_challenge);
28
- if (binding.protocol_version !== 2
28
+ const contracts = binding.contracts;
29
+ if (binding.protocol_version !== 4
29
30
  || nonce.byteLength !== 32
31
+ || !/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)+$/u.test(binding.application_declaration_id)
30
32
  || !/^[0-9a-f]{64}$/u.test(binding.application_manifest_digest)
31
33
  || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(binding.issued_at)
32
34
  || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/u.test(binding.expires_at)
33
35
  || challenge.byteLength !== 32
36
+ || ![
37
+ contracts.operation_transport,
38
+ contracts.authorization_binding,
39
+ contracts.semantic_capabilities,
40
+ contracts.durable_mutation ?? 1
41
+ ].every((version) => Number.isInteger(version) && version > 0)
34
42
  || (binding.requested_operations.length === 0 && binding.requested_files === undefined)
35
43
  || new Set(binding.requested_operations).size !== binding.requested_operations.length
36
44
  || binding.requested_operations.some((operation) => !operation || operation.includes("\0"))
@@ -48,6 +56,7 @@ export function authorizationSigningMessage(binding) {
48
56
  u32(binding.protocol_version),
49
57
  field(uuidBytes(binding.application_id)),
50
58
  field(uuidBytes(binding.authorization_id)),
59
+ field(new TextEncoder().encode(binding.application_declaration_id)),
51
60
  field(hexBytes(binding.application_manifest_digest)),
52
61
  field(uuidBytes(binding.application_installation_id)),
53
62
  ...keys.map(field),
@@ -58,12 +67,21 @@ export function authorizationSigningMessage(binding) {
58
67
  optionalString(binding.redirect_uri),
59
68
  optionalString(binding.state),
60
69
  field(new TextEncoder().encode(binding.code_challenge)),
70
+ u32(contracts.operation_transport),
71
+ u32(contracts.authorization_binding),
72
+ u32(contracts.semantic_capabilities),
73
+ optionalU32(contracts.durable_mutation),
61
74
  u32(operationFields.length),
62
75
  ...operationFields,
63
76
  requestedFiles(binding.requested_files),
64
77
  optionalUuid(binding.collection_id)
65
78
  ]);
66
79
  }
80
+ function optionalU32(value) {
81
+ return value === undefined
82
+ ? new Uint8Array(1)
83
+ : concat([new Uint8Array([1]), u32(value)]);
84
+ }
67
85
  function validateRequestedFiles(files) {
68
86
  if (files === undefined)
69
87
  return;
@@ -78,7 +96,7 @@ function validateRequestedFiles(files) {
78
96
  }
79
97
  function requestedFiles(files) {
80
98
  if (files === undefined)
81
- return new Uint8Array([0]);
99
+ return new Uint8Array(1);
82
100
  const actions = files.actions.map((action) => field(new TextEncoder().encode(action)));
83
101
  return concat([
84
102
  new Uint8Array([1]),
@@ -95,12 +113,12 @@ function requestedFiles(files) {
95
113
  }
96
114
  function optionalString(value) {
97
115
  return value === undefined
98
- ? new Uint8Array([0])
116
+ ? new Uint8Array(1)
99
117
  : concat([new Uint8Array([1]), field(new TextEncoder().encode(value))]);
100
118
  }
101
119
  function optionalUuid(value) {
102
120
  return value === undefined
103
- ? new Uint8Array([0])
121
+ ? new Uint8Array(1)
104
122
  : concat([new Uint8Array([1]), field(uuidBytes(value))]);
105
123
  }
106
124
  function publicKey(value) {
@@ -26,6 +26,7 @@ export declare const APPLICATION_CAPABILITY_DEFINITIONS: {
26
26
  readonly "definitions.update": readonly ["update_type"];
27
27
  readonly "definitions.type-pack.inspect": readonly ["assess_type_pack"];
28
28
  readonly "definitions.type-pack.apply": readonly ["assess_type_pack", "apply_type_pack"];
29
+ readonly "collection.setup.apply": readonly ["assess_collection_setup", "apply_collection_setup"];
29
30
  readonly "timers.list": readonly ["list_timers"];
30
31
  readonly "timers.put": readonly ["put_timer"];
31
32
  readonly "timers.cancel": readonly ["cancel_timer"];
@@ -25,6 +25,7 @@ export const APPLICATION_CAPABILITY_DEFINITIONS = {
25
25
  "definitions.update": ["update_type"],
26
26
  "definitions.type-pack.inspect": ["assess_type_pack"],
27
27
  "definitions.type-pack.apply": ["assess_type_pack", "apply_type_pack"],
28
+ "collection.setup.apply": ["assess_collection_setup", "apply_collection_setup"],
28
29
  "timers.list": ["list_timers"],
29
30
  "timers.put": ["put_timer"],
30
31
  "timers.cancel": ["cancel_timer"],
@@ -0,0 +1,83 @@
1
+ import type { ContractSetupChoice, TypePackAssessment, TypePackProvision, TypePackReceipt } from "./type-packs.js";
2
+ export type ConfigurationContributionValue = string | number | boolean | null;
3
+ export interface ConfigurationRequirement {
4
+ id: string;
5
+ path: string;
6
+ predicate: "contains";
7
+ value: ConfigurationContributionValue;
8
+ }
9
+ export interface ConfigurationProvision {
10
+ requirement: string;
11
+ operation: "set_add";
12
+ path: string;
13
+ value: ConfigurationContributionValue;
14
+ }
15
+ export interface ApplicationCollectionSetupRequirements {
16
+ configuration: ConfigurationRequirement[];
17
+ }
18
+ export interface ApplicationCollectionSetupProvisions {
19
+ configuration: ConfigurationProvision[];
20
+ type_packs: TypePackProvision[];
21
+ }
22
+ export interface AssessCollectionSetupInput {
23
+ /** Stable application declaration id, not the server's database id. */
24
+ application_id: string;
25
+ /** Exact canonical digest of the complete registered application declaration. */
26
+ declaration_digest: string;
27
+ requirements: ApplicationCollectionSetupRequirements;
28
+ provisions: ApplicationCollectionSetupProvisions;
29
+ /** Collection-owner choices for user-owned contract implementations. */
30
+ contract_setups?: ContractSetupChoice[];
31
+ }
32
+ export interface ApplyCollectionSetupInput extends AssessCollectionSetupInput {
33
+ expected_assessment_digest: string;
34
+ expected_collection_revision: string;
35
+ expected_provision_digest: string;
36
+ allow_type_pack_downgrades?: string[];
37
+ }
38
+ export interface ConfigurationSetupConflict {
39
+ code: "configuration_path_conflict" | "configuration_type_conflict";
40
+ path: string;
41
+ expected: "mapping" | "sequence";
42
+ observed: "null" | "boolean" | "number" | "string" | "sequence" | "mapping" | "tagged";
43
+ message: string;
44
+ }
45
+ export interface ConfigurationSetupAssessment {
46
+ requirement: string;
47
+ path: string;
48
+ value: ConfigurationContributionValue;
49
+ action: "current" | "add" | "conflict";
50
+ conflict?: ConfigurationSetupConflict;
51
+ }
52
+ export interface CollectionSetupAssessment {
53
+ status: "current" | "provision" | "conflict";
54
+ applicable: boolean;
55
+ application_id: string;
56
+ declaration_digest: string;
57
+ provision_digest: string;
58
+ collection_revision: string;
59
+ final_collection_revision: string;
60
+ configuration: ConfigurationSetupAssessment[];
61
+ type_packs: TypePackAssessment[];
62
+ final_resource_revisions: Record<string, string>;
63
+ assessment_digest: string;
64
+ }
65
+ export interface ConfigurationContributionReceipt {
66
+ requirement: string;
67
+ path: string;
68
+ value: ConfigurationContributionValue;
69
+ }
70
+ export interface CollectionSetupReceipt {
71
+ application_id: string;
72
+ declaration_digest: string;
73
+ provision_digest: string;
74
+ assessment_digest: string;
75
+ collection_revision: string;
76
+ configuration: ConfigurationContributionReceipt[];
77
+ type_packs: TypePackReceipt[];
78
+ cleanup_deferred: boolean;
79
+ }
80
+ export interface CollectionSetupApplyResult {
81
+ assessment: CollectionSetupAssessment;
82
+ receipt: CollectionSetupReceipt;
83
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import type { ApplicationFileRequirement } from "./files.js";
2
+ import { type CollectionOperation } from "./operations.js";
3
+ export declare const OPERATION_TRANSPORT_PROTOCOL_VERSION: 2;
4
+ export declare const AUTHORIZATION_BINDING_PROTOCOL_VERSION: 4;
5
+ export declare const SEMANTIC_CAPABILITY_CONTRACT_VERSION: 1;
6
+ export declare const DURABLE_MUTATION_CONTRACT_VERSION: 1;
7
+ export interface ConnectContractRequirements {
8
+ operation_transport: number;
9
+ authorization_binding: number;
10
+ semantic_capabilities: number;
11
+ /** Required only by operations that can durably mutate authority state. */
12
+ durable_mutation?: number;
13
+ }
14
+ export interface ConnectContractSupport {
15
+ operation_transport: number[];
16
+ authorization_binding: number[];
17
+ semantic_capabilities: number[];
18
+ durable_mutation: number[];
19
+ }
20
+ export declare const CONNECT_CONTRACT_SUPPORT: ConnectContractSupport;
21
+ /**
22
+ * Produce the exact contract ceiling signed during authorization. `sync` is
23
+ * conservatively mutation-capable because its action is selected per request.
24
+ */
25
+ export declare function authorizationContractRequirements(operations: readonly CollectionOperation[], files?: ApplicationFileRequirement): ConnectContractRequirements;
26
+ export declare function supportsContractRequirements(required: ConnectContractRequirements, supported: ConnectContractSupport, durableMutation: boolean): boolean;
@@ -0,0 +1,35 @@
1
+ import { isMutatingOperation } from "./operations.js";
2
+ export const OPERATION_TRANSPORT_PROTOCOL_VERSION = 2;
3
+ export const AUTHORIZATION_BINDING_PROTOCOL_VERSION = 4;
4
+ export const SEMANTIC_CAPABILITY_CONTRACT_VERSION = 1;
5
+ export const DURABLE_MUTATION_CONTRACT_VERSION = 1;
6
+ export const CONNECT_CONTRACT_SUPPORT = {
7
+ operation_transport: [OPERATION_TRANSPORT_PROTOCOL_VERSION],
8
+ authorization_binding: [AUTHORIZATION_BINDING_PROTOCOL_VERSION],
9
+ semantic_capabilities: [SEMANTIC_CAPABILITY_CONTRACT_VERSION],
10
+ durable_mutation: [DURABLE_MUTATION_CONTRACT_VERSION]
11
+ };
12
+ /**
13
+ * Produce the exact contract ceiling signed during authorization. `sync` is
14
+ * conservatively mutation-capable because its action is selected per request.
15
+ */
16
+ export function authorizationContractRequirements(operations, files) {
17
+ const requirements = {
18
+ operation_transport: OPERATION_TRANSPORT_PROTOCOL_VERSION,
19
+ authorization_binding: AUTHORIZATION_BINDING_PROTOCOL_VERSION,
20
+ semantic_capabilities: 1
21
+ };
22
+ if (operations.some((operation) => isMutatingOperation(operation, { action: "mutate" }))
23
+ || files?.actions.some((action) => action !== "list" && action !== "read") === true) {
24
+ requirements.durable_mutation = 1;
25
+ }
26
+ return requirements;
27
+ }
28
+ export function supportsContractRequirements(required, supported, durableMutation) {
29
+ return supported.operation_transport.includes(required.operation_transport)
30
+ && supported.authorization_binding.includes(required.authorization_binding)
31
+ && supported.semantic_capabilities.includes(required.semantic_capabilities)
32
+ && (!durableMutation
33
+ || (required.durable_mutation !== undefined
34
+ && supported.durable_mutation.includes(required.durable_mutation)));
35
+ }
@@ -20,6 +20,10 @@ export declare const CONNECT_PROBLEM_CATALOG: {
20
20
  readonly category: "authorization";
21
21
  readonly recovery: "reauthorize";
22
22
  };
23
+ readonly authorization_binding_incompatible: {
24
+ readonly category: "compatibility";
25
+ readonly recovery: "upgrade_application";
26
+ };
23
27
  readonly authorization_cancelled: {
24
28
  readonly category: "cancellation";
25
29
  readonly recovery: "none";
@@ -40,6 +44,10 @@ export declare const CONNECT_PROBLEM_CATALOG: {
40
44
  readonly category: "validation";
41
45
  readonly recovery: "fix_request";
42
46
  };
47
+ readonly capability_contract_incompatible: {
48
+ readonly category: "compatibility";
49
+ readonly recovery: "upgrade_application";
50
+ };
43
51
  readonly change_cursor_reset: {
44
52
  readonly category: "conflict";
45
53
  readonly recovery: "refresh";
@@ -120,6 +128,10 @@ export declare const CONNECT_PROBLEM_CATALOG: {
120
128
  readonly category: "availability";
121
129
  readonly recovery: "retry";
122
130
  };
131
+ readonly durable_mutation_unsupported: {
132
+ readonly category: "compatibility";
133
+ readonly recovery: "upgrade_connector";
134
+ };
123
135
  readonly encrypted_relay_rejected: {
124
136
  readonly category: "authorization";
125
137
  readonly recovery: "reauthorize";
@@ -240,6 +252,14 @@ export declare const CONNECT_PROBLEM_CATALOG: {
240
252
  readonly category: "authorization";
241
253
  readonly recovery: "reauthorize";
242
254
  };
255
+ readonly mutation_recovery_expired: {
256
+ readonly category: "compatibility";
257
+ readonly recovery: "none";
258
+ };
259
+ readonly mutation_request_conflict: {
260
+ readonly category: "conflict";
261
+ readonly recovery: "resolve_conflict";
262
+ };
243
263
  readonly no_pending_mutation: {
244
264
  readonly category: "conflict";
245
265
  readonly recovery: "refresh";
@@ -320,6 +340,26 @@ export declare const CONNECT_PROBLEM_CATALOG: {
320
340
  readonly category: "compatibility";
321
341
  readonly recovery: "fix_request";
322
342
  };
343
+ readonly registry_backup_invalid: {
344
+ readonly category: "integrity";
345
+ readonly recovery: "contact_support";
346
+ };
347
+ readonly registry_busy: {
348
+ readonly category: "availability";
349
+ readonly recovery: "retry";
350
+ };
351
+ readonly registry_corrupt: {
352
+ readonly category: "integrity";
353
+ readonly recovery: "repair_collection";
354
+ };
355
+ readonly registry_migration_failed: {
356
+ readonly category: "internal";
357
+ readonly recovery: "contact_support";
358
+ };
359
+ readonly registry_schema_incompatible: {
360
+ readonly category: "compatibility";
361
+ readonly recovery: "upgrade_connector";
362
+ };
323
363
  readonly relay_authorization_expired: {
324
364
  readonly category: "authorization";
325
365
  readonly recovery: "reauthorize";
@@ -360,6 +400,10 @@ export declare const CONNECT_PROBLEM_CATALOG: {
360
400
  readonly category: "availability";
361
401
  readonly recovery: "retry";
362
402
  };
403
+ readonly transport_protocol_incompatible: {
404
+ readonly category: "compatibility";
405
+ readonly recovery: "upgrade_connector";
406
+ };
363
407
  readonly type_pack_provision_failed: {
364
408
  readonly category: "validation";
365
409
  readonly recovery: "repair_collection";
@@ -405,11 +449,25 @@ export interface ConnectProblemDetailsByCode {
405
449
  "interval_seconds": number;
406
450
  };
407
451
  "authority_authorization_changed": undefined;
452
+ "authorization_binding_incompatible": {
453
+ "contract": string;
454
+ "required": Array<number>;
455
+ "supported": Array<number>;
456
+ "peer": string;
457
+ "operation"?: string;
458
+ };
408
459
  "authorization_cancelled": undefined;
409
460
  "authorization_expired": undefined;
410
461
  "authorization_replayed": undefined;
411
462
  "browser_required": undefined;
412
463
  "callback_url_required": undefined;
464
+ "capability_contract_incompatible": {
465
+ "contract": string;
466
+ "required": Array<number>;
467
+ "supported": Array<number>;
468
+ "peer": string;
469
+ "operation"?: string;
470
+ };
413
471
  "change_cursor_reset": undefined;
414
472
  "collection_access_denied": undefined;
415
473
  "collection_configuration_invalid": {
@@ -446,6 +504,13 @@ export interface ConnectProblemDetailsByCode {
446
504
  "device_authorization_failed": undefined;
447
505
  "direct_operation_rejected": undefined;
448
506
  "discovery_failed": undefined;
507
+ "durable_mutation_unsupported": {
508
+ "contract": string;
509
+ "required": Array<number>;
510
+ "supported": Array<number>;
511
+ "peer": string;
512
+ "operation"?: string;
513
+ };
449
514
  "encrypted_relay_rejected": undefined;
450
515
  "encryption_required": undefined;
451
516
  "expired_token": undefined;
@@ -487,6 +552,10 @@ export interface ConnectProblemDetailsByCode {
487
552
  "manifest_load_failed": undefined;
488
553
  "manifest_required": undefined;
489
554
  "missing_grant_key": undefined;
555
+ "mutation_recovery_expired": undefined;
556
+ "mutation_request_conflict": {
557
+ "request_id": string;
558
+ };
490
559
  "no_pending_mutation": undefined;
491
560
  "not_authorized": undefined;
492
561
  "not_remote_authority": undefined;
@@ -502,7 +571,9 @@ export interface ConnectProblemDetailsByCode {
502
571
  "diagnostics": Array<Record<string, unknown>>;
503
572
  "partial_result"?: unknown;
504
573
  };
505
- "operation_outcome_unknown": undefined;
574
+ "operation_outcome_unknown": {
575
+ "request_id": string;
576
+ };
506
577
  "path_occupied": undefined;
507
578
  "pending_mutation_unresolved": undefined;
508
579
  "query_snapshot_changed": undefined;
@@ -512,6 +583,11 @@ export interface ConnectProblemDetailsByCode {
512
583
  "reconnect_required": undefined;
513
584
  "redirect_uri_required": undefined;
514
585
  "reference_updates_unsupported": undefined;
586
+ "registry_backup_invalid": undefined;
587
+ "registry_busy": undefined;
588
+ "registry_corrupt": undefined;
589
+ "registry_migration_failed": undefined;
590
+ "registry_schema_incompatible": undefined;
515
591
  "relay_authorization_expired": undefined;
516
592
  "relay_unavailable": undefined;
517
593
  "sandbox_unsupported": undefined;
@@ -522,6 +598,13 @@ export interface ConnectProblemDetailsByCode {
522
598
  "temporarily_unavailable": undefined;
523
599
  "timeout": undefined;
524
600
  "token_exchange_failed": undefined;
601
+ "transport_protocol_incompatible": {
602
+ "contract": string;
603
+ "required": Array<number>;
604
+ "supported": Array<number>;
605
+ "peer": string;
606
+ "operation"?: string;
607
+ };
525
608
  "type_pack_provision_failed": undefined;
526
609
  "unknown_collection": undefined;
527
610
  "unsafe_file_path": undefined;
@@ -559,6 +642,12 @@ export interface ConnectProblemByCode {
559
642
  recovery: "reauthorize";
560
643
  details?: never;
561
644
  };
645
+ "authorization_binding_incompatible": ConnectProblemBase & {
646
+ code: "authorization_binding_incompatible";
647
+ category: "compatibility";
648
+ recovery: "upgrade_application";
649
+ details: ConnectProblemDetailsByCode["authorization_binding_incompatible"];
650
+ };
562
651
  "authorization_cancelled": ConnectProblemBase & {
563
652
  code: "authorization_cancelled";
564
653
  category: "cancellation";
@@ -589,6 +678,12 @@ export interface ConnectProblemByCode {
589
678
  recovery: "fix_request";
590
679
  details?: never;
591
680
  };
681
+ "capability_contract_incompatible": ConnectProblemBase & {
682
+ code: "capability_contract_incompatible";
683
+ category: "compatibility";
684
+ recovery: "upgrade_application";
685
+ details: ConnectProblemDetailsByCode["capability_contract_incompatible"];
686
+ };
592
687
  "change_cursor_reset": ConnectProblemBase & {
593
688
  code: "change_cursor_reset";
594
689
  category: "conflict";
@@ -709,6 +804,12 @@ export interface ConnectProblemByCode {
709
804
  recovery: "retry";
710
805
  details?: never;
711
806
  };
807
+ "durable_mutation_unsupported": ConnectProblemBase & {
808
+ code: "durable_mutation_unsupported";
809
+ category: "compatibility";
810
+ recovery: "upgrade_connector";
811
+ details: ConnectProblemDetailsByCode["durable_mutation_unsupported"];
812
+ };
712
813
  "encrypted_relay_rejected": ConnectProblemBase & {
713
814
  code: "encrypted_relay_rejected";
714
815
  category: "authorization";
@@ -889,6 +990,18 @@ export interface ConnectProblemByCode {
889
990
  recovery: "reauthorize";
890
991
  details?: never;
891
992
  };
993
+ "mutation_recovery_expired": ConnectProblemBase & {
994
+ code: "mutation_recovery_expired";
995
+ category: "compatibility";
996
+ recovery: "none";
997
+ details?: never;
998
+ };
999
+ "mutation_request_conflict": ConnectProblemBase & {
1000
+ code: "mutation_request_conflict";
1001
+ category: "conflict";
1002
+ recovery: "resolve_conflict";
1003
+ details: ConnectProblemDetailsByCode["mutation_request_conflict"];
1004
+ };
892
1005
  "no_pending_mutation": ConnectProblemBase & {
893
1006
  code: "no_pending_mutation";
894
1007
  category: "conflict";
@@ -965,7 +1078,7 @@ export interface ConnectProblemByCode {
965
1078
  code: "operation_outcome_unknown";
966
1079
  category: "conflict";
967
1080
  recovery: "resolve_outcome";
968
- details?: never;
1081
+ details: ConnectProblemDetailsByCode["operation_outcome_unknown"];
969
1082
  };
970
1083
  "path_occupied": ConnectProblemBase & {
971
1084
  code: "path_occupied";
@@ -1009,6 +1122,36 @@ export interface ConnectProblemByCode {
1009
1122
  recovery: "fix_request";
1010
1123
  details?: never;
1011
1124
  };
1125
+ "registry_backup_invalid": ConnectProblemBase & {
1126
+ code: "registry_backup_invalid";
1127
+ category: "integrity";
1128
+ recovery: "contact_support";
1129
+ details?: never;
1130
+ };
1131
+ "registry_busy": ConnectProblemBase & {
1132
+ code: "registry_busy";
1133
+ category: "availability";
1134
+ recovery: "retry";
1135
+ details?: never;
1136
+ };
1137
+ "registry_corrupt": ConnectProblemBase & {
1138
+ code: "registry_corrupt";
1139
+ category: "integrity";
1140
+ recovery: "repair_collection";
1141
+ details?: never;
1142
+ };
1143
+ "registry_migration_failed": ConnectProblemBase & {
1144
+ code: "registry_migration_failed";
1145
+ category: "internal";
1146
+ recovery: "contact_support";
1147
+ details?: never;
1148
+ };
1149
+ "registry_schema_incompatible": ConnectProblemBase & {
1150
+ code: "registry_schema_incompatible";
1151
+ category: "compatibility";
1152
+ recovery: "upgrade_connector";
1153
+ details?: never;
1154
+ };
1012
1155
  "relay_authorization_expired": ConnectProblemBase & {
1013
1156
  code: "relay_authorization_expired";
1014
1157
  category: "authorization";
@@ -1069,6 +1212,12 @@ export interface ConnectProblemByCode {
1069
1212
  recovery: "retry";
1070
1213
  details?: never;
1071
1214
  };
1215
+ "transport_protocol_incompatible": ConnectProblemBase & {
1216
+ code: "transport_protocol_incompatible";
1217
+ category: "compatibility";
1218
+ recovery: "upgrade_connector";
1219
+ details: ConnectProblemDetailsByCode["transport_protocol_incompatible"];
1220
+ };
1072
1221
  "type_pack_provision_failed": ConnectProblemBase & {
1073
1222
  code: "type_pack_provision_failed";
1074
1223
  category: "validation";