@camstack/addon-provider-rtsp 1.2.124 → 1.2.125

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.
Files changed (3) hide show
  1. package/dist/addon.js +422 -139
  2. package/dist/addon.mjs +422 -139
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5401,7 +5401,7 @@ var ZodIssueCode = {
5401
5401
  var ZodFirstPartyTypeKind;
5402
5402
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5403
5403
  //#endregion
5404
- //#region ../types/dist/sleep-r3RWkGVx.mjs
5404
+ //#region ../types/dist/sleep-DwAQ9sqX.mjs
5405
5405
  /**
5406
5406
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5407
5407
  * window to float samples (D455).
@@ -9407,6 +9407,16 @@ var CompositionSchema = object({
9407
9407
  seen.add(feature.cap);
9408
9408
  });
9409
9409
  });
9410
+ var NodeColorIdSchema = _enum([
9411
+ "node-a",
9412
+ "node-b",
9413
+ "node-c",
9414
+ "node-d",
9415
+ "node-e",
9416
+ "node-f",
9417
+ "node-g",
9418
+ "node-h"
9419
+ ]);
9410
9420
  new Set([
9411
9421
  "track",
9412
9422
  "face",
@@ -18468,14 +18478,14 @@ var LlmProfileSchema = object({
18468
18478
  /** ConfigUISchema tree passed through untyped on the wire (the
18469
18479
  * notification-output `ConfigSchemaPassthrough` precedent at
18470
18480
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18471
- var ConfigSchemaPassthrough$1 = unknown();
18481
+ var ConfigSchemaPassthrough$3 = unknown();
18472
18482
  var LlmProfileKindDescriptorSchema = object({
18473
18483
  kind: LlmProfileKindSchema,
18474
18484
  label: string(),
18475
18485
  icon: string(),
18476
18486
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18477
18487
  addonId: string(),
18478
- configSchema: ConfigSchemaPassthrough$1
18488
+ configSchema: ConfigSchemaPassthrough$3
18479
18489
  });
18480
18490
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18481
18491
  var LlmDefaultSchema = object({
@@ -19596,7 +19606,7 @@ var TargetKindCapsSchema = object({
19596
19606
  * the union is large and not meant for runtime validation here; the exported
19597
19607
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19598
19608
  */
19599
- var ConfigSchemaPassthrough = unknown();
19609
+ var ConfigSchemaPassthrough$2 = unknown();
19600
19610
  var TargetKindSchema = object({
19601
19611
  kind: string(),
19602
19612
  label: string(),
@@ -19633,7 +19643,7 @@ var TargetKindSchema = object({
19633
19643
  * its raster path, which is the safe default for an unknown image.
19634
19644
  */
19635
19645
  iconMediaType: string().optional(),
19636
- configSchema: ConfigSchemaPassthrough,
19646
+ configSchema: ConfigSchemaPassthrough$2,
19637
19647
  /**
19638
19648
  * The config keys that decide WHERE this kind's secrets are sent (server,
19639
19649
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -22970,6 +22980,61 @@ var OauthIntegrationDescriptorSchema = object({
22970
22980
  });
22971
22981
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
22972
22982
  /**
22983
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
22984
+ *
22985
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
22986
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
22987
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
22988
+ * immutable after create.
22989
+ */
22990
+ var ConfigSchemaPassthrough$1 = unknown();
22991
+ var OidcConnectionSchema = object({
22992
+ id: string().min(1),
22993
+ displayName: string(),
22994
+ icon: string(),
22995
+ issuerUrl: string(),
22996
+ clientId: string(),
22997
+ /** Client id + secret present — never the secret value. */
22998
+ configured: boolean(),
22999
+ /**
23000
+ * Values for the connection form schema. `clientSecret` is a keychain
23001
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
23002
+ */
23003
+ formValues: record(string(), unknown()).optional()
23004
+ });
23005
+ /**
23006
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
23007
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
23008
+ */
23009
+ var OidcConnectionUpdateInputSchema = object({
23010
+ id: string().min(1),
23011
+ displayName: string().min(1),
23012
+ icon: string().optional(),
23013
+ issuerUrl: string().optional(),
23014
+ clientId: string().optional(),
23015
+ clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
23016
+ redirectUri: string().optional(),
23017
+ scopes: string().optional(),
23018
+ usernameClaim: _enum([
23019
+ "preferred_username",
23020
+ "email",
23021
+ "sub"
23022
+ ]).optional()
23023
+ });
23024
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
23025
+ id: string().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
23026
+ displayName: string().min(1)
23027
+ }), object({ id: string() }), {
23028
+ kind: "mutation",
23029
+ auth: "admin"
23030
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
23031
+ kind: "mutation",
23032
+ auth: "admin"
23033
+ }), method(object({ id: string().min(1) }), object({ ok: literal(true) }), {
23034
+ kind: "mutation",
23035
+ auth: "admin"
23036
+ });
23037
+ /**
22973
23038
  * What started a camera's onboard motion (D672). `camera` is the camera's own
22974
23039
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
22975
23040
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -24326,24 +24391,69 @@ var RetrainFrameListSchema = object({
24326
24391
  /** What the page pre-selects — the native key frame when one survives. */
24327
24392
  autoPickMediaId: number().int().optional()
24328
24393
  });
24394
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
24395
+ var RetrainFrameWorkStateSchema = _enum([
24396
+ "unannotated",
24397
+ "annotated",
24398
+ "complete"
24399
+ ]);
24400
+ /**
24401
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
24402
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
24403
+ */
24404
+ var RetrainCorpusFilterSchema = object({
24405
+ workState: RetrainFrameWorkStateSchema.optional(),
24406
+ deviceIds: array(number()).max(500).optional(),
24407
+ /** When set, only frames in this named collection. */
24408
+ collectionId: string().optional(),
24409
+ /** Frames that carry at least one saved annotation in one of these classes. */
24410
+ classes: array(RetrainMacroClassSchema).optional(),
24411
+ page: number().int().positive().default(1),
24412
+ pageSize: number().int().positive().max(100).default(50)
24413
+ });
24414
+ var RetrainCorpusPageSchema = object({
24415
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
24416
+ total: number().int().nonnegative(),
24417
+ page: number().int().positive(),
24418
+ pageSize: number().int().positive()
24419
+ });
24420
+ var RetrainCorpusKpiCameraRowSchema = object({
24421
+ deviceId: number(),
24422
+ unannotated: number().int().nonnegative(),
24423
+ annotated: number().int().nonnegative(),
24424
+ complete: number().int().nonnegative(),
24425
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24426
+ * `null` when the corpus is empty (no ratio). */
24427
+ pctOfCorpus: number().min(0).max(1).nullable()
24428
+ });
24429
+ var RetrainCorpusKpiSchema = object({
24430
+ total: number().int().nonnegative(),
24431
+ unannotated: number().int().nonnegative(),
24432
+ annotated: number().int().nonnegative(),
24433
+ complete: number().int().nonnegative(),
24434
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24435
+ });
24329
24436
  /**
24330
24437
  * Which frames an annotated export carries. Every field narrows; an empty
24331
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
24332
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
24333
- * the primitive a version export uses; `batchId` re-selects what an earlier
24334
- * export carried (`exportedInBatch`).
24438
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24439
+ * download uses; `batchId` re-selects what an earlier export carried
24440
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24441
+ * resolves to `frameIds` at plan/start.
24335
24442
  */
24336
24443
  var RetrainExportFilterSchema = object({
24337
24444
  deviceIds: array(number()).optional(),
24338
24445
  frameIds: array(string()).max(2e4).optional(),
24339
24446
  /** Only frames in at least one of these named collections. */
24340
24447
  collectionIds: array(string()).max(200).optional(),
24341
- /** Exactly the frames of this dataset version (and its completeOnly). An
24342
- * unknown id selects nothing. */
24343
- datasetVersionId: string().optional(),
24448
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24449
+ collectionId: string().optional(),
24344
24450
  batchId: string().optional(),
24345
24451
  /** Only frames the operator marked complete (all subjects boxed). */
24346
- completeOnly: boolean().optional()
24452
+ completeOnly: boolean().optional(),
24453
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24454
+ workState: RetrainFrameWorkStateSchema.optional(),
24455
+ /** Frames with at least one saved annotation in one of these classes. */
24456
+ classes: array(RetrainMacroClassSchema).optional()
24347
24457
  });
24348
24458
  /**
24349
24459
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24543,8 +24653,7 @@ var RetrainDatasetStatsSchema = object({
24543
24653
  completeFrames: number().int()
24544
24654
  })).readonly()
24545
24655
  });
24546
- /** An immutable dataset version, without its frame list. */
24547
- var RetrainDatasetVersionSchema = object({
24656
+ object({
24548
24657
  id: string(),
24549
24658
  name: string(),
24550
24659
  createdAt: number(),
@@ -24552,22 +24661,33 @@ var RetrainDatasetVersionSchema = object({
24552
24661
  layout: RetrainExportLayoutSchema,
24553
24662
  completeOnly: boolean(),
24554
24663
  frameCount: number().int(),
24555
- /** sha256 of what the frames taught when the version was frozen. */
24556
24664
  annotationHash: string(),
24557
- /** The export manifest schema the version was cut under. */
24558
24665
  manifestSchema: string(),
24559
24666
  stats: RetrainDatasetStatsSchema
24560
24667
  });
24561
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24562
- kind: literal("created"),
24563
- version: RetrainDatasetVersionSchema
24668
+ /**
24669
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24670
+ * the training cap. Resolved here so plan/start and the annotated export share
24671
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24672
+ */
24673
+ var RetrainTrainingCorpusSelectionSchema = object({
24674
+ collectionIds: array(string()).min(1),
24675
+ workState: _enum([
24676
+ "complete",
24677
+ "annotated_or_complete",
24678
+ "any_annotated"
24679
+ ]).default("complete")
24680
+ });
24681
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24682
+ kind: literal("resolved"),
24683
+ frameIds: array(string()).max(2e4).readonly(),
24684
+ stats: RetrainDatasetStatsSchema,
24685
+ annotationHash: string(),
24686
+ layout: RetrainExportLayoutSchema
24564
24687
  }), object({
24565
24688
  kind: literal("refused"),
24566
- reason: _enum([
24567
- "empty-name",
24568
- "duplicate-name",
24569
- "no-frames"
24570
- ])
24689
+ reason: _enum(["unknown-collection", "no-frames"]),
24690
+ detail: string()
24571
24691
  })]);
24572
24692
  /** The outcome of a lifecycle move owned by the retrain page. */
24573
24693
  var RetrainTransitionResultSchema = object({
@@ -25274,6 +25394,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25274
25394
  }), array(RetrainTrackSchema).readonly(), {
25275
25395
  kind: "query",
25276
25396
  auth: "admin"
25397
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
25398
+ kind: "query",
25399
+ auth: "admin"
25400
+ }), method(object({}), RetrainCorpusKpiSchema, {
25401
+ kind: "query",
25402
+ auth: "admin"
25277
25403
  }), method(object({ trackId: string() }), RetrainFrameListSchema, {
25278
25404
  kind: "query",
25279
25405
  auth: "admin"
@@ -25369,36 +25495,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25369
25495
  kind: "mutation",
25370
25496
  auth: "admin",
25371
25497
  timeoutMs: 12e4
25372
- }), method(object({
25373
- selection: RetrainDatasetSelectionSchema,
25374
- completeOnly: boolean().optional()
25375
- }), RetrainDatasetStatsSchema, {
25376
- kind: "query",
25377
- auth: "admin"
25378
- }), method(object({
25379
- name: string().max(120),
25380
- selection: RetrainDatasetSelectionSchema,
25381
- layout: RetrainExportLayoutSchema,
25382
- completeOnly: boolean()
25383
- }), CreateRetrainDatasetVersionResultSchema, {
25384
- kind: "mutation",
25385
- auth: "admin",
25386
- timeoutMs: 12e4
25387
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
25388
- kind: "query",
25389
- auth: "admin"
25390
- }), method(object({ id: string() }), object({ deleted: boolean() }), {
25391
- kind: "mutation",
25392
- auth: "admin"
25393
- }), method(object({ id: string() }), object({
25394
- found: boolean(),
25395
- annotationHash: string(),
25396
- matches: boolean(),
25397
- missingFrames: number().int()
25398
- }), {
25399
- kind: "query",
25400
- auth: "admin",
25401
- timeoutMs: 12e4
25402
25498
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
25403
25499
  kind: "query",
25404
25500
  auth: "admin"
@@ -25425,6 +25521,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25425
25521
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25426
25522
  kind: "query",
25427
25523
  auth: "admin"
25524
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25525
+ kind: "query",
25526
+ auth: "admin",
25527
+ timeoutMs: 6e4
25428
25528
  }), method(object({
25429
25529
  id: string(),
25430
25530
  name: string().max(120)
@@ -26041,11 +26141,14 @@ var HardwareClassIdSchema = _enum([
26041
26141
  "intel-n-series",
26042
26142
  "apple-m-base",
26043
26143
  "apple-m-pro",
26144
+ "amd-phoenix",
26044
26145
  "unknown"
26045
26146
  ]);
26046
26147
  var AcceleratorKindSchema = _enum([
26047
26148
  "intel-npu",
26048
26149
  "intel-igpu",
26150
+ "amd-igpu",
26151
+ "amd-npu",
26049
26152
  "x86-cpu",
26050
26153
  "arm-cpu",
26051
26154
  "apple-ane",
@@ -27975,6 +28078,8 @@ var AgentPipelineSettingsSchema = object({
27975
28078
  * address is wrong (multi-homed host, NAT, custom interface).
27976
28079
  */
27977
28080
  reachableHost: string().optional(),
28081
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
28082
+ color: NodeColorIdSchema.optional(),
27978
28083
  /**
27979
28084
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
27980
28085
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28524,8 +28629,9 @@ method(object({
28524
28629
  auth: "admin"
28525
28630
  }), method(object({
28526
28631
  agentNodeId: string(),
28527
- reachableHost: string().nullable()
28528
- }), object({ success: literal(true) }), {
28632
+ reachableHost: string().nullable().optional(),
28633
+ color: NodeColorIdSchema.nullable().optional()
28634
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28529
28635
  kind: "mutation",
28530
28636
  auth: "admin"
28531
28637
  }), method(object({
@@ -31705,7 +31811,7 @@ var CustomActionInputSchema = object({
31705
31811
  action: string().min(1),
31706
31812
  input: unknown()
31707
31813
  });
31708
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31814
+ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31709
31815
  addonId: string(),
31710
31816
  limit: number().min(1).max(500).default(100),
31711
31817
  level: LogLevelSchema$2.optional()
@@ -36775,7 +36881,13 @@ var TopologyNodeSchema = object({
36775
36881
  })).readonly(),
36776
36882
  processes: array(TopologyProcessSchema).readonly(),
36777
36883
  categories: array(TopologyCategorySchema).readonly(),
36778
- rootPackage: TopologyRootPackageSchema.nullable()
36884
+ rootPackage: TopologyRootPackageSchema.nullable(),
36885
+ /**
36886
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
36887
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
36888
+ * for offline rows and when the hub cannot tell.
36889
+ */
36890
+ meshTransport: _enum(["tls", "clear"]).optional()
36779
36891
  });
36780
36892
  var CapUsageEdgeSchema = object({
36781
36893
  callerAddonId: string(),
@@ -37188,6 +37300,7 @@ var OsdNamedTemplateSchema = object({
37188
37300
  });
37189
37301
  /** Where a slot's value comes from. */
37190
37302
  var OsdSourceSchema = discriminatedUnion("kind", [
37303
+ object({ kind: literal("none") }),
37191
37304
  object({
37192
37305
  kind: literal("static"),
37193
37306
  text: string().max(64)
@@ -37314,6 +37427,13 @@ method(object({ deviceId: number().int() }), object({
37314
37427
  }), object({ success: literal(true) }), {
37315
37428
  kind: "mutation",
37316
37429
  auth: "admin"
37430
+ }), method(object({
37431
+ deviceId: number().int(),
37432
+ slotId: string().min(1),
37433
+ enabled: boolean()
37434
+ }), object({ success: literal(true) }), {
37435
+ kind: "mutation",
37436
+ auth: "admin"
37317
37437
  }), method(object({
37318
37438
  sourceDeviceId: number().int(),
37319
37439
  targetDeviceId: number().int()
@@ -37745,7 +37865,15 @@ var GpuInfoSchema = object({
37745
37865
  name: string(),
37746
37866
  memoryMB: number().optional()
37747
37867
  });
37748
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
37868
+ var NpuInfoSchema = object({
37869
+ type: _enum([
37870
+ "apple-ane",
37871
+ "intel-npu",
37872
+ "amd-xdna"
37873
+ ]),
37874
+ name: string().optional(),
37875
+ generation: _enum(["xdna1", "xdna2"]).optional()
37876
+ });
37749
37877
  var CoralInfoSchema = object({
37750
37878
  type: literal("coral-edgetpu"),
37751
37879
  bus: string().optional()
@@ -42488,9 +42616,11 @@ var zoneRulesCapability = {
42488
42616
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
42489
42617
  * manifest entry and nothing else.
42490
42618
  *
42491
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
42492
- * `notification-output` posture); `describe` concat-fans across providers.
42493
- * Every method is `admin`: these spend money.
42619
+ * Collection of provider **types** (addons). Each addon owns zero or more
42620
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
42621
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
42622
+ * `entryId`; callers also pass the owning `addonId` as the collection
42623
+ * selector (broker posture). Every method is `admin`: these spend money.
42494
42624
  *
42495
42625
  * Every cloud object a provider creates is tagged with the orchestrator's
42496
42626
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -42514,8 +42644,8 @@ var TrainingRegionOptionSchema = object({
42514
42644
  priceMultiplier: number().positive()
42515
42645
  });
42516
42646
  /**
42517
- * The provider's per-account settings, as the orchestrator reads them. They
42518
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
42647
+ * The provider's per-entry settings, as the orchestrator reads them. They
42648
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
42519
42649
  * depend on the user's account), never hard-coded in the orchestrator.
42520
42650
  */
42521
42651
  var TrainingProviderDefaultsSchema = object({
@@ -42526,9 +42656,44 @@ var TrainingProviderDefaultsSchema = object({
42526
42656
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
42527
42657
  failedDatasetGraceHours: number().nonnegative()
42528
42658
  });
42659
+ /**
42660
+ * Entry form schema for a provider type — same seam as notification
42661
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
42662
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
42663
+ */
42664
+ var ConfigSchemaPassthrough = unknown();
42665
+ /** One creatable provider type, for the Add-entry dialog. */
42666
+ var TrainingProviderTypeSchema = object({
42667
+ typeId: string(),
42668
+ label: string(),
42669
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
42670
+ iconAsset: string(),
42671
+ /** Owning `training-provider` addon — collection selector for createEntry. */
42672
+ addonId: string(),
42673
+ /**
42674
+ * Fields for one entry of this type (credentials + defaults). Absent on a
42675
+ * type that only needs a name. Password fields are keychain-backed on the
42676
+ * provider addon (`secretStatePaths`), not D634 plaintext.
42677
+ */
42678
+ configSchema: ConfigSchemaPassthrough.optional()
42679
+ });
42680
+ /** One configured account / workspace under a provider type. */
42681
+ var TrainingProviderEntrySchema = object({
42682
+ entryId: string(),
42683
+ typeId: string(),
42684
+ name: string(),
42685
+ addonId: string(),
42686
+ /** Credentials are present — never the values. */
42687
+ configured: boolean()
42688
+ });
42529
42689
  var TrainingProviderDescriptorSchema = object({
42530
42690
  addonId: string(),
42531
- /** `modal`, `runpod`, `fake`, … */
42691
+ entryId: string(),
42692
+ typeId: string(),
42693
+ /** Operator-chosen entry name. */
42694
+ name: string(),
42695
+ iconAsset: string(),
42696
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
42532
42697
  kind: string(),
42533
42698
  label: string(),
42534
42699
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -42540,7 +42705,30 @@ var TrainingProviderDescriptorSchema = object({
42540
42705
  dataResidencyNote: string(),
42541
42706
  /** Credentials are present — never the values. */
42542
42707
  configured: boolean(),
42543
- defaults: TrainingProviderDefaultsSchema
42708
+ defaults: TrainingProviderDefaultsSchema,
42709
+ /**
42710
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
42711
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
42712
+ * never plaintext. Same hydrate contract as settings forms (D789).
42713
+ */
42714
+ formValues: record(string(), unknown()).optional()
42715
+ });
42716
+ /**
42717
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
42718
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
42719
+ * `{ $secretClear: true }` clears it.
42720
+ */
42721
+ var TrainingProviderUpdateEntryInputSchema = object({
42722
+ entryId: string().min(1),
42723
+ name: string().min(1),
42724
+ tokenId: string().optional(),
42725
+ tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
42726
+ environment: string().optional(),
42727
+ gpuType: string().optional(),
42728
+ region: string().optional(),
42729
+ costCapUsd: number().nonnegative().optional(),
42730
+ maxRuntimeSec: number().int().positive().optional(),
42731
+ failedDatasetGraceHours: number().nonnegative().optional()
42544
42732
  });
42545
42733
  var TrainingCredentialCheckSchema = object({
42546
42734
  ok: boolean(),
@@ -42592,20 +42780,33 @@ var TrainerSourceRefSchema = object({
42592
42780
  /** A commit sha (never a branch) — the job must be reproducible. */
42593
42781
  revision: string().regex(/^[0-9a-f]{7,64}$/)
42594
42782
  });
42783
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
42595
42784
  var JobRef = {
42596
- addonId: string(),
42785
+ entryId: string().min(1),
42597
42786
  jobKey: string().uuid()
42598
42787
  };
42599
42788
  var TrainingLogLineSchema = object({
42600
42789
  ts: number(),
42601
42790
  text: string()
42602
42791
  });
42603
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string() }), TrainingCredentialCheckSchema, {
42792
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
42793
+ typeId: string().min(1),
42794
+ name: string().min(1)
42795
+ }), object({ entryId: string() }), {
42796
+ kind: "mutation",
42797
+ auth: "admin"
42798
+ }), method(object({ entryId: string().min(1) }), object({ ok: literal(true) }), {
42799
+ kind: "mutation",
42800
+ auth: "admin"
42801
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
42802
+ kind: "mutation",
42803
+ auth: "admin"
42804
+ }), method(object({ entryId: string().min(1) }), TrainingCredentialCheckSchema, {
42604
42805
  kind: "mutation",
42605
42806
  auth: "admin",
42606
42807
  timeoutMs: 3e4
42607
42808
  }), method(object({
42608
- addonId: string(),
42809
+ entryId: string().min(1),
42609
42810
  gpuType: string(),
42610
42811
  region: string(),
42611
42812
  datasetBytes: number().int().nonnegative(),
@@ -42671,7 +42872,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42671
42872
  kind: "mutation",
42672
42873
  auth: "admin",
42673
42874
  timeoutMs: 5 * 6e4
42674
- }), method(object({ addonId: string() }), array(ProviderJobStatusSchema).readonly(), {
42875
+ }), method(object({ entryId: string().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
42675
42876
  auth: "admin",
42676
42877
  timeoutMs: 2 * 6e4
42677
42878
  });
@@ -42681,20 +42882,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42681
42882
  *
42682
42883
  * It owns what every provider must agree on, written once:
42683
42884
  *
42684
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
42685
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
42686
- * the export plan) and reaches this store through the five row methods
42687
- * below, so the Retrain page and the export did not change.
42688
42885
  * - **Jobs.** A persisted state machine, a reconcile loop against the
42689
42886
  * provider, a cost guard, a daily orphan sweep and the retention rules.
42690
42887
  * - **The return flow.** Verified artefacts → Model Studio
42691
42888
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
42692
42889
  * rollback. Nothing is ever registered automatically.
42693
42890
  *
42891
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
42892
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
42893
+ * moment and snapshotted on the job. No frozen dataset version.
42894
+ *
42694
42895
  * Every method is `admin`.
42695
42896
  */
42696
- /** A version WITH its frame list — what the export and a job read. */
42697
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string()).max(2e4).readonly() });
42897
+ /**
42898
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
42899
+ * Frame ids are resolved at plan/start — never a frozen version id.
42900
+ */
42901
+ var TrainingCorpusSelectionSchema = object({
42902
+ collectionIds: array(string()).min(1),
42903
+ /** Default complete-only for v1 */
42904
+ workState: _enum([
42905
+ "complete",
42906
+ "annotated_or_complete",
42907
+ "any_annotated"
42908
+ ]).default("complete")
42909
+ });
42698
42910
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
42699
42911
  var TrainingBaseModelSchema = object({
42700
42912
  modelId: string(),
@@ -42712,9 +42924,13 @@ var TrainingPresetSchema = _enum([
42712
42924
  "thorough"
42713
42925
  ]);
42714
42926
  var TrainingJobRequestSchema = object({
42715
- datasetVersionId: string().min(1),
42716
- /** The `training-provider` addon that runs it. */
42717
- addonId: string().min(1),
42927
+ /** Live collection + work-state criteria; resolved at plan/start. */
42928
+ selection: TrainingCorpusSelectionSchema,
42929
+ /**
42930
+ * The provider **entry** that runs it (credentials + defaults).
42931
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
42932
+ */
42933
+ entryId: string().min(1),
42718
42934
  gpuType: string().min(1),
42719
42935
  region: string(),
42720
42936
  baseModelId: string().min(1),
@@ -42773,6 +42989,7 @@ var TrainingJobPlanSchema = object({
42773
42989
  * result lives after the operator acted on it.
42774
42990
  */
42775
42991
  var TrainingJobStateSchema = _enum([
42992
+ "queued",
42776
42993
  "uploading",
42777
42994
  "submitted",
42778
42995
  "starting",
@@ -42826,6 +43043,11 @@ var TrainingJobSchema = object({
42826
43043
  createdAt: number(),
42827
43044
  updatedAt: number(),
42828
43045
  state: TrainingJobStateSchema,
43046
+ /**
43047
+ * Shared by every job enqueued together via `startJobBatch`.
43048
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
43049
+ */
43050
+ batchId: string().nullable().default(null),
42829
43051
  stage: TrainingStageSchema.nullable(),
42830
43052
  failure: object({
42831
43053
  reason: TrainingFailureReasonSchema,
@@ -42837,6 +43059,12 @@ var TrainingJobSchema = object({
42837
43059
  maxRuntimeSec: number().int().positive(),
42838
43060
  trainer: TrainerSourceRefSchema,
42839
43061
  datasetLayout: RetrainExportLayoutSchema,
43062
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
43063
+ frameCount: number().int().nonnegative(),
43064
+ /** Resolved frame ids at start — the archive ships exactly these. */
43065
+ frameIds: array(string()).max(2e4).readonly(),
43066
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
43067
+ annotationHash: string(),
42840
43068
  dataset: object({
42841
43069
  bytes: number().int(),
42842
43070
  sha256: string(),
@@ -42878,13 +43106,7 @@ var TrainingJobSchema = object({
42878
43106
  canary: TrainingCanarySchema.nullable()
42879
43107
  });
42880
43108
  var IdInput = object({ id: string().min(1) });
42881
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42882
- kind: "mutation",
42883
- auth: "admin"
42884
- }), method(IdInput, TrainingDatasetVersionRowSchema.nullable(), { auth: "admin" }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), object({ id: string().nullable() }), { auth: "admin" }), method(IdInput, object({ removed: boolean() }), {
42885
- kind: "mutation",
42886
- auth: "admin"
42887
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
43109
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
42888
43110
  auth: "admin",
42889
43111
  timeoutMs: 6e4
42890
43112
  }), method(TrainingJobRequestSchema.extend({
@@ -42903,6 +43125,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42903
43125
  kind: "mutation",
42904
43126
  auth: "admin",
42905
43127
  timeoutMs: 12e4
43128
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
43129
+ baseModelIds: array(string().min(1)).min(1),
43130
+ name: string().min(1).max(120),
43131
+ maxCostUsd: number().positive(),
43132
+ maxRuntimeSec: number().int().positive(),
43133
+ idempotencyKey: string().min(8).max(80)
43134
+ }), discriminatedUnion("kind", [object({
43135
+ kind: literal("started"),
43136
+ batchId: string(),
43137
+ jobs: array(TrainingJobSchema).min(1).readonly()
43138
+ }), object({
43139
+ kind: literal("refused"),
43140
+ reason: TrainingRefusalReasonSchema,
43141
+ detail: string()
43142
+ })]), {
43143
+ kind: "mutation",
43144
+ auth: "admin",
43145
+ timeoutMs: 12e4
42906
43146
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
42907
43147
  kind: "mutation",
42908
43148
  auth: "admin",
@@ -48461,6 +48701,36 @@ Object.freeze({
48461
48701
  addonId: null,
48462
48702
  access: "view"
48463
48703
  },
48704
+ "oidcConnections.connectionFormSchema": {
48705
+ capName: "oidc-connections",
48706
+ capScope: "system",
48707
+ addonId: null,
48708
+ access: "view"
48709
+ },
48710
+ "oidcConnections.createConnection": {
48711
+ capName: "oidc-connections",
48712
+ capScope: "system",
48713
+ addonId: null,
48714
+ access: "create"
48715
+ },
48716
+ "oidcConnections.deleteConnection": {
48717
+ capName: "oidc-connections",
48718
+ capScope: "system",
48719
+ addonId: null,
48720
+ access: "delete"
48721
+ },
48722
+ "oidcConnections.listConnections": {
48723
+ capName: "oidc-connections",
48724
+ capScope: "system",
48725
+ addonId: null,
48726
+ access: "view"
48727
+ },
48728
+ "oidcConnections.updateConnection": {
48729
+ capName: "oidc-connections",
48730
+ capScope: "system",
48731
+ addonId: null,
48732
+ access: "create"
48733
+ },
48464
48734
  "osd.getStatus": {
48465
48735
  capName: "osd",
48466
48736
  capScope: "device",
@@ -48533,6 +48803,12 @@ Object.freeze({
48533
48803
  addonId: null,
48534
48804
  access: "create"
48535
48805
  },
48806
+ "osdManager.setSlotCameraEnabled": {
48807
+ capName: "osd-manager",
48808
+ capScope: "system",
48809
+ addonId: null,
48810
+ access: "create"
48811
+ },
48536
48812
  "osdManager.upsertTemplate": {
48537
48813
  capName: "osd-manager",
48538
48814
  capScope: "system",
@@ -48671,12 +48947,6 @@ Object.freeze({
48671
48947
  addonId: null,
48672
48948
  access: "create"
48673
48949
  },
48674
- "pipelineAnalytics.createRetrainDatasetVersion": {
48675
- capName: "pipeline-analytics",
48676
- capScope: "device",
48677
- addonId: null,
48678
- access: "create"
48679
- },
48680
48950
  "pipelineAnalytics.deleteDeviceEvents": {
48681
48951
  capName: "pipeline-analytics",
48682
48952
  capScope: "device",
@@ -48689,12 +48959,6 @@ Object.freeze({
48689
48959
  addonId: null,
48690
48960
  access: "delete"
48691
48961
  },
48692
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
48693
- capName: "pipeline-analytics",
48694
- capScope: "device",
48695
- addonId: null,
48696
- access: "delete"
48697
- },
48698
48962
  "pipelineAnalytics.deleteTracks": {
48699
48963
  capName: "pipeline-analytics",
48700
48964
  capScope: "device",
@@ -48797,6 +49061,12 @@ Object.freeze({
48797
49061
  addonId: null,
48798
49062
  access: "view"
48799
49063
  },
49064
+ "pipelineAnalytics.getRetrainCorpusKpi": {
49065
+ capName: "pipeline-analytics",
49066
+ capScope: "device",
49067
+ addonId: null,
49068
+ access: "view"
49069
+ },
48800
49070
  "pipelineAnalytics.getRetrainExportUrl": {
48801
49071
  capName: "pipeline-analytics",
48802
49072
  capScope: "device",
@@ -48917,7 +49187,7 @@ Object.freeze({
48917
49187
  addonId: null,
48918
49188
  access: "view"
48919
49189
  },
48920
- "pipelineAnalytics.listRetrainDatasetVersions": {
49190
+ "pipelineAnalytics.listRetrainCorpusPage": {
48921
49191
  capName: "pipeline-analytics",
48922
49192
  capScope: "device",
48923
49193
  addonId: null,
@@ -48971,12 +49241,6 @@ Object.freeze({
48971
49241
  addonId: null,
48972
49242
  access: "create"
48973
49243
  },
48974
- "pipelineAnalytics.previewRetrainDataset": {
48975
- capName: "pipeline-analytics",
48976
- capScope: "device",
48977
- addonId: null,
48978
- access: "view"
48979
- },
48980
49244
  "pipelineAnalytics.proposeRetrainAnnotations": {
48981
49245
  capName: "pipeline-analytics",
48982
49246
  capScope: "device",
@@ -49055,6 +49319,12 @@ Object.freeze({
49055
49319
  addonId: null,
49056
49320
  access: "create"
49057
49321
  },
49322
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
49323
+ capName: "pipeline-analytics",
49324
+ capScope: "device",
49325
+ addonId: null,
49326
+ access: "view"
49327
+ },
49058
49328
  "pipelineAnalytics.restageRetrainTrack": {
49059
49329
  capName: "pipeline-analytics",
49060
49330
  capScope: "device",
@@ -49115,12 +49385,6 @@ Object.freeze({
49115
49385
  addonId: null,
49116
49386
  access: "create"
49117
49387
  },
49118
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
49119
- capName: "pipeline-analytics",
49120
- capScope: "device",
49121
- addonId: null,
49122
- access: "view"
49123
- },
49124
49388
  "pipelineAnalytics.wipeAllAnalytics": {
49125
49389
  capName: "pipeline-analytics",
49126
49390
  capScope: "device",
@@ -51515,18 +51779,6 @@ Object.freeze({
51515
51779
  addonId: null,
51516
51780
  access: "create"
51517
51781
  },
51518
- "training.findDatasetVersionIdByName": {
51519
- capName: "training",
51520
- capScope: "system",
51521
- addonId: null,
51522
- access: "view"
51523
- },
51524
- "training.getDatasetVersion": {
51525
- capName: "training",
51526
- capScope: "system",
51527
- addonId: null,
51528
- access: "view"
51529
- },
51530
51782
  "training.getJob": {
51531
51783
  capName: "training",
51532
51784
  capScope: "system",
@@ -51545,12 +51797,6 @@ Object.freeze({
51545
51797
  addonId: null,
51546
51798
  access: "view"
51547
51799
  },
51548
- "training.listDatasetVersions": {
51549
- capName: "training",
51550
- capScope: "system",
51551
- addonId: null,
51552
- access: "view"
51553
- },
51554
51800
  "training.listJobs": {
51555
51801
  capName: "training",
51556
51802
  capScope: "system",
@@ -51563,54 +51809,66 @@ Object.freeze({
51563
51809
  addonId: null,
51564
51810
  access: "view"
51565
51811
  },
51566
- "training.putDatasetVersion": {
51812
+ "training.registerResult": {
51567
51813
  capName: "training",
51568
51814
  capScope: "system",
51569
51815
  addonId: null,
51570
51816
  access: "create"
51571
51817
  },
51572
- "training.registerResult": {
51818
+ "training.rollbackCanary": {
51573
51819
  capName: "training",
51574
51820
  capScope: "system",
51575
51821
  addonId: null,
51576
51822
  access: "create"
51577
51823
  },
51578
- "training.removeDatasetVersion": {
51824
+ "training.startJob": {
51579
51825
  capName: "training",
51580
51826
  capScope: "system",
51581
51827
  addonId: null,
51582
- access: "delete"
51828
+ access: "create"
51583
51829
  },
51584
- "training.rollbackCanary": {
51830
+ "training.startJobBatch": {
51585
51831
  capName: "training",
51586
51832
  capScope: "system",
51587
51833
  addonId: null,
51588
51834
  access: "create"
51589
51835
  },
51590
- "training.startJob": {
51591
- capName: "training",
51836
+ "trainingProvider.cancelJob": {
51837
+ capName: "training-provider",
51592
51838
  capScope: "system",
51593
51839
  addonId: null,
51594
51840
  access: "create"
51595
51841
  },
51596
- "trainingProvider.cancelJob": {
51842
+ "trainingProvider.cleanupJob": {
51597
51843
  capName: "training-provider",
51598
51844
  capScope: "system",
51599
51845
  addonId: null,
51600
51846
  access: "create"
51601
51847
  },
51602
- "trainingProvider.cleanupJob": {
51848
+ "trainingProvider.createEntry": {
51603
51849
  capName: "training-provider",
51604
51850
  capScope: "system",
51605
51851
  addonId: null,
51606
51852
  access: "create"
51607
51853
  },
51854
+ "trainingProvider.deleteEntry": {
51855
+ capName: "training-provider",
51856
+ capScope: "system",
51857
+ addonId: null,
51858
+ access: "delete"
51859
+ },
51608
51860
  "trainingProvider.describe": {
51609
51861
  capName: "training-provider",
51610
51862
  capScope: "system",
51611
51863
  addonId: null,
51612
51864
  access: "view"
51613
51865
  },
51866
+ "trainingProvider.describeTypes": {
51867
+ capName: "training-provider",
51868
+ capScope: "system",
51869
+ addonId: null,
51870
+ access: "view"
51871
+ },
51614
51872
  "trainingProvider.estimateJob": {
51615
51873
  capName: "training-provider",
51616
51874
  capScope: "system",
@@ -51623,6 +51881,12 @@ Object.freeze({
51623
51881
  addonId: null,
51624
51882
  access: "view"
51625
51883
  },
51884
+ "trainingProvider.listEntries": {
51885
+ capName: "training-provider",
51886
+ capScope: "system",
51887
+ addonId: null,
51888
+ access: "view"
51889
+ },
51626
51890
  "trainingProvider.listJobEvents": {
51627
51891
  capName: "training-provider",
51628
51892
  capScope: "system",
@@ -51653,6 +51917,12 @@ Object.freeze({
51653
51917
  addonId: null,
51654
51918
  access: "create"
51655
51919
  },
51920
+ "trainingProvider.updateEntry": {
51921
+ capName: "training-provider",
51922
+ capScope: "system",
51923
+ addonId: null,
51924
+ access: "create"
51925
+ },
51656
51926
  "trainingProvider.uploadDataset": {
51657
51927
  capName: "training-provider",
51658
51928
  capScope: "system",
@@ -54925,6 +55195,11 @@ Object.freeze({
54925
55195
  form: "single",
54926
55196
  optional: false
54927
55197
  }],
55198
+ "osdManager.setSlotCameraEnabled": [{
55199
+ name: "deviceId",
55200
+ form: "single",
55201
+ optional: false
55202
+ }],
54928
55203
  "petFeeder.callPet": [{
54929
55204
  name: "deviceId",
54930
55205
  form: "single",
@@ -55145,6 +55420,11 @@ Object.freeze({
55145
55420
  form: "array",
55146
55421
  optional: false
55147
55422
  }],
55423
+ "pipelineAnalytics.listRetrainCorpusPage": [{
55424
+ name: "deviceIds",
55425
+ form: "array",
55426
+ optional: true
55427
+ }],
55148
55428
  "pipelineAnalytics.listRetrainStaging": [{
55149
55429
  name: "deviceIds",
55150
55430
  form: "array",
@@ -56254,6 +56534,7 @@ Object.freeze({
56254
56534
  });
56255
56535
  Object.freeze({
56256
56536
  "broker": "broker",
56537
+ "calendar-source": "calendar",
56257
56538
  "device-export": "device-export",
56258
56539
  "llm": "ai",
56259
56540
  "mesh-network": "mesh",
@@ -56739,6 +57020,8 @@ var STATE_SUMMARY_VARS = [
56739
57020
  [...RULE_TEXT],
56740
57021
  [...RULE_TEXT],
56741
57022
  [...RULE_TEXT],
57023
+ [...RULE_TEXT],
57024
+ [...RULE_TEXT],
56742
57025
  ([...RULE_TEXT], [...UPDATES]),
56743
57026
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
56744
57027
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),