@camstack/addon-provider-ecowitt 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
@@ -5380,7 +5380,7 @@ var ZodIssueCode$1 = {
5380
5380
  var ZodFirstPartyTypeKind$1;
5381
5381
  ZodFirstPartyTypeKind$1 || (ZodFirstPartyTypeKind$1 = {});
5382
5382
  //#endregion
5383
- //#region ../types/dist/sleep-r3RWkGVx.mjs
5383
+ //#region ../types/dist/sleep-DwAQ9sqX.mjs
5384
5384
  /**
5385
5385
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5386
5386
  * window to float samples (D455).
@@ -9386,6 +9386,16 @@ var CompositionSchema = object({
9386
9386
  seen.add(feature.cap);
9387
9387
  });
9388
9388
  });
9389
+ var NodeColorIdSchema = _enum([
9390
+ "node-a",
9391
+ "node-b",
9392
+ "node-c",
9393
+ "node-d",
9394
+ "node-e",
9395
+ "node-f",
9396
+ "node-g",
9397
+ "node-h"
9398
+ ]);
9389
9399
  new Set([
9390
9400
  "track",
9391
9401
  "face",
@@ -18528,14 +18538,14 @@ var LlmProfileSchema = object({
18528
18538
  /** ConfigUISchema tree passed through untyped on the wire (the
18529
18539
  * notification-output `ConfigSchemaPassthrough` precedent at
18530
18540
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18531
- var ConfigSchemaPassthrough$1 = unknown();
18541
+ var ConfigSchemaPassthrough$3 = unknown();
18532
18542
  var LlmProfileKindDescriptorSchema = object({
18533
18543
  kind: LlmProfileKindSchema,
18534
18544
  label: string(),
18535
18545
  icon: string(),
18536
18546
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18537
18547
  addonId: string(),
18538
- configSchema: ConfigSchemaPassthrough$1
18548
+ configSchema: ConfigSchemaPassthrough$3
18539
18549
  });
18540
18550
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18541
18551
  var LlmDefaultSchema = object({
@@ -19656,7 +19666,7 @@ var TargetKindCapsSchema = object({
19656
19666
  * the union is large and not meant for runtime validation here; the exported
19657
19667
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19658
19668
  */
19659
- var ConfigSchemaPassthrough = unknown();
19669
+ var ConfigSchemaPassthrough$2 = unknown();
19660
19670
  var TargetKindSchema = object({
19661
19671
  kind: string(),
19662
19672
  label: string(),
@@ -19693,7 +19703,7 @@ var TargetKindSchema = object({
19693
19703
  * its raster path, which is the safe default for an unknown image.
19694
19704
  */
19695
19705
  iconMediaType: string().optional(),
19696
- configSchema: ConfigSchemaPassthrough,
19706
+ configSchema: ConfigSchemaPassthrough$2,
19697
19707
  /**
19698
19708
  * The config keys that decide WHERE this kind's secrets are sent (server,
19699
19709
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -23030,6 +23040,61 @@ var OauthIntegrationDescriptorSchema = object({
23030
23040
  });
23031
23041
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
23032
23042
  /**
23043
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
23044
+ *
23045
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
23046
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
23047
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
23048
+ * immutable after create.
23049
+ */
23050
+ var ConfigSchemaPassthrough$1 = unknown();
23051
+ var OidcConnectionSchema = object({
23052
+ id: string().min(1),
23053
+ displayName: string(),
23054
+ icon: string(),
23055
+ issuerUrl: string(),
23056
+ clientId: string(),
23057
+ /** Client id + secret present — never the secret value. */
23058
+ configured: boolean(),
23059
+ /**
23060
+ * Values for the connection form schema. `clientSecret` is a keychain
23061
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
23062
+ */
23063
+ formValues: record(string(), unknown()).optional()
23064
+ });
23065
+ /**
23066
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
23067
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
23068
+ */
23069
+ var OidcConnectionUpdateInputSchema = object({
23070
+ id: string().min(1),
23071
+ displayName: string().min(1),
23072
+ icon: string().optional(),
23073
+ issuerUrl: string().optional(),
23074
+ clientId: string().optional(),
23075
+ clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
23076
+ redirectUri: string().optional(),
23077
+ scopes: string().optional(),
23078
+ usernameClaim: _enum([
23079
+ "preferred_username",
23080
+ "email",
23081
+ "sub"
23082
+ ]).optional()
23083
+ });
23084
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
23085
+ id: string().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
23086
+ displayName: string().min(1)
23087
+ }), object({ id: string() }), {
23088
+ kind: "mutation",
23089
+ auth: "admin"
23090
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
23091
+ kind: "mutation",
23092
+ auth: "admin"
23093
+ }), method(object({ id: string().min(1) }), object({ ok: literal(true) }), {
23094
+ kind: "mutation",
23095
+ auth: "admin"
23096
+ });
23097
+ /**
23033
23098
  * What started a camera's onboard motion (D672). `camera` is the camera's own
23034
23099
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
23035
23100
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -24386,24 +24451,69 @@ var RetrainFrameListSchema = object({
24386
24451
  /** What the page pre-selects — the native key frame when one survives. */
24387
24452
  autoPickMediaId: number().int().optional()
24388
24453
  });
24454
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
24455
+ var RetrainFrameWorkStateSchema = _enum([
24456
+ "unannotated",
24457
+ "annotated",
24458
+ "complete"
24459
+ ]);
24460
+ /**
24461
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
24462
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
24463
+ */
24464
+ var RetrainCorpusFilterSchema = object({
24465
+ workState: RetrainFrameWorkStateSchema.optional(),
24466
+ deviceIds: array(number()).max(500).optional(),
24467
+ /** When set, only frames in this named collection. */
24468
+ collectionId: string().optional(),
24469
+ /** Frames that carry at least one saved annotation in one of these classes. */
24470
+ classes: array(RetrainMacroClassSchema).optional(),
24471
+ page: number().int().positive().default(1),
24472
+ pageSize: number().int().positive().max(100).default(50)
24473
+ });
24474
+ var RetrainCorpusPageSchema = object({
24475
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
24476
+ total: number().int().nonnegative(),
24477
+ page: number().int().positive(),
24478
+ pageSize: number().int().positive()
24479
+ });
24480
+ var RetrainCorpusKpiCameraRowSchema = object({
24481
+ deviceId: number(),
24482
+ unannotated: number().int().nonnegative(),
24483
+ annotated: number().int().nonnegative(),
24484
+ complete: number().int().nonnegative(),
24485
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24486
+ * `null` when the corpus is empty (no ratio). */
24487
+ pctOfCorpus: number().min(0).max(1).nullable()
24488
+ });
24489
+ var RetrainCorpusKpiSchema = object({
24490
+ total: number().int().nonnegative(),
24491
+ unannotated: number().int().nonnegative(),
24492
+ annotated: number().int().nonnegative(),
24493
+ complete: number().int().nonnegative(),
24494
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24495
+ });
24389
24496
  /**
24390
24497
  * Which frames an annotated export carries. Every field narrows; an empty
24391
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
24392
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
24393
- * the primitive a version export uses; `batchId` re-selects what an earlier
24394
- * export carried (`exportedInBatch`).
24498
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24499
+ * download uses; `batchId` re-selects what an earlier export carried
24500
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24501
+ * resolves to `frameIds` at plan/start.
24395
24502
  */
24396
24503
  var RetrainExportFilterSchema = object({
24397
24504
  deviceIds: array(number()).optional(),
24398
24505
  frameIds: array(string()).max(2e4).optional(),
24399
24506
  /** Only frames in at least one of these named collections. */
24400
24507
  collectionIds: array(string()).max(200).optional(),
24401
- /** Exactly the frames of this dataset version (and its completeOnly). An
24402
- * unknown id selects nothing. */
24403
- datasetVersionId: string().optional(),
24508
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24509
+ collectionId: string().optional(),
24404
24510
  batchId: string().optional(),
24405
24511
  /** Only frames the operator marked complete (all subjects boxed). */
24406
- completeOnly: boolean().optional()
24512
+ completeOnly: boolean().optional(),
24513
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24514
+ workState: RetrainFrameWorkStateSchema.optional(),
24515
+ /** Frames with at least one saved annotation in one of these classes. */
24516
+ classes: array(RetrainMacroClassSchema).optional()
24407
24517
  });
24408
24518
  /**
24409
24519
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24603,8 +24713,7 @@ var RetrainDatasetStatsSchema = object({
24603
24713
  completeFrames: number().int()
24604
24714
  })).readonly()
24605
24715
  });
24606
- /** An immutable dataset version, without its frame list. */
24607
- var RetrainDatasetVersionSchema = object({
24716
+ object({
24608
24717
  id: string(),
24609
24718
  name: string(),
24610
24719
  createdAt: number(),
@@ -24612,22 +24721,33 @@ var RetrainDatasetVersionSchema = object({
24612
24721
  layout: RetrainExportLayoutSchema,
24613
24722
  completeOnly: boolean(),
24614
24723
  frameCount: number().int(),
24615
- /** sha256 of what the frames taught when the version was frozen. */
24616
24724
  annotationHash: string(),
24617
- /** The export manifest schema the version was cut under. */
24618
24725
  manifestSchema: string(),
24619
24726
  stats: RetrainDatasetStatsSchema
24620
24727
  });
24621
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24622
- kind: literal("created"),
24623
- version: RetrainDatasetVersionSchema
24728
+ /**
24729
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24730
+ * the training cap. Resolved here so plan/start and the annotated export share
24731
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24732
+ */
24733
+ var RetrainTrainingCorpusSelectionSchema = object({
24734
+ collectionIds: array(string()).min(1),
24735
+ workState: _enum([
24736
+ "complete",
24737
+ "annotated_or_complete",
24738
+ "any_annotated"
24739
+ ]).default("complete")
24740
+ });
24741
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24742
+ kind: literal("resolved"),
24743
+ frameIds: array(string()).max(2e4).readonly(),
24744
+ stats: RetrainDatasetStatsSchema,
24745
+ annotationHash: string(),
24746
+ layout: RetrainExportLayoutSchema
24624
24747
  }), object({
24625
24748
  kind: literal("refused"),
24626
- reason: _enum([
24627
- "empty-name",
24628
- "duplicate-name",
24629
- "no-frames"
24630
- ])
24749
+ reason: _enum(["unknown-collection", "no-frames"]),
24750
+ detail: string()
24631
24751
  })]);
24632
24752
  /** The outcome of a lifecycle move owned by the retrain page. */
24633
24753
  var RetrainTransitionResultSchema = object({
@@ -25334,6 +25454,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25334
25454
  }), array(RetrainTrackSchema).readonly(), {
25335
25455
  kind: "query",
25336
25456
  auth: "admin"
25457
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
25458
+ kind: "query",
25459
+ auth: "admin"
25460
+ }), method(object({}), RetrainCorpusKpiSchema, {
25461
+ kind: "query",
25462
+ auth: "admin"
25337
25463
  }), method(object({ trackId: string() }), RetrainFrameListSchema, {
25338
25464
  kind: "query",
25339
25465
  auth: "admin"
@@ -25429,36 +25555,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25429
25555
  kind: "mutation",
25430
25556
  auth: "admin",
25431
25557
  timeoutMs: 12e4
25432
- }), method(object({
25433
- selection: RetrainDatasetSelectionSchema,
25434
- completeOnly: boolean().optional()
25435
- }), RetrainDatasetStatsSchema, {
25436
- kind: "query",
25437
- auth: "admin"
25438
- }), method(object({
25439
- name: string().max(120),
25440
- selection: RetrainDatasetSelectionSchema,
25441
- layout: RetrainExportLayoutSchema,
25442
- completeOnly: boolean()
25443
- }), CreateRetrainDatasetVersionResultSchema, {
25444
- kind: "mutation",
25445
- auth: "admin",
25446
- timeoutMs: 12e4
25447
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
25448
- kind: "query",
25449
- auth: "admin"
25450
- }), method(object({ id: string() }), object({ deleted: boolean() }), {
25451
- kind: "mutation",
25452
- auth: "admin"
25453
- }), method(object({ id: string() }), object({
25454
- found: boolean(),
25455
- annotationHash: string(),
25456
- matches: boolean(),
25457
- missingFrames: number().int()
25458
- }), {
25459
- kind: "query",
25460
- auth: "admin",
25461
- timeoutMs: 12e4
25462
25558
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
25463
25559
  kind: "query",
25464
25560
  auth: "admin"
@@ -25485,6 +25581,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25485
25581
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25486
25582
  kind: "query",
25487
25583
  auth: "admin"
25584
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25585
+ kind: "query",
25586
+ auth: "admin",
25587
+ timeoutMs: 6e4
25488
25588
  }), method(object({
25489
25589
  id: string(),
25490
25590
  name: string().max(120)
@@ -26101,11 +26201,14 @@ var HardwareClassIdSchema = _enum([
26101
26201
  "intel-n-series",
26102
26202
  "apple-m-base",
26103
26203
  "apple-m-pro",
26204
+ "amd-phoenix",
26104
26205
  "unknown"
26105
26206
  ]);
26106
26207
  var AcceleratorKindSchema = _enum([
26107
26208
  "intel-npu",
26108
26209
  "intel-igpu",
26210
+ "amd-igpu",
26211
+ "amd-npu",
26109
26212
  "x86-cpu",
26110
26213
  "arm-cpu",
26111
26214
  "apple-ane",
@@ -28035,6 +28138,8 @@ var AgentPipelineSettingsSchema = object({
28035
28138
  * address is wrong (multi-homed host, NAT, custom interface).
28036
28139
  */
28037
28140
  reachableHost: string().optional(),
28141
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
28142
+ color: NodeColorIdSchema.optional(),
28038
28143
  /**
28039
28144
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
28040
28145
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28584,8 +28689,9 @@ method(object({
28584
28689
  auth: "admin"
28585
28690
  }), method(object({
28586
28691
  agentNodeId: string(),
28587
- reachableHost: string().nullable()
28588
- }), object({ success: literal(true) }), {
28692
+ reachableHost: string().nullable().optional(),
28693
+ color: NodeColorIdSchema.nullable().optional()
28694
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28589
28695
  kind: "mutation",
28590
28696
  auth: "admin"
28591
28697
  }), method(object({
@@ -31661,7 +31767,7 @@ var CustomActionInputSchema = object({
31661
31767
  action: string().min(1),
31662
31768
  input: unknown()
31663
31769
  });
31664
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31770
+ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31665
31771
  addonId: string(),
31666
31772
  limit: number().min(1).max(500).default(100),
31667
31773
  level: LogLevelSchema$2.optional()
@@ -36723,7 +36829,13 @@ var TopologyNodeSchema = object({
36723
36829
  })).readonly(),
36724
36830
  processes: array(TopologyProcessSchema).readonly(),
36725
36831
  categories: array(TopologyCategorySchema).readonly(),
36726
- rootPackage: TopologyRootPackageSchema.nullable()
36832
+ rootPackage: TopologyRootPackageSchema.nullable(),
36833
+ /**
36834
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
36835
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
36836
+ * for offline rows and when the hub cannot tell.
36837
+ */
36838
+ meshTransport: _enum(["tls", "clear"]).optional()
36727
36839
  });
36728
36840
  var CapUsageEdgeSchema = object({
36729
36841
  callerAddonId: string(),
@@ -37136,6 +37248,7 @@ var OsdNamedTemplateSchema = object({
37136
37248
  });
37137
37249
  /** Where a slot's value comes from. */
37138
37250
  var OsdSourceSchema = discriminatedUnion("kind", [
37251
+ object({ kind: literal("none") }),
37139
37252
  object({
37140
37253
  kind: literal("static"),
37141
37254
  text: string().max(64)
@@ -37262,6 +37375,13 @@ method(object({ deviceId: number().int() }), object({
37262
37375
  }), object({ success: literal(true) }), {
37263
37376
  kind: "mutation",
37264
37377
  auth: "admin"
37378
+ }), method(object({
37379
+ deviceId: number().int(),
37380
+ slotId: string().min(1),
37381
+ enabled: boolean()
37382
+ }), object({ success: literal(true) }), {
37383
+ kind: "mutation",
37384
+ auth: "admin"
37265
37385
  }), method(object({
37266
37386
  sourceDeviceId: number().int(),
37267
37387
  targetDeviceId: number().int()
@@ -37693,7 +37813,15 @@ var GpuInfoSchema = object({
37693
37813
  name: string(),
37694
37814
  memoryMB: number().optional()
37695
37815
  });
37696
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
37816
+ var NpuInfoSchema = object({
37817
+ type: _enum([
37818
+ "apple-ane",
37819
+ "intel-npu",
37820
+ "amd-xdna"
37821
+ ]),
37822
+ name: string().optional(),
37823
+ generation: _enum(["xdna1", "xdna2"]).optional()
37824
+ });
37697
37825
  var CoralInfoSchema = object({
37698
37826
  type: literal("coral-edgetpu"),
37699
37827
  bus: string().optional()
@@ -42436,9 +42564,11 @@ var zoneRulesCapability = {
42436
42564
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
42437
42565
  * manifest entry and nothing else.
42438
42566
  *
42439
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
42440
- * `notification-output` posture); `describe` concat-fans across providers.
42441
- * Every method is `admin`: these spend money.
42567
+ * Collection of provider **types** (addons). Each addon owns zero or more
42568
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
42569
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
42570
+ * `entryId`; callers also pass the owning `addonId` as the collection
42571
+ * selector (broker posture). Every method is `admin`: these spend money.
42442
42572
  *
42443
42573
  * Every cloud object a provider creates is tagged with the orchestrator's
42444
42574
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -42462,8 +42592,8 @@ var TrainingRegionOptionSchema = object({
42462
42592
  priceMultiplier: number().positive()
42463
42593
  });
42464
42594
  /**
42465
- * The provider's per-account settings, as the orchestrator reads them. They
42466
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
42595
+ * The provider's per-entry settings, as the orchestrator reads them. They
42596
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
42467
42597
  * depend on the user's account), never hard-coded in the orchestrator.
42468
42598
  */
42469
42599
  var TrainingProviderDefaultsSchema = object({
@@ -42474,9 +42604,44 @@ var TrainingProviderDefaultsSchema = object({
42474
42604
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
42475
42605
  failedDatasetGraceHours: number().nonnegative()
42476
42606
  });
42607
+ /**
42608
+ * Entry form schema for a provider type — same seam as notification
42609
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
42610
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
42611
+ */
42612
+ var ConfigSchemaPassthrough = unknown();
42613
+ /** One creatable provider type, for the Add-entry dialog. */
42614
+ var TrainingProviderTypeSchema = object({
42615
+ typeId: string(),
42616
+ label: string(),
42617
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
42618
+ iconAsset: string(),
42619
+ /** Owning `training-provider` addon — collection selector for createEntry. */
42620
+ addonId: string(),
42621
+ /**
42622
+ * Fields for one entry of this type (credentials + defaults). Absent on a
42623
+ * type that only needs a name. Password fields are keychain-backed on the
42624
+ * provider addon (`secretStatePaths`), not D634 plaintext.
42625
+ */
42626
+ configSchema: ConfigSchemaPassthrough.optional()
42627
+ });
42628
+ /** One configured account / workspace under a provider type. */
42629
+ var TrainingProviderEntrySchema = object({
42630
+ entryId: string(),
42631
+ typeId: string(),
42632
+ name: string(),
42633
+ addonId: string(),
42634
+ /** Credentials are present — never the values. */
42635
+ configured: boolean()
42636
+ });
42477
42637
  var TrainingProviderDescriptorSchema = object({
42478
42638
  addonId: string(),
42479
- /** `modal`, `runpod`, `fake`, … */
42639
+ entryId: string(),
42640
+ typeId: string(),
42641
+ /** Operator-chosen entry name. */
42642
+ name: string(),
42643
+ iconAsset: string(),
42644
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
42480
42645
  kind: string(),
42481
42646
  label: string(),
42482
42647
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -42488,7 +42653,30 @@ var TrainingProviderDescriptorSchema = object({
42488
42653
  dataResidencyNote: string(),
42489
42654
  /** Credentials are present — never the values. */
42490
42655
  configured: boolean(),
42491
- defaults: TrainingProviderDefaultsSchema
42656
+ defaults: TrainingProviderDefaultsSchema,
42657
+ /**
42658
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
42659
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
42660
+ * never plaintext. Same hydrate contract as settings forms (D789).
42661
+ */
42662
+ formValues: record(string(), unknown()).optional()
42663
+ });
42664
+ /**
42665
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
42666
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
42667
+ * `{ $secretClear: true }` clears it.
42668
+ */
42669
+ var TrainingProviderUpdateEntryInputSchema = object({
42670
+ entryId: string().min(1),
42671
+ name: string().min(1),
42672
+ tokenId: string().optional(),
42673
+ tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
42674
+ environment: string().optional(),
42675
+ gpuType: string().optional(),
42676
+ region: string().optional(),
42677
+ costCapUsd: number().nonnegative().optional(),
42678
+ maxRuntimeSec: number().int().positive().optional(),
42679
+ failedDatasetGraceHours: number().nonnegative().optional()
42492
42680
  });
42493
42681
  var TrainingCredentialCheckSchema = object({
42494
42682
  ok: boolean(),
@@ -42540,20 +42728,33 @@ var TrainerSourceRefSchema = object({
42540
42728
  /** A commit sha (never a branch) — the job must be reproducible. */
42541
42729
  revision: string().regex(/^[0-9a-f]{7,64}$/)
42542
42730
  });
42731
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
42543
42732
  var JobRef = {
42544
- addonId: string(),
42733
+ entryId: string().min(1),
42545
42734
  jobKey: string().uuid()
42546
42735
  };
42547
42736
  var TrainingLogLineSchema = object({
42548
42737
  ts: number(),
42549
42738
  text: string()
42550
42739
  });
42551
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string() }), TrainingCredentialCheckSchema, {
42740
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
42741
+ typeId: string().min(1),
42742
+ name: string().min(1)
42743
+ }), object({ entryId: string() }), {
42744
+ kind: "mutation",
42745
+ auth: "admin"
42746
+ }), method(object({ entryId: string().min(1) }), object({ ok: literal(true) }), {
42747
+ kind: "mutation",
42748
+ auth: "admin"
42749
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
42750
+ kind: "mutation",
42751
+ auth: "admin"
42752
+ }), method(object({ entryId: string().min(1) }), TrainingCredentialCheckSchema, {
42552
42753
  kind: "mutation",
42553
42754
  auth: "admin",
42554
42755
  timeoutMs: 3e4
42555
42756
  }), method(object({
42556
- addonId: string(),
42757
+ entryId: string().min(1),
42557
42758
  gpuType: string(),
42558
42759
  region: string(),
42559
42760
  datasetBytes: number().int().nonnegative(),
@@ -42619,7 +42820,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42619
42820
  kind: "mutation",
42620
42821
  auth: "admin",
42621
42822
  timeoutMs: 5 * 6e4
42622
- }), method(object({ addonId: string() }), array(ProviderJobStatusSchema).readonly(), {
42823
+ }), method(object({ entryId: string().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
42623
42824
  auth: "admin",
42624
42825
  timeoutMs: 2 * 6e4
42625
42826
  });
@@ -42629,20 +42830,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42629
42830
  *
42630
42831
  * It owns what every provider must agree on, written once:
42631
42832
  *
42632
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
42633
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
42634
- * the export plan) and reaches this store through the five row methods
42635
- * below, so the Retrain page and the export did not change.
42636
42833
  * - **Jobs.** A persisted state machine, a reconcile loop against the
42637
42834
  * provider, a cost guard, a daily orphan sweep and the retention rules.
42638
42835
  * - **The return flow.** Verified artefacts → Model Studio
42639
42836
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
42640
42837
  * rollback. Nothing is ever registered automatically.
42641
42838
  *
42839
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
42840
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
42841
+ * moment and snapshotted on the job. No frozen dataset version.
42842
+ *
42642
42843
  * Every method is `admin`.
42643
42844
  */
42644
- /** A version WITH its frame list — what the export and a job read. */
42645
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string()).max(2e4).readonly() });
42845
+ /**
42846
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
42847
+ * Frame ids are resolved at plan/start — never a frozen version id.
42848
+ */
42849
+ var TrainingCorpusSelectionSchema = object({
42850
+ collectionIds: array(string()).min(1),
42851
+ /** Default complete-only for v1 */
42852
+ workState: _enum([
42853
+ "complete",
42854
+ "annotated_or_complete",
42855
+ "any_annotated"
42856
+ ]).default("complete")
42857
+ });
42646
42858
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
42647
42859
  var TrainingBaseModelSchema = object({
42648
42860
  modelId: string(),
@@ -42660,9 +42872,13 @@ var TrainingPresetSchema = _enum([
42660
42872
  "thorough"
42661
42873
  ]);
42662
42874
  var TrainingJobRequestSchema = object({
42663
- datasetVersionId: string().min(1),
42664
- /** The `training-provider` addon that runs it. */
42665
- addonId: string().min(1),
42875
+ /** Live collection + work-state criteria; resolved at plan/start. */
42876
+ selection: TrainingCorpusSelectionSchema,
42877
+ /**
42878
+ * The provider **entry** that runs it (credentials + defaults).
42879
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
42880
+ */
42881
+ entryId: string().min(1),
42666
42882
  gpuType: string().min(1),
42667
42883
  region: string(),
42668
42884
  baseModelId: string().min(1),
@@ -42721,6 +42937,7 @@ var TrainingJobPlanSchema = object({
42721
42937
  * result lives after the operator acted on it.
42722
42938
  */
42723
42939
  var TrainingJobStateSchema = _enum([
42940
+ "queued",
42724
42941
  "uploading",
42725
42942
  "submitted",
42726
42943
  "starting",
@@ -42774,6 +42991,11 @@ var TrainingJobSchema = object({
42774
42991
  createdAt: number(),
42775
42992
  updatedAt: number(),
42776
42993
  state: TrainingJobStateSchema,
42994
+ /**
42995
+ * Shared by every job enqueued together via `startJobBatch`.
42996
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
42997
+ */
42998
+ batchId: string().nullable().default(null),
42777
42999
  stage: TrainingStageSchema.nullable(),
42778
43000
  failure: object({
42779
43001
  reason: TrainingFailureReasonSchema,
@@ -42785,6 +43007,12 @@ var TrainingJobSchema = object({
42785
43007
  maxRuntimeSec: number().int().positive(),
42786
43008
  trainer: TrainerSourceRefSchema,
42787
43009
  datasetLayout: RetrainExportLayoutSchema,
43010
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
43011
+ frameCount: number().int().nonnegative(),
43012
+ /** Resolved frame ids at start — the archive ships exactly these. */
43013
+ frameIds: array(string()).max(2e4).readonly(),
43014
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
43015
+ annotationHash: string(),
42788
43016
  dataset: object({
42789
43017
  bytes: number().int(),
42790
43018
  sha256: string(),
@@ -42826,13 +43054,7 @@ var TrainingJobSchema = object({
42826
43054
  canary: TrainingCanarySchema.nullable()
42827
43055
  });
42828
43056
  var IdInput = object({ id: string().min(1) });
42829
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42830
- kind: "mutation",
42831
- auth: "admin"
42832
- }), 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() }), {
42833
- kind: "mutation",
42834
- auth: "admin"
42835
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
43057
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
42836
43058
  auth: "admin",
42837
43059
  timeoutMs: 6e4
42838
43060
  }), method(TrainingJobRequestSchema.extend({
@@ -42851,6 +43073,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42851
43073
  kind: "mutation",
42852
43074
  auth: "admin",
42853
43075
  timeoutMs: 12e4
43076
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
43077
+ baseModelIds: array(string().min(1)).min(1),
43078
+ name: string().min(1).max(120),
43079
+ maxCostUsd: number().positive(),
43080
+ maxRuntimeSec: number().int().positive(),
43081
+ idempotencyKey: string().min(8).max(80)
43082
+ }), discriminatedUnion("kind", [object({
43083
+ kind: literal("started"),
43084
+ batchId: string(),
43085
+ jobs: array(TrainingJobSchema).min(1).readonly()
43086
+ }), object({
43087
+ kind: literal("refused"),
43088
+ reason: TrainingRefusalReasonSchema,
43089
+ detail: string()
43090
+ })]), {
43091
+ kind: "mutation",
43092
+ auth: "admin",
43093
+ timeoutMs: 12e4
42854
43094
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
42855
43095
  kind: "mutation",
42856
43096
  auth: "admin",
@@ -48409,6 +48649,36 @@ Object.freeze({
48409
48649
  addonId: null,
48410
48650
  access: "view"
48411
48651
  },
48652
+ "oidcConnections.connectionFormSchema": {
48653
+ capName: "oidc-connections",
48654
+ capScope: "system",
48655
+ addonId: null,
48656
+ access: "view"
48657
+ },
48658
+ "oidcConnections.createConnection": {
48659
+ capName: "oidc-connections",
48660
+ capScope: "system",
48661
+ addonId: null,
48662
+ access: "create"
48663
+ },
48664
+ "oidcConnections.deleteConnection": {
48665
+ capName: "oidc-connections",
48666
+ capScope: "system",
48667
+ addonId: null,
48668
+ access: "delete"
48669
+ },
48670
+ "oidcConnections.listConnections": {
48671
+ capName: "oidc-connections",
48672
+ capScope: "system",
48673
+ addonId: null,
48674
+ access: "view"
48675
+ },
48676
+ "oidcConnections.updateConnection": {
48677
+ capName: "oidc-connections",
48678
+ capScope: "system",
48679
+ addonId: null,
48680
+ access: "create"
48681
+ },
48412
48682
  "osd.getStatus": {
48413
48683
  capName: "osd",
48414
48684
  capScope: "device",
@@ -48481,6 +48751,12 @@ Object.freeze({
48481
48751
  addonId: null,
48482
48752
  access: "create"
48483
48753
  },
48754
+ "osdManager.setSlotCameraEnabled": {
48755
+ capName: "osd-manager",
48756
+ capScope: "system",
48757
+ addonId: null,
48758
+ access: "create"
48759
+ },
48484
48760
  "osdManager.upsertTemplate": {
48485
48761
  capName: "osd-manager",
48486
48762
  capScope: "system",
@@ -48619,12 +48895,6 @@ Object.freeze({
48619
48895
  addonId: null,
48620
48896
  access: "create"
48621
48897
  },
48622
- "pipelineAnalytics.createRetrainDatasetVersion": {
48623
- capName: "pipeline-analytics",
48624
- capScope: "device",
48625
- addonId: null,
48626
- access: "create"
48627
- },
48628
48898
  "pipelineAnalytics.deleteDeviceEvents": {
48629
48899
  capName: "pipeline-analytics",
48630
48900
  capScope: "device",
@@ -48637,12 +48907,6 @@ Object.freeze({
48637
48907
  addonId: null,
48638
48908
  access: "delete"
48639
48909
  },
48640
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
48641
- capName: "pipeline-analytics",
48642
- capScope: "device",
48643
- addonId: null,
48644
- access: "delete"
48645
- },
48646
48910
  "pipelineAnalytics.deleteTracks": {
48647
48911
  capName: "pipeline-analytics",
48648
48912
  capScope: "device",
@@ -48745,6 +49009,12 @@ Object.freeze({
48745
49009
  addonId: null,
48746
49010
  access: "view"
48747
49011
  },
49012
+ "pipelineAnalytics.getRetrainCorpusKpi": {
49013
+ capName: "pipeline-analytics",
49014
+ capScope: "device",
49015
+ addonId: null,
49016
+ access: "view"
49017
+ },
48748
49018
  "pipelineAnalytics.getRetrainExportUrl": {
48749
49019
  capName: "pipeline-analytics",
48750
49020
  capScope: "device",
@@ -48865,7 +49135,7 @@ Object.freeze({
48865
49135
  addonId: null,
48866
49136
  access: "view"
48867
49137
  },
48868
- "pipelineAnalytics.listRetrainDatasetVersions": {
49138
+ "pipelineAnalytics.listRetrainCorpusPage": {
48869
49139
  capName: "pipeline-analytics",
48870
49140
  capScope: "device",
48871
49141
  addonId: null,
@@ -48919,12 +49189,6 @@ Object.freeze({
48919
49189
  addonId: null,
48920
49190
  access: "create"
48921
49191
  },
48922
- "pipelineAnalytics.previewRetrainDataset": {
48923
- capName: "pipeline-analytics",
48924
- capScope: "device",
48925
- addonId: null,
48926
- access: "view"
48927
- },
48928
49192
  "pipelineAnalytics.proposeRetrainAnnotations": {
48929
49193
  capName: "pipeline-analytics",
48930
49194
  capScope: "device",
@@ -49003,6 +49267,12 @@ Object.freeze({
49003
49267
  addonId: null,
49004
49268
  access: "create"
49005
49269
  },
49270
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
49271
+ capName: "pipeline-analytics",
49272
+ capScope: "device",
49273
+ addonId: null,
49274
+ access: "view"
49275
+ },
49006
49276
  "pipelineAnalytics.restageRetrainTrack": {
49007
49277
  capName: "pipeline-analytics",
49008
49278
  capScope: "device",
@@ -49063,12 +49333,6 @@ Object.freeze({
49063
49333
  addonId: null,
49064
49334
  access: "create"
49065
49335
  },
49066
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
49067
- capName: "pipeline-analytics",
49068
- capScope: "device",
49069
- addonId: null,
49070
- access: "view"
49071
- },
49072
49336
  "pipelineAnalytics.wipeAllAnalytics": {
49073
49337
  capName: "pipeline-analytics",
49074
49338
  capScope: "device",
@@ -51463,18 +51727,6 @@ Object.freeze({
51463
51727
  addonId: null,
51464
51728
  access: "create"
51465
51729
  },
51466
- "training.findDatasetVersionIdByName": {
51467
- capName: "training",
51468
- capScope: "system",
51469
- addonId: null,
51470
- access: "view"
51471
- },
51472
- "training.getDatasetVersion": {
51473
- capName: "training",
51474
- capScope: "system",
51475
- addonId: null,
51476
- access: "view"
51477
- },
51478
51730
  "training.getJob": {
51479
51731
  capName: "training",
51480
51732
  capScope: "system",
@@ -51493,12 +51745,6 @@ Object.freeze({
51493
51745
  addonId: null,
51494
51746
  access: "view"
51495
51747
  },
51496
- "training.listDatasetVersions": {
51497
- capName: "training",
51498
- capScope: "system",
51499
- addonId: null,
51500
- access: "view"
51501
- },
51502
51748
  "training.listJobs": {
51503
51749
  capName: "training",
51504
51750
  capScope: "system",
@@ -51511,54 +51757,66 @@ Object.freeze({
51511
51757
  addonId: null,
51512
51758
  access: "view"
51513
51759
  },
51514
- "training.putDatasetVersion": {
51760
+ "training.registerResult": {
51515
51761
  capName: "training",
51516
51762
  capScope: "system",
51517
51763
  addonId: null,
51518
51764
  access: "create"
51519
51765
  },
51520
- "training.registerResult": {
51766
+ "training.rollbackCanary": {
51521
51767
  capName: "training",
51522
51768
  capScope: "system",
51523
51769
  addonId: null,
51524
51770
  access: "create"
51525
51771
  },
51526
- "training.removeDatasetVersion": {
51772
+ "training.startJob": {
51527
51773
  capName: "training",
51528
51774
  capScope: "system",
51529
51775
  addonId: null,
51530
- access: "delete"
51776
+ access: "create"
51531
51777
  },
51532
- "training.rollbackCanary": {
51778
+ "training.startJobBatch": {
51533
51779
  capName: "training",
51534
51780
  capScope: "system",
51535
51781
  addonId: null,
51536
51782
  access: "create"
51537
51783
  },
51538
- "training.startJob": {
51539
- capName: "training",
51784
+ "trainingProvider.cancelJob": {
51785
+ capName: "training-provider",
51540
51786
  capScope: "system",
51541
51787
  addonId: null,
51542
51788
  access: "create"
51543
51789
  },
51544
- "trainingProvider.cancelJob": {
51790
+ "trainingProvider.cleanupJob": {
51545
51791
  capName: "training-provider",
51546
51792
  capScope: "system",
51547
51793
  addonId: null,
51548
51794
  access: "create"
51549
51795
  },
51550
- "trainingProvider.cleanupJob": {
51796
+ "trainingProvider.createEntry": {
51551
51797
  capName: "training-provider",
51552
51798
  capScope: "system",
51553
51799
  addonId: null,
51554
51800
  access: "create"
51555
51801
  },
51802
+ "trainingProvider.deleteEntry": {
51803
+ capName: "training-provider",
51804
+ capScope: "system",
51805
+ addonId: null,
51806
+ access: "delete"
51807
+ },
51556
51808
  "trainingProvider.describe": {
51557
51809
  capName: "training-provider",
51558
51810
  capScope: "system",
51559
51811
  addonId: null,
51560
51812
  access: "view"
51561
51813
  },
51814
+ "trainingProvider.describeTypes": {
51815
+ capName: "training-provider",
51816
+ capScope: "system",
51817
+ addonId: null,
51818
+ access: "view"
51819
+ },
51562
51820
  "trainingProvider.estimateJob": {
51563
51821
  capName: "training-provider",
51564
51822
  capScope: "system",
@@ -51571,6 +51829,12 @@ Object.freeze({
51571
51829
  addonId: null,
51572
51830
  access: "view"
51573
51831
  },
51832
+ "trainingProvider.listEntries": {
51833
+ capName: "training-provider",
51834
+ capScope: "system",
51835
+ addonId: null,
51836
+ access: "view"
51837
+ },
51574
51838
  "trainingProvider.listJobEvents": {
51575
51839
  capName: "training-provider",
51576
51840
  capScope: "system",
@@ -51601,6 +51865,12 @@ Object.freeze({
51601
51865
  addonId: null,
51602
51866
  access: "create"
51603
51867
  },
51868
+ "trainingProvider.updateEntry": {
51869
+ capName: "training-provider",
51870
+ capScope: "system",
51871
+ addonId: null,
51872
+ access: "create"
51873
+ },
51604
51874
  "trainingProvider.uploadDataset": {
51605
51875
  capName: "training-provider",
51606
51876
  capScope: "system",
@@ -54807,6 +55077,11 @@ Object.freeze({
54807
55077
  form: "single",
54808
55078
  optional: false
54809
55079
  }],
55080
+ "osdManager.setSlotCameraEnabled": [{
55081
+ name: "deviceId",
55082
+ form: "single",
55083
+ optional: false
55084
+ }],
54810
55085
  "petFeeder.callPet": [{
54811
55086
  name: "deviceId",
54812
55087
  form: "single",
@@ -55027,6 +55302,11 @@ Object.freeze({
55027
55302
  form: "array",
55028
55303
  optional: false
55029
55304
  }],
55305
+ "pipelineAnalytics.listRetrainCorpusPage": [{
55306
+ name: "deviceIds",
55307
+ form: "array",
55308
+ optional: true
55309
+ }],
55030
55310
  "pipelineAnalytics.listRetrainStaging": [{
55031
55311
  name: "deviceIds",
55032
55312
  form: "array",
@@ -56136,6 +56416,7 @@ Object.freeze({
56136
56416
  });
56137
56417
  Object.freeze({
56138
56418
  "broker": "broker",
56419
+ "calendar-source": "calendar",
56139
56420
  "device-export": "device-export",
56140
56421
  "llm": "ai",
56141
56422
  "mesh-network": "mesh",
@@ -56621,6 +56902,8 @@ var STATE_SUMMARY_VARS = [
56621
56902
  [...RULE_TEXT],
56622
56903
  [...RULE_TEXT],
56623
56904
  [...RULE_TEXT],
56905
+ [...RULE_TEXT],
56906
+ [...RULE_TEXT],
56624
56907
  ([...RULE_TEXT], [...UPDATES]),
56625
56908
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
56626
56909
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),