@mdbase-dev/connect 0.1.0-beta.126 → 0.1.0-beta.147

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 (49) hide show
  1. package/dist/application-session.d.ts +1 -1
  2. package/dist/application-session.js +1 -1
  3. package/dist/async.d.ts +6 -0
  4. package/dist/async.js +39 -0
  5. package/dist/authorization-refresh.d.ts +2 -0
  6. package/dist/authorization-refresh.js +13 -1
  7. package/dist/browser/integrity.json +1 -1
  8. package/dist/browser/mdbase-connect.min.js +4 -4
  9. package/dist/browser/mdbase-connect.min.js.sha384 +1 -1
  10. package/dist/capabilities.d.ts +1 -1
  11. package/dist/collection-client.d.ts +2 -0
  12. package/dist/collection-client.js +8 -4
  13. package/dist/connect-options.d.ts +1 -1
  14. package/dist/connect.d.ts +1 -1
  15. package/dist/connect.js +1 -1
  16. package/dist/connection.d.ts +2 -1
  17. package/dist/connection.js +3 -1
  18. package/dist/control-timers.d.ts +43 -0
  19. package/dist/control-timers.js +290 -0
  20. package/dist/errors.d.ts +2 -28
  21. package/dist/errors.js +2 -52
  22. package/dist/file-transfer-internals.d.ts +2 -1
  23. package/dist/file-transfer-internals.js +10 -3
  24. package/dist/files.d.ts +4 -0
  25. package/dist/files.js +17 -18
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.js +1 -0
  28. package/dist/internal-types.d.ts +2 -2
  29. package/dist/internal-types.js +1 -1
  30. package/dist/mdbase-connect.d.ts +1 -1
  31. package/dist/observe.d.ts +81 -0
  32. package/dist/observe.js +390 -0
  33. package/dist/operation-types.d.ts +3 -1
  34. package/dist/outcomes.d.ts +13 -13
  35. package/dist/outcomes.js +17 -0
  36. package/dist/query-pagination-internals.d.ts +1 -1
  37. package/dist/query-pagination-internals.js +4 -2
  38. package/dist/query-pagination.js +1 -1
  39. package/dist/query-wire.d.ts +16 -10
  40. package/dist/query-wire.js +44 -13
  41. package/dist/read-many.js +4 -2
  42. package/dist/runtime-utils.d.ts +1 -1
  43. package/dist/saved-view-pagination.js +1 -1
  44. package/dist/session.d.ts +1 -1
  45. package/dist/session.js +1 -1
  46. package/dist/structured-readiness.d.ts +1 -1
  47. package/package.json +6 -2
  48. package/dist/application-contract.d.ts +0 -22
  49. package/dist/application-contract.js +0 -75
@@ -69,11 +69,13 @@ export interface QueryRecord<Frontmatter extends JsonObject = JsonObject> {
69
69
  /** Query-shaped projection; qualified document batches supply exact-source revisions. */
70
70
  export type ReadManyRecord<Frontmatter extends JsonObject = JsonObject> = QueryRecord<Frontmatter>;
71
71
  export interface ReadManyOptions extends ConnectRequestOptions {
72
+ /** Default true: prefer negotiated document revisions. False uses read-only path queries; no revision guarantee. */
73
+ revisions?: boolean;
72
74
  includeBody?: boolean;
73
75
  frontmatterMode?: QueryInput["frontmatterMode"];
74
76
  /** Restrict matching records to these raw collection types, not a contract view. */
75
77
  types?: string[];
76
- /** Unique paths per batch, default 100; range 1..1,000. Document authorities cap at 100. */
78
+ /** Unique paths per batch, default 100 (1,000 with revisions:false); range 1..1,000. Document authorities cap at 100. */
77
79
  batchSize?: number;
78
80
  /** Independent batches in flight, default 4; range 1..4. Cursor pages stay serial. */
79
81
  concurrency?: number;
@@ -13,19 +13,19 @@ export type ConnectFailure<Code extends ConnectProblemCode = ConnectProblemCode>
13
13
  * for programming errors and broken SDK invariants.
14
14
  */
15
15
  export type ConnectOutcome<Value, Code extends ConnectProblemCode = ConnectProblemCode> = ConnectSuccess<Value> | ConnectFailure<Code>;
16
- export type CommonOperationProblemCode = "access_denied" | "access_paused" | "application_declaration_mismatch" | "authorization_binding_incompatible" | "authorization_expired" | "capability_contract_incompatible" | "collection_access_denied" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "direct_operation_rejected" | "durable_mutation_unsupported" | "operation_outcome_unknown" | "encryption_required" | "encrypted_relay_rejected" | "hosted_provider_unavailable" | "insufficient_access" | "invalid_encrypted_response" | "invalid_operation_response" | "invalid_request" | "missing_grant_key" | "mutation_recovery_expired" | "mutation_request_conflict" | "not_authorized" | "operation_cancelled" | "operation_failed" | "rate_limited" | "relay_authorization_expired" | "relay_unavailable" | "temporarily_unavailable" | "timeout" | "transport_protocol_incompatible" | "unsupported_operation";
17
- export declare const COMMON_OPERATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation"];
16
+ export type CommonOperationProblemCode = "application_authorization_issuance_disabled" | "application_reauthorization_required" | "application_semantic_version_mismatch" | "invalid_replica" | "notification_grant_reauthorization_required" | "origin_denied" | "replica_scope_denied" | "scope_changed" | "scope_denied" | "scope_epoch_stale" | "timer_grant_unavailable" | "access_denied" | "access_paused" | "application_declaration_mismatch" | "authorization_binding_incompatible" | "authorization_expired" | "capability_contract_incompatible" | "collection_access_denied" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "direct_operation_rejected" | "durable_mutation_unsupported" | "operation_outcome_unknown" | "encryption_required" | "encrypted_relay_rejected" | "hosted_provider_unavailable" | "insufficient_access" | "invalid_encrypted_response" | "invalid_operation_response" | "invalid_request" | "missing_grant_key" | "mutation_recovery_expired" | "mutation_request_conflict" | "not_authorized" | "operation_cancelled" | "operation_failed" | "rate_limited" | "relay_authorization_expired" | "relay_unavailable" | "temporarily_unavailable" | "timeout" | "transport_protocol_incompatible" | "unsupported_operation";
17
+ export declare const COMMON_OPERATION_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation"];
18
18
  export declare const ALL_CONNECT_PROBLEM_CODES: ConnectProblemCode[];
19
19
  export type RegistrationProblemCode = "discovery_failed" | "invalid_operation_response" | "invalid_application_manifest" | "invalid_request" | "manifest_load_failed" | "rate_limited" | "temporarily_unavailable" | "timeout";
20
20
  export declare const REGISTRATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout"];
21
- export type AuthorizationProblemCode = RegistrationProblemCode | "access_denied" | "application_declaration_mismatch" | "application_identity_unavailable" | "approval_window_blocked" | "authorization_binding_incompatible" | "authorization_cancelled" | "authorization_replayed" | "browser_required" | "capability_contract_incompatible" | "collection_access_denied" | "collection_configuration_invalid" | "collection_contracts_missing" | "collection_incompatible" | "collection_invalid" | "collection_kind_unsupported" | "collection_mismatch" | "collection_not_found" | "collection_type_registry_invalid" | "collection_version_unsupported" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "device_authorization_failed" | "durable_mutation_unsupported" | "encryption_required" | "expired_token" | "invalid_application_authorization" | "invalid_callback" | "invalid_device_authorization_response" | "invalid_token_response" | "legacy_scope_reauthorization_required" | "scope_denied" | "reconnect_required" | "token_exchange_failed" | "transport_protocol_incompatible";
22
- export declare const AUTHORIZATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_declaration_mismatch", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "legacy_scope_reauthorization_required", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible"];
23
- export type NotificationProblemCode = RegistrationProblemCode | "authorization_expired" | "invalid_operation_response" | "invalid_push_subscription" | "managed_fcm_not_declared" | "not_authorized" | "notification_criterion_not_declared" | "notification_reauthorization_required" | "notification_registration_failed" | "notification_unregistration_failed" | "notifications_not_declared" | "notifications_unavailable";
24
- export declare const NOTIFICATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "authorization_expired", "invalid_operation_response", "invalid_push_subscription", "managed_fcm_not_declared", "not_authorized", "notification_criterion_not_declared", "notification_reauthorization_required", "notification_registration_failed", "notification_unregistration_failed", "notifications_not_declared", "notifications_unavailable"];
21
+ export type AuthorizationProblemCode = RegistrationProblemCode | "application_authorization_issuance_disabled" | "application_reauthorization_required" | "application_semantic_version_mismatch" | "invalid_replica" | "origin_denied" | "access_denied" | "application_declaration_mismatch" | "application_identity_unavailable" | "approval_window_blocked" | "authorization_binding_incompatible" | "authorization_cancelled" | "authorization_replayed" | "browser_required" | "capability_contract_incompatible" | "collection_access_denied" | "collection_configuration_invalid" | "collection_contracts_missing" | "collection_incompatible" | "collection_invalid" | "collection_kind_unsupported" | "collection_mismatch" | "collection_not_found" | "collection_type_registry_invalid" | "collection_version_unsupported" | "connector_identity_changed" | "connector_offline" | "connector_upgrade_required" | "device_authorization_failed" | "durable_mutation_unsupported" | "encryption_required" | "expired_token" | "invalid_application_authorization" | "invalid_callback" | "invalid_device_authorization_response" | "invalid_token_response" | "legacy_scope_reauthorization_required" | "scope_denied" | "reconnect_required" | "token_exchange_failed" | "transport_protocol_incompatible";
22
+ export declare const AUTHORIZATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "origin_denied", "access_denied", "application_declaration_mismatch", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "legacy_scope_reauthorization_required", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible"];
23
+ export type NotificationProblemCode = RegistrationProblemCode | "notification_grant_reauthorization_required" | "authorization_expired" | "invalid_operation_response" | "invalid_push_subscription" | "managed_fcm_not_declared" | "not_authorized" | "notification_criterion_not_declared" | "notification_reauthorization_required" | "notification_registration_failed" | "notification_unregistration_failed" | "notifications_not_declared" | "notifications_unavailable";
24
+ export declare const NOTIFICATION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "notification_grant_reauthorization_required", "authorization_expired", "invalid_operation_response", "invalid_push_subscription", "managed_fcm_not_declared", "not_authorized", "notification_criterion_not_declared", "notification_reauthorization_required", "notification_registration_failed", "notification_unregistration_failed", "notifications_not_declared", "notifications_unavailable"];
25
25
  export type DirectAccessProblemCode = "connector_offline" | "connector_upgrade_required" | "invalid_operation_response" | "not_authorized" | "operation_failed" | "temporarily_unavailable" | "timeout";
26
26
  export declare const DIRECT_ACCESS_PROBLEM_CODES: readonly ["connector_offline", "connector_upgrade_required", "invalid_operation_response", "not_authorized", "operation_failed", "temporarily_unavailable", "timeout"];
27
27
  export type SessionProblemCode = AuthorizationProblemCode | "collection_not_ready" | "collection_not_selected" | "operation_cancelled" | "session_destroyed" | "session_not_started" | "session_starting" | "unknown_collection";
28
- export declare const SESSION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "access_denied", "application_declaration_mismatch", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "legacy_scope_reauthorization_required", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible", "collection_not_ready", "collection_not_selected", "operation_cancelled", "session_destroyed", "session_not_started", "session_starting", "unknown_collection"];
28
+ export declare const SESSION_PROBLEM_CODES: readonly ["discovery_failed", "invalid_operation_response", "invalid_application_manifest", "invalid_request", "manifest_load_failed", "rate_limited", "temporarily_unavailable", "timeout", "application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "origin_denied", "access_denied", "application_declaration_mismatch", "application_identity_unavailable", "approval_window_blocked", "authorization_binding_incompatible", "authorization_cancelled", "authorization_replayed", "browser_required", "capability_contract_incompatible", "collection_access_denied", "collection_configuration_invalid", "collection_contracts_missing", "collection_incompatible", "collection_invalid", "collection_kind_unsupported", "collection_mismatch", "collection_not_found", "collection_type_registry_invalid", "collection_version_unsupported", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "device_authorization_failed", "durable_mutation_unsupported", "encryption_required", "expired_token", "invalid_application_authorization", "invalid_callback", "invalid_device_authorization_response", "invalid_token_response", "legacy_scope_reauthorization_required", "scope_denied", "reconnect_required", "token_exchange_failed", "transport_protocol_incompatible", "collection_not_ready", "collection_not_selected", "operation_cancelled", "session_destroyed", "session_not_started", "session_starting", "unknown_collection"];
29
29
  export type CollectionSetupProblemCode = "collection_configuration_invalid" | "collection_invalid" | "collection_type_registry_invalid" | "collection_version_unsupported";
30
30
  export type CollectionDescriptionProblemCode = CommonOperationProblemCode | CollectionSetupProblemCode;
31
31
  export type CollectionReadProblemCode = CollectionDescriptionProblemCode | "file_not_found" | "invalid_path" | "operation_invalid";
@@ -34,12 +34,12 @@ export type CollectionMutationProblemCode = CollectionReadProblemCode | "concurr
34
34
  export type CollectionChangesProblemCode = CollectionDescriptionProblemCode | "change_cursor_reset";
35
35
  export type CollectionTypeProblemCode = CollectionMutationProblemCode | "type_pack_provision_failed";
36
36
  export declare const COLLECTION_SETUP_PROBLEM_CODES: readonly ["collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
37
- export declare const COLLECTION_DESCRIPTION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
38
- export declare const COLLECTION_READ_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid"];
39
- export declare const COLLECTION_QUERY_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "cursor_capacity_exhausted", "generation_expired", "invalid_read_cursor", "query_snapshot_changed", "sandbox_unsupported"];
40
- export declare const COLLECTION_MUTATION_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved"];
41
- export declare const COLLECTION_CHANGES_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "change_cursor_reset"];
42
- export declare const COLLECTION_TYPE_PROBLEM_CODES: readonly ["access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved", "type_pack_provision_failed"];
37
+ export declare const COLLECTION_DESCRIPTION_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported"];
38
+ export declare const COLLECTION_READ_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid"];
39
+ export declare const COLLECTION_QUERY_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "cursor_capacity_exhausted", "generation_expired", "invalid_read_cursor", "query_snapshot_changed", "sandbox_unsupported"];
40
+ export declare const COLLECTION_MUTATION_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved"];
41
+ export declare const COLLECTION_CHANGES_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "change_cursor_reset"];
42
+ export declare const COLLECTION_TYPE_PROBLEM_CODES: readonly ["application_authorization_issuance_disabled", "application_reauthorization_required", "application_semantic_version_mismatch", "invalid_replica", "notification_grant_reauthorization_required", "origin_denied", "replica_scope_denied", "scope_changed", "scope_denied", "scope_epoch_stale", "timer_grant_unavailable", "access_denied", "access_paused", "application_declaration_mismatch", "authorization_binding_incompatible", "authorization_expired", "capability_contract_incompatible", "collection_access_denied", "connector_identity_changed", "connector_offline", "connector_upgrade_required", "direct_operation_rejected", "durable_mutation_unsupported", "operation_outcome_unknown", "encryption_required", "encrypted_relay_rejected", "hosted_provider_unavailable", "insufficient_access", "invalid_encrypted_response", "invalid_operation_response", "invalid_request", "missing_grant_key", "mutation_recovery_expired", "mutation_request_conflict", "not_authorized", "operation_cancelled", "operation_failed", "rate_limited", "relay_authorization_expired", "relay_unavailable", "temporarily_unavailable", "timeout", "transport_protocol_incompatible", "unsupported_operation", "collection_configuration_invalid", "collection_invalid", "collection_type_registry_invalid", "collection_version_unsupported", "file_not_found", "invalid_path", "operation_invalid", "concurrent_modification", "invalid_preflight", "pending_mutation_unresolved", "type_pack_provision_failed"];
43
43
  export declare function connectSuccess<Value>(value: Value, diagnostics?: MdbaseDiagnostic[]): ConnectSuccess<Value>;
44
44
  export declare function connectFailure<Code extends ConnectProblemCode>(problem: ConnectProblem<Code>): ConnectFailure<Code>;
45
45
  export declare function captureConnectOutcome<Value, Code extends ConnectProblemCode>(operation: () => Promise<Value>, allowedCodes: readonly Code[]): Promise<ConnectOutcome<Value, Code>>;
package/dist/outcomes.js CHANGED
@@ -1,6 +1,17 @@
1
1
  import { CONNECT_PROBLEM_CATALOG } from "@mdbase-dev/connect-protocol";
2
2
  import { MdbaseConnectError, unknownConnectProblem } from "./errors.js";
3
3
  export const COMMON_OPERATION_PROBLEM_CODES = [
4
+ "application_authorization_issuance_disabled",
5
+ "application_reauthorization_required",
6
+ "application_semantic_version_mismatch",
7
+ "invalid_replica",
8
+ "notification_grant_reauthorization_required",
9
+ "origin_denied",
10
+ "replica_scope_denied",
11
+ "scope_changed",
12
+ "scope_denied",
13
+ "scope_epoch_stale",
14
+ "timer_grant_unavailable",
4
15
  "access_denied",
5
16
  "access_paused",
6
17
  "application_declaration_mismatch",
@@ -48,6 +59,11 @@ export const REGISTRATION_PROBLEM_CODES = [
48
59
  ];
49
60
  export const AUTHORIZATION_PROBLEM_CODES = [
50
61
  ...REGISTRATION_PROBLEM_CODES,
62
+ "application_authorization_issuance_disabled",
63
+ "application_reauthorization_required",
64
+ "application_semantic_version_mismatch",
65
+ "invalid_replica",
66
+ "origin_denied",
51
67
  "access_denied",
52
68
  "application_declaration_mismatch",
53
69
  "application_identity_unavailable",
@@ -86,6 +102,7 @@ export const AUTHORIZATION_PROBLEM_CODES = [
86
102
  ];
87
103
  export const NOTIFICATION_PROBLEM_CODES = [
88
104
  ...REGISTRATION_PROBLEM_CODES,
105
+ "notification_grant_reauthorization_required",
89
106
  "authorization_expired",
90
107
  "invalid_operation_response",
91
108
  "invalid_push_subscription",
@@ -1,7 +1,7 @@
1
1
  /** Owns the latest single-use cursor, including while an iterator is paused at yield. */
2
2
  export declare function queryCursorLease(release: (cursor: string) => Promise<void>, signal?: AbortSignal, initialCursor?: string): {
3
3
  startRequest(): void;
4
- finishRequest(nextCursor?: string): void;
4
+ finishRequest(nextCursor: string | undefined, succeeded: boolean): void;
5
5
  dispose(): void;
6
6
  };
7
7
  export declare function resultCap(value?: number): number;
@@ -19,8 +19,10 @@ export function queryCursorLease(release, signal, initialCursor) {
19
19
  signal?.addEventListener("abort", abort, { once: true });
20
20
  return {
21
21
  startRequest() { inFlight = true; },
22
- finishRequest(nextCursor) {
23
- if (nextCursor)
22
+ finishRequest(nextCursor, succeeded) {
23
+ // A successful continuation consumes the previous token, including on the
24
+ // terminal page. Failures retain it for best-effort cleanup.
25
+ if (succeeded)
24
26
  cursor = nextCursor;
25
27
  inFlight = false;
26
28
  if (signal?.aborted)
@@ -62,7 +62,7 @@ export async function* coordinatedQueryPages(query, releaseQueryCursor, input =
62
62
  offset
63
63
  }, pageRequestOptions);
64
64
  }
65
- lease.finishRequest(queried.ok ? queried.value.meta?.cursor : undefined);
65
+ lease.finishRequest(queried.ok ? queried.value.meta?.cursor : undefined, queried.ok);
66
66
  if (options.signal?.aborted)
67
67
  return;
68
68
  if (!queried.ok) {
@@ -31,21 +31,27 @@ export declare function wireQueryInput(input: QueryInput | QueryMetadataInput):
31
31
  };
32
32
  } | undefined;
33
33
  where?: string | undefined;
34
- select?: (string | {
35
- name: string;
36
- expr: string;
37
- label?: string | undefined;
38
- description?: string | undefined;
39
- })[] | undefined;
40
- order_by?: import("./operation-types.js").QueryOrder[] | undefined;
41
- group_by?: import("./operation-types.js").QueryOrder[] | undefined;
34
+ select?: string[] | undefined;
35
+ order_by?: {
36
+ direction?: "asc" | "desc";
37
+ field: string;
38
+ }[] | undefined;
39
+ group_by?: {
40
+ direction?: "asc" | "desc";
41
+ field: string;
42
+ }[] | undefined;
42
43
  summary_functions?: {
43
44
  [k: string]: {
44
45
  expr: string;
45
46
  description?: string | undefined;
46
47
  };
47
48
  } | undefined;
48
- summaries?: import("./operation-types.js").QuerySummary[] | undefined;
49
+ summaries?: {
50
+ function: string;
51
+ name?: string;
52
+ label?: string;
53
+ field: string;
54
+ }[] | undefined;
49
55
  limit?: number | undefined;
50
56
  offset?: number | undefined;
51
57
  pagination?: "cursor" | undefined;
@@ -57,5 +63,5 @@ export declare function wireQueryInput(input: QueryInput | QueryMetadataInput):
57
63
  };
58
64
  export declare function wireDataContractIdentity(value: WireIdentity): DataContractViewIdentity;
59
65
  export declare function wireQueryRecord<Frontmatter extends JsonObject>(value: WireQueryRecord<Frontmatter>): QueryRecord<Frontmatter>;
60
- export declare function wireQueryResult<Frontmatter extends JsonObject>(value: WireQueryResult<Frontmatter>, output: "metadata" | undefined): QueryResult<Frontmatter> | QueryMetadataResult;
66
+ export declare function wireQueryResult<Frontmatter extends JsonObject>(value: WireQueryResult<Frontmatter>, output: "metadata" | undefined, input?: QueryInput | QueryMetadataInput): QueryResult<Frontmatter> | QueryMetadataResult;
61
67
  export declare function wireCollectionDescription(value: WireDescription): CollectionDescription;
@@ -1,32 +1,57 @@
1
1
  import { authorityCapabilities } from "./authority-features.js";
2
2
  import { connectError } from "./errors.js";
3
+ // beta.126's typed QueryRequest accepts only string selections. Lower named
4
+ // expressions to ordinary projections, which both legacy and current hosts
5
+ // accept. Private aliases avoid overwriting user projections or literal fields.
6
+ function querySelections(input) {
7
+ const projections = { ...input.projections };
8
+ const aliases = new Map();
9
+ const occupied = new Set([
10
+ ...Object.keys(projections),
11
+ ...(input.select ?? []).filter((s) => typeof s === "string").map(s => s.replace(/^projection\./, ""))
12
+ ]);
13
+ const select = input.select?.map((selection, index) => {
14
+ if (typeof selection === "string")
15
+ return selection;
16
+ let alias = `connect_select_${index}`;
17
+ while (occupied.has(alias))
18
+ alias += "_";
19
+ occupied.add(alias);
20
+ // Selections run after filtering; don't evaluate them on rejected rows.
21
+ projections[alias] = { expression: input.where ? `(${input.where}) ? (${selection.expression}) : null` : selection.expression };
22
+ aliases.set(alias, selection.name);
23
+ return `projection.${alias}`;
24
+ });
25
+ const field = (name) => {
26
+ for (const [alias, original] of aliases)
27
+ if (original === name)
28
+ return alias;
29
+ return name;
30
+ };
31
+ return { projections, aliases, select, field };
32
+ }
3
33
  export function wireQueryInput(input) {
34
+ const selection = querySelections(input);
4
35
  return {
5
36
  ...(input.output ? { output: input.output } : {}),
6
37
  ...(input.types ? { types: input.types } : {}),
7
38
  ...(input.timezone ? { timezone: input.timezone } : {}),
8
39
  ...(input.context ? { context: input.context } : {}),
9
- ...(input.projections ? {
10
- projections: Object.fromEntries(Object.entries(input.projections).map(([name, projection]) => [
40
+ ...(Object.keys(selection.projections).length ? {
41
+ projections: Object.fromEntries(Object.entries(selection.projections).map(([name, projection]) => [
11
42
  name, { expr: projection.expression, ...(projection.description ? { description: projection.description } : {}) }
12
43
  ]))
13
44
  } : {}),
14
45
  ...(input.where ? { where: input.where } : {}),
15
- ...(input.select ? {
16
- select: input.select.map(selection => typeof selection === "string" ? selection : {
17
- name: selection.name, expr: selection.expression,
18
- ...(selection.label ? { label: selection.label } : {}),
19
- ...(selection.description ? { description: selection.description } : {})
20
- })
21
- } : {}),
22
- ...(input.orderBy ? { order_by: input.orderBy } : {}),
23
- ...(input.groupBy ? { group_by: input.groupBy } : {}),
46
+ ...(selection.select ? { select: selection.select } : {}),
47
+ ...(input.orderBy ? { order_by: input.orderBy.map(order => ({ ...order, field: selection.field(order.field) })) } : {}),
48
+ ...(input.groupBy ? { group_by: input.groupBy.map(order => ({ ...order, field: selection.field(order.field) })) } : {}),
24
49
  ...(input.summaryFunctions ? {
25
50
  summary_functions: Object.fromEntries(Object.entries(input.summaryFunctions).map(([name, projection]) => [
26
51
  name, { expr: projection.expression, ...(projection.description ? { description: projection.description } : {}) }
27
52
  ]))
28
53
  } : {}),
29
- ...(input.summaries ? { summaries: input.summaries } : {}),
54
+ ...(input.summaries ? { summaries: input.summaries.map(summary => ({ ...summary, field: selection.field(summary.field) })) } : {}),
30
55
  ...(input.limit === undefined ? {} : { limit: input.limit }),
31
56
  ...(input.offset === undefined ? {} : { offset: input.offset }),
32
57
  ...(input.pagination ? { pagination: input.pagination } : {}),
@@ -65,10 +90,16 @@ function metadataRecord(value) {
65
90
  ...(value.contract ? { contract: wireDataContractIdentity(value.contract) } : {})
66
91
  };
67
92
  }
68
- export function wireQueryResult(value, output) {
93
+ export function wireQueryResult(value, output, input) {
69
94
  if (!value || !Array.isArray(value.results) || value.output !== output) {
70
95
  throw connectError("invalid_operation_response", "The authority returned an invalid query output mode.");
71
96
  }
97
+ const aliases = input ? querySelections(input).aliases : new Map();
98
+ if (aliases.size)
99
+ value = { ...value, results: value.results.map(row => ({
100
+ ...row,
101
+ ...(row.values ? { values: Object.fromEntries(Object.entries(row.values).map(([key, entry]) => [aliases.get(key) ?? key, entry])) } : {})
102
+ })) };
72
103
  const meta = value.meta ? {
73
104
  ...(typeof value.meta.total_count === "number" ? { totalCount: value.meta.total_count } : {}),
74
105
  ...(value.meta.total_count_outcome === undefined ? {} : { totalCountOutcome: value.meta.total_count_outcome }),
package/dist/read-many.js CHANGED
@@ -3,7 +3,9 @@ import { MdbaseConnectError, connectError, connectProblem } from "./errors.js";
3
3
  import { COLLECTION_QUERY_PROBLEM_CODES, captureConnectOutcome, connectFailure, connectSuccess } from "./outcomes.js";
4
4
  import { requestOptionsWithinBudget, withRequestBudget } from "./request-budget.js";
5
5
  export async function readMany(queryAll, readDocuments, supports, paths, options, defaultTimeoutMs) {
6
- const requestedBatchSize = boundedInteger(options.batchSize ?? 100, 1_000, "batchSize");
6
+ if (options.revisions !== undefined && typeof options.revisions !== "boolean")
7
+ throw new TypeError("revisions must be boolean.");
8
+ const requestedBatchSize = boundedInteger(options.batchSize ?? (options.revisions === false ? 1_000 : 100), 1_000, "batchSize");
7
9
  const concurrency = boundedInteger(options.concurrency ?? 4, 4, "concurrency");
8
10
  if (options.coordination?.latestWins)
9
11
  throw new TypeError("readMany batches cannot use latestWins coordination.");
@@ -32,7 +34,7 @@ export async function readMany(queryAll, readDocuments, supports, paths, options
32
34
  while (!budget.signal.aborted && nextPath < unique.length) {
33
35
  // Recheck cached lifetime evidence at each admission: queued work must
34
36
  // not borrow a retired route's support after reconnect/reauthorization.
35
- const support = await supports?.("read-many-documents-v1", requestOptions);
37
+ const support = options.revisions === false ? undefined : await supports?.("read-many-documents-v1", requestOptions);
36
38
  if (support && !support.ok) {
37
39
  nextPath = unique.length;
38
40
  throw new MdbaseConnectError(support.problem);
@@ -1,5 +1,5 @@
1
1
  import type { FileCapability, GrantEncryption, GrantScope } from "@mdbase-dev/connect-protocol";
2
- import type { MdbaseApplicationManifest as MdbaseAppManifest } from "./application-contract.js";
2
+ import type { MdbaseApplicationManifest as MdbaseAppManifest } from "@mdbase-dev/connect-protocol";
3
3
  import { MdbaseConnectError } from "./errors.js";
4
4
  import type { StoredToken } from "./internal-types.js";
5
5
  import type { MdbaseDeviceAuthorization } from "./connection-types.js";
@@ -25,7 +25,7 @@ export async function* coordinatedSavedViewPages(executeView, releaseQueryCursor
25
25
  timeoutMs: options.pageTimeoutMs,
26
26
  coordination: { ...options.coordination, coalesce: false }
27
27
  });
28
- lease.finishRequest(outcome.ok ? outcome.value.meta.cursor : undefined);
28
+ lease.finishRequest(outcome.ok ? outcome.value.meta.cursor : undefined, outcome.ok);
29
29
  if (options.signal?.aborted)
30
30
  return;
31
31
  if (!outcome.ok) {
package/dist/session.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { CollectionOperation, ConnectProblem, JsonObject } from "@mdbase-dev/connect-protocol";
2
- import { type MdbaseApplicationManifest, type MdbaseApplicationCapabilityId as ApplicationCapabilityId } from "./application-contract.js";
2
+ import { type MdbaseApplicationManifest, type MdbaseApplicationCapabilityId as ApplicationCapabilityId } from "@mdbase-dev/connect-protocol";
3
3
  import { MdbaseConnection, type MdbaseAuthorizationOutcome, type MdbaseAuthorizationResult, type MdbaseAuthorizeOptions } from "./connection.js";
4
4
  import type { MdbaseAuthorizationCapabilities, MdbaseConnectionInfo } from "./connection-types.js";
5
5
  import { type AuthorizationProblemCode, type RegistrationProblemCode, type ConnectOutcome, type SessionProblemCode } from "./outcomes.js";
package/dist/session.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { APPLICATION_CAPABILITY_DEFINITIONS, capabilityOperationsForContractVersion } from "@mdbase-dev/connect-protocol";
2
- import { retainedCapabilities, semanticContractVersion, validateAuthorizationSelection } from "./application-contract.js";
2
+ import { retainedCapabilities, semanticContractVersion, validateAuthorizationSelection } from "@mdbase-dev/connect-protocol";
3
3
  import { authorizationCallbackState, authorizationReturnToFromProblem, isAuthorizationCallbackUrl } from "./authorization-url.js";
4
4
  import { MdbaseConnectError, connectProblem } from "./errors.js";
5
5
  import { DEFAULT_OPERATIONS } from "./internal-types.js";
@@ -1,5 +1,5 @@
1
1
  import type { ContractRequirement, FileAction, JsonObject } from "@mdbase-dev/connect-protocol";
2
- import type { MdbaseApplicationManifest } from "./application-contract.js";
2
+ import type { MdbaseApplicationManifest } from "@mdbase-dev/connect-protocol";
3
3
  import type { MdbaseConnectionInfo } from "./connection-types.js";
4
4
  import { type MdbaseEffectiveCapabilities, type MdbaseCapabilityEvidence } from "./capabilities.js";
5
5
  import type { MdbaseConnection } from "./connection.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mdbase-dev/connect",
3
- "version": "0.1.0-beta.126",
3
+ "version": "0.1.0-beta.147",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,6 +26,10 @@
26
26
  "./crypto": {
27
27
  "types": "./dist/crypto-entry.d.ts",
28
28
  "import": "./dist/crypto-entry.js"
29
+ },
30
+ "./timers": {
31
+ "types": "./dist/control-timers.d.ts",
32
+ "import": "./dist/control-timers.js"
29
33
  }
30
34
  },
31
35
  "files": [
@@ -33,7 +37,7 @@
33
37
  "README.md"
34
38
  ],
35
39
  "dependencies": {
36
- "@mdbase-dev/connect-protocol": "0.1.0-beta.126"
40
+ "@mdbase-dev/connect-protocol": "0.1.0-beta.147"
37
41
  },
38
42
  "devDependencies": {
39
43
  "esbuild": "^0.28.1",
@@ -1,22 +0,0 @@
1
- import { type ApplicationCapabilityId, type ApplicationCapabilityRequirements, type LegacyApplicationCapabilityRequirements, type LegacyApplicationCapabilityId, type ApplicationRequirements, type LegacyApplicationRequirements, type MdbaseAppManifest, type LegacyMdbaseAppManifest, type CollectionOperation } from "@mdbase-dev/connect-protocol";
2
- export declare const DEFAULT_OPERATIONS: CollectionOperation[];
3
- /** SDK input compatibility boundary; protocol ApplicationRequirements remains v2-only. */
4
- export type MdbaseApplicationManifest = MdbaseAppManifest | LegacyMdbaseAppManifest;
5
- export type MdbaseApplicationRequirements = ApplicationRequirements | LegacyApplicationRequirements;
6
- export type MdbaseApplicationCapabilityRequirements = ApplicationCapabilityRequirements | LegacyApplicationCapabilityRequirements;
7
- export type MdbaseApplicationCapabilityId = ApplicationCapabilityId | LegacyApplicationCapabilityId;
8
- interface MdbaseAuthorizationSelection {
9
- operations?: CollectionOperation[];
10
- capabilities?: MdbaseApplicationCapabilityId[];
11
- }
12
- export declare function semanticContractVersion(requirements: MdbaseApplicationRequirements): 1 | 2;
13
- export declare function invalidAuthorizationSelection(message: string): never;
14
- export declare function validateAuthorizationSelection(requirements: MdbaseApplicationRequirements, options: MdbaseAuthorizationSelection): void;
15
- export declare function declaredOperations(requirements: MdbaseApplicationRequirements): CollectionOperation[];
16
- export declare function authorizationOperations(application: {
17
- requirements: MdbaseApplicationRequirements;
18
- provisions?: MdbaseApplicationManifest["provisions"];
19
- }, options: MdbaseAuthorizationSelection): CollectionOperation[];
20
- export declare function retainedCapabilities(requirements: MdbaseApplicationRequirements, operations: CollectionOperation[]): MdbaseApplicationCapabilityId[];
21
- export declare function authorizationFiles(requirements: MdbaseApplicationRequirements): import("@mdbase-dev/connect-protocol").ApplicationFileRequest | undefined;
22
- export {};
@@ -1,75 +0,0 @@
1
- import { APPLICATION_SETUP_OPERATIONS, applicationFileRequest, capabilityOperationsForContractVersion } from "@mdbase-dev/connect-protocol";
2
- import { connectError } from "./errors.js";
3
- export const DEFAULT_OPERATIONS = ["describe", "changes", "read", "query"];
4
- export function semanticContractVersion(requirements) {
5
- const version = requirements.capabilities === undefined ? 1 : requirements.capabilities?.contract_version;
6
- if (version !== 1 && version !== 2)
7
- invalidAuthorizationSelection("Unsupported declared capability contract version.");
8
- return version;
9
- }
10
- export function invalidAuthorizationSelection(message) {
11
- throw connectError("invalid_application_manifest", message, {
12
- details: { issues: [{ path: "/requirements/capabilities", keyword: "authorizationSelection", message, params: {} }] }
13
- });
14
- }
15
- export function validateAuthorizationSelection(requirements, options) {
16
- if (options.operations !== undefined && options.capabilities !== undefined) {
17
- invalidAuthorizationSelection("Specify operations or capabilities, not both.");
18
- }
19
- if (options.operations !== undefined && semanticContractVersion(requirements) !== 1) {
20
- invalidAuthorizationSelection("Exact operations authorization is only supported for legacy v1 declarations.");
21
- }
22
- if (options.capabilities !== undefined) {
23
- const declared = new Set([
24
- ...(requirements.capabilities?.required ?? []),
25
- ...(requirements.capabilities?.optional ?? [])
26
- ]);
27
- if (options.capabilities.some((id) => !declared.has(id)
28
- || capabilityOperationsForContractVersion(semanticContractVersion(requirements), id) === undefined)) {
29
- invalidAuthorizationSelection("Authorization can only include capabilities declared by the application.");
30
- }
31
- }
32
- }
33
- export function declaredOperations(requirements) {
34
- const capabilities = requirements.capabilities;
35
- if (!capabilities)
36
- return [...DEFAULT_OPERATIONS];
37
- return [...new Set([...capabilities.required, ...(capabilities.optional ?? [])].flatMap((id) => capabilityOperationsForContractVersion(capabilities.contract_version, id) ?? []))];
38
- }
39
- export function authorizationOperations(application, options) {
40
- const { requirements } = application;
41
- validateAuthorizationSelection(requirements, options);
42
- // Legacy callers selected independent exact operations, including subsets of declarations.
43
- if (semanticContractVersion(requirements) === 1) {
44
- if (options.operations !== undefined)
45
- return [...new Set(options.operations)];
46
- if (options.capabilities === undefined)
47
- return [...DEFAULT_OPERATIONS];
48
- }
49
- const declared = requirements.capabilities;
50
- const selected = [...(declared?.required ?? []), ...(options.capabilities ?? declared?.optional ?? [])];
51
- const operations = selected.flatMap((id) => capabilityOperationsForContractVersion(semanticContractVersion(requirements), id) ?? []);
52
- const hasSetup = (application.provisions?.type_packs.length ?? 0) > 0
53
- || (application.provisions?.configuration?.length ?? 0) > 0;
54
- return [...new Set([
55
- ...operations,
56
- ...(semanticContractVersion(requirements) === 2 && hasSetup ? APPLICATION_SETUP_OPERATIONS : [])
57
- ])];
58
- }
59
- export function retainedCapabilities(requirements, operations) {
60
- return [...(requirements.capabilities?.required ?? []), ...(requirements.capabilities?.optional ?? [])].filter((id) => (capabilityOperationsForContractVersion(semanticContractVersion(requirements), id) ?? []).every((operation) => operations.includes(operation)));
61
- }
62
- export function authorizationFiles(requirements) {
63
- const files = requirements.files;
64
- if (!files)
65
- return undefined;
66
- if (semanticContractVersion(requirements) === 1) {
67
- if (!("actions" in files) || "required" in files || "optional" in files) {
68
- invalidAuthorizationSelection("Legacy file declarations must use exact files.actions.");
69
- }
70
- return { actions: [...files.actions], scope: structuredClone(files.scope) };
71
- }
72
- if ("actions" in files)
73
- invalidAuthorizationSelection("V2 file declarations must use required/optional file actions.");
74
- return applicationFileRequest(files);
75
- }