@medplum/core 5.1.10 → 5.1.12

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.
@@ -159,6 +159,10 @@ export declare interface AddressFormatOptions {
159
159
  lineSeparator?: string;
160
160
  }
161
161
 
162
+ export declare type AgentChannelStats = {
163
+ rtt: AgentRttStats;
164
+ };
165
+
162
166
  export declare interface AgentConnectRequest extends BaseAgentRequestMessage {
163
167
  type: 'agent:connect:request';
164
168
  agentId: string;
@@ -204,9 +208,51 @@ export declare interface AgentReloadConfigResponse extends BaseAgentMessage {
204
208
  statusCode: number;
205
209
  }
206
210
 
207
- export declare type AgentRequestMessage = AgentConnectRequest | AgentHeartbeatRequest | AgentTransmitRequest | AgentReloadConfigRequest | AgentUpgradeRequest | AgentLogsRequest;
211
+ export declare type AgentRequestMessage = AgentConnectRequest | AgentHeartbeatRequest | AgentTransmitRequest | AgentReloadConfigRequest | AgentUpgradeRequest | AgentLogsRequest | AgentStatsRequest;
212
+
213
+ export declare type AgentResponseMessage = AgentConnectResponse | AgentHeartbeatResponse | AgentTransmitResponse | AgentReloadConfigResponse | AgentUpgradeResponse | AgentLogsResponse | AgentStatsResponse | AgentError;
214
+
215
+ export declare type AgentRttStats = {
216
+ count: number;
217
+ min: number;
218
+ max: number;
219
+ average: number;
220
+ p50: number;
221
+ p95: number;
222
+ p99: number;
223
+ pendingCount: number;
224
+ };
225
+
226
+ export declare type AgentStatPrimitiveValue = string | boolean | number;
227
+
228
+ /**
229
+ * Statistics about the running agent. Known fields are typed; additional
230
+ * fields may be present and are preserved as unknown values.
231
+ */
232
+ export declare interface AgentStats {
233
+ hl7ConnectionsOpen: number;
234
+ ping: number;
235
+ webSocketQueueDepth: number;
236
+ hl7QueueDepth: number;
237
+ hl7ClientCount: number;
238
+ live: boolean;
239
+ outstandingHeartbeats: number;
240
+ channelStats: Record<string, AgentChannelStats>;
241
+ clientStats: Record<string, AgentChannelStats>;
242
+ [key: string]: AgentStatValue;
243
+ }
244
+
245
+ export declare interface AgentStatsRequest extends BaseAgentRequestMessage {
246
+ type: 'agent:stats:request';
247
+ }
248
+
249
+ export declare interface AgentStatsResponse extends BaseAgentMessage {
250
+ type: 'agent:stats:response';
251
+ statusCode: number;
252
+ stats: AgentStats;
253
+ }
208
254
 
209
- export declare type AgentResponseMessage = AgentConnectResponse | AgentHeartbeatResponse | AgentTransmitResponse | AgentReloadConfigResponse | AgentUpgradeResponse | AgentLogsResponse | AgentError;
255
+ export declare type AgentStatValue = AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue>>>;
210
256
 
211
257
  export declare interface AgentTransmitRequest extends BaseAgentRequestMessage {
212
258
  type: 'agent:transmit:request';
@@ -352,7 +398,7 @@ export declare interface BackgroundJobContext {
352
398
 
353
399
  export declare type BackgroundJobInteraction = 'create' | 'update' | 'delete';
354
400
 
355
- export declare function badRequest(details: string, expression?: string): OperationOutcome;
401
+ export declare function badRequest(details: string, expression?: string | string[]): OperationOutcome;
356
402
 
357
403
  export declare interface BaseAgentMessage {
358
404
  type: string;
@@ -809,6 +855,8 @@ export declare class ContainsAtom extends BooleanInfixOperatorAtom {
809
855
  eval(context: AtomContext, input: TypedValue[]): TypedValue[];
810
856
  }
811
857
 
858
+ export declare function contentTooLarge(text: string): OperationOutcome;
859
+
812
860
  /**
813
861
  * Content type constants.
814
862
  */
@@ -1180,7 +1228,7 @@ export declare interface ElementType {
1180
1228
  export declare interface EmailPasswordLoginRequest extends BaseLoginRequest {
1181
1229
  readonly email: string;
1182
1230
  readonly password: string;
1183
- /** @deprecated Use scope of "offline" or "offline_access" instead. */
1231
+ /** @deprecated Use "offline_access" scope instead. */
1184
1232
  readonly remember?: boolean;
1185
1233
  }
1186
1234
 
@@ -2138,6 +2186,8 @@ export declare function getNestedProperty(value: TypedValue | undefined, key: st
2138
2186
  withPath?: false;
2139
2187
  }): (TypedValue | TypedValue[] | undefined)[];
2140
2188
 
2189
+ export declare function getOutcomeRedirectUrl(outcome: OperationOutcome | undefined): string | undefined;
2190
+
2141
2191
  export declare function getParsedDerivedIdentifierExpression(originalExpression: string, atom: FhirPathAtom): FhirPathAtom;
2142
2192
 
2143
2193
  export declare function getParsedExpressionForResourceType(resourceType: string, expression: string): FhirPathAtom;
@@ -2434,15 +2484,15 @@ export declare class Hl7Message {
2434
2484
  readonly context: Hl7Context;
2435
2485
  /**
2436
2486
  * Internal lazy-parsed segment storage. Entries are `string` until they
2437
- * are accessed (via {@link getSegment}, {@link getAllSegments}, {@link header},
2438
- * or the public {@link segments} getter), at which point they are parsed in
2487
+ * are accessed (via {@link Hl7Message.getSegment}, {@link Hl7Message.getAllSegments}, {@link Hl7Message.header},
2488
+ * or the public {@link Hl7Message.segments} getter), at which point they are parsed in
2439
2489
  * place and replaced with their {@link Hl7Segment} form.
2440
2490
  */
2441
2491
  private readonly _segments;
2442
2492
  /**
2443
- * Maps segment name → indices into {@link _segments}. Storing indices (rather
2493
+ * Maps segment name → indices into {@link Hl7Message#_segments}. Storing indices (rather
2444
2494
  * than references to the segments themselves) keeps this map in sync with
2445
- * {@link _segments} without needing a per-parse update step, and is immune to
2495
+ * {@link Hl7Message#_segments} without needing a per-parse update step, and is immune to
2446
2496
  * collisions when two segments have identical raw text.
2447
2497
  */
2448
2498
  private segmentsByName;
@@ -2452,8 +2502,8 @@ export declare class Hl7Message {
2452
2502
  /**
2453
2503
  * Creates a new HL7 message.
2454
2504
  *
2455
- * Segment strings are not parsed until they are accessed via {@link getSegment},
2456
- * {@link getAllSegments}, {@link header}, or the {@link segments} getter.
2505
+ * Segment strings are not parsed until they are accessed via {@link Hl7Message.getSegment},
2506
+ * {@link Hl7Message.getAllSegments}, {@link Hl7Message.header}, or the {@link Hl7Message.segments} getter.
2457
2507
  *
2458
2508
  * @param segments - The HL7 segments.
2459
2509
  * @param context - Optional HL7 parsing context.
@@ -2462,7 +2512,7 @@ export declare class Hl7Message {
2462
2512
  /**
2463
2513
  * Returns all HL7 segments, parsing any unparsed segment strings on first access.
2464
2514
  *
2465
- * Prefer {@link getSegment} or {@link getAllSegments} when you only need a subset
2515
+ * Prefer {@link Hl7Message.getSegment} or {@link Hl7Message.getAllSegments} when you only need a subset
2466
2516
  * of segments; those methods avoid parsing unrelated segments.
2467
2517
  *
2468
2518
  * @returns The HL7 segments array.
@@ -2564,7 +2614,7 @@ export declare class Hl7Segment {
2564
2614
  readonly name: string;
2565
2615
  /**
2566
2616
  * Internal lazy-parsed field storage. Entries are `string` until they are
2567
- * accessed (via {@link getField} or the public {@link fields} getter), at
2617
+ * accessed (via {@link Hl7Segment.getField} or the public {@link Hl7Segment.fields} getter), at
2568
2618
  * which point they are parsed in place and replaced with their
2569
2619
  * {@link Hl7Field} form.
2570
2620
  */
@@ -2577,8 +2627,8 @@ export declare class Hl7Segment {
2577
2627
  /**
2578
2628
  * Creates a new HL7 segment.
2579
2629
  *
2580
- * Field strings are not parsed until they are accessed via {@link getField}
2581
- * or via the {@link fields} getter.
2630
+ * Field strings are not parsed until they are accessed via {@link Hl7Segment.getField}
2631
+ * or via the {@link Hl7Segment.fields} getter.
2582
2632
  *
2583
2633
  * @param fields - The HL7 fields. The first field is the segment name.
2584
2634
  * @param context - Optional HL7 parsing context.
@@ -2587,7 +2637,7 @@ export declare class Hl7Segment {
2587
2637
  /**
2588
2638
  * Returns all HL7 fields, parsing any unparsed field strings on first access.
2589
2639
  *
2590
- * Prefer {@link getField} when you only need a subset of fields; that method
2640
+ * Prefer {@link Hl7Segment.getField} when you only need a subset of fields; that method
2591
2641
  * avoids parsing unrelated fields.
2592
2642
  *
2593
2643
  * @returns The HL7 fields array.
@@ -3365,6 +3415,7 @@ export declare interface LoggerOptions {
3365
3415
 
3366
3416
  export declare interface LoginAuthenticationResponse {
3367
3417
  readonly login: string;
3418
+ readonly emailVerificationRequired?: boolean;
3368
3419
  readonly mfaEnrollRequired?: boolean;
3369
3420
  readonly mfaRequired?: boolean;
3370
3421
  readonly enrollQrCode?: string;
@@ -4999,10 +5050,27 @@ export declare class MedplumClient extends TypedEventTarget<MedplumClientEventMa
4999
5050
  refreshIfExpired(gracePeriod?: number): Promise<void>;
5000
5051
  /**
5001
5052
  * Tries to refresh the auth tokens.
5053
+ *
5054
+ * When `navigator.locks` is available, the network call is wrapped in a Web Lock
5055
+ * scoped to this client's storage namespace. This serializes refresh attempts across
5056
+ * browser tabs/windows on the same origin so a single-use refresh token is not
5057
+ * consumed by more than one tab. Tabs that wait on the lock re-read the latest
5058
+ * tokens from storage when they acquire it and skip the network call if another tab
5059
+ * has already refreshed.
5060
+ *
5061
+ * @param gracePeriod - Optional grace period in milliseconds threaded through to the post-lock authentication check.
5002
5062
  * @returns The refresh promise if available; otherwise undefined.
5003
5063
  * @see https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokens
5004
5064
  */
5005
5065
  private refresh;
5066
+ /**
5067
+ * Acquires a cross-tab Web Lock (when available) and performs the token refresh.
5068
+ * Tabs that wait on the lock check storage on acquisition and skip the network call
5069
+ * if a peer tab has already produced a fresh access token.
5070
+ * @param gracePeriod - Optional grace period in milliseconds used by the post-lock authentication check to decide whether the current token still has enough life left to skip the network refresh.
5071
+ * @returns Promise that resolves when the refresh (or short-circuit) is complete.
5072
+ */
5073
+ private runRefreshWithLock;
5006
5074
  /**
5007
5075
  * Starts a new OAuth2 client credentials flow.
5008
5076
  *
@@ -5626,8 +5694,12 @@ export declare interface MedplumInfraConfig {
5626
5694
  loadBalancerLoggingBucket?: string;
5627
5695
  loadBalancerLoggingPrefix?: string;
5628
5696
  loadBalancerAlgorithm?: 'round_robin' | 'least_outstanding_requests' | 'weighted_random';
5697
+ guardDutyMalwareProtectionEnabled?: boolean;
5698
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5629
5699
  clamscanEnabled: boolean;
5700
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5630
5701
  clamscanLoggingBucket: string;
5702
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5631
5703
  clamscanLoggingPrefix: string;
5632
5704
  skipDns?: boolean;
5633
5705
  hostedZoneName?: string;
@@ -5852,9 +5924,13 @@ export declare interface MedplumSourceInfraConfig {
5852
5924
  loadBalancerLoggingBucket?: ValueOrExternalSecret<string>;
5853
5925
  loadBalancerLoggingPrefix?: ValueOrExternalSecret<string>;
5854
5926
  loadBalancerAlgorithm?: ValueOrExternalSecret<'round_robin' | 'least_outstanding_requests' | 'weighted_random'>;
5855
- clamscanEnabled: ValueOrExternalSecret<boolean>;
5856
- clamscanLoggingBucket: ValueOrExternalSecret<string>;
5857
- clamscanLoggingPrefix: ValueOrExternalSecret<string>;
5927
+ guardDutyMalwareProtectionEnabled?: ValueOrExternalSecret<boolean>;
5928
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5929
+ clamscanEnabled?: ValueOrExternalSecret<boolean>;
5930
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5931
+ clamscanLoggingBucket?: ValueOrExternalSecret<string>;
5932
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5933
+ clamscanLoggingPrefix?: ValueOrExternalSecret<string>;
5858
5934
  skipDns?: ValueOrExternalSecret<boolean>;
5859
5935
  hostedZoneName?: ValueOrExternalSecret<string>;
5860
5936
  wafLogGroupName?: ValueOrExternalSecret<string>;
@@ -6017,7 +6093,7 @@ export declare interface NewUserRequest {
6017
6093
  readonly lastName: string;
6018
6094
  readonly email: string;
6019
6095
  readonly password: string;
6020
- readonly recaptchaToken: string;
6096
+ readonly recaptchaToken?: string;
6021
6097
  readonly recaptchaSiteKey?: string;
6022
6098
  readonly remember?: boolean;
6023
6099
  readonly projectId?: string;
@@ -6086,6 +6162,7 @@ export declare type OAuthClientAssertionType = (typeof OAuthClientAssertionType)
6086
6162
  * Standard identifiers: {@link https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-07#name-grant-types}
6087
6163
  * JWT bearer extension: {@link https://datatracker.ietf.org/doc/html/rfc7523}
6088
6164
  * Token exchange extension: {@link https://datatracker.ietf.org/doc/html/rfc8693}
6165
+ * Pre-authorized code: {@link https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-urnietfparamsoauthgrant-typ}
6089
6166
  */
6090
6167
  export declare const OAuthGrantType: {
6091
6168
  readonly ClientCredentials: "client_credentials";
@@ -6093,6 +6170,7 @@ export declare const OAuthGrantType: {
6093
6170
  readonly RefreshToken: "refresh_token";
6094
6171
  readonly JwtBearer: "urn:ietf:params:oauth:grant-type:jwt-bearer";
6095
6172
  readonly TokenExchange: "urn:ietf:params:oauth:grant-type:token-exchange";
6173
+ readonly PreAuthorizedCode: "urn:ietf:params:oauth:grant-type:pre-authorized_code";
6096
6174
  };
6097
6175
 
6098
6176
  export declare type OAuthGrantType = (typeof OAuthGrantType)[keyof typeof OAuthGrantType];
@@ -6802,6 +6880,8 @@ export declare class ParserBuilder {
6802
6880
 
6803
6881
  export declare function redirect(url: URL): OperationOutcome;
6804
6882
 
6883
+ export declare function redirectOk(url: URL): OperationOutcome;
6884
+
6805
6885
  export declare type ReleaseManifest = {
6806
6886
  tag_name: string;
6807
6887
  assets: {
@@ -159,6 +159,10 @@ export declare interface AddressFormatOptions {
159
159
  lineSeparator?: string;
160
160
  }
161
161
 
162
+ export declare type AgentChannelStats = {
163
+ rtt: AgentRttStats;
164
+ };
165
+
162
166
  export declare interface AgentConnectRequest extends BaseAgentRequestMessage {
163
167
  type: 'agent:connect:request';
164
168
  agentId: string;
@@ -204,9 +208,51 @@ export declare interface AgentReloadConfigResponse extends BaseAgentMessage {
204
208
  statusCode: number;
205
209
  }
206
210
 
207
- export declare type AgentRequestMessage = AgentConnectRequest | AgentHeartbeatRequest | AgentTransmitRequest | AgentReloadConfigRequest | AgentUpgradeRequest | AgentLogsRequest;
211
+ export declare type AgentRequestMessage = AgentConnectRequest | AgentHeartbeatRequest | AgentTransmitRequest | AgentReloadConfigRequest | AgentUpgradeRequest | AgentLogsRequest | AgentStatsRequest;
212
+
213
+ export declare type AgentResponseMessage = AgentConnectResponse | AgentHeartbeatResponse | AgentTransmitResponse | AgentReloadConfigResponse | AgentUpgradeResponse | AgentLogsResponse | AgentStatsResponse | AgentError;
214
+
215
+ export declare type AgentRttStats = {
216
+ count: number;
217
+ min: number;
218
+ max: number;
219
+ average: number;
220
+ p50: number;
221
+ p95: number;
222
+ p99: number;
223
+ pendingCount: number;
224
+ };
225
+
226
+ export declare type AgentStatPrimitiveValue = string | boolean | number;
227
+
228
+ /**
229
+ * Statistics about the running agent. Known fields are typed; additional
230
+ * fields may be present and are preserved as unknown values.
231
+ */
232
+ export declare interface AgentStats {
233
+ hl7ConnectionsOpen: number;
234
+ ping: number;
235
+ webSocketQueueDepth: number;
236
+ hl7QueueDepth: number;
237
+ hl7ClientCount: number;
238
+ live: boolean;
239
+ outstandingHeartbeats: number;
240
+ channelStats: Record<string, AgentChannelStats>;
241
+ clientStats: Record<string, AgentChannelStats>;
242
+ [key: string]: AgentStatValue;
243
+ }
244
+
245
+ export declare interface AgentStatsRequest extends BaseAgentRequestMessage {
246
+ type: 'agent:stats:request';
247
+ }
248
+
249
+ export declare interface AgentStatsResponse extends BaseAgentMessage {
250
+ type: 'agent:stats:response';
251
+ statusCode: number;
252
+ stats: AgentStats;
253
+ }
208
254
 
209
- export declare type AgentResponseMessage = AgentConnectResponse | AgentHeartbeatResponse | AgentTransmitResponse | AgentReloadConfigResponse | AgentUpgradeResponse | AgentLogsResponse | AgentError;
255
+ export declare type AgentStatValue = AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue | Record<string, AgentStatPrimitiveValue>>>;
210
256
 
211
257
  export declare interface AgentTransmitRequest extends BaseAgentRequestMessage {
212
258
  type: 'agent:transmit:request';
@@ -352,7 +398,7 @@ export declare interface BackgroundJobContext {
352
398
 
353
399
  export declare type BackgroundJobInteraction = 'create' | 'update' | 'delete';
354
400
 
355
- export declare function badRequest(details: string, expression?: string): OperationOutcome;
401
+ export declare function badRequest(details: string, expression?: string | string[]): OperationOutcome;
356
402
 
357
403
  export declare interface BaseAgentMessage {
358
404
  type: string;
@@ -809,6 +855,8 @@ export declare class ContainsAtom extends BooleanInfixOperatorAtom {
809
855
  eval(context: AtomContext, input: TypedValue[]): TypedValue[];
810
856
  }
811
857
 
858
+ export declare function contentTooLarge(text: string): OperationOutcome;
859
+
812
860
  /**
813
861
  * Content type constants.
814
862
  */
@@ -1180,7 +1228,7 @@ export declare interface ElementType {
1180
1228
  export declare interface EmailPasswordLoginRequest extends BaseLoginRequest {
1181
1229
  readonly email: string;
1182
1230
  readonly password: string;
1183
- /** @deprecated Use scope of "offline" or "offline_access" instead. */
1231
+ /** @deprecated Use "offline_access" scope instead. */
1184
1232
  readonly remember?: boolean;
1185
1233
  }
1186
1234
 
@@ -2138,6 +2186,8 @@ export declare function getNestedProperty(value: TypedValue | undefined, key: st
2138
2186
  withPath?: false;
2139
2187
  }): (TypedValue | TypedValue[] | undefined)[];
2140
2188
 
2189
+ export declare function getOutcomeRedirectUrl(outcome: OperationOutcome | undefined): string | undefined;
2190
+
2141
2191
  export declare function getParsedDerivedIdentifierExpression(originalExpression: string, atom: FhirPathAtom): FhirPathAtom;
2142
2192
 
2143
2193
  export declare function getParsedExpressionForResourceType(resourceType: string, expression: string): FhirPathAtom;
@@ -2434,15 +2484,15 @@ export declare class Hl7Message {
2434
2484
  readonly context: Hl7Context;
2435
2485
  /**
2436
2486
  * Internal lazy-parsed segment storage. Entries are `string` until they
2437
- * are accessed (via {@link getSegment}, {@link getAllSegments}, {@link header},
2438
- * or the public {@link segments} getter), at which point they are parsed in
2487
+ * are accessed (via {@link Hl7Message.getSegment}, {@link Hl7Message.getAllSegments}, {@link Hl7Message.header},
2488
+ * or the public {@link Hl7Message.segments} getter), at which point they are parsed in
2439
2489
  * place and replaced with their {@link Hl7Segment} form.
2440
2490
  */
2441
2491
  private readonly _segments;
2442
2492
  /**
2443
- * Maps segment name → indices into {@link _segments}. Storing indices (rather
2493
+ * Maps segment name → indices into {@link Hl7Message#_segments}. Storing indices (rather
2444
2494
  * than references to the segments themselves) keeps this map in sync with
2445
- * {@link _segments} without needing a per-parse update step, and is immune to
2495
+ * {@link Hl7Message#_segments} without needing a per-parse update step, and is immune to
2446
2496
  * collisions when two segments have identical raw text.
2447
2497
  */
2448
2498
  private segmentsByName;
@@ -2452,8 +2502,8 @@ export declare class Hl7Message {
2452
2502
  /**
2453
2503
  * Creates a new HL7 message.
2454
2504
  *
2455
- * Segment strings are not parsed until they are accessed via {@link getSegment},
2456
- * {@link getAllSegments}, {@link header}, or the {@link segments} getter.
2505
+ * Segment strings are not parsed until they are accessed via {@link Hl7Message.getSegment},
2506
+ * {@link Hl7Message.getAllSegments}, {@link Hl7Message.header}, or the {@link Hl7Message.segments} getter.
2457
2507
  *
2458
2508
  * @param segments - The HL7 segments.
2459
2509
  * @param context - Optional HL7 parsing context.
@@ -2462,7 +2512,7 @@ export declare class Hl7Message {
2462
2512
  /**
2463
2513
  * Returns all HL7 segments, parsing any unparsed segment strings on first access.
2464
2514
  *
2465
- * Prefer {@link getSegment} or {@link getAllSegments} when you only need a subset
2515
+ * Prefer {@link Hl7Message.getSegment} or {@link Hl7Message.getAllSegments} when you only need a subset
2466
2516
  * of segments; those methods avoid parsing unrelated segments.
2467
2517
  *
2468
2518
  * @returns The HL7 segments array.
@@ -2564,7 +2614,7 @@ export declare class Hl7Segment {
2564
2614
  readonly name: string;
2565
2615
  /**
2566
2616
  * Internal lazy-parsed field storage. Entries are `string` until they are
2567
- * accessed (via {@link getField} or the public {@link fields} getter), at
2617
+ * accessed (via {@link Hl7Segment.getField} or the public {@link Hl7Segment.fields} getter), at
2568
2618
  * which point they are parsed in place and replaced with their
2569
2619
  * {@link Hl7Field} form.
2570
2620
  */
@@ -2577,8 +2627,8 @@ export declare class Hl7Segment {
2577
2627
  /**
2578
2628
  * Creates a new HL7 segment.
2579
2629
  *
2580
- * Field strings are not parsed until they are accessed via {@link getField}
2581
- * or via the {@link fields} getter.
2630
+ * Field strings are not parsed until they are accessed via {@link Hl7Segment.getField}
2631
+ * or via the {@link Hl7Segment.fields} getter.
2582
2632
  *
2583
2633
  * @param fields - The HL7 fields. The first field is the segment name.
2584
2634
  * @param context - Optional HL7 parsing context.
@@ -2587,7 +2637,7 @@ export declare class Hl7Segment {
2587
2637
  /**
2588
2638
  * Returns all HL7 fields, parsing any unparsed field strings on first access.
2589
2639
  *
2590
- * Prefer {@link getField} when you only need a subset of fields; that method
2640
+ * Prefer {@link Hl7Segment.getField} when you only need a subset of fields; that method
2591
2641
  * avoids parsing unrelated fields.
2592
2642
  *
2593
2643
  * @returns The HL7 fields array.
@@ -3365,6 +3415,7 @@ export declare interface LoggerOptions {
3365
3415
 
3366
3416
  export declare interface LoginAuthenticationResponse {
3367
3417
  readonly login: string;
3418
+ readonly emailVerificationRequired?: boolean;
3368
3419
  readonly mfaEnrollRequired?: boolean;
3369
3420
  readonly mfaRequired?: boolean;
3370
3421
  readonly enrollQrCode?: string;
@@ -4999,10 +5050,27 @@ export declare class MedplumClient extends TypedEventTarget<MedplumClientEventMa
4999
5050
  refreshIfExpired(gracePeriod?: number): Promise<void>;
5000
5051
  /**
5001
5052
  * Tries to refresh the auth tokens.
5053
+ *
5054
+ * When `navigator.locks` is available, the network call is wrapped in a Web Lock
5055
+ * scoped to this client's storage namespace. This serializes refresh attempts across
5056
+ * browser tabs/windows on the same origin so a single-use refresh token is not
5057
+ * consumed by more than one tab. Tabs that wait on the lock re-read the latest
5058
+ * tokens from storage when they acquire it and skip the network call if another tab
5059
+ * has already refreshed.
5060
+ *
5061
+ * @param gracePeriod - Optional grace period in milliseconds threaded through to the post-lock authentication check.
5002
5062
  * @returns The refresh promise if available; otherwise undefined.
5003
5063
  * @see https://openid.net/specs/openid-connect-core-1_0.html#RefreshTokens
5004
5064
  */
5005
5065
  private refresh;
5066
+ /**
5067
+ * Acquires a cross-tab Web Lock (when available) and performs the token refresh.
5068
+ * Tabs that wait on the lock check storage on acquisition and skip the network call
5069
+ * if a peer tab has already produced a fresh access token.
5070
+ * @param gracePeriod - Optional grace period in milliseconds used by the post-lock authentication check to decide whether the current token still has enough life left to skip the network refresh.
5071
+ * @returns Promise that resolves when the refresh (or short-circuit) is complete.
5072
+ */
5073
+ private runRefreshWithLock;
5006
5074
  /**
5007
5075
  * Starts a new OAuth2 client credentials flow.
5008
5076
  *
@@ -5626,8 +5694,12 @@ export declare interface MedplumInfraConfig {
5626
5694
  loadBalancerLoggingBucket?: string;
5627
5695
  loadBalancerLoggingPrefix?: string;
5628
5696
  loadBalancerAlgorithm?: 'round_robin' | 'least_outstanding_requests' | 'weighted_random';
5697
+ guardDutyMalwareProtectionEnabled?: boolean;
5698
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5629
5699
  clamscanEnabled: boolean;
5700
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5630
5701
  clamscanLoggingBucket: string;
5702
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5631
5703
  clamscanLoggingPrefix: string;
5632
5704
  skipDns?: boolean;
5633
5705
  hostedZoneName?: string;
@@ -5852,9 +5924,13 @@ export declare interface MedplumSourceInfraConfig {
5852
5924
  loadBalancerLoggingBucket?: ValueOrExternalSecret<string>;
5853
5925
  loadBalancerLoggingPrefix?: ValueOrExternalSecret<string>;
5854
5926
  loadBalancerAlgorithm?: ValueOrExternalSecret<'round_robin' | 'least_outstanding_requests' | 'weighted_random'>;
5855
- clamscanEnabled: ValueOrExternalSecret<boolean>;
5856
- clamscanLoggingBucket: ValueOrExternalSecret<string>;
5857
- clamscanLoggingPrefix: ValueOrExternalSecret<string>;
5927
+ guardDutyMalwareProtectionEnabled?: ValueOrExternalSecret<boolean>;
5928
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5929
+ clamscanEnabled?: ValueOrExternalSecret<boolean>;
5930
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5931
+ clamscanLoggingBucket?: ValueOrExternalSecret<string>;
5932
+ /** @deprecated Use guardDutyMalwareProtectionEnabled instead */
5933
+ clamscanLoggingPrefix?: ValueOrExternalSecret<string>;
5858
5934
  skipDns?: ValueOrExternalSecret<boolean>;
5859
5935
  hostedZoneName?: ValueOrExternalSecret<string>;
5860
5936
  wafLogGroupName?: ValueOrExternalSecret<string>;
@@ -6017,7 +6093,7 @@ export declare interface NewUserRequest {
6017
6093
  readonly lastName: string;
6018
6094
  readonly email: string;
6019
6095
  readonly password: string;
6020
- readonly recaptchaToken: string;
6096
+ readonly recaptchaToken?: string;
6021
6097
  readonly recaptchaSiteKey?: string;
6022
6098
  readonly remember?: boolean;
6023
6099
  readonly projectId?: string;
@@ -6086,6 +6162,7 @@ export declare type OAuthClientAssertionType = (typeof OAuthClientAssertionType)
6086
6162
  * Standard identifiers: {@link https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-07#name-grant-types}
6087
6163
  * JWT bearer extension: {@link https://datatracker.ietf.org/doc/html/rfc7523}
6088
6164
  * Token exchange extension: {@link https://datatracker.ietf.org/doc/html/rfc8693}
6165
+ * Pre-authorized code: {@link https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-urnietfparamsoauthgrant-typ}
6089
6166
  */
6090
6167
  export declare const OAuthGrantType: {
6091
6168
  readonly ClientCredentials: "client_credentials";
@@ -6093,6 +6170,7 @@ export declare const OAuthGrantType: {
6093
6170
  readonly RefreshToken: "refresh_token";
6094
6171
  readonly JwtBearer: "urn:ietf:params:oauth:grant-type:jwt-bearer";
6095
6172
  readonly TokenExchange: "urn:ietf:params:oauth:grant-type:token-exchange";
6173
+ readonly PreAuthorizedCode: "urn:ietf:params:oauth:grant-type:pre-authorized_code";
6096
6174
  };
6097
6175
 
6098
6176
  export declare type OAuthGrantType = (typeof OAuthGrantType)[keyof typeof OAuthGrantType];
@@ -6802,6 +6880,8 @@ export declare class ParserBuilder {
6802
6880
 
6803
6881
  export declare function redirect(url: URL): OperationOutcome;
6804
6882
 
6883
+ export declare function redirectOk(url: URL): OperationOutcome;
6884
+
6805
6885
  export declare type ReleaseManifest = {
6806
6886
  tag_name: string;
6807
6887
  assets: {