@camstack/addon-provider-unraid 0.2.125 → 0.2.126

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
@@ -5377,7 +5377,7 @@ var ZodIssueCode = {
5377
5377
  var ZodFirstPartyTypeKind;
5378
5378
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5379
5379
  //#endregion
5380
- //#region ../types/dist/sleep-r3RWkGVx.mjs
5380
+ //#region ../types/dist/sleep-DwAQ9sqX.mjs
5381
5381
  /**
5382
5382
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5383
5383
  * window to float samples (D455).
@@ -9383,6 +9383,16 @@ var CompositionSchema = object({
9383
9383
  seen.add(feature.cap);
9384
9384
  });
9385
9385
  });
9386
+ var NodeColorIdSchema = _enum([
9387
+ "node-a",
9388
+ "node-b",
9389
+ "node-c",
9390
+ "node-d",
9391
+ "node-e",
9392
+ "node-f",
9393
+ "node-g",
9394
+ "node-h"
9395
+ ]);
9386
9396
  new Set([
9387
9397
  "track",
9388
9398
  "face",
@@ -18525,14 +18535,14 @@ var LlmProfileSchema = object({
18525
18535
  /** ConfigUISchema tree passed through untyped on the wire (the
18526
18536
  * notification-output `ConfigSchemaPassthrough` precedent at
18527
18537
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18528
- var ConfigSchemaPassthrough$1 = unknown();
18538
+ var ConfigSchemaPassthrough$3 = unknown();
18529
18539
  var LlmProfileKindDescriptorSchema = object({
18530
18540
  kind: LlmProfileKindSchema,
18531
18541
  label: string(),
18532
18542
  icon: string(),
18533
18543
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18534
18544
  addonId: string(),
18535
- configSchema: ConfigSchemaPassthrough$1
18545
+ configSchema: ConfigSchemaPassthrough$3
18536
18546
  });
18537
18547
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18538
18548
  var LlmDefaultSchema = object({
@@ -19653,7 +19663,7 @@ var TargetKindCapsSchema = object({
19653
19663
  * the union is large and not meant for runtime validation here; the exported
19654
19664
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19655
19665
  */
19656
- var ConfigSchemaPassthrough = unknown();
19666
+ var ConfigSchemaPassthrough$2 = unknown();
19657
19667
  var TargetKindSchema = object({
19658
19668
  kind: string(),
19659
19669
  label: string(),
@@ -19690,7 +19700,7 @@ var TargetKindSchema = object({
19690
19700
  * its raster path, which is the safe default for an unknown image.
19691
19701
  */
19692
19702
  iconMediaType: string().optional(),
19693
- configSchema: ConfigSchemaPassthrough,
19703
+ configSchema: ConfigSchemaPassthrough$2,
19694
19704
  /**
19695
19705
  * The config keys that decide WHERE this kind's secrets are sent (server,
19696
19706
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -23027,6 +23037,61 @@ var OauthIntegrationDescriptorSchema = object({
23027
23037
  });
23028
23038
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
23029
23039
  /**
23040
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
23041
+ *
23042
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
23043
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
23044
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
23045
+ * immutable after create.
23046
+ */
23047
+ var ConfigSchemaPassthrough$1 = unknown();
23048
+ var OidcConnectionSchema = object({
23049
+ id: string().min(1),
23050
+ displayName: string(),
23051
+ icon: string(),
23052
+ issuerUrl: string(),
23053
+ clientId: string(),
23054
+ /** Client id + secret present — never the secret value. */
23055
+ configured: boolean(),
23056
+ /**
23057
+ * Values for the connection form schema. `clientSecret` is a keychain
23058
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
23059
+ */
23060
+ formValues: record(string(), unknown()).optional()
23061
+ });
23062
+ /**
23063
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
23064
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
23065
+ */
23066
+ var OidcConnectionUpdateInputSchema = object({
23067
+ id: string().min(1),
23068
+ displayName: string().min(1),
23069
+ icon: string().optional(),
23070
+ issuerUrl: string().optional(),
23071
+ clientId: string().optional(),
23072
+ clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
23073
+ redirectUri: string().optional(),
23074
+ scopes: string().optional(),
23075
+ usernameClaim: _enum([
23076
+ "preferred_username",
23077
+ "email",
23078
+ "sub"
23079
+ ]).optional()
23080
+ });
23081
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
23082
+ id: string().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
23083
+ displayName: string().min(1)
23084
+ }), object({ id: string() }), {
23085
+ kind: "mutation",
23086
+ auth: "admin"
23087
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
23088
+ kind: "mutation",
23089
+ auth: "admin"
23090
+ }), method(object({ id: string().min(1) }), object({ ok: literal(true) }), {
23091
+ kind: "mutation",
23092
+ auth: "admin"
23093
+ });
23094
+ /**
23030
23095
  * What started a camera's onboard motion (D672). `camera` is the camera's own
23031
23096
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
23032
23097
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -24383,24 +24448,69 @@ var RetrainFrameListSchema = object({
24383
24448
  /** What the page pre-selects — the native key frame when one survives. */
24384
24449
  autoPickMediaId: number().int().optional()
24385
24450
  });
24451
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
24452
+ var RetrainFrameWorkStateSchema = _enum([
24453
+ "unannotated",
24454
+ "annotated",
24455
+ "complete"
24456
+ ]);
24457
+ /**
24458
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
24459
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
24460
+ */
24461
+ var RetrainCorpusFilterSchema = object({
24462
+ workState: RetrainFrameWorkStateSchema.optional(),
24463
+ deviceIds: array(number()).max(500).optional(),
24464
+ /** When set, only frames in this named collection. */
24465
+ collectionId: string().optional(),
24466
+ /** Frames that carry at least one saved annotation in one of these classes. */
24467
+ classes: array(RetrainMacroClassSchema).optional(),
24468
+ page: number().int().positive().default(1),
24469
+ pageSize: number().int().positive().max(100).default(50)
24470
+ });
24471
+ var RetrainCorpusPageSchema = object({
24472
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
24473
+ total: number().int().nonnegative(),
24474
+ page: number().int().positive(),
24475
+ pageSize: number().int().positive()
24476
+ });
24477
+ var RetrainCorpusKpiCameraRowSchema = object({
24478
+ deviceId: number(),
24479
+ unannotated: number().int().nonnegative(),
24480
+ annotated: number().int().nonnegative(),
24481
+ complete: number().int().nonnegative(),
24482
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24483
+ * `null` when the corpus is empty (no ratio). */
24484
+ pctOfCorpus: number().min(0).max(1).nullable()
24485
+ });
24486
+ var RetrainCorpusKpiSchema = object({
24487
+ total: number().int().nonnegative(),
24488
+ unannotated: number().int().nonnegative(),
24489
+ annotated: number().int().nonnegative(),
24490
+ complete: number().int().nonnegative(),
24491
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24492
+ });
24386
24493
  /**
24387
24494
  * Which frames an annotated export carries. Every field narrows; an empty
24388
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
24389
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
24390
- * the primitive a version export uses; `batchId` re-selects what an earlier
24391
- * export carried (`exportedInBatch`).
24495
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24496
+ * download uses; `batchId` re-selects what an earlier export carried
24497
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24498
+ * resolves to `frameIds` at plan/start.
24392
24499
  */
24393
24500
  var RetrainExportFilterSchema = object({
24394
24501
  deviceIds: array(number()).optional(),
24395
24502
  frameIds: array(string()).max(2e4).optional(),
24396
24503
  /** Only frames in at least one of these named collections. */
24397
24504
  collectionIds: array(string()).max(200).optional(),
24398
- /** Exactly the frames of this dataset version (and its completeOnly). An
24399
- * unknown id selects nothing. */
24400
- datasetVersionId: string().optional(),
24505
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24506
+ collectionId: string().optional(),
24401
24507
  batchId: string().optional(),
24402
24508
  /** Only frames the operator marked complete (all subjects boxed). */
24403
- completeOnly: boolean().optional()
24509
+ completeOnly: boolean().optional(),
24510
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24511
+ workState: RetrainFrameWorkStateSchema.optional(),
24512
+ /** Frames with at least one saved annotation in one of these classes. */
24513
+ classes: array(RetrainMacroClassSchema).optional()
24404
24514
  });
24405
24515
  /**
24406
24516
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24600,8 +24710,7 @@ var RetrainDatasetStatsSchema = object({
24600
24710
  completeFrames: number().int()
24601
24711
  })).readonly()
24602
24712
  });
24603
- /** An immutable dataset version, without its frame list. */
24604
- var RetrainDatasetVersionSchema = object({
24713
+ object({
24605
24714
  id: string(),
24606
24715
  name: string(),
24607
24716
  createdAt: number(),
@@ -24609,22 +24718,33 @@ var RetrainDatasetVersionSchema = object({
24609
24718
  layout: RetrainExportLayoutSchema,
24610
24719
  completeOnly: boolean(),
24611
24720
  frameCount: number().int(),
24612
- /** sha256 of what the frames taught when the version was frozen. */
24613
24721
  annotationHash: string(),
24614
- /** The export manifest schema the version was cut under. */
24615
24722
  manifestSchema: string(),
24616
24723
  stats: RetrainDatasetStatsSchema
24617
24724
  });
24618
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24619
- kind: literal("created"),
24620
- version: RetrainDatasetVersionSchema
24725
+ /**
24726
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24727
+ * the training cap. Resolved here so plan/start and the annotated export share
24728
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24729
+ */
24730
+ var RetrainTrainingCorpusSelectionSchema = object({
24731
+ collectionIds: array(string()).min(1),
24732
+ workState: _enum([
24733
+ "complete",
24734
+ "annotated_or_complete",
24735
+ "any_annotated"
24736
+ ]).default("complete")
24737
+ });
24738
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24739
+ kind: literal("resolved"),
24740
+ frameIds: array(string()).max(2e4).readonly(),
24741
+ stats: RetrainDatasetStatsSchema,
24742
+ annotationHash: string(),
24743
+ layout: RetrainExportLayoutSchema
24621
24744
  }), object({
24622
24745
  kind: literal("refused"),
24623
- reason: _enum([
24624
- "empty-name",
24625
- "duplicate-name",
24626
- "no-frames"
24627
- ])
24746
+ reason: _enum(["unknown-collection", "no-frames"]),
24747
+ detail: string()
24628
24748
  })]);
24629
24749
  /** The outcome of a lifecycle move owned by the retrain page. */
24630
24750
  var RetrainTransitionResultSchema = object({
@@ -25331,6 +25451,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25331
25451
  }), array(RetrainTrackSchema).readonly(), {
25332
25452
  kind: "query",
25333
25453
  auth: "admin"
25454
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
25455
+ kind: "query",
25456
+ auth: "admin"
25457
+ }), method(object({}), RetrainCorpusKpiSchema, {
25458
+ kind: "query",
25459
+ auth: "admin"
25334
25460
  }), method(object({ trackId: string() }), RetrainFrameListSchema, {
25335
25461
  kind: "query",
25336
25462
  auth: "admin"
@@ -25426,36 +25552,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25426
25552
  kind: "mutation",
25427
25553
  auth: "admin",
25428
25554
  timeoutMs: 12e4
25429
- }), method(object({
25430
- selection: RetrainDatasetSelectionSchema,
25431
- completeOnly: boolean().optional()
25432
- }), RetrainDatasetStatsSchema, {
25433
- kind: "query",
25434
- auth: "admin"
25435
- }), method(object({
25436
- name: string().max(120),
25437
- selection: RetrainDatasetSelectionSchema,
25438
- layout: RetrainExportLayoutSchema,
25439
- completeOnly: boolean()
25440
- }), CreateRetrainDatasetVersionResultSchema, {
25441
- kind: "mutation",
25442
- auth: "admin",
25443
- timeoutMs: 12e4
25444
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
25445
- kind: "query",
25446
- auth: "admin"
25447
- }), method(object({ id: string() }), object({ deleted: boolean() }), {
25448
- kind: "mutation",
25449
- auth: "admin"
25450
- }), method(object({ id: string() }), object({
25451
- found: boolean(),
25452
- annotationHash: string(),
25453
- matches: boolean(),
25454
- missingFrames: number().int()
25455
- }), {
25456
- kind: "query",
25457
- auth: "admin",
25458
- timeoutMs: 12e4
25459
25555
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
25460
25556
  kind: "query",
25461
25557
  auth: "admin"
@@ -25482,6 +25578,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25482
25578
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25483
25579
  kind: "query",
25484
25580
  auth: "admin"
25581
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25582
+ kind: "query",
25583
+ auth: "admin",
25584
+ timeoutMs: 6e4
25485
25585
  }), method(object({
25486
25586
  id: string(),
25487
25587
  name: string().max(120)
@@ -26098,11 +26198,14 @@ var HardwareClassIdSchema = _enum([
26098
26198
  "intel-n-series",
26099
26199
  "apple-m-base",
26100
26200
  "apple-m-pro",
26201
+ "amd-phoenix",
26101
26202
  "unknown"
26102
26203
  ]);
26103
26204
  var AcceleratorKindSchema = _enum([
26104
26205
  "intel-npu",
26105
26206
  "intel-igpu",
26207
+ "amd-igpu",
26208
+ "amd-npu",
26106
26209
  "x86-cpu",
26107
26210
  "arm-cpu",
26108
26211
  "apple-ane",
@@ -28032,6 +28135,8 @@ var AgentPipelineSettingsSchema = object({
28032
28135
  * address is wrong (multi-homed host, NAT, custom interface).
28033
28136
  */
28034
28137
  reachableHost: string().optional(),
28138
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
28139
+ color: NodeColorIdSchema.optional(),
28035
28140
  /**
28036
28141
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
28037
28142
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28581,8 +28686,9 @@ method(object({
28581
28686
  auth: "admin"
28582
28687
  }), method(object({
28583
28688
  agentNodeId: string(),
28584
- reachableHost: string().nullable()
28585
- }), object({ success: literal(true) }), {
28689
+ reachableHost: string().nullable().optional(),
28690
+ color: NodeColorIdSchema.nullable().optional()
28691
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28586
28692
  kind: "mutation",
28587
28693
  auth: "admin"
28588
28694
  }), method(object({
@@ -31658,7 +31764,7 @@ var CustomActionInputSchema = object({
31658
31764
  action: string().min(1),
31659
31765
  input: unknown()
31660
31766
  });
31661
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31767
+ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31662
31768
  addonId: string(),
31663
31769
  limit: number().min(1).max(500).default(100),
31664
31770
  level: LogLevelSchema$2.optional()
@@ -36737,7 +36843,13 @@ var TopologyNodeSchema = object({
36737
36843
  })).readonly(),
36738
36844
  processes: array(TopologyProcessSchema).readonly(),
36739
36845
  categories: array(TopologyCategorySchema).readonly(),
36740
- rootPackage: TopologyRootPackageSchema.nullable()
36846
+ rootPackage: TopologyRootPackageSchema.nullable(),
36847
+ /**
36848
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
36849
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
36850
+ * for offline rows and when the hub cannot tell.
36851
+ */
36852
+ meshTransport: _enum(["tls", "clear"]).optional()
36741
36853
  });
36742
36854
  var CapUsageEdgeSchema = object({
36743
36855
  callerAddonId: string(),
@@ -37150,6 +37262,7 @@ var OsdNamedTemplateSchema = object({
37150
37262
  });
37151
37263
  /** Where a slot's value comes from. */
37152
37264
  var OsdSourceSchema = discriminatedUnion("kind", [
37265
+ object({ kind: literal("none") }),
37153
37266
  object({
37154
37267
  kind: literal("static"),
37155
37268
  text: string().max(64)
@@ -37276,6 +37389,13 @@ method(object({ deviceId: number().int() }), object({
37276
37389
  }), object({ success: literal(true) }), {
37277
37390
  kind: "mutation",
37278
37391
  auth: "admin"
37392
+ }), method(object({
37393
+ deviceId: number().int(),
37394
+ slotId: string().min(1),
37395
+ enabled: boolean()
37396
+ }), object({ success: literal(true) }), {
37397
+ kind: "mutation",
37398
+ auth: "admin"
37279
37399
  }), method(object({
37280
37400
  sourceDeviceId: number().int(),
37281
37401
  targetDeviceId: number().int()
@@ -37707,7 +37827,15 @@ var GpuInfoSchema = object({
37707
37827
  name: string(),
37708
37828
  memoryMB: number().optional()
37709
37829
  });
37710
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
37830
+ var NpuInfoSchema = object({
37831
+ type: _enum([
37832
+ "apple-ane",
37833
+ "intel-npu",
37834
+ "amd-xdna"
37835
+ ]),
37836
+ name: string().optional(),
37837
+ generation: _enum(["xdna1", "xdna2"]).optional()
37838
+ });
37711
37839
  var CoralInfoSchema = object({
37712
37840
  type: literal("coral-edgetpu"),
37713
37841
  bus: string().optional()
@@ -42450,9 +42578,11 @@ var zoneRulesCapability = {
42450
42578
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
42451
42579
  * manifest entry and nothing else.
42452
42580
  *
42453
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
42454
- * `notification-output` posture); `describe` concat-fans across providers.
42455
- * Every method is `admin`: these spend money.
42581
+ * Collection of provider **types** (addons). Each addon owns zero or more
42582
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
42583
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
42584
+ * `entryId`; callers also pass the owning `addonId` as the collection
42585
+ * selector (broker posture). Every method is `admin`: these spend money.
42456
42586
  *
42457
42587
  * Every cloud object a provider creates is tagged with the orchestrator's
42458
42588
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -42476,8 +42606,8 @@ var TrainingRegionOptionSchema = object({
42476
42606
  priceMultiplier: number().positive()
42477
42607
  });
42478
42608
  /**
42479
- * The provider's per-account settings, as the orchestrator reads them. They
42480
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
42609
+ * The provider's per-entry settings, as the orchestrator reads them. They
42610
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
42481
42611
  * depend on the user's account), never hard-coded in the orchestrator.
42482
42612
  */
42483
42613
  var TrainingProviderDefaultsSchema = object({
@@ -42488,9 +42618,44 @@ var TrainingProviderDefaultsSchema = object({
42488
42618
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
42489
42619
  failedDatasetGraceHours: number().nonnegative()
42490
42620
  });
42621
+ /**
42622
+ * Entry form schema for a provider type — same seam as notification
42623
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
42624
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
42625
+ */
42626
+ var ConfigSchemaPassthrough = unknown();
42627
+ /** One creatable provider type, for the Add-entry dialog. */
42628
+ var TrainingProviderTypeSchema = object({
42629
+ typeId: string(),
42630
+ label: string(),
42631
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
42632
+ iconAsset: string(),
42633
+ /** Owning `training-provider` addon — collection selector for createEntry. */
42634
+ addonId: string(),
42635
+ /**
42636
+ * Fields for one entry of this type (credentials + defaults). Absent on a
42637
+ * type that only needs a name. Password fields are keychain-backed on the
42638
+ * provider addon (`secretStatePaths`), not D634 plaintext.
42639
+ */
42640
+ configSchema: ConfigSchemaPassthrough.optional()
42641
+ });
42642
+ /** One configured account / workspace under a provider type. */
42643
+ var TrainingProviderEntrySchema = object({
42644
+ entryId: string(),
42645
+ typeId: string(),
42646
+ name: string(),
42647
+ addonId: string(),
42648
+ /** Credentials are present — never the values. */
42649
+ configured: boolean()
42650
+ });
42491
42651
  var TrainingProviderDescriptorSchema = object({
42492
42652
  addonId: string(),
42493
- /** `modal`, `runpod`, `fake`, … */
42653
+ entryId: string(),
42654
+ typeId: string(),
42655
+ /** Operator-chosen entry name. */
42656
+ name: string(),
42657
+ iconAsset: string(),
42658
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
42494
42659
  kind: string(),
42495
42660
  label: string(),
42496
42661
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -42502,7 +42667,30 @@ var TrainingProviderDescriptorSchema = object({
42502
42667
  dataResidencyNote: string(),
42503
42668
  /** Credentials are present — never the values. */
42504
42669
  configured: boolean(),
42505
- defaults: TrainingProviderDefaultsSchema
42670
+ defaults: TrainingProviderDefaultsSchema,
42671
+ /**
42672
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
42673
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
42674
+ * never plaintext. Same hydrate contract as settings forms (D789).
42675
+ */
42676
+ formValues: record(string(), unknown()).optional()
42677
+ });
42678
+ /**
42679
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
42680
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
42681
+ * `{ $secretClear: true }` clears it.
42682
+ */
42683
+ var TrainingProviderUpdateEntryInputSchema = object({
42684
+ entryId: string().min(1),
42685
+ name: string().min(1),
42686
+ tokenId: string().optional(),
42687
+ tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
42688
+ environment: string().optional(),
42689
+ gpuType: string().optional(),
42690
+ region: string().optional(),
42691
+ costCapUsd: number().nonnegative().optional(),
42692
+ maxRuntimeSec: number().int().positive().optional(),
42693
+ failedDatasetGraceHours: number().nonnegative().optional()
42506
42694
  });
42507
42695
  var TrainingCredentialCheckSchema = object({
42508
42696
  ok: boolean(),
@@ -42554,20 +42742,33 @@ var TrainerSourceRefSchema = object({
42554
42742
  /** A commit sha (never a branch) — the job must be reproducible. */
42555
42743
  revision: string().regex(/^[0-9a-f]{7,64}$/)
42556
42744
  });
42745
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
42557
42746
  var JobRef = {
42558
- addonId: string(),
42747
+ entryId: string().min(1),
42559
42748
  jobKey: string().uuid()
42560
42749
  };
42561
42750
  var TrainingLogLineSchema = object({
42562
42751
  ts: number(),
42563
42752
  text: string()
42564
42753
  });
42565
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string() }), TrainingCredentialCheckSchema, {
42754
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
42755
+ typeId: string().min(1),
42756
+ name: string().min(1)
42757
+ }), object({ entryId: string() }), {
42758
+ kind: "mutation",
42759
+ auth: "admin"
42760
+ }), method(object({ entryId: string().min(1) }), object({ ok: literal(true) }), {
42761
+ kind: "mutation",
42762
+ auth: "admin"
42763
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
42764
+ kind: "mutation",
42765
+ auth: "admin"
42766
+ }), method(object({ entryId: string().min(1) }), TrainingCredentialCheckSchema, {
42566
42767
  kind: "mutation",
42567
42768
  auth: "admin",
42568
42769
  timeoutMs: 3e4
42569
42770
  }), method(object({
42570
- addonId: string(),
42771
+ entryId: string().min(1),
42571
42772
  gpuType: string(),
42572
42773
  region: string(),
42573
42774
  datasetBytes: number().int().nonnegative(),
@@ -42633,7 +42834,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42633
42834
  kind: "mutation",
42634
42835
  auth: "admin",
42635
42836
  timeoutMs: 5 * 6e4
42636
- }), method(object({ addonId: string() }), array(ProviderJobStatusSchema).readonly(), {
42837
+ }), method(object({ entryId: string().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
42637
42838
  auth: "admin",
42638
42839
  timeoutMs: 2 * 6e4
42639
42840
  });
@@ -42643,20 +42844,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42643
42844
  *
42644
42845
  * It owns what every provider must agree on, written once:
42645
42846
  *
42646
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
42647
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
42648
- * the export plan) and reaches this store through the five row methods
42649
- * below, so the Retrain page and the export did not change.
42650
42847
  * - **Jobs.** A persisted state machine, a reconcile loop against the
42651
42848
  * provider, a cost guard, a daily orphan sweep and the retention rules.
42652
42849
  * - **The return flow.** Verified artefacts → Model Studio
42653
42850
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
42654
42851
  * rollback. Nothing is ever registered automatically.
42655
42852
  *
42853
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
42854
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
42855
+ * moment and snapshotted on the job. No frozen dataset version.
42856
+ *
42656
42857
  * Every method is `admin`.
42657
42858
  */
42658
- /** A version WITH its frame list — what the export and a job read. */
42659
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string()).max(2e4).readonly() });
42859
+ /**
42860
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
42861
+ * Frame ids are resolved at plan/start — never a frozen version id.
42862
+ */
42863
+ var TrainingCorpusSelectionSchema = object({
42864
+ collectionIds: array(string()).min(1),
42865
+ /** Default complete-only for v1 */
42866
+ workState: _enum([
42867
+ "complete",
42868
+ "annotated_or_complete",
42869
+ "any_annotated"
42870
+ ]).default("complete")
42871
+ });
42660
42872
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
42661
42873
  var TrainingBaseModelSchema = object({
42662
42874
  modelId: string(),
@@ -42674,9 +42886,13 @@ var TrainingPresetSchema = _enum([
42674
42886
  "thorough"
42675
42887
  ]);
42676
42888
  var TrainingJobRequestSchema = object({
42677
- datasetVersionId: string().min(1),
42678
- /** The `training-provider` addon that runs it. */
42679
- addonId: string().min(1),
42889
+ /** Live collection + work-state criteria; resolved at plan/start. */
42890
+ selection: TrainingCorpusSelectionSchema,
42891
+ /**
42892
+ * The provider **entry** that runs it (credentials + defaults).
42893
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
42894
+ */
42895
+ entryId: string().min(1),
42680
42896
  gpuType: string().min(1),
42681
42897
  region: string(),
42682
42898
  baseModelId: string().min(1),
@@ -42735,6 +42951,7 @@ var TrainingJobPlanSchema = object({
42735
42951
  * result lives after the operator acted on it.
42736
42952
  */
42737
42953
  var TrainingJobStateSchema = _enum([
42954
+ "queued",
42738
42955
  "uploading",
42739
42956
  "submitted",
42740
42957
  "starting",
@@ -42788,6 +43005,11 @@ var TrainingJobSchema = object({
42788
43005
  createdAt: number(),
42789
43006
  updatedAt: number(),
42790
43007
  state: TrainingJobStateSchema,
43008
+ /**
43009
+ * Shared by every job enqueued together via `startJobBatch`.
43010
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
43011
+ */
43012
+ batchId: string().nullable().default(null),
42791
43013
  stage: TrainingStageSchema.nullable(),
42792
43014
  failure: object({
42793
43015
  reason: TrainingFailureReasonSchema,
@@ -42799,6 +43021,12 @@ var TrainingJobSchema = object({
42799
43021
  maxRuntimeSec: number().int().positive(),
42800
43022
  trainer: TrainerSourceRefSchema,
42801
43023
  datasetLayout: RetrainExportLayoutSchema,
43024
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
43025
+ frameCount: number().int().nonnegative(),
43026
+ /** Resolved frame ids at start — the archive ships exactly these. */
43027
+ frameIds: array(string()).max(2e4).readonly(),
43028
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
43029
+ annotationHash: string(),
42802
43030
  dataset: object({
42803
43031
  bytes: number().int(),
42804
43032
  sha256: string(),
@@ -42840,13 +43068,7 @@ var TrainingJobSchema = object({
42840
43068
  canary: TrainingCanarySchema.nullable()
42841
43069
  });
42842
43070
  var IdInput = object({ id: string().min(1) });
42843
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42844
- kind: "mutation",
42845
- auth: "admin"
42846
- }), 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() }), {
42847
- kind: "mutation",
42848
- auth: "admin"
42849
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
43071
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
42850
43072
  auth: "admin",
42851
43073
  timeoutMs: 6e4
42852
43074
  }), method(TrainingJobRequestSchema.extend({
@@ -42865,6 +43087,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42865
43087
  kind: "mutation",
42866
43088
  auth: "admin",
42867
43089
  timeoutMs: 12e4
43090
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
43091
+ baseModelIds: array(string().min(1)).min(1),
43092
+ name: string().min(1).max(120),
43093
+ maxCostUsd: number().positive(),
43094
+ maxRuntimeSec: number().int().positive(),
43095
+ idempotencyKey: string().min(8).max(80)
43096
+ }), discriminatedUnion("kind", [object({
43097
+ kind: literal("started"),
43098
+ batchId: string(),
43099
+ jobs: array(TrainingJobSchema).min(1).readonly()
43100
+ }), object({
43101
+ kind: literal("refused"),
43102
+ reason: TrainingRefusalReasonSchema,
43103
+ detail: string()
43104
+ })]), {
43105
+ kind: "mutation",
43106
+ auth: "admin",
43107
+ timeoutMs: 12e4
42868
43108
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
42869
43109
  kind: "mutation",
42870
43110
  auth: "admin",
@@ -48423,6 +48663,36 @@ Object.freeze({
48423
48663
  addonId: null,
48424
48664
  access: "view"
48425
48665
  },
48666
+ "oidcConnections.connectionFormSchema": {
48667
+ capName: "oidc-connections",
48668
+ capScope: "system",
48669
+ addonId: null,
48670
+ access: "view"
48671
+ },
48672
+ "oidcConnections.createConnection": {
48673
+ capName: "oidc-connections",
48674
+ capScope: "system",
48675
+ addonId: null,
48676
+ access: "create"
48677
+ },
48678
+ "oidcConnections.deleteConnection": {
48679
+ capName: "oidc-connections",
48680
+ capScope: "system",
48681
+ addonId: null,
48682
+ access: "delete"
48683
+ },
48684
+ "oidcConnections.listConnections": {
48685
+ capName: "oidc-connections",
48686
+ capScope: "system",
48687
+ addonId: null,
48688
+ access: "view"
48689
+ },
48690
+ "oidcConnections.updateConnection": {
48691
+ capName: "oidc-connections",
48692
+ capScope: "system",
48693
+ addonId: null,
48694
+ access: "create"
48695
+ },
48426
48696
  "osd.getStatus": {
48427
48697
  capName: "osd",
48428
48698
  capScope: "device",
@@ -48495,6 +48765,12 @@ Object.freeze({
48495
48765
  addonId: null,
48496
48766
  access: "create"
48497
48767
  },
48768
+ "osdManager.setSlotCameraEnabled": {
48769
+ capName: "osd-manager",
48770
+ capScope: "system",
48771
+ addonId: null,
48772
+ access: "create"
48773
+ },
48498
48774
  "osdManager.upsertTemplate": {
48499
48775
  capName: "osd-manager",
48500
48776
  capScope: "system",
@@ -48633,12 +48909,6 @@ Object.freeze({
48633
48909
  addonId: null,
48634
48910
  access: "create"
48635
48911
  },
48636
- "pipelineAnalytics.createRetrainDatasetVersion": {
48637
- capName: "pipeline-analytics",
48638
- capScope: "device",
48639
- addonId: null,
48640
- access: "create"
48641
- },
48642
48912
  "pipelineAnalytics.deleteDeviceEvents": {
48643
48913
  capName: "pipeline-analytics",
48644
48914
  capScope: "device",
@@ -48651,12 +48921,6 @@ Object.freeze({
48651
48921
  addonId: null,
48652
48922
  access: "delete"
48653
48923
  },
48654
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
48655
- capName: "pipeline-analytics",
48656
- capScope: "device",
48657
- addonId: null,
48658
- access: "delete"
48659
- },
48660
48924
  "pipelineAnalytics.deleteTracks": {
48661
48925
  capName: "pipeline-analytics",
48662
48926
  capScope: "device",
@@ -48759,6 +49023,12 @@ Object.freeze({
48759
49023
  addonId: null,
48760
49024
  access: "view"
48761
49025
  },
49026
+ "pipelineAnalytics.getRetrainCorpusKpi": {
49027
+ capName: "pipeline-analytics",
49028
+ capScope: "device",
49029
+ addonId: null,
49030
+ access: "view"
49031
+ },
48762
49032
  "pipelineAnalytics.getRetrainExportUrl": {
48763
49033
  capName: "pipeline-analytics",
48764
49034
  capScope: "device",
@@ -48879,7 +49149,7 @@ Object.freeze({
48879
49149
  addonId: null,
48880
49150
  access: "view"
48881
49151
  },
48882
- "pipelineAnalytics.listRetrainDatasetVersions": {
49152
+ "pipelineAnalytics.listRetrainCorpusPage": {
48883
49153
  capName: "pipeline-analytics",
48884
49154
  capScope: "device",
48885
49155
  addonId: null,
@@ -48933,12 +49203,6 @@ Object.freeze({
48933
49203
  addonId: null,
48934
49204
  access: "create"
48935
49205
  },
48936
- "pipelineAnalytics.previewRetrainDataset": {
48937
- capName: "pipeline-analytics",
48938
- capScope: "device",
48939
- addonId: null,
48940
- access: "view"
48941
- },
48942
49206
  "pipelineAnalytics.proposeRetrainAnnotations": {
48943
49207
  capName: "pipeline-analytics",
48944
49208
  capScope: "device",
@@ -49017,6 +49281,12 @@ Object.freeze({
49017
49281
  addonId: null,
49018
49282
  access: "create"
49019
49283
  },
49284
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
49285
+ capName: "pipeline-analytics",
49286
+ capScope: "device",
49287
+ addonId: null,
49288
+ access: "view"
49289
+ },
49020
49290
  "pipelineAnalytics.restageRetrainTrack": {
49021
49291
  capName: "pipeline-analytics",
49022
49292
  capScope: "device",
@@ -49077,12 +49347,6 @@ Object.freeze({
49077
49347
  addonId: null,
49078
49348
  access: "create"
49079
49349
  },
49080
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
49081
- capName: "pipeline-analytics",
49082
- capScope: "device",
49083
- addonId: null,
49084
- access: "view"
49085
- },
49086
49350
  "pipelineAnalytics.wipeAllAnalytics": {
49087
49351
  capName: "pipeline-analytics",
49088
49352
  capScope: "device",
@@ -51477,18 +51741,6 @@ Object.freeze({
51477
51741
  addonId: null,
51478
51742
  access: "create"
51479
51743
  },
51480
- "training.findDatasetVersionIdByName": {
51481
- capName: "training",
51482
- capScope: "system",
51483
- addonId: null,
51484
- access: "view"
51485
- },
51486
- "training.getDatasetVersion": {
51487
- capName: "training",
51488
- capScope: "system",
51489
- addonId: null,
51490
- access: "view"
51491
- },
51492
51744
  "training.getJob": {
51493
51745
  capName: "training",
51494
51746
  capScope: "system",
@@ -51507,12 +51759,6 @@ Object.freeze({
51507
51759
  addonId: null,
51508
51760
  access: "view"
51509
51761
  },
51510
- "training.listDatasetVersions": {
51511
- capName: "training",
51512
- capScope: "system",
51513
- addonId: null,
51514
- access: "view"
51515
- },
51516
51762
  "training.listJobs": {
51517
51763
  capName: "training",
51518
51764
  capScope: "system",
@@ -51525,54 +51771,66 @@ Object.freeze({
51525
51771
  addonId: null,
51526
51772
  access: "view"
51527
51773
  },
51528
- "training.putDatasetVersion": {
51774
+ "training.registerResult": {
51529
51775
  capName: "training",
51530
51776
  capScope: "system",
51531
51777
  addonId: null,
51532
51778
  access: "create"
51533
51779
  },
51534
- "training.registerResult": {
51780
+ "training.rollbackCanary": {
51535
51781
  capName: "training",
51536
51782
  capScope: "system",
51537
51783
  addonId: null,
51538
51784
  access: "create"
51539
51785
  },
51540
- "training.removeDatasetVersion": {
51786
+ "training.startJob": {
51541
51787
  capName: "training",
51542
51788
  capScope: "system",
51543
51789
  addonId: null,
51544
- access: "delete"
51790
+ access: "create"
51545
51791
  },
51546
- "training.rollbackCanary": {
51792
+ "training.startJobBatch": {
51547
51793
  capName: "training",
51548
51794
  capScope: "system",
51549
51795
  addonId: null,
51550
51796
  access: "create"
51551
51797
  },
51552
- "training.startJob": {
51553
- capName: "training",
51798
+ "trainingProvider.cancelJob": {
51799
+ capName: "training-provider",
51554
51800
  capScope: "system",
51555
51801
  addonId: null,
51556
51802
  access: "create"
51557
51803
  },
51558
- "trainingProvider.cancelJob": {
51804
+ "trainingProvider.cleanupJob": {
51559
51805
  capName: "training-provider",
51560
51806
  capScope: "system",
51561
51807
  addonId: null,
51562
51808
  access: "create"
51563
51809
  },
51564
- "trainingProvider.cleanupJob": {
51810
+ "trainingProvider.createEntry": {
51565
51811
  capName: "training-provider",
51566
51812
  capScope: "system",
51567
51813
  addonId: null,
51568
51814
  access: "create"
51569
51815
  },
51816
+ "trainingProvider.deleteEntry": {
51817
+ capName: "training-provider",
51818
+ capScope: "system",
51819
+ addonId: null,
51820
+ access: "delete"
51821
+ },
51570
51822
  "trainingProvider.describe": {
51571
51823
  capName: "training-provider",
51572
51824
  capScope: "system",
51573
51825
  addonId: null,
51574
51826
  access: "view"
51575
51827
  },
51828
+ "trainingProvider.describeTypes": {
51829
+ capName: "training-provider",
51830
+ capScope: "system",
51831
+ addonId: null,
51832
+ access: "view"
51833
+ },
51576
51834
  "trainingProvider.estimateJob": {
51577
51835
  capName: "training-provider",
51578
51836
  capScope: "system",
@@ -51585,6 +51843,12 @@ Object.freeze({
51585
51843
  addonId: null,
51586
51844
  access: "view"
51587
51845
  },
51846
+ "trainingProvider.listEntries": {
51847
+ capName: "training-provider",
51848
+ capScope: "system",
51849
+ addonId: null,
51850
+ access: "view"
51851
+ },
51588
51852
  "trainingProvider.listJobEvents": {
51589
51853
  capName: "training-provider",
51590
51854
  capScope: "system",
@@ -51615,6 +51879,12 @@ Object.freeze({
51615
51879
  addonId: null,
51616
51880
  access: "create"
51617
51881
  },
51882
+ "trainingProvider.updateEntry": {
51883
+ capName: "training-provider",
51884
+ capScope: "system",
51885
+ addonId: null,
51886
+ access: "create"
51887
+ },
51618
51888
  "trainingProvider.uploadDataset": {
51619
51889
  capName: "training-provider",
51620
51890
  capScope: "system",
@@ -54821,6 +55091,11 @@ Object.freeze({
54821
55091
  form: "single",
54822
55092
  optional: false
54823
55093
  }],
55094
+ "osdManager.setSlotCameraEnabled": [{
55095
+ name: "deviceId",
55096
+ form: "single",
55097
+ optional: false
55098
+ }],
54824
55099
  "petFeeder.callPet": [{
54825
55100
  name: "deviceId",
54826
55101
  form: "single",
@@ -55041,6 +55316,11 @@ Object.freeze({
55041
55316
  form: "array",
55042
55317
  optional: false
55043
55318
  }],
55319
+ "pipelineAnalytics.listRetrainCorpusPage": [{
55320
+ name: "deviceIds",
55321
+ form: "array",
55322
+ optional: true
55323
+ }],
55044
55324
  "pipelineAnalytics.listRetrainStaging": [{
55045
55325
  name: "deviceIds",
55046
55326
  form: "array",
@@ -56150,6 +56430,7 @@ Object.freeze({
56150
56430
  });
56151
56431
  Object.freeze({
56152
56432
  "broker": "broker",
56433
+ "calendar-source": "calendar",
56153
56434
  "device-export": "device-export",
56154
56435
  "llm": "ai",
56155
56436
  "mesh-network": "mesh",
@@ -56635,6 +56916,8 @@ var STATE_SUMMARY_VARS = [
56635
56916
  [...RULE_TEXT],
56636
56917
  [...RULE_TEXT],
56637
56918
  [...RULE_TEXT],
56919
+ [...RULE_TEXT],
56920
+ [...RULE_TEXT],
56638
56921
  ([...RULE_TEXT], [...UPDATES]),
56639
56922
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
56640
56923
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),