@camstack/addon-auth 1.2.83 → 1.2.85

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.
@@ -8065,13 +8065,28 @@ var RecordingBandSchema = object({
8065
8065
  end: string().regex(HHMM),
8066
8066
  mode: RecordingBandModeSchema,
8067
8067
  triggers: RecordingBandTriggersSchema.optional(),
8068
+ /**
8069
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8070
+ *
8071
+ * It was the retroactive KEEP bound — which already-written segments survive
8072
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8073
+ * broker could serve, or the gate would delete the seconds the ring had just
8074
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8075
+ * expression of the broker's retention, in different units, in a different
8076
+ * addon, with an invariant the operator had to maintain by hand. The keep
8077
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8078
+ * left to configure here.
8079
+ *
8080
+ * The key survives in the SHAPE so a config written before that record still
8081
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8082
+ * strict, so simply deleting it would strip an operator's value in silence on
8083
+ * the next save (the failure D380 came one commit from shipping). Nothing
8084
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8085
+ */
8068
8086
  preBufferSec: number().min(0).optional(),
8069
8087
  postBufferSec: number().min(0).optional()
8070
8088
  });
8071
- ({
8072
- preBufferSec: 15,
8073
- postBufferSec: 30
8074
- }).postBufferSec * 1e3;
8089
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8075
8090
  /**
8076
8091
  * Per-device retention overrides. Every field is optional; an unset or `0`
8077
8092
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10699,12 +10714,30 @@ var BackupDestinationInfoSchema = object({
10699
10714
  lastSuccessAt: number().optional(),
10700
10715
  /** Newest-archive size from `manifests.json`, or undefined. */
10701
10716
  lastSuccessSizeBytes: number().optional(),
10702
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10717
+ /**
10718
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10719
+ * destination, comma-joined. Absent when no enabled schedule targets it
10720
+ * — a destination nothing is scheduled to write to must not advertise a
10721
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10722
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10723
+ * and reading it made a destination with a DISABLED schedule claim a
10724
+ * nightly run.
10725
+ */
10703
10726
  cron: string().optional(),
10704
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10727
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10705
10728
  nextRunAt: number().optional(),
10706
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10707
- lastRunAt: number().optional()
10729
+ /**
10730
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10731
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10732
+ * newest archive that actually landed) and `lastError`.
10733
+ */
10734
+ lastAttemptAt: number().optional(),
10735
+ /**
10736
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10737
+ * landed the archive. A destination that has never been written to has
10738
+ * neither this nor `lastAttemptAt`.
10739
+ */
10740
+ lastError: string().optional()
10708
10741
  });
10709
10742
  /**
10710
10743
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10867,8 +10900,16 @@ var BackupScheduleSchema = object({
10867
10900
  retentionCount: number().int().min(1).max(1e3),
10868
10901
  /** Optional subset of source locations to include; omitted = all. */
10869
10902
  dataSources: array(string()).readonly().optional(),
10870
- /** ms-epoch of last successful run. */
10871
- lastRunAt: number().optional(),
10903
+ /**
10904
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10905
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10906
+ * "succeeded" — a run refused by every destination stamps it too.
10907
+ */
10908
+ lastAttemptAt: number().optional(),
10909
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10910
+ lastSuccessAt: number().optional(),
10911
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10912
+ lastError: string().optional(),
10872
10913
  /** ms-epoch of next computed firing (read-only, filled on list). */
10873
10914
  nextRunAt: number().optional()
10874
10915
  });
@@ -10917,14 +10958,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10917
10958
  locationId: string(),
10918
10959
  enabled: boolean(),
10919
10960
  retentionCount: number().int().min(1).max(1e3),
10920
- label: string().optional(),
10921
- /**
10922
- * Per-destination cron expression. Empty string clears the
10923
- * schedule (manual-only). Validated server-side via croner;
10924
- * malformed expressions reject the upsert with an actionable
10925
- * message.
10926
- */
10927
- cron: string().optional()
10961
+ label: string().optional()
10928
10962
  }), _void(), {
10929
10963
  kind: "mutation",
10930
10964
  auth: "admin"
@@ -8065,13 +8065,28 @@ var RecordingBandSchema = object({
8065
8065
  end: string().regex(HHMM),
8066
8066
  mode: RecordingBandModeSchema,
8067
8067
  triggers: RecordingBandTriggersSchema.optional(),
8068
+ /**
8069
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8070
+ *
8071
+ * It was the retroactive KEEP bound — which already-written segments survive
8072
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8073
+ * broker could serve, or the gate would delete the seconds the ring had just
8074
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8075
+ * expression of the broker's retention, in different units, in a different
8076
+ * addon, with an invariant the operator had to maintain by hand. The keep
8077
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8078
+ * left to configure here.
8079
+ *
8080
+ * The key survives in the SHAPE so a config written before that record still
8081
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8082
+ * strict, so simply deleting it would strip an operator's value in silence on
8083
+ * the next save (the failure D380 came one commit from shipping). Nothing
8084
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8085
+ */
8068
8086
  preBufferSec: number().min(0).optional(),
8069
8087
  postBufferSec: number().min(0).optional()
8070
8088
  });
8071
- ({
8072
- preBufferSec: 15,
8073
- postBufferSec: 30
8074
- }).postBufferSec * 1e3;
8089
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8075
8090
  /**
8076
8091
  * Per-device retention overrides. Every field is optional; an unset or `0`
8077
8092
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10699,12 +10714,30 @@ var BackupDestinationInfoSchema = object({
10699
10714
  lastSuccessAt: number().optional(),
10700
10715
  /** Newest-archive size from `manifests.json`, or undefined. */
10701
10716
  lastSuccessSizeBytes: number().optional(),
10702
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10717
+ /**
10718
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10719
+ * destination, comma-joined. Absent when no enabled schedule targets it
10720
+ * — a destination nothing is scheduled to write to must not advertise a
10721
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10722
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10723
+ * and reading it made a destination with a DISABLED schedule claim a
10724
+ * nightly run.
10725
+ */
10703
10726
  cron: string().optional(),
10704
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10727
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10705
10728
  nextRunAt: number().optional(),
10706
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10707
- lastRunAt: number().optional()
10729
+ /**
10730
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10731
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10732
+ * newest archive that actually landed) and `lastError`.
10733
+ */
10734
+ lastAttemptAt: number().optional(),
10735
+ /**
10736
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10737
+ * landed the archive. A destination that has never been written to has
10738
+ * neither this nor `lastAttemptAt`.
10739
+ */
10740
+ lastError: string().optional()
10708
10741
  });
10709
10742
  /**
10710
10743
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10867,8 +10900,16 @@ var BackupScheduleSchema = object({
10867
10900
  retentionCount: number().int().min(1).max(1e3),
10868
10901
  /** Optional subset of source locations to include; omitted = all. */
10869
10902
  dataSources: array(string()).readonly().optional(),
10870
- /** ms-epoch of last successful run. */
10871
- lastRunAt: number().optional(),
10903
+ /**
10904
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10905
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10906
+ * "succeeded" — a run refused by every destination stamps it too.
10907
+ */
10908
+ lastAttemptAt: number().optional(),
10909
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10910
+ lastSuccessAt: number().optional(),
10911
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10912
+ lastError: string().optional(),
10872
10913
  /** ms-epoch of next computed firing (read-only, filled on list). */
10873
10914
  nextRunAt: number().optional()
10874
10915
  });
@@ -10917,14 +10958,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10917
10958
  locationId: string(),
10918
10959
  enabled: boolean(),
10919
10960
  retentionCount: number().int().min(1).max(1e3),
10920
- label: string().optional(),
10921
- /**
10922
- * Per-destination cron expression. Empty string clears the
10923
- * schedule (manual-only). Validated server-side via croner;
10924
- * malformed expressions reject the upsert with an actionable
10925
- * message.
10926
- */
10927
- cron: string().optional()
10961
+ label: string().optional()
10928
10962
  }), _void(), {
10929
10963
  kind: "mutation",
10930
10964
  auth: "admin"
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../chunk-Cek0wNdY.js");
6
- const require_dist = require("../dist-DMVRpgKV.js");
6
+ const require_dist = require("../dist-Ud9rgSkS.js");
7
7
  //#region src/magic-link/auth-magic-link.addon.ts
8
8
  /**
9
9
  * Magic-link authentication addon.
@@ -1,4 +1,4 @@
1
- import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-C0vhhVhZ.mjs";
1
+ import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-D9EnjAse.mjs";
2
2
  //#region src/magic-link/auth-magic-link.addon.ts
3
3
  /**
4
4
  * Magic-link authentication addon.
@@ -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-DMVRpgKV.js");
6
+ const require_dist = require("../dist-Ud9rgSkS.js");
7
7
  let node_crypto = require("node:crypto");
8
8
  node_crypto = require_chunk.__toESM(node_crypto);
9
9
  //#region node_modules/jose/dist/webapi/lib/buffer_utils.js
@@ -1,4 +1,4 @@
1
- import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-C0vhhVhZ.mjs";
1
+ import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-D9EnjAse.mjs";
2
2
  import * as crypto$1 from "node:crypto";
3
3
  //#region node_modules/jose/dist/webapi/lib/buffer_utils.js
4
4
  var encoder = new TextEncoder();
@@ -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_auth_webauthn_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_auth_webauthn_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_auth_webauthn_widgets",
@@ -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-DMVRpgKV.js");
6
+ const require_dist = require("../dist-Ud9rgSkS.js");
7
7
  let stream = require("stream");
8
8
  stream = require_chunk.__toESM(stream, 1);
9
9
  let http = require("http");
@@ -1,4 +1,4 @@
1
- import { a as loginMethodCapability, c as BaseAddon, d as number, f as object, l as array, n as addonWidgetsSourceCapability, o as userPasskeysCapability, p as string, u as boolean } from "../dist-C0vhhVhZ.mjs";
1
+ import { a as loginMethodCapability, c as BaseAddon, d as number, f as object, l as array, n as addonWidgetsSourceCapability, o as userPasskeysCapability, p as string, u as boolean } from "../dist-D9EnjAse.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import Stream from "stream";
4
4
  import http from "http";
@@ -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,
@@ -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_auth_webauthn_widgets-BNNjXTd1.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-CIf4k9xj.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-auth",
3
- "version": "1.2.83",
3
+ "version": "1.2.85",
4
4
  "description": "Authentication bundle — magic-link, OIDC, and WebAuthn/passkey. Multi-entry npm package shipping 3 addons under a single bundle; each addon keeps its own id, capabilities, and runner.",
5
5
  "keywords": [
6
6
  "camstack",