@camstack/addon-model-studio 1.1.308 → 1.1.310
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-DkgjOPCB.mjs → MotionZonesSettings-DmT3_5uL.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-fESQpFIS.mjs → PrivacyMaskSettings-DUvJko35.mjs} +4 -4
- package/dist/{SceneMonitorEditor-C9B7EixP.mjs → SceneMonitorEditor-BVMxs7LB.mjs} +3 -3
- package/dist/_stub.js +1700 -1728
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-DHIXnmpZ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BUDlZg-M.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DhQKnJ3x.mjs +26 -0
- package/dist/addon-model-studio.css +1 -1
- package/dist/{hostInit-sbd7BJLf.mjs → hostInit-DlOqhXnD.mjs} +2 -2
- package/dist/model-studio.addon.js +675 -75
- package/dist/model-studio.addon.mjs +675 -75
- package/dist/{player-overlays-SAR77Y-f.mjs → player-overlays-UNmRn2Lm.mjs} +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-DhsW4w_p.mjs → responsive-DpFvXEzP.mjs} +1 -1
- package/dist/{scene-monitor-copy-BYVAve5e.mjs → scene-monitor-copy-55pWpNVH.mjs} +1 -1
- package/dist/{square-Dy3-P6UW.mjs → square-C3qrCBUt.mjs} +1 -1
- package/dist/{trash-2-DScdmxQC.mjs → trash-2-g3e9eqho.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CqZcfvB1.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-B1TWKKP3.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-BQQ1gj_P.mjs +0 -26
|
@@ -368,7 +368,7 @@ function buildPluginCatalogRegistryDescriptor(entry) {
|
|
|
368
368
|
};
|
|
369
369
|
}
|
|
370
370
|
//#endregion
|
|
371
|
-
//#region ../types/dist/event-category-
|
|
371
|
+
//#region ../types/dist/event-category-hdMR7CTW.mjs
|
|
372
372
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
373
373
|
EventCategory["SystemBoot"] = "system.boot";
|
|
374
374
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -1133,6 +1133,11 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
1133
1133
|
*/
|
|
1134
1134
|
EventCategory["AccessoriesChanged"] = "accessories.onAccessoriesChanged";
|
|
1135
1135
|
/**
|
|
1136
|
+
* An action run started or ended. Emitted by the `actions` surface.
|
|
1137
|
+
* Payload: `ActionRunChanged` (`{ actionId, runId, isRunning, outcome?, lastRunAt, lastError }`).
|
|
1138
|
+
*/
|
|
1139
|
+
EventCategory["ActionsRunChanged"] = "actions.onRunChanged";
|
|
1140
|
+
/**
|
|
1136
1141
|
* Progress update from a running model conversion job.
|
|
1137
1142
|
* Payload: `{ kind: 'model-convert', phase, sessionId?, pct?, detail? }`.
|
|
1138
1143
|
* Emitted by `addon-model-studio` on the converting node.
|
|
@@ -5811,7 +5816,7 @@ var ZodIssueCode = {
|
|
|
5811
5816
|
var ZodFirstPartyTypeKind;
|
|
5812
5817
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5813
5818
|
//#endregion
|
|
5814
|
-
//#region ../types/dist/sleep
|
|
5819
|
+
//#region ../types/dist/sleep-BHjNez61.mjs
|
|
5815
5820
|
/**
|
|
5816
5821
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5817
5822
|
* window to float samples (D455).
|
|
@@ -8941,6 +8946,8 @@ Object.freeze({ "doorbell": "lastPressedAt" });
|
|
|
8941
8946
|
/** Every capability name, so addon code can check a name without the schema graph. */
|
|
8942
8947
|
var CAP_NAMES = Object.freeze([
|
|
8943
8948
|
"accessories",
|
|
8949
|
+
"action-source",
|
|
8950
|
+
"actions",
|
|
8944
8951
|
"addon-pages",
|
|
8945
8952
|
"addon-pages-source",
|
|
8946
8953
|
"addon-routes",
|
|
@@ -10243,6 +10250,18 @@ Object.freeze({
|
|
|
10243
10250
|
"path": "foodLevel",
|
|
10244
10251
|
"valueType": "number"
|
|
10245
10252
|
},
|
|
10253
|
+
{
|
|
10254
|
+
"path": "bowlFood",
|
|
10255
|
+
"valueType": "number"
|
|
10256
|
+
},
|
|
10257
|
+
{
|
|
10258
|
+
"path": "eating",
|
|
10259
|
+
"valueType": "boolean"
|
|
10260
|
+
},
|
|
10261
|
+
{
|
|
10262
|
+
"path": "supportsMarkRefilled",
|
|
10263
|
+
"valueType": "boolean"
|
|
10264
|
+
},
|
|
10246
10265
|
{
|
|
10247
10266
|
"path": "food1",
|
|
10248
10267
|
"valueType": "number"
|
|
@@ -15928,7 +15947,23 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
|
|
|
15928
15947
|
kind: literal("schedule"),
|
|
15929
15948
|
cron: string().min(1).max(120)
|
|
15930
15949
|
}),
|
|
15931
|
-
object({ kind: literal("manual") })
|
|
15950
|
+
object({ kind: literal("manual") }),
|
|
15951
|
+
object({
|
|
15952
|
+
kind: literal("detection"),
|
|
15953
|
+
/** Class names. A macro class (`animal`, `vehicle`, `person`, `package`)
|
|
15954
|
+
* matches every raw class that maps to it; any other name matches
|
|
15955
|
+
* exactly. */
|
|
15956
|
+
classes: array(string().min(1)).min(1),
|
|
15957
|
+
deviceIds: array(number().int().nonnegative()).min(1),
|
|
15958
|
+
/** The track must have visited at least one of these zones. */
|
|
15959
|
+
zones: array(string().min(1)).min(1).optional(),
|
|
15960
|
+
/** Best-so-far confidence the track must reach. */
|
|
15961
|
+
minScore: number().min(0).max(1).optional()
|
|
15962
|
+
}),
|
|
15963
|
+
object({
|
|
15964
|
+
kind: literal("interval"),
|
|
15965
|
+
minutes: number().int().min(1).max(1440)
|
|
15966
|
+
})
|
|
15932
15967
|
]);
|
|
15933
15968
|
/**
|
|
15934
15969
|
* One action step.
|
|
@@ -15948,28 +15983,47 @@ var AutomationTriggerSchema = discriminatedUnion("kind", [
|
|
|
15948
15983
|
* is called. The runner still receives a number and is untouched; the
|
|
15949
15984
|
* resolution is the recipe's job, not the runner's.
|
|
15950
15985
|
*/
|
|
15986
|
+
var AutomationWaitStepSchema = object({
|
|
15987
|
+
kind: literal("wait"),
|
|
15988
|
+
seconds: number().min(0).max(300)
|
|
15989
|
+
});
|
|
15990
|
+
var AutomationCapStepSchema = object({
|
|
15991
|
+
kind: literal("cap"),
|
|
15992
|
+
/**
|
|
15993
|
+
* One device, several same-family devices (locks / climate family / …),
|
|
15994
|
+
* or `{ $var }` for the device that triggered the run. An array is
|
|
15995
|
+
* fan-out at codegen — each id gets the same cap.method call.
|
|
15996
|
+
*/
|
|
15997
|
+
deviceId: union([
|
|
15998
|
+
number().int(),
|
|
15999
|
+
array(number().int()).min(1),
|
|
16000
|
+
object({ $var: string().min(1) })
|
|
16001
|
+
]),
|
|
16002
|
+
cap: string().min(1),
|
|
16003
|
+
method: string().min(1),
|
|
16004
|
+
/** Values may carry `{{vars.x}}` slots, or be exactly `{ $var: 'name' }`, which
|
|
16005
|
+
* SUBSTITUTE and do not evaluate (§3.2.3). Anything beyond substitution is
|
|
16006
|
+
* the expression leaf. */
|
|
16007
|
+
args: record(string(), unknown()).optional()
|
|
16008
|
+
});
|
|
16009
|
+
/**
|
|
16010
|
+
* The steps an internal Action may contain: cap and wait, and nothing that can
|
|
16011
|
+
* call back into an Action — so an Action can never reach itself (no cycles).
|
|
16012
|
+
*/
|
|
16013
|
+
var ActionStepSchema = discriminatedUnion("kind", [AutomationWaitStepSchema, AutomationCapStepSchema]);
|
|
15951
16014
|
var AutomationActionSchema = discriminatedUnion("kind", [
|
|
16015
|
+
AutomationWaitStepSchema,
|
|
16016
|
+
AutomationCapStepSchema,
|
|
15952
16017
|
object({
|
|
15953
|
-
kind: literal("
|
|
15954
|
-
|
|
15955
|
-
|
|
15956
|
-
|
|
15957
|
-
|
|
15958
|
-
|
|
15959
|
-
|
|
15960
|
-
|
|
15961
|
-
|
|
15962
|
-
*/
|
|
15963
|
-
deviceId: union([
|
|
15964
|
-
number().int(),
|
|
15965
|
-
array(number().int()).min(1),
|
|
15966
|
-
object({ $var: string().min(1) })
|
|
15967
|
-
]),
|
|
15968
|
-
cap: string().min(1),
|
|
15969
|
-
method: string().min(1),
|
|
15970
|
-
/** Values may carry `{{vars.x}}` slots, which SUBSTITUTE and do not
|
|
15971
|
-
* evaluate (§3.2.3). Anything beyond substitution is the expression leaf. */
|
|
15972
|
-
args: record(string(), unknown()).optional()
|
|
16018
|
+
kind: literal("action"),
|
|
16019
|
+
/** An entry of the `actions` surface (`internal:<uuid>` or `<addonId>:<localId>`). */
|
|
16020
|
+
actionId: string().min(1),
|
|
16021
|
+
/** Values for the action's declared variables; the others take their default. */
|
|
16022
|
+
variables: record(string(), union([
|
|
16023
|
+
string(),
|
|
16024
|
+
number(),
|
|
16025
|
+
boolean()
|
|
16026
|
+
])).optional()
|
|
15973
16027
|
}),
|
|
15974
16028
|
object({
|
|
15975
16029
|
kind: literal("code"),
|
|
@@ -15978,10 +16032,356 @@ var AutomationActionSchema = discriminatedUnion("kind", [
|
|
|
15978
16032
|
code: string().min(1).max(2e4)
|
|
15979
16033
|
})
|
|
15980
16034
|
]);
|
|
16035
|
+
/**
|
|
16036
|
+
* How a trigger that arrives while the automation is busy (or cooling down) is
|
|
16037
|
+
* handled. One of the automation's execution modes, never a property of its
|
|
16038
|
+
* actions. Absent means `single`.
|
|
16039
|
+
*
|
|
16040
|
+
* - `single` — drop the trigger while a run is in progress (traced + logged).
|
|
16041
|
+
* - `restart` — abort the run in progress (at its next step boundary), start fresh.
|
|
16042
|
+
* - `queued` — queue up to `max` triggers, drop the rest (traced).
|
|
16043
|
+
* - `parallel` — up to `max` runs at once, drop the rest (traced).
|
|
16044
|
+
* - `cooldown` — `single`, and no new run until `minutes` after the last run
|
|
16045
|
+
* STARTED; persisted across a restart. A manual trigger bypasses only this
|
|
16046
|
+
* wait, never the single/queued limits.
|
|
16047
|
+
*/
|
|
16048
|
+
var AutomationRunModeSchema = discriminatedUnion("mode", [
|
|
16049
|
+
object({ mode: literal("single") }),
|
|
16050
|
+
object({ mode: literal("restart") }),
|
|
16051
|
+
object({
|
|
16052
|
+
mode: literal("queued"),
|
|
16053
|
+
max: number().int().min(1).max(10)
|
|
16054
|
+
}),
|
|
16055
|
+
object({
|
|
16056
|
+
mode: literal("parallel"),
|
|
16057
|
+
max: number().int().min(1).max(10)
|
|
16058
|
+
}),
|
|
16059
|
+
object({
|
|
16060
|
+
mode: literal("cooldown"),
|
|
16061
|
+
minutes: number().int().min(1).max(1440)
|
|
16062
|
+
})
|
|
16063
|
+
]);
|
|
15981
16064
|
var AutomationRecipeSchema = object({
|
|
15982
16065
|
triggers: array(AutomationTriggerSchema),
|
|
15983
16066
|
conditions: AutomationConditionSchema.optional(),
|
|
15984
|
-
actions: array(AutomationActionSchema)
|
|
16067
|
+
actions: array(AutomationActionSchema),
|
|
16068
|
+
runMode: AutomationRunModeSchema.optional(),
|
|
16069
|
+
/** How many run traces the automation keeps (default {@link DEFAULT_TRACE_KEEP}). */
|
|
16070
|
+
keepTraces: number().int().min(1).max(100).optional()
|
|
16071
|
+
});
|
|
16072
|
+
new Set([
|
|
16073
|
+
{
|
|
16074
|
+
id: "person",
|
|
16075
|
+
name: "Person"
|
|
16076
|
+
},
|
|
16077
|
+
{
|
|
16078
|
+
id: "vehicle",
|
|
16079
|
+
name: "Vehicle"
|
|
16080
|
+
},
|
|
16081
|
+
{
|
|
16082
|
+
id: "animal",
|
|
16083
|
+
name: "Animal"
|
|
16084
|
+
},
|
|
16085
|
+
{
|
|
16086
|
+
id: "package",
|
|
16087
|
+
name: "Package"
|
|
16088
|
+
}
|
|
16089
|
+
].map((l) => l.id));
|
|
16090
|
+
var COCO_TO_MACRO = {
|
|
16091
|
+
mapping: {
|
|
16092
|
+
person: "person",
|
|
16093
|
+
bicycle: "vehicle",
|
|
16094
|
+
car: "vehicle",
|
|
16095
|
+
motorcycle: "vehicle",
|
|
16096
|
+
airplane: "vehicle",
|
|
16097
|
+
bus: "vehicle",
|
|
16098
|
+
train: "vehicle",
|
|
16099
|
+
truck: "vehicle",
|
|
16100
|
+
boat: "vehicle",
|
|
16101
|
+
bird: "animal",
|
|
16102
|
+
cat: "animal",
|
|
16103
|
+
dog: "animal",
|
|
16104
|
+
horse: "animal",
|
|
16105
|
+
sheep: "animal",
|
|
16106
|
+
cow: "animal",
|
|
16107
|
+
elephant: "animal",
|
|
16108
|
+
bear: "animal",
|
|
16109
|
+
zebra: "animal",
|
|
16110
|
+
giraffe: "animal",
|
|
16111
|
+
suitcase: "package",
|
|
16112
|
+
backpack: "package",
|
|
16113
|
+
handbag: "package"
|
|
16114
|
+
},
|
|
16115
|
+
preserveOriginal: false
|
|
16116
|
+
};
|
|
16117
|
+
new Set(Object.values(COCO_TO_MACRO.mapping));
|
|
16118
|
+
/**
|
|
16119
|
+
* Run traces — what an automation (or, later, an Action run) DID, node by node,
|
|
16120
|
+
* so the editor can paint every block green or red with its reason.
|
|
16121
|
+
*
|
|
16122
|
+
* A trace is data, not a log: it covers the WHOLE tree — the trigger stage,
|
|
16123
|
+
* every condition node (containers and leaves, including the ones a
|
|
16124
|
+
* short-circuit never reached), the run-mode verdict and every action step —
|
|
16125
|
+
* each addressed by a stable path (`conditions.0.1`, `actions.2`, or `steps.N`
|
|
16126
|
+
* for an Action run). Skipped
|
|
16127
|
+
* evaluations are traced too, and identical consecutive skips collapse into a
|
|
16128
|
+
* repeat count so a trigger that fails every 5 minutes cannot flush real runs.
|
|
16129
|
+
*
|
|
16130
|
+
* {@link AutomationStepTraceSchema} is deliberately free of automation
|
|
16131
|
+
* vocabulary so an Action run records the same step shape.
|
|
16132
|
+
*/
|
|
16133
|
+
/** A value a trace may show: JSON primitives and short lists, nothing deeper. */
|
|
16134
|
+
var TraceValueSchema = union([
|
|
16135
|
+
string(),
|
|
16136
|
+
number(),
|
|
16137
|
+
boolean(),
|
|
16138
|
+
_null(),
|
|
16139
|
+
array(union([string(), number()]))
|
|
16140
|
+
]);
|
|
16141
|
+
var AutomationRunOutcomeSchema = _enum([
|
|
16142
|
+
"ran",
|
|
16143
|
+
"skipped-trigger",
|
|
16144
|
+
"skipped-conditions",
|
|
16145
|
+
"skipped-cooldown",
|
|
16146
|
+
"skipped-overlap",
|
|
16147
|
+
"failed",
|
|
16148
|
+
"aborted"
|
|
16149
|
+
]);
|
|
16150
|
+
/** `not-evaluated` = a short-circuit never reached the node. */
|
|
16151
|
+
var TraceNodeOutcomeSchema = _enum([
|
|
16152
|
+
"pass",
|
|
16153
|
+
"fail",
|
|
16154
|
+
"not-evaluated"
|
|
16155
|
+
]);
|
|
16156
|
+
var AutomationTriggerTraceSchema = object({
|
|
16157
|
+
kind: string().min(1),
|
|
16158
|
+
outcome: _enum(["pass", "fail"]),
|
|
16159
|
+
/** Why an event was rejected ("class person not in [dog]") or what fired. */
|
|
16160
|
+
reason: string(),
|
|
16161
|
+
/** deviceId, className, trackId, score … — only what the trigger exposes. */
|
|
16162
|
+
vars: record(string(), TraceValueSchema)
|
|
16163
|
+
});
|
|
16164
|
+
var AutomationConditionTraceNodeSchema = object({
|
|
16165
|
+
/** `conditions` for the root, `conditions.<i>` for its i-th child, … */
|
|
16166
|
+
path: string().min(1),
|
|
16167
|
+
kind: _enum([
|
|
16168
|
+
"all",
|
|
16169
|
+
"any",
|
|
16170
|
+
"not",
|
|
16171
|
+
"condition",
|
|
16172
|
+
"expression"
|
|
16173
|
+
]),
|
|
16174
|
+
outcome: TraceNodeOutcomeSchema,
|
|
16175
|
+
reason: string(),
|
|
16176
|
+
deviceId: number().int().optional(),
|
|
16177
|
+
cap: string().optional(),
|
|
16178
|
+
fieldPath: string().optional(),
|
|
16179
|
+
operator: string().optional(),
|
|
16180
|
+
expected: TraceValueSchema.optional(),
|
|
16181
|
+
/** What the mirror held; `null` when it held nothing (unknown). */
|
|
16182
|
+
observed: TraceValueSchema.optional()
|
|
16183
|
+
});
|
|
16184
|
+
var AutomationRunVerdictSchema = object({
|
|
16185
|
+
mode: AutomationRunModeSchema,
|
|
16186
|
+
decision: _enum([
|
|
16187
|
+
"run",
|
|
16188
|
+
"queued",
|
|
16189
|
+
"restart",
|
|
16190
|
+
"drop",
|
|
16191
|
+
"cooldown",
|
|
16192
|
+
"bypass"
|
|
16193
|
+
]),
|
|
16194
|
+
reason: string()
|
|
16195
|
+
});
|
|
16196
|
+
/** One executed (or not-run) step — shared by automations and Action runs. */
|
|
16197
|
+
var AutomationStepTraceSchema = object({
|
|
16198
|
+
/** `actions.<i>` */
|
|
16199
|
+
path: string().min(1),
|
|
16200
|
+
kind: string().min(1),
|
|
16201
|
+
cap: string().optional(),
|
|
16202
|
+
method: string().optional(),
|
|
16203
|
+
deviceId: number().int().optional(),
|
|
16204
|
+
startedAt: number().optional(),
|
|
16205
|
+
endedAt: number().optional(),
|
|
16206
|
+
outcome: _enum([
|
|
16207
|
+
"ok",
|
|
16208
|
+
"error",
|
|
16209
|
+
"not-run"
|
|
16210
|
+
]),
|
|
16211
|
+
message: string().optional()
|
|
16212
|
+
});
|
|
16213
|
+
var AutomationRunTraceSchema = object({
|
|
16214
|
+
runId: string().min(1),
|
|
16215
|
+
startedAt: number(),
|
|
16216
|
+
endedAt: number(),
|
|
16217
|
+
trigger: AutomationTriggerTraceSchema,
|
|
16218
|
+
conditions: array(AutomationConditionTraceNodeSchema),
|
|
16219
|
+
verdict: AutomationRunVerdictSchema.optional(),
|
|
16220
|
+
steps: array(AutomationStepTraceSchema),
|
|
16221
|
+
outcome: AutomationRunOutcomeSchema,
|
|
16222
|
+
/** How many identical consecutive skips this trace stands for (>= 1). */
|
|
16223
|
+
repeat: number().int().min(1),
|
|
16224
|
+
/** When the latest of those repeats happened. */
|
|
16225
|
+
lastAt: number()
|
|
16226
|
+
});
|
|
16227
|
+
/**
|
|
16228
|
+
* What the hub's `runs` ledger holds for one owner (`automation:<blockId>` or
|
|
16229
|
+
* `action:<actionId>`): the cooldown stamp and the trace ring.
|
|
16230
|
+
*/
|
|
16231
|
+
var AutomationStateDocSchema = object({
|
|
16232
|
+
version: literal(1),
|
|
16233
|
+
lastRunStartedAt: number().nullable(),
|
|
16234
|
+
traces: array(AutomationRunTraceSchema)
|
|
16235
|
+
});
|
|
16236
|
+
/**
|
|
16237
|
+
* Actions — named, runnable things an operator (or an automation) can start,
|
|
16238
|
+
* declared as LIST ENTRIES, never as devices.
|
|
16239
|
+
*
|
|
16240
|
+
* An entry is either **internal** (a short list of cap/wait steps kept in the
|
|
16241
|
+
* hub's `actions` record kind) or declared by an addon through the
|
|
16242
|
+
* `action-source` collection (a Home Assistant script, a scene …). The one
|
|
16243
|
+
* surface the UI and automations talk to is the `actions` cap; it keeps no
|
|
16244
|
+
* catalog of its own (D3) — every `list` asks the providers live.
|
|
16245
|
+
*
|
|
16246
|
+
* This file is the data half: the entry schema, the variables an entry may
|
|
16247
|
+
* declare, and the pure resolution of the values a run was given. It holds no
|
|
16248
|
+
* runtime.
|
|
16249
|
+
*/
|
|
16250
|
+
/** What a variable's value is. `select` takes one of `options`. */
|
|
16251
|
+
var ActionVariableTypeSchema = _enum([
|
|
16252
|
+
"string",
|
|
16253
|
+
"number",
|
|
16254
|
+
"boolean",
|
|
16255
|
+
"select"
|
|
16256
|
+
]);
|
|
16257
|
+
var ACTION_VARIABLE_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
16258
|
+
var ActionVariableValueSchema = union([
|
|
16259
|
+
string(),
|
|
16260
|
+
number(),
|
|
16261
|
+
boolean()
|
|
16262
|
+
]);
|
|
16263
|
+
/**
|
|
16264
|
+
* One declared variable. Steps reference it as `{ $var: 'name' }` (the whole
|
|
16265
|
+
* value) or `{{vars.name}}` (inside a string) in their args.
|
|
16266
|
+
*/
|
|
16267
|
+
var ActionVariableSchema = object({
|
|
16268
|
+
name: string().regex(ACTION_VARIABLE_NAME_RE),
|
|
16269
|
+
label: string().min(1).max(120).optional(),
|
|
16270
|
+
type: ActionVariableTypeSchema,
|
|
16271
|
+
required: boolean().optional(),
|
|
16272
|
+
default: ActionVariableValueSchema.optional(),
|
|
16273
|
+
/** The allowed values of a `select`. */
|
|
16274
|
+
options: array(string().min(1)).min(1).optional()
|
|
16275
|
+
}).superRefine((v, ctx) => {
|
|
16276
|
+
if (v.type === "select" && v.options === void 0) ctx.addIssue({
|
|
16277
|
+
code: "custom",
|
|
16278
|
+
message: "a select variable needs options",
|
|
16279
|
+
path: ["options"]
|
|
16280
|
+
});
|
|
16281
|
+
if (v.default !== void 0 && variableValueError(v, v.default) !== null) ctx.addIssue({
|
|
16282
|
+
code: "custom",
|
|
16283
|
+
message: variableValueError(v, v.default) ?? "invalid default",
|
|
16284
|
+
path: ["default"]
|
|
16285
|
+
});
|
|
16286
|
+
});
|
|
16287
|
+
/** Why `value` is not a legal value for the variable, or null when it is. */
|
|
16288
|
+
function variableValueError(variable, value) {
|
|
16289
|
+
switch (variable.type) {
|
|
16290
|
+
case "string": return typeof value === "string" ? null : `variable "${variable.name}" must be a string`;
|
|
16291
|
+
case "number": return typeof value === "number" && Number.isFinite(value) ? null : `variable "${variable.name}" must be a number`;
|
|
16292
|
+
case "boolean": return typeof value === "boolean" ? null : `variable "${variable.name}" must be true or false`;
|
|
16293
|
+
case "select": return typeof value === "string" && (variable.options ?? []).includes(value) ? null : `variable "${variable.name}" must be one of ${(variable.options ?? []).join(", ")}`;
|
|
16294
|
+
}
|
|
16295
|
+
}
|
|
16296
|
+
var ActionSourceKindSchema = _enum(["internal", "addon"]);
|
|
16297
|
+
function isInternalActionId(actionId) {
|
|
16298
|
+
return actionId.startsWith("internal:") && actionId.length > 9;
|
|
16299
|
+
}
|
|
16300
|
+
/** The addon behind a `<addonId>:<localId>` id, or null for anything else (internal included). */
|
|
16301
|
+
function addonIdOfActionId(actionId) {
|
|
16302
|
+
if (isInternalActionId(actionId)) return null;
|
|
16303
|
+
const at = actionId.indexOf(":");
|
|
16304
|
+
return at > 0 && at < actionId.length - 1 ? actionId.slice(0, at) : null;
|
|
16305
|
+
}
|
|
16306
|
+
var ActionStatusSchema = object({
|
|
16307
|
+
isRunning: boolean(),
|
|
16308
|
+
/** Ms epoch the latest run STARTED; null when it never ran. */
|
|
16309
|
+
lastRunAt: number().nullable(),
|
|
16310
|
+
/** The latest run's failure; null on success or when it never ran. */
|
|
16311
|
+
lastError: string().nullable()
|
|
16312
|
+
});
|
|
16313
|
+
var ActionEntrySchema = object({
|
|
16314
|
+
/** `internal:<uuid>` or `<addonId>:<localId>`. */
|
|
16315
|
+
id: string().min(3),
|
|
16316
|
+
name: string().min(1).max(120),
|
|
16317
|
+
/** The addon that declared it; `core-blocks` for an internal one. */
|
|
16318
|
+
addonId: string().min(1),
|
|
16319
|
+
source: ActionSourceKindSchema,
|
|
16320
|
+
/** An addon-declared entry is edited where it was declared. */
|
|
16321
|
+
readOnly: boolean(),
|
|
16322
|
+
/** Internal only: cap and wait steps. No action-in-action, so no cycles. */
|
|
16323
|
+
steps: array(ActionStepSchema).min(1).max(50).optional(),
|
|
16324
|
+
variables: array(ActionVariableSchema).max(20).optional(),
|
|
16325
|
+
status: ActionStatusSchema
|
|
16326
|
+
}).superRefine((entry, ctx) => {
|
|
16327
|
+
if (entry.source === "internal") {
|
|
16328
|
+
if (!isInternalActionId(entry.id)) ctx.addIssue({
|
|
16329
|
+
code: "custom",
|
|
16330
|
+
message: "an internal action id is internal:<uuid>",
|
|
16331
|
+
path: ["id"]
|
|
16332
|
+
});
|
|
16333
|
+
return;
|
|
16334
|
+
}
|
|
16335
|
+
if (entry.steps !== void 0) ctx.addIssue({
|
|
16336
|
+
code: "custom",
|
|
16337
|
+
message: "only an internal action carries steps",
|
|
16338
|
+
path: ["steps"]
|
|
16339
|
+
});
|
|
16340
|
+
if (!entry.readOnly) ctx.addIssue({
|
|
16341
|
+
code: "custom",
|
|
16342
|
+
message: "an addon action is read-only here",
|
|
16343
|
+
path: ["readOnly"]
|
|
16344
|
+
});
|
|
16345
|
+
if (addonIdOfActionId(entry.id) === null) ctx.addIssue({
|
|
16346
|
+
code: "custom",
|
|
16347
|
+
message: "an addon action id is <addonId>:<localId>",
|
|
16348
|
+
path: ["id"]
|
|
16349
|
+
});
|
|
16350
|
+
});
|
|
16351
|
+
/** What an operator writes for an internal action. */
|
|
16352
|
+
var ActionInputSchema = object({
|
|
16353
|
+
name: string().min(1).max(120),
|
|
16354
|
+
steps: array(ActionStepSchema).min(1).max(50),
|
|
16355
|
+
variables: array(ActionVariableSchema).max(20).optional()
|
|
16356
|
+
});
|
|
16357
|
+
/** Who started a run. Absent = the operator pressed it. */
|
|
16358
|
+
var ActionRunOriginSchema = object({
|
|
16359
|
+
/** The automation block whose step started it. */
|
|
16360
|
+
blockId: string().min(1).optional() });
|
|
16361
|
+
/** `started` = the caller did not ask to wait. */
|
|
16362
|
+
var ActionRunOutcomeSchema = union([AutomationRunOutcomeSchema, literal("started")]);
|
|
16363
|
+
var ActionRunResultSchema = object({
|
|
16364
|
+
runId: string().min(1),
|
|
16365
|
+
outcome: ActionRunOutcomeSchema,
|
|
16366
|
+
/** Why it did not run, or what failed. */
|
|
16367
|
+
message: string().optional()
|
|
16368
|
+
});
|
|
16369
|
+
_enum([
|
|
16370
|
+
"not-found",
|
|
16371
|
+
"read-only",
|
|
16372
|
+
"invalid-variables",
|
|
16373
|
+
"invalid-steps",
|
|
16374
|
+
"not-linked",
|
|
16375
|
+
"busy"
|
|
16376
|
+
]);
|
|
16377
|
+
object({
|
|
16378
|
+
actionId: string(),
|
|
16379
|
+
runId: string(),
|
|
16380
|
+
isRunning: boolean(),
|
|
16381
|
+
/** Set when the run ended. */
|
|
16382
|
+
outcome: AutomationRunOutcomeSchema.optional(),
|
|
16383
|
+
lastRunAt: number().nullable(),
|
|
16384
|
+
lastError: string().nullable()
|
|
15985
16385
|
});
|
|
15986
16386
|
/**
|
|
15987
16387
|
* `addon-pages` — system-scoped singleton aggregator cap. Public-facing
|
|
@@ -19542,7 +19942,18 @@ method(object({}), object({ blocks: array(CoreBlockSchema) }), { auth: "admin" }
|
|
|
19542
19942
|
kind: "mutation",
|
|
19543
19943
|
auth: "admin",
|
|
19544
19944
|
access: "view"
|
|
19545
|
-
})
|
|
19945
|
+
}), method(object({
|
|
19946
|
+
blockId: string().min(1),
|
|
19947
|
+
trace: AutomationRunTraceSchema.optional(),
|
|
19948
|
+
runStartedAt: number().optional(),
|
|
19949
|
+
keepTraces: number().int().min(1).max(100).optional()
|
|
19950
|
+
}), _void(), {
|
|
19951
|
+
kind: "mutation",
|
|
19952
|
+
auth: "admin"
|
|
19953
|
+
}), method(object({ blockId: string().min(1) }), AutomationStateDocSchema, { auth: "admin" }), method(object({ blockId: string().min(1) }), object({
|
|
19954
|
+
traces: array(AutomationRunTraceSchema),
|
|
19955
|
+
lastError: string().nullable()
|
|
19956
|
+
}), { auth: "admin" });
|
|
19546
19957
|
/**
|
|
19547
19958
|
* `custom-model-registry` — collection cap exposing operator-registered
|
|
19548
19959
|
* custom detection models. Each provider (today: `addon-model-studio`)
|
|
@@ -44669,51 +45080,6 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
44669
45080
|
kind: "mutation",
|
|
44670
45081
|
auth: "admin"
|
|
44671
45082
|
});
|
|
44672
|
-
new Set([
|
|
44673
|
-
{
|
|
44674
|
-
id: "person",
|
|
44675
|
-
name: "Person"
|
|
44676
|
-
},
|
|
44677
|
-
{
|
|
44678
|
-
id: "vehicle",
|
|
44679
|
-
name: "Vehicle"
|
|
44680
|
-
},
|
|
44681
|
-
{
|
|
44682
|
-
id: "animal",
|
|
44683
|
-
name: "Animal"
|
|
44684
|
-
},
|
|
44685
|
-
{
|
|
44686
|
-
id: "package",
|
|
44687
|
-
name: "Package"
|
|
44688
|
-
}
|
|
44689
|
-
].map((l) => l.id));
|
|
44690
|
-
var COCO_TO_MACRO = {
|
|
44691
|
-
mapping: {
|
|
44692
|
-
person: "person",
|
|
44693
|
-
bicycle: "vehicle",
|
|
44694
|
-
car: "vehicle",
|
|
44695
|
-
motorcycle: "vehicle",
|
|
44696
|
-
airplane: "vehicle",
|
|
44697
|
-
bus: "vehicle",
|
|
44698
|
-
train: "vehicle",
|
|
44699
|
-
truck: "vehicle",
|
|
44700
|
-
boat: "vehicle",
|
|
44701
|
-
bird: "animal",
|
|
44702
|
-
cat: "animal",
|
|
44703
|
-
dog: "animal",
|
|
44704
|
-
horse: "animal",
|
|
44705
|
-
sheep: "animal",
|
|
44706
|
-
cow: "animal",
|
|
44707
|
-
elephant: "animal",
|
|
44708
|
-
bear: "animal",
|
|
44709
|
-
zebra: "animal",
|
|
44710
|
-
giraffe: "animal",
|
|
44711
|
-
suitcase: "package",
|
|
44712
|
-
backpack: "package",
|
|
44713
|
-
handbag: "package"
|
|
44714
|
-
},
|
|
44715
|
-
preserveOriginal: false
|
|
44716
|
-
};
|
|
44717
45083
|
var AUDIO_MACRO_LABELS = [
|
|
44718
45084
|
{
|
|
44719
45085
|
id: "speech",
|
|
@@ -57262,6 +57628,84 @@ DeviceType.Camera, method(object({ deviceId: number() }), AudioMetricsSnapshotSc
|
|
|
57262
57628
|
* would produce more than `maxPoints` samples. */
|
|
57263
57629
|
sampleEveryMs: number().int().positive().optional()
|
|
57264
57630
|
}), AudioMetricsHistorySchema);
|
|
57631
|
+
method(object({}), array(ActionEntrySchema), { auth: "admin" }), method(object({
|
|
57632
|
+
actionId: string().min(1),
|
|
57633
|
+
variables: record(string(), ActionVariableValueSchema).optional()
|
|
57634
|
+
}), _void(), {
|
|
57635
|
+
kind: "mutation",
|
|
57636
|
+
auth: "admin"
|
|
57637
|
+
}), method(object({ actionId: string().min(1) }), _void(), {
|
|
57638
|
+
kind: "mutation",
|
|
57639
|
+
auth: "admin"
|
|
57640
|
+
});
|
|
57641
|
+
/**
|
|
57642
|
+
* actions — the ONE surface for runnable actions, for the UI and for
|
|
57643
|
+
* automations. Provided by the core-blocks builtin on the hub.
|
|
57644
|
+
*
|
|
57645
|
+
* An action is a LIST ENTRY, not a device (D883): either internal (cap and wait
|
|
57646
|
+
* steps, kept in the hub's `actions` record kind) or declared by an addon over
|
|
57647
|
+
* `action-source`. `list` asks every `action-source` provider LIVE and overlays
|
|
57648
|
+
* the run status from the hub's `runs` ledger; there is no catalog here to
|
|
57649
|
+
* drift (D3).
|
|
57650
|
+
*
|
|
57651
|
+
* **Permissions follow the camera, as linked devices do.** An action is linked
|
|
57652
|
+
* to cameras by the operator (`setLinks`, D356: nothing links itself). A
|
|
57653
|
+
* non-admin may `get` / `run` an action only through a camera they may see that
|
|
57654
|
+
* links it: they name the camera (`deviceId`, a top-level field so the scope
|
|
57655
|
+
* gate sees it) and the provider refuses an action that camera does not link.
|
|
57656
|
+
* An admin, and an in-process caller (an automation block), may run any action.
|
|
57657
|
+
* Every refusal is typed (`[not-linked] …`) and logged.
|
|
57658
|
+
*
|
|
57659
|
+
* A second `run` of an action that is already running is REFUSED — traced and
|
|
57660
|
+
* logged — never queued.
|
|
57661
|
+
*/
|
|
57662
|
+
var ActionIdInput = object({ actionId: string().min(1) });
|
|
57663
|
+
var ActionLinksSchema = object({
|
|
57664
|
+
deviceId: number().int().nonnegative(),
|
|
57665
|
+
actionIds: array(string().min(1)).max(100)
|
|
57666
|
+
});
|
|
57667
|
+
method(object({}), array(ActionEntrySchema), { auth: "admin" }), method(object({
|
|
57668
|
+
actionId: string().min(1),
|
|
57669
|
+
deviceId: number().int().nonnegative().optional()
|
|
57670
|
+
}), object({ action: ActionEntrySchema.nullable() }), {
|
|
57671
|
+
role: "viewer",
|
|
57672
|
+
auth: "protected",
|
|
57673
|
+
kind: "query",
|
|
57674
|
+
caller: "required"
|
|
57675
|
+
}), method(object({
|
|
57676
|
+
actionId: string().min(1),
|
|
57677
|
+
variables: record(string(), ActionVariableValueSchema).optional(),
|
|
57678
|
+
wait: boolean().optional(),
|
|
57679
|
+
origin: ActionRunOriginSchema.optional(),
|
|
57680
|
+
deviceId: number().int().nonnegative().optional()
|
|
57681
|
+
}), ActionRunResultSchema, {
|
|
57682
|
+
role: "viewer",
|
|
57683
|
+
auth: "protected",
|
|
57684
|
+
kind: "mutation",
|
|
57685
|
+
caller: "required"
|
|
57686
|
+
}), method(ActionIdInput, _void(), {
|
|
57687
|
+
kind: "mutation",
|
|
57688
|
+
auth: "admin"
|
|
57689
|
+
}), method(ActionIdInput, object({ traces: array(AutomationRunTraceSchema) }), { auth: "admin" }), method(object({ action: ActionInputSchema }), object({ action: ActionEntrySchema }), {
|
|
57690
|
+
kind: "mutation",
|
|
57691
|
+
auth: "admin"
|
|
57692
|
+
}), method(object({
|
|
57693
|
+
actionId: string().min(1),
|
|
57694
|
+
action: ActionInputSchema.partial()
|
|
57695
|
+
}), object({ action: ActionEntrySchema }), {
|
|
57696
|
+
kind: "mutation",
|
|
57697
|
+
auth: "admin"
|
|
57698
|
+
}), method(ActionIdInput, _void(), {
|
|
57699
|
+
kind: "mutation",
|
|
57700
|
+
auth: "admin"
|
|
57701
|
+
}), method(object({ deviceId: number().int().nonnegative() }), array(ActionEntrySchema), {
|
|
57702
|
+
role: "viewer",
|
|
57703
|
+
auth: "protected",
|
|
57704
|
+
kind: "query"
|
|
57705
|
+
}), method(object({ deviceId: number().int().nonnegative() }), ActionLinksSchema, { auth: "admin" }), method(ActionLinksSchema, ActionLinksSchema, {
|
|
57706
|
+
kind: "mutation",
|
|
57707
|
+
auth: "admin"
|
|
57708
|
+
});
|
|
57265
57709
|
object({
|
|
57266
57710
|
/** Whether the automation is currently enabled. Disabled automations
|
|
57267
57711
|
* ignore their trigger block — manual `trigger` still works. */
|
|
@@ -61507,10 +61951,20 @@ var PetFeederDeviceStatusSchema = _enum([
|
|
|
61507
61951
|
]);
|
|
61508
61952
|
var gramsPortion = number().int().min(4).max(200);
|
|
61509
61953
|
object({
|
|
61510
|
-
/** Food
|
|
61511
|
-
*
|
|
61512
|
-
* bowl
|
|
61954
|
+
/** Food in the TANK (hopper), as the feeder's own sensor reports it
|
|
61955
|
+
* (`state.food`). A coarse level code, not grams — `0` is empty. The
|
|
61956
|
+
* amount in the bowl is `bowlFood`. On dual-hopper models this is the
|
|
61957
|
+
* combined reading; per-hopper levels live in `food1`/`food2`. Null when
|
|
61958
|
+
* the device has not reported yet. */
|
|
61513
61959
|
foodLevel: number().nullable().meta(readingMeta("none")),
|
|
61960
|
+
/** Food in the BOWL as the feeder reports it (`state.bowl`), in the
|
|
61961
|
+
* feeder's own units. Null when the model reports none. */
|
|
61962
|
+
bowlFood: number().nullable().meta(readingMeta("none")),
|
|
61963
|
+
/** True while the pet is eating (`state.eating`). */
|
|
61964
|
+
eating: boolean(),
|
|
61965
|
+
/** Whether `markFoodReplenished` does anything on this model. When false
|
|
61966
|
+
* the client must not offer it. */
|
|
61967
|
+
supportsMarkRefilled: boolean(),
|
|
61514
61968
|
/** Hopper-1 food level (grams) on dual-hopper feeders; null on
|
|
61515
61969
|
* single-hopper models. */
|
|
61516
61970
|
food1: number().nullable().meta(readingMeta("none")),
|
|
@@ -61518,8 +61972,8 @@ object({
|
|
|
61518
61972
|
* single-hopper models. */
|
|
61519
61973
|
food2: number().nullable().meta(readingMeta("none")),
|
|
61520
61974
|
/** Derived low-food flag — mirrors the HA `food_level` binary_sensor
|
|
61521
|
-
* (`device_class: problem`, on = low). True when the
|
|
61522
|
-
*
|
|
61975
|
+
* (`device_class: problem`, on = low). True when the tank reports empty,
|
|
61976
|
+
* or, on a dual-hopper model, when EITHER hopper is empty. */
|
|
61523
61977
|
lowFood: boolean(),
|
|
61524
61978
|
/** Battery charge 0..100 (%). Null on mains-powered models or when the
|
|
61525
61979
|
* device has no battery reading. */
|
|
@@ -66365,6 +66819,104 @@ Object.freeze({
|
|
|
66365
66819
|
access: "create",
|
|
66366
66820
|
role: "admin"
|
|
66367
66821
|
},
|
|
66822
|
+
"actions.create": {
|
|
66823
|
+
capName: "actions",
|
|
66824
|
+
capScope: "system",
|
|
66825
|
+
addonId: null,
|
|
66826
|
+
access: "create",
|
|
66827
|
+
role: "admin"
|
|
66828
|
+
},
|
|
66829
|
+
"actions.delete": {
|
|
66830
|
+
capName: "actions",
|
|
66831
|
+
capScope: "system",
|
|
66832
|
+
addonId: null,
|
|
66833
|
+
access: "delete",
|
|
66834
|
+
role: "admin"
|
|
66835
|
+
},
|
|
66836
|
+
"actions.get": {
|
|
66837
|
+
capName: "actions",
|
|
66838
|
+
capScope: "system",
|
|
66839
|
+
addonId: null,
|
|
66840
|
+
access: "view",
|
|
66841
|
+
role: "viewer"
|
|
66842
|
+
},
|
|
66843
|
+
"actions.getLinks": {
|
|
66844
|
+
capName: "actions",
|
|
66845
|
+
capScope: "system",
|
|
66846
|
+
addonId: null,
|
|
66847
|
+
access: "view",
|
|
66848
|
+
role: "admin"
|
|
66849
|
+
},
|
|
66850
|
+
"actions.getTraces": {
|
|
66851
|
+
capName: "actions",
|
|
66852
|
+
capScope: "system",
|
|
66853
|
+
addonId: null,
|
|
66854
|
+
access: "view",
|
|
66855
|
+
role: "admin"
|
|
66856
|
+
},
|
|
66857
|
+
"actions.list": {
|
|
66858
|
+
capName: "actions",
|
|
66859
|
+
capScope: "system",
|
|
66860
|
+
addonId: null,
|
|
66861
|
+
access: "view",
|
|
66862
|
+
role: "admin"
|
|
66863
|
+
},
|
|
66864
|
+
"actions.listForCamera": {
|
|
66865
|
+
capName: "actions",
|
|
66866
|
+
capScope: "system",
|
|
66867
|
+
addonId: null,
|
|
66868
|
+
access: "view",
|
|
66869
|
+
role: "viewer"
|
|
66870
|
+
},
|
|
66871
|
+
"actions.run": {
|
|
66872
|
+
capName: "actions",
|
|
66873
|
+
capScope: "system",
|
|
66874
|
+
addonId: null,
|
|
66875
|
+
access: "create",
|
|
66876
|
+
role: "viewer"
|
|
66877
|
+
},
|
|
66878
|
+
"actions.setLinks": {
|
|
66879
|
+
capName: "actions",
|
|
66880
|
+
capScope: "system",
|
|
66881
|
+
addonId: null,
|
|
66882
|
+
access: "create",
|
|
66883
|
+
role: "admin"
|
|
66884
|
+
},
|
|
66885
|
+
"actions.stop": {
|
|
66886
|
+
capName: "actions",
|
|
66887
|
+
capScope: "system",
|
|
66888
|
+
addonId: null,
|
|
66889
|
+
access: "create",
|
|
66890
|
+
role: "admin"
|
|
66891
|
+
},
|
|
66892
|
+
"actions.update": {
|
|
66893
|
+
capName: "actions",
|
|
66894
|
+
capScope: "system",
|
|
66895
|
+
addonId: null,
|
|
66896
|
+
access: "create",
|
|
66897
|
+
role: "admin"
|
|
66898
|
+
},
|
|
66899
|
+
"actionSource.listActions": {
|
|
66900
|
+
capName: "action-source",
|
|
66901
|
+
capScope: "system",
|
|
66902
|
+
addonId: null,
|
|
66903
|
+
access: "view",
|
|
66904
|
+
role: "admin"
|
|
66905
|
+
},
|
|
66906
|
+
"actionSource.runAction": {
|
|
66907
|
+
capName: "action-source",
|
|
66908
|
+
capScope: "system",
|
|
66909
|
+
addonId: null,
|
|
66910
|
+
access: "create",
|
|
66911
|
+
role: "admin"
|
|
66912
|
+
},
|
|
66913
|
+
"actionSource.stopAction": {
|
|
66914
|
+
capName: "action-source",
|
|
66915
|
+
capScope: "system",
|
|
66916
|
+
addonId: null,
|
|
66917
|
+
access: "create",
|
|
66918
|
+
role: "admin"
|
|
66919
|
+
},
|
|
66368
66920
|
"addonPages.listPages": {
|
|
66369
66921
|
capName: "addon-pages",
|
|
66370
66922
|
capScope: "system",
|
|
@@ -67646,6 +68198,13 @@ Object.freeze({
|
|
|
67646
68198
|
access: "view",
|
|
67647
68199
|
role: "admin"
|
|
67648
68200
|
},
|
|
68201
|
+
"coreBlocks.getAutomationRunState": {
|
|
68202
|
+
capName: "core-blocks",
|
|
68203
|
+
capScope: "system",
|
|
68204
|
+
addonId: null,
|
|
68205
|
+
access: "view",
|
|
68206
|
+
role: "admin"
|
|
68207
|
+
},
|
|
67649
68208
|
"coreBlocks.getBlockSettings": {
|
|
67650
68209
|
capName: "core-blocks",
|
|
67651
68210
|
capScope: "system",
|
|
@@ -67667,6 +68226,13 @@ Object.freeze({
|
|
|
67667
68226
|
access: "view",
|
|
67668
68227
|
role: "admin"
|
|
67669
68228
|
},
|
|
68229
|
+
"coreBlocks.getTraces": {
|
|
68230
|
+
capName: "core-blocks",
|
|
68231
|
+
capScope: "system",
|
|
68232
|
+
addonId: null,
|
|
68233
|
+
access: "view",
|
|
68234
|
+
role: "admin"
|
|
68235
|
+
},
|
|
67670
68236
|
"coreBlocks.getTypeDefs": {
|
|
67671
68237
|
capName: "core-blocks",
|
|
67672
68238
|
capScope: "system",
|
|
@@ -67702,6 +68268,13 @@ Object.freeze({
|
|
|
67702
68268
|
access: "create",
|
|
67703
68269
|
role: "admin"
|
|
67704
68270
|
},
|
|
68271
|
+
"coreBlocks.reportAutomationRun": {
|
|
68272
|
+
capName: "core-blocks",
|
|
68273
|
+
capScope: "system",
|
|
68274
|
+
addonId: null,
|
|
68275
|
+
access: "create",
|
|
68276
|
+
role: "admin"
|
|
68277
|
+
},
|
|
67705
68278
|
"coreBlocks.restart": {
|
|
67706
68279
|
capName: "core-blocks",
|
|
67707
68280
|
capScope: "system",
|
|
@@ -79856,6 +80429,8 @@ var ML = "model and training machinery — no device action";
|
|
|
79856
80429
|
var INTERNAL = "internal plumbing between addons — never operator-facing";
|
|
79857
80430
|
/** Every system-scoped cap, with why it is not a device's vocabulary. */
|
|
79858
80431
|
var SYSTEM_CAP_VOCABULARY = {
|
|
80432
|
+
"action-source": system(INTERNAL),
|
|
80433
|
+
actions: system("declared actions — run from the Actions page and from the cameras that link them"),
|
|
79859
80434
|
"addon-pages": system(UI_PLUMBING),
|
|
79860
80435
|
"addon-pages-source": system(UI_PLUMBING),
|
|
79861
80436
|
"addon-routes": system(UI_PLUMBING),
|
|
@@ -80052,6 +80627,31 @@ Object.freeze({
|
|
|
80052
80627
|
form: "single",
|
|
80053
80628
|
optional: false
|
|
80054
80629
|
}],
|
|
80630
|
+
"actions.get": [{
|
|
80631
|
+
name: "deviceId",
|
|
80632
|
+
form: "single",
|
|
80633
|
+
optional: true
|
|
80634
|
+
}],
|
|
80635
|
+
"actions.getLinks": [{
|
|
80636
|
+
name: "deviceId",
|
|
80637
|
+
form: "single",
|
|
80638
|
+
optional: false
|
|
80639
|
+
}],
|
|
80640
|
+
"actions.listForCamera": [{
|
|
80641
|
+
name: "deviceId",
|
|
80642
|
+
form: "single",
|
|
80643
|
+
optional: false
|
|
80644
|
+
}],
|
|
80645
|
+
"actions.run": [{
|
|
80646
|
+
name: "deviceId",
|
|
80647
|
+
form: "single",
|
|
80648
|
+
optional: true
|
|
80649
|
+
}],
|
|
80650
|
+
"actions.setLinks": [{
|
|
80651
|
+
name: "deviceId",
|
|
80652
|
+
form: "single",
|
|
80653
|
+
optional: false
|
|
80654
|
+
}],
|
|
80055
80655
|
"addonSettings.getDeviceSettings": [{
|
|
80056
80656
|
name: "deviceId",
|
|
80057
80657
|
form: "single",
|