@camstack/addon-model-studio 1.1.316 → 1.1.318

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 (20) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{MotionZonesSettings-CMwAQd-Y.mjs → MotionZonesSettings-DNN9QEA3.mjs} +2 -2
  3. package/dist/{PrivacyMaskSettings-wx9DyDgK.mjs → PrivacyMaskSettings-CwE32Qhm.mjs} +4 -4
  4. package/dist/{SceneMonitorEditor-jDNxVNGw.mjs → SceneMonitorEditor-SNXiXvXt.mjs} +3 -3
  5. package/dist/_stub.js +1647 -1583
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-P5JTQUjR.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BaMcMPS8.mjs} +3 -3
  7. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D_KssOQn.mjs +26 -0
  8. package/dist/addon-model-studio.css +1 -1
  9. package/dist/{hostInit-DXaNbFAa.mjs → hostInit-C6xHvsEb.mjs} +2 -2
  10. package/dist/model-studio.addon.js +484 -10
  11. package/dist/model-studio.addon.mjs +484 -10
  12. package/dist/{player-overlays-B0MiJ5R6.mjs → player-overlays-BmZ_qrdR.mjs} +1 -1
  13. package/dist/remoteEntry.js +1 -1
  14. package/dist/{responsive-BHzVDMt-.mjs → responsive-Dypi_Y-V.mjs} +1 -1
  15. package/dist/{scene-monitor-copy-CBNkkNvs.mjs → scene-monitor-copy-Bafz9ZMd.mjs} +1 -1
  16. package/dist/{square-SIMvtgyo.mjs → square-BhfFFjT7.mjs} +1 -1
  17. package/dist/{trash-2-CTpwDufe.mjs → trash-2-BAyfEZwH.mjs} +1 -1
  18. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-D6DfHBUW.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DyWlwmuC.mjs} +1 -1
  19. package/package.json +1 -1
  20. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Cxz43vtF.mjs +0 -26
@@ -5816,7 +5816,7 @@ var ZodIssueCode = {
5816
5816
  var ZodFirstPartyTypeKind;
5817
5817
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5818
5818
  //#endregion
5819
- //#region ../types/dist/sleep-BAvUCi_2.mjs
5819
+ //#region ../types/dist/sleep-DJws6ho7.mjs
5820
5820
  /**
5821
5821
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5822
5822
  * window to float samples (D455).
@@ -9090,6 +9090,7 @@ var CAP_NAMES = Object.freeze([
9090
9090
  "recording-onboard",
9091
9091
  "recording-signal",
9092
9092
  "records",
9093
+ "remote",
9093
9094
  "running-state",
9094
9095
  "scene-monitor",
9095
9096
  "script-runner",
@@ -9113,6 +9114,7 @@ var CAP_NAMES = Object.freeze([
9113
9114
  "system",
9114
9115
  "tamper",
9115
9116
  "temperature-sensor",
9117
+ "template",
9116
9118
  "terminal-session",
9117
9119
  "toast",
9118
9120
  "training",
@@ -10053,6 +10055,11 @@ Object.freeze({
10053
10055
  "standby"
10054
10056
  ]
10055
10057
  },
10058
+ {
10059
+ "path": "stateSource",
10060
+ "valueType": "enum",
10061
+ "enumValues": ["reported", "assumed"]
10062
+ },
10056
10063
  {
10057
10064
  "path": "volumeLevel",
10058
10065
  "valueType": "number"
@@ -10328,6 +10335,18 @@ Object.freeze({
10328
10335
  {
10329
10336
  "path": "volume",
10330
10337
  "valueType": "number"
10338
+ },
10339
+ {
10340
+ "path": "lastFeedGrams",
10341
+ "valueType": "number"
10342
+ },
10343
+ {
10344
+ "path": "lastFeedHopper1",
10345
+ "valueType": "number"
10346
+ },
10347
+ {
10348
+ "path": "lastFeedHopper2",
10349
+ "valueType": "number"
10331
10350
  }
10332
10351
  ],
10333
10352
  "power-meter": [
@@ -16785,9 +16804,21 @@ var AlertSeveritySchema = _enum([
16785
16804
  "error",
16786
16805
  "critical"
16787
16806
  ]);
16807
+ /**
16808
+ * An action that RUNS something instead of going somewhere: the admin UI calls
16809
+ * the addon's custom action (`addons.custom`) with exactly these fields. The
16810
+ * producer owns the meaning; the UI knows nothing about the addon or the kind.
16811
+ */
16812
+ var AlertActionInvokeSchema = object({
16813
+ addonId: string().min(1),
16814
+ action: string().min(1),
16815
+ input: record(string(), unknown()).optional()
16816
+ });
16817
+ /** An action has `href` (a link) OR `invoke` (a button that runs a custom action). */
16788
16818
  var AlertActionSchema = object({
16789
16819
  label: string(),
16790
16820
  href: string().optional(),
16821
+ invoke: AlertActionInvokeSchema.optional(),
16791
16822
  /**
16792
16823
  * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
16793
16824
  * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
@@ -57972,6 +58003,318 @@ DeviceType.Light, method(object({
57972
58003
  level: number().min(0).max(100),
57973
58004
  lastChangedAt: number()
57974
58005
  });
58006
+ /**
58007
+ * The role vocabulary of a remote (D963): what a button MEANS, independent of
58008
+ * how it is wired. A layout template places buttons by role; a device binds a
58009
+ * role to an action; an exporter asks for a role by name. Roles are shared so
58010
+ * one layout fits every appliance and one voice command fits every binding.
58011
+ *
58012
+ * A role outside this list is `custom:<key>` — the operator's own button (a
58013
+ * SmartIR source, a channel preset). The key is a lowercase slug.
58014
+ */
58015
+ var REMOTE_KNOWN_ROLES = [
58016
+ "power",
58017
+ "power_on",
58018
+ "power_off",
58019
+ "volume_up",
58020
+ "volume_down",
58021
+ "mute",
58022
+ "channel_up",
58023
+ "channel_down",
58024
+ "up",
58025
+ "down",
58026
+ "left",
58027
+ "right",
58028
+ "ok",
58029
+ "back",
58030
+ "home",
58031
+ "menu",
58032
+ "info",
58033
+ "guide",
58034
+ "exit",
58035
+ "input",
58036
+ "play",
58037
+ "pause",
58038
+ "play_pause",
58039
+ "stop",
58040
+ "next",
58041
+ "previous",
58042
+ "fast_forward",
58043
+ "rewind",
58044
+ "digit_0",
58045
+ "digit_1",
58046
+ "digit_2",
58047
+ "digit_3",
58048
+ "digit_4",
58049
+ "digit_5",
58050
+ "digit_6",
58051
+ "digit_7",
58052
+ "digit_8",
58053
+ "digit_9"
58054
+ ];
58055
+ var CUSTOM_KEY_RE = /^[a-z0-9][a-z0-9_]{0,47}$/;
58056
+ var KNOWN_ROLES = new Set(REMOTE_KNOWN_ROLES);
58057
+ function isRemoteKnownRole(value) {
58058
+ return KNOWN_ROLES.has(value);
58059
+ }
58060
+ function isRemoteCustomKey(key) {
58061
+ return CUSTOM_KEY_RE.test(key);
58062
+ }
58063
+ /** The key of a `custom:<key>` role, or null for any other string. */
58064
+ function customKeyOfRole(role) {
58065
+ if (!role.startsWith("custom:")) return null;
58066
+ const key = role.slice(7);
58067
+ return isRemoteCustomKey(key) ? key : null;
58068
+ }
58069
+ function isRemoteRole(value) {
58070
+ return isRemoteKnownRole(value) || customKeyOfRole(value) !== null;
58071
+ }
58072
+ var RemoteRoleSchema = string().refine(isRemoteRole, { message: "a role is one of the known roles or custom:<key> (lowercase letters, digits, _)" });
58073
+ var RemoteBindingSchema = object({ action: AutomationCapStepSchema.extend({ deviceId: number().int().nonnegative() }) });
58074
+ var RemoteCustomButtonSchema = object({
58075
+ /** The slug after `custom:` in the role. */
58076
+ key: string().refine(isRemoteCustomKey, { message: "a lowercase slug" }),
58077
+ /** What the operator calls it, and what a voice command may name. */
58078
+ name: string().min(1).max(60)
58079
+ });
58080
+ var RemotePowerModeSchema = _enum(["toggle", "discrete"]);
58081
+ var RemoteConfigSchema = object({
58082
+ layoutTemplateId: string().min(1).nullable(),
58083
+ /**
58084
+ * The transmitter device new bindings and an import send through. A binding
58085
+ * names its own device, so one command may override it.
58086
+ */
58087
+ defaultTransmitterId: number().int().nonnegative().nullable().default(null),
58088
+ /** Keyed by role. A role with no entry falls back to the native cap. */
58089
+ bindings: record(string(), RemoteBindingSchema),
58090
+ customButtons: array(RemoteCustomButtonSchema).max(100),
58091
+ power: object({ mode: RemotePowerModeSchema })
58092
+ }).superRefine((config, ctx) => {
58093
+ const roles = Object.keys(config.bindings);
58094
+ if (roles.length > 200) ctx.addIssue({
58095
+ code: "custom",
58096
+ message: "too many bindings",
58097
+ path: ["bindings"]
58098
+ });
58099
+ for (const role of roles) if (!isRemoteRole(role)) ctx.addIssue({
58100
+ code: "custom",
58101
+ message: `"${role}" is not a role`,
58102
+ path: ["bindings", role]
58103
+ });
58104
+ const keys = /* @__PURE__ */ new Set();
58105
+ config.customButtons.forEach((button, index) => {
58106
+ if (keys.has(button.key)) ctx.addIssue({
58107
+ code: "custom",
58108
+ message: `custom button "${button.key}" is listed twice`,
58109
+ path: [
58110
+ "customButtons",
58111
+ index,
58112
+ "key"
58113
+ ]
58114
+ });
58115
+ keys.add(button.key);
58116
+ });
58117
+ for (const role of roles) {
58118
+ const key = customKeyOfRole(role);
58119
+ if (key !== null && !keys.has(key)) ctx.addIssue({
58120
+ code: "custom",
58121
+ message: `${role} is bound but has no entry in customButtons`,
58122
+ path: ["bindings", role]
58123
+ });
58124
+ }
58125
+ });
58126
+ object({
58127
+ power: object({
58128
+ state: _enum(["on", "off"]),
58129
+ at: number()
58130
+ }).nullable(),
58131
+ muted: object({
58132
+ value: boolean(),
58133
+ at: number()
58134
+ }).nullable()
58135
+ });
58136
+ var RemoteLayoutButtonSchema = object({
58137
+ id: string().min(1).max(40),
58138
+ /** 0-based grid position. */
58139
+ row: number().int().min(0).max(24),
58140
+ col: number().int().min(0).max(24),
58141
+ rowSpan: number().int().min(1).max(24),
58142
+ colSpan: number().int().min(1).max(24),
58143
+ icon: string().min(1).max(60).optional(),
58144
+ label: string().min(1).max(40).optional(),
58145
+ role: RemoteRoleSchema
58146
+ });
58147
+ object({
58148
+ columns: number().int().min(1).max(24),
58149
+ rows: number().int().min(1).max(24),
58150
+ buttons: array(RemoteLayoutButtonSchema).max(200)
58151
+ }).superRefine((grid, ctx) => {
58152
+ const ids = /* @__PURE__ */ new Set();
58153
+ const taken = /* @__PURE__ */ new Map();
58154
+ grid.buttons.forEach((button, index) => {
58155
+ if (ids.has(button.id)) ctx.addIssue({
58156
+ code: "custom",
58157
+ message: `button id "${button.id}" is used twice`,
58158
+ path: [
58159
+ "buttons",
58160
+ index,
58161
+ "id"
58162
+ ]
58163
+ });
58164
+ ids.add(button.id);
58165
+ if (button.row + button.rowSpan > grid.rows || button.col + button.colSpan > grid.columns) {
58166
+ ctx.addIssue({
58167
+ code: "custom",
58168
+ message: `button "${button.id}" leaves the grid`,
58169
+ path: ["buttons", index]
58170
+ });
58171
+ return;
58172
+ }
58173
+ for (let r = button.row; r < button.row + button.rowSpan; r += 1) for (let c = button.col; c < button.col + button.colSpan; c += 1) {
58174
+ const cell = `${r}:${c}`;
58175
+ const other = taken.get(cell);
58176
+ if (other !== void 0) {
58177
+ ctx.addIssue({
58178
+ code: "custom",
58179
+ message: `buttons "${other}" and "${button.id}" overlap`,
58180
+ path: ["buttons", index]
58181
+ });
58182
+ return;
58183
+ }
58184
+ taken.set(cell, button.id);
58185
+ }
58186
+ });
58187
+ });
58188
+ var RemoteBoundCommandSchema = object({
58189
+ role: RemoteRoleSchema,
58190
+ /** The operator's name for a custom button; absent for a known role. */
58191
+ label: string().optional(),
58192
+ custom: boolean()
58193
+ });
58194
+ var RemoteCommandListSchema = object({
58195
+ layoutTemplateId: string().nullable(),
58196
+ power: object({ mode: RemotePowerModeSchema }),
58197
+ /** Only the roles that are BOUND — the ones a press can reach. */
58198
+ commands: array(RemoteBoundCommandSchema)
58199
+ });
58200
+ var RemoteRefusalReasonSchema = _enum([
58201
+ "no-remote",
58202
+ "unbound-role",
58203
+ "action-failed"
58204
+ ]);
58205
+ var RemoteSendResultSchema = discriminatedUnion("status", [
58206
+ object({
58207
+ status: literal("sent"),
58208
+ /** How many times the action ran. */
58209
+ sends: number().int().min(1)
58210
+ }),
58211
+ object({
58212
+ status: literal("skipped"),
58213
+ reason: literal("already-in-state")
58214
+ }),
58215
+ object({
58216
+ status: literal("refused"),
58217
+ reason: RemoteRefusalReasonSchema,
58218
+ detail: string().optional()
58219
+ })
58220
+ ]);
58221
+ var RemoteMediaCommandSchema = _enum([
58222
+ "play",
58223
+ "pause",
58224
+ "stop",
58225
+ "next",
58226
+ "previous",
58227
+ "setMute",
58228
+ "selectSource"
58229
+ ]);
58230
+ /** A send result, or `not-routed`: the role is not bound, so the native cap answers. */
58231
+ var RemoteMediaCommandResultSchema = discriminatedUnion("status", [...RemoteSendResultSchema.options, object({ status: literal("not-routed") })]);
58232
+ var RemoteSetConfigResultSchema = discriminatedUnion("status", [object({ status: literal("saved") }), object({
58233
+ status: literal("refused"),
58234
+ reason: _enum(["unknown-template", "not-a-media-player"]),
58235
+ detail: string()
58236
+ })]);
58237
+ var deviceInput = object({ deviceId: number().int().nonnegative() });
58238
+ DeviceType.MediaPlayer;
58239
+ method(deviceInput, RemoteConfigSchema, { auth: "admin" }), method(deviceInput.extend({ config: RemoteConfigSchema }), RemoteSetConfigResultSchema, {
58240
+ kind: "mutation",
58241
+ auth: "admin"
58242
+ }), method(deviceInput, RemoteCommandListSchema, { auth: "protected" }), method(deviceInput.extend({
58243
+ role: RemoteRoleSchema,
58244
+ /** Sends in a row (volume steps). */
58245
+ repeat: number().int().min(1).max(50).default(1)
58246
+ }), RemoteSendResultSchema, {
58247
+ kind: "mutation",
58248
+ auth: "protected"
58249
+ }), method(deviceInput.extend({
58250
+ command: RemoteMediaCommandSchema,
58251
+ muted: boolean().optional(),
58252
+ source: string().optional(),
58253
+ repeat: number().int().min(1).max(50).default(1)
58254
+ }), RemoteMediaCommandResultSchema, {
58255
+ kind: "mutation",
58256
+ auth: "protected"
58257
+ });
58258
+ var TemplateKindSchema = _enum(["remote"]);
58259
+ /**
58260
+ * template — the generic store of reusable, named operator data (D963). A
58261
+ * record is `{ id, kind, name, payload }`; the kinds (today only `remote`, the
58262
+ * button grid of a remote) and the schema each payload must satisfy are
58263
+ * declared by the system in `template-kinds.ts`. Nothing here is specific to a
58264
+ * kind: the engine validates a payload against its kind's schema and, on a
58265
+ * delete, asks the kind's owner whether anything still points at the record.
58266
+ *
58267
+ * Every refusal is a typed result — a UI says "unknown kind" or names the
58268
+ * devices that still use a template, without parsing text.
58269
+ */
58270
+ var TemplateRecordSchema = object({
58271
+ id: string().min(1),
58272
+ kind: TemplateKindSchema,
58273
+ name: string().min(1).max(120),
58274
+ /** Shaped by the kind; `checkTemplatePayload(kind, payload)` reads it. */
58275
+ payload: unknown(),
58276
+ createdAt: number(),
58277
+ updatedAt: number()
58278
+ });
58279
+ var TemplateWriteResultSchema = discriminatedUnion("status", [object({
58280
+ status: literal("saved"),
58281
+ template: TemplateRecordSchema
58282
+ }), object({
58283
+ status: literal("refused"),
58284
+ reason: _enum(["invalid-payload", "not-found"]),
58285
+ detail: string()
58286
+ })]);
58287
+ /** A device still pointing at a template. */
58288
+ var TemplateUserSchema = object({
58289
+ deviceId: number().int().nonnegative(),
58290
+ name: string()
58291
+ });
58292
+ var TemplateDeleteResultSchema = discriminatedUnion("status", [
58293
+ object({ status: literal("deleted") }),
58294
+ object({ status: literal("not-found") }),
58295
+ object({
58296
+ status: literal("in-use"),
58297
+ devices: array(TemplateUserSchema).min(1)
58298
+ })
58299
+ ]);
58300
+ method(object({ kind: TemplateKindSchema.optional() }), array(TemplateRecordSchema), { auth: "protected" }), method(object({ id: string().min(1) }), TemplateRecordSchema.nullable(), { auth: "protected" }), method(object({
58301
+ kind: TemplateKindSchema,
58302
+ name: string().min(1).max(120),
58303
+ payload: unknown()
58304
+ }), TemplateWriteResultSchema, {
58305
+ kind: "mutation",
58306
+ auth: "admin"
58307
+ }), method(object({
58308
+ id: string().min(1),
58309
+ name: string().min(1).max(120).optional(),
58310
+ payload: unknown().optional()
58311
+ }), TemplateWriteResultSchema, {
58312
+ kind: "mutation",
58313
+ auth: "admin"
58314
+ }), method(object({ id: string().min(1) }), TemplateDeleteResultSchema, {
58315
+ kind: "mutation",
58316
+ auth: "admin"
58317
+ });
57975
58318
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
57976
58319
  kind: "mutation",
57977
58320
  auth: "protected"
@@ -60721,9 +61064,35 @@ var MediaInfoSchema = object({
60721
61064
  /** Optional cover-art / thumbnail URL. */
60722
61065
  imageUrl: string().optional()
60723
61066
  });
61067
+ /**
61068
+ * Where `state`, `volumeLevel`, `isMuted` and `source` come from. `reported`:
61069
+ * the device said so. `assumed`: the driver has no feedback (infrared) and
61070
+ * tracks what it last SENT; it moves only after a send was accepted, and a
61071
+ * human at the real remote makes it wrong. A UI shows an assumed value as a
61072
+ * guess, never as a reading.
61073
+ */
61074
+ var MediaPlayerStateSourceSchema = _enum(["reported", "assumed"]);
61075
+ /** The fields of a media-player status a driver can only guess. */
61076
+ var MediaPlayerAssumedFieldSchema = _enum([
61077
+ "state",
61078
+ "volumeLevel",
61079
+ "isMuted",
61080
+ "source"
61081
+ ]);
60724
61082
  object({
60725
61083
  /** Playback lifecycle state. */
60726
61084
  state: MediaPlayerStateSchema,
61085
+ /**
61086
+ * Whether the state fields are readings or the driver's own bookkeeping.
61087
+ * A slice written before this field existed parses as `reported`.
61088
+ */
61089
+ stateSource: MediaPlayerStateSourceSchema.default("reported"),
61090
+ /**
61091
+ * Which fields are the driver's own guess. `stateSource` is `assumed` when
61092
+ * this is not empty; a field not listed here is a reading even then (power
61093
+ * from a running-state source, mute guessed from the last send).
61094
+ */
61095
+ assumedFields: array(MediaPlayerAssumedFieldSchema).default([]),
60727
61096
  /** Volume as 0..100 inclusive. Null when the device has no volume
60728
61097
  * surface. Pair with `DeviceFeature.MediaPlayerVolume`. */
60729
61098
  volumeLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -62164,6 +62533,14 @@ object({
62164
62533
  feedSound: boolean(),
62165
62534
  /** Speaker / prompt volume level (device-scaled integer). */
62166
62535
  volume: number().meta(readingMeta("none")),
62536
+ /** Portion (grams) of the last manual feed sent from a single-hopper
62537
+ * stepper — the default the next manual feed starts from. Persisted per
62538
+ * device by the provider; null until a manual feed has been sent. */
62539
+ lastFeedGrams: gramsPortion.nullable(),
62540
+ /** Hopper-1 portion of the last manual feed (dual-hopper); null until sent. */
62541
+ lastFeedHopper1: gramsPortion.nullable(),
62542
+ /** Hopper-2 portion of the last manual feed (dual-hopper); null until sent. */
62543
+ lastFeedHopper2: gramsPortion.nullable(),
62167
62544
  /** Ms epoch when the slice was last refreshed from the cloud. */
62168
62545
  lastFetchedAt: number()
62169
62546
  });
@@ -66805,9 +67182,17 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
66805
67182
  kind: "mutation",
66806
67183
  auth: "admin"
66807
67184
  });
67185
+ discriminatedUnion("kind", [object({
67186
+ kind: literal("raw"),
67187
+ timings: array(number().int()),
67188
+ settings: TransmitSettingsSchema.optional()
67189
+ }), object({
67190
+ kind: literal("pronto"),
67191
+ code: string()
67192
+ })]);
66808
67193
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
66809
67194
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
66810
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
67195
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
66811
67196
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
66812
67197
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
66813
67198
  new Set(CAP_NAMES);
@@ -74647,6 +75032,41 @@ Object.freeze({
74647
75032
  access: "create",
74648
75033
  role: "admin"
74649
75034
  },
75035
+ "remote.getConfig": {
75036
+ capName: "remote",
75037
+ capScope: "system",
75038
+ addonId: null,
75039
+ access: "view",
75040
+ role: "admin"
75041
+ },
75042
+ "remote.listCommands": {
75043
+ capName: "remote",
75044
+ capScope: "system",
75045
+ addonId: null,
75046
+ access: "view",
75047
+ role: "admin"
75048
+ },
75049
+ "remote.sendCommand": {
75050
+ capName: "remote",
75051
+ capScope: "system",
75052
+ addonId: null,
75053
+ access: "create",
75054
+ role: "admin"
75055
+ },
75056
+ "remote.sendMediaCommand": {
75057
+ capName: "remote",
75058
+ capScope: "system",
75059
+ addonId: null,
75060
+ access: "create",
75061
+ role: "admin"
75062
+ },
75063
+ "remote.setConfig": {
75064
+ capName: "remote",
75065
+ capScope: "system",
75066
+ addonId: null,
75067
+ access: "create",
75068
+ role: "admin"
75069
+ },
74650
75070
  "runningState.getStatus": {
74651
75071
  capName: "running-state",
74652
75072
  capScope: "device",
@@ -75837,6 +76257,41 @@ Object.freeze({
75837
76257
  access: "view",
75838
76258
  role: "viewer"
75839
76259
  },
76260
+ "template.create": {
76261
+ capName: "template",
76262
+ capScope: "system",
76263
+ addonId: null,
76264
+ access: "create",
76265
+ role: "admin"
76266
+ },
76267
+ "template.delete": {
76268
+ capName: "template",
76269
+ capScope: "system",
76270
+ addonId: null,
76271
+ access: "delete",
76272
+ role: "admin"
76273
+ },
76274
+ "template.get": {
76275
+ capName: "template",
76276
+ capScope: "system",
76277
+ addonId: null,
76278
+ access: "view",
76279
+ role: "admin"
76280
+ },
76281
+ "template.list": {
76282
+ capName: "template",
76283
+ capScope: "system",
76284
+ addonId: null,
76285
+ access: "view",
76286
+ role: "admin"
76287
+ },
76288
+ "template.update": {
76289
+ capName: "template",
76290
+ capScope: "system",
76291
+ addonId: null,
76292
+ access: "create",
76293
+ role: "admin"
76294
+ },
75840
76295
  "terminalSession.adoptLegacyMonitor": {
75841
76296
  capName: "terminal-session",
75842
76297
  capScope: "system",
@@ -80668,6 +81123,7 @@ var SYSTEM_CAP_VOCABULARY = {
80668
81123
  "recording-archive": system(STORAGE),
80669
81124
  "recording-export": system("recording exports — requested from the timeline, not an automation step"),
80670
81125
  records: system(INTERNAL),
81126
+ remote: system("the per-device remote setup — authored in the Customize remote editor, sent through the remote UI"),
80671
81127
  "server-management": system(CLUSTER),
80672
81128
  "settings-store": system(INTERNAL),
80673
81129
  "smtp-provider": system(INTERNAL),
@@ -80680,6 +81136,7 @@ var SYSTEM_CAP_VOCABULARY = {
80680
81136
  "storage-provider": system(STORAGE),
80681
81137
  "stream-broker": system(PIPELINE),
80682
81138
  system: system(CLUSTER),
81139
+ template: system("operator-authored templates — edited in their own editor, never actuated"),
80683
81140
  "terminal-session": system(CLUSTER),
80684
81141
  toast: system(UI_PLUMBING),
80685
81142
  training: system(ML),
@@ -83106,6 +83563,31 @@ Object.freeze({
83106
83563
  form: "single",
83107
83564
  optional: true
83108
83565
  }],
83566
+ "remote.getConfig": [{
83567
+ name: "deviceId",
83568
+ form: "single",
83569
+ optional: false
83570
+ }],
83571
+ "remote.listCommands": [{
83572
+ name: "deviceId",
83573
+ form: "single",
83574
+ optional: false
83575
+ }],
83576
+ "remote.sendCommand": [{
83577
+ name: "deviceId",
83578
+ form: "single",
83579
+ optional: false
83580
+ }],
83581
+ "remote.sendMediaCommand": [{
83582
+ name: "deviceId",
83583
+ form: "single",
83584
+ optional: false
83585
+ }],
83586
+ "remote.setConfig": [{
83587
+ name: "deviceId",
83588
+ form: "single",
83589
+ optional: false
83590
+ }],
83109
83591
  "runningState.getStatus": [{
83110
83592
  name: "deviceId",
83111
83593
  form: "single",
@@ -84914,14 +85396,6 @@ DEFAULT_NATIVE_LEASE_SETTINGS.admission;
84914
85396
  String.raw`(?<=^|["'(\s>,\[{])`;
84915
85397
  var MB = 1024 * 1024;
84916
85398
  1024 * MB, 3072 * MB;
84917
- discriminatedUnion("kind", [object({
84918
- kind: literal("raw"),
84919
- timings: array(number().int()),
84920
- settings: TransmitSettingsSchema.optional()
84921
- }), object({
84922
- kind: literal("pronto"),
84923
- code: string()
84924
- })]);
84925
85399
  object({
84926
85400
  manufacturer: string().optional(),
84927
85401
  supportedModels: array(string()).optional(),
@@ -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 { _ as s, g as c } from "./responsive-BHzVDMt-.mjs";
3
+ import { _ as s, g as c } from "./responsive-Dypi_Y-V.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-D6DfHBUW.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DyWlwmuC.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 { S as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Cxz43vtF.mjs";
3
+ import { S as u } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D_KssOQn.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,7 +1,7 @@
1
1
  import { S as e, g as t, l as n, u as r, v as i } 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
3
  import { n as a } from "./ui-text-BqZa5BNK.mjs";
4
- import { _ as o, g as s } from "./responsive-BHzVDMt-.mjs";
4
+ import { _ as o, g as s } from "./responsive-Dypi_Y-V.mjs";
5
5
  var c = o("camera", [["path", {
6
6
  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",
7
7
  key: "18u6gg"
@@ -1,4 +1,4 @@
1
- import { _ as e } from "./responsive-BHzVDMt-.mjs";
1
+ import { _ as e } from "./responsive-Dypi_Y-V.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { _ as e } from "./responsive-BHzVDMt-.mjs";
1
+ import { _ as e } from "./responsive-Dypi_Y-V.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-P5JTQUjR.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BaMcMPS8.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.1.316",
3
+ "version": "1.1.318",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",