@camstack/addon-smtp-nodemailer 1.2.153 → 1.2.154

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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.154] - 2026-11-08
11
+
12
+ ### Changed
13
+
14
+ - Its integration-instances provider declares its instance kind and stamps it on every instance.
15
+
10
16
  ## [1.2.153] - 2026-11-08
11
17
 
12
18
  ### Changed
@@ -6044,7 +6044,7 @@ var ZodIssueCode = {
6044
6044
  var ZodFirstPartyTypeKind;
6045
6045
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6046
6046
  //#endregion
6047
- //#region ../types/dist/sleep-7El4r5Bl.mjs
6047
+ //#region ../types/dist/sleep-CGPZyzB5.mjs
6048
6048
  /**
6049
6049
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6050
6050
  * window to float samples (D455).
@@ -7260,6 +7260,7 @@ var RecordIntegrationInstances = class {
7260
7260
  this.secretKeys = topLevelSecretKeys(kind.declaration.secretPaths);
7261
7261
  this.secretMaps = secretMapKeys(kind.declaration.secretPaths);
7262
7262
  this.nameField = kind.declaration.entry?.nameField ?? "name";
7263
+ if (hooks.kindOf === void 0 && hooks.description.kinds.length !== 1) throw new Error(`record kind '${kind.name}': describe().kinds has ${hooks.description.kinds.length} entries, so kindOf is required to say which one an instance is`);
7263
7264
  }
7264
7265
  /**
7265
7266
  * One instance read for the addon's own runtime; null when absent. When the keychain is
@@ -7301,10 +7302,21 @@ var RecordIntegrationInstances = class {
7301
7302
  }
7302
7303
  return out;
7303
7304
  }
7305
+ /** The kind an instance body is of: the provider's `kindOf`, else its one declared kind. */
7306
+ kindOfBody(body) {
7307
+ if (this.hooks.kindOf !== void 0) {
7308
+ const id = this.hooks.kindOf(body);
7309
+ if (!this.hooks.description.kinds.some((declared) => declared.id === id)) throw new Error(`record kind '${this.kind.name}': kindOf returned '${id}', which describe().kinds does not declare (D1013)`);
7310
+ return id;
7311
+ }
7312
+ const only = this.hooks.description.kinds[0];
7313
+ if (only === void 0) throw new Error(`record kind '${this.kind.name}' declares no kinds`);
7314
+ return only.id;
7315
+ }
7304
7316
  viewOf(record) {
7305
7317
  const shown = secretViewsOf(this.records.owner, this.kind.name, record.id, this.kind.declaration, record.data);
7306
7318
  const rawName = record.data[this.nameField];
7307
- const kind = this.hooks.kindOf?.(record.data);
7319
+ const kind = this.kindOfBody(record.data);
7308
7320
  const health = this.hooks.health?.(record.data, record.id);
7309
7321
  return {
7310
7322
  id: record.id,
@@ -7312,7 +7324,7 @@ var RecordIntegrationInstances = class {
7312
7324
  configured: this.hooks.configured(record.data),
7313
7325
  enabled: isInstanceEnabled(record.data),
7314
7326
  formValues: shown,
7315
- ...kind !== void 0 ? { kind } : {},
7327
+ kind,
7316
7328
  ...health?.status !== void 0 ? { status: health.status } : {},
7317
7329
  ...health?.lastCheckedAt !== void 0 ? { lastCheckedAt: health.lastCheckedAt } : {}
7318
7330
  };
@@ -48949,7 +48961,7 @@ DeviceType.MediaPlayer, method(deviceOnly, _void(), {
48949
48961
  kind: "mutation",
48950
48962
  auth: "protected"
48951
48963
  });
48952
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Heater, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Fan, DeviceType.Lock, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Gateway, DeviceType.Hub, DeviceType.Camera, DeviceType.Sensor, DeviceType.MediaPlayer, DeviceType.Vacuum, DeviceType.Generic, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.PetFountain, DeviceType.Fan, DeviceType.Humidifier, DeviceType.Climate, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder, DeviceType.Heater;
48964
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Heater, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Fan, DeviceType.Lock, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Gateway, DeviceType.Hub, DeviceType.Camera, DeviceType.Sensor, DeviceType.MediaPlayer, DeviceType.Vacuum, DeviceType.Generic, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.PetFountain, DeviceType.Fan, DeviceType.Humidifier, DeviceType.Climate, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.MediaPlayer;
48953
48965
  var NUMBER = {
48954
48966
  kind: "fixed",
48955
48967
  result: ["number"]
@@ -54679,10 +54691,11 @@ var IntegrationInstanceDescriptionSchema = object({
54679
54691
  /** True when `testInstance` really probes the remote. */
54680
54692
  canTest: boolean(),
54681
54693
  /**
54682
- * The kinds an instance can be of. Absent or one entry: nothing to choose; more than one: the
54683
- * Add flow asks which first and sends it as `createInstance.kind`.
54694
+ * The kinds an instance can be of (D1013 rule 1), each naming its `functionCap`. One entry:
54695
+ * nothing to choose; more than one: the Add flow asks which first and sends it as
54696
+ * `createInstance.kind`. Never empty: every instance belongs to exactly one kind.
54684
54697
  */
54685
- kinds: array(IntegrationInstanceKindSchema).optional(),
54698
+ kinds: array(IntegrationInstanceKindSchema).min(1),
54686
54699
  /**
54687
54700
  * The provider accepts `createInstance.id` for an id that once existed (an adopted id, because
54688
54701
  * devices carry it). The UI then offers "restore under its old id" on Add. Absent means no.
@@ -54718,8 +54731,8 @@ var IntegrationInstanceSchema = object({
54718
54731
  * the body is the one store, `setInstanceEnabled` the one writer (epic #440, step 3).
54719
54732
  */
54720
54733
  enabled: boolean().optional(),
54721
- /** The kind of this instance (one of `describe().kinds[].id`), when the provider has kinds. */
54722
- kind: string().optional(),
54734
+ /** The kind of this instance: exactly one of `describe().kinds[].id` (D1013 rule 2). */
54735
+ kind: string().min(1),
54723
54736
  /** Values for the instance form; a secret is a `SecretFieldView`, never text. */
54724
54737
  formValues: record(string(), unknown()),
54725
54738
  status: IntegrationInstanceStatusSchema.optional(),
@@ -71656,6 +71669,7 @@ var RemoteLayoutComponentSchema = object({
71656
71669
  });
71657
71670
  });
71658
71671
  method(object({}), array(RemoteLayoutComponentSchema), { auth: "protected" });
71672
+ DeviceType.MediaPlayer;
71659
71673
  var RunningStateSourceSchema = _enum(["native", "assigned"]);
71660
71674
  object({
71661
71675
  /** null = unknown — never coerced to false (D393). */
@@ -136195,7 +136209,14 @@ function buildMailboxInstances(records, deps) {
136195
136209
  role: "services",
136196
136210
  instanceMode: "multiple",
136197
136211
  kind: "mailbox",
136198
- canTest: true
136212
+ canTest: true,
136213
+ kinds: [{
136214
+ id: MAILBOX_INSTANCE_KIND,
136215
+ label: "Inbound mailbox (SMTP)",
136216
+ functionCap: "broker",
136217
+ role: "services",
136218
+ brokerKind: SMTP_INBOUND_KIND
136219
+ }]
136199
136220
  },
136200
136221
  formSchema: () => mailboxSettingsSchema(),
136201
136222
  initialBody: (name) => newMailboxBody(name),
@@ -145931,7 +145952,13 @@ var SmtpNodemailerAddon = class extends BaseAddon {
145931
145952
  role: "services",
145932
145953
  instanceMode: "multiple",
145933
145954
  kind: "relays",
145934
- canTest: true
145955
+ canTest: true,
145956
+ kinds: [{
145957
+ id: "relays",
145958
+ label: "SMTP relay",
145959
+ functionCap: "smtp-provider",
145960
+ role: "services"
145961
+ }]
145935
145962
  },
145936
145963
  formSchema: () => this.relayForm(),
145937
145964
  initialBody: (name) => ({
@@ -6042,7 +6042,7 @@ var ZodIssueCode = {
6042
6042
  var ZodFirstPartyTypeKind;
6043
6043
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
6044
6044
  //#endregion
6045
- //#region ../types/dist/sleep-7El4r5Bl.mjs
6045
+ //#region ../types/dist/sleep-CGPZyzB5.mjs
6046
6046
  /**
6047
6047
  * The audio chunk plane's byte format, and the ONE expansion from a coded
6048
6048
  * window to float samples (D455).
@@ -7258,6 +7258,7 @@ var RecordIntegrationInstances = class {
7258
7258
  this.secretKeys = topLevelSecretKeys(kind.declaration.secretPaths);
7259
7259
  this.secretMaps = secretMapKeys(kind.declaration.secretPaths);
7260
7260
  this.nameField = kind.declaration.entry?.nameField ?? "name";
7261
+ if (hooks.kindOf === void 0 && hooks.description.kinds.length !== 1) throw new Error(`record kind '${kind.name}': describe().kinds has ${hooks.description.kinds.length} entries, so kindOf is required to say which one an instance is`);
7261
7262
  }
7262
7263
  /**
7263
7264
  * One instance read for the addon's own runtime; null when absent. When the keychain is
@@ -7299,10 +7300,21 @@ var RecordIntegrationInstances = class {
7299
7300
  }
7300
7301
  return out;
7301
7302
  }
7303
+ /** The kind an instance body is of: the provider's `kindOf`, else its one declared kind. */
7304
+ kindOfBody(body) {
7305
+ if (this.hooks.kindOf !== void 0) {
7306
+ const id = this.hooks.kindOf(body);
7307
+ if (!this.hooks.description.kinds.some((declared) => declared.id === id)) throw new Error(`record kind '${this.kind.name}': kindOf returned '${id}', which describe().kinds does not declare (D1013)`);
7308
+ return id;
7309
+ }
7310
+ const only = this.hooks.description.kinds[0];
7311
+ if (only === void 0) throw new Error(`record kind '${this.kind.name}' declares no kinds`);
7312
+ return only.id;
7313
+ }
7302
7314
  viewOf(record) {
7303
7315
  const shown = secretViewsOf(this.records.owner, this.kind.name, record.id, this.kind.declaration, record.data);
7304
7316
  const rawName = record.data[this.nameField];
7305
- const kind = this.hooks.kindOf?.(record.data);
7317
+ const kind = this.kindOfBody(record.data);
7306
7318
  const health = this.hooks.health?.(record.data, record.id);
7307
7319
  return {
7308
7320
  id: record.id,
@@ -7310,7 +7322,7 @@ var RecordIntegrationInstances = class {
7310
7322
  configured: this.hooks.configured(record.data),
7311
7323
  enabled: isInstanceEnabled(record.data),
7312
7324
  formValues: shown,
7313
- ...kind !== void 0 ? { kind } : {},
7325
+ kind,
7314
7326
  ...health?.status !== void 0 ? { status: health.status } : {},
7315
7327
  ...health?.lastCheckedAt !== void 0 ? { lastCheckedAt: health.lastCheckedAt } : {}
7316
7328
  };
@@ -48947,7 +48959,7 @@ DeviceType.MediaPlayer, method(deviceOnly, _void(), {
48947
48959
  kind: "mutation",
48948
48960
  auth: "protected"
48949
48961
  });
48950
- DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Heater, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Fan, DeviceType.Lock, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Gateway, DeviceType.Hub, DeviceType.Camera, DeviceType.Sensor, DeviceType.MediaPlayer, DeviceType.Vacuum, DeviceType.Generic, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.PetFountain, DeviceType.Fan, DeviceType.Humidifier, DeviceType.Climate, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder, DeviceType.Heater;
48962
+ DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.EventEmitter, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.PetFountain, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Heater, DeviceType.Dryer, DeviceType.Gateway, DeviceType.Camera, DeviceType.Fan, DeviceType.Lock, DeviceType.Camera, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Switch, DeviceType.Light, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.Gateway, DeviceType.Hub, DeviceType.Camera, DeviceType.Sensor, DeviceType.MediaPlayer, DeviceType.Vacuum, DeviceType.Generic, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.PetFountain, DeviceType.Fan, DeviceType.Humidifier, DeviceType.Climate, DeviceType.WaterHeater, DeviceType.MediaPlayer, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder, DeviceType.Heater, DeviceType.MediaPlayer;
48951
48963
  var NUMBER = {
48952
48964
  kind: "fixed",
48953
48965
  result: ["number"]
@@ -54677,10 +54689,11 @@ var IntegrationInstanceDescriptionSchema = object({
54677
54689
  /** True when `testInstance` really probes the remote. */
54678
54690
  canTest: boolean(),
54679
54691
  /**
54680
- * The kinds an instance can be of. Absent or one entry: nothing to choose; more than one: the
54681
- * Add flow asks which first and sends it as `createInstance.kind`.
54692
+ * The kinds an instance can be of (D1013 rule 1), each naming its `functionCap`. One entry:
54693
+ * nothing to choose; more than one: the Add flow asks which first and sends it as
54694
+ * `createInstance.kind`. Never empty: every instance belongs to exactly one kind.
54682
54695
  */
54683
- kinds: array(IntegrationInstanceKindSchema).optional(),
54696
+ kinds: array(IntegrationInstanceKindSchema).min(1),
54684
54697
  /**
54685
54698
  * The provider accepts `createInstance.id` for an id that once existed (an adopted id, because
54686
54699
  * devices carry it). The UI then offers "restore under its old id" on Add. Absent means no.
@@ -54716,8 +54729,8 @@ var IntegrationInstanceSchema = object({
54716
54729
  * the body is the one store, `setInstanceEnabled` the one writer (epic #440, step 3).
54717
54730
  */
54718
54731
  enabled: boolean().optional(),
54719
- /** The kind of this instance (one of `describe().kinds[].id`), when the provider has kinds. */
54720
- kind: string().optional(),
54732
+ /** The kind of this instance: exactly one of `describe().kinds[].id` (D1013 rule 2). */
54733
+ kind: string().min(1),
54721
54734
  /** Values for the instance form; a secret is a `SecretFieldView`, never text. */
54722
54735
  formValues: record(string(), unknown()),
54723
54736
  status: IntegrationInstanceStatusSchema.optional(),
@@ -71654,6 +71667,7 @@ var RemoteLayoutComponentSchema = object({
71654
71667
  });
71655
71668
  });
71656
71669
  method(object({}), array(RemoteLayoutComponentSchema), { auth: "protected" });
71670
+ DeviceType.MediaPlayer;
71657
71671
  var RunningStateSourceSchema = _enum(["native", "assigned"]);
71658
71672
  object({
71659
71673
  /** null = unknown — never coerced to false (D393). */
@@ -136193,7 +136207,14 @@ function buildMailboxInstances(records, deps) {
136193
136207
  role: "services",
136194
136208
  instanceMode: "multiple",
136195
136209
  kind: "mailbox",
136196
- canTest: true
136210
+ canTest: true,
136211
+ kinds: [{
136212
+ id: MAILBOX_INSTANCE_KIND,
136213
+ label: "Inbound mailbox (SMTP)",
136214
+ functionCap: "broker",
136215
+ role: "services",
136216
+ brokerKind: SMTP_INBOUND_KIND
136217
+ }]
136197
136218
  },
136198
136219
  formSchema: () => mailboxSettingsSchema(),
136199
136220
  initialBody: (name) => newMailboxBody(name),
@@ -145929,7 +145950,13 @@ var SmtpNodemailerAddon = class extends BaseAddon {
145929
145950
  role: "services",
145930
145951
  instanceMode: "multiple",
145931
145952
  kind: "relays",
145932
- canTest: true
145953
+ canTest: true,
145954
+ kinds: [{
145955
+ id: "relays",
145956
+ label: "SMTP relay",
145957
+ functionCap: "smtp-provider",
145958
+ role: "services"
145959
+ }]
145933
145960
  },
145934
145961
  formSchema: () => this.relayForm(),
145935
145962
  initialBody: (name) => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.2.153",
3
+ "version": "1.2.154",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",
@@ -59,7 +59,7 @@
59
59
  "smtp-server"
60
60
  ],
61
61
  "requires": {
62
- "server": ">=1.2.805"
62
+ "server": ">=1.2.810"
63
63
  }
64
64
  },
65
65
  "files": [