@camstack/addon-osd-manager 0.1.268 → 0.1.269

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-Da16aeu1.mjs → MotionZonesSettings-BNpjz5g_.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-Cn7oHD35.mjs → PrivacyMaskSettings-BUUwi7AA.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-DUZEpHBf.mjs → SceneMonitorEditor-C8nM8xAb.mjs} +3 -3
  4. package/dist/_stub.js +4087 -3966
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-pMeJvguf.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-DyV-DzxR.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CV6YcS56.mjs +26 -0
  7. package/dist/addon-osd-manager.css +1 -1
  8. package/dist/{hostInit-Ius2kGzx.mjs → hostInit-FBoYOEXv.mjs} +2 -2
  9. package/dist/index.js +491 -72
  10. package/dist/index.mjs +491 -72
  11. package/dist/{player-overlays-6Y9IRVsJ.mjs → player-overlays-CfPa7e9_.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-CRQUI1kX.mjs → responsive-C4D8Hc3L.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-Ng8lktvt.mjs → scene-monitor-copy-DKL8iV9N.mjs} +1 -1
  15. package/dist/{square-C3jJtMZF.mjs → square-C1SY2RoU.mjs} +1 -1
  16. package/dist/{trash-2-CNbeJ76B.mjs → trash-2-BTuzBHSh.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-CcfyBYDS.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-BxBkI9w9.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BGMAwVi8.mjs +0 -26
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.407",
39
+ version: "1.2.410",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -81,7 +81,7 @@ async function r() {
81
81
  }
82
82
  },
83
83
  "@camstack/ui-library": {
84
- version: "1.2.322",
84
+ version: "1.2.323",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
package/dist/index.js CHANGED
@@ -15848,6 +15848,13 @@ var ComposerUnreadableBlockSchema = object({
15848
15848
  /** The parse error, in the operator's words. */
15849
15849
  error: string()
15850
15850
  });
15851
+ /** A confirmed release the hub did not accept. `deviceId` is the claim's device. */
15852
+ var UnreleasedClaimSchema = object({
15853
+ deviceId: number().int(),
15854
+ capName: string(),
15855
+ owner: string(),
15856
+ error: string()
15857
+ });
15851
15858
  method(object({
15852
15859
  /** The shared Blocks integration; null until `core-blocks` has reconciled it. */
15853
15860
  integrationId: string().nullable(),
@@ -15857,7 +15864,13 @@ method(object({
15857
15864
  /** Operator restarts: rebuild these runtimes and re-resolve their sources. Stores nothing (D62). */
15858
15865
  restartBlockIds: array(string()),
15859
15866
  /** Composition rows that exist but do not parse: held, never withdrawn, reported failed. */
15860
- unreadableBlocks: array(ComposerUnreadableBlockSchema)
15867
+ unreadableBlocks: array(ComposerUnreadableBlockSchema),
15868
+ /**
15869
+ * Operator-confirmed deletions. Their claims are released on this apply,
15870
+ * before any replacement block claims. A block that merely vanished from the
15871
+ * snapshot is not listed here and still waits for two applies (D49).
15872
+ */
15873
+ retiredBlockIds: array(string()).optional()
15861
15874
  }), object({
15862
15875
  blocks: array(object({
15863
15876
  blockId: string(),
@@ -15869,7 +15882,13 @@ method(object({
15869
15882
  * integration unknown, its own rows unread or read empty once). An empty
15870
15883
  * apply the caller owes is paid off only by one the composer acted on (D49).
15871
15884
  */
15872
- acted: boolean()
15885
+ acted: boolean(),
15886
+ /**
15887
+ * Confirmed releases this apply tried and the hub did not accept. Empty when
15888
+ * every one landed (or there was nothing to hand back). Absent on a result
15889
+ * that never got that far.
15890
+ */
15891
+ unreleasedClaims: array(UnreleasedClaimSchema).optional()
15873
15892
  }), {
15874
15893
  kind: "mutation",
15875
15894
  auth: "admin"
@@ -41777,6 +41796,381 @@ var _macroLookup = /* @__PURE__ */ new Map();
41777
41796
  for (const [k, v] of Object.entries(YAMNET_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
41778
41797
  for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set(k.toLowerCase(), v);
41779
41798
  /**
41799
+ * Palette entry ids (D939). Audio is the one gradient; `audio-*` leaves are
41800
+ * not entries. `heatmapScrub` is a mark, not an event kind.
41801
+ */
41802
+ var PALETTE_ENTRY_IDS = [
41803
+ "motion",
41804
+ "audio",
41805
+ "recording",
41806
+ "live",
41807
+ "heatmapScrub",
41808
+ "person",
41809
+ "vehicle",
41810
+ "animal",
41811
+ "package",
41812
+ "sensor",
41813
+ "control",
41814
+ "face",
41815
+ "plate",
41816
+ "car",
41817
+ "truck",
41818
+ "bus",
41819
+ "motorcycle",
41820
+ "bicycle",
41821
+ "airplane",
41822
+ "boat",
41823
+ "train",
41824
+ "bird",
41825
+ "dog",
41826
+ "cat",
41827
+ "horse",
41828
+ "sheep",
41829
+ "cow",
41830
+ "elephant",
41831
+ "bear",
41832
+ "zebra",
41833
+ "giraffe",
41834
+ "package-delivered",
41835
+ "package-picked-up",
41836
+ "suitcase",
41837
+ "backpack",
41838
+ "handbag",
41839
+ "contact",
41840
+ "motion-sensor",
41841
+ "smoke",
41842
+ "flood",
41843
+ "gas",
41844
+ "carbon-monoxide",
41845
+ "vibration",
41846
+ "tamper",
41847
+ "presence",
41848
+ "enum-sensor",
41849
+ "device-event",
41850
+ "lock",
41851
+ "cover",
41852
+ "switch",
41853
+ "siren",
41854
+ "button",
41855
+ "doorbell"
41856
+ ];
41857
+ var AUDIO_ENTRY_ID = "audio";
41858
+ /** Six rungs, quiet → loud. The opaque end is the entry's hex. */
41859
+ var AUDIO_GRADIENT_ALPHAS = [
41860
+ .3,
41861
+ .42,
41862
+ .55,
41863
+ .7,
41864
+ .85,
41865
+ 1
41866
+ ];
41867
+ var PALETTE_PRESET_IDS = [
41868
+ "camstack",
41869
+ "high-contrast",
41870
+ "okabe-ito"
41871
+ ];
41872
+ /** Frozen palette tables (D939). The spec refuses a table that breaks the rule. */
41873
+ var CAMSTACK_HEX = {
41874
+ motion: "#d946ef",
41875
+ audio: "#059eb8",
41876
+ recording: "#ef4444",
41877
+ live: "#8d7a00",
41878
+ heatmapScrub: "#4b32ff",
41879
+ person: "#11a64c",
41880
+ vehicle: "#3b82f6",
41881
+ animal: "#ea6a09",
41882
+ package: "#924667",
41883
+ sensor: "#624bbc",
41884
+ control: "#944d24",
41885
+ face: "#ed4f8d",
41886
+ plate: "#4b7027",
41887
+ car: "#9684cf",
41888
+ truck: "#0f9b89",
41889
+ bus: "#a734a9",
41890
+ motorcycle: "#c1133a",
41891
+ bicycle: "#0e6a9b",
41892
+ airplane: "#7c9928",
41893
+ boat: "#b17933",
41894
+ train: "#ad6ca3",
41895
+ bird: "#0f7c55",
41896
+ dog: "#c82700",
41897
+ cat: "#7268f2",
41898
+ horse: "#cb795e",
41899
+ sheep: "#b8636b",
41900
+ cow: "#cb2969",
41901
+ elephant: "#1158d2",
41902
+ bear: "#8d5e00",
41903
+ zebra: "#0097d6",
41904
+ giraffe: "#8f61bb",
41905
+ "package-delivered": "#cd3f9b",
41906
+ "package-picked-up": "#388a08",
41907
+ suitcase: "#666800",
41908
+ backpack: "#ec5022",
41909
+ handbag: "#a76ef8",
41910
+ contact: "#ab5a49",
41911
+ "motion-sensor": "#b95d1a",
41912
+ smoke: "#dd3858",
41913
+ flood: "#b31e7d",
41914
+ gas: "#5b70b5",
41915
+ "carbon-monoxide": "#7b4e8e",
41916
+ vibration: "#e65bba",
41917
+ tamper: "#98464b",
41918
+ presence: "#3a9468",
41919
+ "enum-sensor": "#7885f8",
41920
+ "device-event": "#8c43c8",
41921
+ lock: "#649653",
41922
+ cover: "#c67597",
41923
+ switch: "#7a812a",
41924
+ siren: "#ac5d7f",
41925
+ button: "#b276cd",
41926
+ doorbell: "#0087ab"
41927
+ };
41928
+ var CAMSTACK_FALLBACK = [
41929
+ "#b34dc7",
41930
+ "#1d7d34",
41931
+ "#db6b6c",
41932
+ "#a43d29",
41933
+ "#0e6ee6",
41934
+ "#29a10b",
41935
+ "#a98731",
41936
+ "#0181c6"
41937
+ ];
41938
+ var HIGH_CONTRAST_HEX = {
41939
+ motion: "#964360",
41940
+ audio: "#23a132",
41941
+ recording: "#2494ca",
41942
+ live: "#bd7e2b",
41943
+ heatmapScrub: "#ad6eea",
41944
+ person: "#62611e",
41945
+ vehicle: "#f4534c",
41946
+ animal: "#1556cd",
41947
+ package: "#9c4415",
41948
+ sensor: "#066c48",
41949
+ control: "#f2479f",
41950
+ face: "#139d8a",
41951
+ plate: "#909024",
41952
+ car: "#8e35ab",
41953
+ truck: "#bd0b2b",
41954
+ bus: "#7a88ca",
41955
+ motorcycle: "#e26725",
41956
+ bicycle: "#a6679b",
41957
+ airplane: "#7c5720",
41958
+ boat: "#467a1b",
41959
+ train: "#6f65a4",
41960
+ bird: "#cb717f",
41961
+ dog: "#c62490",
41962
+ cat: "#b36850",
41963
+ horse: "#1872ac",
41964
+ sheep: "#927939",
41965
+ cow: "#428a5c",
41966
+ elephant: "#d41160",
41967
+ bear: "#799453",
41968
+ zebra: "#a85455",
41969
+ giraffe: "#746be8",
41970
+ "package-delivered": "#824a80",
41971
+ "package-picked-up": "#614ac1",
41972
+ suitcase: "#2f77f3",
41973
+ backpack: "#fa476d",
41974
+ handbag: "#c14cbe",
41975
+ contact: "#c83921",
41976
+ "motion-sensor": "#a07ebd",
41977
+ smoke: "#a25b13",
41978
+ flood: "#526bab",
41979
+ gas: "#924938",
41980
+ "carbon-monoxide": "#bb7e53",
41981
+ vibration: "#b66182",
41982
+ tamper: "#3c6931",
41983
+ presence: "#6c851d",
41984
+ "enum-sensor": "#ad2d48",
41985
+ "device-event": "#5e9b04",
41986
+ lock: "#00a062",
41987
+ cover: "#ad8624",
41988
+ switch: "#d05259",
41989
+ siren: "#cd67b3",
41990
+ button: "#c9746a",
41991
+ doorbell: "#338eeb"
41992
+ };
41993
+ var HIGH_CONTRAST_FALLBACK = [
41994
+ "#817f3b",
41995
+ "#a0733e",
41996
+ "#8658b2",
41997
+ "#956301",
41998
+ "#bc652d",
41999
+ "#647331",
42000
+ "#a14c9e",
42001
+ "#d14e71"
42002
+ ];
42003
+ var OKABE_ITO_HEX = {
42004
+ motion: "#b88128",
42005
+ audio: "#1096c8",
42006
+ recording: "#009e73",
42007
+ live: "#9c8c22",
42008
+ heatmapScrub: "#0072b2",
42009
+ person: "#d55e00",
42010
+ vehicle: "#c0739f",
42011
+ animal: "#226d18",
42012
+ package: "#91446c",
42013
+ sensor: "#217b56",
42014
+ control: "#648647",
42015
+ face: "#c22998",
42016
+ plate: "#fa4575",
42017
+ car: "#956301",
42018
+ truck: "#2f77f3",
42019
+ bus: "#7a4e86",
42020
+ motorcycle: "#f54597",
42021
+ bicycle: "#bb3e75",
42022
+ airplane: "#e054c0",
42023
+ boat: "#457942",
42024
+ train: "#867afa",
42025
+ bird: "#88914c",
42026
+ dog: "#1556cd",
42027
+ cat: "#71702c",
42028
+ horse: "#9b4fa4",
42029
+ sheep: "#c0559d",
42030
+ cow: "#d14f65",
42031
+ elephant: "#98470f",
42032
+ bear: "#595896",
42033
+ zebra: "#96790e",
42034
+ giraffe: "#cb717b",
42035
+ "package-delivered": "#139d8a",
42036
+ "package-picked-up": "#906ead",
42037
+ suitcase: "#d02939",
42038
+ backpack: "#d41160",
42039
+ handbag: "#f64f54",
42040
+ contact: "#7258d2",
42041
+ "motion-sensor": "#b66182",
42042
+ smoke: "#627abb",
42043
+ flood: "#b86ae4",
42044
+ gas: "#a95261",
42045
+ "carbon-monoxide": "#c65d3c",
42046
+ vibration: "#7a40b7",
42047
+ tamper: "#914b34",
42048
+ presence: "#9481c3",
42049
+ "enum-sensor": "#ac6d47",
42050
+ "device-event": "#7b6fce",
42051
+ lock: "#c67662",
42052
+ cover: "#a6564d",
42053
+ switch: "#ad2c4e",
42054
+ siren: "#348e08",
42055
+ button: "#d27303",
42056
+ doorbell: "#55770f"
42057
+ };
42058
+ var OKABE_ITO_FALLBACK = [
42059
+ "#9a3784",
42060
+ "#a7392c",
42061
+ "#409d50",
42062
+ "#6987e7",
42063
+ "#ee5b3d",
42064
+ "#c0430d",
42065
+ "#af79b3",
42066
+ "#4b6628"
42067
+ ];
42068
+ /**
42069
+ * The display palette (D939). One table of colours, three presets, one
42070
+ * validator. Taxonomy colours and every consumer read this — there is no
42071
+ * second hex table.
42072
+ */
42073
+ var paletteHexSchema = string().regex(/^#[0-9a-f]{6}$/);
42074
+ var paletteSwatchSchema = discriminatedUnion("form", [object({
42075
+ form: literal("solid"),
42076
+ hex: paletteHexSchema
42077
+ }), object({
42078
+ form: literal("gradient"),
42079
+ hex: paletteHexSchema,
42080
+ alphas: array(number().gt(0).lte(1)).length(AUDIO_GRADIENT_ALPHAS.length)
42081
+ })]);
42082
+ var paletteReadySchema = object({
42083
+ status: literal("ready"),
42084
+ presetId: _enum(PALETTE_PRESET_IDS),
42085
+ customized: boolean(),
42086
+ source: _enum(["stored", "unconfigured"]),
42087
+ swatches: record(string(), paletteSwatchSchema),
42088
+ fallbacks: array(paletteHexSchema).length(8)
42089
+ });
42090
+ var paletteResultSchema = discriminatedUnion("status", [paletteReadySchema, object({
42091
+ status: literal("unknown"),
42092
+ reason: string()
42093
+ })]);
42094
+ var setPaletteInputSchema = union([object({ presetId: string() }), object({
42095
+ presetId: string(),
42096
+ overrides: record(string(), paletteSwatchSchema)
42097
+ })]);
42098
+ object({
42099
+ presetId: string(),
42100
+ overrides: record(string(), paletteSwatchSchema)
42101
+ });
42102
+ function solid(hex) {
42103
+ return {
42104
+ form: "solid",
42105
+ hex
42106
+ };
42107
+ }
42108
+ function audioGradient(hex) {
42109
+ return {
42110
+ form: "gradient",
42111
+ hex,
42112
+ alphas: [...AUDIO_GRADIENT_ALPHAS]
42113
+ };
42114
+ }
42115
+ function swatchesFrom(hexes) {
42116
+ const out = {};
42117
+ for (const id of PALETTE_ENTRY_IDS) {
42118
+ const hex = hexes[id];
42119
+ if (hex === void 0) throw new Error(`palette table missing ${id}`);
42120
+ out[id] = id === "audio" ? audioGradient(hex) : solid(hex);
42121
+ }
42122
+ return out;
42123
+ }
42124
+ function preset(id, name, hexes, fallbacks) {
42125
+ return {
42126
+ id,
42127
+ name,
42128
+ swatches: swatchesFrom(hexes),
42129
+ fallbacks
42130
+ };
42131
+ }
42132
+ var DISPLAY_PRESETS = [
42133
+ preset("camstack", "CamStack", CAMSTACK_HEX, CAMSTACK_FALLBACK),
42134
+ preset("high-contrast", "High contrast", HIGH_CONTRAST_HEX, HIGH_CONTRAST_FALLBACK),
42135
+ preset("okabe-ito", "Colour-blind safe", OKABE_ITO_HEX, OKABE_ITO_FALLBACK)
42136
+ ];
42137
+ function presetById(id) {
42138
+ return DISPLAY_PRESETS.find((item) => item.id === id);
42139
+ }
42140
+ function bundledCamstack() {
42141
+ const presetRow = presetById("camstack");
42142
+ if (presetRow === void 0) throw new Error("CamStack preset missing");
42143
+ return readyOf(presetRow, "unconfigured", false);
42144
+ }
42145
+ function readyOf(row, source, customized) {
42146
+ return {
42147
+ status: "ready",
42148
+ presetId: row.id,
42149
+ customized,
42150
+ source,
42151
+ swatches: row.swatches,
42152
+ fallbacks: [...row.fallbacks]
42153
+ };
42154
+ }
42155
+ function hashFallback(kind, fallbacks) {
42156
+ let hash = 0;
42157
+ for (let i = 0; i < kind.length; i++) hash = hash * 31 + (kind.codePointAt(i) ?? 0) >>> 0;
42158
+ const hex = fallbacks[hash % fallbacks.length];
42159
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42160
+ return hex;
42161
+ }
42162
+ /** Colour a kind paints with. Audio leaves share the audio gradient's hex. */
42163
+ function paintHex(swatches, fallbacks, kind) {
42164
+ const key = kind.trim().toLowerCase();
42165
+ if (key.startsWith("audio-")) {
42166
+ const audio = swatches[AUDIO_ENTRY_ID];
42167
+ return audio !== void 0 ? audio.hex : hashFallback(key, fallbacks);
42168
+ }
42169
+ const direct = swatches[key];
42170
+ if (direct !== void 0) return direct.hex;
42171
+ return hashFallback(key, fallbacks);
42172
+ }
42173
+ /**
41780
42174
  * Unified event-kind taxonomy — THE single source of truth for
41781
42175
  * `kind → { parentKind, category, level, color, iconId, labelKey, label,
41782
42176
  * icon }`.
@@ -41790,109 +42184,88 @@ for (const [k, v] of Object.entries(APPLE_SA_TO_MACRO.mapping)) _macroLookup.set
41790
42184
  * - `addon-post-analysis/shared/frame/box-drawer.ts` (DEFAULT_COLOR)
41791
42185
  * - the COCO / audio class maps (macro ↔ sub relationships)
41792
42186
  *
41793
- * The DATA (serializable — color/iconId/labelKey/parentKind) lives here in
41794
- * `@camstack/types`. The UI-side mapping `iconId → lucide component` and
41795
- * `labelKey → t()` lives in `@camstack/ui-library`. UIs never hardcode a
41796
- * color or an icon: they read this dictionary (server descriptors carry the
41797
- * fields inline; the client resolves color/icon/label from `iconId`/`kind`).
42187
+ * The DATA (serializable — parentKind / iconId / labelKey) lives here in
42188
+ * `@camstack/types`. Colour is NOT a second table: each entry's `color` is
42189
+ * the bundled CamStack display palette (D939). The effective cluster palette
42190
+ * is the `display-palette` capability. The UI-side mapping `iconId → lucide
42191
+ * component` and `labelKey → t()` lives in `@camstack/ui-library`.
41798
42192
  *
41799
42193
  * Two levels only (v1 YAGNI): macro → sub. `person` is a leaf macro.
41800
42194
  */
41801
- var TAXONOMY_COLORS = {
41802
- motion: "#f59e0b",
41803
- audio: "#06b6d4",
41804
- person: "#22c55e",
41805
- vehicle: "#3b82f6",
41806
- animal: "#f97316",
41807
- package: "#a855f7",
41808
- sensor: "#8b5cf6",
41809
- control: "#10b981",
41810
- genericDetection: "#64748b"
41811
- };
41812
- var DETECTION_SUB_COLORS = {
41813
- car: "#f59e0b",
41814
- truck: "#d97706",
41815
- bus: "#b45309",
41816
- motorcycle: "#eab308",
41817
- bicycle: "#ca8a04",
41818
- airplane: "#60a5fa",
41819
- boat: "#2563eb",
41820
- train: "#1d4ed8",
41821
- bird: "#14b8a6",
41822
- dog: "#84cc16",
41823
- cat: "#f97316",
41824
- horse: "#a16207",
41825
- sheep: "#a3a3a3",
41826
- cow: "#78716c",
41827
- elephant: "#6b7280",
41828
- bear: "#7c2d12",
41829
- zebra: "#404040",
41830
- giraffe: "#d4a373"
41831
- };
42195
+ var BUNDLED_PALETTE = bundledCamstack();
42196
+ function kindColor(kind) {
42197
+ return paintHex(BUNDLED_PALETTE.swatches, BUNDLED_PALETTE.fallbacks, kind);
42198
+ }
42199
+ function firstFallback(fallbacks) {
42200
+ const hex = fallbacks[0];
42201
+ if (hex === void 0) throw new Error("display palette has no fallback colour");
42202
+ return hex;
42203
+ }
42204
+ firstFallback(BUNDLED_PALETTE.fallbacks);
41832
42205
  function titleCase(id) {
41833
42206
  return id.split(/[-_ ]/).filter((p) => p.length > 0).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
41834
42207
  }
41835
42208
  var entries = /* @__PURE__ */ new Map();
41836
- function macro(kind, category, color, iconId, label) {
42209
+ function macro(kind, category, iconId, label) {
41837
42210
  entries.set(kind, {
41838
42211
  kind,
41839
42212
  parentKind: null,
41840
42213
  level: "macro",
41841
42214
  category,
41842
- color,
42215
+ color: kindColor(kind),
41843
42216
  iconId,
41844
42217
  labelKey: `eventKind.${kind}`,
41845
42218
  label
41846
42219
  });
41847
42220
  }
41848
- function sub(kind, parentKind, category, color, iconId, label) {
42221
+ function sub(kind, parentKind, category, iconId, label) {
41849
42222
  entries.set(kind, {
41850
42223
  kind,
41851
42224
  parentKind,
41852
42225
  level: "sub",
41853
42226
  category,
41854
- color,
42227
+ color: kindColor(kind),
41855
42228
  iconId,
41856
42229
  labelKey: `eventKind.${kind}`,
41857
42230
  label
41858
42231
  });
41859
42232
  }
41860
- macro("motion", "motion", TAXONOMY_COLORS.motion, "motion", "Motion");
41861
- macro("audio", "audio", TAXONOMY_COLORS.audio, "audio", "Audio");
41862
- macro("person", "detection", TAXONOMY_COLORS.person, "person", "Person");
41863
- macro("vehicle", "detection", TAXONOMY_COLORS.vehicle, "vehicle", "Vehicle");
41864
- macro("animal", "detection", TAXONOMY_COLORS.animal, "animal", "Animal");
41865
- macro("package", "package", TAXONOMY_COLORS.package, "package", "Package");
41866
- macro("sensor", "sensor", TAXONOMY_COLORS.sensor, "sensor", "Sensor");
41867
- macro("control", "control", TAXONOMY_COLORS.control, "control", "Control");
42233
+ macro("motion", "motion", "motion", "Motion");
42234
+ macro("audio", "audio", "audio", "Audio");
42235
+ macro("person", "detection", "person", "Person");
42236
+ macro("vehicle", "detection", "vehicle", "Vehicle");
42237
+ macro("animal", "detection", "animal", "Animal");
42238
+ macro("package", "package", "package", "Package");
42239
+ macro("sensor", "sensor", "sensor", "Sensor");
42240
+ macro("control", "control", "control", "Control");
41868
42241
  for (const [cocoClass, macroClass] of Object.entries(COCO_TO_MACRO.mapping)) {
41869
42242
  if (macroClass !== "vehicle" && macroClass !== "animal") continue;
41870
42243
  if (entries.has(cocoClass)) continue;
41871
- sub(cocoClass, macroClass, "detection", DETECTION_SUB_COLORS[cocoClass] ?? TAXONOMY_COLORS.genericDetection, cocoClass, titleCase(cocoClass));
42244
+ sub(cocoClass, macroClass, "detection", cocoClass, titleCase(cocoClass));
41872
42245
  }
41873
- sub("package-delivered", "package", "package", TAXONOMY_COLORS.package, "package", "Package delivered");
41874
- sub("package-picked-up", "package", "package", TAXONOMY_COLORS.package, "package", "Package picked up");
41875
- sub("contact", "sensor", "sensor", "#f59e0b", "door", "Contact");
41876
- sub("motion-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "pir", "Motion sensor");
41877
- sub("smoke", "sensor", "sensor", "#ef4444", "smoke", "Smoke");
41878
- sub("flood", "sensor", "sensor", "#3b82f6", "water", "Water leak");
41879
- sub("gas", "sensor", "sensor", "#ef4444", "gas", "Gas");
41880
- sub("carbon-monoxide", "sensor", "sensor", "#dc2626", "smoke", "Carbon monoxide");
41881
- sub("vibration", "sensor", "sensor", "#eab308", "vibration", "Vibration");
41882
- sub("tamper", "sensor", "sensor", "#f97316", "tamper", "Tamper");
41883
- sub("presence", "sensor", "sensor", "#22c55e", "presence", "Presence");
41884
- sub("enum-sensor", "sensor", "sensor", TAXONOMY_COLORS.sensor, "generic", "Sensor state");
41885
- sub("device-event", "sensor", "sensor", "#10b981", "button", "Device event");
41886
- sub("lock", "control", "control", "#0ea5e9", "lock", "Lock");
41887
- sub("cover", "control", "control", "#0ea5e9", "door", "Cover");
41888
- sub("switch", "control", "control", TAXONOMY_COLORS.control, "switch", "Switch");
41889
- sub("siren", "control", "control", "#dc2626", "siren", "Siren");
41890
- sub("button", "control", "control", "#10b981", "button", "Button");
41891
- sub("doorbell", "control", "control", "#a855f7", "doorbell", "Doorbell");
42246
+ sub("package-delivered", "package", "package", "package", "Package delivered");
42247
+ sub("package-picked-up", "package", "package", "package", "Package picked up");
42248
+ sub("contact", "sensor", "sensor", "door", "Contact");
42249
+ sub("motion-sensor", "sensor", "sensor", "pir", "Motion sensor");
42250
+ sub("smoke", "sensor", "sensor", "smoke", "Smoke");
42251
+ sub("flood", "sensor", "sensor", "water", "Water leak");
42252
+ sub("gas", "sensor", "sensor", "gas", "Gas");
42253
+ sub("carbon-monoxide", "sensor", "sensor", "smoke", "Carbon monoxide");
42254
+ sub("vibration", "sensor", "sensor", "vibration", "Vibration");
42255
+ sub("tamper", "sensor", "sensor", "tamper", "Tamper");
42256
+ sub("presence", "sensor", "sensor", "presence", "Presence");
42257
+ sub("enum-sensor", "sensor", "sensor", "generic", "Sensor state");
42258
+ sub("device-event", "sensor", "sensor", "button", "Device event");
42259
+ sub("lock", "control", "control", "lock", "Lock");
42260
+ sub("cover", "control", "control", "door", "Cover");
42261
+ sub("switch", "control", "control", "switch", "Switch");
42262
+ sub("siren", "control", "control", "siren", "Siren");
42263
+ sub("button", "control", "control", "button", "Button");
42264
+ sub("doorbell", "control", "control", "doorbell", "Doorbell");
41892
42265
  for (const l of AUDIO_MACRO_LABELS) {
41893
42266
  const kind = `audio-${l.id}`;
41894
42267
  if (entries.has(kind)) continue;
41895
- sub(kind, "audio", "audio", TAXONOMY_COLORS.audio, kind, l.name);
42268
+ sub(kind, "audio", "audio", kind, l.name);
41896
42269
  }
41897
42270
  /** The complete taxonomy dictionary, keyed by kind. */
41898
42271
  var EVENT_TAXONOMY = Object.freeze(Object.fromEntries(entries));
@@ -55194,6 +55567,30 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
55194
55567
  auth: "admin"
55195
55568
  });
55196
55569
  /**
55570
+ * display-palette — the cluster's one colour table (D939).
55571
+ *
55572
+ * Hub singleton. `getPalette` reports `unknown` when the settings store
55573
+ * cannot be read; it does not pretend the bundled preset was stored.
55574
+ * `setPalette` refuses a palette that fails the ΔE / contrast rule and names
55575
+ * the pairs.
55576
+ */
55577
+ var presetSummarySchema = object({
55578
+ id: string(),
55579
+ name: string(),
55580
+ swatches: record(string(), paletteSwatchSchema),
55581
+ fallbacks: array(string())
55582
+ });
55583
+ method(_void(), paletteResultSchema, {
55584
+ auth: "protected",
55585
+ role: "viewer"
55586
+ }), method(_void(), array(presetSummarySchema).readonly(), {
55587
+ auth: "protected",
55588
+ role: "viewer"
55589
+ }), method(setPaletteInputSchema, paletteReadySchema, {
55590
+ kind: "mutation",
55591
+ auth: "admin"
55592
+ });
55593
+ /**
55197
55594
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
55198
55595
  * for every device, regardless of provider — the kernel needs a uniform
55199
55596
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -66470,6 +66867,27 @@ Object.freeze({
66470
66867
  access: "create",
66471
66868
  role: "viewer"
66472
66869
  },
66870
+ "displayPalette.getPalette": {
66871
+ capName: "display-palette",
66872
+ capScope: "system",
66873
+ addonId: null,
66874
+ access: "view",
66875
+ role: "viewer"
66876
+ },
66877
+ "displayPalette.listPresets": {
66878
+ capName: "display-palette",
66879
+ capScope: "system",
66880
+ addonId: null,
66881
+ access: "view",
66882
+ role: "viewer"
66883
+ },
66884
+ "displayPalette.setPalette": {
66885
+ capName: "display-palette",
66886
+ capScope: "system",
66887
+ addonId: null,
66888
+ access: "create",
66889
+ role: "admin"
66890
+ },
66473
66891
  "doorbell.getStatus": {
66474
66892
  capName: "doorbell",
66475
66893
  capScope: "device",
@@ -76926,6 +77344,7 @@ var SYSTEM_CAP_VOCABULARY = {
76926
77344
  "device-provider": system(INTERNAL),
76927
77345
  "device-removal-hook": system(INTERNAL),
76928
77346
  "device-state": system("the runtime-state mirror every trigger already reads through"),
77347
+ "display-palette": system("the cluster display palette — one colour table for every client, not a device action"),
76929
77348
  "embedding-encoder": system(ML),
76930
77349
  "face-gallery": system("the face gallery — curated on its own page"),
76931
77350
  "failure-contribution": system(INTERNAL),
@@ -84750,7 +85169,7 @@ var OsdManagerAddon = class extends BaseAddon {
84750
85169
  * collection cap. Mirrors the manifest `pages[]` entry — admin-ui's
84751
85170
  * `<AddonPageLoader>` loads `addon_osd_manager_page/page` from
84752
85171
  * `/api/addon-pages/osd-manager/remoteEntry.js`. Modeled directly on
84753
- * `addon-benchmark` / `addon-model-studio` (docs/roadmap.md 4d).
85172
+ * `addon-benchmark` / `addon-model-studio` (former roadmap item 4d).
84754
85173
  */
84755
85174
  pages = [{
84756
85175
  id: "osd-manager",