@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.
@@ -5369,7 +5369,7 @@ var ZodIssueCode = {
5369
5369
  var ZodFirstPartyTypeKind;
5370
5370
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5371
5371
  //#endregion
5372
- //#region ../types/dist/sleep-C-v96WpE.mjs
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-BK-GTFYb.mjs
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
- /** Quantifier over `ids` — at least one / every one visited. */
19012
- match: _enum(["any", "all"]).default("any")
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
- method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
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(_void(), DiskReconcileJobSchema, {
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-nvulD3Mi.js");
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;