@camstack/addon-matter-broker 0.2.124 → 0.2.125

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/addon.js +422 -139
  2. package/dist/addon.mjs +422 -139
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -5391,7 +5391,7 @@ var ZodIssueCode = {
5391
5391
  var ZodFirstPartyTypeKind;
5392
5392
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5393
5393
  //#endregion
5394
- //#region ../types/dist/sleep-r3RWkGVx.mjs
5394
+ //#region ../types/dist/sleep-DwAQ9sqX.mjs
5395
5395
  /**
5396
5396
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5397
5397
  * window to float samples (D455).
@@ -9397,6 +9397,16 @@ var CompositionSchema = object({
9397
9397
  seen.add(feature.cap);
9398
9398
  });
9399
9399
  });
9400
+ var NodeColorIdSchema = _enum([
9401
+ "node-a",
9402
+ "node-b",
9403
+ "node-c",
9404
+ "node-d",
9405
+ "node-e",
9406
+ "node-f",
9407
+ "node-g",
9408
+ "node-h"
9409
+ ]);
9400
9410
  new Set([
9401
9411
  "track",
9402
9412
  "face",
@@ -18492,14 +18502,14 @@ var LlmProfileSchema = object({
18492
18502
  /** ConfigUISchema tree passed through untyped on the wire (the
18493
18503
  * notification-output `ConfigSchemaPassthrough` precedent at
18494
18504
  * notification-output.cap.ts:151); the exported TS type re-tightens it. */
18495
- var ConfigSchemaPassthrough$1 = unknown();
18505
+ var ConfigSchemaPassthrough$3 = unknown();
18496
18506
  var LlmProfileKindDescriptorSchema = object({
18497
18507
  kind: LlmProfileKindSchema,
18498
18508
  label: string$2(),
18499
18509
  icon: string$2(),
18500
18510
  /** Stamped by each provider so the concat-fanned catalog stays routable. */
18501
18511
  addonId: string$2(),
18502
- configSchema: ConfigSchemaPassthrough$1
18512
+ configSchema: ConfigSchemaPassthrough$3
18503
18513
  });
18504
18514
  var LlmDefaultSelectorSchema = union([object({ consumer: string$2() }), object({ purpose: _enum(["text", "vision"]) })]);
18505
18515
  var LlmDefaultSchema = object({
@@ -19620,7 +19630,7 @@ var TargetKindCapsSchema = object({
19620
19630
  * the union is large and not meant for runtime validation here; the exported
19621
19631
  * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
19622
19632
  */
19623
- var ConfigSchemaPassthrough = unknown();
19633
+ var ConfigSchemaPassthrough$2 = unknown();
19624
19634
  var TargetKindSchema = object({
19625
19635
  kind: string$2(),
19626
19636
  label: string$2(),
@@ -19657,7 +19667,7 @@ var TargetKindSchema = object({
19657
19667
  * its raster path, which is the safe default for an unknown image.
19658
19668
  */
19659
19669
  iconMediaType: string$2().optional(),
19660
- configSchema: ConfigSchemaPassthrough,
19670
+ configSchema: ConfigSchemaPassthrough$2,
19661
19671
  /**
19662
19672
  * The config keys that decide WHERE this kind's secrets are sent (server,
19663
19673
  * base URL, instance, chat, recipient). A save that changes any of them
@@ -22994,6 +23004,61 @@ var OauthIntegrationDescriptorSchema = object({
22994
23004
  });
22995
23005
  method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
22996
23006
  /**
23007
+ * `oidc-connections` — CRUD for IdP rows under `auth-oidc` (D828 sibling).
23008
+ *
23009
+ * One hub-only singleton (`auth-oidc`). The Settings UI is a DataTable +
23010
+ * ItemFormDialog; there is no `editable-array` in `globalSettingsSchema`.
23011
+ * Operator-chosen `id` is the URL slug (`/addon/auth-oidc/<id>/…`) and is
23012
+ * immutable after create.
23013
+ */
23014
+ var ConfigSchemaPassthrough$1 = unknown();
23015
+ var OidcConnectionSchema = object({
23016
+ id: string$2().min(1),
23017
+ displayName: string$2(),
23018
+ icon: string$2(),
23019
+ issuerUrl: string$2(),
23020
+ clientId: string$2(),
23021
+ /** Client id + secret present — never the secret value. */
23022
+ configured: boolean(),
23023
+ /**
23024
+ * Values for the connection form schema. `clientSecret` is a keychain
23025
+ * {@link SecretFieldView} or `null` / `''`, never plaintext (D789).
23026
+ */
23027
+ formValues: record(string$2(), unknown()).optional()
23028
+ });
23029
+ /**
23030
+ * Patch one connection. Omitted or empty `clientSecret` keeps the stored
23031
+ * secret (D787). `{ $secretClear: true }` clears it. `id` is never renamed.
23032
+ */
23033
+ var OidcConnectionUpdateInputSchema = object({
23034
+ id: string$2().min(1),
23035
+ displayName: string$2().min(1),
23036
+ icon: string$2().optional(),
23037
+ issuerUrl: string$2().optional(),
23038
+ clientId: string$2().optional(),
23039
+ clientSecret: union([string$2(), object({ $secretClear: literal(true) })]).optional(),
23040
+ redirectUri: string$2().optional(),
23041
+ scopes: string$2().optional(),
23042
+ usernameClaim: _enum([
23043
+ "preferred_username",
23044
+ "email",
23045
+ "sub"
23046
+ ]).optional()
23047
+ });
23048
+ method(object({}), ConfigSchemaPassthrough$1, { auth: "admin" }), method(object({}), array(OidcConnectionSchema).readonly(), { auth: "admin" }), method(object({
23049
+ id: string$2().min(1).regex(/^[a-z0-9][a-z0-9-]{0,63}$/, "id must be a lowercase slug"),
23050
+ displayName: string$2().min(1)
23051
+ }), object({ id: string$2() }), {
23052
+ kind: "mutation",
23053
+ auth: "admin"
23054
+ }), method(OidcConnectionUpdateInputSchema, object({ ok: literal(true) }), {
23055
+ kind: "mutation",
23056
+ auth: "admin"
23057
+ }), method(object({ id: string$2().min(1) }), object({ ok: literal(true) }), {
23058
+ kind: "mutation",
23059
+ auth: "admin"
23060
+ });
23061
+ /**
22997
23062
  * What started a camera's onboard motion (D672). `camera` is the camera's own
22998
23063
  * firmware; `sensor` is a device the operator ATTACHED to it. Absent on the
22999
23064
  * wire means the camera: only the camera-sensors bridge ever says `sensor`.
@@ -24350,24 +24415,69 @@ var RetrainFrameListSchema = object({
24350
24415
  /** What the page pre-selects — the native key frame when one survives. */
24351
24416
  autoPickMediaId: number().int().optional()
24352
24417
  });
24418
+ /** Exclusive partition of a corpus copy's annotation progress (design §4.2). */
24419
+ var RetrainFrameWorkStateSchema = _enum([
24420
+ "unannotated",
24421
+ "annotated",
24422
+ "complete"
24423
+ ]);
24424
+ /**
24425
+ * Filters for paginated corpus list, KPI, and matching export (design §4.4).
24426
+ * Every narrowing field is ANDed; omitted fields impose no constraint.
24427
+ */
24428
+ var RetrainCorpusFilterSchema = object({
24429
+ workState: RetrainFrameWorkStateSchema.optional(),
24430
+ deviceIds: array(number()).max(500).optional(),
24431
+ /** When set, only frames in this named collection. */
24432
+ collectionId: string$2().optional(),
24433
+ /** Frames that carry at least one saved annotation in one of these classes. */
24434
+ classes: array(RetrainMacroClassSchema).optional(),
24435
+ page: number().int().positive().default(1),
24436
+ pageSize: number().int().positive().max(100).default(50)
24437
+ });
24438
+ var RetrainCorpusPageSchema = object({
24439
+ frames: array(RetrainFrameSchema.extend({ workState: RetrainFrameWorkStateSchema })).readonly(),
24440
+ total: number().int().nonnegative(),
24441
+ page: number().int().positive(),
24442
+ pageSize: number().int().positive()
24443
+ });
24444
+ var RetrainCorpusKpiCameraRowSchema = object({
24445
+ deviceId: number(),
24446
+ unannotated: number().int().nonnegative(),
24447
+ annotated: number().int().nonnegative(),
24448
+ complete: number().int().nonnegative(),
24449
+ /** This camera's `complete` count divided by corpus `total`, in `[0,1]`.
24450
+ * `null` when the corpus is empty (no ratio). */
24451
+ pctOfCorpus: number().min(0).max(1).nullable()
24452
+ });
24453
+ var RetrainCorpusKpiSchema = object({
24454
+ total: number().int().nonnegative(),
24455
+ unannotated: number().int().nonnegative(),
24456
+ annotated: number().int().nonnegative(),
24457
+ complete: number().int().nonnegative(),
24458
+ cameras: array(RetrainCorpusKpiCameraRowSchema).readonly()
24459
+ });
24353
24460
  /**
24354
24461
  * Which frames an annotated export carries. Every field narrows; an empty
24355
- * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
24356
- * list owned by whoever trains (the training orchestrator), so `frameIds` is
24357
- * the primitive a version export uses; `batchId` re-selects what an earlier
24358
- * export carried (`exportedInBatch`).
24462
+ * filter is every annotated copy. `frameIds` is the primitive a job or
24463
+ * download uses; `batchId` re-selects what an earlier export carried
24464
+ * (`exportedInBatch`). Frozen dataset versions were removed — live selection
24465
+ * resolves to `frameIds` at plan/start.
24359
24466
  */
24360
24467
  var RetrainExportFilterSchema = object({
24361
24468
  deviceIds: array(number()).optional(),
24362
24469
  frameIds: array(string$2()).max(2e4).optional(),
24363
24470
  /** Only frames in at least one of these named collections. */
24364
24471
  collectionIds: array(string$2()).max(200).optional(),
24365
- /** Exactly the frames of this dataset version (and its completeOnly). An
24366
- * unknown id selects nothing. */
24367
- datasetVersionId: string$2().optional(),
24472
+ /** Single collection (Frames filter bar). ANDed with `collectionIds` when both set. */
24473
+ collectionId: string$2().optional(),
24368
24474
  batchId: string$2().optional(),
24369
24475
  /** Only frames the operator marked complete (all subjects boxed). */
24370
- completeOnly: boolean().optional()
24476
+ completeOnly: boolean().optional(),
24477
+ /** Exclusive work-state partition (`workStateOf`); same as the corpus list. */
24478
+ workState: RetrainFrameWorkStateSchema.optional(),
24479
+ /** Frames with at least one saved annotation in one of these classes. */
24480
+ classes: array(RetrainMacroClassSchema).optional()
24371
24481
  });
24372
24482
  /**
24373
24483
  * `frames`: the full frame copies, boxes in `annotations.json`.
@@ -24567,8 +24677,7 @@ var RetrainDatasetStatsSchema = object({
24567
24677
  completeFrames: number().int()
24568
24678
  })).readonly()
24569
24679
  });
24570
- /** An immutable dataset version, without its frame list. */
24571
- var RetrainDatasetVersionSchema = object({
24680
+ object({
24572
24681
  id: string$2(),
24573
24682
  name: string$2(),
24574
24683
  createdAt: number(),
@@ -24576,22 +24685,33 @@ var RetrainDatasetVersionSchema = object({
24576
24685
  layout: RetrainExportLayoutSchema,
24577
24686
  completeOnly: boolean(),
24578
24687
  frameCount: number().int(),
24579
- /** sha256 of what the frames taught when the version was frozen. */
24580
24688
  annotationHash: string$2(),
24581
- /** The export manifest schema the version was cut under. */
24582
24689
  manifestSchema: string$2(),
24583
24690
  stats: RetrainDatasetStatsSchema
24584
24691
  });
24585
- var CreateRetrainDatasetVersionResultSchema = discriminatedUnion("kind", [object({
24586
- kind: literal("created"),
24587
- version: RetrainDatasetVersionSchema
24692
+ /**
24693
+ * Live training corpus criteria — same shape as `TrainingCorpusSelection` on
24694
+ * the training cap. Resolved here so plan/start and the annotated export share
24695
+ * one definition of "the frames" (`buildRetrainExportPlan`).
24696
+ */
24697
+ var RetrainTrainingCorpusSelectionSchema = object({
24698
+ collectionIds: array(string$2()).min(1),
24699
+ workState: _enum([
24700
+ "complete",
24701
+ "annotated_or_complete",
24702
+ "any_annotated"
24703
+ ]).default("complete")
24704
+ });
24705
+ var RetrainTrainingCorpusResolveResultSchema = discriminatedUnion("kind", [object({
24706
+ kind: literal("resolved"),
24707
+ frameIds: array(string$2()).max(2e4).readonly(),
24708
+ stats: RetrainDatasetStatsSchema,
24709
+ annotationHash: string$2(),
24710
+ layout: RetrainExportLayoutSchema
24588
24711
  }), object({
24589
24712
  kind: literal("refused"),
24590
- reason: _enum([
24591
- "empty-name",
24592
- "duplicate-name",
24593
- "no-frames"
24594
- ])
24713
+ reason: _enum(["unknown-collection", "no-frames"]),
24714
+ detail: string$2()
24595
24715
  })]);
24596
24716
  /** The outcome of a lifecycle move owned by the retrain page. */
24597
24717
  var RetrainTransitionResultSchema = object({
@@ -25298,6 +25418,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25298
25418
  }), array(RetrainTrackSchema).readonly(), {
25299
25419
  kind: "query",
25300
25420
  auth: "admin"
25421
+ }), method(RetrainCorpusFilterSchema, RetrainCorpusPageSchema, {
25422
+ kind: "query",
25423
+ auth: "admin"
25424
+ }), method(object({}), RetrainCorpusKpiSchema, {
25425
+ kind: "query",
25426
+ auth: "admin"
25301
25427
  }), method(object({ trackId: string$2() }), RetrainFrameListSchema, {
25302
25428
  kind: "query",
25303
25429
  auth: "admin"
@@ -25393,36 +25519,6 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25393
25519
  kind: "mutation",
25394
25520
  auth: "admin",
25395
25521
  timeoutMs: 12e4
25396
- }), method(object({
25397
- selection: RetrainDatasetSelectionSchema,
25398
- completeOnly: boolean().optional()
25399
- }), RetrainDatasetStatsSchema, {
25400
- kind: "query",
25401
- auth: "admin"
25402
- }), method(object({
25403
- name: string$2().max(120),
25404
- selection: RetrainDatasetSelectionSchema,
25405
- layout: RetrainExportLayoutSchema,
25406
- completeOnly: boolean()
25407
- }), CreateRetrainDatasetVersionResultSchema, {
25408
- kind: "mutation",
25409
- auth: "admin",
25410
- timeoutMs: 12e4
25411
- }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), {
25412
- kind: "query",
25413
- auth: "admin"
25414
- }), method(object({ id: string$2() }), object({ deleted: boolean() }), {
25415
- kind: "mutation",
25416
- auth: "admin"
25417
- }), method(object({ id: string$2() }), object({
25418
- found: boolean(),
25419
- annotationHash: string$2(),
25420
- matches: boolean(),
25421
- missingFrames: number().int()
25422
- }), {
25423
- kind: "query",
25424
- auth: "admin",
25425
- timeoutMs: 12e4
25426
25522
  }), method(object({}), array(RetrainAssistProfileSchema).readonly(), {
25427
25523
  kind: "query",
25428
25524
  auth: "admin"
@@ -25449,6 +25545,10 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
25449
25545
  }), method(object({}), array(RetrainCollectionSchema).readonly(), {
25450
25546
  kind: "query",
25451
25547
  auth: "admin"
25548
+ }), method(RetrainTrainingCorpusSelectionSchema, RetrainTrainingCorpusResolveResultSchema, {
25549
+ kind: "query",
25550
+ auth: "admin",
25551
+ timeoutMs: 6e4
25452
25552
  }), method(object({
25453
25553
  id: string$2(),
25454
25554
  name: string$2().max(120)
@@ -26065,11 +26165,14 @@ var HardwareClassIdSchema = _enum([
26065
26165
  "intel-n-series",
26066
26166
  "apple-m-base",
26067
26167
  "apple-m-pro",
26168
+ "amd-phoenix",
26068
26169
  "unknown"
26069
26170
  ]);
26070
26171
  var AcceleratorKindSchema = _enum([
26071
26172
  "intel-npu",
26072
26173
  "intel-igpu",
26174
+ "amd-igpu",
26175
+ "amd-npu",
26073
26176
  "x86-cpu",
26074
26177
  "arm-cpu",
26075
26178
  "apple-ane",
@@ -27999,6 +28102,8 @@ var AgentPipelineSettingsSchema = object({
27999
28102
  * address is wrong (multi-homed host, NAT, custom interface).
28000
28103
  */
28001
28104
  reachableHost: string$2().optional(),
28105
+ /** Hub-persisted UI colour (`--color-node-*` theme tokens). */
28106
+ color: NodeColorIdSchema.optional(),
28002
28107
  /**
28003
28108
  * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
28004
28109
  * weight, steps}. Absent / all-disabled ⇒ the node's single default
@@ -28548,8 +28653,9 @@ method(object({
28548
28653
  auth: "admin"
28549
28654
  }), method(object({
28550
28655
  agentNodeId: string$2(),
28551
- reachableHost: string$2().nullable()
28552
- }), object({ success: literal(true) }), {
28656
+ reachableHost: string$2().nullable().optional(),
28657
+ color: NodeColorIdSchema.nullable().optional()
28658
+ }).refine((v) => v.reachableHost !== void 0 || v.color !== void 0, { message: "reachableHost or color required" }), object({ success: literal(true) }), {
28553
28659
  kind: "mutation",
28554
28660
  auth: "admin"
28555
28661
  }), method(object({
@@ -31625,7 +31731,7 @@ var CustomActionInputSchema = object({
31625
31731
  action: string$2().min(1),
31626
31732
  input: unknown()
31627
31733
  });
31628
- method(_void(), array(AddonListItemSchema).readonly()), method(object({
31734
+ method(object({ nodeId: string$2().optional() }).optional(), array(AddonListItemSchema).readonly()), method(object({
31629
31735
  addonId: string$2(),
31630
31736
  limit: number().min(1).max(500).default(100),
31631
31737
  level: LogLevelSchema$2.optional()
@@ -36704,7 +36810,13 @@ var TopologyNodeSchema = object({
36704
36810
  })).readonly(),
36705
36811
  processes: array(TopologyProcessSchema).readonly(),
36706
36812
  categories: array(TopologyCategorySchema).readonly(),
36707
- rootPackage: TopologyRootPackageSchema.nullable()
36813
+ rootPackage: TopologyRootPackageSchema.nullable(),
36814
+ /**
36815
+ * How an online AGENT reaches the hub (mesh mTLS Release A): `tls` once it has
36816
+ * completed a mutual-TLS handshake, `clear` otherwise. Absent for the hub,
36817
+ * for offline rows and when the hub cannot tell.
36818
+ */
36819
+ meshTransport: _enum(["tls", "clear"]).optional()
36708
36820
  });
36709
36821
  var CapUsageEdgeSchema = object({
36710
36822
  callerAddonId: string$2(),
@@ -37117,6 +37229,7 @@ var OsdNamedTemplateSchema = object({
37117
37229
  });
37118
37230
  /** Where a slot's value comes from. */
37119
37231
  var OsdSourceSchema = discriminatedUnion("kind", [
37232
+ object({ kind: literal("none") }),
37120
37233
  object({
37121
37234
  kind: literal("static"),
37122
37235
  text: string$2().max(64)
@@ -37243,6 +37356,13 @@ method(object({ deviceId: number().int() }), object({
37243
37356
  }), object({ success: literal(true) }), {
37244
37357
  kind: "mutation",
37245
37358
  auth: "admin"
37359
+ }), method(object({
37360
+ deviceId: number().int(),
37361
+ slotId: string$2().min(1),
37362
+ enabled: boolean()
37363
+ }), object({ success: literal(true) }), {
37364
+ kind: "mutation",
37365
+ auth: "admin"
37246
37366
  }), method(object({
37247
37367
  sourceDeviceId: number().int(),
37248
37368
  targetDeviceId: number().int()
@@ -37674,7 +37794,15 @@ var GpuInfoSchema = object({
37674
37794
  name: string$2(),
37675
37795
  memoryMB: number().optional()
37676
37796
  });
37677
- var NpuInfoSchema = object({ type: _enum(["apple-ane", "intel-npu"]) });
37797
+ var NpuInfoSchema = object({
37798
+ type: _enum([
37799
+ "apple-ane",
37800
+ "intel-npu",
37801
+ "amd-xdna"
37802
+ ]),
37803
+ name: string$2().optional(),
37804
+ generation: _enum(["xdna1", "xdna2"]).optional()
37805
+ });
37678
37806
  var CoralInfoSchema = object({
37679
37807
  type: literal("coral-edgetpu"),
37680
37808
  bus: string$2().optional()
@@ -42417,9 +42545,11 @@ var zoneRulesCapability = {
42417
42545
  * once is what makes a second provider (RunPod, a local NVIDIA node) a new
42418
42546
  * manifest entry and nothing else.
42419
42547
  *
42420
- * Collection, routed by the `addonId` in every single-row input (the `llm` /
42421
- * `notification-output` posture); `describe` concat-fans across providers.
42422
- * Every method is `admin`: these spend money.
42548
+ * Collection of provider **types** (addons). Each addon owns zero or more
42549
+ * **entries** (credentials + defaults). Concat-fans: `describe`,
42550
+ * `describeTypes`, `listEntries`, `listJobs`. Single-row work is keyed by
42551
+ * `entryId`; callers also pass the owning `addonId` as the collection
42552
+ * selector (broker posture). Every method is `admin`: these spend money.
42423
42553
  *
42424
42554
  * Every cloud object a provider creates is tagged with the orchestrator's
42425
42555
  * `jobKey`, so a retried submit finds the job it already started instead of
@@ -42443,8 +42573,8 @@ var TrainingRegionOptionSchema = object({
42443
42573
  priceMultiplier: number().positive()
42444
42574
  });
42445
42575
  /**
42446
- * The provider's per-account settings, as the orchestrator reads them. They
42447
- * live in the PROVIDER addon's settings (operator decision 2026-10-08: they
42576
+ * The provider's per-entry settings, as the orchestrator reads them. They
42577
+ * live on the PROVIDER addon's entry (operator decision 2026-10-08: they
42448
42578
  * depend on the user's account), never hard-coded in the orchestrator.
42449
42579
  */
42450
42580
  var TrainingProviderDefaultsSchema = object({
@@ -42455,9 +42585,44 @@ var TrainingProviderDefaultsSchema = object({
42455
42585
  /** Hours a FAILED job's cloud dataset is kept for debugging; 0 = delete at once. */
42456
42586
  failedDatasetGraceHours: number().nonnegative()
42457
42587
  });
42588
+ /**
42589
+ * Entry form schema for a provider type — same seam as notification
42590
+ * `TargetKind.configSchema` (`z.unknown()` at the wire; callers tighten to
42591
+ * {@link ConfigUISchema}). Drives `ConfigFormBuilder` on Training → Providers.
42592
+ */
42593
+ var ConfigSchemaPassthrough = unknown();
42594
+ /** One creatable provider type, for the Add-entry dialog. */
42595
+ var TrainingProviderTypeSchema = object({
42596
+ typeId: string$2(),
42597
+ label: string$2(),
42598
+ /** Path under the addon package (e.g. `assets/training-modal/icon.svg`). */
42599
+ iconAsset: string$2(),
42600
+ /** Owning `training-provider` addon — collection selector for createEntry. */
42601
+ addonId: string$2(),
42602
+ /**
42603
+ * Fields for one entry of this type (credentials + defaults). Absent on a
42604
+ * type that only needs a name. Password fields are keychain-backed on the
42605
+ * provider addon (`secretStatePaths`), not D634 plaintext.
42606
+ */
42607
+ configSchema: ConfigSchemaPassthrough.optional()
42608
+ });
42609
+ /** One configured account / workspace under a provider type. */
42610
+ var TrainingProviderEntrySchema = object({
42611
+ entryId: string$2(),
42612
+ typeId: string$2(),
42613
+ name: string$2(),
42614
+ addonId: string$2(),
42615
+ /** Credentials are present — never the values. */
42616
+ configured: boolean()
42617
+ });
42458
42618
  var TrainingProviderDescriptorSchema = object({
42459
42619
  addonId: string$2(),
42460
- /** `modal`, `runpod`, `fake`, … */
42620
+ entryId: string$2(),
42621
+ typeId: string$2(),
42622
+ /** Operator-chosen entry name. */
42623
+ name: string$2(),
42624
+ iconAsset: string$2(),
42625
+ /** `modal`, `runpod`, `fake`, … — same as typeId for current providers. */
42461
42626
  kind: string$2(),
42462
42627
  label: string$2(),
42463
42628
  gpuTypes: array(TrainingGpuOptionSchema).readonly(),
@@ -42469,7 +42634,30 @@ var TrainingProviderDescriptorSchema = object({
42469
42634
  dataResidencyNote: string$2(),
42470
42635
  /** Credentials are present — never the values. */
42471
42636
  configured: boolean(),
42472
- defaults: TrainingProviderDefaultsSchema
42637
+ defaults: TrainingProviderDefaultsSchema,
42638
+ /**
42639
+ * Values for {@link TrainingProviderTypeSchema}'s `configSchema` — password
42640
+ * fields are keychain {@link SecretFieldView} or `null` / `''` (create),
42641
+ * never plaintext. Same hydrate contract as settings forms (D789).
42642
+ */
42643
+ formValues: record(string$2(), unknown()).optional()
42644
+ });
42645
+ /**
42646
+ * Patch one entry's name, credentials and defaults. Pin with owning `{ addonId }`.
42647
+ * An omitted or empty `tokenSecret` means KEEP the stored secret (D787).
42648
+ * `{ $secretClear: true }` clears it.
42649
+ */
42650
+ var TrainingProviderUpdateEntryInputSchema = object({
42651
+ entryId: string$2().min(1),
42652
+ name: string$2().min(1),
42653
+ tokenId: string$2().optional(),
42654
+ tokenSecret: union([string$2(), object({ $secretClear: literal(true) })]).optional(),
42655
+ environment: string$2().optional(),
42656
+ gpuType: string$2().optional(),
42657
+ region: string$2().optional(),
42658
+ costCapUsd: number().nonnegative().optional(),
42659
+ maxRuntimeSec: number().int().positive().optional(),
42660
+ failedDatasetGraceHours: number().nonnegative().optional()
42473
42661
  });
42474
42662
  var TrainingCredentialCheckSchema = object({
42475
42663
  ok: boolean(),
@@ -42521,20 +42709,33 @@ var TrainerSourceRefSchema = object({
42521
42709
  /** A commit sha (never a branch) — the job must be reproducible. */
42522
42710
  revision: string$2().regex(/^[0-9a-f]{7,64}$/)
42523
42711
  });
42712
+ /** Cloud job identity — route with the owning addon's `addonId` selector. */
42524
42713
  var JobRef = {
42525
- addonId: string$2(),
42714
+ entryId: string$2().min(1),
42526
42715
  jobKey: string$2().uuid()
42527
42716
  };
42528
42717
  var TrainingLogLineSchema = object({
42529
42718
  ts: number(),
42530
42719
  text: string$2()
42531
42720
  });
42532
- method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({ addonId: string$2() }), TrainingCredentialCheckSchema, {
42721
+ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderTypeSchema).readonly(), { auth: "admin" }), method(object({}), array(TrainingProviderEntrySchema).readonly(), { auth: "admin" }), method(object({
42722
+ typeId: string$2().min(1),
42723
+ name: string$2().min(1)
42724
+ }), object({ entryId: string$2() }), {
42725
+ kind: "mutation",
42726
+ auth: "admin"
42727
+ }), method(object({ entryId: string$2().min(1) }), object({ ok: literal(true) }), {
42728
+ kind: "mutation",
42729
+ auth: "admin"
42730
+ }), method(TrainingProviderUpdateEntryInputSchema, object({ ok: literal(true) }), {
42731
+ kind: "mutation",
42732
+ auth: "admin"
42733
+ }), method(object({ entryId: string$2().min(1) }), TrainingCredentialCheckSchema, {
42533
42734
  kind: "mutation",
42534
42735
  auth: "admin",
42535
42736
  timeoutMs: 3e4
42536
42737
  }), method(object({
42537
- addonId: string$2(),
42738
+ entryId: string$2().min(1),
42538
42739
  gpuType: string$2(),
42539
42740
  region: string$2(),
42540
42741
  datasetBytes: number().int().nonnegative(),
@@ -42600,7 +42801,7 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42600
42801
  kind: "mutation",
42601
42802
  auth: "admin",
42602
42803
  timeoutMs: 5 * 6e4
42603
- }), method(object({ addonId: string$2() }), array(ProviderJobStatusSchema).readonly(), {
42804
+ }), method(object({ entryId: string$2().min(1).optional() }), array(ProviderJobStatusSchema).readonly(), {
42604
42805
  auth: "admin",
42605
42806
  timeoutMs: 2 * 6e4
42606
42807
  });
@@ -42610,20 +42811,31 @@ method(object({}), array(TrainingProviderDescriptorSchema).readonly(), { auth: "
42610
42811
  *
42611
42812
  * It owns what every provider must agree on, written once:
42612
42813
  *
42613
- * - **Dataset versions.** Taken over from pipeline-analytics (D796): the rows
42614
- * live here (D808); pipeline-analytics still CUTS a version (it owns the corpus and
42615
- * the export plan) and reaches this store through the five row methods
42616
- * below, so the Retrain page and the export did not change.
42617
42814
  * - **Jobs.** A persisted state machine, a reconcile loop against the
42618
42815
  * provider, a cost guard, a daily orphan sweep and the retention rules.
42619
42816
  * - **The return flow.** Verified artefacts → Model Studio
42620
42817
  * (`custom-model-registry.importModelBundle`) → canary on cameras →
42621
42818
  * rollback. Nothing is ever registered automatically.
42622
42819
  *
42820
+ * Plan/start takes a live {@link TrainingCorpusSelection} (collections +
42821
+ * work-state rule); frame ids are resolved via pipeline-analytics at that
42822
+ * moment and snapshotted on the job. No frozen dataset version.
42823
+ *
42623
42824
  * Every method is `admin`.
42624
42825
  */
42625
- /** A version WITH its frame list — what the export and a job read. */
42626
- var TrainingDatasetVersionRowSchema = RetrainDatasetVersionSchema.omit({ frameCount: true }).extend({ frameIds: array(string$2()).max(2e4).readonly() });
42826
+ /**
42827
+ * Live corpus criteria for plan/start (design §5.2). Default is complete-only.
42828
+ * Frame ids are resolved at plan/start — never a frozen version id.
42829
+ */
42830
+ var TrainingCorpusSelectionSchema = object({
42831
+ collectionIds: array(string$2()).min(1),
42832
+ /** Default complete-only for v1 */
42833
+ workState: _enum([
42834
+ "complete",
42835
+ "annotated_or_complete",
42836
+ "any_annotated"
42837
+ ]).default("complete")
42838
+ });
42627
42839
  /** A base model a detector job can fine-tune, and the baseline it is judged against. */
42628
42840
  var TrainingBaseModelSchema = object({
42629
42841
  modelId: string$2(),
@@ -42641,9 +42853,13 @@ var TrainingPresetSchema = _enum([
42641
42853
  "thorough"
42642
42854
  ]);
42643
42855
  var TrainingJobRequestSchema = object({
42644
- datasetVersionId: string$2().min(1),
42645
- /** The `training-provider` addon that runs it. */
42646
- addonId: string$2().min(1),
42856
+ /** Live collection + work-state criteria; resolved at plan/start. */
42857
+ selection: TrainingCorpusSelectionSchema,
42858
+ /**
42859
+ * The provider **entry** that runs it (credentials + defaults).
42860
+ * Resolve to an owning addon via `training-provider.describe` / `listEntries`.
42861
+ */
42862
+ entryId: string$2().min(1),
42647
42863
  gpuType: string$2().min(1),
42648
42864
  region: string$2(),
42649
42865
  baseModelId: string$2().min(1),
@@ -42702,6 +42918,7 @@ var TrainingJobPlanSchema = object({
42702
42918
  * result lives after the operator acted on it.
42703
42919
  */
42704
42920
  var TrainingJobStateSchema = _enum([
42921
+ "queued",
42705
42922
  "uploading",
42706
42923
  "submitted",
42707
42924
  "starting",
@@ -42755,6 +42972,11 @@ var TrainingJobSchema = object({
42755
42972
  createdAt: number(),
42756
42973
  updatedAt: number(),
42757
42974
  state: TrainingJobStateSchema,
42975
+ /**
42976
+ * Shared by every job enqueued together via `startJobBatch`.
42977
+ * `null` for a lone `startJob`. The engine advances queued siblings by this id.
42978
+ */
42979
+ batchId: string$2().nullable().default(null),
42758
42980
  stage: TrainingStageSchema.nullable(),
42759
42981
  failure: object({
42760
42982
  reason: TrainingFailureReasonSchema,
@@ -42766,6 +42988,12 @@ var TrainingJobSchema = object({
42766
42988
  maxRuntimeSec: number().int().positive(),
42767
42989
  trainer: TrainerSourceRefSchema,
42768
42990
  datasetLayout: RetrainExportLayoutSchema,
42991
+ /** Frame count snapshotted when the job started (audit; equals `frameIds.length`). */
42992
+ frameCount: number().int().nonnegative(),
42993
+ /** Resolved frame ids at start — the archive ships exactly these. */
42994
+ frameIds: array(string$2()).max(2e4).readonly(),
42995
+ /** Hash of what those frames taught at start (trainer `dataset.annotationHash`). */
42996
+ annotationHash: string$2(),
42769
42997
  dataset: object({
42770
42998
  bytes: number().int(),
42771
42999
  sha256: string$2(),
@@ -42807,13 +43035,7 @@ var TrainingJobSchema = object({
42807
43035
  canary: TrainingCanarySchema.nullable()
42808
43036
  });
42809
43037
  var IdInput = object({ id: string$2().min(1) });
42810
- method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42811
- kind: "mutation",
42812
- auth: "admin"
42813
- }), method(IdInput, TrainingDatasetVersionRowSchema.nullable(), { auth: "admin" }), method(object({}), array(RetrainDatasetVersionSchema).readonly(), { auth: "admin" }), method(object({ name: string$2() }), object({ id: string$2().nullable() }), { auth: "admin" }), method(IdInput, object({ removed: boolean() }), {
42814
- kind: "mutation",
42815
- auth: "admin"
42816
- }), method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
43038
+ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" }), method(TrainingJobRequestSchema, TrainingJobPlanSchema, {
42817
43039
  auth: "admin",
42818
43040
  timeoutMs: 6e4
42819
43041
  }), method(TrainingJobRequestSchema.extend({
@@ -42832,6 +43054,24 @@ method(TrainingDatasetVersionRowSchema, object({ stored: boolean() }), {
42832
43054
  kind: "mutation",
42833
43055
  auth: "admin",
42834
43056
  timeoutMs: 12e4
43057
+ }), method(TrainingJobRequestSchema.omit({ baseModelId: true }).extend({
43058
+ baseModelIds: array(string$2().min(1)).min(1),
43059
+ name: string$2().min(1).max(120),
43060
+ maxCostUsd: number().positive(),
43061
+ maxRuntimeSec: number().int().positive(),
43062
+ idempotencyKey: string$2().min(8).max(80)
43063
+ }), discriminatedUnion("kind", [object({
43064
+ kind: literal("started"),
43065
+ batchId: string$2(),
43066
+ jobs: array(TrainingJobSchema).min(1).readonly()
43067
+ }), object({
43068
+ kind: literal("refused"),
43069
+ reason: TrainingRefusalReasonSchema,
43070
+ detail: string$2()
43071
+ })]), {
43072
+ kind: "mutation",
43073
+ auth: "admin",
43074
+ timeoutMs: 12e4
42835
43075
  }), method(object({}), array(TrainingJobSchema).readonly(), { auth: "admin" }), method(IdInput, TrainingJobSchema.nullable(), { auth: "admin" }), method(IdInput, TrainingJobSchema, {
42836
43076
  kind: "mutation",
42837
43077
  auth: "admin",
@@ -48390,6 +48630,36 @@ Object.freeze({
48390
48630
  addonId: null,
48391
48631
  access: "view"
48392
48632
  },
48633
+ "oidcConnections.connectionFormSchema": {
48634
+ capName: "oidc-connections",
48635
+ capScope: "system",
48636
+ addonId: null,
48637
+ access: "view"
48638
+ },
48639
+ "oidcConnections.createConnection": {
48640
+ capName: "oidc-connections",
48641
+ capScope: "system",
48642
+ addonId: null,
48643
+ access: "create"
48644
+ },
48645
+ "oidcConnections.deleteConnection": {
48646
+ capName: "oidc-connections",
48647
+ capScope: "system",
48648
+ addonId: null,
48649
+ access: "delete"
48650
+ },
48651
+ "oidcConnections.listConnections": {
48652
+ capName: "oidc-connections",
48653
+ capScope: "system",
48654
+ addonId: null,
48655
+ access: "view"
48656
+ },
48657
+ "oidcConnections.updateConnection": {
48658
+ capName: "oidc-connections",
48659
+ capScope: "system",
48660
+ addonId: null,
48661
+ access: "create"
48662
+ },
48393
48663
  "osd.getStatus": {
48394
48664
  capName: "osd",
48395
48665
  capScope: "device",
@@ -48462,6 +48732,12 @@ Object.freeze({
48462
48732
  addonId: null,
48463
48733
  access: "create"
48464
48734
  },
48735
+ "osdManager.setSlotCameraEnabled": {
48736
+ capName: "osd-manager",
48737
+ capScope: "system",
48738
+ addonId: null,
48739
+ access: "create"
48740
+ },
48465
48741
  "osdManager.upsertTemplate": {
48466
48742
  capName: "osd-manager",
48467
48743
  capScope: "system",
@@ -48600,12 +48876,6 @@ Object.freeze({
48600
48876
  addonId: null,
48601
48877
  access: "create"
48602
48878
  },
48603
- "pipelineAnalytics.createRetrainDatasetVersion": {
48604
- capName: "pipeline-analytics",
48605
- capScope: "device",
48606
- addonId: null,
48607
- access: "create"
48608
- },
48609
48879
  "pipelineAnalytics.deleteDeviceEvents": {
48610
48880
  capName: "pipeline-analytics",
48611
48881
  capScope: "device",
@@ -48618,12 +48888,6 @@ Object.freeze({
48618
48888
  addonId: null,
48619
48889
  access: "delete"
48620
48890
  },
48621
- "pipelineAnalytics.deleteRetrainDatasetVersion": {
48622
- capName: "pipeline-analytics",
48623
- capScope: "device",
48624
- addonId: null,
48625
- access: "delete"
48626
- },
48627
48891
  "pipelineAnalytics.deleteTracks": {
48628
48892
  capName: "pipeline-analytics",
48629
48893
  capScope: "device",
@@ -48726,6 +48990,12 @@ Object.freeze({
48726
48990
  addonId: null,
48727
48991
  access: "view"
48728
48992
  },
48993
+ "pipelineAnalytics.getRetrainCorpusKpi": {
48994
+ capName: "pipeline-analytics",
48995
+ capScope: "device",
48996
+ addonId: null,
48997
+ access: "view"
48998
+ },
48729
48999
  "pipelineAnalytics.getRetrainExportUrl": {
48730
49000
  capName: "pipeline-analytics",
48731
49001
  capScope: "device",
@@ -48846,7 +49116,7 @@ Object.freeze({
48846
49116
  addonId: null,
48847
49117
  access: "view"
48848
49118
  },
48849
- "pipelineAnalytics.listRetrainDatasetVersions": {
49119
+ "pipelineAnalytics.listRetrainCorpusPage": {
48850
49120
  capName: "pipeline-analytics",
48851
49121
  capScope: "device",
48852
49122
  addonId: null,
@@ -48900,12 +49170,6 @@ Object.freeze({
48900
49170
  addonId: null,
48901
49171
  access: "create"
48902
49172
  },
48903
- "pipelineAnalytics.previewRetrainDataset": {
48904
- capName: "pipeline-analytics",
48905
- capScope: "device",
48906
- addonId: null,
48907
- access: "view"
48908
- },
48909
49173
  "pipelineAnalytics.proposeRetrainAnnotations": {
48910
49174
  capName: "pipeline-analytics",
48911
49175
  capScope: "device",
@@ -48984,6 +49248,12 @@ Object.freeze({
48984
49248
  addonId: null,
48985
49249
  access: "create"
48986
49250
  },
49251
+ "pipelineAnalytics.resolveRetrainTrainingCorpus": {
49252
+ capName: "pipeline-analytics",
49253
+ capScope: "device",
49254
+ addonId: null,
49255
+ access: "view"
49256
+ },
48987
49257
  "pipelineAnalytics.restageRetrainTrack": {
48988
49258
  capName: "pipeline-analytics",
48989
49259
  capScope: "device",
@@ -49044,12 +49314,6 @@ Object.freeze({
49044
49314
  addonId: null,
49045
49315
  access: "create"
49046
49316
  },
49047
- "pipelineAnalytics.verifyRetrainDatasetVersion": {
49048
- capName: "pipeline-analytics",
49049
- capScope: "device",
49050
- addonId: null,
49051
- access: "view"
49052
- },
49053
49317
  "pipelineAnalytics.wipeAllAnalytics": {
49054
49318
  capName: "pipeline-analytics",
49055
49319
  capScope: "device",
@@ -51444,18 +51708,6 @@ Object.freeze({
51444
51708
  addonId: null,
51445
51709
  access: "create"
51446
51710
  },
51447
- "training.findDatasetVersionIdByName": {
51448
- capName: "training",
51449
- capScope: "system",
51450
- addonId: null,
51451
- access: "view"
51452
- },
51453
- "training.getDatasetVersion": {
51454
- capName: "training",
51455
- capScope: "system",
51456
- addonId: null,
51457
- access: "view"
51458
- },
51459
51711
  "training.getJob": {
51460
51712
  capName: "training",
51461
51713
  capScope: "system",
@@ -51474,12 +51726,6 @@ Object.freeze({
51474
51726
  addonId: null,
51475
51727
  access: "view"
51476
51728
  },
51477
- "training.listDatasetVersions": {
51478
- capName: "training",
51479
- capScope: "system",
51480
- addonId: null,
51481
- access: "view"
51482
- },
51483
51729
  "training.listJobs": {
51484
51730
  capName: "training",
51485
51731
  capScope: "system",
@@ -51492,54 +51738,66 @@ Object.freeze({
51492
51738
  addonId: null,
51493
51739
  access: "view"
51494
51740
  },
51495
- "training.putDatasetVersion": {
51741
+ "training.registerResult": {
51496
51742
  capName: "training",
51497
51743
  capScope: "system",
51498
51744
  addonId: null,
51499
51745
  access: "create"
51500
51746
  },
51501
- "training.registerResult": {
51747
+ "training.rollbackCanary": {
51502
51748
  capName: "training",
51503
51749
  capScope: "system",
51504
51750
  addonId: null,
51505
51751
  access: "create"
51506
51752
  },
51507
- "training.removeDatasetVersion": {
51753
+ "training.startJob": {
51508
51754
  capName: "training",
51509
51755
  capScope: "system",
51510
51756
  addonId: null,
51511
- access: "delete"
51757
+ access: "create"
51512
51758
  },
51513
- "training.rollbackCanary": {
51759
+ "training.startJobBatch": {
51514
51760
  capName: "training",
51515
51761
  capScope: "system",
51516
51762
  addonId: null,
51517
51763
  access: "create"
51518
51764
  },
51519
- "training.startJob": {
51520
- capName: "training",
51765
+ "trainingProvider.cancelJob": {
51766
+ capName: "training-provider",
51521
51767
  capScope: "system",
51522
51768
  addonId: null,
51523
51769
  access: "create"
51524
51770
  },
51525
- "trainingProvider.cancelJob": {
51771
+ "trainingProvider.cleanupJob": {
51526
51772
  capName: "training-provider",
51527
51773
  capScope: "system",
51528
51774
  addonId: null,
51529
51775
  access: "create"
51530
51776
  },
51531
- "trainingProvider.cleanupJob": {
51777
+ "trainingProvider.createEntry": {
51532
51778
  capName: "training-provider",
51533
51779
  capScope: "system",
51534
51780
  addonId: null,
51535
51781
  access: "create"
51536
51782
  },
51783
+ "trainingProvider.deleteEntry": {
51784
+ capName: "training-provider",
51785
+ capScope: "system",
51786
+ addonId: null,
51787
+ access: "delete"
51788
+ },
51537
51789
  "trainingProvider.describe": {
51538
51790
  capName: "training-provider",
51539
51791
  capScope: "system",
51540
51792
  addonId: null,
51541
51793
  access: "view"
51542
51794
  },
51795
+ "trainingProvider.describeTypes": {
51796
+ capName: "training-provider",
51797
+ capScope: "system",
51798
+ addonId: null,
51799
+ access: "view"
51800
+ },
51543
51801
  "trainingProvider.estimateJob": {
51544
51802
  capName: "training-provider",
51545
51803
  capScope: "system",
@@ -51552,6 +51810,12 @@ Object.freeze({
51552
51810
  addonId: null,
51553
51811
  access: "view"
51554
51812
  },
51813
+ "trainingProvider.listEntries": {
51814
+ capName: "training-provider",
51815
+ capScope: "system",
51816
+ addonId: null,
51817
+ access: "view"
51818
+ },
51555
51819
  "trainingProvider.listJobEvents": {
51556
51820
  capName: "training-provider",
51557
51821
  capScope: "system",
@@ -51582,6 +51846,12 @@ Object.freeze({
51582
51846
  addonId: null,
51583
51847
  access: "create"
51584
51848
  },
51849
+ "trainingProvider.updateEntry": {
51850
+ capName: "training-provider",
51851
+ capScope: "system",
51852
+ addonId: null,
51853
+ access: "create"
51854
+ },
51585
51855
  "trainingProvider.uploadDataset": {
51586
51856
  capName: "training-provider",
51587
51857
  capScope: "system",
@@ -54788,6 +55058,11 @@ Object.freeze({
54788
55058
  form: "single",
54789
55059
  optional: false
54790
55060
  }],
55061
+ "osdManager.setSlotCameraEnabled": [{
55062
+ name: "deviceId",
55063
+ form: "single",
55064
+ optional: false
55065
+ }],
54791
55066
  "petFeeder.callPet": [{
54792
55067
  name: "deviceId",
54793
55068
  form: "single",
@@ -55008,6 +55283,11 @@ Object.freeze({
55008
55283
  form: "array",
55009
55284
  optional: false
55010
55285
  }],
55286
+ "pipelineAnalytics.listRetrainCorpusPage": [{
55287
+ name: "deviceIds",
55288
+ form: "array",
55289
+ optional: true
55290
+ }],
55011
55291
  "pipelineAnalytics.listRetrainStaging": [{
55012
55292
  name: "deviceIds",
55013
55293
  form: "array",
@@ -56117,6 +56397,7 @@ Object.freeze({
56117
56397
  });
56118
56398
  Object.freeze({
56119
56399
  "broker": "broker",
56400
+ "calendar-source": "calendar",
56120
56401
  "device-export": "device-export",
56121
56402
  "llm": "ai",
56122
56403
  "mesh-network": "mesh",
@@ -56602,6 +56883,8 @@ var STATE_SUMMARY_VARS = [
56602
56883
  [...RULE_TEXT],
56603
56884
  [...RULE_TEXT],
56604
56885
  [...RULE_TEXT],
56886
+ [...RULE_TEXT],
56887
+ [...RULE_TEXT],
56605
56888
  ([...RULE_TEXT], [...UPDATES]),
56606
56889
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),
56607
56890
  ([...RULE_TEXT], [...PACKAGE_UPDATES]),