@camstack/addon-post-analysis 1.1.22 → 1.1.24
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/{dist-DbgDsnRE.js → dist-B0VgBdBN.js} +573 -251
- package/dist/{dist-DiIUcFdN.mjs → dist-DRK78NMq.mjs} +573 -251
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/enrichment-engine/index.js +28 -16
- package/dist/enrichment-engine/index.mjs +27 -15
- package/dist/{node-CdzrYoKs.js → node-Cx0LM0Sq.js} +1 -1
- package/dist/pipeline-analytics/_stub.js +1 -1
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BaXPYx2C.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BsRL9Bh-.mjs} +3 -3
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DtOrjE2U.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-CZ8URdDr.mjs → hostInit-sO1Drmtf.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +424 -166
- package/dist/pipeline-analytics/index.mjs +422 -164
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/dist/{resolve-frame-nQMd6Z8B.js → resolve-frame-DBXwF5fk.js} +1 -1
- package/package.json +1 -1
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BEL-L4wR.mjs +0 -26
|
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
|
|
|
4627
4627
|
return inst;
|
|
4628
4628
|
}
|
|
4629
4629
|
//#endregion
|
|
4630
|
-
//#region ../types/dist/sleep-
|
|
4630
|
+
//#region ../types/dist/sleep-b4Jf2n33.mjs
|
|
4631
4631
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4632
4632
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4633
4633
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -4813,6 +4813,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
4813
4813
|
*/
|
|
4814
4814
|
EventCategory["PipelineCameraUpdated"] = "pipeline.camera-updated";
|
|
4815
4815
|
/**
|
|
4816
|
+
* The cluster camera-source OWNER changed (`clusterRoles.ingestNode`).
|
|
4817
|
+
* Emitted by addon-pipeline-orchestrator whenever it (re)derives node
|
|
4818
|
+
* capabilities — at boot, on agent online/offline, and on an ingest-node
|
|
4819
|
+
* flip. Carries the resolved `ownerNodeId`. The stream-broker consumes it to
|
|
4820
|
+
* keep its ingest-owner-gate decision current WITHOUT a per-`ensureBroker`
|
|
4821
|
+
* cross-process `getIngestOwner` query (push the authority's decision instead
|
|
4822
|
+
* of polling it on the hot path). Idempotent state — re-emitted on every
|
|
4823
|
+
* topology change, so a dropped event self-heals on the next one (plus the
|
|
4824
|
+
* broker's long backstop reconcile query).
|
|
4825
|
+
*/
|
|
4826
|
+
EventCategory["PipelineIngestOwnerChanged"] = "pipeline.ingest-owner-changed";
|
|
4827
|
+
/**
|
|
4816
4828
|
* Periodic snapshot of per-node pipeline-runner load
|
|
4817
4829
|
* (`RunnerLocalLoad`). Emitted ~1Hz by every runner so UI dashboards
|
|
4818
4830
|
* subscribe instead of polling `pipelineRunner.getLocalLoad`.
|
|
@@ -5336,10 +5348,6 @@ function hydrateField(field, values) {
|
|
|
5336
5348
|
};
|
|
5337
5349
|
}
|
|
5338
5350
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
5339
|
-
if (field.type === "password") return {
|
|
5340
|
-
...field,
|
|
5341
|
-
value: ""
|
|
5342
|
-
};
|
|
5343
5351
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
5344
5352
|
return {
|
|
5345
5353
|
...field,
|
|
@@ -6728,6 +6736,21 @@ function method(input, output, options) {
|
|
|
6728
6736
|
timeoutMs: options?.timeoutMs
|
|
6729
6737
|
};
|
|
6730
6738
|
}
|
|
6739
|
+
/**
|
|
6740
|
+
* A wrapper/system-only method: served exclusively by the cap's system-level
|
|
6741
|
+
* provider (`InferProvider`), and OPTIONAL on `InferNativeProvider` so per-device
|
|
6742
|
+
* driver natives don't stub out a wrapper concern (e.g. a cross-device cache
|
|
6743
|
+
* overview). The `systemOnly: true` literal is what `InferNativeProvider` keys on.
|
|
6744
|
+
*/
|
|
6745
|
+
function systemMethod(input, output, options) {
|
|
6746
|
+
return {
|
|
6747
|
+
...method(input, output, options),
|
|
6748
|
+
systemOnly: true
|
|
6749
|
+
};
|
|
6750
|
+
}
|
|
6751
|
+
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6752
|
+
var VersionOutputSchema$1 = object({ version: string() });
|
|
6753
|
+
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6731
6754
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6732
6755
|
var VersionOutputSchema = object({ version: string() });
|
|
6733
6756
|
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
@@ -6909,6 +6932,36 @@ var ModelFormatsSchema = object({
|
|
|
6909
6932
|
tflite: ModelFormatEntrySchema.optional(),
|
|
6910
6933
|
pt: ModelFormatEntrySchema.optional()
|
|
6911
6934
|
});
|
|
6935
|
+
/**
|
|
6936
|
+
* Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
|
|
6937
|
+
* the reduced `PipelineModelOption` returned in `pipeline.getSchema()` so the
|
|
6938
|
+
* grouped Family→Tier→Variant picker renders identically in the config UI and
|
|
6939
|
+
* in the pipeline/device steppers. The flat `id` stays the source of truth for
|
|
6940
|
+
* resolution/download/persistence; this is a presentation overlay resolved back
|
|
6941
|
+
* to an `id`.
|
|
6942
|
+
*/
|
|
6943
|
+
var ModelVariantGroupSchema = object({
|
|
6944
|
+
/** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
|
|
6945
|
+
family: string(),
|
|
6946
|
+
/** Size within the family, e.g. `n` | `s` | `m` | `l`. */
|
|
6947
|
+
tier: string(),
|
|
6948
|
+
/** Quantization axis. Omit ⇒ the fp32 base build. */
|
|
6949
|
+
precision: _enum(["fp32", "int8"]).optional(),
|
|
6950
|
+
/**
|
|
6951
|
+
* Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
|
|
6952
|
+
* latency-optimized export (e.g. ReLU-activation variant) — the slot the
|
|
6953
|
+
* future performance variants plug into.
|
|
6954
|
+
*/
|
|
6955
|
+
optimization: _enum(["standard", "fast"]).optional(),
|
|
6956
|
+
/**
|
|
6957
|
+
* Input-resolution axis (square input side, px). Omit ⇒ the family's native
|
|
6958
|
+
* resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
|
|
6959
|
+
* cheap latency lever — especially on Apple ANE and the Intel N100 — at a
|
|
6960
|
+
* small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
|
|
6961
|
+
* the group so the selector can offer it as a variant axis.
|
|
6962
|
+
*/
|
|
6963
|
+
resolution: number().int().positive().optional()
|
|
6964
|
+
});
|
|
6912
6965
|
var ModelCatalogEntrySchema = object({
|
|
6913
6966
|
id: string(),
|
|
6914
6967
|
name: string(),
|
|
@@ -6938,7 +6991,43 @@ var ModelCatalogEntrySchema = object({
|
|
|
6938
6991
|
* Auxiliary files required at runtime (labels JSON, charset dict, etc.).
|
|
6939
6992
|
* Downloaded into the same modelsDir alongside the model file.
|
|
6940
6993
|
*/
|
|
6941
|
-
extraFiles: array(ModelExtraFileSchema).readonly().optional()
|
|
6994
|
+
extraFiles: array(ModelExtraFileSchema).readonly().optional(),
|
|
6995
|
+
/**
|
|
6996
|
+
* LEGACY entry — retained in the catalog so a persisted operator selection
|
|
6997
|
+
* still RESOLVES (and can be re-activated), but hidden from the selectable
|
|
6998
|
+
* model list and excluded from the auto format-default pick. Set on the
|
|
6999
|
+
* superseded / consolidated models (older lineages, redundant fp16 IRs) so
|
|
7000
|
+
* the active lineup stays the coherent curated ladder without deleting a
|
|
7001
|
+
* model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
|
|
7002
|
+
* an explicit legacy id that has a build for the node's format.
|
|
7003
|
+
*/
|
|
7004
|
+
legacy: boolean().optional(),
|
|
7005
|
+
/**
|
|
7006
|
+
* Measured quality/latency metadata — populated from the benchmark addon on
|
|
7007
|
+
* the real node classes. Absent = not yet measured (most entries today; the
|
|
7008
|
+
* catalog historically carried only `sizeMB`, a poor cross-architecture
|
|
7009
|
+
* speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
|
|
7010
|
+
*/
|
|
7011
|
+
metrics: object({
|
|
7012
|
+
map50: number().optional(),
|
|
7013
|
+
p95LatencyMs: record(string(), number()).optional()
|
|
7014
|
+
}).optional(),
|
|
7015
|
+
/**
|
|
7016
|
+
* SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
|
|
7017
|
+
* YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
|
|
7018
|
+
* the retraining addon and any future commercial distribution.
|
|
7019
|
+
*/
|
|
7020
|
+
license: string().optional(),
|
|
7021
|
+
/**
|
|
7022
|
+
* Variant-selector grouping. The UI groups models by `family` + `tier` and
|
|
7023
|
+
* offers `precision` / `optimization` as variant axes WITHIN a tier — so all
|
|
7024
|
+
* of a family's sizes and quantizations collapse into one grouped picker
|
|
7025
|
+
* instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
|
|
7026
|
+
* (legacy / custom models) — never shown in the grouped selector. The flat
|
|
7027
|
+
* `id` stays the source of truth for resolution/download/persistence; grouping
|
|
7028
|
+
* is a presentation overlay resolved back to an `id`.
|
|
7029
|
+
*/
|
|
7030
|
+
group: ModelVariantGroupSchema.optional()
|
|
6942
7031
|
});
|
|
6943
7032
|
var ConvertTargetSchema = discriminatedUnion("format", [object({
|
|
6944
7033
|
format: literal("openvino"),
|
|
@@ -7018,8 +7107,8 @@ var RecordingModeSchema = _enum([
|
|
|
7018
7107
|
"onAudioThreshold"
|
|
7019
7108
|
]);
|
|
7020
7109
|
/**
|
|
7021
|
-
* First-class, authoritative per-camera storage mode — the
|
|
7022
|
-
* reads directly (never inferred from `rules`):
|
|
7110
|
+
* First-class, authoritative per-camera storage mode — the explicit choice the
|
|
7111
|
+
* UI reads directly (never inferred from `rules`):
|
|
7023
7112
|
* - `off` — not recording.
|
|
7024
7113
|
* - `events` — record only around triggers (motion / audio threshold),
|
|
7025
7114
|
* with pre/post-buffer.
|
|
@@ -8713,26 +8802,13 @@ DeviceType.Light, method(object({
|
|
|
8713
8802
|
percentage: number().min(0).max(100),
|
|
8714
8803
|
lastChangedAt: number()
|
|
8715
8804
|
});
|
|
8805
|
+
/** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
|
|
8716
8806
|
var StreamFormatSchema = _enum([
|
|
8717
8807
|
"webrtc",
|
|
8718
8808
|
"hls",
|
|
8719
8809
|
"mjpeg",
|
|
8720
8810
|
"rtsp"
|
|
8721
8811
|
]);
|
|
8722
|
-
var StreamInfoSchema = object({
|
|
8723
|
-
streamId: string(),
|
|
8724
|
-
format: StreamFormatSchema,
|
|
8725
|
-
url: string().nullable(),
|
|
8726
|
-
active: boolean()
|
|
8727
|
-
});
|
|
8728
|
-
method(object({
|
|
8729
|
-
streamId: string(),
|
|
8730
|
-
sourceUrl: string(),
|
|
8731
|
-
codec: string().optional()
|
|
8732
|
-
}), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
|
|
8733
|
-
streamId: string(),
|
|
8734
|
-
format: StreamFormatSchema
|
|
8735
|
-
}), string().nullable()), method(_void(), array(StreamInfoSchema));
|
|
8736
8812
|
var RtspRestreamEntrySchema = object({
|
|
8737
8813
|
brokerId: string(),
|
|
8738
8814
|
url: string(),
|
|
@@ -9397,7 +9473,7 @@ var ConsumablesStatusSchema = object({
|
|
|
9397
9473
|
})),
|
|
9398
9474
|
lastChangedAt: number()
|
|
9399
9475
|
});
|
|
9400
|
-
|
|
9476
|
+
Object.values(DeviceType), method(object({
|
|
9401
9477
|
deviceId: number().int().nonnegative(),
|
|
9402
9478
|
key: string().min(1)
|
|
9403
9479
|
}), _void(), {
|
|
@@ -10312,7 +10388,7 @@ var BoundingBoxSchema = object({
|
|
|
10312
10388
|
w: number(),
|
|
10313
10389
|
h: number()
|
|
10314
10390
|
});
|
|
10315
|
-
|
|
10391
|
+
object({
|
|
10316
10392
|
class: string(),
|
|
10317
10393
|
originalClass: string(),
|
|
10318
10394
|
score: number(),
|
|
@@ -10447,7 +10523,6 @@ var PipelineDefaultStepSchema = lazy(() => object({
|
|
|
10447
10523
|
enabled: boolean(),
|
|
10448
10524
|
modelId: string(),
|
|
10449
10525
|
children: array(PipelineDefaultStepSchema).readonly(),
|
|
10450
|
-
engine: PipelineEngineChoiceSchema.optional(),
|
|
10451
10526
|
group: string().optional(),
|
|
10452
10527
|
settings: record(string(), unknown()).optional()
|
|
10453
10528
|
}));
|
|
@@ -10472,7 +10547,9 @@ var PipelineModelOptionSchema = object({
|
|
|
10472
10547
|
formats: record(string(), object({
|
|
10473
10548
|
downloaded: boolean(),
|
|
10474
10549
|
sizeMB: number()
|
|
10475
|
-
}))
|
|
10550
|
+
})),
|
|
10551
|
+
group: ModelVariantGroupSchema.optional(),
|
|
10552
|
+
legacy: boolean().optional()
|
|
10476
10553
|
});
|
|
10477
10554
|
var ConfigFieldBridge = custom();
|
|
10478
10555
|
var PipelineAddonSchemaSchema = object({
|
|
@@ -10502,11 +10579,6 @@ var PipelineSchemaSchema = object({
|
|
|
10502
10579
|
selectedEngine: PipelineEngineChoiceSchema,
|
|
10503
10580
|
slots: array(PipelineSlotSchemaSchema).readonly()
|
|
10504
10581
|
});
|
|
10505
|
-
var DetectorOutputSchema = object({
|
|
10506
|
-
detections: array(SpatialDetectionSchema).readonly(),
|
|
10507
|
-
inferenceMs: number(),
|
|
10508
|
-
modelId: string()
|
|
10509
|
-
});
|
|
10510
10582
|
var EngineProvisioningSchema = object({
|
|
10511
10583
|
runtimeId: _enum([
|
|
10512
10584
|
"onnx",
|
|
@@ -10523,15 +10595,42 @@ var EngineProvisioningSchema = object({
|
|
|
10523
10595
|
]),
|
|
10524
10596
|
progress: number().optional(),
|
|
10525
10597
|
error: string().optional(),
|
|
10526
|
-
nextRetryAt: number().optional()
|
|
10598
|
+
nextRetryAt: number().optional(),
|
|
10599
|
+
/**
|
|
10600
|
+
* Gate A (config-correctness gate at engine change): human-readable
|
|
10601
|
+
* config issues surfaced EAGERLY when the node's engine changes — model
|
|
10602
|
+
* substitutions ("chose X, running Y") and zero-build steps ("no model
|
|
10603
|
+
* has a <format> build"). Additive/optional: informational only, never
|
|
10604
|
+
* enforced here — `assertEngineReady` (readiness) still gates inference.
|
|
10605
|
+
* Absent/empty when the node-default tree resolves cleanly.
|
|
10606
|
+
*/
|
|
10607
|
+
configIssues: array(string()).optional()
|
|
10527
10608
|
});
|
|
10528
10609
|
var PipelineStepInputSchema = lazy(() => object({
|
|
10529
10610
|
addonId: string(),
|
|
10530
|
-
modelId: string(),
|
|
10611
|
+
modelId: string().optional(),
|
|
10531
10612
|
enabled: boolean().default(true),
|
|
10532
10613
|
children: array(PipelineStepInputSchema).optional(),
|
|
10533
10614
|
settings: record(string(), unknown()).optional()
|
|
10534
10615
|
}));
|
|
10616
|
+
var ModelSubstitutionSchema = object({
|
|
10617
|
+
addonId: string(),
|
|
10618
|
+
chosen: string(),
|
|
10619
|
+
running: string(),
|
|
10620
|
+
format: string()
|
|
10621
|
+
});
|
|
10622
|
+
var PipelineValidationIssueSchema = object({
|
|
10623
|
+
addonId: string(),
|
|
10624
|
+
kind: _enum(["unknown-addon", "no-format-build"]),
|
|
10625
|
+
detail: string()
|
|
10626
|
+
});
|
|
10627
|
+
var PipelineValidationResultSchema = object({
|
|
10628
|
+
ok: boolean(),
|
|
10629
|
+
issues: array(PipelineValidationIssueSchema).readonly(),
|
|
10630
|
+
substitutions: array(ModelSubstitutionSchema).readonly(),
|
|
10631
|
+
/** The node's `currentEngine.format` this validation ran against. */
|
|
10632
|
+
format: string()
|
|
10633
|
+
});
|
|
10535
10634
|
var ReferenceImageEntrySchema = object({
|
|
10536
10635
|
filename: string(),
|
|
10537
10636
|
stepIds: array(string()).readonly().optional()
|
|
@@ -10602,7 +10701,13 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
10602
10701
|
})) }), object({ success: literal(true) }), {
|
|
10603
10702
|
kind: "mutation",
|
|
10604
10703
|
auth: "admin"
|
|
10605
|
-
}), method(
|
|
10704
|
+
}), method(object({ nodeId: string() }), object({
|
|
10705
|
+
success: literal(true),
|
|
10706
|
+
clearedDevices: number()
|
|
10707
|
+
}), {
|
|
10708
|
+
kind: "mutation",
|
|
10709
|
+
auth: "admin"
|
|
10710
|
+
}), 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({
|
|
10606
10711
|
name: string(),
|
|
10607
10712
|
steps: array(PipelineTemplateStepSchema).readonly(),
|
|
10608
10713
|
engine: PipelineEngineChoiceSchema
|
|
@@ -10619,10 +10724,6 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
10619
10724
|
modelId: string(),
|
|
10620
10725
|
format: ModelFormatSchema$1
|
|
10621
10726
|
}), object({ success: literal(true) }), { kind: "mutation" }), method(object({
|
|
10622
|
-
addonId: string(),
|
|
10623
|
-
frame: FrameInputSchema,
|
|
10624
|
-
config: record(string(), unknown()).optional()
|
|
10625
|
-
}), DetectorOutputSchema), method(object({
|
|
10626
10727
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
10627
10728
|
steps: array(PipelineStepInputSchema).min(1),
|
|
10628
10729
|
frame: FrameInputSchema.optional(),
|
|
@@ -10862,6 +10963,13 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
|
|
|
10862
10963
|
kind: literal("remote-restream"),
|
|
10863
10964
|
/** The camera's source-owner node (slice 1: always the hub). */
|
|
10864
10965
|
ownerNodeId: string(),
|
|
10966
|
+
/**
|
|
10967
|
+
* The owner's LAN-reachable host, resolved by the orchestrator from the
|
|
10968
|
+
* per-node `reachableHost` override (Cluster UI). When present the runner
|
|
10969
|
+
* dials THIS host for the owner's restream, in preference to the
|
|
10970
|
+
* `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
|
|
10971
|
+
*/
|
|
10972
|
+
ownerReachableHost: string().optional(),
|
|
10865
10973
|
/** Operator override for the owner host the runner dials. */
|
|
10866
10974
|
hubHostnameOverride: string().optional()
|
|
10867
10975
|
})]).describe("Per-camera frame-source mode for the runner (P2c)");
|
|
@@ -10870,13 +10978,11 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
|
|
|
10870
10978
|
* specific runner instance via `attachCamera`. Carries everything the
|
|
10871
10979
|
* runner needs to subscribe to the local broker and execute inference.
|
|
10872
10980
|
*
|
|
10873
|
-
* Stateless-pipeline model: the
|
|
10874
|
-
*
|
|
10875
|
-
*
|
|
10876
|
-
*
|
|
10877
|
-
*
|
|
10878
|
-
* `engine`/`steps`/`audio` are optional during the additive migration
|
|
10879
|
-
* window; once orchestrator + UI are migrated they become required.
|
|
10981
|
+
* Stateless-pipeline model: the pipeline content (`steps`, optional
|
|
10982
|
+
* `audio`) travels with the attach payload. The runner keeps it in RAM
|
|
10983
|
+
* for the lifetime of the attach — on rebalance, edit, or restart the
|
|
10984
|
+
* orchestrator re-sends the latest snapshot. Engine is NOT carried: it is
|
|
10985
|
+
* node-local, resolved by the executing runner at dispatch time.
|
|
10880
10986
|
*/
|
|
10881
10987
|
var RunnerCameraConfigSchema = object({
|
|
10882
10988
|
deviceId: number(),
|
|
@@ -10927,14 +11033,11 @@ var RunnerCameraConfigSchema = object({
|
|
|
10927
11033
|
*/
|
|
10928
11034
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
10929
11035
|
pipelineEnabled: boolean().default(true),
|
|
10930
|
-
/** Engine choice for video steps (runtime+backend+format). */
|
|
10931
|
-
engine: PipelineEngineChoiceSchema.optional(),
|
|
10932
11036
|
/** Ordered tree of video steps. Absent → runner skips video detection. */
|
|
10933
11037
|
steps: array(PipelineStepInputSchema).readonly().optional(),
|
|
10934
11038
|
/** Audio classification branch. `enabled:false` disables, null skips. */
|
|
10935
11039
|
audio: object({
|
|
10936
|
-
|
|
10937
|
-
modelId: string(),
|
|
11040
|
+
modelId: string().optional(),
|
|
10938
11041
|
enabled: boolean()
|
|
10939
11042
|
}).nullable().optional(),
|
|
10940
11043
|
/**
|
|
@@ -12364,7 +12467,9 @@ var AddonPageDeclarationSchema$1 = object({
|
|
|
12364
12467
|
icon: string(),
|
|
12365
12468
|
path: string(),
|
|
12366
12469
|
remoteName: string(),
|
|
12367
|
-
bundle: string()
|
|
12470
|
+
bundle: string(),
|
|
12471
|
+
section: string().optional(),
|
|
12472
|
+
sectionLabel: string().optional()
|
|
12368
12473
|
});
|
|
12369
12474
|
var AddonPageInfoSchema = object({
|
|
12370
12475
|
addonId: string(),
|
|
@@ -12404,7 +12509,18 @@ var AddonPageDeclarationSchema = object({
|
|
|
12404
12509
|
* the static-file route can compute an mtime-based cache-buster URL
|
|
12405
12510
|
* without a separate filesystem stat.
|
|
12406
12511
|
*/
|
|
12407
|
-
bundle: string()
|
|
12512
|
+
bundle: string(),
|
|
12513
|
+
/**
|
|
12514
|
+
* Sidebar section this page docks into. Well-known ids: `'detection'`,
|
|
12515
|
+
* `'cluster'`, `'administration'` — the page renders inside that group.
|
|
12516
|
+
* Any OTHER string creates (or joins) a custom section rendered after
|
|
12517
|
+
* the built-in groups; its label comes from `sectionLabel` (first
|
|
12518
|
+
* declaration wins), falling back to the id. Absent → the legacy
|
|
12519
|
+
* "Addon Pages" group.
|
|
12520
|
+
*/
|
|
12521
|
+
section: string().optional(),
|
|
12522
|
+
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
12523
|
+
sectionLabel: string().optional()
|
|
12408
12524
|
});
|
|
12409
12525
|
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
12410
12526
|
var AddonHttpRouteSchema = object({
|
|
@@ -12620,6 +12736,17 @@ var WidgetMetadataSchema = object({
|
|
|
12620
12736
|
deviceContext: boolean().default(false),
|
|
12621
12737
|
integrationContext: boolean().default(false)
|
|
12622
12738
|
}),
|
|
12739
|
+
/**
|
|
12740
|
+
* Loadable BEFORE authentication. The normal widget registry listing
|
|
12741
|
+
* (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
|
|
12742
|
+
* (the login page) cannot discover a widget through it. A widget that
|
|
12743
|
+
* declares `preAuth: true` marks itself as safe to mount on a pre-auth
|
|
12744
|
+
* screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
|
|
12745
|
+
* login-method contribution channel (see `login-method.cap.ts`) rather
|
|
12746
|
+
* than the authenticated registry, and its bundle is served by the
|
|
12747
|
+
* public `/api/addon-widgets/:addonId/*` static route. Defaults false.
|
|
12748
|
+
*/
|
|
12749
|
+
preAuth: boolean().optional().default(false),
|
|
12623
12750
|
/** Dashboard placement HINTS (operator can override per instance). */
|
|
12624
12751
|
defaultSize: WidgetSizeEnum.default("md"),
|
|
12625
12752
|
allowedSizes: array(WidgetSizeEnum).readonly().default([
|
|
@@ -12927,6 +13054,66 @@ method(object({
|
|
|
12927
13054
|
password: string()
|
|
12928
13055
|
}), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
|
|
12929
13056
|
/**
|
|
13057
|
+
* `login-method` — collection cap through which auth addons contribute
|
|
13058
|
+
* their pre-auth login surfaces to the login page. This is the SINGLE,
|
|
13059
|
+
* generic mechanism that supersedes the dead `auth.listProviders` reader:
|
|
13060
|
+
* every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
|
|
13061
|
+
* `login-method` provider and the PUBLIC `auth.listLoginMethods`
|
|
13062
|
+
* procedure aggregates them for the unauthenticated login page.
|
|
13063
|
+
*
|
|
13064
|
+
* A contribution is a discriminated union on `kind`:
|
|
13065
|
+
*
|
|
13066
|
+
* - `redirect` — a declarative button. The login page renders a generic
|
|
13067
|
+
* button that navigates to `startUrl` (an addon-owned HTTP route).
|
|
13068
|
+
* Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
|
|
13069
|
+
* ZERO shell-side JS. A future SSO addon plugs in the same way — the
|
|
13070
|
+
* login page needs NO change.
|
|
13071
|
+
*
|
|
13072
|
+
* - `widget` — a Module-Federation widget the login page mounts (via
|
|
13073
|
+
* `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
|
|
13074
|
+
* login ceremony, which must run `@simplewebauthn/browser` INSIDE the
|
|
13075
|
+
* addon bundle. The referenced widget also declares `preAuth: true` in
|
|
13076
|
+
* its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
|
|
13077
|
+
* stamps a public `bundleUrl` from `addonId` + `bundle`.
|
|
13078
|
+
*
|
|
13079
|
+
* Every contribution carries a `stage`:
|
|
13080
|
+
* - `primary` — shown on the first credentials screen (OIDC /
|
|
13081
|
+
* magic-link buttons; a future usernameless passkey).
|
|
13082
|
+
* - `second-factor` — shown AFTER the password leg, gated on the
|
|
13083
|
+
* returned `factors` (passkey-as-2FA today).
|
|
13084
|
+
*
|
|
13085
|
+
* `mount: skip` — the cap is read server-side by the core auth router
|
|
13086
|
+
* (`registry.getCollection('login-method')`), never mounted as its own
|
|
13087
|
+
* tRPC router.
|
|
13088
|
+
*/
|
|
13089
|
+
/** When a login method renders in the two-phase login flow. */
|
|
13090
|
+
var LoginStageEnum = _enum(["primary", "second-factor"]);
|
|
13091
|
+
/** One login-method contribution — redirect button OR pre-auth widget. */
|
|
13092
|
+
var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
|
|
13093
|
+
kind: literal("redirect"),
|
|
13094
|
+
/** Stable id within the login-method set (e.g. `auth-oidc/google`). */
|
|
13095
|
+
id: string(),
|
|
13096
|
+
/** Operator-facing button label. */
|
|
13097
|
+
label: string(),
|
|
13098
|
+
/** lucide-react icon name. */
|
|
13099
|
+
icon: string().optional(),
|
|
13100
|
+
/** Addon-owned HTTP route the button navigates to (GET). */
|
|
13101
|
+
startUrl: string(),
|
|
13102
|
+
stage: LoginStageEnum
|
|
13103
|
+
}), object({
|
|
13104
|
+
kind: literal("widget"),
|
|
13105
|
+
/** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
|
|
13106
|
+
id: string(),
|
|
13107
|
+
/** Owning addon id — drives the public bundle URL + the MF namespace. */
|
|
13108
|
+
addonId: string(),
|
|
13109
|
+
/** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
|
|
13110
|
+
bundle: string(),
|
|
13111
|
+
/** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
|
|
13112
|
+
remote: WidgetRemoteSchema,
|
|
13113
|
+
stage: LoginStageEnum
|
|
13114
|
+
})]);
|
|
13115
|
+
method(_void(), array(LoginMethodContributionSchema).readonly());
|
|
13116
|
+
/**
|
|
12930
13117
|
* Orchestrator-side destination metadata. The orchestrator computes
|
|
12931
13118
|
* `id = <addonId>:<subId>` from its provider lookup so consumers
|
|
12932
13119
|
* (admin UI, restore flow) see one canonical key.
|
|
@@ -15283,11 +15470,11 @@ var pipelineAnalyticsCapability = {
|
|
|
15283
15470
|
}
|
|
15284
15471
|
};
|
|
15285
15472
|
var CameraPipelineConfigSchema = object({
|
|
15286
|
-
engine: PipelineEngineChoiceSchema,
|
|
15473
|
+
engine: PipelineEngineChoiceSchema.optional(),
|
|
15287
15474
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
15288
15475
|
audio: object({
|
|
15289
|
-
engine: PipelineEngineChoiceSchema,
|
|
15290
|
-
modelId: string(),
|
|
15476
|
+
engine: PipelineEngineChoiceSchema.optional(),
|
|
15477
|
+
modelId: string().optional(),
|
|
15291
15478
|
enabled: boolean(),
|
|
15292
15479
|
settings: record(string(), unknown()).readonly().optional()
|
|
15293
15480
|
}).nullable().optional()
|
|
@@ -15302,7 +15489,7 @@ var PipelineTemplateSchema = object({
|
|
|
15302
15489
|
});
|
|
15303
15490
|
var AgentAddonConfigSchema = object({
|
|
15304
15491
|
enabled: boolean(),
|
|
15305
|
-
modelId: string(),
|
|
15492
|
+
modelId: string().optional(),
|
|
15306
15493
|
settings: record(string(), unknown()).readonly()
|
|
15307
15494
|
});
|
|
15308
15495
|
var AgentPipelineSettingsSchema = object({
|
|
@@ -15312,12 +15499,25 @@ var AgentPipelineSettingsSchema = object({
|
|
|
15312
15499
|
detectWeight: number().positive().optional(),
|
|
15313
15500
|
/** Node is eligible to run the detection pipeline (decode + inference). */
|
|
15314
15501
|
detect: boolean().optional(),
|
|
15315
|
-
/**
|
|
15502
|
+
/**
|
|
15503
|
+
* DEPRECATED AND IGNORED. Decode is always co-located with its frame
|
|
15504
|
+
* consumer, so decode eligibility IS detect eligibility. Kept optional in
|
|
15505
|
+
* the schema ONLY so persisted stores written before the removal still
|
|
15506
|
+
* parse — no code reads it and no write path emits it.
|
|
15507
|
+
*/
|
|
15316
15508
|
decode: boolean().optional(),
|
|
15317
15509
|
/** Node is eligible to run audio-analyzer sessions. */
|
|
15318
15510
|
audio: boolean().optional(),
|
|
15319
15511
|
/** Node is eligible to be the ingest / source-owner (serve the restream). */
|
|
15320
|
-
ingest: boolean().optional()
|
|
15512
|
+
ingest: boolean().optional(),
|
|
15513
|
+
/**
|
|
15514
|
+
* Operator override for the LAN host a cross-node decoder dials to reach
|
|
15515
|
+
* THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
|
|
15516
|
+
* falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
|
|
15517
|
+
* it already uses to reach the hub). Set this only when the auto-detected
|
|
15518
|
+
* address is wrong (multi-homed host, NAT, custom interface).
|
|
15519
|
+
*/
|
|
15520
|
+
reachableHost: string().optional()
|
|
15321
15521
|
});
|
|
15322
15522
|
var CameraPipelineForAgentSchema = object({
|
|
15323
15523
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -15365,25 +15565,6 @@ var PipelineAssignmentSchema = object({
|
|
|
15365
15565
|
assignedAt: number()
|
|
15366
15566
|
});
|
|
15367
15567
|
/**
|
|
15368
|
-
* Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for
|
|
15369
|
-
* the decoder-node placement domain (`balanceDecoder` decision: manual pin
|
|
15370
|
-
* → co-located with pipeline → capacity).
|
|
15371
|
-
*/
|
|
15372
|
-
var DecoderAssignmentSchema = object({
|
|
15373
|
-
deviceId: number(),
|
|
15374
|
-
/** Moleculer node id of the decoder provider currently responsible for this camera. */
|
|
15375
|
-
decoderNodeId: string(),
|
|
15376
|
-
/** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
|
|
15377
|
-
pinned: boolean(),
|
|
15378
|
-
/** Why this assignment was made — useful for debugging the decoder balancer. */
|
|
15379
|
-
reason: _enum([
|
|
15380
|
-
"manual",
|
|
15381
|
-
"co-located",
|
|
15382
|
-
"capacity",
|
|
15383
|
-
"hardware-affinity"
|
|
15384
|
-
])
|
|
15385
|
-
});
|
|
15386
|
-
/**
|
|
15387
15568
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
15388
15569
|
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
15389
15570
|
*/
|
|
@@ -15423,6 +15604,15 @@ var GlobalMetricsSchema = object({
|
|
|
15423
15604
|
* capability providers.
|
|
15424
15605
|
*/
|
|
15425
15606
|
var CapabilityBindingsSchema = record(string(), string());
|
|
15607
|
+
/**
|
|
15608
|
+
* The cluster's single camera-source owner (`clusterRoles.ingestNode`) plus
|
|
15609
|
+
* its LAN-reachable host, if one is registered. See `getIngestOwner`.
|
|
15610
|
+
*/
|
|
15611
|
+
var IngestOwnerSchema = object({
|
|
15612
|
+
ownerNodeId: string(),
|
|
15613
|
+
reachableHost: string().optional(),
|
|
15614
|
+
configIssue: string().optional()
|
|
15615
|
+
});
|
|
15426
15616
|
/** Source block — always present; derives from the stream catalog. */
|
|
15427
15617
|
var CameraSourceStatusSchema = object({ streams: array(object({
|
|
15428
15618
|
camStreamId: string(),
|
|
@@ -15437,6 +15627,14 @@ var CameraAssignmentStatusSchema = object({
|
|
|
15437
15627
|
detectionNodeId: string().nullable(),
|
|
15438
15628
|
decoderNodeId: string().nullable(),
|
|
15439
15629
|
audioNodeId: string().nullable(),
|
|
15630
|
+
/**
|
|
15631
|
+
* The node that OWNS this camera's physical source pull (dials the RTSP and
|
|
15632
|
+
* hosts the broker/restream) — the cluster ingest owner today
|
|
15633
|
+
* (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
|
|
15634
|
+
* the UI show WHERE a camera is sourced without SSH/logs, and is the node the
|
|
15635
|
+
* broker block below was read from (pinned). Nullable only pre-wiring.
|
|
15636
|
+
*/
|
|
15637
|
+
sourceNodeId: string().nullable(),
|
|
15440
15638
|
pinned: object({
|
|
15441
15639
|
detection: boolean(),
|
|
15442
15640
|
decoder: boolean(),
|
|
@@ -15569,16 +15767,7 @@ method(object({
|
|
|
15569
15767
|
}), object({ success: literal(true) }), {
|
|
15570
15768
|
kind: "mutation",
|
|
15571
15769
|
auth: "admin"
|
|
15572
|
-
}), method(object({
|
|
15573
|
-
deviceId: number(),
|
|
15574
|
-
nodeId: string()
|
|
15575
|
-
}), _void(), {
|
|
15576
|
-
kind: "mutation",
|
|
15577
|
-
auth: "admin"
|
|
15578
|
-
}), method(object({ deviceId: number() }), _void(), {
|
|
15579
|
-
kind: "mutation",
|
|
15580
|
-
auth: "admin"
|
|
15581
|
-
}), method(_void(), array(DecoderAssignmentSchema).readonly()), method(object({
|
|
15770
|
+
}), method(_void(), IngestOwnerSchema), method(object({
|
|
15582
15771
|
deviceId: number(),
|
|
15583
15772
|
nodeId: string()
|
|
15584
15773
|
}), object({ success: literal(true) }), {
|
|
@@ -15599,10 +15788,7 @@ method(object({
|
|
|
15599
15788
|
nodeId: string(),
|
|
15600
15789
|
pinned: boolean(),
|
|
15601
15790
|
assignedAt: number()
|
|
15602
|
-
}))), method(object({
|
|
15603
|
-
deviceId: number(),
|
|
15604
|
-
pipelineNodeId: string().optional()
|
|
15605
|
-
}), DecoderAssignmentSchema), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
15791
|
+
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
15606
15792
|
nodeId: string(),
|
|
15607
15793
|
settings: AgentPipelineSettingsSchema
|
|
15608
15794
|
})).readonly()), method(object({
|
|
@@ -15632,12 +15818,26 @@ method(object({
|
|
|
15632
15818
|
}), method(object({
|
|
15633
15819
|
agentNodeId: string(),
|
|
15634
15820
|
detect: boolean().nullable().optional(),
|
|
15635
|
-
decode: boolean().nullable().optional(),
|
|
15636
15821
|
audio: boolean().nullable().optional(),
|
|
15637
15822
|
ingest: boolean().nullable().optional()
|
|
15638
15823
|
}), object({ success: literal(true) }), {
|
|
15639
15824
|
kind: "mutation",
|
|
15640
15825
|
auth: "admin"
|
|
15826
|
+
}), method(object({
|
|
15827
|
+
agentNodeId: string(),
|
|
15828
|
+
reachableHost: string().nullable()
|
|
15829
|
+
}), object({ success: literal(true) }), {
|
|
15830
|
+
kind: "mutation",
|
|
15831
|
+
auth: "admin"
|
|
15832
|
+
}), method(object({ agentNodeId: string() }), object({
|
|
15833
|
+
success: literal(true),
|
|
15834
|
+
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
15835
|
+
effectiveModelId: string().nullable(),
|
|
15836
|
+
/** Number of cameras whose node-scoped overrides were cleared. */
|
|
15837
|
+
clearedCameraOverrides: number()
|
|
15838
|
+
}), {
|
|
15839
|
+
kind: "mutation",
|
|
15840
|
+
auth: "admin"
|
|
15641
15841
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
15642
15842
|
deviceId: number(),
|
|
15643
15843
|
addonId: string(),
|
|
@@ -15682,22 +15882,131 @@ method(object({
|
|
|
15682
15882
|
kind: "mutation",
|
|
15683
15883
|
auth: "admin"
|
|
15684
15884
|
});
|
|
15685
|
-
|
|
15686
|
-
|
|
15687
|
-
|
|
15688
|
-
|
|
15689
|
-
|
|
15690
|
-
|
|
15885
|
+
/**
|
|
15886
|
+
* server-management — per-NODE singleton capability for a node's ROOT
|
|
15887
|
+
* package lifecycle (runtime-updatable node packages, phase 2: hub + docker
|
|
15888
|
+
* agents).
|
|
15889
|
+
*
|
|
15890
|
+
* Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
|
|
15891
|
+
* on agents) carries the whole software stack in its npm dep tree, so ONE
|
|
15892
|
+
* version describes the node. Updates install into
|
|
15893
|
+
* `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
|
|
15894
|
+
* starter (probation boot + auto-rollback to N-1).
|
|
15895
|
+
*
|
|
15896
|
+
* Providers:
|
|
15897
|
+
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
15898
|
+
* (`buildServerProviders` in trpc.router.ts) — the default target for
|
|
15899
|
+
* unpinned calls.
|
|
15900
|
+
* - AGENT: `AgentUpdateService` registered by the agent bootstrap under
|
|
15901
|
+
* the synthetic `agent-runtime` addonId and declared in the agent's
|
|
15902
|
+
* `$hub.registerNode` manifest.
|
|
15903
|
+
*
|
|
15904
|
+
* Node routing: singleton caps get the codegen/runtime-builder `nodeId`
|
|
15905
|
+
* injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
|
|
15906
|
+
* SDK) routes the call to that node's provider via the standard remote
|
|
15907
|
+
* proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
|
|
15908
|
+
* in-process provider lookup). No `nodeId` → the hub's own provider.
|
|
15909
|
+
*
|
|
15910
|
+
* Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
|
|
15911
|
+
*/
|
|
15912
|
+
/**
|
|
15913
|
+
* Where the running hub's code was loaded from:
|
|
15914
|
+
* - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
|
|
15915
|
+
* plain resolution and runtime updates are refused.
|
|
15916
|
+
* - `baked` — the immutable image seed closure (no data-dir root active).
|
|
15917
|
+
* - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
|
|
15918
|
+
*/
|
|
15919
|
+
var ServerBootModeSchema = _enum([
|
|
15920
|
+
"workspace",
|
|
15921
|
+
"baked",
|
|
15922
|
+
"data-root"
|
|
15923
|
+
]);
|
|
15924
|
+
/**
|
|
15925
|
+
* Update lifecycle state:
|
|
15926
|
+
* - `idle` / `checking` / `staging` — steady / in-flight registry work.
|
|
15927
|
+
* - `pending-restart` — a version is staged and the node has NOT yet
|
|
15928
|
+
* restarted onto it (still running the OLD version).
|
|
15929
|
+
* - `awaiting-confirmation` — the node HAS restarted onto the staged version
|
|
15930
|
+
* (it is the active probation boot) and is waiting to confirm boot-health.
|
|
15931
|
+
* Apply/rollback are refused in this state and the node must NOT be
|
|
15932
|
+
* manually restarted, or the probation boot auto-rolls-back.
|
|
15933
|
+
*/
|
|
15934
|
+
var ServerUpdateStateSchema = _enum([
|
|
15935
|
+
"idle",
|
|
15936
|
+
"checking",
|
|
15937
|
+
"staging",
|
|
15938
|
+
"pending-restart",
|
|
15939
|
+
"awaiting-confirmation"
|
|
15940
|
+
]);
|
|
15941
|
+
var ServerRollbackInfoSchema = object({
|
|
15942
|
+
/** The version that failed (or was manually rolled back). */
|
|
15943
|
+
fromVersion: string(),
|
|
15944
|
+
/** The version rolled back to; null = the baked seed. */
|
|
15945
|
+
toVersion: string().nullable(),
|
|
15946
|
+
atMs: number(),
|
|
15947
|
+
reason: string()
|
|
15691
15948
|
});
|
|
15692
|
-
var
|
|
15693
|
-
|
|
15694
|
-
|
|
15695
|
-
|
|
15949
|
+
var ServerPackageStatusSchema = object({
|
|
15950
|
+
/** Root package name (`@camstack/server` on the hub). */
|
|
15951
|
+
packageName: string(),
|
|
15952
|
+
/** Version of the code the running process ACTUALLY loaded. */
|
|
15953
|
+
runningVersion: string().nullable(),
|
|
15954
|
+
/** Node.js runtime version the node's process runs on (`process.versions.node`). */
|
|
15955
|
+
nodeRuntimeVersion: string().nullable(),
|
|
15956
|
+
/** Active data-dir root version; null when booted from seed/workspace. */
|
|
15957
|
+
activeVersion: string().nullable(),
|
|
15958
|
+
/** N-1 version kept for rollback; null when no previous version exists. */
|
|
15959
|
+
previousVersion: string().nullable(),
|
|
15960
|
+
/** Version of the immutable baked seed closure (image fallback). */
|
|
15961
|
+
seedVersion: string().nullable(),
|
|
15962
|
+
/** Latest registry version from the most recent check (null = never checked). */
|
|
15963
|
+
latestVersion: string().nullable(),
|
|
15964
|
+
updateAvailable: boolean(),
|
|
15965
|
+
bootMode: ServerBootModeSchema,
|
|
15966
|
+
updateState: ServerUpdateStateSchema,
|
|
15967
|
+
/** Version staged + awaiting its probation boot, when one is pending. */
|
|
15968
|
+
pendingVersion: string().nullable(),
|
|
15969
|
+
/** Set when the last freshly-activated version failed its boot health-check. */
|
|
15970
|
+
rolledBack: ServerRollbackInfoSchema.nullable(),
|
|
15971
|
+
/**
|
|
15972
|
+
* True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
|
|
15973
|
+
* hub is running from the baked seed (or workspace) while installed data-dir
|
|
15974
|
+
* versions are being IGNORED. Surfaced as a warning in the UI.
|
|
15975
|
+
*/
|
|
15976
|
+
stateFileCorrupt: boolean(),
|
|
15977
|
+
lastCheckedAtMs: number().nullable()
|
|
15978
|
+
});
|
|
15979
|
+
var ServerUpdateCheckResultSchema = object({
|
|
15980
|
+
packageName: string(),
|
|
15981
|
+
runningVersion: string().nullable(),
|
|
15982
|
+
latestVersion: string().nullable(),
|
|
15983
|
+
updateAvailable: boolean(),
|
|
15984
|
+
checkedAtMs: number(),
|
|
15985
|
+
/** Non-null when the registry lookup failed (offline, bad registry, …). */
|
|
15986
|
+
error: string().nullable()
|
|
15987
|
+
});
|
|
15988
|
+
var ServerUpdateActionResultSchema = object({
|
|
15989
|
+
accepted: boolean(),
|
|
15990
|
+
targetVersion: string().nullable(),
|
|
15991
|
+
/** True when a graceful restart was scheduled to apply the change. */
|
|
15992
|
+
restarting: boolean(),
|
|
15993
|
+
message: string()
|
|
15994
|
+
});
|
|
15995
|
+
method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
|
|
15996
|
+
kind: "mutation",
|
|
15997
|
+
auth: "admin"
|
|
15998
|
+
}), method(object({
|
|
15999
|
+
/** Explicit target version; omitted = latest from the registry. */
|
|
16000
|
+
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
16001
|
+
kind: "mutation",
|
|
16002
|
+
auth: "admin"
|
|
16003
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
16004
|
+
kind: "mutation",
|
|
16005
|
+
auth: "admin"
|
|
16006
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
16007
|
+
kind: "mutation",
|
|
16008
|
+
auth: "admin"
|
|
15696
16009
|
});
|
|
15697
|
-
method(object({
|
|
15698
|
-
deviceId: number(),
|
|
15699
|
-
streams: array(RegisteredStreamSchema).readonly()
|
|
15700
|
-
}), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(ExposedResourceSchema).readonly());
|
|
15701
16010
|
/**
|
|
15702
16011
|
* Query filter for settings-store collections.
|
|
15703
16012
|
*/
|
|
@@ -15850,9 +16159,9 @@ method(SendEmailInputSchema, SendEmailResultSchema, {
|
|
|
15850
16159
|
/**
|
|
15851
16160
|
* A single device snapshot returned as base64 JPEG/PNG.
|
|
15852
16161
|
*
|
|
15853
|
-
*
|
|
15854
|
-
*
|
|
15855
|
-
*
|
|
16162
|
+
* The `SnapshotAddon` wrapper returns this shape whether the frame came from
|
|
16163
|
+
* the device-native provider (onboard capture) or from the stream-broker
|
|
16164
|
+
* prebuffer fallback.
|
|
15856
16165
|
*/
|
|
15857
16166
|
var SnapshotImageSchema = object({
|
|
15858
16167
|
base64: string(),
|
|
@@ -15883,11 +16192,12 @@ DeviceType.Camera, method(object({
|
|
|
15883
16192
|
}), SnapshotImageSchema.nullable()), method(object({ deviceId: number() }), _void(), {
|
|
15884
16193
|
kind: "mutation",
|
|
15885
16194
|
auth: "admin"
|
|
15886
|
-
})
|
|
15887
|
-
method(object({ deviceId: number() }), boolean()), method(object({
|
|
16195
|
+
}), systemMethod(object({ deviceIds: array(number()).min(1).max(200) }), array(object({
|
|
15888
16196
|
deviceId: number(),
|
|
15889
|
-
|
|
15890
|
-
|
|
16197
|
+
lastCapturedAt: number().nullable(),
|
|
16198
|
+
cacheAgeMs: number().nullable(),
|
|
16199
|
+
etag: string().nullable()
|
|
16200
|
+
})));
|
|
15891
16201
|
/**
|
|
15892
16202
|
* `sso-bridge` — internal hub-only cap that lets SSO-style auth
|
|
15893
16203
|
* providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
|
|
@@ -16138,10 +16448,32 @@ method(_void(), array(TurnServerSchema).readonly());
|
|
|
16138
16448
|
* b. `finishAuthentication({userId, response})` → server verifies
|
|
16139
16449
|
* the assertion, bumps the credential counter, returns ok.
|
|
16140
16450
|
*
|
|
16451
|
+
* 2b. Usernameless (discoverable-credential) authentication — the
|
|
16452
|
+
* passkey IS the primary factor, no password leg:
|
|
16453
|
+
* a. `beginDiscoverableAuthentication({})` → assertion options with
|
|
16454
|
+
* EMPTY `allowCredentials` (the browser offers every resident
|
|
16455
|
+
* passkey it holds for this RP) + `userVerification: 'required'`
|
|
16456
|
+
* (the passkey replaces both factors, so UV is mandatory).
|
|
16457
|
+
* The challenge is stored server-side, NOT bound to any user.
|
|
16458
|
+
* b. `finishDiscoverableAuthentication({response})` → the provider
|
|
16459
|
+
* resolves the credential by the response's credential id,
|
|
16460
|
+
* verifies the assertion against the stored challenge + that
|
|
16461
|
+
* credential's public key/counter, and returns the OWNING
|
|
16462
|
+
* `userId` — the caller (core auth router) mints the session.
|
|
16463
|
+
*
|
|
16141
16464
|
* 3. Management:
|
|
16142
16465
|
* - `listPasskeys({userId})` — enumerate user's enrolled credentials.
|
|
16143
16466
|
* - `removePasskey({userId, credentialId})` — revoke one credential.
|
|
16144
16467
|
*
|
|
16468
|
+
* 4. Second-factor preference (opt-in, default OFF):
|
|
16469
|
+
* Enrolling a passkey only enables passkey-FIRST sign-in. It is
|
|
16470
|
+
* demanded as a second factor after a password login ONLY when the
|
|
16471
|
+
* user explicitly opts in via `setSecondFactorPreference`.
|
|
16472
|
+
* - `getSecondFactorPreference({userId})` → `{ enabled }` (missing
|
|
16473
|
+
* row ⇒ `enabled: false`).
|
|
16474
|
+
* - `setSecondFactorPreference({userId, enabled})` — persisted by
|
|
16475
|
+
* the providing addon beside its credentials.
|
|
16476
|
+
*
|
|
16145
16477
|
* Challenges are short-lived (5 min, in-memory). The cap is internal —
|
|
16146
16478
|
* the admin-ui composes the begin/finish round-trip and never exposes
|
|
16147
16479
|
* the cap to non-admins.
|
|
@@ -16184,6 +16516,17 @@ method(object({
|
|
|
16184
16516
|
}), object({ verified: boolean() }), {
|
|
16185
16517
|
kind: "mutation",
|
|
16186
16518
|
access: "view"
|
|
16519
|
+
}), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
|
|
16520
|
+
kind: "mutation",
|
|
16521
|
+
access: "view"
|
|
16522
|
+
}), method(object({
|
|
16523
|
+
/** AuthenticationResponseJSON from the browser. */
|
|
16524
|
+
response: record(string(), unknown()) }), object({
|
|
16525
|
+
verified: boolean(),
|
|
16526
|
+
userId: string().nullable()
|
|
16527
|
+
}), {
|
|
16528
|
+
kind: "mutation",
|
|
16529
|
+
access: "view"
|
|
16187
16530
|
}), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
|
|
16188
16531
|
userId: string(),
|
|
16189
16532
|
credentialId: string()
|
|
@@ -16191,6 +16534,13 @@ method(object({
|
|
|
16191
16534
|
kind: "mutation",
|
|
16192
16535
|
auth: "admin",
|
|
16193
16536
|
access: "delete"
|
|
16537
|
+
}), method(object({ userId: string() }), object({ enabled: boolean() }), { auth: "admin" }), method(object({
|
|
16538
|
+
userId: string(),
|
|
16539
|
+
enabled: boolean()
|
|
16540
|
+
}), object({ success: literal(true) }), {
|
|
16541
|
+
kind: "mutation",
|
|
16542
|
+
auth: "admin",
|
|
16543
|
+
access: "create"
|
|
16194
16544
|
});
|
|
16195
16545
|
/**
|
|
16196
16546
|
* `videoclips` — the unified, navigable-clip surface for a camera.
|
|
@@ -16258,9 +16608,10 @@ var videoclipsCapability = {
|
|
|
16258
16608
|
}
|
|
16259
16609
|
};
|
|
16260
16610
|
/**
|
|
16261
|
-
* Optional client-side hints sent at session creation to help the
|
|
16262
|
-
*
|
|
16263
|
-
*
|
|
16611
|
+
* Optional client-side hints sent at session creation to help the provider
|
|
16612
|
+
* pick the best native source. All fields optional — a viewer that knows
|
|
16613
|
+
* nothing still gets a sane default. (Relocated from the retired `webrtc`
|
|
16614
|
+
* collection cap; this `webrtc-session` cap is the live signaling surface.)
|
|
16264
16615
|
*/
|
|
16265
16616
|
var webrtcClientHintsSchema = object({
|
|
16266
16617
|
viewportWidth: number().int().positive().optional(),
|
|
@@ -16271,22 +16622,6 @@ var webrtcClientHintsSchema = object({
|
|
|
16271
16622
|
/** Hard tier override; takes precedence over scoring when registered. */
|
|
16272
16623
|
prefersTier: string().optional()
|
|
16273
16624
|
}).partial();
|
|
16274
|
-
method(object({
|
|
16275
|
-
streamId: string(),
|
|
16276
|
-
sdpOffer: string()
|
|
16277
|
-
}), string(), { kind: "mutation" }), method(object({ streamId: string() }), boolean()), method(object({
|
|
16278
|
-
streamId: string(),
|
|
16279
|
-
codec: string()
|
|
16280
|
-
}), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
|
|
16281
|
-
streamId: string(),
|
|
16282
|
-
hints: webrtcClientHintsSchema.optional()
|
|
16283
|
-
}), object({
|
|
16284
|
-
sessionId: string(),
|
|
16285
|
-
sdpOffer: string()
|
|
16286
|
-
}), { kind: "mutation" }), method(object({
|
|
16287
|
-
sessionId: string(),
|
|
16288
|
-
sdpAnswer: string()
|
|
16289
|
-
}), _void(), { kind: "mutation" }), method(object({ sessionId: string() }), _void(), { kind: "mutation" }), method(object({ streamId: string() }), boolean());
|
|
16290
16625
|
/**
|
|
16291
16626
|
* Discriminated target for a WebRTC session. The client sends this
|
|
16292
16627
|
* structured object instead of building / parsing brokerId strings;
|
|
@@ -17740,6 +18075,16 @@ var TopologyCategorySchema = object({
|
|
|
17740
18075
|
healthy: number(),
|
|
17741
18076
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
17742
18077
|
});
|
|
18078
|
+
/**
|
|
18079
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
|
|
18080
|
+
* `@camstack/agent` on agents) as reported by its `registerNode` manifest —
|
|
18081
|
+
* version visibility for the Server management surface. Nullable: offline
|
|
18082
|
+
* rows and pre-phase-2 nodes report none.
|
|
18083
|
+
*/
|
|
18084
|
+
var TopologyRootPackageSchema = object({
|
|
18085
|
+
name: string(),
|
|
18086
|
+
version: string()
|
|
18087
|
+
});
|
|
17743
18088
|
var TopologyNodeSchema = object({
|
|
17744
18089
|
id: string(),
|
|
17745
18090
|
name: string(),
|
|
@@ -17763,7 +18108,8 @@ var TopologyNodeSchema = object({
|
|
|
17763
18108
|
status: string()
|
|
17764
18109
|
})).readonly(),
|
|
17765
18110
|
processes: array(TopologyProcessSchema).readonly(),
|
|
17766
|
-
categories: array(TopologyCategorySchema).readonly()
|
|
18111
|
+
categories: array(TopologyCategorySchema).readonly(),
|
|
18112
|
+
rootPackage: TopologyRootPackageSchema.nullable()
|
|
17767
18113
|
});
|
|
17768
18114
|
var CapUsageEdgeSchema = object({
|
|
17769
18115
|
callerAddonId: string(),
|
|
@@ -20587,6 +20933,12 @@ Object.freeze({
|
|
|
20587
20933
|
addonId: null,
|
|
20588
20934
|
access: "create"
|
|
20589
20935
|
},
|
|
20936
|
+
"loginMethod.getLoginMethods": {
|
|
20937
|
+
capName: "login-method",
|
|
20938
|
+
capScope: "system",
|
|
20939
|
+
addonId: null,
|
|
20940
|
+
access: "view"
|
|
20941
|
+
},
|
|
20590
20942
|
"mediaPlayer.next": {
|
|
20591
20943
|
capName: "media-player",
|
|
20592
20944
|
capScope: "device",
|
|
@@ -21217,23 +21569,23 @@ Object.freeze({
|
|
|
21217
21569
|
addonId: null,
|
|
21218
21570
|
access: "create"
|
|
21219
21571
|
},
|
|
21220
|
-
"pipelineExecutor.
|
|
21572
|
+
"pipelineExecutor.clearDeviceOverrides": {
|
|
21221
21573
|
capName: "pipeline-executor",
|
|
21222
21574
|
capScope: "system",
|
|
21223
21575
|
addonId: null,
|
|
21224
21576
|
access: "delete"
|
|
21225
21577
|
},
|
|
21226
|
-
"pipelineExecutor.
|
|
21578
|
+
"pipelineExecutor.deleteModel": {
|
|
21227
21579
|
capName: "pipeline-executor",
|
|
21228
21580
|
capScope: "system",
|
|
21229
21581
|
addonId: null,
|
|
21230
21582
|
access: "delete"
|
|
21231
21583
|
},
|
|
21232
|
-
"pipelineExecutor.
|
|
21584
|
+
"pipelineExecutor.deleteTemplate": {
|
|
21233
21585
|
capName: "pipeline-executor",
|
|
21234
21586
|
capScope: "system",
|
|
21235
21587
|
addonId: null,
|
|
21236
|
-
access: "
|
|
21588
|
+
access: "delete"
|
|
21237
21589
|
},
|
|
21238
21590
|
"pipelineExecutor.downloadModel": {
|
|
21239
21591
|
capName: "pipeline-executor",
|
|
@@ -21427,13 +21779,13 @@ Object.freeze({
|
|
|
21427
21779
|
addonId: null,
|
|
21428
21780
|
access: "create"
|
|
21429
21781
|
},
|
|
21430
|
-
"
|
|
21431
|
-
capName: "pipeline-
|
|
21782
|
+
"pipelineExecutor.validatePipeline": {
|
|
21783
|
+
capName: "pipeline-executor",
|
|
21432
21784
|
capScope: "system",
|
|
21433
21785
|
addonId: null,
|
|
21434
|
-
access: "
|
|
21786
|
+
access: "view"
|
|
21435
21787
|
},
|
|
21436
|
-
"pipelineOrchestrator.
|
|
21788
|
+
"pipelineOrchestrator.assignAudio": {
|
|
21437
21789
|
capName: "pipeline-orchestrator",
|
|
21438
21790
|
capScope: "system",
|
|
21439
21791
|
addonId: null,
|
|
@@ -21517,19 +21869,13 @@ Object.freeze({
|
|
|
21517
21869
|
addonId: null,
|
|
21518
21870
|
access: "view"
|
|
21519
21871
|
},
|
|
21520
|
-
"pipelineOrchestrator.
|
|
21521
|
-
capName: "pipeline-orchestrator",
|
|
21522
|
-
capScope: "system",
|
|
21523
|
-
addonId: null,
|
|
21524
|
-
access: "view"
|
|
21525
|
-
},
|
|
21526
|
-
"pipelineOrchestrator.getDecoderAssignments": {
|
|
21872
|
+
"pipelineOrchestrator.getGlobalMetrics": {
|
|
21527
21873
|
capName: "pipeline-orchestrator",
|
|
21528
21874
|
capScope: "system",
|
|
21529
21875
|
addonId: null,
|
|
21530
21876
|
access: "view"
|
|
21531
21877
|
},
|
|
21532
|
-
"pipelineOrchestrator.
|
|
21878
|
+
"pipelineOrchestrator.getIngestOwner": {
|
|
21533
21879
|
capName: "pipeline-orchestrator",
|
|
21534
21880
|
capScope: "system",
|
|
21535
21881
|
addonId: null,
|
|
@@ -21571,6 +21917,12 @@ Object.freeze({
|
|
|
21571
21917
|
addonId: null,
|
|
21572
21918
|
access: "delete"
|
|
21573
21919
|
},
|
|
21920
|
+
"pipelineOrchestrator.resetNodePipelineDefaults": {
|
|
21921
|
+
capName: "pipeline-orchestrator",
|
|
21922
|
+
capScope: "system",
|
|
21923
|
+
addonId: null,
|
|
21924
|
+
access: "delete"
|
|
21925
|
+
},
|
|
21574
21926
|
"pipelineOrchestrator.resolvePipeline": {
|
|
21575
21927
|
capName: "pipeline-orchestrator",
|
|
21576
21928
|
capScope: "system",
|
|
@@ -21607,37 +21959,37 @@ Object.freeze({
|
|
|
21607
21959
|
addonId: null,
|
|
21608
21960
|
access: "create"
|
|
21609
21961
|
},
|
|
21610
|
-
"pipelineOrchestrator.
|
|
21962
|
+
"pipelineOrchestrator.setAgentReachableHost": {
|
|
21611
21963
|
capName: "pipeline-orchestrator",
|
|
21612
21964
|
capScope: "system",
|
|
21613
21965
|
addonId: null,
|
|
21614
21966
|
access: "create"
|
|
21615
21967
|
},
|
|
21616
|
-
"pipelineOrchestrator.
|
|
21968
|
+
"pipelineOrchestrator.setCameraPipelineForAgent": {
|
|
21617
21969
|
capName: "pipeline-orchestrator",
|
|
21618
21970
|
capScope: "system",
|
|
21619
21971
|
addonId: null,
|
|
21620
21972
|
access: "create"
|
|
21621
21973
|
},
|
|
21622
|
-
"pipelineOrchestrator.
|
|
21974
|
+
"pipelineOrchestrator.setCameraStepOverride": {
|
|
21623
21975
|
capName: "pipeline-orchestrator",
|
|
21624
21976
|
capScope: "system",
|
|
21625
21977
|
addonId: null,
|
|
21626
21978
|
access: "create"
|
|
21627
21979
|
},
|
|
21628
|
-
"pipelineOrchestrator.
|
|
21980
|
+
"pipelineOrchestrator.setCameraStepToggle": {
|
|
21629
21981
|
capName: "pipeline-orchestrator",
|
|
21630
21982
|
capScope: "system",
|
|
21631
21983
|
addonId: null,
|
|
21632
21984
|
access: "create"
|
|
21633
21985
|
},
|
|
21634
|
-
"pipelineOrchestrator.
|
|
21986
|
+
"pipelineOrchestrator.setCapabilityBinding": {
|
|
21635
21987
|
capName: "pipeline-orchestrator",
|
|
21636
21988
|
capScope: "system",
|
|
21637
21989
|
addonId: null,
|
|
21638
21990
|
access: "create"
|
|
21639
21991
|
},
|
|
21640
|
-
"pipelineOrchestrator.
|
|
21992
|
+
"pipelineOrchestrator.unassignAudio": {
|
|
21641
21993
|
capName: "pipeline-orchestrator",
|
|
21642
21994
|
capScope: "system",
|
|
21643
21995
|
addonId: null,
|
|
@@ -21937,33 +22289,45 @@ Object.freeze({
|
|
|
21937
22289
|
addonId: null,
|
|
21938
22290
|
access: "create"
|
|
21939
22291
|
},
|
|
21940
|
-
"
|
|
21941
|
-
capName: "
|
|
22292
|
+
"scriptRunner.run": {
|
|
22293
|
+
capName: "script-runner",
|
|
22294
|
+
capScope: "device",
|
|
22295
|
+
addonId: null,
|
|
22296
|
+
access: "create"
|
|
22297
|
+
},
|
|
22298
|
+
"scriptRunner.stop": {
|
|
22299
|
+
capName: "script-runner",
|
|
22300
|
+
capScope: "device",
|
|
22301
|
+
addonId: null,
|
|
22302
|
+
access: "create"
|
|
22303
|
+
},
|
|
22304
|
+
"serverManagement.applyServerUpdate": {
|
|
22305
|
+
capName: "server-management",
|
|
21942
22306
|
capScope: "system",
|
|
21943
22307
|
addonId: null,
|
|
21944
|
-
access: "
|
|
22308
|
+
access: "create"
|
|
21945
22309
|
},
|
|
21946
|
-
"
|
|
21947
|
-
capName: "
|
|
22310
|
+
"serverManagement.checkServerUpdate": {
|
|
22311
|
+
capName: "server-management",
|
|
21948
22312
|
capScope: "system",
|
|
21949
22313
|
addonId: null,
|
|
21950
22314
|
access: "create"
|
|
21951
22315
|
},
|
|
21952
|
-
"
|
|
21953
|
-
capName: "
|
|
22316
|
+
"serverManagement.getServerPackageStatus": {
|
|
22317
|
+
capName: "server-management",
|
|
21954
22318
|
capScope: "system",
|
|
21955
22319
|
addonId: null,
|
|
21956
|
-
access: "
|
|
22320
|
+
access: "view"
|
|
21957
22321
|
},
|
|
21958
|
-
"
|
|
21959
|
-
capName: "
|
|
21960
|
-
capScope: "
|
|
22322
|
+
"serverManagement.restartServer": {
|
|
22323
|
+
capName: "server-management",
|
|
22324
|
+
capScope: "system",
|
|
21961
22325
|
addonId: null,
|
|
21962
22326
|
access: "create"
|
|
21963
22327
|
},
|
|
21964
|
-
"
|
|
21965
|
-
capName: "
|
|
21966
|
-
capScope: "
|
|
22328
|
+
"serverManagement.rollbackServerUpdate": {
|
|
22329
|
+
capName: "server-management",
|
|
22330
|
+
capScope: "system",
|
|
21967
22331
|
addonId: null,
|
|
21968
22332
|
access: "create"
|
|
21969
22333
|
},
|
|
@@ -22051,23 +22415,17 @@ Object.freeze({
|
|
|
22051
22415
|
addonId: null,
|
|
22052
22416
|
access: "view"
|
|
22053
22417
|
},
|
|
22054
|
-
"snapshot.
|
|
22418
|
+
"snapshot.getSnapshotOverview": {
|
|
22055
22419
|
capName: "snapshot",
|
|
22056
22420
|
capScope: "device",
|
|
22057
22421
|
addonId: null,
|
|
22058
|
-
access: "create"
|
|
22059
|
-
},
|
|
22060
|
-
"snapshotProvider.getSnapshot": {
|
|
22061
|
-
capName: "snapshot-provider",
|
|
22062
|
-
capScope: "system",
|
|
22063
|
-
addonId: null,
|
|
22064
22422
|
access: "view"
|
|
22065
22423
|
},
|
|
22066
|
-
"
|
|
22067
|
-
capName: "snapshot
|
|
22068
|
-
capScope: "
|
|
22424
|
+
"snapshot.invalidateCache": {
|
|
22425
|
+
capName: "snapshot",
|
|
22426
|
+
capScope: "device",
|
|
22069
22427
|
addonId: null,
|
|
22070
|
-
access: "
|
|
22428
|
+
access: "create"
|
|
22071
22429
|
},
|
|
22072
22430
|
"ssoBridge.signBridgeToken": {
|
|
22073
22431
|
capName: "sso-bridge",
|
|
@@ -22495,30 +22853,6 @@ Object.freeze({
|
|
|
22495
22853
|
addonId: null,
|
|
22496
22854
|
access: "view"
|
|
22497
22855
|
},
|
|
22498
|
-
"streamingEngine.getStreamUrl": {
|
|
22499
|
-
capName: "streaming-engine",
|
|
22500
|
-
capScope: "system",
|
|
22501
|
-
addonId: null,
|
|
22502
|
-
access: "view"
|
|
22503
|
-
},
|
|
22504
|
-
"streamingEngine.listStreams": {
|
|
22505
|
-
capName: "streaming-engine",
|
|
22506
|
-
capScope: "system",
|
|
22507
|
-
addonId: null,
|
|
22508
|
-
access: "view"
|
|
22509
|
-
},
|
|
22510
|
-
"streamingEngine.registerStream": {
|
|
22511
|
-
capName: "streaming-engine",
|
|
22512
|
-
capScope: "system",
|
|
22513
|
-
addonId: null,
|
|
22514
|
-
access: "create"
|
|
22515
|
-
},
|
|
22516
|
-
"streamingEngine.unregisterStream": {
|
|
22517
|
-
capName: "streaming-engine",
|
|
22518
|
-
capScope: "system",
|
|
22519
|
-
addonId: null,
|
|
22520
|
-
access: "delete"
|
|
22521
|
-
},
|
|
22522
22856
|
"streamParams.getConfigSchema": {
|
|
22523
22857
|
capName: "stream-params",
|
|
22524
22858
|
capScope: "device",
|
|
@@ -22765,6 +23099,12 @@ Object.freeze({
|
|
|
22765
23099
|
addonId: null,
|
|
22766
23100
|
access: "view"
|
|
22767
23101
|
},
|
|
23102
|
+
"userPasskeys.beginDiscoverableAuthentication": {
|
|
23103
|
+
capName: "user-passkeys",
|
|
23104
|
+
capScope: "system",
|
|
23105
|
+
addonId: null,
|
|
23106
|
+
access: "view"
|
|
23107
|
+
},
|
|
22768
23108
|
"userPasskeys.beginRegistration": {
|
|
22769
23109
|
capName: "user-passkeys",
|
|
22770
23110
|
capScope: "system",
|
|
@@ -22777,12 +23117,24 @@ Object.freeze({
|
|
|
22777
23117
|
addonId: null,
|
|
22778
23118
|
access: "view"
|
|
22779
23119
|
},
|
|
23120
|
+
"userPasskeys.finishDiscoverableAuthentication": {
|
|
23121
|
+
capName: "user-passkeys",
|
|
23122
|
+
capScope: "system",
|
|
23123
|
+
addonId: null,
|
|
23124
|
+
access: "view"
|
|
23125
|
+
},
|
|
22780
23126
|
"userPasskeys.finishRegistration": {
|
|
22781
23127
|
capName: "user-passkeys",
|
|
22782
23128
|
capScope: "system",
|
|
22783
23129
|
addonId: null,
|
|
22784
23130
|
access: "create"
|
|
22785
23131
|
},
|
|
23132
|
+
"userPasskeys.getSecondFactorPreference": {
|
|
23133
|
+
capName: "user-passkeys",
|
|
23134
|
+
capScope: "system",
|
|
23135
|
+
addonId: null,
|
|
23136
|
+
access: "view"
|
|
23137
|
+
},
|
|
22786
23138
|
"userPasskeys.listPasskeys": {
|
|
22787
23139
|
capName: "user-passkeys",
|
|
22788
23140
|
capScope: "system",
|
|
@@ -22795,6 +23147,12 @@ Object.freeze({
|
|
|
22795
23147
|
addonId: null,
|
|
22796
23148
|
access: "delete"
|
|
22797
23149
|
},
|
|
23150
|
+
"userPasskeys.setSecondFactorPreference": {
|
|
23151
|
+
capName: "user-passkeys",
|
|
23152
|
+
capScope: "system",
|
|
23153
|
+
addonId: null,
|
|
23154
|
+
access: "create"
|
|
23155
|
+
},
|
|
22798
23156
|
"vacuumControl.locate": {
|
|
22799
23157
|
capName: "vacuum-control",
|
|
22800
23158
|
capScope: "device",
|
|
@@ -22867,6 +23225,18 @@ Object.freeze({
|
|
|
22867
23225
|
addonId: null,
|
|
22868
23226
|
access: "view"
|
|
22869
23227
|
},
|
|
23228
|
+
"viewerUi.getStaticDir": {
|
|
23229
|
+
capName: "viewer-ui",
|
|
23230
|
+
capScope: "system",
|
|
23231
|
+
addonId: null,
|
|
23232
|
+
access: "view"
|
|
23233
|
+
},
|
|
23234
|
+
"viewerUi.getVersion": {
|
|
23235
|
+
capName: "viewer-ui",
|
|
23236
|
+
capScope: "system",
|
|
23237
|
+
addonId: null,
|
|
23238
|
+
access: "view"
|
|
23239
|
+
},
|
|
22870
23240
|
"waterHeater.setAway": {
|
|
22871
23241
|
capName: "water-heater",
|
|
22872
23242
|
capScope: "device",
|
|
@@ -22885,54 +23255,6 @@ Object.freeze({
|
|
|
22885
23255
|
addonId: null,
|
|
22886
23256
|
access: "create"
|
|
22887
23257
|
},
|
|
22888
|
-
"webrtc.closeSession": {
|
|
22889
|
-
capName: "webrtc",
|
|
22890
|
-
capScope: "system",
|
|
22891
|
-
addonId: null,
|
|
22892
|
-
access: "create"
|
|
22893
|
-
},
|
|
22894
|
-
"webrtc.createSession": {
|
|
22895
|
-
capName: "webrtc",
|
|
22896
|
-
capScope: "system",
|
|
22897
|
-
addonId: null,
|
|
22898
|
-
access: "create"
|
|
22899
|
-
},
|
|
22900
|
-
"webrtc.handleAnswer": {
|
|
22901
|
-
capName: "webrtc",
|
|
22902
|
-
capScope: "system",
|
|
22903
|
-
addonId: null,
|
|
22904
|
-
access: "create"
|
|
22905
|
-
},
|
|
22906
|
-
"webrtc.handleOffer": {
|
|
22907
|
-
capName: "webrtc",
|
|
22908
|
-
capScope: "system",
|
|
22909
|
-
addonId: null,
|
|
22910
|
-
access: "create"
|
|
22911
|
-
},
|
|
22912
|
-
"webrtc.hasAdaptiveBitrate": {
|
|
22913
|
-
capName: "webrtc",
|
|
22914
|
-
capScope: "system",
|
|
22915
|
-
addonId: null,
|
|
22916
|
-
access: "view"
|
|
22917
|
-
},
|
|
22918
|
-
"webrtc.registerStream": {
|
|
22919
|
-
capName: "webrtc",
|
|
22920
|
-
capScope: "system",
|
|
22921
|
-
addonId: null,
|
|
22922
|
-
access: "create"
|
|
22923
|
-
},
|
|
22924
|
-
"webrtc.supportsStream": {
|
|
22925
|
-
capName: "webrtc",
|
|
22926
|
-
capScope: "system",
|
|
22927
|
-
addonId: null,
|
|
22928
|
-
access: "view"
|
|
22929
|
-
},
|
|
22930
|
-
"webrtc.unregisterStream": {
|
|
22931
|
-
capName: "webrtc",
|
|
22932
|
-
capScope: "system",
|
|
22933
|
-
addonId: null,
|
|
22934
|
-
access: "delete"
|
|
22935
|
-
},
|
|
22936
23258
|
"webrtcSession.addIceCandidate": {
|
|
22937
23259
|
capName: "webrtc-session",
|
|
22938
23260
|
capScope: "device",
|