@camstack/addon-auth 1.2.127 → 1.2.129

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.
@@ -5378,7 +5378,7 @@ var ZodIssueCode = {
5378
5378
  var ZodFirstPartyTypeKind;
5379
5379
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5380
5380
  //#endregion
5381
- //#region ../types/dist/sleep-DXKLNFvA.mjs
5381
+ //#region ../types/dist/sleep-C16NCZR2.mjs
5382
5382
  /**
5383
5383
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5384
5384
  * window to float samples (D455).
@@ -10577,57 +10577,15 @@ var ClipSearchStrictnessSchema = _enum([
10577
10577
  "balanced",
10578
10578
  "strict"
10579
10579
  ]);
10580
- new Set([
10581
- {
10582
- id: "person",
10583
- name: "Person"
10584
- },
10585
- {
10586
- id: "vehicle",
10587
- name: "Vehicle"
10588
- },
10589
- {
10590
- id: "animal",
10591
- name: "Animal"
10592
- },
10593
- {
10594
- id: "package",
10595
- name: "Package"
10596
- }
10597
- ].map((l) => l.id));
10598
- var COCO_TO_MACRO = {
10599
- mapping: {
10600
- person: "person",
10601
- bicycle: "vehicle",
10602
- car: "vehicle",
10603
- motorcycle: "vehicle",
10604
- airplane: "vehicle",
10605
- bus: "vehicle",
10606
- train: "vehicle",
10607
- truck: "vehicle",
10608
- boat: "vehicle",
10609
- bird: "animal",
10610
- cat: "animal",
10611
- dog: "animal",
10612
- horse: "animal",
10613
- sheep: "animal",
10614
- cow: "animal",
10615
- elephant: "animal",
10616
- bear: "animal",
10617
- zebra: "animal",
10618
- giraffe: "animal",
10619
- suitcase: "package",
10620
- backpack: "package",
10621
- handbag: "package"
10622
- },
10623
- preserveOriginal: false
10624
- };
10625
- /** Steps a root detector may declare it fills. */
10626
- var FILLABLE_STEP_IDS = [
10580
+ /** Steps whose effect a root label can BE. */
10581
+ var LABEL_SUPPLY_STEP_IDS = [
10627
10582
  "animal-classifier",
10628
10583
  "vehicle-classifier",
10629
10584
  "package-detection"
10630
10585
  ];
10586
+ /** Steps whose box a root detection can BE. */
10587
+ var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
10588
+ [...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
10631
10589
  var MODEL_FORMATS = [
10632
10590
  "onnx",
10633
10591
  "coreml",
@@ -10760,12 +10718,35 @@ var ModelLicenseSchema = preprocess((value) => typeof value === "string" ? { wei
10760
10718
  /** True when the weights or their data forbid commercial use. */
10761
10719
  nonCommercial: boolean().optional()
10762
10720
  }));
10763
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
10764
- var FillsClassifierEffectSchema = object({
10765
- stepId: _enum(FILLABLE_STEP_IDS),
10721
+ /**
10722
+ * One step a ROOT detector can supply from its own output (D730) — see
10723
+ * `ModelCatalogEntry.suppliesSteps`.
10724
+ *
10725
+ * - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
10726
+ * the root's label to the step's vocabulary; `uncovered` is the vocabulary
10727
+ * the root cannot produce (shown as unavailable, never a blocker).
10728
+ * - `crop`: the root draws the box the step would have found (`license_plate`
10729
+ * for plate-detection, `face` for face-detection). The box becomes a detail
10730
+ * child of the `parentMacro` detection that contains it — never a track.
10731
+ */
10732
+ var RootStepSupplySchema = discriminatedUnion("kind", [object({
10733
+ kind: literal("label"),
10734
+ stepId: _enum(LABEL_SUPPLY_STEP_IDS),
10766
10735
  labelToEffect: record(string(), string()),
10767
10736
  uncovered: array(string()).readonly()
10768
- });
10737
+ }), object({
10738
+ kind: literal("crop"),
10739
+ stepId: _enum(CROP_SUPPLY_STEP_IDS),
10740
+ rootLabels: array(string()).readonly(),
10741
+ parentMacro: _enum(["vehicle", "person"]),
10742
+ childClass: _enum(["plate", "face"]),
10743
+ /**
10744
+ * The root's smaller input side, stamped on read by `rootSuppliesOf` from
10745
+ * the model entry — what a step's `minRootInputPx` gate judges. Never
10746
+ * stored by an import.
10747
+ */
10748
+ rootInputPx: number().int().positive().optional()
10749
+ })]);
10769
10750
  var ModelCatalogEntrySchema = object({
10770
10751
  id: string(),
10771
10752
  name: string(),
@@ -10892,15 +10873,15 @@ var ModelCatalogEntrySchema = object({
10892
10873
  */
10893
10874
  classMap: DetectionCatalogClassMapSchema.optional(),
10894
10875
  /**
10895
- * The pipeline steps this ROOT detector already does the work of (D715):
10896
- * its labels name the effect the step exists to produce (`deer` for
10897
- * `animal-classifier`, `package` for `package-detection`). Derived from the
10898
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
10899
- * declares none. Whether a declaration is honoured is the step's own
10900
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
10901
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
10876
+ * The pipeline steps this ROOT detector can supply from its own output
10877
+ * (D730): its labels name a step's effect (`deer` for `animal-classifier`)
10878
+ * or draw a step's box (`license_plate` for `plate-detection`). Computed at
10879
+ * import from THIS model's labelmap by `deriveRootSupplies`, never written
10880
+ * by hand and never assumed per family; a row without it is derived on read
10881
+ * (`rootSuppliesOf`). Whether a camera uses it is the step's own
10882
+ * `useRootModel` flag (`resolveRootSupply`).
10902
10883
  */
10903
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional(),
10884
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional(),
10904
10885
  /**
10905
10886
  * The model's CLIP feature-space contract (text encoder, dimension, vector
10906
10887
  * index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
@@ -17881,6 +17862,51 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
17881
17862
  kind: "mutation",
17882
17863
  auth: "admin"
17883
17864
  });
17865
+ new Set([
17866
+ {
17867
+ id: "person",
17868
+ name: "Person"
17869
+ },
17870
+ {
17871
+ id: "vehicle",
17872
+ name: "Vehicle"
17873
+ },
17874
+ {
17875
+ id: "animal",
17876
+ name: "Animal"
17877
+ },
17878
+ {
17879
+ id: "package",
17880
+ name: "Package"
17881
+ }
17882
+ ].map((l) => l.id));
17883
+ var COCO_TO_MACRO = {
17884
+ mapping: {
17885
+ person: "person",
17886
+ bicycle: "vehicle",
17887
+ car: "vehicle",
17888
+ motorcycle: "vehicle",
17889
+ airplane: "vehicle",
17890
+ bus: "vehicle",
17891
+ train: "vehicle",
17892
+ truck: "vehicle",
17893
+ boat: "vehicle",
17894
+ bird: "animal",
17895
+ cat: "animal",
17896
+ dog: "animal",
17897
+ horse: "animal",
17898
+ sheep: "animal",
17899
+ cow: "animal",
17900
+ elephant: "animal",
17901
+ bear: "animal",
17902
+ zebra: "animal",
17903
+ giraffe: "animal",
17904
+ suitcase: "package",
17905
+ backpack: "package",
17906
+ handbag: "package"
17907
+ },
17908
+ preserveOriginal: false
17909
+ };
17884
17910
  var AUDIO_MACRO_LABELS = [
17885
17911
  {
17886
17912
  id: "speech",
@@ -18638,6 +18664,8 @@ var NcSystemEventKindSchema = _enum([
18638
18664
  "stream-offline",
18639
18665
  "node-online",
18640
18666
  "node-offline",
18667
+ "node-restarting",
18668
+ "node-updating",
18641
18669
  "node-inference-unavailable",
18642
18670
  "detection-blind",
18643
18671
  "addon-crash-loop",
@@ -23155,6 +23183,34 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
23155
23183
  timestamp: number()
23156
23184
  });
23157
23185
  /**
23186
+ * A root model's boxes standing in for one crop-kind step's own inference
23187
+ * (D730) — see `runPipeline.suppliedRoot`.
23188
+ */
23189
+ var SuppliedRootOutputSchema = object({
23190
+ stepId: string(),
23191
+ /** The root model that drew the boxes — stamped on the result. */
23192
+ modelId: string(),
23193
+ detections: array(object({
23194
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
23195
+ bbox: tuple([
23196
+ number(),
23197
+ number(),
23198
+ number(),
23199
+ number()
23200
+ ]),
23201
+ score: number(),
23202
+ /**
23203
+ * Five facial landmarks in the same pixels — a face the step's own
23204
+ * detector already re-found inside a root face box (D730), so its
23205
+ * embedder child aligns it exactly as it aligns any detected face.
23206
+ */
23207
+ landmarks: array(object({
23208
+ x: number(),
23209
+ y: number()
23210
+ })).optional()
23211
+ })).min(1)
23212
+ });
23213
+ /**
23158
23214
  * Reference to the frame's retained NATIVE surface + the parent crop's placement
23159
23215
  * within the frame, so the executor can re-cut a leaf child ROI at native
23160
23216
  * resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
@@ -23285,7 +23341,7 @@ var PipelineModelOptionSchema = object({
23285
23341
  legacy: boolean().optional(),
23286
23342
  provider: ModelProviderIdSchema.optional(),
23287
23343
  defaultConfidence: number().optional(),
23288
- fillsClassifierEffects: array(FillsClassifierEffectSchema).readonly().optional()
23344
+ suppliesSteps: array(RootStepSupplySchema).readonly().optional()
23289
23345
  });
23290
23346
  var ConfigFieldBridge = custom();
23291
23347
  var PipelineAddonSchemaSchema = object({
@@ -23553,7 +23609,16 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
23553
23609
  * `device-not-servable`), and nothing reaches the camera's live
23554
23610
  * trace stream. Absent ⇒ unchanged behaviour.
23555
23611
  */
23556
- replay: literal(true).optional()
23612
+ replay: literal(true).optional(),
23613
+ /**
23614
+ * Root-supplied detections for the tree's ROOT step (D730). Set by
23615
+ * `runDetailSubtree` when the camera's root model supplies a crop-kind
23616
+ * step (a Frigate+ `license_plate` for `plate-detection`): the step is
23617
+ * NOT inferred, these boxes are its output, and its children (the plate
23618
+ * reader) run on them through their own crop policy. Boxes are in the
23619
+ * PIXELS of the image this call carries. Absent ⇒ the root step runs.
23620
+ */
23621
+ suppliedRoot: SuppliedRootOutputSchema.optional()
23557
23622
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
23558
23623
  steps: array(PipelineStepInputSchema).min(1),
23559
23624
  frames: array(FrameInputSchema).min(1).max(255),
@@ -24655,7 +24720,22 @@ method(RunnerCameraConfigSchema, object({ success: literal(true) }), { kind: "mu
24655
24720
  */
24656
24721
  cropJpeg: string().optional(),
24657
24722
  parent: DetailParentSchema,
24658
- steps: array(string()).optional()
24723
+ steps: array(string()).optional(),
24724
+ /**
24725
+ * The camera's root model already drew this step's boxes (D730): a
24726
+ * `license_plate` inside the parent vehicle. The named step is NOT
24727
+ * inferred — these FRAME-space boxes are its output — and its
24728
+ * requested children (the plate reader) run on them. Absent ⇒ every
24729
+ * requested step infers as before.
24730
+ */
24731
+ supplied: object({
24732
+ stepId: string(),
24733
+ modelId: string(),
24734
+ boxes: array(object({
24735
+ bbox: NativeCropBboxSchema,
24736
+ score: number()
24737
+ })).min(1)
24738
+ }).optional()
24659
24739
  }), object({ details: array(DetailResultSchema) }).nullable(), { kind: "mutation" }), method(object({
24660
24740
  /** Catalog step id, e.g. `clip-embedding`. */
24661
24741
  stepId: string(),
@@ -27991,6 +28071,14 @@ DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), ar
27991
28071
  */
27992
28072
  alive: boolean()
27993
28073
  })), method(object({
28074
+ deviceId: number().int().nonnegative(),
28075
+ sessionId: string(),
28076
+ downlinkMbps: number().nonnegative()
28077
+ }), object({
28078
+ outcome: _enum(["switching", "held"]),
28079
+ tier: CamProfileSchema.nullable(),
28080
+ reason: string()
28081
+ }), { kind: "mutation" }), method(object({
27994
28082
  deviceId: number().int().nonnegative(),
27995
28083
  sessionId: string()
27996
28084
  }), WebrtcSessionDebugSchema, { kind: "query" });
@@ -30666,7 +30754,8 @@ var ConnectionEndpointSchema = object({
30666
30754
  "lan-ipv6",
30667
30755
  "public",
30668
30756
  "loopback",
30669
- "app-link"
30757
+ "app-link",
30758
+ "custom"
30670
30759
  ]),
30671
30760
  /**
30672
30761
  * Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
@@ -30768,6 +30857,76 @@ var ViewerEndpointsSchema = object({
30768
30857
  /** What the ranking currently resolves to (may be empty if nothing is up). */
30769
30858
  resolved: array(string()).readonly()
30770
30859
  });
30860
+ /**
30861
+ * DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
30862
+ * one release for addons built against it): `cluster` is the `agents` role,
30863
+ * `browser` the `signIn` role; `override` is the flagged address.
30864
+ */
30865
+ var HubAddressSnapshotSchema = object({
30866
+ override: string().nullable(),
30867
+ resolved: string().nullable(),
30868
+ source: _enum([
30869
+ "override",
30870
+ "auto",
30871
+ "none"
30872
+ ])
30873
+ });
30874
+ var HubAddressesSchema = object({
30875
+ cluster: HubAddressSnapshotSchema,
30876
+ browser: HubAddressSnapshotSchema
30877
+ });
30878
+ /**
30879
+ * What an address is used for (`hub-address.ts`). `viewer` is many-valued;
30880
+ * `notifications`, `agents` and `signIn` are carried by at most one address.
30881
+ */
30882
+ var HubAddressRoleSchema = _enum([
30883
+ "viewer",
30884
+ "notifications",
30885
+ "agents",
30886
+ "signIn"
30887
+ ]);
30888
+ var RoleSourceSchema = _enum([
30889
+ "flagged",
30890
+ "auto",
30891
+ "none"
30892
+ ]);
30893
+ /** One single-valued role: the flagged address, the one in use, and why. */
30894
+ var HubAddressRoleResolutionSchema = object({
30895
+ /** The address carrying the flag, or null = automatic. */
30896
+ flagged: string().nullable(),
30897
+ /** The address in use, or null when nothing qualifies (never loopback). */
30898
+ resolved: string().nullable(),
30899
+ source: RoleSourceSchema
30900
+ });
30901
+ var HubViewerResolutionSchema = object({
30902
+ /** The addresses flagged `viewer`, or empty = automatic. */
30903
+ flagged: array(string()).readonly(),
30904
+ /** What the apps race right now. */
30905
+ resolved: array(string()).readonly(),
30906
+ source: RoleSourceSchema
30907
+ });
30908
+ var HubAddressBookSchema = object({
30909
+ rows: array(ConnectionEndpointSchema.extend({
30910
+ /** In the hub's detected palette right now. */
30911
+ detected: boolean(),
30912
+ /** Entered by the operator (removable). */
30913
+ custom: boolean(),
30914
+ /** The roles explicitly flagged on this address. */
30915
+ flags: array(HubAddressRoleSchema).readonly(),
30916
+ /** The roles this address serves right now — flagged or automatic. */
30917
+ inUse: array(HubAddressRoleSchema).readonly(),
30918
+ /** The roles this address may be flagged with. */
30919
+ eligible: array(HubAddressRoleSchema).readonly()
30920
+ })).readonly(),
30921
+ roles: object({
30922
+ viewer: HubViewerResolutionSchema,
30923
+ notifications: HubAddressRoleResolutionSchema,
30924
+ agents: HubAddressRoleResolutionSchema,
30925
+ signIn: HubAddressRoleResolutionSchema
30926
+ }),
30927
+ /** The `hub=` an app link carries (D709), or null. */
30928
+ appLinkHub: string().nullable()
30929
+ });
30771
30930
  var AllowedAddressesSchema = object({
30772
30931
  /**
30773
30932
  * Allowlist of interface addresses operators have explicitly opted
@@ -30814,7 +30973,24 @@ method(_void(), ListResultSchema), method(_void(), PreferredSchema), method(obje
30814
30973
  * an address notification links can be flagged with, not a hub
30815
30974
  * route. Default `false`: racers and rankers never see it. */
30816
30975
  includeAppLink: boolean().optional()
30817
- }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
30976
+ }), GetConnectionEndpointsResultSchema), method(_void(), NotificationEndpointSchema), method(object({ baseUrl: string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }), method(_void(), ViewerEndpointsSchema), method(object({ baseUrls: array(string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }), method(object({ scheme: _enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema), method(object({
30977
+ baseUrl: string(),
30978
+ label: string().max(80)
30979
+ }), HubAddressBookSchema, {
30980
+ kind: "mutation",
30981
+ auth: "admin"
30982
+ }), method(object({ baseUrl: string() }), HubAddressBookSchema, {
30983
+ kind: "mutation",
30984
+ auth: "admin"
30985
+ }), method(object({
30986
+ role: HubAddressRoleSchema,
30987
+ baseUrl: string().nullable(),
30988
+ enabled: boolean(),
30989
+ acceptInsecureHttp: boolean().optional()
30990
+ }), HubAddressBookSchema, {
30991
+ kind: "mutation",
30992
+ auth: "admin"
30993
+ }), method(_void(), HubAddressesSchema), method(_void(), AllowedAddressesSchema), method(AllowedAddressesSchema, object({ success: literal(true) }), { kind: "mutation" }), method(_void(), AllowedAddressesSchema, { kind: "mutation" }), method(_void(), TlsStatusSchema), method(object({ reason: string().optional() }), TlsStatusSchema, {
30818
30994
  kind: "mutation",
30819
30995
  auth: "admin"
30820
30996
  }), method(object({
@@ -31204,7 +31380,8 @@ object({
31204
31380
  * writes this slice (not even a boot seed), and neither does the runner's
31205
31381
  * phase machine: its phase is "a session is attached" for every on-motion
31206
31382
  * session, not motion, and it now has its own `DetectionPhaseTransition`.
31207
- * A provider's `isDetected` answers from the hub's slice.
31383
+ * A provider's `isDetected` and `getStatus` answer from the hub's slice
31384
+ * (`hubMotionNativeProvider`).
31208
31385
  * - **Sensors** (Home Assistant binary sensors, Homematic, Matter, Alexa
31209
31386
  * imports) — the provider pushes both edges itself, from the upstream
31210
31387
  * system's own state change. That is the sensor's own fact.
@@ -39263,12 +39440,24 @@ Object.freeze({
39263
39440
  addonId: null,
39264
39441
  access: "view"
39265
39442
  },
39443
+ "localNetwork.addCustomAddress": {
39444
+ capName: "local-network",
39445
+ capScope: "system",
39446
+ addonId: null,
39447
+ access: "create"
39448
+ },
39266
39449
  "localNetwork.downloadCa": {
39267
39450
  capName: "local-network",
39268
39451
  capScope: "system",
39269
39452
  addonId: null,
39270
39453
  access: "view"
39271
39454
  },
39455
+ "localNetwork.getAddresses": {
39456
+ capName: "local-network",
39457
+ capScope: "system",
39458
+ addonId: null,
39459
+ access: "view"
39460
+ },
39272
39461
  "localNetwork.getAllowedAddresses": {
39273
39462
  capName: "local-network",
39274
39463
  capScope: "system",
@@ -39281,6 +39470,12 @@ Object.freeze({
39281
39470
  addonId: null,
39282
39471
  access: "view"
39283
39472
  },
39473
+ "localNetwork.getHubAddresses": {
39474
+ capName: "local-network",
39475
+ capScope: "system",
39476
+ addonId: null,
39477
+ access: "view"
39478
+ },
39284
39479
  "localNetwork.getNotificationEndpoint": {
39285
39480
  capName: "local-network",
39286
39481
  capScope: "system",
@@ -39317,6 +39512,12 @@ Object.freeze({
39317
39512
  addonId: null,
39318
39513
  access: "create"
39319
39514
  },
39515
+ "localNetwork.removeCustomAddress": {
39516
+ capName: "local-network",
39517
+ capScope: "system",
39518
+ addonId: null,
39519
+ access: "delete"
39520
+ },
39320
39521
  "localNetwork.resetAllowlistToBestMatch": {
39321
39522
  capName: "local-network",
39322
39523
  capScope: "system",
@@ -39329,6 +39530,12 @@ Object.freeze({
39329
39530
  addonId: null,
39330
39531
  access: "create"
39331
39532
  },
39533
+ "localNetwork.setAddressRole": {
39534
+ capName: "local-network",
39535
+ capScope: "system",
39536
+ addonId: null,
39537
+ access: "create"
39538
+ },
39332
39539
  "localNetwork.setAllowedAddresses": {
39333
39540
  capName: "local-network",
39334
39541
  capScope: "system",
@@ -43583,6 +43790,12 @@ Object.freeze({
43583
43790
  addonId: null,
43584
43791
  access: "create"
43585
43792
  },
43793
+ "webrtcSession.applyDownlinkProbe": {
43794
+ capName: "webrtc-session",
43795
+ capScope: "device",
43796
+ addonId: null,
43797
+ access: "create"
43798
+ },
43586
43799
  "webrtcSession.closeSession": {
43587
43800
  capName: "webrtc-session",
43588
43801
  capScope: "device",
@@ -47505,6 +47718,11 @@ Object.freeze({
47505
47718
  form: "single",
47506
47719
  optional: false
47507
47720
  }],
47721
+ "webrtcSession.applyDownlinkProbe": [{
47722
+ name: "deviceId",
47723
+ form: "single",
47724
+ optional: false
47725
+ }],
47508
47726
  "webrtcSession.closeSession": [{
47509
47727
  name: "deviceId",
47510
47728
  form: "single",
@@ -47734,6 +47952,8 @@ new Map(Object.entries({
47734
47952
  "detection-blind": "device-events",
47735
47953
  "node-online": "system",
47736
47954
  "node-offline": "system",
47955
+ "node-restarting": "system",
47956
+ "node-updating": "system",
47737
47957
  "node-inference-unavailable": "system",
47738
47958
  "addon-crash-loop": "system",
47739
47959
  "addon-update-available": "system",
@@ -47811,6 +48031,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47811
48031
  kinds: [
47812
48032
  "node-offline",
47813
48033
  "node-online",
48034
+ "node-restarting",
47814
48035
  "node-inference-unavailable"
47815
48036
  ]
47816
48037
  },
@@ -47832,6 +48053,7 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
47832
48053
  label: "Server & container updates",
47833
48054
  kinds: [
47834
48055
  "server-update-available",
48056
+ "node-updating",
47835
48057
  "server-updated",
47836
48058
  "wrapper-update-available"
47837
48059
  ]
@@ -47979,6 +48201,7 @@ var STATE_SUMMARY_SECTION_VARS = [
47979
48201
  kinds: [
47980
48202
  "node-offline",
47981
48203
  "node-online",
48204
+ "node-restarting",
47982
48205
  "node-inference-unavailable"
47983
48206
  ]
47984
48207
  },
@@ -48000,6 +48223,7 @@ var STATE_SUMMARY_SECTION_VARS = [
48000
48223
  example: "server 1.2.377 → 1.2.378",
48001
48224
  kinds: [
48002
48225
  "server-update-available",
48226
+ "node-updating",
48003
48227
  "server-updated",
48004
48228
  "wrapper-update-available"
48005
48229
  ]
@@ -48032,7 +48256,7 @@ var STATE_SUMMARY_VARS = [
48032
48256
  {
48033
48257
  name: "summarySection",
48034
48258
  label: "Summary: this section",
48035
- description: "The section a per-section summary row is about (D698); on a summary sent as one message, every section it reports, comma-separated.",
48259
+ description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
48036
48260
  example: "Batterie scariche",
48037
48261
  group: "system",
48038
48262
  families: ["rule"],
@@ -48639,4 +48863,14 @@ DEFAULT_NATIVE_LEASE_SETTINGS.admission;
48639
48863
  var MB = 1024 * 1024;
48640
48864
  1024 * MB, 3072 * MB;
48641
48865
  //#endregion
48642
- export { loginMethodCapability as a, BaseAddon as c, number as d, object as f, buildAddonRouteProvider as i, array as l, addonWidgetsSourceCapability as n, userPasskeysCapability as o, string as p, authProviderCapability as r, errMsg as s, addonRoutesCapability as t, boolean as u };
48866
+ //#region src/hub-browser-origin.ts
48867
+ async function hubBrowserOrigin(localNetwork, logger) {
48868
+ try {
48869
+ return (await localNetwork.getAddresses.query()).roles.signIn.resolved;
48870
+ } catch (err) {
48871
+ logger.warn("hub address unavailable from local-network — using the localhost default", { meta: { error: err instanceof Error ? err.message : String(err) } });
48872
+ return null;
48873
+ }
48874
+ }
48875
+ //#endregion
48876
+ export { buildAddonRouteProvider as a, errMsg as c, boolean as d, number as f, authProviderCapability as i, BaseAddon as l, string as m, addonRoutesCapability as n, loginMethodCapability as o, object as p, addonWidgetsSourceCapability as r, userPasskeysCapability as s, hubBrowserOrigin as t, array as u };
@@ -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-CrTS14S8.js");
6
+ const require_hub_browser_origin = require("../hub-browser-origin-Cd5W-H0b.js");
7
7
  //#region src/magic-link/auth-magic-link.addon.ts
8
8
  /**
9
9
  * Magic-link authentication addon.
@@ -38,7 +38,7 @@ var DEFAULT_CONFIG = {
38
38
  defaultRole: "viewer",
39
39
  ttlSec: 600
40
40
  };
41
- var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
41
+ var AuthMagicLinkAddon = class extends require_hub_browser_origin.BaseAddon {
42
42
  constructor() {
43
43
  super({ ...DEFAULT_CONFIG });
44
44
  }
@@ -53,7 +53,7 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
53
53
  throw new Error("Magic link does not use callback — the email link redirects to /api/auth/sso/finish directly");
54
54
  }
55
55
  };
56
- const routeProvider = require_dist.buildAddonRouteProvider("auth-magic-link", [
56
+ const routeProvider = require_hub_browser_origin.buildAddonRouteProvider("auth-magic-link", [
57
57
  {
58
58
  method: "GET",
59
59
  path: "/start",
@@ -80,15 +80,15 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
80
80
  this.ctx.logger.info("Magic-link auth provider initialized", { meta: { deliveryMode: this.config.deliveryMode } });
81
81
  return [
82
82
  {
83
- capability: require_dist.authProviderCapability,
83
+ capability: require_hub_browser_origin.authProviderCapability,
84
84
  provider: authProvider
85
85
  },
86
86
  {
87
- capability: require_dist.addonRoutesCapability,
87
+ capability: require_hub_browser_origin.addonRoutesCapability,
88
88
  provider: routeProvider
89
89
  },
90
90
  {
91
- capability: require_dist.loginMethodCapability,
91
+ capability: require_hub_browser_origin.loginMethodCapability,
92
92
  provider: loginMethodProvider
93
93
  }
94
94
  ];
@@ -134,7 +134,7 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
134
134
  type: "text",
135
135
  key: "publicOrigin",
136
136
  label: "Public origin",
137
- description: "Where the email link points. Empty = read CAMSTACK_HUB_PUBLIC_URL env var.",
137
+ description: "Where the email link points. Empty = the hub address from Network (public tunnel, then mesh, then LAN).",
138
138
  default: ""
139
139
  }),
140
140
  this.field({
@@ -174,17 +174,17 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
174
174
  ]
175
175
  }] });
176
176
  }
177
- buildPublicOrigin() {
177
+ async buildPublicOrigin() {
178
178
  const configured = this.config.publicOrigin?.trim();
179
179
  if (configured) return configured.replace(/\/+$/, "");
180
- return (process.env["CAMSTACK_HUB_PUBLIC_URL"] || "").replace(/\/+$/, "") || "https://localhost:4443";
180
+ return await require_hub_browser_origin.hubBrowserOrigin(this.ctx.api.localNetwork, this.ctx.logger) ?? "https://localhost:4443";
181
181
  }
182
182
  async findUserByEmail(email) {
183
183
  let users;
184
184
  try {
185
185
  users = await this.ctx.api.userManagement.listUsers.query();
186
186
  } catch (err) {
187
- this.ctx.logger.warn("Magic-link user lookup failed (user-management cap unavailable)", { meta: { message: require_dist.errMsg(err) } });
187
+ this.ctx.logger.warn("Magic-link user lookup failed (user-management cap unavailable)", { meta: { message: require_hub_browser_origin.errMsg(err) } });
188
188
  return null;
189
189
  }
190
190
  const needle = email.trim().toLowerCase();
@@ -273,12 +273,12 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
273
273
  ttlSec: this.config.ttlSec || DEFAULT_CONFIG.ttlSec
274
274
  }));
275
275
  } catch (err) {
276
- this.ctx.logger.error("Magic-link bridge-token minting failed (sso-bridge unavailable)", { meta: { message: require_dist.errMsg(err) } });
276
+ this.ctx.logger.error("Magic-link bridge-token minting failed (sso-bridge unavailable)", { meta: { message: require_hub_browser_origin.errMsg(err) } });
277
277
  reply.code(503);
278
278
  reply.send({ error: "sso-bridge capability unavailable" });
279
279
  return;
280
280
  }
281
- const link = `${this.buildPublicOrigin()}/addon/auth-magic-link/login?bridge=${encodeURIComponent(token)}`;
281
+ const link = `${await this.buildPublicOrigin()}/addon/auth-magic-link/login?bridge=${encodeURIComponent(token)}`;
282
282
  if (this.config.deliveryMode === "log-only") this.ctx.logger.warn("Magic link generated (log-only mode — NOT delivered via email)", { meta: {
283
283
  email,
284
284
  link,
@@ -294,7 +294,7 @@ var AuthMagicLinkAddon = class extends require_dist.BaseAddon {
294
294
  reply.code(500);
295
295
  reply.send({
296
296
  error: "Magic-link request failed",
297
- message: require_dist.errMsg(err)
297
+ message: require_hub_browser_origin.errMsg(err)
298
298
  });
299
299
  }
300
300
  }