@camstack/addon-post-analysis 1.2.194 → 1.2.196

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.
@@ -8195,6 +8195,24 @@ var RecordingBandSchema = object({
8195
8195
  end: string().regex(HHMM),
8196
8196
  mode: RecordingBandModeSchema,
8197
8197
  triggers: RecordingBandTriggersSchema.optional(),
8198
+ /**
8199
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8200
+ *
8201
+ * It was the retroactive KEEP bound — which already-written segments survive
8202
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8203
+ * broker could serve, or the gate would delete the seconds the ring had just
8204
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8205
+ * expression of the broker's retention, in different units, in a different
8206
+ * addon, with an invariant the operator had to maintain by hand. The keep
8207
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8208
+ * left to configure here.
8209
+ *
8210
+ * The key survives in the SHAPE so a config written before that record still
8211
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8212
+ * strict, so simply deleting it would strip an operator's value in silence on
8213
+ * the next save (the failure D380 came one commit from shipping). Nothing
8214
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8215
+ */
8198
8216
  preBufferSec: number().min(0).optional(),
8199
8217
  postBufferSec: number().min(0).optional()
8200
8218
  });
@@ -8211,10 +8229,7 @@ var RecordingBandSchema = object({
8211
8229
  * Segments stay the source of truth on disk (`startMs-durMs-bytes.m4s`); a
8212
8230
  * visit is derived, not a second copy of the files.
8213
8231
  */
8214
- var VISIT_MERGE_GAP_MS = {
8215
- preBufferSec: 15,
8216
- postBufferSec: 30
8217
- }.postBufferSec * 1e3;
8232
+ var VISIT_MERGE_GAP_MS = { postBufferSec: 30 }.postBufferSec * 1e3;
8218
8233
  /**
8219
8234
  * Per-device retention overrides. Every field is optional; an unset or `0`
8220
8235
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10934,12 +10949,30 @@ var BackupDestinationInfoSchema = object({
10934
10949
  lastSuccessAt: number().optional(),
10935
10950
  /** Newest-archive size from `manifests.json`, or undefined. */
10936
10951
  lastSuccessSizeBytes: number().optional(),
10937
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10952
+ /**
10953
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10954
+ * destination, comma-joined. Absent when no enabled schedule targets it
10955
+ * — a destination nothing is scheduled to write to must not advertise a
10956
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10957
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10958
+ * and reading it made a destination with a DISABLED schedule claim a
10959
+ * nightly run.
10960
+ */
10938
10961
  cron: string().optional(),
10939
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10962
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10940
10963
  nextRunAt: number().optional(),
10941
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10942
- lastRunAt: number().optional()
10964
+ /**
10965
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10966
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10967
+ * newest archive that actually landed) and `lastError`.
10968
+ */
10969
+ lastAttemptAt: number().optional(),
10970
+ /**
10971
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10972
+ * landed the archive. A destination that has never been written to has
10973
+ * neither this nor `lastAttemptAt`.
10974
+ */
10975
+ lastError: string().optional()
10943
10976
  });
10944
10977
  /**
10945
10978
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11102,8 +11135,16 @@ var BackupScheduleSchema = object({
11102
11135
  retentionCount: number().int().min(1).max(1e3),
11103
11136
  /** Optional subset of source locations to include; omitted = all. */
11104
11137
  dataSources: array(string()).readonly().optional(),
11105
- /** ms-epoch of last successful run. */
11106
- lastRunAt: number().optional(),
11138
+ /**
11139
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11140
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11141
+ * "succeeded" — a run refused by every destination stamps it too.
11142
+ */
11143
+ lastAttemptAt: number().optional(),
11144
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11145
+ lastSuccessAt: number().optional(),
11146
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11147
+ lastError: string().optional(),
11107
11148
  /** ms-epoch of next computed firing (read-only, filled on list). */
11108
11149
  nextRunAt: number().optional()
11109
11150
  });
@@ -11152,14 +11193,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11152
11193
  locationId: string(),
11153
11194
  enabled: boolean(),
11154
11195
  retentionCount: number().int().min(1).max(1e3),
11155
- label: string().optional(),
11156
- /**
11157
- * Per-destination cron expression. Empty string clears the
11158
- * schedule (manual-only). Validated server-side via croner;
11159
- * malformed expressions reject the upsert with an actionable
11160
- * message.
11161
- */
11162
- cron: string().optional()
11196
+ label: string().optional()
11163
11197
  }), _void(), {
11164
11198
  kind: "mutation",
11165
11199
  auth: "admin"
@@ -8164,6 +8164,24 @@ var RecordingBandSchema = object({
8164
8164
  end: string().regex(HHMM),
8165
8165
  mode: RecordingBandModeSchema,
8166
8166
  triggers: RecordingBandTriggersSchema.optional(),
8167
+ /**
8168
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8169
+ *
8170
+ * It was the retroactive KEEP bound — which already-written segments survive
8171
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8172
+ * broker could serve, or the gate would delete the seconds the ring had just
8173
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8174
+ * expression of the broker's retention, in different units, in a different
8175
+ * addon, with an invariant the operator had to maintain by hand. The keep
8176
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8177
+ * left to configure here.
8178
+ *
8179
+ * The key survives in the SHAPE so a config written before that record still
8180
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8181
+ * strict, so simply deleting it would strip an operator's value in silence on
8182
+ * the next save (the failure D380 came one commit from shipping). Nothing
8183
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8184
+ */
8167
8185
  preBufferSec: number().min(0).optional(),
8168
8186
  postBufferSec: number().min(0).optional()
8169
8187
  });
@@ -8180,10 +8198,7 @@ var RecordingBandSchema = object({
8180
8198
  * Segments stay the source of truth on disk (`startMs-durMs-bytes.m4s`); a
8181
8199
  * visit is derived, not a second copy of the files.
8182
8200
  */
8183
- var VISIT_MERGE_GAP_MS = {
8184
- preBufferSec: 15,
8185
- postBufferSec: 30
8186
- }.postBufferSec * 1e3;
8201
+ var VISIT_MERGE_GAP_MS = { postBufferSec: 30 }.postBufferSec * 1e3;
8187
8202
  /**
8188
8203
  * Per-device retention overrides. Every field is optional; an unset or `0`
8189
8204
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10903,12 +10918,30 @@ var BackupDestinationInfoSchema = object({
10903
10918
  lastSuccessAt: number().optional(),
10904
10919
  /** Newest-archive size from `manifests.json`, or undefined. */
10905
10920
  lastSuccessSizeBytes: number().optional(),
10906
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10921
+ /**
10922
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10923
+ * destination, comma-joined. Absent when no enabled schedule targets it
10924
+ * — a destination nothing is scheduled to write to must not advertise a
10925
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10926
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10927
+ * and reading it made a destination with a DISABLED schedule claim a
10928
+ * nightly run.
10929
+ */
10907
10930
  cron: string().optional(),
10908
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10931
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10909
10932
  nextRunAt: number().optional(),
10910
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10911
- lastRunAt: number().optional()
10933
+ /**
10934
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10935
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10936
+ * newest archive that actually landed) and `lastError`.
10937
+ */
10938
+ lastAttemptAt: number().optional(),
10939
+ /**
10940
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10941
+ * landed the archive. A destination that has never been written to has
10942
+ * neither this nor `lastAttemptAt`.
10943
+ */
10944
+ lastError: string().optional()
10912
10945
  });
10913
10946
  /**
10914
10947
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11071,8 +11104,16 @@ var BackupScheduleSchema = object({
11071
11104
  retentionCount: number().int().min(1).max(1e3),
11072
11105
  /** Optional subset of source locations to include; omitted = all. */
11073
11106
  dataSources: array(string()).readonly().optional(),
11074
- /** ms-epoch of last successful run. */
11075
- lastRunAt: number().optional(),
11107
+ /**
11108
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11109
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11110
+ * "succeeded" — a run refused by every destination stamps it too.
11111
+ */
11112
+ lastAttemptAt: number().optional(),
11113
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11114
+ lastSuccessAt: number().optional(),
11115
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11116
+ lastError: string().optional(),
11076
11117
  /** ms-epoch of next computed firing (read-only, filled on list). */
11077
11118
  nextRunAt: number().optional()
11078
11119
  });
@@ -11121,14 +11162,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11121
11162
  locationId: string(),
11122
11163
  enabled: boolean(),
11123
11164
  retentionCount: number().int().min(1).max(1e3),
11124
- label: string().optional(),
11125
- /**
11126
- * Per-destination cron expression. Empty string clears the
11127
- * schedule (manual-only). Validated server-side via croner;
11128
- * malformed expressions reject the upsert with an actionable
11129
- * message.
11130
- */
11131
- cron: string().optional()
11165
+ label: string().optional()
11132
11166
  }), _void(), {
11133
11167
  kind: "mutation",
11134
11168
  auth: "admin"
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DMnyp081.js");
5
+ const require_dist = require("../dist-BRvbQOHc.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { At as BaseAddon, F as PoolMemoryWatchdog, St as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, gt as parseProcStatus, ut as hfModelUrl } from "../dist-DLVNGF8I.mjs";
1
+ import { At as BaseAddon, F as PoolMemoryWatchdog, St as resolvePoolMemoryPolicy, at as embeddingEncoderCapability, gt as parseProcStatus, ut as hfModelUrl } from "../dist-Cu4sfuYT.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.2.79",
6
+ version: "1.2.81",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_analytics_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.2.159",
21
+ version: "1.2.161",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.2.127",
36
+ version: "1.2.129",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.2.159",
39
+ version: "1.2.161",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -45,7 +45,7 @@ async function r() {
45
45
  }
46
46
  },
47
47
  "@camstack/sdk": {
48
- version: "1.2.79",
48
+ version: "1.2.81",
49
49
  scope: "default",
50
50
  shareConfig: {
51
51
  singleton: !0,
@@ -81,7 +81,7 @@ async function r() {
81
81
  }
82
82
  },
83
83
  "@camstack/ui-library": {
84
- version: "1.2.127",
84
+ version: "1.2.129",
85
85
  scope: "default",
86
86
  shareConfig: {
87
87
  singleton: !0,
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DMnyp081.js");
5
+ const require_dist = require("../dist-BRvbQOHc.js");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_dist.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $ as audioModeOf, A as NcSnoozeSchema, At as BaseAddon, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as boolean, C as NcConditionDescriptorSchema, Ct as sceneMonitorCapability, D as NcRuleTargetSchema, Dt as videoclipsCapability, E as NcRuleSchema, Et as vectorDimFromBase64, Ft as isDeviceScopedCap, G as TimelapseRulePatchSchema, Gt as partialRecord, H as SceneMonitorSchema, Ht as literal, I as RECORDING_EXPORT_MAX_READ_BYTES, It as nodePin, J as VISIT_MERGE_GAP_MS, Jt as unknown, K as TimelapseRuleSchema, Kt as record, L as RetrainStatusSchema, Lt as sleep$1, M as NcSystemEventKindSchema, Mt as DeviceType, N as NcTaxonomySchema, Nt as createEvent, O as NcScheduleSchema, Ot as zoneAnalyticsCapability, P as OpsLogEntrySchema, Pt as hydrateSchema, Q as audioMetricsCapability, Rt as _enum, S as NC_TAXONOMY, T as NcRulePatchSchema, Tt as systemEventFilterApplies, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as number, V as SCENE_DIVERGED, Vt as discriminatedUnion, W as TimelapseRuleInputSchema, Wt as object, X as alarmPanelCapability, Y as addonWidgetsSourceCapability, Yt as EventCategory, Z as assertTimelapseCadences, _ as MediaFileKindEnum, _t as pickClusterStepModels, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as readDeviceStateFrom, c as DETECTION_MACRO_CLASSES, ct as faceGalleryCapability, d as EVENT_KIND_BY_CAP, dt as isDetectionMacroClass, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isScheduleActive, g as MACRO_LABELS, h as LabelAttributionSchema, ht as notificationRulesCapability, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as CamProfileSchema, k as NcSnoozeInputSchema, kt as errMsg$1, lt as failureContributionCapability, m as FailureCounters, mt as kebabToCamel, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isSourceCap, q as TrackSourceSchema, qt as string, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, v as NC_ALARM_SYSTEM_EVENT_KINDS, vt as pipelineAnalyticsCapability, w as NcRuleInputSchema, wt as subKindsOf, xt as readTimelapseGeneratedAt, y as NC_CONDITION_CATALOG, yt as plateGalleryCapability, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as array } from "../dist-DLVNGF8I.mjs";
1
+ import { $ as audioModeOf, A as NcSnoozeSchema, At as BaseAddon, B as SCENE_DEFAULT_UNCOVERED_POLICY, Bt as boolean, C as NcConditionDescriptorSchema, Ct as sceneMonitorCapability, D as NcRuleTargetSchema, Dt as videoclipsCapability, E as NcRuleSchema, Et as vectorDimFromBase64, Ft as isDeviceScopedCap, G as TimelapseRulePatchSchema, Gt as partialRecord, H as SceneMonitorSchema, Ht as literal, I as RECORDING_EXPORT_MAX_READ_BYTES, It as nodePin, J as VISIT_MERGE_GAP_MS, Jt as unknown, K as TimelapseRuleSchema, Kt as record, L as RetrainStatusSchema, Lt as sleep$1, M as NcSystemEventKindSchema, Mt as DeviceType, N as NcTaxonomySchema, Nt as createEvent, O as NcScheduleSchema, Ot as zoneAnalyticsCapability, P as OpsLogEntrySchema, Pt as hydrateSchema, Q as audioMetricsCapability, Rt as _enum, S as NC_TAXONOMY, T as NcRulePatchSchema, Tt as systemEventFilterApplies, U as TIMELAPSE_DENSE_FLOOR_SEC, Ut as number, V as SCENE_DIVERGED, Vt as discriminatedUnion, W as TimelapseRuleInputSchema, Wt as object, X as alarmPanelCapability, Y as addonWidgetsSourceCapability, Yt as EventCategory, Z as assertTimelapseCadences, _ as MediaFileKindEnum, _t as pickClusterStepModels, a as DEFAULT_EVENT_COLOR, b as NC_DEFAULT_SNOOZE_MINUTES, bt as readDeviceStateFrom, c as DETECTION_MACRO_CLASSES, ct as faceGalleryCapability, d as EVENT_KIND_BY_CAP, dt as isDetectionMacroClass, et as buildEventKindDescriptor, f as EVENT_PAD_MS, ft as isScheduleActive, g as MACRO_LABELS, h as LabelAttributionSchema, ht as notificationRulesCapability, i as COCO_TO_MACRO, it as deriveRecordingMode, j as NcSnoozeSuppressedSchema, jt as CamProfileSchema, k as NcSnoozeInputSchema, kt as errMsg$1, lt as failureContributionCapability, m as FailureCounters, mt as kebabToCamel, n as BaseDevice, nt as customAction, ot as encodeVectorBase64, p as FULL_IMAGE_BBOX, pt as isSourceCap, q as TrackSourceSchema, qt as string, r as CLUSTER_MODEL_SCOPED_STEPS, rt as defineCustomActions, st as evaluateSensorEdge, t as AUDIO_MACRO_LABELS, tt as cosineSimilarity$1, u as DeclaredDevices, v as NC_ALARM_SYSTEM_EVENT_KINDS, vt as pipelineAnalyticsCapability, w as NcRuleInputSchema, wt as subKindsOf, xt as readTimelapseGeneratedAt, y as NC_CONDITION_CATALOG, yt as plateGalleryCapability, z as SCENE_DEFAULT_ANCHOR_THRESHOLD, zt as array } from "../dist-Cu4sfuYT.mjs";
2
2
  import { t as __exportAll } from "../embedding-encoder/index.mjs";
3
3
  import * as fs from "node:fs";
4
4
  import { promises } from "node:fs";
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-DAc8SUDf.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-1iZqrgrt.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-post-analysis",
3
- "version": "1.2.194",
3
+ "version": "1.2.196",
4
4
  "description": "Post-Analysis bundle — enrichment, embedding-encoder, pipeline-analytics. Multi-entry npm package shipping addons that consume pipeline output.",
5
5
  "keywords": [
6
6
  "camstack",