@camstack/system 1.2.110 → 1.2.112
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/dist/addon-runner.js +1 -1
- package/dist/addon-runner.mjs +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alerts.addon.js +1 -1
- package/dist/builtins/alerts/alerts.addon.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/core-blocks.addon.js +1 -1
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +1 -1
- package/dist/builtins/device-manager/device-manager.addon.js +2 -2
- package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
- package/dist/builtins/doorbell/virtual-doorbell.addon.js +1 -1
- package/dist/builtins/doorbell/virtual-doorbell.addon.mjs +1 -1
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/local-auth.addon.js +1 -1
- package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
- package/dist/builtins/local-network/local-network.addon.js +1 -1
- package/dist/builtins/local-network/local-network.addon.mjs +1 -1
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +72 -18
- package/dist/builtins/snapshot/index.mjs +72 -18
- package/dist/builtins/snapshot/snapshot.addon.d.ts +16 -0
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
- package/dist/builtins/system-config/system-config.addon.js +1 -1
- package/dist/builtins/system-config/system-config.addon.mjs +1 -1
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{dist-CQkr5Kw0.js → dist-IPLFQ_-A.js} +10 -1
- package/dist/{dist-CW4Cims4.mjs → dist-bkg2-2g3.mjs} +10 -1
- package/dist/index.js +87 -9
- package/dist/index.mjs +87 -9
- package/dist/kernel/capability-registry.d.ts +51 -3
- package/dist/kernel/index.d.ts +1 -1
- package/dist/kernel/lifecycle/staging-area.d.ts +1 -0
- package/dist/kernel/transport/child-cap-protocol.d.ts +12 -0
- package/dist/kernel/transport/local-child-registry.d.ts +9 -2
- package/dist/{manifest-python-deps-5ei2xVUh.mjs → manifest-python-deps-Cb1ANt3i.mjs} +35 -8
- package/dist/{manifest-python-deps-GejnH--L.js → manifest-python-deps-MA_BZGBz.js} +35 -8
- package/dist/{retired-settings-keys-DCESas5O.js → retired-settings-keys-B-I7w1Ta.js} +1 -1
- package/dist/{retired-settings-keys-DGgOxOir.mjs → retired-settings-keys-C7rRSzbP.mjs} +1 -1
- package/package.json +1 -1
package/dist/addon-runner.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Cek0wNdY.js");
|
|
2
|
-
const require_manifest_python_deps = require("./manifest-python-deps-
|
|
2
|
+
const require_manifest_python_deps = require("./manifest-python-deps-MA_BZGBz.js");
|
|
3
3
|
const require_custom_action_registry = require("./custom-action-registry-jY0NOZK8.js");
|
|
4
4
|
let node_path = require("node:path");
|
|
5
5
|
node_path = require_chunk.__toESM(node_path);
|
package/dist/addon-runner.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { I as createUdsLoggerWithControl, L as LocalChildClient, Pt as startRunnerHeapWatch, at as setWorkerNativeCapsChangeListener, bt as installManifestNativeDeps, i as createUdsAddonContext, nt as getWorkerNativeCapProvider, rt as getWorkerNativeCapSnapshot, st as validateProviderRegistrations, t as installManifestPythonDeps, xt as resolveAddonClass } from "./manifest-python-deps-
|
|
1
|
+
import { I as createUdsLoggerWithControl, L as LocalChildClient, Pt as startRunnerHeapWatch, at as setWorkerNativeCapsChangeListener, bt as installManifestNativeDeps, i as createUdsAddonContext, nt as getWorkerNativeCapProvider, rt as getWorkerNativeCapSnapshot, st as validateProviderRegistrations, t as installManifestPythonDeps, xt as resolveAddonClass } from "./manifest-python-deps-Cb1ANt3i.mjs";
|
|
2
2
|
import { t as CustomActionRegistry } from "./custom-action-registry-F__gp_VX.mjs";
|
|
3
3
|
import { register } from "node:module";
|
|
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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.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 { Gt as EventCategory, v as addonPagesCapability, vt as errMsg, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, v as addonPagesCapability, vt as errMsg, yt as BaseAddon } from "../../dist-bkg2-2g3.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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.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 { Gt as EventCategory, b as addonWidgetsCapability, vt as errMsg, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, b as addonWidgetsCapability, vt as errMsg, yt as BaseAddon } from "../../dist-bkg2-2g3.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
|
require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
//#region src/builtins/alerts/prune-policy.ts
|
|
8
8
|
/**
|
|
9
9
|
* Ids older than `cutoffMs`, oldest first.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gt as EventCategory, Mt as createEvent, n as AlertSchema, vt as errMsg, x as alertsCapability, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, Mt as createEvent, n as AlertSchema, vt as errMsg, x as alertsCapability, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
//#region src/builtins/alerts/prune-policy.ts
|
|
3
3
|
/**
|
|
4
4
|
* Ids older than `cutoffMs`, oldest first.
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
let buffer = require("buffer");
|
|
9
9
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as backupCapability, Gt as EventCategory, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { C as backupCapability, Gt as EventCategory, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { randomBytes, randomUUID } from "node:crypto";
|
|
3
3
|
import { Buffer as Buffer$1 } from "buffer";
|
|
4
4
|
import * as fsp from "node:fs/promises";
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
const require_formatter = require("../../formatter-DqAKDlvN.js");
|
|
8
8
|
//#region src/builtins/console-logging/console-destination.ts
|
|
9
9
|
var LEVEL_RANK = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
|
|
3
3
|
//#region src/builtins/console-logging/console-destination.ts
|
|
4
4
|
var LEVEL_RANK = {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_chunk = require("../../chunk-Cek0wNdY.js");
|
|
3
|
-
const require_dist = require("../../dist-
|
|
3
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
4
4
|
let node_crypto = require("node:crypto");
|
|
5
5
|
let node_fs_promises = require("node:fs/promises");
|
|
6
6
|
node_fs_promises = require_chunk.__toESM(node_fs_promises);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as coreBlockAddonId, O as coreBlockIdFromAddonId, c as CoreBlockSchema, k as coreBlocksCapability, l as DeclaredDevices, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX, vt as errMsg, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { D as coreBlockAddonId, O as coreBlockIdFromAddonId, c as CoreBlockSchema, k as coreBlocksCapability, l as DeclaredDevices, o as CORE_BLOCKS_ADDON_ID, s as CORE_BLOCK_ADDON_PREFIX, vt as errMsg, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import * as fs from "node:fs/promises";
|
|
4
4
|
import * as path$1 from "node:path";
|
|
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
7
|
-
const require_retired_settings_keys = require("../../retired-settings-keys-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
|
+
const require_retired_settings_keys = require("../../retired-settings-keys-B-I7w1Ta.js");
|
|
8
8
|
let node_crypto = require("node:crypto");
|
|
9
9
|
let _camstack_types_node = require("@camstack/types/node");
|
|
10
10
|
//#region src/builtins/device-manager/adoption-job-engine.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Ct as DeviceFeature, E as buildStreamParamsConfigSchema, F as deviceStatusCapability, Gt as EventCategory, Lt as isDeviceConfigCap, N as deviceManagerCapability, Ot as WELL_KNOWN_TAB_MAP, P as deviceStateCapability, R as enumerateItemArrayFields, Tt as DeviceType, Wt as sleep, a as CAP_NAMES_WITH_STATUS, at as runtimeStatePolicyFor, et as normalizeUnit, nt as parseStreamParamsFormPatch, p as STREAM_PROFILE_META, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, vt as errMsg, wt as DeviceRole, yt as BaseAddon, z as enumerateSchemaFields } from "../../dist-
|
|
2
|
-
import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-
|
|
1
|
+
import { Ct as DeviceFeature, E as buildStreamParamsConfigSchema, F as deviceStatusCapability, Gt as EventCategory, Lt as isDeviceConfigCap, N as deviceManagerCapability, Ot as WELL_KNOWN_TAB_MAP, P as deviceStateCapability, R as enumerateItemArrayFields, Tt as DeviceType, Wt as sleep, a as CAP_NAMES_WITH_STATUS, at as runtimeStatePolicyFor, et as normalizeUnit, nt as parseStreamParamsFormPatch, p as STREAM_PROFILE_META, t as ALL_CAPABILITY_DEFINITIONS, u as DeviceStatusSchema, vt as errMsg, wt as DeviceRole, yt as BaseAddon, z as enumerateSchemaFields } from "../../dist-bkg2-2g3.mjs";
|
|
2
|
+
import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-C7rRSzbP.mjs";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
import { canonicalDeviceFingerprint } from "@camstack/types/node";
|
|
5
5
|
//#region src/builtins/device-manager/adoption-job-engine.ts
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
//#region src/builtins/doorbell/trigger-engine.ts
|
|
8
8
|
/**
|
|
9
9
|
* Pure trigger logic for the virtual-doorbell builtin — edge detection over
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { G as isSameAddonId, Gt as EventCategory, I as doorbellCapability, Mt as createEvent, Tt as DeviceType, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { G as isSameAddonId, Gt as EventCategory, I as doorbellCapability, Mt as createEvent, Tt as DeviceType, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
//#region src/builtins/doorbell/trigger-engine.ts
|
|
3
3
|
/**
|
|
4
4
|
* Pure trigger logic for the virtual-doorbell builtin — edge detection over
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
const require_formatter = require("../../formatter-DqAKDlvN.js");
|
|
8
8
|
//#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
|
|
9
9
|
var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
|
|
3
3
|
//#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
|
|
4
4
|
var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
require("../../chunk-Cek0wNdY.js");
|
|
3
|
-
const require_dist = require("../../dist-
|
|
3
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
4
4
|
//#region src/builtins/liveness-monitor/liveness-checks.ts
|
|
5
5
|
var NO_DEVICES = "liveness:no-devices";
|
|
6
6
|
var ALL_OFFLINE = "liveness:all-devices-offline";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gt as EventCategory, Mt as createEvent, vt as errMsg, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, Mt as createEvent, vt as errMsg, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
//#region src/builtins/liveness-monitor/liveness-checks.ts
|
|
3
3
|
var NO_DEVICES = "liveness:no-devices";
|
|
4
4
|
var ALL_OFFLINE = "liveness:all-devices-offline";
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
node_crypto = require_chunk.__toESM(node_crypto);
|
|
9
9
|
let crypto$1 = require("crypto");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { i as __require, o as __toESM, t as __commonJSMin } from "../../chunk-CNf5ZN-e.mjs";
|
|
2
|
-
import { S as authProviderCapability, _ as UserRecordSchema, ht as userManagementCapability, m as ScopedTokenSchema, r as ApiKeyRecordSchema, yt as BaseAddon } from "../../dist-
|
|
2
|
+
import { S as authProviderCapability, _ as UserRecordSchema, ht as userManagementCapability, m as ScopedTokenSchema, r as ApiKeyRecordSchema, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
3
3
|
import * as crypto$2 from "node:crypto";
|
|
4
4
|
import { createHash, randomUUID, timingSafeEqual } from "node:crypto";
|
|
5
5
|
import nodeCrypto from "crypto";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_chunk = require("../../chunk-Cek0wNdY.js");
|
|
3
|
-
const require_dist = require("../../dist-
|
|
3
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
4
4
|
let node_os = require("node:os");
|
|
5
5
|
node_os = require_chunk.__toESM(node_os);
|
|
6
6
|
//#region src/builtins/local-network/local-network.addon.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gt as EventCategory, Y as localNetworkCapability, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, Y as localNetworkCapability, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import * as os from "node:os";
|
|
3
3
|
//#region src/builtins/local-network/local-network.addon.ts
|
|
4
4
|
/**
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
//#region src/builtins/loki-logging/loki-payload.ts
|
|
8
8
|
/**
|
|
9
9
|
* Loki rejects a label name that is not a valid Prometheus label
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { X as logDestinationCapability, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
//#region src/builtins/loki-logging/loki-payload.ts
|
|
3
3
|
/**
|
|
4
4
|
* Loki rejects a label name that is not a valid Prometheus label
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
let node_child_process = require("node:child_process");
|
|
8
8
|
let node_util = require("node:util");
|
|
9
9
|
let node_os = require("node:os");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { $ as metricsProviderCapability, Gt as EventCategory, Mt as createEvent, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { execFile, execFileSync } from "node:child_process";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import * as os from "node:os";
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
let node_child_process = require("node:child_process");
|
|
8
8
|
let node_util = require("node:util");
|
|
9
9
|
let node_os = require("node:os");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
|
|
2
|
-
import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-
|
|
2
|
+
import { Gt as EventCategory, L as enumerateInferenceDevices, Pt as emitReadiness, ct as scoreRuntimes, rt as platformProbeCapability, vt as errMsg, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
5
|
import * as os from "node:os";
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
//#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
|
|
8
8
|
/**
|
|
9
9
|
* Reconcile the durable `enabledProviders` set against authoritative
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Gt as EventCategory, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Gt as EventCategory, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
//#region src/builtins/remote-access-orchestrator/enabled-providers-reconcile.ts
|
|
3
3
|
/**
|
|
4
4
|
* Reconcile the durable `enabledProviders` set against authoritative
|
|
@@ -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-
|
|
6
|
+
const require_dist = require("../../dist-IPLFQ_-A.js");
|
|
7
7
|
let zod = require("zod");
|
|
8
8
|
let node_crypto = require("node:crypto");
|
|
9
9
|
let _camstack_types_node = require("@camstack/types/node");
|
|
@@ -939,6 +939,24 @@ function pickWarmSnapshotBroker(ranked, devicePrefix) {
|
|
|
939
939
|
//#endregion
|
|
940
940
|
//#region src/builtins/snapshot/snapshot.addon.ts
|
|
941
941
|
/**
|
|
942
|
+
* States that make a dial pointless — the ladder is skipped entirely.
|
|
943
|
+
*
|
|
944
|
+
* `offline` is deliberately absent: a camera that is never probed can never be
|
|
945
|
+
* observed to come back, and this layer's own capture is one of the two ways a
|
|
946
|
+
* wrong `online:false` gets discovered (the other is the reachability poller
|
|
947
|
+
* that set it).
|
|
948
|
+
*/
|
|
949
|
+
var CAPTURE_BLOCKING_REASONS = [
|
|
950
|
+
"disabled",
|
|
951
|
+
"sleeping",
|
|
952
|
+
"unreachable",
|
|
953
|
+
"waking"
|
|
954
|
+
];
|
|
955
|
+
/** True when this state must answer WITHOUT touching the camera. */
|
|
956
|
+
function blocksCapture(reason) {
|
|
957
|
+
return CAPTURE_BLOCKING_REASONS.includes(reason);
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
942
960
|
* How long `getSnapshotLinks` waits for the capture it triggered before minting
|
|
943
961
|
* the link over whatever frame it has.
|
|
944
962
|
*
|
|
@@ -1681,7 +1699,7 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
1681
1699
|
resolutionMeta.isBattery = isBatteryDevice;
|
|
1682
1700
|
delete resolutionMeta.stateReason;
|
|
1683
1701
|
}
|
|
1684
|
-
if (state.reason !== void 0 && (
|
|
1702
|
+
if (state.reason !== void 0 && blocksCapture(state.reason) && (!force || state.reason !== "sleeping")) {
|
|
1685
1703
|
if (resolutionMeta) resolutionMeta.stateReason = state.reason;
|
|
1686
1704
|
log.debug("snapshot: camera state overrides raw cache", {
|
|
1687
1705
|
tags: { deviceId },
|
|
@@ -1709,7 +1727,8 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
1709
1727
|
isBattery: isBatteryDevice
|
|
1710
1728
|
}
|
|
1711
1729
|
});
|
|
1712
|
-
|
|
1730
|
+
if (!hit) return null;
|
|
1731
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, hit, resolutionMeta) : hit.data;
|
|
1713
1732
|
}
|
|
1714
1733
|
const flightKey = `${deviceId}:${effectiveStreamId ?? "auto"}`;
|
|
1715
1734
|
const flight = this.captureFlight.run(flightKey, () => this.captureFresh({
|
|
@@ -1722,16 +1741,19 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
1722
1741
|
flight.catch(() => void 0);
|
|
1723
1742
|
const waitMs = !force && decision.staleFallback && hit !== void 0 ? Math.min(decision.waitMs, staleWaitCapMs) : decision.waitMs;
|
|
1724
1743
|
const raced = await raceForResult(flight, Math.min(Math.max(waitMs, minimumCaptureWaitMs), maximumCaptureWaitMs));
|
|
1725
|
-
if (raced.settled)
|
|
1726
|
-
const
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
if (
|
|
1744
|
+
if (raced.settled) {
|
|
1745
|
+
const captured = raced.value.ok && raced.value.image !== null;
|
|
1746
|
+
try {
|
|
1747
|
+
const resolved = await this.resolveOutcome(raced.value, deviceId, hit, log);
|
|
1748
|
+
if (resolved !== null) return captured || state.reason !== "offline" ? resolved : await this.offlineImage(deviceId, deviceName, hit, resolutionMeta);
|
|
1749
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, void 0, resolutionMeta) : null;
|
|
1750
|
+
} catch (err) {
|
|
1751
|
+
if (state.reason === "offline") {
|
|
1752
|
+
const stateFrame = await this.offlineImage(deviceId, deviceName, hit, resolutionMeta);
|
|
1753
|
+
if (stateFrame !== null) return stateFrame;
|
|
1754
|
+
}
|
|
1755
|
+
throw err;
|
|
1733
1756
|
}
|
|
1734
|
-
throw err;
|
|
1735
1757
|
}
|
|
1736
1758
|
if (decision.staleFallback && hit) {
|
|
1737
1759
|
if (prefs.snapshotDebug) log.debug("snapshot: SWR — returning stale frame; refresh continues in background", {
|
|
@@ -1741,11 +1763,11 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
1741
1763
|
waitMs: decision.waitMs
|
|
1742
1764
|
}
|
|
1743
1765
|
});
|
|
1744
|
-
return hit.data;
|
|
1766
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, hit, resolutionMeta) : hit.data;
|
|
1745
1767
|
}
|
|
1746
|
-
if (
|
|
1747
|
-
const
|
|
1748
|
-
if (
|
|
1768
|
+
if (state.reason === "offline") {
|
|
1769
|
+
const stateFrame = await this.offlineImage(deviceId, deviceName, void 0, resolutionMeta);
|
|
1770
|
+
if (stateFrame !== null) return stateFrame;
|
|
1749
1771
|
}
|
|
1750
1772
|
return null;
|
|
1751
1773
|
}
|
|
@@ -2104,7 +2126,12 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
2104
2126
|
meta: { error: require_dist.errMsg(err) }
|
|
2105
2127
|
});
|
|
2106
2128
|
}
|
|
2107
|
-
|
|
2129
|
+
const isBattery = meta?.isBattery === true || batteryStatus !== null || waking;
|
|
2130
|
+
const unreachableVerdict = meta?.online === false ? {
|
|
2131
|
+
isBattery,
|
|
2132
|
+
reason: "offline"
|
|
2133
|
+
} : null;
|
|
2134
|
+
if (!isBattery) return unreachableVerdict ?? { isBattery: false };
|
|
2108
2135
|
if (waking) return {
|
|
2109
2136
|
isBattery: true,
|
|
2110
2137
|
reason: "waking"
|
|
@@ -2113,10 +2140,11 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
2113
2140
|
status: batteryStatus,
|
|
2114
2141
|
nowMs: Date.now()
|
|
2115
2142
|
});
|
|
2116
|
-
|
|
2143
|
+
if (presence !== "awake") return {
|
|
2117
2144
|
isBattery: true,
|
|
2118
2145
|
reason: presence
|
|
2119
2146
|
};
|
|
2147
|
+
return unreachableVerdict ?? { isBattery: true };
|
|
2120
2148
|
}
|
|
2121
2149
|
isDeviceWaking(deviceId) {
|
|
2122
2150
|
const startedAt = this.wakingDevices.get(deviceId);
|
|
@@ -2299,6 +2327,32 @@ var SnapshotAddon = class SnapshotAddon extends require_dist.BaseAddon {
|
|
|
2299
2327
|
};
|
|
2300
2328
|
}
|
|
2301
2329
|
/**
|
|
2330
|
+
* The answer for a camera the hub cannot reach: its last good frame, with
|
|
2331
|
+
* `Offline` painted over it, and `offline` stamped on the response identity.
|
|
2332
|
+
*
|
|
2333
|
+
* Called only AFTER the ladder has run (offline is not in
|
|
2334
|
+
* {@link CAPTURE_BLOCKING_REASONS}), so this dresses a frame that could not be
|
|
2335
|
+
* refreshed — never one that just landed.
|
|
2336
|
+
*
|
|
2337
|
+
* The `stateReason` is set FIRST and unconditionally, because it is what a
|
|
2338
|
+
* surface labels the tile from and what puts `offline` in the ETag: a client
|
|
2339
|
+
* holding the live frame has to see a new identity the moment the camera
|
|
2340
|
+
* drops, or it paints the unlabelled photograph until the camera comes back.
|
|
2341
|
+
* A failed render therefore degrades to the raw frame rather than to nothing —
|
|
2342
|
+
* the metadata still says offline, so the tile is still honest.
|
|
2343
|
+
*/
|
|
2344
|
+
async offlineImage(deviceId, deviceName, hit, resolutionMeta) {
|
|
2345
|
+
if (resolutionMeta) resolutionMeta.stateReason = "offline";
|
|
2346
|
+
this.ctx.logger.debug("snapshot: serving the offline treatment", {
|
|
2347
|
+
tags: { deviceId },
|
|
2348
|
+
meta: {
|
|
2349
|
+
hasCache: hit !== void 0,
|
|
2350
|
+
ageMs: hit ? Date.now() - hit.ts : null
|
|
2351
|
+
}
|
|
2352
|
+
});
|
|
2353
|
+
return await this.stateImage(deviceId, "offline", deviceName, hit) ?? hit?.data ?? null;
|
|
2354
|
+
}
|
|
2355
|
+
/**
|
|
2302
2356
|
* Render a state-labelled answer. A cached real frame is the background, not
|
|
2303
2357
|
* the answer by itself; if it cannot be decoded, fall back to the generated
|
|
2304
2358
|
* courtesy background rather than leaking an unlabelled stale frame.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-
|
|
1
|
+
import { Ct as DeviceFeature, Gt as EventCategory, M as deriveBatteryPresence, Rt as nodePin, T as batteryCapability, Tt as DeviceType, i as BatteryStatusSchema, mt as streamQualityLabel, ut as snapshotCapability, vt as errMsg, w as bareAddonId, yt as BaseAddon } from "../../dist-bkg2-2g3.mjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
4
|
import { signExpiringUrl, verifyExpiringUrl } from "@camstack/types/node";
|
|
@@ -933,6 +933,24 @@ function pickWarmSnapshotBroker(ranked, devicePrefix) {
|
|
|
933
933
|
//#endregion
|
|
934
934
|
//#region src/builtins/snapshot/snapshot.addon.ts
|
|
935
935
|
/**
|
|
936
|
+
* States that make a dial pointless — the ladder is skipped entirely.
|
|
937
|
+
*
|
|
938
|
+
* `offline` is deliberately absent: a camera that is never probed can never be
|
|
939
|
+
* observed to come back, and this layer's own capture is one of the two ways a
|
|
940
|
+
* wrong `online:false` gets discovered (the other is the reachability poller
|
|
941
|
+
* that set it).
|
|
942
|
+
*/
|
|
943
|
+
var CAPTURE_BLOCKING_REASONS = [
|
|
944
|
+
"disabled",
|
|
945
|
+
"sleeping",
|
|
946
|
+
"unreachable",
|
|
947
|
+
"waking"
|
|
948
|
+
];
|
|
949
|
+
/** True when this state must answer WITHOUT touching the camera. */
|
|
950
|
+
function blocksCapture(reason) {
|
|
951
|
+
return CAPTURE_BLOCKING_REASONS.includes(reason);
|
|
952
|
+
}
|
|
953
|
+
/**
|
|
936
954
|
* How long `getSnapshotLinks` waits for the capture it triggered before minting
|
|
937
955
|
* the link over whatever frame it has.
|
|
938
956
|
*
|
|
@@ -1675,7 +1693,7 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
1675
1693
|
resolutionMeta.isBattery = isBatteryDevice;
|
|
1676
1694
|
delete resolutionMeta.stateReason;
|
|
1677
1695
|
}
|
|
1678
|
-
if (state.reason !== void 0 && (
|
|
1696
|
+
if (state.reason !== void 0 && blocksCapture(state.reason) && (!force || state.reason !== "sleeping")) {
|
|
1679
1697
|
if (resolutionMeta) resolutionMeta.stateReason = state.reason;
|
|
1680
1698
|
log.debug("snapshot: camera state overrides raw cache", {
|
|
1681
1699
|
tags: { deviceId },
|
|
@@ -1703,7 +1721,8 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
1703
1721
|
isBattery: isBatteryDevice
|
|
1704
1722
|
}
|
|
1705
1723
|
});
|
|
1706
|
-
|
|
1724
|
+
if (!hit) return null;
|
|
1725
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, hit, resolutionMeta) : hit.data;
|
|
1707
1726
|
}
|
|
1708
1727
|
const flightKey = `${deviceId}:${effectiveStreamId ?? "auto"}`;
|
|
1709
1728
|
const flight = this.captureFlight.run(flightKey, () => this.captureFresh({
|
|
@@ -1716,16 +1735,19 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
1716
1735
|
flight.catch(() => void 0);
|
|
1717
1736
|
const waitMs = !force && decision.staleFallback && hit !== void 0 ? Math.min(decision.waitMs, staleWaitCapMs) : decision.waitMs;
|
|
1718
1737
|
const raced = await raceForResult(flight, Math.min(Math.max(waitMs, minimumCaptureWaitMs), maximumCaptureWaitMs));
|
|
1719
|
-
if (raced.settled)
|
|
1720
|
-
const
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
if (
|
|
1738
|
+
if (raced.settled) {
|
|
1739
|
+
const captured = raced.value.ok && raced.value.image !== null;
|
|
1740
|
+
try {
|
|
1741
|
+
const resolved = await this.resolveOutcome(raced.value, deviceId, hit, log);
|
|
1742
|
+
if (resolved !== null) return captured || state.reason !== "offline" ? resolved : await this.offlineImage(deviceId, deviceName, hit, resolutionMeta);
|
|
1743
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, void 0, resolutionMeta) : null;
|
|
1744
|
+
} catch (err) {
|
|
1745
|
+
if (state.reason === "offline") {
|
|
1746
|
+
const stateFrame = await this.offlineImage(deviceId, deviceName, hit, resolutionMeta);
|
|
1747
|
+
if (stateFrame !== null) return stateFrame;
|
|
1748
|
+
}
|
|
1749
|
+
throw err;
|
|
1727
1750
|
}
|
|
1728
|
-
throw err;
|
|
1729
1751
|
}
|
|
1730
1752
|
if (decision.staleFallback && hit) {
|
|
1731
1753
|
if (prefs.snapshotDebug) log.debug("snapshot: SWR — returning stale frame; refresh continues in background", {
|
|
@@ -1735,11 +1757,11 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
1735
1757
|
waitMs: decision.waitMs
|
|
1736
1758
|
}
|
|
1737
1759
|
});
|
|
1738
|
-
return hit.data;
|
|
1760
|
+
return state.reason === "offline" ? await this.offlineImage(deviceId, deviceName, hit, resolutionMeta) : hit.data;
|
|
1739
1761
|
}
|
|
1740
|
-
if (
|
|
1741
|
-
const
|
|
1742
|
-
if (
|
|
1762
|
+
if (state.reason === "offline") {
|
|
1763
|
+
const stateFrame = await this.offlineImage(deviceId, deviceName, void 0, resolutionMeta);
|
|
1764
|
+
if (stateFrame !== null) return stateFrame;
|
|
1743
1765
|
}
|
|
1744
1766
|
return null;
|
|
1745
1767
|
}
|
|
@@ -2098,7 +2120,12 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
2098
2120
|
meta: { error: errMsg(err) }
|
|
2099
2121
|
});
|
|
2100
2122
|
}
|
|
2101
|
-
|
|
2123
|
+
const isBattery = meta?.isBattery === true || batteryStatus !== null || waking;
|
|
2124
|
+
const unreachableVerdict = meta?.online === false ? {
|
|
2125
|
+
isBattery,
|
|
2126
|
+
reason: "offline"
|
|
2127
|
+
} : null;
|
|
2128
|
+
if (!isBattery) return unreachableVerdict ?? { isBattery: false };
|
|
2102
2129
|
if (waking) return {
|
|
2103
2130
|
isBattery: true,
|
|
2104
2131
|
reason: "waking"
|
|
@@ -2107,10 +2134,11 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
2107
2134
|
status: batteryStatus,
|
|
2108
2135
|
nowMs: Date.now()
|
|
2109
2136
|
});
|
|
2110
|
-
|
|
2137
|
+
if (presence !== "awake") return {
|
|
2111
2138
|
isBattery: true,
|
|
2112
2139
|
reason: presence
|
|
2113
2140
|
};
|
|
2141
|
+
return unreachableVerdict ?? { isBattery: true };
|
|
2114
2142
|
}
|
|
2115
2143
|
isDeviceWaking(deviceId) {
|
|
2116
2144
|
const startedAt = this.wakingDevices.get(deviceId);
|
|
@@ -2293,6 +2321,32 @@ var SnapshotAddon = class SnapshotAddon extends BaseAddon {
|
|
|
2293
2321
|
};
|
|
2294
2322
|
}
|
|
2295
2323
|
/**
|
|
2324
|
+
* The answer for a camera the hub cannot reach: its last good frame, with
|
|
2325
|
+
* `Offline` painted over it, and `offline` stamped on the response identity.
|
|
2326
|
+
*
|
|
2327
|
+
* Called only AFTER the ladder has run (offline is not in
|
|
2328
|
+
* {@link CAPTURE_BLOCKING_REASONS}), so this dresses a frame that could not be
|
|
2329
|
+
* refreshed — never one that just landed.
|
|
2330
|
+
*
|
|
2331
|
+
* The `stateReason` is set FIRST and unconditionally, because it is what a
|
|
2332
|
+
* surface labels the tile from and what puts `offline` in the ETag: a client
|
|
2333
|
+
* holding the live frame has to see a new identity the moment the camera
|
|
2334
|
+
* drops, or it paints the unlabelled photograph until the camera comes back.
|
|
2335
|
+
* A failed render therefore degrades to the raw frame rather than to nothing —
|
|
2336
|
+
* the metadata still says offline, so the tile is still honest.
|
|
2337
|
+
*/
|
|
2338
|
+
async offlineImage(deviceId, deviceName, hit, resolutionMeta) {
|
|
2339
|
+
if (resolutionMeta) resolutionMeta.stateReason = "offline";
|
|
2340
|
+
this.ctx.logger.debug("snapshot: serving the offline treatment", {
|
|
2341
|
+
tags: { deviceId },
|
|
2342
|
+
meta: {
|
|
2343
|
+
hasCache: hit !== void 0,
|
|
2344
|
+
ageMs: hit ? Date.now() - hit.ts : null
|
|
2345
|
+
}
|
|
2346
|
+
});
|
|
2347
|
+
return await this.stateImage(deviceId, "offline", deviceName, hit) ?? hit?.data ?? null;
|
|
2348
|
+
}
|
|
2349
|
+
/**
|
|
2296
2350
|
* Render a state-labelled answer. A cached real frame is the background, not
|
|
2297
2351
|
* the answer by itself; if it cannot be decoded, fall back to the generated
|
|
2298
2352
|
* courtesy background rather than leaking an unlabelled stale frame.
|