@camstack/addon-smtp-nodemailer 1.2.120 → 1.2.122

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.
@@ -5414,7 +5414,7 @@ var ZodIssueCode = {
5414
5414
  var ZodFirstPartyTypeKind;
5415
5415
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5416
5416
  //#endregion
5417
- //#region ../types/dist/sleep-r3RWkGVx.mjs
5417
+ //#region ../types/dist/sleep-DwAQ9sqX.mjs
5418
5418
  /**
5419
5419
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5420
5420
  * window to float samples (D455).
@@ -9343,6 +9343,16 @@ var CompositionSchema = object({
9343
9343
  seen.add(feature.cap);
9344
9344
  });
9345
9345
  });
9346
+ var NodeColorIdSchema = _enum([
9347
+ "node-a",
9348
+ "node-b",
9349
+ "node-c",
9350
+ "node-d",
9351
+ "node-e",
9352
+ "node-f",
9353
+ "node-g",
9354
+ "node-h"
9355
+ ]);
9346
9356
  new Set([
9347
9357
  "track",
9348
9358
  "face",
@@ -18082,14 +18092,14 @@ var LlmProfileSchema = object({
18082
18092
  /** ConfigUISchema tree passed through untyped on the wire (the
18083
18093
  * notification-output `ConfigSchemaPassthrough` precedent at
18084
18094
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18085
- var ConfigSchemaPassthrough$1 = unknown();
18095
+ var ConfigSchemaPassthrough$3 = unknown();
18086
18096
  var LlmProfileKindDescriptorSchema = object({
18087
18097
  kind: LlmProfileKindSchema,
18088
18098
  label: string(),
18089
18099
  icon: string(),
18090
18100
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18091
18101
  addonId: string(),
18092
- configSchema: ConfigSchemaPassthrough$1
18102
+ configSchema: ConfigSchemaPassthrough$3
18093
18103
  });
18094
18104
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18095
18105
  var LlmDefaultSchema = object({
@@ -19210,7 +19220,7 @@ var TargetKindCapsSchema = object({
19210
19220
  * the union is large and not meant for runtime validation here; the exported
19211
19221
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19212
19222
  */
19213
- var ConfigSchemaPassthrough = unknown();
19223
+ var ConfigSchemaPassthrough$2 = unknown();
19214
19224
  var TargetKindSchema = object({
19215
19225
  kind: string(),
19216
19226
  label: string(),
@@ -19247,7 +19257,7 @@ var TargetKindSchema = object({
19247
19257
  * its raster path, which is the safe default for an unknown image.
19248
19258
  */
19249
19259
  iconMediaType: string().optional(),
19250
- configSchema: ConfigSchemaPassthrough,
19260
+ configSchema: ConfigSchemaPassthrough$2,
19251
19261
  /**
19252
19262
  * The config keys that decide WHERE this kind's secrets are sent (server,
19253
19263
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -22546,6 +22556,61 @@ var OauthIntegrationDescriptorSchema = object({
22546
22556
  });
22547
22557
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
22548
22558
  /**
22559
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
22560
+ *
22561
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
22562
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
22563
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
22564
+ * immutable after create.
22565
+ */
22566
+ var ConfigSchemaPassthrough$1 = unknown();
22567
+ var OidcConnectionSchema = object({
22568
+ id: string().min(1),
22569
+ displayName: string(),
22570
+ icon: string(),
22571
+ issuerUrl: string(),
22572
+ clientId: string(),
22573
+ /** Client id + secret present — never the secret value. */
22574
+ configured: boolean(),
22575
+ /**
22576
+ * Values for the connection form schema. `clientSecret` is a keychain
22577
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
22578
+ */
22579
+ formValues: record(string(), unknown()).optional()
22580
+ });
22581
+ /**
22582
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
22583
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
22584
+ */
22585
+ var OidcConnectionUpdateInputSchema = object({
22586
+ id: string().min(1),
22587
+ displayName: string().min(1),
22588
+ icon: string().optional(),
22589
+ issuerUrl: string().optional(),
22590
+ clientId: string().optional(),
22591
+ clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
22592
+ redirectUri: string().optional(),
22593
+ scopes: string().optional(),
22594
+ usernameClaim: _enum([
22595
+ "preferred_username",
22596
+ "email",
22597
+ "sub"
22598
+ ]).optional()
22599
+ });
22600
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
22601
+ id: string().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
22602
+ displayName: string().min(1)
22603
+ }), object({ id: string() }), {
22604
+ kind: "mutation",
22605
+ auth: "admin"
22606
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
22607
+ kind: "mutation",
22608
+ auth: "admin"
22609
+ }), method(object({ id: string().min(1) }), object({ ok: literal(true) }), {
22610
+ kind: "mutation",
22611
+ auth: "admin"
22612
+ });
22613
+ /**
22549
22614
  * What started a camera's onboard motion (D672). `camera` is the camera's own
22550
22615
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
22551
22616
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -23902,24 +23967,69 @@ var RetrainFrameListSchema = object({
23902
23967
  /** What the page pre-selects — the native key frame when one survives. */
23903
23968
  autoPickMediaId: number().int().optional()
23904
23969
  });
23970
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
23971
+ var RetrainFrameWorkStateSchema = _enum([
23972
+ "unannotated",
23973
+ "annotated",
23974
+ "complete"
23975
+ ]);
23976
+ /**
23977
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
23978
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
23979
+ */
23980
+ var RetrainCorpusFilterSchema = object({
23981
+ workState: RetrainFrameWorkStateSchema.optional(),
23982
+ deviceIds: array(number()).max(500).optional(),
23983
+ /** When set, only frames in this named collection. */
23984
+ collectionId: string().optional(),
23985
+ /** Frames that carry at least one saved annotation in one of these classes. */
23986
+ classes: array(RetrainMacroClassSchema).optional(),
23987
+ page: number().int().positive().default(1),
23988
+ pageSize: number().int().positive().max(100).default(50)
23989
+ });
23990
+ var RetrainCorpusPageSchema = object({
23991
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
23992
+ total: number().int().nonnegative(),
23993
+ page: number().int().positive(),
23994
+ pageSize: number().int().positive()
23995
+ });
23996
+ var RetrainCorpusKpiCameraRowSchema = object({
23997
+ deviceId: number(),
23998
+ unannotated: number().int().nonnegative(),
23999
+ annotated: number().int().nonnegative(),
24000
+ complete: number().int().nonnegative(),
24001
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24002
+ * `null` when the corpus is empty (no ratio). */
24003
+ pctOfCorpus: number().min(0).max(1).nullable()
24004
+ });
24005
+ var RetrainCorpusKpiSchema = object({
24006
+ total: number().int().nonnegative(),
24007
+ unannotated: number().int().nonnegative(),
24008
+ annotated: number().int().nonnegative(),
24009
+ complete: number().int().nonnegative(),
24010
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24011
+ });
23905
24012
  /**
23906
24013
  * Which frames an annotated export carries. Every field narrows; an empty
23907
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
23908
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
23909
- * the primitive a version export uses; `batchId` re-selects what an earlier
23910
- * export carried (`exportedInBatch`).
24014
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24015
+ * download uses; `batchId` re-selects what an earlier export carried
24016
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24017
+ * resolves to `frameIds` at plan/start.
23911
24018
  */
23912
24019
  var RetrainExportFilterSchema = object({
23913
24020
  deviceIds: array(number()).optional(),
23914
24021
  frameIds: array(string()).max(2e4).optional(),
23915
24022
  /** Only frames in at least one of these named collections. */
23916
24023
  collectionIds: array(string()).max(200).optional(),
23917
- /** Exactly the frames of this dataset version (and its completeOnly). An
23918
- * unknown id selects nothing. */
23919
- datasetVersionId: string().optional(),
24024
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24025
+ collectionId: string().optional(),
23920
24026
  batchId: string().optional(),
23921
24027
  /** Only frames the operator marked complete (all subjects boxed). */
23922
- completeOnly: boolean().optional()
24028
+ completeOnly: boolean().optional(),
24029
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24030
+ workState: RetrainFrameWorkStateSchema.optional(),
24031
+ /** Frames with at least one saved annotation in one of these classes. */
24032
+ classes: array(RetrainMacroClassSchema).optional()
23923
24033
  });
23924
24034
  /**
23925
24035
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24119,8 +24229,7 @@ var RetrainDatasetStatsSchema = object({
24119
24229
  completeFrames: number().int()
24120
24230
  })).readonly()
24121
24231
  });
24122
- /** An immutable dataset version, without its frame list. */
24123
- var RetrainDatasetVersionSchema = object({
24232
+ object({
24124
24233
  id: string(),
24125
24234
  name: string(),
24126
24235
  createdAt: number(),
@@ -24128,22 +24237,33 @@ var RetrainDatasetVersionSchema = object({
24128
24237
  layout: RetrainExportLayoutSchema,
24129
24238
  completeOnly: boolean(),
24130
24239
  frameCount: number().int(),
24131
- /** sha256 of what the frames taught when the version was frozen. */
24132
24240
  annotationHash: string(),
24133
- /** The export manifest schema the version was cut under. */
24134
24241
  manifestSchema: string(),
24135
24242
  stats: RetrainDatasetStatsSchema
24136
24243
  });
24137
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24138
- kind: literal("created"),
24139
- version: RetrainDatasetVersionSchema
24244
+ /**
24245
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24246
+ * the training cap. Resolved here so plan/start and the annotated export share
24247
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24248
+ */
24249
+ var RetrainTrainingCorpusSelectionSchema = object({
24250
+ collectionIds: array(string()).min(1),
24251
+ workState: _enum([
24252
+ "complete",
24253
+ "annotated_or_complete",
24254
+ "any_annotated"
24255
+ ]).default("complete")
24256
+ });
24257
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24258
+ kind: literal("resolved"),
24259
+ frameIds: array(string()).max(2e4).readonly(),
24260
+ stats: RetrainDatasetStatsSchema,
24261
+ annotationHash: string(),
24262
+ layout: RetrainExportLayoutSchema
24140
24263
  }), object({
24141
24264
  kind: literal("refused"),
24142
- reason: _enum([
24143
- "empty-name",
24144
- "duplicate-name",
24145
- "no-frames"
24146
- ])
24265
+ reason: _enum(["unknown-collection", "no-frames"]),
24266
+ detail: string()
24147
24267
  })]);
24148
24268
  /** The outcome of a lifecycle move owned by the retrain page. */
24149
24269
  var RetrainTransitionResultSchema = object({
@@ -24850,6 +24970,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
24850
24970
  }), array(RetrainTrackSchema).readonly(), {
24851
24971
  kind: "query",
24852
24972
  auth: "admin"
24973
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
24974
+ kind: "query",
24975
+ auth: "admin"
24976
+ }), method(object({}), RetrainCorpusKpiSchema, {
24977
+ kind: "query",
24978
+ auth: "admin"
24853
24979
  }), method(object({ trackId: string() }), RetrainFrameListSchema, {
24854
24980
  kind: "query",
24855
24981
  auth: "admin"
@@ -24945,36 +25071,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
24945
25071
  kind: "mutation",
24946
25072
  auth: "admin",
24947
25073
  timeoutMs: 12e4
24948
- }), method(object({
24949
- selection: RetrainDatasetSelectionSchema,
24950
- completeOnly: boolean().optional()
24951
- }), RetrainDatasetStatsSchema, {
24952
- kind: "query",
24953
- auth: "admin"
24954
- }), method(object({
24955
- name: string().max(120),
24956
- selection: RetrainDatasetSelectionSchema,
24957
- layout: RetrainExportLayoutSchema,
24958
- completeOnly: boolean()
24959
- }), CreateRetrainDatasetVersionResultSchema, {
24960
- kind: "mutation",
24961
- auth: "admin",
24962
- timeoutMs: 12e4
24963
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
24964
- kind: "query",
24965
- auth: "admin"
24966
- }), method(object({ id: string() }), object({ deleted: boolean() }), {
24967
- kind: "mutation",
24968
- auth: "admin"
24969
- }), method(object({ id: string() }), object({
24970
- found: boolean(),
24971
- annotationHash: string(),
24972
- matches: boolean(),
24973
- missingFrames: number().int()
24974
- }), {
24975
- kind: "query",
24976
- auth: "admin",
24977
- timeoutMs: 12e4
24978
25074
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
24979
25075
  kind: "query",
24980
25076
  auth: "admin"
@@ -25001,6 +25097,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25001
25097
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25002
25098
  kind: "query",
25003
25099
  auth: "admin"
25100
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25101
+ kind: "query",
25102
+ auth: "admin",
25103
+ timeoutMs: 6e4
25004
25104
  }), method(object({
25005
25105
  id: string(),
25006
25106
  name: string().max(120)
@@ -25617,11 +25717,14 @@ var HardwareClassIdSchema = _enum([
25617
25717
  "intel-n-series",
25618
25718
  "apple-m-base",
25619
25719
  "apple-m-pro",
25720
+ "amd-phoenix",
25620
25721
  "unknown"
25621
25722
  ]);
25622
25723
  var AcceleratorKindSchema = _enum([
25623
25724
  "intel-npu",
25624
25725
  "intel-igpu",
25726
+ "amd-igpu",
25727
+ "amd-npu",
25625
25728
  "x86-cpu",
25626
25729
  "arm-cpu",
25627
25730
  "apple-ane",
@@ -27511,6 +27614,8 @@ var AgentPipelineSettingsSchema = object({
27511
27614
  * address is wrong (multi-homed host, NAT, custom interface).
27512
27615
  */
27513
27616
  reachableHost: string().optional(),
27617
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
27618
+ color: NodeColorIdSchema.optional(),
27514
27619
  /**
27515
27620
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
27516
27621
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28060,8 +28165,9 @@ method(object({
28060
28165
  auth: "admin"
28061
28166
  }), method(object({
28062
28167
  agentNodeId: string(),
28063
- reachableHost: string().nullable()
28064
- }), object({ success: literal(true) }), {
28168
+ reachableHost: string().nullable().optional(),
28169
+ color: NodeColorIdSchema.nullable().optional()
28170
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28065
28171
  kind: "mutation",
28066
28172
  auth: "admin"
28067
28173
  }), method(object({
@@ -31121,7 +31227,7 @@ var CustomActionInputSchema = object({
31121
31227
  action: string().min(1),
31122
31228
  input: unknown()
31123
31229
  });
31124
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31230
+ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31125
31231
  addonId: string(),
31126
31232
  limit: number().min(1).max(500).default(100),
31127
31233
  level: LogLevelSchema$2.optional()
@@ -34668,7 +34774,13 @@ var TopologyNodeSchema = object({
34668
34774
  })).readonly(),
34669
34775
  processes: array(TopologyProcessSchema).readonly(),
34670
34776
  categories: array(TopologyCategorySchema).readonly(),
34671
- rootPackage: TopologyRootPackageSchema.nullable()
34777
+ rootPackage: TopologyRootPackageSchema.nullable(),
34778
+ /**
34779
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
34780
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
34781
+ * for offline rows and when the hub cannot tell.
34782
+ */
34783
+ meshTransport: _enum(["tls", "clear"]).optional()
34672
34784
  });
34673
34785
  var CapUsageEdgeSchema = object({
34674
34786
  callerAddonId: string(),
@@ -35008,6 +35120,7 @@ var OsdNamedTemplateSchema = object({
35008
35120
  });
35009
35121
  /** Where a slot's value comes from. */
35010
35122
  var OsdSourceSchema = discriminatedUnion("kind", [
35123
+ object({ kind: literal("none") }),
35011
35124
  object({
35012
35125
  kind: literal("static"),
35013
35126
  text: string().max(64)
@@ -35134,6 +35247,13 @@ method(object({ deviceId: number().int() }), object({
35134
35247
  }), object({ success: literal(true) }), {
35135
35248
  kind: "mutation",
35136
35249
  auth: "admin"
35250
+ }), method(object({
35251
+ deviceId: number().int(),
35252
+ slotId: string().min(1),
35253
+ enabled: boolean()
35254
+ }), object({ success: literal(true) }), {
35255
+ kind: "mutation",
35256
+ auth: "admin"
35137
35257
  }), method(object({
35138
35258
  sourceDeviceId: number().int(),
35139
35259
  targetDeviceId: number().int()
@@ -35514,7 +35634,15 @@ var GpuInfoSchema = object({
35514
35634
  name: string(),
35515
35635
  memoryMB: number().optional()
35516
35636
  });
35517
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
35637
+ var NpuInfoSchema = object({
35638
+ type: _enum([
35639
+ "apple-ane",
35640
+ "intel-npu",
35641
+ "amd-xdna"
35642
+ ]),
35643
+ name: string().optional(),
35644
+ generation: _enum(["xdna1", "xdna2"]).optional()
35645
+ });
35518
35646
  var CoralInfoSchema = object({
35519
35647
  type: literal("coral-edgetpu"),
35520
35648
  bus: string().optional()
@@ -39276,9 +39404,11 @@ DeviceType.Camera, method(object({
39276
39404
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
39277
39405
  * manifest entry and nothing else.
39278
39406
  *
39279
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
39280
- * `notification-output` posture); `describe` concat-fans across providers.
39281
- * Every method is `admin`: these spend money.
39407
+ * Collection of provider **types** (addons). Each addon owns zero or more
39408
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
39409
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
39410
+ * `entryId`; callers also pass the owning `addonId` as the collection
39411
+ * selector (broker posture). Every method is `admin`: these spend money.
39282
39412
  *
39283
39413
  * Every cloud object a provider creates is tagged with the orchestrator's
39284
39414
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -39302,8 +39432,8 @@ var TrainingRegionOptionSchema = object({
39302
39432
  priceMultiplier: number().positive()
39303
39433
  });
39304
39434
  /**
39305
- * The provider's per-account settings, as the orchestrator reads them. They
39306
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
39435
+ * The provider's per-entry settings, as the orchestrator reads them. They
39436
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
39307
39437
  * depend on the user's account), never hard-coded in the orchestrator.
39308
39438
  */
39309
39439
  var TrainingProviderDefaultsSchema = object({
@@ -39314,9 +39444,44 @@ var TrainingProviderDefaultsSchema = object({
39314
39444
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
39315
39445
  failedDatasetGraceHours: number().nonnegative()
39316
39446
  });
39447
+ /**
39448
+ * Entry form schema for a provider type — same seam as notification
39449
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
39450
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
39451
+ */
39452
+ var ConfigSchemaPassthrough = unknown();
39453
+ /** One creatable provider type, for the Add-entry dialog. */
39454
+ var TrainingProviderTypeSchema = object({
39455
+ typeId: string(),
39456
+ label: string(),
39457
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
39458
+ iconAsset: string(),
39459
+ /** Owning `training-provider` addon — collection selector for createEntry. */
39460
+ addonId: string(),
39461
+ /**
39462
+ * Fields for one entry of this type (credentials + defaults). Absent on a
39463
+ * type that only needs a name. Password fields are keychain-backed on the
39464
+ * provider addon (`secretStatePaths`), not D634 plaintext.
39465
+ */
39466
+ configSchema: ConfigSchemaPassthrough.optional()
39467
+ });
39468
+ /** One configured account / workspace under a provider type. */
39469
+ var TrainingProviderEntrySchema = object({
39470
+ entryId: string(),
39471
+ typeId: string(),
39472
+ name: string(),
39473
+ addonId: string(),
39474
+ /** Credentials are present — never the values. */
39475
+ configured: boolean()
39476
+ });
39317
39477
  var TrainingProviderDescriptorSchema = object({
39318
39478
  addonId: string(),
39319
- /** `modal`, `runpod`, `fake`, … */
39479
+ entryId: string(),
39480
+ typeId: string(),
39481
+ /** Operator-chosen entry name. */
39482
+ name: string(),
39483
+ iconAsset: string(),
39484
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
39320
39485
  kind: string(),
39321
39486
  label: string(),
39322
39487
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -39328,7 +39493,30 @@ var TrainingProviderDescriptorSchema = object({
39328
39493
  dataResidencyNote: string(),
39329
39494
  /** Credentials are present — never the values. */
39330
39495
  configured: boolean(),
39331
- defaults: TrainingProviderDefaultsSchema
39496
+ defaults: TrainingProviderDefaultsSchema,
39497
+ /**
39498
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
39499
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
39500
+ * never plaintext. Same hydrate contract as settings forms (D789).
39501
+ */
39502
+ formValues: record(string(), unknown()).optional()
39503
+ });
39504
+ /**
39505
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
39506
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
39507
+ * `{ $secretClear: true }` clears it.
39508
+ */
39509
+ var TrainingProviderUpdateEntryInputSchema = object({
39510
+ entryId: string().min(1),
39511
+ name: string().min(1),
39512
+ tokenId: string().optional(),
39513
+ tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
39514
+ environment: string().optional(),
39515
+ gpuType: string().optional(),
39516
+ region: string().optional(),
39517
+ costCapUsd: number().nonnegative().optional(),
39518
+ maxRuntimeSec: number().int().positive().optional(),
39519
+ failedDatasetGraceHours: number().nonnegative().optional()
39332
39520
  });
39333
39521
  var TrainingCredentialCheckSchema = object({
39334
39522
  ok: boolean(),
@@ -39380,20 +39568,33 @@ var TrainerSourceRefSchema = object({
39380
39568
  /** A commit sha (never a branch) — the job must be reproducible. */
39381
39569
  revision: string().regex(/^[0-9a-f]{7,64}$/)
39382
39570
  });
39571
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
39383
39572
  var JobRef = {
39384
- addonId: string(),
39573
+ entryId: string().min(1),
39385
39574
  jobKey: string().uuid()
39386
39575
  };
39387
39576
  var TrainingLogLineSchema = object({
39388
39577
  ts: number(),
39389
39578
  text: string()
39390
39579
  });
39391
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string() }), TrainingCredentialCheckSchema, {
39580
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
39581
+ typeId: string().min(1),
39582
+ name: string().min(1)
39583
+ }), object({ entryId: string() }), {
39584
+ kind: "mutation",
39585
+ auth: "admin"
39586
+ }), method(object({ entryId: string().min(1) }), object({ ok: literal(true) }), {
39587
+ kind: "mutation",
39588
+ auth: "admin"
39589
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
39590
+ kind: "mutation",
39591
+ auth: "admin"
39592
+ }), method(object({ entryId: string().min(1) }), TrainingCredentialCheckSchema, {
39392
39593
  kind: "mutation",
39393
39594
  auth: "admin",
39394
39595
  timeoutMs: 3e4
39395
39596
  }), method(object({
39396
- addonId: string(),
39597
+ entryId: string().min(1),
39397
39598
  gpuType: string(),
39398
39599
  region: string(),
39399
39600
  datasetBytes: number().int().nonnegative(),
@@ -39459,7 +39660,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
39459
39660
  kind: "mutation",
39460
39661
  auth: "admin",
39461
39662
  timeoutMs: 5 * 6e4
39462
- }), method(object({ addonId: string() }), array(ProviderJobStatusSchema).readonly(), {
39663
+ }), method(object({ entryId: string().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
39463
39664
  auth: "admin",
39464
39665
  timeoutMs: 2 * 6e4
39465
39666
  });
@@ -39469,20 +39670,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
39469
39670
  *
39470
39671
  * It owns what every provider must agree on, written once:
39471
39672
  *
39472
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
39473
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
39474
- * the export plan) and reaches this store through the five row methods
39475
- * below, so the Retrain page and the export did not change.
39476
39673
  * - **Jobs.** A persisted state machine, a reconcile loop against the
39477
39674
  * provider, a cost guard, a daily orphan sweep and the retention rules.
39478
39675
  * - **The return flow.** Verified artefacts → Model Studio
39479
39676
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
39480
39677
  * rollback. Nothing is ever registered automatically.
39481
39678
  *
39679
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
39680
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
39681
+ * moment and snapshotted on the job. No frozen dataset version.
39682
+ *
39482
39683
  * Every method is `admin`.
39483
39684
  */
39484
- /** A version WITH its frame list — what the export and a job read. */
39485
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string()).max(2e4).readonly() });
39685
+ /**
39686
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
39687
+ * Frame ids are resolved at plan/start — never a frozen version id.
39688
+ */
39689
+ var TrainingCorpusSelectionSchema = object({
39690
+ collectionIds: array(string()).min(1),
39691
+ /** Default complete-only for v1 */
39692
+ workState: _enum([
39693
+ "complete",
39694
+ "annotated_or_complete",
39695
+ "any_annotated"
39696
+ ]).default("complete")
39697
+ });
39486
39698
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
39487
39699
  var TrainingBaseModelSchema = object({
39488
39700
  modelId: string(),
@@ -39500,9 +39712,13 @@ var TrainingPresetSchema = _enum([
39500
39712
  "thorough"
39501
39713
  ]);
39502
39714
  var TrainingJobRequestSchema = object({
39503
- datasetVersionId: string().min(1),
39504
- /** The `training-provider` addon that runs it. */
39505
- addonId: string().min(1),
39715
+ /** Live collection + work-state criteria; resolved at plan/start. */
39716
+ selection: TrainingCorpusSelectionSchema,
39717
+ /**
39718
+ * The provider **entry** that runs it (credentials + defaults).
39719
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
39720
+ */
39721
+ entryId: string().min(1),
39506
39722
  gpuType: string().min(1),
39507
39723
  region: string(),
39508
39724
  baseModelId: string().min(1),
@@ -39561,6 +39777,7 @@ var TrainingJobPlanSchema = object({
39561
39777
  * result lives after the operator acted on it.
39562
39778
  */
39563
39779
  var TrainingJobStateSchema = _enum([
39780
+ "queued",
39564
39781
  "uploading",
39565
39782
  "submitted",
39566
39783
  "starting",
@@ -39614,6 +39831,11 @@ var TrainingJobSchema = object({
39614
39831
  createdAt: number(),
39615
39832
  updatedAt: number(),
39616
39833
  state: TrainingJobStateSchema,
39834
+ /**
39835
+ * Shared by every job enqueued together via `startJobBatch`.
39836
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
39837
+ */
39838
+ batchId: string().nullable().default(null),
39617
39839
  stage: TrainingStageSchema.nullable(),
39618
39840
  failure: object({
39619
39841
  reason: TrainingFailureReasonSchema,
@@ -39625,6 +39847,12 @@ var TrainingJobSchema = object({
39625
39847
  maxRuntimeSec: number().int().positive(),
39626
39848
  trainer: TrainerSourceRefSchema,
39627
39849
  datasetLayout: RetrainExportLayoutSchema,
39850
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
39851
+ frameCount: number().int().nonnegative(),
39852
+ /** Resolved frame ids at start — the archive ships exactly these. */
39853
+ frameIds: array(string()).max(2e4).readonly(),
39854
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
39855
+ annotationHash: string(),
39628
39856
  dataset: object({
39629
39857
  bytes: number().int(),
39630
39858
  sha256: string(),
@@ -39666,13 +39894,7 @@ var TrainingJobSchema = object({
39666
39894
  canary: TrainingCanarySchema.nullable()
39667
39895
  });
39668
39896
  var IdInput = object({ id: string().min(1) });
39669
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
39670
- kind: "mutation",
39671
- auth: "admin"
39672
- }), 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() }), {
39673
- kind: "mutation",
39674
- auth: "admin"
39675
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
39897
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
39676
39898
  auth: "admin",
39677
39899
  timeoutMs: 6e4
39678
39900
  }), method(TrainingJobRequestSchema.extend({
@@ -39691,6 +39913,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
39691
39913
  kind: "mutation",
39692
39914
  auth: "admin",
39693
39915
  timeoutMs: 12e4
39916
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
39917
+ baseModelIds: array(string().min(1)).min(1),
39918
+ name: string().min(1).max(120),
39919
+ maxCostUsd: number().positive(),
39920
+ maxRuntimeSec: number().int().positive(),
39921
+ idempotencyKey: string().min(8).max(80)
39922
+ }), discriminatedUnion("kind", [object({
39923
+ kind: literal("started"),
39924
+ batchId: string(),
39925
+ jobs: array(TrainingJobSchema).min(1).readonly()
39926
+ }), object({
39927
+ kind: literal("refused"),
39928
+ reason: TrainingRefusalReasonSchema,
39929
+ detail: string()
39930
+ })]), {
39931
+ kind: "mutation",
39932
+ auth: "admin",
39933
+ timeoutMs: 12e4
39694
39934
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
39695
39935
  kind: "mutation",
39696
39936
  auth: "admin",
@@ -43724,6 +43964,36 @@ Object.freeze({
43724
43964
  addonId: null,
43725
43965
  access: "view"
43726
43966
  },
43967
+ "oidcConnections.connectionFormSchema": {
43968
+ capName: "oidc-connections",
43969
+ capScope: "system",
43970
+ addonId: null,
43971
+ access: "view"
43972
+ },
43973
+ "oidcConnections.createConnection": {
43974
+ capName: "oidc-connections",
43975
+ capScope: "system",
43976
+ addonId: null,
43977
+ access: "create"
43978
+ },
43979
+ "oidcConnections.deleteConnection": {
43980
+ capName: "oidc-connections",
43981
+ capScope: "system",
43982
+ addonId: null,
43983
+ access: "delete"
43984
+ },
43985
+ "oidcConnections.listConnections": {
43986
+ capName: "oidc-connections",
43987
+ capScope: "system",
43988
+ addonId: null,
43989
+ access: "view"
43990
+ },
43991
+ "oidcConnections.updateConnection": {
43992
+ capName: "oidc-connections",
43993
+ capScope: "system",
43994
+ addonId: null,
43995
+ access: "create"
43996
+ },
43727
43997
  "osd.getStatus": {
43728
43998
  capName: "osd",
43729
43999
  capScope: "device",
@@ -43796,6 +44066,12 @@ Object.freeze({
43796
44066
  addonId: null,
43797
44067
  access: "create"
43798
44068
  },
44069
+ "osdManager.setSlotCameraEnabled": {
44070
+ capName: "osd-manager",
44071
+ capScope: "system",
44072
+ addonId: null,
44073
+ access: "create"
44074
+ },
43799
44075
  "osdManager.upsertTemplate": {
43800
44076
  capName: "osd-manager",
43801
44077
  capScope: "system",
@@ -43934,12 +44210,6 @@ Object.freeze({
43934
44210
  addonId: null,
43935
44211
  access: "create"
43936
44212
  },
43937
- "pipelineAnalytics.createRetrainDatasetVersion": {
43938
- capName: "pipeline-analytics",
43939
- capScope: "device",
43940
- addonId: null,
43941
- access: "create"
43942
- },
43943
44213
  "pipelineAnalytics.deleteDeviceEvents": {
43944
44214
  capName: "pipeline-analytics",
43945
44215
  capScope: "device",
@@ -43952,12 +44222,6 @@ Object.freeze({
43952
44222
  addonId: null,
43953
44223
  access: "delete"
43954
44224
  },
43955
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
43956
- capName: "pipeline-analytics",
43957
- capScope: "device",
43958
- addonId: null,
43959
- access: "delete"
43960
- },
43961
44225
  "pipelineAnalytics.deleteTracks": {
43962
44226
  capName: "pipeline-analytics",
43963
44227
  capScope: "device",
@@ -44060,6 +44324,12 @@ Object.freeze({
44060
44324
  addonId: null,
44061
44325
  access: "view"
44062
44326
  },
44327
+ "pipelineAnalytics.getRetrainCorpusKpi": {
44328
+ capName: "pipeline-analytics",
44329
+ capScope: "device",
44330
+ addonId: null,
44331
+ access: "view"
44332
+ },
44063
44333
  "pipelineAnalytics.getRetrainExportUrl": {
44064
44334
  capName: "pipeline-analytics",
44065
44335
  capScope: "device",
@@ -44180,7 +44450,7 @@ Object.freeze({
44180
44450
  addonId: null,
44181
44451
  access: "view"
44182
44452
  },
44183
- "pipelineAnalytics.listRetrainDatasetVersions": {
44453
+ "pipelineAnalytics.listRetrainCorpusPage": {
44184
44454
  capName: "pipeline-analytics",
44185
44455
  capScope: "device",
44186
44456
  addonId: null,
@@ -44234,12 +44504,6 @@ Object.freeze({
44234
44504
  addonId: null,
44235
44505
  access: "create"
44236
44506
  },
44237
- "pipelineAnalytics.previewRetrainDataset": {
44238
- capName: "pipeline-analytics",
44239
- capScope: "device",
44240
- addonId: null,
44241
- access: "view"
44242
- },
44243
44507
  "pipelineAnalytics.proposeRetrainAnnotations": {
44244
44508
  capName: "pipeline-analytics",
44245
44509
  capScope: "device",
@@ -44318,6 +44582,12 @@ Object.freeze({
44318
44582
  addonId: null,
44319
44583
  access: "create"
44320
44584
  },
44585
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
44586
+ capName: "pipeline-analytics",
44587
+ capScope: "device",
44588
+ addonId: null,
44589
+ access: "view"
44590
+ },
44321
44591
  "pipelineAnalytics.restageRetrainTrack": {
44322
44592
  capName: "pipeline-analytics",
44323
44593
  capScope: "device",
@@ -44378,12 +44648,6 @@ Object.freeze({
44378
44648
  addonId: null,
44379
44649
  access: "create"
44380
44650
  },
44381
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
44382
- capName: "pipeline-analytics",
44383
- capScope: "device",
44384
- addonId: null,
44385
- access: "view"
44386
- },
44387
44651
  "pipelineAnalytics.wipeAllAnalytics": {
44388
44652
  capName: "pipeline-analytics",
44389
44653
  capScope: "device",
@@ -46778,18 +47042,6 @@ Object.freeze({
46778
47042
  addonId: null,
46779
47043
  access: "create"
46780
47044
  },
46781
- "training.findDatasetVersionIdByName": {
46782
- capName: "training",
46783
- capScope: "system",
46784
- addonId: null,
46785
- access: "view"
46786
- },
46787
- "training.getDatasetVersion": {
46788
- capName: "training",
46789
- capScope: "system",
46790
- addonId: null,
46791
- access: "view"
46792
- },
46793
47045
  "training.getJob": {
46794
47046
  capName: "training",
46795
47047
  capScope: "system",
@@ -46808,12 +47060,6 @@ Object.freeze({
46808
47060
  addonId: null,
46809
47061
  access: "view"
46810
47062
  },
46811
- "training.listDatasetVersions": {
46812
- capName: "training",
46813
- capScope: "system",
46814
- addonId: null,
46815
- access: "view"
46816
- },
46817
47063
  "training.listJobs": {
46818
47064
  capName: "training",
46819
47065
  capScope: "system",
@@ -46826,54 +47072,66 @@ Object.freeze({
46826
47072
  addonId: null,
46827
47073
  access: "view"
46828
47074
  },
46829
- "training.putDatasetVersion": {
47075
+ "training.registerResult": {
46830
47076
  capName: "training",
46831
47077
  capScope: "system",
46832
47078
  addonId: null,
46833
47079
  access: "create"
46834
47080
  },
46835
- "training.registerResult": {
47081
+ "training.rollbackCanary": {
46836
47082
  capName: "training",
46837
47083
  capScope: "system",
46838
47084
  addonId: null,
46839
47085
  access: "create"
46840
47086
  },
46841
- "training.removeDatasetVersion": {
47087
+ "training.startJob": {
46842
47088
  capName: "training",
46843
47089
  capScope: "system",
46844
47090
  addonId: null,
46845
- access: "delete"
47091
+ access: "create"
46846
47092
  },
46847
- "training.rollbackCanary": {
47093
+ "training.startJobBatch": {
46848
47094
  capName: "training",
46849
47095
  capScope: "system",
46850
47096
  addonId: null,
46851
47097
  access: "create"
46852
47098
  },
46853
- "training.startJob": {
46854
- capName: "training",
47099
+ "trainingProvider.cancelJob": {
47100
+ capName: "training-provider",
46855
47101
  capScope: "system",
46856
47102
  addonId: null,
46857
47103
  access: "create"
46858
47104
  },
46859
- "trainingProvider.cancelJob": {
47105
+ "trainingProvider.cleanupJob": {
46860
47106
  capName: "training-provider",
46861
47107
  capScope: "system",
46862
47108
  addonId: null,
46863
47109
  access: "create"
46864
47110
  },
46865
- "trainingProvider.cleanupJob": {
47111
+ "trainingProvider.createEntry": {
46866
47112
  capName: "training-provider",
46867
47113
  capScope: "system",
46868
47114
  addonId: null,
46869
47115
  access: "create"
46870
47116
  },
47117
+ "trainingProvider.deleteEntry": {
47118
+ capName: "training-provider",
47119
+ capScope: "system",
47120
+ addonId: null,
47121
+ access: "delete"
47122
+ },
46871
47123
  "trainingProvider.describe": {
46872
47124
  capName: "training-provider",
46873
47125
  capScope: "system",
46874
47126
  addonId: null,
46875
47127
  access: "view"
46876
47128
  },
47129
+ "trainingProvider.describeTypes": {
47130
+ capName: "training-provider",
47131
+ capScope: "system",
47132
+ addonId: null,
47133
+ access: "view"
47134
+ },
46877
47135
  "trainingProvider.estimateJob": {
46878
47136
  capName: "training-provider",
46879
47137
  capScope: "system",
@@ -46886,6 +47144,12 @@ Object.freeze({
46886
47144
  addonId: null,
46887
47145
  access: "view"
46888
47146
  },
47147
+ "trainingProvider.listEntries": {
47148
+ capName: "training-provider",
47149
+ capScope: "system",
47150
+ addonId: null,
47151
+ access: "view"
47152
+ },
46889
47153
  "trainingProvider.listJobEvents": {
46890
47154
  capName: "training-provider",
46891
47155
  capScope: "system",
@@ -46916,6 +47180,12 @@ Object.freeze({
46916
47180
  addonId: null,
46917
47181
  access: "create"
46918
47182
  },
47183
+ "trainingProvider.updateEntry": {
47184
+ capName: "training-provider",
47185
+ capScope: "system",
47186
+ addonId: null,
47187
+ access: "create"
47188
+ },
46919
47189
  "trainingProvider.uploadDataset": {
46920
47190
  capName: "training-provider",
46921
47191
  capScope: "system",
@@ -50122,6 +50392,11 @@ Object.freeze({
50122
50392
  form: "single",
50123
50393
  optional: false
50124
50394
  }],
50395
+ "osdManager.setSlotCameraEnabled": [{
50396
+ name: "deviceId",
50397
+ form: "single",
50398
+ optional: false
50399
+ }],
50125
50400
  "petFeeder.callPet": [{
50126
50401
  name: "deviceId",
50127
50402
  form: "single",
@@ -50342,6 +50617,11 @@ Object.freeze({
50342
50617
  form: "array",
50343
50618
  optional: false
50344
50619
  }],
50620
+ "pipelineAnalytics.listRetrainCorpusPage": [{
50621
+ name: "deviceIds",
50622
+ form: "array",
50623
+ optional: true
50624
+ }],
50345
50625
  "pipelineAnalytics.listRetrainStaging": [{
50346
50626
  name: "deviceIds",
50347
50627
  form: "array",
@@ -51451,6 +51731,7 @@ Object.freeze({
51451
51731
  });
51452
51732
  Object.freeze({
51453
51733
  "broker": "broker",
51734
+ "calendar-source": "calendar",
51454
51735
  "device-export": "device-export",
51455
51736
  "llm": "ai",
51456
51737
  "mesh-network": "mesh",
@@ -51936,6 +52217,8 @@ var STATE_SUMMARY_VARS = [
51936
52217
  [...RULE_TEXT],
51937
52218
  [...RULE_TEXT],
51938
52219
  [...RULE_TEXT],
52220
+ [...RULE_TEXT],
52221
+ [...RULE_TEXT],
51939
52222
  ([...RULE_TEXT], [...UPDATES]),
51940
52223
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
51941
52224
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),