@camstack/addon-training 0.1.79 → 0.1.80

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 (21) hide show
  1. package/dist/{MotionZonesSettings-CHoUtlZU.mjs → MotionZonesSettings-BliuxpCH.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-DfxPrf-U.mjs → PrivacyMaskSettings-CKL9xV-S.mjs} +2 -2
  3. package/dist/{SceneMonitorEditor-B32hWMGP.mjs → SceneMonitorEditor-BE7rVggL.mjs} +1 -1
  4. package/dist/_stub.js +5248 -5127
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-GwANcGcn.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-DyaQwk4k.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DKoALssM.mjs +26 -0
  7. package/dist/addon-training.css +1 -1
  8. package/dist/{dist-we-Yi15l.mjs → dist-BCUHufOe.mjs} +490 -71
  9. package/dist/{dist-DuaaneP-.js → dist-FpC7GFu_.js} +490 -71
  10. package/dist/{hostInit-OSodFHgq.mjs → hostInit-DxnxYPQ_.mjs} +2 -2
  11. package/dist/index.js +1 -1
  12. package/dist/orchestrator/training.addon.js +1 -1
  13. package/dist/orchestrator/training.addon.mjs +1 -1
  14. package/dist/{player-overlays-CN0bZ_0v.mjs → player-overlays-1cASdLh_.mjs} +1 -1
  15. package/dist/providers/modal/training-modal.addon.js +1 -1
  16. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  17. package/dist/remoteEntry.js +1 -1
  18. package/dist/{responsive-wQi9hajb.mjs → responsive-Ctl0WYwk.mjs} +1 -1
  19. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-CbTZ0yvt.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-C_798y4H.mjs} +1 -1
  20. package/package.json +1 -1
  21. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-ff_0UQsH.mjs +0 -26
@@ -16244,6 +16244,13 @@ var ComposerUnreadableBlockSchema = object({
16244
16244
  /** The parse error, in the operator's words. */
16245
16245
  error: string()
16246
16246
  });
16247
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
16248
+ var UnreleasedClaimSchema = object({
16249
+ deviceId: number().int(),
16250
+ capName: string(),
16251
+ owner: string(),
16252
+ error: string()
16253
+ });
16247
16254
  method(object({
16248
16255
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16249
16256
  integrationId: string().nullable(),
@@ -16253,7 +16260,13 @@ method(object({
16253
16260
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16254
16261
  restartBlockIds: array(string()),
16255
16262
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16256
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
16263
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
16264
+ /**
16265
+ * Operator-confirmed deletions. Their claims are released on this apply,
16266
+ * before any replacement block claims. A block that merely vanished from the
16267
+ * snapshot is not listed here and still waits for two applies (D49).
16268
+ */
16269
+ retiredBlockIds: array(string()).optional()
16257
16270
  }), object({
16258
16271
  blocks: array(object({
16259
16272
  blockId: string(),
@@ -16265,7 +16278,13 @@ method(object({
16265
16278
  * integration unknown, its own rows unread or read empty once). An empty
16266
16279
  * apply the caller owes is paid off only by one the composer acted on (D49).
16267
16280
  */
16268
- acted: boolean()
16281
+ acted: boolean(),
16282
+ /**
16283
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
16284
+ * every one landed (or there was nothing to hand back). Absent on a result
16285
+ * that never got that far.
16286
+ */
16287
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16269
16288
  }), {
16270
16289
  kind: "mutation",
16271
16290
  auth: "admin"
@@ -42128,6 +42147,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42128
42147
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42129
42148
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42130
42149
  /**
42150
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
42151
+ * not entries. `heatmapScrub` is a mark, not an event kind.
42152
+ */
42153
+ var PALETTE_ENTRY_IDS = [
42154
+ "motion",
42155
+ "audio",
42156
+ "recording",
42157
+ "live",
42158
+ "heatmapScrub",
42159
+ "person",
42160
+ "vehicle",
42161
+ "animal",
42162
+ "package",
42163
+ "sensor",
42164
+ "control",
42165
+ "face",
42166
+ "plate",
42167
+ "car",
42168
+ "truck",
42169
+ "bus",
42170
+ "motorcycle",
42171
+ "bicycle",
42172
+ "airplane",
42173
+ "boat",
42174
+ "train",
42175
+ "bird",
42176
+ "dog",
42177
+ "cat",
42178
+ "horse",
42179
+ "sheep",
42180
+ "cow",
42181
+ "elephant",
42182
+ "bear",
42183
+ "zebra",
42184
+ "giraffe",
42185
+ "package-delivered",
42186
+ "package-picked-up",
42187
+ "suitcase",
42188
+ "backpack",
42189
+ "handbag",
42190
+ "contact",
42191
+ "motion-sensor",
42192
+ "smoke",
42193
+ "flood",
42194
+ "gas",
42195
+ "carbon-monoxide",
42196
+ "vibration",
42197
+ "tamper",
42198
+ "presence",
42199
+ "enum-sensor",
42200
+ "device-event",
42201
+ "lock",
42202
+ "cover",
42203
+ "switch",
42204
+ "siren",
42205
+ "button",
42206
+ "doorbell"
42207
+ ];
42208
+ var AUDIO_ENTRY_ID = "audio";
42209
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
42210
+ var AUDIO_GRADIENT_ALPHAS = [
42211
+ .3,
42212
+ .42,
42213
+ .55,
42214
+ .7,
42215
+ .85,
42216
+ 1
42217
+ ];
42218
+ var PALETTE_PRESET_IDS = [
42219
+ "camstack",
42220
+ "high-contrast",
42221
+ "okabe-ito"
42222
+ ];
42223
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
42224
+ var CAMSTACK_HEX = {
42225
+ motion: "#d946ef",
42226
+ audio: "#059eb8",
42227
+ recording: "#ef4444",
42228
+ live: "#8d7a00",
42229
+ heatmapScrub: "#4b32ff",
42230
+ person: "#11a64c",
42231
+ vehicle: "#3b82f6",
42232
+ animal: "#ea6a09",
42233
+ package: "#924667",
42234
+ sensor: "#624bbc",
42235
+ control: "#944d24",
42236
+ face: "#ed4f8d",
42237
+ plate: "#4b7027",
42238
+ car: "#9684cf",
42239
+ truck: "#0f9b89",
42240
+ bus: "#a734a9",
42241
+ motorcycle: "#c1133a",
42242
+ bicycle: "#0e6a9b",
42243
+ airplane: "#7c9928",
42244
+ boat: "#b17933",
42245
+ train: "#ad6ca3",
42246
+ bird: "#0f7c55",
42247
+ dog: "#c82700",
42248
+ cat: "#7268f2",
42249
+ horse: "#cb795e",
42250
+ sheep: "#b8636b",
42251
+ cow: "#cb2969",
42252
+ elephant: "#1158d2",
42253
+ bear: "#8d5e00",
42254
+ zebra: "#0097d6",
42255
+ giraffe: "#8f61bb",
42256
+ "package-delivered": "#cd3f9b",
42257
+ "package-picked-up": "#388a08",
42258
+ suitcase: "#666800",
42259
+ backpack: "#ec5022",
42260
+ handbag: "#a76ef8",
42261
+ contact: "#ab5a49",
42262
+ "motion-sensor": "#b95d1a",
42263
+ smoke: "#dd3858",
42264
+ flood: "#b31e7d",
42265
+ gas: "#5b70b5",
42266
+ "carbon-monoxide": "#7b4e8e",
42267
+ vibration: "#e65bba",
42268
+ tamper: "#98464b",
42269
+ presence: "#3a9468",
42270
+ "enum-sensor": "#7885f8",
42271
+ "device-event": "#8c43c8",
42272
+ lock: "#649653",
42273
+ cover: "#c67597",
42274
+ switch: "#7a812a",
42275
+ siren: "#ac5d7f",
42276
+ button: "#b276cd",
42277
+ doorbell: "#0087ab"
42278
+ };
42279
+ var CAMSTACK_FALLBACK = [
42280
+ "#b34dc7",
42281
+ "#1d7d34",
42282
+ "#db6b6c",
42283
+ "#a43d29",
42284
+ "#0e6ee6",
42285
+ "#29a10b",
42286
+ "#a98731",
42287
+ "#0181c6"
42288
+ ];
42289
+ var HIGH_CONTRAST_HEX = {
42290
+ motion: "#964360",
42291
+ audio: "#23a132",
42292
+ recording: "#2494ca",
42293
+ live: "#bd7e2b",
42294
+ heatmapScrub: "#ad6eea",
42295
+ person: "#62611e",
42296
+ vehicle: "#f4534c",
42297
+ animal: "#1556cd",
42298
+ package: "#9c4415",
42299
+ sensor: "#066c48",
42300
+ control: "#f2479f",
42301
+ face: "#139d8a",
42302
+ plate: "#909024",
42303
+ car: "#8e35ab",
42304
+ truck: "#bd0b2b",
42305
+ bus: "#7a88ca",
42306
+ motorcycle: "#e26725",
42307
+ bicycle: "#a6679b",
42308
+ airplane: "#7c5720",
42309
+ boat: "#467a1b",
42310
+ train: "#6f65a4",
42311
+ bird: "#cb717f",
42312
+ dog: "#c62490",
42313
+ cat: "#b36850",
42314
+ horse: "#1872ac",
42315
+ sheep: "#927939",
42316
+ cow: "#428a5c",
42317
+ elephant: "#d41160",
42318
+ bear: "#799453",
42319
+ zebra: "#a85455",
42320
+ giraffe: "#746be8",
42321
+ "package-delivered": "#824a80",
42322
+ "package-picked-up": "#614ac1",
42323
+ suitcase: "#2f77f3",
42324
+ backpack: "#fa476d",
42325
+ handbag: "#c14cbe",
42326
+ contact: "#c83921",
42327
+ "motion-sensor": "#a07ebd",
42328
+ smoke: "#a25b13",
42329
+ flood: "#526bab",
42330
+ gas: "#924938",
42331
+ "carbon-monoxide": "#bb7e53",
42332
+ vibration: "#b66182",
42333
+ tamper: "#3c6931",
42334
+ presence: "#6c851d",
42335
+ "enum-sensor": "#ad2d48",
42336
+ "device-event": "#5e9b04",
42337
+ lock: "#00a062",
42338
+ cover: "#ad8624",
42339
+ switch: "#d05259",
42340
+ siren: "#cd67b3",
42341
+ button: "#c9746a",
42342
+ doorbell: "#338eeb"
42343
+ };
42344
+ var HIGH_CONTRAST_FALLBACK = [
42345
+ "#817f3b",
42346
+ "#a0733e",
42347
+ "#8658b2",
42348
+ "#956301",
42349
+ "#bc652d",
42350
+ "#647331",
42351
+ "#a14c9e",
42352
+ "#d14e71"
42353
+ ];
42354
+ var OKABE_ITO_HEX = {
42355
+ motion: "#b88128",
42356
+ audio: "#1096c8",
42357
+ recording: "#009e73",
42358
+ live: "#9c8c22",
42359
+ heatmapScrub: "#0072b2",
42360
+ person: "#d55e00",
42361
+ vehicle: "#c0739f",
42362
+ animal: "#226d18",
42363
+ package: "#91446c",
42364
+ sensor: "#217b56",
42365
+ control: "#648647",
42366
+ face: "#c22998",
42367
+ plate: "#fa4575",
42368
+ car: "#956301",
42369
+ truck: "#2f77f3",
42370
+ bus: "#7a4e86",
42371
+ motorcycle: "#f54597",
42372
+ bicycle: "#bb3e75",
42373
+ airplane: "#e054c0",
42374
+ boat: "#457942",
42375
+ train: "#867afa",
42376
+ bird: "#88914c",
42377
+ dog: "#1556cd",
42378
+ cat: "#71702c",
42379
+ horse: "#9b4fa4",
42380
+ sheep: "#c0559d",
42381
+ cow: "#d14f65",
42382
+ elephant: "#98470f",
42383
+ bear: "#595896",
42384
+ zebra: "#96790e",
42385
+ giraffe: "#cb717b",
42386
+ "package-delivered": "#139d8a",
42387
+ "package-picked-up": "#906ead",
42388
+ suitcase: "#d02939",
42389
+ backpack: "#d41160",
42390
+ handbag: "#f64f54",
42391
+ contact: "#7258d2",
42392
+ "motion-sensor": "#b66182",
42393
+ smoke: "#627abb",
42394
+ flood: "#b86ae4",
42395
+ gas: "#a95261",
42396
+ "carbon-monoxide": "#c65d3c",
42397
+ vibration: "#7a40b7",
42398
+ tamper: "#914b34",
42399
+ presence: "#9481c3",
42400
+ "enum-sensor": "#ac6d47",
42401
+ "device-event": "#7b6fce",
42402
+ lock: "#c67662",
42403
+ cover: "#a6564d",
42404
+ switch: "#ad2c4e",
42405
+ siren: "#348e08",
42406
+ button: "#d27303",
42407
+ doorbell: "#55770f"
42408
+ };
42409
+ var OKABE_ITO_FALLBACK = [
42410
+ "#9a3784",
42411
+ "#a7392c",
42412
+ "#409d50",
42413
+ "#6987e7",
42414
+ "#ee5b3d",
42415
+ "#c0430d",
42416
+ "#af79b3",
42417
+ "#4b6628"
42418
+ ];
42419
+ /**
42420
+ * The display palette (D939). One table of colours, three presets, one
42421
+ * validator. Taxonomy colours and every consumer read this — there is no
42422
+ * second hex table.
42423
+ */
42424
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
42425
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
42426
+ form: literal("solid"),
42427
+ hex: paletteHexSchema
42428
+ }), object({
42429
+ form: literal("gradient"),
42430
+ hex: paletteHexSchema,
42431
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
42432
+ })]);
42433
+ var paletteReadySchema = object({
42434
+ status: literal("ready"),
42435
+ presetId: _enum(PALETTE_PRESET_IDS),
42436
+ customized: boolean(),
42437
+ source: _enum(["stored", "unconfigured"]),
42438
+ swatches: record(string(), paletteSwatchSchema),
42439
+ fallbacks: array(paletteHexSchema).length(8)
42440
+ });
42441
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
42442
+ status: literal("unknown"),
42443
+ reason: string()
42444
+ })]);
42445
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
42446
+ presetId: string(),
42447
+ overrides: record(string(), paletteSwatchSchema)
42448
+ })]);
42449
+ object({
42450
+ presetId: string(),
42451
+ overrides: record(string(), paletteSwatchSchema)
42452
+ });
42453
+ function solid(hex) {
42454
+ return {
42455
+ form: "solid",
42456
+ hex
42457
+ };
42458
+ }
42459
+ function audioGradient(hex) {
42460
+ return {
42461
+ form: "gradient",
42462
+ hex,
42463
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
42464
+ };
42465
+ }
42466
+ function swatchesFrom(hexes) {
42467
+ const out = {};
42468
+ for (const id of PALETTE_ENTRY_IDS) {
42469
+ const hex = hexes[id];
42470
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
42471
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
42472
+ }
42473
+ return out;
42474
+ }
42475
+ function preset(id, name, hexes, fallbacks) {
42476
+ return {
42477
+ id,
42478
+ name,
42479
+ swatches: swatchesFrom(hexes),
42480
+ fallbacks
42481
+ };
42482
+ }
42483
+ var DISPLAY_PRESETS = [
42484
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
42485
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
42486
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
42487
+ ];
42488
+ function presetById(id) {
42489
+ return DISPLAY_PRESETS.find((item) => item.id === id);
42490
+ }
42491
+ function bundledCamstack() {
42492
+ const presetRow = presetById("camstack");
42493
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
42494
+ return readyOf(presetRow, "unconfigured", false);
42495
+ }
42496
+ function readyOf(row, source, customized) {
42497
+ return {
42498
+ status: "ready",
42499
+ presetId: row.id,
42500
+ customized,
42501
+ source,
42502
+ swatches: row.swatches,
42503
+ fallbacks: [...row.fallbacks]
42504
+ };
42505
+ }
42506
+ function hashFallback(kind, fallbacks) {
42507
+ let hash = 0;
42508
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
42509
+ const hex = fallbacks[hash % fallbacks.length];
42510
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42511
+ return hex;
42512
+ }
42513
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
42514
+ function paintHex(swatches, fallbacks, kind) {
42515
+ const key = kind.trim().toLowerCase();
42516
+ if (key.startsWith("audio-")) {
42517
+ const audio = swatches[AUDIO_ENTRY_ID];
42518
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
42519
+ }
42520
+ const direct = swatches[key];
42521
+ if (direct !== void 0) return direct.hex;
42522
+ return hashFallback(key, fallbacks);
42523
+ }
42524
+ /**
42131
42525
  * Unified event-kind taxonomy — THE single source of truth for
42132
42526
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42133
42527
  * icon }`.
@@ -42141,109 +42535,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42141
42535
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42142
42536
  * - the COCO / audio class maps (macro ↔ sub relationships)
42143
42537
  *
42144
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42145
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42146
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42147
- * color or an icon: they read this dictionary (server descriptors carry the
42148
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
42538
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
42539
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
42540
+ * the bundled CamStack display palette (D939). The effective cluster palette
42541
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
42542
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42149
42543
  *
42150
42544
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42151
42545
  */
42152
- var TAXONOMY_COLORS = {
42153
- motion: "#f59e0b",
42154
- audio: "#06b6d4",
42155
- person: "#22c55e",
42156
- vehicle: "#3b82f6",
42157
- animal: "#f97316",
42158
- package: "#a855f7",
42159
- sensor: "#8b5cf6",
42160
- control: "#10b981",
42161
- genericDetection: "#64748b"
42162
- };
42163
- var DETECTION_SUB_COLORS = {
42164
- car: "#f59e0b",
42165
- truck: "#d97706",
42166
- bus: "#b45309",
42167
- motorcycle: "#eab308",
42168
- bicycle: "#ca8a04",
42169
- airplane: "#60a5fa",
42170
- boat: "#2563eb",
42171
- train: "#1d4ed8",
42172
- bird: "#14b8a6",
42173
- dog: "#84cc16",
42174
- cat: "#f97316",
42175
- horse: "#a16207",
42176
- sheep: "#a3a3a3",
42177
- cow: "#78716c",
42178
- elephant: "#6b7280",
42179
- bear: "#7c2d12",
42180
- zebra: "#404040",
42181
- giraffe: "#d4a373"
42182
- };
42546
+ var BUNDLED_PALETTE = bundledCamstack();
42547
+ function kindColor(kind) {
42548
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
42549
+ }
42550
+ function firstFallback(fallbacks) {
42551
+ const hex = fallbacks[0];
42552
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42553
+ return hex;
42554
+ }
42555
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42183
42556
  function titleCase(id) {
42184
42557
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42185
42558
  }
42186
42559
  var entries = /* @__PURE__ */ new Map();
42187
- function macro(kind, category, color, iconId, label) {
42560
+ function macro(kind, category, iconId, label) {
42188
42561
  entries.set(kind, {
42189
42562
  kind,
42190
42563
  parentKind: null,
42191
42564
  level: "macro",
42192
42565
  category,
42193
- color,
42566
+ color: kindColor(kind),
42194
42567
  iconId,
42195
42568
  labelKey: `eventKind.${kind}`,
42196
42569
  label
42197
42570
  });
42198
42571
  }
42199
- function sub(kind, parentKind, category, color, iconId, label) {
42572
+ function sub(kind, parentKind, category, iconId, label) {
42200
42573
  entries.set(kind, {
42201
42574
  kind,
42202
42575
  parentKind,
42203
42576
  level: "sub",
42204
42577
  category,
42205
- color,
42578
+ color: kindColor(kind),
42206
42579
  iconId,
42207
42580
  labelKey: `eventKind.${kind}`,
42208
42581
  label
42209
42582
  });
42210
42583
  }
42211
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42212
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42213
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42214
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42215
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42216
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42217
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42218
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
42584
+ macro("motion", "motion", "motion", "Motion");
42585
+ macro("audio", "audio", "audio", "Audio");
42586
+ macro("person", "detection", "person", "Person");
42587
+ macro("vehicle", "detection", "vehicle", "Vehicle");
42588
+ macro("animal", "detection", "animal", "Animal");
42589
+ macro("package", "package", "package", "Package");
42590
+ macro("sensor", "sensor", "sensor", "Sensor");
42591
+ macro("control", "control", "control", "Control");
42219
42592
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42220
42593
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42221
42594
  if (entries.has(cocoClass)) continue;
42222
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
42595
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
42223
42596
  }
42224
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42225
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42226
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42227
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42228
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42229
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42230
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42231
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42232
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42233
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42234
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42235
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42236
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42237
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42238
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42239
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42240
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42241
- sub("button", "control", "control", "#10b981", "button", "Button");
42242
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
42597
+ sub("package-delivered", "package", "package", "package", "Package delivered");
42598
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
42599
+ sub("contact", "sensor", "sensor", "door", "Contact");
42600
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
42601
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
42602
+ sub("flood", "sensor", "sensor", "water", "Water leak");
42603
+ sub("gas", "sensor", "sensor", "gas", "Gas");
42604
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
42605
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
42606
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
42607
+ sub("presence", "sensor", "sensor", "presence", "Presence");
42608
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
42609
+ sub("device-event", "sensor", "sensor", "button", "Device event");
42610
+ sub("lock", "control", "control", "lock", "Lock");
42611
+ sub("cover", "control", "control", "door", "Cover");
42612
+ sub("switch", "control", "control", "switch", "Switch");
42613
+ sub("siren", "control", "control", "siren", "Siren");
42614
+ sub("button", "control", "control", "button", "Button");
42615
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42243
42616
  for (const l of AUDIO_MACRO_LABELS) {
42244
42617
  const kind = `audio-${l.id}`;
42245
42618
  if (entries.has(kind)) continue;
42246
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
42619
+ sub(kind, "audio", "audio", kind, l.name);
42247
42620
  }
42248
42621
  /** The complete taxonomy dictionary, keyed by kind. */
42249
42622
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -54953,6 +55326,30 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
54953
55326
  auth: "admin"
54954
55327
  });
54955
55328
  /**
55329
+ * display-palette — the cluster's one colour table (D939).
55330
+ *
55331
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
55332
+ * cannot be read; it does not pretend the bundled preset was stored.
55333
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
55334
+ * the pairs.
55335
+ */
55336
+ var presetSummarySchema = object({
55337
+ id: string(),
55338
+ name: string(),
55339
+ swatches: record(string(), paletteSwatchSchema),
55340
+ fallbacks: array(string())
55341
+ });
55342
+ method(_void(), paletteResultSchema, {
55343
+ auth: "protected",
55344
+ role: "viewer"
55345
+ }), method(_void(), array(presetSummarySchema).readonly(), {
55346
+ auth: "protected",
55347
+ role: "viewer"
55348
+ }), method(setPaletteInputSchema, paletteReadySchema, {
55349
+ kind: "mutation",
55350
+ auth: "admin"
55351
+ });
55352
+ /**
54956
55353
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
54957
55354
  * for every device, regardless of provider — the kernel needs a uniform
54958
55355
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -65953,6 +66350,27 @@ Object.freeze({
65953
66350
  access: "create",
65954
66351
  role: "viewer"
65955
66352
  },
66353
+ "displayPalette.getPalette": {
66354
+ capName: "display-palette",
66355
+ capScope: "system",
66356
+ addonId: null,
66357
+ access: "view",
66358
+ role: "viewer"
66359
+ },
66360
+ "displayPalette.listPresets": {
66361
+ capName: "display-palette",
66362
+ capScope: "system",
66363
+ addonId: null,
66364
+ access: "view",
66365
+ role: "viewer"
66366
+ },
66367
+ "displayPalette.setPalette": {
66368
+ capName: "display-palette",
66369
+ capScope: "system",
66370
+ addonId: null,
66371
+ access: "create",
66372
+ role: "admin"
66373
+ },
65956
66374
  "doorbell.getStatus": {
65957
66375
  capName: "doorbell",
65958
66376
  capScope: "device",
@@ -76409,6 +76827,7 @@ var SYSTEM_CAP_VOCABULARY = {
76409
76827
  "device-provider": system(INTERNAL),
76410
76828
  "device-removal-hook": system(INTERNAL),
76411
76829
  "device-state": system("the runtime-state mirror every trigger already reads through"),
76830
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
76412
76831
  "embedding-encoder": system(ML),
76413
76832
  "face-gallery": system("the face gallery — curated on its own page"),
76414
76833
  "failure-contribution": system(INTERNAL),