camstack 1.2.182 → 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-r3RWkGVx.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",
@@ -25151,14 +25164,14 @@ var LlmProfileSchema = external_exports.object({
25151
25164
  */
25152
25165
  appleFoundation: external_exports.object({ nodeId: external_exports.string() }).optional()
25153
25166
  });
25154
- var ConfigSchemaPassthrough$1 = external_exports.unknown();
25167
+ var ConfigSchemaPassthrough$2 = external_exports.unknown();
25155
25168
  var LlmProfileKindDescriptorSchema = external_exports.object({
25156
25169
  kind: LlmProfileKindSchema,
25157
25170
  label: external_exports.string(),
25158
25171
  icon: external_exports.string(),
25159
25172
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
25160
25173
  addonId: external_exports.string(),
25161
- configSchema: ConfigSchemaPassthrough$1
25174
+ configSchema: ConfigSchemaPassthrough$2
25162
25175
  });
25163
25176
  var LlmDefaultSelectorSchema = external_exports.union([external_exports.object({ consumer: external_exports.string() }), external_exports.object({ purpose: external_exports.enum(["text", "vision"]) })]);
25164
25177
  var LlmDefaultSchema = external_exports.object({
@@ -26261,7 +26274,7 @@ var TargetKindCapsSchema = external_exports.object({
26261
26274
  ttl: external_exports.boolean(),
26262
26275
  bodyMaxLen: external_exports.number().int().positive()
26263
26276
  });
26264
- var ConfigSchemaPassthrough = external_exports.unknown();
26277
+ var ConfigSchemaPassthrough$1 = external_exports.unknown();
26265
26278
  var TargetKindSchema = external_exports.object({
26266
26279
  kind: external_exports.string(),
26267
26280
  label: external_exports.string(),
@@ -26298,7 +26311,7 @@ var TargetKindSchema = external_exports.object({
26298
26311
  * its raster path, which is the safe default for an unknown image.
26299
26312
  */
26300
26313
  iconMediaType: external_exports.string().optional(),
26301
- configSchema: ConfigSchemaPassthrough,
26314
+ configSchema: ConfigSchemaPassthrough$1,
26302
26315
  /**
26303
26316
  * The config keys that decide WHERE this kind's secrets are sent (server,
26304
26317
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -30002,17 +30015,58 @@ var RetrainFrameListSchema = external_exports.object({
30002
30015
  /** What the page pre-selects — the native key frame when one survives. */
30003
30016
  autoPickMediaId: external_exports.number().int().optional()
30004
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
+ });
30005
30056
  var RetrainExportFilterSchema = external_exports.object({
30006
30057
  deviceIds: external_exports.array(external_exports.number()).optional(),
30007
30058
  frameIds: external_exports.array(external_exports.string()).max(2e4).optional(),
30008
30059
  /** Only frames in at least one of these named collections. */
30009
30060
  collectionIds: external_exports.array(external_exports.string()).max(200).optional(),
30010
- /** Exactly the frames of this dataset version (and its completeOnly). An
30011
- * unknown id selects nothing. */
30012
- datasetVersionId: external_exports.string().optional(),
30061
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
30062
+ collectionId: external_exports.string().optional(),
30013
30063
  batchId: external_exports.string().optional(),
30014
30064
  /** Only frames the operator marked complete (all subjects boxed). */
30015
- 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()
30016
30070
  });
30017
30071
  var RetrainExportLayoutSchema = external_exports.enum(["frames", "crops"]);
30018
30072
  var RetrainArchiveTargetSchema = external_exports.object({
@@ -30185,22 +30239,28 @@ var RetrainDatasetVersionSchema = external_exports.object({
30185
30239
  layout: RetrainExportLayoutSchema,
30186
30240
  completeOnly: external_exports.boolean(),
30187
30241
  frameCount: external_exports.number().int(),
30188
- /** sha256 of what the frames taught when the version was frozen. */
30189
30242
  annotationHash: external_exports.string(),
30190
- /** The export manifest schema the version was cut under. */
30191
30243
  manifestSchema: external_exports.string(),
30192
30244
  stats: RetrainDatasetStatsSchema
30193
30245
  });
30194
- var CreateRetrainDatasetVersionResultSchema = external_exports.discriminatedUnion("kind", [external_exports.object({
30195
- kind: external_exports.literal("created"),
30196
- 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
30197
30260
  }), external_exports.object({
30198
30261
  kind: external_exports.literal("refused"),
30199
- reason: external_exports.enum([
30200
- "empty-name",
30201
- "duplicate-name",
30202
- "no-frames"
30203
- ])
30262
+ reason: external_exports.enum(["unknown-collection", "no-frames"]),
30263
+ detail: external_exports.string()
30204
30264
  })]);
30205
30265
  var RetrainTransitionResultSchema = external_exports.object({
30206
30266
  trackId: external_exports.string(),
@@ -31221,6 +31281,26 @@ var pipelineAnalyticsCapability = {
31221
31281
  auth: "admin"
31222
31282
  }),
31223
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
+ /**
31224
31304
  * What a track can contribute, and what it already has.
31225
31305
  *
31226
31306
  * `candidates` are the track's whole, unannotated frames — index rows only,
@@ -31447,53 +31527,6 @@ var pipelineAnalyticsCapability = {
31447
31527
  auth: "admin",
31448
31528
  timeoutMs: 12e4
31449
31529
  }),
31450
- /** The counts a selection would freeze — class × camera × day/night,
31451
- * completeness — without freezing anything. Index reads only. */
31452
- previewRetrainDataset: method(external_exports.object({
31453
- selection: RetrainDatasetSelectionSchema,
31454
- completeOnly: external_exports.boolean().optional()
31455
- }), RetrainDatasetStatsSchema, {
31456
- kind: "query",
31457
- auth: "admin"
31458
- }),
31459
- /**
31460
- * Freeze a dataset version: the frames the selection yields (the same plan
31461
- * the annotated export builds), the hash of what they teach, the export
31462
- * parameters and the counts. Immutable — a different selection is a new
31463
- * version. Export it with `getRetrainExportUrl({ datasetVersionId })`.
31464
- */
31465
- createRetrainDatasetVersion: method(external_exports.object({
31466
- name: external_exports.string().max(120),
31467
- selection: RetrainDatasetSelectionSchema,
31468
- layout: RetrainExportLayoutSchema,
31469
- completeOnly: external_exports.boolean()
31470
- }), CreateRetrainDatasetVersionResultSchema, {
31471
- kind: "mutation",
31472
- auth: "admin",
31473
- timeoutMs: 12e4
31474
- }),
31475
- /** Every dataset version, newest first. */
31476
- listRetrainDatasetVersions: method(external_exports.object({}), external_exports.array(RetrainDatasetVersionSchema).readonly(), {
31477
- kind: "query",
31478
- auth: "admin"
31479
- }),
31480
- /** Delete a version. Its frames stay in the dataset. */
31481
- deleteRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({ deleted: external_exports.boolean() }), {
31482
- kind: "mutation",
31483
- auth: "admin"
31484
- }),
31485
- /** Does the corpus still teach what the version froze? `missingFrames`
31486
- * counts frames that left the dataset (or lost every box and tick). */
31487
- verifyRetrainDatasetVersion: method(external_exports.object({ id: external_exports.string() }), external_exports.object({
31488
- found: external_exports.boolean(),
31489
- annotationHash: external_exports.string(),
31490
- matches: external_exports.boolean(),
31491
- missingFrames: external_exports.number().int()
31492
- }), {
31493
- kind: "query",
31494
- auth: "admin",
31495
- timeoutMs: 12e4
31496
- }),
31497
31530
  /** The enabled, vision-capable LLM profiles, each saying whether a frame
31498
31531
  * sent to it leaves the house. */
31499
31532
  listRetrainAssistProfiles: method(external_exports.object({}), external_exports.array(RetrainAssistProfileSchema).readonly(), {
@@ -31540,6 +31573,16 @@ var pipelineAnalyticsCapability = {
31540
31573
  kind: "query",
31541
31574
  auth: "admin"
31542
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
+ }),
31543
31586
  renameRetrainCollection: method(external_exports.object({
31544
31587
  id: external_exports.string(),
31545
31588
  name: external_exports.string().max(120)
@@ -32445,11 +32488,14 @@ var HardwareClassIdSchema = external_exports.enum([
32445
32488
  "intel-n-series",
32446
32489
  "apple-m-base",
32447
32490
  "apple-m-pro",
32491
+ "amd-phoenix",
32448
32492
  "unknown"
32449
32493
  ]);
32450
32494
  var AcceleratorKindSchema = external_exports.enum([
32451
32495
  "intel-npu",
32452
32496
  "intel-igpu",
32497
+ "amd-igpu",
32498
+ "amd-npu",
32453
32499
  "x86-cpu",
32454
32500
  "arm-cpu",
32455
32501
  "apple-ane",
@@ -34375,6 +34421,8 @@ var AgentPipelineSettingsSchema = external_exports.object({
34375
34421
  * address is wrong (multi-homed host, NAT, custom interface).
34376
34422
  */
34377
34423
  reachableHost: external_exports.string().optional(),
34424
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
34425
+ color: NodeColorIdSchema.optional(),
34378
34426
  /**
34379
34427
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
34380
34428
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -35011,8 +35059,9 @@ var pipelineOrchestratorCapability = {
35011
35059
  */
35012
35060
  setAgentReachableHost: method(external_exports.object({
35013
35061
  agentNodeId: external_exports.string(),
35014
- reachableHost: external_exports.string().nullable()
35015
- }), 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) }), {
35016
35065
  kind: "mutation",
35017
35066
  auth: "admin"
35018
35067
  }),
@@ -38507,7 +38556,13 @@ var addonsCapability = {
38507
38556
  mode: "singleton",
38508
38557
  nodeIdMode: "data",
38509
38558
  methods: {
38510
- 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()),
38511
38566
  getLogs: method(external_exports.object({
38512
38567
  addonId: external_exports.string(),
38513
38568
  limit: external_exports.number().min(1).max(500).default(100),
@@ -39299,6 +39354,7 @@ var calendarSourceCapability = {
39299
39354
  scope: "system",
39300
39355
  mode: "collection",
39301
39356
  internal: true,
39357
+ providerKind: "calendar",
39302
39358
  methods: {
39303
39359
  listCalendars: method(external_exports.void(), external_exports.array(CalendarInfoSchema).readonly(), { auth: "admin" }),
39304
39360
  listEvents: method(CalendarListEventsInputSchema, external_exports.array(CalendarEventSchema).readonly(), { auth: "admin" })
@@ -43134,7 +43190,13 @@ var TopologyNodeSchema = external_exports.object({
43134
43190
  })).readonly(),
43135
43191
  processes: external_exports.array(TopologyProcessSchema).readonly(),
43136
43192
  categories: external_exports.array(TopologyCategorySchema).readonly(),
43137
- 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()
43138
43200
  });
43139
43201
  var CapUsageEdgeSchema = external_exports.object({
43140
43202
  callerAddonId: external_exports.string(),
@@ -43559,6 +43621,7 @@ var OsdNamedTemplateSchema = external_exports.object({
43559
43621
  parser: external_exports.string().max(256).default("")
43560
43622
  });
43561
43623
  var OsdSourceSchema = external_exports.discriminatedUnion("kind", [
43624
+ external_exports.object({ kind: external_exports.literal("none") }),
43562
43625
  external_exports.object({
43563
43626
  kind: external_exports.literal("static"),
43564
43627
  text: external_exports.string().max(64)
@@ -43706,6 +43769,19 @@ var osdManagerCapability = {
43706
43769
  auth: "admin"
43707
43770
  }),
43708
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
+ /**
43709
43785
  * Replace one camera's binding configuration from another. Writable source
43710
43786
  * slots are mapped by ordinal onto writable target slots so different
43711
43787
  * provider slot ids do not make the copied configuration disappear.
@@ -44168,7 +44244,15 @@ var GpuInfoSchema = external_exports.object({
44168
44244
  name: external_exports.string(),
44169
44245
  memoryMB: external_exports.number().optional()
44170
44246
  });
44171
- 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
+ });
44172
44256
  var CoralInfoSchema = external_exports.object({
44173
44257
  type: external_exports.literal("coral-edgetpu"),
44174
44258
  bus: external_exports.string().optional()
@@ -48256,9 +48340,37 @@ var TrainingProviderDefaultsSchema = external_exports.object({
48256
48340
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
48257
48341
  failedDatasetGraceHours: external_exports.number().nonnegative()
48258
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
+ });
48259
48366
  var TrainingProviderDescriptorSchema = external_exports.object({
48260
48367
  addonId: external_exports.string(),
48261
- /** `modal`, `runpod`, `fake`, … */
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. */
48262
48374
  kind: external_exports.string(),
48263
48375
  label: external_exports.string(),
48264
48376
  gpuTypes: external_exports.array(TrainingGpuOptionSchema).readonly(),
@@ -48270,7 +48382,25 @@ var TrainingProviderDescriptorSchema = external_exports.object({
48270
48382
  dataResidencyNote: external_exports.string(),
48271
48383
  /** Credentials are present — never the values. */
48272
48384
  configured: external_exports.boolean(),
48273
- defaults: TrainingProviderDefaultsSchema
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()
48274
48404
  });
48275
48405
  var TrainingCredentialCheckSchema = external_exports.object({
48276
48406
  ok: external_exports.boolean(),
@@ -48317,7 +48447,7 @@ var TrainerSourceRefSchema = external_exports.object({
48317
48447
  revision: external_exports.string().regex(/^[0-9a-f]{7,64}$/)
48318
48448
  });
48319
48449
  var JobRef = {
48320
- addonId: external_exports.string(),
48450
+ entryId: external_exports.string().min(1),
48321
48451
  jobKey: external_exports.string().uuid()
48322
48452
  };
48323
48453
  var TrainingLogLineSchema = external_exports.object({
@@ -48330,17 +48460,45 @@ var trainingProviderCapability = {
48330
48460
  mode: "collection",
48331
48461
  internal: true,
48332
48462
  methods: {
48333
- /** Every provider's offer and settings. Concat-fans across providers. */
48463
+ /** Every entry's offer and settings. Concat-fans across providers. */
48334
48464
  describe: method(external_exports.object({}), external_exports.array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }),
48335
- /** Call the provider with the stored credentials. Never returns them. */
48336
- validateCredentials: method(external_exports.object({ addonId: external_exports.string() }), TrainingCredentialCheckSchema, {
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, {
48337
48495
  kind: "mutation",
48338
48496
  auth: "admin",
48339
48497
  timeoutMs: 3e4
48340
48498
  }),
48341
48499
  /** USD range for a run of `gpuSeconds` on `gpuType` in `region`. */
48342
48500
  estimateJob: method(external_exports.object({
48343
- addonId: external_exports.string(),
48501
+ entryId: external_exports.string().min(1),
48344
48502
  gpuType: external_exports.string(),
48345
48503
  region: external_exports.string(),
48346
48504
  datasetBytes: external_exports.number().int().nonnegative(),
@@ -48436,14 +48594,25 @@ var trainingProviderCapability = {
48436
48594
  auth: "admin",
48437
48595
  timeoutMs: 5 * 6e4
48438
48596
  }),
48439
- /** Every job the provider can still see — the orphan sweep diffs it against our records. */
48440
- listJobs: method(external_exports.object({ addonId: external_exports.string() }), external_exports.array(ProviderJobStatusSchema).readonly(), {
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(), {
48441
48602
  auth: "admin",
48442
48603
  timeoutMs: 2 * 6e4
48443
48604
  })
48444
48605
  }
48445
48606
  };
48446
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: external_exports.array(external_exports.string()).max(2e4).readonly() });
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
+ });
48447
48616
  var TrainingBaseModelSchema = external_exports.object({
48448
48617
  modelId: external_exports.string(),
48449
48618
  label: external_exports.string(),
@@ -48460,9 +48629,13 @@ var TrainingPresetSchema = external_exports.enum([
48460
48629
  "thorough"
48461
48630
  ]);
48462
48631
  var TrainingJobRequestSchema = external_exports.object({
48463
- datasetVersionId: external_exports.string().min(1),
48464
- /** The `training-provider` addon that runs it. */
48465
- addonId: external_exports.string().min(1),
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),
48466
48639
  gpuType: external_exports.string().min(1),
48467
48640
  region: external_exports.string(),
48468
48641
  baseModelId: external_exports.string().min(1),
@@ -48515,6 +48688,7 @@ var TrainingJobPlanSchema = external_exports.object({
48515
48688
  dataNotice: external_exports.string()
48516
48689
  });
48517
48690
  var TrainingJobStateSchema = external_exports.enum([
48691
+ "queued",
48518
48692
  "uploading",
48519
48693
  "submitted",
48520
48694
  "starting",
@@ -48568,6 +48742,11 @@ var TrainingJobSchema = external_exports.object({
48568
48742
  createdAt: external_exports.number(),
48569
48743
  updatedAt: external_exports.number(),
48570
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),
48571
48750
  stage: TrainingStageSchema.nullable(),
48572
48751
  failure: external_exports.object({
48573
48752
  reason: TrainingFailureReasonSchema,
@@ -48579,6 +48758,12 @@ var TrainingJobSchema = external_exports.object({
48579
48758
  maxRuntimeSec: external_exports.number().int().positive(),
48580
48759
  trainer: TrainerSourceRefSchema,
48581
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(),
48582
48767
  dataset: external_exports.object({
48583
48768
  bytes: external_exports.number().int(),
48584
48769
  sha256: external_exports.string(),
@@ -48626,19 +48811,6 @@ var trainingCapability = {
48626
48811
  mode: "singleton",
48627
48812
  mount: { kind: "hub-only" },
48628
48813
  methods: {
48629
- /** Store a version once. `stored: false` = that id already exists (immutable). */
48630
- putDatasetVersion: method(TrainingDatasetVersionRowSchema, external_exports.object({ stored: external_exports.boolean() }), {
48631
- kind: "mutation",
48632
- auth: "admin"
48633
- }),
48634
- getDatasetVersion: method(IdInput, TrainingDatasetVersionRowSchema.nullable(), { auth: "admin" }),
48635
- /** Every version without its frame list, newest first. */
48636
- listDatasetVersions: method(external_exports.object({}), external_exports.array(RetrainDatasetVersionSchema).readonly(), { auth: "admin" }),
48637
- findDatasetVersionIdByName: method(external_exports.object({ name: external_exports.string() }), external_exports.object({ id: external_exports.string().nullable() }), { auth: "admin" }),
48638
- removeDatasetVersion: method(IdInput, external_exports.object({ removed: external_exports.boolean() }), {
48639
- kind: "mutation",
48640
- auth: "admin"
48641
- }),
48642
48814
  listBaseModels: method(external_exports.object({}), external_exports.array(TrainingBaseModelSchema).readonly(), { auth: "admin" }),
48643
48815
  /** Split, estimate, defaults and any named refusal — nothing is started. */
48644
48816
  planJob: method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
@@ -48667,6 +48839,32 @@ var trainingCapability = {
48667
48839
  auth: "admin",
48668
48840
  timeoutMs: 12e4
48669
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
+ }),
48670
48868
  listJobs: method(external_exports.object({}), external_exports.array(TrainingJobSchema).readonly(), { auth: "admin" }),
48671
48869
  getJob: method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }),
48672
48870
  cancelJob: method(IdInput, TrainingJobSchema, {
@@ -53042,6 +53240,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53042
53240
  addonId: null,
53043
53241
  access: "create"
53044
53242
  },
53243
+ "osdManager.setSlotCameraEnabled": {
53244
+ capName: "osd-manager",
53245
+ capScope: "system",
53246
+ addonId: null,
53247
+ access: "create"
53248
+ },
53045
53249
  "osdManager.upsertTemplate": {
53046
53250
  capName: "osd-manager",
53047
53251
  capScope: "system",
@@ -53180,12 +53384,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
53180
53384
  addonId: null,
53181
53385
  access: "create"
53182
53386
  },
53183
- "pipelineAnalytics.createRetrainDatasetVersion": {
53184
- capName: "pipeline-analytics",
53185
- capScope: "device",
53186
- addonId: null,
53187
- access: "create"
53188
- },
53189
53387
  "pipelineAnalytics.deleteDeviceEvents": {
53190
53388
  capName: "pipeline-analytics",
53191
53389
  capScope: "device",
@@ -53198,12 +53396,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
53198
53396
  addonId: null,
53199
53397
  access: "delete"
53200
53398
  },
53201
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
53202
- capName: "pipeline-analytics",
53203
- capScope: "device",
53204
- addonId: null,
53205
- access: "delete"
53206
- },
53207
53399
  "pipelineAnalytics.deleteTracks": {
53208
53400
  capName: "pipeline-analytics",
53209
53401
  capScope: "device",
@@ -53306,6 +53498,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53306
53498
  addonId: null,
53307
53499
  access: "view"
53308
53500
  },
53501
+ "pipelineAnalytics.getRetrainCorpusKpi": {
53502
+ capName: "pipeline-analytics",
53503
+ capScope: "device",
53504
+ addonId: null,
53505
+ access: "view"
53506
+ },
53309
53507
  "pipelineAnalytics.getRetrainExportUrl": {
53310
53508
  capName: "pipeline-analytics",
53311
53509
  capScope: "device",
@@ -53426,7 +53624,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
53426
53624
  addonId: null,
53427
53625
  access: "view"
53428
53626
  },
53429
- "pipelineAnalytics.listRetrainDatasetVersions": {
53627
+ "pipelineAnalytics.listRetrainCorpusPage": {
53430
53628
  capName: "pipeline-analytics",
53431
53629
  capScope: "device",
53432
53630
  addonId: null,
@@ -53480,12 +53678,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
53480
53678
  addonId: null,
53481
53679
  access: "create"
53482
53680
  },
53483
- "pipelineAnalytics.previewRetrainDataset": {
53484
- capName: "pipeline-analytics",
53485
- capScope: "device",
53486
- addonId: null,
53487
- access: "view"
53488
- },
53489
53681
  "pipelineAnalytics.proposeRetrainAnnotations": {
53490
53682
  capName: "pipeline-analytics",
53491
53683
  capScope: "device",
@@ -53564,6 +53756,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
53564
53756
  addonId: null,
53565
53757
  access: "create"
53566
53758
  },
53759
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
53760
+ capName: "pipeline-analytics",
53761
+ capScope: "device",
53762
+ addonId: null,
53763
+ access: "view"
53764
+ },
53567
53765
  "pipelineAnalytics.restageRetrainTrack": {
53568
53766
  capName: "pipeline-analytics",
53569
53767
  capScope: "device",
@@ -53624,12 +53822,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
53624
53822
  addonId: null,
53625
53823
  access: "create"
53626
53824
  },
53627
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
53628
- capName: "pipeline-analytics",
53629
- capScope: "device",
53630
- addonId: null,
53631
- access: "view"
53632
- },
53633
53825
  "pipelineAnalytics.wipeAllAnalytics": {
53634
53826
  capName: "pipeline-analytics",
53635
53827
  capScope: "device",
@@ -56024,18 +56216,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
56024
56216
  addonId: null,
56025
56217
  access: "create"
56026
56218
  },
56027
- "training.findDatasetVersionIdByName": {
56028
- capName: "training",
56029
- capScope: "system",
56030
- addonId: null,
56031
- access: "view"
56032
- },
56033
- "training.getDatasetVersion": {
56034
- capName: "training",
56035
- capScope: "system",
56036
- addonId: null,
56037
- access: "view"
56038
- },
56039
56219
  "training.getJob": {
56040
56220
  capName: "training",
56041
56221
  capScope: "system",
@@ -56054,12 +56234,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
56054
56234
  addonId: null,
56055
56235
  access: "view"
56056
56236
  },
56057
- "training.listDatasetVersions": {
56058
- capName: "training",
56059
- capScope: "system",
56060
- addonId: null,
56061
- access: "view"
56062
- },
56063
56237
  "training.listJobs": {
56064
56238
  capName: "training",
56065
56239
  capScope: "system",
@@ -56072,54 +56246,66 @@ var METHOD_ACCESS_MAP = Object.freeze({
56072
56246
  addonId: null,
56073
56247
  access: "view"
56074
56248
  },
56075
- "training.putDatasetVersion": {
56249
+ "training.registerResult": {
56076
56250
  capName: "training",
56077
56251
  capScope: "system",
56078
56252
  addonId: null,
56079
56253
  access: "create"
56080
56254
  },
56081
- "training.registerResult": {
56255
+ "training.rollbackCanary": {
56082
56256
  capName: "training",
56083
56257
  capScope: "system",
56084
56258
  addonId: null,
56085
56259
  access: "create"
56086
56260
  },
56087
- "training.removeDatasetVersion": {
56261
+ "training.startJob": {
56088
56262
  capName: "training",
56089
56263
  capScope: "system",
56090
56264
  addonId: null,
56091
- access: "delete"
56265
+ access: "create"
56092
56266
  },
56093
- "training.rollbackCanary": {
56267
+ "training.startJobBatch": {
56094
56268
  capName: "training",
56095
56269
  capScope: "system",
56096
56270
  addonId: null,
56097
56271
  access: "create"
56098
56272
  },
56099
- "training.startJob": {
56100
- capName: "training",
56273
+ "trainingProvider.cancelJob": {
56274
+ capName: "training-provider",
56101
56275
  capScope: "system",
56102
56276
  addonId: null,
56103
56277
  access: "create"
56104
56278
  },
56105
- "trainingProvider.cancelJob": {
56279
+ "trainingProvider.cleanupJob": {
56106
56280
  capName: "training-provider",
56107
56281
  capScope: "system",
56108
56282
  addonId: null,
56109
56283
  access: "create"
56110
56284
  },
56111
- "trainingProvider.cleanupJob": {
56285
+ "trainingProvider.createEntry": {
56112
56286
  capName: "training-provider",
56113
56287
  capScope: "system",
56114
56288
  addonId: null,
56115
56289
  access: "create"
56116
56290
  },
56291
+ "trainingProvider.deleteEntry": {
56292
+ capName: "training-provider",
56293
+ capScope: "system",
56294
+ addonId: null,
56295
+ access: "delete"
56296
+ },
56117
56297
  "trainingProvider.describe": {
56118
56298
  capName: "training-provider",
56119
56299
  capScope: "system",
56120
56300
  addonId: null,
56121
56301
  access: "view"
56122
56302
  },
56303
+ "trainingProvider.describeTypes": {
56304
+ capName: "training-provider",
56305
+ capScope: "system",
56306
+ addonId: null,
56307
+ access: "view"
56308
+ },
56123
56309
  "trainingProvider.estimateJob": {
56124
56310
  capName: "training-provider",
56125
56311
  capScope: "system",
@@ -56132,6 +56318,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56132
56318
  addonId: null,
56133
56319
  access: "view"
56134
56320
  },
56321
+ "trainingProvider.listEntries": {
56322
+ capName: "training-provider",
56323
+ capScope: "system",
56324
+ addonId: null,
56325
+ access: "view"
56326
+ },
56135
56327
  "trainingProvider.listJobEvents": {
56136
56328
  capName: "training-provider",
56137
56329
  capScope: "system",
@@ -56162,6 +56354,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56162
56354
  addonId: null,
56163
56355
  access: "create"
56164
56356
  },
56357
+ "trainingProvider.updateEntry": {
56358
+ capName: "training-provider",
56359
+ capScope: "system",
56360
+ addonId: null,
56361
+ access: "create"
56362
+ },
56165
56363
  "trainingProvider.uploadDataset": {
56166
56364
  capName: "training-provider",
56167
56365
  capScope: "system",
@@ -59410,6 +59608,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
59410
59608
  form: "single",
59411
59609
  optional: false
59412
59610
  }],
59611
+ "osdManager.setSlotCameraEnabled": [{
59612
+ name: "deviceId",
59613
+ form: "single",
59614
+ optional: false
59615
+ }],
59413
59616
  "petFeeder.callPet": [{
59414
59617
  name: "deviceId",
59415
59618
  form: "single",
@@ -59630,6 +59833,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
59630
59833
  form: "array",
59631
59834
  optional: false
59632
59835
  }],
59836
+ "pipelineAnalytics.listRetrainCorpusPage": [{
59837
+ name: "deviceIds",
59838
+ form: "array",
59839
+ optional: true
59840
+ }],
59633
59841
  "pipelineAnalytics.listRetrainStaging": [{
59634
59842
  name: "deviceIds",
59635
59843
  form: "array",
@@ -60739,6 +60947,7 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
60739
60947
  });
60740
60948
  var CAP_PROVIDER_KIND_MAP = Object.freeze({
60741
60949
  "broker": "broker",
60950
+ "calendar-source": "calendar",
60742
60951
  "device-export": "device-export",
60743
60952
  "llm": "ai",
60744
60953
  "mesh-network": "mesh",
@@ -61466,6 +61675,26 @@ var NC_TEMPLATE_VARS = [
61466
61675
  "server-updated"
61467
61676
  ]
61468
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
+ },
61469
61698
  {
61470
61699
  name: "devices",
61471
61700
  label: "Devices",
@@ -61752,7 +61981,7 @@ var NC_TEMPLATE_VARS = [
61752
61981
  {
61753
61982
  name: "skipped",
61754
61983
  label: "Skipped count",
61755
- 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).",
61756
61985
  example: "1",
61757
61986
  group: "system",
61758
61987
  families: ["rule"],