@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.
- package/CHANGELOG.md +12 -0
- package/dist/{MotionZonesSettings-CMwAQd-Y.mjs → MotionZonesSettings-DNN9QEA3.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-wx9DyDgK.mjs → PrivacyMaskSettings-CwE32Qhm.mjs} +4 -4
- package/dist/{SceneMonitorEditor-jDNxVNGw.mjs → SceneMonitorEditor-SNXiXvXt.mjs} +3 -3
- package/dist/_stub.js +1647 -1583
- 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
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D_KssOQn.mjs +26 -0
- package/dist/addon-model-studio.css +1 -1
- package/dist/{hostInit-DXaNbFAa.mjs → hostInit-C6xHvsEb.mjs} +2 -2
- package/dist/model-studio.addon.js +484 -10
- package/dist/model-studio.addon.mjs +484 -10
- package/dist/{player-overlays-B0MiJ5R6.mjs → player-overlays-BmZ_qrdR.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-BHzVDMt-.mjs → responsive-Dypi_Y-V.mjs} +1 -1
- package/dist/{scene-monitor-copy-CBNkkNvs.mjs → scene-monitor-copy-Bafz9ZMd.mjs} +1 -1
- package/dist/{square-SIMvtgyo.mjs → square-BhfFFjT7.mjs} +1 -1
- package/dist/{trash-2-CTpwDufe.mjs → trash-2-BAyfEZwH.mjs} +1 -1
- 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
- package/package.json +1 -1
- 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-
|
|
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-
|
|
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"
|
package/dist/remoteEntry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-
|
|
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-
|
|
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-
|
|
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"
|
|
@@ -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-
|
|
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
|
}
|