@camstack/system 1.2.421 → 1.2.423

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 (68) hide show
  1. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  2. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  3. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/alerts/alerts.addon.js +1 -1
  6. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  7. package/dist/builtins/autotrack/index.js +1 -1
  8. package/dist/builtins/autotrack/index.mjs +1 -1
  9. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  10. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  11. package/dist/builtins/calendars/calendars.addon.js +1 -1
  12. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  13. package/dist/builtins/camera-grid/index.js +1 -1
  14. package/dist/builtins/camera-grid/index.mjs +1 -1
  15. package/dist/builtins/composer/composer.addon.js +2 -2
  16. package/dist/builtins/composer/composer.addon.mjs +2 -2
  17. package/dist/builtins/console-logging/index.js +1 -1
  18. package/dist/builtins/console-logging/index.mjs +1 -1
  19. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  20. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  21. package/dist/builtins/device-manager/device-manager.addon.js +2 -2
  22. package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
  23. package/dist/builtins/hub-forwarder/index.js +1 -1
  24. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  25. package/dist/builtins/keychain/index.js +3 -3
  26. package/dist/builtins/keychain/index.mjs +3 -3
  27. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  28. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  29. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  30. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  31. package/dist/builtins/local-network/local-network.addon.js +1 -1
  32. package/dist/builtins/local-network/local-network.addon.mjs +1 -1
  33. package/dist/builtins/loki-logging/index.js +1 -1
  34. package/dist/builtins/loki-logging/index.mjs +1 -1
  35. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  36. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  37. package/dist/builtins/platform-probe/index.js +1 -1
  38. package/dist/builtins/platform-probe/index.mjs +1 -1
  39. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  40. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  41. package/dist/builtins/snapshot/index.js +1 -1
  42. package/dist/builtins/snapshot/index.mjs +1 -1
  43. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  44. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  45. package/dist/builtins/sqlite-storage/sqlite-settings-backend.d.ts +44 -1
  46. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  47. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  48. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +3 -1
  49. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +3 -1
  50. package/dist/builtins/system-config/system-config.addon.js +2 -2
  51. package/dist/builtins/system-config/system-config.addon.mjs +279 -279
  52. package/dist/builtins/winston-logging/index.js +1 -1
  53. package/dist/builtins/winston-logging/index.mjs +1 -1
  54. package/dist/{composition-sources-DoYpCPtl.mjs → composition-sources-BXDchWFn.mjs} +1 -1
  55. package/dist/{composition-sources-DxlTUSI1.js → composition-sources-CgiAeG-2.js} +1 -1
  56. package/dist/{constants-GXZQRcjB.js → constants-1_7QtPNo.js} +1 -1
  57. package/dist/{constants-CtxNK2QJ.mjs → constants-C2dhkIuF.mjs} +1 -1
  58. package/dist/{dist-0OD9ue39.mjs → dist-DimotS8e.mjs} +223 -3
  59. package/dist/{dist-Df7s77se.js → dist-VIIxVsBW.js} +223 -3
  60. package/dist/index.js +4 -4
  61. package/dist/index.mjs +4 -4
  62. package/dist/{jwt-signing-key-W-WFzAoK.mjs → jwt-signing-key-C8nMdNYW.mjs} +1 -1
  63. package/dist/{jwt-signing-key-BmyvxlDJ.js → jwt-signing-key-C8s9syVg.js} +1 -1
  64. package/dist/{restore-archive-W1Cg5y6C.js → restore-archive-DjppfrIB.js} +1 -1
  65. package/dist/{restore-archive-BUMSox6L.mjs → restore-archive-bOMZwY0D.mjs} +77 -77
  66. package/dist/{retired-settings-keys-Wz92bcuK.mjs → retired-settings-keys-BYnjMBE-.mjs} +1 -1
  67. package/dist/{retired-settings-keys-D-Xv1Zyv.js → retired-settings-keys-_muTvNyh.js} +1 -1
  68. package/package.json +1 -1
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Df7s77se.js");
6
+ const require_dist = require("../../dist-VIIxVsBW.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_chunk.__toESM(node_path);
@@ -1,4 +1,4 @@
1
- import { Xt as logDestinationCapability, cr as BaseAddon } from "../../dist-0OD9ue39.mjs";
1
+ import { Xt as logDestinationCapability, cr as BaseAddon } from "../../dist-DimotS8e.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  import * as path$1 from "node:path";
4
4
  import path from "node:path";
@@ -1,4 +1,4 @@
1
- import { er as compositionSourceKey, sr as errMsg } from "./dist-0OD9ue39.mjs";
1
+ import { er as compositionSourceKey, sr as errMsg } from "./dist-DimotS8e.mjs";
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-Df7s77se.js");
1
+ const require_dist = require("./dist-VIIxVsBW.js");
2
2
  //#region src/builtins/core-blocks/composition-sources.ts
3
3
  /**
4
4
  * Describe what a composition reads and writes for SAVE-time validation
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-Df7s77se.js");
1
+ const require_dist = require("./dist-VIIxVsBW.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/kernel/moleculer/cluster-secret.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { xr as buildSecretRef } from "./dist-0OD9ue39.mjs";
1
+ import { xr as buildSecretRef } from "./dist-DimotS8e.mjs";
2
2
  import { createHash, timingSafeEqual } from "node:crypto";
3
3
  //#region src/kernel/moleculer/cluster-secret.ts
4
4
  /**
@@ -718,7 +718,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
718
718
  return EventCategory;
719
719
  }({});
720
720
  //#endregion
721
- //#region ../types/dist/sleep-B_3F_YwS.mjs
721
+ //#region ../types/dist/sleep-BBF1iXUi.mjs
722
722
  /**
723
723
  * The audio chunk plane's byte format, and the ONE expansion from a coded
724
724
  * window to float samples (D455).
@@ -7338,6 +7338,15 @@ z.discriminatedUnion("type", [
7338
7338
  message: z.string()
7339
7339
  })
7340
7340
  ]);
7341
+ /** Every status, in the order a summary lists them. */
7342
+ var RETRAIN_REVIEW_STATUSES = [
7343
+ "unchanged",
7344
+ "adjusted",
7345
+ "reclassified",
7346
+ "added",
7347
+ "removed",
7348
+ "model-error"
7349
+ ];
7341
7350
  /**
7342
7351
  * What the gate decided about a birth, from the CALLER's point of view.
7343
7352
  *
@@ -15124,6 +15133,38 @@ var BulkRecordSchema = z.object({
15124
15133
  data: z.record(z.string(), z.unknown())
15125
15134
  });
15126
15135
  /**
15136
+ * One write inside a {@link settingsStoreCapability.methods.transact} call.
15137
+ * Only the three that a "replace this set, bump that revision" write needs.
15138
+ */
15139
+ var TransactOpSchema = z.discriminatedUnion("op", [
15140
+ z.object({
15141
+ op: z.literal("deleteWhere"),
15142
+ collection: z.string(),
15143
+ filter: MutationFilterSchema
15144
+ }),
15145
+ z.object({
15146
+ op: z.literal("insertMany"),
15147
+ collection: z.string(),
15148
+ records: z.array(BulkRecordSchema).readonly()
15149
+ }),
15150
+ z.object({
15151
+ op: z.literal("update"),
15152
+ collection: z.string(),
15153
+ id: z.string(),
15154
+ data: z.record(z.string(), z.unknown())
15155
+ })
15156
+ ]);
15157
+ /**
15158
+ * The precondition of a transaction: the row `key` of `collection` must hold
15159
+ * `equals` in `column`, read INSIDE the transaction.
15160
+ */
15161
+ var TransactGuardSchema = z.object({
15162
+ collection: z.string(),
15163
+ key: z.string(),
15164
+ column: z.string(),
15165
+ equals: z.unknown()
15166
+ });
15167
+ /**
15127
15168
  * Column declaration for a structured (SQL-backed) collection.
15128
15169
  *
15129
15170
  * Logical types — the backend translates each to the matching SQLite
@@ -15348,6 +15389,36 @@ id: z.union([z.string(), z.number()]) }), {
15348
15389
  kind: "mutation",
15349
15390
  auth: "admin"
15350
15391
  }),
15392
+ /**
15393
+ * Several writes, ONE transaction, behind an optional precondition.
15394
+ *
15395
+ * The multi-collection twin of {@link insertMany}: a write that has to move
15396
+ * a set of rows in one collection AND a revision in another cannot be
15397
+ * expressed as separate calls without a window in which a reader (or a
15398
+ * crash) sees half of it. The retrain annotation save replaces a frame's
15399
+ * rows, its dismissed set and its revision this way.
15400
+ *
15401
+ * `guard`, when given, is read inside the transaction: if the row is
15402
+ * missing or its column differs from `equals`, NOTHING is written and the
15403
+ * answer is `{ applied: false, current }` with what was found — the
15404
+ * compare-and-set a revisioned write needs, with no second reader able to
15405
+ * slip between the check and the writes.
15406
+ *
15407
+ * **All or nothing**, like {@link insertMany}: a throw in any op rolls the
15408
+ * whole call back. Ops run in the order given (delete before insert to
15409
+ * replace a set). `namespace` applies to every collection named.
15410
+ */
15411
+ transact: method(z.object({
15412
+ namespace: z.string().optional(),
15413
+ guard: TransactGuardSchema.optional(),
15414
+ ops: z.array(TransactOpSchema).readonly()
15415
+ }), z.object({
15416
+ applied: z.boolean(),
15417
+ current: z.unknown().optional()
15418
+ }), {
15419
+ kind: "mutation",
15420
+ auth: "admin"
15421
+ }),
15351
15422
  /** Update an existing record by ID. */
15352
15423
  update: method(z.object({
15353
15424
  namespace: z.string().optional(),
@@ -15632,6 +15703,18 @@ id: z.union([z.string(), z.number()]) }), {
15632
15703
  kind: "mutation",
15633
15704
  auth: "admin"
15634
15705
  }),
15706
+ /** Several writes in ONE transaction behind an optional guard; see the door. */
15707
+ transact: method(z.object({
15708
+ namespace: z.string().optional(),
15709
+ guard: TransactGuardSchema.optional(),
15710
+ ops: z.array(TransactOpSchema).readonly()
15711
+ }), z.object({
15712
+ applied: z.boolean(),
15713
+ current: z.unknown().optional()
15714
+ }), {
15715
+ kind: "mutation",
15716
+ auth: "admin"
15717
+ }),
15635
15718
  /** Update an existing record by ID. */
15636
15719
  update: method(z.object({
15637
15720
  namespace: z.string().optional(),
@@ -26313,6 +26396,59 @@ var RetrainBboxSchema = z.object({
26313
26396
  h: z.number()
26314
26397
  });
26315
26398
  /**
26399
+ * What a box LOOKED LIKE when it was offered, snapshotted at the moment the
26400
+ * operator accepted it. The saved row keeps only the final rectangle; this is
26401
+ * the other half of the pair, and the pair is what says whether the operator
26402
+ * accepted, nudged, relabelled or replaced a proposal (`retrain-review.ts`).
26403
+ *
26404
+ * `ref` names the proposal inside its frame: `pipeline:<trackId>` for a box the
26405
+ * live pipeline drew, `assist:<n>` for the n-th box of a detector or LLM run,
26406
+ * and anything unique for an operator-drawn box (`operator:<n>`). Re-derived
26407
+ * pipeline boxes carry the same ref every time, which is what lets a dismissal
26408
+ * stay dismissed.
26409
+ */
26410
+ var RetrainOriginSchema = z.object({
26411
+ source: RetrainAnnotationSourceSchema,
26412
+ ref: z.string().min(1),
26413
+ bbox: RetrainBboxSchema,
26414
+ macroClass: RetrainMacroClassSchema,
26415
+ label: z.string().optional(),
26416
+ score: z.number().optional(),
26417
+ modelId: z.string().optional()
26418
+ });
26419
+ /**
26420
+ * A proposal the operator deleted. Durable on the frame, so a deleted pipeline
26421
+ * box does not come back as a draft every time the frame is reopened, and so
26422
+ * the deletion itself is a recorded fact rather than an absence.
26423
+ */
26424
+ var RetrainDismissedSchema = z.object({
26425
+ ref: z.string().min(1),
26426
+ snapshot: RetrainOriginSchema
26427
+ });
26428
+ /** What the operator did with a proposal (see `retrain-review.ts`). */
26429
+ var RetrainReviewStatusSchema = z.enum(RETRAIN_REVIEW_STATUSES);
26430
+ var RetrainBoxReviewSchema = z.object({
26431
+ ref: z.string(),
26432
+ savedId: z.string().optional(),
26433
+ status: RetrainReviewStatusSchema,
26434
+ /** The baseline was re-derived, not snapshotted (a pre-origin row). */
26435
+ approximate: z.boolean(),
26436
+ origin: RetrainOriginSchema.optional(),
26437
+ /** The class / label the box carries NOW (a removed box: its origin's). Absent on an older hub. */
26438
+ macroClass: RetrainMacroClassSchema.optional(),
26439
+ label: z.string().optional(),
26440
+ iou: z.number().optional()
26441
+ });
26442
+ var RetrainFrameReviewSchema = z.object({
26443
+ boxes: z.array(RetrainBoxReviewSchema).readonly(),
26444
+ summary: z.object({
26445
+ counts: z.record(RetrainReviewStatusSchema, z.number().int()),
26446
+ total: z.number().int(),
26447
+ changed: z.number().int(),
26448
+ approximate: z.boolean()
26449
+ })
26450
+ });
26451
+ /**
26316
26452
  * One annotated subject.
26317
26453
  *
26318
26454
  * `bbox` is normalised against the full frame, ALWAYS. The per-model shapes
@@ -26336,6 +26472,9 @@ var RetrainAnnotationSchema = z.object({
26336
26472
  /** Which model proposed this box — or, on a `model_error`, drew the phantom. */
26337
26473
  assistModelId: z.string().optional(),
26338
26474
  assistScore: z.number().optional(),
26475
+ /** The proposal this box started from, snapshotted at accept time. `null` on
26476
+ * a row saved before origins existed; absent on a draft nobody snapshotted. */
26477
+ origin: RetrainOriginSchema.nullable().optional(),
26339
26478
  exportedInBatch: z.string().optional(),
26340
26479
  createdAt: z.number()
26341
26480
  });
@@ -26428,7 +26567,19 @@ var RetrainFrameSchema = z.object({
26428
26567
  * empty when nothing the track store holds can be placed on it. */
26429
26568
  pipelineBoxes: z.array(RetrainPipelineBoxSchema).readonly().optional(),
26430
26569
  /** The named collections this frame belongs to. Present on list answers. */
26431
- collectionIds: z.array(z.string()).readonly().optional()
26570
+ collectionIds: z.array(z.string()).readonly().optional(),
26571
+ /** Bumped by every annotation save. A save that names a stale
26572
+ * `expectedRevision` is refused, so two surfaces cannot overwrite each other. */
26573
+ revision: z.number().int().optional(),
26574
+ /** Proposals the operator deleted — never re-seeded as drafts. */
26575
+ dismissed: z.array(RetrainDismissedSchema).readonly().optional(),
26576
+ /** What the operator did with the proposals, computed by the server. */
26577
+ review: RetrainFrameReviewSchema.optional(),
26578
+ /** The frame's pixels over the admin data plane (full size). Fetch with the
26579
+ * admin bearer token; relative to the hub root. */
26580
+ imageUrl: z.string().optional(),
26581
+ /** The same, as a ~480 px thumbnail for grids. */
26582
+ thumbnailUrl: z.string().optional()
26432
26583
  });
26433
26584
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
26434
26585
  var RetrainCopyRefusalSchema = z.enum([
@@ -27971,6 +28122,11 @@ var pipelineAnalyticsCapability = {
27971
28122
  /**
27972
28123
  * The pixels of ONE copied frame, base64.
27973
28124
  *
28125
+ * @deprecated Use `RetrainFrame.imageUrl` / `thumbnailUrl` (the admin
28126
+ * `retrain-frame` data plane, D613). A base64 envelope holds the frame
28127
+ * whole in the producer AND the caller, and a grid of tiles paid that for
28128
+ * every tile. Kept for one release for callers that cannot fetch a URL.
28129
+ *
27974
28130
  * Through the cap rather than a data plane because it is genuinely one
27975
28131
  * frame at a time, on demand, at human speed — the shape D9/D18 permit
27976
28132
  * (what they forbid is frames crossing a boundary at frame RATE). The
@@ -28033,18 +28189,59 @@ var pipelineAnalyticsCapability = {
28033
28189
  * Refuses a macro class typed into `label` or `subLabel` — the tiers are
28034
28190
  * separate and the guard is at the WRITE, because a mixed taxonomy cannot
28035
28191
  * be un-mixed by reading it.
28192
+ *
28193
+ * ATOMIC and REVISIONED: the replaced rows, the frame's `dismissed` set and
28194
+ * its `revision` move in one transaction, guarded by the revision the
28195
+ * caller saw. A stale `expectedRevision` writes nothing and throws
28196
+ * `retrain-revision-conflict` (parse it with `parseRetrainRevisionConflict`);
28197
+ * the UI and an MCP agent no longer overwrite each other silently.
28036
28198
  */
28037
28199
  saveRetrainAnnotations: method(z.object({
28038
28200
  deviceId: z.number(),
28039
28201
  /** The frame's track, when it has one — checked against the frame. */
28040
28202
  trackId: z.string().optional(),
28041
28203
  frameId: z.string(),
28042
- annotations: z.array(RetrainAnnotationDraftSchema)
28204
+ annotations: z.array(RetrainAnnotationDraftSchema),
28205
+ /** The frame's `revision` the caller saw. A different current revision
28206
+ * refuses the save with a `retrain-revision-conflict` error
28207
+ * (`parseRetrainRevisionConflict`). Absent ⇒ last write wins. */
28208
+ expectedRevision: z.number().int().optional(),
28209
+ /** The proposals the operator deleted. Absent ⇒ keep the frame's
28210
+ * current set; present ⇒ replace it (an empty array un-dismisses). */
28211
+ dismissed: z.array(RetrainDismissedSchema).optional()
28043
28212
  }), z.array(RetrainAnnotationSchema).readonly(), {
28044
28213
  kind: "mutation",
28045
28214
  auth: "admin"
28046
28215
  }),
28047
28216
  /**
28217
+ * Give annotations saved BEFORE origins existed the origin a caller
28218
+ * reconstructed for them (the MCP `track_review_backfill_origin` tool
28219
+ * matches each row to the pipeline box it equals).
28220
+ *
28221
+ * Writes `origin` and nothing else: ids, creation time and the export stamp
28222
+ * are untouched (a re-save through `saveRetrainAnnotations` would reset all
28223
+ * three). A row that already has an origin is SKIPPED — a snapshot taken at
28224
+ * accept time is evidence, a reconstruction is a guess. Atomic and
28225
+ * revision-guarded like the save; bumps the frame's `revision`.
28226
+ */
28227
+ backfillRetrainOrigins: method(z.object({
28228
+ deviceId: z.number(),
28229
+ trackId: z.string().optional(),
28230
+ frameId: z.string(),
28231
+ expectedRevision: z.number().int().optional(),
28232
+ origins: z.array(z.object({
28233
+ annotationId: z.string(),
28234
+ origin: RetrainOriginSchema
28235
+ })).min(1).max(500)
28236
+ }), z.object({
28237
+ updated: z.number().int(),
28238
+ skipped: z.number().int(),
28239
+ revision: z.number().int()
28240
+ }), {
28241
+ kind: "mutation",
28242
+ auth: "admin"
28243
+ }),
28244
+ /**
28048
28245
  * Finish with a track: `staging → trained`. **The only writer of that
28049
28246
  * state** — D81 shipped the column with it deliberately unreachable.
28050
28247
  *
@@ -52877,6 +53074,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
52877
53074
  addonId: null,
52878
53075
  access: "create"
52879
53076
  },
53077
+ "dataStoreProvider.transact": {
53078
+ capName: "data-store-provider",
53079
+ capScope: "system",
53080
+ addonId: null,
53081
+ access: "create"
53082
+ },
52880
53083
  "dataStoreProvider.update": {
52881
53084
  capName: "data-store-provider",
52882
53085
  capScope: "system",
@@ -55721,6 +55924,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55721
55924
  addonId: null,
55722
55925
  access: "create"
55723
55926
  },
55927
+ "pipelineAnalytics.backfillRetrainOrigins": {
55928
+ capName: "pipeline-analytics",
55929
+ capScope: "device",
55930
+ addonId: null,
55931
+ access: "create"
55932
+ },
55724
55933
  "pipelineAnalytics.cancelRelocateMedia": {
55725
55934
  capName: "pipeline-analytics",
55726
55935
  capScope: "device",
@@ -57713,6 +57922,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
57713
57922
  addonId: null,
57714
57923
  access: "create"
57715
57924
  },
57925
+ "settingsStore.transact": {
57926
+ capName: "settings-store",
57927
+ capScope: "system",
57928
+ addonId: null,
57929
+ access: "create"
57930
+ },
57716
57931
  "settingsStore.update": {
57717
57932
  capName: "settings-store",
57718
57933
  capScope: "system",
@@ -62299,6 +62514,11 @@ Object.freeze({
62299
62514
  form: "single",
62300
62515
  optional: false
62301
62516
  }],
62517
+ "pipelineAnalytics.backfillRetrainOrigins": [{
62518
+ name: "deviceId",
62519
+ form: "single",
62520
+ optional: false
62521
+ }],
62302
62522
  "pipelineAnalytics.clearTrackRelation": [{
62303
62523
  name: "deviceId",
62304
62524
  form: "single",