@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.
Files changed (2) hide show
  1. package/dist/addon.js +178 -46
  2. 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-BK-GTFYb.mjs
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(_void(), DiskReconcileJobSchema, {
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.156" })
46801
+ getVersion: async () => ({ version: "1.2.157" })
46670
46802
  }
46671
46803
  }];
46672
46804
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-agent-ui",
3
- "version": "1.2.156",
3
+ "version": "1.2.157",
4
4
  "description": "Agent UI — lightweight status dashboard served by every agent node",
5
5
  "keywords": [
6
6
  "camstack",