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