@camstack/addon-provider-onvif 1.2.26 → 1.2.27
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/dist/addon.js +184 -34
- package/dist/addon.mjs +184 -34
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -5804,6 +5804,13 @@ var BaseAddon = class {
|
|
|
5804
5804
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
5805
5805
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
5806
5806
|
_registeredCapNames = [];
|
|
5807
|
+
/**
|
|
5808
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
5809
|
+
* defaults look like stored config when the store is down — a forked
|
|
5810
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
5811
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
5812
|
+
*/
|
|
5813
|
+
settingsStoreReady = false;
|
|
5807
5814
|
/** Default config values. Provided via constructor. */
|
|
5808
5815
|
defaults;
|
|
5809
5816
|
constructor(defaults) {
|
|
@@ -6204,7 +6211,9 @@ var BaseAddon = class {
|
|
|
6204
6211
|
];
|
|
6205
6212
|
let lastErr;
|
|
6206
6213
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
6207
|
-
|
|
6214
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
6215
|
+
this.settingsStoreReady = true;
|
|
6216
|
+
return stored;
|
|
6208
6217
|
} catch (err) {
|
|
6209
6218
|
lastErr = err;
|
|
6210
6219
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -6212,6 +6221,7 @@ var BaseAddon = class {
|
|
|
6212
6221
|
if (attempt === delaysMs.length) break;
|
|
6213
6222
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
6214
6223
|
}
|
|
6224
|
+
this.settingsStoreReady = false;
|
|
6215
6225
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
6216
6226
|
return {};
|
|
6217
6227
|
}
|
|
@@ -8111,6 +8121,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8111
8121
|
*/
|
|
8112
8122
|
resolution: number().int().positive().optional()
|
|
8113
8123
|
});
|
|
8124
|
+
var ModelProviderIdSchema = _enum([
|
|
8125
|
+
"camstack",
|
|
8126
|
+
"frigate",
|
|
8127
|
+
"scrypted",
|
|
8128
|
+
"custom"
|
|
8129
|
+
]);
|
|
8114
8130
|
var ModelCatalogEntrySchema = object({
|
|
8115
8131
|
id: string(),
|
|
8116
8132
|
name: string(),
|
|
@@ -8208,6 +8224,12 @@ var ModelCatalogEntrySchema = object({
|
|
|
8208
8224
|
*/
|
|
8209
8225
|
group: ModelVariantGroupSchema.optional(),
|
|
8210
8226
|
/**
|
|
8227
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8228
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8229
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8230
|
+
*/
|
|
8231
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8232
|
+
/**
|
|
8211
8233
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8212
8234
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8213
8235
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
@@ -11790,6 +11812,27 @@ var LinkedDeviceSchema = object({
|
|
|
11790
11812
|
features: array(string()),
|
|
11791
11813
|
producesTrackedEvents: boolean().optional()
|
|
11792
11814
|
});
|
|
11815
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
11816
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
11817
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
11818
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
11819
|
+
deviceId: number(),
|
|
11820
|
+
mode: LinkedDevicesModeSchema,
|
|
11821
|
+
devices: array(LinkedDeviceSchema)
|
|
11822
|
+
});
|
|
11823
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
11824
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
11825
|
+
* object literal is exactly how the three drift apart. */
|
|
11826
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
11827
|
+
deviceId: number(),
|
|
11828
|
+
entries: array(object({
|
|
11829
|
+
capName: string(),
|
|
11830
|
+
kind: _enum(["native", "wrapped"]),
|
|
11831
|
+
providerAddonId: string(),
|
|
11832
|
+
providerNodeId: string(),
|
|
11833
|
+
nativeAddonId: string()
|
|
11834
|
+
}))
|
|
11835
|
+
});
|
|
11793
11836
|
var SavedDeviceRowSchema = object({
|
|
11794
11837
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
11795
11838
|
id: number(),
|
|
@@ -12015,11 +12058,25 @@ method(object({
|
|
|
12015
12058
|
projection: _enum(["full", "slim"]).optional(),
|
|
12016
12059
|
/** Return only camera devices. Filtering server-side instead of
|
|
12017
12060
|
* shipping 293 rows to find 12. */
|
|
12018
|
-
isCamera: boolean().optional()
|
|
12061
|
+
isCamera: boolean().optional(),
|
|
12062
|
+
/**
|
|
12063
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12064
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12065
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12066
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12067
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12068
|
+
* refetches on the reconcile interval, on a phone.
|
|
12069
|
+
*
|
|
12070
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12071
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12072
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12073
|
+
* it answers today and the caller filters as it already does.
|
|
12074
|
+
*/
|
|
12075
|
+
deviceIds: array(number()).optional()
|
|
12019
12076
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
12020
12077
|
mode: LinkedDevicesModeSchema,
|
|
12021
12078
|
devices: array(LinkedDeviceSchema)
|
|
12022
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12079
|
+
})), method(object({ deviceIds: array(number()) }), array(LinkedDevicesForDeviceSchema)), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12023
12080
|
deviceId: number(),
|
|
12024
12081
|
values: record(string(), unknown())
|
|
12025
12082
|
}), object({ success: literal(true) }), {
|
|
@@ -12046,25 +12103,7 @@ method(object({
|
|
|
12046
12103
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12047
12104
|
kind: "mutation",
|
|
12048
12105
|
auth: "admin"
|
|
12049
|
-
}), method(object({ deviceId: number() }), object({
|
|
12050
|
-
deviceId: number(),
|
|
12051
|
-
entries: array(object({
|
|
12052
|
-
capName: string(),
|
|
12053
|
-
kind: _enum(["native", "wrapped"]),
|
|
12054
|
-
providerAddonId: string(),
|
|
12055
|
-
providerNodeId: string(),
|
|
12056
|
-
nativeAddonId: string()
|
|
12057
|
-
}))
|
|
12058
|
-
})), method(object({}), array(object({
|
|
12059
|
-
deviceId: number(),
|
|
12060
|
-
entries: array(object({
|
|
12061
|
-
capName: string(),
|
|
12062
|
-
kind: _enum(["native", "wrapped"]),
|
|
12063
|
-
providerAddonId: string(),
|
|
12064
|
-
providerNodeId: string(),
|
|
12065
|
-
nativeAddonId: string()
|
|
12066
|
-
}))
|
|
12067
|
-
}))), method(object({
|
|
12106
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12068
12107
|
deviceId: number(),
|
|
12069
12108
|
capName: string(),
|
|
12070
12109
|
wrapperAddonId: string(),
|
|
@@ -14436,12 +14475,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14436
14475
|
* there is no second switch that can disagree with the first and every rule
|
|
14437
14476
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14438
14477
|
*
|
|
14439
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14440
|
-
*
|
|
14441
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14442
|
-
*
|
|
14443
|
-
*
|
|
14444
|
-
*
|
|
14478
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14479
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14480
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14481
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14482
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14483
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14484
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14485
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14486
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14445
14487
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14446
14488
|
* the condition: at least `hitPercent`% of the samples over
|
|
14447
14489
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14468,14 +14510,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14468
14510
|
* an operator who typed `dog` mean the same thing.
|
|
14469
14511
|
*/
|
|
14470
14512
|
var NcAudioConditionSchema = object({
|
|
14471
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14513
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14472
14514
|
labels: array(string().min(1)).min(1).optional(),
|
|
14473
14515
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14474
14516
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14475
14517
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14476
14518
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14477
14519
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14478
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14520
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14521
|
+
/**
|
|
14522
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14523
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14524
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14525
|
+
*/
|
|
14526
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14527
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14528
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14479
14529
|
});
|
|
14480
14530
|
/**
|
|
14481
14531
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -16849,6 +16899,46 @@ var RecentTracksPageSchema = object({
|
|
|
16849
16899
|
/** Cursor for the next page, or null when this page is the last. */
|
|
16850
16900
|
nextCursor: string().nullable()
|
|
16851
16901
|
});
|
|
16902
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
16903
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
16904
|
+
var AnalyticsGroupRecordSchema = object({
|
|
16905
|
+
id: string(),
|
|
16906
|
+
deviceId: number().int(),
|
|
16907
|
+
openedAt: number().int(),
|
|
16908
|
+
closedAt: number().int(),
|
|
16909
|
+
timestamp: number().int(),
|
|
16910
|
+
memberCount: number().int(),
|
|
16911
|
+
memberTrackIds: array(string()).readonly(),
|
|
16912
|
+
className: string(),
|
|
16913
|
+
classes: array(string()).readonly(),
|
|
16914
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
16915
|
+
mediaUrl: string().nullable(),
|
|
16916
|
+
singleton: boolean()
|
|
16917
|
+
});
|
|
16918
|
+
var AnalyticsGroupMemberSchema = object({
|
|
16919
|
+
trackId: string(),
|
|
16920
|
+
deviceId: number().int(),
|
|
16921
|
+
className: string(),
|
|
16922
|
+
firstSeen: number().int(),
|
|
16923
|
+
lastSeen: number().int(),
|
|
16924
|
+
mediaUrl: string().nullable()
|
|
16925
|
+
});
|
|
16926
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
16927
|
+
var ListGroupsQueryInput = object({
|
|
16928
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
16929
|
+
deviceIds: array(number()),
|
|
16930
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
16931
|
+
since: number().optional(),
|
|
16932
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
16933
|
+
until: number().optional(),
|
|
16934
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
16935
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
16936
|
+
cursor: string().optional()
|
|
16937
|
+
});
|
|
16938
|
+
var ListGroupsPageSchema = object({
|
|
16939
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
16940
|
+
nextCursor: string().nullable()
|
|
16941
|
+
});
|
|
16852
16942
|
var KeyEventQueryInput = object({
|
|
16853
16943
|
deviceId: number(),
|
|
16854
16944
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -16924,7 +17014,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
16924
17014
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
16925
17015
|
plates: number().int(),
|
|
16926
17016
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
16927
|
-
embeddings: number().int()
|
|
17017
|
+
embeddings: number().int(),
|
|
17018
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17019
|
+
groups: number().int()
|
|
16928
17020
|
});
|
|
16929
17021
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
16930
17022
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17070,7 +17162,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17070
17162
|
* stationary registry). Default false: the timeline lists passages,
|
|
17071
17163
|
* not parking records (operator decision, 2026-08-15). */
|
|
17072
17164
|
includeStationary: boolean().optional()
|
|
17073
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17165
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17166
|
+
deviceId: number(),
|
|
17167
|
+
groupId: string().min(1)
|
|
17168
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17074
17169
|
kind: "mutation",
|
|
17075
17170
|
auth: "admin"
|
|
17076
17171
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -17380,7 +17475,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17380
17475
|
sizeMB: number()
|
|
17381
17476
|
})),
|
|
17382
17477
|
group: ModelVariantGroupSchema.optional(),
|
|
17383
|
-
legacy: boolean().optional()
|
|
17478
|
+
legacy: boolean().optional(),
|
|
17479
|
+
provider: ModelProviderIdSchema.optional()
|
|
17384
17480
|
});
|
|
17385
17481
|
var ConfigFieldBridge = custom();
|
|
17386
17482
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -24068,7 +24164,12 @@ var PlateInfoSchema = object({
|
|
|
24068
24164
|
plateBbox: BoundingBoxSchema.optional(),
|
|
24069
24165
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
24070
24166
|
keyFrameMediaKey: string().optional(),
|
|
24071
|
-
base64: string().optional()
|
|
24167
|
+
base64: string().optional(),
|
|
24168
|
+
/**
|
|
24169
|
+
* Same crop as a data-plane URL. `getPlateByTrack` returns this and
|
|
24170
|
+
* never inlines JPEG; `listPlates` still inlines for the admin-ui.
|
|
24171
|
+
*/
|
|
24172
|
+
cropUrl: string().optional()
|
|
24072
24173
|
});
|
|
24073
24174
|
var MediaFileLiteSchema = object({
|
|
24074
24175
|
key: string(),
|
|
@@ -28160,6 +28261,12 @@ Object.freeze({
|
|
|
28160
28261
|
addonId: null,
|
|
28161
28262
|
access: "view"
|
|
28162
28263
|
},
|
|
28264
|
+
"deviceManager.getBindingsBatch": {
|
|
28265
|
+
capName: "device-manager",
|
|
28266
|
+
capScope: "system",
|
|
28267
|
+
addonId: null,
|
|
28268
|
+
access: "view"
|
|
28269
|
+
},
|
|
28163
28270
|
"deviceManager.getChildren": {
|
|
28164
28271
|
capName: "device-manager",
|
|
28165
28272
|
capScope: "system",
|
|
@@ -28220,6 +28327,12 @@ Object.freeze({
|
|
|
28220
28327
|
addonId: null,
|
|
28221
28328
|
access: "view"
|
|
28222
28329
|
},
|
|
28330
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
28331
|
+
capName: "device-manager",
|
|
28332
|
+
capScope: "system",
|
|
28333
|
+
addonId: null,
|
|
28334
|
+
access: "view"
|
|
28335
|
+
},
|
|
28223
28336
|
"deviceManager.getRoleDisplayDefaults": {
|
|
28224
28337
|
capName: "device-manager",
|
|
28225
28338
|
capScope: "system",
|
|
@@ -29990,6 +30103,12 @@ Object.freeze({
|
|
|
29990
30103
|
addonId: null,
|
|
29991
30104
|
access: "view"
|
|
29992
30105
|
},
|
|
30106
|
+
"pipelineAnalytics.getGroup": {
|
|
30107
|
+
capName: "pipeline-analytics",
|
|
30108
|
+
capScope: "device",
|
|
30109
|
+
addonId: null,
|
|
30110
|
+
access: "view"
|
|
30111
|
+
},
|
|
29993
30112
|
"pipelineAnalytics.getKeyEvents": {
|
|
29994
30113
|
capName: "pipeline-analytics",
|
|
29995
30114
|
capScope: "device",
|
|
@@ -30074,6 +30193,12 @@ Object.freeze({
|
|
|
30074
30193
|
addonId: null,
|
|
30075
30194
|
access: "view"
|
|
30076
30195
|
},
|
|
30196
|
+
"pipelineAnalytics.listGroups": {
|
|
30197
|
+
capName: "pipeline-analytics",
|
|
30198
|
+
capScope: "device",
|
|
30199
|
+
addonId: null,
|
|
30200
|
+
access: "view"
|
|
30201
|
+
},
|
|
30077
30202
|
"pipelineAnalytics.listOpsLog": {
|
|
30078
30203
|
capName: "pipeline-analytics",
|
|
30079
30204
|
capScope: "device",
|
|
@@ -32855,6 +32980,11 @@ Object.freeze({
|
|
|
32855
32980
|
form: "single",
|
|
32856
32981
|
optional: false
|
|
32857
32982
|
}],
|
|
32983
|
+
"deviceManager.getBindingsBatch": [{
|
|
32984
|
+
name: "deviceIds",
|
|
32985
|
+
form: "array",
|
|
32986
|
+
optional: false
|
|
32987
|
+
}],
|
|
32858
32988
|
"deviceManager.getChildren": [{
|
|
32859
32989
|
name: "parentDeviceId",
|
|
32860
32990
|
form: "single",
|
|
@@ -32900,6 +33030,11 @@ Object.freeze({
|
|
|
32900
33030
|
form: "single",
|
|
32901
33031
|
optional: false
|
|
32902
33032
|
}],
|
|
33033
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
33034
|
+
name: "deviceIds",
|
|
33035
|
+
form: "array",
|
|
33036
|
+
optional: false
|
|
33037
|
+
}],
|
|
32903
33038
|
"deviceManager.getSettingsSchema": [{
|
|
32904
33039
|
name: "deviceId",
|
|
32905
33040
|
form: "single",
|
|
@@ -32920,6 +33055,11 @@ Object.freeze({
|
|
|
32920
33055
|
form: "single",
|
|
32921
33056
|
optional: false
|
|
32922
33057
|
}],
|
|
33058
|
+
"deviceManager.listAll": [{
|
|
33059
|
+
name: "deviceIds",
|
|
33060
|
+
form: "array",
|
|
33061
|
+
optional: true
|
|
33062
|
+
}],
|
|
32923
33063
|
"deviceManager.loadConfig": [{
|
|
32924
33064
|
name: "deviceId",
|
|
32925
33065
|
form: "single",
|
|
@@ -33493,6 +33633,11 @@ Object.freeze({
|
|
|
33493
33633
|
form: "single",
|
|
33494
33634
|
optional: false
|
|
33495
33635
|
}],
|
|
33636
|
+
"pipelineAnalytics.getGroup": [{
|
|
33637
|
+
name: "deviceId",
|
|
33638
|
+
form: "single",
|
|
33639
|
+
optional: false
|
|
33640
|
+
}],
|
|
33496
33641
|
"pipelineAnalytics.getKeyEvents": [{
|
|
33497
33642
|
name: "deviceId",
|
|
33498
33643
|
form: "single",
|
|
@@ -33548,6 +33693,11 @@ Object.freeze({
|
|
|
33548
33693
|
form: "array",
|
|
33549
33694
|
optional: false
|
|
33550
33695
|
}],
|
|
33696
|
+
"pipelineAnalytics.listGroups": [{
|
|
33697
|
+
name: "deviceIds",
|
|
33698
|
+
form: "array",
|
|
33699
|
+
optional: false
|
|
33700
|
+
}],
|
|
33551
33701
|
"pipelineAnalytics.listOpsLog": [{
|
|
33552
33702
|
name: "deviceId",
|
|
33553
33703
|
form: "single",
|
package/dist/addon.mjs
CHANGED
|
@@ -5805,6 +5805,13 @@ var BaseAddon = class {
|
|
|
5805
5805
|
_readinessGeneration = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2, 14);
|
|
5806
5806
|
/** Capability names this addon registered at init — used to emit matching `down` events on shutdown. */
|
|
5807
5807
|
_registeredCapNames = [];
|
|
5808
|
+
/**
|
|
5809
|
+
* True only after `readAddonStore` actually answered. Constructor
|
|
5810
|
+
* defaults look like stored config when the store is down — a forked
|
|
5811
|
+
* addon that auto-starts from those defaults (cloudflare-tunnel quick
|
|
5812
|
+
* mode, 2026-08-25) is not "the operator chose this".
|
|
5813
|
+
*/
|
|
5814
|
+
settingsStoreReady = false;
|
|
5808
5815
|
/** Default config values. Provided via constructor. */
|
|
5809
5816
|
defaults;
|
|
5810
5817
|
constructor(defaults) {
|
|
@@ -6205,7 +6212,9 @@ var BaseAddon = class {
|
|
|
6205
6212
|
];
|
|
6206
6213
|
let lastErr;
|
|
6207
6214
|
for (let attempt = 0; attempt <= delaysMs.length; attempt++) try {
|
|
6208
|
-
|
|
6215
|
+
const stored = await settings.readAddonStore() ?? {};
|
|
6216
|
+
this.settingsStoreReady = true;
|
|
6217
|
+
return stored;
|
|
6209
6218
|
} catch (err) {
|
|
6210
6219
|
lastErr = err;
|
|
6211
6220
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -6213,6 +6222,7 @@ var BaseAddon = class {
|
|
|
6213
6222
|
if (attempt === delaysMs.length) break;
|
|
6214
6223
|
await new Promise((r) => setTimeout(r, delaysMs[attempt]));
|
|
6215
6224
|
}
|
|
6225
|
+
this.settingsStoreReady = false;
|
|
6216
6226
|
this._ctx?.logger?.warn?.("readAddonStore: settings-store unavailable after retries — using defaults", { meta: { error: lastErr instanceof Error ? lastErr.message : String(lastErr) } });
|
|
6217
6227
|
return {};
|
|
6218
6228
|
}
|
|
@@ -8112,6 +8122,12 @@ var ModelVariantGroupSchema = object({
|
|
|
8112
8122
|
*/
|
|
8113
8123
|
resolution: number().int().positive().optional()
|
|
8114
8124
|
});
|
|
8125
|
+
var ModelProviderIdSchema = _enum([
|
|
8126
|
+
"camstack",
|
|
8127
|
+
"frigate",
|
|
8128
|
+
"scrypted",
|
|
8129
|
+
"custom"
|
|
8130
|
+
]);
|
|
8115
8131
|
var ModelCatalogEntrySchema = object({
|
|
8116
8132
|
id: string(),
|
|
8117
8133
|
name: string(),
|
|
@@ -8209,6 +8225,12 @@ var ModelCatalogEntrySchema = object({
|
|
|
8209
8225
|
*/
|
|
8210
8226
|
group: ModelVariantGroupSchema.optional(),
|
|
8211
8227
|
/**
|
|
8228
|
+
* Catalog source for the pipeline stepper's provider-first picker. Absent on
|
|
8229
|
+
* built-in CamStack entries (treated as `camstack`) and on registry rows
|
|
8230
|
+
* persisted before this field existed (`inferModelProvider` fills those).
|
|
8231
|
+
*/
|
|
8232
|
+
provider: ModelProviderIdSchema.optional(),
|
|
8233
|
+
/**
|
|
8212
8234
|
* Per-MODEL class map override. Absent ⇒ the step's `StepDefinition.classMap`
|
|
8213
8235
|
* applies (Frigate / COCO public catalog). Set on a custom model whose raw
|
|
8214
8236
|
* labels already ARE the CamStack macros (Scrypted identity map).
|
|
@@ -11791,6 +11813,27 @@ var LinkedDeviceSchema = object({
|
|
|
11791
11813
|
features: array(string()),
|
|
11792
11814
|
producesTrackedEvents: boolean().optional()
|
|
11793
11815
|
});
|
|
11816
|
+
/** One camera's resolved linked set, tagged with the camera it belongs to.
|
|
11817
|
+
* The batch answer needs the tag; the single-device answer already has it
|
|
11818
|
+
* from the input, which is why `getLinkedDevices` keeps the untagged shape. */
|
|
11819
|
+
var LinkedDevicesForDeviceSchema = object({
|
|
11820
|
+
deviceId: number(),
|
|
11821
|
+
mode: LinkedDevicesModeSchema,
|
|
11822
|
+
devices: array(LinkedDeviceSchema)
|
|
11823
|
+
});
|
|
11824
|
+
/** One device's binding map — the shape `getBindings`, `getBindingsBatch` and
|
|
11825
|
+
* `getAllBindings` all answer in. Declared once: three copies of the same
|
|
11826
|
+
* object literal is exactly how the three drift apart. */
|
|
11827
|
+
var DeviceBindingsForDeviceSchema = object({
|
|
11828
|
+
deviceId: number(),
|
|
11829
|
+
entries: array(object({
|
|
11830
|
+
capName: string(),
|
|
11831
|
+
kind: _enum(["native", "wrapped"]),
|
|
11832
|
+
providerAddonId: string(),
|
|
11833
|
+
providerNodeId: string(),
|
|
11834
|
+
nativeAddonId: string()
|
|
11835
|
+
}))
|
|
11836
|
+
});
|
|
11794
11837
|
var SavedDeviceRowSchema = object({
|
|
11795
11838
|
/** Numeric id reserved at allocateDeviceId time. */
|
|
11796
11839
|
id: number(),
|
|
@@ -12016,11 +12059,25 @@ method(object({
|
|
|
12016
12059
|
projection: _enum(["full", "slim"]).optional(),
|
|
12017
12060
|
/** Return only camera devices. Filtering server-side instead of
|
|
12018
12061
|
* shipping 293 rows to find 12. */
|
|
12019
|
-
isCamera: boolean().optional()
|
|
12062
|
+
isCamera: boolean().optional(),
|
|
12063
|
+
/**
|
|
12064
|
+
* Return only these device ids. For the caller that already KNOWS the
|
|
12065
|
+
* handful it wants and needs a field the id-bearing answer does not
|
|
12066
|
+
* carry — the viewer's linked-devices panel joins `type` and `online`
|
|
12067
|
+
* onto ~8 linked ids and, unfiltered, dragged the fleet across to do
|
|
12068
|
+
* it: 433 KB slim / 958 KB full for 967 devices, on a query that
|
|
12069
|
+
* refetches on the reconcile interval, on a phone.
|
|
12070
|
+
*
|
|
12071
|
+
* Safe to send at a hub that predates it: Zod STRIPS unknown input
|
|
12072
|
+
* keys rather than rejecting them (verified against the live hub
|
|
12073
|
+
* 2026-08-25 — 967 rows came back), so an old hub answers exactly what
|
|
12074
|
+
* it answers today and the caller filters as it already does.
|
|
12075
|
+
*/
|
|
12076
|
+
deviceIds: array(number()).optional()
|
|
12020
12077
|
}), array(DeviceInfoSchema)), method(object({ deviceId: number() }), DeviceInfoSchema.nullable()), method(object({ parentDeviceId: number() }), array(DeviceInfoSchema)), method(object({ deviceId: number() }), object({
|
|
12021
12078
|
mode: LinkedDevicesModeSchema,
|
|
12022
12079
|
devices: array(LinkedDeviceSchema)
|
|
12023
|
-
})), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12080
|
+
})), method(object({ deviceIds: array(number()) }), array(LinkedDevicesForDeviceSchema)), method(object({ deviceId: number() }), array(StreamSourceEntrySchema$1)), method(object({ deviceId: number() }), array(ConfigEntrySchema)), method(object({ deviceId: number() }), ConfigUISchemaOutput), method(object({
|
|
12024
12081
|
deviceId: number(),
|
|
12025
12082
|
values: record(string(), unknown())
|
|
12026
12083
|
}), object({ success: literal(true) }), {
|
|
@@ -12047,25 +12104,7 @@ method(object({
|
|
|
12047
12104
|
}), method(object({ deviceId: number() }), array(StreamProbeResultSchema), {
|
|
12048
12105
|
kind: "mutation",
|
|
12049
12106
|
auth: "admin"
|
|
12050
|
-
}), method(object({ deviceId: number() }), object({
|
|
12051
|
-
deviceId: number(),
|
|
12052
|
-
entries: array(object({
|
|
12053
|
-
capName: string(),
|
|
12054
|
-
kind: _enum(["native", "wrapped"]),
|
|
12055
|
-
providerAddonId: string(),
|
|
12056
|
-
providerNodeId: string(),
|
|
12057
|
-
nativeAddonId: string()
|
|
12058
|
-
}))
|
|
12059
|
-
})), method(object({}), array(object({
|
|
12060
|
-
deviceId: number(),
|
|
12061
|
-
entries: array(object({
|
|
12062
|
-
capName: string(),
|
|
12063
|
-
kind: _enum(["native", "wrapped"]),
|
|
12064
|
-
providerAddonId: string(),
|
|
12065
|
-
providerNodeId: string(),
|
|
12066
|
-
nativeAddonId: string()
|
|
12067
|
-
}))
|
|
12068
|
-
}))), method(object({
|
|
12107
|
+
}), method(object({ deviceId: number() }), DeviceBindingsForDeviceSchema), method(object({ deviceIds: array(number()) }), array(DeviceBindingsForDeviceSchema)), method(object({}), array(DeviceBindingsForDeviceSchema)), method(object({
|
|
12069
12108
|
deviceId: number(),
|
|
12070
12109
|
capName: string(),
|
|
12071
12110
|
wrapperAddonId: string(),
|
|
@@ -14437,12 +14476,15 @@ var NcOccupancyConditionSchema = object({
|
|
|
14437
14476
|
* there is no second switch that can disagree with the first and every rule
|
|
14438
14477
|
* authored before the decision migrates for free (`audioModeOf`):
|
|
14439
14478
|
*
|
|
14440
|
-
* - **LABEL mode — `labels` present.** The rule fires
|
|
14441
|
-
*
|
|
14442
|
-
* `hitPercent` and `samplingSeconds` are ignored
|
|
14443
|
-
*
|
|
14444
|
-
*
|
|
14445
|
-
*
|
|
14479
|
+
* - **LABEL mode — `labels` present.** The rule fires when `confirmHits`
|
|
14480
|
+
* labelled frames land inside `confirmWindowSec` (default 2 in 5 s).
|
|
14481
|
+
* `hitPercent` and `samplingSeconds` are still ignored — a percentage of
|
|
14482
|
+
* frames is the wrong question for a classifier that labels 1–3 frames
|
|
14483
|
+
* per episode. The count window is the brake that drops a single-frame
|
|
14484
|
+
* false positive; the rule's own `throttle` cooldown is the other. The
|
|
14485
|
+
* per-label confidence floor is the analyzer's (`classificationMinScore`,
|
|
14486
|
+
* per device) — a label only reaches this condition if the classifier was
|
|
14487
|
+
* already confident enough. `confirmHits: 1` restores first-frame fire.
|
|
14446
14488
|
* - **LEVEL mode — `dbThreshold` present, no labels.** The sampling window IS
|
|
14447
14489
|
* the condition: at least `hitPercent`% of the samples over
|
|
14448
14490
|
* `samplingSeconds` must be at or above `dbThreshold` dBFS (see
|
|
@@ -14469,14 +14511,22 @@ var NcOccupancyConditionSchema = object({
|
|
|
14469
14511
|
* an operator who typed `dog` mean the same thing.
|
|
14470
14512
|
*/
|
|
14471
14513
|
var NcAudioConditionSchema = object({
|
|
14472
|
-
/** LABEL MODE: audio macro labels. Present ⇒
|
|
14514
|
+
/** LABEL MODE: audio macro labels. Present ⇒ count-in-window confirm. */
|
|
14473
14515
|
labels: array(string().min(1)).min(1).optional(),
|
|
14474
14516
|
/** LEVEL MODE: floor in dBFS (negative-going, `0` = full scale). */
|
|
14475
14517
|
dbThreshold: number().min(-96).max(0).optional(),
|
|
14476
14518
|
/** LEVEL MODE ONLY: percentage of the window's samples that must be hits (1–100). */
|
|
14477
14519
|
hitPercent: number().int().min(1).max(100).default(60),
|
|
14478
14520
|
/** LEVEL MODE ONLY: length of the sampling window in seconds. */
|
|
14479
|
-
samplingSeconds: number().int().min(1).max(300).default(10)
|
|
14521
|
+
samplingSeconds: number().int().min(1).max(300).default(10),
|
|
14522
|
+
/**
|
|
14523
|
+
* LABEL MODE: how many labelled frames must land inside
|
|
14524
|
+
* {@link NcAudioConditionSchema.shape.confirmWindowSec} before dispatch.
|
|
14525
|
+
* Absent ⇒ 2 (the matcher default). `1` is first-frame fire.
|
|
14526
|
+
*/
|
|
14527
|
+
confirmHits: number().int().min(1).max(20).optional(),
|
|
14528
|
+
/** LABEL MODE: the window those frames must share, in seconds. Absent ⇒ 5. */
|
|
14529
|
+
confirmWindowSec: number().int().min(1).max(60).optional()
|
|
14480
14530
|
});
|
|
14481
14531
|
/**
|
|
14482
14532
|
* Which zone-crossing DIRECTION a rule accepts (`ObjectEvent.zoneCrossing`).
|
|
@@ -16850,6 +16900,46 @@ var RecentTracksPageSchema = object({
|
|
|
16850
16900
|
/** Cursor for the next page, or null when this page is the last. */
|
|
16851
16901
|
nextCursor: string().nullable()
|
|
16852
16902
|
});
|
|
16903
|
+
var LIST_GROUPS_DEFAULT_LIMIT = 40;
|
|
16904
|
+
var LIST_GROUPS_MAX_LIMIT = 100;
|
|
16905
|
+
var AnalyticsGroupRecordSchema = object({
|
|
16906
|
+
id: string(),
|
|
16907
|
+
deviceId: number().int(),
|
|
16908
|
+
openedAt: number().int(),
|
|
16909
|
+
closedAt: number().int(),
|
|
16910
|
+
timestamp: number().int(),
|
|
16911
|
+
memberCount: number().int(),
|
|
16912
|
+
memberTrackIds: array(string()).readonly(),
|
|
16913
|
+
className: string(),
|
|
16914
|
+
classes: array(string()).readonly(),
|
|
16915
|
+
/** Relative event-media path, or null when the group has no picture yet. */
|
|
16916
|
+
mediaUrl: string().nullable(),
|
|
16917
|
+
singleton: boolean()
|
|
16918
|
+
});
|
|
16919
|
+
var AnalyticsGroupMemberSchema = object({
|
|
16920
|
+
trackId: string(),
|
|
16921
|
+
deviceId: number().int(),
|
|
16922
|
+
className: string(),
|
|
16923
|
+
firstSeen: number().int(),
|
|
16924
|
+
lastSeen: number().int(),
|
|
16925
|
+
mediaUrl: string().nullable()
|
|
16926
|
+
});
|
|
16927
|
+
var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
|
|
16928
|
+
var ListGroupsQueryInput = object({
|
|
16929
|
+
/** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
|
|
16930
|
+
deviceIds: array(number()),
|
|
16931
|
+
/** Window lower bound on `closedAt` (inclusive). */
|
|
16932
|
+
since: number().optional(),
|
|
16933
|
+
/** Window upper bound on `openedAt` (inclusive). */
|
|
16934
|
+
until: number().optional(),
|
|
16935
|
+
limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
|
|
16936
|
+
/** Opaque continuation cursor from a previous page's `nextCursor`. */
|
|
16937
|
+
cursor: string().optional()
|
|
16938
|
+
});
|
|
16939
|
+
var ListGroupsPageSchema = object({
|
|
16940
|
+
groups: array(AnalyticsGroupRecordSchema).readonly(),
|
|
16941
|
+
nextCursor: string().nullable()
|
|
16942
|
+
});
|
|
16853
16943
|
var KeyEventQueryInput = object({
|
|
16854
16944
|
deviceId: number(),
|
|
16855
16945
|
/** Window lower bound (track firstSeen ≥ since). */
|
|
@@ -16925,7 +17015,9 @@ var TrackCascadeCountsSchema = object({
|
|
|
16925
17015
|
/** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
|
|
16926
17016
|
plates: number().int(),
|
|
16927
17017
|
/** Per-track CLIP search vectors removed (best-effort). */
|
|
16928
|
-
embeddings: number().int()
|
|
17018
|
+
embeddings: number().int(),
|
|
17019
|
+
/** Group membership + group rows removed with their last member (best-effort). */
|
|
17020
|
+
groups: number().int()
|
|
16929
17021
|
});
|
|
16930
17022
|
/** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
|
|
16931
17023
|
var DiskReconcileCountsSchema = object({
|
|
@@ -17071,7 +17163,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
17071
17163
|
* stationary registry). Default false: the timeline lists passages,
|
|
17072
17164
|
* not parking records (operator decision, 2026-08-15). */
|
|
17073
17165
|
includeStationary: boolean().optional()
|
|
17074
|
-
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(
|
|
17166
|
+
}), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
|
|
17167
|
+
deviceId: number(),
|
|
17168
|
+
groupId: string().min(1)
|
|
17169
|
+
}), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
17075
17170
|
kind: "mutation",
|
|
17076
17171
|
auth: "admin"
|
|
17077
17172
|
}), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
|
|
@@ -17381,7 +17476,8 @@ var PipelineModelOptionSchema = object({
|
|
|
17381
17476
|
sizeMB: number()
|
|
17382
17477
|
})),
|
|
17383
17478
|
group: ModelVariantGroupSchema.optional(),
|
|
17384
|
-
legacy: boolean().optional()
|
|
17479
|
+
legacy: boolean().optional(),
|
|
17480
|
+
provider: ModelProviderIdSchema.optional()
|
|
17385
17481
|
});
|
|
17386
17482
|
var ConfigFieldBridge = custom();
|
|
17387
17483
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -24069,7 +24165,12 @@ var PlateInfoSchema = object({
|
|
|
24069
24165
|
plateBbox: BoundingBoxSchema.optional(),
|
|
24070
24166
|
/** keyFrame parity: MediaStore key of the track's native-resolution key frame. */
|
|
24071
24167
|
keyFrameMediaKey: string().optional(),
|
|
24072
|
-
base64: string().optional()
|
|
24168
|
+
base64: string().optional(),
|
|
24169
|
+
/**
|
|
24170
|
+
* Same crop as a data-plane URL. `getPlateByTrack` returns this and
|
|
24171
|
+
* never inlines JPEG; `listPlates` still inlines for the admin-ui.
|
|
24172
|
+
*/
|
|
24173
|
+
cropUrl: string().optional()
|
|
24073
24174
|
});
|
|
24074
24175
|
var MediaFileLiteSchema = object({
|
|
24075
24176
|
key: string(),
|
|
@@ -28161,6 +28262,12 @@ Object.freeze({
|
|
|
28161
28262
|
addonId: null,
|
|
28162
28263
|
access: "view"
|
|
28163
28264
|
},
|
|
28265
|
+
"deviceManager.getBindingsBatch": {
|
|
28266
|
+
capName: "device-manager",
|
|
28267
|
+
capScope: "system",
|
|
28268
|
+
addonId: null,
|
|
28269
|
+
access: "view"
|
|
28270
|
+
},
|
|
28164
28271
|
"deviceManager.getChildren": {
|
|
28165
28272
|
capName: "device-manager",
|
|
28166
28273
|
capScope: "system",
|
|
@@ -28221,6 +28328,12 @@ Object.freeze({
|
|
|
28221
28328
|
addonId: null,
|
|
28222
28329
|
access: "view"
|
|
28223
28330
|
},
|
|
28331
|
+
"deviceManager.getLinkedDevicesBatch": {
|
|
28332
|
+
capName: "device-manager",
|
|
28333
|
+
capScope: "system",
|
|
28334
|
+
addonId: null,
|
|
28335
|
+
access: "view"
|
|
28336
|
+
},
|
|
28224
28337
|
"deviceManager.getRoleDisplayDefaults": {
|
|
28225
28338
|
capName: "device-manager",
|
|
28226
28339
|
capScope: "system",
|
|
@@ -29991,6 +30104,12 @@ Object.freeze({
|
|
|
29991
30104
|
addonId: null,
|
|
29992
30105
|
access: "view"
|
|
29993
30106
|
},
|
|
30107
|
+
"pipelineAnalytics.getGroup": {
|
|
30108
|
+
capName: "pipeline-analytics",
|
|
30109
|
+
capScope: "device",
|
|
30110
|
+
addonId: null,
|
|
30111
|
+
access: "view"
|
|
30112
|
+
},
|
|
29994
30113
|
"pipelineAnalytics.getKeyEvents": {
|
|
29995
30114
|
capName: "pipeline-analytics",
|
|
29996
30115
|
capScope: "device",
|
|
@@ -30075,6 +30194,12 @@ Object.freeze({
|
|
|
30075
30194
|
addonId: null,
|
|
30076
30195
|
access: "view"
|
|
30077
30196
|
},
|
|
30197
|
+
"pipelineAnalytics.listGroups": {
|
|
30198
|
+
capName: "pipeline-analytics",
|
|
30199
|
+
capScope: "device",
|
|
30200
|
+
addonId: null,
|
|
30201
|
+
access: "view"
|
|
30202
|
+
},
|
|
30078
30203
|
"pipelineAnalytics.listOpsLog": {
|
|
30079
30204
|
capName: "pipeline-analytics",
|
|
30080
30205
|
capScope: "device",
|
|
@@ -32856,6 +32981,11 @@ Object.freeze({
|
|
|
32856
32981
|
form: "single",
|
|
32857
32982
|
optional: false
|
|
32858
32983
|
}],
|
|
32984
|
+
"deviceManager.getBindingsBatch": [{
|
|
32985
|
+
name: "deviceIds",
|
|
32986
|
+
form: "array",
|
|
32987
|
+
optional: false
|
|
32988
|
+
}],
|
|
32859
32989
|
"deviceManager.getChildren": [{
|
|
32860
32990
|
name: "parentDeviceId",
|
|
32861
32991
|
form: "single",
|
|
@@ -32901,6 +33031,11 @@ Object.freeze({
|
|
|
32901
33031
|
form: "single",
|
|
32902
33032
|
optional: false
|
|
32903
33033
|
}],
|
|
33034
|
+
"deviceManager.getLinkedDevicesBatch": [{
|
|
33035
|
+
name: "deviceIds",
|
|
33036
|
+
form: "array",
|
|
33037
|
+
optional: false
|
|
33038
|
+
}],
|
|
32904
33039
|
"deviceManager.getSettingsSchema": [{
|
|
32905
33040
|
name: "deviceId",
|
|
32906
33041
|
form: "single",
|
|
@@ -32921,6 +33056,11 @@ Object.freeze({
|
|
|
32921
33056
|
form: "single",
|
|
32922
33057
|
optional: false
|
|
32923
33058
|
}],
|
|
33059
|
+
"deviceManager.listAll": [{
|
|
33060
|
+
name: "deviceIds",
|
|
33061
|
+
form: "array",
|
|
33062
|
+
optional: true
|
|
33063
|
+
}],
|
|
32924
33064
|
"deviceManager.loadConfig": [{
|
|
32925
33065
|
name: "deviceId",
|
|
32926
33066
|
form: "single",
|
|
@@ -33494,6 +33634,11 @@ Object.freeze({
|
|
|
33494
33634
|
form: "single",
|
|
33495
33635
|
optional: false
|
|
33496
33636
|
}],
|
|
33637
|
+
"pipelineAnalytics.getGroup": [{
|
|
33638
|
+
name: "deviceId",
|
|
33639
|
+
form: "single",
|
|
33640
|
+
optional: false
|
|
33641
|
+
}],
|
|
33497
33642
|
"pipelineAnalytics.getKeyEvents": [{
|
|
33498
33643
|
name: "deviceId",
|
|
33499
33644
|
form: "single",
|
|
@@ -33549,6 +33694,11 @@ Object.freeze({
|
|
|
33549
33694
|
form: "array",
|
|
33550
33695
|
optional: false
|
|
33551
33696
|
}],
|
|
33697
|
+
"pipelineAnalytics.listGroups": [{
|
|
33698
|
+
name: "deviceIds",
|
|
33699
|
+
form: "array",
|
|
33700
|
+
optional: false
|
|
33701
|
+
}],
|
|
33552
33702
|
"pipelineAnalytics.listOpsLog": [{
|
|
33553
33703
|
name: "deviceId",
|
|
33554
33704
|
form: "single",
|