@camstack/addon-pipeline-orchestrator 1.2.606 → 1.2.607

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.
package/dist/index.js CHANGED
@@ -5578,7 +5578,7 @@ var ZodIssueCode = {
5578
5578
  var ZodFirstPartyTypeKind;
5579
5579
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5580
5580
  //#endregion
5581
- //#region ../types/dist/sleep-yKL5gfrH.mjs
5581
+ //#region ../types/dist/sleep-BSuCCFjf.mjs
5582
5582
  /**
5583
5583
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5584
5584
  * window to float samples (D455).
@@ -18309,7 +18309,19 @@ var DeviceHistorySubjectSchema = discriminatedUnion("kind", [object({
18309
18309
  kind: literal("node"),
18310
18310
  nodeId: string().min(1)
18311
18311
  })]);
18312
+ /**
18313
+ * `enum` stores a STATE as the ordinal of its value in the series' value list
18314
+ * (`DeviceHistorySeriesInfo.values`, append-only, so an ordinal never changes
18315
+ * meaning); a rollup keeps the time spent in each state (`states`).
18316
+ */
18312
18317
  var DeviceHistoryKindSchema = _enum([
18318
+ "gauge",
18319
+ "counter",
18320
+ "boolean",
18321
+ "enum"
18322
+ ]);
18323
+ /** What a PRODUCER may declare. `enum` is cap-only: its value list is the cap field's. */
18324
+ var DeviceHistoryProducerKindSchema = _enum([
18313
18325
  "gauge",
18314
18326
  "counter",
18315
18327
  "boolean"
@@ -18346,7 +18358,13 @@ var SeriesInfoSchema = object({
18346
18358
  /** `null` is unknown (a `unitFrom` series whose device does not state a unit right now), never a guess. */
18347
18359
  unit: string().nullable(),
18348
18360
  displayName: string(),
18349
- source: _enum(["cap", "addon"]),
18361
+ source: _enum([
18362
+ "cap",
18363
+ "addon",
18364
+ "derived"
18365
+ ]),
18366
+ /** `enum`: the value of each ordinal (index = ordinal); `null` for every other kind. */
18367
+ values: array(string()).readonly().nullable(),
18350
18368
  firstTs: number(),
18351
18369
  lastTs: number()
18352
18370
  });
@@ -18360,17 +18378,31 @@ var QueryPointSchema = object({
18360
18378
  twMean: number().nullable(),
18361
18379
  min: number(),
18362
18380
  max: number(),
18363
- /** `null` is unknown, never zero (D393). */
18364
- last: number().nullable()
18381
+ /** `null` is unknown, never zero (D393). For an `enum` series: the ordinal of {@link state}. */
18382
+ last: number().nullable(),
18383
+ /**
18384
+ * The increase over the point: a `counter`'s growth since the previous point
18385
+ * or bucket (a drop is a reset, counted from zero), and for
18386
+ * {@link DEVICE_HISTORY_ENERGY_KEY} the kWh used in the bucket. `null` for
18387
+ * every other kind, and when it cannot be known.
18388
+ */
18389
+ delta: number().nullable(),
18390
+ /** `enum`: the state in force at the end of the point (the name of `last`); `null` otherwise. */
18391
+ state: string().nullable(),
18392
+ /** `enum` rollup: milliseconds spent in each state inside the bucket; `null` for raw points and other kinds. */
18393
+ states: record(string(), number()).nullable()
18365
18394
  });
18366
18395
  var QuerySeriesSchema = object({
18367
18396
  scope: string(),
18368
18397
  /** The last point STRICTLY BEFORE `from` in the chosen tier, so a step chart can start at the held value. */
18369
18398
  before: object({
18370
18399
  t: number(),
18371
- value: number().nullable()
18400
+ value: number().nullable(),
18401
+ state: string().nullable()
18372
18402
  }).nullable(),
18373
- points: array(QueryPointSchema).readonly()
18403
+ points: array(QueryPointSchema).readonly(),
18404
+ /** A derived key: the stored key its points were computed from; `null` for a stored series. */
18405
+ derivedFrom: string().nullable()
18374
18406
  });
18375
18407
  /** The window part of a query, shared by the device and node forms. */
18376
18408
  var QueryWindowShape = {
@@ -18386,6 +18418,23 @@ var QueryResultSchema = object({
18386
18418
  series: array(QuerySeriesSchema).readonly(),
18387
18419
  truncated: boolean()
18388
18420
  });
18421
+ /** One read of a batch: a device's key or a node's key (exactly one subject). */
18422
+ var QueryManyItemSchema = union([object({
18423
+ deviceId: number().int(),
18424
+ key: string(),
18425
+ scope: string().optional()
18426
+ }), object({
18427
+ forNodeId: string().min(1),
18428
+ key: string(),
18429
+ scope: string().optional()
18430
+ })]);
18431
+ var QueryManyEntrySchema = discriminatedUnion("ok", [object({
18432
+ ok: literal(true),
18433
+ result: QueryResultSchema
18434
+ }), object({
18435
+ ok: literal(false),
18436
+ error: string()
18437
+ })]);
18389
18438
  var TierStatusSchema = object({
18390
18439
  tier: DeviceHistoryResolutionSchema,
18391
18440
  /** `null` until the first background count answered. */
@@ -18441,16 +18490,22 @@ var DeviceHistoryStatusSchema = object({
18441
18490
  lastRefreshAt: number().nullable()
18442
18491
  })
18443
18492
  });
18444
- method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ nodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
18493
+ method(object({ deviceId: number().int() }), array(SeriesInfoSchema).readonly()), method(object({ forNodeId: string().min(1) }), array(SeriesInfoSchema).readonly(), { auth: "admin" }), method(object({
18445
18494
  deviceId: number().int(),
18446
18495
  ...QueryWindowShape
18447
18496
  }), QueryResultSchema), method(object({
18448
- nodeId: string().min(1),
18497
+ forNodeId: string().min(1),
18449
18498
  ...QueryWindowShape
18450
18499
  }), QueryResultSchema, { auth: "admin" }), method(object({
18500
+ items: array(QueryManyItemSchema).min(1).max(24),
18501
+ from: QueryWindowShape.from,
18502
+ to: QueryWindowShape.to,
18503
+ resolution: QueryWindowShape.resolution,
18504
+ maxPoints: QueryWindowShape.maxPoints
18505
+ }), object({ results: array(QueryManyEntrySchema).readonly() }), { auth: "admin" }), method(object({
18451
18506
  name: string().regex(/^[a-z0-9-]+$/),
18452
18507
  subjectKind: _enum(["device", "node"]),
18453
- kind: DeviceHistoryKindSchema,
18508
+ kind: DeviceHistoryProducerKindSchema,
18454
18509
  unit: string().optional(),
18455
18510
  displayName: string().min(1),
18456
18511
  ingest: _enum(["points", "buckets"])
@@ -41467,14 +41522,106 @@ var LogEntrySchema = object({
41467
41522
  meta: record(string(), unknown()).optional(),
41468
41523
  tags: record(string(), string()).optional()
41469
41524
  });
41470
- method(LogEntrySchema, _void(), { kind: "mutation" }), method(object({
41471
- scope: array(string()).optional(),
41525
+ /**
41526
+ * A history READ against one destination (D898).
41527
+ *
41528
+ * Every filter is applied by the PROVIDER, before the limit — a filter the
41529
+ * browser applied after the limit is what made a rare device's lines
41530
+ * unreachable behind a busy one's. `before` / `after` are cursors the provider
41531
+ * minted (opaque to everyone else): a file position for the rotated files, a
41532
+ * nanosecond timestamp for Loki.
41533
+ *
41534
+ * A read is BOUNDED by `budgetMs`: a filter that matches nothing on a 30-day
41535
+ * store answers `done: false` with the cursor it reached and the bytes it
41536
+ * scanned, and the caller decides whether to go on. That is what makes a long
41537
+ * scan show progress and stop when asked — `cancelRead` ends the slice in
41538
+ * flight, and not asking for the next slice ends the scan.
41539
+ */
41540
+ var LogReadQuerySchema = object({
41541
+ /** Correlates `cancelRead`. Caller-chosen, unique per in-flight read. */
41542
+ requestId: string().min(1).max(64).optional(),
41543
+ /** The device the line is about (`tags.deviceId`, numeric). */
41544
+ deviceId: number().int().optional(),
41545
+ /**
41546
+ * The emitting addon — bare manifest id; `@<version>` / `::<sub>` suffixes
41547
+ * match. Not `addonId`: a cap router reads that name as "which provider".
41548
+ */
41549
+ fromAddonId: string().min(1).max(200).optional(),
41550
+ /**
41551
+ * The emitting node: matches the agent that emitted the line, the node
41552
+ * itself, or a worker under it (`<agent>/<runner>`) — the `agentId`
41553
+ * semantics of `matchesLogTags`. Not `nodeId`: a cap router reads that
41554
+ * name as "which node's provider".
41555
+ */
41556
+ fromNodeId: string().min(1).max(200).optional(),
41557
+ /** Any other tag, exact match (AND). */
41558
+ tags: record(string(), union([string(), number()])).optional(),
41559
+ /** Severity FLOOR: this level and above. */
41472
41560
  level: LogLevelSchema.optional(),
41473
- since: date().optional(),
41474
- until: date().optional(),
41475
- limit: number().optional(),
41476
- tags: record(string(), string()).optional()
41477
- }), array(LogEntrySchema).readonly());
41561
+ /** Case-insensitive substring over message, scope, tag values and meta values. */
41562
+ text: string().min(1).max(200).optional(),
41563
+ /** Epoch ms, inclusive. */
41564
+ since: number().optional(),
41565
+ /** Epoch ms, inclusive. */
41566
+ until: number().optional(),
41567
+ /** Older than this cursor (exclusive). Absent with `after` absent ⇒ from the newest. */
41568
+ before: string().min(1).max(1024).optional(),
41569
+ /** Newer than this cursor (exclusive). */
41570
+ after: string().min(1).max(1024).optional(),
41571
+ limit: number().int().min(1).max(1e3).optional(),
41572
+ /** Wall-clock bound of this slice. The provider caps it. */
41573
+ budgetMs: number().int().min(50).max(1e4).optional()
41574
+ });
41575
+ var LogReadResultSchema = object({
41576
+ /** Newest first. */
41577
+ entries: array(object({
41578
+ /** `<bootId>.<seq>` minted by the emitting LogManager — the dedupe key. */
41579
+ id: string().optional(),
41580
+ /** Epoch ms. */
41581
+ timestamp: number(),
41582
+ level: LogLevelSchema,
41583
+ scope: string().optional(),
41584
+ message: string(),
41585
+ tags: record(string(), union([string(), number()])).optional(),
41586
+ meta: record(string(), unknown()).optional()
41587
+ })),
41588
+ /** Pass as `before` for the next older page; null when nothing older exists. */
41589
+ nextBefore: string().nullable(),
41590
+ /** Pass as `after` to read what arrived since; null when unknown. */
41591
+ nextAfter: string().nullable(),
41592
+ /** Bytes this slice read (files) or received (remote). Progress, not a promise. */
41593
+ scannedBytes: number().int().nonnegative(),
41594
+ /**
41595
+ * True when the scan in this direction reached the end of the store.
41596
+ * False with fewer than `limit` entries means the budget ran out first —
41597
+ * call again with `nextBefore` to go on.
41598
+ */
41599
+ done: boolean(),
41600
+ /** True when `cancelRead` ended this slice early. */
41601
+ cancelled: boolean().optional()
41602
+ });
41603
+ var LogReadCapabilitiesSchema = object({
41604
+ /** False ⇒ this destination only ships lines (console, forwarder, an unconfigured Loki). */
41605
+ readable: boolean(),
41606
+ /** Why not, when `readable` is false — rendered next to the source. */
41607
+ reason: string().nullable(),
41608
+ /** Filters the provider applies itself. A false one is applied by nobody. */
41609
+ filters: object({
41610
+ deviceId: boolean(),
41611
+ addonId: boolean(),
41612
+ nodeId: boolean(),
41613
+ tags: boolean(),
41614
+ level: boolean(),
41615
+ text: boolean(),
41616
+ timeRange: boolean()
41617
+ }),
41618
+ /** How far back the store reaches, when the provider knows (days). */
41619
+ retentionDays: number().nullable()
41620
+ });
41621
+ method(LogEntrySchema, _void(), { kind: "mutation" }), optionalMethod(_void(), LogReadCapabilitiesSchema, { auth: "admin" }), optionalMethod(LogReadQuerySchema, LogReadResultSchema, { auth: "admin" }), optionalMethod(object({ requestId: string().min(1).max(64) }), object({ cancelled: boolean() }), {
41622
+ kind: "mutation",
41623
+ auth: "admin"
41624
+ });
41478
41625
  /**
41479
41626
  * `login-method` — collection cap through which auth addons contribute
41480
41627
  * their pre-auth login surfaces to the login page. This is the SINGLE,
@@ -44030,6 +44177,33 @@ var NcRuleTargetSchema = object({
44030
44177
  params: record(string(), unknown()).optional()
44031
44178
  });
44032
44179
  /**
44180
+ * WHAT THE NOTIFICATION'S PICTURE IS (D897) — the ONE media choice of a rule.
44181
+ *
44182
+ * Every mode starts from the same CLEAN source frame of the trigger moment
44183
+ * (keyFrame → sceneFrame → lastSceneFrame, narrowed to the trigger instant and
44184
+ * to the zone that fired the rule) and renders it once at send time:
44185
+ * - `scene-boxes` — the whole scene, the subject outlined thick in the accent
44186
+ * colour and every OTHER track visible at that instant outlined thin, each
44187
+ * labelled with class and confidence ("dog 87%").
44188
+ * - `crop` — the subject cut out of that frame around its box at that instant.
44189
+ * - `clean` — the whole scene with nothing drawn on it.
44190
+ * - `none` — no picture.
44191
+ *
44192
+ * A mode that cannot be honoured (no box at that instant, a photograph with no
44193
+ * tracked subject) ships `clean` and names the reason in the log, per camera.
44194
+ * It replaces the `attach` × `frame` × `zoneCrop` triple, which let one rule
44195
+ * ship a crop on one event and a boxed scene on the next depending on which
44196
+ * stored kind had landed.
44197
+ */
44198
+ var NcMediaImageSchema = _enum([
44199
+ "scene-boxes",
44200
+ "crop",
44201
+ "clean",
44202
+ "none"
44203
+ ]);
44204
+ /**
44205
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44206
+ *
44033
44207
  * Media attachment policy (P1 still-image subset).
44034
44208
  * - `best` — the best AVAILABLE subject image at dispatch time (D-3).
44035
44209
  * - `best-matching` — the media that explains WHY the rule fired: a rule
@@ -44043,6 +44217,8 @@ var NcRuleTargetSchema = object({
44043
44217
  * - `none` — no attachment.
44044
44218
  */
44045
44219
  /**
44220
+ * @deprecated Read only by `normalizeNcMediaPolicy` (D897) — see {@link NcMediaImageSchema}.
44221
+ *
44046
44222
  * WHAT THE PICTURE SHOWS — chosen explicitly, because the implicit ladders
44047
44223
  * conflate it with the selection strategy and betray the request: asking for
44048
44224
  * the clean scene frame on an object-event owner used to start at
@@ -44071,16 +44247,29 @@ var NcMediaFrameSchema = _enum([
44071
44247
  */
44072
44248
  var NcLinkedCameraModeSchema = _enum(["mosaic", "each"]);
44073
44249
  var NcMediaPolicySchema = object({
44250
+ /**
44251
+ * The picture — see {@link NcMediaImageSchema}. Absent on a rule nobody has
44252
+ * saved since D897: `normalizeNcMediaPolicy` derives it from the legacy
44253
+ * triple below, at load and at every write, and the store keeps only this.
44254
+ */
44255
+ image: NcMediaImageSchema.optional(),
44256
+ /**
44257
+ * Draw the zone that FIRED the rule on the picture (`scene-boxes` / `clean`;
44258
+ * a `crop` never shows it). Valid only on a rule whose trigger is a zone —
44259
+ * `conditions.zones` or an occupancy zone — and refused on save otherwise.
44260
+ * Replaces `zoneCrop`.
44261
+ */
44262
+ showTriggerZone: boolean().optional(),
44263
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44074
44264
  attach: _enum([
44075
44265
  "best",
44076
44266
  "best-matching",
44077
44267
  "keyFrame",
44078
44268
  "none"
44079
- ]).default("best"),
44080
- /** What the still shows. Absent = `cropped` (the historical `best` shape). */
44269
+ ]).optional(),
44270
+ /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
44081
44271
  frame: NcMediaFrameSchema.optional(),
44082
- /** Crop the attached still to the rule's condition-zone bbox (padded) —
44083
- * "show me the ZONE", not the whole scene or the subject crop. */
44272
+ /** @deprecated D897 — folded into `image: 'clean'` + `showTriggerZone` on save. */
44084
44273
  zoneCrop: boolean().optional(),
44085
44274
  /**
44086
44275
  * Also attach a short GIF cut from the stream broker's clip ring around the
@@ -44252,7 +44441,9 @@ var NcRuleInputSchema = object({
44252
44441
  * targets.
44253
44442
  */
44254
44443
  targetUsers: array(string()).optional(),
44255
- media: NcMediaPolicySchema.default({ attach: "best" }),
44444
+ /** Absent = the kind's default picture (`resolveNcMediaImage`): the subject crop for a
44445
+ * detection, the clean scene for a sensor or a sound. Set explicitly on save (D897). */
44446
+ media: NcMediaPolicySchema.default({}),
44256
44447
  throttle: NcThrottleSchema.default({
44257
44448
  cooldownSec: 60,
44258
44449
  scope: "rule-device"
@@ -45189,13 +45380,37 @@ var NcAlarmModeOpeningsSchema = object({
45189
45380
  /** Covered devices whose state could not be read (D49): neither open nor closed. */
45190
45381
  unknown: array(number().int())
45191
45382
  });
45383
+ /**
45384
+ * One alarm INPUT — a (rule, device) pair — the operator bypassed until the
45385
+ * next disarm ("Bypass this input until disarm" on a trigger notification, or
45386
+ * `nc.bypassAlarmInput`). Reported so an armed alarm with a silenced input
45387
+ * never looks fully armed (D62: off must never look like broken).
45388
+ */
45389
+ var NcAlarmInputBypassViewSchema = object({
45390
+ ruleId: string(),
45391
+ /** The rule's current name (its frozen name when the rule is gone). */
45392
+ ruleName: string(),
45393
+ /** The input: the sensor of the match, else its camera. */
45394
+ deviceId: number().int(),
45395
+ /** The input's current name. */
45396
+ name: string(),
45397
+ /** When it was bypassed (ms epoch). */
45398
+ since: number(),
45399
+ /** Triggers from this input dropped since. */
45400
+ dropped: number().int().min(0)
45401
+ });
45192
45402
  var NcAlarmLiveSchema = object({
45193
45403
  state: AlarmStateSchema,
45194
45404
  /** The mode being armed into (exit delay) or held; null when disarmed. */
45195
45405
  targetMode: AlarmArmModeSchema.nullable(),
45196
45406
  availableModes: array(AlarmArmModeSchema),
45197
45407
  openings: array(NcAlarmModeOpeningsSchema),
45198
- exclusions: array(NcAlarmExclusionViewSchema)
45408
+ exclusions: array(NcAlarmExclusionViewSchema),
45409
+ /**
45410
+ * Inputs bypassed for the rest of this arm session; cleared on disarm.
45411
+ * Defaulted so an older hub answer still parses (as "none known").
45412
+ */
45413
+ bypassedInputs: array(NcAlarmInputBypassViewSchema).default([])
45199
45414
  });
45200
45415
  var NcAlarmConfigSchema = object({
45201
45416
  /**
@@ -67903,7 +68118,19 @@ Object.freeze({
67903
68118
  addonId: null,
67904
68119
  access: "view"
67905
68120
  },
67906
- "logDestination.query": {
68121
+ "logDestination.cancelRead": {
68122
+ capName: "log-destination",
68123
+ capScope: "system",
68124
+ addonId: null,
68125
+ access: "create"
68126
+ },
68127
+ "logDestination.describeRead": {
68128
+ capName: "log-destination",
68129
+ capScope: "system",
68130
+ addonId: null,
68131
+ access: "view"
68132
+ },
68133
+ "logDestination.read": {
67907
68134
  capName: "log-destination",
67908
68135
  capScope: "system",
67909
68136
  addonId: null,
@@ -73938,6 +74165,11 @@ Object.freeze({
73938
74165
  form: "single",
73939
74166
  optional: false
73940
74167
  }],
74168
+ "logDestination.read": [{
74169
+ name: "deviceId",
74170
+ form: "single",
74171
+ optional: true
74172
+ }],
73941
74173
  "mediaPlayer.getStatus": [{
73942
74174
  name: "deviceId",
73943
74175
  form: "single",
@@ -89515,7 +89747,7 @@ var NodeStressHistoryProducer = class {
89515
89747
  const key = SERIES_KEYS[input.series];
89516
89748
  if (key === void 0) return [];
89517
89749
  const result = await this.deviceHistory.queryNode({
89518
- nodeId,
89750
+ forNodeId: nodeId,
89519
89751
  key,
89520
89752
  from: input.from ?? 0,
89521
89753
  to: input.to ?? Date.now(),