@camstack/addon-pipeline 1.1.45 → 1.1.47
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/audio-analyzer/index.js +1 -1
- package/dist/audio-analyzer/index.mjs +1 -1
- package/dist/detection-pipeline/index.js +78 -231
- package/dist/detection-pipeline/index.mjs +78 -231
- package/dist/{dist-D04numuO.mjs → dist-BXax-C-g.mjs} +316 -101
- package/dist/{dist-CjxqjgEv.js → dist-CSXbgmP-.js} +316 -101
- package/dist/motion-wasm/index.js +1 -1
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/pipeline-runner/index.js +24 -8
- package/dist/pipeline-runner/index.mjs +24 -8
- package/dist/recorder/index.js +1 -1
- package/dist/recorder/index.mjs +1 -1
- package/dist/{remote-source-plane-D31IILFN.mjs → remote-source-plane-D9mX0HiW.mjs} +1 -1
- package/dist/{remote-source-plane-CLuxyDV2.js → remote-source-plane-Rbl_xds1.js} +1 -1
- package/dist/stream-broker/_stub.js +2 -2
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BGKueo9D.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Dz7jhO6c.mjs} +3 -3
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-o4tu_xuc.mjs +26 -0
- package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-8BUVCFIR.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CK4BmiTK.mjs} +1 -1
- package/dist/stream-broker/{hostInit-DazV2RCq.mjs → hostInit-DcMnvklS.mjs} +3 -3
- package/dist/stream-broker/index.js +79 -18
- package/dist/stream-broker/index.mjs +79 -18
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-D_F4a_3H.js → MaskShapeCanvas-DI4BY7W2-BSSjCL6j.js} +1 -1
- package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CfTBrn4G.js → MotionZonesSettings-NcxxQN8r-BDb2ziPs.js} +1 -1
- package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-BWYkeoRj.js → PrivacyMaskSettings-APgPLF7p-ARYovxqE.js} +1 -1
- package/embed-dist/assets/{index-_ccEdNW7.js → index-ByiLuUQZ.js} +10 -10
- package/embed-dist/assets/{index-CA4kv43T.css → index-JqUY2p33.css} +1 -1
- package/embed-dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D0sKyXiy.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-DJaTV2D7.mjs
|
|
4631
4631
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4632
4632
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4633
4633
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -5348,10 +5348,6 @@ function hydrateField(field, values) {
|
|
|
5348
5348
|
};
|
|
5349
5349
|
}
|
|
5350
5350
|
const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
|
|
5351
|
-
if (field.type === "password") return {
|
|
5352
|
-
...field,
|
|
5353
|
-
value: ""
|
|
5354
|
-
};
|
|
5355
5351
|
const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
|
|
5356
5352
|
return {
|
|
5357
5353
|
...field,
|
|
@@ -6839,6 +6835,9 @@ function method(input, output, options) {
|
|
|
6839
6835
|
function event(data) {
|
|
6840
6836
|
return { data };
|
|
6841
6837
|
}
|
|
6838
|
+
var StaticDirOutputSchema$1 = object({ staticDir: string() });
|
|
6839
|
+
var VersionOutputSchema$1 = object({ version: string() });
|
|
6840
|
+
method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
|
|
6842
6841
|
var StaticDirOutputSchema = object({ staticDir: string() });
|
|
6843
6842
|
var VersionOutputSchema = object({ version: string() });
|
|
6844
6843
|
method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
|
|
@@ -11221,7 +11220,7 @@ var BoundingBoxSchema = object({
|
|
|
11221
11220
|
w: number(),
|
|
11222
11221
|
h: number()
|
|
11223
11222
|
});
|
|
11224
|
-
|
|
11223
|
+
object({
|
|
11225
11224
|
class: string(),
|
|
11226
11225
|
originalClass: string(),
|
|
11227
11226
|
score: number(),
|
|
@@ -11425,11 +11424,6 @@ var PipelineSchemaSchema = object({
|
|
|
11425
11424
|
selectedEngine: PipelineEngineChoiceSchema,
|
|
11426
11425
|
slots: array(PipelineSlotSchemaSchema).readonly()
|
|
11427
11426
|
});
|
|
11428
|
-
var DetectorOutputSchema = object({
|
|
11429
|
-
detections: array(SpatialDetectionSchema).readonly(),
|
|
11430
|
-
inferenceMs: number(),
|
|
11431
|
-
modelId: string()
|
|
11432
|
-
});
|
|
11433
11427
|
var EngineProvisioningSchema = object({
|
|
11434
11428
|
runtimeId: _enum([
|
|
11435
11429
|
"onnx",
|
|
@@ -11595,23 +11589,23 @@ var pipelineExecutorCapability = {
|
|
|
11595
11589
|
auth: "admin"
|
|
11596
11590
|
}),
|
|
11597
11591
|
/**
|
|
11598
|
-
*
|
|
11599
|
-
*
|
|
11600
|
-
*
|
|
11601
|
-
* it (default `nodeIdMode: 'routing'
|
|
11602
|
-
*
|
|
11603
|
-
*
|
|
11592
|
+
* Clear THIS node's executor-side PER-DEVICE settings stores (the
|
|
11593
|
+
* per-camera step overrides the object-detection root reads via
|
|
11594
|
+
* `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
|
|
11595
|
+
* generated cap-router strips it (default `nodeIdMode: 'routing'`) and
|
|
11596
|
+
* dispatches to that node, so the provider method runs ON the target
|
|
11597
|
+
* node and receives no `nodeId`.
|
|
11604
11598
|
*
|
|
11605
|
-
*
|
|
11606
|
-
*
|
|
11607
|
-
*
|
|
11608
|
-
*
|
|
11609
|
-
*
|
|
11610
|
-
*
|
|
11599
|
+
* This is the slimmed executor leg of the orchestrator's
|
|
11600
|
+
* `resetNodePipelineDefaults` flow (which owns the real reset: node
|
|
11601
|
+
* addonDefaults pins + per-camera orchestrator overrides). The legacy
|
|
11602
|
+
* `resetToDefault` — which reset a persisted global step-tree seed
|
|
11603
|
+
* nothing in the live per-camera path read — was removed together with
|
|
11604
|
+
* that seed.
|
|
11611
11605
|
*/
|
|
11612
|
-
|
|
11606
|
+
clearDeviceOverrides: method(object({ nodeId: string() }), object({
|
|
11613
11607
|
success: literal(true),
|
|
11614
|
-
|
|
11608
|
+
clearedDevices: number()
|
|
11615
11609
|
}), {
|
|
11616
11610
|
kind: "mutation",
|
|
11617
11611
|
auth: "admin"
|
|
@@ -11657,11 +11651,6 @@ var pipelineExecutorCapability = {
|
|
|
11657
11651
|
modelId: string(),
|
|
11658
11652
|
format: ModelFormatSchema$1
|
|
11659
11653
|
}), object({ success: literal(true) }), { kind: "mutation" }),
|
|
11660
|
-
detect: method(object({
|
|
11661
|
-
addonId: string(),
|
|
11662
|
-
frame: FrameInputSchema,
|
|
11663
|
-
config: record(string(), unknown()).optional()
|
|
11664
|
-
}), DetectorOutputSchema),
|
|
11665
11654
|
/**
|
|
11666
11655
|
* Stateless single-frame execution. Callers (runner, benchmark) pass
|
|
11667
11656
|
* the complete `engine` + `steps` tree; the executor holds no state
|
|
@@ -13554,7 +13543,9 @@ var AddonPageDeclarationSchema$1 = object({
|
|
|
13554
13543
|
icon: string(),
|
|
13555
13544
|
path: string(),
|
|
13556
13545
|
remoteName: string(),
|
|
13557
|
-
bundle: string()
|
|
13546
|
+
bundle: string(),
|
|
13547
|
+
section: string().optional(),
|
|
13548
|
+
sectionLabel: string().optional()
|
|
13558
13549
|
});
|
|
13559
13550
|
var AddonPageInfoSchema = object({
|
|
13560
13551
|
addonId: string(),
|
|
@@ -13594,7 +13585,18 @@ var AddonPageDeclarationSchema = object({
|
|
|
13594
13585
|
* the static-file route can compute an mtime-based cache-buster URL
|
|
13595
13586
|
* without a separate filesystem stat.
|
|
13596
13587
|
*/
|
|
13597
|
-
bundle: string()
|
|
13588
|
+
bundle: string(),
|
|
13589
|
+
/**
|
|
13590
|
+
* Sidebar section this page docks into. Well-known ids: `'detection'`,
|
|
13591
|
+
* `'cluster'`, `'administration'` — the page renders inside that group.
|
|
13592
|
+
* Any OTHER string creates (or joins) a custom section rendered after
|
|
13593
|
+
* the built-in groups; its label comes from `sectionLabel` (first
|
|
13594
|
+
* declaration wins), falling back to the id. Absent → the legacy
|
|
13595
|
+
* "Addon Pages" group.
|
|
13596
|
+
*/
|
|
13597
|
+
section: string().optional(),
|
|
13598
|
+
/** Display label for a CUSTOM `section` id (ignored for well-known ids). */
|
|
13599
|
+
sectionLabel: string().optional()
|
|
13598
13600
|
});
|
|
13599
13601
|
method(_void(), array(AddonPageDeclarationSchema).readonly());
|
|
13600
13602
|
var AddonHttpRouteSchema = object({
|
|
@@ -13810,6 +13812,17 @@ var WidgetMetadataSchema = object({
|
|
|
13810
13812
|
deviceContext: boolean().default(false),
|
|
13811
13813
|
integrationContext: boolean().default(false)
|
|
13812
13814
|
}),
|
|
13815
|
+
/**
|
|
13816
|
+
* Loadable BEFORE authentication. The normal widget registry listing
|
|
13817
|
+
* (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
|
|
13818
|
+
* (the login page) cannot discover a widget through it. A widget that
|
|
13819
|
+
* declares `preAuth: true` marks itself as safe to mount on a pre-auth
|
|
13820
|
+
* screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
|
|
13821
|
+
* login-method contribution channel (see `login-method.cap.ts`) rather
|
|
13822
|
+
* than the authenticated registry, and its bundle is served by the
|
|
13823
|
+
* public `/api/addon-widgets/:addonId/*` static route. Defaults false.
|
|
13824
|
+
*/
|
|
13825
|
+
preAuth: boolean().optional().default(false),
|
|
13813
13826
|
/** Dashboard placement HINTS (operator can override per instance). */
|
|
13814
13827
|
defaultSize: WidgetSizeEnum.default("md"),
|
|
13815
13828
|
allowedSizes: array(WidgetSizeEnum).readonly().default([
|
|
@@ -14202,6 +14215,66 @@ method(object({
|
|
|
14202
14215
|
password: string()
|
|
14203
14216
|
}), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
|
|
14204
14217
|
/**
|
|
14218
|
+
* `login-method` — collection cap through which auth addons contribute
|
|
14219
|
+
* their pre-auth login surfaces to the login page. This is the SINGLE,
|
|
14220
|
+
* generic mechanism that supersedes the dead `auth.listProviders` reader:
|
|
14221
|
+
* every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
|
|
14222
|
+
* `login-method` provider and the PUBLIC `auth.listLoginMethods`
|
|
14223
|
+
* procedure aggregates them for the unauthenticated login page.
|
|
14224
|
+
*
|
|
14225
|
+
* A contribution is a discriminated union on `kind`:
|
|
14226
|
+
*
|
|
14227
|
+
* - `redirect` — a declarative button. The login page renders a generic
|
|
14228
|
+
* button that navigates to `startUrl` (an addon-owned HTTP route).
|
|
14229
|
+
* Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
|
|
14230
|
+
* ZERO shell-side JS. A future SSO addon plugs in the same way — the
|
|
14231
|
+
* login page needs NO change.
|
|
14232
|
+
*
|
|
14233
|
+
* - `widget` — a Module-Federation widget the login page mounts (via
|
|
14234
|
+
* `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
|
|
14235
|
+
* login ceremony, which must run `@simplewebauthn/browser` INSIDE the
|
|
14236
|
+
* addon bundle. The referenced widget also declares `preAuth: true` in
|
|
14237
|
+
* its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
|
|
14238
|
+
* stamps a public `bundleUrl` from `addonId` + `bundle`.
|
|
14239
|
+
*
|
|
14240
|
+
* Every contribution carries a `stage`:
|
|
14241
|
+
* - `primary` — shown on the first credentials screen (OIDC /
|
|
14242
|
+
* magic-link buttons; a future usernameless passkey).
|
|
14243
|
+
* - `second-factor` — shown AFTER the password leg, gated on the
|
|
14244
|
+
* returned `factors` (passkey-as-2FA today).
|
|
14245
|
+
*
|
|
14246
|
+
* `mount: skip` — the cap is read server-side by the core auth router
|
|
14247
|
+
* (`registry.getCollection('login-method')`), never mounted as its own
|
|
14248
|
+
* tRPC router.
|
|
14249
|
+
*/
|
|
14250
|
+
/** When a login method renders in the two-phase login flow. */
|
|
14251
|
+
var LoginStageEnum = _enum(["primary", "second-factor"]);
|
|
14252
|
+
/** One login-method contribution — redirect button OR pre-auth widget. */
|
|
14253
|
+
var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
|
|
14254
|
+
kind: literal("redirect"),
|
|
14255
|
+
/** Stable id within the login-method set (e.g. `auth-oidc/google`). */
|
|
14256
|
+
id: string(),
|
|
14257
|
+
/** Operator-facing button label. */
|
|
14258
|
+
label: string(),
|
|
14259
|
+
/** lucide-react icon name. */
|
|
14260
|
+
icon: string().optional(),
|
|
14261
|
+
/** Addon-owned HTTP route the button navigates to (GET). */
|
|
14262
|
+
startUrl: string(),
|
|
14263
|
+
stage: LoginStageEnum
|
|
14264
|
+
}), object({
|
|
14265
|
+
kind: literal("widget"),
|
|
14266
|
+
/** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
|
|
14267
|
+
id: string(),
|
|
14268
|
+
/** Owning addon id — drives the public bundle URL + the MF namespace. */
|
|
14269
|
+
addonId: string(),
|
|
14270
|
+
/** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
|
|
14271
|
+
bundle: string(),
|
|
14272
|
+
/** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
|
|
14273
|
+
remote: WidgetRemoteSchema,
|
|
14274
|
+
stage: LoginStageEnum
|
|
14275
|
+
})]);
|
|
14276
|
+
method(_void(), array(LoginMethodContributionSchema).readonly());
|
|
14277
|
+
/**
|
|
14205
14278
|
* Orchestrator-side destination metadata. The orchestrator computes
|
|
14206
14279
|
* `id = <addonId>:<subId>` from its provider lookup so consumers
|
|
14207
14280
|
* (admin UI, restore flow) see one canonical key.
|
|
@@ -16571,7 +16644,12 @@ var AgentPipelineSettingsSchema = object({
|
|
|
16571
16644
|
detectWeight: number().positive().optional(),
|
|
16572
16645
|
/** Node is eligible to run the detection pipeline (decode + inference). */
|
|
16573
16646
|
detect: boolean().optional(),
|
|
16574
|
-
/**
|
|
16647
|
+
/**
|
|
16648
|
+
* DEPRECATED AND IGNORED. Decode is always co-located with its frame
|
|
16649
|
+
* consumer, so decode eligibility IS detect eligibility. Kept optional in
|
|
16650
|
+
* the schema ONLY so persisted stores written before the removal still
|
|
16651
|
+
* parse — no code reads it and no write path emits it.
|
|
16652
|
+
*/
|
|
16575
16653
|
decode: boolean().optional(),
|
|
16576
16654
|
/** Node is eligible to run audio-analyzer sessions. */
|
|
16577
16655
|
audio: boolean().optional(),
|
|
@@ -16632,25 +16710,6 @@ var PipelineAssignmentSchema = object({
|
|
|
16632
16710
|
assignedAt: number()
|
|
16633
16711
|
});
|
|
16634
16712
|
/**
|
|
16635
|
-
* Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for
|
|
16636
|
-
* the decoder-node placement domain (`balanceDecoder` decision: manual pin
|
|
16637
|
-
* → co-located with pipeline → capacity).
|
|
16638
|
-
*/
|
|
16639
|
-
var DecoderAssignmentSchema = object({
|
|
16640
|
-
deviceId: number(),
|
|
16641
|
-
/** Moleculer node id of the decoder provider currently responsible for this camera. */
|
|
16642
|
-
decoderNodeId: string(),
|
|
16643
|
-
/** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
|
|
16644
|
-
pinned: boolean(),
|
|
16645
|
-
/** Why this assignment was made — useful for debugging the decoder balancer. */
|
|
16646
|
-
reason: _enum([
|
|
16647
|
-
"manual",
|
|
16648
|
-
"co-located",
|
|
16649
|
-
"capacity",
|
|
16650
|
-
"hardware-affinity"
|
|
16651
|
-
])
|
|
16652
|
-
});
|
|
16653
|
-
/**
|
|
16654
16713
|
* Per-agent load summary surfaced to the load balancer + dashboards.
|
|
16655
16714
|
* Aggregated from each runner's `getLocalLoad` cap call.
|
|
16656
16715
|
*/
|
|
@@ -16856,15 +16915,6 @@ method(object({
|
|
|
16856
16915
|
}), method(_void(), IngestOwnerSchema), method(object({
|
|
16857
16916
|
deviceId: number(),
|
|
16858
16917
|
nodeId: string()
|
|
16859
|
-
}), _void(), {
|
|
16860
|
-
kind: "mutation",
|
|
16861
|
-
auth: "admin"
|
|
16862
|
-
}), method(object({ deviceId: number() }), _void(), {
|
|
16863
|
-
kind: "mutation",
|
|
16864
|
-
auth: "admin"
|
|
16865
|
-
}), method(_void(), array(DecoderAssignmentSchema).readonly()), method(object({
|
|
16866
|
-
deviceId: number(),
|
|
16867
|
-
nodeId: string()
|
|
16868
16918
|
}), object({ success: literal(true) }), {
|
|
16869
16919
|
kind: "mutation",
|
|
16870
16920
|
auth: "admin"
|
|
@@ -16883,10 +16933,7 @@ method(object({
|
|
|
16883
16933
|
nodeId: string(),
|
|
16884
16934
|
pinned: boolean(),
|
|
16885
16935
|
assignedAt: number()
|
|
16886
|
-
}))), method(object({
|
|
16887
|
-
deviceId: number(),
|
|
16888
|
-
pipelineNodeId: string().optional()
|
|
16889
|
-
}), DecoderAssignmentSchema), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
16936
|
+
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
16890
16937
|
nodeId: string(),
|
|
16891
16938
|
settings: AgentPipelineSettingsSchema
|
|
16892
16939
|
})).readonly()), method(object({
|
|
@@ -16916,7 +16963,6 @@ method(object({
|
|
|
16916
16963
|
}), method(object({
|
|
16917
16964
|
agentNodeId: string(),
|
|
16918
16965
|
detect: boolean().nullable().optional(),
|
|
16919
|
-
decode: boolean().nullable().optional(),
|
|
16920
16966
|
audio: boolean().nullable().optional(),
|
|
16921
16967
|
ingest: boolean().nullable().optional()
|
|
16922
16968
|
}), object({ success: literal(true) }), {
|
|
@@ -16928,6 +16974,15 @@ method(object({
|
|
|
16928
16974
|
}), object({ success: literal(true) }), {
|
|
16929
16975
|
kind: "mutation",
|
|
16930
16976
|
auth: "admin"
|
|
16977
|
+
}), method(object({ agentNodeId: string() }), object({
|
|
16978
|
+
success: literal(true),
|
|
16979
|
+
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
16980
|
+
effectiveModelId: string().nullable(),
|
|
16981
|
+
/** Number of cameras whose node-scoped overrides were cleared. */
|
|
16982
|
+
clearedCameraOverrides: number()
|
|
16983
|
+
}), {
|
|
16984
|
+
kind: "mutation",
|
|
16985
|
+
auth: "admin"
|
|
16931
16986
|
}), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
|
|
16932
16987
|
deviceId: number(),
|
|
16933
16988
|
addonId: string(),
|
|
@@ -16973,6 +17028,131 @@ method(object({
|
|
|
16973
17028
|
auth: "admin"
|
|
16974
17029
|
});
|
|
16975
17030
|
/**
|
|
17031
|
+
* server-management — per-NODE singleton capability for a node's ROOT
|
|
17032
|
+
* package lifecycle (runtime-updatable node packages, phase 2: hub + docker
|
|
17033
|
+
* agents).
|
|
17034
|
+
*
|
|
17035
|
+
* Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
|
|
17036
|
+
* on agents) carries the whole software stack in its npm dep tree, so ONE
|
|
17037
|
+
* version describes the node. Updates install into
|
|
17038
|
+
* `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
|
|
17039
|
+
* starter (probation boot + auto-rollback to N-1).
|
|
17040
|
+
*
|
|
17041
|
+
* Providers:
|
|
17042
|
+
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
17043
|
+
* (`buildServerProviders` in trpc.router.ts) — the default target for
|
|
17044
|
+
* unpinned calls.
|
|
17045
|
+
* - AGENT: `AgentUpdateService` registered by the agent bootstrap under
|
|
17046
|
+
* the synthetic `agent-runtime` addonId and declared in the agent's
|
|
17047
|
+
* `$hub.registerNode` manifest.
|
|
17048
|
+
*
|
|
17049
|
+
* Node routing: singleton caps get the codegen/runtime-builder `nodeId`
|
|
17050
|
+
* injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
|
|
17051
|
+
* SDK) routes the call to that node's provider via the standard remote
|
|
17052
|
+
* proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
|
|
17053
|
+
* in-process provider lookup). No `nodeId` → the hub's own provider.
|
|
17054
|
+
*
|
|
17055
|
+
* Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
|
|
17056
|
+
*/
|
|
17057
|
+
/**
|
|
17058
|
+
* Where the running hub's code was loaded from:
|
|
17059
|
+
* - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
|
|
17060
|
+
* plain resolution and runtime updates are refused.
|
|
17061
|
+
* - `baked` — the immutable image seed closure (no data-dir root active).
|
|
17062
|
+
* - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
|
|
17063
|
+
*/
|
|
17064
|
+
var ServerBootModeSchema = _enum([
|
|
17065
|
+
"workspace",
|
|
17066
|
+
"baked",
|
|
17067
|
+
"data-root"
|
|
17068
|
+
]);
|
|
17069
|
+
/**
|
|
17070
|
+
* Update lifecycle state:
|
|
17071
|
+
* - `idle` / `checking` / `staging` — steady / in-flight registry work.
|
|
17072
|
+
* - `pending-restart` — a version is staged and the node has NOT yet
|
|
17073
|
+
* restarted onto it (still running the OLD version).
|
|
17074
|
+
* - `awaiting-confirmation` — the node HAS restarted onto the staged version
|
|
17075
|
+
* (it is the active probation boot) and is waiting to confirm boot-health.
|
|
17076
|
+
* Apply/rollback are refused in this state and the node must NOT be
|
|
17077
|
+
* manually restarted, or the probation boot auto-rolls-back.
|
|
17078
|
+
*/
|
|
17079
|
+
var ServerUpdateStateSchema = _enum([
|
|
17080
|
+
"idle",
|
|
17081
|
+
"checking",
|
|
17082
|
+
"staging",
|
|
17083
|
+
"pending-restart",
|
|
17084
|
+
"awaiting-confirmation"
|
|
17085
|
+
]);
|
|
17086
|
+
var ServerRollbackInfoSchema = object({
|
|
17087
|
+
/** The version that failed (or was manually rolled back). */
|
|
17088
|
+
fromVersion: string(),
|
|
17089
|
+
/** The version rolled back to; null = the baked seed. */
|
|
17090
|
+
toVersion: string().nullable(),
|
|
17091
|
+
atMs: number(),
|
|
17092
|
+
reason: string()
|
|
17093
|
+
});
|
|
17094
|
+
var ServerPackageStatusSchema = object({
|
|
17095
|
+
/** Root package name (`@camstack/server` on the hub). */
|
|
17096
|
+
packageName: string(),
|
|
17097
|
+
/** Version of the code the running process ACTUALLY loaded. */
|
|
17098
|
+
runningVersion: string().nullable(),
|
|
17099
|
+
/** Node.js runtime version the node's process runs on (`process.versions.node`). */
|
|
17100
|
+
nodeRuntimeVersion: string().nullable(),
|
|
17101
|
+
/** Active data-dir root version; null when booted from seed/workspace. */
|
|
17102
|
+
activeVersion: string().nullable(),
|
|
17103
|
+
/** N-1 version kept for rollback; null when no previous version exists. */
|
|
17104
|
+
previousVersion: string().nullable(),
|
|
17105
|
+
/** Version of the immutable baked seed closure (image fallback). */
|
|
17106
|
+
seedVersion: string().nullable(),
|
|
17107
|
+
/** Latest registry version from the most recent check (null = never checked). */
|
|
17108
|
+
latestVersion: string().nullable(),
|
|
17109
|
+
updateAvailable: boolean(),
|
|
17110
|
+
bootMode: ServerBootModeSchema,
|
|
17111
|
+
updateState: ServerUpdateStateSchema,
|
|
17112
|
+
/** Version staged + awaiting its probation boot, when one is pending. */
|
|
17113
|
+
pendingVersion: string().nullable(),
|
|
17114
|
+
/** Set when the last freshly-activated version failed its boot health-check. */
|
|
17115
|
+
rolledBack: ServerRollbackInfoSchema.nullable(),
|
|
17116
|
+
/**
|
|
17117
|
+
* True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
|
|
17118
|
+
* hub is running from the baked seed (or workspace) while installed data-dir
|
|
17119
|
+
* versions are being IGNORED. Surfaced as a warning in the UI.
|
|
17120
|
+
*/
|
|
17121
|
+
stateFileCorrupt: boolean(),
|
|
17122
|
+
lastCheckedAtMs: number().nullable()
|
|
17123
|
+
});
|
|
17124
|
+
var ServerUpdateCheckResultSchema = object({
|
|
17125
|
+
packageName: string(),
|
|
17126
|
+
runningVersion: string().nullable(),
|
|
17127
|
+
latestVersion: string().nullable(),
|
|
17128
|
+
updateAvailable: boolean(),
|
|
17129
|
+
checkedAtMs: number(),
|
|
17130
|
+
/** Non-null when the registry lookup failed (offline, bad registry, …). */
|
|
17131
|
+
error: string().nullable()
|
|
17132
|
+
});
|
|
17133
|
+
var ServerUpdateActionResultSchema = object({
|
|
17134
|
+
accepted: boolean(),
|
|
17135
|
+
targetVersion: string().nullable(),
|
|
17136
|
+
/** True when a graceful restart was scheduled to apply the change. */
|
|
17137
|
+
restarting: boolean(),
|
|
17138
|
+
message: string()
|
|
17139
|
+
});
|
|
17140
|
+
method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
|
|
17141
|
+
kind: "mutation",
|
|
17142
|
+
auth: "admin"
|
|
17143
|
+
}), method(object({
|
|
17144
|
+
/** Explicit target version; omitted = latest from the registry. */
|
|
17145
|
+
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
17146
|
+
kind: "mutation",
|
|
17147
|
+
auth: "admin"
|
|
17148
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
17149
|
+
kind: "mutation",
|
|
17150
|
+
auth: "admin"
|
|
17151
|
+
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
17152
|
+
kind: "mutation",
|
|
17153
|
+
auth: "admin"
|
|
17154
|
+
});
|
|
17155
|
+
/**
|
|
16976
17156
|
* Query filter for settings-store collections.
|
|
16977
17157
|
*/
|
|
16978
17158
|
var QueryFilterSchema = object({
|
|
@@ -19054,6 +19234,16 @@ var TopologyCategorySchema = object({
|
|
|
19054
19234
|
healthy: number(),
|
|
19055
19235
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
19056
19236
|
});
|
|
19237
|
+
/**
|
|
19238
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
|
|
19239
|
+
* `@camstack/agent` on agents) as reported by its `registerNode` manifest —
|
|
19240
|
+
* version visibility for the Server management surface. Nullable: offline
|
|
19241
|
+
* rows and pre-phase-2 nodes report none.
|
|
19242
|
+
*/
|
|
19243
|
+
var TopologyRootPackageSchema = object({
|
|
19244
|
+
name: string(),
|
|
19245
|
+
version: string()
|
|
19246
|
+
});
|
|
19057
19247
|
var TopologyNodeSchema = object({
|
|
19058
19248
|
id: string(),
|
|
19059
19249
|
name: string(),
|
|
@@ -19077,7 +19267,8 @@ var TopologyNodeSchema = object({
|
|
|
19077
19267
|
status: string()
|
|
19078
19268
|
})).readonly(),
|
|
19079
19269
|
processes: array(TopologyProcessSchema).readonly(),
|
|
19080
|
-
categories: array(TopologyCategorySchema).readonly()
|
|
19270
|
+
categories: array(TopologyCategorySchema).readonly(),
|
|
19271
|
+
rootPackage: TopologyRootPackageSchema.nullable()
|
|
19081
19272
|
});
|
|
19082
19273
|
var CapUsageEdgeSchema = object({
|
|
19083
19274
|
callerAddonId: string(),
|
|
@@ -21910,6 +22101,12 @@ Object.freeze({
|
|
|
21910
22101
|
addonId: null,
|
|
21911
22102
|
access: "create"
|
|
21912
22103
|
},
|
|
22104
|
+
"loginMethod.getLoginMethods": {
|
|
22105
|
+
capName: "login-method",
|
|
22106
|
+
capScope: "system",
|
|
22107
|
+
addonId: null,
|
|
22108
|
+
access: "view"
|
|
22109
|
+
},
|
|
21913
22110
|
"mediaPlayer.next": {
|
|
21914
22111
|
capName: "media-player",
|
|
21915
22112
|
capScope: "device",
|
|
@@ -22540,23 +22737,23 @@ Object.freeze({
|
|
|
22540
22737
|
addonId: null,
|
|
22541
22738
|
access: "create"
|
|
22542
22739
|
},
|
|
22543
|
-
"pipelineExecutor.
|
|
22740
|
+
"pipelineExecutor.clearDeviceOverrides": {
|
|
22544
22741
|
capName: "pipeline-executor",
|
|
22545
22742
|
capScope: "system",
|
|
22546
22743
|
addonId: null,
|
|
22547
22744
|
access: "delete"
|
|
22548
22745
|
},
|
|
22549
|
-
"pipelineExecutor.
|
|
22746
|
+
"pipelineExecutor.deleteModel": {
|
|
22550
22747
|
capName: "pipeline-executor",
|
|
22551
22748
|
capScope: "system",
|
|
22552
22749
|
addonId: null,
|
|
22553
22750
|
access: "delete"
|
|
22554
22751
|
},
|
|
22555
|
-
"pipelineExecutor.
|
|
22752
|
+
"pipelineExecutor.deleteTemplate": {
|
|
22556
22753
|
capName: "pipeline-executor",
|
|
22557
22754
|
capScope: "system",
|
|
22558
22755
|
addonId: null,
|
|
22559
|
-
access: "
|
|
22756
|
+
access: "delete"
|
|
22560
22757
|
},
|
|
22561
22758
|
"pipelineExecutor.downloadModel": {
|
|
22562
22759
|
capName: "pipeline-executor",
|
|
@@ -22702,12 +22899,6 @@ Object.freeze({
|
|
|
22702
22899
|
addonId: null,
|
|
22703
22900
|
access: "create"
|
|
22704
22901
|
},
|
|
22705
|
-
"pipelineExecutor.resetToDefault": {
|
|
22706
|
-
capName: "pipeline-executor",
|
|
22707
|
-
capScope: "system",
|
|
22708
|
-
addonId: null,
|
|
22709
|
-
access: "delete"
|
|
22710
|
-
},
|
|
22711
22902
|
"pipelineExecutor.runAudioTest": {
|
|
22712
22903
|
capName: "pipeline-executor",
|
|
22713
22904
|
capScope: "system",
|
|
@@ -22768,12 +22959,6 @@ Object.freeze({
|
|
|
22768
22959
|
addonId: null,
|
|
22769
22960
|
access: "create"
|
|
22770
22961
|
},
|
|
22771
|
-
"pipelineOrchestrator.assignDecoder": {
|
|
22772
|
-
capName: "pipeline-orchestrator",
|
|
22773
|
-
capScope: "system",
|
|
22774
|
-
addonId: null,
|
|
22775
|
-
access: "create"
|
|
22776
|
-
},
|
|
22777
22962
|
"pipelineOrchestrator.assignPipeline": {
|
|
22778
22963
|
capName: "pipeline-orchestrator",
|
|
22779
22964
|
capScope: "system",
|
|
@@ -22852,18 +23037,6 @@ Object.freeze({
|
|
|
22852
23037
|
addonId: null,
|
|
22853
23038
|
access: "view"
|
|
22854
23039
|
},
|
|
22855
|
-
"pipelineOrchestrator.getDecoderAssignment": {
|
|
22856
|
-
capName: "pipeline-orchestrator",
|
|
22857
|
-
capScope: "system",
|
|
22858
|
-
addonId: null,
|
|
22859
|
-
access: "view"
|
|
22860
|
-
},
|
|
22861
|
-
"pipelineOrchestrator.getDecoderAssignments": {
|
|
22862
|
-
capName: "pipeline-orchestrator",
|
|
22863
|
-
capScope: "system",
|
|
22864
|
-
addonId: null,
|
|
22865
|
-
access: "view"
|
|
22866
|
-
},
|
|
22867
23040
|
"pipelineOrchestrator.getGlobalMetrics": {
|
|
22868
23041
|
capName: "pipeline-orchestrator",
|
|
22869
23042
|
capScope: "system",
|
|
@@ -22912,6 +23085,12 @@ Object.freeze({
|
|
|
22912
23085
|
addonId: null,
|
|
22913
23086
|
access: "delete"
|
|
22914
23087
|
},
|
|
23088
|
+
"pipelineOrchestrator.resetNodePipelineDefaults": {
|
|
23089
|
+
capName: "pipeline-orchestrator",
|
|
23090
|
+
capScope: "system",
|
|
23091
|
+
addonId: null,
|
|
23092
|
+
access: "delete"
|
|
23093
|
+
},
|
|
22915
23094
|
"pipelineOrchestrator.resolvePipeline": {
|
|
22916
23095
|
capName: "pipeline-orchestrator",
|
|
22917
23096
|
capScope: "system",
|
|
@@ -22984,12 +23163,6 @@ Object.freeze({
|
|
|
22984
23163
|
addonId: null,
|
|
22985
23164
|
access: "create"
|
|
22986
23165
|
},
|
|
22987
|
-
"pipelineOrchestrator.unassignDecoder": {
|
|
22988
|
-
capName: "pipeline-orchestrator",
|
|
22989
|
-
capScope: "system",
|
|
22990
|
-
addonId: null,
|
|
22991
|
-
access: "create"
|
|
22992
|
-
},
|
|
22993
23166
|
"pipelineOrchestrator.unassignPipeline": {
|
|
22994
23167
|
capName: "pipeline-orchestrator",
|
|
22995
23168
|
capScope: "system",
|
|
@@ -23296,6 +23469,36 @@ Object.freeze({
|
|
|
23296
23469
|
addonId: null,
|
|
23297
23470
|
access: "create"
|
|
23298
23471
|
},
|
|
23472
|
+
"serverManagement.applyServerUpdate": {
|
|
23473
|
+
capName: "server-management",
|
|
23474
|
+
capScope: "system",
|
|
23475
|
+
addonId: null,
|
|
23476
|
+
access: "create"
|
|
23477
|
+
},
|
|
23478
|
+
"serverManagement.checkServerUpdate": {
|
|
23479
|
+
capName: "server-management",
|
|
23480
|
+
capScope: "system",
|
|
23481
|
+
addonId: null,
|
|
23482
|
+
access: "create"
|
|
23483
|
+
},
|
|
23484
|
+
"serverManagement.getServerPackageStatus": {
|
|
23485
|
+
capName: "server-management",
|
|
23486
|
+
capScope: "system",
|
|
23487
|
+
addonId: null,
|
|
23488
|
+
access: "view"
|
|
23489
|
+
},
|
|
23490
|
+
"serverManagement.restartServer": {
|
|
23491
|
+
capName: "server-management",
|
|
23492
|
+
capScope: "system",
|
|
23493
|
+
addonId: null,
|
|
23494
|
+
access: "create"
|
|
23495
|
+
},
|
|
23496
|
+
"serverManagement.rollbackServerUpdate": {
|
|
23497
|
+
capName: "server-management",
|
|
23498
|
+
capScope: "system",
|
|
23499
|
+
addonId: null,
|
|
23500
|
+
access: "create"
|
|
23501
|
+
},
|
|
23299
23502
|
"settingsStore.count": {
|
|
23300
23503
|
capName: "settings-store",
|
|
23301
23504
|
capScope: "system",
|
|
@@ -24160,6 +24363,18 @@ Object.freeze({
|
|
|
24160
24363
|
addonId: null,
|
|
24161
24364
|
access: "view"
|
|
24162
24365
|
},
|
|
24366
|
+
"viewerUi.getStaticDir": {
|
|
24367
|
+
capName: "viewer-ui",
|
|
24368
|
+
capScope: "system",
|
|
24369
|
+
addonId: null,
|
|
24370
|
+
access: "view"
|
|
24371
|
+
},
|
|
24372
|
+
"viewerUi.getVersion": {
|
|
24373
|
+
capName: "viewer-ui",
|
|
24374
|
+
capScope: "system",
|
|
24375
|
+
addonId: null,
|
|
24376
|
+
access: "view"
|
|
24377
|
+
},
|
|
24163
24378
|
"waterHeater.setAway": {
|
|
24164
24379
|
capName: "water-heater",
|
|
24165
24380
|
capScope: "device",
|