@camstack/addon-export-alexa 1.2.147 → 1.2.148

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.
@@ -34,7 +34,7 @@ let node_path = require("node:path");
34
34
  node_path = __toESM(node_path, 1);
35
35
  require("node:child_process");
36
36
  require("node:zlib");
37
- //#region ../types/dist/event-category-BvOFi6PY.mjs
37
+ //#region ../types/dist/event-category-DOl51-Ij.mjs
38
38
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
39
39
  EventCategory["SystemBoot"] = "system.boot";
40
40
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -113,9 +113,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
113
113
  /**
114
114
  * The node's one-shot runner boot check (D877): planned runners against the
115
115
  * process service, `degraded` when any is failed, refused or missing. The
116
- * alert centre turns it into one alert and a direct critical push.
116
+ * alert centre turns it into one critical alert.
117
117
  */
118
118
  EventCategory["SystemRunnerCheck"] = "system.runner-check";
119
+ /**
120
+ * An alert EPISODE opened or closed, emitted by the alert centre for alerts
121
+ * of severity `critical` or `error` (`AlertEpisodePayload`). The alert
122
+ * centre sends no notification of its own: Notification Center turns this
123
+ * into the `alert-critical` / `alert-error` / `alert-critical-resolved`
124
+ * system-event kinds, and reconciles from the alerts store because a bus
125
+ * event may be dropped (D8, D11).
126
+ */
127
+ EventCategory["AlertEpisode"] = "alert.episode";
119
128
  EventCategory["AddonError"] = "addon.error";
120
129
  EventCategory["AddonPageReady"] = "addon.page-ready";
121
130
  EventCategory["AddonWidgetReady"] = "addon.widget-ready";
@@ -5440,7 +5449,7 @@ var ZodIssueCode = {
5440
5449
  var ZodFirstPartyTypeKind;
5441
5450
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5442
5451
  //#endregion
5443
- //#region ../types/dist/sleep-BegKjwUu.mjs
5452
+ //#region ../types/dist/sleep-BxjU_fJM.mjs
5444
5453
  /**
5445
5454
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5446
5455
  * window to float samples (D455).
@@ -13437,7 +13446,14 @@ var AlertSeveritySchema = _enum([
13437
13446
  ]);
13438
13447
  var AlertActionSchema = object({
13439
13448
  label: string(),
13440
- href: string().optional()
13449
+ href: string().optional(),
13450
+ /**
13451
+ * How `href` is followed. Absent / `app`: an admin-ui route (client-side).
13452
+ * `server`: a route the HUB serves (an addon HTTP route such as an OAuth
13453
+ * start) — the browser must leave the SPA with a full navigation, because
13454
+ * the SPA has no such route and would bounce to the home page.
13455
+ */
13456
+ navigation: _enum(["app", "server"]).optional()
13441
13457
  });
13442
13458
  var AlertStatusSchema = _enum([
13443
13459
  "active",
@@ -41838,6 +41854,9 @@ var NcSystemEventKindSchema = _enum([
41838
41854
  "server-updated",
41839
41855
  "export-completed",
41840
41856
  "backup-completed",
41857
+ "alert-critical",
41858
+ "alert-error",
41859
+ "alert-critical-resolved",
41841
41860
  "camera-online",
41842
41861
  "camera-offline",
41843
41862
  "camera-disabled",
@@ -50886,7 +50905,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
50886
50905
  }), method(object({ jobId: string().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
50887
50906
  kind: "mutation",
50888
50907
  auth: "admin"
50889
- }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
50908
+ }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string()).readonly() }), object({
50909
+ clear: boolean(),
50910
+ repointLocationId: string().optional()
50911
+ }), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
50890
50912
  kind: "mutation",
50891
50913
  auth: "admin"
50892
50914
  }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
@@ -54345,6 +54367,11 @@ object({
54345
54367
  *
54346
54368
  * `kind: 'poll'` — cloud REST APIs typically have no push channel; the
54347
54369
  * provider refreshes the slice on an interval and eagerly after commands.
54370
+ *
54371
+ * UNKNOWN IS NOT OFF. Every field the appliance reports separately is
54372
+ * nullable: `null` means "not known right now" (the appliance has not said,
54373
+ * the link is down, or the description does not carry it) and is never
54374
+ * rendered or exported as `false` / `0`. `availability` says why.
54348
54375
  */
54349
54376
  var DishwasherStateSchema = _enum([
54350
54377
  "idle",
@@ -54354,112 +54381,227 @@ var DishwasherStateSchema = _enum([
54354
54381
  "error",
54355
54382
  "unavailable"
54356
54383
  ]);
54384
+ /**
54385
+ * The appliance's own operation state, uncollapsed. `state` above is the coarse
54386
+ * view for compact surfaces; this is what the appliance said.
54387
+ */
54388
+ var DishwasherOperationStateSchema = _enum([
54389
+ "Inactive",
54390
+ "Ready",
54391
+ "DelayedStart",
54392
+ "Run",
54393
+ "Pause",
54394
+ "ActionRequired",
54395
+ "Finished",
54396
+ "Error",
54397
+ "Aborting"
54398
+ ]);
54399
+ /**
54400
+ * Why fields may be `null`:
54401
+ * - `available` — the link is up and the description is loaded;
54402
+ * - `offline` — the local link is down (values are unknown, not last-known);
54403
+ * - `description-missing` — the link is up but the appliance's description could not
54404
+ * be loaded, so its values cannot be decoded.
54405
+ */
54406
+ var DishwasherAvailabilitySchema = _enum([
54407
+ "available",
54408
+ "offline",
54409
+ "description-missing"
54410
+ ]);
54357
54411
  var DishwasherConsumableLevelSchema = _enum([
54358
54412
  "ok",
54359
54413
  "low",
54360
54414
  "empty"
54361
54415
  ]);
54362
54416
  object({
54417
+ availability: DishwasherAvailabilitySchema,
54418
+ /** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
54363
54419
  state: DishwasherStateSchema,
54364
- /** Active program id/name, or null when none selected / unknown. */
54420
+ /** The appliance's operation state as reported; null when not known. */
54421
+ operationState: DishwasherOperationStateSchema.nullable(),
54422
+ /** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
54365
54423
  program: string().nullable(),
54366
- /** Program tokens the hardware accepts — drives the UI selector. */
54424
+ /** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
54425
+ selectedProgram: string().nullable(),
54426
+ /** Feature keys of the programs the appliance currently offers — drives the UI selector. */
54367
54427
  availablePrograms: array(string()),
54368
- /** Minutes remaining on the active cycle, or null when not running. */
54369
- remainingMinutes: number().int().nonnegative().nullable(),
54428
+ /** Seconds remaining on the active cycle, or null when not running / not known. */
54429
+ remainingSeconds: number().int().nonnegative().nullable(),
54430
+ /** Seconds the delayed start is set to (time until the cycle starts), or null. */
54431
+ delayedStartSeconds: number().int().nonnegative().nullable(),
54370
54432
  /** Cycle completion 0..100, or null when not applicable. */
54371
54433
  progressPercent: number().min(0).max(100).nullable(),
54372
- /** True when the door is reported open. */
54373
- doorOpen: boolean(),
54374
- /** True when remote start is allowed (door closed, power on, etc.). */
54375
- remoteStartAllowed: boolean(),
54376
- /** Main power / switched-on state. */
54377
- powerOn: boolean(),
54434
+ /** True when the door is reported open; null when the door state is not known. */
54435
+ doorOpen: boolean().nullable(),
54436
+ /** True when the door is latched (locked) during a cycle; null when not reported. */
54437
+ doorLocked: boolean().nullable(),
54438
+ /** True when remote start is allowed (door closed, power on, etc.); null when not known. */
54439
+ remoteStartAllowed: boolean().nullable(),
54440
+ /** True when the appliance accepts remote control now; null when not known. */
54441
+ remoteControlActive: boolean().nullable(),
54442
+ /** True while somebody operates the appliance at its panel; null when not reported. */
54443
+ localControlActive: boolean().nullable(),
54444
+ /** Main power / switched-on state; null when not known. */
54445
+ powerOn: boolean().nullable(),
54446
+ /** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
54447
+ powerState: string().nullable(),
54378
54448
  saltLevel: DishwasherConsumableLevelSchema.nullable(),
54379
54449
  rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
54380
- halfLoad: boolean(),
54381
- hygienePlus: boolean(),
54450
+ /** Option states: null when the appliance does not expose the option or has not said. */
54451
+ halfLoad: boolean().nullable(),
54452
+ hygienePlus: boolean().nullable(),
54382
54453
  /** Extra dry option when the appliance exposes it. */
54383
- extraDry: boolean(),
54454
+ extraDry: boolean().nullable(),
54384
54455
  /** Intensive zone (lower basket) when the appliance exposes it. */
54385
- intensiveZone: boolean(),
54456
+ intensiveZone: boolean().nullable(),
54386
54457
  /** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
54387
- varioSpeedPlus: boolean(),
54388
- /** Child lock (controls disabled on the appliance). */
54389
- childLock: boolean(),
54458
+ varioSpeedPlus: boolean().nullable(),
54459
+ /** Child lock (controls disabled on the appliance); null when not known. */
54460
+ childLock: boolean().nullable(),
54461
+ /** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
54462
+ activeEvents: array(string()),
54463
+ /** Numeric error code when the appliance reports one; null otherwise. */
54390
54464
  errorCode: number().nullable(),
54465
+ /** Name of the raised alert-level event while the appliance is in error; null otherwise. */
54391
54466
  errorLabel: string().nullable(),
54467
+ /** Ms epoch of the last value received from the appliance; 0 = never. */
54392
54468
  lastFetchedAt: number()
54393
54469
  });
54394
- DeviceType.Dishwasher, method(object({ deviceId: number().int().nonnegative() }), _void(), {
54470
+ var DeviceIdSchema = number().int().nonnegative();
54471
+ /** A value a program option or setting can take. */
54472
+ var DishwasherValueSchema = union([
54473
+ boolean(),
54474
+ string(),
54475
+ number()
54476
+ ]);
54477
+ var DishwasherAccessSchema = _enum([
54478
+ "none",
54479
+ "read",
54480
+ "readWrite",
54481
+ "writeOnly",
54482
+ "readStatic"
54483
+ ]);
54484
+ /**
54485
+ * One option or setting the appliance declares, with the constraints its description
54486
+ * gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
54487
+ */
54488
+ var DishwasherOptionDescriptorSchema = object({
54489
+ /** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
54490
+ key: string(),
54491
+ /** Last segment of the key, for display. */
54492
+ name: string(),
54493
+ type: _enum([
54494
+ "boolean",
54495
+ "number",
54496
+ "enum",
54497
+ "string"
54498
+ ]),
54499
+ access: DishwasherAccessSchema,
54500
+ /** The appliance reports this entity as currently available. */
54501
+ available: boolean(),
54502
+ /** Unit the description declares for a number; null when it declares none. */
54503
+ unit: string().nullable(),
54504
+ min: number().nullable(),
54505
+ max: number().nullable(),
54506
+ step: number().nullable(),
54507
+ /** Allowed members of an enum; null for other types. */
54508
+ enumValues: array(string()).nullable(),
54509
+ defaultValue: DishwasherValueSchema.nullable()
54510
+ });
54511
+ var DishwasherProgramSchema = object({
54512
+ /** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
54513
+ key: string(),
54514
+ name: string(),
54515
+ /** The appliance currently offers this program. */
54516
+ available: boolean(),
54517
+ /** The options this program lists, with the program-level access / availability / default. */
54518
+ options: array(DishwasherOptionDescriptorSchema)
54519
+ });
54520
+ var DishwasherOptionsSchema = object({
54521
+ availability: DishwasherAvailabilitySchema,
54522
+ /** What the appliance can be told to do, from the commands its description declares. */
54523
+ supportsStart: boolean(),
54524
+ supportsPause: boolean(),
54525
+ supportsResume: boolean(),
54526
+ supportsStop: boolean(),
54527
+ supportsPower: boolean(),
54528
+ /** Every program the description lists, with its options. */
54529
+ programs: array(DishwasherProgramSchema),
54530
+ /** Every option and setting entity the description lists (programs reference these by key). */
54531
+ options: array(DishwasherOptionDescriptorSchema)
54532
+ });
54533
+ DeviceType.Dishwasher, method(object({
54534
+ deviceId: DeviceIdSchema,
54535
+ program: string().min(1).optional(),
54536
+ options: record(string(), DishwasherValueSchema).optional()
54537
+ }), _void(), {
54395
54538
  kind: "mutation",
54396
54539
  auth: "protected"
54397
- }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
54540
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54398
54541
  kind: "mutation",
54399
54542
  auth: "protected"
54400
- }), method(object({ deviceId: number().int().nonnegative() }), _void(), {
54543
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54544
+ kind: "mutation",
54545
+ auth: "protected"
54546
+ }), method(object({ deviceId: DeviceIdSchema }), _void(), {
54401
54547
  kind: "mutation",
54402
54548
  auth: "protected"
54403
54549
  }), method(object({
54404
- deviceId: number().int().nonnegative(),
54550
+ deviceId: DeviceIdSchema,
54405
54551
  program: string().min(1)
54406
54552
  }), _void(), {
54407
54553
  kind: "mutation",
54408
54554
  auth: "protected"
54409
54555
  }), method(object({
54410
- deviceId: number().int().nonnegative(),
54556
+ deviceId: DeviceIdSchema,
54411
54557
  on: boolean()
54412
54558
  }), _void(), {
54413
54559
  kind: "mutation",
54414
54560
  auth: "protected"
54415
54561
  }), method(object({
54416
- deviceId: number().int().nonnegative(),
54562
+ deviceId: DeviceIdSchema,
54417
54563
  on: boolean()
54418
54564
  }), _void(), {
54419
54565
  kind: "mutation",
54420
54566
  auth: "protected"
54421
54567
  }), method(object({
54422
- deviceId: number().int().nonnegative(),
54568
+ deviceId: DeviceIdSchema,
54423
54569
  on: boolean()
54424
54570
  }), _void(), {
54425
54571
  kind: "mutation",
54426
54572
  auth: "protected"
54427
54573
  }), method(object({
54428
- deviceId: number().int().nonnegative(),
54574
+ deviceId: DeviceIdSchema,
54429
54575
  on: boolean()
54430
54576
  }), _void(), {
54431
54577
  kind: "mutation",
54432
54578
  auth: "protected"
54433
54579
  }), method(object({
54434
- deviceId: number().int().nonnegative(),
54580
+ deviceId: DeviceIdSchema,
54435
54581
  on: boolean()
54436
54582
  }), _void(), {
54437
54583
  kind: "mutation",
54438
54584
  auth: "protected"
54439
54585
  }), method(object({
54440
- deviceId: number().int().nonnegative(),
54586
+ deviceId: DeviceIdSchema,
54441
54587
  on: boolean()
54442
54588
  }), _void(), {
54443
54589
  kind: "mutation",
54444
54590
  auth: "protected"
54445
54591
  }), method(object({
54446
- deviceId: number().int().nonnegative(),
54592
+ deviceId: DeviceIdSchema,
54447
54593
  on: boolean()
54448
54594
  }), _void(), {
54449
54595
  kind: "mutation",
54450
54596
  auth: "protected"
54451
54597
  }), method(object({
54452
- deviceId: number().int().nonnegative(),
54598
+ deviceId: DeviceIdSchema,
54453
54599
  key: string().min(1),
54454
- value: union([
54455
- boolean(),
54456
- string(),
54457
- number()
54458
- ])
54600
+ value: DishwasherValueSchema
54459
54601
  }), _void(), {
54460
54602
  kind: "mutation",
54461
54603
  auth: "protected"
54462
- });
54604
+ }), method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" });
54463
54605
  object({
54464
54606
  /** Ms epoch of the last press. null = never observed since this provider started. */
54465
54607
  lastPressedAt: number().nullable(),
@@ -64550,6 +64692,12 @@ Object.freeze({
64550
64692
  addonId: null,
64551
64693
  access: "view"
64552
64694
  },
64695
+ "dishwasher.getOptions": {
64696
+ capName: "dishwasher",
64697
+ capScope: "device",
64698
+ addonId: null,
64699
+ access: "view"
64700
+ },
64553
64701
  "dishwasher.getStatus": {
64554
64702
  capName: "dishwasher",
64555
64703
  capScope: "device",
@@ -64562,6 +64710,12 @@ Object.freeze({
64562
64710
  addonId: null,
64563
64711
  access: "create"
64564
64712
  },
64713
+ "dishwasher.resume": {
64714
+ capName: "dishwasher",
64715
+ capScope: "device",
64716
+ addonId: null,
64717
+ access: "create"
64718
+ },
64565
64719
  "dishwasher.setChildLock": {
64566
64720
  capName: "dishwasher",
64567
64721
  capScope: "device",
@@ -69062,6 +69216,12 @@ Object.freeze({
69062
69216
  addonId: null,
69063
69217
  access: "view"
69064
69218
  },
69219
+ "storageMigration.moverClearance": {
69220
+ capName: "storage-migration",
69221
+ capScope: "system",
69222
+ addonId: null,
69223
+ access: "view"
69224
+ },
69065
69225
  "storageMigration.movers": {
69066
69226
  capName: "storage-migration",
69067
69227
  capScope: "system",
@@ -71255,6 +71415,11 @@ Object.freeze({
71255
71415
  form: "single",
71256
71416
  optional: false
71257
71417
  }],
71418
+ "dishwasher.getOptions": [{
71419
+ name: "deviceId",
71420
+ form: "single",
71421
+ optional: false
71422
+ }],
71258
71423
  "dishwasher.getStatus": [{
71259
71424
  name: "deviceId",
71260
71425
  form: "single",
@@ -71265,6 +71430,11 @@ Object.freeze({
71265
71430
  form: "single",
71266
71431
  optional: false
71267
71432
  }],
71433
+ "dishwasher.resume": [{
71434
+ name: "deviceId",
71435
+ form: "single",
71436
+ optional: false
71437
+ }],
71268
71438
  "dishwasher.setChildLock": [{
71269
71439
  name: "deviceId",
71270
71440
  form: "single",
@@ -73351,6 +73521,9 @@ new Map(Object.entries({
73351
73521
  "wrapper-update-available": "system",
73352
73522
  "backup-completed": "system",
73353
73523
  "export-completed": "system",
73524
+ "alert-critical": "system",
73525
+ "alert-error": "system",
73526
+ "alert-critical-resolved": "system",
73354
73527
  "storage-location-low": "system",
73355
73528
  "storage-location-critical": "system",
73356
73529
  "storage-location-ok": "system",
@@ -73475,6 +73648,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
73475
73648
  "storage-location-ok"
73476
73649
  ]
73477
73650
  },
73651
+ {
73652
+ id: "alerts",
73653
+ family: "system",
73654
+ label: "Alerts",
73655
+ kinds: [
73656
+ "alert-critical",
73657
+ "alert-error",
73658
+ "alert-critical-resolved"
73659
+ ]
73660
+ },
73478
73661
  {
73479
73662
  id: "alarm",
73480
73663
  family: "alarm",
@@ -73519,6 +73702,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
73519
73702
  return [[descriptor.kind, field]];
73520
73703
  })));
73521
73704
  Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
73705
+ object({
73706
+ phase: _enum(["raised", "resolved"]),
73707
+ episodeId: string().min(1),
73708
+ alertId: string().min(1),
73709
+ severity: AlertSeveritySchema,
73710
+ category: string(),
73711
+ title: string(),
73712
+ message: string(),
73713
+ sourceType: string().optional(),
73714
+ sourceId: string().optional(),
73715
+ nodeId: string().optional(),
73716
+ /** The alert's own action link (where the operator acts on it), when it has one. */
73717
+ actionUrl: string().optional(),
73718
+ at: number()
73719
+ });
73522
73720
  var RULE_BODY_ONLY = ["body"];
73523
73721
  var RULE_TEXT = ["title", "body"];
73524
73722
  var BATTERY = ["device-battery-low", "device-battery-normal"];
@@ -73528,6 +73726,11 @@ var TANK = [
73528
73726
  "device-tank-full",
73529
73727
  "device-tank-normal"
73530
73728
  ];
73729
+ var ALERT_EPISODE = [
73730
+ "alert-critical",
73731
+ "alert-error",
73732
+ "alert-critical-resolved"
73733
+ ];
73531
73734
  var UPDATES = [
73532
73735
  "addon-update-available",
73533
73736
  "server-update-available",
@@ -73720,14 +73923,14 @@ var STATE_SUMMARY_VARS = [
73720
73923
  ([...RULE_TEXT], [...CONSUMABLE]),
73721
73924
  ([...RULE_TEXT], [...TANK]),
73722
73925
  [...RULE_TEXT],
73723
- ([...RULE_TEXT], [...UPDATES]),
73724
- ([...RULE_TEXT], [...UPDATES]),
73725
- [...RULE_TEXT],
73926
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
73927
+ ([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
73726
73928
  [...RULE_TEXT],
73727
73929
  [...RULE_TEXT],
73728
73930
  [...RULE_TEXT],
73729
73931
  [...RULE_TEXT],
73730
73932
  [...RULE_TEXT],
73933
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73731
73934
  [...RULE_TEXT],
73732
73935
  [...RULE_TEXT],
73733
73936
  [...RULE_TEXT],
@@ -73745,7 +73948,11 @@ var STATE_SUMMARY_VARS = [
73745
73948
  [...RULE_TEXT],
73746
73949
  [...RULE_TEXT],
73747
73950
  [...RULE_TEXT],
73748
- [...RULE_TEXT],
73951
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73952
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73953
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73954
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73955
+ ([...RULE_TEXT], [...ALERT_EPISODE]),
73749
73956
  [...RULE_TEXT],
73750
73957
  [...RULE_TEXT],
73751
73958
  [...RULE_TEXT],
@@ -83634,13 +83841,20 @@ function buildAlexaOauthIntegration(publicHubUrl) {
83634
83841
  function buildAlexaSetupBlock(input) {
83635
83842
  const base = input.publicHubUrl.replace(/\/+$/, "");
83636
83843
  return {
83637
- fields: [...base ? [{
83638
- label: "Directive endpoint",
83639
- value: `${base}/addon/export-alexa/directive`
83640
- }] : [], ...input.ingressToken && input.skillMode === "custom" ? [{
83641
- label: "Ingress token (Lambda HUB_INGRESS_TOKEN) — use \"Show ingress token\" in settings",
83642
- value: maskSecretTail(input.ingressToken)
83643
- }] : []],
83844
+ fields: [
83845
+ ...base ? [{
83846
+ label: "Hub address to enter in the Alexa app",
83847
+ value: base
83848
+ }] : [],
83849
+ ...base ? [{
83850
+ label: "Directive endpoint",
83851
+ value: `${base}/addon/export-alexa/directive`
83852
+ }] : [],
83853
+ ...input.ingressToken && input.skillMode === "custom" ? [{
83854
+ label: "Ingress token (Lambda HUB_INGRESS_TOKEN) — use \"Show ingress token\" in settings",
83855
+ value: maskSecretTail(input.ingressToken)
83856
+ }] : []
83857
+ ],
83644
83858
  note: base ? "Account linking is handled by the core OAuth server. Use the hub's /api/oauth2/authorize endpoint with integration=export-alexa." : "Set the public hub URL on the settings form first — the directive endpoint URL is derived from it."
83645
83859
  };
83646
83860
  }