@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 +82 -7
- package/dist/addon.mjs +82 -7
- package/package.json +1 -1
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(
|
|
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, {
|
|
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(
|
|
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, {
|
|
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.
|
|
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",
|