@serve.zone/interfaces 17.3.0 → 17.5.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 (39) hide show
  1. package/changelog.md +18 -0
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/appstore/types.d.ts +76 -1
  4. package/dist_ts/appstore/types.js +7 -2
  5. package/dist_ts/data/deploymentoperation.js +5 -3
  6. package/dist_ts/data/deploymentpreflight.d.ts +2 -2
  7. package/dist_ts/data/gateway.d.ts +9 -0
  8. package/dist_ts/data/index.d.ts +1 -0
  9. package/dist_ts/data/index.js +2 -1
  10. package/dist_ts/data/service.d.ts +2 -0
  11. package/dist_ts/data/service.js +1 -1
  12. package/dist_ts/data/webpush.d.ts +106 -0
  13. package/dist_ts/data/webpush.js +2 -0
  14. package/dist_ts/platform/index.d.ts +3 -1
  15. package/dist_ts/platform/index.js +4 -2
  16. package/dist_ts/platform/pushnotification.d.ts +1 -0
  17. package/dist_ts/platform/storage.d.ts +185 -0
  18. package/dist_ts/platform/storage.js +8 -0
  19. package/dist_ts/platformservice/pushnotification.d.ts +1 -0
  20. package/dist_ts/requests/index.d.ts +3 -1
  21. package/dist_ts/requests/index.js +4 -2
  22. package/dist_ts/requests/webpush.d.ts +132 -0
  23. package/dist_ts/requests/webpush.js +2 -0
  24. package/package.json +1 -1
  25. package/readme.md +112 -1
  26. package/ts/00_commitinfo_data.ts +1 -1
  27. package/ts/appstore/types.ts +104 -1
  28. package/ts/data/deploymentoperation.ts +4 -2
  29. package/ts/data/deploymentpreflight.ts +2 -2
  30. package/ts/data/gateway.ts +9 -0
  31. package/ts/data/index.ts +1 -0
  32. package/ts/data/service.ts +2 -0
  33. package/ts/data/webpush.ts +133 -0
  34. package/ts/platform/index.ts +3 -0
  35. package/ts/platform/pushnotification.ts +1 -0
  36. package/ts/platform/storage.ts +237 -0
  37. package/ts/platformservice/pushnotification.ts +1 -0
  38. package/ts/requests/index.ts +3 -0
  39. package/ts/requests/webpush.ts +184 -0
@@ -4,12 +4,103 @@ import type {
4
4
  IServicePublicPortMapping,
5
5
  IServiceTargetPort,
6
6
  } from '../data/serviceports.js';
7
+ import type {
8
+ IStorageCapacityRequest,
9
+ IStorageClassRequirement,
10
+ TFilesystemStorageAccessMode,
11
+ TObjectStorageAccessMode,
12
+ TObjectStorageDelivery,
13
+ TStorageReclaimPolicy,
14
+ TStorageResourceKind,
15
+ TStorageSnapshotMode,
16
+ } from '../platform/storage.js';
7
17
 
8
18
  export type TAppStorePlatformRequirement = 'mongodb' | 's3' | 'clickhouse' | 'valkey' | 'mariadb';
19
+ export interface IAppStorePlatformRequirements {
20
+ mongodb?: boolean;
21
+ /**
22
+ * @deprecated `s3: true` is normalized to one legacy object-storage binding.
23
+ * New templates use a named objectStorage request.
24
+ */
25
+ s3?: boolean;
26
+ clickhouse?: boolean;
27
+ valkey?: boolean;
28
+ mariadb?: boolean;
29
+ }
9
30
  export type TAppStoreSourceType = 'inline' | 'repoManifest' | 'dockerImage';
10
31
  export type TAppStoreTrackingMode = 'tag' | 'digest';
11
32
  export type TAppStoreUpgradeStrategy = 'semver' | 'branch' | 'dockerDigest';
12
33
 
34
+ export const appStoreStorageFeatureIds = {
35
+ bindingsV1: 'storage.bindings.v1',
36
+ filesystemV1: 'storage.filesystem.v1',
37
+ objectStorageV1: 'storage.object-storage.v1',
38
+ objectStorageSecretFileV1: 'storage.object-storage.secret-file.v1',
39
+ } as const;
40
+
41
+ export type TAppStoreStorageFeatureId =
42
+ typeof appStoreStorageFeatureIds[keyof typeof appStoreStorageFeatureIds];
43
+
44
+ export type TAppStoreStoragePurpose =
45
+ | 'runtime'
46
+ | 'database'
47
+ | 'registry'
48
+ | 'backup';
49
+
50
+ /**
51
+ * A template-local logical class. It states portable policy requirements and
52
+ * preferences; fulfillment adapters select their own compatible policy class.
53
+ */
54
+ export interface IAppStoreStorageClass {
55
+ kind: TStorageResourceKind;
56
+ purpose: TAppStoreStoragePurpose;
57
+ required?: IStorageClassRequirement;
58
+ preferred?: IStorageClassRequirement;
59
+ }
60
+
61
+ export interface IAppStoreStorageRequestBase {
62
+ /** Stable identity used across upgrades, migrations, and restores. */
63
+ id: string;
64
+ kind: TStorageResourceKind;
65
+ /** Key in the containing version config's storageClasses record. */
66
+ storageClass: string;
67
+ capacity?: IStorageCapacityRequest;
68
+ reclaimPolicy: TStorageReclaimPolicy;
69
+ }
70
+
71
+ export interface IAppStoreFilesystemProtection {
72
+ backup?: 'required';
73
+ snapshots?: Exclude<TStorageSnapshotMode, 'none'>;
74
+ consistency?: 'crashConsistent' | 'applicationConsistent';
75
+ }
76
+
77
+ export interface IAppStoreFilesystemStorageRequest
78
+ extends IAppStoreStorageRequestBase {
79
+ kind: 'filesystem';
80
+ mountPath: string;
81
+ accessMode: TFilesystemStorageAccessMode;
82
+ protection?: IAppStoreFilesystemProtection;
83
+ }
84
+
85
+ export interface IAppStoreObjectStorageProtection {
86
+ backup?: 'required';
87
+ versioning?: 'required';
88
+ /** Minimum provider-enforced retention duration. */
89
+ retentionDays?: number;
90
+ }
91
+
92
+ export interface IAppStoreObjectStorageRequest
93
+ extends IAppStoreStorageRequestBase {
94
+ kind: 'objectStorage';
95
+ accessMode: TObjectStorageAccessMode;
96
+ delivery: TObjectStorageDelivery;
97
+ protection?: IAppStoreObjectStorageProtection;
98
+ }
99
+
100
+ export type TAppStoreStorageRequest =
101
+ | IAppStoreFilesystemStorageRequest
102
+ | IAppStoreObjectStorageRequest;
103
+
13
104
  export interface IAppStoreInlineSource {
14
105
  type: 'inline';
15
106
  }
@@ -140,9 +231,21 @@ export interface IAppStoreVersionConfig {
140
231
  /** Edge/coretraffic public TCP/UDP exposure, distinct from Docker publishedPorts. */
141
232
  publicPortMappings?: IServicePublicPortMapping[];
142
233
  envVars?: IAppStoreEnvVar[];
234
+ /**
235
+ * @deprecated Legacy volume syntax. New templates use storageClasses and
236
+ * storageRequests. Resolver normalization must reject legacy physical driver
237
+ * options that cannot be represented portably.
238
+ */
143
239
  volumes?: TAppStoreVolumeSpec[];
240
+ /**
241
+ * Template-local logical policy classes. Keys are stable within the
242
+ * template; they are not Onebox or Cloudly operator class names.
243
+ */
244
+ storageClasses?: Record<string, IAppStoreStorageClass>;
245
+ /** Stable named filesystem and managed object-storage requests. */
246
+ storageRequests?: TAppStoreStorageRequest[];
144
247
  publishedPorts?: IAppStorePublishedPort[];
145
- platformRequirements?: Partial<Record<TAppStorePlatformRequirement, boolean>>;
248
+ platformRequirements?: IAppStorePlatformRequirements;
146
249
  minOneboxVersion?: string;
147
250
  minCloudlyVersion?: string;
148
251
  appStoreVersion?: string;
@@ -222,9 +222,11 @@ export const validateDeploymentProposedConfiguration = (
222
222
  errors.push('volumeMounts must be canonical supported declarations');
223
223
  }
224
224
  if (!Array.isArray(configurationArg.requiredCapabilities)
225
- || configurationArg.requiredCapabilities.length > 2
225
+ || configurationArg.requiredCapabilities.length > 3
226
226
  || configurationArg.requiredCapabilities.some((capabilityArg) => (
227
- capabilityArg !== 'database' && capabilityArg !== 'objectstorage'
227
+ capabilityArg !== 'database'
228
+ && capabilityArg !== 'objectstorage'
229
+ && capabilityArg !== 'pushnotification'
228
230
  ))
229
231
  || new Set(configurationArg.requiredCapabilities).size
230
232
  !== configurationArg.requiredCapabilities.length) {
@@ -98,7 +98,7 @@ export interface IDeploymentPreflightRuntimeTask {
98
98
  }
99
99
 
100
100
  export interface IDeploymentPreflightPlatformBinding {
101
- capability: 'database' | 'objectstorage';
101
+ capability: 'database' | 'objectstorage' | 'pushnotification';
102
102
  desiredState: 'enabled' | 'disabled';
103
103
  status: 'requested' | 'provisioning' | 'ready' | 'degraded' | 'failed' | 'disabled';
104
104
  }
@@ -139,7 +139,7 @@ export interface IDeploymentPreflightProposedConfiguration {
139
139
  secretFiles?: IServiceSecretFile[];
140
140
  containerPorts: number[];
141
141
  volumeMounts: IDeploymentPreflightProposedVolumeMount[];
142
- requiredCapabilities: Array<'database' | 'objectstorage'>;
142
+ requiredCapabilities: Array<'database' | 'objectstorage' | 'pushnotification'>;
143
143
  }
144
144
 
145
145
  export interface IDeploymentReleaseEvidenceReference {
@@ -131,6 +131,13 @@ export interface IGatewayCapabilities {
131
131
  http3: {
132
132
  enabled: boolean;
133
133
  };
134
+ /** Absent means that this gateway does not advertise Web Push support. */
135
+ webPush?: {
136
+ bindings: boolean;
137
+ delivery: boolean;
138
+ cancellation: boolean;
139
+ vapidRotation: boolean;
140
+ };
134
141
  }
135
142
 
136
143
  /**
@@ -146,6 +153,8 @@ export interface IGatewayTokenCapabilities {
146
153
  manageMail?: boolean;
147
154
  readCertificates?: boolean;
148
155
  requestCertificates?: boolean;
156
+ readWebPush?: boolean;
157
+ manageWebPush?: boolean;
149
158
  }
150
159
 
151
160
  /**
package/ts/data/index.ts CHANGED
@@ -33,3 +33,4 @@ export * from './taskexecution.js';
33
33
  export * from './traffic.js';
34
34
  export * from './user.js';
35
35
  export * from './version.js';
36
+ export * from './webpush.js';
@@ -3,6 +3,7 @@ import type { IRegistryTarget } from './registry.js';
3
3
  import type { IAppStorePublishedPort } from '../appstore/index.js';
4
4
  import type { IHostedAppLifecycleState } from './hostedapp.js';
5
5
  import type { IServiceMailConfig } from './mail.js';
6
+ import type { IServiceWebPushConfig } from './webpush.js';
6
7
  import type {
7
8
  IImageRolloutStatus,
8
9
  IImmutableImageDeploymentPlan,
@@ -326,6 +327,7 @@ export interface IService {
326
327
  custom?: { [domain: string]: string };
327
328
  };
328
329
  mail?: IServiceMailConfig;
330
+ webPush?: IServiceWebPushConfig;
329
331
  volumes?: IServiceVolume[];
330
332
  publishedPorts?: IAppStorePublishedPort[];
331
333
  /** Edge/coretraffic public TCP/UDP exposure, distinct from Docker Swarm publishedPorts. */
@@ -0,0 +1,133 @@
1
+ import type { TGatewayClientType } from './gateway.js';
2
+
3
+ export type TWebPushBindingStatus = 'active' | 'disabled' | 'pending' | 'failed';
4
+
5
+ export type TWebPushCredentialStatus = 'active' | 'disabled' | 'rotated' | 'revoked';
6
+
7
+ export type TWebPushVapidKeyStatus = 'active' | 'retiring' | 'retired';
8
+
9
+ /**
10
+ * `pushServiceAccepted` means that the remote push service accepted the
11
+ * encrypted request. It does not prove browser receipt or display.
12
+ */
13
+ export type TWebPushDeliveryState =
14
+ | 'accepted'
15
+ | 'queued'
16
+ | 'sending'
17
+ | 'deferred'
18
+ | 'pushServiceAccepted'
19
+ | 'invalidSubscription'
20
+ | 'failed'
21
+ | 'expired'
22
+ | 'cancelled';
23
+
24
+ export type TWebPushUrgency = 'very-low' | 'low' | 'normal' | 'high';
25
+
26
+ /**
27
+ * `appInstanceId` identifies the environment-specific deployed service
28
+ * instance, not an App Store template or a browser-provided owner.
29
+ */
30
+ export interface IWebPushResourceOwner {
31
+ gatewayClientType: TGatewayClientType;
32
+ gatewayClientId: string;
33
+ appInstanceId: string;
34
+ }
35
+
36
+ /** JSON form returned by the browser Push API. */
37
+ export interface IWebPushSubscription {
38
+ endpoint: string;
39
+ expirationTime: number | null;
40
+ keys: {
41
+ p256dh: string;
42
+ auth: string;
43
+ };
44
+ }
45
+
46
+ export interface IWebPushCredentialPublic {
47
+ id: string;
48
+ status: TWebPushCredentialStatus;
49
+ createdAt: number;
50
+ updatedAt: number;
51
+ lastRotatedAt?: number;
52
+ }
53
+
54
+ export interface IWebPushCredentialOneTimeSecret {
55
+ credential: IWebPushCredentialPublic;
56
+ secret: string;
57
+ secretShownOnce: true;
58
+ }
59
+
60
+ export interface IWebPushVapidKeyPublic {
61
+ id: string;
62
+ publicKey: string;
63
+ status: TWebPushVapidKeyStatus;
64
+ createdAt: number;
65
+ activatedAt?: number;
66
+ retireAfter?: number;
67
+ retiredAt?: number;
68
+ }
69
+
70
+ export interface IWebPushBinding {
71
+ id: string;
72
+ owner: IWebPushResourceOwner;
73
+ enabled: boolean;
74
+ status: TWebPushBindingStatus;
75
+ credential?: IWebPushCredentialPublic;
76
+ vapidKeys: IWebPushVapidKeyPublic[];
77
+ createdAt: number;
78
+ updatedAt: number;
79
+ createdBy?: string;
80
+ }
81
+
82
+ /**
83
+ * Privacy-minimal notification signal. Applications fetch display content
84
+ * from their authenticated API after receiving this event.
85
+ */
86
+ export interface IWebPushNotificationPayload {
87
+ schemaVersion: 1;
88
+ event: 'notificationAvailable';
89
+ eventId: string;
90
+ /** Same-origin application route beginning with a single slash. */
91
+ route: string;
92
+ }
93
+
94
+ /** Public delivery metadata. Subscription and encrypted payload data are absent. */
95
+ export interface IWebPushDeliveryStatus {
96
+ spoolItemId: string;
97
+ state: TWebPushDeliveryState;
98
+ attempts: number;
99
+ acceptedAt: number;
100
+ updatedAt: number;
101
+ nextAttemptAt?: number;
102
+ terminalAt?: number;
103
+ pushServiceStatusCode?: number;
104
+ errorCode?: string;
105
+ }
106
+
107
+ export interface IWebPushServiceStatus {
108
+ ready: boolean;
109
+ bindingId: string;
110
+ bindingStatus: TWebPushBindingStatus;
111
+ activeVapidKey?: IWebPushVapidKeyPublic;
112
+ retiringVapidKeys: IWebPushVapidKeyPublic[];
113
+ maxPayloadBytes: number;
114
+ maxTtlSeconds: number;
115
+ contentEncoding: 'aes128gcm';
116
+ message?: string;
117
+ }
118
+
119
+ export type TWebPushCancellationTarget =
120
+ | {
121
+ type: 'spoolItem';
122
+ spoolItemId: string;
123
+ subscriptionId?: never;
124
+ }
125
+ | {
126
+ type: 'subscription';
127
+ subscriptionId: string;
128
+ spoolItemId?: never;
129
+ };
130
+
131
+ export interface IServiceWebPushConfig {
132
+ enabled?: boolean;
133
+ }
@@ -8,6 +8,7 @@ import * as objectstorage from './objectstorage.js';
8
8
  import * as pushnotification from './pushnotification.js';
9
9
  import * as sip from './sip.js';
10
10
  import * as sms from './sms.js';
11
+ import * as storage from './storage.js';
11
12
  import * as types from './types.js';
12
13
 
13
14
  export {
@@ -21,7 +22,9 @@ export {
21
22
  pushnotification,
22
23
  sip,
23
24
  sms,
25
+ storage,
24
26
  types,
25
27
  };
26
28
 
29
+ export * from './storage.js';
27
30
  export * from './types.js';
@@ -1,5 +1,6 @@
1
1
  import * as plugins from '../plugins.js';
2
2
 
3
+ /** @deprecated Use the credential-scoped requests.webpush contracts. */
3
4
  export interface IReq_SendPushNotification extends plugins.typedrequestInterfaces.implementsTR<
4
5
  plugins.typedrequestInterfaces.ITypedRequest,
5
6
  IReq_SendPushNotification
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Backend-neutral storage vocabulary shared by App Store manifests, control
3
+ * planes, and fulfillment adapters. Physical providers and runtime attachment
4
+ * details intentionally do not belong in these contracts.
5
+ */
6
+ export type TStorageResourceKind = 'filesystem' | 'objectStorage';
7
+ /**
8
+ * Compatibility bridge for the existing generic platform capability. New
9
+ * filesystem requests intentionally have no generic IPlatformBinding mapping.
10
+ */
11
+ export const storageKindPlatformCapabilityIds = {
12
+ objectStorage: 'objectstorage',
13
+ } as const;
14
+ export type TFilesystemStorageAccessMode =
15
+ | 'ReadWriteOnce'
16
+ | 'ReadOnlyMany'
17
+ | 'ReadWriteMany';
18
+ export type TObjectStorageAccessMode = 'readOnly' | 'readWrite';
19
+ export type TStoragePerformanceTier = 'standard' | 'highIops' | 'capacity';
20
+ export type TStorageDurability = 'ephemeral' | 'persistent';
21
+ export type TStorageTopology = 'singleNode' | 'multiNode';
22
+ export type TStorageSnapshotMode = 'none' | 'portable' | 'native';
23
+ export type TStorageReclaimPolicy = 'retain' | 'delete';
24
+
25
+ /**
26
+ * A positive base-2 quantity written as an integer followed by KiB, MiB, GiB,
27
+ * or TiB, for example `20GiB`. Parsers must reject every other representation.
28
+ */
29
+ export type TStorageCapacityQuantity = string;
30
+
31
+ export interface IStorageCapacityRequest {
32
+ request: TStorageCapacityQuantity;
33
+ /**
34
+ * A hard upper bound. A request with a limit can only be fulfilled by a
35
+ * class whose granted capabilities include hardQuota.
36
+ */
37
+ limit?: TStorageCapacityQuantity;
38
+ }
39
+
40
+ /**
41
+ * App-facing requirements describe policy, never a concrete provider class.
42
+ * Values in a `required` block are hard constraints; values in `preferred`
43
+ * influence selection but may not weaken required constraints.
44
+ */
45
+ export interface IStorageClassRequirement {
46
+ performanceTier?: TStoragePerformanceTier;
47
+ durability?: TStorageDurability;
48
+ topology?: TStorageTopology;
49
+ hardQuota?: true;
50
+ snapshots?: Exclude<TStorageSnapshotMode, 'none'>;
51
+ backup?: true;
52
+ encryptedInTransit?: true;
53
+ }
54
+
55
+ export interface IStorageGrantedCapabilities {
56
+ performanceTier: TStoragePerformanceTier;
57
+ durability: TStorageDurability;
58
+ topology: TStorageTopology;
59
+ hardQuota: boolean;
60
+ snapshots: TStorageSnapshotMode;
61
+ backup: boolean;
62
+ encryptedInTransit: boolean;
63
+ }
64
+
65
+ export interface IStorageClassCapabilitiesBase {
66
+ /** Opaque operator-defined policy class ID, not a physical backend name. */
67
+ classId: string;
68
+ /** Changes whenever matching behavior or guarantees change. */
69
+ revision: string;
70
+ kind: TStorageResourceKind;
71
+ performanceTiers: TStoragePerformanceTier[];
72
+ durabilities: TStorageDurability[];
73
+ topologies: TStorageTopology[];
74
+ hardQuota: boolean;
75
+ snapshotModes: TStorageSnapshotMode[];
76
+ backup: boolean;
77
+ encryptedInTransit: boolean;
78
+ }
79
+
80
+ export interface IFilesystemStorageClassCapabilities
81
+ extends IStorageClassCapabilitiesBase {
82
+ kind: 'filesystem';
83
+ accessModes: TFilesystemStorageAccessMode[];
84
+ }
85
+
86
+ export interface IObjectStorageClassCapabilities
87
+ extends IStorageClassCapabilitiesBase {
88
+ kind: 'objectStorage';
89
+ accessModes: TObjectStorageAccessMode[];
90
+ versioning: boolean;
91
+ retention: boolean;
92
+ }
93
+
94
+ export type TStorageClassCapabilities =
95
+ | IFilesystemStorageClassCapabilities
96
+ | IObjectStorageClassCapabilities;
97
+
98
+ /**
99
+ * Fulfillment adapters advertise only portable guarantees. Provider names,
100
+ * addresses, mount options, principals, and credential values are private.
101
+ */
102
+ export interface IStorageCapabilityAdvertisement {
103
+ schemaVersion: 1;
104
+ featureIds: string[];
105
+ classes: TStorageClassCapabilities[];
106
+ }
107
+
108
+ export interface IObjectStorageEnvironmentDelivery {
109
+ type: 'environment';
110
+ /**
111
+ * Explicit target keys prevent two named bindings from silently overwriting
112
+ * each other. Every required field must have a distinct environment key.
113
+ */
114
+ keys: {
115
+ endpoint: string;
116
+ bucket: string;
117
+ region: string;
118
+ accessKeyId: string;
119
+ secretAccessKey: string;
120
+ sessionToken?: string;
121
+ };
122
+ }
123
+
124
+ export interface IObjectStorageSecretFileDelivery {
125
+ type: 'secretFile';
126
+ /** Canonical absolute path below /run/secrets/. */
127
+ targetPath: string;
128
+ /**
129
+ * JSON object with endpoint, bucket, region, accessKeyId,
130
+ * secretAccessKey, and optional sessionToken fields.
131
+ */
132
+ format: 'servezone-object-storage-v1';
133
+ }
134
+
135
+ export type TObjectStorageDelivery =
136
+ | IObjectStorageEnvironmentDelivery
137
+ | IObjectStorageSecretFileDelivery;
138
+
139
+ export type TResolvedStorageBindingStatus =
140
+ | 'requested'
141
+ | 'provisioning'
142
+ | 'ready'
143
+ | 'degraded'
144
+ | 'failed'
145
+ | 'releasing'
146
+ | 'retained'
147
+ | 'released';
148
+
149
+ export type TStorageBindingFailureCode =
150
+ | 'unsupportedCapability'
151
+ | 'policyUnavailable'
152
+ | 'provisionFailed'
153
+ | 'attachmentFailed'
154
+ | 'quotaExceeded'
155
+ | 'credentialsUnavailable'
156
+ | 'backendUnavailable'
157
+ | 'migrationRequired';
158
+
159
+ export interface IStorageBindingFailure {
160
+ code: TStorageBindingFailureCode;
161
+ message: string;
162
+ retryable: boolean;
163
+ observedAt: number;
164
+ }
165
+
166
+ export interface IResolvedStoragePolicyRef {
167
+ /** Opaque operator-defined policy class ID selected for this request. */
168
+ classId: string;
169
+ revision: string;
170
+ }
171
+
172
+ export interface IResolvedStorageCapacity {
173
+ requested?: TStorageCapacityQuantity;
174
+ granted?: TStorageCapacityQuantity;
175
+ limit?: TStorageCapacityQuantity;
176
+ }
177
+
178
+ export interface IResolvedStorageBindingBase {
179
+ schemaVersion: 1;
180
+ /** Stable binding/allocation identity. */
181
+ id: string;
182
+ serviceId: string;
183
+ /** Stable App Store storageRequests[].id. */
184
+ requestId: string;
185
+ /**
186
+ * Canonical digest of the normalized request. Adapters use it to distinguish
187
+ * an idempotent reconciliation from a migration.
188
+ */
189
+ requestDigest: string;
190
+ kind: TStorageResourceKind;
191
+ generation: number;
192
+ observedGeneration: number;
193
+ status: TResolvedStorageBindingStatus;
194
+ policy: IResolvedStoragePolicyRef;
195
+ capabilities: IStorageGrantedCapabilities;
196
+ /** Opaque resource identity; never a host path, export, or provider URL. */
197
+ resourceRef: string;
198
+ capacity?: IResolvedStorageCapacity;
199
+ failure?: IStorageBindingFailure;
200
+ createdAt?: number;
201
+ updatedAt?: number;
202
+ }
203
+
204
+ export interface IResolvedFilesystemStorageBinding
205
+ extends IResolvedStorageBindingBase {
206
+ kind: 'filesystem';
207
+ mountPath: string;
208
+ accessMode: TFilesystemStorageAccessMode;
209
+ }
210
+
211
+ export interface IStorageObjectCredentialsRef {
212
+ secretBundleId: string;
213
+ accessKeyIdKey: string;
214
+ secretAccessKeyKey: string;
215
+ sessionTokenKey?: string;
216
+ }
217
+
218
+ export interface IResolvedObjectStorageConnection {
219
+ endpoint: string;
220
+ bucket: string;
221
+ region: string;
222
+ }
223
+
224
+ export interface IResolvedObjectStorageBinding
225
+ extends IResolvedStorageBindingBase {
226
+ kind: 'objectStorage';
227
+ accessMode: TObjectStorageAccessMode;
228
+ connection: IResolvedObjectStorageConnection;
229
+ credentials: IStorageObjectCredentialsRef;
230
+ delivery: TObjectStorageDelivery;
231
+ versioning: boolean;
232
+ retentionDays?: number;
233
+ }
234
+
235
+ export type TResolvedStorageBinding =
236
+ | IResolvedFilesystemStorageBinding
237
+ | IResolvedObjectStorageBinding;
@@ -1,5 +1,6 @@
1
1
  import * as plugins from '../plugins.js';
2
2
 
3
+ /** @deprecated Use the credential-scoped requests.webpush contracts. */
3
4
  export interface IRequest_SendPushNotification extends plugins.typedrequestInterfaces.implementsTR<
4
5
  plugins.typedrequestInterfaces.ITypedRequest,
5
6
  IRequest_SendPushNotification
@@ -33,6 +33,7 @@ import * as settingsRequests from './settings.js';
33
33
  import * as statusRequests from './status.js';
34
34
  import * as taskRequests from './task.js';
35
35
  import * as versionRequests from './version.js';
36
+ import * as webPushRequests from './webpush.js';
36
37
 
37
38
  export {
38
39
  adminRequests as admin,
@@ -68,8 +69,10 @@ export {
68
69
  statusRequests as status,
69
70
  taskRequests as task,
70
71
  versionRequests as version,
72
+ webPushRequests as webpush,
71
73
  };
72
74
 
73
75
  export * from './inform.js';
74
76
  export * from './hostedapp.js';
75
77
  export * from './mail.js';
78
+ export * from './webpush.js';