@camstack/addon-agent-ui 1.2.156 → 1.2.157
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 +178 -46
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -7418,7 +7418,59 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
7418
7418
|
return DeviceRole;
|
|
7419
7419
|
}({});
|
|
7420
7420
|
//#endregion
|
|
7421
|
-
//#region ../types/dist/composition-
|
|
7421
|
+
//#region ../types/dist/composition-Dq42XWp0.mjs
|
|
7422
|
+
/**
|
|
7423
|
+
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
7424
|
+
*
|
|
7425
|
+
* ## Why a download, on every node, including the container
|
|
7426
|
+
*
|
|
7427
|
+
* The version of ffmpeg used to be CODE: baked into the image, changeable only
|
|
7428
|
+
* by rebuilding and rolling it. Now it is DATA — this file states the release,
|
|
7429
|
+
* and a node that boots with a different one downloads it. Changing ffmpeg is a
|
|
7430
|
+
* framework bump, not an image rebuild.
|
|
7431
|
+
*
|
|
7432
|
+
* It also settles the licence question by removing it. FFmpeg's licence is
|
|
7433
|
+
* chosen at compile time: the core is LGPL 2.1+, `--enable-gpl` makes it GPL
|
|
7434
|
+
* (for x264/x265), `--enable-version3` makes that v3, and `--enable-nonfree`
|
|
7435
|
+
* makes the result undistributable. These are GPL v3 builds, and we do not
|
|
7436
|
+
* distribute them: the user's own node fetches the archive from the project
|
|
7437
|
+
* that publishes it, so we convey no GPL work and inherit none of the
|
|
7438
|
+
* obligations that come with conveying one. That is the whole reason the image
|
|
7439
|
+
* no longer installs ffmpeg at all — not a technical preference.
|
|
7440
|
+
*
|
|
7441
|
+
* ## Why jellyfin-ffmpeg
|
|
7442
|
+
*
|
|
7443
|
+
* One vendor covering linux-amd64, linux-arm64, darwin-arm64 and darwin-x64
|
|
7444
|
+
* from one release, with the widest hardware surface of anything maintained:
|
|
7445
|
+
* VAAPI, QSV, NVENC/NVDEC, AMF, Vulkan, OpenCL and DRM on amd64, plus Rockchip
|
|
7446
|
+
* MPP on arm64. It reaches the vendor libraries through dlopen trampolines,
|
|
7447
|
+
* so the binary is not linked against a driver stack it may not find.
|
|
7448
|
+
*
|
|
7449
|
+
* **What it still needs from the host, measured 2026-09-19.** On the Unraid
|
|
7450
|
+
* HOST, which has no libva, `-vaapi_device` aborts the process outright —
|
|
7451
|
+
* `implib-gen: libva-drm.so.2: failed to load library ... Assertion '0 &&
|
|
7452
|
+
* "Assertion in generated code"' failed`. Inside our container, which installs
|
|
7453
|
+
* libva plus the iHD driver, the same command encodes: verified end to end with
|
|
7454
|
+
* `testsrc → format=nv12,hwupload → h264_vaapi`. So the image drops ffmpeg and
|
|
7455
|
+
* KEEPS the Intel media stack; the drivers are the part a binary cannot bring.
|
|
7456
|
+
*
|
|
7457
|
+
* ## Why each artifact carries a checksum and a claim
|
|
7458
|
+
*
|
|
7459
|
+
* The download is now the only source, so `sha256` is verified before anything
|
|
7460
|
+
* is extracted — jellyfin publishes no checksums on its release assets, so
|
|
7461
|
+
* these are ours, taken at the version bump. And `expectedHwaccels` is what the
|
|
7462
|
+
* build is supposed to be able to do: a binary that probes short of its own
|
|
7463
|
+
* claim is a source that changed under us, which is precisely what went
|
|
7464
|
+
* unnoticed for months when a static build turned out to carry no VAAPI at all
|
|
7465
|
+
* (D536).
|
|
7466
|
+
*/
|
|
7467
|
+
/** The pinned jellyfin-ffmpeg release. Changing this is the version change. */
|
|
7468
|
+
var FFMPEG_RELEASE = "8.1.2-5";
|
|
7469
|
+
var BASE = `https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v${FFMPEG_RELEASE}`;
|
|
7470
|
+
function portable(target) {
|
|
7471
|
+
return `${BASE}/jellyfin-ffmpeg_${FFMPEG_RELEASE}_portable_${target}-gpl.tar.xz`;
|
|
7472
|
+
}
|
|
7473
|
+
portable("linux64"), portable("linuxarm64"), portable("macarm64"), portable("mac64");
|
|
7422
7474
|
/**
|
|
7423
7475
|
* LA tabella "quale booleano di questo tipo di device conta come ALTO", e il
|
|
7424
7476
|
* valutatore puro del suo FRONTE.
|
|
@@ -12977,6 +13029,70 @@ var CompositionBlockStateSchema = object({
|
|
|
12977
13029
|
reason: string().optional(),
|
|
12978
13030
|
fields: array(CompositionFieldStateSchema)
|
|
12979
13031
|
});
|
|
13032
|
+
var NUMBER = {
|
|
13033
|
+
kind: "fixed",
|
|
13034
|
+
result: ["number"]
|
|
13035
|
+
};
|
|
13036
|
+
var BOOLEAN = {
|
|
13037
|
+
kind: "fixed",
|
|
13038
|
+
result: ["boolean"]
|
|
13039
|
+
};
|
|
13040
|
+
Object.freeze({
|
|
13041
|
+
min: NUMBER,
|
|
13042
|
+
max: NUMBER,
|
|
13043
|
+
abs: NUMBER,
|
|
13044
|
+
floor: NUMBER,
|
|
13045
|
+
ceil: NUMBER,
|
|
13046
|
+
sqrt: NUMBER,
|
|
13047
|
+
round: NUMBER,
|
|
13048
|
+
pow: NUMBER,
|
|
13049
|
+
clamp: NUMBER,
|
|
13050
|
+
avg: NUMBER,
|
|
13051
|
+
sum: NUMBER,
|
|
13052
|
+
age: NUMBER,
|
|
13053
|
+
convert: NUMBER,
|
|
13054
|
+
coalesce: { kind: "coalesce" },
|
|
13055
|
+
any: BOOLEAN,
|
|
13056
|
+
all: BOOLEAN,
|
|
13057
|
+
within: BOOLEAN,
|
|
13058
|
+
latest: {
|
|
13059
|
+
kind: "fixed",
|
|
13060
|
+
result: ["number", "null"]
|
|
13061
|
+
},
|
|
13062
|
+
number: {
|
|
13063
|
+
kind: "fixed",
|
|
13064
|
+
result: ["number", "null"]
|
|
13065
|
+
},
|
|
13066
|
+
rose: {
|
|
13067
|
+
kind: "fixed",
|
|
13068
|
+
result: ["number", "null"]
|
|
13069
|
+
},
|
|
13070
|
+
count: NUMBER
|
|
13071
|
+
});
|
|
13072
|
+
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
13073
|
+
/**
|
|
13074
|
+
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
13075
|
+
* device of that type, or an existing one that lacks them, can be given. The
|
|
13076
|
+
* blockers are the validator's own refusal codes, and a spec compares this
|
|
13077
|
+
* listing with `planComposition` for every capability — the editor can never
|
|
13078
|
+
* offer a feature the save would refuse for the same reason.
|
|
13079
|
+
*/
|
|
13080
|
+
var ComposableFieldSchema = object({
|
|
13081
|
+
path: string(),
|
|
13082
|
+
kind: CompositionFieldKindSchema,
|
|
13083
|
+
nullable: boolean(),
|
|
13084
|
+
required: boolean(),
|
|
13085
|
+
enumValues: array(string()).optional()
|
|
13086
|
+
});
|
|
13087
|
+
var ComposableCapabilitiesSchema = object({ caps: array(object({
|
|
13088
|
+
cap: string(),
|
|
13089
|
+
fields: array(ComposableFieldSchema),
|
|
13090
|
+
/** Present for an item-array cap (`consumables.items`). */
|
|
13091
|
+
itemArray: object({
|
|
13092
|
+
path: string(),
|
|
13093
|
+
keyField: string()
|
|
13094
|
+
}).optional()
|
|
13095
|
+
})) });
|
|
12980
13096
|
/** Where a block runs. The operator chooses — a block driving a device on an
|
|
12981
13097
|
* agent is the reason placement is not fixed to the hub. */
|
|
12982
13098
|
var CoreBlockPlacementSchema = union([literal("hub"), string().min(1)]);
|
|
@@ -13141,7 +13257,7 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
|
|
|
13141
13257
|
}), method(object({ blockId: string() }), CompositionGetReadSchema, { auth: "admin" }), method(object({}), CompositionListReadSchema, { auth: "admin" }), method(object({
|
|
13142
13258
|
addonId: string().min(1),
|
|
13143
13259
|
stableId: string().min(1)
|
|
13144
|
-
}), CompositionCustomizationReadSchema, { auth: "admin" }), method(object({
|
|
13260
|
+
}), CompositionCustomizationReadSchema, { auth: "admin" }), method(object({ deviceType: _enum(DeviceType) }), ComposableCapabilitiesSchema, { auth: "admin" }), method(object({
|
|
13145
13261
|
composition: CompositionSchema,
|
|
13146
13262
|
blockId: string().optional()
|
|
13147
13263
|
}), CompositionValidationSchema, {
|
|
@@ -20041,7 +20157,7 @@ function cameraSensorRefKey(ref) {
|
|
|
20041
20157
|
}
|
|
20042
20158
|
/** CS-1 accepts exactly one mode; CS-2 (D673) widens it to confirm / replace. */
|
|
20043
20159
|
var CameraSensorsModeSchema = _enum(["in-addition"]);
|
|
20044
|
-
object({
|
|
20160
|
+
var CameraSensorsConfigSchema = object({
|
|
20045
20161
|
mode: CameraSensorsModeSchema,
|
|
20046
20162
|
sensors: array(CameraSensorRefSchema).min(1).max(8)
|
|
20047
20163
|
}).superRefine((value, ctx) => {
|
|
@@ -21031,6 +21147,21 @@ var ObjectEventSchema = object({
|
|
|
21031
21147
|
keyFrameMediaId: number().int().optional(),
|
|
21032
21148
|
/** Populated by B5 (recording playback URL for this event). */
|
|
21033
21149
|
mediaUrl: string().optional(),
|
|
21150
|
+
/**
|
|
21151
|
+
* When the change this row records HAPPENED, epoch ms, when that is earlier
|
|
21152
|
+
* than {@link timestamp} and the producer could date it (D684).
|
|
21153
|
+
*
|
|
21154
|
+
* Set on a package PICK-UP row only: its `timestamp` is when the departure
|
|
21155
|
+
* was CONCLUDED — five minutes of unseen observed time after the parcel went
|
|
21156
|
+
* — and a notification's footage has to be cut around the pick-up, not the
|
|
21157
|
+
* empty doormat after it (D682). Stored so every path that rebuilds a
|
|
21158
|
+
* notification subject from the row (the boot reconcile, a dry-run) anchors
|
|
21159
|
+
* on the same instant the live hook did.
|
|
21160
|
+
*
|
|
21161
|
+
* `timestamp` keeps its meaning. Absent on every other row and on every
|
|
21162
|
+
* pick-up written before D684 — UNKNOWN, never 0 and never `timestamp`.
|
|
21163
|
+
*/
|
|
21164
|
+
observedAt: number().optional(),
|
|
21034
21165
|
/** The parent track's key-event importance [0,1], propagated to every object
|
|
21035
21166
|
* event of the track (so an event row can be sorted by importance without a
|
|
21036
21167
|
* track join). Absent on legacy rows / before the track was scored. */
|
|
@@ -24098,6 +24229,28 @@ var NodeInferenceDevicesSchema = object({
|
|
|
24098
24229
|
reachable: boolean(),
|
|
24099
24230
|
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
24100
24231
|
});
|
|
24232
|
+
/**
|
|
24233
|
+
* Pipeline Orchestrator capability — global load balancer + camera dispatcher.
|
|
24234
|
+
*
|
|
24235
|
+
* Lives on the hub. Tracks the camera-to-agent assignment map, listens to
|
|
24236
|
+
* device lifecycle events, queries each runner's capacity + hardware
|
|
24237
|
+
* profile, and dispatches `attachCamera` / `detachCamera` cap calls to the
|
|
24238
|
+
* appropriate runner instances. Persists assignments via the multi-level
|
|
24239
|
+
* settings store so they survive hub restarts.
|
|
24240
|
+
*
|
|
24241
|
+
* Strictly the control plane: never sees a frame, never calls inference,
|
|
24242
|
+
* never drains queues. The runner does that work locally on each agent.
|
|
24243
|
+
*/
|
|
24244
|
+
/**
|
|
24245
|
+
* The input of `setCameraSensors` (G5, D676): the ONE typed write path of a
|
|
24246
|
+
* camera's attached sensors (D672). `config: null` removes the attachment —
|
|
24247
|
+
* the camera reads `not-configured` again, never `unreadable`.
|
|
24248
|
+
*/
|
|
24249
|
+
var SetCameraSensorsInputSchema = object({
|
|
24250
|
+
deviceId: number().int().nonnegative(),
|
|
24251
|
+
/** `null` removes the attachment: the camera goes back to `not-configured`. */
|
|
24252
|
+
config: CameraSensorsConfigSchema.nullable()
|
|
24253
|
+
});
|
|
24101
24254
|
method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
|
|
24102
24255
|
kind: "mutation",
|
|
24103
24256
|
auth: "admin"
|
|
@@ -24252,7 +24405,10 @@ method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
|
|
|
24252
24405
|
}), CameraSwitchGroupSchema, {
|
|
24253
24406
|
kind: "mutation",
|
|
24254
24407
|
auth: "admin"
|
|
24255
|
-
}), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(
|
|
24408
|
+
}), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(SetCameraSensorsInputSchema, object({ success: literal(true) }), {
|
|
24409
|
+
kind: "mutation",
|
|
24410
|
+
auth: "admin"
|
|
24411
|
+
}), method(_void(), DiskReconcileJobSchema, {
|
|
24256
24412
|
kind: "mutation",
|
|
24257
24413
|
auth: "admin"
|
|
24258
24414
|
}), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
|
|
@@ -35153,47 +35309,6 @@ DeviceType.Camera, method(object({
|
|
|
35153
35309
|
detection: array(ZoneRuleSchema).readonly(),
|
|
35154
35310
|
package: array(ZoneRuleSchema).readonly()
|
|
35155
35311
|
});
|
|
35156
|
-
var NUMBER = {
|
|
35157
|
-
kind: "fixed",
|
|
35158
|
-
result: ["number"]
|
|
35159
|
-
};
|
|
35160
|
-
var BOOLEAN = {
|
|
35161
|
-
kind: "fixed",
|
|
35162
|
-
result: ["boolean"]
|
|
35163
|
-
};
|
|
35164
|
-
Object.freeze({
|
|
35165
|
-
min: NUMBER,
|
|
35166
|
-
max: NUMBER,
|
|
35167
|
-
abs: NUMBER,
|
|
35168
|
-
floor: NUMBER,
|
|
35169
|
-
ceil: NUMBER,
|
|
35170
|
-
sqrt: NUMBER,
|
|
35171
|
-
round: NUMBER,
|
|
35172
|
-
pow: NUMBER,
|
|
35173
|
-
clamp: NUMBER,
|
|
35174
|
-
avg: NUMBER,
|
|
35175
|
-
sum: NUMBER,
|
|
35176
|
-
age: NUMBER,
|
|
35177
|
-
convert: NUMBER,
|
|
35178
|
-
coalesce: { kind: "coalesce" },
|
|
35179
|
-
any: BOOLEAN,
|
|
35180
|
-
all: BOOLEAN,
|
|
35181
|
-
within: BOOLEAN,
|
|
35182
|
-
latest: {
|
|
35183
|
-
kind: "fixed",
|
|
35184
|
-
result: ["number", "null"]
|
|
35185
|
-
},
|
|
35186
|
-
number: {
|
|
35187
|
-
kind: "fixed",
|
|
35188
|
-
result: ["number", "null"]
|
|
35189
|
-
},
|
|
35190
|
-
rose: {
|
|
35191
|
-
kind: "fixed",
|
|
35192
|
-
result: ["number", "null"]
|
|
35193
|
-
},
|
|
35194
|
-
count: NUMBER
|
|
35195
|
-
});
|
|
35196
|
-
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
35197
35312
|
/**
|
|
35198
35313
|
* Accessory device helpers — shared across drivers.
|
|
35199
35314
|
*
|
|
@@ -37616,6 +37731,12 @@ Object.freeze({
|
|
|
37616
37731
|
addonId: null,
|
|
37617
37732
|
access: "view"
|
|
37618
37733
|
},
|
|
37734
|
+
"coreBlocks.listComposableCaps": {
|
|
37735
|
+
capName: "core-blocks",
|
|
37736
|
+
capScope: "system",
|
|
37737
|
+
addonId: null,
|
|
37738
|
+
access: "view"
|
|
37739
|
+
},
|
|
37619
37740
|
"coreBlocks.listCompositions": {
|
|
37620
37741
|
capName: "core-blocks",
|
|
37621
37742
|
capScope: "system",
|
|
@@ -41300,6 +41421,12 @@ Object.freeze({
|
|
|
41300
41421
|
addonId: null,
|
|
41301
41422
|
access: "create"
|
|
41302
41423
|
},
|
|
41424
|
+
"pipelineOrchestrator.setCameraSensors": {
|
|
41425
|
+
capName: "pipeline-orchestrator",
|
|
41426
|
+
capScope: "system",
|
|
41427
|
+
addonId: null,
|
|
41428
|
+
access: "create"
|
|
41429
|
+
},
|
|
41303
41430
|
"pipelineOrchestrator.setCameraStepOverride": {
|
|
41304
41431
|
capName: "pipeline-orchestrator",
|
|
41305
41432
|
capScope: "system",
|
|
@@ -45010,6 +45137,11 @@ Object.freeze({
|
|
|
45010
45137
|
form: "single",
|
|
45011
45138
|
optional: false
|
|
45012
45139
|
}],
|
|
45140
|
+
"pipelineOrchestrator.setCameraSensors": [{
|
|
45141
|
+
name: "deviceId",
|
|
45142
|
+
form: "single",
|
|
45143
|
+
optional: false
|
|
45144
|
+
}],
|
|
45013
45145
|
"pipelineOrchestrator.setCameraStepOverride": [{
|
|
45014
45146
|
name: "deviceId",
|
|
45015
45147
|
form: "single",
|
|
@@ -46666,7 +46798,7 @@ var AgentUIAddon = class extends BaseAddon {
|
|
|
46666
46798
|
capability: adminUiCapability,
|
|
46667
46799
|
provider: {
|
|
46668
46800
|
getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
|
|
46669
|
-
getVersion: async () => ({ version: "1.2.
|
|
46801
|
+
getVersion: async () => ({ version: "1.2.157" })
|
|
46670
46802
|
}
|
|
46671
46803
|
}];
|
|
46672
46804
|
}
|