@camstack/addon-provider-reolink 1.1.20 → 1.1.22
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 +496 -283
- package/dist/addon.mjs +496 -283
- package/package.json +4 -1
package/dist/addon.js
CHANGED
|
@@ -4655,7 +4655,7 @@ function _instanceof(cls, params = {}) {
|
|
|
4655
4655
|
return inst;
|
|
4656
4656
|
}
|
|
4657
4657
|
//#endregion
|
|
4658
|
-
//#region ../types/dist/sleep-
|
|
4658
|
+
//#region ../types/dist/sleep-DJaTV2D7.mjs
|
|
4659
4659
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4660
4660
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4661
4661
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -4841,6 +4841,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
4841
4841
|
*/
|
|
4842
4842
|
EventCategory["PipelineCameraUpdated"] = "pipeline.camera-updated";
|
|
4843
4843
|
/**
|
|
4844
|
+
* The cluster camera-source OWNER changed (`clusterRoles.ingestNode`).
|
|
4845
|
+
* Emitted by addon-pipeline-orchestrator whenever it (re)derives node
|
|
4846
|
+
* capabilities — at boot, on agent online/offline, and on an ingest-node
|
|
4847
|
+
* flip. Carries the resolved `ownerNodeId`. The stream-broker consumes it to
|
|
4848
|
+
* keep its ingest-owner-gate decision current WITHOUT a per-`ensureBroker`
|
|
4849
|
+
* cross-process `getIngestOwner` query (push the authority's decision instead
|
|
4850
|
+
* of polling it on the hot path). Idempotent state — re-emitted on every
|
|
4851
|
+
* topology change, so a dropped event self-heals on the next one (plus the
|
|
4852
|
+
* broker's long backstop reconcile query).
|
|
4853
|
+
*/
|
|
4854
|
+
EventCategory["PipelineIngestOwnerChanged"] = "pipeline.ingest-owner-changed";
|
|
4855
|
+
/**
|
|
4844
4856
|
* Periodic snapshot of per-node pipeline-runner load
|
|
4845
4857
|
* (`RunnerLocalLoad`). Emitted ~1Hz by every runner so UI dashboards
|
|
4846
4858
|
* subscribe instead of polling `pipelineRunner.getLocalLoad`.
|
|
@@ -5364,10 +5376,6 @@ function hydrateField(field, values) {
|
|
|
5364
5376
|
};
|
|
5365
5377
|
}
|
|
5366
5378
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
5367
|
-
if (field.type === "password") return {
|
|
5368
|
-
...field,
|
|
5369
|
-
value: ""
|
|
5370
|
-
};
|
|
5371
5379
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
5372
5380
|
return {
|
|
5373
5381
|
...field,
|
|
@@ -6755,6 +6763,9 @@ function method(input, output, options) {
|
|
|
6755
6763
|
function event(data) {
|
|
6756
6764
|
return { data };
|
|
6757
6765
|
}
|
|
6766
|
+
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6767
|
+
var VersionOutputSchema$1 = object({ version: string() });
|
|
6768
|
+
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6758
6769
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6759
6770
|
var VersionOutputSchema = object({ version: string() });
|
|
6760
6771
|
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
@@ -6948,6 +6959,36 @@ var ModelFormatsSchema = object({
|
|
|
6948
6959
|
tflite: ModelFormatEntrySchema.optional(),
|
|
6949
6960
|
pt: ModelFormatEntrySchema.optional()
|
|
6950
6961
|
});
|
|
6962
|
+
/**
|
|
6963
|
+
* Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
|
|
6964
|
+
* the reduced `PipelineModelOption` returned in `pipeline.getSchema()` so the
|
|
6965
|
+
* grouped Family→Tier→Variant picker renders identically in the config UI and
|
|
6966
|
+
* in the pipeline/device steppers. The flat `id` stays the source of truth for
|
|
6967
|
+
* resolution/download/persistence; this is a presentation overlay resolved back
|
|
6968
|
+
* to an `id`.
|
|
6969
|
+
*/
|
|
6970
|
+
var ModelVariantGroupSchema = object({
|
|
6971
|
+
/** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
|
|
6972
|
+
family: string(),
|
|
6973
|
+
/** Size within the family, e.g. `n` | `s` | `m` | `l`. */
|
|
6974
|
+
tier: string(),
|
|
6975
|
+
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
6976
|
+
precision: _enum(["fp32", "int8"]).optional(),
|
|
6977
|
+
/**
|
|
6978
|
+
* Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
|
|
6979
|
+
* latency-optimized export (e.g. ReLU-activation variant) — the slot the
|
|
6980
|
+
* future performance variants plug into.
|
|
6981
|
+
*/
|
|
6982
|
+
optimization: _enum(["standard", "fast"]).optional(),
|
|
6983
|
+
/**
|
|
6984
|
+
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
6985
|
+
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
6986
|
+
* cheap latency lever — especially on Apple ANE and the Intel N100 — at a
|
|
6987
|
+
* small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
|
|
6988
|
+
* the group so the selector can offer it as a variant axis.
|
|
6989
|
+
*/
|
|
6990
|
+
resolution: number().int().positive().optional()
|
|
6991
|
+
});
|
|
6951
6992
|
var ModelCatalogEntrySchema = object({
|
|
6952
6993
|
id: string(),
|
|
6953
6994
|
name: string(),
|
|
@@ -6977,7 +7018,43 @@ var ModelCatalogEntrySchema = object({
|
|
|
6977
7018
|
* Auxiliary files required at runtime (labels JSON, charset dict, etc.).
|
|
6978
7019
|
* Downloaded into the same modelsDir alongside the model file.
|
|
6979
7020
|
*/
|
|
6980
|
-
extraFiles: array(ModelExtraFileSchema).readonly().optional()
|
|
7021
|
+
extraFiles: array(ModelExtraFileSchema).readonly().optional(),
|
|
7022
|
+
/**
|
|
7023
|
+
* LEGACY entry — retained in the catalog so a persisted operator selection
|
|
7024
|
+
* still RESOLVES (and can be re-activated), but hidden from the selectable
|
|
7025
|
+
* model list and excluded from the auto format-default pick. Set on the
|
|
7026
|
+
* superseded / consolidated models (older lineages, redundant fp16 IRs) so
|
|
7027
|
+
* the active lineup stays the coherent curated ladder without deleting a
|
|
7028
|
+
* model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
|
|
7029
|
+
* an explicit legacy id that has a build for the node's format.
|
|
7030
|
+
*/
|
|
7031
|
+
legacy: boolean().optional(),
|
|
7032
|
+
/**
|
|
7033
|
+
* Measured quality/latency metadata — populated from the benchmark addon on
|
|
7034
|
+
* the real node classes. Absent = not yet measured (most entries today; the
|
|
7035
|
+
* catalog historically carried only `sizeMB`, a poor cross-architecture
|
|
7036
|
+
* speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
|
|
7037
|
+
*/
|
|
7038
|
+
metrics: object({
|
|
7039
|
+
map50: number().optional(),
|
|
7040
|
+
p95LatencyMs: record(string(), number()).optional()
|
|
7041
|
+
}).optional(),
|
|
7042
|
+
/**
|
|
7043
|
+
* SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
|
|
7044
|
+
* YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
|
|
7045
|
+
* the retraining addon and any future commercial distribution.
|
|
7046
|
+
*/
|
|
7047
|
+
license: string().optional(),
|
|
7048
|
+
/**
|
|
7049
|
+
* Variant-selector grouping. The UI groups models by `family` + `tier` and
|
|
7050
|
+
* offers `precision` / `optimization` as variant axes WITHIN a tier — so all
|
|
7051
|
+
* of a family's sizes and quantizations collapse into one grouped picker
|
|
7052
|
+
* instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
|
|
7053
|
+
* (legacy / custom models) — never shown in the grouped selector. The flat
|
|
7054
|
+
* `id` stays the source of truth for resolution/download/persistence; grouping
|
|
7055
|
+
* is a presentation overlay resolved back to an `id`.
|
|
7056
|
+
*/
|
|
7057
|
+
group: ModelVariantGroupSchema.optional()
|
|
6981
7058
|
});
|
|
6982
7059
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
6983
7060
|
format: literal("openvino"),
|
|
@@ -7213,8 +7290,8 @@ var RecordingModeSchema = _enum([
|
|
|
7213
7290
|
"onAudioThreshold"
|
|
7214
7291
|
]);
|
|
7215
7292
|
/**
|
|
7216
|
-
* First-class, authoritative per-camera storage mode — the
|
|
7217
|
-
* reads directly (never inferred from `rules`):
|
|
7293
|
+
* First-class, authoritative per-camera storage mode — the explicit choice the
|
|
7294
|
+
* UI reads directly (never inferred from `rules`):
|
|
7218
7295
|
* - `off` — not recording.
|
|
7219
7296
|
* - `events` — record only around triggers (motion / audio threshold),
|
|
7220
7297
|
* with pre/post-buffer.
|
|
@@ -9416,26 +9493,13 @@ onBrightnessChanged: { data: object({
|
|
|
9416
9493
|
*/
|
|
9417
9494
|
runtimeState: BrightnessStatusSchema
|
|
9418
9495
|
};
|
|
9496
|
+
/** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
|
|
9419
9497
|
var StreamFormatSchema = _enum([
|
|
9420
9498
|
"webrtc",
|
|
9421
9499
|
"hls",
|
|
9422
9500
|
"mjpeg",
|
|
9423
9501
|
"rtsp"
|
|
9424
9502
|
]);
|
|
9425
|
-
var StreamInfoSchema = object({
|
|
9426
|
-
streamId: string(),
|
|
9427
|
-
format: StreamFormatSchema,
|
|
9428
|
-
url: string().nullable(),
|
|
9429
|
-
active: boolean()
|
|
9430
|
-
});
|
|
9431
|
-
method(object({
|
|
9432
|
-
streamId: string(),
|
|
9433
|
-
sourceUrl: string(),
|
|
9434
|
-
codec: string().optional()
|
|
9435
|
-
}), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
|
|
9436
|
-
streamId: string(),
|
|
9437
|
-
format: StreamFormatSchema
|
|
9438
|
-
}), string().nullable()), method(_void(), array(StreamInfoSchema));
|
|
9439
9503
|
var RtspRestreamEntrySchema = object({
|
|
9440
9504
|
brokerId: string(),
|
|
9441
9505
|
url: string(),
|
|
@@ -10303,37 +10367,7 @@ var consumablesCapability = {
|
|
|
10303
10367
|
scope: "device",
|
|
10304
10368
|
deviceNative: true,
|
|
10305
10369
|
mode: "singleton",
|
|
10306
|
-
deviceTypes:
|
|
10307
|
-
DeviceType.Camera,
|
|
10308
|
-
DeviceType.Hub,
|
|
10309
|
-
DeviceType.Light,
|
|
10310
|
-
DeviceType.Siren,
|
|
10311
|
-
DeviceType.Switch,
|
|
10312
|
-
DeviceType.Sensor,
|
|
10313
|
-
DeviceType.Thermostat,
|
|
10314
|
-
DeviceType.Button,
|
|
10315
|
-
DeviceType.EventEmitter,
|
|
10316
|
-
DeviceType.Update,
|
|
10317
|
-
DeviceType.Generic,
|
|
10318
|
-
DeviceType.Notifier,
|
|
10319
|
-
DeviceType.Script,
|
|
10320
|
-
DeviceType.Automation,
|
|
10321
|
-
DeviceType.Lock,
|
|
10322
|
-
DeviceType.Cover,
|
|
10323
|
-
DeviceType.Valve,
|
|
10324
|
-
DeviceType.Humidifier,
|
|
10325
|
-
DeviceType.WaterHeater,
|
|
10326
|
-
DeviceType.Fan,
|
|
10327
|
-
DeviceType.MediaPlayer,
|
|
10328
|
-
DeviceType.AlarmPanel,
|
|
10329
|
-
DeviceType.Control,
|
|
10330
|
-
DeviceType.Presence,
|
|
10331
|
-
DeviceType.Weather,
|
|
10332
|
-
DeviceType.Vacuum,
|
|
10333
|
-
DeviceType.LawnMower,
|
|
10334
|
-
DeviceType.Container,
|
|
10335
|
-
DeviceType.Image
|
|
10336
|
-
],
|
|
10370
|
+
deviceTypes: Object.values(DeviceType),
|
|
10337
10371
|
deviceConfig: { ui: {
|
|
10338
10372
|
kind: "widget",
|
|
10339
10373
|
widgetId: "host/consumables-panel",
|
|
@@ -11791,7 +11825,7 @@ var BoundingBoxSchema = object({
|
|
|
11791
11825
|
w: number(),
|
|
11792
11826
|
h: number()
|
|
11793
11827
|
});
|
|
11794
|
-
|
|
11828
|
+
object({
|
|
11795
11829
|
class: string(),
|
|
11796
11830
|
originalClass: string(),
|
|
11797
11831
|
score: number(),
|
|
@@ -11926,7 +11960,6 @@ var PipelineDefaultStepSchema = lazy(() => object({
|
|
|
11926
11960
|
enabled: boolean(),
|
|
11927
11961
|
modelId: string(),
|
|
11928
11962
|
children: array(PipelineDefaultStepSchema).readonly(),
|
|
11929
|
-
engine: PipelineEngineChoiceSchema.optional(),
|
|
11930
11963
|
group: string().optional(),
|
|
11931
11964
|
settings: record(string(), unknown()).optional()
|
|
11932
11965
|
}));
|
|
@@ -11951,7 +11984,9 @@ var PipelineModelOptionSchema = object({
|
|
|
11951
11984
|
formats: record(string(), object({
|
|
11952
11985
|
downloaded: boolean(),
|
|
11953
11986
|
sizeMB: number()
|
|
11954
|
-
}))
|
|
11987
|
+
})),
|
|
11988
|
+
group: ModelVariantGroupSchema.optional(),
|
|
11989
|
+
legacy: boolean().optional()
|
|
11955
11990
|
});
|
|
11956
11991
|
var ConfigFieldBridge = custom$2();
|
|
11957
11992
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -11981,11 +12016,6 @@ var PipelineSchemaSchema = object({
|
|
|
11981
12016
|
selectedEngine: PipelineEngineChoiceSchema,
|
|
11982
12017
|
slots: array(PipelineSlotSchemaSchema).readonly()
|
|
11983
12018
|
});
|
|
11984
|
-
var DetectorOutputSchema = object({
|
|
11985
|
-
detections: array(SpatialDetectionSchema).readonly(),
|
|
11986
|
-
inferenceMs: number(),
|
|
11987
|
-
modelId: string()
|
|
11988
|
-
});
|
|
11989
12019
|
var EngineProvisioningSchema = object({
|
|
11990
12020
|
runtimeId: _enum([
|
|
11991
12021
|
"onnx",
|
|
@@ -12002,15 +12032,42 @@ var EngineProvisioningSchema = object({
|
|
|
12002
12032
|
]),
|
|
12003
12033
|
progress: number().optional(),
|
|
12004
12034
|
error: string().optional(),
|
|
12005
|
-
nextRetryAt: number().optional()
|
|
12035
|
+
nextRetryAt: number().optional(),
|
|
12036
|
+
/**
|
|
12037
|
+
* Gate A (config-correctness gate at engine change): human-readable
|
|
12038
|
+
* config issues surfaced EAGERLY when the node's engine changes — model
|
|
12039
|
+
* substitutions ("chose X, running Y") and zero-build steps ("no model
|
|
12040
|
+
* has a <format> build"). Additive/optional: informational only, never
|
|
12041
|
+
* enforced here — `assertEngineReady` (readiness) still gates inference.
|
|
12042
|
+
* Absent/empty when the node-default tree resolves cleanly.
|
|
12043
|
+
*/
|
|
12044
|
+
configIssues: array(string()).optional()
|
|
12006
12045
|
});
|
|
12007
12046
|
var PipelineStepInputSchema = lazy(() => object({
|
|
12008
12047
|
addonId: string(),
|
|
12009
|
-
modelId: string(),
|
|
12048
|
+
modelId: string().optional(),
|
|
12010
12049
|
enabled: boolean().default(true),
|
|
12011
12050
|
children: array(PipelineStepInputSchema).optional(),
|
|
12012
12051
|
settings: record(string(), unknown()).optional()
|
|
12013
12052
|
}));
|
|
12053
|
+
var ModelSubstitutionSchema = object({
|
|
12054
|
+
addonId: string(),
|
|
12055
|
+
chosen: string(),
|
|
12056
|
+
running: string(),
|
|
12057
|
+
format: string()
|
|
12058
|
+
});
|
|
12059
|
+
var PipelineValidationIssueSchema = object({
|
|
12060
|
+
addonId: string(),
|
|
12061
|
+
kind: _enum(["unknown-addon", "no-format-build"]),
|
|
12062
|
+
detail: string()
|
|
12063
|
+
});
|
|
12064
|
+
var PipelineValidationResultSchema = object({
|
|
12065
|
+
ok: boolean(),
|
|
12066
|
+
issues: array(PipelineValidationIssueSchema).readonly(),
|
|
12067
|
+
substitutions: array(ModelSubstitutionSchema).readonly(),
|
|
12068
|
+
/** The node's `currentEngine.format` this validation ran against. */
|
|
12069
|
+
format: string()
|
|
12070
|
+
});
|
|
12014
12071
|
var ReferenceImageEntrySchema = object({
|
|
12015
12072
|
filename: string(),
|
|
12016
12073
|
stepIds: array(string()).readonly().optional()
|
|
@@ -12081,7 +12138,13 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12081
12138
|
})) }), object({ success: literal(true) }), {
|
|
12082
12139
|
kind: "mutation",
|
|
12083
12140
|
auth: "admin"
|
|
12084
|
-
}), method(
|
|
12141
|
+
}), method(object({ nodeId: string() }), object({
|
|
12142
|
+
success: literal(true),
|
|
12143
|
+
clearedDevices: number()
|
|
12144
|
+
}), {
|
|
12145
|
+
kind: "mutation",
|
|
12146
|
+
auth: "admin"
|
|
12147
|
+
}), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({ steps: array(PipelineStepInputSchema) }), PipelineValidationResultSchema), method(_void(), array(PipelineTemplateSchema$1).readonly()), method(object({
|
|
12085
12148
|
name: string(),
|
|
12086
12149
|
steps: array(PipelineTemplateStepSchema).readonly(),
|
|
12087
12150
|
engine: PipelineEngineChoiceSchema
|
|
@@ -12098,10 +12161,6 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12098
12161
|
modelId: string(),
|
|
12099
12162
|
format: ModelFormatSchema$1
|
|
12100
12163
|
}), object({ success: literal(true) }), { kind: "mutation" }), method(object({
|
|
12101
|
-
addonId: string(),
|
|
12102
|
-
frame: FrameInputSchema,
|
|
12103
|
-
config: record(string(), unknown()).optional()
|
|
12104
|
-
}), DetectorOutputSchema), method(object({
|
|
12105
12164
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
12106
12165
|
steps: array(PipelineStepInputSchema).min(1),
|
|
12107
12166
|
frame: FrameInputSchema.optional(),
|
|
@@ -12374,6 +12433,13 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
|
|
|
12374
12433
|
kind: literal("remote-restream"),
|
|
12375
12434
|
/** The camera's source-owner node (slice 1: always the hub). */
|
|
12376
12435
|
ownerNodeId: string(),
|
|
12436
|
+
/**
|
|
12437
|
+
* The owner's LAN-reachable host, resolved by the orchestrator from the
|
|
12438
|
+
* per-node `reachableHost` override (Cluster UI). When present the runner
|
|
12439
|
+
* dials THIS host for the owner's restream, in preference to the
|
|
12440
|
+
* `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
|
|
12441
|
+
*/
|
|
12442
|
+
ownerReachableHost: string().optional(),
|
|
12377
12443
|
/** Operator override for the owner host the runner dials. */
|
|
12378
12444
|
hubHostnameOverride: string().optional()
|
|
12379
12445
|
})]).describe("Per-camera frame-source mode for the runner (P2c)");
|
|
@@ -12382,13 +12448,11 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
|
|
|
12382
12448
|
* specific runner instance via `attachCamera`. Carries everything the
|
|
12383
12449
|
* runner needs to subscribe to the local broker and execute inference.
|
|
12384
12450
|
*
|
|
12385
|
-
* Stateless-pipeline model: the
|
|
12386
|
-
*
|
|
12387
|
-
*
|
|
12388
|
-
*
|
|
12389
|
-
*
|
|
12390
|
-
* `engine`/`steps`/`audio` are optional during the additive migration
|
|
12391
|
-
* window; once orchestrator + UI are migrated they become required.
|
|
12451
|
+
* Stateless-pipeline model: the pipeline content (`steps`, optional
|
|
12452
|
+
* `audio`) travels with the attach payload. The runner keeps it in RAM
|
|
12453
|
+
* for the lifetime of the attach — on rebalance, edit, or restart the
|
|
12454
|
+
* orchestrator re-sends the latest snapshot. Engine is NOT carried: it is
|
|
12455
|
+
* node-local, resolved by the executing runner at dispatch time.
|
|
12392
12456
|
*/
|
|
12393
12457
|
var RunnerCameraConfigSchema = object({
|
|
12394
12458
|
deviceId: number(),
|
|
@@ -12439,14 +12503,11 @@ var RunnerCameraConfigSchema = object({
|
|
|
12439
12503
|
*/
|
|
12440
12504
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
12441
12505
|
pipelineEnabled: boolean().default(true),
|
|
12442
|
-
/** Engine choice for video steps (runtime+backend+format). */
|
|
12443
|
-
engine: PipelineEngineChoiceSchema.optional(),
|
|
12444
12506
|
/** Ordered tree of video steps. Absent → runner skips video detection. */
|
|
12445
12507
|
steps: array(PipelineStepInputSchema).readonly().optional(),
|
|
12446
12508
|
/** Audio classification branch. `enabled:false` disables, null skips. */
|
|
12447
12509
|
audio: object({
|
|
12448
|
-
|
|
12449
|
-
modelId: string(),
|
|
12510
|
+
modelId: string().optional(),
|
|
12450
12511
|
enabled: boolean()
|
|
12451
12512
|
}).nullable().optional(),
|
|
12452
12513
|
/**
|
|
@@ -15464,7 +15525,9 @@ var AddonPageDeclarationSchema$1 = object({
|
|
|
15464
15525
|
icon: string(),
|
|
15465
15526
|
path: string(),
|
|
15466
15527
|
remoteName: string(),
|
|
15467
|
-
bundle: string()
|
|
15528
|
+
bundle: string(),
|
|
15529
|
+
section: string().optional(),
|
|
15530
|
+
sectionLabel: string().optional()
|
|
15468
15531
|
});
|
|
15469
15532
|
var AddonPageInfoSchema = object({
|
|
15470
15533
|
addonId: string(),
|
|
@@ -15504,7 +15567,18 @@ var AddonPageDeclarationSchema = object({
|
|
|
15504
15567
|
* the static-file route can compute an mtime-based cache-buster URL
|
|
15505
15568
|
* without a separate filesystem stat.
|
|
15506
15569
|
*/
|
|
15507
|
-
bundle: string()
|
|
15570
|
+
bundle: string(),
|
|
15571
|
+
/**
|
|
15572
|
+
* Sidebar section this page docks into. Well-known ids: `'detection'`,
|
|
15573
|
+
* `'cluster'`, `'administration'` — the page renders inside that group.
|
|
15574
|
+
* Any OTHER string creates (or joins) a custom section rendered after
|
|
15575
|
+
* the built-in groups; its label comes from `sectionLabel` (first
|
|
15576
|
+
* declaration wins), falling back to the id. Absent → the legacy
|
|
15577
|
+
* "Addon Pages" group.
|
|
15578
|
+
*/
|
|
15579
|
+
section: string().optional(),
|
|
15580
|
+
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
15581
|
+
sectionLabel: string().optional()
|
|
15508
15582
|
});
|
|
15509
15583
|
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
15510
15584
|
var AddonHttpRouteSchema = object({
|
|
@@ -15720,6 +15794,17 @@ var WidgetMetadataSchema = object({
|
|
|
15720
15794
|
deviceContext: boolean().default(false),
|
|
15721
15795
|
integrationContext: boolean().default(false)
|
|
15722
15796
|
}),
|
|
15797
|
+
/**
|
|
15798
|
+
* Loadable BEFORE authentication. The normal widget registry listing
|
|
15799
|
+
* (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
|
|
15800
|
+
* (the login page) cannot discover a widget through it. A widget that
|
|
15801
|
+
* declares `preAuth: true` marks itself as safe to mount on a pre-auth
|
|
15802
|
+
* screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
|
|
15803
|
+
* login-method contribution channel (see `login-method.cap.ts`) rather
|
|
15804
|
+
* than the authenticated registry, and its bundle is served by the
|
|
15805
|
+
* public `/api/addon-widgets/:addonId/*` static route. Defaults false.
|
|
15806
|
+
*/
|
|
15807
|
+
preAuth: boolean().optional().default(false),
|
|
15723
15808
|
/** Dashboard placement HINTS (operator can override per instance). */
|
|
15724
15809
|
defaultSize: WidgetSizeEnum.default("md"),
|
|
15725
15810
|
allowedSizes: array(WidgetSizeEnum).readonly().default([
|
|
@@ -16021,6 +16106,66 @@ method(object({
|
|
|
16021
16106
|
password: string()
|
|
16022
16107
|
}), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
|
|
16023
16108
|
/**
|
|
16109
|
+
* `login-method` — collection cap through which auth addons contribute
|
|
16110
|
+
* their pre-auth login surfaces to the login page. This is the SINGLE,
|
|
16111
|
+
* generic mechanism that supersedes the dead `auth.listProviders` reader:
|
|
16112
|
+
* every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
|
|
16113
|
+
* `login-method` provider and the PUBLIC `auth.listLoginMethods`
|
|
16114
|
+
* procedure aggregates them for the unauthenticated login page.
|
|
16115
|
+
*
|
|
16116
|
+
* A contribution is a discriminated union on `kind`:
|
|
16117
|
+
*
|
|
16118
|
+
* - `redirect` — a declarative button. The login page renders a generic
|
|
16119
|
+
* button that navigates to `startUrl` (an addon-owned HTTP route).
|
|
16120
|
+
* Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
|
|
16121
|
+
* ZERO shell-side JS. A future SSO addon plugs in the same way — the
|
|
16122
|
+
* login page needs NO change.
|
|
16123
|
+
*
|
|
16124
|
+
* - `widget` — a Module-Federation widget the login page mounts (via
|
|
16125
|
+
* `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
|
|
16126
|
+
* login ceremony, which must run `@simplewebauthn/browser` INSIDE the
|
|
16127
|
+
* addon bundle. The referenced widget also declares `preAuth: true` in
|
|
16128
|
+
* its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
|
|
16129
|
+
* stamps a public `bundleUrl` from `addonId` + `bundle`.
|
|
16130
|
+
*
|
|
16131
|
+
* Every contribution carries a `stage`:
|
|
16132
|
+
* - `primary` — shown on the first credentials screen (OIDC /
|
|
16133
|
+
* magic-link buttons; a future usernameless passkey).
|
|
16134
|
+
* - `second-factor` — shown AFTER the password leg, gated on the
|
|
16135
|
+
* returned `factors` (passkey-as-2FA today).
|
|
16136
|
+
*
|
|
16137
|
+
* `mount: skip` — the cap is read server-side by the core auth router
|
|
16138
|
+
* (`registry.getCollection('login-method')`), never mounted as its own
|
|
16139
|
+
* tRPC router.
|
|
16140
|
+
*/
|
|
16141
|
+
/** When a login method renders in the two-phase login flow. */
|
|
16142
|
+
var LoginStageEnum = _enum(["primary", "second-factor"]);
|
|
16143
|
+
/** One login-method contribution — redirect button OR pre-auth widget. */
|
|
16144
|
+
var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
|
|
16145
|
+
kind: literal("redirect"),
|
|
16146
|
+
/** Stable id within the login-method set (e.g. `auth-oidc/google`). */
|
|
16147
|
+
id: string(),
|
|
16148
|
+
/** Operator-facing button label. */
|
|
16149
|
+
label: string(),
|
|
16150
|
+
/** lucide-react icon name. */
|
|
16151
|
+
icon: string().optional(),
|
|
16152
|
+
/** Addon-owned HTTP route the button navigates to (GET). */
|
|
16153
|
+
startUrl: string(),
|
|
16154
|
+
stage: LoginStageEnum
|
|
16155
|
+
}), object({
|
|
16156
|
+
kind: literal("widget"),
|
|
16157
|
+
/** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
|
|
16158
|
+
id: string(),
|
|
16159
|
+
/** Owning addon id — drives the public bundle URL + the MF namespace. */
|
|
16160
|
+
addonId: string(),
|
|
16161
|
+
/** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
|
|
16162
|
+
bundle: string(),
|
|
16163
|
+
/** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
|
|
16164
|
+
remote: WidgetRemoteSchema,
|
|
16165
|
+
stage: LoginStageEnum
|
|
16166
|
+
})]);
|
|
16167
|
+
method(_void(), array(LoginMethodContributionSchema).readonly());
|
|
16168
|
+
/**
|
|
16024
16169
|
* Orchestrator-side destination metadata. The orchestrator computes
|
|
16025
16170
|
* `id = <addonId>:<subId>` from its provider lookup so consumers
|
|
16026
16171
|
* (admin UI, restore flow) see one canonical key.
|
|
@@ -18321,11 +18466,11 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
18321
18466
|
timestamp: number()
|
|
18322
18467
|
});
|
|
18323
18468
|
var CameraPipelineConfigSchema = object({
|
|
18324
|
-
engine: PipelineEngineChoiceSchema,
|
|
18469
|
+
engine: PipelineEngineChoiceSchema.optional(),
|
|
18325
18470
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
18326
18471
|
audio: object({
|
|
18327
|
-
engine: PipelineEngineChoiceSchema,
|
|
18328
|
-
modelId: string(),
|
|
18472
|
+
engine: PipelineEngineChoiceSchema.optional(),
|
|
18473
|
+
modelId: string().optional(),
|
|
18329
18474
|
enabled: boolean(),
|
|
18330
18475
|
settings: record(string(), unknown()).readonly().optional()
|
|
18331
18476
|
}).nullable().optional()
|
|
@@ -18340,7 +18485,7 @@ var PipelineTemplateSchema = object({
|
|
|
18340
18485
|
});
|
|
18341
18486
|
var AgentAddonConfigSchema = object({
|
|
18342
18487
|
enabled: boolean(),
|
|
18343
|
-
modelId: string(),
|
|
18488
|
+
modelId: string().optional(),
|
|
18344
18489
|
settings: record(string(), unknown()).readonly()
|
|
18345
18490
|
});
|
|
18346
18491
|
var AgentPipelineSettingsSchema = object({
|
|
@@ -18350,12 +18495,25 @@ var AgentPipelineSettingsSchema = object({
|
|
|
18350
18495
|
detectWeight: number().positive().optional(),
|
|
18351
18496
|
/** Node is eligible to run the detection pipeline (decode + inference). */
|
|
18352
18497
|
detect: boolean().optional(),
|
|
18353
|
-
/**
|
|
18498
|
+
/**
|
|
18499
|
+
* DEPRECATED AND IGNORED. Decode is always co-located with its frame
|
|
18500
|
+
* consumer, so decode eligibility IS detect eligibility. Kept optional in
|
|
18501
|
+
* the schema ONLY so persisted stores written before the removal still
|
|
18502
|
+
* parse — no code reads it and no write path emits it.
|
|
18503
|
+
*/
|
|
18354
18504
|
decode: boolean().optional(),
|
|
18355
18505
|
/** Node is eligible to run audio-analyzer sessions. */
|
|
18356
18506
|
audio: boolean().optional(),
|
|
18357
18507
|
/** Node is eligible to be the ingest / source-owner (serve the restream). */
|
|
18358
|
-
ingest: boolean().optional()
|
|
18508
|
+
ingest: boolean().optional(),
|
|
18509
|
+
/**
|
|
18510
|
+
* Operator override for the LAN host a cross-node decoder dials to reach
|
|
18511
|
+
* THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
|
|
18512
|
+
* falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
|
|
18513
|
+
* it already uses to reach the hub). Set this only when the auto-detected
|
|
18514
|
+
* address is wrong (multi-homed host, NAT, custom interface).
|
|
18515
|
+
*/
|
|
18516
|
+
reachableHost: string().optional()
|
|
18359
18517
|
});
|
|
18360
18518
|
var CameraPipelineForAgentSchema = object({
|
|
18361
18519
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -18403,25 +18561,6 @@ var PipelineAssignmentSchema = object({
|
|
|
18403
18561
|
assignedAt: number()
|
|
18404
18562
|
});
|
|
18405
18563
|
/**
|
|
18406
|
-
* Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for
|
|
18407
|
-
* the decoder-node placement domain (`balanceDecoder` decision: manual pin
|
|
18408
|
-
* → co-located with pipeline → capacity).
|
|
18409
|
-
*/
|
|
18410
|
-
var DecoderAssignmentSchema = object({
|
|
18411
|
-
deviceId: number(),
|
|
18412
|
-
/** Moleculer node id of the decoder provider currently responsible for this camera. */
|
|
18413
|
-
decoderNodeId: string(),
|
|
18414
|
-
/** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
|
|
18415
|
-
pinned: boolean(),
|
|
18416
|
-
/** Why this assignment was made — useful for debugging the decoder balancer. */
|
|
18417
|
-
reason: _enum([
|
|
18418
|
-
"manual",
|
|
18419
|
-
"co-located",
|
|
18420
|
-
"capacity",
|
|
18421
|
-
"hardware-affinity"
|
|
18422
|
-
])
|
|
18423
|
-
});
|
|
18424
|
-
/**
|
|
18425
18564
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
18426
18565
|
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
18427
18566
|
*/
|
|
@@ -18461,6 +18600,15 @@ var GlobalMetricsSchema = object({
|
|
|
18461
18600
|
* capability providers.
|
|
18462
18601
|
*/
|
|
18463
18602
|
var CapabilityBindingsSchema = record(string(), string());
|
|
18603
|
+
/**
|
|
18604
|
+
* The cluster's single camera-source owner (`clusterRoles.ingestNode`) plus
|
|
18605
|
+
* its LAN-reachable host, if one is registered. See `getIngestOwner`.
|
|
18606
|
+
*/
|
|
18607
|
+
var IngestOwnerSchema = object({
|
|
18608
|
+
ownerNodeId: string(),
|
|
18609
|
+
reachableHost: string().optional(),
|
|
18610
|
+
configIssue: string().optional()
|
|
18611
|
+
});
|
|
18464
18612
|
/** Source block — always present; derives from the stream catalog. */
|
|
18465
18613
|
var CameraSourceStatusSchema = object({ streams: array(object({
|
|
18466
18614
|
camStreamId: string(),
|
|
@@ -18475,6 +18623,14 @@ var CameraAssignmentStatusSchema = object({
|
|
|
18475
18623
|
detectionNodeId: string().nullable(),
|
|
18476
18624
|
decoderNodeId: string().nullable(),
|
|
18477
18625
|
audioNodeId: string().nullable(),
|
|
18626
|
+
/**
|
|
18627
|
+
* The node that OWNS this camera's physical source pull (dials the RTSP and
|
|
18628
|
+
* hosts the broker/restream) — the cluster ingest owner today
|
|
18629
|
+
* (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
|
|
18630
|
+
* the UI show WHERE a camera is sourced without SSH/logs, and is the node the
|
|
18631
|
+
* broker block below was read from (pinned). Nullable only pre-wiring.
|
|
18632
|
+
*/
|
|
18633
|
+
sourceNodeId: string().nullable(),
|
|
18478
18634
|
pinned: object({
|
|
18479
18635
|
detection: boolean(),
|
|
18480
18636
|
decoder: boolean(),
|
|
@@ -18607,16 +18763,7 @@ method(object({
|
|
|
18607
18763
|
}), object({ success: literal(true) }), {
|
|
18608
18764
|
kind: "mutation",
|
|
18609
18765
|
auth: "admin"
|
|
18610
|
-
}), method(object({
|
|
18611
|
-
deviceId: number(),
|
|
18612
|
-
nodeId: string()
|
|
18613
|
-
}), _void(), {
|
|
18614
|
-
kind: "mutation",
|
|
18615
|
-
auth: "admin"
|
|
18616
|
-
}), method(object({ deviceId: number() }), _void(), {
|
|
18617
|
-
kind: "mutation",
|
|
18618
|
-
auth: "admin"
|
|
18619
|
-
}), method(_void(), array(DecoderAssignmentSchema).readonly()), method(object({
|
|
18766
|
+
}), method(_void(), IngestOwnerSchema), method(object({
|
|
18620
18767
|
deviceId: number(),
|
|
18621
18768
|
nodeId: string()
|
|
18622
18769
|
}), object({ success: literal(true) }), {
|
|
@@ -18637,10 +18784,7 @@ method(object({
|
|
|
18637
18784
|
nodeId: string(),
|
|
18638
18785
|
pinned: boolean(),
|
|
18639
18786
|
assignedAt: number()
|
|
18640
|
-
}))), method(object({
|
|
18641
|
-
deviceId: number(),
|
|
18642
|
-
pipelineNodeId: string().optional()
|
|
18643
|
-
}), DecoderAssignmentSchema), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
18787
|
+
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
18644
18788
|
nodeId: string(),
|
|
18645
18789
|
settings: AgentPipelineSettingsSchema
|
|
18646
18790
|
})).readonly()), method(object({
|
|
@@ -18670,12 +18814,26 @@ method(object({
|
|
|
18670
18814
|
}), method(object({
|
|
18671
18815
|
agentNodeId: string(),
|
|
18672
18816
|
detect: boolean().nullable().optional(),
|
|
18673
|
-
decode: boolean().nullable().optional(),
|
|
18674
18817
|
audio: boolean().nullable().optional(),
|
|
18675
18818
|
ingest: boolean().nullable().optional()
|
|
18676
18819
|
}), object({ success: literal(true) }), {
|
|
18677
18820
|
kind: "mutation",
|
|
18678
18821
|
auth: "admin"
|
|
18822
|
+
}), method(object({
|
|
18823
|
+
agentNodeId: string(),
|
|
18824
|
+
reachableHost: string().nullable()
|
|
18825
|
+
}), object({ success: literal(true) }), {
|
|
18826
|
+
kind: "mutation",
|
|
18827
|
+
auth: "admin"
|
|
18828
|
+
}), method(object({ agentNodeId: string() }), object({
|
|
18829
|
+
success: literal(true),
|
|
18830
|
+
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
18831
|
+
effectiveModelId: string().nullable(),
|
|
18832
|
+
/** Number of cameras whose node-scoped overrides were cleared. */
|
|
18833
|
+
clearedCameraOverrides: number()
|
|
18834
|
+
}), {
|
|
18835
|
+
kind: "mutation",
|
|
18836
|
+
auth: "admin"
|
|
18679
18837
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
18680
18838
|
deviceId: number(),
|
|
18681
18839
|
addonId: string(),
|
|
@@ -18720,22 +18878,131 @@ method(object({
|
|
|
18720
18878
|
kind: "mutation",
|
|
18721
18879
|
auth: "admin"
|
|
18722
18880
|
});
|
|
18723
|
-
|
|
18724
|
-
|
|
18725
|
-
|
|
18726
|
-
|
|
18727
|
-
|
|
18728
|
-
|
|
18881
|
+
/**
|
|
18882
|
+
* server-management — per-NODE singleton capability for a node's ROOT
|
|
18883
|
+
* package lifecycle (runtime-updatable node packages, phase 2: hub + docker
|
|
18884
|
+
* agents).
|
|
18885
|
+
*
|
|
18886
|
+
* Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
|
|
18887
|
+
* on agents) carries the whole software stack in its npm dep tree, so ONE
|
|
18888
|
+
* version describes the node. Updates install into
|
|
18889
|
+
* `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
|
|
18890
|
+
* starter (probation boot + auto-rollback to N-1).
|
|
18891
|
+
*
|
|
18892
|
+
* Providers:
|
|
18893
|
+
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
18894
|
+
* (`buildServerProviders` in trpc.router.ts) — the default target for
|
|
18895
|
+
* unpinned calls.
|
|
18896
|
+
* - AGENT: `AgentUpdateService` registered by the agent bootstrap under
|
|
18897
|
+
* the synthetic `agent-runtime` addonId and declared in the agent's
|
|
18898
|
+
* `$hub.registerNode` manifest.
|
|
18899
|
+
*
|
|
18900
|
+
* Node routing: singleton caps get the codegen/runtime-builder `nodeId`
|
|
18901
|
+
* injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
|
|
18902
|
+
* SDK) routes the call to that node's provider via the standard remote
|
|
18903
|
+
* proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
|
|
18904
|
+
* in-process provider lookup). No `nodeId` → the hub's own provider.
|
|
18905
|
+
*
|
|
18906
|
+
* Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
|
|
18907
|
+
*/
|
|
18908
|
+
/**
|
|
18909
|
+
* Where the running hub's code was loaded from:
|
|
18910
|
+
* - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
|
|
18911
|
+
* plain resolution and runtime updates are refused.
|
|
18912
|
+
* - `baked` — the immutable image seed closure (no data-dir root active).
|
|
18913
|
+
* - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
|
|
18914
|
+
*/
|
|
18915
|
+
var ServerBootModeSchema = _enum([
|
|
18916
|
+
"workspace",
|
|
18917
|
+
"baked",
|
|
18918
|
+
"data-root"
|
|
18919
|
+
]);
|
|
18920
|
+
/**
|
|
18921
|
+
* Update lifecycle state:
|
|
18922
|
+
* - `idle` / `checking` / `staging` — steady / in-flight registry work.
|
|
18923
|
+
* - `pending-restart` — a version is staged and the node has NOT yet
|
|
18924
|
+
* restarted onto it (still running the OLD version).
|
|
18925
|
+
* - `awaiting-confirmation` — the node HAS restarted onto the staged version
|
|
18926
|
+
* (it is the active probation boot) and is waiting to confirm boot-health.
|
|
18927
|
+
* Apply/rollback are refused in this state and the node must NOT be
|
|
18928
|
+
* manually restarted, or the probation boot auto-rolls-back.
|
|
18929
|
+
*/
|
|
18930
|
+
var ServerUpdateStateSchema = _enum([
|
|
18931
|
+
"idle",
|
|
18932
|
+
"checking",
|
|
18933
|
+
"staging",
|
|
18934
|
+
"pending-restart",
|
|
18935
|
+
"awaiting-confirmation"
|
|
18936
|
+
]);
|
|
18937
|
+
var ServerRollbackInfoSchema = object({
|
|
18938
|
+
/** The version that failed (or was manually rolled back). */
|
|
18939
|
+
fromVersion: string(),
|
|
18940
|
+
/** The version rolled back to; null = the baked seed. */
|
|
18941
|
+
toVersion: string().nullable(),
|
|
18942
|
+
atMs: number(),
|
|
18943
|
+
reason: string()
|
|
18729
18944
|
});
|
|
18730
|
-
var
|
|
18731
|
-
|
|
18732
|
-
|
|
18733
|
-
|
|
18945
|
+
var ServerPackageStatusSchema = object({
|
|
18946
|
+
/** Root package name (`@camstack/server` on the hub). */
|
|
18947
|
+
packageName: string(),
|
|
18948
|
+
/** Version of the code the running process ACTUALLY loaded. */
|
|
18949
|
+
runningVersion: string().nullable(),
|
|
18950
|
+
/** Node.js runtime version the node's process runs on (`process.versions.node`). */
|
|
18951
|
+
nodeRuntimeVersion: string().nullable(),
|
|
18952
|
+
/** Active data-dir root version; null when booted from seed/workspace. */
|
|
18953
|
+
activeVersion: string().nullable(),
|
|
18954
|
+
/** N-1 version kept for rollback; null when no previous version exists. */
|
|
18955
|
+
previousVersion: string().nullable(),
|
|
18956
|
+
/** Version of the immutable baked seed closure (image fallback). */
|
|
18957
|
+
seedVersion: string().nullable(),
|
|
18958
|
+
/** Latest registry version from the most recent check (null = never checked). */
|
|
18959
|
+
latestVersion: string().nullable(),
|
|
18960
|
+
updateAvailable: boolean(),
|
|
18961
|
+
bootMode: ServerBootModeSchema,
|
|
18962
|
+
updateState: ServerUpdateStateSchema,
|
|
18963
|
+
/** Version staged + awaiting its probation boot, when one is pending. */
|
|
18964
|
+
pendingVersion: string().nullable(),
|
|
18965
|
+
/** Set when the last freshly-activated version failed its boot health-check. */
|
|
18966
|
+
rolledBack: ServerRollbackInfoSchema.nullable(),
|
|
18967
|
+
/**
|
|
18968
|
+
* True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
|
|
18969
|
+
* hub is running from the baked seed (or workspace) while installed data-dir
|
|
18970
|
+
* versions are being IGNORED. Surfaced as a warning in the UI.
|
|
18971
|
+
*/
|
|
18972
|
+
stateFileCorrupt: boolean(),
|
|
18973
|
+
lastCheckedAtMs: number().nullable()
|
|
18974
|
+
});
|
|
18975
|
+
var ServerUpdateCheckResultSchema = object({
|
|
18976
|
+
packageName: string(),
|
|
18977
|
+
runningVersion: string().nullable(),
|
|
18978
|
+
latestVersion: string().nullable(),
|
|
18979
|
+
updateAvailable: boolean(),
|
|
18980
|
+
checkedAtMs: number(),
|
|
18981
|
+
/** Non-null when the registry lookup failed (offline, bad registry, …). */
|
|
18982
|
+
error: string().nullable()
|
|
18983
|
+
});
|
|
18984
|
+
var ServerUpdateActionResultSchema = object({
|
|
18985
|
+
accepted: boolean(),
|
|
18986
|
+
targetVersion: string().nullable(),
|
|
18987
|
+
/** True when a graceful restart was scheduled to apply the change. */
|
|
18988
|
+
restarting: boolean(),
|
|
18989
|
+
message: string()
|
|
18990
|
+
});
|
|
18991
|
+
method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
|
|
18992
|
+
kind: "mutation",
|
|
18993
|
+
auth: "admin"
|
|
18994
|
+
}), method(object({
|
|
18995
|
+
/** Explicit target version; omitted = latest from the registry. */
|
|
18996
|
+
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
18997
|
+
kind: "mutation",
|
|
18998
|
+
auth: "admin"
|
|
18999
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
19000
|
+
kind: "mutation",
|
|
19001
|
+
auth: "admin"
|
|
19002
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
19003
|
+
kind: "mutation",
|
|
19004
|
+
auth: "admin"
|
|
18734
19005
|
});
|
|
18735
|
-
method(object({
|
|
18736
|
-
deviceId: number(),
|
|
18737
|
-
streams: array(RegisteredStreamSchema).readonly()
|
|
18738
|
-
}), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(ExposedResourceSchema).readonly());
|
|
18739
19006
|
/**
|
|
18740
19007
|
* Query filter for settings-store collections.
|
|
18741
19008
|
*/
|
|
@@ -18888,9 +19155,9 @@ method(SendEmailInputSchema, SendEmailResultSchema, {
|
|
|
18888
19155
|
/**
|
|
18889
19156
|
* A single device snapshot returned as base64 JPEG/PNG.
|
|
18890
19157
|
*
|
|
18891
|
-
*
|
|
18892
|
-
*
|
|
18893
|
-
*
|
|
19158
|
+
* The `SnapshotAddon` wrapper returns this shape whether the frame came from
|
|
19159
|
+
* the device-native provider (onboard capture) or from the stream-broker
|
|
19160
|
+
* prebuffer fallback.
|
|
18894
19161
|
*/
|
|
18895
19162
|
var SnapshotImageSchema = object({
|
|
18896
19163
|
base64: string(),
|
|
@@ -18965,10 +19232,6 @@ var snapshotCapability = {
|
|
|
18965
19232
|
kind: "poll"
|
|
18966
19233
|
}
|
|
18967
19234
|
};
|
|
18968
|
-
method(object({ deviceId: number() }), boolean()), method(object({
|
|
18969
|
-
deviceId: number(),
|
|
18970
|
-
streamId: string().optional()
|
|
18971
|
-
}), SnapshotImageSchema.nullable());
|
|
18972
19235
|
/**
|
|
18973
19236
|
* `sso-bridge` — internal hub-only cap that lets SSO-style auth
|
|
18974
19237
|
* providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
|
|
@@ -19329,9 +19592,10 @@ method(object({
|
|
|
19329
19592
|
auth: "admin"
|
|
19330
19593
|
});
|
|
19331
19594
|
/**
|
|
19332
|
-
* Optional client-side hints sent at session creation to help the
|
|
19333
|
-
*
|
|
19334
|
-
*
|
|
19595
|
+
* Optional client-side hints sent at session creation to help the provider
|
|
19596
|
+
* pick the best native source. All fields optional — a viewer that knows
|
|
19597
|
+
* nothing still gets a sane default. (Relocated from the retired `webrtc`
|
|
19598
|
+
* collection cap; this `webrtc-session` cap is the live signaling surface.)
|
|
19335
19599
|
*/
|
|
19336
19600
|
var webrtcClientHintsSchema = object({
|
|
19337
19601
|
viewportWidth: number().int().positive().optional(),
|
|
@@ -19342,22 +19606,6 @@ var webrtcClientHintsSchema = object({
|
|
|
19342
19606
|
/** Hard tier override; takes precedence over scoring when registered. */
|
|
19343
19607
|
prefersTier: string().optional()
|
|
19344
19608
|
}).partial();
|
|
19345
|
-
method(object({
|
|
19346
|
-
streamId: string(),
|
|
19347
|
-
sdpOffer: string()
|
|
19348
|
-
}), string(), { kind: "mutation" }), method(object({ streamId: string() }), boolean()), method(object({
|
|
19349
|
-
streamId: string(),
|
|
19350
|
-
codec: string()
|
|
19351
|
-
}), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
|
|
19352
|
-
streamId: string(),
|
|
19353
|
-
hints: webrtcClientHintsSchema.optional()
|
|
19354
|
-
}), object({
|
|
19355
|
-
sessionId: string(),
|
|
19356
|
-
sdpOffer: string()
|
|
19357
|
-
}), { kind: "mutation" }), method(object({
|
|
19358
|
-
sessionId: string(),
|
|
19359
|
-
sdpAnswer: string()
|
|
19360
|
-
}), _void(), { kind: "mutation" }), method(object({ sessionId: string() }), _void(), { kind: "mutation" }), method(object({ streamId: string() }), boolean());
|
|
19361
19609
|
/**
|
|
19362
19610
|
* Discriminated target for a WebRTC session. The client sends this
|
|
19363
19611
|
* structured object instead of building / parsing brokerId strings;
|
|
@@ -19844,7 +20092,15 @@ var FrameworkPackageStatusSchema = object({
|
|
|
19844
20092
|
latestVersion: string().nullable(),
|
|
19845
20093
|
hasUpdate: boolean(),
|
|
19846
20094
|
/** Optional manifest description for the row tooltip. */
|
|
19847
|
-
description: string().optional()
|
|
20095
|
+
description: string().optional(),
|
|
20096
|
+
/**
|
|
20097
|
+
* Content build-id (md5 of the resolved `dist/` tree) of the code the hub
|
|
20098
|
+
* ACTUALLY loaded. Framework packages ship code changes without always
|
|
20099
|
+
* bumping `currentVersion`, so semver alone hides "same version, new code".
|
|
20100
|
+
* `null` when the dist can't be hashed (not installed / empty). The admin-UI
|
|
20101
|
+
* surfaces this so a stale-code hub is visible even at an unchanged version.
|
|
20102
|
+
*/
|
|
20103
|
+
buildId: string().nullable()
|
|
19848
20104
|
});
|
|
19849
20105
|
var LogStreamEntrySchema = object({
|
|
19850
20106
|
timestamp: string(),
|
|
@@ -20828,6 +21084,16 @@ var TopologyCategorySchema = object({
|
|
|
20828
21084
|
healthy: number(),
|
|
20829
21085
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
20830
21086
|
});
|
|
21087
|
+
/**
|
|
21088
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
|
|
21089
|
+
* `@camstack/agent` on agents) as reported by its `registerNode` manifest —
|
|
21090
|
+
* version visibility for the Server management surface. Nullable: offline
|
|
21091
|
+
* rows and pre-phase-2 nodes report none.
|
|
21092
|
+
*/
|
|
21093
|
+
var TopologyRootPackageSchema = object({
|
|
21094
|
+
name: string(),
|
|
21095
|
+
version: string()
|
|
21096
|
+
});
|
|
20831
21097
|
var TopologyNodeSchema = object({
|
|
20832
21098
|
id: string(),
|
|
20833
21099
|
name: string(),
|
|
@@ -20851,7 +21117,8 @@ var TopologyNodeSchema = object({
|
|
|
20851
21117
|
status: string()
|
|
20852
21118
|
})).readonly(),
|
|
20853
21119
|
processes: array(TopologyProcessSchema).readonly(),
|
|
20854
|
-
categories: array(TopologyCategorySchema).readonly()
|
|
21120
|
+
categories: array(TopologyCategorySchema).readonly(),
|
|
21121
|
+
rootPackage: TopologyRootPackageSchema.nullable()
|
|
20855
21122
|
});
|
|
20856
21123
|
var CapUsageEdgeSchema = object({
|
|
20857
21124
|
callerAddonId: string(),
|
|
@@ -23929,6 +24196,12 @@ Object.freeze({
|
|
|
23929
24196
|
addonId: null,
|
|
23930
24197
|
access: "create"
|
|
23931
24198
|
},
|
|
24199
|
+
"loginMethod.getLoginMethods": {
|
|
24200
|
+
capName: "login-method",
|
|
24201
|
+
capScope: "system",
|
|
24202
|
+
addonId: null,
|
|
24203
|
+
access: "view"
|
|
24204
|
+
},
|
|
23932
24205
|
"mediaPlayer.next": {
|
|
23933
24206
|
capName: "media-player",
|
|
23934
24207
|
capScope: "device",
|
|
@@ -24559,23 +24832,23 @@ Object.freeze({
|
|
|
24559
24832
|
addonId: null,
|
|
24560
24833
|
access: "create"
|
|
24561
24834
|
},
|
|
24562
|
-
"pipelineExecutor.
|
|
24835
|
+
"pipelineExecutor.clearDeviceOverrides": {
|
|
24563
24836
|
capName: "pipeline-executor",
|
|
24564
24837
|
capScope: "system",
|
|
24565
24838
|
addonId: null,
|
|
24566
24839
|
access: "delete"
|
|
24567
24840
|
},
|
|
24568
|
-
"pipelineExecutor.
|
|
24841
|
+
"pipelineExecutor.deleteModel": {
|
|
24569
24842
|
capName: "pipeline-executor",
|
|
24570
24843
|
capScope: "system",
|
|
24571
24844
|
addonId: null,
|
|
24572
24845
|
access: "delete"
|
|
24573
24846
|
},
|
|
24574
|
-
"pipelineExecutor.
|
|
24847
|
+
"pipelineExecutor.deleteTemplate": {
|
|
24575
24848
|
capName: "pipeline-executor",
|
|
24576
24849
|
capScope: "system",
|
|
24577
24850
|
addonId: null,
|
|
24578
|
-
access: "
|
|
24851
|
+
access: "delete"
|
|
24579
24852
|
},
|
|
24580
24853
|
"pipelineExecutor.downloadModel": {
|
|
24581
24854
|
capName: "pipeline-executor",
|
|
@@ -24769,13 +25042,13 @@ Object.freeze({
|
|
|
24769
25042
|
addonId: null,
|
|
24770
25043
|
access: "create"
|
|
24771
25044
|
},
|
|
24772
|
-
"
|
|
24773
|
-
capName: "pipeline-
|
|
25045
|
+
"pipelineExecutor.validatePipeline": {
|
|
25046
|
+
capName: "pipeline-executor",
|
|
24774
25047
|
capScope: "system",
|
|
24775
25048
|
addonId: null,
|
|
24776
|
-
access: "
|
|
25049
|
+
access: "view"
|
|
24777
25050
|
},
|
|
24778
|
-
"pipelineOrchestrator.
|
|
25051
|
+
"pipelineOrchestrator.assignAudio": {
|
|
24779
25052
|
capName: "pipeline-orchestrator",
|
|
24780
25053
|
capScope: "system",
|
|
24781
25054
|
addonId: null,
|
|
@@ -24859,19 +25132,13 @@ Object.freeze({
|
|
|
24859
25132
|
addonId: null,
|
|
24860
25133
|
access: "view"
|
|
24861
25134
|
},
|
|
24862
|
-
"pipelineOrchestrator.
|
|
24863
|
-
capName: "pipeline-orchestrator",
|
|
24864
|
-
capScope: "system",
|
|
24865
|
-
addonId: null,
|
|
24866
|
-
access: "view"
|
|
24867
|
-
},
|
|
24868
|
-
"pipelineOrchestrator.getDecoderAssignments": {
|
|
25135
|
+
"pipelineOrchestrator.getGlobalMetrics": {
|
|
24869
25136
|
capName: "pipeline-orchestrator",
|
|
24870
25137
|
capScope: "system",
|
|
24871
25138
|
addonId: null,
|
|
24872
25139
|
access: "view"
|
|
24873
25140
|
},
|
|
24874
|
-
"pipelineOrchestrator.
|
|
25141
|
+
"pipelineOrchestrator.getIngestOwner": {
|
|
24875
25142
|
capName: "pipeline-orchestrator",
|
|
24876
25143
|
capScope: "system",
|
|
24877
25144
|
addonId: null,
|
|
@@ -24913,6 +25180,12 @@ Object.freeze({
|
|
|
24913
25180
|
addonId: null,
|
|
24914
25181
|
access: "delete"
|
|
24915
25182
|
},
|
|
25183
|
+
"pipelineOrchestrator.resetNodePipelineDefaults": {
|
|
25184
|
+
capName: "pipeline-orchestrator",
|
|
25185
|
+
capScope: "system",
|
|
25186
|
+
addonId: null,
|
|
25187
|
+
access: "delete"
|
|
25188
|
+
},
|
|
24916
25189
|
"pipelineOrchestrator.resolvePipeline": {
|
|
24917
25190
|
capName: "pipeline-orchestrator",
|
|
24918
25191
|
capScope: "system",
|
|
@@ -24949,37 +25222,37 @@ Object.freeze({
|
|
|
24949
25222
|
addonId: null,
|
|
24950
25223
|
access: "create"
|
|
24951
25224
|
},
|
|
24952
|
-
"pipelineOrchestrator.
|
|
25225
|
+
"pipelineOrchestrator.setAgentReachableHost": {
|
|
24953
25226
|
capName: "pipeline-orchestrator",
|
|
24954
25227
|
capScope: "system",
|
|
24955
25228
|
addonId: null,
|
|
24956
25229
|
access: "create"
|
|
24957
25230
|
},
|
|
24958
|
-
"pipelineOrchestrator.
|
|
25231
|
+
"pipelineOrchestrator.setCameraPipelineForAgent": {
|
|
24959
25232
|
capName: "pipeline-orchestrator",
|
|
24960
25233
|
capScope: "system",
|
|
24961
25234
|
addonId: null,
|
|
24962
25235
|
access: "create"
|
|
24963
25236
|
},
|
|
24964
|
-
"pipelineOrchestrator.
|
|
25237
|
+
"pipelineOrchestrator.setCameraStepOverride": {
|
|
24965
25238
|
capName: "pipeline-orchestrator",
|
|
24966
25239
|
capScope: "system",
|
|
24967
25240
|
addonId: null,
|
|
24968
25241
|
access: "create"
|
|
24969
25242
|
},
|
|
24970
|
-
"pipelineOrchestrator.
|
|
25243
|
+
"pipelineOrchestrator.setCameraStepToggle": {
|
|
24971
25244
|
capName: "pipeline-orchestrator",
|
|
24972
25245
|
capScope: "system",
|
|
24973
25246
|
addonId: null,
|
|
24974
25247
|
access: "create"
|
|
24975
25248
|
},
|
|
24976
|
-
"pipelineOrchestrator.
|
|
25249
|
+
"pipelineOrchestrator.setCapabilityBinding": {
|
|
24977
25250
|
capName: "pipeline-orchestrator",
|
|
24978
25251
|
capScope: "system",
|
|
24979
25252
|
addonId: null,
|
|
24980
25253
|
access: "create"
|
|
24981
25254
|
},
|
|
24982
|
-
"pipelineOrchestrator.
|
|
25255
|
+
"pipelineOrchestrator.unassignAudio": {
|
|
24983
25256
|
capName: "pipeline-orchestrator",
|
|
24984
25257
|
capScope: "system",
|
|
24985
25258
|
addonId: null,
|
|
@@ -25279,33 +25552,45 @@ Object.freeze({
|
|
|
25279
25552
|
addonId: null,
|
|
25280
25553
|
access: "create"
|
|
25281
25554
|
},
|
|
25282
|
-
"
|
|
25283
|
-
capName: "
|
|
25555
|
+
"scriptRunner.run": {
|
|
25556
|
+
capName: "script-runner",
|
|
25557
|
+
capScope: "device",
|
|
25558
|
+
addonId: null,
|
|
25559
|
+
access: "create"
|
|
25560
|
+
},
|
|
25561
|
+
"scriptRunner.stop": {
|
|
25562
|
+
capName: "script-runner",
|
|
25563
|
+
capScope: "device",
|
|
25564
|
+
addonId: null,
|
|
25565
|
+
access: "create"
|
|
25566
|
+
},
|
|
25567
|
+
"serverManagement.applyServerUpdate": {
|
|
25568
|
+
capName: "server-management",
|
|
25284
25569
|
capScope: "system",
|
|
25285
25570
|
addonId: null,
|
|
25286
|
-
access: "
|
|
25571
|
+
access: "create"
|
|
25287
25572
|
},
|
|
25288
|
-
"
|
|
25289
|
-
capName: "
|
|
25573
|
+
"serverManagement.checkServerUpdate": {
|
|
25574
|
+
capName: "server-management",
|
|
25290
25575
|
capScope: "system",
|
|
25291
25576
|
addonId: null,
|
|
25292
25577
|
access: "create"
|
|
25293
25578
|
},
|
|
25294
|
-
"
|
|
25295
|
-
capName: "
|
|
25579
|
+
"serverManagement.getServerPackageStatus": {
|
|
25580
|
+
capName: "server-management",
|
|
25296
25581
|
capScope: "system",
|
|
25297
25582
|
addonId: null,
|
|
25298
|
-
access: "
|
|
25583
|
+
access: "view"
|
|
25299
25584
|
},
|
|
25300
|
-
"
|
|
25301
|
-
capName: "
|
|
25302
|
-
capScope: "
|
|
25585
|
+
"serverManagement.restartServer": {
|
|
25586
|
+
capName: "server-management",
|
|
25587
|
+
capScope: "system",
|
|
25303
25588
|
addonId: null,
|
|
25304
25589
|
access: "create"
|
|
25305
25590
|
},
|
|
25306
|
-
"
|
|
25307
|
-
capName: "
|
|
25308
|
-
capScope: "
|
|
25591
|
+
"serverManagement.rollbackServerUpdate": {
|
|
25592
|
+
capName: "server-management",
|
|
25593
|
+
capScope: "system",
|
|
25309
25594
|
addonId: null,
|
|
25310
25595
|
access: "create"
|
|
25311
25596
|
},
|
|
@@ -25399,18 +25684,6 @@ Object.freeze({
|
|
|
25399
25684
|
addonId: null,
|
|
25400
25685
|
access: "create"
|
|
25401
25686
|
},
|
|
25402
|
-
"snapshotProvider.getSnapshot": {
|
|
25403
|
-
capName: "snapshot-provider",
|
|
25404
|
-
capScope: "system",
|
|
25405
|
-
addonId: null,
|
|
25406
|
-
access: "view"
|
|
25407
|
-
},
|
|
25408
|
-
"snapshotProvider.supportsDevice": {
|
|
25409
|
-
capName: "snapshot-provider",
|
|
25410
|
-
capScope: "system",
|
|
25411
|
-
addonId: null,
|
|
25412
|
-
access: "view"
|
|
25413
|
-
},
|
|
25414
25687
|
"ssoBridge.signBridgeToken": {
|
|
25415
25688
|
capName: "sso-bridge",
|
|
25416
25689
|
capScope: "system",
|
|
@@ -25837,30 +26110,6 @@ Object.freeze({
|
|
|
25837
26110
|
addonId: null,
|
|
25838
26111
|
access: "view"
|
|
25839
26112
|
},
|
|
25840
|
-
"streamingEngine.getStreamUrl": {
|
|
25841
|
-
capName: "streaming-engine",
|
|
25842
|
-
capScope: "system",
|
|
25843
|
-
addonId: null,
|
|
25844
|
-
access: "view"
|
|
25845
|
-
},
|
|
25846
|
-
"streamingEngine.listStreams": {
|
|
25847
|
-
capName: "streaming-engine",
|
|
25848
|
-
capScope: "system",
|
|
25849
|
-
addonId: null,
|
|
25850
|
-
access: "view"
|
|
25851
|
-
},
|
|
25852
|
-
"streamingEngine.registerStream": {
|
|
25853
|
-
capName: "streaming-engine",
|
|
25854
|
-
capScope: "system",
|
|
25855
|
-
addonId: null,
|
|
25856
|
-
access: "create"
|
|
25857
|
-
},
|
|
25858
|
-
"streamingEngine.unregisterStream": {
|
|
25859
|
-
capName: "streaming-engine",
|
|
25860
|
-
capScope: "system",
|
|
25861
|
-
addonId: null,
|
|
25862
|
-
access: "delete"
|
|
25863
|
-
},
|
|
25864
26113
|
"streamParams.getConfigSchema": {
|
|
25865
26114
|
capName: "stream-params",
|
|
25866
26115
|
capScope: "device",
|
|
@@ -26209,6 +26458,18 @@ Object.freeze({
|
|
|
26209
26458
|
addonId: null,
|
|
26210
26459
|
access: "view"
|
|
26211
26460
|
},
|
|
26461
|
+
"viewerUi.getStaticDir": {
|
|
26462
|
+
capName: "viewer-ui",
|
|
26463
|
+
capScope: "system",
|
|
26464
|
+
addonId: null,
|
|
26465
|
+
access: "view"
|
|
26466
|
+
},
|
|
26467
|
+
"viewerUi.getVersion": {
|
|
26468
|
+
capName: "viewer-ui",
|
|
26469
|
+
capScope: "system",
|
|
26470
|
+
addonId: null,
|
|
26471
|
+
access: "view"
|
|
26472
|
+
},
|
|
26212
26473
|
"waterHeater.setAway": {
|
|
26213
26474
|
capName: "water-heater",
|
|
26214
26475
|
capScope: "device",
|
|
@@ -26227,54 +26488,6 @@ Object.freeze({
|
|
|
26227
26488
|
addonId: null,
|
|
26228
26489
|
access: "create"
|
|
26229
26490
|
},
|
|
26230
|
-
"webrtc.closeSession": {
|
|
26231
|
-
capName: "webrtc",
|
|
26232
|
-
capScope: "system",
|
|
26233
|
-
addonId: null,
|
|
26234
|
-
access: "create"
|
|
26235
|
-
},
|
|
26236
|
-
"webrtc.createSession": {
|
|
26237
|
-
capName: "webrtc",
|
|
26238
|
-
capScope: "system",
|
|
26239
|
-
addonId: null,
|
|
26240
|
-
access: "create"
|
|
26241
|
-
},
|
|
26242
|
-
"webrtc.handleAnswer": {
|
|
26243
|
-
capName: "webrtc",
|
|
26244
|
-
capScope: "system",
|
|
26245
|
-
addonId: null,
|
|
26246
|
-
access: "create"
|
|
26247
|
-
},
|
|
26248
|
-
"webrtc.handleOffer": {
|
|
26249
|
-
capName: "webrtc",
|
|
26250
|
-
capScope: "system",
|
|
26251
|
-
addonId: null,
|
|
26252
|
-
access: "create"
|
|
26253
|
-
},
|
|
26254
|
-
"webrtc.hasAdaptiveBitrate": {
|
|
26255
|
-
capName: "webrtc",
|
|
26256
|
-
capScope: "system",
|
|
26257
|
-
addonId: null,
|
|
26258
|
-
access: "view"
|
|
26259
|
-
},
|
|
26260
|
-
"webrtc.registerStream": {
|
|
26261
|
-
capName: "webrtc",
|
|
26262
|
-
capScope: "system",
|
|
26263
|
-
addonId: null,
|
|
26264
|
-
access: "create"
|
|
26265
|
-
},
|
|
26266
|
-
"webrtc.supportsStream": {
|
|
26267
|
-
capName: "webrtc",
|
|
26268
|
-
capScope: "system",
|
|
26269
|
-
addonId: null,
|
|
26270
|
-
access: "view"
|
|
26271
|
-
},
|
|
26272
|
-
"webrtc.unregisterStream": {
|
|
26273
|
-
capName: "webrtc",
|
|
26274
|
-
capScope: "system",
|
|
26275
|
-
addonId: null,
|
|
26276
|
-
access: "delete"
|
|
26277
|
-
},
|
|
26278
26491
|
"webrtcSession.addIceCandidate": {
|
|
26279
26492
|
capName: "webrtc-session",
|
|
26280
26493
|
capScope: "device",
|