@spatius/avatarkit 1.3.1-beta.5 → 1.3.1-beta.7

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/CHANGELOG.md CHANGED
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.3.1-beta.7] - 2026-08-02
9
+
10
+ ### Changed
11
+ - Internal telemetry changes only; no changes to the public API or runtime behavior.
12
+
13
+ ## [1.3.1-beta.6] - 2026-08-01
14
+
15
+ ### Changed
16
+ - Internal telemetry changes only; no changes to the public API or runtime behavior.
17
+
8
18
  ## [1.3.1-beta.5] - 2026-07-31
9
19
 
10
20
  ### Changed
@@ -1,8 +1,8 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { t as AvatarSDK } from "./AvatarSDK-BRDgRJ_Z.js";
3
- import { Et as ErrorCode, c as logEvent, gt as generateTraceId, l as logMetric, t as logger, vt as AvatarError, y as recordHttpClientDuration } from "./logger-C61wOfFi.js";
4
- import { n as APP_CONFIG, r as getFlameCdnBase, t as errorToMessage } from "./error-utils-Ct04L0Ek.js";
5
- import { t as PwaCacheManager } from "./pwa-cache-manager-0wrNgZ7C.js";
2
+ import { t as AvatarSDK } from "./AvatarSDK-CTprrfJk.js";
3
+ import { Et as ErrorCode, c as logEvent, gt as generateTraceId, l as logMetric, t as logger, vt as AvatarError, y as recordHttpClientDuration } from "./logger-DdmfSEn-.js";
4
+ import { n as APP_CONFIG, r as getFlameCdnBase, t as errorToMessage } from "./error-utils-BCZDCrc6.js";
5
+ import { t as PwaCacheManager } from "./pwa-cache-manager-BMKyJWXI.js";
6
6
  //#region core/AvatarDownloader.ts
7
7
  var AvatarDownloader_exports = /* @__PURE__ */ __exportAll({ AvatarDownloader: () => AvatarDownloader });
8
8
  /**
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { $ as TraceFlags, A as ExportResultCode, B as ATTR_EXCEPTION_TYPE, C as createInstrumentationScope, D as defaultResource, E as OTLPExporterBase, F as isTimeInputHrTime, G as isTracingSuppressed, H as getNumberFromEnv, I as millisToHrTime, J as diag$1, K as suppressTracing, L as otperformance, M as hrTime, N as hrTimeDuration, O as resourceFromAttributes, P as isTimeInput, Q as INVALID_SPAN_CONTEXT, R as ATTR_EXCEPTION_MESSAGE, S as JSON_ENCODER, T as toAttributes, Tt as DrivingServiceMode, U as getStringFromEnv, V as ATTR_SERVICE_NAME, W as globalErrorHandler, X as isSpanContextValid, Y as context, Z as isValidTraceId, _ as cleanupOtelMetrics, a as clientContextFields, at as getGlobal, c as logEvent, ct as OTEL_LOGS_ENDPOINT, d as cleanupOtel, dt as OTEL_TRACES_ENDPOINT, et as ContextAPI, f as initializeOtel, ft as OTEL_TRACES_STREAM_NAME, g as fetchBootstrap, h as clockSync, ht as idManager, i as cleanupPostHog, it as DiagAPI, j as addHrTimes, k as BindOnceFuture, kt as LogLevel, lt as OTEL_PASSWORD, n as setLogLevel, nt as ROOT_CONTEXT, o as getLogsFeatureFlag, ot as registerGlobal, pt as OTEL_USERNAME, q as trace, r as logSink, rt as createContextKey, s as initializePostHog, st as unregisterGlobal, t as logger, tt as createNoopMeter, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_STREAM_NAME, v as initializeOtelMetrics, w as createResource, x as createLegacyOtlpBrowserExportDelegate, z as ATTR_EXCEPTION_STACKTRACE } from "./logger-C61wOfFi.js";
2
+ import { $ as TraceFlags, A as ExportResultCode, B as ATTR_EXCEPTION_TYPE, C as createInstrumentationScope, D as defaultResource, E as OTLPExporterBase, F as isTimeInputHrTime, G as isTracingSuppressed, H as getNumberFromEnv, I as millisToHrTime, J as diag$1, K as suppressTracing, L as otperformance, M as hrTime, N as hrTimeDuration, O as resourceFromAttributes, P as isTimeInput, Q as INVALID_SPAN_CONTEXT, R as ATTR_EXCEPTION_MESSAGE, S as JSON_ENCODER, T as toAttributes, Tt as DrivingServiceMode, U as getStringFromEnv, V as ATTR_SERVICE_NAME, W as globalErrorHandler, X as isSpanContextValid, Y as context, Z as isValidTraceId, _ as cleanupOtelMetrics, a as clientContextFields, at as getGlobal, c as logEvent, ct as OTEL_LOGS_ENDPOINT, d as cleanupOtel, dt as OTEL_TRACES_ENDPOINT, et as ContextAPI, f as initializeOtel, ft as OTEL_TRACES_STREAM_NAME, g as fetchBootstrap, h as clockSync, ht as idManager, i as cleanupPostHog, it as DiagAPI, j as addHrTimes, k as BindOnceFuture, kt as LogLevel, lt as OTEL_PASSWORD, n as setLogLevel, nt as ROOT_CONTEXT, o as getLogsFeatureFlag, ot as registerGlobal, pt as OTEL_USERNAME, q as trace, r as logSink, rt as createContextKey, s as initializePostHog, st as unregisterGlobal, t as logger, tt as createNoopMeter, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_STREAM_NAME, v as initializeOtelMetrics, w as createResource, x as createLegacyOtlpBrowserExportDelegate, z as ATTR_EXCEPTION_STACKTRACE } from "./logger-DdmfSEn-.js";
3
3
  //#region node_modules/.pnpm/@bufbuild+protobuf@2.10.1/node_modules/@bufbuild/protobuf/dist/esm/wire/varint.js
4
4
  /**
5
5
  * Read a 64 bit varint as two JS numbers.
@@ -6321,7 +6321,7 @@ var AvatarSDK = class {
6321
6321
  static _initializationState = "uninitialized";
6322
6322
  static _initializingPromise = null;
6323
6323
  static _configuration = null;
6324
- static _version = "1.3.1-beta.5";
6324
+ static _version = "1.3.1-beta.7";
6325
6325
  static _avatarCore = null;
6326
6326
  static _cachedDeviceScore = null;
6327
6327
  static _rendererBackend = null;
@@ -6487,7 +6487,7 @@ var AvatarSDK = class {
6487
6487
  logger.log("[AvatarSDK] Loading template resources...");
6488
6488
  logEvent("template_init_start", "info", { stage: "sdk_init" });
6489
6489
  try {
6490
- const { AvatarDownloader } = await import("./AvatarDownloader-DqxFbPSb.js").then((n) => n.n);
6490
+ const { AvatarDownloader } = await import("./AvatarDownloader-B1tJTnIb.js").then((n) => n.n);
6491
6491
  const templateResources = await new AvatarDownloader().loadUnifiedTemplate();
6492
6492
  if (await this._avatarCore.loadTemplateResourcesFromBuffers(templateResources)) logger.log("[AvatarSDK] Template resources initialized successfully");
6493
6493
  else logger.log("[AvatarSDK] Template resources already initialized, skipping...");
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll, r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { t as logger } from "./logger-C61wOfFi.js";
2
+ import { t as logger } from "./logger-DdmfSEn-.js";
3
3
  /** Opus granule positions are always in 48 kHz samples, regardless of input rate. */
4
4
  var OPUS_GRANULE_RATE = 48e3;
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { t as logger } from "./logger-C61wOfFi.js";
1
+ import { t as logger } from "./logger-DdmfSEn-.js";
2
2
  //#region audio/OpusDecoderProxy.ts
3
3
  var OpusDecoderProxy = class OpusDecoderProxy {
4
4
  worker = null;
@@ -21,7 +21,7 @@ var OpusDecoderProxy = class OpusDecoderProxy {
21
21
  } catch (err) {
22
22
  logger.warn("[Opus][DecoderProxy] Worker unavailable, falling back to main-thread decode:", err instanceof Error ? err.message : String(err));
23
23
  }
24
- const { OggOpusDecoder } = await import("./OpusCodec-Bo1tty8H.js").then((n) => n.n);
24
+ const { OggOpusDecoder } = await import("./OpusCodec-PWv7ynPp.js").then((n) => n.n);
25
25
  proxy.fallbackDecoder = new OggOpusDecoder();
26
26
  proxy.backend = "main-thread";
27
27
  return proxy;
@@ -32,7 +32,7 @@ var OpusDecoderProxy = class OpusDecoderProxy {
32
32
  try {
33
33
  worker = new Worker(new URL(
34
34
  /* @vite-ignore */
35
- "/assets/OpusDecoderWorker.worker-DkBuCaO8.js",
35
+ "/assets/OpusDecoderWorker.worker-CSSWn75M.js",
36
36
  "" + import.meta.url
37
37
  ), { type: "module" });
38
38
  } catch (err) {
@@ -1,4 +1,4 @@
1
- import { t as logger } from "./logger-C61wOfFi.js";
1
+ import { t as logger } from "./logger-DdmfSEn-.js";
2
2
  //#region audio/OpusEncoderProxy.ts
3
3
  var OpusEncoderProxy = class OpusEncoderProxy {
4
4
  worker = null;
@@ -26,7 +26,7 @@ var OpusEncoderProxy = class OpusEncoderProxy {
26
26
  } catch (err) {
27
27
  logger.warn("[Opus][Proxy] Worker unavailable, falling back to main-thread encode:", err instanceof Error ? err.message : String(err));
28
28
  }
29
- const { OggOpusEncoder } = await import("./OpusCodec-Bo1tty8H.js").then((n) => n.n);
29
+ const { OggOpusEncoder } = await import("./OpusCodec-PWv7ynPp.js").then((n) => n.n);
30
30
  proxy.fallbackEncoder = new OggOpusEncoder(sampleRate, bitrate);
31
31
  proxy.backend = "main-thread";
32
32
  return proxy;
@@ -37,7 +37,7 @@ var OpusEncoderProxy = class OpusEncoderProxy {
37
37
  try {
38
38
  worker = new Worker(new URL(
39
39
  /* @vite-ignore */
40
- "/assets/OpusEncoderWorker.worker-ZqEypyPc.js",
40
+ "/assets/OpusEncoderWorker.worker-q4TdCVDZ.js",
41
41
  "" + import.meta.url
42
42
  ), { type: "module" });
43
43
  } catch (err) {
@@ -1,5 +1,5 @@
1
- import { c as logEvent, t as logger } from "./logger-C61wOfFi.js";
2
- import { n as APP_CONFIG, t as errorToMessage } from "./error-utils-Ct04L0Ek.js";
1
+ import { c as logEvent, t as logger } from "./logger-DdmfSEn-.js";
2
+ import { n as APP_CONFIG, t as errorToMessage } from "./error-utils-BCZDCrc6.js";
3
3
  //#region audio/StreamingAudioPlayer.ts
4
4
  /**
5
5
  * Streaming Audio Player
@@ -1,5 +1,5 @@
1
- import { _ as recordHttpClientDuration, c as logEvent, dt as isDebugMode, l as logMetric, mt as AvatarError, pt as generateTraceId, t as logger, vt as ErrorCode } from "./logger-Dxe0Iw4R.js";
2
- import { t as AvatarSDK } from "./AvatarSDK-dtQsJHmr.js";
1
+ import { _ as recordHttpClientDuration, c as logEvent, dt as isDebugMode, l as logMetric, mt as AvatarError, pt as generateTraceId, t as logger, vt as ErrorCode } from "./logger-DCzHWd4N.js";
2
+ import { t as AvatarSDK } from "./AvatarSDK-CPEeTeLT.js";
3
3
  //#region config/app-config.ts
4
4
  const GLOBAL_FLAME_CDN_BASE = "https://cdn.spatialwalk.cloud/public";
5
5
  const CN_FLAME_CDN_BASE = "https://cdn.spatialwalk.top/public";
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { $ as ROOT_CONTEXT, A as hrTimeDuration, B as getStringFromEnv, C as OTLPExporterBase, D as ExportResultCode, E as BindOnceFuture, F as ATTR_EXCEPTION_MESSAGE, G as diag$1, H as isTracingSuppressed, I as ATTR_EXCEPTION_STACKTRACE, J as isValidTraceId, K as context, L as ATTR_EXCEPTION_TYPE, M as isTimeInputHrTime, N as millisToHrTime, O as addHrTimes, P as otperformance, Q as createNoopMeter, R as ATTR_SERVICE_NAME, S as toAttributes, T as resourceFromAttributes, U as suppressTracing, V as globalErrorHandler, W as trace, X as TraceFlags, Y as INVALID_SPAN_CONTEXT, Z as ContextAPI, _t as DrivingServiceMode, a as clientContextFields, at as OTEL_LOGS_ENDPOINT, b as createInstrumentationScope, c as logEvent, ct as OTEL_TRACES_ENDPOINT, d as cleanupOtel, et as createContextKey, f as initializeOtel, ft as idManager, g as initializeOtelMetrics, h as cleanupOtelMetrics, i as cleanupPostHog, it as unregisterGlobal, j as isTimeInput, k as hrTime, lt as OTEL_TRACES_STREAM_NAME, m as fetchBootstrap, n as setLogLevel, nt as getGlobal, o as getLogsFeatureFlag, ot as OTEL_PASSWORD, p as clockSync, q as isSpanContextValid, r as logSink, rt as registerGlobal, s as initializePostHog, st as OTEL_STREAM_NAME, t as logger, tt as DiagAPI, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_USERNAME, v as createLegacyOtlpBrowserExportDelegate, w as defaultResource, x as createResource, y as JSON_ENCODER, yt as LogLevel, z as getNumberFromEnv } from "./logger-Dxe0Iw4R.js";
2
+ import { $ as ROOT_CONTEXT, A as hrTimeDuration, B as getStringFromEnv, C as OTLPExporterBase, D as ExportResultCode, E as BindOnceFuture, F as ATTR_EXCEPTION_MESSAGE, G as diag$1, H as isTracingSuppressed, I as ATTR_EXCEPTION_STACKTRACE, J as isValidTraceId, K as context, L as ATTR_EXCEPTION_TYPE, M as isTimeInputHrTime, N as millisToHrTime, O as addHrTimes, P as otperformance, Q as createNoopMeter, R as ATTR_SERVICE_NAME, S as toAttributes, T as resourceFromAttributes, U as suppressTracing, V as globalErrorHandler, W as trace, X as TraceFlags, Y as INVALID_SPAN_CONTEXT, Z as ContextAPI, _t as DrivingServiceMode, a as clientContextFields, at as OTEL_LOGS_ENDPOINT, b as createInstrumentationScope, c as logEvent, ct as OTEL_TRACES_ENDPOINT, d as cleanupOtel, et as createContextKey, f as initializeOtel, ft as idManager, g as initializeOtelMetrics, h as cleanupOtelMetrics, i as cleanupPostHog, it as unregisterGlobal, j as isTimeInput, k as hrTime, lt as OTEL_TRACES_STREAM_NAME, m as fetchBootstrap, n as setLogLevel, nt as getGlobal, o as getLogsFeatureFlag, ot as OTEL_PASSWORD, p as clockSync, q as isSpanContextValid, r as logSink, rt as registerGlobal, s as initializePostHog, st as OTEL_STREAM_NAME, t as logger, tt as DiagAPI, u as updatePostHogPersonPropertiesForFlags, ut as OTEL_USERNAME, v as createLegacyOtlpBrowserExportDelegate, w as defaultResource, x as createResource, y as JSON_ENCODER, yt as LogLevel, z as getNumberFromEnv } from "./logger-DCzHWd4N.js";
3
3
  //#region node_modules/.pnpm/@opentelemetry+api@1.9.1/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js
4
4
  var BaggageImpl = class BaggageImpl {
5
5
  constructor(entries) {
@@ -6109,7 +6109,7 @@ var AvatarSDK = class {
6109
6109
  static _initializationState = "uninitialized";
6110
6110
  static _initializingPromise = null;
6111
6111
  static _configuration = null;
6112
- static _version = "1.3.1-beta.5";
6112
+ static _version = "1.3.1-beta.7";
6113
6113
  static _avatarCore = null;
6114
6114
  static _cachedDeviceScore = null;
6115
6115
  static _rendererBackend = null;
@@ -6275,7 +6275,7 @@ var AvatarSDK = class {
6275
6275
  logger.log("[AvatarSDK] Loading template resources...");
6276
6276
  logEvent("template_init_start", "info", { stage: "sdk_init" });
6277
6277
  try {
6278
- const { AvatarDownloader } = await import("./AvatarDownloader-C85m5uos.js");
6278
+ const { AvatarDownloader } = await import("./AvatarDownloader-LO9uuYvm.js");
6279
6279
  const templateResources = await new AvatarDownloader().loadUnifiedTemplate();
6280
6280
  if (await this._avatarCore.loadTemplateResourcesFromBuffers(templateResources)) logger.log("[AvatarSDK] Template resources initialized successfully");
6281
6281
  else logger.log("[AvatarSDK] Template resources already initialized, skipping...");
@@ -1,5 +1,5 @@
1
1
  import { r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { t as logger } from "./logger-Dxe0Iw4R.js";
2
+ import { t as logger } from "./logger-DCzHWd4N.js";
3
3
  //#region __vite-browser-external
4
4
  var require___vite_browser_external = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5
5
  module.exports = {};
@@ -1,5 +1,5 @@
1
1
  import { r as __toESM, t as __commonJSMin } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { t as logger } from "./logger-Dxe0Iw4R.js";
2
+ import { t as logger } from "./logger-DCzHWd4N.js";
3
3
  //#region __vite-browser-external
4
4
  var require___vite_browser_external = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5
5
  module.exports = {};
@@ -13550,7 +13550,7 @@ const HTTP_NETWORK_BUCKETS_MS = [
13550
13550
  5e3
13551
13551
  ];
13552
13552
  /**
13553
- * RTC playback 指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
13553
+ * 播放指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
13554
13554
  * 帧率只可能落在 0~25,缺帧数和卡顿次数几乎全部挤在第一个桶里,分位数因此毫无意义。
13555
13555
  * 桶按各指标的实际值域给:
13556
13556
  *
@@ -13559,9 +13559,18 @@ const HTTP_NETWORK_BUCKETS_MS = [
13559
13559
  * - 卡顿次数:数的是次数不是帧,自成一组。
13560
13560
  * - 百分比:每 5% 一档,0~100。
13561
13561
  * - 时长:分两组——整轮播放是秒级,单次卡顿是一帧起步的毫秒级。
13562
+ * - 延迟:音频送入是等距(要看偏离整秒多少),动画到达是等比(两种用法差一个数量级)。
13563
+ * - GPU 耗时:个位数毫秒,按帧预算设档。
13562
13564
  *
13563
- * 这些 metric @spatius/avatarkit-rtc 发出(meter 名 spatius-avatarkit-rtc),
13564
- * view 只能配在创建 MeterProvider 的这一侧,所以桶定义留在这里。
13565
+ * SDK @spatius/avatarkit-rtcmeter 名 spatius-avatarkit-rtc)两边的指标都在这里配:
13566
+ * view 只能配在创建 MeterProvider 的这一侧,rtc 那批虽由另一个包发出,桶定义也得留在此处。
13567
+ * 同名概念两边共用一组桶,好让两条链路的分布能直接叠着比。
13568
+ */
13569
+ /**
13570
+ * 上界给到 30 而非 25:25fps 是目标帧率,正常轮次全落在那一档,若把它当上界,
13571
+ * 每一轮健康播放都会挤进 +Inf 溢出桶,与真正超发的异常轮次混在一起,
13572
+ * 这条 metric 就只剩「是否达标」这一个比特的信息。25 单独成档、上面再留几格,
13573
+ * 达标与超发才分得开。
13565
13574
  */
13566
13575
  const RTC_FPS_BUCKETS = [
13567
13576
  0,
@@ -13588,7 +13597,12 @@ const RTC_FPS_BUCKETS = [
13588
13597
  21,
13589
13598
  22,
13590
13599
  23,
13591
- 24
13600
+ 24,
13601
+ 25,
13602
+ 26,
13603
+ 27,
13604
+ 28,
13605
+ 30
13592
13606
  ];
13593
13607
  /**
13594
13608
  * 一轮播出的帧数。档位是播放时长桶除以帧间隔(40ms),和时长视角一一对应:
@@ -13622,8 +13636,9 @@ const RTC_LOST_FRAME_BUCKETS = [
13622
13636
  256
13623
13637
  ];
13624
13638
  /**
13625
- * 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义;
13626
- * 一轮内卡上几十次已属异常,量级到此为止。
13639
+ * 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义。
13640
+ * 低位逐个分档、高位翻倍:一轮几次和一轮几十次是两种情况,都要看得出来。
13641
+ * 实测慢网络下一轮 35 次,因此高位必须留到三位数。
13627
13642
  */
13628
13643
  const RTC_STALL_COUNT_BUCKETS = [
13629
13644
  0,
@@ -13632,10 +13647,12 @@ const RTC_STALL_COUNT_BUCKETS = [
13632
13647
  3,
13633
13648
  4,
13634
13649
  5,
13635
- 8,
13636
- 12,
13650
+ 10,
13637
13651
  20,
13638
- 40
13652
+ 40,
13653
+ 80,
13654
+ 160,
13655
+ 320
13639
13656
  ];
13640
13657
  const RTC_PERCENT_BUCKETS = [
13641
13658
  0,
@@ -13687,20 +13704,135 @@ const RTC_STALL_DURATION_BUCKETS_MS = [
13687
13704
  5120,
13688
13705
  10240
13689
13706
  ];
13707
+ /**
13708
+ * 音频送入节奏:tap_N 是第 N 秒音频送入的时刻,metric 记的是相对首包(tap_0)的累计 Δ。
13709
+ * 流式输入下 tap_1/2/4 天然聚在 1000/2000/4000 附近,偏离多少正是要看的——喂得比实时慢,
13710
+ * 后台就攒不够音频、推理迟迟不触发。等距 200ms 让这三个中心各自落在档位边界上,
13711
+ * 偏移一两档就能读出来;等比会把它们挤进同一格。
13712
+ *
13713
+ * 上界 6000 而非 4000:4000 是 tap_4 的理想值,拿理想值当上界,正常轮次会全部挤进
13714
+ * +Inf 溢出桶,与真正喂得慢的轮次混在一起。
13715
+ */
13716
+ const AUDIO_LATENCY_BUCKETS_MS = [
13717
+ 0,
13718
+ 200,
13719
+ 400,
13720
+ 600,
13721
+ 800,
13722
+ 1e3,
13723
+ 1200,
13724
+ 1400,
13725
+ 1600,
13726
+ 1800,
13727
+ 2e3,
13728
+ 2200,
13729
+ 2400,
13730
+ 2600,
13731
+ 2800,
13732
+ 3e3,
13733
+ 3200,
13734
+ 3400,
13735
+ 3600,
13736
+ 3800,
13737
+ 4e3,
13738
+ 4200,
13739
+ 4400,
13740
+ 4600,
13741
+ 4800,
13742
+ 5e3,
13743
+ 5200,
13744
+ 5400,
13745
+ 5600,
13746
+ 5800,
13747
+ 6e3
13748
+ ];
13749
+ /**
13750
+ * 动画包到达:anim_N 是第 N 组动画包到达的时刻(同样相对 tap_0 的累计 Δ)。
13751
+ * 后台攒够音频(2s/4s/4s)就推理下发,所以这个值等于「攒音频的等待 + 推理 + 网络下行」,
13752
+ * 与播放进度无关:一次性灌入 10s 预制音频,三个包会连着回来,全落在低位;实时流式喂,
13753
+ * 则要等音频攒够,anim_2 可以到十几秒。两种用法差一个数量级,同一个直方图要都装得下,
13754
+ * 因此用等比而非等距——低位密到看清推理耗时,高位疏到兜住慢速流式。
13755
+ *
13756
+ * 200ms 起步:网络下行本身就要这个量级,再往下细分没有意义。
13757
+ */
13758
+ const ANIM_LATENCY_BUCKETS_MS = [
13759
+ 0,
13760
+ 200,
13761
+ 400,
13762
+ 800,
13763
+ 1600,
13764
+ 3200,
13765
+ 6400,
13766
+ 12800,
13767
+ 25600
13768
+ ];
13769
+ /**
13770
+ * 单帧 GPU 渲染耗时。实测中低端机器可以到 30ms 上下,因此值域按机型跨度给到 100ms,
13771
+ * 每 5ms 一档——而不是只覆盖高端机那几毫秒。40ms 是一帧的总预算,越过就意味着 GPU
13772
+ * 单独一项已经吃满整帧;再往上到 100ms 是给最差的机型留的观测空间。
13773
+ *
13774
+ * webgl 没有可移植的 GPU timer,取不到样本,那几轮整条 metric 不发(见 AvatarController),
13775
+ * 所以这里的分布只含 webgpu 的真实数据,不会被一堆 0 压在第一格。
13776
+ */
13777
+ const GPU_RENDER_BUCKETS_MS = [
13778
+ 5,
13779
+ 10,
13780
+ 15,
13781
+ 20,
13782
+ 25,
13783
+ 30,
13784
+ 35,
13785
+ 40,
13786
+ 45,
13787
+ 50,
13788
+ 55,
13789
+ 60,
13790
+ 65,
13791
+ 70,
13792
+ 75,
13793
+ 80,
13794
+ 85,
13795
+ 90,
13796
+ 95,
13797
+ 100
13798
+ ];
13690
13799
  /** metric 名 → 桶,供下面的 views 展开。 */
13691
- const RTC_BUCKET_PROFILES = [
13800
+ const BUCKET_PROFILES = [
13801
+ ["playback_avg_fps", RTC_FPS_BUCKETS],
13802
+ ["playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13803
+ ["playback_audio_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13804
+ ["playback_animation_frame_count", RTC_FRAME_COUNT_BUCKETS],
13805
+ ["playback_jank_frame_count", RTC_LOST_FRAME_BUCKETS],
13806
+ ["playback_stall_count", RTC_STALL_COUNT_BUCKETS],
13807
+ ["playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13808
+ ["playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13809
+ ["playback_audio_stall_count", RTC_STALL_COUNT_BUCKETS],
13810
+ ["playback_audio_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13811
+ ["playback_audio_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13812
+ ["playback_gpu_render_p50_ms", GPU_RENDER_BUCKETS_MS],
13813
+ ["playback_gpu_render_p90_ms", GPU_RENDER_BUCKETS_MS],
13814
+ ["playback_gpu_render_p95_ms", GPU_RENDER_BUCKETS_MS],
13815
+ ["playback_latency_tap_1_ms", AUDIO_LATENCY_BUCKETS_MS],
13816
+ ["playback_latency_tap_2_ms", AUDIO_LATENCY_BUCKETS_MS],
13817
+ ["playback_latency_tap_4_ms", AUDIO_LATENCY_BUCKETS_MS],
13818
+ ["playback_latency_anim_0_ms", ANIM_LATENCY_BUCKETS_MS],
13819
+ ["playback_latency_anim_1_ms", ANIM_LATENCY_BUCKETS_MS],
13820
+ ["playback_latency_anim_2_ms", ANIM_LATENCY_BUCKETS_MS],
13692
13821
  ["rtc_playback_avg_fps", RTC_FPS_BUCKETS],
13693
13822
  ["rtc_playback_frame_count", RTC_FRAME_COUNT_BUCKETS],
13694
- ["rtc_playback_frames_lost", RTC_LOST_FRAME_BUCKETS],
13695
13823
  ["rtc_playback_skipped_frames", RTC_LOST_FRAME_BUCKETS],
13696
13824
  ["rtc_playback_tail_discarded", RTC_LOST_FRAME_BUCKETS],
13697
13825
  ["rtc_playback_stall_count", RTC_STALL_COUNT_BUCKETS],
13698
13826
  ["rtc_playback_start_transition_missing", RTC_LOST_FRAME_BUCKETS],
13699
13827
  ["rtc_playback_end_transition_missing", RTC_LOST_FRAME_BUCKETS],
13700
- ["rtc_playback_loss_rate_pct", RTC_PERCENT_BUCKETS],
13828
+ ["rtc_playback_skip_rate_pct", RTC_PERCENT_BUCKETS],
13701
13829
  ["rtc_playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13702
13830
  ["rtc_playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13703
- ["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS]
13831
+ ["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13832
+ ["rtc_transport_packets_lost", RTC_LOST_FRAME_BUCKETS],
13833
+ ["rtc_transport_packets_recovered", RTC_LOST_FRAME_BUCKETS],
13834
+ ["rtc_transport_packets_dropped", RTC_LOST_FRAME_BUCKETS],
13835
+ ["rtc_transport_packets_out_of_order", RTC_LOST_FRAME_BUCKETS]
13704
13836
  ];
13705
13837
  const METRIC_EXPORT_INTERVAL_MS = 1e4;
13706
13838
  let sdkVersion$2 = "1.0.0";
@@ -13747,7 +13879,7 @@ function initializeOtelMetrics(version, resourceAttrs) {
13747
13879
  type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
13748
13880
  options: { boundaries: HTTP_NETWORK_BUCKETS_MS }
13749
13881
  }
13750
- }, ...RTC_BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
13882
+ }, ...BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
13751
13883
  instrumentName,
13752
13884
  aggregation: {
13753
13885
  type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
@@ -15109,7 +15241,7 @@ async function writeToLocalLog(message, level, extra = {}) {
15109
15241
  try {
15110
15242
  const { shouldPersist, sanitized } = sanitizeForLocalLog(message);
15111
15243
  if (!shouldPersist) return;
15112
- const { AvatarSDK } = await import("./AvatarSDK-dtQsJHmr.js").then((n) => n.n);
15244
+ const { AvatarSDK } = await import("./AvatarSDK-CPEeTeLT.js").then((n) => n.n);
15113
15245
  const version = AvatarSDK.version;
15114
15246
  const appId = idManager.getAppId();
15115
15247
  const userId = idManager.getUserId();
@@ -1,4 +1,4 @@
1
- import { mt as isDebugMode } from "./logger-C61wOfFi.js";
1
+ import { mt as isDebugMode } from "./logger-DdmfSEn-.js";
2
2
  //#region config/app-config.ts
3
3
  var GLOBAL_FLAME_CDN_BASE = "https://cdn.spatialwalk.cloud/public";
4
4
  var CN_FLAME_CDN_BASE = "https://cdn.spatialwalk.top/public";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { a as avatarViewRegistry, c as Message, d as BinaryReader, f as BinaryWriter, i as buildTraceparent, l as MessageType, o as AudioFormat, r as startPlaybackTrace, s as EgressType, t as AvatarSDK, u as TransportCompression } from "./AvatarSDK-BRDgRJ_Z.js";
2
- import { At as RENDER_QUALITY_PARAMS, Ct as DEFAULT_REGION, Dt as FrameStarvationMode, Et as ErrorCode, Mt as TransitionType, Ot as LoadProgress, St as DEFAULT_OPUS_BITRATE, Tt as DrivingServiceMode, _t as AnimationType, b as recordMetric, bt as ConnectionState, c as logEvent, h as clockSync, ht as idManager, jt as RenderQuality, kt as LogLevel, l as logMetric, m as resolveMarks, p as monoTimestamp, t as logger, vt as AvatarError, wt as DEFAULT_REGION_REQUEST, xt as ConversationState, yt as AvatarState } from "./logger-C61wOfFi.js";
3
- import { n as APP_CONFIG } from "./error-utils-Ct04L0Ek.js";
4
- import { r as OggMuxer, t as OggPageSplitter } from "./OpusCodec-Bo1tty8H.js";
5
- import { t as AvatarDownloader } from "./AvatarDownloader-DqxFbPSb.js";
1
+ import { a as avatarViewRegistry, c as Message, d as BinaryReader, f as BinaryWriter, i as buildTraceparent, l as MessageType, o as AudioFormat, r as startPlaybackTrace, s as EgressType, t as AvatarSDK, u as TransportCompression } from "./AvatarSDK-CTprrfJk.js";
2
+ import { At as RENDER_QUALITY_PARAMS, Ct as DEFAULT_REGION, Dt as FrameStarvationMode, Et as ErrorCode, Mt as TransitionType, Ot as LoadProgress, St as DEFAULT_OPUS_BITRATE, Tt as DrivingServiceMode, _t as AnimationType, b as recordMetric, bt as ConnectionState, c as logEvent, h as clockSync, ht as idManager, jt as RenderQuality, kt as LogLevel, l as logMetric, m as resolveMarks, p as monoTimestamp, t as logger, vt as AvatarError, wt as DEFAULT_REGION_REQUEST, xt as ConversationState, yt as AvatarState } from "./logger-DdmfSEn-.js";
3
+ import { n as APP_CONFIG } from "./error-utils-BCZDCrc6.js";
4
+ import { r as OggMuxer, t as OggPageSplitter } from "./OpusCodec-PWv7ynPp.js";
5
+ import { t as AvatarDownloader } from "./AvatarDownloader-B1tJTnIb.js";
6
6
  //#region core/Avatar.ts
7
7
  var Avatar = class {
8
8
  id;
@@ -309,8 +309,8 @@ var AnimationPlayer = class AnimationPlayer {
309
309
  */
310
310
  async createAndInitializeStreamingPlayer() {
311
311
  if (this.streamingPlayer) return;
312
- const { StreamingAudioPlayer } = await import("./StreamingAudioPlayer-BRmZO9aV.js");
313
- const { AvatarSDK } = await import("./AvatarSDK-BRDgRJ_Z.js").then((n) => n.n);
312
+ const { StreamingAudioPlayer } = await import("./StreamingAudioPlayer-C6hgkvbK.js");
313
+ const { AvatarSDK } = await import("./AvatarSDK-CTprrfJk.js").then((n) => n.n);
314
314
  const audioFormat = AvatarSDK.getAudioFormat();
315
315
  this.streamingPlayer = new StreamingAudioPlayer({
316
316
  sampleRate: audioFormat.sampleRate,
@@ -1281,7 +1281,7 @@ var AnimationWebSocketClient = class extends EventEmitter {
1281
1281
  return;
1282
1282
  }
1283
1283
  try {
1284
- const { OpusEncoderProxy } = await import("./OpusEncoderProxy-DyX-nL6Q.js");
1284
+ const { OpusEncoderProxy } = await import("./OpusEncoderProxy-DiW21sBK.js");
1285
1285
  const bitrate = opusBitrate ?? 48e3;
1286
1286
  this.opusEncoder = await OpusEncoderProxy.create(sampleRate, bitrate);
1287
1287
  this.uplinkIsOpus = true;
@@ -2442,9 +2442,11 @@ var AvatarController = class {
2442
2442
  recordMetric("playback_animation_frame_count", this.receivedAnimationFrames, labels);
2443
2443
  recordMetric("playback_avg_fps", Math.round(stats.avgFps), labels);
2444
2444
  recordMetric("playback_jank_frame_count", stats.jankFrameCount, labels);
2445
- recordMetric("playback_gpu_render_p50_ms", Math.round(stats.gpuRenderP50Ms), labels);
2446
- recordMetric("playback_gpu_render_p90_ms", Math.round(stats.gpuRenderP90Ms), labels);
2447
- recordMetric("playback_gpu_render_p95_ms", Math.round(stats.gpuRenderP95Ms), labels);
2445
+ if (stats.gpuRenderP50Ms > 0) {
2446
+ recordMetric("playback_gpu_render_p50_ms", Math.round(stats.gpuRenderP50Ms), labels);
2447
+ recordMetric("playback_gpu_render_p90_ms", Math.round(stats.gpuRenderP90Ms), labels);
2448
+ recordMetric("playback_gpu_render_p95_ms", Math.round(stats.gpuRenderP95Ms), labels);
2449
+ }
2448
2450
  recordMetric("playback_stall_count", stall.count, labels);
2449
2451
  recordMetric("playback_stall_max_ms", stall.max_ms, labels);
2450
2452
  recordMetric("playback_stall_total_ms", stall.total_ms, labels);
@@ -2628,7 +2630,7 @@ var AvatarController = class {
2628
2630
  const { inputAudioFormat } = AvatarSDK.getAudioFormat();
2629
2631
  if (inputAudioFormat !== "opus" || this.inputOpusDecoderProxy) return;
2630
2632
  try {
2631
- const { OpusDecoderProxy } = await import("./OpusDecoderProxy-9hC5C8o1.js");
2633
+ const { OpusDecoderProxy } = await import("./OpusDecoderProxy-m0fVN_M2.js");
2632
2634
  this.inputOpusDecoderProxy = await OpusDecoderProxy.create();
2633
2635
  this.inputDecodeChain = Promise.resolve();
2634
2636
  } catch (error) {
@@ -3841,7 +3843,7 @@ var AvatarManager = class AvatarManager {
3841
3843
  } else {
3842
3844
  logger.log(`[AvatarManager] Avatar ${id} cache invalid: updatedAt=${cachedUpdatedAt}->${newUpdatedAt}, modelType=${cachedModelType}->${requestedModelType}, reloading...`);
3843
3845
  this.avatarCache.delete(id);
3844
- const { PwaCacheManager } = await import("./pwa-cache-manager-0wrNgZ7C.js").then((n) => n.n);
3846
+ const { PwaCacheManager } = await import("./pwa-cache-manager-BMKyJWXI.js").then((n) => n.n);
3845
3847
  await PwaCacheManager.clearCharacterCache(id);
3846
3848
  }
3847
3849
  }
@@ -1,4 +1,4 @@
1
- import { h as clockSync } from "./logger-C61wOfFi.js";
1
+ import { h as clockSync } from "./logger-DdmfSEn-.js";
2
2
  //#region internal-telemetry.ts
3
3
  /**
4
4
  * Internal telemetry surface for the companion RTC SDK.
@@ -13625,7 +13625,7 @@ var HTTP_NETWORK_BUCKETS_MS = [
13625
13625
  5e3
13626
13626
  ];
13627
13627
  /**
13628
- * RTC playback 指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
13628
+ * 播放指标的桶。默认桶(0/5/10/25/50/…/10000)对这批指标毫无分辨率:
13629
13629
  * 帧率只可能落在 0~25,缺帧数和卡顿次数几乎全部挤在第一个桶里,分位数因此毫无意义。
13630
13630
  * 桶按各指标的实际值域给:
13631
13631
  *
@@ -13634,9 +13634,18 @@ var HTTP_NETWORK_BUCKETS_MS = [
13634
13634
  * - 卡顿次数:数的是次数不是帧,自成一组。
13635
13635
  * - 百分比:每 5% 一档,0~100。
13636
13636
  * - 时长:分两组——整轮播放是秒级,单次卡顿是一帧起步的毫秒级。
13637
+ * - 延迟:音频送入是等距(要看偏离整秒多少),动画到达是等比(两种用法差一个数量级)。
13638
+ * - GPU 耗时:个位数毫秒,按帧预算设档。
13637
13639
  *
13638
- * 这些 metric @spatius/avatarkit-rtc 发出(meter 名 spatius-avatarkit-rtc),
13639
- * view 只能配在创建 MeterProvider 的这一侧,所以桶定义留在这里。
13640
+ * SDK @spatius/avatarkit-rtcmeter 名 spatius-avatarkit-rtc)两边的指标都在这里配:
13641
+ * view 只能配在创建 MeterProvider 的这一侧,rtc 那批虽由另一个包发出,桶定义也得留在此处。
13642
+ * 同名概念两边共用一组桶,好让两条链路的分布能直接叠着比。
13643
+ */
13644
+ /**
13645
+ * 上界给到 30 而非 25:25fps 是目标帧率,正常轮次全落在那一档,若把它当上界,
13646
+ * 每一轮健康播放都会挤进 +Inf 溢出桶,与真正超发的异常轮次混在一起,
13647
+ * 这条 metric 就只剩「是否达标」这一个比特的信息。25 单独成档、上面再留几格,
13648
+ * 达标与超发才分得开。
13640
13649
  */
13641
13650
  var RTC_FPS_BUCKETS = [
13642
13651
  0,
@@ -13663,7 +13672,12 @@ var RTC_FPS_BUCKETS = [
13663
13672
  21,
13664
13673
  22,
13665
13674
  23,
13666
- 24
13675
+ 24,
13676
+ 25,
13677
+ 26,
13678
+ 27,
13679
+ 28,
13680
+ 30
13667
13681
  ];
13668
13682
  /**
13669
13683
  * 一轮播出的帧数。档位是播放时长桶除以帧间隔(40ms),和时长视角一一对应:
@@ -13697,8 +13711,9 @@ var RTC_LOST_FRAME_BUCKETS = [
13697
13711
  256
13698
13712
  ];
13699
13713
  /**
13700
- * 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义;
13701
- * 一轮内卡上几十次已属异常,量级到此为止。
13714
+ * 一轮里卡顿发生的次数。数的是次数不是帧,上面那套按帧间隔换算的档位对它没有意义。
13715
+ * 低位逐个分档、高位翻倍:一轮几次和一轮几十次是两种情况,都要看得出来。
13716
+ * 实测慢网络下一轮 35 次,因此高位必须留到三位数。
13702
13717
  */
13703
13718
  var RTC_STALL_COUNT_BUCKETS = [
13704
13719
  0,
@@ -13707,10 +13722,12 @@ var RTC_STALL_COUNT_BUCKETS = [
13707
13722
  3,
13708
13723
  4,
13709
13724
  5,
13710
- 8,
13711
- 12,
13725
+ 10,
13712
13726
  20,
13713
- 40
13727
+ 40,
13728
+ 80,
13729
+ 160,
13730
+ 320
13714
13731
  ];
13715
13732
  var RTC_PERCENT_BUCKETS = [
13716
13733
  0,
@@ -13762,20 +13779,135 @@ var RTC_STALL_DURATION_BUCKETS_MS = [
13762
13779
  5120,
13763
13780
  10240
13764
13781
  ];
13782
+ /**
13783
+ * 音频送入节奏:tap_N 是第 N 秒音频送入的时刻,metric 记的是相对首包(tap_0)的累计 Δ。
13784
+ * 流式输入下 tap_1/2/4 天然聚在 1000/2000/4000 附近,偏离多少正是要看的——喂得比实时慢,
13785
+ * 后台就攒不够音频、推理迟迟不触发。等距 200ms 让这三个中心各自落在档位边界上,
13786
+ * 偏移一两档就能读出来;等比会把它们挤进同一格。
13787
+ *
13788
+ * 上界 6000 而非 4000:4000 是 tap_4 的理想值,拿理想值当上界,正常轮次会全部挤进
13789
+ * +Inf 溢出桶,与真正喂得慢的轮次混在一起。
13790
+ */
13791
+ var AUDIO_LATENCY_BUCKETS_MS = [
13792
+ 0,
13793
+ 200,
13794
+ 400,
13795
+ 600,
13796
+ 800,
13797
+ 1e3,
13798
+ 1200,
13799
+ 1400,
13800
+ 1600,
13801
+ 1800,
13802
+ 2e3,
13803
+ 2200,
13804
+ 2400,
13805
+ 2600,
13806
+ 2800,
13807
+ 3e3,
13808
+ 3200,
13809
+ 3400,
13810
+ 3600,
13811
+ 3800,
13812
+ 4e3,
13813
+ 4200,
13814
+ 4400,
13815
+ 4600,
13816
+ 4800,
13817
+ 5e3,
13818
+ 5200,
13819
+ 5400,
13820
+ 5600,
13821
+ 5800,
13822
+ 6e3
13823
+ ];
13824
+ /**
13825
+ * 动画包到达:anim_N 是第 N 组动画包到达的时刻(同样相对 tap_0 的累计 Δ)。
13826
+ * 后台攒够音频(2s/4s/4s)就推理下发,所以这个值等于「攒音频的等待 + 推理 + 网络下行」,
13827
+ * 与播放进度无关:一次性灌入 10s 预制音频,三个包会连着回来,全落在低位;实时流式喂,
13828
+ * 则要等音频攒够,anim_2 可以到十几秒。两种用法差一个数量级,同一个直方图要都装得下,
13829
+ * 因此用等比而非等距——低位密到看清推理耗时,高位疏到兜住慢速流式。
13830
+ *
13831
+ * 200ms 起步:网络下行本身就要这个量级,再往下细分没有意义。
13832
+ */
13833
+ var ANIM_LATENCY_BUCKETS_MS = [
13834
+ 0,
13835
+ 200,
13836
+ 400,
13837
+ 800,
13838
+ 1600,
13839
+ 3200,
13840
+ 6400,
13841
+ 12800,
13842
+ 25600
13843
+ ];
13844
+ /**
13845
+ * 单帧 GPU 渲染耗时。实测中低端机器可以到 30ms 上下,因此值域按机型跨度给到 100ms,
13846
+ * 每 5ms 一档——而不是只覆盖高端机那几毫秒。40ms 是一帧的总预算,越过就意味着 GPU
13847
+ * 单独一项已经吃满整帧;再往上到 100ms 是给最差的机型留的观测空间。
13848
+ *
13849
+ * webgl 没有可移植的 GPU timer,取不到样本,那几轮整条 metric 不发(见 AvatarController),
13850
+ * 所以这里的分布只含 webgpu 的真实数据,不会被一堆 0 压在第一格。
13851
+ */
13852
+ var GPU_RENDER_BUCKETS_MS = [
13853
+ 5,
13854
+ 10,
13855
+ 15,
13856
+ 20,
13857
+ 25,
13858
+ 30,
13859
+ 35,
13860
+ 40,
13861
+ 45,
13862
+ 50,
13863
+ 55,
13864
+ 60,
13865
+ 65,
13866
+ 70,
13867
+ 75,
13868
+ 80,
13869
+ 85,
13870
+ 90,
13871
+ 95,
13872
+ 100
13873
+ ];
13765
13874
  /** metric 名 → 桶,供下面的 views 展开。 */
13766
- var RTC_BUCKET_PROFILES = [
13875
+ var BUCKET_PROFILES = [
13876
+ ["playback_avg_fps", RTC_FPS_BUCKETS],
13877
+ ["playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13878
+ ["playback_audio_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13879
+ ["playback_animation_frame_count", RTC_FRAME_COUNT_BUCKETS],
13880
+ ["playback_jank_frame_count", RTC_LOST_FRAME_BUCKETS],
13881
+ ["playback_stall_count", RTC_STALL_COUNT_BUCKETS],
13882
+ ["playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13883
+ ["playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13884
+ ["playback_audio_stall_count", RTC_STALL_COUNT_BUCKETS],
13885
+ ["playback_audio_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13886
+ ["playback_audio_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13887
+ ["playback_gpu_render_p50_ms", GPU_RENDER_BUCKETS_MS],
13888
+ ["playback_gpu_render_p90_ms", GPU_RENDER_BUCKETS_MS],
13889
+ ["playback_gpu_render_p95_ms", GPU_RENDER_BUCKETS_MS],
13890
+ ["playback_latency_tap_1_ms", AUDIO_LATENCY_BUCKETS_MS],
13891
+ ["playback_latency_tap_2_ms", AUDIO_LATENCY_BUCKETS_MS],
13892
+ ["playback_latency_tap_4_ms", AUDIO_LATENCY_BUCKETS_MS],
13893
+ ["playback_latency_anim_0_ms", ANIM_LATENCY_BUCKETS_MS],
13894
+ ["playback_latency_anim_1_ms", ANIM_LATENCY_BUCKETS_MS],
13895
+ ["playback_latency_anim_2_ms", ANIM_LATENCY_BUCKETS_MS],
13767
13896
  ["rtc_playback_avg_fps", RTC_FPS_BUCKETS],
13768
13897
  ["rtc_playback_frame_count", RTC_FRAME_COUNT_BUCKETS],
13769
- ["rtc_playback_frames_lost", RTC_LOST_FRAME_BUCKETS],
13770
13898
  ["rtc_playback_skipped_frames", RTC_LOST_FRAME_BUCKETS],
13771
13899
  ["rtc_playback_tail_discarded", RTC_LOST_FRAME_BUCKETS],
13772
13900
  ["rtc_playback_stall_count", RTC_STALL_COUNT_BUCKETS],
13773
13901
  ["rtc_playback_start_transition_missing", RTC_LOST_FRAME_BUCKETS],
13774
13902
  ["rtc_playback_end_transition_missing", RTC_LOST_FRAME_BUCKETS],
13775
- ["rtc_playback_loss_rate_pct", RTC_PERCENT_BUCKETS],
13903
+ ["rtc_playback_skip_rate_pct", RTC_PERCENT_BUCKETS],
13776
13904
  ["rtc_playback_duration_ms", RTC_PLAYBACK_DURATION_BUCKETS_MS],
13777
13905
  ["rtc_playback_stall_total_ms", RTC_STALL_DURATION_BUCKETS_MS],
13778
- ["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS]
13906
+ ["rtc_playback_stall_max_ms", RTC_STALL_DURATION_BUCKETS_MS],
13907
+ ["rtc_transport_packets_lost", RTC_LOST_FRAME_BUCKETS],
13908
+ ["rtc_transport_packets_recovered", RTC_LOST_FRAME_BUCKETS],
13909
+ ["rtc_transport_packets_dropped", RTC_LOST_FRAME_BUCKETS],
13910
+ ["rtc_transport_packets_out_of_order", RTC_LOST_FRAME_BUCKETS]
13779
13911
  ];
13780
13912
  var METRIC_EXPORT_INTERVAL_MS = 1e4;
13781
13913
  var sdkVersion$2 = "1.0.0";
@@ -13823,7 +13955,7 @@ function initializeOtelMetrics(version, resourceAttrs) {
13823
13955
  type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
13824
13956
  options: { boundaries: HTTP_NETWORK_BUCKETS_MS }
13825
13957
  }
13826
- }, ...RTC_BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
13958
+ }, ...BUCKET_PROFILES.map(([instrumentName, boundaries]) => ({
13827
13959
  instrumentName,
13828
13960
  aggregation: {
13829
13961
  type: AggregationType.EXPLICIT_BUCKET_HISTOGRAM,
@@ -15197,7 +15329,7 @@ async function writeToLocalLog(message, level, extra = {}) {
15197
15329
  try {
15198
15330
  const { shouldPersist, sanitized } = sanitizeForLocalLog(message);
15199
15331
  if (!shouldPersist) return;
15200
- const { AvatarSDK } = await import("./AvatarSDK-BRDgRJ_Z.js").then((n) => n.n);
15332
+ const { AvatarSDK } = await import("./AvatarSDK-CTprrfJk.js").then((n) => n.n);
15201
15333
  const version = AvatarSDK.version;
15202
15334
  const appId = idManager.getAppId();
15203
15335
  const userId = idManager.getUserId();
@@ -1,5 +1,5 @@
1
1
  import { n as __exportAll } from "./rolldown-runtime-B-1-B7_t.js";
2
- import { t as logger } from "./logger-C61wOfFi.js";
2
+ import { t as logger } from "./logger-DdmfSEn-.js";
3
3
  //#region utils/pwa-cache-manager.ts
4
4
  /**
5
5
  * PWA Cache Manager
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@spatius/avatarkit",
3
3
  "type": "module",
4
- "version": "1.3.1-beta.5",
4
+ "version": "1.3.1-beta.7",
5
5
  "packageManager": "pnpm@10.18.2",
6
- "description": "AvatarKit SDK - Real-time Avatar Rendering SDK for Web",
6
+ "description": "AvatarKit real-time, audio-driven avatar rendering SDK for Web.",
7
+ "homepage": "https://spatius.ai/",
7
8
  "author": "AvatarKit Team",
8
9
  "license": "UNLICENSED",
9
10
  "keywords": [