@camstack/system 1.2.456 → 1.2.458

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/addon-runner.js +259 -37
  2. package/dist/addon-runner.mjs +289 -67
  3. package/dist/{agent-https-fm4AR8XL.mjs → agent-https-CQA3W-3e.mjs} +2 -2
  4. package/dist/{agent-https-yjxdfJDA.js → agent-https-DOELEug8.js} +2 -2
  5. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  8. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  9. package/dist/builtins/alerts/alerts.addon.js +2 -2
  10. package/dist/builtins/alerts/alerts.addon.mjs +2 -2
  11. package/dist/builtins/autotrack/index.js +1 -1
  12. package/dist/builtins/autotrack/index.mjs +1 -1
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  14. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  15. package/dist/builtins/calendars/calendars.addon.js +1 -1
  16. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  17. package/dist/builtins/camera-grid/index.js +1 -1
  18. package/dist/builtins/camera-grid/index.mjs +1 -1
  19. package/dist/builtins/composer/composer.addon.js +2 -2
  20. package/dist/builtins/composer/composer.addon.mjs +2 -2
  21. package/dist/builtins/console-logging/console-destination.d.ts +1 -2
  22. package/dist/builtins/console-logging/index.js +1 -4
  23. package/dist/builtins/console-logging/index.mjs +1 -4
  24. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  25. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  26. package/dist/builtins/device-history/capture/capture-engine.d.ts +6 -0
  27. package/dist/builtins/device-history/device-history.addon.d.ts +13 -0
  28. package/dist/builtins/device-history/device-history.addon.js +736 -315
  29. package/dist/builtins/device-history/device-history.addon.mjs +736 -315
  30. package/dist/builtins/device-history/ingest/producer-ingest.d.ts +11 -1
  31. package/dist/builtins/device-history/query/history-query.d.ts +35 -9
  32. package/dist/builtins/device-history/query/point-shape.d.ts +33 -0
  33. package/dist/builtins/device-history/retention/retention.d.ts +1 -1
  34. package/dist/builtins/device-history/rollup/rollup-engine.d.ts +2 -0
  35. package/dist/builtins/device-history/rollup/rollup-math.d.ts +6 -0
  36. package/dist/builtins/device-history/store/history-store.d.ts +7 -0
  37. package/dist/builtins/device-history/store/series-registry.d.ts +26 -1
  38. package/dist/builtins/device-manager/device-manager.addon.js +1 -1
  39. package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
  40. package/dist/builtins/hub-forwarder/hub-forwarder-destination.d.ts +1 -2
  41. package/dist/builtins/hub-forwarder/index.js +1 -4
  42. package/dist/builtins/hub-forwarder/index.mjs +1 -4
  43. package/dist/builtins/keychain/index.js +4 -4
  44. package/dist/builtins/keychain/index.mjs +4 -4
  45. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  46. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  47. package/dist/builtins/local-auth/local-auth.addon.js +3 -3
  48. package/dist/builtins/local-auth/local-auth.addon.mjs +3 -3
  49. package/dist/builtins/local-network/local-network.addon.js +2 -2
  50. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  51. package/dist/builtins/loki-logging/index.js +323 -7
  52. package/dist/builtins/loki-logging/index.mjs +323 -7
  53. package/dist/builtins/loki-logging/loki-destination.d.ts +20 -3
  54. package/dist/builtins/loki-logging/loki-read.d.ts +51 -0
  55. package/dist/builtins/native-metrics/native-metrics.addon.js +290 -112
  56. package/dist/builtins/native-metrics/native-metrics.addon.mjs +290 -112
  57. package/dist/builtins/native-metrics/node-metrics-history-recorder.d.ts +106 -35
  58. package/dist/builtins/platform-probe/coral-accelerators.d.ts +26 -9
  59. package/dist/builtins/platform-probe/index.js +11 -68
  60. package/dist/builtins/platform-probe/index.mjs +11 -68
  61. package/dist/builtins/record-entries/index.js +1 -1
  62. package/dist/builtins/record-entries/index.mjs +1 -1
  63. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  64. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  65. package/dist/builtins/snapshot/index.js +1 -1
  66. package/dist/builtins/snapshot/index.mjs +1 -1
  67. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  68. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  69. package/dist/builtins/sqlite-storage/index.js +1 -1
  70. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  71. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  72. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  73. package/dist/builtins/storage-orchestrator/location-history-recorder.d.ts +76 -0
  74. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.d.ts +9 -0
  75. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +144 -1
  76. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +144 -1
  77. package/dist/builtins/system-config/system-config.addon.js +3 -3
  78. package/dist/builtins/system-config/system-config.addon.mjs +3 -3
  79. package/dist/builtins/winston-logging/index.js +165 -3
  80. package/dist/builtins/winston-logging/index.mjs +165 -3
  81. package/dist/builtins/winston-logging/log-file-cursor.d.ts +12 -0
  82. package/dist/builtins/winston-logging/log-file-index-store.d.ts +11 -0
  83. package/dist/builtins/winston-logging/log-file-index.d.ts +77 -0
  84. package/dist/builtins/winston-logging/log-file-read-client.d.ts +44 -0
  85. package/dist/builtins/winston-logging/log-file-read-protocol.d.ts +41 -0
  86. package/dist/builtins/winston-logging/log-file-read-worker.d.ts +1 -0
  87. package/dist/builtins/winston-logging/log-file-reader.d.ts +51 -0
  88. package/dist/builtins/winston-logging/winston-destination.d.ts +20 -2
  89. package/dist/{composition-sources-Ds0Vr6eD.mjs → composition-sources-BVguN7VV.mjs} +1 -1
  90. package/dist/{composition-sources-gB4coDJR.js → composition-sources-DURQNDJ4.js} +1 -1
  91. package/dist/{constants-i5oD_gLB.mjs → constants-FGjnsE2x.mjs} +1 -1
  92. package/dist/{constants-CavyKfHZ.js → constants-Njka8Cv6.js} +1 -1
  93. package/dist/coral-accelerators-Bi_c3Rft.js +175 -0
  94. package/dist/coral-accelerators-DcnZvctM.mjs +162 -0
  95. package/dist/{device-ca-bpoEr0zG.js → device-ca-BrVK_5s3.js} +1 -1
  96. package/dist/{device-ca-qz1Pmeu1.mjs → device-ca-lEaAQ9Xi.mjs} +1 -1
  97. package/dist/{dist-BpqA2CT0.js → dist-BZQjLPiz.js} +526 -57
  98. package/dist/{dist-BSF_C8W2.mjs → dist-B_GRPhnY.mjs} +509 -58
  99. package/dist/file-host-worker.js +1 -1
  100. package/dist/file-host-worker.mjs +1 -1
  101. package/dist/{hub-mdns-ciao-CHaGDzyz.mjs → hub-mdns-ciao-Bg2HfTwP.mjs} +2 -2
  102. package/dist/{hub-mdns-ciao-CZlZRxxA.js → hub-mdns-ciao-nce3TXs_.js} +2 -2
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.js +140 -48
  105. package/dist/index.mjs +134 -49
  106. package/dist/kernel/config-schema.d.ts +5 -0
  107. package/dist/kernel/hwaccel/hwaccel-resolver.d.ts +7 -3
  108. package/dist/kernel/moleculer/accessory-prune-gate.d.ts +55 -0
  109. package/dist/log-file-read-protocol-B7M3X3bT.mjs +785 -0
  110. package/dist/log-file-read-protocol-D0WcLbIV.js +817 -0
  111. package/dist/log-file-read-worker.js +64 -0
  112. package/dist/log-file-read-worker.mjs +64 -0
  113. package/dist/log-read-filter-Bi066jwU.js +134 -0
  114. package/dist/log-read-filter-D7Ev3zm-.mjs +93 -0
  115. package/dist/logging/log-manager.d.ts +10 -6
  116. package/dist/logging/log-read-filter.d.ts +43 -0
  117. package/dist/{phase6-declare-gate-n-IZRklX.js → phase6-declare-gate-Dag1_WR2.js} +1 -1
  118. package/dist/{phase6-declare-gate-B4yfsf2n.mjs → phase6-declare-gate-Lb-mrVvz.mjs} +1 -1
  119. package/dist/{restore-archive-BGUM4FKf.mjs → restore-archive-C7kLDI_0.mjs} +1 -1
  120. package/dist/{restore-archive-B4QG7XmX.js → restore-archive-FyfZ8YMC.js} +1 -1
  121. package/dist/{wal-maintenance-CNEs_I94.js → wal-maintenance-DfSIOj24.js} +0 -0
  122. package/dist/{wal-maintenance-AerF4XE6.mjs → wal-maintenance-Duejh7Lx.mjs} +0 -0
  123. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import { register } from "node:module";
2
- import * as fs from "node:fs";
3
- import { createReadStream, createWriteStream, existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import * as fs$1 from "node:fs";
3
+ import fs, { createReadStream, createWriteStream, existsSync, readFileSync, readdirSync } from "node:fs";
4
4
  import * as path from "node:path";
5
5
  import { dirname, isAbsolute, join } from "node:path";
6
6
  import { BOOT_RECOVERY_BACKOFF_MS, CALLER_STAMPED_CAPABILITIES, DATAPLANE_SECRET_HEADER, DEVICE_CHILDREN_BATCH_MAX, DeviceType, DisposerChain, ErrorI18nPayloadSchema, EventCategory, PEER_BYTES_CHUNK_BYTES, PEER_BYTES_MAX_OUTSTANDING, PEER_BYTES_STALL_MS, PEER_BYTES_TICKET_TTL_MS, ReadinessRegistry, ReadinessTimeoutError, addonSliceHandleApi, asJsonObject, asString, collectZodSecretPaths, createDeviceProxy, createEventBusSliceSource, createRecordsAccess, createSecretsAccess, describeCustomActions, deviceOpsCapability, emitReadiness, errMsg, expandCapMethods, isCollectionArrayMethodName, isProviderOptionalMethodName, maskUrlCredentials, normalizeAddonInitResult, readErrorI18n, readNodePin, resolveSecretViewsIn, scopeKey, scrubKnownSecrets, withCapInputDefaults } from "@camstack/types/addon";
@@ -222,7 +222,7 @@ async function defaultDownloadTarball(url, destTgz) {
222
222
  const res = await fetch(url);
223
223
  if (!res.ok || !res.body) throw new Error(`HTTP ${res.status} downloading ${url}`);
224
224
  const bytes = Buffer.from(await res.arrayBuffer());
225
- await fs.promises.writeFile(destTgz, bytes);
225
+ await fs$1.promises.writeFile(destTgz, bytes);
226
226
  }
227
227
  async function defaultExtractTarball(tgzPath, destDir) {
228
228
  await execFileAsync$3("tar", [
@@ -308,7 +308,7 @@ async function resolveUncached(options) {
308
308
  argsPrefix: []
309
309
  };
310
310
  const cliPath = bootstrappedCliPath(options.cacheDir);
311
- if (fs.existsSync(cliPath)) {
311
+ if (fs$1.existsSync(cliPath)) {
312
312
  options.logger.info("system npm unavailable — using bootstrapped npm", { meta: { cliPath } });
313
313
  return {
314
314
  command: process.execPath,
@@ -320,12 +320,12 @@ async function resolveUncached(options) {
320
320
  const registry = (options.registry ?? DEFAULT_REGISTRY).replace(/\/+$/, "");
321
321
  const tarballUrl = tarballUrlOf(await (options.fetchJson ?? defaultFetchJson)(`${registry}/npm/latest`));
322
322
  if (!tarballUrl) throw new Error(`registry metadata for 'npm' carries no dist.tarball (${registry})`);
323
- await fs.promises.mkdir(options.cacheDir, { recursive: true });
323
+ await fs$1.promises.mkdir(options.cacheDir, { recursive: true });
324
324
  const tgzPath = path.join(options.cacheDir, "npm-bootstrap.tgz");
325
325
  await (options.downloadTarball ?? defaultDownloadTarball)(tarballUrl, tgzPath);
326
326
  await (options.extractTarball ?? defaultExtractTarball)(tgzPath, options.cacheDir);
327
- await fs.promises.rm(tgzPath, { force: true });
328
- if (!fs.existsSync(cliPath)) throw new Error(`extracted npm tarball is missing ${cliPath}`);
327
+ await fs$1.promises.rm(tgzPath, { force: true });
328
+ if (!fs$1.existsSync(cliPath)) throw new Error(`extracted npm tarball is missing ${cliPath}`);
329
329
  options.logger.info("npm bootstrapped", { meta: { cliPath } });
330
330
  return {
331
331
  command: process.execPath,
@@ -389,7 +389,7 @@ async function installManifestNativeDeps(addonDir, pkgRaw, logger, registry, npm
389
389
  count: Object.keys(native).length
390
390
  } });
391
391
  try {
392
- fs.writeFileSync(markerFile, markerHash);
392
+ fs$1.writeFileSync(markerFile, markerHash);
393
393
  } catch (err) {
394
394
  logger.warn("Failed to write native deps marker", { meta: {
395
395
  markerFile,
@@ -427,7 +427,7 @@ async function installManifestNativeDeps(addonDir, pkgRaw, logger, registry, npm
427
427
  }
428
428
  await rebuildNativeDeps(addonDir, pending.map(([name]) => name), logger, npmCacheDir ?? defaultNpmCacheDir(), registry);
429
429
  try {
430
- fs.writeFileSync(markerFile, markerHash);
430
+ fs$1.writeFileSync(markerFile, markerHash);
431
431
  } catch (err) {
432
432
  logger.warn("Failed to write native deps marker", { meta: {
433
433
  markerFile,
@@ -449,12 +449,12 @@ function copyPrebuiltNativeDep(name, addonDir, logger) {
449
449
  if (source === target) continue;
450
450
  if (!hasBuiltBinary(source)) continue;
451
451
  try {
452
- fs.rmSync(target, {
452
+ fs$1.rmSync(target, {
453
453
  recursive: true,
454
454
  force: true
455
455
  });
456
- fs.mkdirSync(path.dirname(target), { recursive: true });
457
- fs.cpSync(source, target, {
456
+ fs$1.mkdirSync(path.dirname(target), { recursive: true });
457
+ fs$1.cpSync(source, target, {
458
458
  recursive: true,
459
459
  dereference: true
460
460
  });
@@ -476,12 +476,12 @@ function copyPrebuiltNativeDep(name, addonDir, logger) {
476
476
  }
477
477
  /** A package dir is "built" when it carries a compiled `.node` or a prebuilds tree. */
478
478
  function hasBuiltBinary(pkgDir) {
479
- if (!fs.existsSync(path.join(pkgDir, "package.json"))) return false;
479
+ if (!fs$1.existsSync(path.join(pkgDir, "package.json"))) return false;
480
480
  const releaseDir = path.join(pkgDir, "build", "Release");
481
481
  try {
482
- if (fs.existsSync(releaseDir) && fs.readdirSync(releaseDir).some((f) => f.endsWith(".node"))) return true;
482
+ if (fs$1.existsSync(releaseDir) && fs$1.readdirSync(releaseDir).some((f) => f.endsWith(".node"))) return true;
483
483
  } catch {}
484
- return fs.existsSync(path.join(pkgDir, "prebuilds"));
484
+ return fs$1.existsSync(path.join(pkgDir, "prebuilds"));
485
485
  }
486
486
  /** Candidate hoisted locations for `<name>`: NODE_PATH entries + ancestors of `addonDir`. */
487
487
  function candidateHoistedDirs(name, addonDir) {
@@ -519,7 +519,7 @@ function hashDeclaration(deps) {
519
519
  }
520
520
  function markerMatches(markerFile, expected) {
521
521
  try {
522
- return fs.readFileSync(markerFile, "utf-8").trim() === expected;
522
+ return fs$1.readFileSync(markerFile, "utf-8").trim() === expected;
523
523
  } catch {
524
524
  return false;
525
525
  }
@@ -5443,6 +5443,67 @@ function createChildrenBatchLoader(opts) {
5443
5443
  } };
5444
5444
  }
5445
5445
  //#endregion
5446
+ //#region src/kernel/moleculer/accessory-prune-gate.ts
5447
+ function isSpecList(answer) {
5448
+ return Array.isArray(answer);
5449
+ }
5450
+ function classifyAccessoryRead(answer, ctx) {
5451
+ if (isSpecList(answer)) {
5452
+ if (!ctx.online) return {
5453
+ kind: "unknown",
5454
+ reason: "parent offline",
5455
+ children: answer
5456
+ };
5457
+ if (ctx.probedAt === 0) return {
5458
+ kind: "unknown",
5459
+ reason: "probe not yet completed",
5460
+ children: answer
5461
+ };
5462
+ return {
5463
+ kind: "successful",
5464
+ children: answer
5465
+ };
5466
+ }
5467
+ if (answer.kind === "unknown") return {
5468
+ kind: "unknown",
5469
+ reason: answer.reason,
5470
+ children: answer.known ?? []
5471
+ };
5472
+ return {
5473
+ kind: "successful",
5474
+ children: answer.children
5475
+ };
5476
+ }
5477
+ /** One per parent registration; in-memory on purpose (a restart starts over — the safe direction). */
5478
+ var AccessoryShrinkGate = class {
5479
+ /** childId → the probe (`lastProbedAt`) of the first successful read that lacked it. */
5480
+ #firstMissing = /* @__PURE__ */ new Map();
5481
+ /**
5482
+ * `missing` = the managed children a SUCCESSFUL read no longer lists. Never
5483
+ * call this for an unknown read.
5484
+ */
5485
+ decide(missing, probedAt) {
5486
+ const missingSet = new Set(missing);
5487
+ for (const id of [...this.#firstMissing.keys()]) if (!missingSet.has(id)) this.#firstMissing.delete(id);
5488
+ const prune = [];
5489
+ const deferred = [];
5490
+ for (const id of missing) {
5491
+ const first = this.#firstMissing.get(id);
5492
+ if (first !== void 0 && probedAt > first) {
5493
+ prune.push(id);
5494
+ this.#firstMissing.delete(id);
5495
+ continue;
5496
+ }
5497
+ if (first === void 0) this.#firstMissing.set(id, probedAt);
5498
+ deferred.push(id);
5499
+ }
5500
+ return {
5501
+ prune,
5502
+ deferred
5503
+ };
5504
+ }
5505
+ };
5506
+ //#endregion
5446
5507
  //#region src/kernel/moleculer/runtime-state-load.ts
5447
5508
  /** A device build refused because its runtime state could not be loaded. */
5448
5509
  var RuntimeStateLoadError = class extends Error {
@@ -6176,6 +6237,7 @@ function createBrokerDeviceManagerApi(opts) {
6176
6237
  throw err;
6177
6238
  }
6178
6239
  const lifecycleHost = device;
6240
+ const shrinkGate = new AccessoryShrinkGate();
6179
6241
  const runReconcile = async () => {
6180
6242
  try {
6181
6243
  await callDeviceManager(api, "registerDevice", {
@@ -6199,7 +6261,12 @@ function createBrokerDeviceManagerApi(opts) {
6199
6261
  });
6200
6262
  }
6201
6263
  if (typeof lifecycleHost.getAccessoryChildren !== "function") return;
6202
- const specs = lifecycleHost.getAccessoryChildren();
6264
+ const probedAt = device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0;
6265
+ const read = classifyAccessoryRead(lifecycleHost.getAccessoryChildren(), {
6266
+ online: device.online,
6267
+ probedAt
6268
+ });
6269
+ const specs = read.children;
6203
6270
  const expected = new Set(specs.map((s) => `${device.stableId}-${s.stableIdSuffix}`));
6204
6271
  await runBounded(specs, ACCESSORY_SPAWN_CONCURRENCY, async (spec) => {
6205
6272
  try {
@@ -6217,24 +6284,42 @@ function createBrokerDeviceManagerApi(opts) {
6217
6284
  });
6218
6285
  }
6219
6286
  });
6220
- if ((device.runtimeState?.getCapState("feature-probe")?.lastProbedAt ?? 0) === 0 && specs.length === 0) {
6221
- opts.logger.debug("Accessory orphan reconciliation skipped — probe not yet completed", { tags: {
6222
- parentDeviceId: device.id,
6223
- parentStableId: device.stableId
6224
- } });
6287
+ if (read.kind === "unknown") {
6288
+ opts.logger.info("Accessory orphan reconciliation skipped — child list unknown", {
6289
+ tags: {
6290
+ deviceId: device.id,
6291
+ parentStableId: device.stableId
6292
+ },
6293
+ meta: {
6294
+ reason: read.reason,
6295
+ probedAt
6296
+ }
6297
+ });
6225
6298
  return;
6226
6299
  }
6227
6300
  try {
6228
- const currentChildren = await childrenLoader.load(device.id);
6229
- for (const child of currentChildren) {
6230
- if (child.linkDeviceId !== device.id) continue;
6231
- if (expected.has(child.stableId)) continue;
6301
+ const missing = (await childrenLoader.load(device.id)).filter((child) => child.linkDeviceId === device.id && !expected.has(child.stableId));
6302
+ const decision = shrinkGate.decide(missing.map((child) => child.id), probedAt);
6303
+ if (decision.deferred.length > 0) opts.logger.info("Accessory children missing from a complete read — kept until a later probe agrees", {
6304
+ tags: {
6305
+ deviceId: device.id,
6306
+ parentStableId: device.stableId
6307
+ },
6308
+ meta: {
6309
+ childDeviceIds: [...decision.deferred],
6310
+ probedAt
6311
+ }
6312
+ });
6313
+ const confirmed = new Set(decision.prune);
6314
+ for (const child of missing) {
6315
+ if (!confirmed.has(child.id)) continue;
6232
6316
  const live = registry.getById(child.id);
6233
6317
  try {
6234
6318
  if (live) await deviceApi.remove(child.id);
6235
6319
  else await callDeviceManager(api, "removeDevice", { deviceId: child.id });
6236
6320
  opts.logger.info("Removed orphan accessory child no longer in parent specs", {
6237
6321
  tags: {
6322
+ deviceId: child.id,
6238
6323
  parentDeviceId: device.id,
6239
6324
  parentStableId: device.stableId
6240
6325
  },
@@ -6247,6 +6332,7 @@ function createBrokerDeviceManagerApi(opts) {
6247
6332
  } catch (err) {
6248
6333
  opts.logger.warn("Failed to remove orphan accessory child", {
6249
6334
  tags: {
6335
+ deviceId: child.id,
6250
6336
  parentDeviceId: device.id,
6251
6337
  parentStableId: device.stableId,
6252
6338
  childDeviceId: child.id
@@ -7755,6 +7841,166 @@ function ipcParentLink(getCallOut) {
7755
7841
  };
7756
7842
  }
7757
7843
  //#endregion
7844
+ //#region src/builtins/platform-probe/coral-accelerators.ts
7845
+ /**
7846
+ * Coral USB Edge TPU USB identifiers.
7847
+ *
7848
+ * The device enumerates as `1a6e:089a` (Global Unichip) BEFORE the libedgetpu
7849
+ * firmware loads, then re-enumerates as `18d1:9302` (Google) AFTER. Either id
7850
+ * means a Coral is physically attached, so both count as a positive signal.
7851
+ */
7852
+ var CORAL_USB_IDS = [{
7853
+ vendor: "1a6e",
7854
+ product: "089a"
7855
+ }, {
7856
+ vendor: "18d1",
7857
+ product: "9302"
7858
+ }];
7859
+ /** The PCIe / M.2 Coral's PCI function id (Global Unichip "Apex"). */
7860
+ var CORAL_PCI_VENDOR = "0x1ac1";
7861
+ var CORAL_PCI_DEVICE = "0x089a";
7862
+ /** A unit the apex driver bound: `/sys/class/apex/apex_<N>` ↔ `/dev/apex_<N>`. */
7863
+ var APEX_ENTRY = /^apex_(\d+)$/;
7864
+ /**
7865
+ * Default install path of the libedgetpu delegate on the hub, provisioned
7866
+ * out-of-band by `/data/deps/edgetpu-install.sh` (it is a system shared
7867
+ * library, not a pip package). Overridable via `CAMSTACK_EDGETPU_LIB` — kept in
7868
+ * sync with the Python pool's own default in `inference_pool.py`.
7869
+ */
7870
+ var DEFAULT_EDGETPU_LIB = "/data/deps/edgetpu/lib/libedgetpu.so.1";
7871
+ function countUsbCorals(fsx) {
7872
+ let count = 0;
7873
+ for (const device of fsx.listUsbDevices()) {
7874
+ const vendor = fsx.readUsbAttr(device, "idVendor").toLowerCase();
7875
+ const product = fsx.readUsbAttr(device, "idProduct").toLowerCase();
7876
+ if (CORAL_USB_IDS.some((id) => id.vendor === vendor && id.product === product)) count++;
7877
+ }
7878
+ return count;
7879
+ }
7880
+ function countPciCorals(fsx) {
7881
+ let count = 0;
7882
+ for (const device of fsx.listPciDevices()) {
7883
+ const vendor = fsx.readPciAttr(device, "vendor").toLowerCase();
7884
+ const product = fsx.readPciAttr(device, "device").toLowerCase();
7885
+ if (vendor === CORAL_PCI_VENDOR && product === CORAL_PCI_DEVICE) count++;
7886
+ }
7887
+ return count;
7888
+ }
7889
+ /**
7890
+ * PCIe units: each `/sys/class/apex/apex_N` is a unit the driver bound; it is
7891
+ * usable only when `/dev/apex_N` is in this process's view AND opens read/write.
7892
+ * PCI functions with the Coral id beyond the bound units have no driver.
7893
+ */
7894
+ function classifyPci(fsx) {
7895
+ let usable = 0;
7896
+ let notAccessible = 0;
7897
+ for (const entry of fsx.listApexClass()) {
7898
+ const match = APEX_ENTRY.exec(entry);
7899
+ if (match === null) continue;
7900
+ const node = `/dev/apex_${match[1]}`;
7901
+ if (fsx.exists(node) && fsx.canOpen(node)) usable++;
7902
+ else notAccessible++;
7903
+ }
7904
+ const driverMissing = Math.max(0, countPciCorals(fsx) - usable - notAccessible);
7905
+ return {
7906
+ usable,
7907
+ notAccessible,
7908
+ driverMissing
7909
+ };
7910
+ }
7911
+ /**
7912
+ * Detect Coral Edge TPUs on USB and PCIe/M.2.
7913
+ *
7914
+ * - USB: every matching USB device counts (multiple Corals run concurrently).
7915
+ * - PCIe: the apex driver's units, each usable only if its device node opens;
7916
+ * a Coral PCI function the driver did not bind is `driver-missing`.
7917
+ * - Fallback: when NO Coral signal of either bus is visible but the libedgetpu
7918
+ * delegate is installed (a container whose `/sys` USB view is limited), one
7919
+ * USB Coral is assumed — never when a PCI Coral was seen, since the delegate
7920
+ * then says nothing about USB.
7921
+ *
7922
+ * Returns `null` only when no Coral was found at all; a present-but-unusable
7923
+ * Coral is reported with its typed reason, never as absent (D393/D315).
7924
+ */
7925
+ function classifyCoralAccelerator(fsx) {
7926
+ const usb = countUsbCorals(fsx);
7927
+ const pci = classifyPci(fsx);
7928
+ const units = [];
7929
+ if (usb > 0) units.push({
7930
+ bus: "usb",
7931
+ count: usb
7932
+ });
7933
+ if (pci.usable > 0) units.push({
7934
+ bus: "pci",
7935
+ count: pci.usable
7936
+ });
7937
+ const unavailable = [];
7938
+ if (pci.driverMissing > 0) unavailable.push({
7939
+ bus: "pci",
7940
+ count: pci.driverMissing,
7941
+ reason: "driver-missing"
7942
+ });
7943
+ if (pci.notAccessible > 0) unavailable.push({
7944
+ bus: "pci",
7945
+ count: pci.notAccessible,
7946
+ reason: "device-not-accessible"
7947
+ });
7948
+ if (units.length > 0 || unavailable.length > 0) return unavailable.length > 0 ? {
7949
+ type: "coral-edgetpu",
7950
+ units,
7951
+ unavailable
7952
+ } : {
7953
+ type: "coral-edgetpu",
7954
+ units
7955
+ };
7956
+ const libPath = process.env["CAMSTACK_EDGETPU_LIB"] ?? DEFAULT_EDGETPU_LIB;
7957
+ if (fsx.exists(libPath)) return {
7958
+ type: "coral-edgetpu",
7959
+ units: [{
7960
+ bus: "usb",
7961
+ count: 1
7962
+ }]
7963
+ };
7964
+ return null;
7965
+ }
7966
+ function safeList(dir) {
7967
+ try {
7968
+ return fs.readdirSync(dir);
7969
+ } catch {
7970
+ return [];
7971
+ }
7972
+ }
7973
+ function safeRead(path) {
7974
+ try {
7975
+ return fs.readFileSync(path, "utf8").trim();
7976
+ } catch {
7977
+ return "";
7978
+ }
7979
+ }
7980
+ /** The real filesystem view: `/sys` for enumeration, `/dev` for access. */
7981
+ var nodeCoralFs = {
7982
+ listUsbDevices: () => safeList("/sys/bus/usb/devices"),
7983
+ readUsbAttr: (device, attr) => safeRead(`/sys/bus/usb/devices/${device}/${attr}`),
7984
+ listPciDevices: () => safeList("/sys/bus/pci/devices"),
7985
+ readPciAttr: (device, attr) => safeRead(`/sys/bus/pci/devices/${device}/${attr}`),
7986
+ listApexClass: () => safeList("/sys/class/apex"),
7987
+ canOpen: (path) => {
7988
+ try {
7989
+ fs.accessSync(path, fs.constants.R_OK | fs.constants.W_OK);
7990
+ return true;
7991
+ } catch {
7992
+ return false;
7993
+ }
7994
+ },
7995
+ exists: (path) => {
7996
+ try {
7997
+ return fs.existsSync(path);
7998
+ } catch {
7999
+ return false;
8000
+ }
8001
+ }
8002
+ };
8003
+ //#endregion
7758
8004
  //#region src/kernel/hwaccel/hwaccel-resolver.ts
7759
8005
  /**
7760
8006
  * Platform-probe for hardware video decode acceleration.
@@ -7774,35 +8020,11 @@ function ipcParentLink(getCallOut) {
7774
8020
  */
7775
8021
  function safeExistsSync(path) {
7776
8022
  try {
7777
- return fs.existsSync(path);
8023
+ return fs$1.existsSync(path);
7778
8024
  } catch {
7779
8025
  return false;
7780
8026
  }
7781
8027
  }
7782
- /**
7783
- * Detect a Coral USB Edge TPU: a matching USB device (`1a6e:089a` pre-init or
7784
- * `18d1:9302` post-init) OR the installed libedgetpu delegate (the hub
7785
- * provisions it out-of-band; its presence is a reliable "Coral is wired"
7786
- * signal even where the container's `/sys` USB view is limited).
7787
- */
7788
- function detectCoralUsb() {
7789
- const CORAL_IDS = [{
7790
- vendor: "1a6e",
7791
- product: "089a"
7792
- }, {
7793
- vendor: "18d1",
7794
- product: "9302"
7795
- }];
7796
- try {
7797
- for (const device of fs.readdirSync("/sys/bus/usb/devices")) try {
7798
- const base = `/sys/bus/usb/devices/${device}`;
7799
- const vendor = fs.readFileSync(`${base}/idVendor`, "utf8").trim().toLowerCase();
7800
- const product = fs.readFileSync(`${base}/idProduct`, "utf8").trim().toLowerCase();
7801
- if (CORAL_IDS.some((id) => id.vendor === vendor && id.product === product)) return true;
7802
- } catch {}
7803
- } catch {}
7804
- return safeExistsSync(process.env["CAMSTACK_EDGETPU_LIB"] ?? "/data/deps/edgetpu/lib/libedgetpu.so.1");
7805
- }
7806
8028
  /** Probe Linux GPU vendors by parsing /proc/bus/pci/devices or /sys/class/drm. */
7807
8029
  function probeLinuxGpus() {
7808
8030
  const signals = {
@@ -7811,17 +8033,17 @@ function probeLinuxGpus() {
7811
8033
  hasIntelGpu: false,
7812
8034
  hasRenderNode: false,
7813
8035
  hasIntelNpu: safeExistsSync("/dev/accel/accel0"),
7814
- hasCoral: detectCoralUsb()
8036
+ coral: classifyCoralAccelerator(nodeCoralFs)
7815
8037
  };
7816
8038
  signals.hasRenderNode = safeExistsSync("/dev/dri/renderD128");
7817
8039
  if (safeExistsSync("/dev/nvidia0") || safeExistsSync("/proc/driver/nvidia/version")) signals.hasNvidiaGpu = true;
7818
8040
  try {
7819
8041
  const drmDir = "/sys/class/drm";
7820
- if (fs.existsSync(drmDir)) for (const entry of fs.readdirSync(drmDir)) {
8042
+ if (fs$1.existsSync(drmDir)) for (const entry of fs$1.readdirSync(drmDir)) {
7821
8043
  if (!entry.startsWith("card")) continue;
7822
8044
  const vendorPath = `${drmDir}/${entry}/device/vendor`;
7823
8045
  if (!safeExistsSync(vendorPath)) continue;
7824
- const vendor = fs.readFileSync(vendorPath, "utf8").trim().toLowerCase();
8046
+ const vendor = fs$1.readFileSync(vendorPath, "utf8").trim().toLowerCase();
7825
8047
  if (vendor === "0x10de") signals.hasNvidiaGpu = true;
7826
8048
  else if (vendor === "0x1002") signals.hasAmdGpu = true;
7827
8049
  else if (vendor === "0x8086") signals.hasIntelGpu = true;
@@ -7845,7 +8067,7 @@ function probePlatform() {
7845
8067
  hasIntelGpu: false,
7846
8068
  hasRenderNode: false,
7847
8069
  hasIntelNpu: false,
7848
- hasCoral: safeExistsSync(process.env["CAMSTACK_EDGETPU_LIB"] ?? "/data/deps/edgetpu/lib/libedgetpu.so.1")
8070
+ coral: classifyCoralAccelerator(nodeCoralFs)
7849
8071
  };
7850
8072
  }
7851
8073
  function pickBackendsForPlatform(signals) {
@@ -7936,7 +8158,7 @@ function mapSignalsToInferenceHardware(signals) {
7936
8158
  return {
7937
8159
  gpu: signals.hasNvidiaGpu ? { type: "nvidia" } : signals.hasAmdGpu ? { type: "amd" } : signals.hasIntelGpu ? { type: "intel" } : signals.hasRenderNode ? { type: "intel" } : null,
7938
8160
  npu: signals.platform === "darwin" && signals.arch === "arm64" ? { type: "apple-ane" } : signals.hasIntelNpu ? { type: "intel-npu" } : null,
7939
- coral: signals.hasCoral ? { type: "coral-edgetpu" } : null
8161
+ coral: signals.coral
7940
8162
  };
7941
8163
  }
7942
8164
  /**
@@ -8680,21 +8902,21 @@ function sleep(ms) {
8680
8902
  * crashed holder) is stolen.
8681
8903
  */
8682
8904
  async function withFileLock(lockPath, fn) {
8683
- fs.mkdirSync(join(lockPath, ".."), { recursive: true });
8905
+ fs$1.mkdirSync(join(lockPath, ".."), { recursive: true });
8684
8906
  for (;;) try {
8685
- const fd = fs.openSync(lockPath, "wx");
8686
- fs.closeSync(fd);
8907
+ const fd = fs$1.openSync(lockPath, "wx");
8908
+ fs$1.closeSync(fd);
8687
8909
  break;
8688
8910
  } catch {
8689
8911
  try {
8690
- if (Date.now() - fs.statSync(lockPath).mtimeMs > LOCK_STALE_MS) fs.rmSync(lockPath, { force: true });
8912
+ if (Date.now() - fs$1.statSync(lockPath).mtimeMs > LOCK_STALE_MS) fs$1.rmSync(lockPath, { force: true });
8691
8913
  else await sleep(LOCK_POLL_MS);
8692
8914
  } catch {}
8693
8915
  }
8694
8916
  try {
8695
8917
  return await fn();
8696
8918
  } finally {
8697
- fs.rmSync(lockPath, { force: true });
8919
+ fs$1.rmSync(lockPath, { force: true });
8698
8920
  }
8699
8921
  }
8700
8922
  /** Coalesce in-process + serialize cross-process for one binary id. */
@@ -10249,7 +10471,7 @@ async function buildAddonContext(runtime, declaration, dataDir, options) {
10249
10471
  const addonId = declaration.id;
10250
10472
  const nodeDataDir = process.env["CAMSTACK_DATA"] ?? dataDir;
10251
10473
  const addonDataDir = path.resolve(nodeDataDir, "addons-data", addonId);
10252
- fs.mkdirSync(addonDataDir, { recursive: true });
10474
+ fs$1.mkdirSync(addonDataDir, { recursive: true });
10253
10475
  if (runtime.mode === "broker") ensureBindingSubscription(runtime.broker);
10254
10476
  const regs = getRegistries(nodeId);
10255
10477
  const workerResolver = {
@@ -11117,11 +11339,11 @@ function parseAddonsSpec(raw) {
11117
11339
  }
11118
11340
  async function loadAddonModule(addonId, addonDir) {
11119
11341
  const pkgJsonPath = path.join(addonDir, "package.json");
11120
- if (!fs.existsSync(pkgJsonPath)) throw new Error(`No package.json at ${addonDir}`);
11121
- const declaration = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8"))["camstack"]?.addons?.find((a) => a.id === addonId);
11342
+ if (!fs$1.existsSync(pkgJsonPath)) throw new Error(`No package.json at ${addonDir}`);
11343
+ const declaration = JSON.parse(fs$1.readFileSync(pkgJsonPath, "utf-8"))["camstack"]?.addons?.find((a) => a.id === addonId);
11122
11344
  if (!declaration?.entry) throw new Error(`Addon "${addonId}" not found in ${pkgJsonPath} manifest`);
11123
11345
  const entryPath = path.resolve(addonDir, declaration.entry);
11124
- if (!fs.existsSync(entryPath)) throw new Error(`Entry point not found: ${entryPath}`);
11346
+ if (!fs$1.existsSync(entryPath)) throw new Error(`Entry point not found: ${entryPath}`);
11125
11347
  const modUnknown = await import(entryPath);
11126
11348
  const mod = isRecord(modUnknown) ? modUnknown : {};
11127
11349
  const AddonClass = resolveAddonClass(mod);
@@ -11318,7 +11540,7 @@ async function main() {
11318
11540
  });
11319
11541
  if (context.secrets !== void 0) addonSecrets.set(spec.addonId, context.secrets);
11320
11542
  try {
11321
- const pkgRaw = JSON.parse(fs.readFileSync(path.join(spec.addonDir, "package.json"), "utf-8"));
11543
+ const pkgRaw = JSON.parse(fs$1.readFileSync(path.join(spec.addonDir, "package.json"), "utf-8"));
11322
11544
  await installManifestNativeDeps(spec.addonDir, pkgRaw, context.logger);
11323
11545
  } catch (nativeErr) {
11324
11546
  console.error(`[addon-runner] native deps install failed for "${spec.addonId}": ${errMsg(nativeErr)}`);
@@ -11381,7 +11603,7 @@ async function main() {
11381
11603
  const refusal = findAddonRefusal(err);
11382
11604
  if (refusal !== null) {
11383
11605
  try {
11384
- fs.writeSync(1, formatRunnerRefusalLine(nodeId, refusalReportOf(spec.addonId, refusal)));
11606
+ fs$1.writeSync(1, formatRunnerRefusalLine(nodeId, refusalReportOf(spec.addonId, refusal)));
11385
11607
  } catch {}
11386
11608
  process.exit(78);
11387
11609
  }
@@ -1,6 +1,6 @@
1
- import { Ui as defineRecordKinds } from "./dist-BSF_C8W2.mjs";
1
+ import { Ki as defineRecordKinds } from "./dist-B_GRPhnY.mjs";
2
2
  import { S as backdatedNotBefore, _ as NameConstraints, a as KeyUsageFlags, c as Pkcs10CertificateRequest, d as SubjectKeyIdentifierExtension, f as X509Certificate$1, g as GeneralSubtrees, h as GeneralSubtree, i as Extension, l as Pkcs10CertificateRequestGenerator, m as cryptoProvider, n as BasicConstraintsExtension, o as KeyUsagesExtension, p as X509CertificateGenerator, r as ExtendedKeyUsageExtension, s as PemConverter, t as AuthorityKeyIdentifierExtension, u as SubjectAlternativeNameExtension, v as GeneralName, x as AsnConvert } from "./x509.es-DK__ETIe.mjs";
3
- import { c as SERVER_AUTH_OID$1, r as MESH_CA_COMMON_NAME, s as MESH_CA_VALIDITY_DAYS, t as CLIENT_AUTH_OID } from "./constants-i5oD_gLB.mjs";
3
+ import { c as SERVER_AUTH_OID$1, r as MESH_CA_COMMON_NAME, s as MESH_CA_VALIDITY_DAYS, t as CLIENT_AUTH_OID } from "./constants-FGjnsE2x.mjs";
4
4
  import { z } from "zod";
5
5
  import { X509Certificate, createHash, createPrivateKey, randomBytes, webcrypto } from "node:crypto";
6
6
  import { writeOwnerOnlyFileSync } from "@camstack/types/node";
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-BpqA2CT0.js");
2
+ const require_dist = require("./dist-BZQjLPiz.js");
3
3
  const require_x509_es = require("./x509.es-C4cOo48M.js");
4
- const require_constants = require("./constants-CavyKfHZ.js");
4
+ const require_constants = require("./constants-Njka8Cv6.js");
5
5
  let zod = require("zod");
6
6
  let node_crypto = require("node:crypto");
7
7
  let _camstack_types_node = require("@camstack/types/node");
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-BpqA2CT0.js");
6
+ const require_dist = require("../../dist-BZQjLPiz.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $r as BaseAddon, Qr as errMsg, Ta as EventCategory, gt as addonPagesCapability } from "../../dist-BSF_C8W2.mjs";
1
+ import { Oa as EventCategory, ni as BaseAddon, ti as errMsg, yt as addonPagesCapability } from "../../dist-B_GRPhnY.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-BpqA2CT0.js");
6
+ const require_dist = require("../../dist-BZQjLPiz.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $r as BaseAddon, Qr as errMsg, Ta as EventCategory, vt as addonWidgetsCapability } from "../../dist-BSF_C8W2.mjs";
1
+ import { Oa as EventCategory, ni as BaseAddon, ti as errMsg, xt as addonWidgetsCapability } from "../../dist-B_GRPhnY.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-BpqA2CT0.js");
6
+ const require_dist = require("../../dist-BZQjLPiz.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
- const require_phase6_declare_gate = require("../../phase6-declare-gate-n-IZRklX.js");
8
+ const require_phase6_declare_gate = require("../../phase6-declare-gate-Dag1_WR2.js");
9
9
  //#region src/builtins/alerts/alert-episode-policy.ts
10
10
  /**
11
11
  * When does an alert open a new EPISODE, and which edge of it is announced?
@@ -1,6 +1,6 @@
1
- import { $r as BaseAddon, Qr as errMsg, Ta as EventCategory, Ui as defineRecordKinds, bt as alertEpisodePayload, i as AlertSchema, vn as isAlertEpisodeOpen, xt as alertsCapability, yn as isAlertEpisodeSeverity, yt as alertEpisodeId, zi as createEvent } from "../../dist-BSF_C8W2.mjs";
1
+ import { Ct as alertEpisodePayload, Hi as createEvent, Ki as defineRecordKinds, Oa as EventCategory, Sn as isAlertEpisodeSeverity, St as alertEpisodeId, i as AlertSchema, ni as BaseAddon, ti as errMsg, wt as alertsCapability, xn as isAlertEpisodeOpen } from "../../dist-B_GRPhnY.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { t as resolvePhase6UseRecordsPathForHub } from "../../phase6-declare-gate-B4yfsf2n.mjs";
3
+ import { t as resolvePhase6UseRecordsPathForHub } from "../../phase6-declare-gate-Lb-mrVvz.mjs";
4
4
  //#region src/builtins/alerts/alert-episode-policy.ts
5
5
  /**
6
6
  * When does an alert open a new EPISODE, and which edge of it is announced?
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-BpqA2CT0.js");
6
+ const require_dist = require("../../dist-BZQjLPiz.js");
7
7
  //#region src/builtins/autotrack/autotrack-config.ts
8
8
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
9
9
  deadZoneFraction: .5,
@@ -1,4 +1,4 @@
1
- import { $r as BaseAddon, I as FIRST_LEVEL_MACRO_CLASSES, Qr as errMsg, Ta as EventCategory, Tt as bareAddonId, Xi as isEvent, er as ptzAutotrackCapability } from "../../dist-BSF_C8W2.mjs";
1
+ import { $i as isEvent, L as FIRST_LEVEL_MACRO_CLASSES, Oa as EventCategory, Ot as bareAddonId, ni as BaseAddon, rr as ptzAutotrackCapability, ti as errMsg } from "../../dist-B_GRPhnY.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,