@camstack/addon-model-studio 1.1.292 → 1.1.293

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 (19) hide show
  1. package/dist/{MotionZonesSettings-BcdUnoUf.mjs → MotionZonesSettings-DrHyXG0G.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-B8Fva5aA.mjs → PrivacyMaskSettings-CuqGSOYk.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-gGXbk_xd.mjs → SceneMonitorEditor-_wt-7NOB.mjs} +3 -3
  4. package/dist/_stub.js +4256 -4135
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BQtGyoxs.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-D1kg1qk9.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPZnyWUq.mjs +26 -0
  7. package/dist/addon-model-studio.css +1 -1
  8. package/dist/{hostInit-E9SMnTP0.mjs → hostInit-CqUjCpJe.mjs} +2 -2
  9. package/dist/model-studio.addon.js +490 -71
  10. package/dist/model-studio.addon.mjs +490 -71
  11. package/dist/{player-overlays-CMJi9ZqH.mjs → player-overlays-IswZiT1v.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-BsA5VAZE.mjs → responsive-BRDOoNTu.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-CoIP1A-9.mjs → scene-monitor-copy-BLrlOdpo.mjs} +1 -1
  15. package/dist/{square-DtlTO5Fw.mjs → square-CqxajgGh.mjs} +1 -1
  16. package/dist/{trash-2-CYc9z9Tz.mjs → trash-2-B67pP3l-.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-D-DKvrkx.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DeT4IssS.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BsM_g96G.mjs +0 -26
@@ -16434,6 +16434,13 @@ var ComposerUnreadableBlockSchema = object({
16434
16434
  /** The parse error, in the operator's words. */
16435
16435
  error: string()
16436
16436
  });
16437
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
16438
+ var UnreleasedClaimSchema = object({
16439
+ deviceId: number().int(),
16440
+ capName: string(),
16441
+ owner: string(),
16442
+ error: string()
16443
+ });
16437
16444
  method(object({
16438
16445
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
16439
16446
  integrationId: string().nullable(),
@@ -16443,7 +16450,13 @@ method(object({
16443
16450
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
16444
16451
  restartBlockIds: array(string()),
16445
16452
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
16446
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
16453
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
16454
+ /**
16455
+ * Operator-confirmed deletions. Their claims are released on this apply,
16456
+ * before any replacement block claims. A block that merely vanished from the
16457
+ * snapshot is not listed here and still waits for two applies (D49).
16458
+ */
16459
+ retiredBlockIds: array(string()).optional()
16447
16460
  }), object({
16448
16461
  blocks: array(object({
16449
16462
  blockId: string(),
@@ -16455,7 +16468,13 @@ method(object({
16455
16468
  * integration unknown, its own rows unread or read empty once). An empty
16456
16469
  * apply the caller owes is paid off only by one the composer acted on (D49).
16457
16470
  */
16458
- acted: boolean()
16471
+ acted: boolean(),
16472
+ /**
16473
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
16474
+ * every one landed (or there was nothing to hand back). Absent on a result
16475
+ * that never got that far.
16476
+ */
16477
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
16459
16478
  }), {
16460
16479
  kind: "mutation",
16461
16480
  auth: "admin"
@@ -42352,6 +42371,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
42352
42371
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42353
42372
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
42354
42373
  /**
42374
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
42375
+ * not entries. `heatmapScrub` is a mark, not an event kind.
42376
+ */
42377
+ var PALETTE_ENTRY_IDS = [
42378
+ "motion",
42379
+ "audio",
42380
+ "recording",
42381
+ "live",
42382
+ "heatmapScrub",
42383
+ "person",
42384
+ "vehicle",
42385
+ "animal",
42386
+ "package",
42387
+ "sensor",
42388
+ "control",
42389
+ "face",
42390
+ "plate",
42391
+ "car",
42392
+ "truck",
42393
+ "bus",
42394
+ "motorcycle",
42395
+ "bicycle",
42396
+ "airplane",
42397
+ "boat",
42398
+ "train",
42399
+ "bird",
42400
+ "dog",
42401
+ "cat",
42402
+ "horse",
42403
+ "sheep",
42404
+ "cow",
42405
+ "elephant",
42406
+ "bear",
42407
+ "zebra",
42408
+ "giraffe",
42409
+ "package-delivered",
42410
+ "package-picked-up",
42411
+ "suitcase",
42412
+ "backpack",
42413
+ "handbag",
42414
+ "contact",
42415
+ "motion-sensor",
42416
+ "smoke",
42417
+ "flood",
42418
+ "gas",
42419
+ "carbon-monoxide",
42420
+ "vibration",
42421
+ "tamper",
42422
+ "presence",
42423
+ "enum-sensor",
42424
+ "device-event",
42425
+ "lock",
42426
+ "cover",
42427
+ "switch",
42428
+ "siren",
42429
+ "button",
42430
+ "doorbell"
42431
+ ];
42432
+ var AUDIO_ENTRY_ID = "audio";
42433
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
42434
+ var AUDIO_GRADIENT_ALPHAS = [
42435
+ .3,
42436
+ .42,
42437
+ .55,
42438
+ .7,
42439
+ .85,
42440
+ 1
42441
+ ];
42442
+ var PALETTE_PRESET_IDS = [
42443
+ "camstack",
42444
+ "high-contrast",
42445
+ "okabe-ito"
42446
+ ];
42447
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
42448
+ var CAMSTACK_HEX = {
42449
+ motion: "#d946ef",
42450
+ audio: "#059eb8",
42451
+ recording: "#ef4444",
42452
+ live: "#8d7a00",
42453
+ heatmapScrub: "#4b32ff",
42454
+ person: "#11a64c",
42455
+ vehicle: "#3b82f6",
42456
+ animal: "#ea6a09",
42457
+ package: "#924667",
42458
+ sensor: "#624bbc",
42459
+ control: "#944d24",
42460
+ face: "#ed4f8d",
42461
+ plate: "#4b7027",
42462
+ car: "#9684cf",
42463
+ truck: "#0f9b89",
42464
+ bus: "#a734a9",
42465
+ motorcycle: "#c1133a",
42466
+ bicycle: "#0e6a9b",
42467
+ airplane: "#7c9928",
42468
+ boat: "#b17933",
42469
+ train: "#ad6ca3",
42470
+ bird: "#0f7c55",
42471
+ dog: "#c82700",
42472
+ cat: "#7268f2",
42473
+ horse: "#cb795e",
42474
+ sheep: "#b8636b",
42475
+ cow: "#cb2969",
42476
+ elephant: "#1158d2",
42477
+ bear: "#8d5e00",
42478
+ zebra: "#0097d6",
42479
+ giraffe: "#8f61bb",
42480
+ "package-delivered": "#cd3f9b",
42481
+ "package-picked-up": "#388a08",
42482
+ suitcase: "#666800",
42483
+ backpack: "#ec5022",
42484
+ handbag: "#a76ef8",
42485
+ contact: "#ab5a49",
42486
+ "motion-sensor": "#b95d1a",
42487
+ smoke: "#dd3858",
42488
+ flood: "#b31e7d",
42489
+ gas: "#5b70b5",
42490
+ "carbon-monoxide": "#7b4e8e",
42491
+ vibration: "#e65bba",
42492
+ tamper: "#98464b",
42493
+ presence: "#3a9468",
42494
+ "enum-sensor": "#7885f8",
42495
+ "device-event": "#8c43c8",
42496
+ lock: "#649653",
42497
+ cover: "#c67597",
42498
+ switch: "#7a812a",
42499
+ siren: "#ac5d7f",
42500
+ button: "#b276cd",
42501
+ doorbell: "#0087ab"
42502
+ };
42503
+ var CAMSTACK_FALLBACK = [
42504
+ "#b34dc7",
42505
+ "#1d7d34",
42506
+ "#db6b6c",
42507
+ "#a43d29",
42508
+ "#0e6ee6",
42509
+ "#29a10b",
42510
+ "#a98731",
42511
+ "#0181c6"
42512
+ ];
42513
+ var HIGH_CONTRAST_HEX = {
42514
+ motion: "#964360",
42515
+ audio: "#23a132",
42516
+ recording: "#2494ca",
42517
+ live: "#bd7e2b",
42518
+ heatmapScrub: "#ad6eea",
42519
+ person: "#62611e",
42520
+ vehicle: "#f4534c",
42521
+ animal: "#1556cd",
42522
+ package: "#9c4415",
42523
+ sensor: "#066c48",
42524
+ control: "#f2479f",
42525
+ face: "#139d8a",
42526
+ plate: "#909024",
42527
+ car: "#8e35ab",
42528
+ truck: "#bd0b2b",
42529
+ bus: "#7a88ca",
42530
+ motorcycle: "#e26725",
42531
+ bicycle: "#a6679b",
42532
+ airplane: "#7c5720",
42533
+ boat: "#467a1b",
42534
+ train: "#6f65a4",
42535
+ bird: "#cb717f",
42536
+ dog: "#c62490",
42537
+ cat: "#b36850",
42538
+ horse: "#1872ac",
42539
+ sheep: "#927939",
42540
+ cow: "#428a5c",
42541
+ elephant: "#d41160",
42542
+ bear: "#799453",
42543
+ zebra: "#a85455",
42544
+ giraffe: "#746be8",
42545
+ "package-delivered": "#824a80",
42546
+ "package-picked-up": "#614ac1",
42547
+ suitcase: "#2f77f3",
42548
+ backpack: "#fa476d",
42549
+ handbag: "#c14cbe",
42550
+ contact: "#c83921",
42551
+ "motion-sensor": "#a07ebd",
42552
+ smoke: "#a25b13",
42553
+ flood: "#526bab",
42554
+ gas: "#924938",
42555
+ "carbon-monoxide": "#bb7e53",
42556
+ vibration: "#b66182",
42557
+ tamper: "#3c6931",
42558
+ presence: "#6c851d",
42559
+ "enum-sensor": "#ad2d48",
42560
+ "device-event": "#5e9b04",
42561
+ lock: "#00a062",
42562
+ cover: "#ad8624",
42563
+ switch: "#d05259",
42564
+ siren: "#cd67b3",
42565
+ button: "#c9746a",
42566
+ doorbell: "#338eeb"
42567
+ };
42568
+ var HIGH_CONTRAST_FALLBACK = [
42569
+ "#817f3b",
42570
+ "#a0733e",
42571
+ "#8658b2",
42572
+ "#956301",
42573
+ "#bc652d",
42574
+ "#647331",
42575
+ "#a14c9e",
42576
+ "#d14e71"
42577
+ ];
42578
+ var OKABE_ITO_HEX = {
42579
+ motion: "#b88128",
42580
+ audio: "#1096c8",
42581
+ recording: "#009e73",
42582
+ live: "#9c8c22",
42583
+ heatmapScrub: "#0072b2",
42584
+ person: "#d55e00",
42585
+ vehicle: "#c0739f",
42586
+ animal: "#226d18",
42587
+ package: "#91446c",
42588
+ sensor: "#217b56",
42589
+ control: "#648647",
42590
+ face: "#c22998",
42591
+ plate: "#fa4575",
42592
+ car: "#956301",
42593
+ truck: "#2f77f3",
42594
+ bus: "#7a4e86",
42595
+ motorcycle: "#f54597",
42596
+ bicycle: "#bb3e75",
42597
+ airplane: "#e054c0",
42598
+ boat: "#457942",
42599
+ train: "#867afa",
42600
+ bird: "#88914c",
42601
+ dog: "#1556cd",
42602
+ cat: "#71702c",
42603
+ horse: "#9b4fa4",
42604
+ sheep: "#c0559d",
42605
+ cow: "#d14f65",
42606
+ elephant: "#98470f",
42607
+ bear: "#595896",
42608
+ zebra: "#96790e",
42609
+ giraffe: "#cb717b",
42610
+ "package-delivered": "#139d8a",
42611
+ "package-picked-up": "#906ead",
42612
+ suitcase: "#d02939",
42613
+ backpack: "#d41160",
42614
+ handbag: "#f64f54",
42615
+ contact: "#7258d2",
42616
+ "motion-sensor": "#b66182",
42617
+ smoke: "#627abb",
42618
+ flood: "#b86ae4",
42619
+ gas: "#a95261",
42620
+ "carbon-monoxide": "#c65d3c",
42621
+ vibration: "#7a40b7",
42622
+ tamper: "#914b34",
42623
+ presence: "#9481c3",
42624
+ "enum-sensor": "#ac6d47",
42625
+ "device-event": "#7b6fce",
42626
+ lock: "#c67662",
42627
+ cover: "#a6564d",
42628
+ switch: "#ad2c4e",
42629
+ siren: "#348e08",
42630
+ button: "#d27303",
42631
+ doorbell: "#55770f"
42632
+ };
42633
+ var OKABE_ITO_FALLBACK = [
42634
+ "#9a3784",
42635
+ "#a7392c",
42636
+ "#409d50",
42637
+ "#6987e7",
42638
+ "#ee5b3d",
42639
+ "#c0430d",
42640
+ "#af79b3",
42641
+ "#4b6628"
42642
+ ];
42643
+ /**
42644
+ * The display palette (D939). One table of colours, three presets, one
42645
+ * validator. Taxonomy colours and every consumer read this — there is no
42646
+ * second hex table.
42647
+ */
42648
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
42649
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
42650
+ form: literal("solid"),
42651
+ hex: paletteHexSchema
42652
+ }), object({
42653
+ form: literal("gradient"),
42654
+ hex: paletteHexSchema,
42655
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
42656
+ })]);
42657
+ var paletteReadySchema = object({
42658
+ status: literal("ready"),
42659
+ presetId: _enum(PALETTE_PRESET_IDS),
42660
+ customized: boolean(),
42661
+ source: _enum(["stored", "unconfigured"]),
42662
+ swatches: record(string(), paletteSwatchSchema),
42663
+ fallbacks: array(paletteHexSchema).length(8)
42664
+ });
42665
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
42666
+ status: literal("unknown"),
42667
+ reason: string()
42668
+ })]);
42669
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
42670
+ presetId: string(),
42671
+ overrides: record(string(), paletteSwatchSchema)
42672
+ })]);
42673
+ object({
42674
+ presetId: string(),
42675
+ overrides: record(string(), paletteSwatchSchema)
42676
+ });
42677
+ function solid(hex) {
42678
+ return {
42679
+ form: "solid",
42680
+ hex
42681
+ };
42682
+ }
42683
+ function audioGradient(hex) {
42684
+ return {
42685
+ form: "gradient",
42686
+ hex,
42687
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
42688
+ };
42689
+ }
42690
+ function swatchesFrom(hexes) {
42691
+ const out = {};
42692
+ for (const id of PALETTE_ENTRY_IDS) {
42693
+ const hex = hexes[id];
42694
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
42695
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
42696
+ }
42697
+ return out;
42698
+ }
42699
+ function preset(id, name, hexes, fallbacks) {
42700
+ return {
42701
+ id,
42702
+ name,
42703
+ swatches: swatchesFrom(hexes),
42704
+ fallbacks
42705
+ };
42706
+ }
42707
+ var DISPLAY_PRESETS = [
42708
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
42709
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
42710
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
42711
+ ];
42712
+ function presetById(id) {
42713
+ return DISPLAY_PRESETS.find((item) => item.id === id);
42714
+ }
42715
+ function bundledCamstack() {
42716
+ const presetRow = presetById("camstack");
42717
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
42718
+ return readyOf(presetRow, "unconfigured", false);
42719
+ }
42720
+ function readyOf(row, source, customized) {
42721
+ return {
42722
+ status: "ready",
42723
+ presetId: row.id,
42724
+ customized,
42725
+ source,
42726
+ swatches: row.swatches,
42727
+ fallbacks: [...row.fallbacks]
42728
+ };
42729
+ }
42730
+ function hashFallback(kind, fallbacks) {
42731
+ let hash = 0;
42732
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
42733
+ const hex = fallbacks[hash % fallbacks.length];
42734
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42735
+ return hex;
42736
+ }
42737
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
42738
+ function paintHex(swatches, fallbacks, kind) {
42739
+ const key = kind.trim().toLowerCase();
42740
+ if (key.startsWith("audio-")) {
42741
+ const audio = swatches[AUDIO_ENTRY_ID];
42742
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
42743
+ }
42744
+ const direct = swatches[key];
42745
+ if (direct !== void 0) return direct.hex;
42746
+ return hashFallback(key, fallbacks);
42747
+ }
42748
+ /**
42355
42749
  * Unified event-kind taxonomy — THE single source of truth for
42356
42750
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
42357
42751
  * icon }`.
@@ -42365,109 +42759,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
42365
42759
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
42366
42760
  * - the COCO / audio class maps (macro ↔ sub relationships)
42367
42761
  *
42368
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
42369
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
42370
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
42371
- * color or an icon: they read this dictionary (server descriptors carry the
42372
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
42762
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
42763
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
42764
+ * the bundled CamStack display palette (D939). The effective cluster palette
42765
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
42766
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
42373
42767
  *
42374
42768
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
42375
42769
  */
42376
- var TAXONOMY_COLORS = {
42377
- motion: "#f59e0b",
42378
- audio: "#06b6d4",
42379
- person: "#22c55e",
42380
- vehicle: "#3b82f6",
42381
- animal: "#f97316",
42382
- package: "#a855f7",
42383
- sensor: "#8b5cf6",
42384
- control: "#10b981",
42385
- genericDetection: "#64748b"
42386
- };
42387
- var DETECTION_SUB_COLORS = {
42388
- car: "#f59e0b",
42389
- truck: "#d97706",
42390
- bus: "#b45309",
42391
- motorcycle: "#eab308",
42392
- bicycle: "#ca8a04",
42393
- airplane: "#60a5fa",
42394
- boat: "#2563eb",
42395
- train: "#1d4ed8",
42396
- bird: "#14b8a6",
42397
- dog: "#84cc16",
42398
- cat: "#f97316",
42399
- horse: "#a16207",
42400
- sheep: "#a3a3a3",
42401
- cow: "#78716c",
42402
- elephant: "#6b7280",
42403
- bear: "#7c2d12",
42404
- zebra: "#404040",
42405
- giraffe: "#d4a373"
42406
- };
42770
+ var BUNDLED_PALETTE = bundledCamstack();
42771
+ function kindColor(kind) {
42772
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
42773
+ }
42774
+ function firstFallback(fallbacks) {
42775
+ const hex = fallbacks[0];
42776
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42777
+ return hex;
42778
+ }
42779
+ firstFallback(BUNDLED_PALETTE.fallbacks);
42407
42780
  function titleCase(id) {
42408
42781
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
42409
42782
  }
42410
42783
  var entries = /* @__PURE__ */ new Map();
42411
- function macro(kind, category, color, iconId, label) {
42784
+ function macro(kind, category, iconId, label) {
42412
42785
  entries.set(kind, {
42413
42786
  kind,
42414
42787
  parentKind: null,
42415
42788
  level: "macro",
42416
42789
  category,
42417
- color,
42790
+ color: kindColor(kind),
42418
42791
  iconId,
42419
42792
  labelKey: `eventKind.${kind}`,
42420
42793
  label
42421
42794
  });
42422
42795
  }
42423
- function sub(kind, parentKind, category, color, iconId, label) {
42796
+ function sub(kind, parentKind, category, iconId, label) {
42424
42797
  entries.set(kind, {
42425
42798
  kind,
42426
42799
  parentKind,
42427
42800
  level: "sub",
42428
42801
  category,
42429
- color,
42802
+ color: kindColor(kind),
42430
42803
  iconId,
42431
42804
  labelKey: `eventKind.${kind}`,
42432
42805
  label
42433
42806
  });
42434
42807
  }
42435
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
42436
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
42437
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
42438
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
42439
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
42440
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
42441
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
42442
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
42808
+ macro("motion", "motion", "motion", "Motion");
42809
+ macro("audio", "audio", "audio", "Audio");
42810
+ macro("person", "detection", "person", "Person");
42811
+ macro("vehicle", "detection", "vehicle", "Vehicle");
42812
+ macro("animal", "detection", "animal", "Animal");
42813
+ macro("package", "package", "package", "Package");
42814
+ macro("sensor", "sensor", "sensor", "Sensor");
42815
+ macro("control", "control", "control", "Control");
42443
42816
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
42444
42817
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
42445
42818
  if (entries.has(cocoClass)) continue;
42446
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
42819
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
42447
42820
  }
42448
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
42449
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
42450
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
42451
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
42452
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
42453
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
42454
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
42455
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
42456
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
42457
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
42458
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
42459
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
42460
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
42461
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
42462
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
42463
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
42464
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
42465
- sub("button", "control", "control", "#10b981", "button", "Button");
42466
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
42821
+ sub("package-delivered", "package", "package", "package", "Package delivered");
42822
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
42823
+ sub("contact", "sensor", "sensor", "door", "Contact");
42824
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
42825
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
42826
+ sub("flood", "sensor", "sensor", "water", "Water leak");
42827
+ sub("gas", "sensor", "sensor", "gas", "Gas");
42828
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
42829
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
42830
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
42831
+ sub("presence", "sensor", "sensor", "presence", "Presence");
42832
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
42833
+ sub("device-event", "sensor", "sensor", "button", "Device event");
42834
+ sub("lock", "control", "control", "lock", "Lock");
42835
+ sub("cover", "control", "control", "door", "Cover");
42836
+ sub("switch", "control", "control", "switch", "Switch");
42837
+ sub("siren", "control", "control", "siren", "Siren");
42838
+ sub("button", "control", "control", "button", "Button");
42839
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
42467
42840
  for (const l of AUDIO_MACRO_LABELS) {
42468
42841
  const kind = `audio-${l.id}`;
42469
42842
  if (entries.has(kind)) continue;
42470
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
42843
+ sub(kind, "audio", "audio", kind, l.name);
42471
42844
  }
42472
42845
  /** The complete taxonomy dictionary, keyed by kind. */
42473
42846
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -55177,6 +55550,30 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
55177
55550
  auth: "admin"
55178
55551
  });
55179
55552
  /**
55553
+ * display-palette — the cluster's one colour table (D939).
55554
+ *
55555
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
55556
+ * cannot be read; it does not pretend the bundled preset was stored.
55557
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
55558
+ * the pairs.
55559
+ */
55560
+ var presetSummarySchema = object({
55561
+ id: string(),
55562
+ name: string(),
55563
+ swatches: record(string(), paletteSwatchSchema),
55564
+ fallbacks: array(string())
55565
+ });
55566
+ method(_void(), paletteResultSchema, {
55567
+ auth: "protected",
55568
+ role: "viewer"
55569
+ }), method(_void(), array(presetSummarySchema).readonly(), {
55570
+ auth: "protected",
55571
+ role: "viewer"
55572
+ }), method(setPaletteInputSchema, paletteReadySchema, {
55573
+ kind: "mutation",
55574
+ auth: "admin"
55575
+ });
55576
+ /**
55180
55577
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
55181
55578
  * for every device, regardless of provider — the kernel needs a uniform
55182
55579
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -66173,6 +66570,27 @@ Object.freeze({
66173
66570
  access: "create",
66174
66571
  role: "viewer"
66175
66572
  },
66573
+ "displayPalette.getPalette": {
66574
+ capName: "display-palette",
66575
+ capScope: "system",
66576
+ addonId: null,
66577
+ access: "view",
66578
+ role: "viewer"
66579
+ },
66580
+ "displayPalette.listPresets": {
66581
+ capName: "display-palette",
66582
+ capScope: "system",
66583
+ addonId: null,
66584
+ access: "view",
66585
+ role: "viewer"
66586
+ },
66587
+ "displayPalette.setPalette": {
66588
+ capName: "display-palette",
66589
+ capScope: "system",
66590
+ addonId: null,
66591
+ access: "create",
66592
+ role: "admin"
66593
+ },
66176
66594
  "doorbell.getStatus": {
66177
66595
  capName: "doorbell",
66178
66596
  capScope: "device",
@@ -76629,6 +77047,7 @@ var SYSTEM_CAP_VOCABULARY = {
76629
77047
  "device-provider": system(INTERNAL),
76630
77048
  "device-removal-hook": system(INTERNAL),
76631
77049
  "device-state": system("the runtime-state mirror every trigger already reads through"),
77050
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
76632
77051
  "embedding-encoder": system(ML),
76633
77052
  "face-gallery": system("the face gallery — curated on its own page"),
76634
77053
  "failure-contribution": system(INTERNAL),
@@ -1,6 +1,6 @@
1
1
  import { S as e, d as t, u as n, v as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import { n as i, r as a, t as o } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { g as s, h as c } from "./responsive-BsA5VAZE.mjs";
3
+ import { g as s, h as c } from "./responsive-BRDOoNTu.mjs";
4
4
  var l = s("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
6
6
  key: "qrunsl"
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-D-DKvrkx.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DeT4IssS.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { S as e, d as t, g as n, i as r, l as i, n as a, r as o, u as s, v as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { g as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BsM_g96G.mjs";
3
+ import { v as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPZnyWUq.mjs";
4
4
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  e();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,6 +1,6 @@
1
1
  import { S as e, g as t, l as n, v as r } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DMBKVIH7.mjs";
2
2
  import { n as i } from "./ui-text-BqZa5BNK.mjs";
3
- import { g as a } from "./responsive-BsA5VAZE.mjs";
3
+ import { g as a } from "./responsive-BRDOoNTu.mjs";
4
4
  var o = a("camera", [["path", {
5
5
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
6
6
  key: "18u6gg"