realtime-avatar 0.27.1 → 0.27.3

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 CHANGED
@@ -86,8 +86,12 @@ if (recording.status === "ready") {
86
86
 
87
87
  Omitted or `"off"` disables recording. `"audio"` records published user and avatar audio;
88
88
  `"video"` records published video without audio; `"audio_video"` keeps both on one media timeline.
89
+ `"participants"` keeps each participant's voice and camera in its own continuous file.
90
+ `"tracks"` saves separate published audio/video tracks and replacement-camera segments;
91
+ use `listRecordings({ sessionId: call.sessionId })` because its initial grant omits recording
92
+ metadata so older installed clients remain compatible.
89
93
  Recording does not enable the microphone, camera, or screen sharing. Only tracks that participants
90
- authorize and publish can be recorded. Camera controls remain a future SDK feature.
94
+ authorize and publish can be recorded.
91
95
 
92
96
  Recordings may finish processing after a call ends. Use `listRecordings({ sessionId })` to find
93
97
  them, or refresh `getRecording(recordingId)` while processing. These methods and
@@ -98,6 +102,15 @@ default); each URL expires at `expiresAt` (up to one hour, capped by retention).
98
102
  access before replaying or seeking after expiry. An expired URL does not delete the file.
99
103
  Treat the URL as private: anyone who has it can play that file until it expires.
100
104
 
105
+ For participant replay, pass every ready `{ recording, url }` asset to `RecordingPlayer`
106
+ from `realtime-avatar/react`. It accepts combined participant MP4s and separate audio/video
107
+ segments, including camera republication. Follow `nextCursor` when listing a session's recordings.
108
+ The optional `mediaStartOffsetMs` preserves a file's first native media timestamp; it delays
109
+ that track's visibility without shifting its playback clock. The player preserves native
110
+ timestamps across gaps and uses the artifact's duration instead of an initially truncated
111
+ WebM container duration. `mediaMutedIntervalsMs` hides a muted camera while keeping media
112
+ clocks and audio running, including audio carried by a legacy combined file.
113
+
101
114
  ## Optional connection history
102
115
 
103
116
  Set `connectionHistory: true` in the server's `startCall` policy when the caller needs a
@@ -220,9 +233,22 @@ the top of that file with the reason for each: two are gaps in the contract itse
220
233
  query parameters for `GET /v1/usage/sessions`, and the transcript webhook body is not in it at
221
234
  all), and the `video` policy types are deliberately not one-to-one with the wire.
222
235
 
236
+ `contentPolicy: "minor-sexual-content-v1"` is an optional **server-owned** call policy,
237
+ serialized as `content_policy`. Omission sends no policy field and preserves existing behavior.
238
+ Unknown values, `null`, and disable values are refused before the request is sent. Set it in
239
+ `startCall` or a proxy `session` callback, never from browser input: the proxy strips both
240
+ `contentPolicy` and `content_policy` from incoming client bodies.
241
+
242
+ Pre-release contract provenance: this field was generated with
243
+ `node scripts/generate-clip-schema.mjs --sync <absolute sibling realtime-policy-platform root>`
244
+ from `packages/realtime-avatar-contracts/openapi/realtime-avatar.openapi.json`, then
245
+ `npm run spec:types`. The checked-in snapshot is that reviewed platform artifact, not the
246
+ older deployed spec. **Before release, deploy the platform and regenerate with `npm run spec`
247
+ against its deployed OpenAPI, then run `npm run check`.** Do not hand-edit the generated enum.
248
+
223
249
  ```ts
224
250
  // calls
225
- rta.startCall({ avatarId, mode?, instructions?, context?, maxSeconds?, video?, recording?, connectionHistory?, transcript?, metadata?, llm? })
251
+ rta.startCall({ avatarId, mode?, instructions?, context?, maxSeconds?, video?, recording?, connectionHistory?, contentPolicy?, transcript?, metadata?, llm? })
226
252
  rta.endCall(sessionId, { reason? }) // free an abandoned call's slot; idempotent, never throws
227
253
  rta.leaveQueue(queueTicketId, { reason? }) // give up a queued call's place in line; idempotent, never throws
228
254
 
@@ -1,4 +1,4 @@
1
- import { sessionModeSchema, liveKitSessionReleaseReasonSchema, RealtimeAvatar, ROUTE_TIMEOUT_MS, isQueued, RealtimeAvatarHttpError, RealtimeAvatarError } from './chunk-4IEGR75H.js';
1
+ import { sessionModeSchema, liveKitSessionReleaseReasonSchema, RealtimeAvatar, ROUTE_TIMEOUT_MS, isQueued, RealtimeAvatarHttpError, RealtimeAvatarError } from './chunk-W4DGBG4Z.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  // ../http-client/src/generated/error-semantics.ts
@@ -239,13 +239,17 @@ var schema26 = z.strictObject({
239
239
  var clipLibraryResponseSchema = schema24;
240
240
  var clipLibraryUpdateSchema = schema26;
241
241
  var RECORDED_MEDIA_MODES = ["audio", "video", "audio_video"];
242
- var recordingModeSchema = z.enum(["off", ...RECORDED_MEDIA_MODES, "participants"]).describe("Server-owned recording policy; omitted means off. Legacy audio includes user and avatar audio. participants saves one continuous audio/video file per participant, without mixing their voices.");
242
+ var recordingModeSchema = z.enum(["off", ...RECORDED_MEDIA_MODES, "participants", "tracks"]).describe("Server-owned recording policy; omitted means off. Legacy audio includes user and avatar audio. participants saves one continuous audio/video file per participant, without mixing their voices. tracks saves each published participant audio/video track separately; list recordings by session after capture.");
243
243
  var RECORDING_STATUSES = ["pending", "recording", "processing", "ready", "failed", "expired"];
244
244
  z.enum(RECORDING_STATUSES);
245
245
  var recordingParticipantSchema = z.object({
246
246
  participantIdentity: z.string().min(1).max(160),
247
247
  role: z.enum(["user", "avatar"])
248
248
  }).strict();
249
+ var recordingMutedIntervalSchema = z.object({
250
+ startMs: z.number().int().min(0),
251
+ endMs: z.number().int().positive()
252
+ }).strict().refine((interval) => interval.endMs > interval.startMs, "Muted interval must end after it starts");
249
253
  var recordingMetadataSchema = z.object({
250
254
  sessionId: z.string().min(1),
251
255
  recordingId: z.string().min(1),
@@ -254,13 +258,15 @@ var recordingMetadataSchema = z.object({
254
258
  retainedUntil: z.string().datetime({ offset: true }),
255
259
  participant: recordingParticipantSchema.optional(),
256
260
  mediaStartedAt: z.string().datetime({ offset: true }).optional(),
257
- mediaEndedAt: z.string().datetime({ offset: true }).optional()
261
+ mediaEndedAt: z.string().datetime({ offset: true }).optional(),
262
+ mediaStartOffsetMs: z.number().int().min(0).optional().describe("First playable native media timestamp relative to mediaStartedAt. Playback retains this offset; it does not reset the file clock to zero."),
263
+ mediaMutedIntervalsMs: z.array(recordingMutedIntervalSchema).optional().describe("Intervals of hidden camera video relative to mediaStartedAt, using native media timestamps. Audio playback continues through these intervals.")
258
264
  });
259
265
  var recordingArtifactSchema = z.discriminatedUnion("status", [
260
266
  recordingMetadataSchema.extend({ status: z.enum(["pending", "recording", "processing", "expired"]) }).strict(),
261
267
  recordingMetadataSchema.extend({
262
268
  status: z.literal("ready"),
263
- mediaType: z.enum(["audio/mp4", "video/mp4"]),
269
+ mediaType: z.enum(["audio/mp4", "video/mp4", "audio/ogg", "video/webm"]),
264
270
  sizeBytes: z.number().int().positive(),
265
271
  durationMs: z.number().int().nonnegative().nullable()
266
272
  }).strict(),
@@ -328,6 +334,8 @@ function transcriptionToWire(input) {
328
334
  ...options.customVocabulary !== void 0 ? { custom_vocabulary: options.customVocabulary } : {}
329
335
  };
330
336
  }
337
+ var schema03 = z.enum(["minor-sexual-content-v1"]);
338
+ var contentPolicySchema = schema03;
331
339
 
332
340
  // ../client/src/wire.ts
333
341
  var DEFAULT_AVATAR_ID = "maria";
@@ -494,7 +502,8 @@ z.object({
494
502
  support_edits: sessionSupportEditsSchema.optional(),
495
503
  transcript_webhook: transcriptWebhookSchema.optional(),
496
504
  client_metadata: clientMetadataSchema.optional(),
497
- connection_history: z.boolean().optional()
505
+ connection_history: z.boolean().optional(),
506
+ content_policy: contentPolicySchema.optional()
498
507
  }).strict().superRefine((value, ctx) => {
499
508
  if (value.support_edits && value.render_backend === "generative") {
500
509
  ctx.addIssue({
@@ -562,7 +571,8 @@ z.object({
562
571
  supportEdits: sessionSupportEditsSchema.optional(),
563
572
  transcriptWebhook: transcriptWebhookSchema.optional(),
564
573
  clientMetadata: clientMetadataSchema.optional(),
565
- connectionHistory: z.boolean().optional()
574
+ connectionHistory: z.boolean().optional(),
575
+ contentPolicy: contentPolicySchema.optional()
566
576
  }).strict();
567
577
  var liveKitSessionGrantSchema = z.object({
568
578
  recording: recordingArtifactSchema.optional(),
@@ -665,7 +675,7 @@ var liveKitSessionReleaseReasonSchema = z.enum([
665
675
 
666
676
  // ../http-client/src/client.ts
667
677
  var DEFAULT_BASE_URL = "https://realtimeavatar.ai/api/v1";
668
- var SDK_VERSION = "0.27.1";
678
+ var SDK_VERSION = "0.27.3";
669
679
  var RealtimeAvatar = class {
670
680
  #apiKey;
671
681
  #baseUrl;
@@ -716,6 +726,7 @@ var RealtimeAvatar = class {
716
726
  if (options.metadata !== void 0) body.client_metadata = options.metadata;
717
727
  if (options.recording !== void 0) body.recording = recordingModeSchema.parse(options.recording);
718
728
  if (options.connectionHistory !== void 0) body.connection_history = options.connectionHistory;
729
+ if (options.contentPolicy !== void 0) body.content_policy = contentPolicySchema.parse(options.contentPolicy);
719
730
  if (options.clientTools) body.capabilities = ["client_tools"];
720
731
  if (options.llm !== void 0) {
721
732
  const { backend, model, baseUrl, token } = options.llm;
package/dist/express.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ProxyConfig } from './types-JtCwa0Ip.js';
2
- import './types-6MUqx800.js';
1
+ import { P as ProxyConfig } from './types-lgS4Z9rd.js';
2
+ import './types-kgmS7ECd.js';
3
3
  import 'zod';
4
4
 
5
5
  type Expressish = {
package/dist/express.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createProxyHandler } from './chunk-DOHZ365B.js';
2
- import './chunk-4IEGR75H.js';
1
+ import { createProxyHandler } from './chunk-QBOIOZ3O.js';
2
+ import './chunk-W4DGBG4Z.js';
3
3
  import './chunk-MCIXU6XP.js';
4
4
 
5
5
  // ../proxy/src/express.ts
package/dist/hono.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ProxyConfig } from './types-JtCwa0Ip.js';
2
- import './types-6MUqx800.js';
1
+ import { P as ProxyConfig } from './types-lgS4Z9rd.js';
2
+ import './types-kgmS7ECd.js';
3
3
  import 'zod';
4
4
 
5
5
  /**
package/dist/hono.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createProxyHandler } from './chunk-DOHZ365B.js';
2
- import './chunk-4IEGR75H.js';
1
+ import { createProxyHandler } from './chunk-QBOIOZ3O.js';
2
+ import './chunk-W4DGBG4Z.js';
3
3
  import './chunk-MCIXU6XP.js';
4
4
 
5
5
  // ../proxy/src/hono.ts
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { a as CallPolicy, C as CallMode, S as StartCallResult, E as EndCallOptions, A as Avatar, b as AvatarUpdate, c as AvatarSourceSwap, d as ClipLibraryDeclaration, e as ClipLibraryUpdate, L as LoopRedirect, f as ClipLibrary, g as AssetKind, h as Asset, i as ListSessionsOptions, U as UsageSessionPage, j as UsageSession, k as ListRecordingsQuery, l as ListRecordingsResponse, R as RecordingArtifact, m as RecordingAccessResponse, n as CreditBalance, T as TranscriptPayload } from './types-6MUqx800.js';
2
- export { o as AvatarClip, p as CallConnection, q as CallQueued, r as ClipDeclaration, s as ClipLibraryPlan, t as ClipSource, u as ContextMessage, v as EndCallReason, w as ExternalLlm, x as RecordingArtifactStatus, y as RecordingMode, V as VideoPolicy, z as isQueued, B as listRecordingsResponseSchema, D as recordingAccessResponseSchema, F as recordingArtifactSchema, G as recordingModeSchema } from './types-6MUqx800.js';
1
+ import { a as CallPolicy, C as CallMode, S as StartCallResult, E as EndCallOptions, A as Avatar, b as AvatarUpdate, c as AvatarSourceSwap, d as ClipLibraryDeclaration, e as ClipLibraryUpdate, L as LoopRedirect, f as ClipLibrary, g as AssetKind, h as Asset, i as ListSessionsOptions, U as UsageSessionPage, j as UsageSession, k as ListRecordingsQuery, l as ListRecordingsResponse, R as RecordingArtifact, m as RecordingAccessResponse, n as CreditBalance, T as TranscriptPayload } from './types-kgmS7ECd.js';
2
+ export { o as AvatarClip, p as CallConnection, q as CallQueued, r as ClipDeclaration, s as ClipLibraryPlan, t as ClipSource, u as ContextMessage, v as EndCallReason, w as ExternalLlm, x as RecordingArtifactStatus, y as RecordingMode, V as VideoPolicy, z as isQueued, B as listRecordingsResponseSchema, D as recordingAccessResponseSchema, F as recordingArtifactSchema, G as recordingModeSchema } from './types-kgmS7ECd.js';
3
3
  import { ConnectionHistoryResponse } from './connection-history.js';
4
4
  import { z } from 'zod';
5
5
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { RealtimeAvatar, RealtimeAvatarError, RealtimeAvatarHttpError, clipLibraryDeclarationSchema, isQueued, listRecordingsResponseSchema, recordingAccessResponseSchema, recordingArtifactSchema, recordingModeSchema, verifyTranscript } from './chunk-4IEGR75H.js';
1
+ export { RealtimeAvatar, RealtimeAvatarError, RealtimeAvatarHttpError, clipLibraryDeclarationSchema, isQueued, listRecordingsResponseSchema, recordingAccessResponseSchema, recordingArtifactSchema, recordingModeSchema, verifyTranscript } from './chunk-W4DGBG4Z.js';
2
2
  import './chunk-MCIXU6XP.js';
package/dist/nextjs.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { P as ProxyConfig } from './types-JtCwa0Ip.js';
2
- import './types-6MUqx800.js';
1
+ import { P as ProxyConfig } from './types-lgS4Z9rd.js';
2
+ import './types-kgmS7ECd.js';
3
3
  import 'zod';
4
4
 
5
5
  /**
package/dist/nextjs.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createProxyHandler } from './chunk-DOHZ365B.js';
2
- import './chunk-4IEGR75H.js';
1
+ import { createProxyHandler } from './chunk-QBOIOZ3O.js';
2
+ import './chunk-W4DGBG4Z.js';
3
3
  import './chunk-MCIXU6XP.js';
4
4
 
5
5
  // ../proxy/src/nextjs.ts
@@ -242,6 +242,9 @@ declare const liveKitSessionRequestSchema: z.ZodObject<{
242
242
  }, z.core.$strict>>;
243
243
  clientMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
244
244
  connectionHistory: z.ZodOptional<z.ZodBoolean>;
245
+ contentPolicy: z.ZodOptional<z.ZodEnum<{
246
+ "minor-sexual-content-v1": "minor-sexual-content-v1";
247
+ }>>;
245
248
  }, z.core.$strict>;
246
249
  declare const liveKitSessionGrantSchema: z.ZodObject<{
247
250
  recording: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -263,6 +266,11 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
263
266
  }, z.core.$strict>>;
264
267
  mediaStartedAt: z.ZodOptional<z.ZodString>;
265
268
  mediaEndedAt: z.ZodOptional<z.ZodString>;
269
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
270
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
271
+ startMs: z.ZodNumber;
272
+ endMs: z.ZodNumber;
273
+ }, z.core.$strict>>>;
266
274
  status: z.ZodEnum<{
267
275
  pending: "pending";
268
276
  recording: "recording";
@@ -288,10 +296,17 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
288
296
  }, z.core.$strict>>;
289
297
  mediaStartedAt: z.ZodOptional<z.ZodString>;
290
298
  mediaEndedAt: z.ZodOptional<z.ZodString>;
299
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
300
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
301
+ startMs: z.ZodNumber;
302
+ endMs: z.ZodNumber;
303
+ }, z.core.$strict>>>;
291
304
  status: z.ZodLiteral<"ready">;
292
305
  mediaType: z.ZodEnum<{
293
306
  "audio/mp4": "audio/mp4";
294
307
  "video/mp4": "video/mp4";
308
+ "audio/ogg": "audio/ogg";
309
+ "video/webm": "video/webm";
295
310
  }>;
296
311
  sizeBytes: z.ZodNumber;
297
312
  durationMs: z.ZodNullable<z.ZodNumber>;
@@ -314,6 +329,11 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
314
329
  }, z.core.$strict>>;
315
330
  mediaStartedAt: z.ZodOptional<z.ZodString>;
316
331
  mediaEndedAt: z.ZodOptional<z.ZodString>;
332
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
333
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
334
+ startMs: z.ZodNumber;
335
+ endMs: z.ZodNumber;
336
+ }, z.core.$strict>>>;
317
337
  status: z.ZodLiteral<"failed">;
318
338
  errorCode: z.ZodEnum<{
319
339
  recording_failed: "recording_failed";
@@ -326,6 +346,7 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
326
346
  audio_video: "audio_video";
327
347
  off: "off";
328
348
  participants: "participants";
349
+ tracks: "tracks";
329
350
  }>>;
330
351
  recordings: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
331
352
  sessionId: z.ZodString;
@@ -346,6 +367,11 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
346
367
  }, z.core.$strict>>;
347
368
  mediaStartedAt: z.ZodOptional<z.ZodString>;
348
369
  mediaEndedAt: z.ZodOptional<z.ZodString>;
370
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
371
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
372
+ startMs: z.ZodNumber;
373
+ endMs: z.ZodNumber;
374
+ }, z.core.$strict>>>;
349
375
  status: z.ZodEnum<{
350
376
  pending: "pending";
351
377
  recording: "recording";
@@ -371,10 +397,17 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
371
397
  }, z.core.$strict>>;
372
398
  mediaStartedAt: z.ZodOptional<z.ZodString>;
373
399
  mediaEndedAt: z.ZodOptional<z.ZodString>;
400
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
401
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
402
+ startMs: z.ZodNumber;
403
+ endMs: z.ZodNumber;
404
+ }, z.core.$strict>>>;
374
405
  status: z.ZodLiteral<"ready">;
375
406
  mediaType: z.ZodEnum<{
376
407
  "audio/mp4": "audio/mp4";
377
408
  "video/mp4": "video/mp4";
409
+ "audio/ogg": "audio/ogg";
410
+ "video/webm": "video/webm";
378
411
  }>;
379
412
  sizeBytes: z.ZodNumber;
380
413
  durationMs: z.ZodNullable<z.ZodNumber>;
@@ -397,6 +430,11 @@ declare const liveKitSessionGrantSchema: z.ZodObject<{
397
430
  }, z.core.$strict>>;
398
431
  mediaStartedAt: z.ZodOptional<z.ZodString>;
399
432
  mediaEndedAt: z.ZodOptional<z.ZodString>;
433
+ mediaStartOffsetMs: z.ZodOptional<z.ZodNumber>;
434
+ mediaMutedIntervalsMs: z.ZodOptional<z.ZodArray<z.ZodObject<{
435
+ startMs: z.ZodNumber;
436
+ endMs: z.ZodNumber;
437
+ }, z.core.$strict>>>;
400
438
  status: z.ZodLiteral<"failed">;
401
439
  errorCode: z.ZodEnum<{
402
440
  recording_failed: "recording_failed";
@@ -1,7 +1,7 @@
1
1
  import { LiveKitRoomProps } from '@livekit/react-native';
2
2
  export { AudioSession, VideoTrack, VideoTrackProps, registerGlobals } from '@livekit/react-native';
3
- import { L as LiveKitSessionGrant, A as AvatarVideoFit } from './proxy-client-Cs2azqD1.js';
4
- export { a as AdaptivePlayoutController, b as AdaptivePlayoutDecision, c as AdaptivePlayoutOptions, d as AdaptivePlayoutSample, e as ApproachingEndEvent, f as ApproachingEndReason, g as AvatarConnectionDetails, h as AvatarSessionClient, B as BehaviorSnapshot, C as CallTranscript, i as CallTranscriptSegment, j as CartesiaTtsModel, k as ClipResult, l as ClosingTurnResult, m as CreditsLowEvent, D as DEFAULT_APPROACHING_END_LEAD_SECONDS, n as DEFAULT_CREDITS_LOW_LEAD_SECONDS, o as DEFAULT_GOVERNOR_CONFIG, p as DEFAULT_GRACE_CEILING_SECONDS, q as DEFAULT_GRACE_WINDOW_LEAD_SECONDS, r as DEFAULT_IDLE_SECONDS, s as DEFAULT_IDLE_WARN_LEAD_SECONDS, t as DEFAULT_READY_TIMEOUT_SECONDS, u as DEFAULT_TURN_TIMEOUT_SECONDS, v as DeclaredInputSource, E as EndReason, w as EndedEvent, x as ExtendResult, F as FishTtsModel, y as FreezeReadingFn, G as Governor, z as GovernorAction, H as GovernorConfig, I as GovernorSignal, J as GovernorState, K as GraceWindowClosedEvent, M as GraceWindowOpenEvent, N as GraceWindowState, O as IdleWarningEvent, P as InboundRtpCursor, Q as InboundRtpReading, R as KnownBehaviorState, S as LLMProvider, T as LLMSelection, U as LiveKitAvatarGrantState, V as LiveKitAvatarGrantStatus, W as LiveKitCapacityState, X as LiveKitConnectionStatus, Y as LiveKitSessionRequest, Z as LiveKitSessionStartResult, _ as MAX_RECONNECT_ATTEMPTS, $ as MAX_SESSION_INSTRUCTIONS_CHARS, a0 as ProxyClientOptions, a1 as QualityCap, a2 as RECONNECT_BACKOFF_MS, a3 as RealtimeAvatarRequestOptions, a4 as RealtimeSessionApi, a5 as RealtimeSessionMedia, a6 as RealtimeSessionRoomSinks, a7 as ReconnectPolicy, a8 as ReconnectingEvent, a9 as RecoveryState, aa as RetryStep, ab as SendTurnOptions, ac as SessionBehavior, ad as SessionClip, ae as SessionClocks, af as SessionEndReason, ag as SessionLifecycleApi, ah as SessionLifecyclePhase, ai as SessionLifecyclePhaseKind, aj as SessionLifecycleRoomBridge, ak as SessionLifecycleRoomBridgeProps, al as SessionReadinessFailure, am as SurfaceLayers, an as TranscriptSender, ao as TranscriptSenderOptions, ap as TurnState, aq as TurnTimeoutEvent, ar as UseAvatarQualityGovernorInput, as as UseLiveKitAvatarGrantInput, at as UseRealtimeSessionInput, au as UseSessionLifecycleInput, av as VoiceSpec, aw as VoiceSpecInput, ax as capacityErrorFromBusy, ay as capacityStateFromGrant, az as createProxyClient, aA as isNativeLiveTrackSubscribed, aB as knownBehaviorStates, aC as mapTurnState, aD as readInboundRtp, aE as sessionBehaviorSchema, aF as sessionClipSchema, aG as splitCallTranscript, aH as useAvatarAdaptivePlayoutDelay, aI as useAvatarCamera, aJ as useAvatarPlayoutDelay, aK as useAvatarQualityGovernor, aL as useCallTranscript, aM as useLiveKitAvatarGrant, aN as useLiveTrackProducing, aO as useMicLease, aP as useRealtimeSession, aQ as useReleaseMicLeaseOnTrackEnded, aR as useSessionLifecycle } from './proxy-client-Cs2azqD1.js';
3
+ import { L as LiveKitSessionGrant, A as AvatarVideoFit } from './proxy-client-BAY77sJZ.js';
4
+ export { a as AdaptivePlayoutController, b as AdaptivePlayoutDecision, c as AdaptivePlayoutOptions, d as AdaptivePlayoutSample, e as ApproachingEndEvent, f as ApproachingEndReason, g as AvatarConnectionDetails, h as AvatarSessionClient, B as BehaviorSnapshot, C as CallTranscript, i as CallTranscriptSegment, j as CartesiaTtsModel, k as ClipResult, l as ClosingTurnResult, m as CreditsLowEvent, D as DEFAULT_APPROACHING_END_LEAD_SECONDS, n as DEFAULT_CREDITS_LOW_LEAD_SECONDS, o as DEFAULT_GOVERNOR_CONFIG, p as DEFAULT_GRACE_CEILING_SECONDS, q as DEFAULT_GRACE_WINDOW_LEAD_SECONDS, r as DEFAULT_IDLE_SECONDS, s as DEFAULT_IDLE_WARN_LEAD_SECONDS, t as DEFAULT_READY_TIMEOUT_SECONDS, u as DEFAULT_TURN_TIMEOUT_SECONDS, v as DeclaredInputSource, E as EndReason, w as EndedEvent, x as ExtendResult, F as FishTtsModel, y as FreezeReadingFn, G as Governor, z as GovernorAction, H as GovernorConfig, I as GovernorSignal, J as GovernorState, K as GraceWindowClosedEvent, M as GraceWindowOpenEvent, N as GraceWindowState, O as IdleWarningEvent, P as InboundRtpCursor, Q as InboundRtpReading, R as KnownBehaviorState, S as LLMProvider, T as LLMSelection, U as LiveKitAvatarGrantState, V as LiveKitAvatarGrantStatus, W as LiveKitCapacityState, X as LiveKitConnectionStatus, Y as LiveKitSessionRequest, Z as LiveKitSessionStartResult, _ as MAX_RECONNECT_ATTEMPTS, $ as MAX_SESSION_INSTRUCTIONS_CHARS, a0 as ProxyClientOptions, a1 as QualityCap, a2 as RECONNECT_BACKOFF_MS, a3 as RealtimeAvatarRequestOptions, a4 as RealtimeSessionApi, a5 as RealtimeSessionMedia, a6 as RealtimeSessionRoomSinks, a7 as ReconnectPolicy, a8 as ReconnectingEvent, a9 as RecoveryState, aa as RetryStep, ab as SendTurnOptions, ac as SessionBehavior, ad as SessionClip, ae as SessionClocks, af as SessionEndReason, ag as SessionLifecycleApi, ah as SessionLifecyclePhase, ai as SessionLifecyclePhaseKind, aj as SessionLifecycleRoomBridge, ak as SessionLifecycleRoomBridgeProps, al as SessionReadinessFailure, am as SurfaceLayers, an as TranscriptSender, ao as TranscriptSenderOptions, ap as TurnState, aq as TurnTimeoutEvent, ar as UseAvatarQualityGovernorInput, as as UseLiveKitAvatarGrantInput, at as UseRealtimeSessionInput, au as UseSessionLifecycleInput, av as VoiceSpec, aw as VoiceSpecInput, ax as capacityErrorFromBusy, ay as capacityStateFromGrant, az as createProxyClient, aA as isNativeLiveTrackSubscribed, aB as knownBehaviorStates, aC as mapTurnState, aD as readInboundRtp, aE as sessionBehaviorSchema, aF as sessionClipSchema, aG as splitCallTranscript, aH as useAvatarAdaptivePlayoutDelay, aI as useAvatarCamera, aJ as useAvatarPlayoutDelay, aK as useAvatarQualityGovernor, aL as useCallTranscript, aM as useLiveKitAvatarGrant, aN as useLiveTrackProducing, aO as useMicLease, aP as useRealtimeSession, aQ as useReleaseMicLeaseOnTrackEnded, aR as useSessionLifecycle } from './proxy-client-BAY77sJZ.js';
5
5
  import { ReactNode, ReactElement } from 'react';
6
6
  import { StyleProp, ViewStyle } from 'react-native';
7
7
  export { useChat, useConnectionState, useLocalParticipant, useRoomContext, useTrackToggle, useTranscriptions, useVoiceAssistant } from '@livekit/components-react';
@@ -1630,13 +1630,17 @@ var styles = StyleSheet.create({
1630
1630
  }
1631
1631
  });
1632
1632
  var RECORDED_MEDIA_MODES = ["audio", "video", "audio_video"];
1633
- var recordingModeSchema = z.enum(["off", ...RECORDED_MEDIA_MODES, "participants"]).describe("Server-owned recording policy; omitted means off. Legacy audio includes user and avatar audio. participants saves one continuous audio/video file per participant, without mixing their voices.");
1633
+ var recordingModeSchema = z.enum(["off", ...RECORDED_MEDIA_MODES, "participants", "tracks"]).describe("Server-owned recording policy; omitted means off. Legacy audio includes user and avatar audio. participants saves one continuous audio/video file per participant, without mixing their voices. tracks saves each published participant audio/video track separately; list recordings by session after capture.");
1634
1634
  var RECORDING_STATUSES = ["pending", "recording", "processing", "ready", "failed", "expired"];
1635
1635
  z.enum(RECORDING_STATUSES);
1636
1636
  var recordingParticipantSchema = z.object({
1637
1637
  participantIdentity: z.string().min(1).max(160),
1638
1638
  role: z.enum(["user", "avatar"])
1639
1639
  }).strict();
1640
+ var recordingMutedIntervalSchema = z.object({
1641
+ startMs: z.number().int().min(0),
1642
+ endMs: z.number().int().positive()
1643
+ }).strict().refine((interval) => interval.endMs > interval.startMs, "Muted interval must end after it starts");
1640
1644
  var recordingMetadataSchema = z.object({
1641
1645
  sessionId: z.string().min(1),
1642
1646
  recordingId: z.string().min(1),
@@ -1645,13 +1649,15 @@ var recordingMetadataSchema = z.object({
1645
1649
  retainedUntil: z.string().datetime({ offset: true }),
1646
1650
  participant: recordingParticipantSchema.optional(),
1647
1651
  mediaStartedAt: z.string().datetime({ offset: true }).optional(),
1648
- mediaEndedAt: z.string().datetime({ offset: true }).optional()
1652
+ mediaEndedAt: z.string().datetime({ offset: true }).optional(),
1653
+ mediaStartOffsetMs: z.number().int().min(0).optional().describe("First playable native media timestamp relative to mediaStartedAt. Playback retains this offset; it does not reset the file clock to zero."),
1654
+ mediaMutedIntervalsMs: z.array(recordingMutedIntervalSchema).optional().describe("Intervals of hidden camera video relative to mediaStartedAt, using native media timestamps. Audio playback continues through these intervals.")
1649
1655
  });
1650
1656
  var recordingArtifactSchema = z.discriminatedUnion("status", [
1651
1657
  recordingMetadataSchema.extend({ status: z.enum(["pending", "recording", "processing", "expired"]) }).strict(),
1652
1658
  recordingMetadataSchema.extend({
1653
1659
  status: z.literal("ready"),
1654
- mediaType: z.enum(["audio/mp4", "video/mp4"]),
1660
+ mediaType: z.enum(["audio/mp4", "video/mp4", "audio/ogg", "video/webm"]),
1655
1661
  sizeBytes: z.number().int().positive(),
1656
1662
  durationMs: z.number().int().nonnegative().nullable()
1657
1663
  }).strict(),
@@ -1714,6 +1720,8 @@ var transcriptionOptionsSchema = z.object({
1714
1720
  languageCodes: transcriptionWireSchema.shape.language_codes,
1715
1721
  customVocabulary: transcriptionWireSchema.shape.custom_vocabulary
1716
1722
  }).strict();
1723
+ var schema02 = z.enum(["minor-sexual-content-v1"]);
1724
+ var contentPolicySchema = schema02;
1717
1725
 
1718
1726
  // ../client/src/wire.ts
1719
1727
  var DEFAULT_AVATAR_ID = "maria";
@@ -1880,7 +1888,8 @@ z.object({
1880
1888
  support_edits: sessionSupportEditsSchema.optional(),
1881
1889
  transcript_webhook: transcriptWebhookSchema.optional(),
1882
1890
  client_metadata: clientMetadataSchema.optional(),
1883
- connection_history: z.boolean().optional()
1891
+ connection_history: z.boolean().optional(),
1892
+ content_policy: contentPolicySchema.optional()
1884
1893
  }).strict().superRefine((value, ctx) => {
1885
1894
  if (value.support_edits && value.render_backend === "generative") {
1886
1895
  ctx.addIssue({
@@ -1948,7 +1957,8 @@ z.object({
1948
1957
  supportEdits: sessionSupportEditsSchema.optional(),
1949
1958
  transcriptWebhook: transcriptWebhookSchema.optional(),
1950
1959
  clientMetadata: clientMetadataSchema.optional(),
1951
- connectionHistory: z.boolean().optional()
1960
+ connectionHistory: z.boolean().optional(),
1961
+ contentPolicy: contentPolicySchema.optional()
1952
1962
  }).strict();
1953
1963
  z.object({
1954
1964
  recording: recordingArtifactSchema.optional(),
package/dist/react.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { ToolRegistration, RegisteredTool } from './tools.js';
2
- import { ak as SessionLifecycleRoomBridgeProps, h as AvatarSessionClient, A as AvatarVideoFit, aS as CallMicrophone, aT as CallAudioPlayback, aU as CallMicrophoneProblem } from './proxy-client-Cs2azqD1.js';
3
- export { a as AdaptivePlayoutController, b as AdaptivePlayoutDecision, c as AdaptivePlayoutOptions, d as AdaptivePlayoutSample, e as ApproachingEndEvent, f as ApproachingEndReason, g as AvatarConnectionDetails, aV as AvatarVideoSurface, aW as AvatarVideoSurfaceProps, B as BehaviorSnapshot, C as CallTranscript, i as CallTranscriptSegment, j as CartesiaTtsModel, k as ClipResult, l as ClosingTurnResult, m as CreditsLowEvent, D as DEFAULT_APPROACHING_END_LEAD_SECONDS, n as DEFAULT_CREDITS_LOW_LEAD_SECONDS, o as DEFAULT_GOVERNOR_CONFIG, p as DEFAULT_GRACE_CEILING_SECONDS, q as DEFAULT_GRACE_WINDOW_LEAD_SECONDS, r as DEFAULT_IDLE_SECONDS, s as DEFAULT_IDLE_WARN_LEAD_SECONDS, t as DEFAULT_READY_TIMEOUT_SECONDS, u as DEFAULT_TURN_TIMEOUT_SECONDS, v as DeclaredInputSource, E as EndReason, w as EndedEvent, x as ExtendResult, F as FishTtsModel, y as FreezeReadingFn, G as Governor, z as GovernorAction, H as GovernorConfig, I as GovernorSignal, J as GovernorState, K as GraceWindowClosedEvent, M as GraceWindowOpenEvent, N as GraceWindowState, O as IdleWarningEvent, P as InboundRtpCursor, Q as InboundRtpReading, R as KnownBehaviorState, S as LLMProvider, T as LLMSelection, U as LiveKitAvatarGrantState, V as LiveKitAvatarGrantStatus, W as LiveKitCapacityState, X as LiveKitConnectionStatus, Y as LiveKitSessionRequest, Z as LiveKitSessionStartResult, aX as LivePlaybackKeeper, _ as MAX_RECONNECT_ATTEMPTS, $ as MAX_SESSION_INSTRUCTIONS_CHARS, aY as MIC_LEASE_ENDED_TIMEOUT_MS, aZ as MicLease, a_ as NETWORK_QUALITY_POLICY, a$ as NetworkQualityStatus, b0 as PlayableVideoElement, a0 as ProxyClientOptions, a1 as QualityCap, a2 as RECONNECT_BACKOFF_MS, b1 as RealtimeAvatarCapacityError, b2 as RealtimeAvatarLiveKitRoom, b3 as RealtimeAvatarLiveKitRoomProps, a3 as RealtimeAvatarRequestOptions, a4 as RealtimeSessionApi, a5 as RealtimeSessionMedia, a6 as RealtimeSessionRoomSinks, a7 as ReconnectPolicy, a8 as ReconnectingEvent, a9 as RecoveryState, aa as RetryStep, ab as SendTurnOptions, ac as SessionBehavior, ad as SessionClip, ae as SessionClocks, af as SessionEndReason, ag as SessionLifecycleApi, ah as SessionLifecyclePhase, ai as SessionLifecyclePhaseKind, aj as SessionLifecycleRoomBridge, al as SessionReadinessFailure, am as SurfaceLayers, an as TranscriptSender, ao as TranscriptSenderOptions, ap as TurnState, aq as TurnTimeoutEvent, ar as UseAvatarQualityGovernorInput, as as UseLiveKitAvatarGrantInput, at as UseRealtimeSessionInput, au as UseSessionLifecycleInput, av as VoiceSpec, aw as VoiceSpecInput, ax as capacityErrorFromBusy, ay as capacityStateFromGrant, az as createProxyClient, aB as knownBehaviorStates, aC as mapTurnState, aD as readInboundRtp, aE as sessionBehaviorSchema, aF as sessionClipSchema, b4 as shouldReplayPendingTurn, aG as splitCallTranscript, aH as useAvatarAdaptivePlayoutDelay, aI as useAvatarCamera, aJ as useAvatarPlayoutDelay, aK as useAvatarQualityGovernor, aL as useCallTranscript, aM as useLiveKitAvatarGrant, aO as useMicLease, aP as useRealtimeSession, aQ as useReleaseMicLeaseOnTrackEnded, aR as useSessionLifecycle } from './proxy-client-Cs2azqD1.js';
2
+ import { ak as SessionLifecycleRoomBridgeProps, h as AvatarSessionClient, A as AvatarVideoFit, aS as CallMicrophone, aT as CallAudioPlayback, aU as CallMicrophoneProblem } from './proxy-client-BAY77sJZ.js';
3
+ export { a as AdaptivePlayoutController, b as AdaptivePlayoutDecision, c as AdaptivePlayoutOptions, d as AdaptivePlayoutSample, e as ApproachingEndEvent, f as ApproachingEndReason, g as AvatarConnectionDetails, aV as AvatarVideoSurface, aW as AvatarVideoSurfaceProps, B as BehaviorSnapshot, C as CallTranscript, i as CallTranscriptSegment, j as CartesiaTtsModel, k as ClipResult, l as ClosingTurnResult, m as CreditsLowEvent, D as DEFAULT_APPROACHING_END_LEAD_SECONDS, n as DEFAULT_CREDITS_LOW_LEAD_SECONDS, o as DEFAULT_GOVERNOR_CONFIG, p as DEFAULT_GRACE_CEILING_SECONDS, q as DEFAULT_GRACE_WINDOW_LEAD_SECONDS, r as DEFAULT_IDLE_SECONDS, s as DEFAULT_IDLE_WARN_LEAD_SECONDS, t as DEFAULT_READY_TIMEOUT_SECONDS, u as DEFAULT_TURN_TIMEOUT_SECONDS, v as DeclaredInputSource, E as EndReason, w as EndedEvent, x as ExtendResult, F as FishTtsModel, y as FreezeReadingFn, G as Governor, z as GovernorAction, H as GovernorConfig, I as GovernorSignal, J as GovernorState, K as GraceWindowClosedEvent, M as GraceWindowOpenEvent, N as GraceWindowState, O as IdleWarningEvent, P as InboundRtpCursor, Q as InboundRtpReading, R as KnownBehaviorState, S as LLMProvider, T as LLMSelection, U as LiveKitAvatarGrantState, V as LiveKitAvatarGrantStatus, W as LiveKitCapacityState, X as LiveKitConnectionStatus, Y as LiveKitSessionRequest, Z as LiveKitSessionStartResult, aX as LivePlaybackKeeper, _ as MAX_RECONNECT_ATTEMPTS, $ as MAX_SESSION_INSTRUCTIONS_CHARS, aY as MIC_LEASE_ENDED_TIMEOUT_MS, aZ as MicLease, a_ as NETWORK_QUALITY_POLICY, a$ as NetworkQualityStatus, b0 as PlayableVideoElement, a0 as ProxyClientOptions, a1 as QualityCap, a2 as RECONNECT_BACKOFF_MS, b1 as RealtimeAvatarCapacityError, b2 as RealtimeAvatarLiveKitRoom, b3 as RealtimeAvatarLiveKitRoomProps, a3 as RealtimeAvatarRequestOptions, a4 as RealtimeSessionApi, a5 as RealtimeSessionMedia, a6 as RealtimeSessionRoomSinks, a7 as ReconnectPolicy, a8 as ReconnectingEvent, a9 as RecoveryState, aa as RetryStep, ab as SendTurnOptions, ac as SessionBehavior, ad as SessionClip, ae as SessionClocks, af as SessionEndReason, ag as SessionLifecycleApi, ah as SessionLifecyclePhase, ai as SessionLifecyclePhaseKind, aj as SessionLifecycleRoomBridge, al as SessionReadinessFailure, am as SurfaceLayers, an as TranscriptSender, ao as TranscriptSenderOptions, ap as TurnState, aq as TurnTimeoutEvent, ar as UseAvatarQualityGovernorInput, as as UseLiveKitAvatarGrantInput, at as UseRealtimeSessionInput, au as UseSessionLifecycleInput, av as VoiceSpec, aw as VoiceSpecInput, ax as capacityErrorFromBusy, ay as capacityStateFromGrant, az as createProxyClient, aB as knownBehaviorStates, aC as mapTurnState, aD as readInboundRtp, aE as sessionBehaviorSchema, aF as sessionClipSchema, b4 as shouldReplayPendingTurn, aG as splitCallTranscript, aH as useAvatarAdaptivePlayoutDelay, aI as useAvatarCamera, aJ as useAvatarPlayoutDelay, aK as useAvatarQualityGovernor, aL as useCallTranscript, aM as useLiveKitAvatarGrant, aO as useMicLease, aP as useRealtimeSession, aQ as useReleaseMicLeaseOnTrackEnded, aR as useSessionLifecycle } from './proxy-client-BAY77sJZ.js';
4
4
  import { CSSProperties, ReactNode } from 'react';
5
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
6
- import { R as RecordingArtifact } from './recording-DjswTx5B.js';
6
+ import { R as RecordingArtifact } from './recording-ydFVySSd.js';
7
7
  export { D as DEFAULT_AVATAR_PLAYOUT_DELAY_SECONDS } from './playout-delay-CtRZdtsj.js';
8
8
  import 'zod';
9
9
  import 'livekit-client';
@@ -201,7 +201,7 @@ type RecordingPlaybackAsset = {
201
201
  recording: RecordingArtifact;
202
202
  url: string;
203
203
  };
204
- /** Each participant file carries only its own voice; one clock drives both files. */
204
+ /** Participant files and separate track segments share one clock without mixing voices. */
205
205
  declare function RecordingPlayer({ assets, className }: {
206
206
  assets: readonly RecordingPlaybackAsset[];
207
207
  className?: string;