@tinycloud/node-sdk 3.8.0-beta.9 → 3.8.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +6 -0
  2. package/dist/{TinyCloudNode-C0LgPzzJ.d.cts → TinyCloudNode-BhWBbCay.d.cts} +50 -5
  3. package/dist/{TinyCloudNode-jPL2UqH5.d.ts → TinyCloudNode-BjJJIifr.d.ts} +50 -5
  4. package/dist/{WasmKeyProvider-5Ee7fcAw.d.cts → WasmKeyProvider-BKCPRC-c.d.cts} +21 -1
  5. package/dist/{WasmKeyProvider-5Ee7fcAw.d.ts → WasmKeyProvider-BKCPRC-c.d.ts} +21 -1
  6. package/dist/{authority-DvHTgPC4.d.ts → authority-BzqKNzOr.d.ts} +1 -1
  7. package/dist/{authority-Dkhr6n-f.d.cts → authority-WCJA3phs.d.cts} +1 -1
  8. package/dist/core.cjs +265 -31
  9. package/dist/core.cjs.map +1 -1
  10. package/dist/core.d.cts +4 -4
  11. package/dist/core.d.ts +4 -4
  12. package/dist/core.js +266 -32
  13. package/dist/core.js.map +1 -1
  14. package/dist/credentials-core.d.cts +1 -1
  15. package/dist/credentials-core.d.ts +1 -1
  16. package/dist/credentials.d.cts +1 -1
  17. package/dist/credentials.d.ts +1 -1
  18. package/dist/{delegation-0LKZkmP2.d.cts → delegation-Ckc3UETl.d.cts} +1 -1
  19. package/dist/{delegation-0LKZkmP2.d.ts → delegation-Ckc3UETl.d.ts} +1 -1
  20. package/dist/encryption-keys.d.cts +2 -2
  21. package/dist/encryption-keys.d.ts +2 -2
  22. package/dist/index.cjs +215 -31
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +3 -3
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +220 -33
  27. package/dist/index.js.map +1 -1
  28. package/dist/replication/authority.d.cts +3 -3
  29. package/dist/replication/authority.d.ts +3 -3
  30. package/dist/share-receive.cjs +775 -0
  31. package/dist/share-receive.cjs.map +1 -0
  32. package/dist/share-receive.d.cts +32 -0
  33. package/dist/share-receive.d.ts +32 -0
  34. package/dist/share-receive.js +777 -0
  35. package/dist/share-receive.js.map +1 -0
  36. package/package.json +11 -4
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ISigner, Bytes, IWasmBindings, PersistedSessionProof, ISessionManager } from '@tinycloud/sdk-core';
2
2
  export { ACCOUNT_REGISTRY_PATH, ACCOUNT_REGISTRY_SPACE, AccountApplication, AccountApplicationListOptions, AccountApplicationRegisterOptions, AccountDelegation, AccountDelegationListOptions, AccountDelegationPage, AccountDelegationQueryOptions, AccountDelegationRecord, AccountDelegationResource, AccountDelegationRevokeOptions, AccountIndexEnsureResult, AccountIndexRebuildResult, AccountIndexStatus, AccountIndexedReadOptions, AccountService, AccountServiceConfig, AccountSpace, AccountSpaceListOptions, AccountStatus, AuthorityRefusal, AutoApproveSpaceCreationHandler, AutoRejectStrategy, AutoSignStrategy, BatchOptions, BatchResponse, BuildCanonicalDecryptRequestInput, BuildDecryptFactsInput, BuildDecryptInvocationInput, BuiltDecryptInvocation, CallbackStrategy, CanonicalAddress, CanonicalDecryptRequest, CanonicalJson, CanonicalParsedNetworkId, CapabilityEntry, CapabilityKeyRegistry, CapabilityKeyRegistryErrorCode, CapabilityKeyRegistryErrorCodes, CaveatedDelegationUnsupportedError, ClientSession, ColumnInfo, ComposeManifestOptions, ComposedManifestRequest, CreateDelegationParams, DECRYPT_ACTION, DECRYPT_FACT_TYPE, DECRYPT_RESULT_TYPE, DEFAULT_ENCRYPTION_ALG, DEFAULT_KEY_VERSION, DEFAULT_MANIFEST_SPACE, DEFAULT_MANIFEST_VERSION, DEFAULT_SIGNED_READ_URL_EXPIRY_MS, DataVaultConfig, DataVaultService, DatabaseHandle, DecryptCapabilityProof, DecryptEnvelopeOptions, DecryptInvocationFact, DecryptInvocationSigner, DecryptRequestBody, DecryptResponseBody, DecryptTransport, DecryptTransportResponseError, DelegateReceivedShareParams, DelegatedShareAccess, Delegation, DelegationChain, DelegationChainV2, DelegationDirection, DelegationError, DelegationErrorCode, DelegationErrorCodes, DelegationFilters, DelegationManager, DelegationManagerConfig, DelegationRecord, DelegationResult, DelegationRevocationReceipt, DidCacheKeyOptions, DidEqualsOptions, DiscoverNetworkInput, DiscoveredNetwork, DiscoverySource, DuckDbAction, DuckDbActionType, DuckDbBatchOptions, DuckDbBatchResponse, DuckDbDatabaseHandle, DuckDbExecuteOptions, DuckDbExecuteResponse, DuckDbOptions, DuckDbQueryOptions, DuckDbQueryResponse, DuckDbService, DuckDbServiceConfig, DuckDbStatement, DuckDbValue, ENCRYPTION_NETWORK_URN_PREFIX, ENCRYPTION_SERVICE, ENCRYPTION_SERVICE_SHORT, ENVELOPE_VERSION, EncodedShareData, EncryptToNetworkInput, EncryptToNetworkOptions, EncryptToNetworkResult, EncryptionCrypto, EncryptionError, EncryptionErrorInput, EncryptionService, EncryptionServiceConfig, ExecuteOptions, ExecuteResponse, Extension, FetchFunction, GenerateShareParams, HookEvent, HookServiceName, HookStreamEvent, HookSubscription, HookWebhookListOptions, HookWebhookRecord, HookWebhookRegistration, HookWebhookScope, HookWebhookUnregisterOptions, HooksService, HooksServiceConfig, ICapabilityKeyRegistry, IDataVaultService, IDatabaseHandle, IDuckDbDatabaseHandle, IDuckDbService, IENSResolver, IEncryptionService, IHooksService, IKVService, INotificationHandler, IPrefixedKVService, ISQLService, ISecretsService, ISessionManager, ISessionStorage, ISharingService, ISigner, ISpace, ISpaceCreationHandler, ISpaceScopedDelegations, ISpaceScopedSharing, ISpaceService, IStorageService, IUserAuthorization, IWasmBindings, IdentityParseError, IngestOptions, InlineEncryptedEnvelope, InvokeFunction, JWK, KVBatchReadResponse, KVCreateSignedReadUrlOptions, KVListPage, KVReadThrough, KVReplicaHandle, KVReplicaSpec, KVReplicaStorage, KVReplicationController, KVReplicationDeps, KVResponse, KVService, KVServiceConfig, KVSignedReadUrlResponse, KeyInfo, KeyProvider, KeyType, LocalGetResult, LocalListResult, LocalReadMeta, LocalReplicaStatus, LocalSyncResult, MAX_SECRET_SCOPE_LENGTH, Manifest, ManifestDefaults, ManifestRegistryRecord, ManifestSecretActions, ManifestValidationError, NETWORK_NAME_PATTERN, NetworkDescriptor, NetworkIdError, NodeDescriptorFetcher, OpenKeyCallbackStrategy, OpenKeySigningRequestBody, OpenKeySigningResponseBody, OpenKeySigningStrategyOptions, OwnerDelegationPermission, ParsedNetworkId, ParsedSecretCatalogKey, PendingWriteRecord, PendingWriteState, PendingWriteStore, PermissionEntry, PermissionNotInManifestError, PersistedSessionData, PinnedKey, PkhDidParts, PrefixedKVService, ProtocolMismatchError, PurgeTarget, QueryOptions, QueryResponse, RandomReceiverKeyInput, ReceiveOptions, ReceiverKeyPair, ReceiverKeySigner, RegisterBatchSuccess, RegisterPolicyV3Input, RegisterPolicyV3Receipt, ReplicaAuthorityState, ReplicaCoverage, ReplicaDevice, ReplicaGatedHandle, ReplicaGrantInfo, ReplicaInspectedStatus, ReplicaLocalEraseOutcome, ReplicaPurgeError, ReplicaPurgeFailedEvent, ReplicaPurgeLocalCopyResult, ReplicaPurgeTrigger, ReplicaState, ReplicaStatusEntry, ReplicationAuthority, ReplicationControl, ReplicationEvent, ReplicationIdentity, ReplicationOptions, ReplicationPurgeReport, ReplicationReason, ReplicationScheduler, ResolvedCapabilities, ResolvedDelegate, ResolvedReplicationOptions, ResolvedSecretPath, ResourceCapability, SECRET_NAME_RE, SECRET_SCOPE_RE, SQLAction, SQLActionType, SQLService, SQLServiceConfig, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_WRITE_TOO_LARGE_MESSAGE, SchemaInfo, SecretCatalogEntry, SecretPayload, SecretPutOptions, SecretScopeOptions, SecretsError, SecretsService, ServiceContext, ServiceContextConfig, ServiceSession, SessionExpiredError, ShareAccess, ShareLink, ShareLinkData, ShareSchema, SharingService, SharingServiceConfig, SignCallback, SignInOptions, SignRequest, SignResponse, SignedReceiverKeyInput, SilentNotificationHandler, Space, SpaceAbilitiesMap, SpaceConfig, SpaceCreationContext, SpaceErrorCode, SpaceErrorCodes, SpaceInfo, SpaceOwnership, SpaceService, SpaceServiceConfig, SqlStatement, SqlValue, StorageAccountUsage, StorageFullEvent, StorageStatus, StorageStatusOptions, StorageUsage, StorageUsageState, StoredDelegationChain, SubscribeOptions, TC832_RESERVED_SCOPES, TableInfo, TelemetryConfig, TelemetryEventHandler, TinyCloud, TinyCloudConfig, TinyCloudDebugEnableOptions, TinyCloudDebugEvent, TinyCloudDebugLevel, TinyCloudDebugLogger, TinyCloudDebugTimer, TinyCloudSession, UnsupportedFeatureError, VAULT_PERMISSION_SERVICE, VaultCrypto, VaultEntry, VaultError, VaultGetOptions, VaultGrantOptions, VaultHeaders, VaultListOptions, VaultNetworkReadResult, VaultPublicSpaceKVActions, VaultPutOptions, VerifyDecryptResponseInput, VersionCheckError, ViewInfo, WasmVaultFunctions, WellKnownDescriptorFetcher, addressStorageKey, appSecretScope, buildCanonicalDecryptRequest, buildDecryptAttenuation, buildDecryptFacts, buildDecryptInvocation, buildNetworkId, buildSpaceUri, canonicalHashHex, canonicalSignedResponse, canonicalizeAddress, canonicalizeDid, canonicalizeDidUrl, canonicalizeEncryptionJson, canonicalizeNetworkId, canonicalizeSecretScope, checkDecryptInvocationInput, checkNodeInfo, clearTinyCloudDebugLogs, composeManifestRequest, createCapabilityKeyRegistry, createOpenKeyCallbackSigningStrategy, createSharingService, createSpaceService, createVaultCrypto, decryptEnvelopeWithKey, defaultSpaceCreationHandler, deriveSignedReceiverKey, didCacheKey, didEquals, disableTinyCloudDebug, discoverNetwork, enableTinyCloudDebug, encryptToNetwork, encryptionBase64Decode, encryptionBase64Encode, encryptionError, encryptionUtf8Decode, encryptionUtf8Encode, ensureNetworkUsableForDecrypt, expandActionShortNames, expandPermissionEntries, expandPermissionEntry, generateRandomReceiverKey, getTinyCloudDebugLogs, hexDecode, hexEncode, installTinyCloudDebugGlobals, isCapabilitySubset, isEvmAddress, isNetworkId, isStorageFullError, loadManifest, makePkhSpaceId, makePublicSpaceId, networkDiscoveryKey, openWrappedKey, parseCanonicalNetworkId, parseExpiry, parseNetworkId, parsePkhDid, parseSecretCatalogKey, parseSpaceUri, pkhDid, principalDid, principalDidEquals, resolveManifest, resolveSecretListPrefix, resolveSecretPath, resourceCapabilitiesToSpaceAbilitiesMap, storageUsageState, tinyCloudDebugLogger, validateEnvelope, validateManifest, verifyDecryptResponse } from '@tinycloud/sdk-core';
3
- export { F as FileSessionStorage, M as MemorySessionStorage, W as WasmKeyProvider, a as WasmKeyProviderConfig, c as createWasmKeyProvider } from './WasmKeyProvider-5Ee7fcAw.cjs';
4
- export { A as ACCEPTED_MARKER_VERSIONS, l as BOOTSTRAP_COMPLETION_MARKER_KEY, m as BOOTSTRAP_COMPLETION_MARKER_VERSION, n as BootstrapCompletionMarker, B as BootstrapWarning, C as CreateOwnerDelegationParams, D as DelegateToOptions, a as DelegateToResult, b as DelegatedAccess, E as EnsureEncryptionNetworkOptions, I as InvalidRestoredSessionError, N as NodeEventEmitterStrategy, c as NodeUserAuthorization, o as NodeUserAuthorizationAuthorizeFn, d as NodeUserAuthorizationConfig, p as OpenKeyAuthorizationResultV1, q as OpenKeyAuthorizeInput, r as OpenKeyAuthorizeTinyCloud, s as OpenKeyBridgeInput, O as OwnerDelegationReceipt, t as RestorableSession, R as RuntimePermissionGrantOptions, S as SecretPermissionHint, e as SecretReadInput, f as SecretReadResult, g as SignStrategy, T as TinyCloudNode, h as TinyCloudNodeConfig, U as UnifiedOwnerRootInput, i as UnifiedOwnerRootReceipt, j as UnsupportedSessionRestoreError, k as defaultSignStrategy, w as wireOpenKeyAuthorize } from './TinyCloudNode-C0LgPzzJ.cjs';
3
+ export { F as FileSessionStorage, M as MemorySessionStorage, W as WasmKeyProvider, a as WasmKeyProviderConfig, c as createWasmKeyProvider, i as isAppKeyHostBound } from './WasmKeyProvider-BKCPRC-c.cjs';
4
+ export { A as ACCEPTED_MARKER_VERSIONS, m as BOOTSTRAP_COMPLETION_MARKER_KEY, n as BOOTSTRAP_COMPLETION_MARKER_VERSION, o as BootstrapCompletionMarker, B as BootstrapWarning, C as CreateOwnerDelegationParams, D as DelegateToOptions, a as DelegateToResult, b as DelegatedAccess, E as EnsureEncryptionNetworkOptions, I as InvalidRestoredSessionError, N as NodeEventEmitterStrategy, c as NodeUserAuthorization, p as NodeUserAuthorizationAuthorizeFn, d as NodeUserAuthorizationConfig, q as OpenKeyAuthorizationResultV1, r as OpenKeyAuthorizeInput, O as OpenKeyAuthorizeTinyCloud, s as OpenKeyBridgeInput, e as OwnerDelegationReceipt, P as PreparedOpenKeyAuthorization, t as RestorableSession, R as RuntimePermissionGrantOptions, S as SecretPermissionHint, f as SecretReadInput, g as SecretReadResult, h as SignStrategy, T as TinyCloudNode, i as TinyCloudNodeConfig, U as UnifiedOwnerRootInput, j as UnifiedOwnerRootReceipt, k as UnsupportedSessionRestoreError, l as defaultSignStrategy, w as wireOpenKeyAuthorize } from './TinyCloudNode-BhWBbCay.cjs';
5
5
  import { invoke, invokeAny, computeCid, prepareSession, completeSessionSetup, ensureEip55, makeSpaceId, createDelegation, parseRecapFromSiwe, parseVerifiedRecapFromSiwe, generateHostSIWEMessage, siweToDelegationHeaders, protocolVersion, vault_encrypt, vault_decrypt, vault_derive_key, vault_x25519_from_seed, vault_x25519_dh, vault_random_bytes, vault_sha256 } from '@tinycloud/node-sdk-wasm';
6
- export { A as AuthDelegationArtifact, b as AuthRequestArtifact, C as CompactRuntimeDelegationInput, D as DelegationAuthority, P as PortableDelegation, R as RUNTIME_DELEGATION_REJECTIONS, c as RuntimeDelegationActivator, e as RuntimeDelegationRejectedError, f as RuntimeDelegationRejection, S as SessionGrantProof, V as ValidatedRuntimeDelegation, g as VerifiedSessionGrant, a as activateCompactRuntimeDelegation, h as activateValidatedRuntimeDelegation, d as deserializeDelegation, i as grantAuthRequest, s as serializeDelegation, j as signedCompactUcanExpiry, k as siweRuntimeDelegation } from './delegation-0LKZkmP2.cjs';
6
+ export { A as AuthDelegationArtifact, e as AuthRequestArtifact, C as CompactRuntimeDelegationInput, D as DelegationAuthority, P as PortableDelegation, f as RUNTIME_DELEGATION_REJECTIONS, g as RuntimeDelegationActivator, R as RuntimeDelegationRejectedError, a as RuntimeDelegationRejection, S as SessionGrantProof, V as ValidatedRuntimeDelegation, h as VerifiedSessionGrant, b as activateCompactRuntimeDelegation, c as activateValidatedRuntimeDelegation, d as deserializeDelegation, i as grantAuthRequest, s as serializeDelegation, j as signedCompactUcanExpiry, k as siweRuntimeDelegation } from './delegation-Ckc3UETl.cjs';
7
7
  import { KVReplicaStorage } from '@tinycloud/sdk-services';
8
8
  import { ProfileReplicaPurge } from '@tinycloud/sdk-services/kv/replication';
9
9
  export { ProfileReplicaDeferredToken, ProfileReplicaPurge } from '@tinycloud/sdk-services/kv/replication';
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ISigner, Bytes, IWasmBindings, PersistedSessionProof, ISessionManager } from '@tinycloud/sdk-core';
2
2
  export { ACCOUNT_REGISTRY_PATH, ACCOUNT_REGISTRY_SPACE, AccountApplication, AccountApplicationListOptions, AccountApplicationRegisterOptions, AccountDelegation, AccountDelegationListOptions, AccountDelegationPage, AccountDelegationQueryOptions, AccountDelegationRecord, AccountDelegationResource, AccountDelegationRevokeOptions, AccountIndexEnsureResult, AccountIndexRebuildResult, AccountIndexStatus, AccountIndexedReadOptions, AccountService, AccountServiceConfig, AccountSpace, AccountSpaceListOptions, AccountStatus, AuthorityRefusal, AutoApproveSpaceCreationHandler, AutoRejectStrategy, AutoSignStrategy, BatchOptions, BatchResponse, BuildCanonicalDecryptRequestInput, BuildDecryptFactsInput, BuildDecryptInvocationInput, BuiltDecryptInvocation, CallbackStrategy, CanonicalAddress, CanonicalDecryptRequest, CanonicalJson, CanonicalParsedNetworkId, CapabilityEntry, CapabilityKeyRegistry, CapabilityKeyRegistryErrorCode, CapabilityKeyRegistryErrorCodes, CaveatedDelegationUnsupportedError, ClientSession, ColumnInfo, ComposeManifestOptions, ComposedManifestRequest, CreateDelegationParams, DECRYPT_ACTION, DECRYPT_FACT_TYPE, DECRYPT_RESULT_TYPE, DEFAULT_ENCRYPTION_ALG, DEFAULT_KEY_VERSION, DEFAULT_MANIFEST_SPACE, DEFAULT_MANIFEST_VERSION, DEFAULT_SIGNED_READ_URL_EXPIRY_MS, DataVaultConfig, DataVaultService, DatabaseHandle, DecryptCapabilityProof, DecryptEnvelopeOptions, DecryptInvocationFact, DecryptInvocationSigner, DecryptRequestBody, DecryptResponseBody, DecryptTransport, DecryptTransportResponseError, DelegateReceivedShareParams, DelegatedShareAccess, Delegation, DelegationChain, DelegationChainV2, DelegationDirection, DelegationError, DelegationErrorCode, DelegationErrorCodes, DelegationFilters, DelegationManager, DelegationManagerConfig, DelegationRecord, DelegationResult, DelegationRevocationReceipt, DidCacheKeyOptions, DidEqualsOptions, DiscoverNetworkInput, DiscoveredNetwork, DiscoverySource, DuckDbAction, DuckDbActionType, DuckDbBatchOptions, DuckDbBatchResponse, DuckDbDatabaseHandle, DuckDbExecuteOptions, DuckDbExecuteResponse, DuckDbOptions, DuckDbQueryOptions, DuckDbQueryResponse, DuckDbService, DuckDbServiceConfig, DuckDbStatement, DuckDbValue, ENCRYPTION_NETWORK_URN_PREFIX, ENCRYPTION_SERVICE, ENCRYPTION_SERVICE_SHORT, ENVELOPE_VERSION, EncodedShareData, EncryptToNetworkInput, EncryptToNetworkOptions, EncryptToNetworkResult, EncryptionCrypto, EncryptionError, EncryptionErrorInput, EncryptionService, EncryptionServiceConfig, ExecuteOptions, ExecuteResponse, Extension, FetchFunction, GenerateShareParams, HookEvent, HookServiceName, HookStreamEvent, HookSubscription, HookWebhookListOptions, HookWebhookRecord, HookWebhookRegistration, HookWebhookScope, HookWebhookUnregisterOptions, HooksService, HooksServiceConfig, ICapabilityKeyRegistry, IDataVaultService, IDatabaseHandle, IDuckDbDatabaseHandle, IDuckDbService, IENSResolver, IEncryptionService, IHooksService, IKVService, INotificationHandler, IPrefixedKVService, ISQLService, ISecretsService, ISessionManager, ISessionStorage, ISharingService, ISigner, ISpace, ISpaceCreationHandler, ISpaceScopedDelegations, ISpaceScopedSharing, ISpaceService, IStorageService, IUserAuthorization, IWasmBindings, IdentityParseError, IngestOptions, InlineEncryptedEnvelope, InvokeFunction, JWK, KVBatchReadResponse, KVCreateSignedReadUrlOptions, KVListPage, KVReadThrough, KVReplicaHandle, KVReplicaSpec, KVReplicaStorage, KVReplicationController, KVReplicationDeps, KVResponse, KVService, KVServiceConfig, KVSignedReadUrlResponse, KeyInfo, KeyProvider, KeyType, LocalGetResult, LocalListResult, LocalReadMeta, LocalReplicaStatus, LocalSyncResult, MAX_SECRET_SCOPE_LENGTH, Manifest, ManifestDefaults, ManifestRegistryRecord, ManifestSecretActions, ManifestValidationError, NETWORK_NAME_PATTERN, NetworkDescriptor, NetworkIdError, NodeDescriptorFetcher, OpenKeyCallbackStrategy, OpenKeySigningRequestBody, OpenKeySigningResponseBody, OpenKeySigningStrategyOptions, OwnerDelegationPermission, ParsedNetworkId, ParsedSecretCatalogKey, PendingWriteRecord, PendingWriteState, PendingWriteStore, PermissionEntry, PermissionNotInManifestError, PersistedSessionData, PinnedKey, PkhDidParts, PrefixedKVService, ProtocolMismatchError, PurgeTarget, QueryOptions, QueryResponse, RandomReceiverKeyInput, ReceiveOptions, ReceiverKeyPair, ReceiverKeySigner, RegisterBatchSuccess, RegisterPolicyV3Input, RegisterPolicyV3Receipt, ReplicaAuthorityState, ReplicaCoverage, ReplicaDevice, ReplicaGatedHandle, ReplicaGrantInfo, ReplicaInspectedStatus, ReplicaLocalEraseOutcome, ReplicaPurgeError, ReplicaPurgeFailedEvent, ReplicaPurgeLocalCopyResult, ReplicaPurgeTrigger, ReplicaState, ReplicaStatusEntry, ReplicationAuthority, ReplicationControl, ReplicationEvent, ReplicationIdentity, ReplicationOptions, ReplicationPurgeReport, ReplicationReason, ReplicationScheduler, ResolvedCapabilities, ResolvedDelegate, ResolvedReplicationOptions, ResolvedSecretPath, ResourceCapability, SECRET_NAME_RE, SECRET_SCOPE_RE, SQLAction, SQLActionType, SQLService, SQLServiceConfig, STORAGE_FULL_MESSAGE, STORAGE_MANAGE_URL, STORAGE_WRITE_TOO_LARGE_MESSAGE, SchemaInfo, SecretCatalogEntry, SecretPayload, SecretPutOptions, SecretScopeOptions, SecretsError, SecretsService, ServiceContext, ServiceContextConfig, ServiceSession, SessionExpiredError, ShareAccess, ShareLink, ShareLinkData, ShareSchema, SharingService, SharingServiceConfig, SignCallback, SignInOptions, SignRequest, SignResponse, SignedReceiverKeyInput, SilentNotificationHandler, Space, SpaceAbilitiesMap, SpaceConfig, SpaceCreationContext, SpaceErrorCode, SpaceErrorCodes, SpaceInfo, SpaceOwnership, SpaceService, SpaceServiceConfig, SqlStatement, SqlValue, StorageAccountUsage, StorageFullEvent, StorageStatus, StorageStatusOptions, StorageUsage, StorageUsageState, StoredDelegationChain, SubscribeOptions, TC832_RESERVED_SCOPES, TableInfo, TelemetryConfig, TelemetryEventHandler, TinyCloud, TinyCloudConfig, TinyCloudDebugEnableOptions, TinyCloudDebugEvent, TinyCloudDebugLevel, TinyCloudDebugLogger, TinyCloudDebugTimer, TinyCloudSession, UnsupportedFeatureError, VAULT_PERMISSION_SERVICE, VaultCrypto, VaultEntry, VaultError, VaultGetOptions, VaultGrantOptions, VaultHeaders, VaultListOptions, VaultNetworkReadResult, VaultPublicSpaceKVActions, VaultPutOptions, VerifyDecryptResponseInput, VersionCheckError, ViewInfo, WasmVaultFunctions, WellKnownDescriptorFetcher, addressStorageKey, appSecretScope, buildCanonicalDecryptRequest, buildDecryptAttenuation, buildDecryptFacts, buildDecryptInvocation, buildNetworkId, buildSpaceUri, canonicalHashHex, canonicalSignedResponse, canonicalizeAddress, canonicalizeDid, canonicalizeDidUrl, canonicalizeEncryptionJson, canonicalizeNetworkId, canonicalizeSecretScope, checkDecryptInvocationInput, checkNodeInfo, clearTinyCloudDebugLogs, composeManifestRequest, createCapabilityKeyRegistry, createOpenKeyCallbackSigningStrategy, createSharingService, createSpaceService, createVaultCrypto, decryptEnvelopeWithKey, defaultSpaceCreationHandler, deriveSignedReceiverKey, didCacheKey, didEquals, disableTinyCloudDebug, discoverNetwork, enableTinyCloudDebug, encryptToNetwork, encryptionBase64Decode, encryptionBase64Encode, encryptionError, encryptionUtf8Decode, encryptionUtf8Encode, ensureNetworkUsableForDecrypt, expandActionShortNames, expandPermissionEntries, expandPermissionEntry, generateRandomReceiverKey, getTinyCloudDebugLogs, hexDecode, hexEncode, installTinyCloudDebugGlobals, isCapabilitySubset, isEvmAddress, isNetworkId, isStorageFullError, loadManifest, makePkhSpaceId, makePublicSpaceId, networkDiscoveryKey, openWrappedKey, parseCanonicalNetworkId, parseExpiry, parseNetworkId, parsePkhDid, parseSecretCatalogKey, parseSpaceUri, pkhDid, principalDid, principalDidEquals, resolveManifest, resolveSecretListPrefix, resolveSecretPath, resourceCapabilitiesToSpaceAbilitiesMap, storageUsageState, tinyCloudDebugLogger, validateEnvelope, validateManifest, verifyDecryptResponse } from '@tinycloud/sdk-core';
3
- export { F as FileSessionStorage, M as MemorySessionStorage, W as WasmKeyProvider, a as WasmKeyProviderConfig, c as createWasmKeyProvider } from './WasmKeyProvider-5Ee7fcAw.js';
4
- export { A as ACCEPTED_MARKER_VERSIONS, l as BOOTSTRAP_COMPLETION_MARKER_KEY, m as BOOTSTRAP_COMPLETION_MARKER_VERSION, n as BootstrapCompletionMarker, B as BootstrapWarning, C as CreateOwnerDelegationParams, D as DelegateToOptions, a as DelegateToResult, b as DelegatedAccess, E as EnsureEncryptionNetworkOptions, I as InvalidRestoredSessionError, N as NodeEventEmitterStrategy, c as NodeUserAuthorization, o as NodeUserAuthorizationAuthorizeFn, d as NodeUserAuthorizationConfig, p as OpenKeyAuthorizationResultV1, q as OpenKeyAuthorizeInput, r as OpenKeyAuthorizeTinyCloud, s as OpenKeyBridgeInput, O as OwnerDelegationReceipt, t as RestorableSession, R as RuntimePermissionGrantOptions, S as SecretPermissionHint, e as SecretReadInput, f as SecretReadResult, g as SignStrategy, T as TinyCloudNode, h as TinyCloudNodeConfig, U as UnifiedOwnerRootInput, i as UnifiedOwnerRootReceipt, j as UnsupportedSessionRestoreError, k as defaultSignStrategy, w as wireOpenKeyAuthorize } from './TinyCloudNode-jPL2UqH5.js';
3
+ export { F as FileSessionStorage, M as MemorySessionStorage, W as WasmKeyProvider, a as WasmKeyProviderConfig, c as createWasmKeyProvider, i as isAppKeyHostBound } from './WasmKeyProvider-BKCPRC-c.js';
4
+ export { A as ACCEPTED_MARKER_VERSIONS, m as BOOTSTRAP_COMPLETION_MARKER_KEY, n as BOOTSTRAP_COMPLETION_MARKER_VERSION, o as BootstrapCompletionMarker, B as BootstrapWarning, C as CreateOwnerDelegationParams, D as DelegateToOptions, a as DelegateToResult, b as DelegatedAccess, E as EnsureEncryptionNetworkOptions, I as InvalidRestoredSessionError, N as NodeEventEmitterStrategy, c as NodeUserAuthorization, p as NodeUserAuthorizationAuthorizeFn, d as NodeUserAuthorizationConfig, q as OpenKeyAuthorizationResultV1, r as OpenKeyAuthorizeInput, O as OpenKeyAuthorizeTinyCloud, s as OpenKeyBridgeInput, e as OwnerDelegationReceipt, P as PreparedOpenKeyAuthorization, t as RestorableSession, R as RuntimePermissionGrantOptions, S as SecretPermissionHint, f as SecretReadInput, g as SecretReadResult, h as SignStrategy, T as TinyCloudNode, i as TinyCloudNodeConfig, U as UnifiedOwnerRootInput, j as UnifiedOwnerRootReceipt, k as UnsupportedSessionRestoreError, l as defaultSignStrategy, w as wireOpenKeyAuthorize } from './TinyCloudNode-BjJJIifr.js';
5
5
  import { invoke, invokeAny, computeCid, prepareSession, completeSessionSetup, ensureEip55, makeSpaceId, createDelegation, parseRecapFromSiwe, parseVerifiedRecapFromSiwe, generateHostSIWEMessage, siweToDelegationHeaders, protocolVersion, vault_encrypt, vault_decrypt, vault_derive_key, vault_x25519_from_seed, vault_x25519_dh, vault_random_bytes, vault_sha256 } from '@tinycloud/node-sdk-wasm';
6
- export { A as AuthDelegationArtifact, b as AuthRequestArtifact, C as CompactRuntimeDelegationInput, D as DelegationAuthority, P as PortableDelegation, R as RUNTIME_DELEGATION_REJECTIONS, c as RuntimeDelegationActivator, e as RuntimeDelegationRejectedError, f as RuntimeDelegationRejection, S as SessionGrantProof, V as ValidatedRuntimeDelegation, g as VerifiedSessionGrant, a as activateCompactRuntimeDelegation, h as activateValidatedRuntimeDelegation, d as deserializeDelegation, i as grantAuthRequest, s as serializeDelegation, j as signedCompactUcanExpiry, k as siweRuntimeDelegation } from './delegation-0LKZkmP2.js';
6
+ export { A as AuthDelegationArtifact, e as AuthRequestArtifact, C as CompactRuntimeDelegationInput, D as DelegationAuthority, P as PortableDelegation, f as RUNTIME_DELEGATION_REJECTIONS, g as RuntimeDelegationActivator, R as RuntimeDelegationRejectedError, a as RuntimeDelegationRejection, S as SessionGrantProof, V as ValidatedRuntimeDelegation, h as VerifiedSessionGrant, b as activateCompactRuntimeDelegation, c as activateValidatedRuntimeDelegation, d as deserializeDelegation, i as grantAuthRequest, s as serializeDelegation, j as signedCompactUcanExpiry, k as siweRuntimeDelegation } from './delegation-Ckc3UETl.js';
7
7
  import { KVReplicaStorage } from '@tinycloud/sdk-services';
8
8
  import { ProfileReplicaPurge } from '@tinycloud/sdk-services/kv/replication';
9
9
  export { ProfileReplicaDeferredToken, ProfileReplicaPurge } from '@tinycloud/sdk-services/kv/replication';
package/dist/index.js CHANGED
@@ -18690,6 +18690,7 @@ function deserializeDelegation(data) {
18690
18690
 
18691
18691
  // src/TinyCloudNode.ts
18692
18692
  import { generateNonce, SiweMessage as SiweMessage3 } from "siwe";
18693
+ import { didKeyFromEd25519PublicKey } from "@tinycloud/share-envelope";
18693
18694
 
18694
18695
  // src/replication/module-registry.ts
18695
18696
  var nodeLoaders;
@@ -18738,10 +18739,13 @@ import {
18738
18739
  ENCRYPTION_PERMISSION_SERVICE as ENCRYPTION_PERMISSION_SERVICE2,
18739
18740
  CaveatedDelegationUnsupportedError as CaveatedDelegationUnsupportedError2,
18740
18741
  PermissionNotInManifestError,
18742
+ ManifestValidationError as ManifestValidationError2,
18741
18743
  SessionExpiredError,
18742
18744
  canonicalizeRecapCaveats as canonicalizeRecapCaveats2,
18743
18745
  recapCaveatsEqual as recapCaveatsEqual2,
18744
18746
  expandPermissionEntries as expandPermissionEntriesCore,
18747
+ expandRuntimePermissionEntries,
18748
+ expandDelegationPermissionEntries,
18745
18749
  isCapabilitySubset as isCapabilitySubset2,
18746
18750
  isExplicitOnlyAction,
18747
18751
  parseRecapCapabilities,
@@ -18772,6 +18776,7 @@ import {
18772
18776
  withoutShareLink,
18773
18777
  verifyEip191MessageSignature,
18774
18778
  signCompactUcanRootAuthorization,
18779
+ signCompactUcanAuthorization,
18775
18780
  markDelegationTerminal,
18776
18781
  isStorageFullError,
18777
18782
  STORAGE_FULL_MESSAGE,
@@ -18855,6 +18860,18 @@ function appKeyHostBinding(domain, appId) {
18855
18860
  const reversed = labels.reverse().join(".");
18856
18861
  return appId === reversed || appId.startsWith(`${reversed}.`);
18857
18862
  }
18863
+ function isAppKeyHostBound(keysAppId, origin) {
18864
+ if (typeof origin === "string" && !origin.includes("://")) {
18865
+ return appKeyHostBinding(origin, keysAppId);
18866
+ }
18867
+ let url;
18868
+ try {
18869
+ url = typeof origin === "string" ? new URL(origin) : origin;
18870
+ } catch {
18871
+ return false;
18872
+ }
18873
+ return appKeyHostBinding(url.host, keysAppId);
18874
+ }
18858
18875
 
18859
18876
  // src/authorization/NodeUserAuthorization.ts
18860
18877
  init_authority_sign_in();
@@ -19015,6 +19032,7 @@ function cloneAbilitiesMap(actions) {
19015
19032
  var NodeUserAuthorization = class {
19016
19033
  constructor(config) {
19017
19034
  this.activeSessionKeyId = "default";
19035
+ this.preparedSessionCounter = 0;
19018
19036
  /** Incremented by resetSession; a sign-in started earlier publishes nothing. */
19019
19037
  this.sessionGeneration = 0;
19020
19038
  /**
@@ -19597,7 +19615,8 @@ var NodeUserAuthorization = class {
19597
19615
  return true;
19598
19616
  }
19599
19617
  const parsed = entry.path.includes("/") ? parseEncryptionResource(entry.path) : { ...parseNetworkId(entry.path), kind: "network" };
19600
- if (parsed.kind !== "network") {
19618
+ const sharePrefix = parsed.kind === "prefix" && parsed.network === "default" && parsed.prefix === "share" && entry.actions.length === 1 && entry.actions[0] === DECRYPT_ACTION && didPrincipalMatches(parsed.ownerDid, currentDid);
19619
+ if (parsed.kind !== "network" && !sharePrefix) {
19601
19620
  throw new ManifestValidationError("named keys go in manifest.keys");
19602
19621
  }
19603
19622
  for (const action of entry.actions) {
@@ -19640,8 +19659,7 @@ var NodeUserAuthorization = class {
19640
19659
  /**
19641
19660
  * Build SIWE overrides from the top-level nonce and siweConfig.
19642
19661
  * - Top-level `nonce` is seeded first so `siweConfig.nonce` wins if both are set.
19643
- * - statement is prepended to the default statement
19644
- * - resources are appended to the default resources
19662
+ * - resources are inserted after WASM preparation, before the final ReCap
19645
19663
  * - uri triggers a warning (overwriting delegation target)
19646
19664
  * - all other fields override directly
19647
19665
  * - per-call nonce overrides siweConfig.nonce when provided
@@ -19659,9 +19677,6 @@ var NodeUserAuthorization = class {
19659
19677
  if (statement) {
19660
19678
  overrides.statement = this.statement ? `${statement} ${this.statement}` : statement;
19661
19679
  }
19662
- if (resources && resources.length > 0) {
19663
- overrides.resources = resources;
19664
- }
19665
19680
  if (uri) {
19666
19681
  console.warn(
19667
19682
  "[tinycloud] siweConfig.uri is overwriting the delegation target URI. This may break delegation chain validation if the URI does not match the session key DID."
@@ -19673,6 +19688,29 @@ var NodeUserAuthorization = class {
19673
19688
  }
19674
19689
  return overrides;
19675
19690
  }
19691
+ prepareSessionWithResources(params) {
19692
+ const resources = this.siweConfig?.resources;
19693
+ if (resources?.some((resource) => typeof resource !== "string" || !/^urn:tinycloud:recipients:[A-Za-z0-9_-]+$/.test(resource))) {
19694
+ throw new Error("SIWE metadata resources must be base64url recipients URIs");
19695
+ }
19696
+ const prepared = this.wasm.prepareSession(params);
19697
+ if (!resources?.length) return prepared;
19698
+ const recapLines = /^- urn:recap:[^\r\n]+$/gim;
19699
+ const recaps = prepared.siwe.match(recapLines);
19700
+ const recap = recaps?.[0];
19701
+ if (recaps?.length !== 1 || !prepared.siwe.endsWith(recap)) {
19702
+ throw new Error("Prepared SIWE must end with exactly one ReCap");
19703
+ }
19704
+ const insertedLines = resources.map((resource) => `- ${resource}`);
19705
+ const siwe = prepared.siwe.slice(0, -recap.length) + insertedLines.join("\n") + "\n" + recap;
19706
+ const expectedFields = extractImmutableSiweFields(prepared.siwe);
19707
+ expectedFields.nonRecapResources = [expectedFields.nonRecapResources, ...insertedLines].filter(Boolean).join("\n");
19708
+ const actualRecaps = siwe.match(recapLines);
19709
+ if (actualRecaps?.length !== 1 || actualRecaps[0] !== recap || diffImmutableSiweFields(expectedFields, extractImmutableSiweFields(siwe)).length) {
19710
+ throw new Error("SIWE metadata insertion changed the prepared message");
19711
+ }
19712
+ return { ...prepared, siwe };
19713
+ }
19676
19714
  /**
19677
19715
  * Add an extension to the authorization flow.
19678
19716
  */
@@ -19920,7 +19958,7 @@ var NodeUserAuthorization = class {
19920
19958
  spaceAbilities[spaceId] = resourceCapabilitiesToAbilitiesMap(resources);
19921
19959
  }
19922
19960
  const abilities = spaceAbilities[options.spaceId] ?? resourceCapabilitiesToAbilitiesMap([]);
19923
- const prepared = this.wasm.prepareSession({
19961
+ const prepared = this.prepareSessionWithResources({
19924
19962
  abilities,
19925
19963
  spaceAbilities,
19926
19964
  ...options.rawAbilities !== void 0 ? { rawAbilities: options.rawAbilities } : {},
@@ -20001,8 +20039,8 @@ var NodeUserAuthorization = class {
20001
20039
  this.assertSignInCurrent(generation);
20002
20040
  await this.refreshNamedKeyFeatureForSignIn(address, chainId);
20003
20041
  this.assertSignInCurrent(generation);
20004
- const keyId = `session-${Date.now()}`;
20005
- this.sessionManager.renameSessionKeyId(this.activeSessionKeyId, keyId);
20042
+ const keyId = `session-${Date.now()}-${Math.random().toString(36).slice(2)}`;
20043
+ this.sessionManager.createSessionKey(keyId);
20006
20044
  this.activeSessionKeyId = keyId;
20007
20045
  const jwkString = this.sessionManager.jwk(keyId);
20008
20046
  if (!jwkString) {
@@ -20013,7 +20051,7 @@ var NodeUserAuthorization = class {
20013
20051
  const spaceId = capabilityPlan.spaceId;
20014
20052
  const now = /* @__PURE__ */ new Date();
20015
20053
  const expirationTime = new Date(now.getTime() + this.sessionExpirationMs);
20016
- const prepared = this.wasm.prepareSession({
20054
+ const prepared = this.prepareSessionWithResources({
20017
20055
  abilities: capabilityPlan.abilities,
20018
20056
  ...capabilityPlan.spaceAbilities !== void 0 ? { spaceAbilities: capabilityPlan.spaceAbilities } : {},
20019
20057
  ...capabilityPlan.rawAbilities !== void 0 ? { rawAbilities: capabilityPlan.rawAbilities } : {},
@@ -20148,9 +20186,8 @@ var NodeUserAuthorization = class {
20148
20186
  const address = canonicalizeAddress(await this.signer.getAddress());
20149
20187
  const chainId = await this.signer.getChainId();
20150
20188
  await this.refreshNamedKeyFeatureForSignIn(address, chainId);
20151
- const keyId = `session-${Date.now()}`;
20152
- this.sessionManager.renameSessionKeyId(this.activeSessionKeyId, keyId);
20153
- this.activeSessionKeyId = keyId;
20189
+ const keyId = `openkey-session-${Date.now()}-${++this.preparedSessionCounter}`;
20190
+ this.sessionManager.createSessionKey(keyId);
20154
20191
  const jwkString = this.sessionManager.jwk(keyId);
20155
20192
  if (!jwkString) {
20156
20193
  throw new Error("Failed to create session key");
@@ -20160,7 +20197,7 @@ var NodeUserAuthorization = class {
20160
20197
  const spaceId = capabilityPlan.spaceId;
20161
20198
  const now = /* @__PURE__ */ new Date();
20162
20199
  const expirationTime = new Date(now.getTime() + this.sessionExpirationMs);
20163
- const prepared = this.wasm.prepareSession({
20200
+ const prepared = this.prepareSessionWithResources({
20164
20201
  abilities: capabilityPlan.abilities,
20165
20202
  ...capabilityPlan.spaceAbilities !== void 0 ? { spaceAbilities: capabilityPlan.spaceAbilities } : {},
20166
20203
  ...capabilityPlan.rawAbilities !== void 0 ? { rawAbilities: capabilityPlan.rawAbilities } : {},
@@ -20231,6 +20268,7 @@ var NodeUserAuthorization = class {
20231
20268
  await this.sessionStorage.save(address, persistedData);
20232
20269
  this._session = clientSession;
20233
20270
  this._tinyCloudSession = tinyCloudSession;
20271
+ this.activeSessionKeyId = keyId;
20234
20272
  this._address = address;
20235
20273
  this._chainId = chainId;
20236
20274
  await this.refreshNodeInfo();
@@ -20277,6 +20315,11 @@ var NodeUserAuthorization = class {
20277
20315
  * @param options Optional overrides for the OpenKey request.
20278
20316
  */
20279
20317
  async signInWithOpenKey(authorizeFn, options) {
20318
+ const pending = await this.prepareOpenKeySignIn(options);
20319
+ return this.completeOpenKeySignIn(pending, authorizeFn(pending.request), options);
20320
+ }
20321
+ /** Finish address, host and SIWE preparation before an approval click. */
20322
+ async prepareOpenKeySignIn(options) {
20280
20323
  refuseCaveated(this.getCapabilityRequest()?.manifests);
20281
20324
  if (options?.host !== void 0) {
20282
20325
  const overrideHost = options.host.trim();
@@ -20288,7 +20331,7 @@ var NodeUserAuthorization = class {
20288
20331
  const signingAddress = canonicalizeAddress(await this.signer.getAddress());
20289
20332
  const signingChainId = await this.signer.getChainId();
20290
20333
  await this.resolveTinyCloudHostsForSignIn(signingAddress, signingChainId);
20291
- const { prepared, keyId, jwk } = await this.prepareSessionForSigning();
20334
+ const { prepared, keyId, jwk, address, chainId } = await this.prepareSessionForSigning();
20292
20335
  const presentation = this.buildPresentationEnvelope(options?.reason);
20293
20336
  const hostHint = this.primaryTinyCloudHost;
20294
20337
  const originalRequest = {
@@ -20300,12 +20343,32 @@ var NodeUserAuthorization = class {
20300
20343
  keyId: options?.openkeyKeyId,
20301
20344
  presentation
20302
20345
  };
20346
+ return {
20347
+ request: originalRequest,
20348
+ prepared,
20349
+ keyId,
20350
+ jwk,
20351
+ address,
20352
+ chainId,
20353
+ generation: this.sessionGeneration,
20354
+ createdAt: Date.now()
20355
+ };
20356
+ }
20357
+ /** Complete a prepared approval. The caller starts authorization before awaiting this method. */
20358
+ async completeOpenKeySignIn(pending, authorization, options) {
20359
+ if (Date.now() - pending.createdAt > 5 * 6e4) {
20360
+ throw new Error("Prepared OpenKey sign-in expired; prepare again");
20361
+ }
20362
+ if (pending.generation !== this.sessionGeneration) {
20363
+ throw new Error("Prepared OpenKey sign-in expired after sign-out");
20364
+ }
20365
+ const { request: originalRequest, prepared, keyId, jwk } = pending;
20303
20366
  let result;
20304
20367
  let signed2;
20305
20368
  let signature2;
20306
20369
  for (let attempt = 0; ; ) {
20307
20370
  try {
20308
- result ?? (result = await authorizeFn(originalRequest));
20371
+ result ?? (result = await authorization);
20309
20372
  signed2 = await this.verifyOpenKeyResult(result, prepared);
20310
20373
  signature2 = result.signature;
20311
20374
  break;
@@ -21714,6 +21777,7 @@ var _TinyCloudNode = class _TinyCloudNode {
21714
21777
  constructor(config = {}) {
21715
21778
  this.signer = null;
21716
21779
  this.auth = null;
21780
+ this.consumedOpenKeyPendings = /* @__PURE__ */ new WeakSet();
21717
21781
  this.tc = null;
21718
21782
  this._chainId = 1;
21719
21783
  this.replicaPurgeFailedHandlers = /* @__PURE__ */ new Set();
@@ -22654,6 +22718,37 @@ var _TinyCloudNode = class _TinyCloudNode {
22654
22718
  }
22655
22719
  await this.signInWith(() => this.auth.signInWithOpenKey(authorizeFn, options));
22656
22720
  }
22721
+ /** Prepare the OpenKey request before the approval click. */
22722
+ async prepareOpenKeySignIn() {
22723
+ if (!this.signer || !this.tc || !this.auth) {
22724
+ throw new Error("Cannot prepare OpenKey sign-in in session-only mode. Provide a signer in config.");
22725
+ }
22726
+ await this.signOutInFlight;
22727
+ await this.accountRegistryTail;
22728
+ await this.wasmBindings.ensureInitialized?.();
22729
+ return this.auth.prepareOpenKeySignIn();
22730
+ }
22731
+ /** Start OpenKey authorization synchronously, then complete normal session setup. */
22732
+ signInWithPreparedOpenKey(pending, authorizeFn) {
22733
+ if (!this.signer || !this.tc || !this.auth || this.signOutInFlight) {
22734
+ throw new Error("Prepared OpenKey sign-in is unavailable");
22735
+ }
22736
+ if (this.consumedOpenKeyPendings.has(pending)) {
22737
+ throw new Error("Prepared OpenKey sign-in was already used");
22738
+ }
22739
+ if (Date.now() - pending.createdAt > 5 * 6e4) {
22740
+ throw new Error("Prepared OpenKey sign-in expired; prepare again");
22741
+ }
22742
+ this.consumedOpenKeyPendings.add(pending);
22743
+ const authorization = authorizeFn(pending.request);
22744
+ void authorization.catch(() => void 0);
22745
+ return this.signInWith(() => {
22746
+ if (this._address !== pending.address || this._chainId !== pending.chainId) {
22747
+ throw new Error("OpenKey account changed after sign-in preparation");
22748
+ }
22749
+ return this.auth.completeOpenKeySignIn(pending, authorization);
22750
+ });
22751
+ }
22657
22752
  async signInWith(performSignIn) {
22658
22753
  refuseCaveated(this.auth?.capabilityRequest?.manifests);
22659
22754
  const epoch = this.sessionEpoch;
@@ -24295,6 +24390,7 @@ var _TinyCloudNode = class _TinyCloudNode {
24295
24390
  invoke: graph.invoke,
24296
24391
  invokeAny: graph.invokeAny,
24297
24392
  signOwnerRevocation: this.signer ? (cid) => this.signOwnerRevocation(cid) : void 0,
24393
+ sessionInvocationSigner: this.sessionInvocationSignerFor(input.serviceSession),
24298
24394
  fetch: graph.fetch
24299
24395
  });
24300
24396
  const keyProvider = new WasmKeyProvider({ sessionManager: input.manager });
@@ -24510,6 +24606,31 @@ var _TinyCloudNode = class _TinyCloudNode {
24510
24606
  if (session === void 0) throw new Error("Not signed in. Call signIn() first.");
24511
24607
  return signBytesWithJwk(bytes, session.jwk);
24512
24608
  }
24609
+ /**
24610
+ * Signs proofless invocations with `session`'s own did:key, for the node's
24611
+ * issued-delegation list and revocation by the delegator. The audience is
24612
+ * this Node's DID; each invocation lives 60 seconds.
24613
+ */
24614
+ sessionInvocationSignerFor(session) {
24615
+ return {
24616
+ did: () => session.verificationMethod.split("#", 1)[0],
24617
+ sign: async (attenuation) => {
24618
+ const now = Math.floor(Date.now() / 1e3);
24619
+ const invocation = await signCompactUcanAuthorization({
24620
+ issuerDid: session.verificationMethod.split("#", 1)[0],
24621
+ audienceDid: await this.fetchNodeId(),
24622
+ attenuation,
24623
+ facts: [{}],
24624
+ proofs: [],
24625
+ notBefore: now,
24626
+ expiresAt: now + 60,
24627
+ nonce: `urn:uuid:${crypto.randomUUID()}`,
24628
+ sign: (bytes) => signBytesWithJwk(bytes, session.jwk)
24629
+ });
24630
+ return invocation.authorization;
24631
+ }
24632
+ };
24633
+ }
24513
24634
  /** Author a proofless Policy/v3 owner root with the authenticated holder key. */
24514
24635
  async createUnifiedOwnerRoot(input) {
24515
24636
  const ownerDid = this.credentialHolderDid;
@@ -25044,7 +25165,7 @@ var _TinyCloudNode = class _TinyCloudNode {
25044
25165
  graph.assertActive();
25045
25166
  const signed2 = await this.signRawNetworkAuthorization({
25046
25167
  targetNode: input.targetNode,
25047
- networkId: input.networkId,
25168
+ networkId: input.body.keyPath === void 0 ? input.networkId : `${input.networkId}/${input.body.keyPath}`,
25048
25169
  action: DECRYPT_ACTION2,
25049
25170
  facts: input.facts
25050
25171
  }, { graph, session });
@@ -25217,6 +25338,7 @@ var _TinyCloudNode = class _TinyCloudNode {
25217
25338
  invoke: graph.invoke,
25218
25339
  invokeAny: graph.invokeAny,
25219
25340
  signOwnerRevocation: this.signer ? (cid) => this.signOwnerRevocation(cid) : void 0,
25341
+ sessionInvocationSigner: this.sessionInvocationSignerFor(serviceSession),
25220
25342
  fetch: graph.fetch
25221
25343
  });
25222
25344
  this._spaceService = new SpaceService({
@@ -26000,7 +26122,7 @@ var _TinyCloudNode = class _TinyCloudNode {
26000
26122
  if (!session || !Array.isArray(permissions) || permissions.length === 0) {
26001
26123
  return false;
26002
26124
  }
26003
- const expanded = this.expandPermissionEntries(permissions);
26125
+ const expanded = expandRuntimePermissionEntries(permissions, pkhDid2(session.address, session.chainId));
26004
26126
  if (this.sessionCoversPermissionEntries(session, expanded)) {
26005
26127
  return true;
26006
26128
  }
@@ -26020,7 +26142,7 @@ var _TinyCloudNode = class _TinyCloudNode {
26020
26142
  if (!session || !Array.isArray(permissions) || permissions.length === 0) {
26021
26143
  return [];
26022
26144
  }
26023
- const expanded = this.expandPermissionEntries(permissions);
26145
+ const expanded = expandRuntimePermissionEntries(permissions, pkhDid2(session.address, session.chainId));
26024
26146
  return this.findRuntimeGrantsForPermissionEntries(expanded, session).map(
26025
26147
  (grant) => grant.delegation
26026
26148
  );
@@ -26195,7 +26317,28 @@ var _TinyCloudNode = class _TinyCloudNode {
26195
26317
  throw new SessionExpiredError(sessionExpiry);
26196
26318
  }
26197
26319
  }
26198
- const expanded = this.expandPermissionEntries(permissions);
26320
+ const expanded = expandRuntimePermissionEntries(permissions, pkhDid2(session.address, session.chainId));
26321
+ const bindsShareKey = expanded.some((entry) => entry.service === ENCRYPTION_PERMISSION_SERVICE2 && entry.actions.includes("tinycloud.encryption/key.create"));
26322
+ const captured = bindsShareKey ? { ...session, jwk: { ...options?.expectedSessionKey ?? session.jwk } } : session;
26323
+ const assertCapturedKey = bindsShareKey ? () => {
26324
+ const live = session.jwk;
26325
+ const key2 = captured.jwk;
26326
+ if (this.currentTinyCloudSession() !== session || session.verificationMethod !== captured.verificationMethod || session.delegationCid !== captured.delegationCid || session.spaceId !== captured.spaceId || session.address !== captured.address || session.chainId !== captured.chainId || live?.kty !== key2.kty || live?.crv !== key2.crv || live?.x !== key2.x || live?.y !== key2.y || live?.d !== key2.d) {
26327
+ throw new Error("Runtime permission request cancelled because the session key changed.");
26328
+ }
26329
+ } : void 0;
26330
+ const sessionKeyDid = bindsShareKey ? this.sessionDid : void 0;
26331
+ if (bindsShareKey) {
26332
+ const key2 = captured.jwk;
26333
+ if (key2.kty !== "OKP" || key2.crv !== "Ed25519" || typeof key2.x !== "string") {
26334
+ throw new Error("Runtime permission session key does not match its signed identity.");
26335
+ }
26336
+ const keyDid = didKeyFromEd25519PublicKey(base64UrlDecode(key2.x));
26337
+ if (!didPrincipalMatches2(keyDid, sessionKeyDid) || !didPrincipalMatches2(keyDid, captured.verificationMethod) || !didPrincipalMatches2(keyDid, new SiweMessage3(session.siwe).uri)) {
26338
+ throw new Error("Runtime permission session key does not match its signed identity.");
26339
+ }
26340
+ assertCapturedKey();
26341
+ }
26199
26342
  if (this.sessionCoversPermissionEntries(session, expanded)) {
26200
26343
  return [];
26201
26344
  }
@@ -26203,7 +26346,7 @@ var _TinyCloudNode = class _TinyCloudNode {
26203
26346
  if (existingGrants.length > 0) {
26204
26347
  return existingGrants.map((grant) => grant.delegation);
26205
26348
  }
26206
- if (!this.signer) {
26349
+ if (!this.signer && options?.signMessage === void 0) {
26207
26350
  throw new Error(
26208
26351
  "grantRuntimePermissions requires wallet mode with a signer or privateKey."
26209
26352
  );
@@ -26245,13 +26388,13 @@ var _TinyCloudNode = class _TinyCloudNode {
26245
26388
  return this.wasmBindings.prepareSession({
26246
26389
  abilities,
26247
26390
  ...rawForDelegation.length > 0 ? { rawAbilities: this.permissionsToRawAbilities(rawForDelegation) } : {},
26248
- address: this.wasmBindings.ensureEip55(session.address),
26249
- chainId: session.chainId,
26391
+ address: this.wasmBindings.ensureEip55(captured.address),
26392
+ chainId: captured.chainId,
26250
26393
  domain: this.siweDomain,
26251
26394
  issuedAt: now.toISOString(),
26252
26395
  expirationTime: expiresAt.toISOString(),
26253
26396
  spaceId,
26254
- jwk: session.jwk
26397
+ jwk: captured.jwk
26255
26398
  });
26256
26399
  } catch (error) {
26257
26400
  if (rawForDelegation.some((entry) => this.isRawRevocationPermissionEntry(entry)) && /invalid ReCap resource URI/i.test(error instanceof Error ? error.message : String(error))) {
@@ -26263,8 +26406,19 @@ var _TinyCloudNode = class _TinyCloudNode {
26263
26406
  throw error;
26264
26407
  }
26265
26408
  })();
26266
- const signature2 = await this.signer.signMessage(prepared.siwe);
26409
+ if (bindsShareKey && !didPrincipalMatches2(new SiweMessage3(prepared.siwe).uri, sessionKeyDid)) {
26410
+ throw new Error("Prepared runtime permission targets a different session key.");
26411
+ }
26412
+ assertCapturedKey?.();
26413
+ if (options?.signMessage !== void 0) {
26414
+ this.assertRuntimeGrantMessage(prepared.siwe, session);
26415
+ }
26416
+ const signature2 = options?.signMessage !== void 0 ? await options.signMessage(prepared.siwe) : await this.signer.signMessage(prepared.siwe);
26417
+ if (options?.signMessage !== void 0 && !await verifyEip191MessageSignature(prepared.siwe, signature2, session.address)) {
26418
+ throw new Error("The signature does not match the account that owns this session.");
26419
+ }
26267
26420
  graph.assertActive();
26421
+ assertCapturedKey?.();
26268
26422
  const delegatedSession = this.wasmBindings.completeSessionSetup({
26269
26423
  ...prepared,
26270
26424
  signature: signature2
@@ -26293,18 +26447,19 @@ var _TinyCloudNode = class _TinyCloudNode {
26293
26447
  delegatedSession,
26294
26448
  delegatedEntries,
26295
26449
  spaceId,
26296
- session,
26450
+ captured,
26297
26451
  expiresAt,
26298
26452
  { siwe: prepared.siwe, signature: signature2 }
26299
26453
  );
26300
26454
  graph.assertActive();
26455
+ assertCapturedKey?.();
26301
26456
  this.runtimePermissionGrants.push({
26302
26457
  session: {
26303
26458
  delegationHeader: delegatedSession.delegationHeader,
26304
26459
  delegationCid: delegatedSession.delegationCid,
26305
26460
  spaceId,
26306
- verificationMethod: session.verificationMethod,
26307
- jwk: session.jwk
26461
+ verificationMethod: captured.verificationMethod,
26462
+ jwk: captured.jwk
26308
26463
  },
26309
26464
  delegation,
26310
26465
  operations: this.permissionOperations(delegatedEntries, spaceId),
@@ -26633,7 +26788,19 @@ var _TinyCloudNode = class _TinyCloudNode {
26633
26788
  "delegateTo requires a non-empty permissions array"
26634
26789
  );
26635
26790
  }
26636
- const expandedEntries = this.expandPermissionEntries(permissions);
26791
+ const expandedEntries = expandDelegationPermissionEntries(permissions);
26792
+ const namedKeyEntries = expandedEntries.filter((entry) => entry.service === ENCRYPTION_PERMISSION_SERVICE2 && entry.path.includes("/"));
26793
+ if (namedKeyEntries.length > 0) {
26794
+ if (expandedEntries.some((entry) => entry.service === ENCRYPTION_PERMISSION_SERVICE2 && !entry.path.includes("/"))) {
26795
+ throw new ManifestValidationError2("named-key delegation cannot include bare-network permissions");
26796
+ }
26797
+ if (options?.forceWalletSign) {
26798
+ throw new ManifestValidationError2("named-key delegation requires a signed session grant");
26799
+ }
26800
+ const granted = this.projectSignedRecapCapabilities(session.siwe);
26801
+ const { subset, missing } = this.signedCapabilitySubset(namedKeyEntries, granted);
26802
+ if (!subset) throw new PermissionNotInManifestError(missing, granted);
26803
+ }
26637
26804
  const now = /* @__PURE__ */ new Date();
26638
26805
  const expiryMs = resolveExpiryMs(options?.expiry);
26639
26806
  const expirationTime = new Date(now.getTime() + expiryMs);
@@ -27067,6 +27234,25 @@ var _TinyCloudNode = class _TinyCloudNode {
27067
27234
  expandPermissionEntries(permissions) {
27068
27235
  return expandPermissionEntriesCore(permissions);
27069
27236
  }
27237
+ /**
27238
+ * Checks the SIWE text a caller-supplied signer is asked to sign: it must be in canonical form (parsing and
27239
+ * re-serializing it gives the same bytes) and name the session's account and chain. The caller then checks the
27240
+ * signature against these exact bytes.
27241
+ */
27242
+ assertRuntimeGrantMessage(siwe, session) {
27243
+ let parsed;
27244
+ try {
27245
+ parsed = new SiweMessage3(siwe);
27246
+ } catch {
27247
+ throw new Error("The prepared sign-in message is not a valid SIWE message.");
27248
+ }
27249
+ if (parsed.prepareMessage() !== siwe) {
27250
+ throw new Error("The prepared sign-in message is not in canonical form.");
27251
+ }
27252
+ if (parsed.chainId !== session.chainId || canonicalizeAddress2(parsed.address) !== canonicalizeAddress2(session.address)) {
27253
+ throw new Error("The prepared sign-in message is for a different account or chain than this session.");
27254
+ }
27255
+ }
27070
27256
  /**
27071
27257
  * The current WASM child-delegation APIs accept action-only maps. Refuse any
27072
27258
  * constrained branch rather than signing a broader action-only child UCAN.
@@ -28183,7 +28369,7 @@ var FileSessionStorage = class {
28183
28369
  };
28184
28370
 
28185
28371
  // src/authorization/openKeyBridge.ts
28186
- function wireOpenKeyAuthorize(openkey) {
28372
+ function wireOpenKeyAuthorize(openkey, opts) {
28187
28373
  return async (input) => {
28188
28374
  const result = await openkey.authorizeTinyCloud({
28189
28375
  protocolVersion: 1,
@@ -28194,7 +28380,7 @@ function wireOpenKeyAuthorize(openkey) {
28194
28380
  // Forward the presentation envelope verbatim — the OpenKey SDK
28195
28381
  // validates and size-bounds it before use.
28196
28382
  presentation: input.presentation
28197
- });
28383
+ }, opts);
28198
28384
  if (result.protocolVersion !== 1) {
28199
28385
  throw new Error(
28200
28386
  `wireOpenKeyAuthorize: OpenKey returned unsupported protocolVersion ${result.protocolVersion}`
@@ -28236,7 +28422,7 @@ import {
28236
28422
  CaveatedDelegationUnsupportedError as CaveatedDelegationUnsupportedError3,
28237
28423
  PermissionNotInManifestError as PermissionNotInManifestError2,
28238
28424
  SessionExpiredError as SessionExpiredError2,
28239
- ManifestValidationError as ManifestValidationError2,
28425
+ ManifestValidationError as ManifestValidationError3,
28240
28426
  composeManifestRequest as composeManifestRequest2,
28241
28427
  resolveManifest as resolveManifest2,
28242
28428
  validateManifest,
@@ -30901,7 +31087,7 @@ export {
30901
31087
  InvalidRestoredSessionError,
30902
31088
  KVService4 as KVService,
30903
31089
  MAX_SECRET_SCOPE_LENGTH,
30904
- ManifestValidationError2 as ManifestValidationError,
31090
+ ManifestValidationError3 as ManifestValidationError,
30905
31091
  MemorySessionStorage,
30906
31092
  NETWORK_NAME_PATTERN,
30907
31093
  NetworkIdError,
@@ -30998,6 +31184,7 @@ export {
30998
31184
  hexDecode,
30999
31185
  hexEncode,
31000
31186
  installTinyCloudDebugGlobals,
31187
+ isAppKeyHostBound,
31001
31188
  isCapabilitySubset4 as isCapabilitySubset,
31002
31189
  isEvmAddress,
31003
31190
  isNetworkId,