@camstack/addon-provider-homeassistant 1.2.148 → 1.2.149
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.js +1 -1
- package/dist/addon.mjs +1 -1
- package/dist/{dist-nvulD3Mi.js → dist-BHAS4ZKN.js} +372 -51
- package/dist/{dist-DmoYnWid.mjs → dist-CpKTdyca.mjs} +372 -51
- package/dist/ha-export/ha-export.addon.js +7 -57
- package/dist/ha-export/ha-export.addon.mjs +7 -57
- package/package.json +1 -1
|
@@ -5369,7 +5369,7 @@ var ZodIssueCode = {
|
|
|
5369
5369
|
var ZodFirstPartyTypeKind;
|
|
5370
5370
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5371
5371
|
//#endregion
|
|
5372
|
-
//#region ../types/dist/sleep-
|
|
5372
|
+
//#region ../types/dist/sleep-gU6hqv4_.mjs
|
|
5373
5373
|
/**
|
|
5374
5374
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5375
5375
|
* window to float samples (D455).
|
|
@@ -7471,7 +7471,59 @@ function errMsg(err) {
|
|
|
7471
7471
|
return String(err);
|
|
7472
7472
|
}
|
|
7473
7473
|
//#endregion
|
|
7474
|
-
//#region ../types/dist/composition-
|
|
7474
|
+
//#region ../types/dist/composition-Dq42XWp0.mjs
|
|
7475
|
+
/**
|
|
7476
|
+
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
7477
|
+
*
|
|
7478
|
+
* ## Why a download, on every node, including the container
|
|
7479
|
+
*
|
|
7480
|
+
* The version of ffmpeg used to be CODE: baked into the image, changeable only
|
|
7481
|
+
* by rebuilding and rolling it. Now it is DATA — this file states the release,
|
|
7482
|
+
* and a node that boots with a different one downloads it. Changing ffmpeg is a
|
|
7483
|
+
* framework bump, not an image rebuild.
|
|
7484
|
+
*
|
|
7485
|
+
* It also settles the licence question by removing it. FFmpeg's licence is
|
|
7486
|
+
* chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
|
|
7487
|
+
* (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
|
|
7488
|
+
* makes the result undistributable. These are GPL v3 builds, and we do not
|
|
7489
|
+
* distribute them: the user's own node fetches the archive from the project
|
|
7490
|
+
* that publishes it, so we convey no GPL work and inherit none of the
|
|
7491
|
+
* obligations that come with conveying one. That is the whole reason the image
|
|
7492
|
+
* no longer installs ffmpeg at all — not a technical preference.
|
|
7493
|
+
*
|
|
7494
|
+
* ## Why jellyfin-ffmpeg
|
|
7495
|
+
*
|
|
7496
|
+
* One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
|
|
7497
|
+
* from one release, with the widest hardware surface of anything maintained:
|
|
7498
|
+
* VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
|
|
7499
|
+
* MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
|
|
7500
|
+
* so the binary is not linked against a driver stack it may not find.
|
|
7501
|
+
*
|
|
7502
|
+
* **What it still needs from the host, measured 2026-09-19.** On the Unraid
|
|
7503
|
+
* HOST, which has no libva, `-vaapi_device` aborts the process outright —
|
|
7504
|
+
* `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
|
|
7505
|
+
* "Assertion in generated code"' failed`. Inside our container, which installs
|
|
7506
|
+
* libva plus the iHD driver, the same command encodes: verified end to end with
|
|
7507
|
+
* `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
|
|
7508
|
+
* KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
|
|
7509
|
+
*
|
|
7510
|
+
* ## Why each artifact carries a checksum and a claim
|
|
7511
|
+
*
|
|
7512
|
+
* The download is now the only source, so `sha256` is verified before anything
|
|
7513
|
+
* is extracted — jellyfin publishes no checksums on its release assets, so
|
|
7514
|
+
* these are ours, taken at the version bump. And `expectedHwaccels` is what the
|
|
7515
|
+
* build is supposed to be able to do: a binary that probes short of its own
|
|
7516
|
+
* claim is a source that changed under us, which is precisely what went
|
|
7517
|
+
* unnoticed for months when a static build turned out to carry no VAAPI at all
|
|
7518
|
+
* (D536).
|
|
7519
|
+
*/
|
|
7520
|
+
/** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
|
|
7521
|
+
var FFMPEG_RELEASE = "8.1.2-5";
|
|
7522
|
+
var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
|
|
7523
|
+
function portable(target) {
|
|
7524
|
+
return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
|
|
7525
|
+
}
|
|
7526
|
+
portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
|
|
7475
7527
|
/**
|
|
7476
7528
|
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
7477
7529
|
* valutatore puro del suo FRONTE.
|
|
@@ -9089,6 +9141,82 @@ var ArchivedDebugNoteQueryInputSchema = object({
|
|
|
9089
9141
|
/** Max rows returned, newest-first. */
|
|
9090
9142
|
limit: number().int().min(1).max(1e3).optional()
|
|
9091
9143
|
});
|
|
9144
|
+
var TrackRelationKindSchema = _enum(["same-subject", "different-subjects"]);
|
|
9145
|
+
var TrackSideSchema = _enum(["before", "after"]);
|
|
9146
|
+
var TrackPurityValueSchema = _enum(["mixed", "not-a-subject"]);
|
|
9147
|
+
var TrackRelationSchema = object({
|
|
9148
|
+
id: string(),
|
|
9149
|
+
deviceId: number().int(),
|
|
9150
|
+
leftTrackId: string(),
|
|
9151
|
+
rightTrackId: string(),
|
|
9152
|
+
leftSide: TrackSideSchema.nullable(),
|
|
9153
|
+
rightSide: TrackSideSchema.nullable(),
|
|
9154
|
+
relation: TrackRelationKindSchema,
|
|
9155
|
+
presence: literal("continuous").nullable(),
|
|
9156
|
+
leftStartedAt: number().int().nullable(),
|
|
9157
|
+
rightStartedAt: number().int().nullable(),
|
|
9158
|
+
createdAt: number().int(),
|
|
9159
|
+
updatedAt: number().int(),
|
|
9160
|
+
author: string().nullable()
|
|
9161
|
+
});
|
|
9162
|
+
var TrackPuritySchema = object({
|
|
9163
|
+
id: string(),
|
|
9164
|
+
deviceId: number().int(),
|
|
9165
|
+
sourceTrackId: string(),
|
|
9166
|
+
purity: TrackPurityValueSchema,
|
|
9167
|
+
switchAtMs: number().int().nullable(),
|
|
9168
|
+
startedAt: number().int().nullable(),
|
|
9169
|
+
createdAt: number().int(),
|
|
9170
|
+
updatedAt: number().int(),
|
|
9171
|
+
author: string().nullable()
|
|
9172
|
+
});
|
|
9173
|
+
var SetTrackRelationInputSchema = object({
|
|
9174
|
+
deviceId: number().int(),
|
|
9175
|
+
trackId: string().min(1),
|
|
9176
|
+
otherTrackId: string().min(1),
|
|
9177
|
+
relation: TrackRelationKindSchema,
|
|
9178
|
+
presence: literal("continuous").optional(),
|
|
9179
|
+
trackSide: TrackSideSchema.optional(),
|
|
9180
|
+
otherSide: TrackSideSchema.optional()
|
|
9181
|
+
});
|
|
9182
|
+
var ClearTrackRelationInputSchema = object({
|
|
9183
|
+
deviceId: number().int(),
|
|
9184
|
+
trackId: string().min(1),
|
|
9185
|
+
otherTrackId: string().min(1)
|
|
9186
|
+
});
|
|
9187
|
+
var ClearTrackRelationResultSchema = object({ cleared: boolean() });
|
|
9188
|
+
var SetTrackPurityInputSchema = object({
|
|
9189
|
+
deviceId: number().int(),
|
|
9190
|
+
trackId: string().min(1),
|
|
9191
|
+
purity: _enum([
|
|
9192
|
+
"pure",
|
|
9193
|
+
"mixed",
|
|
9194
|
+
"not-a-subject"
|
|
9195
|
+
]),
|
|
9196
|
+
switchAtMs: number().int().optional()
|
|
9197
|
+
});
|
|
9198
|
+
/** `null` when `pure` cleared the row. */
|
|
9199
|
+
var SetTrackPurityResultSchema = object({ purity: TrackPuritySchema.nullable() });
|
|
9200
|
+
var ListTrackRelationsInputSchema = object({
|
|
9201
|
+
deviceId: number().int(),
|
|
9202
|
+
trackId: string().optional(),
|
|
9203
|
+
since: number().int().optional(),
|
|
9204
|
+
until: number().int().optional(),
|
|
9205
|
+
limit: number().int().min(1).max(5e3).optional()
|
|
9206
|
+
});
|
|
9207
|
+
var ListTrackRelationsResultSchema = object({
|
|
9208
|
+
relations: array(TrackRelationSchema).readonly(),
|
|
9209
|
+
purities: array(TrackPuritySchema).readonly(),
|
|
9210
|
+
truncated: boolean()
|
|
9211
|
+
});
|
|
9212
|
+
_enum([
|
|
9213
|
+
"unknown-track",
|
|
9214
|
+
"cross-device",
|
|
9215
|
+
"self-relation",
|
|
9216
|
+
"contradiction",
|
|
9217
|
+
"switch-outside-track",
|
|
9218
|
+
"switch-needs-mixed"
|
|
9219
|
+
]);
|
|
9092
9220
|
/**
|
|
9093
9221
|
* Ops-log — the durable, append-only operations audit shared by the
|
|
9094
9222
|
* recordings and events management surfaces.
|
|
@@ -13346,6 +13474,70 @@ var CompositionBlockStateSchema = object({
|
|
|
13346
13474
|
reason: string().optional(),
|
|
13347
13475
|
fields: array(CompositionFieldStateSchema)
|
|
13348
13476
|
});
|
|
13477
|
+
var NUMBER = {
|
|
13478
|
+
kind: "fixed",
|
|
13479
|
+
result: ["number"]
|
|
13480
|
+
};
|
|
13481
|
+
var BOOLEAN = {
|
|
13482
|
+
kind: "fixed",
|
|
13483
|
+
result: ["boolean"]
|
|
13484
|
+
};
|
|
13485
|
+
Object.freeze({
|
|
13486
|
+
min: NUMBER,
|
|
13487
|
+
max: NUMBER,
|
|
13488
|
+
abs: NUMBER,
|
|
13489
|
+
floor: NUMBER,
|
|
13490
|
+
ceil: NUMBER,
|
|
13491
|
+
sqrt: NUMBER,
|
|
13492
|
+
round: NUMBER,
|
|
13493
|
+
pow: NUMBER,
|
|
13494
|
+
clamp: NUMBER,
|
|
13495
|
+
avg: NUMBER,
|
|
13496
|
+
sum: NUMBER,
|
|
13497
|
+
age: NUMBER,
|
|
13498
|
+
convert: NUMBER,
|
|
13499
|
+
coalesce: { kind: "coalesce" },
|
|
13500
|
+
any: BOOLEAN,
|
|
13501
|
+
all: BOOLEAN,
|
|
13502
|
+
within: BOOLEAN,
|
|
13503
|
+
latest: {
|
|
13504
|
+
kind: "fixed",
|
|
13505
|
+
result: ["number", "null"]
|
|
13506
|
+
},
|
|
13507
|
+
number: {
|
|
13508
|
+
kind: "fixed",
|
|
13509
|
+
result: ["number", "null"]
|
|
13510
|
+
},
|
|
13511
|
+
rose: {
|
|
13512
|
+
kind: "fixed",
|
|
13513
|
+
result: ["number", "null"]
|
|
13514
|
+
},
|
|
13515
|
+
count: NUMBER
|
|
13516
|
+
});
|
|
13517
|
+
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
13518
|
+
/**
|
|
13519
|
+
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
13520
|
+
* device of that type, or an existing one that lacks them, can be given. The
|
|
13521
|
+
* blockers are the validator's own refusal codes, and a spec compares this
|
|
13522
|
+
* listing with `planComposition` for every capability — the editor can never
|
|
13523
|
+
* offer a feature the save would refuse for the same reason.
|
|
13524
|
+
*/
|
|
13525
|
+
var ComposableFieldSchema = object({
|
|
13526
|
+
path: string(),
|
|
13527
|
+
kind: CompositionFieldKindSchema,
|
|
13528
|
+
nullable: boolean(),
|
|
13529
|
+
required: boolean(),
|
|
13530
|
+
enumValues: array(string()).optional()
|
|
13531
|
+
});
|
|
13532
|
+
var ComposableCapabilitiesSchema = object({ caps: array(object({
|
|
13533
|
+
cap: string(),
|
|
13534
|
+
fields: array(ComposableFieldSchema),
|
|
13535
|
+
/** Present for an item-array cap (`consumables.items`). */
|
|
13536
|
+
itemArray: object({
|
|
13537
|
+
path: string(),
|
|
13538
|
+
keyField: string()
|
|
13539
|
+
}).optional()
|
|
13540
|
+
})) });
|
|
13349
13541
|
/** Where a block runs. The operator chooses — a block driving a device on an
|
|
13350
13542
|
* agent is the reason placement is not fixed to the hub. */
|
|
13351
13543
|
var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
|
|
@@ -13510,7 +13702,7 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
|
|
|
13510
13702
|
}), method(object({ blockId: string() }), CompositionGetReadSchema, { auth: "admin" }), method(object({}), CompositionListReadSchema, { auth: "admin" }), method(object({
|
|
13511
13703
|
addonId: string().min(1),
|
|
13512
13704
|
stableId: string().min(1)
|
|
13513
|
-
}), CompositionCustomizationReadSchema, { auth: "admin" }), method(object({
|
|
13705
|
+
}), CompositionCustomizationReadSchema, { auth: "admin" }), method(object({ deviceType: _enum(DeviceType) }), ComposableCapabilitiesSchema, { auth: "admin" }), method(object({
|
|
13514
13706
|
composition: CompositionSchema,
|
|
13515
13707
|
blockId: string().optional()
|
|
13516
13708
|
}), CompositionValidationSchema, {
|
|
@@ -19008,8 +19200,14 @@ var NcSensorTransitionSchema = _enum(["raised", "cleared"]);
|
|
|
19008
19200
|
/** Admin-zone membership condition (zone IDs as stamped by the ZoneEngine). */
|
|
19009
19201
|
var NcZoneConditionSchema = object({
|
|
19010
19202
|
ids: array(string().min(1)).min(1),
|
|
19011
|
-
/**
|
|
19012
|
-
|
|
19203
|
+
/**
|
|
19204
|
+
* LEGACY quantifier over `ids`. Absent = `any` (at least one visited), which
|
|
19205
|
+
* is what both editors mean and all they write since D690: "all of" was
|
|
19206
|
+
* removed from the editors because on an immediate rule it asked one
|
|
19207
|
+
* detection to stand in every zone at once. Still ACCEPTED, and `all` still
|
|
19208
|
+
* evaluated, so a stored rule keeps parsing and meaning what it meant.
|
|
19209
|
+
*/
|
|
19210
|
+
match: _enum(["any", "all"]).optional()
|
|
19013
19211
|
});
|
|
19014
19212
|
/**
|
|
19015
19213
|
* The P1 condition set — a flat AND of groups; absent group = pass;
|
|
@@ -20900,7 +21098,7 @@ function cameraSensorRefKey(ref) {
|
|
|
20900
21098
|
}
|
|
20901
21099
|
/** CS-1 accepts exactly one mode; CS-2 (D673) widens it to confirm / replace. */
|
|
20902
21100
|
var CameraSensorsModeSchema = _enum(["in-addition"]);
|
|
20903
|
-
object({
|
|
21101
|
+
var CameraSensorsConfigSchema = object({
|
|
20904
21102
|
mode: CameraSensorsModeSchema,
|
|
20905
21103
|
sensors: array(CameraSensorRefSchema).min(1).max(8)
|
|
20906
21104
|
}).superRefine((value, ctx) => {
|
|
@@ -22805,7 +23003,8 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
22805
23003
|
trackIds: array(string()).min(1)
|
|
22806
23004
|
}), object({
|
|
22807
23005
|
deleted: number().int(),
|
|
22808
|
-
failed: array(string()).readonly()
|
|
23006
|
+
failed: array(string()).readonly(),
|
|
23007
|
+
sparedMediaIds: array(number().int()).readonly().optional()
|
|
22809
23008
|
}), {
|
|
22810
23009
|
kind: "mutation",
|
|
22811
23010
|
auth: "admin"
|
|
@@ -22814,7 +23013,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
22814
23013
|
deviceId: number(),
|
|
22815
23014
|
trackId: string(),
|
|
22816
23015
|
flags: TrackFlagsPatchSchema
|
|
22817
|
-
}), TrackFlagsSchema, { kind: "mutation" }), method(ArchivedDebugNoteQueryInputSchema, array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }), method(BirthDecisionQueryInputSchema, array(BirthDecisionRecordSchema).readonly(), { kind: "query" }), method(object({}), EventStoreFootprintSchema, {
|
|
23016
|
+
}), TrackFlagsSchema, { kind: "mutation" }), method(ArchivedDebugNoteQueryInputSchema, array(ArchivedDebugNoteSchema).readonly(), { kind: "query" }), method(SetTrackRelationInputSchema, TrackRelationSchema, { kind: "mutation" }), method(ClearTrackRelationInputSchema, ClearTrackRelationResultSchema, { kind: "mutation" }), method(SetTrackPurityInputSchema, SetTrackPurityResultSchema, { kind: "mutation" }), method(ListTrackRelationsInputSchema, ListTrackRelationsResultSchema, { kind: "query" }), method(BirthDecisionQueryInputSchema, array(BirthDecisionRecordSchema).readonly(), { kind: "query" }), method(object({}), EventStoreFootprintSchema, {
|
|
22818
23017
|
kind: "query",
|
|
22819
23018
|
auth: "admin"
|
|
22820
23019
|
}), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
|
|
@@ -25012,7 +25211,64 @@ var NodeInferenceDevicesSchema = object({
|
|
|
25012
25211
|
reachable: boolean(),
|
|
25013
25212
|
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
25014
25213
|
});
|
|
25015
|
-
|
|
25214
|
+
/**
|
|
25215
|
+
* Pipeline Orchestrator capability — global load balancer + camera dispatcher.
|
|
25216
|
+
*
|
|
25217
|
+
* Lives on the hub. Tracks the camera-to-agent assignment map, listens to
|
|
25218
|
+
* device lifecycle events, queries each runner's capacity + hardware
|
|
25219
|
+
* profile, and dispatches `attachCamera` / `detachCamera` cap calls to the
|
|
25220
|
+
* appropriate runner instances. Persists assignments via the multi-level
|
|
25221
|
+
* settings store so they survive hub restarts.
|
|
25222
|
+
*
|
|
25223
|
+
* Strictly the control plane: never sees a frame, never calls inference,
|
|
25224
|
+
* never drains queues. The runner does that work locally on each agent.
|
|
25225
|
+
*/
|
|
25226
|
+
/**
|
|
25227
|
+
* The input of `setCameraSensors` (G5, D676): the ONE typed write path of a
|
|
25228
|
+
* camera's attached sensors (D672). `config: null` removes the attachment —
|
|
25229
|
+
* the camera reads `not-configured` again, never `unreadable`.
|
|
25230
|
+
*/
|
|
25231
|
+
var SetCameraSensorsInputSchema = object({
|
|
25232
|
+
deviceId: number().int().nonnegative(),
|
|
25233
|
+
/** `null` removes the attachment: the camera goes back to `not-configured`. */
|
|
25234
|
+
config: CameraSensorsConfigSchema.nullable()
|
|
25235
|
+
});
|
|
25236
|
+
/**
|
|
25237
|
+
* Why an early occupancy look (D691) was not scheduled.
|
|
25238
|
+
*
|
|
25239
|
+
* - `unknown-camera` — no session was ever dispatched for it, so there is no
|
|
25240
|
+
* node and no config to attach a burst with.
|
|
25241
|
+
* - `out-of-range` — the ask is negative or further out than the orchestrator
|
|
25242
|
+
* will hold a timer for; the parked-object cadence is the answer there.
|
|
25243
|
+
* - `no-burst-producer` — this build has no burst producer at all.
|
|
25244
|
+
* - `already-looked` — this camera's ONE early look since its last session has
|
|
25245
|
+
* been spent. A look's own burst can re-arm a flickering flip, and a look
|
|
25246
|
+
* per arm would chain a burst every ~30 s forever (review H2); the next
|
|
25247
|
+
* real session re-arms the budget.
|
|
25248
|
+
*/
|
|
25249
|
+
var OccupancyLookRefusalSchema = _enum([
|
|
25250
|
+
"unknown-camera",
|
|
25251
|
+
"out-of-range",
|
|
25252
|
+
"no-burst-producer",
|
|
25253
|
+
"already-looked"
|
|
25254
|
+
]);
|
|
25255
|
+
method(object({
|
|
25256
|
+
deviceId: number().int().nonnegative(),
|
|
25257
|
+
/** How long from NOW until the pending flip's sustain window ends. RELATIVE,
|
|
25258
|
+
* so the caller's clock and the orchestrator's never have to agree. */
|
|
25259
|
+
afterMs: number().finite(),
|
|
25260
|
+
/** Why, for the log. */
|
|
25261
|
+
reason: string()
|
|
25262
|
+
}), object({
|
|
25263
|
+
scheduled: boolean(),
|
|
25264
|
+
/** When `scheduled`: how long until the burst is dialled. */
|
|
25265
|
+
dueInMs: number().optional(),
|
|
25266
|
+
/** When not `scheduled`: why. */
|
|
25267
|
+
refusedBecause: OccupancyLookRefusalSchema.optional()
|
|
25268
|
+
}), {
|
|
25269
|
+
kind: "mutation",
|
|
25270
|
+
auth: "admin"
|
|
25271
|
+
}), method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
|
|
25016
25272
|
kind: "mutation",
|
|
25017
25273
|
auth: "admin"
|
|
25018
25274
|
}), method(StorageMigrationLeaseInputSchema, object({ resumed: literal(true) }), {
|
|
@@ -25166,7 +25422,10 @@ method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
|
|
|
25166
25422
|
}), CameraSwitchGroupSchema, {
|
|
25167
25423
|
kind: "mutation",
|
|
25168
25424
|
auth: "admin"
|
|
25169
|
-
}), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(
|
|
25425
|
+
}), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(SetCameraSensorsInputSchema, object({ success: literal(true) }), {
|
|
25426
|
+
kind: "mutation",
|
|
25427
|
+
auth: "admin"
|
|
25428
|
+
}), method(_void(), DiskReconcileJobSchema, {
|
|
25170
25429
|
kind: "mutation",
|
|
25171
25430
|
auth: "admin"
|
|
25172
25431
|
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
|
|
@@ -38839,47 +39098,6 @@ var zoneRulesCapability = {
|
|
|
38839
39098
|
*/
|
|
38840
39099
|
durability: "restored"
|
|
38841
39100
|
};
|
|
38842
|
-
var NUMBER = {
|
|
38843
|
-
kind: "fixed",
|
|
38844
|
-
result: ["number"]
|
|
38845
|
-
};
|
|
38846
|
-
var BOOLEAN = {
|
|
38847
|
-
kind: "fixed",
|
|
38848
|
-
result: ["boolean"]
|
|
38849
|
-
};
|
|
38850
|
-
Object.freeze({
|
|
38851
|
-
min: NUMBER,
|
|
38852
|
-
max: NUMBER,
|
|
38853
|
-
abs: NUMBER,
|
|
38854
|
-
floor: NUMBER,
|
|
38855
|
-
ceil: NUMBER,
|
|
38856
|
-
sqrt: NUMBER,
|
|
38857
|
-
round: NUMBER,
|
|
38858
|
-
pow: NUMBER,
|
|
38859
|
-
clamp: NUMBER,
|
|
38860
|
-
avg: NUMBER,
|
|
38861
|
-
sum: NUMBER,
|
|
38862
|
-
age: NUMBER,
|
|
38863
|
-
convert: NUMBER,
|
|
38864
|
-
coalesce: { kind: "coalesce" },
|
|
38865
|
-
any: BOOLEAN,
|
|
38866
|
-
all: BOOLEAN,
|
|
38867
|
-
within: BOOLEAN,
|
|
38868
|
-
latest: {
|
|
38869
|
-
kind: "fixed",
|
|
38870
|
-
result: ["number", "null"]
|
|
38871
|
-
},
|
|
38872
|
-
number: {
|
|
38873
|
-
kind: "fixed",
|
|
38874
|
-
result: ["number", "null"]
|
|
38875
|
-
},
|
|
38876
|
-
rose: {
|
|
38877
|
-
kind: "fixed",
|
|
38878
|
-
result: ["number", "null"]
|
|
38879
|
-
},
|
|
38880
|
-
count: NUMBER
|
|
38881
|
-
});
|
|
38882
|
-
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
38883
39101
|
/**
|
|
38884
39102
|
* Accessory device helpers — shared across drivers.
|
|
38885
39103
|
*
|
|
@@ -42825,6 +43043,12 @@ Object.freeze({
|
|
|
42825
43043
|
addonId: null,
|
|
42826
43044
|
access: "view"
|
|
42827
43045
|
},
|
|
43046
|
+
"coreBlocks.listComposableCaps": {
|
|
43047
|
+
capName: "core-blocks",
|
|
43048
|
+
capScope: "system",
|
|
43049
|
+
addonId: null,
|
|
43050
|
+
access: "view"
|
|
43051
|
+
},
|
|
42828
43052
|
"coreBlocks.listCompositions": {
|
|
42829
43053
|
capName: "core-blocks",
|
|
42830
43054
|
capScope: "system",
|
|
@@ -45639,6 +45863,12 @@ Object.freeze({
|
|
|
45639
45863
|
addonId: null,
|
|
45640
45864
|
access: "create"
|
|
45641
45865
|
},
|
|
45866
|
+
"pipelineAnalytics.clearTrackRelation": {
|
|
45867
|
+
capName: "pipeline-analytics",
|
|
45868
|
+
capScope: "device",
|
|
45869
|
+
addonId: null,
|
|
45870
|
+
access: "delete"
|
|
45871
|
+
},
|
|
45642
45872
|
"pipelineAnalytics.clearTracks": {
|
|
45643
45873
|
capName: "pipeline-analytics",
|
|
45644
45874
|
capScope: "device",
|
|
@@ -45891,6 +46121,12 @@ Object.freeze({
|
|
|
45891
46121
|
addonId: null,
|
|
45892
46122
|
access: "view"
|
|
45893
46123
|
},
|
|
46124
|
+
"pipelineAnalytics.listTrackRelations": {
|
|
46125
|
+
capName: "pipeline-analytics",
|
|
46126
|
+
capScope: "device",
|
|
46127
|
+
addonId: null,
|
|
46128
|
+
access: "view"
|
|
46129
|
+
},
|
|
45894
46130
|
"pipelineAnalytics.listTracks": {
|
|
45895
46131
|
capName: "pipeline-analytics",
|
|
45896
46132
|
capScope: "device",
|
|
@@ -46005,6 +46241,18 @@ Object.freeze({
|
|
|
46005
46241
|
addonId: null,
|
|
46006
46242
|
access: "create"
|
|
46007
46243
|
},
|
|
46244
|
+
"pipelineAnalytics.setTrackPurity": {
|
|
46245
|
+
capName: "pipeline-analytics",
|
|
46246
|
+
capScope: "device",
|
|
46247
|
+
addonId: null,
|
|
46248
|
+
access: "create"
|
|
46249
|
+
},
|
|
46250
|
+
"pipelineAnalytics.setTrackRelation": {
|
|
46251
|
+
capName: "pipeline-analytics",
|
|
46252
|
+
capScope: "device",
|
|
46253
|
+
addonId: null,
|
|
46254
|
+
access: "create"
|
|
46255
|
+
},
|
|
46008
46256
|
"pipelineAnalytics.startStorageMigrationMove": {
|
|
46009
46257
|
capName: "pipeline-analytics",
|
|
46010
46258
|
capScope: "device",
|
|
@@ -46443,6 +46691,12 @@ Object.freeze({
|
|
|
46443
46691
|
addonId: null,
|
|
46444
46692
|
access: "delete"
|
|
46445
46693
|
},
|
|
46694
|
+
"pipelineOrchestrator.requestOccupancyLook": {
|
|
46695
|
+
capName: "pipeline-orchestrator",
|
|
46696
|
+
capScope: "system",
|
|
46697
|
+
addonId: null,
|
|
46698
|
+
access: "create"
|
|
46699
|
+
},
|
|
46446
46700
|
"pipelineOrchestrator.resetNodePipelineDefaults": {
|
|
46447
46701
|
capName: "pipeline-orchestrator",
|
|
46448
46702
|
capScope: "system",
|
|
@@ -46509,6 +46763,12 @@ Object.freeze({
|
|
|
46509
46763
|
addonId: null,
|
|
46510
46764
|
access: "create"
|
|
46511
46765
|
},
|
|
46766
|
+
"pipelineOrchestrator.setCameraSensors": {
|
|
46767
|
+
capName: "pipeline-orchestrator",
|
|
46768
|
+
capScope: "system",
|
|
46769
|
+
addonId: null,
|
|
46770
|
+
access: "create"
|
|
46771
|
+
},
|
|
46512
46772
|
"pipelineOrchestrator.setCameraStepOverride": {
|
|
46513
46773
|
capName: "pipeline-orchestrator",
|
|
46514
46774
|
capScope: "system",
|
|
@@ -49919,6 +50179,11 @@ Object.freeze({
|
|
|
49919
50179
|
form: "single",
|
|
49920
50180
|
optional: false
|
|
49921
50181
|
}],
|
|
50182
|
+
"pipelineAnalytics.clearTrackRelation": [{
|
|
50183
|
+
name: "deviceId",
|
|
50184
|
+
form: "single",
|
|
50185
|
+
optional: false
|
|
50186
|
+
}],
|
|
49922
50187
|
"pipelineAnalytics.clearTracks": [{
|
|
49923
50188
|
name: "deviceId",
|
|
49924
50189
|
form: "single",
|
|
@@ -50069,6 +50334,11 @@ Object.freeze({
|
|
|
50069
50334
|
form: "single",
|
|
50070
50335
|
optional: false
|
|
50071
50336
|
}],
|
|
50337
|
+
"pipelineAnalytics.listTrackRelations": [{
|
|
50338
|
+
name: "deviceId",
|
|
50339
|
+
form: "single",
|
|
50340
|
+
optional: false
|
|
50341
|
+
}],
|
|
50072
50342
|
"pipelineAnalytics.listTracks": [{
|
|
50073
50343
|
name: "deviceId",
|
|
50074
50344
|
form: "single",
|
|
@@ -50139,6 +50409,16 @@ Object.freeze({
|
|
|
50139
50409
|
form: "single",
|
|
50140
50410
|
optional: false
|
|
50141
50411
|
}],
|
|
50412
|
+
"pipelineAnalytics.setTrackPurity": [{
|
|
50413
|
+
name: "deviceId",
|
|
50414
|
+
form: "single",
|
|
50415
|
+
optional: false
|
|
50416
|
+
}],
|
|
50417
|
+
"pipelineAnalytics.setTrackRelation": [{
|
|
50418
|
+
name: "deviceId",
|
|
50419
|
+
form: "single",
|
|
50420
|
+
optional: false
|
|
50421
|
+
}],
|
|
50142
50422
|
"pipelineAnalytics.wipeAllAnalytics": [{
|
|
50143
50423
|
name: "deviceId",
|
|
50144
50424
|
form: "single",
|
|
@@ -50209,6 +50489,11 @@ Object.freeze({
|
|
|
50209
50489
|
form: "single",
|
|
50210
50490
|
optional: false
|
|
50211
50491
|
}],
|
|
50492
|
+
"pipelineOrchestrator.requestOccupancyLook": [{
|
|
50493
|
+
name: "deviceId",
|
|
50494
|
+
form: "single",
|
|
50495
|
+
optional: false
|
|
50496
|
+
}],
|
|
50212
50497
|
"pipelineOrchestrator.resolvePipeline": [{
|
|
50213
50498
|
name: "deviceId",
|
|
50214
50499
|
form: "single",
|
|
@@ -50219,6 +50504,11 @@ Object.freeze({
|
|
|
50219
50504
|
form: "single",
|
|
50220
50505
|
optional: false
|
|
50221
50506
|
}],
|
|
50507
|
+
"pipelineOrchestrator.setCameraSensors": [{
|
|
50508
|
+
name: "deviceId",
|
|
50509
|
+
form: "single",
|
|
50510
|
+
optional: false
|
|
50511
|
+
}],
|
|
50222
50512
|
"pipelineOrchestrator.setCameraStepOverride": [{
|
|
50223
50513
|
name: "deviceId",
|
|
50224
50514
|
form: "single",
|
|
@@ -51648,6 +51938,37 @@ var STATE_SUMMARY_VARS = [
|
|
|
51648
51938
|
[...RULE_TEXT],
|
|
51649
51939
|
...STATE_SUMMARY_VARS
|
|
51650
51940
|
];
|
|
51941
|
+
new Set([
|
|
51942
|
+
"disarmed",
|
|
51943
|
+
"armed_home",
|
|
51944
|
+
"armed_away",
|
|
51945
|
+
"armed_night",
|
|
51946
|
+
"armed_vacation",
|
|
51947
|
+
"armed_custom_bypass",
|
|
51948
|
+
"arming",
|
|
51949
|
+
"disarming",
|
|
51950
|
+
"pending",
|
|
51951
|
+
"triggered",
|
|
51952
|
+
"open",
|
|
51953
|
+
"opening",
|
|
51954
|
+
"closing",
|
|
51955
|
+
"closed",
|
|
51956
|
+
"stopped",
|
|
51957
|
+
"locked",
|
|
51958
|
+
"unlocked",
|
|
51959
|
+
"locking",
|
|
51960
|
+
"unlocking",
|
|
51961
|
+
"jammed",
|
|
51962
|
+
"on",
|
|
51963
|
+
"off",
|
|
51964
|
+
"home",
|
|
51965
|
+
"not_home",
|
|
51966
|
+
"matched",
|
|
51967
|
+
"diverged",
|
|
51968
|
+
"unknown",
|
|
51969
|
+
"latched",
|
|
51970
|
+
"live"
|
|
51971
|
+
]);
|
|
51651
51972
|
/**
|
|
51652
51973
|
* TimelapseRule — the STANDALONE scheduled timelapse producer's rule model.
|
|
51653
51974
|
*
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
//#endregion
|
|
6
|
-
const require_dist = require("../dist-
|
|
6
|
+
const require_dist = require("../dist-BHAS4ZKN.js");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
//#region src/ha-export/topics.ts
|
|
9
9
|
/**
|
|
@@ -4216,60 +4216,6 @@ function resolveCameraFunctionWrite(id, on, reads) {
|
|
|
4216
4216
|
};
|
|
4217
4217
|
}
|
|
4218
4218
|
}
|
|
4219
|
-
//#endregion
|
|
4220
|
-
//#region ../types/dist/node.mjs
|
|
4221
|
-
/**
|
|
4222
|
-
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
4223
|
-
*
|
|
4224
|
-
* ## Why a download, on every node, including the container
|
|
4225
|
-
*
|
|
4226
|
-
* The version of ffmpeg used to be CODE: baked into the image, changeable only
|
|
4227
|
-
* by rebuilding and rolling it. Now it is DATA — this file states the release,
|
|
4228
|
-
* and a node that boots with a different one downloads it. Changing ffmpeg is a
|
|
4229
|
-
* framework bump, not an image rebuild.
|
|
4230
|
-
*
|
|
4231
|
-
* It also settles the licence question by removing it. FFmpeg's licence is
|
|
4232
|
-
* chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
|
|
4233
|
-
* (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
|
|
4234
|
-
* makes the result undistributable. These are GPL v3 builds, and we do not
|
|
4235
|
-
* distribute them: the user's own node fetches the archive from the project
|
|
4236
|
-
* that publishes it, so we convey no GPL work and inherit none of the
|
|
4237
|
-
* obligations that come with conveying one. That is the whole reason the image
|
|
4238
|
-
* no longer installs ffmpeg at all — not a technical preference.
|
|
4239
|
-
*
|
|
4240
|
-
* ## Why jellyfin-ffmpeg
|
|
4241
|
-
*
|
|
4242
|
-
* One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
|
|
4243
|
-
* from one release, with the widest hardware surface of anything maintained:
|
|
4244
|
-
* VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
|
|
4245
|
-
* MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
|
|
4246
|
-
* so the binary is not linked against a driver stack it may not find.
|
|
4247
|
-
*
|
|
4248
|
-
* **What it still needs from the host, measured 2026-09-19.** On the Unraid
|
|
4249
|
-
* HOST, which has no libva, `-vaapi_device` aborts the process outright —
|
|
4250
|
-
* `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
|
|
4251
|
-
* "Assertion in generated code"' failed`. Inside our container, which installs
|
|
4252
|
-
* libva plus the iHD driver, the same command encodes: verified end to end with
|
|
4253
|
-
* `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
|
|
4254
|
-
* KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
|
|
4255
|
-
*
|
|
4256
|
-
* ## Why each artifact carries a checksum and a claim
|
|
4257
|
-
*
|
|
4258
|
-
* The download is now the only source, so `sha256` is verified before anything
|
|
4259
|
-
* is extracted — jellyfin publishes no checksums on its release assets, so
|
|
4260
|
-
* these are ours, taken at the version bump. And `expectedHwaccels` is what the
|
|
4261
|
-
* build is supposed to be able to do: a binary that probes short of its own
|
|
4262
|
-
* claim is a source that changed under us, which is precisely what went
|
|
4263
|
-
* unnoticed for months when a static build turned out to carry no VAAPI at all
|
|
4264
|
-
* (D536).
|
|
4265
|
-
*/
|
|
4266
|
-
/** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
|
|
4267
|
-
var FFMPEG_RELEASE = "8.1.2-5";
|
|
4268
|
-
var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
|
|
4269
|
-
function portable(target) {
|
|
4270
|
-
return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
|
|
4271
|
-
}
|
|
4272
|
-
portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
|
|
4273
4219
|
/**
|
|
4274
4220
|
* The ONE derivation of "a signed, expiring URL".
|
|
4275
4221
|
*
|
|
@@ -4958,6 +4904,7 @@ function projectMotion(deviceKey, input) {
|
|
|
4958
4904
|
* camstack mints the URL and HA fetches the bytes on demand.
|
|
4959
4905
|
*/
|
|
4960
4906
|
function projectTrackLifecycle(deviceKey, track, mediaUrl) {
|
|
4907
|
+
if (track.phase === "end" && track.fusedIntoTrackId !== void 0) return [];
|
|
4961
4908
|
const className = track.bestClassName ?? track.classes[0];
|
|
4962
4909
|
if (className === void 0) return [];
|
|
4963
4910
|
const macro = macroOf(className);
|
|
@@ -6363,6 +6310,7 @@ var HaExportAddon = class extends require_dist.BaseAddon {
|
|
|
6363
6310
|
const plateText = readString(data, "plateText");
|
|
6364
6311
|
const lastSeen = readNumber(data, "lastSeen") ?? Date.now();
|
|
6365
6312
|
const zonesVisited = readStringArray(data, "zonesVisited");
|
|
6313
|
+
const fusedIntoTrackId = readString(data, "fusedIntoTrackId");
|
|
6366
6314
|
const mediaUrl = this.mintTrackMediaUrl(trackId, deviceId);
|
|
6367
6315
|
const values = projectTrackLifecycle(deviceKey, {
|
|
6368
6316
|
deviceId,
|
|
@@ -6373,7 +6321,8 @@ var HaExportAddon = class extends require_dist.BaseAddon {
|
|
|
6373
6321
|
...label !== null ? { label } : {},
|
|
6374
6322
|
...plateText !== null ? { plateText } : {},
|
|
6375
6323
|
lastSeen,
|
|
6376
|
-
zonesVisited
|
|
6324
|
+
zonesVisited,
|
|
6325
|
+
...fusedIntoTrackId !== null ? { fusedIntoTrackId } : {}
|
|
6377
6326
|
}, mediaUrl);
|
|
6378
6327
|
if (values.length === 0) {
|
|
6379
6328
|
this.ctx.logger.debug("ha-export: track produced no exportable state", {
|
|
@@ -6381,7 +6330,8 @@ var HaExportAddon = class extends require_dist.BaseAddon {
|
|
|
6381
6330
|
meta: {
|
|
6382
6331
|
trackId,
|
|
6383
6332
|
bestClassName,
|
|
6384
|
-
phase
|
|
6333
|
+
phase,
|
|
6334
|
+
fusedIntoTrackId
|
|
6385
6335
|
}
|
|
6386
6336
|
});
|
|
6387
6337
|
return;
|