@camstack/system 1.1.76 → 1.2.1
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 +2 -2
- package/dist/addon-runner.mjs +2 -2
- 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/device-manager/device-linked-devices.d.ts +13 -0
- package/dist/builtins/device-manager/device-manager.addon.js +86 -26
- package/dist/builtins/device-manager/device-manager.addon.mjs +86 -26
- 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/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/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 +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- 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 +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +1 -1
- 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-Dycu89sF.mjs → dist-BLNvh8Qy.mjs} +39 -18
- package/dist/{dist-C0Pf5ShP.js → dist-DP2SKMvU.js} +39 -18
- package/dist/index.d.ts +1 -0
- package/dist/index.js +37 -8
- package/dist/index.mjs +35 -9
- package/dist/kernel/addon-installer.d.ts +17 -3
- package/dist/kernel/index.d.ts +1 -1
- package/dist/kernel/moleculer/node-registry.d.ts +2 -2
- package/dist/{manifest-python-deps-BiM1uDhe.mjs → manifest-python-deps-Co8MTPdy.mjs} +2 -2
- package/dist/{manifest-python-deps-BRFns0U-.js → manifest-python-deps-DE8HxnIx.js} +13 -1
- package/package.json +1 -1
package/dist/addon-runner.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-Cek0wNdY.js");
|
|
2
|
-
const require_dist = require("./dist-
|
|
3
|
-
const require_manifest_python_deps = require("./manifest-python-deps-
|
|
2
|
+
const require_dist = require("./dist-DP2SKMvU.js");
|
|
3
|
+
const require_manifest_python_deps = require("./manifest-python-deps-DE8HxnIx.js");
|
|
4
4
|
const require_custom_action_registry = require("./custom-action-registry-vLYEFTtv.js");
|
|
5
5
|
let node_fs = require("node:fs");
|
|
6
6
|
node_fs = require_chunk.__toESM(node_fs);
|
package/dist/addon-runner.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { M as isCollectionArrayMethod, t as ALL_CAPABILITY_DEFINITIONS } from "./dist-
|
|
2
|
-
import {
|
|
1
|
+
import { M as isCollectionArrayMethod, t as ALL_CAPABILITY_DEFINITIONS } from "./dist-BLNvh8Qy.mjs";
|
|
2
|
+
import { I as createUdsLoggerWithControl, L as LocalChildClient, St as resolveAddonClass, at as setWorkerNativeCapsChangeListener, i as createUdsAddonContext, nt as getWorkerNativeCapProvider, rt as getWorkerNativeCapSnapshot, st as validateProviderRegistrations, t as installManifestPythonDeps, yt as installManifestNativeDeps } from "./manifest-python-deps-Co8MTPdy.mjs";
|
|
3
3
|
import { t as CustomActionRegistry } from "./custom-action-registry-BEXwC-oo.mjs";
|
|
4
4
|
import { register } from "node:module";
|
|
5
5
|
import * as fs from "node:fs";
|
|
@@ -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-DP2SKMvU.js");
|
|
7
7
|
const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
9
|
node_fs = require_chunk.__toESM(node_fs);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, at as BaseAddon, f as addonPagesCapability, it as errMsg } from "../../dist-
|
|
1
|
+
import { At as EventCategory, at as BaseAddon, f as addonPagesCapability, it as errMsg } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
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-DP2SKMvU.js");
|
|
7
7
|
const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
9
|
node_fs = require_chunk.__toESM(node_fs);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, at as BaseAddon, it as errMsg, m as addonWidgetsCapability } from "../../dist-
|
|
1
|
+
import { At as EventCategory, at as BaseAddon, it as errMsg, m as addonWidgetsCapability } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
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-DP2SKMvU.js");
|
|
7
7
|
//#region src/builtins/alerts/alerts.addon.ts
|
|
8
8
|
var CATEGORY_MAPPINGS = {
|
|
9
9
|
"addon.crashed": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, at as BaseAddon, h as alertsCapability, it as errMsg, n as AlertSchema, vt as createEvent } from "../../dist-
|
|
1
|
+
import { At as EventCategory, at as BaseAddon, h as alertsCapability, it as errMsg, n as AlertSchema, vt as createEvent } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
//#region src/builtins/alerts/alerts.addon.ts
|
|
3
3
|
var CATEGORY_MAPPINGS = {
|
|
4
4
|
"addon.crashed": {
|
|
@@ -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-DP2SKMvU.js");
|
|
7
7
|
let node_fs = require("node:fs");
|
|
8
8
|
let node_fs$1 = require_chunk.__toESM(node_fs, 1);
|
|
9
9
|
node_fs = require_chunk.__toESM(node_fs);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, at as BaseAddon, v as backupCapability } from "../../dist-
|
|
1
|
+
import { At as EventCategory, at as BaseAddon, v as backupCapability } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import Kt from "node:fs";
|
|
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-DP2SKMvU.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 { R as logDestinationCapability, at as BaseAddon } from "../../dist-
|
|
1
|
+
import { R as logDestinationCapability, at as BaseAddon } from "../../dist-BLNvh8Qy.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 = {
|
|
@@ -3,6 +3,9 @@ import { ProviderContext } from './device-provider-context.js';
|
|
|
3
3
|
/** Reserved device-config keys (cf. `_profileMap`). */
|
|
4
4
|
export declare const LINKED_MODE_CONFIG_KEY = "_linkedDevicesMode";
|
|
5
5
|
export declare const LINKED_IDS_CONFIG_KEY = "_linkedDeviceIds";
|
|
6
|
+
/** Reserved key: subset of linked devices that materialize synthetic tracked
|
|
7
|
+
* events on the camera. Absent ⇒ ALL linked devices produce tracked events. */
|
|
8
|
+
export declare const LINKED_TRACKED_IDS_CONFIG_KEY = "_linkedDeviceTrackedIds";
|
|
6
9
|
export interface LinkedDevicesConfig {
|
|
7
10
|
readonly mode: DeviceLinkMode;
|
|
8
11
|
readonly manualIds: readonly number[];
|
|
@@ -27,6 +30,16 @@ export declare function resolveLinkedDeviceIds(params: {
|
|
|
27
30
|
readonly config: LinkedDevicesConfig;
|
|
28
31
|
readonly candidates: readonly LinkCandidate[];
|
|
29
32
|
}): readonly number[];
|
|
33
|
+
/**
|
|
34
|
+
* Which linked devices materialize synthetic tracked events on the camera.
|
|
35
|
+
* Absent / non-array config key ⇒ ALL linked devices (back-compat with the
|
|
36
|
+
* pre-existing "every linked device produces events" behaviour). Otherwise the
|
|
37
|
+
* configured subset intersected with the currently-resolved linked set (a
|
|
38
|
+
* picked id no longer linked is dropped). Ids may arrive as numbers or numeric
|
|
39
|
+
* strings (the multiselect stores string option values); non-numeric entries
|
|
40
|
+
* are ignored.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveTrackedEventDeviceIds(config: Record<string, unknown>, linkedIds: readonly number[]): readonly number[];
|
|
30
43
|
/** Cap implementation of `getLinkedDevices`. */
|
|
31
44
|
export declare function getLinkedDevices(pctx: ProviderContext, input: Parameters<IDeviceManagerProvider['getLinkedDevices']>[0]): ReturnType<IDeviceManagerProvider['getLinkedDevices']>;
|
|
32
45
|
/**
|
|
@@ -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-DP2SKMvU.js");
|
|
7
7
|
let _camstack_types_node = require("@camstack/types/node");
|
|
8
8
|
let zod = require("zod");
|
|
9
9
|
let node_crypto = require("node:crypto");
|
|
@@ -1209,6 +1209,9 @@ async function testField(pctx, input) {
|
|
|
1209
1209
|
/** Reserved device-config keys (cf. `_profileMap`). */
|
|
1210
1210
|
var LINKED_MODE_CONFIG_KEY = "_linkedDevicesMode";
|
|
1211
1211
|
var LINKED_IDS_CONFIG_KEY = "_linkedDeviceIds";
|
|
1212
|
+
/** Reserved key: subset of linked devices that materialize synthetic tracked
|
|
1213
|
+
* events on the camera. Absent ⇒ ALL linked devices produce tracked events. */
|
|
1214
|
+
var LINKED_TRACKED_IDS_CONFIG_KEY = "_linkedDeviceTrackedIds";
|
|
1212
1215
|
/** Parse the two reserved keys out of a device-config blob. Tolerant:
|
|
1213
1216
|
* ids may arrive as numbers or numeric strings (the multiselect field
|
|
1214
1217
|
* stores string option values); anything else is dropped. */
|
|
@@ -1244,6 +1247,25 @@ function resolveLinkedDeviceIds(params) {
|
|
|
1244
1247
|
ids.delete(selfId);
|
|
1245
1248
|
return [...ids];
|
|
1246
1249
|
}
|
|
1250
|
+
/**
|
|
1251
|
+
* Which linked devices materialize synthetic tracked events on the camera.
|
|
1252
|
+
* Absent / non-array config key ⇒ ALL linked devices (back-compat with the
|
|
1253
|
+
* pre-existing "every linked device produces events" behaviour). Otherwise the
|
|
1254
|
+
* configured subset intersected with the currently-resolved linked set (a
|
|
1255
|
+
* picked id no longer linked is dropped). Ids may arrive as numbers or numeric
|
|
1256
|
+
* strings (the multiselect stores string option values); non-numeric entries
|
|
1257
|
+
* are ignored.
|
|
1258
|
+
*/
|
|
1259
|
+
function resolveTrackedEventDeviceIds(config, linkedIds) {
|
|
1260
|
+
const raw = config[LINKED_TRACKED_IDS_CONFIG_KEY];
|
|
1261
|
+
if (!Array.isArray(raw)) return linkedIds;
|
|
1262
|
+
const picked = /* @__PURE__ */ new Set();
|
|
1263
|
+
for (const v of raw) {
|
|
1264
|
+
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
1265
|
+
if (Number.isInteger(n)) picked.add(n);
|
|
1266
|
+
}
|
|
1267
|
+
return linkedIds.filter((id) => picked.has(id));
|
|
1268
|
+
}
|
|
1247
1269
|
/** Cap implementation of `getLinkedDevices`. */
|
|
1248
1270
|
async function getLinkedDevices(pctx, input) {
|
|
1249
1271
|
const { deviceId } = input;
|
|
@@ -1256,6 +1278,7 @@ async function getLinkedDevices(pctx, input) {
|
|
|
1256
1278
|
config,
|
|
1257
1279
|
candidates: all
|
|
1258
1280
|
});
|
|
1281
|
+
const trackedIds = new Set(resolveTrackedEventDeviceIds(blob, ids));
|
|
1259
1282
|
const devices = [];
|
|
1260
1283
|
for (const id of ids) {
|
|
1261
1284
|
const d = byId.get(id);
|
|
@@ -1264,7 +1287,8 @@ async function getLinkedDevices(pctx, input) {
|
|
|
1264
1287
|
deviceId: d.id,
|
|
1265
1288
|
name: d.name,
|
|
1266
1289
|
location: d.location,
|
|
1267
|
-
features: d.features
|
|
1290
|
+
features: d.features,
|
|
1291
|
+
producesTrackedEvents: trackedIds.has(d.id)
|
|
1268
1292
|
});
|
|
1269
1293
|
}
|
|
1270
1294
|
return {
|
|
@@ -1287,36 +1311,63 @@ async function buildLinkedDevicesContribution(pctx, deviceId) {
|
|
|
1287
1311
|
value: String(d.id),
|
|
1288
1312
|
label: d.location !== null ? `${d.name} (${d.location})` : d.name
|
|
1289
1313
|
}));
|
|
1314
|
+
const linkedIds = resolveLinkedDeviceIds({
|
|
1315
|
+
selfId: deviceId,
|
|
1316
|
+
selfLocation: all.find((d) => d.id === deviceId)?.location ?? null,
|
|
1317
|
+
config,
|
|
1318
|
+
candidates: all
|
|
1319
|
+
});
|
|
1320
|
+
const byId = new Map(all.map((d) => [d.id, d]));
|
|
1321
|
+
const trackedOptions = linkedIds.flatMap((id) => {
|
|
1322
|
+
const d = byId.get(id);
|
|
1323
|
+
if (!d) return [];
|
|
1324
|
+
return [{
|
|
1325
|
+
value: String(d.id),
|
|
1326
|
+
label: d.location !== null ? `${d.name} (${d.location})` : d.name
|
|
1327
|
+
}];
|
|
1328
|
+
});
|
|
1329
|
+
const trackedValue = resolveTrackedEventDeviceIds(blob, linkedIds).map(String);
|
|
1290
1330
|
return { sections: [{
|
|
1291
1331
|
id: "linked-devices",
|
|
1292
1332
|
title: "Linked devices",
|
|
1293
1333
|
description: "Companion devices associated with this camera. Device-tree children are always linked; auto mode also links every device sharing the camera location, manual mode links the picked list instead.",
|
|
1294
1334
|
order: 70,
|
|
1295
|
-
fields: [
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
type: "multiselect",
|
|
1310
|
-
key: LINKED_IDS_CONFIG_KEY,
|
|
1311
|
-
label: "Manually linked devices",
|
|
1312
|
-
description: "Used in manual mode (children stay linked regardless).",
|
|
1313
|
-
showWhen: {
|
|
1314
|
-
field: LINKED_MODE_CONFIG_KEY,
|
|
1315
|
-
equals: "manual"
|
|
1335
|
+
fields: [
|
|
1336
|
+
{
|
|
1337
|
+
type: "select",
|
|
1338
|
+
key: LINKED_MODE_CONFIG_KEY,
|
|
1339
|
+
label: "Link mode",
|
|
1340
|
+
description: "Auto: children + same-location devices. Manual: children + the list below.",
|
|
1341
|
+
options: [{
|
|
1342
|
+
value: "auto",
|
|
1343
|
+
label: "Auto (location-based)"
|
|
1344
|
+
}, {
|
|
1345
|
+
value: "manual",
|
|
1346
|
+
label: "Manual"
|
|
1347
|
+
}],
|
|
1348
|
+
value: config.mode
|
|
1316
1349
|
},
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1350
|
+
{
|
|
1351
|
+
type: "multiselect",
|
|
1352
|
+
key: LINKED_IDS_CONFIG_KEY,
|
|
1353
|
+
label: "Manually linked devices",
|
|
1354
|
+
description: "Used in manual mode (children stay linked regardless).",
|
|
1355
|
+
showWhen: {
|
|
1356
|
+
field: LINKED_MODE_CONFIG_KEY,
|
|
1357
|
+
equals: "manual"
|
|
1358
|
+
},
|
|
1359
|
+
options,
|
|
1360
|
+
value: config.manualIds.map(String)
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
type: "multiselect",
|
|
1364
|
+
key: LINKED_TRACKED_IDS_CONFIG_KEY,
|
|
1365
|
+
label: "Devices that produce tracked events",
|
|
1366
|
+
description: "Linked devices whose state changes materialize a synthetic tracked event on this camera. Default: all linked devices.",
|
|
1367
|
+
options: trackedOptions,
|
|
1368
|
+
value: trackedValue
|
|
1369
|
+
}
|
|
1370
|
+
]
|
|
1320
1371
|
}] };
|
|
1321
1372
|
}
|
|
1322
1373
|
/**
|
|
@@ -1329,6 +1380,15 @@ async function applyLinkedDevicesPatch(pctx, deviceId, patch) {
|
|
|
1329
1380
|
const next = { ...await pctx.settings.readDeviceStore(deviceId) };
|
|
1330
1381
|
if ("_linkedDevicesMode" in patch) next[LINKED_MODE_CONFIG_KEY] = patch["_linkedDevicesMode"] === "manual" ? "manual" : "auto";
|
|
1331
1382
|
if ("_linkedDeviceIds" in patch) next[LINKED_IDS_CONFIG_KEY] = [...parseLinkedDevicesConfig({ [LINKED_IDS_CONFIG_KEY]: patch[LINKED_IDS_CONFIG_KEY] }).manualIds];
|
|
1383
|
+
if ("_linkedDeviceTrackedIds" in patch) {
|
|
1384
|
+
const raw = patch[LINKED_TRACKED_IDS_CONFIG_KEY];
|
|
1385
|
+
const ids = [];
|
|
1386
|
+
if (Array.isArray(raw)) for (const v of raw) {
|
|
1387
|
+
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
1388
|
+
if (Number.isInteger(n) && !ids.includes(n)) ids.push(n);
|
|
1389
|
+
}
|
|
1390
|
+
next[LINKED_TRACKED_IDS_CONFIG_KEY] = ids;
|
|
1391
|
+
}
|
|
1332
1392
|
await pctx.settings.writeDeviceStore(deviceId, next);
|
|
1333
1393
|
return { success: true };
|
|
1334
1394
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as getByPath, At as EventCategory, Ct as isDeviceConfigCap, D as evaluateLinkExpression, E as enumerateSchemaFields, H as normalizeUnit, S as deviceStatusCapability, T as enumerateItemArrayFields, W as parseStreamParamsFormPatch, Y as setByPath, a as DeviceStatusSchema, at as BaseAddon, b as deviceManagerCapability, c as STREAM_PROFILE_META, dt as DeviceType, g as applyTransform, i as CAP_NAMES_WITH_STATUS, it as errMsg, kt as sleep, lt as DeviceFeature, mt as WELL_KNOWN_TAB_MAP, rt as validateExpressionSource, t as ALL_CAPABILITY_DEFINITIONS, tt as toExpressionValue, ut as DeviceRole, x as deviceStateCapability, y as buildStreamParamsConfigSchema } from "../../dist-
|
|
1
|
+
import { A as getByPath, At as EventCategory, Ct as isDeviceConfigCap, D as evaluateLinkExpression, E as enumerateSchemaFields, H as normalizeUnit, S as deviceStatusCapability, T as enumerateItemArrayFields, W as parseStreamParamsFormPatch, Y as setByPath, a as DeviceStatusSchema, at as BaseAddon, b as deviceManagerCapability, c as STREAM_PROFILE_META, dt as DeviceType, g as applyTransform, i as CAP_NAMES_WITH_STATUS, it as errMsg, kt as sleep, lt as DeviceFeature, mt as WELL_KNOWN_TAB_MAP, rt as validateExpressionSource, t as ALL_CAPABILITY_DEFINITIONS, tt as toExpressionValue, ut as DeviceRole, x as deviceStateCapability, y as buildStreamParamsConfigSchema } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import { canonicalDeviceFingerprint } from "@camstack/types/node";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -1204,6 +1204,9 @@ async function testField(pctx, input) {
|
|
|
1204
1204
|
/** Reserved device-config keys (cf. `_profileMap`). */
|
|
1205
1205
|
var LINKED_MODE_CONFIG_KEY = "_linkedDevicesMode";
|
|
1206
1206
|
var LINKED_IDS_CONFIG_KEY = "_linkedDeviceIds";
|
|
1207
|
+
/** Reserved key: subset of linked devices that materialize synthetic tracked
|
|
1208
|
+
* events on the camera. Absent ⇒ ALL linked devices produce tracked events. */
|
|
1209
|
+
var LINKED_TRACKED_IDS_CONFIG_KEY = "_linkedDeviceTrackedIds";
|
|
1207
1210
|
/** Parse the two reserved keys out of a device-config blob. Tolerant:
|
|
1208
1211
|
* ids may arrive as numbers or numeric strings (the multiselect field
|
|
1209
1212
|
* stores string option values); anything else is dropped. */
|
|
@@ -1239,6 +1242,25 @@ function resolveLinkedDeviceIds(params) {
|
|
|
1239
1242
|
ids.delete(selfId);
|
|
1240
1243
|
return [...ids];
|
|
1241
1244
|
}
|
|
1245
|
+
/**
|
|
1246
|
+
* Which linked devices materialize synthetic tracked events on the camera.
|
|
1247
|
+
* Absent / non-array config key ⇒ ALL linked devices (back-compat with the
|
|
1248
|
+
* pre-existing "every linked device produces events" behaviour). Otherwise the
|
|
1249
|
+
* configured subset intersected with the currently-resolved linked set (a
|
|
1250
|
+
* picked id no longer linked is dropped). Ids may arrive as numbers or numeric
|
|
1251
|
+
* strings (the multiselect stores string option values); non-numeric entries
|
|
1252
|
+
* are ignored.
|
|
1253
|
+
*/
|
|
1254
|
+
function resolveTrackedEventDeviceIds(config, linkedIds) {
|
|
1255
|
+
const raw = config[LINKED_TRACKED_IDS_CONFIG_KEY];
|
|
1256
|
+
if (!Array.isArray(raw)) return linkedIds;
|
|
1257
|
+
const picked = /* @__PURE__ */ new Set();
|
|
1258
|
+
for (const v of raw) {
|
|
1259
|
+
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
1260
|
+
if (Number.isInteger(n)) picked.add(n);
|
|
1261
|
+
}
|
|
1262
|
+
return linkedIds.filter((id) => picked.has(id));
|
|
1263
|
+
}
|
|
1242
1264
|
/** Cap implementation of `getLinkedDevices`. */
|
|
1243
1265
|
async function getLinkedDevices(pctx, input) {
|
|
1244
1266
|
const { deviceId } = input;
|
|
@@ -1251,6 +1273,7 @@ async function getLinkedDevices(pctx, input) {
|
|
|
1251
1273
|
config,
|
|
1252
1274
|
candidates: all
|
|
1253
1275
|
});
|
|
1276
|
+
const trackedIds = new Set(resolveTrackedEventDeviceIds(blob, ids));
|
|
1254
1277
|
const devices = [];
|
|
1255
1278
|
for (const id of ids) {
|
|
1256
1279
|
const d = byId.get(id);
|
|
@@ -1259,7 +1282,8 @@ async function getLinkedDevices(pctx, input) {
|
|
|
1259
1282
|
deviceId: d.id,
|
|
1260
1283
|
name: d.name,
|
|
1261
1284
|
location: d.location,
|
|
1262
|
-
features: d.features
|
|
1285
|
+
features: d.features,
|
|
1286
|
+
producesTrackedEvents: trackedIds.has(d.id)
|
|
1263
1287
|
});
|
|
1264
1288
|
}
|
|
1265
1289
|
return {
|
|
@@ -1282,36 +1306,63 @@ async function buildLinkedDevicesContribution(pctx, deviceId) {
|
|
|
1282
1306
|
value: String(d.id),
|
|
1283
1307
|
label: d.location !== null ? `${d.name} (${d.location})` : d.name
|
|
1284
1308
|
}));
|
|
1309
|
+
const linkedIds = resolveLinkedDeviceIds({
|
|
1310
|
+
selfId: deviceId,
|
|
1311
|
+
selfLocation: all.find((d) => d.id === deviceId)?.location ?? null,
|
|
1312
|
+
config,
|
|
1313
|
+
candidates: all
|
|
1314
|
+
});
|
|
1315
|
+
const byId = new Map(all.map((d) => [d.id, d]));
|
|
1316
|
+
const trackedOptions = linkedIds.flatMap((id) => {
|
|
1317
|
+
const d = byId.get(id);
|
|
1318
|
+
if (!d) return [];
|
|
1319
|
+
return [{
|
|
1320
|
+
value: String(d.id),
|
|
1321
|
+
label: d.location !== null ? `${d.name} (${d.location})` : d.name
|
|
1322
|
+
}];
|
|
1323
|
+
});
|
|
1324
|
+
const trackedValue = resolveTrackedEventDeviceIds(blob, linkedIds).map(String);
|
|
1285
1325
|
return { sections: [{
|
|
1286
1326
|
id: "linked-devices",
|
|
1287
1327
|
title: "Linked devices",
|
|
1288
1328
|
description: "Companion devices associated with this camera. Device-tree children are always linked; auto mode also links every device sharing the camera location, manual mode links the picked list instead.",
|
|
1289
1329
|
order: 70,
|
|
1290
|
-
fields: [
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
type: "multiselect",
|
|
1305
|
-
key: LINKED_IDS_CONFIG_KEY,
|
|
1306
|
-
label: "Manually linked devices",
|
|
1307
|
-
description: "Used in manual mode (children stay linked regardless).",
|
|
1308
|
-
showWhen: {
|
|
1309
|
-
field: LINKED_MODE_CONFIG_KEY,
|
|
1310
|
-
equals: "manual"
|
|
1330
|
+
fields: [
|
|
1331
|
+
{
|
|
1332
|
+
type: "select",
|
|
1333
|
+
key: LINKED_MODE_CONFIG_KEY,
|
|
1334
|
+
label: "Link mode",
|
|
1335
|
+
description: "Auto: children + same-location devices. Manual: children + the list below.",
|
|
1336
|
+
options: [{
|
|
1337
|
+
value: "auto",
|
|
1338
|
+
label: "Auto (location-based)"
|
|
1339
|
+
}, {
|
|
1340
|
+
value: "manual",
|
|
1341
|
+
label: "Manual"
|
|
1342
|
+
}],
|
|
1343
|
+
value: config.mode
|
|
1311
1344
|
},
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1345
|
+
{
|
|
1346
|
+
type: "multiselect",
|
|
1347
|
+
key: LINKED_IDS_CONFIG_KEY,
|
|
1348
|
+
label: "Manually linked devices",
|
|
1349
|
+
description: "Used in manual mode (children stay linked regardless).",
|
|
1350
|
+
showWhen: {
|
|
1351
|
+
field: LINKED_MODE_CONFIG_KEY,
|
|
1352
|
+
equals: "manual"
|
|
1353
|
+
},
|
|
1354
|
+
options,
|
|
1355
|
+
value: config.manualIds.map(String)
|
|
1356
|
+
},
|
|
1357
|
+
{
|
|
1358
|
+
type: "multiselect",
|
|
1359
|
+
key: LINKED_TRACKED_IDS_CONFIG_KEY,
|
|
1360
|
+
label: "Devices that produce tracked events",
|
|
1361
|
+
description: "Linked devices whose state changes materialize a synthetic tracked event on this camera. Default: all linked devices.",
|
|
1362
|
+
options: trackedOptions,
|
|
1363
|
+
value: trackedValue
|
|
1364
|
+
}
|
|
1365
|
+
]
|
|
1315
1366
|
}] };
|
|
1316
1367
|
}
|
|
1317
1368
|
/**
|
|
@@ -1324,6 +1375,15 @@ async function applyLinkedDevicesPatch(pctx, deviceId, patch) {
|
|
|
1324
1375
|
const next = { ...await pctx.settings.readDeviceStore(deviceId) };
|
|
1325
1376
|
if ("_linkedDevicesMode" in patch) next[LINKED_MODE_CONFIG_KEY] = patch["_linkedDevicesMode"] === "manual" ? "manual" : "auto";
|
|
1326
1377
|
if ("_linkedDeviceIds" in patch) next[LINKED_IDS_CONFIG_KEY] = [...parseLinkedDevicesConfig({ [LINKED_IDS_CONFIG_KEY]: patch[LINKED_IDS_CONFIG_KEY] }).manualIds];
|
|
1378
|
+
if ("_linkedDeviceTrackedIds" in patch) {
|
|
1379
|
+
const raw = patch[LINKED_TRACKED_IDS_CONFIG_KEY];
|
|
1380
|
+
const ids = [];
|
|
1381
|
+
if (Array.isArray(raw)) for (const v of raw) {
|
|
1382
|
+
const n = typeof v === "number" ? v : typeof v === "string" ? Number(v) : NaN;
|
|
1383
|
+
if (Number.isInteger(n) && !ids.includes(n)) ids.push(n);
|
|
1384
|
+
}
|
|
1385
|
+
next[LINKED_TRACKED_IDS_CONFIG_KEY] = ids;
|
|
1386
|
+
}
|
|
1327
1387
|
await pctx.settings.writeDeviceStore(deviceId, next);
|
|
1328
1388
|
return { success: true };
|
|
1329
1389
|
}
|
|
@@ -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-DP2SKMvU.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 { At as EventCategory, C as doorbellCapability, at as BaseAddon, dt as DeviceType, it as errMsg, vt as createEvent } from "../../dist-
|
|
1
|
+
import { At as EventCategory, C as doorbellCapability, at as BaseAddon, dt as DeviceType, it as errMsg, vt as createEvent } from "../../dist-BLNvh8Qy.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-DP2SKMvU.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 { R as logDestinationCapability, at as BaseAddon } from "../../dist-
|
|
1
|
+
import { R as logDestinationCapability, at as BaseAddon } from "../../dist-BLNvh8Qy.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;
|
|
@@ -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-DP2SKMvU.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,4 +1,4 @@
|
|
|
1
|
-
import { _ as authProviderCapability, at as BaseAddon, d as UserRecordSchema, l as ScopedTokenSchema, nt as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-
|
|
1
|
+
import { _ as authProviderCapability, at as BaseAddon, d as UserRecordSchema, l as ScopedTokenSchema, nt as userManagementCapability, r as ApiKeyRecordSchema } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import * as crypto$1 from "node:crypto";
|
|
4
4
|
import { randomUUID } from "node: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-DP2SKMvU.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 { At as EventCategory, L as localNetworkCapability, at as BaseAddon } from "../../dist-
|
|
1
|
+
import { At as EventCategory, L as localNetworkCapability, at as BaseAddon } from "../../dist-BLNvh8Qy.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
|
const require_chunk = require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
6
|
+
const require_dist = require("../../dist-DP2SKMvU.js");
|
|
7
7
|
let node_fs = require("node:fs");
|
|
8
8
|
node_fs = require_chunk.__toESM(node_fs);
|
|
9
9
|
let node_child_process = require("node:child_process");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, B as metricsProviderCapability, at as BaseAddon, vt as createEvent } from "../../dist-
|
|
1
|
+
import { At as EventCategory, B as metricsProviderCapability, at as BaseAddon, vt as createEvent } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import { execFile, execFileSync } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
|
@@ -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-DP2SKMvU.js");
|
|
7
7
|
let node_fs = require("node:fs");
|
|
8
8
|
node_fs = require_chunk.__toESM(node_fs);
|
|
9
9
|
let node_child_process = require("node:child_process");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { At as EventCategory, G as platformProbeCapability, J as scoreRuntimes, at as BaseAddon, bt as emitReadiness, it as errMsg, w as enumerateInferenceDevices } from "../../dist-
|
|
1
|
+
import { At as EventCategory, G as platformProbeCapability, J as scoreRuntimes, at as BaseAddon, bt as emitReadiness, it as errMsg, w as enumerateInferenceDevices } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
|
@@ -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-DP2SKMvU.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 { At as EventCategory, at as BaseAddon } from "../../dist-
|
|
1
|
+
import { At as EventCategory, at as BaseAddon } from "../../dist-BLNvh8Qy.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
|
require("../../chunk-Cek0wNdY.js");
|
|
6
|
-
const require_dist = require("../../dist-
|
|
6
|
+
const require_dist = require("../../dist-DP2SKMvU.js");
|
|
7
7
|
let node_child_process = require("node:child_process");
|
|
8
8
|
//#region src/builtins/snapshot/snapshot-coalescing.ts
|
|
9
9
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { V as nodePin, Z as snapshotCapability, at as BaseAddon, dt as DeviceType, et as streamQualityLabel, it as errMsg, lt as DeviceFeature } from "../../dist-
|
|
1
|
+
import { V as nodePin, Z as snapshotCapability, at as BaseAddon, dt as DeviceType, et as streamQualityLabel, it as errMsg, lt as DeviceFeature } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import { execFile } from "node:child_process";
|
|
3
3
|
//#region src/builtins/snapshot/snapshot-coalescing.ts
|
|
4
4
|
/**
|
|
@@ -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-DP2SKMvU.js");
|
|
7
7
|
let node_fs = require("node:fs");
|
|
8
8
|
node_fs = require_chunk.__toESM(node_fs);
|
|
9
9
|
let node_path = require("node:path");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as storageProviderCapability, at as BaseAddon, k as filesystemBrowseCapability } from "../../dist-
|
|
1
|
+
import { $ as storageProviderCapability, at as BaseAddon, k as filesystemBrowseCapability } from "../../dist-BLNvh8Qy.mjs";
|
|
2
2
|
import * as fs from "node:fs";
|
|
3
3
|
import * as path$1 from "node:path";
|
|
4
4
|
import { basename, dirname, join, resolve, sep } 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-DP2SKMvU.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
let better_sqlite3 = require("better-sqlite3");
|
|
9
9
|
better_sqlite3 = require_chunk.__toESM(better_sqlite3);
|