@camstack/addon-training 0.1.102 → 0.1.104

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 (23) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{MotionZonesSettings-HAJ6awj4.mjs → MotionZonesSettings-Bm3-aVd_.mjs} +2 -2
  3. package/dist/{PrivacyMaskSettings-BF0NUmVm.mjs → PrivacyMaskSettings-CHKqJ1Jl.mjs} +2 -2
  4. package/dist/{SceneMonitorEditor-CeEWTp0p.mjs → SceneMonitorEditor-BLeDd1kR.mjs} +2 -2
  5. package/dist/_stub.js +1726 -1662
  6. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-p2vBd39W.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-DsiAbTAk.mjs} +3 -3
  7. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-rtY7yvpT.mjs +26 -0
  8. package/dist/addon-training.css +1 -1
  9. package/dist/{dist-u3tq3l-n.mjs → dist-CXZDrfkr.mjs} +484 -10
  10. package/dist/{dist-CNkCexYe.js → dist-DkRYepCT.js} +484 -10
  11. package/dist/{hostInit-CvBrePIu.mjs → hostInit-CkFf4SAO.mjs} +2 -2
  12. package/dist/index.js +1 -1
  13. package/dist/orchestrator/training.addon.js +1 -1
  14. package/dist/orchestrator/training.addon.mjs +1 -1
  15. package/dist/{player-overlays-NVql0bBe.mjs → player-overlays-DxLTXMBd.mjs} +1 -1
  16. package/dist/providers/modal/training-modal.addon.js +1 -1
  17. package/dist/providers/modal/training-modal.addon.mjs +1 -1
  18. package/dist/remoteEntry.js +1 -1
  19. package/dist/{responsive-Cw10UV1G.mjs → responsive-1P4H2DQA.mjs} +1 -1
  20. package/dist/{scene-monitor-copy-BiaQA_PZ.mjs → scene-monitor-copy-DmazWKcQ.mjs} +1 -1
  21. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-B2ShwDvL.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BBdigjaL.mjs} +1 -1
  22. package/package.json +1 -1
  23. package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CLeWJI6-.mjs +0 -26
@@ -5613,7 +5613,7 @@ var ZodIssueCode = {
5613
5613
  var ZodFirstPartyTypeKind;
5614
5614
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5615
5615
  //#endregion
5616
- //#region ../types/dist/sleep-BAvUCi_2.mjs
5616
+ //#region ../types/dist/sleep-DJws6ho7.mjs
5617
5617
  /**
5618
5618
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5619
5619
  * window to float samples (D455).
@@ -9054,6 +9054,7 @@ var CAP_NAMES = Object.freeze([
9054
9054
  "recording-onboard",
9055
9055
  "recording-signal",
9056
9056
  "records",
9057
+ "remote",
9057
9058
  "running-state",
9058
9059
  "scene-monitor",
9059
9060
  "script-runner",
@@ -9077,6 +9078,7 @@ var CAP_NAMES = Object.freeze([
9077
9078
  "system",
9078
9079
  "tamper",
9079
9080
  "temperature-sensor",
9081
+ "template",
9080
9082
  "terminal-session",
9081
9083
  "toast",
9082
9084
  "training",
@@ -10017,6 +10019,11 @@ Object.freeze({
10017
10019
  "standby"
10018
10020
  ]
10019
10021
  },
10022
+ {
10023
+ "path": "stateSource",
10024
+ "valueType": "enum",
10025
+ "enumValues": ["reported", "assumed"]
10026
+ },
10020
10027
  {
10021
10028
  "path": "volumeLevel",
10022
10029
  "valueType": "number"
@@ -10292,6 +10299,18 @@ Object.freeze({
10292
10299
  {
10293
10300
  "path": "volume",
10294
10301
  "valueType": "number"
10302
+ },
10303
+ {
10304
+ "path": "lastFeedGrams",
10305
+ "valueType": "number"
10306
+ },
10307
+ {
10308
+ "path": "lastFeedHopper1",
10309
+ "valueType": "number"
10310
+ },
10311
+ {
10312
+ "path": "lastFeedHopper2",
10313
+ "valueType": "number"
10295
10314
  }
10296
10315
  ],
10297
10316
  "power-meter": [
@@ -16628,9 +16647,21 @@ var AlertSeveritySchema = _enum([
16628
16647
  "error",
16629
16648
  "critical"
16630
16649
  ]);
16650
+ /**
16651
+ * An action that RUNS something instead of going somewhere: the admin UI calls
16652
+ * the addon's custom action (`addons.custom`) with exactly these fields. The
16653
+ * producer owns the meaning; the UI knows nothing about the addon or the kind.
16654
+ */
16655
+ var AlertActionInvokeSchema = object({
16656
+ addonId: string().min(1),
16657
+ action: string().min(1),
16658
+ input: record(string(), unknown()).optional()
16659
+ });
16660
+ /** An action has `href` (a link) OR `invoke` (a button that runs a custom action). */
16631
16661
  var AlertActionSchema = object({
16632
16662
  label: string(),
16633
16663
  href: string().optional(),
16664
+ invoke: AlertActionInvokeSchema.optional(),
16634
16665
  /**
16635
16666
  * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
16636
16667
  * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
@@ -57781,6 +57812,318 @@ DeviceType.Light, method(object({
57781
57812
  level: number().min(0).max(100),
57782
57813
  lastChangedAt: number()
57783
57814
  });
57815
+ /**
57816
+ * The role vocabulary of a remote (D963): what a button MEANS, independent of
57817
+ * how it is wired. A layout template places buttons by role; a device binds a
57818
+ * role to an action; an exporter asks for a role by name. Roles are shared so
57819
+ * one layout fits every appliance and one voice command fits every binding.
57820
+ *
57821
+ * A role outside this list is `custom:<key>` — the operator's own button (a
57822
+ * SmartIR source, a channel preset). The key is a lowercase slug.
57823
+ */
57824
+ var REMOTE_KNOWN_ROLES = [
57825
+ "power",
57826
+ "power_on",
57827
+ "power_off",
57828
+ "volume_up",
57829
+ "volume_down",
57830
+ "mute",
57831
+ "channel_up",
57832
+ "channel_down",
57833
+ "up",
57834
+ "down",
57835
+ "left",
57836
+ "right",
57837
+ "ok",
57838
+ "back",
57839
+ "home",
57840
+ "menu",
57841
+ "info",
57842
+ "guide",
57843
+ "exit",
57844
+ "input",
57845
+ "play",
57846
+ "pause",
57847
+ "play_pause",
57848
+ "stop",
57849
+ "next",
57850
+ "previous",
57851
+ "fast_forward",
57852
+ "rewind",
57853
+ "digit_0",
57854
+ "digit_1",
57855
+ "digit_2",
57856
+ "digit_3",
57857
+ "digit_4",
57858
+ "digit_5",
57859
+ "digit_6",
57860
+ "digit_7",
57861
+ "digit_8",
57862
+ "digit_9"
57863
+ ];
57864
+ var CUSTOM_KEY_RE = /^[a-z0-9][a-z0-9_]{0,47}$/;
57865
+ var KNOWN_ROLES = new Set(REMOTE_KNOWN_ROLES);
57866
+ function isRemoteKnownRole(value) {
57867
+ return KNOWN_ROLES.has(value);
57868
+ }
57869
+ function isRemoteCustomKey(key) {
57870
+ return CUSTOM_KEY_RE.test(key);
57871
+ }
57872
+ /** The key of a `custom:<key>` role, or null for any other string. */
57873
+ function customKeyOfRole(role) {
57874
+ if (!role.startsWith("custom:")) return null;
57875
+ const key = role.slice(7);
57876
+ return isRemoteCustomKey(key) ? key : null;
57877
+ }
57878
+ function isRemoteRole(value) {
57879
+ return isRemoteKnownRole(value) || customKeyOfRole(value) !== null;
57880
+ }
57881
+ var RemoteRoleSchema = string().refine(isRemoteRole, { message: "a role is one of the known roles or custom:<key> (lowercase letters, digits, _)" });
57882
+ var RemoteBindingSchema = object({ action: AutomationCapStepSchema.extend({ deviceId: number().int().nonnegative() }) });
57883
+ var RemoteCustomButtonSchema = object({
57884
+ /** The slug after `custom:` in the role. */
57885
+ key: string().refine(isRemoteCustomKey, { message: "a lowercase slug" }),
57886
+ /** What the operator calls it, and what a voice command may name. */
57887
+ name: string().min(1).max(60)
57888
+ });
57889
+ var RemotePowerModeSchema = _enum(["toggle", "discrete"]);
57890
+ var RemoteConfigSchema = object({
57891
+ layoutTemplateId: string().min(1).nullable(),
57892
+ /**
57893
+ * The transmitter device new bindings and an import send through. A binding
57894
+ * names its own device, so one command may override it.
57895
+ */
57896
+ defaultTransmitterId: number().int().nonnegative().nullable().default(null),
57897
+ /** Keyed by role. A role with no entry falls back to the native cap. */
57898
+ bindings: record(string(), RemoteBindingSchema),
57899
+ customButtons: array(RemoteCustomButtonSchema).max(100),
57900
+ power: object({ mode: RemotePowerModeSchema })
57901
+ }).superRefine((config, ctx) => {
57902
+ const roles = Object.keys(config.bindings);
57903
+ if (roles.length > 200) ctx.addIssue({
57904
+ code: "custom",
57905
+ message: "too many bindings",
57906
+ path: ["bindings"]
57907
+ });
57908
+ for (const role of roles) if (!isRemoteRole(role)) ctx.addIssue({
57909
+ code: "custom",
57910
+ message: `"${role}" is not a role`,
57911
+ path: ["bindings", role]
57912
+ });
57913
+ const keys = /* @__PURE__ */ new Set();
57914
+ config.customButtons.forEach((button, index) => {
57915
+ if (keys.has(button.key)) ctx.addIssue({
57916
+ code: "custom",
57917
+ message: `custom button "${button.key}" is listed twice`,
57918
+ path: [
57919
+ "customButtons",
57920
+ index,
57921
+ "key"
57922
+ ]
57923
+ });
57924
+ keys.add(button.key);
57925
+ });
57926
+ for (const role of roles) {
57927
+ const key = customKeyOfRole(role);
57928
+ if (key !== null && !keys.has(key)) ctx.addIssue({
57929
+ code: "custom",
57930
+ message: `${role} is bound but has no entry in customButtons`,
57931
+ path: ["bindings", role]
57932
+ });
57933
+ }
57934
+ });
57935
+ object({
57936
+ power: object({
57937
+ state: _enum(["on", "off"]),
57938
+ at: number()
57939
+ }).nullable(),
57940
+ muted: object({
57941
+ value: boolean(),
57942
+ at: number()
57943
+ }).nullable()
57944
+ });
57945
+ var RemoteLayoutButtonSchema = object({
57946
+ id: string().min(1).max(40),
57947
+ /** 0-based grid position. */
57948
+ row: number().int().min(0).max(24),
57949
+ col: number().int().min(0).max(24),
57950
+ rowSpan: number().int().min(1).max(24),
57951
+ colSpan: number().int().min(1).max(24),
57952
+ icon: string().min(1).max(60).optional(),
57953
+ label: string().min(1).max(40).optional(),
57954
+ role: RemoteRoleSchema
57955
+ });
57956
+ object({
57957
+ columns: number().int().min(1).max(24),
57958
+ rows: number().int().min(1).max(24),
57959
+ buttons: array(RemoteLayoutButtonSchema).max(200)
57960
+ }).superRefine((grid, ctx) => {
57961
+ const ids = /* @__PURE__ */ new Set();
57962
+ const taken = /* @__PURE__ */ new Map();
57963
+ grid.buttons.forEach((button, index) => {
57964
+ if (ids.has(button.id)) ctx.addIssue({
57965
+ code: "custom",
57966
+ message: `button id "${button.id}" is used twice`,
57967
+ path: [
57968
+ "buttons",
57969
+ index,
57970
+ "id"
57971
+ ]
57972
+ });
57973
+ ids.add(button.id);
57974
+ if (button.row + button.rowSpan > grid.rows || button.col + button.colSpan > grid.columns) {
57975
+ ctx.addIssue({
57976
+ code: "custom",
57977
+ message: `button "${button.id}" leaves the grid`,
57978
+ path: ["buttons", index]
57979
+ });
57980
+ return;
57981
+ }
57982
+ for (let r = button.row; r < button.row + button.rowSpan; r += 1) for (let c = button.col; c < button.col + button.colSpan; c += 1) {
57983
+ const cell = `${r}:${c}`;
57984
+ const other = taken.get(cell);
57985
+ if (other !== void 0) {
57986
+ ctx.addIssue({
57987
+ code: "custom",
57988
+ message: `buttons "${other}" and "${button.id}" overlap`,
57989
+ path: ["buttons", index]
57990
+ });
57991
+ return;
57992
+ }
57993
+ taken.set(cell, button.id);
57994
+ }
57995
+ });
57996
+ });
57997
+ var RemoteBoundCommandSchema = object({
57998
+ role: RemoteRoleSchema,
57999
+ /** The operator's name for a custom button; absent for a known role. */
58000
+ label: string().optional(),
58001
+ custom: boolean()
58002
+ });
58003
+ var RemoteCommandListSchema = object({
58004
+ layoutTemplateId: string().nullable(),
58005
+ power: object({ mode: RemotePowerModeSchema }),
58006
+ /** Only the roles that are BOUND — the ones a press can reach. */
58007
+ commands: array(RemoteBoundCommandSchema)
58008
+ });
58009
+ var RemoteRefusalReasonSchema = _enum([
58010
+ "no-remote",
58011
+ "unbound-role",
58012
+ "action-failed"
58013
+ ]);
58014
+ var RemoteSendResultSchema = discriminatedUnion("status", [
58015
+ object({
58016
+ status: literal("sent"),
58017
+ /** How many times the action ran. */
58018
+ sends: number().int().min(1)
58019
+ }),
58020
+ object({
58021
+ status: literal("skipped"),
58022
+ reason: literal("already-in-state")
58023
+ }),
58024
+ object({
58025
+ status: literal("refused"),
58026
+ reason: RemoteRefusalReasonSchema,
58027
+ detail: string().optional()
58028
+ })
58029
+ ]);
58030
+ var RemoteMediaCommandSchema = _enum([
58031
+ "play",
58032
+ "pause",
58033
+ "stop",
58034
+ "next",
58035
+ "previous",
58036
+ "setMute",
58037
+ "selectSource"
58038
+ ]);
58039
+ /** A send result, or `not-routed`: the role is not bound, so the native cap answers. */
58040
+ var RemoteMediaCommandResultSchema = discriminatedUnion("status", [...RemoteSendResultSchema.options, object({ status: literal("not-routed") })]);
58041
+ var RemoteSetConfigResultSchema = discriminatedUnion("status", [object({ status: literal("saved") }), object({
58042
+ status: literal("refused"),
58043
+ reason: _enum(["unknown-template", "not-a-media-player"]),
58044
+ detail: string()
58045
+ })]);
58046
+ var deviceInput = object({ deviceId: number().int().nonnegative() });
58047
+ DeviceType.MediaPlayer;
58048
+ method(deviceInput, RemoteConfigSchema, { auth: "admin" }), method(deviceInput.extend({ config: RemoteConfigSchema }), RemoteSetConfigResultSchema, {
58049
+ kind: "mutation",
58050
+ auth: "admin"
58051
+ }), method(deviceInput, RemoteCommandListSchema, { auth: "protected" }), method(deviceInput.extend({
58052
+ role: RemoteRoleSchema,
58053
+ /** Sends in a row (volume steps). */
58054
+ repeat: number().int().min(1).max(50).default(1)
58055
+ }), RemoteSendResultSchema, {
58056
+ kind: "mutation",
58057
+ auth: "protected"
58058
+ }), method(deviceInput.extend({
58059
+ command: RemoteMediaCommandSchema,
58060
+ muted: boolean().optional(),
58061
+ source: string().optional(),
58062
+ repeat: number().int().min(1).max(50).default(1)
58063
+ }), RemoteMediaCommandResultSchema, {
58064
+ kind: "mutation",
58065
+ auth: "protected"
58066
+ });
58067
+ var TemplateKindSchema = _enum(["remote"]);
58068
+ /**
58069
+ * template — the generic store of reusable, named operator data (D963). A
58070
+ * record is `{ id, kind, name, payload }`; the kinds (today only `remote`, the
58071
+ * button grid of a remote) and the schema each payload must satisfy are
58072
+ * declared by the system in `template-kinds.ts`. Nothing here is specific to a
58073
+ * kind: the engine validates a payload against its kind's schema and, on a
58074
+ * delete, asks the kind's owner whether anything still points at the record.
58075
+ *
58076
+ * Every refusal is a typed result — a UI says "unknown kind" or names the
58077
+ * devices that still use a template, without parsing text.
58078
+ */
58079
+ var TemplateRecordSchema = object({
58080
+ id: string().min(1),
58081
+ kind: TemplateKindSchema,
58082
+ name: string().min(1).max(120),
58083
+ /** Shaped by the kind; `checkTemplatePayload(kind, payload)` reads it. */
58084
+ payload: unknown(),
58085
+ createdAt: number(),
58086
+ updatedAt: number()
58087
+ });
58088
+ var TemplateWriteResultSchema = discriminatedUnion("status", [object({
58089
+ status: literal("saved"),
58090
+ template: TemplateRecordSchema
58091
+ }), object({
58092
+ status: literal("refused"),
58093
+ reason: _enum(["invalid-payload", "not-found"]),
58094
+ detail: string()
58095
+ })]);
58096
+ /** A device still pointing at a template. */
58097
+ var TemplateUserSchema = object({
58098
+ deviceId: number().int().nonnegative(),
58099
+ name: string()
58100
+ });
58101
+ var TemplateDeleteResultSchema = discriminatedUnion("status", [
58102
+ object({ status: literal("deleted") }),
58103
+ object({ status: literal("not-found") }),
58104
+ object({
58105
+ status: literal("in-use"),
58106
+ devices: array(TemplateUserSchema).min(1)
58107
+ })
58108
+ ]);
58109
+ method(object({ kind: TemplateKindSchema.optional() }), array(TemplateRecordSchema), { auth: "protected" }), method(object({ id: string().min(1) }), TemplateRecordSchema.nullable(), { auth: "protected" }), method(object({
58110
+ kind: TemplateKindSchema,
58111
+ name: string().min(1).max(120),
58112
+ payload: unknown()
58113
+ }), TemplateWriteResultSchema, {
58114
+ kind: "mutation",
58115
+ auth: "admin"
58116
+ }), method(object({
58117
+ id: string().min(1),
58118
+ name: string().min(1).max(120).optional(),
58119
+ payload: unknown().optional()
58120
+ }), TemplateWriteResultSchema, {
58121
+ kind: "mutation",
58122
+ auth: "admin"
58123
+ }), method(object({ id: string().min(1) }), TemplateDeleteResultSchema, {
58124
+ kind: "mutation",
58125
+ auth: "admin"
58126
+ });
57784
58127
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
57785
58128
  kind: "mutation",
57786
58129
  auth: "protected"
@@ -60530,9 +60873,35 @@ var MediaInfoSchema = object({
60530
60873
  /** Optional cover-art / thumbnail URL. */
60531
60874
  imageUrl: string().optional()
60532
60875
  });
60876
+ /**
60877
+ * Where `state`, `volumeLevel`, `isMuted` and `source` come from. `reported`:
60878
+ * the device said so. `assumed`: the driver has no feedback (infrared) and
60879
+ * tracks what it last SENT; it moves only after a send was accepted, and a
60880
+ * human at the real remote makes it wrong. A UI shows an assumed value as a
60881
+ * guess, never as a reading.
60882
+ */
60883
+ var MediaPlayerStateSourceSchema = _enum(["reported", "assumed"]);
60884
+ /** The fields of a media-player status a driver can only guess. */
60885
+ var MediaPlayerAssumedFieldSchema = _enum([
60886
+ "state",
60887
+ "volumeLevel",
60888
+ "isMuted",
60889
+ "source"
60890
+ ]);
60533
60891
  object({
60534
60892
  /** Playback lifecycle state. */
60535
60893
  state: MediaPlayerStateSchema,
60894
+ /**
60895
+ * Whether the state fields are readings or the driver's own bookkeeping.
60896
+ * A slice written before this field existed parses as `reported`.
60897
+ */
60898
+ stateSource: MediaPlayerStateSourceSchema.default("reported"),
60899
+ /**
60900
+ * Which fields are the driver's own guess. `stateSource` is `assumed` when
60901
+ * this is not empty; a field not listed here is a reading even then (power
60902
+ * from a running-state source, mute guessed from the last send).
60903
+ */
60904
+ assumedFields: array(MediaPlayerAssumedFieldSchema).default([]),
60536
60905
  /** Volume as 0..100 inclusive. Null when the device has no volume
60537
60906
  * surface. Pair with `DeviceFeature.MediaPlayerVolume`. */
60538
60907
  volumeLevel: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
@@ -61973,6 +62342,14 @@ object({
61973
62342
  feedSound: boolean(),
61974
62343
  /** Speaker / prompt volume level (device-scaled integer). */
61975
62344
  volume: number().meta(readingMeta("none")),
62345
+ /** Portion (grams) of the last manual feed sent from a single-hopper
62346
+ * stepper — the default the next manual feed starts from. Persisted per
62347
+ * device by the provider; null until a manual feed has been sent. */
62348
+ lastFeedGrams: gramsPortion.nullable(),
62349
+ /** Hopper-1 portion of the last manual feed (dual-hopper); null until sent. */
62350
+ lastFeedHopper1: gramsPortion.nullable(),
62351
+ /** Hopper-2 portion of the last manual feed (dual-hopper); null until sent. */
62352
+ lastFeedHopper2: gramsPortion.nullable(),
61976
62353
  /** Ms epoch when the slice was last refreshed from the cloud. */
61977
62354
  lastFetchedAt: number()
61978
62355
  });
@@ -66716,9 +67093,17 @@ var trainingCapability = {
66716
67093
  })
66717
67094
  }
66718
67095
  };
67096
+ discriminatedUnion("kind", [object({
67097
+ kind: literal("raw"),
67098
+ timings: array(number().int()),
67099
+ settings: TransmitSettingsSchema.optional()
67100
+ }), object({
67101
+ kind: literal("pronto"),
67102
+ code: string()
67103
+ })]);
66719
67104
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
66720
67105
  SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
66721
- 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;
67106
+ 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;
66722
67107
  String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
66723
67108
  DeviceRole.BinarySensor, DeviceRole.MotionSensor;
66724
67109
  new Set(CAP_NAMES);
@@ -74460,6 +74845,41 @@ Object.freeze({
74460
74845
  access: "create",
74461
74846
  role: "admin"
74462
74847
  },
74848
+ "remote.getConfig": {
74849
+ capName: "remote",
74850
+ capScope: "system",
74851
+ addonId: null,
74852
+ access: "view",
74853
+ role: "admin"
74854
+ },
74855
+ "remote.listCommands": {
74856
+ capName: "remote",
74857
+ capScope: "system",
74858
+ addonId: null,
74859
+ access: "view",
74860
+ role: "admin"
74861
+ },
74862
+ "remote.sendCommand": {
74863
+ capName: "remote",
74864
+ capScope: "system",
74865
+ addonId: null,
74866
+ access: "create",
74867
+ role: "admin"
74868
+ },
74869
+ "remote.sendMediaCommand": {
74870
+ capName: "remote",
74871
+ capScope: "system",
74872
+ addonId: null,
74873
+ access: "create",
74874
+ role: "admin"
74875
+ },
74876
+ "remote.setConfig": {
74877
+ capName: "remote",
74878
+ capScope: "system",
74879
+ addonId: null,
74880
+ access: "create",
74881
+ role: "admin"
74882
+ },
74463
74883
  "runningState.getStatus": {
74464
74884
  capName: "running-state",
74465
74885
  capScope: "device",
@@ -75650,6 +76070,41 @@ Object.freeze({
75650
76070
  access: "view",
75651
76071
  role: "viewer"
75652
76072
  },
76073
+ "template.create": {
76074
+ capName: "template",
76075
+ capScope: "system",
76076
+ addonId: null,
76077
+ access: "create",
76078
+ role: "admin"
76079
+ },
76080
+ "template.delete": {
76081
+ capName: "template",
76082
+ capScope: "system",
76083
+ addonId: null,
76084
+ access: "delete",
76085
+ role: "admin"
76086
+ },
76087
+ "template.get": {
76088
+ capName: "template",
76089
+ capScope: "system",
76090
+ addonId: null,
76091
+ access: "view",
76092
+ role: "admin"
76093
+ },
76094
+ "template.list": {
76095
+ capName: "template",
76096
+ capScope: "system",
76097
+ addonId: null,
76098
+ access: "view",
76099
+ role: "admin"
76100
+ },
76101
+ "template.update": {
76102
+ capName: "template",
76103
+ capScope: "system",
76104
+ addonId: null,
76105
+ access: "create",
76106
+ role: "admin"
76107
+ },
75653
76108
  "terminalSession.adoptLegacyMonitor": {
75654
76109
  capName: "terminal-session",
75655
76110
  capScope: "system",
@@ -80481,6 +80936,7 @@ var SYSTEM_CAP_VOCABULARY = {
80481
80936
  "recording-archive": system(STORAGE),
80482
80937
  "recording-export": system("recording exports — requested from the timeline, not an automation step"),
80483
80938
  records: system(INTERNAL),
80939
+ remote: system("the per-device remote setup — authored in the Customize remote editor, sent through the remote UI"),
80484
80940
  "server-management": system(CLUSTER),
80485
80941
  "settings-store": system(INTERNAL),
80486
80942
  "smtp-provider": system(INTERNAL),
@@ -80493,6 +80949,7 @@ var SYSTEM_CAP_VOCABULARY = {
80493
80949
  "storage-provider": system(STORAGE),
80494
80950
  "stream-broker": system(PIPELINE),
80495
80951
  system: system(CLUSTER),
80952
+ template: system("operator-authored templates — edited in their own editor, never actuated"),
80496
80953
  "terminal-session": system(CLUSTER),
80497
80954
  toast: system(UI_PLUMBING),
80498
80955
  training: system(ML),
@@ -82919,6 +83376,31 @@ Object.freeze({
82919
83376
  form: "single",
82920
83377
  optional: true
82921
83378
  }],
83379
+ "remote.getConfig": [{
83380
+ name: "deviceId",
83381
+ form: "single",
83382
+ optional: false
83383
+ }],
83384
+ "remote.listCommands": [{
83385
+ name: "deviceId",
83386
+ form: "single",
83387
+ optional: false
83388
+ }],
83389
+ "remote.sendCommand": [{
83390
+ name: "deviceId",
83391
+ form: "single",
83392
+ optional: false
83393
+ }],
83394
+ "remote.sendMediaCommand": [{
83395
+ name: "deviceId",
83396
+ form: "single",
83397
+ optional: false
83398
+ }],
83399
+ "remote.setConfig": [{
83400
+ name: "deviceId",
83401
+ form: "single",
83402
+ optional: false
83403
+ }],
82922
83404
  "runningState.getStatus": [{
82923
83405
  name: "deviceId",
82924
83406
  form: "single",
@@ -84727,14 +85209,6 @@ DEFAULT_NATIVE_LEASE_SETTINGS.admission;
84727
85209
  String.raw`(?<=^|["'(\s>,\[{])`;
84728
85210
  var MB = 1024 * 1024;
84729
85211
  1024 * MB, 3072 * MB;
84730
- discriminatedUnion("kind", [object({
84731
- kind: literal("raw"),
84732
- timings: array(number().int()),
84733
- settings: TransmitSettingsSchema.optional()
84734
- }), object({
84735
- kind: literal("pronto"),
84736
- code: string()
84737
- })]);
84738
85212
  object({
84739
85213
  manufacturer: string().optional(),
84740
85214
  supportedModels: array(string()).optional(),
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.438",
39
+ version: "1.2.441",
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.346",
84
+ version: "1.2.348",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./dist-CNkCexYe.js");
2
+ require("./dist-DkRYepCT.js");
3
3
  const require_orchestrator_training_addon = require("./orchestrator/training.addon.js");
4
4
  const require_providers_modal_training_modal_addon = require("./providers/modal/training-modal.addon.js");
5
5
  //#region src/providers/fake/fake-provider.ts
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-CNkCexYe.js");
2
+ const require_dist = require("../dist-DkRYepCT.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-u3tq3l-n.mjs";
1
+ import { a as addonPagesSourceCapability, i as TrainingResultSchema, l as BaseAddon, m as defineRecordKinds, n as TrainingJobSchema, o as parseTrainingEventLine, r as TrainingJobSpecSchema, s as trainingCapability, t as TRAINING_JOB_SCHEMA, u as RECORD_MAX_DATA_BYTES } from "../dist-CXZDrfkr.mjs";
2
2
  import path from "node:path";
3
3
  import { createHash } from "node:crypto";
4
4
  import { createReadStream } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import { d as e, u as t, w as n, y as r } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react__loadShare__.js-CEvdvp1T.mjs";
2
2
  import { n as i, r as a, t as o } from "./_virtual_mf___mfe_internal__addon_training_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DnrbBvrw.mjs";
3
3
  import { n as s, t as c } from "./chevron-right-cA8Hucbi.mjs";
4
- import { g as l } from "./responsive-Cw10UV1G.mjs";
4
+ import { g as l } from "./responsive-1P4H2DQA.mjs";
5
5
  //#region ../ui-library/src/composites/widget-panel.tsx
6
6
  n();
7
7
  function u({ title: e, icon: t, headerRight: n, collapsible: l = !1, defaultOpen: u = !0, open: d, onOpenChange: f, bodyClassName: p = "p-3", children: m }) {
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../../dist-CNkCexYe.js");
2
+ const require_dist = require("../../dist-DkRYepCT.js");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
5
5
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-u3tq3l-n.mjs";
1
+ import { C as record, S as object, _ as isSecretClear, b as boolean, c as trainingProviderCapability, d as SECRET_CLEAR, f as arrayItemFieldPath, g as globalSecretScope, h as entryBody, l as BaseAddon, p as defineEntryKind, v as isSecretMarker, w as string, x as number, y as toSecretFieldView } from "../../dist-CXZDrfkr.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import path, { dirname, posix } from "node:path";
4
4
  import { createHash, createPrivateKey, createPublicKey, createSign, randomBytes, randomUUID } from "node:crypto";
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-B2ShwDvL.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BBdigjaL.mjs";
2
2
  export { t as get, e as init };