@tinycloud/sdk-services 3.2.6-beta.2 → 3.3.0-beta.11

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 (65) hide show
  1. package/dist/{BaseService-4wwJq1Gn.d.cts → BaseService-Cc6Ueicm.d.cts} +1 -1
  2. package/dist/{BaseService-BGr2slUz.d.ts → BaseService-DOdXd7sr.d.ts} +1 -1
  3. package/dist/encryption/index.cjs +10 -0
  4. package/dist/encryption/index.cjs.map +1 -1
  5. package/dist/encryption/index.d.cts +2 -2
  6. package/dist/encryption/index.d.ts +2 -2
  7. package/dist/encryption/index.js +10 -0
  8. package/dist/encryption/index.js.map +1 -1
  9. package/dist/index.cjs +360 -210
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +116 -13
  12. package/dist/index.d.ts +116 -13
  13. package/dist/index.js +359 -210
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/decrypt-transport-response-error.d.cts +1 -1
  16. package/dist/internal/decrypt-transport-response-error.d.ts +1 -1
  17. package/dist/kv/index.cjs +68 -21
  18. package/dist/kv/index.cjs.map +1 -1
  19. package/dist/kv/index.d.cts +7 -4
  20. package/dist/kv/index.d.ts +7 -4
  21. package/dist/kv/index.js +68 -21
  22. package/dist/kv/index.js.map +1 -1
  23. package/dist/kv/replication/contractConstants.cjs +115 -0
  24. package/dist/kv/replication/contractConstants.cjs.map +1 -0
  25. package/dist/kv/replication/contractConstants.d.cts +77 -0
  26. package/dist/kv/replication/contractConstants.d.ts +77 -0
  27. package/dist/kv/replication/contractConstants.js +75 -0
  28. package/dist/kv/replication/contractConstants.js.map +1 -0
  29. package/dist/kv/replication/grantPolicy.cjs +82 -0
  30. package/dist/kv/replication/grantPolicy.cjs.map +1 -0
  31. package/dist/kv/replication/grantPolicy.d.cts +19 -0
  32. package/dist/kv/replication/grantPolicy.d.ts +19 -0
  33. package/dist/kv/replication/grantPolicy.js +50 -0
  34. package/dist/kv/replication/grantPolicy.js.map +1 -0
  35. package/dist/kv/replication/grantPolicyConstants.cjs +42 -0
  36. package/dist/kv/replication/grantPolicyConstants.cjs.map +1 -0
  37. package/dist/kv/replication/grantPolicyConstants.d.cts +10 -0
  38. package/dist/kv/replication/grantPolicyConstants.d.ts +10 -0
  39. package/dist/kv/replication/grantPolicyConstants.js +14 -0
  40. package/dist/kv/replication/grantPolicyConstants.js.map +1 -0
  41. package/dist/kv/replication/grantPolicyTypes.cjs +19 -0
  42. package/dist/kv/replication/grantPolicyTypes.cjs.map +1 -0
  43. package/dist/kv/replication/grantPolicyTypes.d.cts +87 -0
  44. package/dist/kv/replication/grantPolicyTypes.d.ts +87 -0
  45. package/dist/kv/replication/grantPolicyTypes.js +1 -0
  46. package/dist/kv/replication/grantPolicyTypes.js.map +1 -0
  47. package/dist/kv/replication/index.cjs +575 -131
  48. package/dist/kv/replication/index.cjs.map +1 -1
  49. package/dist/kv/replication/index.d.cts +6 -3
  50. package/dist/kv/replication/index.d.ts +6 -3
  51. package/dist/kv/replication/index.js +575 -131
  52. package/dist/kv/replication/index.js.map +1 -1
  53. package/dist/scope-B-m6cKH-.d.ts +1962 -0
  54. package/dist/scope-B7oeKdLM.d.cts +1962 -0
  55. package/dist/sql/index.cjs +72 -36
  56. package/dist/sql/index.cjs.map +1 -1
  57. package/dist/sql/index.d.cts +2 -2
  58. package/dist/sql/index.d.ts +2 -2
  59. package/dist/sql/index.js +72 -36
  60. package/dist/sql/index.js.map +1 -1
  61. package/dist/{types-D-9A3Sut.d.cts → types-BjH0ZtGy.d.cts} +8 -0
  62. package/dist/{types-D-9A3Sut.d.ts → types-BjH0ZtGy.d.ts} +8 -0
  63. package/package.json +55 -2
  64. package/dist/scope-CoKKmMiI.d.ts +0 -957
  65. package/dist/scope-D7wmjbMH.d.cts +0 -957
package/dist/index.d.cts CHANGED
@@ -1,16 +1,19 @@
1
- import { a as IServiceContext, c as InvokeFunction, d as InvokeAnyFunction, F as FetchFunction, S as ServiceSession, e as RetryPolicy, T as TelemetryConfig, I as IService, E as EventHandler, b as ServiceError, R as Result, P as PermissionHint, f as StorageQuotaInfo } from './types-D-9A3Sut.cjs';
2
- export { g as ErrorCode, h as ErrorCodes, i as FetchRequestInit, j as FetchResponse, k as InvocationFact, l as InvocationFacts, m as InvokeAnyEntry, n as ServiceErrorEvent, o as ServiceHeaders, p as ServiceRequestEvent, q as ServiceResponseEvent, r as ServiceRetryEvent, s as TelemetryEventHandler, t as TelemetryEvents, u as TelemetrySpanEvent, v as defaultRetryPolicy, w as err, x as ok, y as serviceError } from './types-D-9A3Sut.cjs';
1
+ import { a as IServiceContext, c as InvokeFunction, d as InvokeAnyFunction, F as FetchFunction, S as ServiceSession, e as RetryPolicy, T as TelemetryConfig, I as IService, E as EventHandler, b as ServiceError, R as Result, P as PermissionHint, f as StorageQuotaInfo } from './types-BjH0ZtGy.cjs';
2
+ export { g as ErrorCode, h as ErrorCodes, i as FetchRequestInit, j as FetchResponse, k as InvocationFact, l as InvocationFacts, m as InvokeAnyEntry, n as ServiceErrorEvent, o as ServiceHeaders, p as ServiceRequestEvent, q as ServiceResponseEvent, r as ServiceRetryEvent, s as TelemetryEventHandler, t as TelemetryEvents, u as TelemetrySpanEvent, v as defaultRetryPolicy, w as err, x as ok, y as serviceError } from './types-BjH0ZtGy.cjs';
3
3
  import { z } from 'zod';
4
- import { B as BaseService } from './BaseService-4wwJq1Gn.cjs';
5
- export { a as BaseServiceOptions, R as RequestSignal, S as ServiceConstructor, b as ServiceRegistration } from './BaseService-4wwJq1Gn.cjs';
4
+ import { B as BaseService } from './BaseService-Cc6Ueicm.cjs';
5
+ export { a as BaseServiceOptions, R as RequestSignal, S as ServiceConstructor, b as ServiceRegistration } from './BaseService-Cc6Ueicm.cjs';
6
6
  import { IKVService } from './kv/index.cjs';
7
7
  export { IPrefixedKVService, KVService, PrefixedKVService } from './kv/index.cjs';
8
- export { A as AuthorityRefusal, C as CLEAR_PENDING_WARNING, H as DEFAULT_SIGNED_READ_URL_EXPIRY_MS, I as KVAction, J as KVActionType, M as KVBatchPutItem, N as KVBatchPutOptions, O as KVBatchPutResponse, Q as KVBatchReadResponse, S as KVChange, T as KVChangesAuthority, U as KVChangesOptions, V as KVChangesResponse, W as KVCreateSignedReadUrlOptions, X as KVDeleteOptions, Y as KVGetOptions, Z as KVHeadOptions, _ as KVListOptions, b as KVListPage, $ as KVListResponse, a0 as KVPutOptions, c as KVReadThrough, d as KVReplicaHandle, e as KVReplicaSpec, f as KVReplicaStorage, a as KVReplicationController, K as KVReplicationDeps, a1 as KVResponse, a2 as KVResponseHeaders, a3 as KVServiceConfig, a4 as KVSignedReadUrlResponse, L as LocalGetResult, g as LocalListResult, h as LocalReadMeta, i as LocalReplicaStatus, j as LocalSyncResult, k as PendingWriteRecord, l as PendingWriteState, P as PendingWriteStore, m as PinnedKey, n as PurgeTarget, o as ReplicaAuthorityState, p as ReplicaCoverage, q as ReplicaDevice, r as ReplicaGrantInfo, s as ReplicaState, t as ReplicaStatusEntry, u as ReplicationAuthority, v as ReplicationControl, w as ReplicationEvent, R as ReplicationIdentity, x as ReplicationOptions, y as ReplicationPurgeReport, z as ReplicationReason, B as ReplicationScheduler, D as ResolvedReplicationOptions, E as canonicalReplicationIdentity, F as replicationIdentityKey, G as requiresSecretsOptIn } from './scope-D7wmjbMH.cjs';
8
+ export { A as AuthorityRefusal, C as CLEAR_PENDING_WARNING, aq as DEFAULT_SIGNED_READ_URL_EXPIRY_MS, ar as KVAction, as as KVActionType, at as KVBatchPutItem, au as KVBatchPutOptions, av as KVBatchPutResponse, aw as KVBatchReadResponse, ax as KVChange, ay as KVChangesAuthority, az as KVChangesOptions, aA as KVChangesResponse, aB as KVCreateSignedReadUrlOptions, aC as KVDeleteOptions, aD as KVGetOptions, aE as KVHeadOptions, aF as KVListOptions, b as KVListPage, aG as KVListResponse, aH as KVPutOptions, c as KVReadThrough, d as KVReplicaHandle, e as KVReplicaSpec, f as KVReplicaStorage, a as KVReplicationController, K as KVReplicationDeps, aI as KVResponse, aJ as KVResponseHeaders, aK as KVServiceConfig, aL as KVSignedReadUrlResponse, L as LocalGetResult, g as LocalListResult, h as LocalReadMeta, i as LocalReplicaStatus, j as LocalSyncResult, k as PendingWriteRecord, l as PendingWriteState, P as PendingWriteStore, m as PinnedKey, w as PurgeTarget, x as ReplicaAccountGate, y as ReplicaAdmitHook, z as ReplicaAuthorityState, B as ReplicaBrowserGateAccess, D as ReplicaBrowserGateSnapshot, E as ReplicaBrowserGateTx, F as ReplicaBrowserPageAdmission, G as ReplicaClock, H as ReplicaCoverage, I as ReplicaDeliveryDecision, J as ReplicaDenyInput, M as ReplicaDenyOutcome, N as ReplicaDevice, O as ReplicaEraseReport, Q as ReplicaGateAccess, S as ReplicaGateReason, T as ReplicaGateScope, U as ReplicaGateSnapshot, V as ReplicaGateTx, W as ReplicaGatedError, X as ReplicaGatedHandle, Y as ReplicaGatedSpec, Z as ReplicaGatedStorage, _ as ReplicaGrantInfo, $ as ReplicaGuardedStore, a0 as ReplicaInspectedStatus, a1 as ReplicaLifecycleGate, a2 as ReplicaPageAdmission, a3 as ReplicaPartitionEraser, a4 as ReplicaPartitionIndexEntry, a5 as ReplicaPeerCommit, a6 as ReplicaPrivateGateHash, a7 as ReplicaPurgeIntent, a8 as ReplicaQuotaLedger, a9 as ReplicaQuotaSpec, aa as ReplicaSessionStamp, ab as ReplicaStampedReply, ac as ReplicaState, ad as ReplicaStatusEntry, ae as ReplicationAuthority, af as ReplicationControl, ag as ReplicationEvent, R as ReplicationIdentity, ah as ReplicationOptions, ai as ReplicationPurgeReport, aj as ReplicationReason, ak as ReplicationScheduler, al as ResolvedReplicationOptions, am as SaltedHash, an as canonicalReplicationIdentity, ao as replicationIdentityKey, ap as requiresSecretsOptIn } from './scope-B7oeKdLM.cjs';
9
+ export { ClampConsentAnchor, ConsentDeadlineMs, EffectiveGrantExpiry, EffectiveGrantExpiryInput, MintRemainingMs, NeedsSilentRenewal, ReplicaConsentAnchor, ReplicaConsentSource, ReplicaGrantPolicy } from './kv/replication/grantPolicyTypes.cjs';
9
10
  export { BatchOptions, BatchResponse, DatabaseHandle, ExecuteOptions, ExecuteResponse, IDatabaseHandle, ISQLMigrations, ISQLService, QueryOptions, QueryResponse, SQLAction, SQLActionType, SQLMigrations, SQLService, SQLServiceConfig, SqlMigration, SqlMigrationApplyOptions, SqlMigrationApplyResponse, SqlStatement, SqlValue } from './sql/index.cjs';
10
11
  import { IEncryptionService, DecryptCapabilityProof } from './encryption/index.cjs';
11
12
  export { BuildCanonicalDecryptRequestInput, BuildDecryptFactsInput, BuildDecryptInvocationInput, BuiltDecryptInvocation, CanonicalDecryptRequest, CanonicalJson, DECRYPT_ACTION, DECRYPT_FACT_TYPE, DECRYPT_RESULT_TYPE, DEFAULT_ENCRYPTION_ALG, DEFAULT_KEY_VERSION, DecryptEnvelopeOptions, DecryptInvocationFact, DecryptInvocationSigner, DecryptRequestBody, DecryptResponseBody, DecryptTransport, DiscoverNetworkInput, DiscoveredNetwork, DiscoverySource, ENCRYPTION_NETWORK_URN_PREFIX, ENCRYPTION_SERVICE, ENCRYPTION_SERVICE_SHORT, ENVELOPE_VERSION, EncryptToNetworkInput, EncryptToNetworkOptions, EncryptToNetworkResult, EncryptionCrypto, EncryptionError, EncryptionErrorInput, EncryptionService, EncryptionServiceConfig, InlineEncryptedEnvelope, Json, NETWORK_NAME_PATTERN, NetworkDescriptor, NetworkIdError, NodeDescriptorFetcher, ParsedNetworkId, RandomReceiverKeyInput, ReceiverKeyPair, ReceiverKeySigner, SignedReceiverKeyInput, VerifyDecryptResponseInput, WellKnownDescriptorFetcher, base64Decode, base64Encode, buildCanonicalDecryptRequest, buildDecryptAttenuation, buildDecryptFacts, buildDecryptInvocation, buildNetworkId, canonicalHashHex, canonicalSignedResponse, canonicalize as canonicalizeEncryptionJson, checkDecryptInvocationInput, decryptEnvelopeWithKey, deriveSignedReceiverKey, discoverNetwork, encryptToNetwork, encryptionError, ensureNetworkUsableForDecrypt, generateRandomReceiverKey, hexDecode, hexEncode, isNetworkId, networkDiscoveryKey, openWrappedKey, parseNetworkId, utf8Decode, utf8Encode, validateEnvelope, verifyDecryptResponse } from './encryption/index.cjs';
12
13
  export { DecryptTransportResponseError } from '@tinycloud/sdk-services/internal/decrypt-transport-response-error';
13
14
  export { kvPrefixCovers } from './kv/replication/prefix.cjs';
15
+ import './kv/replication/contractConstants.cjs';
16
+ import './kv/replication/grantPolicyConstants.cjs';
14
17
 
15
18
  type TinyCloudDebugLevel = "debug";
16
19
  interface TinyCloudDebugEvent {
@@ -488,14 +491,14 @@ declare const ServiceRequestEventSchema: z.ZodObject<{
488
491
  timestamp: z.ZodNumber;
489
492
  }, "strip", z.ZodTypeAny, {
490
493
  timestamp: number;
491
- service: string;
492
494
  action: string;
495
+ service: string;
493
496
  key?: string | undefined;
494
497
  span?: string | undefined;
495
498
  }, {
496
499
  timestamp: number;
497
- service: string;
498
500
  action: string;
501
+ service: string;
499
502
  key?: string | undefined;
500
503
  span?: string | undefined;
501
504
  }>;
@@ -514,16 +517,16 @@ declare const ServiceResponseEventSchema: z.ZodObject<{
514
517
  }, "strip", z.ZodTypeAny, {
515
518
  duration: number;
516
519
  ok: boolean;
517
- service: string;
518
520
  action: string;
521
+ service: string;
519
522
  durationMs?: number | undefined;
520
523
  status?: number | undefined;
521
524
  span?: string | undefined;
522
525
  }, {
523
526
  duration: number;
524
527
  ok: boolean;
525
- service: string;
526
528
  action: string;
529
+ service: string;
527
530
  durationMs?: number | undefined;
528
531
  status?: number | undefined;
529
532
  span?: string | undefined;
@@ -682,8 +685,8 @@ declare const TelemetrySpanEventSchema: z.ZodObject<{
682
685
  meta?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
683
686
  } | undefined;
684
687
  status?: number | undefined;
685
- service?: string | undefined;
686
688
  action?: string | undefined;
689
+ service?: string | undefined;
687
690
  }, {
688
691
  durationMs: number;
689
692
  ok: boolean;
@@ -696,8 +699,8 @@ declare const TelemetrySpanEventSchema: z.ZodObject<{
696
699
  meta?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
697
700
  } | undefined;
698
701
  status?: number | undefined;
699
- service?: string | undefined;
700
702
  action?: string | undefined;
703
+ service?: string | undefined;
701
704
  }>;
702
705
  type TelemetrySpanEventType = z.infer<typeof TelemetrySpanEventSchema>;
703
706
  /**
@@ -1054,6 +1057,29 @@ declare function authExpiredError(service: string): ServiceError;
1054
1057
  * Create a service error for network issues.
1055
1058
  */
1056
1059
  declare function networkError(service: string, message: string, cause?: Error): ServiceError;
1060
+ /**
1061
+ * Classify a node retry signal (tinycloud-node #347, TC-1054). The node's
1062
+ * bodies are plain text led by a stable token:
1063
+ * - `503 sql_busy: <stage>: ...` and `503 unavailable_retryable: ...` are
1064
+ * `NODE_BUSY`: nothing was applied; retry after `meta.retryAfterMs`.
1065
+ * - `503 request_timeout: ...` is `REQUEST_TIMEOUT`: the deadline passed before
1066
+ * any write began, so nothing was applied.
1067
+ * - `500 outcome_unknown: ...` is `OUTCOME_UNKNOWN`: a write may have been
1068
+ * applied; read back before retrying a non-idempotent operation.
1069
+ *
1070
+ * `meta.retryable` is the safe-to-retry verdict and `meta.retryAfterMs` the
1071
+ * node's `Retry-After` (the node sends whole seconds; anything else is
1072
+ * ignored). The SDK never retries on its own. Returns `undefined` for any
1073
+ * other response, including the bodyless 503/500 of nodes before 1.21, which
1074
+ * callers keep classifying as they always did.
1075
+ */
1076
+ declare function nodeRetryError(service: string, message: string, response: {
1077
+ status: number;
1078
+ statusText: string;
1079
+ headers: {
1080
+ get(name: string): string | null;
1081
+ };
1082
+ }, errorText: string): ServiceError | undefined;
1057
1083
  /**
1058
1084
  * Create a service error for timeouts.
1059
1085
  *
@@ -1868,6 +1894,19 @@ interface VaultPutOptions {
1868
1894
  * fails with `ALREADY_EXISTS`; it is never overwritten.
1869
1895
  */
1870
1896
  ifNoneMatch?: "*";
1897
+ /**
1898
+ * Compare-and-swap: write only when the stored envelope still has this
1899
+ * strong ETag, passed exactly as {@link VaultEntry.etag} returned it
1900
+ * (including the quotes). Network-encrypted vaults only; cannot be combined
1901
+ * with `ifNoneMatch`.
1902
+ *
1903
+ * Failures are distinct codes: `ETAG_MISMATCH` (the value changed or was
1904
+ * deleted: re-read, re-apply, retry), `INVALID_ETAG` (malformed; never
1905
+ * retry), `OUTCOME_UNKNOWN` (the node may have applied the write, or a gateway
1906
+ * answered for it: read it back before retrying, with a freshly signed request) and `NODE_BUSY`
1907
+ * (nothing was written; retry).
1908
+ */
1909
+ ifMatch?: string;
1871
1910
  }
1872
1911
  /**
1873
1912
  * Options for vault get operations.
@@ -1877,8 +1916,25 @@ interface VaultGetOptions<T = unknown> {
1877
1916
  deserialize?: (data: Uint8Array) => T;
1878
1917
  /** Return raw decrypted bytes without deserialization */
1879
1918
  raw?: boolean;
1880
- /** Force the underlying KV read to bypass replica read-through. */
1919
+ /**
1920
+ * Force the underlying KV read to bypass replica read-through. Required for
1921
+ * a usable {@link VaultEntry.etag}: only network reads return one, because
1922
+ * a replica can serve a stale etag.
1923
+ */
1881
1924
  source?: "network";
1925
+ /**
1926
+ * Opt-in (default off): refuse an envelope whose AAD is not bound to this
1927
+ * vault's space and this key (`tinycloud.vault:<spaceId>:<key>`). The space
1928
+ * id is compared after normalizing the spelling of its EVM addresses
1929
+ * (checksummed and lowercase are the same space). An envelope with no AAD,
1930
+ * or with a different one, fails with `AAD_MISMATCH` (`aad_mismatch` from
1931
+ * `readNetworkEncrypted`) instead of decrypting. This stops a ciphertext
1932
+ * copied to another key from being accepted; it does not stop a freshly
1933
+ * encrypted forgery. A malformed stored value is a corrupt envelope, as without this
1934
+ * option. Network-encrypted vaults only: a master-key vault and `getShared` refuse it with
1935
+ * `STORAGE_ERROR` rather than skip the check.
1936
+ */
1937
+ expectAad?: boolean;
1882
1938
  /** Delegated KV service for reading from the grantor's space (used by getShared) */
1883
1939
  kv?: {
1884
1940
  get<V>(key: string, options?: {
@@ -1933,6 +1989,12 @@ interface VaultEntry<T> {
1933
1989
  metadata: Record<string, string>;
1934
1990
  /** Key ID used for encryption */
1935
1991
  keyId: string;
1992
+ /**
1993
+ * Strong ETag of the stored envelope, for {@link VaultPutOptions.ifMatch}.
1994
+ * Present only for network-encrypted reads made with `source: "network"`
1995
+ * (always for `readNetworkEncrypted`); never taken from a replica.
1996
+ */
1997
+ etag?: string;
1936
1998
  }
1937
1999
  /**
1938
2000
  * Safe classification for a network-encrypted vault read.
@@ -1959,6 +2021,10 @@ type VaultNetworkReadResult<T> = {
1959
2021
  status: "decrypt_failed";
1960
2022
  } | {
1961
2023
  status: "invalid_payload";
2024
+ }
2025
+ /** Only with `expectAad`: the envelope is not bound to this space and key. */
2026
+ | {
2027
+ status: "aad_mismatch";
1962
2028
  };
1963
2029
  /**
1964
2030
  * Structured error codes for vault operations.
@@ -2016,6 +2082,43 @@ type VaultErrorInput = {
2016
2082
  meta?: Record<string, unknown>;
2017
2083
  /** The typed KV error that refused the write (an `Error` carrying its `code`, `service` and `meta`). */
2018
2084
  cause: ServiceError & Error;
2085
+ } | {
2086
+ /** `expectAad` read: the envelope's AAD is missing or bound to another space/key. */
2087
+ code: "AAD_MISMATCH";
2088
+ key: string;
2089
+ message: string;
2090
+ } | {
2091
+ /** `ifMatch` write refused (HTTP 412): the value changed or no longer exists. Re-read and retry. */
2092
+ code: "ETAG_MISMATCH";
2093
+ key: string;
2094
+ message: string;
2095
+ meta?: Record<string, unknown>;
2096
+ cause: ServiceError & Error;
2097
+ } | {
2098
+ /** `ifMatch` is not a strong ETag (HTTP 400, or rejected before sending). Never retry. */
2099
+ code: "INVALID_ETAG";
2100
+ key: string;
2101
+ message: string;
2102
+ meta?: Record<string, unknown>;
2103
+ cause?: ServiceError & Error;
2104
+ } | {
2105
+ /**
2106
+ * `ifMatch` write that may have been applied: the node's `outcome_unknown` (500), a gateway
2107
+ * answer that can follow a commit (500, 502, 503 without the node's busy body, 504, 520,
2108
+ * 522, 524) or a connection that failed after the request was sent. Re-read before retrying.
2109
+ */
2110
+ code: "OUTCOME_UNKNOWN";
2111
+ key: string;
2112
+ message: string;
2113
+ meta?: Record<string, unknown>;
2114
+ cause: ServiceError & Error;
2115
+ } | {
2116
+ /** `ifMatch` write, the node's own busy/timeout answer (503 with its busy body): nothing was written. Safe to retry. */
2117
+ code: "NODE_BUSY";
2118
+ key: string;
2119
+ message: string;
2120
+ meta?: Record<string, unknown>;
2121
+ cause: ServiceError & Error;
2019
2122
  } | {
2020
2123
  code: "STORAGE_QUOTA_EXCEEDED" | "STORAGE_LIMIT_REACHED";
2021
2124
  message: string;
@@ -2581,4 +2684,4 @@ declare class SecretsService implements ISecretsService {
2581
2684
  listAll(): Promise<Result<SecretCatalogEntry[], SecretsError>>;
2582
2685
  }
2583
2686
 
2584
- export { type AuthorizationVerdict, BaseService, type ColumnInfo, type DataVaultConfig, DataVaultService, DecryptCapabilityProof, DuckDbAction, type DuckDbActionType, type DuckDbBatchOptions, type BatchResponse as DuckDbBatchResponse, DuckDbDatabaseHandle, type DuckDbExecuteOptions, type ExecuteResponse as DuckDbExecuteResponse, type DuckDbOptions, type DuckDbQueryOptions, type QueryResponse as DuckDbQueryResponse, DuckDbService, type DuckDbServiceConfig, type DuckDbStatement, type DuckDbValue, EventHandler, FetchFunction, GenericKVResponseSchema, type GenericKVResponseType, GenericResultSchema, type HookEvent, type HookServiceName, type HookStreamEvent, type HookStreamRetryConfig, type HookSubscription, type HookWebhookListOptions, type HookWebhookRecord, type HookWebhookRegistration, type HookWebhookScope, type HookWebhookUnregisterOptions, HooksService, type HooksServiceConfig, type IDataVaultService, type IDuckDbDatabaseHandle, type IDuckDbService, IEncryptionService, type IHooksService, IKVService, type ISecretsService, IService, IServiceContext, type IStorageService, InvokeAnyFunction, InvokeFunction, KVListResponseSchema, type KVListResponseType, KVListResultSchema, type KVListResultType, KVResponseHeadersSchema, type KVResponseHeadersType, MAX_SECRET_SCOPE_LENGTH, type ParsedSecretCatalogKey, PermissionHint, type QuotaConfig, type QuotaStatus, type ResolvedSecretPath, Result, RetryPolicy, RetryPolicySchema, type RetryPolicyType, SECRET_NAME_RE, SECRET_SCOPE_RE, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_NEARLY_FULL_RATIO, STORAGE_WRITE_TOO_LARGE_MESSAGE, type SchemaInfo, type SecretCatalogEntry, type SecretPayload, type SecretPutOptions, type SecretScopeOptions, type SecretsError, SecretsService, ServiceContext, type ServiceContextConfig, ServiceError, ServiceErrorEventSchema, type ServiceErrorEventType, ServiceErrorSchema, type ServiceErrorType, ServiceRequestEventSchema, type ServiceRequestEventType, ServiceResponseEventSchema, type ServiceResponseEventType, ServiceRetryEventSchema, type ServiceRetryEventType, ServiceSession, ServiceSessionSchema, type ServiceSessionType, type StorageAccountUsage, type StorageFullEvent, type StorageFullHandler, StorageFullMonitor, StorageQuotaInfo, type StorageRejectionDetails, type StorageStatus, type StorageStatusOptions, type StorageUsage, type StorageUsageState, type SubscribeOptions, TC832_RESERVED_SCOPES, type TableInfo, TelemetryConfig, TelemetrySpanEventSchema, type TelemetrySpanEventType, type TinyCloudDebugEnableOptions, type TinyCloudDebugEvent, type TinyCloudDebugLevel, TinyCloudDebugLogger, type TinyCloudDebugTimer, TinyCloudQuota, type ValidationError, type VaultCrypto, type VaultEntry, type VaultError, type VaultGetOptions, type VaultGrantOptions, VaultHeaders, type VaultListOptions, type VaultListPage, type VaultNetworkReadResult, VaultPublicSpaceKVActions, type VaultPutOptions, type ViewInfo, type WasmVaultFunctions, abortedError, appSecretScope, authExpiredError, authRequiredError, authUnauthorizedError, authorizationVerdictOf, canonicalizeSecretScope, clearTinyCloudDebugLogs, createKVResponseSchema, createResultSchema, createVaultCrypto, disableTinyCloudDebug, enableTinyCloudDebug, errorResult, getTinyCloudDebugLogs, installTinyCloudDebugGlobals, isStorageFullError, networkError, notFoundError, parseAuthError, parseCapabilityResource, parsePermissionHint, parsePermissionHintFromErrorText, parseSecretCatalogKey, parseStorageQuotaBytes, parseStorageRejection, parseStorageStatus, permissionDeniedError, resolveSecretListPrefix, resolveSecretPath, storageLimitReachedError, storageQuotaExceededError, storageRejectionError, storageUsageState, timeoutError, tinyCloudDebugLogger, validateKVListResponse, validateKVResponseHeaders, validateRetryPolicy, validateServiceError, validateServiceRequestEvent, validateServiceResponseEvent, validateServiceSession, validateTelemetrySpanEvent, validatedCapabilityOf, wrapError };
2687
+ export { type AuthorizationVerdict, BaseService, type ColumnInfo, type DataVaultConfig, DataVaultService, DecryptCapabilityProof, DuckDbAction, type DuckDbActionType, type DuckDbBatchOptions, type BatchResponse as DuckDbBatchResponse, DuckDbDatabaseHandle, type DuckDbExecuteOptions, type ExecuteResponse as DuckDbExecuteResponse, type DuckDbOptions, type DuckDbQueryOptions, type QueryResponse as DuckDbQueryResponse, DuckDbService, type DuckDbServiceConfig, type DuckDbStatement, type DuckDbValue, EventHandler, FetchFunction, GenericKVResponseSchema, type GenericKVResponseType, GenericResultSchema, type HookEvent, type HookServiceName, type HookStreamEvent, type HookStreamRetryConfig, type HookSubscription, type HookWebhookListOptions, type HookWebhookRecord, type HookWebhookRegistration, type HookWebhookScope, type HookWebhookUnregisterOptions, HooksService, type HooksServiceConfig, type IDataVaultService, type IDuckDbDatabaseHandle, type IDuckDbService, IEncryptionService, type IHooksService, IKVService, type ISecretsService, IService, IServiceContext, type IStorageService, InvokeAnyFunction, InvokeFunction, KVListResponseSchema, type KVListResponseType, KVListResultSchema, type KVListResultType, KVResponseHeadersSchema, type KVResponseHeadersType, MAX_SECRET_SCOPE_LENGTH, type ParsedSecretCatalogKey, PermissionHint, type QuotaConfig, type QuotaStatus, type ResolvedSecretPath, Result, RetryPolicy, RetryPolicySchema, type RetryPolicyType, SECRET_NAME_RE, SECRET_SCOPE_RE, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_NEARLY_FULL_RATIO, STORAGE_WRITE_TOO_LARGE_MESSAGE, type SchemaInfo, type SecretCatalogEntry, type SecretPayload, type SecretPutOptions, type SecretScopeOptions, type SecretsError, SecretsService, ServiceContext, type ServiceContextConfig, ServiceError, ServiceErrorEventSchema, type ServiceErrorEventType, ServiceErrorSchema, type ServiceErrorType, ServiceRequestEventSchema, type ServiceRequestEventType, ServiceResponseEventSchema, type ServiceResponseEventType, ServiceRetryEventSchema, type ServiceRetryEventType, ServiceSession, ServiceSessionSchema, type ServiceSessionType, type StorageAccountUsage, type StorageFullEvent, type StorageFullHandler, StorageFullMonitor, StorageQuotaInfo, type StorageRejectionDetails, type StorageStatus, type StorageStatusOptions, type StorageUsage, type StorageUsageState, type SubscribeOptions, TC832_RESERVED_SCOPES, type TableInfo, TelemetryConfig, TelemetrySpanEventSchema, type TelemetrySpanEventType, type TinyCloudDebugEnableOptions, type TinyCloudDebugEvent, type TinyCloudDebugLevel, TinyCloudDebugLogger, type TinyCloudDebugTimer, TinyCloudQuota, type ValidationError, type VaultCrypto, type VaultEntry, type VaultError, type VaultGetOptions, type VaultGrantOptions, VaultHeaders, type VaultListOptions, type VaultListPage, type VaultNetworkReadResult, VaultPublicSpaceKVActions, type VaultPutOptions, type ViewInfo, type WasmVaultFunctions, abortedError, appSecretScope, authExpiredError, authRequiredError, authUnauthorizedError, authorizationVerdictOf, canonicalizeSecretScope, clearTinyCloudDebugLogs, createKVResponseSchema, createResultSchema, createVaultCrypto, disableTinyCloudDebug, enableTinyCloudDebug, errorResult, getTinyCloudDebugLogs, installTinyCloudDebugGlobals, isStorageFullError, networkError, nodeRetryError, notFoundError, parseAuthError, parseCapabilityResource, parsePermissionHint, parsePermissionHintFromErrorText, parseSecretCatalogKey, parseStorageQuotaBytes, parseStorageRejection, parseStorageStatus, permissionDeniedError, resolveSecretListPrefix, resolveSecretPath, storageLimitReachedError, storageQuotaExceededError, storageRejectionError, storageUsageState, timeoutError, tinyCloudDebugLogger, validateKVListResponse, validateKVResponseHeaders, validateRetryPolicy, validateServiceError, validateServiceRequestEvent, validateServiceResponseEvent, validateServiceSession, validateTelemetrySpanEvent, validatedCapabilityOf, wrapError };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,19 @@
1
- import { a as IServiceContext, c as InvokeFunction, d as InvokeAnyFunction, F as FetchFunction, S as ServiceSession, e as RetryPolicy, T as TelemetryConfig, I as IService, E as EventHandler, b as ServiceError, R as Result, P as PermissionHint, f as StorageQuotaInfo } from './types-D-9A3Sut.js';
2
- export { g as ErrorCode, h as ErrorCodes, i as FetchRequestInit, j as FetchResponse, k as InvocationFact, l as InvocationFacts, m as InvokeAnyEntry, n as ServiceErrorEvent, o as ServiceHeaders, p as ServiceRequestEvent, q as ServiceResponseEvent, r as ServiceRetryEvent, s as TelemetryEventHandler, t as TelemetryEvents, u as TelemetrySpanEvent, v as defaultRetryPolicy, w as err, x as ok, y as serviceError } from './types-D-9A3Sut.js';
1
+ import { a as IServiceContext, c as InvokeFunction, d as InvokeAnyFunction, F as FetchFunction, S as ServiceSession, e as RetryPolicy, T as TelemetryConfig, I as IService, E as EventHandler, b as ServiceError, R as Result, P as PermissionHint, f as StorageQuotaInfo } from './types-BjH0ZtGy.js';
2
+ export { g as ErrorCode, h as ErrorCodes, i as FetchRequestInit, j as FetchResponse, k as InvocationFact, l as InvocationFacts, m as InvokeAnyEntry, n as ServiceErrorEvent, o as ServiceHeaders, p as ServiceRequestEvent, q as ServiceResponseEvent, r as ServiceRetryEvent, s as TelemetryEventHandler, t as TelemetryEvents, u as TelemetrySpanEvent, v as defaultRetryPolicy, w as err, x as ok, y as serviceError } from './types-BjH0ZtGy.js';
3
3
  import { z } from 'zod';
4
- import { B as BaseService } from './BaseService-BGr2slUz.js';
5
- export { a as BaseServiceOptions, R as RequestSignal, S as ServiceConstructor, b as ServiceRegistration } from './BaseService-BGr2slUz.js';
4
+ import { B as BaseService } from './BaseService-DOdXd7sr.js';
5
+ export { a as BaseServiceOptions, R as RequestSignal, S as ServiceConstructor, b as ServiceRegistration } from './BaseService-DOdXd7sr.js';
6
6
  import { IKVService } from './kv/index.js';
7
7
  export { IPrefixedKVService, KVService, PrefixedKVService } from './kv/index.js';
8
- export { A as AuthorityRefusal, C as CLEAR_PENDING_WARNING, H as DEFAULT_SIGNED_READ_URL_EXPIRY_MS, I as KVAction, J as KVActionType, M as KVBatchPutItem, N as KVBatchPutOptions, O as KVBatchPutResponse, Q as KVBatchReadResponse, S as KVChange, T as KVChangesAuthority, U as KVChangesOptions, V as KVChangesResponse, W as KVCreateSignedReadUrlOptions, X as KVDeleteOptions, Y as KVGetOptions, Z as KVHeadOptions, _ as KVListOptions, b as KVListPage, $ as KVListResponse, a0 as KVPutOptions, c as KVReadThrough, d as KVReplicaHandle, e as KVReplicaSpec, f as KVReplicaStorage, a as KVReplicationController, K as KVReplicationDeps, a1 as KVResponse, a2 as KVResponseHeaders, a3 as KVServiceConfig, a4 as KVSignedReadUrlResponse, L as LocalGetResult, g as LocalListResult, h as LocalReadMeta, i as LocalReplicaStatus, j as LocalSyncResult, k as PendingWriteRecord, l as PendingWriteState, P as PendingWriteStore, m as PinnedKey, n as PurgeTarget, o as ReplicaAuthorityState, p as ReplicaCoverage, q as ReplicaDevice, r as ReplicaGrantInfo, s as ReplicaState, t as ReplicaStatusEntry, u as ReplicationAuthority, v as ReplicationControl, w as ReplicationEvent, R as ReplicationIdentity, x as ReplicationOptions, y as ReplicationPurgeReport, z as ReplicationReason, B as ReplicationScheduler, D as ResolvedReplicationOptions, E as canonicalReplicationIdentity, F as replicationIdentityKey, G as requiresSecretsOptIn } from './scope-CoKKmMiI.js';
8
+ export { A as AuthorityRefusal, C as CLEAR_PENDING_WARNING, aq as DEFAULT_SIGNED_READ_URL_EXPIRY_MS, ar as KVAction, as as KVActionType, at as KVBatchPutItem, au as KVBatchPutOptions, av as KVBatchPutResponse, aw as KVBatchReadResponse, ax as KVChange, ay as KVChangesAuthority, az as KVChangesOptions, aA as KVChangesResponse, aB as KVCreateSignedReadUrlOptions, aC as KVDeleteOptions, aD as KVGetOptions, aE as KVHeadOptions, aF as KVListOptions, b as KVListPage, aG as KVListResponse, aH as KVPutOptions, c as KVReadThrough, d as KVReplicaHandle, e as KVReplicaSpec, f as KVReplicaStorage, a as KVReplicationController, K as KVReplicationDeps, aI as KVResponse, aJ as KVResponseHeaders, aK as KVServiceConfig, aL as KVSignedReadUrlResponse, L as LocalGetResult, g as LocalListResult, h as LocalReadMeta, i as LocalReplicaStatus, j as LocalSyncResult, k as PendingWriteRecord, l as PendingWriteState, P as PendingWriteStore, m as PinnedKey, w as PurgeTarget, x as ReplicaAccountGate, y as ReplicaAdmitHook, z as ReplicaAuthorityState, B as ReplicaBrowserGateAccess, D as ReplicaBrowserGateSnapshot, E as ReplicaBrowserGateTx, F as ReplicaBrowserPageAdmission, G as ReplicaClock, H as ReplicaCoverage, I as ReplicaDeliveryDecision, J as ReplicaDenyInput, M as ReplicaDenyOutcome, N as ReplicaDevice, O as ReplicaEraseReport, Q as ReplicaGateAccess, S as ReplicaGateReason, T as ReplicaGateScope, U as ReplicaGateSnapshot, V as ReplicaGateTx, W as ReplicaGatedError, X as ReplicaGatedHandle, Y as ReplicaGatedSpec, Z as ReplicaGatedStorage, _ as ReplicaGrantInfo, $ as ReplicaGuardedStore, a0 as ReplicaInspectedStatus, a1 as ReplicaLifecycleGate, a2 as ReplicaPageAdmission, a3 as ReplicaPartitionEraser, a4 as ReplicaPartitionIndexEntry, a5 as ReplicaPeerCommit, a6 as ReplicaPrivateGateHash, a7 as ReplicaPurgeIntent, a8 as ReplicaQuotaLedger, a9 as ReplicaQuotaSpec, aa as ReplicaSessionStamp, ab as ReplicaStampedReply, ac as ReplicaState, ad as ReplicaStatusEntry, ae as ReplicationAuthority, af as ReplicationControl, ag as ReplicationEvent, R as ReplicationIdentity, ah as ReplicationOptions, ai as ReplicationPurgeReport, aj as ReplicationReason, ak as ReplicationScheduler, al as ResolvedReplicationOptions, am as SaltedHash, an as canonicalReplicationIdentity, ao as replicationIdentityKey, ap as requiresSecretsOptIn } from './scope-B-m6cKH-.js';
9
+ export { ClampConsentAnchor, ConsentDeadlineMs, EffectiveGrantExpiry, EffectiveGrantExpiryInput, MintRemainingMs, NeedsSilentRenewal, ReplicaConsentAnchor, ReplicaConsentSource, ReplicaGrantPolicy } from './kv/replication/grantPolicyTypes.js';
9
10
  export { BatchOptions, BatchResponse, DatabaseHandle, ExecuteOptions, ExecuteResponse, IDatabaseHandle, ISQLMigrations, ISQLService, QueryOptions, QueryResponse, SQLAction, SQLActionType, SQLMigrations, SQLService, SQLServiceConfig, SqlMigration, SqlMigrationApplyOptions, SqlMigrationApplyResponse, SqlStatement, SqlValue } from './sql/index.js';
10
11
  import { IEncryptionService, DecryptCapabilityProof } from './encryption/index.js';
11
12
  export { BuildCanonicalDecryptRequestInput, BuildDecryptFactsInput, BuildDecryptInvocationInput, BuiltDecryptInvocation, CanonicalDecryptRequest, CanonicalJson, DECRYPT_ACTION, DECRYPT_FACT_TYPE, DECRYPT_RESULT_TYPE, DEFAULT_ENCRYPTION_ALG, DEFAULT_KEY_VERSION, DecryptEnvelopeOptions, DecryptInvocationFact, DecryptInvocationSigner, DecryptRequestBody, DecryptResponseBody, DecryptTransport, DiscoverNetworkInput, DiscoveredNetwork, DiscoverySource, ENCRYPTION_NETWORK_URN_PREFIX, ENCRYPTION_SERVICE, ENCRYPTION_SERVICE_SHORT, ENVELOPE_VERSION, EncryptToNetworkInput, EncryptToNetworkOptions, EncryptToNetworkResult, EncryptionCrypto, EncryptionError, EncryptionErrorInput, EncryptionService, EncryptionServiceConfig, InlineEncryptedEnvelope, Json, NETWORK_NAME_PATTERN, NetworkDescriptor, NetworkIdError, NodeDescriptorFetcher, ParsedNetworkId, RandomReceiverKeyInput, ReceiverKeyPair, ReceiverKeySigner, SignedReceiverKeyInput, VerifyDecryptResponseInput, WellKnownDescriptorFetcher, base64Decode, base64Encode, buildCanonicalDecryptRequest, buildDecryptAttenuation, buildDecryptFacts, buildDecryptInvocation, buildNetworkId, canonicalHashHex, canonicalSignedResponse, canonicalize as canonicalizeEncryptionJson, checkDecryptInvocationInput, decryptEnvelopeWithKey, deriveSignedReceiverKey, discoverNetwork, encryptToNetwork, encryptionError, ensureNetworkUsableForDecrypt, generateRandomReceiverKey, hexDecode, hexEncode, isNetworkId, networkDiscoveryKey, openWrappedKey, parseNetworkId, utf8Decode, utf8Encode, validateEnvelope, verifyDecryptResponse } from './encryption/index.js';
12
13
  export { DecryptTransportResponseError } from '@tinycloud/sdk-services/internal/decrypt-transport-response-error';
13
14
  export { kvPrefixCovers } from './kv/replication/prefix.js';
15
+ import './kv/replication/contractConstants.js';
16
+ import './kv/replication/grantPolicyConstants.js';
14
17
 
15
18
  type TinyCloudDebugLevel = "debug";
16
19
  interface TinyCloudDebugEvent {
@@ -488,14 +491,14 @@ declare const ServiceRequestEventSchema: z.ZodObject<{
488
491
  timestamp: z.ZodNumber;
489
492
  }, "strip", z.ZodTypeAny, {
490
493
  timestamp: number;
491
- service: string;
492
494
  action: string;
495
+ service: string;
493
496
  key?: string | undefined;
494
497
  span?: string | undefined;
495
498
  }, {
496
499
  timestamp: number;
497
- service: string;
498
500
  action: string;
501
+ service: string;
499
502
  key?: string | undefined;
500
503
  span?: string | undefined;
501
504
  }>;
@@ -514,16 +517,16 @@ declare const ServiceResponseEventSchema: z.ZodObject<{
514
517
  }, "strip", z.ZodTypeAny, {
515
518
  duration: number;
516
519
  ok: boolean;
517
- service: string;
518
520
  action: string;
521
+ service: string;
519
522
  durationMs?: number | undefined;
520
523
  status?: number | undefined;
521
524
  span?: string | undefined;
522
525
  }, {
523
526
  duration: number;
524
527
  ok: boolean;
525
- service: string;
526
528
  action: string;
529
+ service: string;
527
530
  durationMs?: number | undefined;
528
531
  status?: number | undefined;
529
532
  span?: string | undefined;
@@ -682,8 +685,8 @@ declare const TelemetrySpanEventSchema: z.ZodObject<{
682
685
  meta?: z.objectOutputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
683
686
  } | undefined;
684
687
  status?: number | undefined;
685
- service?: string | undefined;
686
688
  action?: string | undefined;
689
+ service?: string | undefined;
687
690
  }, {
688
691
  durationMs: number;
689
692
  ok: boolean;
@@ -696,8 +699,8 @@ declare const TelemetrySpanEventSchema: z.ZodObject<{
696
699
  meta?: z.objectInputType<{}, z.ZodTypeAny, "passthrough"> | undefined;
697
700
  } | undefined;
698
701
  status?: number | undefined;
699
- service?: string | undefined;
700
702
  action?: string | undefined;
703
+ service?: string | undefined;
701
704
  }>;
702
705
  type TelemetrySpanEventType = z.infer<typeof TelemetrySpanEventSchema>;
703
706
  /**
@@ -1054,6 +1057,29 @@ declare function authExpiredError(service: string): ServiceError;
1054
1057
  * Create a service error for network issues.
1055
1058
  */
1056
1059
  declare function networkError(service: string, message: string, cause?: Error): ServiceError;
1060
+ /**
1061
+ * Classify a node retry signal (tinycloud-node #347, TC-1054). The node's
1062
+ * bodies are plain text led by a stable token:
1063
+ * - `503 sql_busy: <stage>: ...` and `503 unavailable_retryable: ...` are
1064
+ * `NODE_BUSY`: nothing was applied; retry after `meta.retryAfterMs`.
1065
+ * - `503 request_timeout: ...` is `REQUEST_TIMEOUT`: the deadline passed before
1066
+ * any write began, so nothing was applied.
1067
+ * - `500 outcome_unknown: ...` is `OUTCOME_UNKNOWN`: a write may have been
1068
+ * applied; read back before retrying a non-idempotent operation.
1069
+ *
1070
+ * `meta.retryable` is the safe-to-retry verdict and `meta.retryAfterMs` the
1071
+ * node's `Retry-After` (the node sends whole seconds; anything else is
1072
+ * ignored). The SDK never retries on its own. Returns `undefined` for any
1073
+ * other response, including the bodyless 503/500 of nodes before 1.21, which
1074
+ * callers keep classifying as they always did.
1075
+ */
1076
+ declare function nodeRetryError(service: string, message: string, response: {
1077
+ status: number;
1078
+ statusText: string;
1079
+ headers: {
1080
+ get(name: string): string | null;
1081
+ };
1082
+ }, errorText: string): ServiceError | undefined;
1057
1083
  /**
1058
1084
  * Create a service error for timeouts.
1059
1085
  *
@@ -1868,6 +1894,19 @@ interface VaultPutOptions {
1868
1894
  * fails with `ALREADY_EXISTS`; it is never overwritten.
1869
1895
  */
1870
1896
  ifNoneMatch?: "*";
1897
+ /**
1898
+ * Compare-and-swap: write only when the stored envelope still has this
1899
+ * strong ETag, passed exactly as {@link VaultEntry.etag} returned it
1900
+ * (including the quotes). Network-encrypted vaults only; cannot be combined
1901
+ * with `ifNoneMatch`.
1902
+ *
1903
+ * Failures are distinct codes: `ETAG_MISMATCH` (the value changed or was
1904
+ * deleted: re-read, re-apply, retry), `INVALID_ETAG` (malformed; never
1905
+ * retry), `OUTCOME_UNKNOWN` (the node may have applied the write, or a gateway
1906
+ * answered for it: read it back before retrying, with a freshly signed request) and `NODE_BUSY`
1907
+ * (nothing was written; retry).
1908
+ */
1909
+ ifMatch?: string;
1871
1910
  }
1872
1911
  /**
1873
1912
  * Options for vault get operations.
@@ -1877,8 +1916,25 @@ interface VaultGetOptions<T = unknown> {
1877
1916
  deserialize?: (data: Uint8Array) => T;
1878
1917
  /** Return raw decrypted bytes without deserialization */
1879
1918
  raw?: boolean;
1880
- /** Force the underlying KV read to bypass replica read-through. */
1919
+ /**
1920
+ * Force the underlying KV read to bypass replica read-through. Required for
1921
+ * a usable {@link VaultEntry.etag}: only network reads return one, because
1922
+ * a replica can serve a stale etag.
1923
+ */
1881
1924
  source?: "network";
1925
+ /**
1926
+ * Opt-in (default off): refuse an envelope whose AAD is not bound to this
1927
+ * vault's space and this key (`tinycloud.vault:<spaceId>:<key>`). The space
1928
+ * id is compared after normalizing the spelling of its EVM addresses
1929
+ * (checksummed and lowercase are the same space). An envelope with no AAD,
1930
+ * or with a different one, fails with `AAD_MISMATCH` (`aad_mismatch` from
1931
+ * `readNetworkEncrypted`) instead of decrypting. This stops a ciphertext
1932
+ * copied to another key from being accepted; it does not stop a freshly
1933
+ * encrypted forgery. A malformed stored value is a corrupt envelope, as without this
1934
+ * option. Network-encrypted vaults only: a master-key vault and `getShared` refuse it with
1935
+ * `STORAGE_ERROR` rather than skip the check.
1936
+ */
1937
+ expectAad?: boolean;
1882
1938
  /** Delegated KV service for reading from the grantor's space (used by getShared) */
1883
1939
  kv?: {
1884
1940
  get<V>(key: string, options?: {
@@ -1933,6 +1989,12 @@ interface VaultEntry<T> {
1933
1989
  metadata: Record<string, string>;
1934
1990
  /** Key ID used for encryption */
1935
1991
  keyId: string;
1992
+ /**
1993
+ * Strong ETag of the stored envelope, for {@link VaultPutOptions.ifMatch}.
1994
+ * Present only for network-encrypted reads made with `source: "network"`
1995
+ * (always for `readNetworkEncrypted`); never taken from a replica.
1996
+ */
1997
+ etag?: string;
1936
1998
  }
1937
1999
  /**
1938
2000
  * Safe classification for a network-encrypted vault read.
@@ -1959,6 +2021,10 @@ type VaultNetworkReadResult<T> = {
1959
2021
  status: "decrypt_failed";
1960
2022
  } | {
1961
2023
  status: "invalid_payload";
2024
+ }
2025
+ /** Only with `expectAad`: the envelope is not bound to this space and key. */
2026
+ | {
2027
+ status: "aad_mismatch";
1962
2028
  };
1963
2029
  /**
1964
2030
  * Structured error codes for vault operations.
@@ -2016,6 +2082,43 @@ type VaultErrorInput = {
2016
2082
  meta?: Record<string, unknown>;
2017
2083
  /** The typed KV error that refused the write (an `Error` carrying its `code`, `service` and `meta`). */
2018
2084
  cause: ServiceError & Error;
2085
+ } | {
2086
+ /** `expectAad` read: the envelope's AAD is missing or bound to another space/key. */
2087
+ code: "AAD_MISMATCH";
2088
+ key: string;
2089
+ message: string;
2090
+ } | {
2091
+ /** `ifMatch` write refused (HTTP 412): the value changed or no longer exists. Re-read and retry. */
2092
+ code: "ETAG_MISMATCH";
2093
+ key: string;
2094
+ message: string;
2095
+ meta?: Record<string, unknown>;
2096
+ cause: ServiceError & Error;
2097
+ } | {
2098
+ /** `ifMatch` is not a strong ETag (HTTP 400, or rejected before sending). Never retry. */
2099
+ code: "INVALID_ETAG";
2100
+ key: string;
2101
+ message: string;
2102
+ meta?: Record<string, unknown>;
2103
+ cause?: ServiceError & Error;
2104
+ } | {
2105
+ /**
2106
+ * `ifMatch` write that may have been applied: the node's `outcome_unknown` (500), a gateway
2107
+ * answer that can follow a commit (500, 502, 503 without the node's busy body, 504, 520,
2108
+ * 522, 524) or a connection that failed after the request was sent. Re-read before retrying.
2109
+ */
2110
+ code: "OUTCOME_UNKNOWN";
2111
+ key: string;
2112
+ message: string;
2113
+ meta?: Record<string, unknown>;
2114
+ cause: ServiceError & Error;
2115
+ } | {
2116
+ /** `ifMatch` write, the node's own busy/timeout answer (503 with its busy body): nothing was written. Safe to retry. */
2117
+ code: "NODE_BUSY";
2118
+ key: string;
2119
+ message: string;
2120
+ meta?: Record<string, unknown>;
2121
+ cause: ServiceError & Error;
2019
2122
  } | {
2020
2123
  code: "STORAGE_QUOTA_EXCEEDED" | "STORAGE_LIMIT_REACHED";
2021
2124
  message: string;
@@ -2581,4 +2684,4 @@ declare class SecretsService implements ISecretsService {
2581
2684
  listAll(): Promise<Result<SecretCatalogEntry[], SecretsError>>;
2582
2685
  }
2583
2686
 
2584
- export { type AuthorizationVerdict, BaseService, type ColumnInfo, type DataVaultConfig, DataVaultService, DecryptCapabilityProof, DuckDbAction, type DuckDbActionType, type DuckDbBatchOptions, type BatchResponse as DuckDbBatchResponse, DuckDbDatabaseHandle, type DuckDbExecuteOptions, type ExecuteResponse as DuckDbExecuteResponse, type DuckDbOptions, type DuckDbQueryOptions, type QueryResponse as DuckDbQueryResponse, DuckDbService, type DuckDbServiceConfig, type DuckDbStatement, type DuckDbValue, EventHandler, FetchFunction, GenericKVResponseSchema, type GenericKVResponseType, GenericResultSchema, type HookEvent, type HookServiceName, type HookStreamEvent, type HookStreamRetryConfig, type HookSubscription, type HookWebhookListOptions, type HookWebhookRecord, type HookWebhookRegistration, type HookWebhookScope, type HookWebhookUnregisterOptions, HooksService, type HooksServiceConfig, type IDataVaultService, type IDuckDbDatabaseHandle, type IDuckDbService, IEncryptionService, type IHooksService, IKVService, type ISecretsService, IService, IServiceContext, type IStorageService, InvokeAnyFunction, InvokeFunction, KVListResponseSchema, type KVListResponseType, KVListResultSchema, type KVListResultType, KVResponseHeadersSchema, type KVResponseHeadersType, MAX_SECRET_SCOPE_LENGTH, type ParsedSecretCatalogKey, PermissionHint, type QuotaConfig, type QuotaStatus, type ResolvedSecretPath, Result, RetryPolicy, RetryPolicySchema, type RetryPolicyType, SECRET_NAME_RE, SECRET_SCOPE_RE, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_NEARLY_FULL_RATIO, STORAGE_WRITE_TOO_LARGE_MESSAGE, type SchemaInfo, type SecretCatalogEntry, type SecretPayload, type SecretPutOptions, type SecretScopeOptions, type SecretsError, SecretsService, ServiceContext, type ServiceContextConfig, ServiceError, ServiceErrorEventSchema, type ServiceErrorEventType, ServiceErrorSchema, type ServiceErrorType, ServiceRequestEventSchema, type ServiceRequestEventType, ServiceResponseEventSchema, type ServiceResponseEventType, ServiceRetryEventSchema, type ServiceRetryEventType, ServiceSession, ServiceSessionSchema, type ServiceSessionType, type StorageAccountUsage, type StorageFullEvent, type StorageFullHandler, StorageFullMonitor, StorageQuotaInfo, type StorageRejectionDetails, type StorageStatus, type StorageStatusOptions, type StorageUsage, type StorageUsageState, type SubscribeOptions, TC832_RESERVED_SCOPES, type TableInfo, TelemetryConfig, TelemetrySpanEventSchema, type TelemetrySpanEventType, type TinyCloudDebugEnableOptions, type TinyCloudDebugEvent, type TinyCloudDebugLevel, TinyCloudDebugLogger, type TinyCloudDebugTimer, TinyCloudQuota, type ValidationError, type VaultCrypto, type VaultEntry, type VaultError, type VaultGetOptions, type VaultGrantOptions, VaultHeaders, type VaultListOptions, type VaultListPage, type VaultNetworkReadResult, VaultPublicSpaceKVActions, type VaultPutOptions, type ViewInfo, type WasmVaultFunctions, abortedError, appSecretScope, authExpiredError, authRequiredError, authUnauthorizedError, authorizationVerdictOf, canonicalizeSecretScope, clearTinyCloudDebugLogs, createKVResponseSchema, createResultSchema, createVaultCrypto, disableTinyCloudDebug, enableTinyCloudDebug, errorResult, getTinyCloudDebugLogs, installTinyCloudDebugGlobals, isStorageFullError, networkError, notFoundError, parseAuthError, parseCapabilityResource, parsePermissionHint, parsePermissionHintFromErrorText, parseSecretCatalogKey, parseStorageQuotaBytes, parseStorageRejection, parseStorageStatus, permissionDeniedError, resolveSecretListPrefix, resolveSecretPath, storageLimitReachedError, storageQuotaExceededError, storageRejectionError, storageUsageState, timeoutError, tinyCloudDebugLogger, validateKVListResponse, validateKVResponseHeaders, validateRetryPolicy, validateServiceError, validateServiceRequestEvent, validateServiceResponseEvent, validateServiceSession, validateTelemetrySpanEvent, validatedCapabilityOf, wrapError };
2687
+ export { type AuthorizationVerdict, BaseService, type ColumnInfo, type DataVaultConfig, DataVaultService, DecryptCapabilityProof, DuckDbAction, type DuckDbActionType, type DuckDbBatchOptions, type BatchResponse as DuckDbBatchResponse, DuckDbDatabaseHandle, type DuckDbExecuteOptions, type ExecuteResponse as DuckDbExecuteResponse, type DuckDbOptions, type DuckDbQueryOptions, type QueryResponse as DuckDbQueryResponse, DuckDbService, type DuckDbServiceConfig, type DuckDbStatement, type DuckDbValue, EventHandler, FetchFunction, GenericKVResponseSchema, type GenericKVResponseType, GenericResultSchema, type HookEvent, type HookServiceName, type HookStreamEvent, type HookStreamRetryConfig, type HookSubscription, type HookWebhookListOptions, type HookWebhookRecord, type HookWebhookRegistration, type HookWebhookScope, type HookWebhookUnregisterOptions, HooksService, type HooksServiceConfig, type IDataVaultService, type IDuckDbDatabaseHandle, type IDuckDbService, IEncryptionService, type IHooksService, IKVService, type ISecretsService, IService, IServiceContext, type IStorageService, InvokeAnyFunction, InvokeFunction, KVListResponseSchema, type KVListResponseType, KVListResultSchema, type KVListResultType, KVResponseHeadersSchema, type KVResponseHeadersType, MAX_SECRET_SCOPE_LENGTH, type ParsedSecretCatalogKey, PermissionHint, type QuotaConfig, type QuotaStatus, type ResolvedSecretPath, Result, RetryPolicy, RetryPolicySchema, type RetryPolicyType, SECRET_NAME_RE, SECRET_SCOPE_RE, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_NEARLY_FULL_RATIO, STORAGE_WRITE_TOO_LARGE_MESSAGE, type SchemaInfo, type SecretCatalogEntry, type SecretPayload, type SecretPutOptions, type SecretScopeOptions, type SecretsError, SecretsService, ServiceContext, type ServiceContextConfig, ServiceError, ServiceErrorEventSchema, type ServiceErrorEventType, ServiceErrorSchema, type ServiceErrorType, ServiceRequestEventSchema, type ServiceRequestEventType, ServiceResponseEventSchema, type ServiceResponseEventType, ServiceRetryEventSchema, type ServiceRetryEventType, ServiceSession, ServiceSessionSchema, type ServiceSessionType, type StorageAccountUsage, type StorageFullEvent, type StorageFullHandler, StorageFullMonitor, StorageQuotaInfo, type StorageRejectionDetails, type StorageStatus, type StorageStatusOptions, type StorageUsage, type StorageUsageState, type SubscribeOptions, TC832_RESERVED_SCOPES, type TableInfo, TelemetryConfig, TelemetrySpanEventSchema, type TelemetrySpanEventType, type TinyCloudDebugEnableOptions, type TinyCloudDebugEvent, type TinyCloudDebugLevel, TinyCloudDebugLogger, type TinyCloudDebugTimer, TinyCloudQuota, type ValidationError, type VaultCrypto, type VaultEntry, type VaultError, type VaultGetOptions, type VaultGrantOptions, VaultHeaders, type VaultListOptions, type VaultListPage, type VaultNetworkReadResult, VaultPublicSpaceKVActions, type VaultPutOptions, type ViewInfo, type WasmVaultFunctions, abortedError, appSecretScope, authExpiredError, authRequiredError, authUnauthorizedError, authorizationVerdictOf, canonicalizeSecretScope, clearTinyCloudDebugLogs, createKVResponseSchema, createResultSchema, createVaultCrypto, disableTinyCloudDebug, enableTinyCloudDebug, errorResult, getTinyCloudDebugLogs, installTinyCloudDebugGlobals, isStorageFullError, networkError, nodeRetryError, notFoundError, parseAuthError, parseCapabilityResource, parsePermissionHint, parsePermissionHintFromErrorText, parseSecretCatalogKey, parseStorageQuotaBytes, parseStorageRejection, parseStorageStatus, permissionDeniedError, resolveSecretListPrefix, resolveSecretPath, storageLimitReachedError, storageQuotaExceededError, storageRejectionError, storageUsageState, timeoutError, tinyCloudDebugLogger, validateKVListResponse, validateKVResponseHeaders, validateRetryPolicy, validateServiceError, validateServiceRequestEvent, validateServiceResponseEvent, validateServiceSession, validateTelemetrySpanEvent, validatedCapabilityOf, wrapError };