camstack 1.2.181 → 1.2.183

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.
@@ -14681,7 +14681,7 @@ function date4(params) {
14681
14681
  // ../../node_modules/zod/v4/classic/external.js
14682
14682
  config(en_default());
14683
14683
 
14684
- // ../types/dist/sleep-DujUvOcb.mjs
14684
+ // ../types/dist/sleep-DwAQ9sqX.mjs
14685
14685
  var AUDIO_CHUNK_FORMATS = [
14686
14686
  "f32le",
14687
14687
  "pcmu",
@@ -16264,6 +16264,19 @@ var CompositionSchema = external_exports.object({
16264
16264
  });
16265
16265
  });
16266
16266
 
16267
+ // ../types/dist/node-color.mjs
16268
+ var NODE_COLOR_IDS = [
16269
+ "node-a",
16270
+ "node-b",
16271
+ "node-c",
16272
+ "node-d",
16273
+ "node-e",
16274
+ "node-f",
16275
+ "node-g",
16276
+ "node-h"
16277
+ ];
16278
+ var NodeColorIdSchema = external_exports.enum(NODE_COLOR_IDS);
16279
+
16267
16280
  // ../types/dist/index.mjs
16268
16281
  var MEDIA_OWNER_TYPES = [
16269
16282
  "track",
@@ -16554,6 +16567,254 @@ var CameraSwitchGroupSchema = external_exports.object({
16554
16567
  /** Unix ms when the group was composed server-side. */
16555
16568
  fetchedAt: external_exports.number()
16556
16569
  });
16570
+ var TRAINING_JOB_SCHEMA = "camstack.training/v1";
16571
+ var TRAINING_RESULT_SCHEMA = "camstack.training-result/v1";
16572
+ var TrainingExportSchema = external_exports.enum([
16573
+ "onnx",
16574
+ "openvino-fp16",
16575
+ "openvino-int8",
16576
+ "coreml-fp16"
16577
+ ]);
16578
+ var FloorsSchema = external_exports.record(external_exports.string(), external_exports.number().min(0).max(1));
16579
+ var TrainingJobSpecSchema = external_exports.object({
16580
+ schema: external_exports.literal(TRAINING_JOB_SCHEMA),
16581
+ jobKey: external_exports.string().uuid(),
16582
+ target: external_exports.object({
16583
+ kind: external_exports.literal("detector"),
16584
+ step: external_exports.literal("object-detection")
16585
+ }),
16586
+ base: external_exports.object({
16587
+ modelId: external_exports.string().min(1),
16588
+ /** Ultralytics weights id, e.g. `yolov9m.pt`. */
16589
+ weights: external_exports.string().min(1),
16590
+ imgsz: external_exports.number().int().positive()
16591
+ }),
16592
+ baseline: external_exports.object({
16593
+ modelId: external_exports.string().min(1),
16594
+ /** The baseline ONNX the holdout comparison runs; public mirror URL. */
16595
+ onnxUrl: external_exports.string().url(),
16596
+ imgsz: external_exports.number().int().positive(),
16597
+ floors: FloorsSchema
16598
+ }),
16599
+ dataset: external_exports.object({
16600
+ versionId: external_exports.string().min(1),
16601
+ annotationHash: external_exports.string(),
16602
+ /** sha256 of the uploaded archive; the trainer refuses a mismatch (exit 65). */
16603
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/)
16604
+ }),
16605
+ split: external_exports.object({
16606
+ holdoutCameras: external_exports.array(external_exports.number().int()),
16607
+ /** When no camera is held out: the last N days of every camera. */
16608
+ holdoutLastDays: external_exports.number().int().nonnegative(),
16609
+ valFraction: external_exports.number().min(0).max(0.5),
16610
+ seed: external_exports.number().int()
16611
+ }),
16612
+ hyper: external_exports.object({
16613
+ epochs: external_exports.number().int().positive(),
16614
+ batch: external_exports.number().int().positive(),
16615
+ lr0: external_exports.number().positive(),
16616
+ /** Layers frozen from the start of the backbone; 0 = none. */
16617
+ freeze: external_exports.number().int().nonnegative(),
16618
+ patience: external_exports.number().int().nonnegative(),
16619
+ seed: external_exports.number().int()
16620
+ }),
16621
+ replay: external_exports.object({
16622
+ source: external_exports.literal("coco2017"),
16623
+ count: external_exports.number().int().nonnegative()
16624
+ }),
16625
+ exports: external_exports.array(TrainingExportSchema).min(1),
16626
+ calibration: external_exports.object({ maxFrames: external_exports.number().int().positive() }),
16627
+ floors: external_exports.object({
16628
+ minSupport: external_exports.number().int().positive(),
16629
+ clamp: external_exports.number().min(0).max(1)
16630
+ }),
16631
+ int8Gate: external_exports.object({ maxMap50Drop: external_exports.number().min(0).max(1) }),
16632
+ catalog: external_exports.object({
16633
+ id: external_exports.string().regex(/^[a-z0-9][a-z0-9-]{2,80}$/),
16634
+ name: external_exports.string().min(1).max(160)
16635
+ })
16636
+ });
16637
+ var TrainingResultFileSchema = external_exports.object({
16638
+ path: external_exports.string().min(1),
16639
+ bytes: external_exports.number().int().nonnegative(),
16640
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
16641
+ format: external_exports.enum([
16642
+ "onnx",
16643
+ "openvino",
16644
+ "coreml",
16645
+ "pt"
16646
+ ]),
16647
+ variant: external_exports.enum(["base", "int8"])
16648
+ });
16649
+ var DraftFormatSchema = external_exports.object({
16650
+ /** RELATIVE path inside the bundle; the hub rewrites it to `camstack-local://`. */
16651
+ url: external_exports.string().min(1),
16652
+ sizeMB: external_exports.number().nonnegative(),
16653
+ isDirectory: external_exports.boolean().optional(),
16654
+ files: external_exports.array(external_exports.string()).optional(),
16655
+ runtimes: external_exports.array(external_exports.literal("python")).optional(),
16656
+ revision: external_exports.string().min(1)
16657
+ });
16658
+ var TrainingCatalogDraftSchema = external_exports.object({
16659
+ id: external_exports.string().min(1),
16660
+ name: external_exports.string().min(1),
16661
+ description: external_exports.string(),
16662
+ labels: external_exports.array(external_exports.unknown()),
16663
+ inputSize: external_exports.object({
16664
+ width: external_exports.number().int().positive(),
16665
+ height: external_exports.number().int().positive()
16666
+ }),
16667
+ preprocessMode: external_exports.literal("letterbox"),
16668
+ defaultClassFloors: FloorsSchema,
16669
+ formats: external_exports.object({
16670
+ onnx: DraftFormatSchema.optional(),
16671
+ openvino: DraftFormatSchema.optional(),
16672
+ coreml: DraftFormatSchema.optional()
16673
+ })
16674
+ });
16675
+ var TrainingEvalClassSchema = external_exports.object({
16676
+ positives: external_exports.number().int(),
16677
+ floor: external_exports.number().nullable(),
16678
+ tp: external_exports.number().int(),
16679
+ fp: external_exports.number().int(),
16680
+ fn: external_exports.number().int(),
16681
+ precision: external_exports.number().nullable(),
16682
+ recall: external_exports.number().nullable(),
16683
+ ap50: external_exports.number().nullable(),
16684
+ recallByCamera: external_exports.record(external_exports.string(), external_exports.number().nullable()).optional(),
16685
+ recallByLight: external_exports.record(external_exports.string(), external_exports.number().nullable()).optional(),
16686
+ fpByCamera: external_exports.record(external_exports.string(), external_exports.number()).optional(),
16687
+ smallFound: external_exports.number().int().optional(),
16688
+ smallTotal: external_exports.number().int().optional()
16689
+ }).passthrough();
16690
+ var TrainingEvalReportSchema = external_exports.object({
16691
+ frames: external_exports.number().int(),
16692
+ classes: external_exports.record(external_exports.string(), TrainingEvalClassSchema)
16693
+ }).passthrough();
16694
+ var TrainingResultSchema = external_exports.object({
16695
+ schema: external_exports.literal(TRAINING_RESULT_SCHEMA),
16696
+ jobKey: external_exports.string(),
16697
+ status: external_exports.enum(["succeeded", "failed"]),
16698
+ error: external_exports.object({
16699
+ stage: external_exports.string(),
16700
+ code: external_exports.string(),
16701
+ message: external_exports.string()
16702
+ }).nullable(),
16703
+ trainer: external_exports.object({
16704
+ version: external_exports.string(),
16705
+ revision: external_exports.string()
16706
+ }),
16707
+ toolchain: external_exports.record(external_exports.string(), external_exports.string().nullable()),
16708
+ dataset: external_exports.object({
16709
+ versionId: external_exports.string(),
16710
+ annotationHash: external_exports.string(),
16711
+ sha256: external_exports.string(),
16712
+ frames: external_exports.object({
16713
+ train: external_exports.number().int(),
16714
+ val: external_exports.number().int(),
16715
+ holdout: external_exports.number().int()
16716
+ }),
16717
+ holdoutCameras: external_exports.array(external_exports.number().int()),
16718
+ replayImages: external_exports.number().int()
16719
+ }).optional(),
16720
+ training: external_exports.object({
16721
+ epochsRun: external_exports.number().int(),
16722
+ bestEpoch: external_exports.number().int(),
16723
+ bestMap50: external_exports.number(),
16724
+ bestMap50_95: external_exports.number(),
16725
+ seconds: external_exports.number()
16726
+ }).optional(),
16727
+ evaluation: external_exports.object({
16728
+ holdoutFrames: external_exports.number().int(),
16729
+ baseline: TrainingEvalReportSchema.nullable(),
16730
+ candidate: TrainingEvalReportSchema.nullable(),
16731
+ candidateInt8: TrainingEvalReportSchema.nullable(),
16732
+ recallDeltaByCamera: external_exports.record(external_exports.string(), external_exports.record(external_exports.string(), external_exports.number())).nullable(),
16733
+ map50: external_exports.record(external_exports.string(), external_exports.number().nullable())
16734
+ }).optional(),
16735
+ floors: external_exports.object({
16736
+ baseline: FloorsSchema,
16737
+ candidate: FloorsSchema,
16738
+ candidateInt8: FloorsSchema.nullable(),
16739
+ notes: external_exports.array(external_exports.string())
16740
+ }).optional(),
16741
+ int8: external_exports.object({
16742
+ kept: external_exports.boolean(),
16743
+ map50Fp16: external_exports.number().nullable(),
16744
+ map50Int8: external_exports.number().nullable(),
16745
+ reason: external_exports.string().nullable()
16746
+ }).optional(),
16747
+ exportsDropped: external_exports.array(external_exports.object({
16748
+ export: external_exports.string(),
16749
+ reason: external_exports.string()
16750
+ })).optional(),
16751
+ files: external_exports.array(TrainingResultFileSchema).optional(),
16752
+ bundle: external_exports.object({
16753
+ path: external_exports.literal("bundle.tar"),
16754
+ bytes: external_exports.number().int().nonnegative(),
16755
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/)
16756
+ }).nullable().optional(),
16757
+ catalogDraft: external_exports.object({
16758
+ base: TrainingCatalogDraftSchema,
16759
+ int8: TrainingCatalogDraftSchema.nullable()
16760
+ }).nullable().optional(),
16761
+ licence: external_exports.string()
16762
+ });
16763
+ var TrainingStageSchema = external_exports.enum([
16764
+ "prepare",
16765
+ "replay",
16766
+ "train",
16767
+ "eval",
16768
+ "export",
16769
+ "package"
16770
+ ]);
16771
+ var EventBase = {
16772
+ v: external_exports.literal(1),
16773
+ ts: external_exports.number()
16774
+ };
16775
+ var TrainingEventSchema = external_exports.discriminatedUnion("type", [
16776
+ external_exports.object({
16777
+ ...EventBase,
16778
+ type: external_exports.literal("stage"),
16779
+ stage: TrainingStageSchema
16780
+ }),
16781
+ external_exports.object({
16782
+ ...EventBase,
16783
+ type: external_exports.literal("epoch"),
16784
+ epoch: external_exports.number().int(),
16785
+ epochs: external_exports.number().int(),
16786
+ boxLoss: external_exports.number().nullable().optional(),
16787
+ map50: external_exports.number().nullable().optional(),
16788
+ map50_95: external_exports.number().nullable().optional(),
16789
+ etaSec: external_exports.number().nullable().optional()
16790
+ }),
16791
+ external_exports.object({
16792
+ ...EventBase,
16793
+ type: external_exports.literal("metric"),
16794
+ name: external_exports.string(),
16795
+ value: external_exports.number()
16796
+ }),
16797
+ external_exports.object({
16798
+ ...EventBase,
16799
+ type: external_exports.literal("artifact"),
16800
+ path: external_exports.string(),
16801
+ bytes: external_exports.number(),
16802
+ sha256: external_exports.string()
16803
+ }),
16804
+ external_exports.object({
16805
+ ...EventBase,
16806
+ type: external_exports.literal("done"),
16807
+ status: external_exports.enum(["succeeded", "failed"]),
16808
+ resultSha256: external_exports.string().nullable().optional()
16809
+ }),
16810
+ external_exports.object({
16811
+ ...EventBase,
16812
+ type: external_exports.literal("error"),
16813
+ stage: external_exports.string(),
16814
+ code: external_exports.string(),
16815
+ message: external_exports.string()
16816
+ })
16817
+ ]);
16557
16818
  var BirthDecisionVerdictSchema = external_exports.enum([
16558
16819
  "confirmed",
16559
16820
  "suppressed",
@@ -18230,7 +18491,9 @@ var AddonHttpRouteSchema = external_exports.object({
18230
18491
  "authenticated",
18231
18492
  "admin"
18232
18493
  ]).optional(),
18233
- description: external_exports.string().optional()
18494
+ description: external_exports.string().optional(),
18495
+ /** The hub limits this route per client address before the handler runs. */
18496
+ rateLimit: external_exports.enum(["auth"]).optional()
18234
18497
  });
18235
18498
  var InvokeRequestSchema = external_exports.object({
18236
18499
  method: external_exports.string(),
@@ -18940,6 +19203,26 @@ var BackupDestinationInfoSchema = external_exports.object({
18940
19203
  */
18941
19204
  lastError: external_exports.string().optional()
18942
19205
  });
19206
+ var BackupArchiveEncryptionSchema = external_exports.object({
19207
+ /** `x25519-hkdf-aes256gcm-stream-v1`. */
19208
+ scheme: external_exports.string(),
19209
+ /** 16 hex — the backup key whose secret restores this archive. */
19210
+ keyId: external_exports.string()
19211
+ });
19212
+ var BackupEncryptionStatusSchema = external_exports.object({
19213
+ enabled: external_exports.boolean(),
19214
+ active: external_exports.object({
19215
+ keyId: external_exports.string(),
19216
+ publicKey: external_exports.string(),
19217
+ createdAt: external_exports.number()
19218
+ }).nullable(),
19219
+ /** Every key ever set up, newest first. */
19220
+ keys: external_exports.array(external_exports.object({
19221
+ keyId: external_exports.string(),
19222
+ createdAt: external_exports.number(),
19223
+ retiredAt: external_exports.number().nullable()
19224
+ })).readonly()
19225
+ });
18943
19226
  var BackupArchiveEntrySchema = external_exports.object({
18944
19227
  id: external_exports.string(),
18945
19228
  filename: external_exports.string(),
@@ -18947,7 +19230,9 @@ var BackupArchiveEntrySchema = external_exports.object({
18947
19230
  sizeBytes: external_exports.number(),
18948
19231
  label: external_exports.string().optional(),
18949
19232
  /** Top-level locations included in the archive (db, addons, tls, …). */
18950
- locations: external_exports.array(external_exports.string()).readonly()
19233
+ locations: external_exports.array(external_exports.string()).readonly(),
19234
+ /** Present when the archive is encrypted; restore then needs that key. */
19235
+ encryption: BackupArchiveEncryptionSchema.optional()
18951
19236
  });
18952
19237
  var BackupEntrySchema = external_exports.object({
18953
19238
  id: external_exports.string(),
@@ -18956,7 +19241,8 @@ var BackupEntrySchema = external_exports.object({
18956
19241
  label: external_exports.string().optional(),
18957
19242
  createdAt: external_exports.number(),
18958
19243
  sizeBytes: external_exports.number(),
18959
- locations: external_exports.array(external_exports.string()).optional()
19244
+ locations: external_exports.array(external_exports.string()).optional(),
19245
+ encryption: BackupArchiveEncryptionSchema.optional()
18960
19246
  });
18961
19247
  var ArchiveEntrySchema = external_exports.object({
18962
19248
  path: external_exports.string(),
@@ -19169,11 +19455,58 @@ var backupCapability = {
19169
19455
  * this list and skips entries whose path doesn't start with
19170
19456
  * any of them.
19171
19457
  */
19172
- locations: external_exports.array(external_exports.string()).optional()
19458
+ locations: external_exports.array(external_exports.string()).optional(),
19459
+ /**
19460
+ * The backup SECRET key, for an encrypted archive (ignored for a plain
19461
+ * one). The archive is decrypted into the hub's private staging
19462
+ * before the restart; the key is not stored. A wrong or missing key
19463
+ * is refused before the archive is downloaded.
19464
+ */
19465
+ backupSecretKey: external_exports.string().optional()
19173
19466
  }), external_exports.void(), {
19174
19467
  kind: "mutation",
19175
19468
  auth: "admin"
19176
19469
  }),
19470
+ /** The encryption setting — public keys only. */
19471
+ getEncryption: method(external_exports.void(), BackupEncryptionStatusSchema, { auth: "admin" }),
19472
+ /**
19473
+ * Turn encryption on, or replace the key: generates a new key pair, keeps
19474
+ * the PUBLIC key, and returns the SECRET key — once. It is never stored
19475
+ * on the hub and cannot be shown again; archives made from now on need
19476
+ * it to be restored. A previous key is retired: archives made with it
19477
+ * still need IT.
19478
+ */
19479
+ setupEncryption: method(external_exports.object({}), external_exports.object({
19480
+ keyId: external_exports.string(),
19481
+ secretKey: external_exports.string(),
19482
+ publicKey: external_exports.string(),
19483
+ createdAt: external_exports.number(),
19484
+ replacedKeyId: external_exports.string().nullable()
19485
+ }), {
19486
+ kind: "mutation",
19487
+ auth: "admin"
19488
+ }),
19489
+ /** New archives are plain again. Existing encrypted archives keep needing their key. */
19490
+ disableEncryption: method(external_exports.object({}), external_exports.object({ disabledKeyId: external_exports.string().nullable() }), {
19491
+ kind: "mutation",
19492
+ auth: "admin"
19493
+ }),
19494
+ /**
19495
+ * Does this secret key parse, and which backup key is it? A mutation so
19496
+ * the key never travels in a URL. Nothing is stored.
19497
+ */
19498
+ checkBackupKey: method(external_exports.object({ backupSecretKey: external_exports.string() }), external_exports.object({
19499
+ valid: external_exports.boolean(),
19500
+ keyId: external_exports.string().nullable(),
19501
+ /** The hub knows this key (active or retired). */
19502
+ known: external_exports.boolean(),
19503
+ /** It is the key new archives are encrypted to. */
19504
+ active: external_exports.boolean(),
19505
+ error: external_exports.string().optional()
19506
+ }), {
19507
+ kind: "mutation",
19508
+ auth: "admin"
19509
+ }),
19177
19510
  delete: method(external_exports.object({
19178
19511
  destinationId: external_exports.string(),
19179
19512
  backupId: external_exports.string()
@@ -21121,6 +21454,54 @@ var CustomModelDescriptorSchema = external_exports.object({
21121
21454
  stepId: external_exports.string(),
21122
21455
  entry: ModelCatalogEntrySchema
21123
21456
  });
21457
+ var ModelBundleFileSchema = external_exports.object({
21458
+ /** Relative path inside the bundle tar; an mlpackage member is `<x>.mlpackage/<member>`. */
21459
+ path: external_exports.string().min(1),
21460
+ bytes: external_exports.number().int().nonnegative(),
21461
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/)
21462
+ });
21463
+ var ImportModelBundleInputSchema = external_exports.object({
21464
+ /** The registry provider that keeps the model (Model Studio). */
21465
+ addonId: external_exports.string(),
21466
+ stepId: external_exports.string().min(1),
21467
+ /**
21468
+ * The catalog rows to register, complete, every format URL already
21469
+ * `camstack-local://<modelId>/<file>` naming a file of the bundle. One
21470
+ * bundle may carry several rows (a base and its INT8 variant).
21471
+ */
21472
+ entries: external_exports.array(ModelCatalogEntrySchema).min(1).max(4),
21473
+ /** The bundle tar, offered by the producer over `ctx.peerBytes` (same host). */
21474
+ bundle: external_exports.object({
21475
+ ticket: PeerBytesTicketSchema,
21476
+ bytes: external_exports.number().int().positive(),
21477
+ sha256: external_exports.string().regex(/^[0-9a-f]{64}$/)
21478
+ }),
21479
+ /** Every file the tar must hold; anything missing, extra or different is refused. */
21480
+ files: external_exports.array(ModelBundleFileSchema).min(1).max(64),
21481
+ /** Convert missing engine formats and push the model to every agent afterwards. */
21482
+ distribute: external_exports.boolean()
21483
+ });
21484
+ var ImportModelBundleResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
21485
+ kind: external_exports.literal("imported"),
21486
+ modelIds: external_exports.array(external_exports.string()).readonly(),
21487
+ distributed: external_exports.array(external_exports.object({
21488
+ modelId: external_exports.string(),
21489
+ nodeId: external_exports.string(),
21490
+ format: external_exports.enum(MODEL_FORMATS),
21491
+ ok: external_exports.boolean(),
21492
+ error: external_exports.string().optional()
21493
+ })).readonly()
21494
+ }), external_exports.object({
21495
+ kind: external_exports.literal("refused"),
21496
+ reason: external_exports.enum([
21497
+ "transfer-failed",
21498
+ "checksum-mismatch",
21499
+ "bundle-mismatch",
21500
+ "invalid-entry",
21501
+ "id-taken"
21502
+ ]),
21503
+ detail: external_exports.string()
21504
+ })]);
21124
21505
  var customModelRegistryCapability = {
21125
21506
  name: "custom-model-registry",
21126
21507
  scope: "system",
@@ -21136,7 +21517,22 @@ var customModelRegistryCapability = {
21136
21517
  * `ctx.api.customModelRegistry.listModels.query()` — UDS/Moleculer,
21137
21518
  * never tRPC — so `auth: 'admin'` costs it nothing.
21138
21519
  */
21139
- listModels: method(external_exports.void(), external_exports.array(CustomModelDescriptorSchema).readonly(), { auth: "admin" })
21520
+ listModels: method(external_exports.void(), external_exports.array(CustomModelDescriptorSchema).readonly(), { auth: "admin" }),
21521
+ /**
21522
+ * Register a model whose files arrive as ONE bundle tar (D806): the tar
21523
+ * is taken over `ctx.peerBytes`, checked against `bundle.sha256` and
21524
+ * every row of `files`, unpacked into the hub's flat modelsDir (directory
21525
+ * formats included), each format's `.revision` record written, the rows
21526
+ * upserted under the operator's name, the hub marked available and —
21527
+ * when asked — engine formats converted and the model distributed. A
21528
+ * model id already registered by another source is refused, never
21529
+ * overwritten.
21530
+ */
21531
+ importModelBundle: method(ImportModelBundleInputSchema, ImportModelBundleResultSchema, {
21532
+ kind: "mutation",
21533
+ auth: "admin",
21534
+ timeoutMs: 30 * 6e4
21535
+ })
21140
21536
  }
21141
21537
  };
21142
21538
  var QueryFilterSchema = external_exports.object({
@@ -21772,6 +22168,31 @@ var KeychainKeySourceSchema = external_exports.object({
21772
22168
  */
21773
22169
  sharesBackupWithDatabase: external_exports.boolean()
21774
22170
  });
22171
+ var KeychainResetRecordSchema = external_exports.object({
22172
+ id: external_exports.string(),
22173
+ at: external_exports.number(),
22174
+ /** `user:<id>` or {@link KEYCHAIN_RESET_TRIGGER_ACTOR}. */
22175
+ actor: external_exports.string(),
22176
+ /** Why the keychain was locked when it was reset; `null` when it was not locked. */
22177
+ lockedReason: external_exports.string().nullable(),
22178
+ /** Values moved into the archive table (ciphertext under the lost key). */
22179
+ archived: external_exports.number().int(),
22180
+ /** `keychain:secrets-orphaned-<ts>`, or `null` when nothing was stored. */
22181
+ archivedCollection: external_exports.string().nullable(),
22182
+ /**
22183
+ * `keychain:keys-orphaned-<ts>`: the wrapped data keys of the archive, kept
22184
+ * so the archive can still be opened if the lost master key turns up.
22185
+ */
22186
+ archivedKeysCollection: external_exports.string().nullable(),
22187
+ /**
22188
+ * `system-settings` keys whose marker the reset cleared — the cluster
22189
+ * secret's: a marker left pointing at an archived value would refuse every
22190
+ * agent forever (D797).
22191
+ */
22192
+ clearedSettingsKeys: external_exports.array(external_exports.string()).readonly(),
22193
+ /** When an operator dismissed the notice on the Secrets page; `null` until then. */
22194
+ acknowledgedAt: external_exports.number().nullable()
22195
+ });
21775
22196
  var KeychainStatusSchema = external_exports.object({
21776
22197
  keychain: KeychainStateSchema,
21777
22198
  /** The source of the master key in use; `null` while locked. */
@@ -21789,7 +22210,9 @@ var KeychainStatusSchema = external_exports.object({
21789
22210
  /** Wrapped copies of the data key under a previous master key, kept until purged. */
21790
22211
  retiredWraps: external_exports.number().int(),
21791
22212
  recoveryKeyDownloadedAt: external_exports.number().nullable(),
21792
- secretCount: external_exports.number().int()
22213
+ secretCount: external_exports.number().int(),
22214
+ /** The most recent reset, acknowledged or not; `null` when the keychain was never reset. */
22215
+ lastReset: KeychainResetRecordSchema.nullable()
21793
22216
  });
21794
22217
  var KeychainSecretUsageSchema = external_exports.enum([
21795
22218
  "in-use",
@@ -21806,13 +22229,14 @@ var KeychainAuditActionSchema = external_exports.enum([
21806
22229
  "download-recovery-key",
21807
22230
  "delete-orphans",
21808
22231
  "reset",
22232
+ "acknowledge-reset",
21809
22233
  "initialize"
21810
22234
  ]);
21811
22235
  var KeychainAuditEntrySchema = external_exports.object({
21812
22236
  id: external_exports.string(),
21813
22237
  at: external_exports.number(),
21814
22238
  action: KeychainAuditActionSchema,
21815
- /** `addon:<id>` | `user:<id>` | `system`. */
22239
+ /** `addon:<id>` | `user:<id>` | `system` | `trigger-file`. */
21816
22240
  actor: external_exports.string(),
21817
22241
  ref: external_exports.string().nullable(),
21818
22242
  detail: external_exports.string().nullable()
@@ -21916,6 +22340,21 @@ var keychainAdminCapability = {
21916
22340
  kind: "mutation",
21917
22341
  auth: "admin",
21918
22342
  caller: "required"
22343
+ }),
22344
+ /**
22345
+ * What the last reset left to re-enter: the archived refs (owner, scope,
22346
+ * field — never a value) that hold no value again yet. Process-held refs
22347
+ * the hub regenerates itself (the session signing key) are not listed.
22348
+ */
22349
+ resetReport: method(external_exports.object({}), external_exports.object({
22350
+ reset: KeychainResetRecordSchema.nullable(),
22351
+ pendingReentry: external_exports.array(KeychainSecretMetaSchema).readonly()
22352
+ }), { auth: "admin" }),
22353
+ /** Dismiss the "keychain was reset" notice. Audited. */
22354
+ acknowledgeReset: method(external_exports.object({}), external_exports.object({ acknowledged: external_exports.boolean() }), {
22355
+ kind: "mutation",
22356
+ auth: "admin",
22357
+ caller: "required"
21919
22358
  })
21920
22359
  }
21921
22360
  };
@@ -24725,14 +25164,14 @@ var LlmProfileSchema = external_exports.object({
24725
25164
  */
24726
25165
  appleFoundation: external_exports.object({ nodeId: external_exports.string() }).optional()
24727
25166
  });
24728
- var ConfigSchemaPassthrough$1 = external_exports.unknown();
25167
+ var ConfigSchemaPassthrough$2 = external_exports.unknown();
24729
25168
  var LlmProfileKindDescriptorSchema = external_exports.object({
24730
25169
  kind: LlmProfileKindSchema,
24731
25170
  label: external_exports.string(),
24732
25171
  icon: external_exports.string(),
24733
25172
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
24734
25173
  addonId: external_exports.string(),
24735
- configSchema: ConfigSchemaPassthrough$1
25174
+ configSchema: ConfigSchemaPassthrough$2
24736
25175
  });
24737
25176
  var LlmDefaultSelectorSchema = external_exports.union([external_exports.object({ consumer: external_exports.string() }), external_exports.object({ purpose: external_exports.enum(["text", "vision"]) })]);
24738
25177
  var LlmDefaultSchema = external_exports.object({
@@ -25066,7 +25505,7 @@ var RedirectLoginMethodSchema = external_exports.object({
25066
25505
  * The provider names an external identity a signed-in user can link to
25067
25506
  * their own account (D782): `auth.listLinkableProviders` /
25068
25507
  * `beginExternalLink` offer exactly the redirect methods that set this,
25069
- * whatever their id. Absent / false — a login button only (magic-link).
25508
+ * whatever their id. Absent / false — a login button only.
25070
25509
  */
25071
25510
  linkable: external_exports.boolean().optional()
25072
25511
  });
@@ -25835,7 +26274,7 @@ var TargetKindCapsSchema = external_exports.object({
25835
26274
  ttl: external_exports.boolean(),
25836
26275
  bodyMaxLen: external_exports.number().int().positive()
25837
26276
  });
25838
- var ConfigSchemaPassthrough = external_exports.unknown();
26277
+ var ConfigSchemaPassthrough$1 = external_exports.unknown();
25839
26278
  var TargetKindSchema = external_exports.object({
25840
26279
  kind: external_exports.string(),
25841
26280
  label: external_exports.string(),
@@ -25872,7 +26311,7 @@ var TargetKindSchema = external_exports.object({
25872
26311
  * its raster path, which is the safe default for an unknown image.
25873
26312
  */
25874
26313
  iconMediaType: external_exports.string().optional(),
25875
- configSchema: ConfigSchemaPassthrough,
26314
+ configSchema: ConfigSchemaPassthrough$1,
25876
26315
  /**
25877
26316
  * The config keys that decide WHERE this kind's secrets are sent (server,
25878
26317
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -29576,17 +30015,58 @@ var RetrainFrameListSchema = external_exports.object({
29576
30015
  /** What the page pre-selects — the native key frame when one survives. */
29577
30016
  autoPickMediaId: external_exports.number().int().optional()
29578
30017
  });
30018
+ var RetrainFrameWorkStateSchema = external_exports.enum([
30019
+ "unannotated",
30020
+ "annotated",
30021
+ "complete"
30022
+ ]);
30023
+ var RetrainCorpusFilterSchema = external_exports.object({
30024
+ workState: RetrainFrameWorkStateSchema.optional(),
30025
+ deviceIds: external_exports.array(external_exports.number()).max(500).optional(),
30026
+ /** When set, only frames in this named collection. */
30027
+ collectionId: external_exports.string().optional(),
30028
+ /** Frames that carry at least one saved annotation in one of these classes. */
30029
+ classes: external_exports.array(RetrainMacroClassSchema).optional(),
30030
+ page: external_exports.number().int().positive().default(1),
30031
+ pageSize: external_exports.number().int().positive().max(100).default(50)
30032
+ });
30033
+ var RetrainCorpusPageFrameSchema = RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema });
30034
+ var RetrainCorpusPageSchema = external_exports.object({
30035
+ frames: external_exports.array(RetrainCorpusPageFrameSchema).readonly(),
30036
+ total: external_exports.number().int().nonnegative(),
30037
+ page: external_exports.number().int().positive(),
30038
+ pageSize: external_exports.number().int().positive()
30039
+ });
30040
+ var RetrainCorpusKpiCameraRowSchema = external_exports.object({
30041
+ deviceId: external_exports.number(),
30042
+ unannotated: external_exports.number().int().nonnegative(),
30043
+ annotated: external_exports.number().int().nonnegative(),
30044
+ complete: external_exports.number().int().nonnegative(),
30045
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
30046
+ * `null` when the corpus is empty (no ratio). */
30047
+ pctOfCorpus: external_exports.number().min(0).max(1).nullable()
30048
+ });
30049
+ var RetrainCorpusKpiSchema = external_exports.object({
30050
+ total: external_exports.number().int().nonnegative(),
30051
+ unannotated: external_exports.number().int().nonnegative(),
30052
+ annotated: external_exports.number().int().nonnegative(),
30053
+ complete: external_exports.number().int().nonnegative(),
30054
+ cameras: external_exports.array(RetrainCorpusKpiCameraRowSchema).readonly()
30055
+ });
29579
30056
  var RetrainExportFilterSchema = external_exports.object({
29580
30057
  deviceIds: external_exports.array(external_exports.number()).optional(),
29581
30058
  frameIds: external_exports.array(external_exports.string()).max(2e4).optional(),
29582
30059
  /** Only frames in at least one of these named collections. */
29583
30060
  collectionIds: external_exports.array(external_exports.string()).max(200).optional(),
29584
- /** Exactly the frames of this dataset version (and its completeOnly). An
29585
- * unknown id selects nothing. */
29586
- datasetVersionId: external_exports.string().optional(),
30061
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
30062
+ collectionId: external_exports.string().optional(),
29587
30063
  batchId: external_exports.string().optional(),
29588
30064
  /** Only frames the operator marked complete (all subjects boxed). */
29589
- completeOnly: external_exports.boolean().optional()
30065
+ completeOnly: external_exports.boolean().optional(),
30066
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
30067
+ workState: RetrainFrameWorkStateSchema.optional(),
30068
+ /** Frames with at least one saved annotation in one of these classes. */
30069
+ classes: external_exports.array(RetrainMacroClassSchema).optional()
29590
30070
  });
29591
30071
  var RetrainExportLayoutSchema = external_exports.enum(["frames", "crops"]);
29592
30072
  var RetrainArchiveTargetSchema = external_exports.object({
@@ -29759,22 +30239,28 @@ var RetrainDatasetVersionSchema = external_exports.object({
29759
30239
  layout: RetrainExportLayoutSchema,
29760
30240
  completeOnly: external_exports.boolean(),
29761
30241
  frameCount: external_exports.number().int(),
29762
- /** sha256 of what the frames taught when the version was frozen. */
29763
30242
  annotationHash: external_exports.string(),
29764
- /** The export manifest schema the version was cut under. */
29765
30243
  manifestSchema: external_exports.string(),
29766
30244
  stats: RetrainDatasetStatsSchema
29767
30245
  });
29768
- var CreateRetrainDatasetVersionResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
29769
- kind: external_exports.literal("created"),
29770
- version: RetrainDatasetVersionSchema
30246
+ var RetrainTrainingCorpusSelectionSchema = external_exports.object({
30247
+ collectionIds: external_exports.array(external_exports.string()).min(1),
30248
+ workState: external_exports.enum([
30249
+ "complete",
30250
+ "annotated_or_complete",
30251
+ "any_annotated"
30252
+ ]).default("complete")
30253
+ });
30254
+ var RetrainTrainingCorpusResolveResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
30255
+ kind: external_exports.literal("resolved"),
30256
+ frameIds: external_exports.array(external_exports.string()).max(2e4).readonly(),
30257
+ stats: RetrainDatasetStatsSchema,
30258
+ annotationHash: external_exports.string(),
30259
+ layout: RetrainExportLayoutSchema
29771
30260
  }), external_exports.object({
29772
30261
  kind: external_exports.literal("refused"),
29773
- reason: external_exports.enum([
29774
- "empty-name",
29775
- "duplicate-name",
29776
- "no-frames"
29777
- ])
30262
+ reason: external_exports.enum(["unknown-collection", "no-frames"]),
30263
+ detail: external_exports.string()
29778
30264
  })]);
29779
30265
  var RetrainTransitionResultSchema = external_exports.object({
29780
30266
  trackId: external_exports.string(),
@@ -30795,6 +31281,26 @@ var pipelineAnalyticsCapability = {
30795
31281
  auth: "admin"
30796
31282
  }),
30797
31283
  /**
31284
+ * Paginated corpus copies for the Frames grid — index reads only.
31285
+ *
31286
+ * Filters AND (`workState`, cameras, one collection, annotated classes).
31287
+ * An answered empty match is `{ frames: [], total: 0, … }` (D315), never a
31288
+ * pending masquerade. Classification uses `workStateOf` (annotation count
31289
+ * wins over a stray `complete` flag).
31290
+ */
31291
+ listRetrainCorpusPage: method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
31292
+ kind: "query",
31293
+ auth: "admin"
31294
+ }),
31295
+ /**
31296
+ * Global + per-camera corpus KPI. Unfiltered totals; `%` on a camera row is
31297
+ * `complete(camera) / corpus total`, or `null` when the corpus is empty.
31298
+ */
31299
+ getRetrainCorpusKpi: method(external_exports.object({}), RetrainCorpusKpiSchema, {
31300
+ kind: "query",
31301
+ auth: "admin"
31302
+ }),
31303
+ /**
30798
31304
  * What a track can contribute, and what it already has.
30799
31305
  *
30800
31306
  * `candidates` are the track's whole, unannotated frames — index rows only,
@@ -31001,50 +31507,23 @@ var pipelineAnalyticsCapability = {
31001
31507
  auth: "admin",
31002
31508
  timeoutMs: 60 * 6e4
31003
31509
  }),
31004
- /** The counts a selection would freeze — class × camera × day/night,
31005
- * completeness — without freezing anything. Index reads only. */
31006
- previewRetrainDataset: method(external_exports.object({
31007
- selection: RetrainDatasetSelectionSchema,
31008
- completeOnly: external_exports.boolean().optional()
31009
- }), RetrainDatasetStatsSchema, {
31010
- kind: "query",
31011
- auth: "admin"
31012
- }),
31013
31510
  /**
31014
- * Freeze a dataset version: the frames the selection yields (the same plan
31015
- * the annotated export builds), the hash of what they teach, the export
31016
- * parameters and the counts. Immutable — a different selection is a new
31017
- * version. Export it with `getRetrainExportUrl({ datasetVersionId })`.
31511
+ * OFFER the annotated archive instead of pushing it (D805): the same tar
31512
+ * `writeRetrainArchive` streams, behind a one-shot `ctx.peerBytes` ticket
31513
+ * the caller dials at once (same host). For a consumer that cannot expose
31514
+ * an upload URL — a training provider streaming straight into its cloud.
31515
+ * The answer is the plan; the bytes and their sha256 are the consumer's
31516
+ * to measure as they arrive.
31018
31517
  */
31019
- createRetrainDatasetVersion: method(external_exports.object({
31020
- name: external_exports.string().max(120),
31021
- selection: RetrainDatasetSelectionSchema,
31022
- layout: RetrainExportLayoutSchema,
31023
- completeOnly: external_exports.boolean()
31024
- }), CreateRetrainDatasetVersionResultSchema, {
31025
- kind: "mutation",
31026
- auth: "admin",
31027
- timeoutMs: 12e4
31028
- }),
31029
- /** Every dataset version, newest first. */
31030
- listRetrainDatasetVersions: method(external_exports.object({}), external_exports.array(RetrainDatasetVersionSchema).readonly(), {
31031
- kind: "query",
31032
- auth: "admin"
31033
- }),
31034
- /** Delete a version. Its frames stay in the dataset. */
31035
- deleteRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ deleted: external_exports.boolean() }), {
31036
- kind: "mutation",
31037
- auth: "admin"
31038
- }),
31039
- /** Does the corpus still teach what the version froze? `missingFrames`
31040
- * counts frames that left the dataset (or lost every box and tick). */
31041
- verifyRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({
31042
- found: external_exports.boolean(),
31043
- annotationHash: external_exports.string(),
31044
- matches: external_exports.boolean(),
31045
- missingFrames: external_exports.number().int()
31518
+ offerRetrainArchive: method(external_exports.object({
31519
+ filter: RetrainExportFilterSchema,
31520
+ layout: RetrainExportLayoutSchema
31521
+ }), external_exports.object({
31522
+ ticket: PeerBytesTicketSchema,
31523
+ frames: external_exports.number().int(),
31524
+ annotations: external_exports.number().int()
31046
31525
  }), {
31047
- kind: "query",
31526
+ kind: "mutation",
31048
31527
  auth: "admin",
31049
31528
  timeoutMs: 12e4
31050
31529
  }),
@@ -31094,6 +31573,16 @@ var pipelineAnalyticsCapability = {
31094
31573
  kind: "query",
31095
31574
  auth: "admin"
31096
31575
  }),
31576
+ /**
31577
+ * Resolve a live training corpus selection to frame ids + stats (index
31578
+ * reads only). Same plan the annotated export builds — training plan/start
31579
+ * calls this instead of a frozen dataset version.
31580
+ */
31581
+ resolveRetrainTrainingCorpus: method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
31582
+ kind: "query",
31583
+ auth: "admin",
31584
+ timeoutMs: 6e4
31585
+ }),
31097
31586
  renameRetrainCollection: method(external_exports.object({
31098
31587
  id: external_exports.string(),
31099
31588
  name: external_exports.string().max(120)
@@ -31999,11 +32488,14 @@ var HardwareClassIdSchema = external_exports.enum([
31999
32488
  "intel-n-series",
32000
32489
  "apple-m-base",
32001
32490
  "apple-m-pro",
32491
+ "amd-phoenix",
32002
32492
  "unknown"
32003
32493
  ]);
32004
32494
  var AcceleratorKindSchema = external_exports.enum([
32005
32495
  "intel-npu",
32006
32496
  "intel-igpu",
32497
+ "amd-igpu",
32498
+ "amd-npu",
32007
32499
  "x86-cpu",
32008
32500
  "arm-cpu",
32009
32501
  "apple-ane",
@@ -33929,6 +34421,8 @@ var AgentPipelineSettingsSchema = external_exports.object({
33929
34421
  * address is wrong (multi-homed host, NAT, custom interface).
33930
34422
  */
33931
34423
  reachableHost: external_exports.string().optional(),
34424
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
34425
+ color: NodeColorIdSchema.optional(),
33932
34426
  /**
33933
34427
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
33934
34428
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -34565,8 +35059,9 @@ var pipelineOrchestratorCapability = {
34565
35059
  */
34566
35060
  setAgentReachableHost: method(external_exports.object({
34567
35061
  agentNodeId: external_exports.string(),
34568
- reachableHost: external_exports.string().nullable()
34569
- }), external_exports.object({ success: external_exports.literal(true) }), {
35062
+ reachableHost: external_exports.string().nullable().optional(),
35063
+ color: NodeColorIdSchema.nullable().optional()
35064
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), external_exports.object({ success: external_exports.literal(true) }), {
34570
35065
  kind: "mutation",
34571
35066
  auth: "admin"
34572
35067
  }),
@@ -35510,7 +36005,14 @@ var SsoBridgeClaimsSchema = external_exports.object({
35510
36005
  * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
35511
36006
  * subject is unique only per issuer, so a link is bound to it.
35512
36007
  */
35513
- issuer: external_exports.string().optional()
36008
+ issuer: external_exports.string().optional(),
36009
+ /**
36010
+ * SHA-256 (hex) of the `camstack_sso_state` cookie the IdP `/start` set in
36011
+ * the browser that began this sign-in. `/api/auth/sso/finish` requires the
36012
+ * request to present the matching cookie — a login bridge is useless in
36013
+ * any other browser.
36014
+ */
36015
+ browserBinding: external_exports.string().optional()
35514
36016
  });
35515
36017
  var ssoBridgeCapability = {
35516
36018
  name: "sso-bridge",
@@ -35528,7 +36030,7 @@ var ssoBridgeCapability = {
35528
36030
  * `/api/auth/sso/finish` to become admin — a full privilege escalation
35529
36031
  * through the exact surface this cap exists to close (see the module
35530
36032
  * docblock). Every real caller (`oauth-grants.ts`, `main.ts`
35531
- * registration, the OIDC/magic-link addons) reaches this through
36033
+ * registration, the OIDC addon) reaches this through
35532
36034
  * `ctx.api` / the in-process registry — never through tRPC — so
35533
36035
  * `auth: 'admin'` costs those callers nothing.
35534
36036
  */
@@ -38054,7 +38556,13 @@ var addonsCapability = {
38054
38556
  mode: "singleton",
38055
38557
  nodeIdMode: "data",
38056
38558
  methods: {
38057
- list: method(external_exports.void(), external_exports.array(AddonListItemSchema).readonly()),
38559
+ /**
38560
+ * Installed addon roster for a node. `nodeId` omitted (or `'hub'`)
38561
+ * is the hub's own registry; an agent `nodeId` overlays that agent's
38562
+ * installed package versions (via `$agent.status`) onto hub manifests
38563
+ * and drops packages the agent does not have.
38564
+ */
38565
+ list: method(external_exports.object({ nodeId: external_exports.string().optional() }).optional(), external_exports.array(AddonListItemSchema).readonly()),
38058
38566
  getLogs: method(external_exports.object({
38059
38567
  addonId: external_exports.string(),
38060
38568
  limit: external_exports.number().min(1).max(500).default(100),
@@ -38846,6 +39354,7 @@ var calendarSourceCapability = {
38846
39354
  scope: "system",
38847
39355
  mode: "collection",
38848
39356
  internal: true,
39357
+ providerKind: "calendar",
38849
39358
  methods: {
38850
39359
  listCalendars: method(external_exports.void(), external_exports.array(CalendarInfoSchema).readonly(), { auth: "admin" }),
38851
39360
  listEvents: method(CalendarListEventsInputSchema, external_exports.array(CalendarEventSchema).readonly(), { auth: "admin" })
@@ -42681,7 +43190,13 @@ var TopologyNodeSchema = external_exports.object({
42681
43190
  })).readonly(),
42682
43191
  processes: external_exports.array(TopologyProcessSchema).readonly(),
42683
43192
  categories: external_exports.array(TopologyCategorySchema).readonly(),
42684
- rootPackage: TopologyRootPackageSchema.nullable()
43193
+ rootPackage: TopologyRootPackageSchema.nullable(),
43194
+ /**
43195
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
43196
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
43197
+ * for offline rows and when the hub cannot tell.
43198
+ */
43199
+ meshTransport: external_exports.enum(["tls", "clear"]).optional()
42685
43200
  });
42686
43201
  var CapUsageEdgeSchema = external_exports.object({
42687
43202
  callerAddonId: external_exports.string(),
@@ -43106,6 +43621,7 @@ var OsdNamedTemplateSchema = external_exports.object({
43106
43621
  parser: external_exports.string().max(256).default("")
43107
43622
  });
43108
43623
  var OsdSourceSchema = external_exports.discriminatedUnion("kind", [
43624
+ external_exports.object({ kind: external_exports.literal("none") }),
43109
43625
  external_exports.object({
43110
43626
  kind: external_exports.literal("static"),
43111
43627
  text: external_exports.string().max(64)
@@ -43253,6 +43769,19 @@ var osdManagerCapability = {
43253
43769
  auth: "admin"
43254
43770
  }),
43255
43771
  /**
43772
+ * Toggle the camera firmware overlay on/off (`osd.setOverlay` `enabled`).
43773
+ * Distinct from the binding's own `enabled` flag — this is what the
43774
+ * operator sees on the live picture (e.g. Reolink camera name layer).
43775
+ */
43776
+ setSlotCameraEnabled: method(external_exports.object({
43777
+ deviceId: external_exports.number().int(),
43778
+ slotId: external_exports.string().min(1),
43779
+ enabled: external_exports.boolean()
43780
+ }), external_exports.object({ success: external_exports.literal(true) }), {
43781
+ kind: "mutation",
43782
+ auth: "admin"
43783
+ }),
43784
+ /**
43256
43785
  * Replace one camera's binding configuration from another. Writable source
43257
43786
  * slots are mapped by ordinal onto writable target slots so different
43258
43787
  * provider slot ids do not make the copied configuration disappear.
@@ -43715,7 +44244,15 @@ var GpuInfoSchema = external_exports.object({
43715
44244
  name: external_exports.string(),
43716
44245
  memoryMB: external_exports.number().optional()
43717
44246
  });
43718
- var NpuInfoSchema = external_exports.object({ type: external_exports.enum(["apple-ane", "intel-npu"]) });
44247
+ var NpuInfoSchema = external_exports.object({
44248
+ type: external_exports.enum([
44249
+ "apple-ane",
44250
+ "intel-npu",
44251
+ "amd-xdna"
44252
+ ]),
44253
+ name: external_exports.string().optional(),
44254
+ generation: external_exports.enum(["xdna1", "xdna2"]).optional()
44255
+ });
43719
44256
  var CoralInfoSchema = external_exports.object({
43720
44257
  type: external_exports.literal("coral-edgetpu"),
43721
44258
  bus: external_exports.string().optional()
@@ -47057,16 +47594,6 @@ var ApiKeySummarySchema = external_exports.object({
47057
47594
  createdAt: external_exports.number(),
47058
47595
  lastUsedAt: external_exports.number().optional()
47059
47596
  });
47060
- var CreateApiKeyInputSchema = external_exports.object({
47061
- label: external_exports.string(),
47062
- isAdmin: external_exports.boolean().default(false),
47063
- allowedProviders: external_exports.union([external_exports.array(external_exports.string()), external_exports.literal("*")]).optional(),
47064
- allowedDevices: external_exports.record(external_exports.string(), external_exports.union([external_exports.array(external_exports.string()), external_exports.literal("*")])).optional()
47065
- });
47066
- var CreateApiKeyResultSchema = external_exports.object({
47067
- token: external_exports.string(),
47068
- record: ApiKeySummarySchema
47069
- });
47070
47597
  var ScopedTokenSummarySchema = external_exports.object({
47071
47598
  id: external_exports.string(),
47072
47599
  userId: external_exports.string(),
@@ -47168,20 +47695,11 @@ var userManagementCapability = {
47168
47695
  access: "view"
47169
47696
  }),
47170
47697
  listApiKeys: method(external_exports.void(), external_exports.array(ApiKeySummarySchema), { auth: "admin" }),
47171
- createApiKey: method(CreateApiKeyInputSchema, CreateApiKeyResultSchema, {
47172
- kind: "mutation",
47173
- auth: "admin",
47174
- access: "create"
47175
- }),
47176
47698
  revokeApiKey: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ success: external_exports.literal(true) }), {
47177
47699
  kind: "mutation",
47178
47700
  auth: "admin",
47179
47701
  access: "delete"
47180
47702
  }),
47181
- validateApiKey: method(external_exports.object({ token: external_exports.string() }), ApiKeySummarySchema.nullable(), {
47182
- kind: "mutation",
47183
- access: "view"
47184
- }),
47185
47703
  createScopedToken: method(CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, {
47186
47704
  kind: "mutation",
47187
47705
  auth: "admin",
@@ -47271,20 +47789,6 @@ var userManagementCapability = {
47271
47789
  userId: external_exports.string(),
47272
47790
  issuer: external_exports.string()
47273
47791
  }).nullable(), { auth: "admin" }),
47274
- /**
47275
- * Link `(provider, subject)` to `userId`. Idempotent for the same user;
47276
- * REFUSES (throws) an identity already linked to another user, and a
47277
- * user that does not exist.
47278
- */
47279
- linkExternalIdentity: method(ExternalIdentityKeySchema.extend({
47280
- userId: external_exports.string(),
47281
- issuer: external_exports.string().min(1),
47282
- label: external_exports.string().optional()
47283
- }), external_exports.object({ success: external_exports.literal(true) }), {
47284
- kind: "mutation",
47285
- auth: "admin",
47286
- access: "create"
47287
- }),
47288
47792
  /** Remove one link of `userId`. `success: false` when it was not linked to that user. */
47289
47793
  unlinkExternalIdentity: method(ExternalIdentityKeySchema.extend({ userId: external_exports.string() }), external_exports.object({ success: external_exports.boolean() }), {
47290
47794
  kind: "mutation",
@@ -47815,6 +48319,586 @@ var zoneRulesCapability = {
47815
48319
  */
47816
48320
  durability: "restored"
47817
48321
  };
48322
+ var TrainingGpuOptionSchema = external_exports.object({
48323
+ id: external_exports.string(),
48324
+ label: external_exports.string(),
48325
+ /** List price, USD per GPU-hour, before any region multiplier. */
48326
+ usdPerHour: external_exports.number().nonnegative(),
48327
+ vramGb: external_exports.number().nonnegative()
48328
+ });
48329
+ var TrainingRegionOptionSchema = external_exports.object({
48330
+ /** `''` = any region (the provider's choice). */
48331
+ id: external_exports.string(),
48332
+ label: external_exports.string(),
48333
+ priceMultiplier: external_exports.number().positive()
48334
+ });
48335
+ var TrainingProviderDefaultsSchema = external_exports.object({
48336
+ gpuType: external_exports.string(),
48337
+ region: external_exports.string(),
48338
+ costCapUsd: external_exports.number().nonnegative(),
48339
+ maxRuntimeSec: external_exports.number().int().positive(),
48340
+ /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
48341
+ failedDatasetGraceHours: external_exports.number().nonnegative()
48342
+ });
48343
+ var ConfigSchemaPassthrough = external_exports.unknown();
48344
+ var TrainingProviderTypeSchema = external_exports.object({
48345
+ typeId: external_exports.string(),
48346
+ label: external_exports.string(),
48347
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
48348
+ iconAsset: external_exports.string(),
48349
+ /** Owning `training-provider` addon — collection selector for createEntry. */
48350
+ addonId: external_exports.string(),
48351
+ /**
48352
+ * Fields for one entry of this type (credentials + defaults). Absent on a
48353
+ * type that only needs a name. Password fields are keychain-backed on the
48354
+ * provider addon (`secretStatePaths`), not D634 plaintext.
48355
+ */
48356
+ configSchema: ConfigSchemaPassthrough.optional()
48357
+ });
48358
+ var TrainingProviderEntrySchema = external_exports.object({
48359
+ entryId: external_exports.string(),
48360
+ typeId: external_exports.string(),
48361
+ name: external_exports.string(),
48362
+ addonId: external_exports.string(),
48363
+ /** Credentials are present — never the values. */
48364
+ configured: external_exports.boolean()
48365
+ });
48366
+ var TrainingProviderDescriptorSchema = external_exports.object({
48367
+ addonId: external_exports.string(),
48368
+ entryId: external_exports.string(),
48369
+ typeId: external_exports.string(),
48370
+ /** Operator-chosen entry name. */
48371
+ name: external_exports.string(),
48372
+ iconAsset: external_exports.string(),
48373
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
48374
+ kind: external_exports.string(),
48375
+ label: external_exports.string(),
48376
+ gpuTypes: external_exports.array(TrainingGpuOptionSchema).readonly(),
48377
+ regions: external_exports.array(TrainingRegionOptionSchema).readonly(),
48378
+ maxDatasetBytes: external_exports.number().int().positive(),
48379
+ maxRuntimeSec: external_exports.number().int().positive(),
48380
+ freeTierNote: external_exports.string().optional(),
48381
+ /** Where the data goes, in one sentence the confirm dialog repeats. */
48382
+ dataResidencyNote: external_exports.string(),
48383
+ /** Credentials are present — never the values. */
48384
+ configured: external_exports.boolean(),
48385
+ defaults: TrainingProviderDefaultsSchema,
48386
+ /**
48387
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
48388
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
48389
+ * never plaintext. Same hydrate contract as settings forms (D789).
48390
+ */
48391
+ formValues: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
48392
+ });
48393
+ var TrainingProviderUpdateEntryInputSchema = external_exports.object({
48394
+ entryId: external_exports.string().min(1),
48395
+ name: external_exports.string().min(1),
48396
+ tokenId: external_exports.string().optional(),
48397
+ tokenSecret: external_exports.union([external_exports.string(), external_exports.object({ $secretClear: external_exports.literal(true) })]).optional(),
48398
+ environment: external_exports.string().optional(),
48399
+ gpuType: external_exports.string().optional(),
48400
+ region: external_exports.string().optional(),
48401
+ costCapUsd: external_exports.number().nonnegative().optional(),
48402
+ maxRuntimeSec: external_exports.number().int().positive().optional(),
48403
+ failedDatasetGraceHours: external_exports.number().nonnegative().optional()
48404
+ });
48405
+ var TrainingCredentialCheckSchema = external_exports.object({
48406
+ ok: external_exports.boolean(),
48407
+ /** Workspace / account name, when the provider says. */
48408
+ account: external_exports.string().optional(),
48409
+ reason: external_exports.enum([
48410
+ "missing",
48411
+ "invalid",
48412
+ "forbidden",
48413
+ "network",
48414
+ "quota"
48415
+ ]).optional(),
48416
+ detail: external_exports.string().optional()
48417
+ });
48418
+ var ProviderJobStateSchema = external_exports.enum([
48419
+ "pending",
48420
+ "starting",
48421
+ "running",
48422
+ "succeeded",
48423
+ "failed",
48424
+ "cancelled",
48425
+ "lost"
48426
+ ]);
48427
+ var ProviderJobStatusSchema = external_exports.object({
48428
+ jobKey: external_exports.string(),
48429
+ providerJobId: external_exports.string().optional(),
48430
+ state: ProviderJobStateSchema,
48431
+ startedAt: external_exports.number().optional(),
48432
+ endedAt: external_exports.number().optional(),
48433
+ exitCode: external_exports.number().int().optional(),
48434
+ failureReason: external_exports.string().optional(),
48435
+ gpuType: external_exports.string(),
48436
+ region: external_exports.string().optional(),
48437
+ billedSeconds: external_exports.number().nonnegative(),
48438
+ costUsd: external_exports.number().nonnegative(),
48439
+ /** True when `costUsd` is runtime × list price, not a billing answer. */
48440
+ costIsEstimate: external_exports.boolean(),
48441
+ lastFetchedAt: external_exports.number()
48442
+ });
48443
+ var TrainerSourceRefSchema = external_exports.object({
48444
+ /** Hugging Face repo id, e.g. `camstack/camstack-trainer`. */
48445
+ repo: external_exports.string().min(1),
48446
+ /** A commit sha (never a branch) — the job must be reproducible. */
48447
+ revision: external_exports.string().regex(/^[0-9a-f]{7,64}$/)
48448
+ });
48449
+ var JobRef = {
48450
+ entryId: external_exports.string().min(1),
48451
+ jobKey: external_exports.string().uuid()
48452
+ };
48453
+ var TrainingLogLineSchema = external_exports.object({
48454
+ ts: external_exports.number(),
48455
+ text: external_exports.string()
48456
+ });
48457
+ var trainingProviderCapability = {
48458
+ name: "training-provider",
48459
+ scope: "system",
48460
+ mode: "collection",
48461
+ internal: true,
48462
+ methods: {
48463
+ /** Every entry's offer and settings. Concat-fans across providers. */
48464
+ describe: method(external_exports.object({}), external_exports.array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }),
48465
+ /** Creatable types for the Add-entry dialog. Concat-fans. */
48466
+ describeTypes: method(external_exports.object({}), external_exports.array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }),
48467
+ /** Configured entries (pills). Concat-fans. */
48468
+ listEntries: method(external_exports.object({}), external_exports.array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }),
48469
+ /**
48470
+ * Create an entry under this provider type. Pin with `{ addonId }` of the
48471
+ * type's owning addon (from describeTypes).
48472
+ */
48473
+ createEntry: method(external_exports.object({
48474
+ typeId: external_exports.string().min(1),
48475
+ name: external_exports.string().min(1)
48476
+ }), external_exports.object({ entryId: external_exports.string() }), {
48477
+ kind: "mutation",
48478
+ auth: "admin"
48479
+ }),
48480
+ /** Delete an entry. Pin with the owning `{ addonId }`. */
48481
+ deleteEntry: method(external_exports.object({ entryId: external_exports.string().min(1) }), external_exports.object({ ok: external_exports.literal(true) }), {
48482
+ kind: "mutation",
48483
+ auth: "admin"
48484
+ }),
48485
+ /**
48486
+ * Update one entry (name, credentials, defaults). Pin with owning
48487
+ * `{ addonId }`. Empty/omitted `tokenSecret` keeps the stored secret.
48488
+ */
48489
+ updateEntry: method(TrainingProviderUpdateEntryInputSchema, external_exports.object({ ok: external_exports.literal(true) }), {
48490
+ kind: "mutation",
48491
+ auth: "admin"
48492
+ }),
48493
+ /** Call the provider with the entry's stored credentials. Never returns them. */
48494
+ validateCredentials: method(external_exports.object({ entryId: external_exports.string().min(1) }), TrainingCredentialCheckSchema, {
48495
+ kind: "mutation",
48496
+ auth: "admin",
48497
+ timeoutMs: 3e4
48498
+ }),
48499
+ /** USD range for a run of `gpuSeconds` on `gpuType` in `region`. */
48500
+ estimateJob: method(external_exports.object({
48501
+ entryId: external_exports.string().min(1),
48502
+ gpuType: external_exports.string(),
48503
+ region: external_exports.string(),
48504
+ datasetBytes: external_exports.number().int().nonnegative(),
48505
+ gpuSecondsLow: external_exports.number().nonnegative(),
48506
+ gpuSecondsHigh: external_exports.number().nonnegative()
48507
+ }), external_exports.object({
48508
+ usdLow: external_exports.number().nonnegative(),
48509
+ usdHigh: external_exports.number().nonnegative(),
48510
+ notes: external_exports.array(external_exports.string()).readonly()
48511
+ }), { auth: "admin" }),
48512
+ /**
48513
+ * Take the dataset archive behind `ticket` (minted by pipeline-analytics,
48514
+ * same host) and land it as the job's dataset in the cloud, streamed —
48515
+ * nothing is staged on the hub's disk. Idempotent per `jobKey`: a second
48516
+ * call replaces a partial upload. Answers what actually landed.
48517
+ */
48518
+ uploadDataset: method(external_exports.object({
48519
+ ...JobRef,
48520
+ ticket: PeerBytesTicketSchema
48521
+ }), external_exports.object({
48522
+ bytes: external_exports.number().int().nonnegative(),
48523
+ sha256: external_exports.string()
48524
+ }), {
48525
+ kind: "mutation",
48526
+ auth: "admin",
48527
+ timeoutMs: 120 * 6e4
48528
+ }),
48529
+ /**
48530
+ * Start the trainer on a GPU. Looks the job up by `jobKey` first, so a
48531
+ * retried submit never starts a second GPU. `jobSpecJson` is written next
48532
+ * to the dataset as `job.json`; `maxRuntimeSec` is enforced by the
48533
+ * provider (a hard timeout), not by the hub.
48534
+ */
48535
+ submitJob: method(external_exports.object({
48536
+ ...JobRef,
48537
+ trainer: TrainerSourceRefSchema,
48538
+ jobSpecJson: external_exports.string().min(2).max(64e3),
48539
+ gpuType: external_exports.string(),
48540
+ region: external_exports.string(),
48541
+ maxRuntimeSec: external_exports.number().int().positive()
48542
+ }), ProviderJobStatusSchema, {
48543
+ kind: "mutation",
48544
+ auth: "admin",
48545
+ timeoutMs: 30 * 6e4
48546
+ }),
48547
+ getJob: method(external_exports.object(JobRef), ProviderJobStatusSchema, {
48548
+ auth: "admin",
48549
+ timeoutMs: 6e4
48550
+ }),
48551
+ /** Stdout/stderr since `cursor` (opaque), oldest first, at most `max` lines. */
48552
+ listJobEvents: method(external_exports.object({
48553
+ ...JobRef,
48554
+ cursor: external_exports.string().optional(),
48555
+ max: external_exports.number().int().min(1).max(500)
48556
+ }), external_exports.object({
48557
+ lines: external_exports.array(TrainingLogLineSchema).readonly(),
48558
+ cursor: external_exports.string()
48559
+ }), {
48560
+ auth: "admin",
48561
+ timeoutMs: 6e4
48562
+ }),
48563
+ /** Stop the job. Idempotent: an unknown or finished job is a no-op. */
48564
+ cancelJob: method(external_exports.object(JobRef), external_exports.object({ ok: external_exports.literal(true) }), {
48565
+ kind: "mutation",
48566
+ auth: "admin",
48567
+ timeoutMs: 6e4
48568
+ }),
48569
+ /** The job's `result.json`, as text (small, JSON). `found: false` before it exists. */
48570
+ readResult: method(external_exports.object(JobRef), external_exports.object({
48571
+ found: external_exports.boolean(),
48572
+ text: external_exports.string().optional()
48573
+ }), {
48574
+ kind: "mutation",
48575
+ auth: "admin",
48576
+ timeoutMs: 5 * 6e4
48577
+ }),
48578
+ /**
48579
+ * Offer one output file of the job (`bundle.tar`) to the caller as a
48580
+ * one-shot `ctx.peerBytes` ticket, streamed from the cloud — the provider
48581
+ * stages nothing on disk. The caller dials it at once.
48582
+ */
48583
+ offerArtifact: method(external_exports.object({
48584
+ ...JobRef,
48585
+ path: external_exports.enum(["bundle.tar"])
48586
+ }), external_exports.object({ ticket: PeerBytesTicketSchema }), {
48587
+ kind: "mutation",
48588
+ auth: "admin",
48589
+ timeoutMs: 5 * 6e4
48590
+ }),
48591
+ /** Delete every cloud object tagged with `jobKey` (the dataset first). Idempotent. */
48592
+ cleanupJob: method(external_exports.object(JobRef), external_exports.object({ deleted: external_exports.array(external_exports.string()).readonly() }), {
48593
+ kind: "mutation",
48594
+ auth: "admin",
48595
+ timeoutMs: 5 * 6e4
48596
+ }),
48597
+ /**
48598
+ * Jobs this provider can still see. Optional `entryId` filters; omit to
48599
+ * list every entry (orphan sweep). Pin with `{ addonId }`.
48600
+ */
48601
+ listJobs: method(external_exports.object({ entryId: external_exports.string().min(1).optional() }), external_exports.array(ProviderJobStatusSchema).readonly(), {
48602
+ auth: "admin",
48603
+ timeoutMs: 2 * 6e4
48604
+ })
48605
+ }
48606
+ };
48607
+ var TrainingCorpusSelectionSchema = external_exports.object({
48608
+ collectionIds: external_exports.array(external_exports.string()).min(1),
48609
+ /** Default complete-only for v1 */
48610
+ workState: external_exports.enum([
48611
+ "complete",
48612
+ "annotated_or_complete",
48613
+ "any_annotated"
48614
+ ]).default("complete")
48615
+ });
48616
+ var TrainingBaseModelSchema = external_exports.object({
48617
+ modelId: external_exports.string(),
48618
+ label: external_exports.string(),
48619
+ weights: external_exports.string(),
48620
+ imgsz: external_exports.number().int(),
48621
+ baselineOnnxUrl: external_exports.string(),
48622
+ baselineFloors: external_exports.record(external_exports.string(), external_exports.number()),
48623
+ /** The base the fleet runs most — the UI's default. */
48624
+ recommended: external_exports.boolean()
48625
+ });
48626
+ var TrainingPresetSchema = external_exports.enum([
48627
+ "quick",
48628
+ "standard",
48629
+ "thorough"
48630
+ ]);
48631
+ var TrainingJobRequestSchema = external_exports.object({
48632
+ /** Live collection + work-state criteria; resolved at plan/start. */
48633
+ selection: TrainingCorpusSelectionSchema,
48634
+ /**
48635
+ * The provider **entry** that runs it (credentials + defaults).
48636
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
48637
+ */
48638
+ entryId: external_exports.string().min(1),
48639
+ gpuType: external_exports.string().min(1),
48640
+ region: external_exports.string(),
48641
+ baseModelId: external_exports.string().min(1),
48642
+ preset: TrainingPresetSchema,
48643
+ /** Freeze the backbone's first N layers; `null` = the preset's choice. */
48644
+ freeze: external_exports.number().int().nonnegative().nullable(),
48645
+ /** Cameras held out whole for evaluation; `null` = the orchestrator's default. */
48646
+ holdoutCameras: external_exports.array(external_exports.number().int()).nullable()
48647
+ });
48648
+ var TrainingSplitPlanSchema = external_exports.object({
48649
+ holdoutCameras: external_exports.array(external_exports.number().int()).readonly(),
48650
+ /** Used when no camera is held out: the last N days of every camera. */
48651
+ holdoutLastDays: external_exports.number().int().nonnegative(),
48652
+ /** Holdout subjects per class (camera holdout only; `null` = known only after the split). */
48653
+ holdoutSupport: external_exports.record(external_exports.string(), external_exports.number().int()).nullable(),
48654
+ trainSubjects: external_exports.number().int()
48655
+ });
48656
+ var TrainingRefusalReasonSchema = external_exports.enum([
48657
+ "unknown-dataset",
48658
+ "unknown-provider",
48659
+ "provider-not-configured",
48660
+ "unknown-base-model",
48661
+ "unknown-gpu",
48662
+ "dataset-too-large",
48663
+ "no-training-subjects",
48664
+ "job-already-running"
48665
+ ]);
48666
+ var TrainingJobPlanSchema = external_exports.object({
48667
+ refusal: external_exports.object({
48668
+ reason: TrainingRefusalReasonSchema,
48669
+ detail: external_exports.string()
48670
+ }).nullable(),
48671
+ warnings: external_exports.array(external_exports.string()).readonly(),
48672
+ split: TrainingSplitPlanSchema.nullable(),
48673
+ estimate: external_exports.object({
48674
+ datasetBytes: external_exports.number().int(),
48675
+ uploadMinutesAt20Mbps: external_exports.number(),
48676
+ gpuSecondsLow: external_exports.number(),
48677
+ gpuSecondsHigh: external_exports.number(),
48678
+ usdLow: external_exports.number(),
48679
+ usdHigh: external_exports.number(),
48680
+ notes: external_exports.array(external_exports.string()).readonly()
48681
+ }).nullable(),
48682
+ /** Pre-filled from the provider's settings; the operator may lower or raise them. */
48683
+ defaults: external_exports.object({
48684
+ maxCostUsd: external_exports.number(),
48685
+ maxRuntimeSec: external_exports.number().int()
48686
+ }).nullable(),
48687
+ /** The sentence the confirm dialog repeats: where the frames go and when they are deleted. */
48688
+ dataNotice: external_exports.string()
48689
+ });
48690
+ var TrainingJobStateSchema = external_exports.enum([
48691
+ "queued",
48692
+ "uploading",
48693
+ "submitted",
48694
+ "starting",
48695
+ "running",
48696
+ "collecting",
48697
+ "ready",
48698
+ "registered",
48699
+ "canary",
48700
+ "failed",
48701
+ "cancelling",
48702
+ "cancelled",
48703
+ "lost",
48704
+ "expired",
48705
+ "discarded"
48706
+ ]);
48707
+ var TrainingFailureReasonSchema = external_exports.enum([
48708
+ "cost-cap",
48709
+ "runtime-cap",
48710
+ "upload-failed",
48711
+ "submit-failed",
48712
+ "trainer-failed",
48713
+ "result-invalid",
48714
+ "checksum-mismatch",
48715
+ "fetch-failed",
48716
+ "provider-error",
48717
+ "hub-restart-during-upload"
48718
+ ]);
48719
+ var TrainingProgressPointSchema = external_exports.object({
48720
+ epoch: external_exports.number().int(),
48721
+ map50: external_exports.number().nullable(),
48722
+ map50_95: external_exports.number().nullable()
48723
+ });
48724
+ var TrainingCanarySchema = external_exports.object({
48725
+ deviceIds: external_exports.array(external_exports.number().int()).readonly(),
48726
+ since: external_exports.number(),
48727
+ /** Every override the canary replaced, exactly, so rollback restores it. */
48728
+ previous: external_exports.array(external_exports.object({
48729
+ deviceId: external_exports.number().int(),
48730
+ nodeId: external_exports.string(),
48731
+ deviceKey: external_exports.string(),
48732
+ patch: external_exports.object({
48733
+ modelId: external_exports.string().optional(),
48734
+ settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
48735
+ }).nullable()
48736
+ })).readonly()
48737
+ });
48738
+ var TrainingJobSchema = external_exports.object({
48739
+ id: external_exports.string(),
48740
+ idempotencyKey: external_exports.string(),
48741
+ name: external_exports.string(),
48742
+ createdAt: external_exports.number(),
48743
+ updatedAt: external_exports.number(),
48744
+ state: TrainingJobStateSchema,
48745
+ /**
48746
+ * Shared by every job enqueued together via `startJobBatch`.
48747
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
48748
+ */
48749
+ batchId: external_exports.string().nullable().default(null),
48750
+ stage: TrainingStageSchema.nullable(),
48751
+ failure: external_exports.object({
48752
+ reason: TrainingFailureReasonSchema,
48753
+ stage: external_exports.string().nullable(),
48754
+ detail: external_exports.string()
48755
+ }).nullable(),
48756
+ request: TrainingJobRequestSchema,
48757
+ maxCostUsd: external_exports.number().nonnegative(),
48758
+ maxRuntimeSec: external_exports.number().int().positive(),
48759
+ trainer: TrainerSourceRefSchema,
48760
+ datasetLayout: RetrainExportLayoutSchema,
48761
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
48762
+ frameCount: external_exports.number().int().nonnegative(),
48763
+ /** Resolved frame ids at start — the archive ships exactly these. */
48764
+ frameIds: external_exports.array(external_exports.string()).max(2e4).readonly(),
48765
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
48766
+ annotationHash: external_exports.string(),
48767
+ dataset: external_exports.object({
48768
+ bytes: external_exports.number().int(),
48769
+ sha256: external_exports.string(),
48770
+ uploadedAt: external_exports.number()
48771
+ }).nullable(),
48772
+ split: TrainingSplitPlanSchema,
48773
+ provider: external_exports.object({
48774
+ state: ProviderJobStateSchema.nullable(),
48775
+ providerJobId: external_exports.string().nullable(),
48776
+ startedAt: external_exports.number().nullable(),
48777
+ endedAt: external_exports.number().nullable(),
48778
+ billedSeconds: external_exports.number(),
48779
+ costUsd: external_exports.number(),
48780
+ costIsEstimate: external_exports.boolean(),
48781
+ lastPolledAt: external_exports.number().nullable()
48782
+ }),
48783
+ progress: external_exports.object({
48784
+ epoch: external_exports.number().int().nullable(),
48785
+ epochs: external_exports.number().int().nullable(),
48786
+ etaSec: external_exports.number().nullable(),
48787
+ series: external_exports.array(TrainingProgressPointSchema).readonly()
48788
+ }),
48789
+ /** The last lines of the job's output (≤ 200), newest last. Never frame paths. */
48790
+ logTail: external_exports.array(external_exports.string()).readonly(),
48791
+ logCursor: external_exports.string().nullable(),
48792
+ artifacts: external_exports.object({
48793
+ bundleBytes: external_exports.number().int(),
48794
+ bundleSha256: external_exports.string(),
48795
+ fetchedAt: external_exports.number(),
48796
+ /** When the staged artefacts are deleted from the hub. */
48797
+ expiresAt: external_exports.number()
48798
+ }).nullable(),
48799
+ /** When the provider-side copy of the frames was deleted; null while it exists. */
48800
+ cloudDatasetDeletedAt: external_exports.number().nullable(),
48801
+ /** A failed job's dataset is kept until then (the provider's grace), then deleted. */
48802
+ cloudCleanupDueAt: external_exports.number().nullable(),
48803
+ /** Model ids registered from this job (base, and int8 when kept). */
48804
+ registeredModelIds: external_exports.array(external_exports.string()).readonly(),
48805
+ canary: TrainingCanarySchema.nullable()
48806
+ });
48807
+ var IdInput = external_exports.object({ id: external_exports.string().min(1) });
48808
+ var trainingCapability = {
48809
+ name: "training",
48810
+ scope: "system",
48811
+ mode: "singleton",
48812
+ mount: { kind: "hub-only" },
48813
+ methods: {
48814
+ listBaseModels: method(external_exports.object({}), external_exports.array(TrainingBaseModelSchema).readonly(), { auth: "admin" }),
48815
+ /** Split, estimate, defaults and any named refusal — nothing is started. */
48816
+ planJob: method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
48817
+ auth: "admin",
48818
+ timeoutMs: 6e4
48819
+ }),
48820
+ /**
48821
+ * Start a job. The same `idempotencyKey` returns the job it already
48822
+ * started. Answers at once (`uploading`); the upload and the submit run in
48823
+ * the background and the job record says how far they got.
48824
+ */
48825
+ startJob: method(TrainingJobRequestSchema.extend({
48826
+ name: external_exports.string().min(1).max(120),
48827
+ maxCostUsd: external_exports.number().positive(),
48828
+ maxRuntimeSec: external_exports.number().int().positive(),
48829
+ idempotencyKey: external_exports.string().min(8).max(80)
48830
+ }), external_exports.discriminatedUnion("kind", [external_exports.object({
48831
+ kind: external_exports.literal("started"),
48832
+ job: TrainingJobSchema
48833
+ }), external_exports.object({
48834
+ kind: external_exports.literal("refused"),
48835
+ reason: TrainingRefusalReasonSchema,
48836
+ detail: external_exports.string()
48837
+ })]), {
48838
+ kind: "mutation",
48839
+ auth: "admin",
48840
+ timeoutMs: 12e4
48841
+ }),
48842
+ /**
48843
+ * Enqueue one job per base model (same selection, entry, caps). The first
48844
+ * becomes `uploading`; the rest stay `queued` until the prior job settles.
48845
+ * One ACTIVE job at a time — a parallel `startJob` still gets
48846
+ * `job-already-running`. The same `idempotencyKey` returns the batch it
48847
+ * already started.
48848
+ */
48849
+ startJobBatch: method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
48850
+ baseModelIds: external_exports.array(external_exports.string().min(1)).min(1),
48851
+ name: external_exports.string().min(1).max(120),
48852
+ maxCostUsd: external_exports.number().positive(),
48853
+ maxRuntimeSec: external_exports.number().int().positive(),
48854
+ idempotencyKey: external_exports.string().min(8).max(80)
48855
+ }), external_exports.discriminatedUnion("kind", [external_exports.object({
48856
+ kind: external_exports.literal("started"),
48857
+ batchId: external_exports.string(),
48858
+ jobs: external_exports.array(TrainingJobSchema).min(1).readonly()
48859
+ }), external_exports.object({
48860
+ kind: external_exports.literal("refused"),
48861
+ reason: TrainingRefusalReasonSchema,
48862
+ detail: external_exports.string()
48863
+ })]), {
48864
+ kind: "mutation",
48865
+ auth: "admin",
48866
+ timeoutMs: 12e4
48867
+ }),
48868
+ listJobs: method(external_exports.object({}), external_exports.array(TrainingJobSchema).readonly(), { auth: "admin" }),
48869
+ getJob: method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }),
48870
+ cancelJob: method(IdInput, TrainingJobSchema, {
48871
+ kind: "mutation",
48872
+ auth: "admin",
48873
+ timeoutMs: 12e4
48874
+ }),
48875
+ /** The verified `result.json` of a job in `ready` or later; null before. */
48876
+ getJobResult: method(IdInput, TrainingResultSchema.nullable(), { auth: "admin" }),
48877
+ /** Hand the verified bundle to Model Studio; optionally canary right after. */
48878
+ registerResult: method(IdInput.extend({ canaryDeviceIds: external_exports.array(external_exports.number().int()).readonly() }), TrainingJobSchema, {
48879
+ kind: "mutation",
48880
+ auth: "admin",
48881
+ timeoutMs: 30 * 6e4
48882
+ }),
48883
+ /** Pin the registered model on these cameras, remembering what it replaced. */
48884
+ canaryResult: method(IdInput.extend({ deviceIds: external_exports.array(external_exports.number().int()).min(1).readonly() }), TrainingJobSchema, {
48885
+ kind: "mutation",
48886
+ auth: "admin",
48887
+ timeoutMs: 12e4
48888
+ }),
48889
+ /** Put every canary camera back exactly as it was. */
48890
+ rollbackCanary: method(IdInput, TrainingJobSchema, {
48891
+ kind: "mutation",
48892
+ auth: "admin",
48893
+ timeoutMs: 12e4
48894
+ }),
48895
+ /** Delete the staged artefacts of an unregistered result. */
48896
+ discardResult: method(IdInput, TrainingJobSchema, {
48897
+ kind: "mutation",
48898
+ auth: "admin"
48899
+ })
48900
+ }
48901
+ };
47818
48902
  var PIPELINE_FLOW_CAPABILITY_NAMES = [
47819
48903
  "decoder",
47820
48904
  "motion-detection",
@@ -48694,6 +49778,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
48694
49778
  addonId: null,
48695
49779
  access: "create"
48696
49780
  },
49781
+ "backup.checkBackupKey": {
49782
+ capName: "backup",
49783
+ capScope: "system",
49784
+ addonId: null,
49785
+ access: "create"
49786
+ },
48697
49787
  "backup.delete": {
48698
49788
  capName: "backup",
48699
49789
  capScope: "system",
@@ -48706,6 +49796,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
48706
49796
  addonId: null,
48707
49797
  access: "delete"
48708
49798
  },
49799
+ "backup.disableEncryption": {
49800
+ capName: "backup",
49801
+ capScope: "system",
49802
+ addonId: null,
49803
+ access: "create"
49804
+ },
49805
+ "backup.getEncryption": {
49806
+ capName: "backup",
49807
+ capScope: "system",
49808
+ addonId: null,
49809
+ access: "view"
49810
+ },
48709
49811
  "backup.getEntries": {
48710
49812
  capName: "backup",
48711
49813
  capScope: "system",
@@ -48760,6 +49862,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
48760
49862
  addonId: null,
48761
49863
  access: "create"
48762
49864
  },
49865
+ "backup.setupEncryption": {
49866
+ capName: "backup",
49867
+ capScope: "system",
49868
+ addonId: null,
49869
+ access: "create"
49870
+ },
48763
49871
  "backup.trigger": {
48764
49872
  capName: "backup",
48765
49873
  capScope: "system",
@@ -49312,6 +50420,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
49312
50420
  addonId: null,
49313
50421
  access: "create"
49314
50422
  },
50423
+ "customModelRegistry.importModelBundle": {
50424
+ capName: "custom-model-registry",
50425
+ capScope: "system",
50426
+ addonId: null,
50427
+ access: "create"
50428
+ },
49315
50429
  "customModelRegistry.listModels": {
49316
50430
  capName: "custom-model-registry",
49317
50431
  capScope: "system",
@@ -50752,6 +51866,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50752
51866
  addonId: null,
50753
51867
  access: "view"
50754
51868
  },
51869
+ "keychainAdmin.acknowledgeReset": {
51870
+ capName: "keychain-admin",
51871
+ capScope: "system",
51872
+ addonId: null,
51873
+ access: "create"
51874
+ },
50755
51875
  "keychainAdmin.deleteOrphans": {
50756
51876
  capName: "keychain-admin",
50757
51877
  capScope: "system",
@@ -50788,6 +51908,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
50788
51908
  addonId: null,
50789
51909
  access: "delete"
50790
51910
  },
51911
+ "keychainAdmin.resetReport": {
51912
+ capName: "keychain-admin",
51913
+ capScope: "system",
51914
+ addonId: null,
51915
+ access: "delete"
51916
+ },
50791
51917
  "keychainAdmin.reveal": {
50792
51918
  capName: "keychain-admin",
50793
51919
  capScope: "system",
@@ -52114,6 +53240,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
52114
53240
  addonId: null,
52115
53241
  access: "create"
52116
53242
  },
53243
+ "osdManager.setSlotCameraEnabled": {
53244
+ capName: "osd-manager",
53245
+ capScope: "system",
53246
+ addonId: null,
53247
+ access: "create"
53248
+ },
52117
53249
  "osdManager.upsertTemplate": {
52118
53250
  capName: "osd-manager",
52119
53251
  capScope: "system",
@@ -52252,12 +53384,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52252
53384
  addonId: null,
52253
53385
  access: "create"
52254
53386
  },
52255
- "pipelineAnalytics.createRetrainDatasetVersion": {
52256
- capName: "pipeline-analytics",
52257
- capScope: "device",
52258
- addonId: null,
52259
- access: "create"
52260
- },
52261
53387
  "pipelineAnalytics.deleteDeviceEvents": {
52262
53388
  capName: "pipeline-analytics",
52263
53389
  capScope: "device",
@@ -52270,12 +53396,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52270
53396
  addonId: null,
52271
53397
  access: "delete"
52272
53398
  },
52273
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
52274
- capName: "pipeline-analytics",
52275
- capScope: "device",
52276
- addonId: null,
52277
- access: "delete"
52278
- },
52279
53399
  "pipelineAnalytics.deleteTracks": {
52280
53400
  capName: "pipeline-analytics",
52281
53401
  capScope: "device",
@@ -52378,6 +53498,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
52378
53498
  addonId: null,
52379
53499
  access: "view"
52380
53500
  },
53501
+ "pipelineAnalytics.getRetrainCorpusKpi": {
53502
+ capName: "pipeline-analytics",
53503
+ capScope: "device",
53504
+ addonId: null,
53505
+ access: "view"
53506
+ },
52381
53507
  "pipelineAnalytics.getRetrainExportUrl": {
52382
53508
  capName: "pipeline-analytics",
52383
53509
  capScope: "device",
@@ -52498,7 +53624,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
52498
53624
  addonId: null,
52499
53625
  access: "view"
52500
53626
  },
52501
- "pipelineAnalytics.listRetrainDatasetVersions": {
53627
+ "pipelineAnalytics.listRetrainCorpusPage": {
52502
53628
  capName: "pipeline-analytics",
52503
53629
  capScope: "device",
52504
53630
  addonId: null,
@@ -52534,23 +53660,23 @@ var METHOD_ACCESS_MAP = Object.freeze({
52534
53660
  addonId: null,
52535
53661
  access: "view"
52536
53662
  },
52537
- "pipelineAnalytics.ownersWithMedia": {
53663
+ "pipelineAnalytics.offerRetrainArchive": {
52538
53664
  capName: "pipeline-analytics",
52539
53665
  capScope: "device",
52540
53666
  addonId: null,
52541
- access: "view"
53667
+ access: "create"
52542
53668
  },
52543
- "pipelineAnalytics.pauseForStorageMigration": {
53669
+ "pipelineAnalytics.ownersWithMedia": {
52544
53670
  capName: "pipeline-analytics",
52545
53671
  capScope: "device",
52546
53672
  addonId: null,
52547
- access: "create"
53673
+ access: "view"
52548
53674
  },
52549
- "pipelineAnalytics.previewRetrainDataset": {
53675
+ "pipelineAnalytics.pauseForStorageMigration": {
52550
53676
  capName: "pipeline-analytics",
52551
53677
  capScope: "device",
52552
53678
  addonId: null,
52553
- access: "view"
53679
+ access: "create"
52554
53680
  },
52555
53681
  "pipelineAnalytics.proposeRetrainAnnotations": {
52556
53682
  capName: "pipeline-analytics",
@@ -52630,6 +53756,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
52630
53756
  addonId: null,
52631
53757
  access: "create"
52632
53758
  },
53759
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
53760
+ capName: "pipeline-analytics",
53761
+ capScope: "device",
53762
+ addonId: null,
53763
+ access: "view"
53764
+ },
52633
53765
  "pipelineAnalytics.restageRetrainTrack": {
52634
53766
  capName: "pipeline-analytics",
52635
53767
  capScope: "device",
@@ -52690,12 +53822,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
52690
53822
  addonId: null,
52691
53823
  access: "create"
52692
53824
  },
52693
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
52694
- capName: "pipeline-analytics",
52695
- capScope: "device",
52696
- addonId: null,
52697
- access: "view"
52698
- },
52699
53825
  "pipelineAnalytics.wipeAllAnalytics": {
52700
53826
  capName: "pipeline-analytics",
52701
53827
  capScope: "device",
@@ -55072,6 +56198,180 @@ var METHOD_ACCESS_MAP = Object.freeze({
55072
56198
  addonId: null,
55073
56199
  access: "view"
55074
56200
  },
56201
+ "training.canaryResult": {
56202
+ capName: "training",
56203
+ capScope: "system",
56204
+ addonId: null,
56205
+ access: "create"
56206
+ },
56207
+ "training.cancelJob": {
56208
+ capName: "training",
56209
+ capScope: "system",
56210
+ addonId: null,
56211
+ access: "create"
56212
+ },
56213
+ "training.discardResult": {
56214
+ capName: "training",
56215
+ capScope: "system",
56216
+ addonId: null,
56217
+ access: "create"
56218
+ },
56219
+ "training.getJob": {
56220
+ capName: "training",
56221
+ capScope: "system",
56222
+ addonId: null,
56223
+ access: "view"
56224
+ },
56225
+ "training.getJobResult": {
56226
+ capName: "training",
56227
+ capScope: "system",
56228
+ addonId: null,
56229
+ access: "view"
56230
+ },
56231
+ "training.listBaseModels": {
56232
+ capName: "training",
56233
+ capScope: "system",
56234
+ addonId: null,
56235
+ access: "view"
56236
+ },
56237
+ "training.listJobs": {
56238
+ capName: "training",
56239
+ capScope: "system",
56240
+ addonId: null,
56241
+ access: "view"
56242
+ },
56243
+ "training.planJob": {
56244
+ capName: "training",
56245
+ capScope: "system",
56246
+ addonId: null,
56247
+ access: "view"
56248
+ },
56249
+ "training.registerResult": {
56250
+ capName: "training",
56251
+ capScope: "system",
56252
+ addonId: null,
56253
+ access: "create"
56254
+ },
56255
+ "training.rollbackCanary": {
56256
+ capName: "training",
56257
+ capScope: "system",
56258
+ addonId: null,
56259
+ access: "create"
56260
+ },
56261
+ "training.startJob": {
56262
+ capName: "training",
56263
+ capScope: "system",
56264
+ addonId: null,
56265
+ access: "create"
56266
+ },
56267
+ "training.startJobBatch": {
56268
+ capName: "training",
56269
+ capScope: "system",
56270
+ addonId: null,
56271
+ access: "create"
56272
+ },
56273
+ "trainingProvider.cancelJob": {
56274
+ capName: "training-provider",
56275
+ capScope: "system",
56276
+ addonId: null,
56277
+ access: "create"
56278
+ },
56279
+ "trainingProvider.cleanupJob": {
56280
+ capName: "training-provider",
56281
+ capScope: "system",
56282
+ addonId: null,
56283
+ access: "create"
56284
+ },
56285
+ "trainingProvider.createEntry": {
56286
+ capName: "training-provider",
56287
+ capScope: "system",
56288
+ addonId: null,
56289
+ access: "create"
56290
+ },
56291
+ "trainingProvider.deleteEntry": {
56292
+ capName: "training-provider",
56293
+ capScope: "system",
56294
+ addonId: null,
56295
+ access: "delete"
56296
+ },
56297
+ "trainingProvider.describe": {
56298
+ capName: "training-provider",
56299
+ capScope: "system",
56300
+ addonId: null,
56301
+ access: "view"
56302
+ },
56303
+ "trainingProvider.describeTypes": {
56304
+ capName: "training-provider",
56305
+ capScope: "system",
56306
+ addonId: null,
56307
+ access: "view"
56308
+ },
56309
+ "trainingProvider.estimateJob": {
56310
+ capName: "training-provider",
56311
+ capScope: "system",
56312
+ addonId: null,
56313
+ access: "view"
56314
+ },
56315
+ "trainingProvider.getJob": {
56316
+ capName: "training-provider",
56317
+ capScope: "system",
56318
+ addonId: null,
56319
+ access: "view"
56320
+ },
56321
+ "trainingProvider.listEntries": {
56322
+ capName: "training-provider",
56323
+ capScope: "system",
56324
+ addonId: null,
56325
+ access: "view"
56326
+ },
56327
+ "trainingProvider.listJobEvents": {
56328
+ capName: "training-provider",
56329
+ capScope: "system",
56330
+ addonId: null,
56331
+ access: "view"
56332
+ },
56333
+ "trainingProvider.listJobs": {
56334
+ capName: "training-provider",
56335
+ capScope: "system",
56336
+ addonId: null,
56337
+ access: "view"
56338
+ },
56339
+ "trainingProvider.offerArtifact": {
56340
+ capName: "training-provider",
56341
+ capScope: "system",
56342
+ addonId: null,
56343
+ access: "create"
56344
+ },
56345
+ "trainingProvider.readResult": {
56346
+ capName: "training-provider",
56347
+ capScope: "system",
56348
+ addonId: null,
56349
+ access: "create"
56350
+ },
56351
+ "trainingProvider.submitJob": {
56352
+ capName: "training-provider",
56353
+ capScope: "system",
56354
+ addonId: null,
56355
+ access: "create"
56356
+ },
56357
+ "trainingProvider.updateEntry": {
56358
+ capName: "training-provider",
56359
+ capScope: "system",
56360
+ addonId: null,
56361
+ access: "create"
56362
+ },
56363
+ "trainingProvider.uploadDataset": {
56364
+ capName: "training-provider",
56365
+ capScope: "system",
56366
+ addonId: null,
56367
+ access: "create"
56368
+ },
56369
+ "trainingProvider.validateCredentials": {
56370
+ capName: "training-provider",
56371
+ capScope: "system",
56372
+ addonId: null,
56373
+ access: "create"
56374
+ },
55075
56375
  "turnProvider.getTurnServers": {
55076
56376
  capName: "turn-provider",
55077
56377
  capScope: "system",
@@ -55096,12 +56396,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
55096
56396
  addonId: null,
55097
56397
  access: "create"
55098
56398
  },
55099
- "userManagement.createApiKey": {
55100
- capName: "user-management",
55101
- capScope: "system",
55102
- addonId: null,
55103
- access: "create"
55104
- },
55105
56399
  "userManagement.createScopedToken": {
55106
56400
  capName: "user-management",
55107
56401
  capScope: "system",
@@ -55138,12 +56432,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
55138
56432
  addonId: null,
55139
56433
  access: "view"
55140
56434
  },
55141
- "userManagement.linkExternalIdentity": {
55142
- capName: "user-management",
55143
- capScope: "system",
55144
- addonId: null,
55145
- access: "create"
55146
- },
55147
56435
  "userManagement.listApiKeys": {
55148
56436
  capName: "user-management",
55149
56437
  capScope: "system",
@@ -55246,12 +56534,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
55246
56534
  addonId: null,
55247
56535
  access: "create"
55248
56536
  },
55249
- "userManagement.validateApiKey": {
55250
- capName: "user-management",
55251
- capScope: "system",
55252
- addonId: null,
55253
- access: "view"
55254
- },
55255
56537
  "userManagement.validateCredentials": {
55256
56538
  capName: "user-management",
55257
56539
  capScope: "system",
@@ -58326,6 +59608,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
58326
59608
  form: "single",
58327
59609
  optional: false
58328
59610
  }],
59611
+ "osdManager.setSlotCameraEnabled": [{
59612
+ name: "deviceId",
59613
+ form: "single",
59614
+ optional: false
59615
+ }],
58329
59616
  "petFeeder.callPet": [{
58330
59617
  name: "deviceId",
58331
59618
  form: "single",
@@ -58546,6 +59833,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
58546
59833
  form: "array",
58547
59834
  optional: false
58548
59835
  }],
59836
+ "pipelineAnalytics.listRetrainCorpusPage": [{
59837
+ name: "deviceIds",
59838
+ form: "array",
59839
+ optional: true
59840
+ }],
58549
59841
  "pipelineAnalytics.listRetrainStaging": [{
58550
59842
  name: "deviceIds",
58551
59843
  form: "array",
@@ -59407,6 +60699,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
59407
60699
  form: "single",
59408
60700
  optional: false
59409
60701
  }],
60702
+ "training.canaryResult": [{
60703
+ name: "deviceIds",
60704
+ form: "array",
60705
+ optional: false
60706
+ }],
59410
60707
  "update.getStatus": [{
59411
60708
  name: "deviceId",
59412
60709
  form: "single",
@@ -59650,6 +60947,7 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
59650
60947
  });
59651
60948
  var CAP_PROVIDER_KIND_MAP = Object.freeze({
59652
60949
  "broker": "broker",
60950
+ "calendar-source": "calendar",
59653
60951
  "device-export": "device-export",
59654
60952
  "llm": "ai",
59655
60953
  "mesh-network": "mesh",
@@ -60377,6 +61675,26 @@ var NC_TEMPLATE_VARS = [
60377
61675
  "server-updated"
60378
61676
  ]
60379
61677
  },
61678
+ {
61679
+ name: "nodeName",
61680
+ label: "Node name",
61681
+ example: "little-unraid",
61682
+ group: "system",
61683
+ families: ["rule"],
61684
+ fields: [...RULE_TEXT],
61685
+ kinds: ["system"],
61686
+ systemEventKinds: ["node-online", "node-offline"]
61687
+ },
61688
+ {
61689
+ name: "offlineFor",
61690
+ label: "Offline for",
61691
+ example: "44 min",
61692
+ group: "system",
61693
+ families: ["rule"],
61694
+ fields: [...RULE_TEXT],
61695
+ kinds: ["system"],
61696
+ systemEventKinds: ["node-online"]
61697
+ },
60380
61698
  {
60381
61699
  name: "devices",
60382
61700
  label: "Devices",
@@ -60663,7 +61981,7 @@ var NC_TEMPLATE_VARS = [
60663
61981
  {
60664
61982
  name: "skipped",
60665
61983
  label: "Skipped count",
60666
- description: "How many named devices the mode cannot arm \u2014 muted, detection off, offline (title: m saltati).",
61984
+ description: "How many named devices the mode cannot arm \u2014 muted, detection off, offline, or Arm-anyway exclusions (title: m saltati).",
60667
61985
  example: "1",
60668
61986
  group: "system",
60669
61987
  families: ["rule"],