@camstack/system 1.2.91 → 1.2.92
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/blocks-integration.d.ts +34 -1
- package/dist/builtins/core-blocks/core-blocks.addon.js +69 -22
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +69 -22
- package/dist/builtins/device-manager/device-manager.addon.js +1 -1
- package/dist/builtins/device-manager/device-manager.addon.mjs +1 -1
- 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 +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-9Gfk4KOk.js → dist-BH2tZ9ZN.js} +252 -5
- package/dist/{dist-DhrTd8LL.mjs → dist-DXDvrBi0.mjs} +252 -5
- package/dist/index.js +41 -6
- package/dist/index.mjs +41 -6
- package/dist/kernel/addon-health-monitor.d.ts +10 -1
- package/dist/logging/log-manager.d.ts +28 -0
- package/dist/{manifest-python-deps-C0zkl1Ae.js → manifest-python-deps-BZO_eMn-.js} +1 -7
- package/dist/{manifest-python-deps-fWzdEasI.mjs → manifest-python-deps-D3hP9W8D.mjs} +2 -8
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Lt as parseJsonObject, _t as BaseAddon, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as storageCapability, st as settingsStoreCapability, ut as storageMigrationCapability } from "../../dist-
|
|
1
|
+
import { Lt as parseJsonObject, _t as BaseAddon, g as StorageMigrationJobSchema, h as StorageLocationTypeSchema, lt as storageCapability, st as settingsStoreCapability, ut as storageMigrationCapability } from "../../dist-DXDvrBi0.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,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-BH2tZ9ZN.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 { Pt as hydrateSchema, _t as BaseAddon, gt as errMsg } from "../../dist-
|
|
1
|
+
import { Pt as hydrateSchema, _t as BaseAddon, gt as errMsg } from "../../dist-DXDvrBi0.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-BH2tZ9ZN.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 { J as logDestinationCapability, _t as BaseAddon } from "../../dist-
|
|
1
|
+
import { J as logDestinationCapability, _t as BaseAddon } from "../../dist-DXDvrBi0.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";
|
|
@@ -10158,6 +10158,18 @@ var LlmGenerateBaseInputSchema = zod.z.object({
|
|
|
10158
10158
|
* Resource ceiling = llama-server flags + idleStopMinutes ONLY (no RSS
|
|
10159
10159
|
* watchdog — operator decision #3).
|
|
10160
10160
|
*/
|
|
10161
|
+
/**
|
|
10162
|
+
* A companion artifact that MUST land beside the main GGUF: the `mmproj`
|
|
10163
|
+
* projector of a vision model, or shards 2..N of a split GGUF. Carried on the
|
|
10164
|
+
* REF rather than looked up at install time, so what the operator approved in
|
|
10165
|
+
* the preview is exactly what the node downloads.
|
|
10166
|
+
*/
|
|
10167
|
+
var ManagedModelExtraFileSchema = zod.z.object({
|
|
10168
|
+
url: zod.z.string(),
|
|
10169
|
+
filename: zod.z.string(),
|
|
10170
|
+
sizeBytes: zod.z.number(),
|
|
10171
|
+
sha256: zod.z.string().optional()
|
|
10172
|
+
});
|
|
10161
10173
|
var ManagedModelRefSchema = zod.z.discriminatedUnion("kind", [
|
|
10162
10174
|
zod.z.object({
|
|
10163
10175
|
kind: zod.z.literal("catalog"),
|
|
@@ -10166,7 +10178,11 @@ var ManagedModelRefSchema = zod.z.discriminatedUnion("kind", [
|
|
|
10166
10178
|
zod.z.object({
|
|
10167
10179
|
kind: zod.z.literal("url"),
|
|
10168
10180
|
url: zod.z.string(),
|
|
10169
|
-
sha256: zod.z.string().optional()
|
|
10181
|
+
sha256: zod.z.string().optional(),
|
|
10182
|
+
/** Picker/status label; the file basename when absent. */
|
|
10183
|
+
label: zod.z.string().optional(),
|
|
10184
|
+
sizeBytes: zod.z.number().optional(),
|
|
10185
|
+
extraFiles: zod.z.array(ManagedModelExtraFileSchema).optional()
|
|
10170
10186
|
}),
|
|
10171
10187
|
zod.z.object({
|
|
10172
10188
|
kind: zod.z.literal("path"),
|
|
@@ -10227,11 +10243,39 @@ var ManagedRuntimeConfigSchema = zod.z.object({
|
|
|
10227
10243
|
"q4_1",
|
|
10228
10244
|
"q4_0"
|
|
10229
10245
|
]).optional(),
|
|
10246
|
+
/**
|
|
10247
|
+
* Escape hatch for llama-server flags this schema does NOT model — `--jinja`
|
|
10248
|
+
* (which most vision chat templates need and some language-only models
|
|
10249
|
+
* dislike), `--cont-batching`, `--rope-scaling`, …
|
|
10250
|
+
*
|
|
10251
|
+
* It is NOT a second place to set the flags above. A token that collides
|
|
10252
|
+
* with a typed field is REJECTED at start, naming the field that owns it
|
|
10253
|
+
* (`assertNoOwnedFlags`), because two knobs writing the same argv is exactly
|
|
10254
|
+
* the "two switches that disagree" failure this repo has already shipped
|
|
10255
|
+
* twice (D62).
|
|
10256
|
+
*/
|
|
10257
|
+
extraArgs: zod.z.array(zod.z.string()).default([]),
|
|
10230
10258
|
/** Else lazy: first generate boots it. */
|
|
10231
10259
|
autoStart: zod.z.boolean().default(false),
|
|
10232
10260
|
/** 0 = never; frees RAM after quiet periods. */
|
|
10233
10261
|
idleStopMinutes: zod.z.number().int().default(30)
|
|
10234
10262
|
});
|
|
10263
|
+
/**
|
|
10264
|
+
* Where a multi-GB install currently is. A single 0..1 fraction cannot answer
|
|
10265
|
+
* "is it stuck?" for an install that is three files (shards + mmproj) followed
|
|
10266
|
+
* by a sha256 pass over 22 GB — during which the fraction sat at 1.0 and the
|
|
10267
|
+
* node looked hung. Phase + file + bytes is the smallest shape that does.
|
|
10268
|
+
*/
|
|
10269
|
+
var LlmDownloadProgressSchema = zod.z.object({
|
|
10270
|
+
phase: zod.z.enum(["downloading", "verifying"]),
|
|
10271
|
+
/** The artifact currently moving, e.g. `mmproj-F16.gguf`. */
|
|
10272
|
+
file: zod.z.string(),
|
|
10273
|
+
fileIndex: zod.z.number().int(),
|
|
10274
|
+
fileCount: zod.z.number().int(),
|
|
10275
|
+
/** Across the WHOLE install, not the current file. */
|
|
10276
|
+
downloadedBytes: zod.z.number(),
|
|
10277
|
+
totalBytes: zod.z.number().optional()
|
|
10278
|
+
});
|
|
10235
10279
|
var LlmRuntimeStatusSchema = zod.z.object({
|
|
10236
10280
|
/** Status is ALWAYS node-qualified. */
|
|
10237
10281
|
nodeId: zod.z.string(),
|
|
@@ -10248,6 +10292,8 @@ var LlmRuntimeStatusSchema = zod.z.object({
|
|
|
10248
10292
|
modelPath: zod.z.string().optional(),
|
|
10249
10293
|
modelId: zod.z.string().optional(),
|
|
10250
10294
|
downloadProgress: zod.z.number().min(0).max(1).optional(),
|
|
10295
|
+
/** Detail behind `downloadProgress`; present for the same lifetime. */
|
|
10296
|
+
download: LlmDownloadProgressSchema.optional(),
|
|
10251
10297
|
lastError: zod.z.string().optional(),
|
|
10252
10298
|
crashesInWindow: zod.z.number(),
|
|
10253
10299
|
/** Child RSS (sampled best-effort). */
|
|
@@ -10258,7 +10304,14 @@ var LlmNodeModelSchema = zod.z.object({
|
|
|
10258
10304
|
file: zod.z.string(),
|
|
10259
10305
|
sizeBytes: zod.z.number(),
|
|
10260
10306
|
catalogId: zod.z.string().optional(),
|
|
10261
|
-
installedAt: zod.z.number().optional()
|
|
10307
|
+
installedAt: zod.z.number().optional(),
|
|
10308
|
+
/**
|
|
10309
|
+
* Absolute path on the node. Present so a file that is on disk but matches
|
|
10310
|
+
* no catalog entry — a custom Hugging Face install, or a GGUF the operator
|
|
10311
|
+
* copied in by hand — is still SELECTABLE, as a `{kind:'path'}` ref. Without
|
|
10312
|
+
* it the picker could list such a file and do nothing with it.
|
|
10313
|
+
*/
|
|
10314
|
+
path: zod.z.string().optional()
|
|
10262
10315
|
});
|
|
10263
10316
|
var LlmRuntimeDiskUsageSchema = zod.z.object({
|
|
10264
10317
|
nodeId: zod.z.string(),
|
|
@@ -10351,9 +10404,12 @@ var LlmProfileSchema = zod.z.object({
|
|
|
10351
10404
|
systemPrompt: zod.z.string().optional(),
|
|
10352
10405
|
/** Total generation bound — the only one a unary call has. */
|
|
10353
10406
|
timeoutMs: zod.z.number().int().positive().default(6e4),
|
|
10354
|
-
/**
|
|
10407
|
+
/** The TCP handshake only — "is the port even open". NOT the wait for
|
|
10408
|
+
* response headers: on the LM Studio / llama-server wire those are written
|
|
10409
|
+
* once the model has finished loading, so they belong to the bound below. */
|
|
10355
10410
|
connectTimeoutMs: zod.z.number().int().positive().default(1e4),
|
|
10356
|
-
/** Accepted, but no output yet —
|
|
10411
|
+
/** Accepted, but no output yet — response headers included, because a cold
|
|
10412
|
+
* GPU load is exactly what happens before them. */
|
|
10357
10413
|
firstTokenTimeoutMs: zod.z.number().int().positive().default(12e4),
|
|
10358
10414
|
/** Output started then stopped. */
|
|
10359
10415
|
idleTimeoutMs: zod.z.number().int().positive().default(6e4),
|
|
@@ -10416,6 +10472,36 @@ var ManagedModelCatalogEntrySchema = zod.z.object({
|
|
|
10416
10472
|
/** Vision models: companion projector file. */
|
|
10417
10473
|
mmprojUrl: zod.z.string().optional()
|
|
10418
10474
|
});
|
|
10475
|
+
/**
|
|
10476
|
+
* The outcome of turning one operator-typed Hugging Face reference into a
|
|
10477
|
+
* download plan. A RESULT, never a throw: "this repo has 24 quantizations and
|
|
10478
|
+
* I will not pick for you" is a normal answer the UI has to render, not an
|
|
10479
|
+
* exception.
|
|
10480
|
+
*
|
|
10481
|
+
* `candidates` is the whole reason the refusal is usable — every string in it
|
|
10482
|
+
* is a tag that resolves when pasted back as `<org>/<repo>:<TAG>`.
|
|
10483
|
+
*/
|
|
10484
|
+
var HfModelResolutionSchema = zod.z.discriminatedUnion("ok", [zod.z.object({
|
|
10485
|
+
ok: zod.z.literal(true),
|
|
10486
|
+
/** Ready to hand to `installModel` unchanged. */
|
|
10487
|
+
model: ManagedModelRefSchema,
|
|
10488
|
+
label: zod.z.string(),
|
|
10489
|
+
repo: zod.z.string(),
|
|
10490
|
+
quantization: zod.z.string(),
|
|
10491
|
+
purpose: zod.z.enum(["text", "vision"]),
|
|
10492
|
+
totalBytes: zod.z.number(),
|
|
10493
|
+
/** mmproj + shards, for the preview: an operator approving 23 GB should
|
|
10494
|
+
* see that 0.9 GB of it is a projector they did not name. */
|
|
10495
|
+
extraFilenames: zod.z.array(zod.z.string())
|
|
10496
|
+
}), zod.z.object({
|
|
10497
|
+
ok: zod.z.literal(false),
|
|
10498
|
+
code: zod.z.string(),
|
|
10499
|
+
message: zod.z.string(),
|
|
10500
|
+
candidates: zod.z.array(zod.z.string()).optional(),
|
|
10501
|
+
/** Set when the refusal was only the ceiling: re-calling with
|
|
10502
|
+
* `maxBytes: requiredBytes` is the operator's explicit override. */
|
|
10503
|
+
requiredBytes: zod.z.number().optional()
|
|
10504
|
+
})]);
|
|
10419
10505
|
var LlmRuntimeNodeSchema = zod.z.object({
|
|
10420
10506
|
nodeId: zod.z.string(),
|
|
10421
10507
|
reachable: zod.z.boolean(),
|
|
@@ -10483,6 +10569,25 @@ var llmCapability = {
|
|
|
10483
10569
|
listModelCatalog: method(zod.z.object({}), zod.z.array(ManagedModelCatalogEntrySchema)),
|
|
10484
10570
|
listRuntimeNodes: method(zod.z.object({}), zod.z.array(LlmRuntimeNodeSchema)),
|
|
10485
10571
|
listNodeModels: method(zod.z.object({ nodeId: zod.z.string() }), zod.z.array(LlmNodeModelSchema)),
|
|
10572
|
+
/**
|
|
10573
|
+
* One typed Hugging Face reference → a pinned, verified `ManagedModelRef`.
|
|
10574
|
+
*
|
|
10575
|
+
* Runs on the HUB, not on the target node: resolution needs egress to
|
|
10576
|
+
* huggingface.co, and an agent that cannot reach it still installs fine
|
|
10577
|
+
* through the model-distributor relay. Nothing is downloaded here — this is
|
|
10578
|
+
* a tree read plus a HEAD, so the operator sees the size, the quantization
|
|
10579
|
+
* and the mmproj BEFORE approving a multi-GB pull.
|
|
10580
|
+
*/
|
|
10581
|
+
resolveModelRef: method(zod.z.object({
|
|
10582
|
+
/** `https://huggingface.co/<org>/<repo>/resolve/main/<f>.gguf`,
|
|
10583
|
+
* `<org>/<repo>/<f>.gguf`, `<org>/<repo>` or `<org>/<repo>:<QUANT>`. */
|
|
10584
|
+
ref: zod.z.string(),
|
|
10585
|
+
/** Explicit ceiling override, in bytes. Absent = the built-in ceiling. */
|
|
10586
|
+
maxBytes: zod.z.number().positive().optional()
|
|
10587
|
+
}), HfModelResolutionSchema, {
|
|
10588
|
+
kind: "mutation",
|
|
10589
|
+
auth: "admin"
|
|
10590
|
+
}),
|
|
10486
10591
|
installModel: method(zod.z.object({
|
|
10487
10592
|
nodeId: zod.z.string(),
|
|
10488
10593
|
model: ManagedModelRefSchema
|
|
@@ -12620,9 +12725,66 @@ var NcDeviceStateConditionSchema = zod.z.object({
|
|
|
12620
12725
|
/** Any of these matches. */
|
|
12621
12726
|
states: zod.z.array(zod.z.string().min(1)).min(1)
|
|
12622
12727
|
});
|
|
12728
|
+
/**
|
|
12729
|
+
* "This rule applies only while scene `sceneId` is `matched` / `diverged`."
|
|
12730
|
+
*
|
|
12731
|
+
* A GATE, not a trigger. `occupancy` and `audio` each DISCRIMINATE their rule —
|
|
12732
|
+
* carrying one makes the rule fire on that subject and nothing else. Scene is
|
|
12733
|
+
* the other shape entirely, the `deviceState` shape: it narrows a rule that
|
|
12734
|
+
* already has a trigger ("tell me about a person at the front door, but only
|
|
12735
|
+
* while the bin is still out"). That is why it composes with every delivery
|
|
12736
|
+
* instead of owning one, and why no new `NcDelivery` member and no new subject
|
|
12737
|
+
* kind exist for it — see D159.
|
|
12738
|
+
*
|
|
12739
|
+
* ── Identity ───────────────────────────────────────────────────────────────
|
|
12740
|
+
* `sceneId` is `SceneMonitor.id`, a `randomUUID()` minted by `createScene` —
|
|
12741
|
+
* globally unique, so it needs no device to disambiguate it. `deviceId` is
|
|
12742
|
+
* carried as a HINT for the editor and for the log line, never as part of the
|
|
12743
|
+
* lookup key: a rule whose hint drifted must still gate correctly.
|
|
12744
|
+
*
|
|
12745
|
+
* ── Which boolean ──────────────────────────────────────────────────────────
|
|
12746
|
+
* `latched` ABSENT means "whatever the scene itself says" — `SceneMonitor.emit`
|
|
12747
|
+
* already declares which boolean drives notification rules, and a second knob
|
|
12748
|
+
* that could disagree with it is exactly the D62 failure. Set it only to
|
|
12749
|
+
* override one rule against the scene's own default.
|
|
12750
|
+
*
|
|
12751
|
+
* - LIVE reading (`emit`/`latched` resolve to live): passes iff
|
|
12752
|
+
* `verdict === requiredState`. `unknown` — no reference for this light, view
|
|
12753
|
+
* shifted, no snapshot — passes NEITHER. A scene that cannot judge is not
|
|
12754
|
+
* evidence, in either direction.
|
|
12755
|
+
* - LATCHED reading: passes iff `latched === (requiredState === 'diverged')`.
|
|
12756
|
+
* The latch is a durable fact about the past ("it has diverged since I armed
|
|
12757
|
+
* it"), so a camera that has gone dark does not clear it — that is the whole
|
|
12758
|
+
* reason the operator asked for a latch.
|
|
12759
|
+
*
|
|
12760
|
+
* The gate reads an in-memory mirror (`NcSceneStateCache`) refreshed OFF the
|
|
12761
|
+
* event path, never the cap: D49. A mirror that has never loaded, or a scene it
|
|
12762
|
+
* does not carry, reads absent and the rule does NOT fire — fail closed, and
|
|
12763
|
+
* said out loud in the log rather than dropped in silence.
|
|
12764
|
+
*/
|
|
12765
|
+
var NcSceneConditionSchema = zod.z.object({
|
|
12766
|
+
/** `SceneMonitor.id` — the uuid the cap mints. The whole lookup key. */
|
|
12767
|
+
sceneId: zod.z.string().min(1),
|
|
12768
|
+
/** The camera the scene lives on. A hint for the editor and the log line. */
|
|
12769
|
+
deviceId: zod.z.number().int().optional(),
|
|
12770
|
+
/** The state the scene must be in for the rule to fire. */
|
|
12771
|
+
requiredState: zod.z.enum(["matched", "diverged"]),
|
|
12772
|
+
/**
|
|
12773
|
+
* Read the LATCH (`true`) or the LIVE verdict (`false`). Absent = follow the
|
|
12774
|
+
* scene's own `emit` field, which is the only place that decision belongs.
|
|
12775
|
+
*/
|
|
12776
|
+
latched: zod.z.boolean().optional()
|
|
12777
|
+
});
|
|
12623
12778
|
var NcConditionsSchema = zod.z.object({
|
|
12624
12779
|
/** Gate on ANOTHER device's current state (the alarm armed, a switch on). */
|
|
12625
12780
|
deviceState: NcDeviceStateConditionSchema.optional(),
|
|
12781
|
+
/**
|
|
12782
|
+
* Gate on a SCENE's state — "only while the bin is still out". Composes with
|
|
12783
|
+
* every trigger (detection, occupancy, audio, sensor, package, track-end);
|
|
12784
|
+
* unlike `occupancy`/`audio` it discriminates nothing. See
|
|
12785
|
+
* {@link NcSceneCondition} and D159.
|
|
12786
|
+
*/
|
|
12787
|
+
scene: NcSceneConditionSchema.optional(),
|
|
12626
12788
|
/** Device scope — absent = all devices. */
|
|
12627
12789
|
devices: zod.z.array(zod.z.number()).optional(),
|
|
12628
12790
|
/** Detector class names (any overlap with the record's class set). */
|
|
@@ -13260,6 +13422,7 @@ var NcConditionDescriptorSchema = zod.z.object({
|
|
|
13260
13422
|
"occupancy",
|
|
13261
13423
|
"audio",
|
|
13262
13424
|
"deviceState",
|
|
13425
|
+
"scene",
|
|
13263
13426
|
"systemEvent"
|
|
13264
13427
|
]),
|
|
13265
13428
|
operator: zod.z.enum([
|
|
@@ -16485,6 +16648,17 @@ var maxSessionHoldMsField = {
|
|
|
16485
16648
|
default: 12e4,
|
|
16486
16649
|
step: 5e3
|
|
16487
16650
|
};
|
|
16651
|
+
/**
|
|
16652
|
+
* Quiet period that closes an `audioMode: 'on-motion'` audio window. Floor of
|
|
16653
|
+
* 5s so a rearm can never degenerate into per-event stream churn; default 90s
|
|
16654
|
+
* comfortably outlives the gap between two PIR wakes on a battery camera.
|
|
16655
|
+
*/
|
|
16656
|
+
var audioMotionWindowMsField = {
|
|
16657
|
+
min: 5e3,
|
|
16658
|
+
max: 6e5,
|
|
16659
|
+
default: 9e4,
|
|
16660
|
+
step: 5e3
|
|
16661
|
+
};
|
|
16488
16662
|
var motionFpsField = {
|
|
16489
16663
|
min: 1,
|
|
16490
16664
|
max: 30,
|
|
@@ -16661,6 +16835,27 @@ var RunnerCameraConfigSchema = zod.z.object({
|
|
|
16661
16835
|
* resolved `CameraDetectionConfig`.
|
|
16662
16836
|
*/
|
|
16663
16837
|
maxSessionHoldMs: zod.z.number().min(maxSessionHoldMsField.min).max(maxSessionHoldMsField.max).optional(),
|
|
16838
|
+
/**
|
|
16839
|
+
* Orchestrator-side quiet period (ms) that closes an `audioMode:
|
|
16840
|
+
* 'on-motion'` audio window, measured from the LAST motion event.
|
|
16841
|
+
*
|
|
16842
|
+
* This exists because the falling edge cannot be relied on. Camera-native
|
|
16843
|
+
* providers emit motion as a RISING EDGE ONLY (Reolink's Baichuan push and
|
|
16844
|
+
* its email-push SMTP path both emit `detected: true` and never the
|
|
16845
|
+
* counterpart); only the frame-diff analyzer emits falls. So on an
|
|
16846
|
+
* onboard-only camera a window that closed only on `detected: false` never
|
|
16847
|
+
* closed at all, and `on-motion` silently behaved as `always-on` — on a
|
|
16848
|
+
* battery camera, the one failure mode the mode exists to prevent.
|
|
16849
|
+
*
|
|
16850
|
+
* Every motion event rearms this timer WITHOUT restarting the stream, so a
|
|
16851
|
+
* burst of re-fires costs nothing. A falling edge, when one does arrive,
|
|
16852
|
+
* still closes earlier via `motionCooldownMs` — whichever comes first wins.
|
|
16853
|
+
*
|
|
16854
|
+
* Not consumed by the runner: carried here so it shares the per-camera
|
|
16855
|
+
* device-settings surface with `motionCooldownMs`, exactly like
|
|
16856
|
+
* `maxSessionHoldMs`.
|
|
16857
|
+
*/
|
|
16858
|
+
audioMotionWindowMs: zod.z.number().min(audioMotionWindowMsField.min).max(audioMotionWindowMsField.max).optional(),
|
|
16664
16859
|
motionFps: zod.z.number().min(motionFpsField.min).max(motionFpsField.max).default(motionFpsField.default),
|
|
16665
16860
|
detectionFps: zod.z.number().min(detectionFpsField.min).max(detectionFpsField.max).default(detectionFpsField.default),
|
|
16666
16861
|
motionStreamId: zod.z.string(),
|
|
@@ -16756,7 +16951,7 @@ var RunnerCameraConfigSchema = zod.z.object({
|
|
|
16756
16951
|
*/
|
|
16757
16952
|
inferenceDevices: zod.z.array(RunnerInferenceDeviceSchema).readonly().optional()
|
|
16758
16953
|
});
|
|
16759
|
-
motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
|
|
16954
|
+
motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, maxSessionHoldMsField.min, maxSessionHoldMsField.max, maxSessionHoldMsField.step, maxSessionHoldMsField.default, audioMotionWindowMsField.min, audioMotionWindowMsField.max, audioMotionWindowMsField.step, audioMotionWindowMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
|
|
16760
16955
|
/**
|
|
16761
16956
|
* Runtime load summary returned by `getLocalLoad`. Used by the orchestrator's
|
|
16762
16957
|
* load-balancing levels (L2 capacity-based, L3 hardware-aware) to decide
|
|
@@ -26788,6 +26983,33 @@ var recordingExportCapability = {
|
|
|
26788
26983
|
* as `unknown`, never guessed. A day reference scored against an IR frame
|
|
26789
26984
|
* collapses the cosine and would latch a false alarm every single night. */
|
|
26790
26985
|
var SceneConditionSchema = zod.z.string();
|
|
26986
|
+
/**
|
|
26987
|
+
* What a scene does when the CURRENT light has no reference of its own.
|
|
26988
|
+
*
|
|
26989
|
+
* The lighting variants are not equally likely to exist. Almost every operator
|
|
26990
|
+
* captures daylight and then never stands outside at 22:00 to capture IR, and a
|
|
26991
|
+
* scene that is only ever going to be asked about a daytime question ("is the
|
|
26992
|
+
* bin still on the kerb at 08:00") does not need a night reference at all. The
|
|
26993
|
+
* night half must therefore be OPTIONAL, and optional means the scene keeps
|
|
26994
|
+
* working without it rather than degrading into a permanent complaint.
|
|
26995
|
+
*
|
|
26996
|
+
* - `skip` (default) — the check in that light is not made. Not a verdict, not
|
|
26997
|
+
* an alarm, not even an `unknown`: the live state simply stays whatever the
|
|
26998
|
+
* last covered light left it at, the latch is untouched, and the hysteresis
|
|
26999
|
+
* run is neither spent nor cleared. The scene resumes by itself at first
|
|
27000
|
+
* light. This is the only behaviour under which "I never captured IR" is a
|
|
27001
|
+
* configuration choice instead of a nightly fault.
|
|
27002
|
+
* - `judge-anyway` — score against the OTHER conditions' references. Available
|
|
27003
|
+
* for cameras whose IR frame is close enough to daylight (a floodlit
|
|
27004
|
+
* driveway, an always-white-light doorbell), and wrong for everything else:
|
|
27005
|
+
* cross-condition cosines are not comparable, so a day reference against a
|
|
27006
|
+
* true IR frame collapses and the scene reports a theft at 21:40.
|
|
27007
|
+
*
|
|
27008
|
+
* Never applies when the scene has NO comparable reference at all — that is
|
|
27009
|
+
* "not armed yet", it is reported as `no-reference-for-condition`, and silence
|
|
27010
|
+
* there would hide a scene the operator never finished setting up.
|
|
27011
|
+
*/
|
|
27012
|
+
var SceneUncoveredPolicySchema = zod.z.enum(["skip", "judge-anyway"]);
|
|
26791
27013
|
/** `matched` = the baseline is what we see; `diverged` = it demonstrably is not;
|
|
26792
27014
|
* `unknown` = we cannot judge (no reference for this condition, encoder model
|
|
26793
27015
|
* changed, view shifted, no snapshot). `unknown` is a real value, not a null,
|
|
@@ -26843,6 +27065,9 @@ var SceneCheckSchema = zod.z.discriminatedUnion("mode", [zod.z.object({
|
|
|
26843
27065
|
hysteresisCount: zod.z.number().int().positive()
|
|
26844
27066
|
})]);
|
|
26845
27067
|
var SCENE_DEFAULT_ANCHOR_THRESHOLD = .85;
|
|
27068
|
+
/** Night is OPTIONAL. A scene with only a daylight reference sits the IR hours
|
|
27069
|
+
* out in silence rather than reporting a fault every night. */
|
|
27070
|
+
var SCENE_DEFAULT_UNCOVERED_POLICY = "skip";
|
|
26846
27071
|
/**
|
|
26847
27072
|
* Vision-model adjudication of a candidate flip. Field names deliberately
|
|
26848
27073
|
* mirror `NcConfirmSchema` so an operator meets one vocabulary, not two.
|
|
@@ -26909,6 +27134,21 @@ var SceneMonitorSchema = zod.z.object({
|
|
|
26909
27134
|
* automation can react to the bin coming back without the operator's own
|
|
26910
27135
|
* alarm silently clearing itself. */
|
|
26911
27136
|
autoRestore: zod.z.boolean().default(false),
|
|
27137
|
+
/** What to do when the current light has no reference of its own. See
|
|
27138
|
+
* {@link SceneUncoveredPolicySchema} — the default makes night OPTIONAL. */
|
|
27139
|
+
onUncoveredCondition: SceneUncoveredPolicySchema.default(SCENE_DEFAULT_UNCOVERED_POLICY),
|
|
27140
|
+
/**
|
|
27141
|
+
* The light whose checks are currently being SAT OUT under
|
|
27142
|
+
* `onUncoveredCondition: 'skip'` — `null` when the scene is checking normally.
|
|
27143
|
+
*
|
|
27144
|
+
* Engine-reported and advisory only: it moves no verdict, no latch and no
|
|
27145
|
+
* hysteresis. It exists so the card can say *"night (IR) — checks paused,
|
|
27146
|
+
* nothing captured in this light"* in the same calm voice as the coverage
|
|
27147
|
+
* line, because the alternative is a scene that silently stops answering
|
|
27148
|
+
* after sunset with nothing anywhere saying why. A skipped check must never
|
|
27149
|
+
* read as a broken one.
|
|
27150
|
+
*/
|
|
27151
|
+
suspendedCondition: SceneConditionSchema.nullable().default(null),
|
|
26912
27152
|
/** Named cause when `verdict === 'unknown'`. */
|
|
26913
27153
|
unavailable: SceneUnavailableSchema.nullable(),
|
|
26914
27154
|
/** Conditions that have at least one comparable reference — the coverage line
|
|
@@ -26962,6 +27202,7 @@ var sceneMonitorCapability = {
|
|
|
26962
27202
|
minObservationSpacingSec: zod.z.number().int().min(0).max(3600).optional(),
|
|
26963
27203
|
anchorThreshold: zod.z.number().min(0).max(1).optional(),
|
|
26964
27204
|
autoRestore: zod.z.boolean().optional(),
|
|
27205
|
+
onUncoveredCondition: SceneUncoveredPolicySchema.optional(),
|
|
26965
27206
|
/** `null` clears the vision-model adjudicator. */
|
|
26966
27207
|
confirm: SceneConfirmSchema.nullable().optional()
|
|
26967
27208
|
})
|
|
@@ -31707,6 +31948,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
31707
31948
|
addonId: null,
|
|
31708
31949
|
access: "view"
|
|
31709
31950
|
},
|
|
31951
|
+
"llm.resolveModelRef": {
|
|
31952
|
+
capName: "llm",
|
|
31953
|
+
capScope: "system",
|
|
31954
|
+
addonId: null,
|
|
31955
|
+
access: "create"
|
|
31956
|
+
},
|
|
31710
31957
|
"llm.setDefault": {
|
|
31711
31958
|
capName: "llm",
|
|
31712
31959
|
capScope: "system",
|