@camstack/addon-notifiers 1.2.56 → 1.2.59

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/dist/addon.js CHANGED
@@ -7851,7 +7851,8 @@ var OpsLogReasonSchema = _enum([
7851
7851
  "quota",
7852
7852
  "manual",
7853
7853
  "operator",
7854
- "maintenance"
7854
+ "maintenance",
7855
+ "orphaned-device"
7855
7856
  ]);
7856
7857
  /** One audit row, shared verbatim by both domains. */
7857
7858
  var OpsLogEntrySchema = object({
@@ -12923,10 +12924,39 @@ var DevicePersistConfigPayloadSchema = object({
12923
12924
  deviceId: number(),
12924
12925
  data: record(string(), unknown())
12925
12926
  });
12927
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12928
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12929
+ var MigrateSwitchOutcomeSchema = _enum([
12930
+ "off",
12931
+ "on",
12932
+ "not-offered",
12933
+ "unreachable"
12934
+ ]);
12935
+ var MigrateSwitchReportSchema = object({
12936
+ deviceId: number(),
12937
+ switchId: CameraSwitchIdSchema,
12938
+ outcome: MigrateSwitchOutcomeSchema,
12939
+ detail: string().optional()
12940
+ });
12941
+ var MigrateDeviceResultSchema = object({
12942
+ sourceId: number(),
12943
+ targetId: number(),
12944
+ switches: array(MigrateSwitchReportSchema).readonly(),
12945
+ /** Switches that could NOT be turned off on the source. Empty is the only
12946
+ * value meaning the replaced hardware is quiet. */
12947
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
12948
+ swapped: boolean()
12949
+ });
12926
12950
  method(object({
12927
12951
  addonId: string(),
12928
12952
  stableId: string()
12929
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
12953
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
12954
+ sourceId: number(),
12955
+ targetId: number()
12956
+ }), MigrateDeviceResultSchema, {
12957
+ kind: "mutation",
12958
+ auth: "admin"
12959
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
12930
12960
  deviceId: number(),
12931
12961
  name: string()
12932
12962
  }), _void(), {
@@ -13401,6 +13431,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13401
13431
  auth: "admin"
13402
13432
  });
13403
13433
  /**
13434
+ * Transport bounds for AI capability methods.
13435
+ *
13436
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13437
+ * each other: declaring the constant in either one hands the other `undefined`
13438
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13439
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13440
+ * reintroduced invisibly. Found by the guard, not by review.
13441
+ */
13442
+ /**
13443
+ * Ceiling for a cap method that runs inference or loads a model.
13444
+ *
13445
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13446
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13447
+ * never be the layer that gives up first: when it does, the failure is
13448
+ * reported as a transport error for a model that was still thinking, naming
13449
+ * the wrong layer and hiding the real one.
13450
+ *
13451
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13452
+ * more on a cold model load. With no declaration every digest failed at
13453
+ * exactly 60 s and shipped without its text.
13454
+ *
13455
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13456
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13457
+ * decide when to stop, because only they can say WHY.
13458
+ */
13459
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13460
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13461
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13462
+ /**
13404
13463
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13405
13464
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13406
13465
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13672,16 +13731,19 @@ method(LlmGenerateBaseInputSchema.extend({
13672
13731
  timeoutMs: number().int().positive().optional()
13673
13732
  }), LlmGenerateResultSchema, {
13674
13733
  kind: "mutation",
13675
- auth: "admin"
13734
+ auth: "admin",
13735
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13676
13736
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13677
13737
  kind: "mutation",
13678
- auth: "admin"
13738
+ auth: "admin",
13739
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13679
13740
  }), method(object({}), _void(), {
13680
13741
  kind: "mutation",
13681
13742
  auth: "admin"
13682
13743
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13683
13744
  kind: "mutation",
13684
- auth: "admin"
13745
+ auth: "admin",
13746
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13685
13747
  }), method(object({ file: string() }), _void(), {
13686
13748
  kind: "mutation",
13687
13749
  auth: "admin"
@@ -13849,7 +13911,13 @@ var ProfileRefInputSchema = object({
13849
13911
  addonId: string(),
13850
13912
  profileId: string()
13851
13913
  });
13852
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
13914
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
13915
+ kind: "mutation",
13916
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13917
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
13918
+ kind: "mutation",
13919
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13920
+ }), method(object({
13853
13921
  addonId: string().optional(),
13854
13922
  requestId: string()
13855
13923
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13860,7 +13928,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13860
13928
  auth: "admin"
13861
13929
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13862
13930
  kind: "mutation",
13863
- auth: "admin"
13931
+ auth: "admin",
13932
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13864
13933
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13865
13934
  selector: LlmDefaultSelectorSchema,
13866
13935
  profileId: string().nullable()
@@ -30443,6 +30512,12 @@ Object.freeze({
30443
30512
  addonId: null,
30444
30513
  access: "view"
30445
30514
  },
30515
+ "deviceManager.migrateDevice": {
30516
+ capName: "device-manager",
30517
+ capScope: "system",
30518
+ addonId: null,
30519
+ access: "create"
30520
+ },
30446
30521
  "deviceManager.persistConfig": {
30447
30522
  capName: "device-manager",
30448
30523
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -7824,7 +7824,8 @@ var OpsLogReasonSchema = _enum([
7824
7824
  "quota",
7825
7825
  "manual",
7826
7826
  "operator",
7827
- "maintenance"
7827
+ "maintenance",
7828
+ "orphaned-device"
7828
7829
  ]);
7829
7830
  /** One audit row, shared verbatim by both domains. */
7830
7831
  var OpsLogEntrySchema = object({
@@ -12896,10 +12897,39 @@ var DevicePersistConfigPayloadSchema = object({
12896
12897
  deviceId: number(),
12897
12898
  data: record(string(), unknown())
12898
12899
  });
12900
+ /** What a migration actually did, per switch. `unreachable` is a first-class
12901
+ * answer: a camera that could not be asked is not a camera that was silenced. */
12902
+ var MigrateSwitchOutcomeSchema = _enum([
12903
+ "off",
12904
+ "on",
12905
+ "not-offered",
12906
+ "unreachable"
12907
+ ]);
12908
+ var MigrateSwitchReportSchema = object({
12909
+ deviceId: number(),
12910
+ switchId: CameraSwitchIdSchema,
12911
+ outcome: MigrateSwitchOutcomeSchema,
12912
+ detail: string().optional()
12913
+ });
12914
+ var MigrateDeviceResultSchema = object({
12915
+ sourceId: number(),
12916
+ targetId: number(),
12917
+ switches: array(MigrateSwitchReportSchema).readonly(),
12918
+ /** Switches that could NOT be turned off on the source. Empty is the only
12919
+ * value meaning the replaced hardware is quiet. */
12920
+ sourceStillLive: array(CameraSwitchIdSchema).readonly(),
12921
+ swapped: boolean()
12922
+ });
12899
12923
  method(object({
12900
12924
  addonId: string(),
12901
12925
  stableId: string()
12902
- }), object({ id: number() }), { kind: "mutation" }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
12926
+ }), object({ id: number() }), { kind: "mutation" }), method(object({
12927
+ sourceId: number(),
12928
+ targetId: number()
12929
+ }), MigrateDeviceResultSchema, {
12930
+ kind: "mutation",
12931
+ auth: "admin"
12932
+ }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
12903
12933
  deviceId: number(),
12904
12934
  name: string()
12905
12935
  }), _void(), {
@@ -13374,6 +13404,35 @@ method(_void(), array(string()).readonly(), { auth: "admin" }), method(object({
13374
13404
  auth: "admin"
13375
13405
  });
13376
13406
  /**
13407
+ * Transport bounds for AI capability methods.
13408
+ *
13409
+ * Its own module because `llm.cap.ts` and `llm-runtime.cap.ts` already import
13410
+ * each other: declaring the constant in either one hands the other `undefined`
13411
+ * at module-init time, and an undefined `timeoutMs` silently falls back to the
13412
+ * kernel's 60 s default — the exact failure this constant exists to prevent,
13413
+ * reintroduced invisibly. Found by the guard, not by review.
13414
+ */
13415
+ /**
13416
+ * Ceiling for a cap method that runs inference or loads a model.
13417
+ *
13418
+ * Deliberately far above anything the AI layer itself may wait for (a summary
13419
+ * asks 180 s by default, a rule may ask 600 s), because the TRANSPORT must
13420
+ * never be the layer that gives up first: when it does, the failure is
13421
+ * reported as a transport error for a model that was still thinking, naming
13422
+ * the wrong layer and hiding the real one.
13423
+ *
13424
+ * Measured 2026-09-03: a 6-image vision request needs 44.8 s warm and ~20 s
13425
+ * more on a cold model load. With no declaration every digest failed at
13426
+ * exactly 60 s and shipped without its text.
13427
+ *
13428
+ * A ceiling, not a budget. The AI layer's own timeouts (the rule's `timeoutMs`,
13429
+ * the profile's `timeoutMs` / `firstTokenTimeoutMs`) remain the things that
13430
+ * decide when to stop, because only they can say WHY.
13431
+ */
13432
+ var AI_CAP_TRANSPORT_TIMEOUT_MS = 6e5;
13433
+ /** A multi-gigabyte download. An hour is not generous, it is honest. */
13434
+ var AI_MODEL_INSTALL_TIMEOUT_MS = 60 * 6e4;
13435
+ /**
13377
13436
  * Shared LLM generate contracts — imported by BOTH `llm.cap.ts` (consumer
13378
13437
  * surface) and `llm-runtime.cap.ts` (node-side managed executor) so the two
13379
13438
  * caps stay wire-compatible without a circular cap→cap import.
@@ -13645,16 +13704,19 @@ method(LlmGenerateBaseInputSchema.extend({
13645
13704
  timeoutMs: number().int().positive().optional()
13646
13705
  }), LlmGenerateResultSchema, {
13647
13706
  kind: "mutation",
13648
- auth: "admin"
13707
+ auth: "admin",
13708
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13649
13709
  }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13650
13710
  kind: "mutation",
13651
- auth: "admin"
13711
+ auth: "admin",
13712
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13652
13713
  }), method(object({}), _void(), {
13653
13714
  kind: "mutation",
13654
13715
  auth: "admin"
13655
13716
  }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13656
13717
  kind: "mutation",
13657
- auth: "admin"
13718
+ auth: "admin",
13719
+ timeoutMs: AI_MODEL_INSTALL_TIMEOUT_MS
13658
13720
  }), method(object({ file: string() }), _void(), {
13659
13721
  kind: "mutation",
13660
13722
  auth: "admin"
@@ -13822,7 +13884,13 @@ var ProfileRefInputSchema = object({
13822
13884
  addonId: string(),
13823
13885
  profileId: string()
13824
13886
  });
13825
- method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, { kind: "mutation" }), method(object({
13887
+ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, {
13888
+ kind: "mutation",
13889
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13890
+ }), method(GenerateVisionInputSchema, LlmGenerateResultSchema, {
13891
+ kind: "mutation",
13892
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13893
+ }), method(object({
13826
13894
  addonId: string().optional(),
13827
13895
  requestId: string()
13828
13896
  }), _void(), { kind: "mutation" }), method(object({}), array(LlmProfileKindDescriptorSchema)), method(object({}), array(LlmProfileSchema)), method(object({ profile: LlmProfileSchema }), LlmProfileSchema, {
@@ -13833,7 +13901,8 @@ method(LlmGenerateBaseInputSchema, LlmGenerateResultSchema, { kind: "mutation" }
13833
13901
  auth: "admin"
13834
13902
  }), method(ProfileRefInputSchema, LlmGenerateResultSchema, {
13835
13903
  kind: "mutation",
13836
- auth: "admin"
13904
+ auth: "admin",
13905
+ timeoutMs: AI_CAP_TRANSPORT_TIMEOUT_MS
13837
13906
  }), method(ProfileRefInputSchema, array(string())), method(object({}), array(LlmDefaultSchema)), method(object({
13838
13907
  selector: LlmDefaultSelectorSchema,
13839
13908
  profileId: string().nullable()
@@ -30416,6 +30485,12 @@ Object.freeze({
30416
30485
  addonId: null,
30417
30486
  access: "view"
30418
30487
  },
30488
+ "deviceManager.migrateDevice": {
30489
+ capName: "device-manager",
30490
+ capScope: "system",
30491
+ addonId: null,
30492
+ access: "create"
30493
+ },
30419
30494
  "deviceManager.persistConfig": {
30420
30495
  capName: "device-manager",
30421
30496
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.56",
3
+ "version": "1.2.59",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",