@camstack/addon-auth 1.2.48 → 1.2.49

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.
@@ -8117,6 +8117,21 @@ var RelocateJobSchema = object({
8117
8117
  bytesMoved: number().int(),
8118
8118
  /** Total files discovered up front; null while (or when) unknown. */
8119
8119
  filesTotal: number().int().nullable(),
8120
+ /**
8121
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8122
+ * made that nobody asked for, so it is reported where the operator reads the
8123
+ * job rather than only in a log line.
8124
+ *
8125
+ * A footage segment records its byte count in its own NAME, and the durable
8126
+ * hour row derives its aggregates from those names. A file that does not
8127
+ * match its name therefore makes the ledger's sums — and with them quota and
8128
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8129
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8130
+ *
8131
+ * Absent on lanes where the question has no meaning: a media blob's size is
8132
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8133
+ */
8134
+ rowsReconciled: number().int().nonnegative().optional(),
8120
8135
  startedAt: number(),
8121
8136
  finishedAt: number().nullable(),
8122
8137
  error: string().nullable()
@@ -8185,14 +8200,42 @@ var RelocateMediaInputSchema = object({
8185
8200
  /** Omitted = `move`, the pre-existing behaviour. */
8186
8201
  mode: MediaRelocateModeSchema.optional()
8187
8202
  });
8188
- /** How many rows still carry NO `locationId` — the population a repoint would
8189
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8190
- * value that permits a non-blocking `eventMedia` cutover. */
8191
- var UnstampedEventMediaCountSchema = object({
8192
- media: number().int().nonnegative(),
8193
- retrainFrames: number().int().nonnegative(),
8194
- total: number().int().nonnegative()
8203
+ /**
8204
+ * The unstamped population of ONE collection split, because the gate and the
8205
+ * operator ask two different questions and only one of them has to be cheap.
8206
+ *
8207
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8208
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8209
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8210
+ * that matters — after a seal, when the population is empty.
8211
+ *
8212
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8213
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8214
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8215
+ * and useful answer: "there are some, and this read could not say how many"
8216
+ * still refuses the cutover, which is the whole job.
8217
+ */
8218
+ var UnstampedRowsSchema = object({
8219
+ present: boolean(),
8220
+ rows: number().int().nonnegative().nullable()
8195
8221
  });
8222
+ /**
8223
+ * How many rows still carry NO `locationId` — the population a repoint would
8224
+ * silently re-aim at a disk that does not hold their bytes.
8225
+ *
8226
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8227
+ * over. The gate opens on a measured absence and on nothing else; an unread
8228
+ * collection and an empty one are different facts, and this repo has already
8229
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8230
+ */
8231
+ var UnstampedEventMediaCountSchema = object({
8232
+ media: UnstampedRowsSchema,
8233
+ retrainFrames: UnstampedRowsSchema,
8234
+ /** True when EITHER collection holds one. The refusal reads this. */
8235
+ anyPresent: boolean(),
8236
+ /** Sum across both, or `null` when either lane could not be counted. */
8237
+ total: number().int().nonnegative().nullable()
8238
+ }).nullable();
8196
8239
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8197
8240
  /** The independently selectable logical storage classes — every class
8198
8241
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8303,6 +8346,10 @@ var StorageMigrationMoveProgressSchema = object({
8303
8346
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8304
8347
  filesTotal: number().int().nonnegative().nullable(),
8305
8348
  bytesMoved: number().int().nonnegative(),
8349
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8350
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8351
+ * rows would be the same failure as one that silently skipped them. */
8352
+ rowsReconciled: number().int().nonnegative().optional(),
8306
8353
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8307
8354
  * crash gets a new mover, and a rate computed from the migration's start
8308
8355
  * would silently average in the time nothing was running. */
@@ -8117,6 +8117,21 @@ var RelocateJobSchema = object({
8117
8117
  bytesMoved: number().int(),
8118
8118
  /** Total files discovered up front; null while (or when) unknown. */
8119
8119
  filesTotal: number().int().nullable(),
8120
+ /**
8121
+ * Rows this run CORRECTED while moving them — a durable mutation the move
8122
+ * made that nobody asked for, so it is reported where the operator reads the
8123
+ * job rather than only in a log line.
8124
+ *
8125
+ * A footage segment records its byte count in its own NAME, and the durable
8126
+ * hour row derives its aggregates from those names. A file that does not
8127
+ * match its name therefore makes the ledger's sums — and with them quota and
8128
+ * pressure eviction — wrong by the difference, and only a rename can fix it.
8129
+ * On 2026-08-30 one such row also stalled a 110 749-file drain permanently.
8130
+ *
8131
+ * Absent on lanes where the question has no meaning: a media blob's size is
8132
+ * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8133
+ */
8134
+ rowsReconciled: number().int().nonnegative().optional(),
8120
8135
  startedAt: number(),
8121
8136
  finishedAt: number().nullable(),
8122
8137
  error: string().nullable()
@@ -8185,14 +8200,42 @@ var RelocateMediaInputSchema = object({
8185
8200
  /** Omitted = `move`, the pre-existing behaviour. */
8186
8201
  mode: MediaRelocateModeSchema.optional()
8187
8202
  });
8188
- /** How many rows still carry NO `locationId` — the population a repoint would
8189
- * silently re-aim at a disk that does not hold their bytes. Zero is the only
8190
- * value that permits a non-blocking `eventMedia` cutover. */
8191
- var UnstampedEventMediaCountSchema = object({
8192
- media: number().int().nonnegative(),
8193
- retrainFrames: number().int().nonnegative(),
8194
- total: number().int().nonnegative()
8203
+ /**
8204
+ * The unstamped population of ONE collection split, because the gate and the
8205
+ * operator ask two different questions and only one of them has to be cheap.
8206
+ *
8207
+ * `present` is the GATE: "is there at least one row that would be orphaned by a
8208
+ * repoint". It is a single indexed seek to the first matching row, so it stays
8209
+ * answerable on a saturated disk and answers in O(log n) precisely in the state
8210
+ * that matters — after a seal, when the population is empty.
8211
+ *
8212
+ * `rows` is the NUMBER, for the refusal message and the operator's sense of
8213
+ * scale. It is a second, indexed `COUNT(*)`, and `null` means **not
8214
+ * measurable** — never zero. `{ present: true, rows: null }` is a legitimate
8215
+ * and useful answer: "there are some, and this read could not say how many"
8216
+ * still refuses the cutover, which is the whole job.
8217
+ */
8218
+ var UnstampedRowsSchema = object({
8219
+ present: boolean(),
8220
+ rows: number().int().nonnegative().nullable()
8195
8221
  });
8222
+ /**
8223
+ * How many rows still carry NO `locationId` — the population a repoint would
8224
+ * silently re-aim at a disk that does not hold their bytes.
8225
+ *
8226
+ * **`null` = the count could not be taken**, and it is NOT permission to cut
8227
+ * over. The gate opens on a measured absence and on nothing else; an unread
8228
+ * collection and an empty one are different facts, and this repo has already
8229
+ * paid for conflating them (`RelocateResidueSchema`, D295).
8230
+ */
8231
+ var UnstampedEventMediaCountSchema = object({
8232
+ media: UnstampedRowsSchema,
8233
+ retrainFrames: UnstampedRowsSchema,
8234
+ /** True when EITHER collection holds one. The refusal reads this. */
8235
+ anyPresent: boolean(),
8236
+ /** Sum across both, or `null` when either lane could not be counted. */
8237
+ total: number().int().nonnegative().nullable()
8238
+ }).nullable();
8196
8239
  var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8197
8240
  /** The independently selectable logical storage classes — every class
8198
8241
  * `storage.listLocationDeclarations` reports, so an operator never meets a
@@ -8303,6 +8346,10 @@ var StorageMigrationMoveProgressSchema = object({
8303
8346
  /** The archive census — the **M** of "N of M" (D295). `null` = unknowable. */
8304
8347
  filesTotal: number().int().nonnegative().nullable(),
8305
8348
  bytesMoved: number().int().nonnegative(),
8349
+ /** Rows the mover corrected while moving them — see `RelocateJob`. Absent on
8350
+ * a lane that cannot reconcile. A migration that silently rewrote durable
8351
+ * rows would be the same failure as one that silently skipped them. */
8352
+ rowsReconciled: number().int().nonnegative().optional(),
8306
8353
  /** The MOVER's start, not the migration's: a drain restarted after an addon
8307
8354
  * crash gets a new mover, and a rate computed from the migration's start
8308
8355
  * would silently average in the time nothing was running. */
@@ -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-DJ0XK1ze.js");
6
+ const require_dist = require("../dist-BVUxSu6R.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-Cejgb_kg.mjs";
1
+ import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-Bw-A_piq.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-DJ0XK1ze.js");
6
+ const require_dist = require("../dist-BVUxSu6R.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-Cejgb_kg.mjs";
1
+ import { a as loginMethodCapability, c as BaseAddon, i as buildAddonRouteProvider, r as authProviderCapability, s as errMsg, t as addonRoutesCapability } from "../dist-Bw-A_piq.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.48",
6
+ version: "1.2.49",
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.126",
21
+ version: "1.2.127",
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.89",
36
+ version: "1.2.90",
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-DJ0XK1ze.js");
6
+ const require_dist = require("../dist-BVUxSu6R.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-Cejgb_kg.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-Bw-A_piq.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.126",
39
+ version: "1.2.127",
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.48",
48
+ version: "1.2.49",
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.89",
84
+ version: "1.2.90",
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-CdJ1lSwb.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_auth_webauthn_widgets-B8P5Tp1B.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.48",
3
+ "version": "1.2.49",
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",