@registrystack/client 0.42.0 → 0.44.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.
- package/README.md +37 -7
- package/breg/client.d.ts +49 -27
- package/breg/client.js +18 -8
- package/breg/index.d.ts +31 -16
- package/casework/client.d.ts +11 -10
- package/casework/client.js +39 -1
- package/casework/index.d.ts +3 -3
- package/compatibility.json +18 -0
- package/coordinator/client.d.ts +218 -0
- package/coordinator/client.js +140 -0
- package/coordinator/index.d.ts +19 -0
- package/coordinator/index.js +3 -0
- package/discovery/client.d.ts +2 -2
- package/discovery/client.js +3 -3
- package/discovery/index.d.ts +2 -2
- package/evidence/client.d.ts +9 -16
- package/evidence/index.d.ts +1 -1
- package/index.d.ts +2 -1
- package/index.js +2 -1
- package/messaging/client.d.ts +7 -6
- package/native.js +2 -2
- package/package.json +15 -6
- package/scheduling/client.d.ts +177 -11
- package/scheduling/client.js +6 -1
- package/scheduling/index.d.ts +6 -1
package/scheduling/client.d.ts
CHANGED
|
@@ -10,11 +10,12 @@ export type JsonValue = JsonScalar | ReadonlyArray<JsonValue> | { readonly [key:
|
|
|
10
10
|
|
|
11
11
|
export interface SchedulingClientConfig {
|
|
12
12
|
baseUrl: string
|
|
13
|
-
|
|
14
|
-
connectTimeoutMilliseconds?: SafeInteger
|
|
15
|
-
|
|
16
|
-
userAgent?: string
|
|
17
|
-
|
|
13
|
+
attemptTimeoutMilliseconds?: SafeInteger
|
|
14
|
+
connectTimeoutMilliseconds?: SafeInteger
|
|
15
|
+
maximumResponseBytes?: SafeInteger
|
|
16
|
+
userAgent?: string
|
|
17
|
+
/** Additional trust roots for the deployment, as PEM text. */
|
|
18
|
+
trustedRootCertificates?: string
|
|
18
19
|
/**
|
|
19
20
|
* How many times a keyed command (hold, appointment create, reschedule,
|
|
20
21
|
* cancel) whose outcome is unknown is resent, identically and under the
|
|
@@ -22,7 +23,7 @@ export interface SchedulingClientConfig {
|
|
|
22
23
|
* to 2, default 2; 0 sends it once. Any other value is a `configuration`
|
|
23
24
|
* error.
|
|
24
25
|
*/
|
|
25
|
-
|
|
26
|
+
maximumMutationRetries?: SafeInteger
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
/** An opaque record link Scheduling retains with a hold or appointment. */
|
|
@@ -33,12 +34,98 @@ export interface ExternalReference {
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
export interface PartyCounts { recipients: SafeInteger; attendees: SafeInteger }
|
|
37
|
+
export interface BusyCoverage { start: Instant; end: Instant; resources: ReadonlyArray<string> }
|
|
38
|
+
export interface BusyIntervalInput { externalUid: string; externalRevision: string; resource: string; start: Instant; end: Instant }
|
|
39
|
+
export interface BusyReconciliationRequest {
|
|
40
|
+
expectedRevision: SafeInteger
|
|
41
|
+
observedAt: Instant
|
|
42
|
+
freshUntil?: Instant | null
|
|
43
|
+
coverage: BusyCoverage
|
|
44
|
+
status: 'fresh' | 'unavailable'
|
|
45
|
+
records: ReadonlyArray<BusyIntervalInput>
|
|
46
|
+
}
|
|
47
|
+
export interface BusyCommitmentImpact { kind: string; resource: string; occupiedStart: Instant; occupiedEnd: Instant }
|
|
48
|
+
export interface BusyImpactSummary {
|
|
49
|
+
total: SafeInteger
|
|
50
|
+
detailsAvailable: boolean
|
|
51
|
+
truncated: boolean
|
|
52
|
+
items?: ReadonlyArray<BusyCommitmentImpact>
|
|
53
|
+
}
|
|
54
|
+
export interface BusyReconciliationCounts {
|
|
55
|
+
sourceId: string
|
|
56
|
+
requestDigest: string
|
|
57
|
+
added: SafeInteger
|
|
58
|
+
changed: SafeInteger
|
|
59
|
+
deleted: SafeInteger
|
|
60
|
+
retainedOutsideAuthority: SafeInteger
|
|
61
|
+
retainedAcrossCoverageBoundary: SafeInteger
|
|
62
|
+
impacts: BusyImpactSummary
|
|
63
|
+
}
|
|
64
|
+
export interface BusyReconciliationPreview extends BusyReconciliationCounts {
|
|
65
|
+
expectedRevision: SafeInteger
|
|
66
|
+
currentRevision: SafeInteger
|
|
67
|
+
}
|
|
68
|
+
export interface BusyApplyOutcome extends BusyReconciliationCounts {
|
|
69
|
+
kind: 'applied' | 'already-applied'
|
|
70
|
+
revision: SafeInteger
|
|
71
|
+
}
|
|
72
|
+
/** A secondary physical requirement, committed with the primary offering. */
|
|
73
|
+
export interface AdditionalAllocationRequest {
|
|
74
|
+
offering: string
|
|
75
|
+
resource?: string
|
|
76
|
+
units?: SafeInteger
|
|
77
|
+
}
|
|
78
|
+
export type AllocationRequirementDocument =
|
|
79
|
+
| { kind: 'primary' }
|
|
80
|
+
| { kind: 'additional'; index: SafeInteger }
|
|
81
|
+
export interface AllocationDocument {
|
|
82
|
+
requirement: AllocationRequirementDocument
|
|
83
|
+
offering: string
|
|
84
|
+
resource: string
|
|
85
|
+
units: SafeInteger
|
|
86
|
+
occupiedStart: Instant
|
|
87
|
+
occupiedEnd: Instant
|
|
88
|
+
}
|
|
89
|
+
export interface OperationalAllocationDocument extends Omit<AllocationDocument, 'resource'> {
|
|
90
|
+
resource?: string
|
|
91
|
+
}
|
|
92
|
+
/** Physical advice only. This read never grants admission or reserves capacity. */
|
|
93
|
+
export interface AvailabilityPreviewRequest {
|
|
94
|
+
offering: string
|
|
95
|
+
start: Instant
|
|
96
|
+
durationMinutes?: SafeInteger
|
|
97
|
+
resource?: string
|
|
98
|
+
resourceUnits?: SafeInteger
|
|
99
|
+
additionalAllocations?: ReadonlyArray<AdditionalAllocationRequest>
|
|
100
|
+
party?: PartyCounts
|
|
101
|
+
}
|
|
102
|
+
export interface AvailabilityPreviewDocument {
|
|
103
|
+
offering: string
|
|
104
|
+
start: Instant
|
|
105
|
+
end: Instant
|
|
106
|
+
capacityAvailable: boolean
|
|
107
|
+
publicCode?: string
|
|
108
|
+
}
|
|
109
|
+
/** A fixed verified-grant selector, never a caller-supplied manager identifier. */
|
|
110
|
+
export type ManagerSelection = 'schedulingManager'
|
|
111
|
+
/** Source-owned booking data. It grants no relationship or appointment authority. */
|
|
112
|
+
export interface PartyReference {
|
|
113
|
+
role: 'beneficiary' | 'organization'
|
|
114
|
+
reference: ExternalReference
|
|
115
|
+
}
|
|
36
116
|
|
|
37
117
|
/** One admission: the offering, start, and party a hold or booking asks capacity for. */
|
|
38
118
|
export interface AdmissionRequest {
|
|
39
119
|
offering: string
|
|
40
120
|
start: Instant
|
|
41
|
-
|
|
121
|
+
durationMinutes?: SafeInteger
|
|
122
|
+
resource?: string
|
|
123
|
+
/** Physical units, default 1. People are counted separately. */
|
|
124
|
+
resourceUnits?: SafeInteger
|
|
125
|
+
additionalAllocations?: ReadonlyArray<AdditionalAllocationRequest>
|
|
126
|
+
party?: PartyCounts
|
|
127
|
+
manager?: ManagerSelection
|
|
128
|
+
partyReferences?: ReadonlyArray<PartyReference>
|
|
42
129
|
channel?: string | null
|
|
43
130
|
duplicateKey?: string | null
|
|
44
131
|
policyRevision: SafeInteger
|
|
@@ -55,19 +142,59 @@ export type CreateAppointmentRequest =
|
|
|
55
142
|
|
|
56
143
|
export interface RescheduleAppointmentRequest { observedRevision: SafeInteger; admission: AdmissionRequest }
|
|
57
144
|
export interface CancelAppointmentRequest { observedRevision: SafeInteger; reason?: string | null }
|
|
145
|
+
export type AttendanceState = 'arrived' | 'completed' | 'no-show'
|
|
146
|
+
export interface RecordAttendanceRequest {
|
|
147
|
+
observedAppointmentRevision: SafeInteger
|
|
148
|
+
observedRevision: SafeInteger
|
|
149
|
+
state: AttendanceState
|
|
150
|
+
observedAt: Instant
|
|
151
|
+
}
|
|
152
|
+
export interface AttendanceDocument {
|
|
153
|
+
appointmentId: string
|
|
154
|
+
appointmentRevision: SafeInteger
|
|
155
|
+
revision: SafeInteger
|
|
156
|
+
state: AttendanceState
|
|
157
|
+
observedAt: Instant
|
|
158
|
+
recordedAt: Instant
|
|
159
|
+
}
|
|
58
160
|
|
|
59
|
-
export interface
|
|
161
|
+
export interface AvailabilitySelection {
|
|
162
|
+
durationMinutes?: SafeInteger | null
|
|
163
|
+
resource?: string | null
|
|
164
|
+
}
|
|
165
|
+
export interface AvailabilityQuery extends AvailabilitySelection {
|
|
60
166
|
start?: Instant | null
|
|
61
167
|
end?: Instant | null
|
|
62
168
|
cursor?: string | null
|
|
63
169
|
limit?: SafeInteger | null
|
|
64
170
|
}
|
|
65
171
|
export interface PageQuery { cursor?: string | null; limit?: SafeInteger | null }
|
|
172
|
+
export type OperationalTimeBasis = 'displayed' | 'occupied'
|
|
173
|
+
export interface OperationalAppointmentQuery {
|
|
174
|
+
service: string
|
|
175
|
+
location: string
|
|
176
|
+
start: Instant
|
|
177
|
+
end: Instant
|
|
178
|
+
timeBasis: OperationalTimeBasis
|
|
179
|
+
offering?: string
|
|
180
|
+
state?: AppointmentState
|
|
181
|
+
resource?: string
|
|
182
|
+
externalReference?: ExternalReference
|
|
183
|
+
profile?: string
|
|
184
|
+
cursor?: string
|
|
185
|
+
limit?: SafeInteger
|
|
186
|
+
}
|
|
66
187
|
|
|
67
188
|
export interface SchedulingServiceDocument { schedulingId: string; policyRevision: SafeInteger; policyDigest: string }
|
|
68
189
|
export interface ServiceDocument { id: string; label: string }
|
|
69
190
|
export type SchedulingMode = 'exact-time' | 'arrival-window'
|
|
191
|
+
export type OpeningCoverage = 'service-interval' | 'occupied-interval'
|
|
70
192
|
export interface ReminderDocument { minutesBefore: SafeInteger }
|
|
193
|
+
export interface DurationSelectionDocument {
|
|
194
|
+
minimumMinutes: SafeInteger
|
|
195
|
+
maximumMinutes: SafeInteger
|
|
196
|
+
incrementMinutes: SafeInteger
|
|
197
|
+
}
|
|
71
198
|
export interface WindowDocument { id: string; revision: SafeInteger; start: Instant; end: Instant; units: SafeInteger }
|
|
72
199
|
export interface OfferingDocument {
|
|
73
200
|
id: string
|
|
@@ -75,36 +202,46 @@ export interface OfferingDocument {
|
|
|
75
202
|
label: string
|
|
76
203
|
mode: SchedulingMode
|
|
77
204
|
location: string
|
|
205
|
+
pool?: string
|
|
78
206
|
leadTimeMinutes: SafeInteger
|
|
79
207
|
horizonDays: SafeInteger
|
|
80
208
|
cancellationCutoffMinutes: SafeInteger
|
|
81
209
|
durationMinutes: SafeInteger | null
|
|
210
|
+
durationSelection?: DurationSelectionDocument
|
|
211
|
+
openingCoverage?: OpeningCoverage
|
|
212
|
+
allowResourceSelection?: boolean
|
|
213
|
+
partyCounts?: 'required' | 'optional'
|
|
82
214
|
bufferBeforeMinutes: SafeInteger | null
|
|
83
215
|
bufferAfterMinutes: SafeInteger | null
|
|
84
216
|
startIncrementMinutes: SafeInteger | null
|
|
85
217
|
maxRecipients: SafeInteger | null
|
|
86
218
|
window: WindowDocument | null
|
|
219
|
+
windows?: ReadonlyArray<WindowDocument>
|
|
87
220
|
reminders: ReadonlyArray<ReminderDocument>
|
|
88
221
|
requiresCapabilities: ReadonlyArray<string>
|
|
89
222
|
prerequisites: ReadonlyArray<string>
|
|
90
223
|
}
|
|
91
|
-
export interface ResourceDocument { resourceId: string; pool: string; capabilities: ReadonlyArray<string>; available: boolean }
|
|
224
|
+
export interface ResourceDocument { resourceId: string; pool: string; capabilities: ReadonlyArray<string>; available: boolean; capacityUnits?: SafeInteger }
|
|
92
225
|
export interface LocationDocument { locationId: string; timezone: string }
|
|
93
226
|
|
|
94
227
|
/** Exact-time offerings answer grid slots; arrival-window offerings answer windows. */
|
|
95
228
|
export type AvailabilityEntry =
|
|
96
|
-
| { kind: 'slot'; start: Instant; end: Instant; free: SafeInteger }
|
|
229
|
+
| { kind: 'slot'; start: Instant; end: Instant; free: SafeInteger; availableUnits?: SafeInteger }
|
|
97
230
|
| { kind: 'window'; window: string; start: Instant; end: Instant; remaining: SafeInteger; channelRemaining: SafeInteger | null }
|
|
98
231
|
|
|
99
232
|
export interface PageDocument<T> { items: ReadonlyArray<T>; nextCursor: string | null }
|
|
100
233
|
|
|
101
234
|
export interface HoldDocument {
|
|
235
|
+
allocations?: ReadonlyArray<AllocationDocument>
|
|
102
236
|
holdId: string
|
|
103
237
|
offering: string
|
|
104
238
|
start: Instant
|
|
105
239
|
end: Instant
|
|
106
240
|
resource: string | null
|
|
107
241
|
units: SafeInteger
|
|
242
|
+
party?: PartyCounts
|
|
243
|
+
manager?: ManagerSelection
|
|
244
|
+
partyReferences?: ReadonlyArray<PartyReference>
|
|
108
245
|
expiresAt: Instant
|
|
109
246
|
policyRevision: SafeInteger
|
|
110
247
|
externalReferences: ReadonlyArray<ExternalReference>
|
|
@@ -112,12 +249,17 @@ export interface HoldDocument {
|
|
|
112
249
|
|
|
113
250
|
export type AppointmentState = 'confirmed' | 'cancelled'
|
|
114
251
|
export interface AppointmentDocument {
|
|
252
|
+
attendance?: AttendanceDocument
|
|
253
|
+
allocations?: ReadonlyArray<AllocationDocument>
|
|
115
254
|
appointmentId: string
|
|
116
255
|
offering: string
|
|
117
256
|
start: Instant
|
|
118
257
|
end: Instant
|
|
119
258
|
resource: string | null
|
|
120
259
|
units: SafeInteger
|
|
260
|
+
party?: PartyCounts
|
|
261
|
+
manager?: ManagerSelection
|
|
262
|
+
partyReferences?: ReadonlyArray<PartyReference>
|
|
121
263
|
channel: string | null
|
|
122
264
|
revision: SafeInteger
|
|
123
265
|
state: AppointmentState
|
|
@@ -126,6 +268,24 @@ export interface AppointmentDocument {
|
|
|
126
268
|
cancelledAt: Instant | null
|
|
127
269
|
externalReferences: ReadonlyArray<ExternalReference>
|
|
128
270
|
}
|
|
271
|
+
export interface OperationalAppointmentDocument {
|
|
272
|
+
attendance?: AttendanceDocument
|
|
273
|
+
allocations?: ReadonlyArray<OperationalAllocationDocument>
|
|
274
|
+
appointmentId: string
|
|
275
|
+
revision: SafeInteger
|
|
276
|
+
service: string
|
|
277
|
+
location: string
|
|
278
|
+
offering: string
|
|
279
|
+
state: AppointmentState
|
|
280
|
+
displayedStart: Instant
|
|
281
|
+
displayedEnd: Instant
|
|
282
|
+
occupiedStart?: Instant
|
|
283
|
+
occupiedEnd?: Instant
|
|
284
|
+
resource?: string
|
|
285
|
+
units?: SafeInteger
|
|
286
|
+
party?: PartyCounts
|
|
287
|
+
externalReferences?: ExternalReference[]
|
|
288
|
+
}
|
|
129
289
|
|
|
130
290
|
export interface AppointmentHistoryEntryDocument {
|
|
131
291
|
eventId: string
|
|
@@ -213,7 +373,11 @@ export class SchedulingClient {
|
|
|
213
373
|
listServices(token: string, cursor?: string | null): Promise<SchedulingOutcome<PageDocument<ServiceDocument>>>
|
|
214
374
|
listOfferings(token: string, cursor?: string | null): Promise<SchedulingOutcome<PageDocument<OfferingDocument>>>
|
|
215
375
|
availability(token: string, offering: string, query?: AvailabilityQuery | null): Promise<SchedulingOutcome<PageDocument<AvailabilityEntry>>>
|
|
216
|
-
|
|
376
|
+
previewAvailability(token: string, request: AvailabilityPreviewRequest): Promise<SchedulingOutcome<AvailabilityPreviewDocument>>
|
|
377
|
+
previewSourceBusy(token: string, profile: string, request: BusyReconciliationRequest): Promise<SchedulingOutcome<BusyReconciliationPreview>>
|
|
378
|
+
/** Apply once; recover uncertainty with the exact body and expected revision. */
|
|
379
|
+
applySourceBusy(token: string, profile: string, request: BusyReconciliationRequest): Promise<SchedulingOutcome<BusyApplyOutcome>>
|
|
380
|
+
explain(token: string, offering: string, start: Instant, selection?: AvailabilitySelection | null): Promise<SchedulingOutcome<ExplainDocument>>
|
|
217
381
|
createHold(token: string, idempotencyKey: string, request: AdmissionRequest): Promise<SchedulingOutcome<HoldDocument>>
|
|
218
382
|
releaseHold(token: string, holdId: string): Promise<SchedulingOutcome<null>>
|
|
219
383
|
createAppointment(token: string, idempotencyKey: string, request: CreateAppointmentRequest): Promise<SchedulingOutcome<AppointmentDocument>>
|
|
@@ -221,8 +385,10 @@ export class SchedulingClient {
|
|
|
221
385
|
appointmentReceipt(token: string, idempotencyKey: string, request: CreateAppointmentRequest): Promise<SchedulingOutcome<AppointmentDocument>>
|
|
222
386
|
getAppointment(token: string, appointmentId: string): Promise<SchedulingOutcome<AppointmentDocument>>
|
|
223
387
|
listAppointments(token: string, reference: ExternalReference, page?: PageQuery | null): Promise<SchedulingOutcome<PageDocument<AppointmentDocument>>>
|
|
388
|
+
listOperationalAppointments(token: string, query: OperationalAppointmentQuery): Promise<SchedulingOutcome<PageDocument<OperationalAppointmentDocument>>>
|
|
224
389
|
rescheduleAppointment(token: string, appointmentId: string, idempotencyKey: string, request: RescheduleAppointmentRequest): Promise<SchedulingOutcome<AppointmentDocument>>
|
|
225
390
|
cancelAppointment(token: string, appointmentId: string, idempotencyKey: string, request: CancelAppointmentRequest): Promise<SchedulingOutcome<AppointmentDocument>>
|
|
391
|
+
recordAttendance(token: string, appointmentId: string, idempotencyKey: string, request: RecordAttendanceRequest): Promise<SchedulingOutcome<AttendanceDocument>>
|
|
226
392
|
appointmentHistory(token: string, appointmentId: string, cursor?: string | null): Promise<SchedulingOutcome<PageDocument<AppointmentHistoryEntryDocument>>>
|
|
227
393
|
listResources(token: string, cursor?: string | null): Promise<SchedulingOutcome<PageDocument<ResourceDocument>>>
|
|
228
394
|
listLocations(token: string, cursor?: string | null): Promise<SchedulingOutcome<PageDocument<LocationDocument>>>
|
package/scheduling/client.js
CHANGED
|
@@ -114,15 +114,20 @@ for (const [method, jsonIndexes] of [
|
|
|
114
114
|
['listServices', []],
|
|
115
115
|
['listOfferings', []],
|
|
116
116
|
['availability', [2]],
|
|
117
|
-
['
|
|
117
|
+
['previewAvailability', [1]],
|
|
118
|
+
['previewSourceBusy', [2]],
|
|
119
|
+
['applySourceBusy', [2]],
|
|
120
|
+
['explain', [3]],
|
|
118
121
|
['createHold', [2]],
|
|
119
122
|
['releaseHold', []],
|
|
120
123
|
['createAppointment', [2]],
|
|
121
124
|
['appointmentReceipt', [2]],
|
|
122
125
|
['getAppointment', []],
|
|
123
126
|
['listAppointments', [1, 2]],
|
|
127
|
+
['listOperationalAppointments', [1]],
|
|
124
128
|
['rescheduleAppointment', [3]],
|
|
125
129
|
['cancelAppointment', [3]],
|
|
130
|
+
['recordAttendance', [3]],
|
|
126
131
|
['appointmentHistory', []],
|
|
127
132
|
['listResources', []],
|
|
128
133
|
['listLocations', []],
|
package/scheduling/index.d.ts
CHANGED
|
@@ -7,15 +7,20 @@ export declare class SchedulingClient {
|
|
|
7
7
|
listServices(token: string, cursor?: string | undefined | null): Promise<SchedulingOutcome>
|
|
8
8
|
listOfferings(token: string, cursor?: string | undefined | null): Promise<SchedulingOutcome>
|
|
9
9
|
availability(token: string, offering: string, query?: any | undefined | null): Promise<SchedulingOutcome>
|
|
10
|
-
|
|
10
|
+
previewAvailability(token: string, request: any): Promise<SchedulingOutcome>
|
|
11
|
+
previewSourceBusy(token: string, profile: string, request: any): Promise<SchedulingOutcome>
|
|
12
|
+
applySourceBusy(token: string, profile: string, request: any): Promise<SchedulingOutcome>
|
|
13
|
+
explain(token: string, offering: string, start: string, selection?: any | undefined | null): Promise<SchedulingOutcome>
|
|
11
14
|
createHold(token: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
12
15
|
releaseHold(token: string, holdId: string): Promise<SchedulingOutcome>
|
|
13
16
|
createAppointment(token: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
14
17
|
appointmentReceipt(token: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
15
18
|
getAppointment(token: string, appointmentId: string): Promise<SchedulingOutcome>
|
|
16
19
|
listAppointments(token: string, reference: any, page?: any | undefined | null): Promise<SchedulingOutcome>
|
|
20
|
+
listOperationalAppointments(token: string, query: any): Promise<SchedulingOutcome>
|
|
17
21
|
rescheduleAppointment(token: string, appointmentId: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
18
22
|
cancelAppointment(token: string, appointmentId: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
23
|
+
recordAttendance(token: string, appointmentId: string, idempotencyKey: string, request: any): Promise<SchedulingOutcome>
|
|
19
24
|
appointmentHistory(token: string, appointmentId: string, cursor?: string | undefined | null): Promise<SchedulingOutcome>
|
|
20
25
|
listResources(token: string, cursor?: string | undefined | null): Promise<SchedulingOutcome>
|
|
21
26
|
listLocations(token: string, cursor?: string | undefined | null): Promise<SchedulingOutcome>
|