@camstack/addon-model-studio 1.0.28 → 1.1.1

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.
@@ -7078,6 +7078,17 @@ var ModelCatalogEntrySchema = object({
7078
7078
  "imagenet",
7079
7079
  "none"
7080
7080
  ]).optional(),
7081
+ /**
7082
+ * The model already applies softmax IN-GRAPH — its raw output is a
7083
+ * probability distribution, not logits. When set, the `softmax`
7084
+ * postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
7085
+ * probability vector collapses it toward uniform (top-1 score craters far
7086
+ * below its true value, making every confidence gate meaningless). Absent ⇒
7087
+ * the output is raw logits and the postprocessor applies softmax (the normal
7088
+ * case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
7089
+ * TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
7090
+ */
7091
+ outputProbabilities: boolean().optional(),
7081
7092
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
7082
7093
  /**
7083
7094
  * Per-MODEL postprocessor override. Absent ⇒ the step's own
@@ -11122,10 +11133,7 @@ var ConfigUISchemaNullableBridge = custom();
11122
11133
  var InferenceCapabilitiesBridge = custom();
11123
11134
  var ModelAvailabilityListBridge = custom();
11124
11135
  var PipelineRunResultBridge = custom();
11125
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
11126
- kind: "mutation",
11127
- auth: "admin"
11128
- }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11136
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11129
11137
  modelId: string(),
11130
11138
  settings: record(string(), unknown()).readonly()
11131
11139
  }))), method(object({ steps: record(string(), object({
@@ -11185,13 +11193,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11185
11193
  * (inputClasses ≠ null) are skipped and served per-track via
11186
11194
  * pipelineRunner.runDetailSubtree (two-plane design).
11187
11195
  */
11188
- plane: _enum(["full", "frame"]).optional()
11196
+ plane: _enum(["full", "frame"]).optional(),
11197
+ /**
11198
+ * Inference-device selector (Phase 2 multi-device). Format
11199
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
11200
+ * Omitted ⇒ the runner's default device (current single-engine
11201
+ * behaviour). Selects WHICH device pool of the node runs the call.
11202
+ */
11203
+ deviceKey: string().optional()
11189
11204
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
11190
11205
  engine: PipelineEngineChoiceSchema.optional(),
11191
11206
  steps: array(PipelineStepInputSchema).min(1),
11192
11207
  frames: array(FrameInputSchema).min(1).max(255),
11193
11208
  deviceId: number().optional(),
11194
- sessionId: string().optional()
11209
+ sessionId: string().optional(),
11210
+ /**
11211
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
11212
+ * the batch to the Python pool's bench preprocess cache
11213
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
11214
+ * preprocessed ONCE and every later inference is a pure-inference cache
11215
+ * hit — the sustained-throughput run measures inference, not
11216
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
11217
+ * full preprocess every call, correct). Fresh per sustained run;
11218
+ * released via `uncacheFrame`.
11219
+ */
11220
+ frameId: number().int().nonnegative().optional(),
11221
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
11222
+ deviceKey: string().optional()
11195
11223
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
11196
11224
  data: _instanceof(Uint8Array),
11197
11225
  width: number().int().positive(),
@@ -11223,8 +11251,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11223
11251
  * - `runtime` — main camera-serving engine (no idle TTL).
11224
11252
  * - `warm-override` — benchmark/test override held in the warm
11225
11253
  * cache; auto-disposed after the idle TTL.
11254
+ * - `device-pool` — a concurrent per-device pool (Phase 2
11255
+ * multi-device, keyed by `deviceKey`) resolved
11256
+ * via `resolveDeviceFactory`. Runs alongside the
11257
+ * `runtime` engine on a DIFFERENT accelerator
11258
+ * (NPU / iGPU / Coral) — this is how the
11259
+ * Engines tab shows all pools running at once.
11226
11260
  */
11227
- kind: _enum(["runtime", "warm-override"]),
11261
+ kind: _enum([
11262
+ "runtime",
11263
+ "warm-override",
11264
+ "device-pool"
11265
+ ]),
11228
11266
  /** Native pid of the underlying Python pool (null when no pool). */
11229
11267
  poolPid: number().nullable(),
11230
11268
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -11326,7 +11364,21 @@ var NativeCropResultSchema = object({
11326
11364
  /** Packed rgb (24-bit) pixels of the crop. */
11327
11365
  bytes: _instanceof(Uint8Array),
11328
11366
  width: number().int().positive(),
11329
- height: number().int().positive()
11367
+ height: number().int().positive(),
11368
+ /**
11369
+ * Which source served this crop, so a quality-sensitive consumer (the native
11370
+ * `keyFrame`) can reject a degraded fallback:
11371
+ * - `native` — cut from the decode worker's retained NATIVE surface (the
11372
+ * quality path).
11373
+ * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
11374
+ * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
11375
+ * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
11376
+ *
11377
+ * OPTIONAL: a pre-tier runner (version skew) omits it — an ABSENT `tier` MUST be
11378
+ * treated as `native` (accepted) by every consumer so mixed-version clusters
11379
+ * keep the pre-tier behaviour. An ROI miss returns `null` (no tier at all).
11380
+ */
11381
+ tier: _enum(["native", "ram-fullframe"]).optional()
11330
11382
  });
11331
11383
  /** Parent detection context passed to `runDetailSubtree` — the crop's
11332
11384
  * originating detection, in FRAME-space coordinates. Reuses
@@ -11566,7 +11618,14 @@ var RunnerCameraConfigSchema = object({
11566
11618
  * camera's detect node differs from its source-owner (P2d, gated by the
11567
11619
  * `remoteSourcingNodes` rollout setting).
11568
11620
  */
11569
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
11621
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
11622
+ /**
11623
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
11624
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
11625
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
11626
+ * this only selects WHICH device pool of that node runs the session.
11627
+ */
11628
+ deviceKey: string().optional()
11570
11629
  });
11571
11630
  motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
11572
11631
  /**
@@ -11587,6 +11646,19 @@ var RunnerLocalLoadSchema = object({
11587
11646
  avgInferenceTimeMs: number(),
11588
11647
  /** Total queue depth across motion + detection queues. */
11589
11648
  queueDepthTotal: number(),
11649
+ /**
11650
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
11651
+ * this runner currently has attached cameras on, so the orchestrator's second
11652
+ * `balance()` pass (over a node's devices) weights on real per-pool session
11653
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
11654
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
11655
+ */
11656
+ devices: array(object({
11657
+ deviceKey: string(),
11658
+ backend: string(),
11659
+ attachedCameras: number(),
11660
+ queueDepthTotal: number()
11661
+ })).default([]),
11590
11662
  /** Hardware capability flags reported by this node. */
11591
11663
  hardware: object({
11592
11664
  hasGpu: boolean(),
@@ -13062,6 +13134,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
13062
13134
  kind: "mutation",
13063
13135
  auth: "admin"
13064
13136
  });
13137
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
13138
+ new Set(Object.values(DeviceType));
13065
13139
  /**
13066
13140
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
13067
13141
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -14668,7 +14742,8 @@ var LinkedDeviceSchema = object({
14668
14742
  deviceId: number(),
14669
14743
  name: string(),
14670
14744
  location: string().nullable(),
14671
- features: array(string())
14745
+ features: array(string()),
14746
+ producesTrackedEvents: boolean().optional()
14672
14747
  });
14673
14748
  var SavedDeviceRowSchema = object({
14674
14749
  /** Numeric id reserved at allocateDeviceId time. */
@@ -16304,6 +16379,7 @@ var TrackSchema = object({
16304
16379
  deviceId: number(),
16305
16380
  className: string(),
16306
16381
  label: string().optional(),
16382
+ producingDeviceName: string().optional(),
16307
16383
  /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
16308
16384
  source: TrackSourceSchema.optional(),
16309
16385
  firstSeen: number(),
@@ -16441,7 +16517,8 @@ var MediaFileKindEnum = _enum([
16441
16517
  "fullFrameBoxed",
16442
16518
  "faceCrop",
16443
16519
  "plateCrop",
16444
- "keyFrame"
16520
+ "keyFrame",
16521
+ "keyFrameSmall"
16445
16522
  ]);
16446
16523
  var MediaFileSchema = object({
16447
16524
  key: string(),
@@ -16770,13 +16847,11 @@ var PipelineTemplateSchema = object({
16770
16847
  createdAt: string(),
16771
16848
  updatedAt: string()
16772
16849
  });
16773
- var AgentAddonConfigSchema = object({
16774
- enabled: boolean(),
16850
+ var DeviceStepConfigSchema = object({
16775
16851
  modelId: string().optional(),
16776
- settings: record(string(), unknown()).readonly()
16852
+ settings: record(string(), unknown()).optional()
16777
16853
  });
16778
16854
  var AgentPipelineSettingsSchema = object({
16779
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16780
16855
  maxCameras: number().int().nonnegative().nullable().default(null),
16781
16856
  /** Per-node detection weight (relative share for the quota balancer). */
16782
16857
  detectWeight: number().positive().optional(),
@@ -16800,7 +16875,22 @@ var AgentPipelineSettingsSchema = object({
16800
16875
  * it already uses to reach the hub). Set this only when the auto-detected
16801
16876
  * address is wrong (multi-homed host, NAT, custom interface).
16802
16877
  */
16803
- reachableHost: string().optional()
16878
+ reachableHost: string().optional(),
16879
+ /**
16880
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16881
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16882
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16883
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16884
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16885
+ * the default model/settings for every camera landing on that accelerator;
16886
+ * a stepId absent ⇒ the step uses that device's format default.
16887
+ */
16888
+ inferenceDevices: record(string(), object({
16889
+ enabled: boolean(),
16890
+ weight: number().positive().optional(),
16891
+ maxSessions: number().int().positive().optional(),
16892
+ steps: record(string(), DeviceStepConfigSchema).optional()
16893
+ })).optional()
16804
16894
  });
16805
16895
  var CameraPipelineForAgentSchema = object({
16806
16896
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16810,14 +16900,13 @@ var CameraPipelineForAgentSchema = object({
16810
16900
  }).nullable()
16811
16901
  });
16812
16902
  var CameraStepOverridePatchSchema = object({
16813
- enabled: boolean().optional(),
16814
16903
  modelId: string().optional(),
16815
16904
  settings: record(string(), unknown()).readonly().optional()
16816
16905
  });
16817
16906
  var CameraPipelineSettingsSchema = object({
16818
16907
  pinnedAgentNodeId: string().optional(),
16819
16908
  stepToggles: record(string(), boolean()).optional(),
16820
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16909
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16821
16910
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16822
16911
  });
16823
16912
  /**
@@ -17031,6 +17120,44 @@ var CameraStatusSchema = object({
17031
17120
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
17032
17121
  fetchedAt: number()
17033
17122
  });
17123
+ var NodeInferenceDeviceSchema = object({
17124
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17125
+ key: string(),
17126
+ backend: string(),
17127
+ device: string(),
17128
+ format: _enum(MODEL_FORMATS),
17129
+ /** Whether the node's live probe reports the device as usable right now. */
17130
+ available: boolean(),
17131
+ /**
17132
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17133
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17134
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17135
+ * not a balanced target). An explicit stored value always wins; a stored-only
17136
+ * (unavailable) key keeps its stored value.
17137
+ */
17138
+ enabled: boolean(),
17139
+ /** Relative balancer weight for the enabled device (default 1). */
17140
+ weight: number(),
17141
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17142
+ maxSessions: number().nullable(),
17143
+ /** Object-detection model the executor defaults to for this deviceKey. */
17144
+ defaultModelId: string(),
17145
+ /**
17146
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17147
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17148
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17149
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17150
+ * available per format; this is the stored selection that becomes the
17151
+ * default for EVERY camera landing on this accelerator.
17152
+ */
17153
+ steps: record(string(), DeviceStepConfigSchema).optional()
17154
+ });
17155
+ var NodeInferenceDevicesSchema = object({
17156
+ nodeId: string(),
17157
+ /** False when the node's platform-probe was unreachable (no live device set). */
17158
+ reachable: boolean(),
17159
+ devices: array(NodeInferenceDeviceSchema).readonly()
17160
+ });
17034
17161
  method(object({
17035
17162
  deviceId: number(),
17036
17163
  agentNodeId: string()
@@ -17040,7 +17167,13 @@ method(object({
17040
17167
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
17041
17168
  kind: "mutation",
17042
17169
  auth: "admin"
17043
- }), method(_void(), object({ migrated: number() }), {
17170
+ }), method(object({
17171
+ deviceId: number(),
17172
+ deviceKey: string()
17173
+ }), object({ success: literal(true) }), {
17174
+ kind: "mutation",
17175
+ auth: "admin"
17176
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17044
17177
  kind: "mutation",
17045
17178
  auth: "admin"
17046
17179
  }), method(_void(), array(PipelineAssignmentSchema).readonly()), method(object({ deviceId: number() }), PipelineAssignmentSchema.nullable()), method(_void(), array(AgentLoadSummarySchema).readonly()), method(_void(), GlobalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(object({ nodeId: string() }), CapabilityBindingsSchema), method(object({
@@ -17074,13 +17207,7 @@ method(object({
17074
17207
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17075
17208
  nodeId: string(),
17076
17209
  settings: AgentPipelineSettingsSchema
17077
- })).readonly()), method(object({
17078
- agentNodeId: string(),
17079
- defaults: record(string(), AgentAddonConfigSchema)
17080
- }), object({ success: literal(true) }), {
17081
- kind: "mutation",
17082
- auth: "admin"
17083
- }), method(object({ agentNodeId: string() }), object({
17210
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17084
17211
  success: boolean(),
17085
17212
  removed: boolean()
17086
17213
  }), {
@@ -17112,7 +17239,18 @@ method(object({
17112
17239
  }), object({ success: literal(true) }), {
17113
17240
  kind: "mutation",
17114
17241
  auth: "admin"
17115
- }), method(object({ agentNodeId: string() }), object({
17242
+ }), method(object({
17243
+ agentNodeId: string(),
17244
+ inferenceDevices: record(string(), object({
17245
+ enabled: boolean(),
17246
+ weight: number().positive().optional(),
17247
+ maxSessions: number().int().positive().optional(),
17248
+ steps: record(string(), DeviceStepConfigSchema).optional()
17249
+ }))
17250
+ }), object({ success: literal(true) }), {
17251
+ kind: "mutation",
17252
+ auth: "admin"
17253
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17116
17254
  success: literal(true),
17117
17255
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17118
17256
  effectiveModelId: string().nullable(),
@@ -17128,9 +17266,10 @@ method(object({
17128
17266
  }), object({ success: literal(true) }), {
17129
17267
  kind: "mutation",
17130
17268
  auth: "admin"
17131
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17269
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17132
17270
  deviceId: number(),
17133
17271
  agentNodeId: string(),
17272
+ deviceKey: string(),
17134
17273
  addonId: string(),
17135
17274
  patch: CameraStepOverridePatchSchema.nullable()
17136
17275
  }), object({ success: literal(true) }), {
@@ -17167,14 +17306,13 @@ method(object({
17167
17306
  });
17168
17307
  /**
17169
17308
  * server-management — per-NODE singleton capability for a node's ROOT
17170
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17171
- * agents).
17309
+ * package lifecycle (runtime-updatable node packages).
17172
17310
  *
17173
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17174
- * on agents) carries the whole software stack in its npm dep tree, so ONE
17175
- * version describes the node. Updates install into
17176
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17177
- * starter (probation boot + auto-rollback to N-1).
17311
+ * Every node role runs the SAME root package (`@camstack/server`), which
17312
+ * carries the whole software stack in its npm dep tree, so ONE version
17313
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17314
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17315
+ * no auto-rollback).
17178
17316
  *
17179
17317
  * Providers:
17180
17318
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17282,7 +17420,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17282
17420
  /** Explicit target version; omitted = latest from the registry. */
17283
17421
  version: string().optional() }), ServerUpdateActionResultSchema, {
17284
17422
  kind: "mutation",
17285
- auth: "admin"
17423
+ auth: "admin",
17424
+ timeoutMs: 16 * 6e4
17286
17425
  }), method(_void(), ServerUpdateActionResultSchema, {
17287
17426
  kind: "mutation",
17288
17427
  auth: "admin"
@@ -18326,22 +18465,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18326
18465
  var RestartAddonResultSchema = unknown();
18327
18466
  var InstallPackageResultSchema = unknown();
18328
18467
  var ReloadPackagesResultSchema = unknown();
18329
- /**
18330
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
18331
- * server restarts so the admin UI can react to the `restartingAt`
18332
- * timestamp (shows reconnect overlay). The transition from
18333
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
18334
- * `system.restart-completed` event after the new process boots.
18335
- *
18336
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
18337
- */
18338
- var UpdateFrameworkPackageResultSchema = object({
18339
- packageName: string(),
18340
- fromVersion: string(),
18341
- toVersion: string(),
18342
- /** Ms-epoch the server scheduled its self-restart. */
18343
- restartingAt: number()
18344
- });
18345
18468
  var BulkUpdateItemStatusSchema = _enum([
18346
18469
  "queued",
18347
18470
  "updating",
@@ -18469,13 +18592,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18469
18592
  }), object({ success: literal(true) }), {
18470
18593
  kind: "mutation",
18471
18594
  auth: "admin"
18472
- }), method(object({
18473
- packageName: string().min(1),
18474
- version: string().optional(),
18475
- deferRestart: boolean().optional()
18476
- }), UpdateFrameworkPackageResultSchema, {
18477
- kind: "mutation",
18478
- auth: "admin"
18479
18595
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18480
18596
  kind: "mutation",
18481
18597
  auth: "admin"
@@ -19341,10 +19457,10 @@ var TopologyCategorySchema = object({
19341
19457
  addons: array(TopologyCategoryAddonSchema).readonly()
19342
19458
  });
19343
19459
  /**
19344
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19345
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19346
- * version visibility for the Server management surface. Nullable: offline
19347
- * rows and pre-phase-2 nodes report none.
19460
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19461
+ * root package for every node role) as reported by its `registerNode`
19462
+ * manifest — version visibility for the Server management surface. Nullable:
19463
+ * offline rows and nodes that never reported one.
19348
19464
  */
19349
19465
  var TopologyRootPackageSchema = object({
19350
19466
  name: string(),
@@ -19732,17 +19848,28 @@ var PlatformScoreSchema = object({
19732
19848
  format: _enum([
19733
19849
  "onnx",
19734
19850
  "coreml",
19735
- "openvino"
19851
+ "openvino",
19852
+ "tflite"
19736
19853
  ]),
19737
19854
  score: number(),
19738
19855
  reason: string(),
19739
19856
  available: boolean()
19740
19857
  });
19858
+ var InferenceDeviceDescriptorSchema = object({
19859
+ key: string(),
19860
+ backend: string(),
19861
+ device: string(),
19862
+ format: ModelFormatSchema,
19863
+ runtime: literal("python"),
19864
+ score: number(),
19865
+ available: boolean()
19866
+ });
19741
19867
  var PlatformCapabilitiesSchema = object({
19742
19868
  hardware: HardwareInfoSchema,
19743
19869
  scores: array(PlatformScoreSchema).readonly(),
19744
19870
  bestScore: PlatformScoreSchema,
19745
- pythonPath: string().nullable()
19871
+ pythonPath: string().nullable(),
19872
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19746
19873
  });
19747
19874
  var ModelRequirementSchema = object({
19748
19875
  modelId: string(),
@@ -20621,12 +20748,6 @@ Object.freeze({
20621
20748
  addonId: null,
20622
20749
  access: "delete"
20623
20750
  },
20624
- "addons.updateFrameworkPackage": {
20625
- capName: "addons",
20626
- capScope: "system",
20627
- addonId: null,
20628
- access: "create"
20629
- },
20630
20751
  "addons.updatePackage": {
20631
20752
  capName: "addons",
20632
20753
  capScope: "system",
@@ -23399,12 +23520,6 @@ Object.freeze({
23399
23520
  addonId: null,
23400
23521
  access: "view"
23401
23522
  },
23402
- "pipelineExecutor.reprobeEngine": {
23403
- capName: "pipeline-executor",
23404
- capScope: "system",
23405
- addonId: null,
23406
- access: "create"
23407
- },
23408
23523
  "pipelineExecutor.runAudioTest": {
23409
23524
  capName: "pipeline-executor",
23410
23525
  capScope: "system",
@@ -23555,6 +23670,12 @@ Object.freeze({
23555
23670
  addonId: null,
23556
23671
  access: "view"
23557
23672
  },
23673
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23674
+ capName: "pipeline-orchestrator",
23675
+ capScope: "system",
23676
+ addonId: null,
23677
+ access: "view"
23678
+ },
23558
23679
  "pipelineOrchestrator.getPipelineAssignment": {
23559
23680
  capName: "pipeline-orchestrator",
23560
23681
  capScope: "system",
@@ -23567,6 +23688,12 @@ Object.freeze({
23567
23688
  addonId: null,
23568
23689
  access: "view"
23569
23690
  },
23691
+ "pipelineOrchestrator.getPipelineDevicePin": {
23692
+ capName: "pipeline-orchestrator",
23693
+ capScope: "system",
23694
+ addonId: null,
23695
+ access: "view"
23696
+ },
23570
23697
  "pipelineOrchestrator.listAgentSettings": {
23571
23698
  capName: "pipeline-orchestrator",
23572
23699
  capScope: "system",
@@ -23609,19 +23736,19 @@ Object.freeze({
23609
23736
  addonId: null,
23610
23737
  access: "create"
23611
23738
  },
23612
- "pipelineOrchestrator.setAgentAddonDefaults": {
23739
+ "pipelineOrchestrator.setAgentCapabilities": {
23613
23740
  capName: "pipeline-orchestrator",
23614
23741
  capScope: "system",
23615
23742
  addonId: null,
23616
23743
  access: "create"
23617
23744
  },
23618
- "pipelineOrchestrator.setAgentCapabilities": {
23745
+ "pipelineOrchestrator.setAgentDetectWeight": {
23619
23746
  capName: "pipeline-orchestrator",
23620
23747
  capScope: "system",
23621
23748
  addonId: null,
23622
23749
  access: "create"
23623
23750
  },
23624
- "pipelineOrchestrator.setAgentDetectWeight": {
23751
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23625
23752
  capName: "pipeline-orchestrator",
23626
23753
  capScope: "system",
23627
23754
  addonId: null,
@@ -23663,6 +23790,12 @@ Object.freeze({
23663
23790
  addonId: null,
23664
23791
  access: "create"
23665
23792
  },
23793
+ "pipelineOrchestrator.setPipelineDevicePin": {
23794
+ capName: "pipeline-orchestrator",
23795
+ capScope: "system",
23796
+ addonId: null,
23797
+ access: "create"
23798
+ },
23666
23799
  "pipelineOrchestrator.unassignAudio": {
23667
23800
  capName: "pipeline-orchestrator",
23668
23801
  capScope: "system",
@@ -25215,32 +25348,6 @@ Object.freeze({
25215
25348
  "network-access": "ingress",
25216
25349
  "smtp-provider": "email"
25217
25350
  });
25218
- var frameworkSwapPackageSchema = object({
25219
- name: string(),
25220
- stagedPath: string(),
25221
- backupPath: string(),
25222
- toVersion: string(),
25223
- fromVersion: string().nullable()
25224
- });
25225
- object({
25226
- jobId: string(),
25227
- taskId: string(),
25228
- packages: array(frameworkSwapPackageSchema),
25229
- requestedAtMs: number(),
25230
- schemaVersion: literal(1)
25231
- });
25232
- object({
25233
- jobId: string(),
25234
- taskId: string(),
25235
- backups: array(object({
25236
- name: string(),
25237
- backupPath: string(),
25238
- livePath: string()
25239
- })),
25240
- appliedAtMs: number(),
25241
- bootAttempts: number(),
25242
- schemaVersion: literal(1)
25243
- });
25244
25351
  //#endregion
25245
25352
  //#region ../system/dist/model-download-service-Cp9f4dk6.mjs
25246
25353
  /** Build fetch headers, including HF auth token for huggingface.co URLs */
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react__loadShare__.js-DJDHChgO.mjs";
2
2
  import { n as u, r as d, t as f } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-ds_Ehzaa.mjs";
3
- import { f as p } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BOsI55Qr.mjs";
3
+ import { p } from "./_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BVOnSREM.mjs";
4
4
  //#region ../ui-library/src/lib/cap-error.ts
5
5
  function m(e) {
6
6
  if (typeof e != "object" || !e) return null;
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DvnLvZMm.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-C3kcXNUK.mjs";
2
2
  export { t as get, e as init };
@@ -1,4 +1,4 @@
1
- import { s as e } from "./player-overlays-BR3IAbV5.mjs";
1
+ import { s as e } from "./player-overlays-C54-e_Df.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-NMFv_zoJ.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BK3xUMr7.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-model-studio",
3
- "version": "1.0.28",
3
+ "version": "1.1.1",
4
4
  "description": "Custom detection model registry, conversion & distribution for CamStack",
5
5
  "keywords": [
6
6
  "camstack",