@camstack/system 1.2.233 → 1.2.234
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/addon-utils.js +1 -1
- package/dist/addon-utils.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/contribution-cache.d.ts +68 -0
- package/dist/builtins/device-manager/device-config-contribution.d.ts +0 -1
- package/dist/builtins/device-manager/device-manager.addon.js +176 -83
- package/dist/builtins/device-manager/device-manager.addon.mjs +177 -84
- 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 +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 +0 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
- 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/{custom-action-registry-CFHYDHAu.mjs → custom-action-registry-CVsXD56p.mjs} +1 -1
- package/dist/{custom-action-registry-CWFK5UDj.js → custom-action-registry-DG-QIWxd.js} +1 -1
- package/dist/{dist-D3lJV9M7.js → dist-DaSCLJVH.js} +61 -22
- package/dist/{dist-BIvXRexm.mjs → dist-at9PGh6X.mjs} +61 -22
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{retired-settings-keys-YPsd2Exa.js → retired-settings-keys-CZISf623.js} +1 -1
- package/dist/{retired-settings-keys-CV3ZLGnJ.mjs → retired-settings-keys-X5zRxcV9.mjs} +1 -1
- package/package.json +1 -1
- package/dist/builtins/device-manager/native-object-detection-config-schema.d.ts +0 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { $t as DeviceFeature, At as resolveContainerPrimaryChild, Ct as normalizeUnit, J as deviceStatusCapability, Jt as errMsg, K as deviceManagerCapability, L as buildStreamParamsConfigSchema, Nt as runtimeStatePolicyFor, Q as enumerateSchemaFields, S as STREAM_PROFILE_META, Tt as parseStreamParamsFormPatch, Yt as BaseAddon, Z as enumerateItemArrayFields, a as CAMERA_SWITCH_ORDER, bn as sleep, en as DeviceRole, f as DeviceStatusSchema, in as WELL_KNOWN_TAB_MAP, o as CAP_NAMES_WITH_STATUS, pn as isDeviceConfigCap, q as deviceStateCapability, t as ALL_CAPABILITY_DEFINITIONS, tn as DeviceType, xn as EventCategory } from "../../dist-
|
|
2
|
-
import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-
|
|
1
|
+
import { $t as DeviceFeature, At as resolveContainerPrimaryChild, Ct as normalizeUnit, J as deviceStatusCapability, Jt as errMsg, K as deviceManagerCapability, L as buildStreamParamsConfigSchema, Nt as runtimeStatePolicyFor, Q as enumerateSchemaFields, S as STREAM_PROFILE_META, Tt as parseStreamParamsFormPatch, Yt as BaseAddon, Z as enumerateItemArrayFields, a as CAMERA_SWITCH_ORDER, bn as sleep$1, en as DeviceRole, f as DeviceStatusSchema, in as WELL_KNOWN_TAB_MAP, o as CAP_NAMES_WITH_STATUS, pn as isDeviceConfigCap, q as deviceStateCapability, t as ALL_CAPABILITY_DEFINITIONS, tn as DeviceType, xn as EventCategory } from "../../dist-at9PGh6X.mjs";
|
|
2
|
+
import { n as purgeRetiredSettingsRows } from "../../retired-settings-keys-X5zRxcV9.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
|
|
@@ -290,6 +290,113 @@ var AdoptionJobEngine = class {
|
|
|
290
290
|
}
|
|
291
291
|
};
|
|
292
292
|
//#endregion
|
|
293
|
+
//#region src/builtins/device-manager/contribution-cache.ts
|
|
294
|
+
/**
|
|
295
|
+
* The device-details fan-out, made survivable: budgeted, cached, single-flight.
|
|
296
|
+
*
|
|
297
|
+
* ## What it is for
|
|
298
|
+
*
|
|
299
|
+
* `getDeviceAggregate` asks every contributing provider for this device's
|
|
300
|
+
* settings panel and waits for all of them. Measured on this hub (2026-09-14):
|
|
301
|
+
* 10 595 ms on a battery camera against 331 ms on a mains one, while the page
|
|
302
|
+
* re-polls every 2 500 ms. One slow contributor stalled the whole device page,
|
|
303
|
+
* the poll stacked a fresh 10 s call on top of the one still running, and not
|
|
304
|
+
* one line named which provider was holding it.
|
|
305
|
+
*
|
|
306
|
+
* ## Why a budget alone would have been worse
|
|
307
|
+
*
|
|
308
|
+
* Dropping the provider that overran makes its settings SECTION disappear and
|
|
309
|
+
* come back between polls. A section of settings that flickers is worse than a
|
|
310
|
+
* slow one — and it is also what moved the operator's page: the schema loses a
|
|
311
|
+
* tab for a beat, and everything downstream reacts to a tab that is not there.
|
|
312
|
+
*
|
|
313
|
+
* So the budget is paired with the last answer that provider gave. A slow
|
|
314
|
+
* provider costs the page its budget ONCE; after that the page is instant and
|
|
315
|
+
* shows what that provider last said, until it says something new.
|
|
316
|
+
*
|
|
317
|
+
* ## The rules
|
|
318
|
+
*
|
|
319
|
+
* - **A read never joins a refresh already in flight** (D224). Without this the
|
|
320
|
+
* 2.5 s poll starts a new 10 s call every tick and they pile up.
|
|
321
|
+
* - **An explicit `null` is an ANSWER**, not a miss: it means "I have nothing
|
|
322
|
+
* for this device", and it replaces what was cached. A cache that only ever
|
|
323
|
+
* remembers successes would serve a stale panel around a provider that has
|
|
324
|
+
* since disowned the device.
|
|
325
|
+
* - **A failure falls back**, but a failure with nothing behind it is ABSENT
|
|
326
|
+
* and says which of the two it was — "never answered" and "answered once and
|
|
327
|
+
* is now broken" are different operator problems.
|
|
328
|
+
*/
|
|
329
|
+
/** How long the page waits for ONE provider before serving what it has. */
|
|
330
|
+
var CONTRIBUTION_BUDGET_MS = 1500;
|
|
331
|
+
var ContributionCache = class {
|
|
332
|
+
maxEntries;
|
|
333
|
+
entries = /* @__PURE__ */ new Map();
|
|
334
|
+
constructor(maxEntries = 512) {
|
|
335
|
+
this.maxEntries = maxEntries;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Resolve one provider's contribution within `budgetMs`.
|
|
339
|
+
*
|
|
340
|
+
* The call is never cancelled: it keeps running and its answer refreshes the
|
|
341
|
+
* cache, so the provider that overran this page pays for the next one.
|
|
342
|
+
*/
|
|
343
|
+
async resolve(key, call, budgetMs = CONTRIBUTION_BUDGET_MS) {
|
|
344
|
+
const existing = this.entries.get(key);
|
|
345
|
+
if (existing?.inFlight) return existing.value !== null ? {
|
|
346
|
+
kind: "stale",
|
|
347
|
+
value: existing.value
|
|
348
|
+
} : {
|
|
349
|
+
kind: "absent",
|
|
350
|
+
reason: "slow"
|
|
351
|
+
};
|
|
352
|
+
const entry = existing ?? {
|
|
353
|
+
value: null,
|
|
354
|
+
inFlight: null
|
|
355
|
+
};
|
|
356
|
+
if (!existing) this.remember(key, entry);
|
|
357
|
+
let settled = false;
|
|
358
|
+
let answer = null;
|
|
359
|
+
let failed = false;
|
|
360
|
+
const refresh = call().then((value) => {
|
|
361
|
+
answer = value;
|
|
362
|
+
settled = true;
|
|
363
|
+
entry.value = value;
|
|
364
|
+
entry.inFlight = null;
|
|
365
|
+
}, () => {
|
|
366
|
+
failed = true;
|
|
367
|
+
settled = true;
|
|
368
|
+
entry.inFlight = null;
|
|
369
|
+
});
|
|
370
|
+
entry.inFlight = refresh;
|
|
371
|
+
await Promise.race([refresh, sleep(budgetMs)]);
|
|
372
|
+
if (settled && !failed) return {
|
|
373
|
+
kind: "fresh",
|
|
374
|
+
value: answer
|
|
375
|
+
};
|
|
376
|
+
if (entry.value !== null) return {
|
|
377
|
+
kind: "stale",
|
|
378
|
+
value: entry.value
|
|
379
|
+
};
|
|
380
|
+
return {
|
|
381
|
+
kind: "absent",
|
|
382
|
+
reason: failed ? "failed" : "slow"
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
remember(key, entry) {
|
|
386
|
+
this.entries.set(key, entry);
|
|
387
|
+
while (this.entries.size > this.maxEntries) {
|
|
388
|
+
const oldest = this.entries.keys().next();
|
|
389
|
+
if (oldest.done === true) break;
|
|
390
|
+
this.entries.delete(oldest.value);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
function sleep(ms) {
|
|
395
|
+
return new Promise((resolve) => {
|
|
396
|
+
setTimeout(resolve, ms).unref?.();
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
//#endregion
|
|
293
400
|
//#region src/builtins/device-manager/device-aggregation-merge.ts
|
|
294
401
|
/**
|
|
295
402
|
* Pure aggregator-merge + field-tagging helpers for the device-manager
|
|
@@ -1125,42 +1232,6 @@ function parseImageSettingsFormPatch(patch) {
|
|
|
1125
1232
|
return out;
|
|
1126
1233
|
}
|
|
1127
1234
|
//#endregion
|
|
1128
|
-
//#region src/builtins/device-manager/native-object-detection-config-schema.ts
|
|
1129
|
-
/**
|
|
1130
|
-
* What the toggle buys, per geometry. Written out rather than computed: the
|
|
1131
|
-
* `flag-only` sentence is the one an operator needs BEFORE flipping the switch,
|
|
1132
|
-
* and a generic "may not be supported" would not have said it.
|
|
1133
|
-
*/
|
|
1134
|
-
var GEOMETRY_HELP = {
|
|
1135
|
-
boxed: "This camera ships a bounding box with each detection, so the pipeline tracks it as a subject: it gets a track, a best shot and the notification rules that address onboard detections.",
|
|
1136
|
-
"flag-only": "This camera ships the class with no bounding box — on Reolink that is every battery camera, because the boxes ride a sub-stream a battery camera never attaches. Turning this on makes the detections reach the tracker as motion and no further; it will not produce tracked subjects."
|
|
1137
|
-
};
|
|
1138
|
-
function buildNativeObjectDetectionConfigSchema(options, status) {
|
|
1139
|
-
if (options.supportedClasses.length === 0) return null;
|
|
1140
|
-
const fields = [{
|
|
1141
|
-
type: "boolean",
|
|
1142
|
-
key: "nativeObjectDetection_enabled",
|
|
1143
|
-
label: "Forward onboard AI detections",
|
|
1144
|
-
default: status?.enabled ?? false
|
|
1145
|
-
}];
|
|
1146
|
-
return { sections: [{
|
|
1147
|
-
id: "native-object-detection",
|
|
1148
|
-
tab: "motion",
|
|
1149
|
-
title: "Onboard AI detections",
|
|
1150
|
-
description: `${GEOMETRY_HELP[options.geometry]} Detected by this firmware: ${options.supportedClasses.join(", ")}.`,
|
|
1151
|
-
columns: 1,
|
|
1152
|
-
fields
|
|
1153
|
-
}] };
|
|
1154
|
-
}
|
|
1155
|
-
function parseNativeObjectDetectionFormPatch(patch) {
|
|
1156
|
-
const out = {};
|
|
1157
|
-
if ("nativeObjectDetection_enabled" in patch) {
|
|
1158
|
-
const value = patch.nativeObjectDetection_enabled;
|
|
1159
|
-
if (typeof value === "boolean") out.enabled = value;
|
|
1160
|
-
}
|
|
1161
|
-
return out;
|
|
1162
|
-
}
|
|
1163
|
-
//#endregion
|
|
1164
1235
|
//#region src/builtins/device-manager/device-config-contribution.ts
|
|
1165
1236
|
/**
|
|
1166
1237
|
* D14 device-config archetype — framework-side contribution derivation.
|
|
@@ -1188,7 +1259,6 @@ function parseNativeObjectDetectionFormPatch(patch) {
|
|
|
1188
1259
|
var STREAM_PARAMS_BUILDER_ID = "stream-params";
|
|
1189
1260
|
var DAY_NIGHT_BUILDER_ID = "day-night";
|
|
1190
1261
|
var IMAGE_SETTINGS_BUILDER_ID = "image-settings";
|
|
1191
|
-
var NATIVE_OBJECT_DETECTION_BUILDER_ID = "native-object-detection";
|
|
1192
1262
|
var STREAM_PARAMS_REDUCER = {
|
|
1193
1263
|
kind: "profile",
|
|
1194
1264
|
buildSchema: (options, status) => buildStreamParamsConfigSchema(options, status ?? null),
|
|
@@ -1209,16 +1279,10 @@ var IMAGE_SETTINGS_REDUCER = {
|
|
|
1209
1279
|
buildSchema: (options, status) => buildImageSettingsConfigSchema(options, status ?? null),
|
|
1210
1280
|
parsePatch: (patch) => parseImageSettingsFormPatch(patch)
|
|
1211
1281
|
};
|
|
1212
|
-
var NATIVE_OBJECT_DETECTION_REDUCER = {
|
|
1213
|
-
kind: "settings",
|
|
1214
|
-
buildSchema: (options, status) => buildNativeObjectDetectionConfigSchema(options, status ?? null),
|
|
1215
|
-
parsePatch: (patch) => parseNativeObjectDetectionFormPatch(patch)
|
|
1216
|
-
};
|
|
1217
1282
|
var BUILDER_REDUCERS = {
|
|
1218
1283
|
[STREAM_PARAMS_BUILDER_ID]: STREAM_PARAMS_REDUCER,
|
|
1219
1284
|
[DAY_NIGHT_BUILDER_ID]: DAY_NIGHT_REDUCER,
|
|
1220
|
-
[IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER
|
|
1221
|
-
[NATIVE_OBJECT_DETECTION_BUILDER_ID]: NATIVE_OBJECT_DETECTION_REDUCER
|
|
1285
|
+
[IMAGE_SETTINGS_BUILDER_ID]: IMAGE_SETTINGS_REDUCER
|
|
1222
1286
|
};
|
|
1223
1287
|
function resolveReducer(builderId) {
|
|
1224
1288
|
const reducer = BUILDER_REDUCERS[builderId];
|
|
@@ -2476,6 +2540,52 @@ function splitDeviceStoreKeys(patch) {
|
|
|
2476
2540
|
* and side effects of the original class methods are preserved; the addon keeps
|
|
2477
2541
|
* thin delegator methods over these functions.
|
|
2478
2542
|
*/
|
|
2543
|
+
/**
|
|
2544
|
+
* One process-wide cache behind every device-details fan-out.
|
|
2545
|
+
*
|
|
2546
|
+
* Module-level on purpose: the page re-polls every 2.5 s and a per-call cache
|
|
2547
|
+
* would be empty every time, which is the same as having none.
|
|
2548
|
+
*/
|
|
2549
|
+
var contributionCache = new ContributionCache();
|
|
2550
|
+
/**
|
|
2551
|
+
* Ask ONE provider for its contribution, bounded, and say what happened.
|
|
2552
|
+
*
|
|
2553
|
+
* The two non-fresh outcomes are logged because they are the two questions an
|
|
2554
|
+
* operator asks of a slow device page, and neither had an answer before: WHICH
|
|
2555
|
+
* provider is slow, and whether the panel in front of them is current.
|
|
2556
|
+
*/
|
|
2557
|
+
async function resolveContribution(deps, input) {
|
|
2558
|
+
const { deviceId, kind, capName, addonId } = input;
|
|
2559
|
+
const outcome = await contributionCache.resolve(`${String(deviceId)}:${kind}:${capName}:${addonId}`, input.call);
|
|
2560
|
+
if (outcome.kind === "fresh") return outcome.value === null ? null : tagContribution(outcome.value, capName, addonId, kind);
|
|
2561
|
+
if (outcome.kind === "stale") {
|
|
2562
|
+
deps.ctx.logger.info("device contribution served from the last answer — the provider is slow", {
|
|
2563
|
+
tags: {
|
|
2564
|
+
deviceId,
|
|
2565
|
+
addonId
|
|
2566
|
+
},
|
|
2567
|
+
meta: {
|
|
2568
|
+
capName,
|
|
2569
|
+
method: kind,
|
|
2570
|
+
budgetMs: CONTRIBUTION_BUDGET_MS
|
|
2571
|
+
}
|
|
2572
|
+
});
|
|
2573
|
+
return tagContribution(outcome.value, capName, addonId, kind);
|
|
2574
|
+
}
|
|
2575
|
+
deps.ctx.logger.warn("device contribution unavailable — the panel is missing this section", {
|
|
2576
|
+
tags: {
|
|
2577
|
+
deviceId,
|
|
2578
|
+
addonId
|
|
2579
|
+
},
|
|
2580
|
+
meta: {
|
|
2581
|
+
capName,
|
|
2582
|
+
method: kind,
|
|
2583
|
+
reason: outcome.reason,
|
|
2584
|
+
budgetMs: CONTRIBUTION_BUDGET_MS
|
|
2585
|
+
}
|
|
2586
|
+
});
|
|
2587
|
+
return null;
|
|
2588
|
+
}
|
|
2479
2589
|
async function getDeviceAggregate(deps, deviceId, kind) {
|
|
2480
2590
|
const registry = deps.capabilityRegistry;
|
|
2481
2591
|
if (!registry) {
|
|
@@ -2491,25 +2601,16 @@ async function getDeviceAggregate(deps, deviceId, kind) {
|
|
|
2491
2601
|
if (!def?.exposesDeviceSettings) return null;
|
|
2492
2602
|
const provider = registry.getProviderByAddon(entry.capName, entry.providerAddonId);
|
|
2493
2603
|
if (!provider) return null;
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
},
|
|
2505
|
-
meta: {
|
|
2506
|
-
capName: entry.capName,
|
|
2507
|
-
method,
|
|
2508
|
-
error: msg
|
|
2509
|
-
}
|
|
2510
|
-
});
|
|
2511
|
-
return null;
|
|
2512
|
-
}
|
|
2604
|
+
return await resolveContribution(deps, {
|
|
2605
|
+
deviceId,
|
|
2606
|
+
kind,
|
|
2607
|
+
capName: entry.capName,
|
|
2608
|
+
addonId: entry.providerAddonId,
|
|
2609
|
+
call: async () => {
|
|
2610
|
+
const contribution = await provider[method]({ deviceId });
|
|
2611
|
+
return contribution ? toWireShape(contribution) : null;
|
|
2612
|
+
}
|
|
2613
|
+
});
|
|
2513
2614
|
}));
|
|
2514
2615
|
const base = kind === "settings" ? await buildBaseDeviceSection(deps, deviceId) : null;
|
|
2515
2616
|
const systemResults = await collectSystemDeviceContributions(deps, deviceId, kind, seenCaps);
|
|
@@ -2559,24 +2660,16 @@ async function collectSystemDeviceContributions(deps, deviceId, kind, seenCaps)
|
|
|
2559
2660
|
for (const addonId of addonIds) tasks.push((async () => {
|
|
2560
2661
|
const provider = registry.getProviderByAddon(info.name, addonId);
|
|
2561
2662
|
if (!provider) return null;
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
meta: {
|
|
2573
|
-
capName: info.name,
|
|
2574
|
-
method,
|
|
2575
|
-
error: err instanceof Error ? err.message : String(err)
|
|
2576
|
-
}
|
|
2577
|
-
});
|
|
2578
|
-
return null;
|
|
2579
|
-
}
|
|
2663
|
+
return await resolveContribution(deps, {
|
|
2664
|
+
deviceId,
|
|
2665
|
+
kind,
|
|
2666
|
+
capName: info.name,
|
|
2667
|
+
addonId,
|
|
2668
|
+
call: async () => {
|
|
2669
|
+
const contribution = await provider[method]({ deviceId });
|
|
2670
|
+
return contribution ? toWireShape(contribution) : null;
|
|
2671
|
+
}
|
|
2672
|
+
});
|
|
2580
2673
|
})());
|
|
2581
2674
|
}
|
|
2582
2675
|
return (await Promise.all(tasks)).filter((r) => r !== null);
|
|
@@ -2950,7 +3043,7 @@ async function resolveDriverConfigSchema(deps, deviceId, hubLocal) {
|
|
|
2950
3043
|
const RETRY_DELAY_MS = 750;
|
|
2951
3044
|
let lastErr;
|
|
2952
3045
|
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
2953
|
-
if (attempt > 0) await sleep(RETRY_DELAY_MS);
|
|
3046
|
+
if (attempt > 0) await sleep$1(RETRY_DELAY_MS);
|
|
2954
3047
|
try {
|
|
2955
3048
|
const schema = await ops.getSettingsSchema({ deviceId });
|
|
2956
3049
|
if (!schema) return { status: "none" };
|
|
@@ -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-DaSCLJVH.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 { $ as evaluateSensorEdge, F as bareAddonId, Jt as errMsg, Y as doorbellCapability, Yt as BaseAddon, b as SOURCE_DEVICE_TYPES, cn as createEvent, lt as isSameAddonId, tn as DeviceType, ut as isSourceCap, xn as EventCategory, y as SOURCE_CAPS } from "../../dist-
|
|
1
|
+
import { $ as evaluateSensorEdge, F as bareAddonId, Jt as errMsg, Y as doorbellCapability, Yt as BaseAddon, b as SOURCE_DEVICE_TYPES, cn as createEvent, lt as isSameAddonId, tn as DeviceType, ut as isSourceCap, xn as EventCategory, y as SOURCE_CAPS } from "../../dist-at9PGh6X.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-DaSCLJVH.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 { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-
|
|
1
|
+
import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-at9PGh6X.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-DaSCLJVH.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 { Jt as errMsg, Yt as BaseAddon, cn as createEvent, v as RecordingStatusSchema, xn as EventCategory } from "../../dist-
|
|
1
|
+
import { Jt as errMsg, Yt as BaseAddon, cn as createEvent, v as RecordingStatusSchema, xn as EventCategory } from "../../dist-at9PGh6X.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-DaSCLJVH.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 { C as ScopedTokenSchema, N as authProviderCapability, O as UserRecordSchema, Wt as userManagementCapability, Yt as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-
|
|
2
|
+
import { C as ScopedTokenSchema, N as authProviderCapability, O as UserRecordSchema, Wt as userManagementCapability, Yt as BaseAddon, r as ApiKeyRecordSchema } from "../../dist-at9PGh6X.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-DaSCLJVH.js");
|
|
4
4
|
const require_tls = require("../../tls-BFs4PzoW.js");
|
|
5
5
|
let node_fs_promises = require("node:fs/promises");
|
|
6
6
|
let node_path = require("node:path");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Yt as BaseAddon, ht as localNetworkCapability, xn as EventCategory } from "../../dist-
|
|
1
|
+
import { Yt as BaseAddon, ht as localNetworkCapability, xn as EventCategory } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { S as readLanHttpState, _ as DEFAULT_LAN_HTTP_PORT, a as writeTlsMode, i as writeExtraSans, l as reissueTlsLeaf, n as readTlsAccessStatus, o as validateUploadedTls, r as readTlsMode, s as ensureTlsCert, t as readExtraSans, y as applyLanHttp } from "../../tls-2xbgg78V.mjs";
|
|
3
3
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
4
|
import { join } 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-DaSCLJVH.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 { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-
|
|
1
|
+
import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-at9PGh6X.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-DaSCLJVH.js");
|
|
7
7
|
let node_fs_promises = require("node:fs/promises");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
9
|
node_fs = require_chunk.__toESM(node_fs);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Jt as errMsg, Ot as reducePoints, Yt as BaseAddon, cn as createEvent, kt as resolveBucketMs, rt as foldSnapshotByFunction, xn as EventCategory, xt as metricsProviderCapability } from "../../dist-
|
|
1
|
+
import { Jt as errMsg, Ot as reducePoints, Yt as BaseAddon, cn as createEvent, kt as resolveBucketMs, rt as foldSnapshotByFunction, xn as EventCategory, xt as metricsProviderCapability } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { access, readFile, readdir } from "node:fs/promises";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import { constants, readFileSync } 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-DaSCLJVH.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,5 +1,5 @@
|
|
|
1
1
|
import { o as __toESM } from "../../chunk-CNf5ZN-e.mjs";
|
|
2
|
-
import { Et as platformProbeCapability, It as scoreRuntimes, Jt as errMsg, X as enumerateInferenceDevices, Yt as BaseAddon, un as emitReadiness, xn as EventCategory } from "../../dist-
|
|
2
|
+
import { Et as platformProbeCapability, It as scoreRuntimes, Jt as errMsg, X as enumerateInferenceDevices, Yt as BaseAddon, un as emitReadiness, xn as EventCategory } from "../../dist-at9PGh6X.mjs";
|
|
3
3
|
import * as fs from "node:fs";
|
|
4
4
|
import { execFile } from "node:child_process";
|
|
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-DaSCLJVH.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 { Yt as BaseAddon, xn as EventCategory } from "../../dist-
|
|
1
|
+
import { Yt as BaseAddon, xn as EventCategory } from "../../dist-at9PGh6X.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-DaSCLJVH.js");
|
|
7
7
|
const require_snapshot_courtesy = require("../../snapshot-courtesy-oeTWCXPv.js");
|
|
8
8
|
let zod = require("zod");
|
|
9
9
|
let node_crypto = require("node:crypto");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $t as DeviceFeature, F as bareAddonId, I as batteryCapability, Jt as errMsg, Rt as snapshotCapability, Ut as streamQualityLabel, W as deriveBatteryPresence, Yt as BaseAddon, i as BatteryStatusSchema, mn as nodePin, tn as DeviceType, xn as EventCategory } from "../../dist-
|
|
1
|
+
import { $t as DeviceFeature, F as bareAddonId, I as batteryCapability, Jt as errMsg, Rt as snapshotCapability, Ut as streamQualityLabel, W as deriveBatteryPresence, Yt as BaseAddon, i as BatteryStatusSchema, mn as nodePin, tn as DeviceType, xn as EventCategory } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { i as renderCourtesyOverlayJpeg, n as courtesyCacheKey, r as renderCourtesyJpeg } from "../../snapshot-courtesy-LoJNgHHZ.mjs";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -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-DaSCLJVH.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
let node_fs_promises = require("node:fs/promises");
|
|
9
9
|
let node_path = require("node:path");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Ht as storageProviderCapability, Yt as BaseAddon, nt as filesystemBrowseCapability } from "../../dist-
|
|
1
|
+
import { Ht as storageProviderCapability, Yt as BaseAddon, nt as filesystemBrowseCapability } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { mkdir, readdir, realpath, statfs } from "node:fs/promises";
|
|
4
4
|
import * as path$1 from "node:path";
|
|
Binary file
|
|
Binary file
|
|
@@ -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-DaSCLJVH.js");
|
|
7
7
|
const require_hub_cap_forward = require("../../hub-cap-forward-DmHNjbB0.js");
|
|
8
8
|
let zod = require("zod");
|
|
9
9
|
let node_crypto = require("node:crypto");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Bt as storageMigrationCapability, D as StorageMigrationJobSchema, E as StorageLocationTypeSchema, Lt as settingsStoreCapability, R as collectSecretConfigKeys, St as modeMayWrite, T as StorageLocationModeSchema, Yt as BaseAddon, bt as mayWriteToLocation, et as evictionPolicyOfLocation, g as REDACTED_SECRET, hn as parseJsonObject, it as gbToBytes, jt as resolveLocationMode, m as LegacyStorageLocationDefaultSchema, pt as legacyModeOf, qt as withLocationMode, st as isLocationEnabled, w as StorageCleanupJobSchema, xn as EventCategory, yt as mayReadLocation, zt as storageCapability } from "../../dist-
|
|
1
|
+
import { Bt as storageMigrationCapability, D as StorageMigrationJobSchema, E as StorageLocationTypeSchema, Lt as settingsStoreCapability, R as collectSecretConfigKeys, St as modeMayWrite, T as StorageLocationModeSchema, Yt as BaseAddon, bt as mayWriteToLocation, et as evictionPolicyOfLocation, g as REDACTED_SECRET, hn as parseJsonObject, it as gbToBytes, jt as resolveLocationMode, m as LegacyStorageLocationDefaultSchema, pt as legacyModeOf, qt as withLocationMode, st as isLocationEnabled, w as StorageCleanupJobSchema, xn as EventCategory, yt as mayReadLocation, zt as storageCapability } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { t as HUB_CAP_FWD_ACTION } from "../../hub-cap-forward-BdT320dq.mjs";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
@@ -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-DaSCLJVH.js");
|
|
7
7
|
//#region src/builtins/system-config/system-config.addon.ts
|
|
8
8
|
/**
|
|
9
9
|
* Built-in `system-config` addon — Phase 4 of the settings redesign.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Jt as errMsg, Yt as BaseAddon, fn as hydrateSchema } from "../../dist-
|
|
1
|
+
import { Jt as errMsg, Yt as BaseAddon, fn as hydrateSchema } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
//#region src/builtins/system-config/system-config.addon.ts
|
|
3
3
|
/**
|
|
4
4
|
* Built-in `system-config` addon — Phase 4 of the settings redesign.
|
|
@@ -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-DaSCLJVH.js");
|
|
7
7
|
const require_formatter = require("../../formatter-DqAKDlvN.js");
|
|
8
8
|
let node_path = require("node:path");
|
|
9
9
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-
|
|
1
|
+
import { Yt as BaseAddon, gt as logDestinationCapability } from "../../dist-at9PGh6X.mjs";
|
|
2
2
|
import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
|
|
3
3
|
import * as path$1 from "node:path";
|
|
4
4
|
import path from "node:path";
|