@camstack/addon-notifiers 1.2.129 → 1.2.130

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.mjs CHANGED
@@ -5380,7 +5380,7 @@ var ZodIssueCode = {
5380
5380
  var ZodFirstPartyTypeKind;
5381
5381
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
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).
@@ -9331,6 +9331,16 @@ var CompositionSchema = object({
9331
9331
  seen.add(feature.cap);
9332
9332
  });
9333
9333
  });
9334
+ var NodeColorIdSchema = _enum([
9335
+ "node-a",
9336
+ "node-b",
9337
+ "node-c",
9338
+ "node-d",
9339
+ "node-e",
9340
+ "node-f",
9341
+ "node-g",
9342
+ "node-h"
9343
+ ]);
9334
9344
  new Set([
9335
9345
  "track",
9336
9346
  "face",
@@ -18206,14 +18216,14 @@ var LlmProfileSchema = object({
18206
18216
  /** ConfigUISchema tree passed through untyped on the wire (the
18207
18217
  * notification-output `ConfigSchemaPassthrough` precedent at
18208
18218
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18209
- var ConfigSchemaPassthrough$1 = unknown();
18219
+ var ConfigSchemaPassthrough$3 = unknown();
18210
18220
  var LlmProfileKindDescriptorSchema = object({
18211
18221
  kind: LlmProfileKindSchema,
18212
18222
  label: string(),
18213
18223
  icon: string(),
18214
18224
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18215
18225
  addonId: string(),
18216
- configSchema: ConfigSchemaPassthrough$1
18226
+ configSchema: ConfigSchemaPassthrough$3
18217
18227
  });
18218
18228
  var LlmDefaultSelectorSchema = union([object({ consumer: string() }), object({ purpose: _enum(["text", "vision"]) })]);
18219
18229
  var LlmDefaultSchema = object({
@@ -19334,7 +19344,7 @@ var TargetKindCapsSchema = object({
19334
19344
  * the union is large and not meant for runtime validation here; the exported
19335
19345
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19336
19346
  */
19337
- var ConfigSchemaPassthrough = unknown();
19347
+ var ConfigSchemaPassthrough$2 = unknown();
19338
19348
  var TargetKindSchema = object({
19339
19349
  kind: string(),
19340
19350
  label: string(),
@@ -19371,7 +19381,7 @@ var TargetKindSchema = object({
19371
19381
  * its raster path, which is the safe default for an unknown image.
19372
19382
  */
19373
19383
  iconMediaType: string().optional(),
19374
- configSchema: ConfigSchemaPassthrough,
19384
+ configSchema: ConfigSchemaPassthrough$2,
19375
19385
  /**
19376
19386
  * The config keys that decide WHERE this kind's secrets are sent (server,
19377
19387
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -22692,6 +22702,61 @@ var OauthIntegrationDescriptorSchema = object({
22692
22702
  });
22693
22703
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
22694
22704
  /**
22705
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
22706
+ *
22707
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
22708
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
22709
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
22710
+ * immutable after create.
22711
+ */
22712
+ var ConfigSchemaPassthrough$1 = unknown();
22713
+ var OidcConnectionSchema = object({
22714
+ id: string().min(1),
22715
+ displayName: string(),
22716
+ icon: string(),
22717
+ issuerUrl: string(),
22718
+ clientId: string(),
22719
+ /** Client id + secret present — never the secret value. */
22720
+ configured: boolean(),
22721
+ /**
22722
+ * Values for the connection form schema. `clientSecret` is a keychain
22723
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
22724
+ */
22725
+ formValues: record(string(), unknown()).optional()
22726
+ });
22727
+ /**
22728
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
22729
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
22730
+ */
22731
+ var OidcConnectionUpdateInputSchema = object({
22732
+ id: string().min(1),
22733
+ displayName: string().min(1),
22734
+ icon: string().optional(),
22735
+ issuerUrl: string().optional(),
22736
+ clientId: string().optional(),
22737
+ clientSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
22738
+ redirectUri: string().optional(),
22739
+ scopes: string().optional(),
22740
+ usernameClaim: _enum([
22741
+ "preferred_username",
22742
+ "email",
22743
+ "sub"
22744
+ ]).optional()
22745
+ });
22746
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
22747
+ id: string().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
22748
+ displayName: string().min(1)
22749
+ }), object({ id: string() }), {
22750
+ kind: "mutation",
22751
+ auth: "admin"
22752
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
22753
+ kind: "mutation",
22754
+ auth: "admin"
22755
+ }), method(object({ id: string().min(1) }), object({ ok: literal(true) }), {
22756
+ kind: "mutation",
22757
+ auth: "admin"
22758
+ });
22759
+ /**
22695
22760
  * What started a camera's onboard motion (D672). `camera` is the camera's own
22696
22761
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
22697
22762
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -24048,24 +24113,69 @@ var RetrainFrameListSchema = object({
24048
24113
  /** What the page pre-selects — the native key frame when one survives. */
24049
24114
  autoPickMediaId: number().int().optional()
24050
24115
  });
24116
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
24117
+ var RetrainFrameWorkStateSchema = _enum([
24118
+ "unannotated",
24119
+ "annotated",
24120
+ "complete"
24121
+ ]);
24122
+ /**
24123
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
24124
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
24125
+ */
24126
+ var RetrainCorpusFilterSchema = object({
24127
+ workState: RetrainFrameWorkStateSchema.optional(),
24128
+ deviceIds: array(number()).max(500).optional(),
24129
+ /** When set, only frames in this named collection. */
24130
+ collectionId: string().optional(),
24131
+ /** Frames that carry at least one saved annotation in one of these classes. */
24132
+ classes: array(RetrainMacroClassSchema).optional(),
24133
+ page: number().int().positive().default(1),
24134
+ pageSize: number().int().positive().max(100).default(50)
24135
+ });
24136
+ var RetrainCorpusPageSchema = object({
24137
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
24138
+ total: number().int().nonnegative(),
24139
+ page: number().int().positive(),
24140
+ pageSize: number().int().positive()
24141
+ });
24142
+ var RetrainCorpusKpiCameraRowSchema = object({
24143
+ deviceId: number(),
24144
+ unannotated: number().int().nonnegative(),
24145
+ annotated: number().int().nonnegative(),
24146
+ complete: number().int().nonnegative(),
24147
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24148
+ * `null` when the corpus is empty (no ratio). */
24149
+ pctOfCorpus: number().min(0).max(1).nullable()
24150
+ });
24151
+ var RetrainCorpusKpiSchema = object({
24152
+ total: number().int().nonnegative(),
24153
+ unannotated: number().int().nonnegative(),
24154
+ annotated: number().int().nonnegative(),
24155
+ complete: number().int().nonnegative(),
24156
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24157
+ });
24051
24158
  /**
24052
24159
  * Which frames an annotated export carries. Every field narrows; an empty
24053
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
24054
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
24055
- * the primitive a version export uses; `batchId` re-selects what an earlier
24056
- * export carried (`exportedInBatch`).
24160
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24161
+ * download uses; `batchId` re-selects what an earlier export carried
24162
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24163
+ * resolves to `frameIds` at plan/start.
24057
24164
  */
24058
24165
  var RetrainExportFilterSchema = object({
24059
24166
  deviceIds: array(number()).optional(),
24060
24167
  frameIds: array(string()).max(2e4).optional(),
24061
24168
  /** Only frames in at least one of these named collections. */
24062
24169
  collectionIds: array(string()).max(200).optional(),
24063
- /** Exactly the frames of this dataset version (and its completeOnly). An
24064
- * unknown id selects nothing. */
24065
- datasetVersionId: string().optional(),
24170
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24171
+ collectionId: string().optional(),
24066
24172
  batchId: string().optional(),
24067
24173
  /** Only frames the operator marked complete (all subjects boxed). */
24068
- completeOnly: boolean().optional()
24174
+ completeOnly: boolean().optional(),
24175
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24176
+ workState: RetrainFrameWorkStateSchema.optional(),
24177
+ /** Frames with at least one saved annotation in one of these classes. */
24178
+ classes: array(RetrainMacroClassSchema).optional()
24069
24179
  });
24070
24180
  /**
24071
24181
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24265,8 +24375,7 @@ var RetrainDatasetStatsSchema = object({
24265
24375
  completeFrames: number().int()
24266
24376
  })).readonly()
24267
24377
  });
24268
- /** An immutable dataset version, without its frame list. */
24269
- var RetrainDatasetVersionSchema = object({
24378
+ object({
24270
24379
  id: string(),
24271
24380
  name: string(),
24272
24381
  createdAt: number(),
@@ -24274,22 +24383,33 @@ var RetrainDatasetVersionSchema = object({
24274
24383
  layout: RetrainExportLayoutSchema,
24275
24384
  completeOnly: boolean(),
24276
24385
  frameCount: number().int(),
24277
- /** sha256 of what the frames taught when the version was frozen. */
24278
24386
  annotationHash: string(),
24279
- /** The export manifest schema the version was cut under. */
24280
24387
  manifestSchema: string(),
24281
24388
  stats: RetrainDatasetStatsSchema
24282
24389
  });
24283
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24284
- kind: literal("created"),
24285
- version: RetrainDatasetVersionSchema
24390
+ /**
24391
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24392
+ * the training cap. Resolved here so plan/start and the annotated export share
24393
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24394
+ */
24395
+ var RetrainTrainingCorpusSelectionSchema = object({
24396
+ collectionIds: array(string()).min(1),
24397
+ workState: _enum([
24398
+ "complete",
24399
+ "annotated_or_complete",
24400
+ "any_annotated"
24401
+ ]).default("complete")
24402
+ });
24403
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24404
+ kind: literal("resolved"),
24405
+ frameIds: array(string()).max(2e4).readonly(),
24406
+ stats: RetrainDatasetStatsSchema,
24407
+ annotationHash: string(),
24408
+ layout: RetrainExportLayoutSchema
24286
24409
  }), object({
24287
24410
  kind: literal("refused"),
24288
- reason: _enum([
24289
- "empty-name",
24290
- "duplicate-name",
24291
- "no-frames"
24292
- ])
24411
+ reason: _enum(["unknown-collection", "no-frames"]),
24412
+ detail: string()
24293
24413
  })]);
24294
24414
  /** The outcome of a lifecycle move owned by the retrain page. */
24295
24415
  var RetrainTransitionResultSchema = object({
@@ -24996,6 +25116,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
24996
25116
  }), array(RetrainTrackSchema).readonly(), {
24997
25117
  kind: "query",
24998
25118
  auth: "admin"
25119
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
25120
+ kind: "query",
25121
+ auth: "admin"
25122
+ }), method(object({}), RetrainCorpusKpiSchema, {
25123
+ kind: "query",
25124
+ auth: "admin"
24999
25125
  }), method(object({ trackId: string() }), RetrainFrameListSchema, {
25000
25126
  kind: "query",
25001
25127
  auth: "admin"
@@ -25091,36 +25217,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25091
25217
  kind: "mutation",
25092
25218
  auth: "admin",
25093
25219
  timeoutMs: 12e4
25094
- }), method(object({
25095
- selection: RetrainDatasetSelectionSchema,
25096
- completeOnly: boolean().optional()
25097
- }), RetrainDatasetStatsSchema, {
25098
- kind: "query",
25099
- auth: "admin"
25100
- }), method(object({
25101
- name: string().max(120),
25102
- selection: RetrainDatasetSelectionSchema,
25103
- layout: RetrainExportLayoutSchema,
25104
- completeOnly: boolean()
25105
- }), CreateRetrainDatasetVersionResultSchema, {
25106
- kind: "mutation",
25107
- auth: "admin",
25108
- timeoutMs: 12e4
25109
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
25110
- kind: "query",
25111
- auth: "admin"
25112
- }), method(object({ id: string() }), object({ deleted: boolean() }), {
25113
- kind: "mutation",
25114
- auth: "admin"
25115
- }), method(object({ id: string() }), object({
25116
- found: boolean(),
25117
- annotationHash: string(),
25118
- matches: boolean(),
25119
- missingFrames: number().int()
25120
- }), {
25121
- kind: "query",
25122
- auth: "admin",
25123
- timeoutMs: 12e4
25124
25220
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
25125
25221
  kind: "query",
25126
25222
  auth: "admin"
@@ -25147,6 +25243,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25147
25243
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25148
25244
  kind: "query",
25149
25245
  auth: "admin"
25246
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25247
+ kind: "query",
25248
+ auth: "admin",
25249
+ timeoutMs: 6e4
25150
25250
  }), method(object({
25151
25251
  id: string(),
25152
25252
  name: string().max(120)
@@ -25763,11 +25863,14 @@ var HardwareClassIdSchema = _enum([
25763
25863
  "intel-n-series",
25764
25864
  "apple-m-base",
25765
25865
  "apple-m-pro",
25866
+ "amd-phoenix",
25766
25867
  "unknown"
25767
25868
  ]);
25768
25869
  var AcceleratorKindSchema = _enum([
25769
25870
  "intel-npu",
25770
25871
  "intel-igpu",
25872
+ "amd-igpu",
25873
+ "amd-npu",
25771
25874
  "x86-cpu",
25772
25875
  "arm-cpu",
25773
25876
  "apple-ane",
@@ -27657,6 +27760,8 @@ var AgentPipelineSettingsSchema = object({
27657
27760
  * address is wrong (multi-homed host, NAT, custom interface).
27658
27761
  */
27659
27762
  reachableHost: string().optional(),
27763
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
27764
+ color: NodeColorIdSchema.optional(),
27660
27765
  /**
27661
27766
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
27662
27767
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28206,8 +28311,9 @@ method(object({
28206
28311
  auth: "admin"
28207
28312
  }), method(object({
28208
28313
  agentNodeId: string(),
28209
- reachableHost: string().nullable()
28210
- }), object({ success: literal(true) }), {
28314
+ reachableHost: string().nullable().optional(),
28315
+ color: NodeColorIdSchema.nullable().optional()
28316
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28211
28317
  kind: "mutation",
28212
28318
  auth: "admin"
28213
28319
  }), method(object({
@@ -31254,7 +31360,7 @@ var CustomActionInputSchema = object({
31254
31360
  action: string().min(1),
31255
31361
  input: unknown()
31256
31362
  });
31257
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31363
+ method(object({ nodeId: string().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31258
31364
  addonId: string(),
31259
31365
  limit: number().min(1).max(500).default(100),
31260
31366
  level: LogLevelSchema$2.optional()
@@ -34801,7 +34907,13 @@ var TopologyNodeSchema = object({
34801
34907
  })).readonly(),
34802
34908
  processes: array(TopologyProcessSchema).readonly(),
34803
34909
  categories: array(TopologyCategorySchema).readonly(),
34804
- rootPackage: TopologyRootPackageSchema.nullable()
34910
+ rootPackage: TopologyRootPackageSchema.nullable(),
34911
+ /**
34912
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
34913
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
34914
+ * for offline rows and when the hub cannot tell.
34915
+ */
34916
+ meshTransport: _enum(["tls", "clear"]).optional()
34805
34917
  });
34806
34918
  var CapUsageEdgeSchema = object({
34807
34919
  callerAddonId: string(),
@@ -35141,6 +35253,7 @@ var OsdNamedTemplateSchema = object({
35141
35253
  });
35142
35254
  /** Where a slot's value comes from. */
35143
35255
  var OsdSourceSchema = discriminatedUnion("kind", [
35256
+ object({ kind: literal("none") }),
35144
35257
  object({
35145
35258
  kind: literal("static"),
35146
35259
  text: string().max(64)
@@ -35267,6 +35380,13 @@ method(object({ deviceId: number().int() }), object({
35267
35380
  }), object({ success: literal(true) }), {
35268
35381
  kind: "mutation",
35269
35382
  auth: "admin"
35383
+ }), method(object({
35384
+ deviceId: number().int(),
35385
+ slotId: string().min(1),
35386
+ enabled: boolean()
35387
+ }), object({ success: literal(true) }), {
35388
+ kind: "mutation",
35389
+ auth: "admin"
35270
35390
  }), method(object({
35271
35391
  sourceDeviceId: number().int(),
35272
35392
  targetDeviceId: number().int()
@@ -35647,7 +35767,15 @@ var GpuInfoSchema = object({
35647
35767
  name: string(),
35648
35768
  memoryMB: number().optional()
35649
35769
  });
35650
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
35770
+ var NpuInfoSchema = object({
35771
+ type: _enum([
35772
+ "apple-ane",
35773
+ "intel-npu",
35774
+ "amd-xdna"
35775
+ ]),
35776
+ name: string().optional(),
35777
+ generation: _enum(["xdna1", "xdna2"]).optional()
35778
+ });
35651
35779
  var CoralInfoSchema = object({
35652
35780
  type: literal("coral-edgetpu"),
35653
35781
  bus: string().optional()
@@ -39409,9 +39537,11 @@ DeviceType.Camera, method(object({
39409
39537
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
39410
39538
  * manifest entry and nothing else.
39411
39539
  *
39412
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
39413
- * `notification-output` posture); `describe` concat-fans across providers.
39414
- * Every method is `admin`: these spend money.
39540
+ * Collection of provider **types** (addons). Each addon owns zero or more
39541
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
39542
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
39543
+ * `entryId`; callers also pass the owning `addonId` as the collection
39544
+ * selector (broker posture). Every method is `admin`: these spend money.
39415
39545
  *
39416
39546
  * Every cloud object a provider creates is tagged with the orchestrator's
39417
39547
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -39435,8 +39565,8 @@ var TrainingRegionOptionSchema = object({
39435
39565
  priceMultiplier: number().positive()
39436
39566
  });
39437
39567
  /**
39438
- * The provider's per-account settings, as the orchestrator reads them. They
39439
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
39568
+ * The provider's per-entry settings, as the orchestrator reads them. They
39569
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
39440
39570
  * depend on the user's account), never hard-coded in the orchestrator.
39441
39571
  */
39442
39572
  var TrainingProviderDefaultsSchema = object({
@@ -39447,9 +39577,44 @@ var TrainingProviderDefaultsSchema = object({
39447
39577
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
39448
39578
  failedDatasetGraceHours: number().nonnegative()
39449
39579
  });
39580
+ /**
39581
+ * Entry form schema for a provider type — same seam as notification
39582
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
39583
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
39584
+ */
39585
+ var ConfigSchemaPassthrough = unknown();
39586
+ /** One creatable provider type, for the Add-entry dialog. */
39587
+ var TrainingProviderTypeSchema = object({
39588
+ typeId: string(),
39589
+ label: string(),
39590
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
39591
+ iconAsset: string(),
39592
+ /** Owning `training-provider` addon — collection selector for createEntry. */
39593
+ addonId: string(),
39594
+ /**
39595
+ * Fields for one entry of this type (credentials + defaults). Absent on a
39596
+ * type that only needs a name. Password fields are keychain-backed on the
39597
+ * provider addon (`secretStatePaths`), not D634 plaintext.
39598
+ */
39599
+ configSchema: ConfigSchemaPassthrough.optional()
39600
+ });
39601
+ /** One configured account / workspace under a provider type. */
39602
+ var TrainingProviderEntrySchema = object({
39603
+ entryId: string(),
39604
+ typeId: string(),
39605
+ name: string(),
39606
+ addonId: string(),
39607
+ /** Credentials are present — never the values. */
39608
+ configured: boolean()
39609
+ });
39450
39610
  var TrainingProviderDescriptorSchema = object({
39451
39611
  addonId: string(),
39452
- /** `modal`, `runpod`, `fake`, … */
39612
+ entryId: string(),
39613
+ typeId: string(),
39614
+ /** Operator-chosen entry name. */
39615
+ name: string(),
39616
+ iconAsset: string(),
39617
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
39453
39618
  kind: string(),
39454
39619
  label: string(),
39455
39620
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -39461,7 +39626,30 @@ var TrainingProviderDescriptorSchema = object({
39461
39626
  dataResidencyNote: string(),
39462
39627
  /** Credentials are present — never the values. */
39463
39628
  configured: boolean(),
39464
- defaults: TrainingProviderDefaultsSchema
39629
+ defaults: TrainingProviderDefaultsSchema,
39630
+ /**
39631
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
39632
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
39633
+ * never plaintext. Same hydrate contract as settings forms (D789).
39634
+ */
39635
+ formValues: record(string(), unknown()).optional()
39636
+ });
39637
+ /**
39638
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
39639
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
39640
+ * `{ $secretClear: true }` clears it.
39641
+ */
39642
+ var TrainingProviderUpdateEntryInputSchema = object({
39643
+ entryId: string().min(1),
39644
+ name: string().min(1),
39645
+ tokenId: string().optional(),
39646
+ tokenSecret: union([string(), object({ $secretClear: literal(true) })]).optional(),
39647
+ environment: string().optional(),
39648
+ gpuType: string().optional(),
39649
+ region: string().optional(),
39650
+ costCapUsd: number().nonnegative().optional(),
39651
+ maxRuntimeSec: number().int().positive().optional(),
39652
+ failedDatasetGraceHours: number().nonnegative().optional()
39465
39653
  });
39466
39654
  var TrainingCredentialCheckSchema = object({
39467
39655
  ok: boolean(),
@@ -39513,20 +39701,33 @@ var TrainerSourceRefSchema = object({
39513
39701
  /** A commit sha (never a branch) — the job must be reproducible. */
39514
39702
  revision: string().regex(/^[0-9a-f]{7,64}$/)
39515
39703
  });
39704
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
39516
39705
  var JobRef = {
39517
- addonId: string(),
39706
+ entryId: string().min(1),
39518
39707
  jobKey: string().uuid()
39519
39708
  };
39520
39709
  var TrainingLogLineSchema = object({
39521
39710
  ts: number(),
39522
39711
  text: string()
39523
39712
  });
39524
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string() }), TrainingCredentialCheckSchema, {
39713
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
39714
+ typeId: string().min(1),
39715
+ name: string().min(1)
39716
+ }), object({ entryId: string() }), {
39717
+ kind: "mutation",
39718
+ auth: "admin"
39719
+ }), method(object({ entryId: string().min(1) }), object({ ok: literal(true) }), {
39720
+ kind: "mutation",
39721
+ auth: "admin"
39722
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
39723
+ kind: "mutation",
39724
+ auth: "admin"
39725
+ }), method(object({ entryId: string().min(1) }), TrainingCredentialCheckSchema, {
39525
39726
  kind: "mutation",
39526
39727
  auth: "admin",
39527
39728
  timeoutMs: 3e4
39528
39729
  }), method(object({
39529
- addonId: string(),
39730
+ entryId: string().min(1),
39530
39731
  gpuType: string(),
39531
39732
  region: string(),
39532
39733
  datasetBytes: number().int().nonnegative(),
@@ -39592,7 +39793,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
39592
39793
  kind: "mutation",
39593
39794
  auth: "admin",
39594
39795
  timeoutMs: 5 * 6e4
39595
- }), method(object({ addonId: string() }), array(ProviderJobStatusSchema).readonly(), {
39796
+ }), method(object({ entryId: string().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
39596
39797
  auth: "admin",
39597
39798
  timeoutMs: 2 * 6e4
39598
39799
  });
@@ -39602,20 +39803,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
39602
39803
  *
39603
39804
  * It owns what every provider must agree on, written once:
39604
39805
  *
39605
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
39606
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
39607
- * the export plan) and reaches this store through the five row methods
39608
- * below, so the Retrain page and the export did not change.
39609
39806
  * - **Jobs.** A persisted state machine, a reconcile loop against the
39610
39807
  * provider, a cost guard, a daily orphan sweep and the retention rules.
39611
39808
  * - **The return flow.** Verified artefacts → Model Studio
39612
39809
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
39613
39810
  * rollback. Nothing is ever registered automatically.
39614
39811
  *
39812
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
39813
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
39814
+ * moment and snapshotted on the job. No frozen dataset version.
39815
+ *
39615
39816
  * Every method is `admin`.
39616
39817
  */
39617
- /** A version WITH its frame list — what the export and a job read. */
39618
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string()).max(2e4).readonly() });
39818
+ /**
39819
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
39820
+ * Frame ids are resolved at plan/start — never a frozen version id.
39821
+ */
39822
+ var TrainingCorpusSelectionSchema = object({
39823
+ collectionIds: array(string()).min(1),
39824
+ /** Default complete-only for v1 */
39825
+ workState: _enum([
39826
+ "complete",
39827
+ "annotated_or_complete",
39828
+ "any_annotated"
39829
+ ]).default("complete")
39830
+ });
39619
39831
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
39620
39832
  var TrainingBaseModelSchema = object({
39621
39833
  modelId: string(),
@@ -39633,9 +39845,13 @@ var TrainingPresetSchema = _enum([
39633
39845
  "thorough"
39634
39846
  ]);
39635
39847
  var TrainingJobRequestSchema = object({
39636
- datasetVersionId: string().min(1),
39637
- /** The `training-provider` addon that runs it. */
39638
- addonId: string().min(1),
39848
+ /** Live collection + work-state criteria; resolved at plan/start. */
39849
+ selection: TrainingCorpusSelectionSchema,
39850
+ /**
39851
+ * The provider **entry** that runs it (credentials + defaults).
39852
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
39853
+ */
39854
+ entryId: string().min(1),
39639
39855
  gpuType: string().min(1),
39640
39856
  region: string(),
39641
39857
  baseModelId: string().min(1),
@@ -39694,6 +39910,7 @@ var TrainingJobPlanSchema = object({
39694
39910
  * result lives after the operator acted on it.
39695
39911
  */
39696
39912
  var TrainingJobStateSchema = _enum([
39913
+ "queued",
39697
39914
  "uploading",
39698
39915
  "submitted",
39699
39916
  "starting",
@@ -39747,6 +39964,11 @@ var TrainingJobSchema = object({
39747
39964
  createdAt: number(),
39748
39965
  updatedAt: number(),
39749
39966
  state: TrainingJobStateSchema,
39967
+ /**
39968
+ * Shared by every job enqueued together via `startJobBatch`.
39969
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
39970
+ */
39971
+ batchId: string().nullable().default(null),
39750
39972
  stage: TrainingStageSchema.nullable(),
39751
39973
  failure: object({
39752
39974
  reason: TrainingFailureReasonSchema,
@@ -39758,6 +39980,12 @@ var TrainingJobSchema = object({
39758
39980
  maxRuntimeSec: number().int().positive(),
39759
39981
  trainer: TrainerSourceRefSchema,
39760
39982
  datasetLayout: RetrainExportLayoutSchema,
39983
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
39984
+ frameCount: number().int().nonnegative(),
39985
+ /** Resolved frame ids at start — the archive ships exactly these. */
39986
+ frameIds: array(string()).max(2e4).readonly(),
39987
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
39988
+ annotationHash: string(),
39761
39989
  dataset: object({
39762
39990
  bytes: number().int(),
39763
39991
  sha256: string(),
@@ -39799,13 +40027,7 @@ var TrainingJobSchema = object({
39799
40027
  canary: TrainingCanarySchema.nullable()
39800
40028
  });
39801
40029
  var IdInput = object({ id: string().min(1) });
39802
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
39803
- kind: "mutation",
39804
- auth: "admin"
39805
- }), 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() }), {
39806
- kind: "mutation",
39807
- auth: "admin"
39808
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
40030
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
39809
40031
  auth: "admin",
39810
40032
  timeoutMs: 6e4
39811
40033
  }), method(TrainingJobRequestSchema.extend({
@@ -39824,6 +40046,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
39824
40046
  kind: "mutation",
39825
40047
  auth: "admin",
39826
40048
  timeoutMs: 12e4
40049
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
40050
+ baseModelIds: array(string().min(1)).min(1),
40051
+ name: string().min(1).max(120),
40052
+ maxCostUsd: number().positive(),
40053
+ maxRuntimeSec: number().int().positive(),
40054
+ idempotencyKey: string().min(8).max(80)
40055
+ }), discriminatedUnion("kind", [object({
40056
+ kind: literal("started"),
40057
+ batchId: string(),
40058
+ jobs: array(TrainingJobSchema).min(1).readonly()
40059
+ }), object({
40060
+ kind: literal("refused"),
40061
+ reason: TrainingRefusalReasonSchema,
40062
+ detail: string()
40063
+ })]), {
40064
+ kind: "mutation",
40065
+ auth: "admin",
40066
+ timeoutMs: 12e4
39827
40067
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
39828
40068
  kind: "mutation",
39829
40069
  auth: "admin",
@@ -43857,6 +44097,36 @@ Object.freeze({
43857
44097
  addonId: null,
43858
44098
  access: "view"
43859
44099
  },
44100
+ "oidcConnections.connectionFormSchema": {
44101
+ capName: "oidc-connections",
44102
+ capScope: "system",
44103
+ addonId: null,
44104
+ access: "view"
44105
+ },
44106
+ "oidcConnections.createConnection": {
44107
+ capName: "oidc-connections",
44108
+ capScope: "system",
44109
+ addonId: null,
44110
+ access: "create"
44111
+ },
44112
+ "oidcConnections.deleteConnection": {
44113
+ capName: "oidc-connections",
44114
+ capScope: "system",
44115
+ addonId: null,
44116
+ access: "delete"
44117
+ },
44118
+ "oidcConnections.listConnections": {
44119
+ capName: "oidc-connections",
44120
+ capScope: "system",
44121
+ addonId: null,
44122
+ access: "view"
44123
+ },
44124
+ "oidcConnections.updateConnection": {
44125
+ capName: "oidc-connections",
44126
+ capScope: "system",
44127
+ addonId: null,
44128
+ access: "create"
44129
+ },
43860
44130
  "osd.getStatus": {
43861
44131
  capName: "osd",
43862
44132
  capScope: "device",
@@ -43929,6 +44199,12 @@ Object.freeze({
43929
44199
  addonId: null,
43930
44200
  access: "create"
43931
44201
  },
44202
+ "osdManager.setSlotCameraEnabled": {
44203
+ capName: "osd-manager",
44204
+ capScope: "system",
44205
+ addonId: null,
44206
+ access: "create"
44207
+ },
43932
44208
  "osdManager.upsertTemplate": {
43933
44209
  capName: "osd-manager",
43934
44210
  capScope: "system",
@@ -44067,12 +44343,6 @@ Object.freeze({
44067
44343
  addonId: null,
44068
44344
  access: "create"
44069
44345
  },
44070
- "pipelineAnalytics.createRetrainDatasetVersion": {
44071
- capName: "pipeline-analytics",
44072
- capScope: "device",
44073
- addonId: null,
44074
- access: "create"
44075
- },
44076
44346
  "pipelineAnalytics.deleteDeviceEvents": {
44077
44347
  capName: "pipeline-analytics",
44078
44348
  capScope: "device",
@@ -44085,12 +44355,6 @@ Object.freeze({
44085
44355
  addonId: null,
44086
44356
  access: "delete"
44087
44357
  },
44088
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
44089
- capName: "pipeline-analytics",
44090
- capScope: "device",
44091
- addonId: null,
44092
- access: "delete"
44093
- },
44094
44358
  "pipelineAnalytics.deleteTracks": {
44095
44359
  capName: "pipeline-analytics",
44096
44360
  capScope: "device",
@@ -44193,6 +44457,12 @@ Object.freeze({
44193
44457
  addonId: null,
44194
44458
  access: "view"
44195
44459
  },
44460
+ "pipelineAnalytics.getRetrainCorpusKpi": {
44461
+ capName: "pipeline-analytics",
44462
+ capScope: "device",
44463
+ addonId: null,
44464
+ access: "view"
44465
+ },
44196
44466
  "pipelineAnalytics.getRetrainExportUrl": {
44197
44467
  capName: "pipeline-analytics",
44198
44468
  capScope: "device",
@@ -44313,7 +44583,7 @@ Object.freeze({
44313
44583
  addonId: null,
44314
44584
  access: "view"
44315
44585
  },
44316
- "pipelineAnalytics.listRetrainDatasetVersions": {
44586
+ "pipelineAnalytics.listRetrainCorpusPage": {
44317
44587
  capName: "pipeline-analytics",
44318
44588
  capScope: "device",
44319
44589
  addonId: null,
@@ -44367,12 +44637,6 @@ Object.freeze({
44367
44637
  addonId: null,
44368
44638
  access: "create"
44369
44639
  },
44370
- "pipelineAnalytics.previewRetrainDataset": {
44371
- capName: "pipeline-analytics",
44372
- capScope: "device",
44373
- addonId: null,
44374
- access: "view"
44375
- },
44376
44640
  "pipelineAnalytics.proposeRetrainAnnotations": {
44377
44641
  capName: "pipeline-analytics",
44378
44642
  capScope: "device",
@@ -44451,6 +44715,12 @@ Object.freeze({
44451
44715
  addonId: null,
44452
44716
  access: "create"
44453
44717
  },
44718
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
44719
+ capName: "pipeline-analytics",
44720
+ capScope: "device",
44721
+ addonId: null,
44722
+ access: "view"
44723
+ },
44454
44724
  "pipelineAnalytics.restageRetrainTrack": {
44455
44725
  capName: "pipeline-analytics",
44456
44726
  capScope: "device",
@@ -44511,12 +44781,6 @@ Object.freeze({
44511
44781
  addonId: null,
44512
44782
  access: "create"
44513
44783
  },
44514
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
44515
- capName: "pipeline-analytics",
44516
- capScope: "device",
44517
- addonId: null,
44518
- access: "view"
44519
- },
44520
44784
  "pipelineAnalytics.wipeAllAnalytics": {
44521
44785
  capName: "pipeline-analytics",
44522
44786
  capScope: "device",
@@ -46911,18 +47175,6 @@ Object.freeze({
46911
47175
  addonId: null,
46912
47176
  access: "create"
46913
47177
  },
46914
- "training.findDatasetVersionIdByName": {
46915
- capName: "training",
46916
- capScope: "system",
46917
- addonId: null,
46918
- access: "view"
46919
- },
46920
- "training.getDatasetVersion": {
46921
- capName: "training",
46922
- capScope: "system",
46923
- addonId: null,
46924
- access: "view"
46925
- },
46926
47178
  "training.getJob": {
46927
47179
  capName: "training",
46928
47180
  capScope: "system",
@@ -46941,12 +47193,6 @@ Object.freeze({
46941
47193
  addonId: null,
46942
47194
  access: "view"
46943
47195
  },
46944
- "training.listDatasetVersions": {
46945
- capName: "training",
46946
- capScope: "system",
46947
- addonId: null,
46948
- access: "view"
46949
- },
46950
47196
  "training.listJobs": {
46951
47197
  capName: "training",
46952
47198
  capScope: "system",
@@ -46959,54 +47205,66 @@ Object.freeze({
46959
47205
  addonId: null,
46960
47206
  access: "view"
46961
47207
  },
46962
- "training.putDatasetVersion": {
47208
+ "training.registerResult": {
46963
47209
  capName: "training",
46964
47210
  capScope: "system",
46965
47211
  addonId: null,
46966
47212
  access: "create"
46967
47213
  },
46968
- "training.registerResult": {
47214
+ "training.rollbackCanary": {
46969
47215
  capName: "training",
46970
47216
  capScope: "system",
46971
47217
  addonId: null,
46972
47218
  access: "create"
46973
47219
  },
46974
- "training.removeDatasetVersion": {
47220
+ "training.startJob": {
46975
47221
  capName: "training",
46976
47222
  capScope: "system",
46977
47223
  addonId: null,
46978
- access: "delete"
47224
+ access: "create"
46979
47225
  },
46980
- "training.rollbackCanary": {
47226
+ "training.startJobBatch": {
46981
47227
  capName: "training",
46982
47228
  capScope: "system",
46983
47229
  addonId: null,
46984
47230
  access: "create"
46985
47231
  },
46986
- "training.startJob": {
46987
- capName: "training",
47232
+ "trainingProvider.cancelJob": {
47233
+ capName: "training-provider",
46988
47234
  capScope: "system",
46989
47235
  addonId: null,
46990
47236
  access: "create"
46991
47237
  },
46992
- "trainingProvider.cancelJob": {
47238
+ "trainingProvider.cleanupJob": {
46993
47239
  capName: "training-provider",
46994
47240
  capScope: "system",
46995
47241
  addonId: null,
46996
47242
  access: "create"
46997
47243
  },
46998
- "trainingProvider.cleanupJob": {
47244
+ "trainingProvider.createEntry": {
46999
47245
  capName: "training-provider",
47000
47246
  capScope: "system",
47001
47247
  addonId: null,
47002
47248
  access: "create"
47003
47249
  },
47250
+ "trainingProvider.deleteEntry": {
47251
+ capName: "training-provider",
47252
+ capScope: "system",
47253
+ addonId: null,
47254
+ access: "delete"
47255
+ },
47004
47256
  "trainingProvider.describe": {
47005
47257
  capName: "training-provider",
47006
47258
  capScope: "system",
47007
47259
  addonId: null,
47008
47260
  access: "view"
47009
47261
  },
47262
+ "trainingProvider.describeTypes": {
47263
+ capName: "training-provider",
47264
+ capScope: "system",
47265
+ addonId: null,
47266
+ access: "view"
47267
+ },
47010
47268
  "trainingProvider.estimateJob": {
47011
47269
  capName: "training-provider",
47012
47270
  capScope: "system",
@@ -47019,6 +47277,12 @@ Object.freeze({
47019
47277
  addonId: null,
47020
47278
  access: "view"
47021
47279
  },
47280
+ "trainingProvider.listEntries": {
47281
+ capName: "training-provider",
47282
+ capScope: "system",
47283
+ addonId: null,
47284
+ access: "view"
47285
+ },
47022
47286
  "trainingProvider.listJobEvents": {
47023
47287
  capName: "training-provider",
47024
47288
  capScope: "system",
@@ -47049,6 +47313,12 @@ Object.freeze({
47049
47313
  addonId: null,
47050
47314
  access: "create"
47051
47315
  },
47316
+ "trainingProvider.updateEntry": {
47317
+ capName: "training-provider",
47318
+ capScope: "system",
47319
+ addonId: null,
47320
+ access: "create"
47321
+ },
47052
47322
  "trainingProvider.uploadDataset": {
47053
47323
  capName: "training-provider",
47054
47324
  capScope: "system",
@@ -50255,6 +50525,11 @@ Object.freeze({
50255
50525
  form: "single",
50256
50526
  optional: false
50257
50527
  }],
50528
+ "osdManager.setSlotCameraEnabled": [{
50529
+ name: "deviceId",
50530
+ form: "single",
50531
+ optional: false
50532
+ }],
50258
50533
  "petFeeder.callPet": [{
50259
50534
  name: "deviceId",
50260
50535
  form: "single",
@@ -50475,6 +50750,11 @@ Object.freeze({
50475
50750
  form: "array",
50476
50751
  optional: false
50477
50752
  }],
50753
+ "pipelineAnalytics.listRetrainCorpusPage": [{
50754
+ name: "deviceIds",
50755
+ form: "array",
50756
+ optional: true
50757
+ }],
50478
50758
  "pipelineAnalytics.listRetrainStaging": [{
50479
50759
  name: "deviceIds",
50480
50760
  form: "array",
@@ -51584,6 +51864,7 @@ Object.freeze({
51584
51864
  });
51585
51865
  Object.freeze({
51586
51866
  "broker": "broker",
51867
+ "calendar-source": "calendar",
51587
51868
  "device-export": "device-export",
51588
51869
  "llm": "ai",
51589
51870
  "mesh-network": "mesh",
@@ -52276,6 +52557,8 @@ var STATE_SUMMARY_VARS = [
52276
52557
  [...RULE_TEXT],
52277
52558
  [...RULE_TEXT],
52278
52559
  [...RULE_TEXT],
52560
+ [...RULE_TEXT],
52561
+ [...RULE_TEXT],
52279
52562
  ([...RULE_TEXT], [...UPDATES]),
52280
52563
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
52281
52564
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),