@camstack/addon-agent-ui 1.1.12 → 1.1.14
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
|
@@ -4629,7 +4629,7 @@ function _instanceof(cls, params = {}) {
|
|
|
4629
4629
|
return inst;
|
|
4630
4630
|
}
|
|
4631
4631
|
//#endregion
|
|
4632
|
-
//#region ../types/dist/sleep-
|
|
4632
|
+
//#region ../types/dist/sleep-MHm--th-.mjs
|
|
4633
4633
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
4634
4634
|
EventCategory["SystemBoot"] = "system.boot";
|
|
4635
4635
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -5891,6 +5891,7 @@ var CamStreamKindSchema = _enum([
|
|
|
5891
5891
|
"pull-rtsp",
|
|
5892
5892
|
"pull-rtmp",
|
|
5893
5893
|
"pull-http",
|
|
5894
|
+
"pull-flv",
|
|
5894
5895
|
"pull-rfc4571",
|
|
5895
5896
|
"push-annexb",
|
|
5896
5897
|
"derived"
|
|
@@ -7043,7 +7044,21 @@ var StorageLocationDeclarationSchema = object({
|
|
|
7043
7044
|
* slots (e.g. `recordingsLow` → `recordings`) so operators only need to
|
|
7044
7045
|
* configure the primary location.
|
|
7045
7046
|
*/
|
|
7046
|
-
defaultsTo: string().optional()
|
|
7047
|
+
defaultsTo: string().optional(),
|
|
7048
|
+
/**
|
|
7049
|
+
* Which node root the seeded `<id>:default` instance is placed under on a
|
|
7050
|
+
* FRESH install:
|
|
7051
|
+
* - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
|
|
7052
|
+
* the appData volume. Right for small/durable data (backups, logs, models).
|
|
7053
|
+
* - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
|
|
7054
|
+
* env is set, else falls back to the data root. Right for bulky, hot media
|
|
7055
|
+
* (recordings, event media) that should stay off the appData disk.
|
|
7056
|
+
*
|
|
7057
|
+
* Only affects the seeded default's `basePath`; operators can repoint any
|
|
7058
|
+
* location afterwards, and a `defaultsTo` slot inherits its parent's root
|
|
7059
|
+
* regardless of this field. Absent (the common case) is treated as `'data'`.
|
|
7060
|
+
*/
|
|
7061
|
+
defaultRoot: _enum(["data", "media"]).optional()
|
|
7047
7062
|
});
|
|
7048
7063
|
var DecoderStatsSchema = object({
|
|
7049
7064
|
inputFps: number(),
|
|
@@ -7890,6 +7905,10 @@ var RtspRestreamEntrySchema = object({
|
|
|
7890
7905
|
var BrokerRtspClientSchema = object({
|
|
7891
7906
|
sessionId: string(),
|
|
7892
7907
|
remoteAddr: string(),
|
|
7908
|
+
/** Client `User-Agent` (e.g. `recorder` for the recorder's RTSP pull), or
|
|
7909
|
+
* null/absent when the client sent none. Lets the UI label a consumer by
|
|
7910
|
+
* purpose. Optional so a client built against an older schema stays valid. */
|
|
7911
|
+
userAgent: string().nullish(),
|
|
7893
7912
|
playing: boolean(),
|
|
7894
7913
|
muted: boolean(),
|
|
7895
7914
|
connectedAt: number(),
|
|
@@ -9770,6 +9789,31 @@ var ReportMotionInputSchema = object({
|
|
|
9770
9789
|
regions: array(MotionRegionSchema).readonly().optional()
|
|
9771
9790
|
});
|
|
9772
9791
|
/**
|
|
9792
|
+
* Where a runner gets a camera's decoded frames (cross-node Phase 2,
|
|
9793
|
+
* restream-owner model — P2c).
|
|
9794
|
+
*
|
|
9795
|
+
* - `local-broker` (DEFAULT): today's path — subscribe to the co-located
|
|
9796
|
+
* stream-broker's shm frame plane. Every pre-P2c attach payload (no
|
|
9797
|
+
* `frameSource` key) parses to this, so the field is additive with zero
|
|
9798
|
+
* behavior change.
|
|
9799
|
+
* - `remote-restream`: the detect node is NOT the camera's source-owner.
|
|
9800
|
+
* The runner acquires the owner's COMPRESSED passthrough restream
|
|
9801
|
+
* (`streamBroker.getStreamWithCodec({video:'copy'})` — refcounted, the
|
|
9802
|
+
* double-pull guard) and decodes LOCALLY via a satellite frame plane +
|
|
9803
|
+
* pull-mode decoder session pinned to its own node. The shm ring stays
|
|
9804
|
+
* node-local; only H.264/H.265 packets cross the wire.
|
|
9805
|
+
* `hubHostnameOverride` mirrors the recorder's `recordingHubHostname`:
|
|
9806
|
+
* when set it overrides the `CAMSTACK_HUB_URL`-derived host the runner
|
|
9807
|
+
* dials for the owner's restream.
|
|
9808
|
+
*/
|
|
9809
|
+
var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal("local-broker") }), object({
|
|
9810
|
+
kind: literal("remote-restream"),
|
|
9811
|
+
/** The camera's source-owner node (slice 1: always the hub). */
|
|
9812
|
+
ownerNodeId: string(),
|
|
9813
|
+
/** Operator override for the owner host the runner dials. */
|
|
9814
|
+
hubHostnameOverride: string().optional()
|
|
9815
|
+
})]).describe("Per-camera frame-source mode for the runner (P2c)");
|
|
9816
|
+
/**
|
|
9773
9817
|
* Camera assignment payload sent by `addon-pipeline-orchestrator` to a
|
|
9774
9818
|
* specific runner instance via `attachCamera`. Carries everything the
|
|
9775
9819
|
* runner needs to subscribe to the local broker and execute inference.
|
|
@@ -9867,7 +9911,15 @@ var RunnerCameraConfigSchema = object({
|
|
|
9867
9911
|
*/
|
|
9868
9912
|
onboardMotionDrivesAnalyzer: boolean().default(true),
|
|
9869
9913
|
occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
|
|
9870
|
-
occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default)
|
|
9914
|
+
occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
|
|
9915
|
+
/**
|
|
9916
|
+
* Where this runner gets the camera's decoded frames (P2c). Defaulted so
|
|
9917
|
+
* every existing payload behaves as `local-broker` — the pre-Phase-2 path.
|
|
9918
|
+
* Populated with `remote-restream` by the orchestrator ONLY when the
|
|
9919
|
+
* camera's detect node differs from its source-owner (P2d, gated by the
|
|
9920
|
+
* `remoteSourcingNodes` rollout setting).
|
|
9921
|
+
*/
|
|
9922
|
+
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
|
|
9871
9923
|
});
|
|
9872
9924
|
motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
|
|
9873
9925
|
/**
|
|
@@ -12349,14 +12401,36 @@ var ChildLayoutEntrySchema = object({
|
|
|
12349
12401
|
collapsed: boolean().optional()
|
|
12350
12402
|
});
|
|
12351
12403
|
/** Cap-wire shape of a DeviceLink — structurally mirrors `DeviceLink` in
|
|
12352
|
-
* `device-management.ts`.
|
|
12404
|
+
* `device-management.ts`. Source is a union: a FIELD source copies a sibling
|
|
12405
|
+
* accessory's status field (`kind` optional/absent for wire compat); a
|
|
12406
|
+
* LITERAL source carries a per-device constant (no sibling is read); a
|
|
12407
|
+
* GLOBAL source (P2e) copies ANY device's status field, addressed by the
|
|
12408
|
+
* source device's full re-sync-stable `stableId`. */
|
|
12353
12409
|
var DeviceLinkSchema = object({
|
|
12354
12410
|
id: string(),
|
|
12355
|
-
source:
|
|
12356
|
-
|
|
12357
|
-
|
|
12358
|
-
|
|
12359
|
-
|
|
12411
|
+
source: union([
|
|
12412
|
+
object({
|
|
12413
|
+
kind: literal("field").optional(),
|
|
12414
|
+
sourceKey: string(),
|
|
12415
|
+
cap: string(),
|
|
12416
|
+
fieldPath: string()
|
|
12417
|
+
}),
|
|
12418
|
+
object({
|
|
12419
|
+
kind: literal("literal"),
|
|
12420
|
+
value: union([
|
|
12421
|
+
string(),
|
|
12422
|
+
number(),
|
|
12423
|
+
boolean(),
|
|
12424
|
+
_null()
|
|
12425
|
+
])
|
|
12426
|
+
}),
|
|
12427
|
+
object({
|
|
12428
|
+
kind: literal("global"),
|
|
12429
|
+
sourceStableId: string(),
|
|
12430
|
+
cap: string(),
|
|
12431
|
+
fieldPath: string()
|
|
12432
|
+
})
|
|
12433
|
+
]),
|
|
12360
12434
|
target: object({
|
|
12361
12435
|
cap: string(),
|
|
12362
12436
|
fieldPath: string(),
|
|
@@ -12599,7 +12673,10 @@ method(object({
|
|
|
12599
12673
|
}), _void(), {
|
|
12600
12674
|
kind: "mutation",
|
|
12601
12675
|
auth: "admin"
|
|
12602
|
-
}), method(object({
|
|
12676
|
+
}), method(object({
|
|
12677
|
+
deviceId: number(),
|
|
12678
|
+
includeSynthesizable: boolean().optional()
|
|
12679
|
+
}), object({ caps: array(object({
|
|
12603
12680
|
cap: string(),
|
|
12604
12681
|
fields: array(object({
|
|
12605
12682
|
path: string(),
|
|
@@ -12609,8 +12686,13 @@ method(object({
|
|
|
12609
12686
|
"boolean",
|
|
12610
12687
|
"enum"
|
|
12611
12688
|
]),
|
|
12612
|
-
enumValues: array(string()).optional()
|
|
12613
|
-
|
|
12689
|
+
enumValues: array(string()).optional(),
|
|
12690
|
+
item: boolean().optional()
|
|
12691
|
+
})).readonly(),
|
|
12692
|
+
itemArray: object({
|
|
12693
|
+
path: string(),
|
|
12694
|
+
keyField: string()
|
|
12695
|
+
}).optional()
|
|
12614
12696
|
})).readonly() }), { kind: "query" }), method(object({
|
|
12615
12697
|
deviceId: number(),
|
|
12616
12698
|
role: string().nullable()
|
|
@@ -12680,7 +12762,11 @@ method(object({
|
|
|
12680
12762
|
deviceId: number(),
|
|
12681
12763
|
entries: array(object({
|
|
12682
12764
|
capName: string(),
|
|
12683
|
-
kind: _enum([
|
|
12765
|
+
kind: _enum([
|
|
12766
|
+
"native",
|
|
12767
|
+
"wrapped",
|
|
12768
|
+
"linked"
|
|
12769
|
+
]),
|
|
12684
12770
|
providerAddonId: string(),
|
|
12685
12771
|
providerNodeId: string(),
|
|
12686
12772
|
nativeAddonId: string()
|
|
@@ -12689,7 +12775,11 @@ method(object({
|
|
|
12689
12775
|
deviceId: number(),
|
|
12690
12776
|
entries: array(object({
|
|
12691
12777
|
capName: string(),
|
|
12692
|
-
kind: _enum([
|
|
12778
|
+
kind: _enum([
|
|
12779
|
+
"native",
|
|
12780
|
+
"wrapped",
|
|
12781
|
+
"linked"
|
|
12782
|
+
]),
|
|
12693
12783
|
providerAddonId: string(),
|
|
12694
12784
|
providerNodeId: string(),
|
|
12695
12785
|
nativeAddonId: string()
|
|
@@ -13179,7 +13269,7 @@ var AddBrokerInputSchema = object({
|
|
|
13179
13269
|
});
|
|
13180
13270
|
var AddBrokerResultSchema = object({ id: string() });
|
|
13181
13271
|
var IdInputSchema = object({ id: string() });
|
|
13182
|
-
var TestResultSchema = discriminatedUnion("ok", [object({
|
|
13272
|
+
var TestResultSchema$1 = discriminatedUnion("ok", [object({
|
|
13183
13273
|
ok: literal(true),
|
|
13184
13274
|
latencyMs: number()
|
|
13185
13275
|
}), object({
|
|
@@ -13202,7 +13292,7 @@ var StatusSchema = object({
|
|
|
13202
13292
|
brokerCount: number(),
|
|
13203
13293
|
embeddedRunning: boolean()
|
|
13204
13294
|
});
|
|
13205
|
-
method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
|
|
13295
|
+
method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema$1, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
|
|
13206
13296
|
var NetworkEndpointSchema = object({
|
|
13207
13297
|
url: string(),
|
|
13208
13298
|
hostname: string(),
|
|
@@ -13236,23 +13326,198 @@ var NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
|
|
|
13236
13326
|
sourcePort: number().optional()
|
|
13237
13327
|
});
|
|
13238
13328
|
method(_void(), NetworkEndpointSchema, { kind: "mutation" }), method(_void(), _void(), { kind: "mutation" }), method(_void(), NetworkEndpointSchema.nullable()), method(_void(), NetworkAccessStatusSchema), method(_void(), array(NetworkEndpointEntrySchema).readonly());
|
|
13239
|
-
|
|
13240
|
-
|
|
13329
|
+
/**
|
|
13330
|
+
* notification-output — canonical, capability-gated notification delivery.
|
|
13331
|
+
*
|
|
13332
|
+
* Apprise-derived model (see
|
|
13333
|
+
* `docs/superpowers/specs/2026-07-03-notification-output-notifier-matrix.md`):
|
|
13334
|
+
* callers emit ONE canonical `Notification`; each provider declares a
|
|
13335
|
+
* per-kind capability descriptor (`TargetKind`), and the pure degrade
|
|
13336
|
+
* engine (`@camstack/types` `prepareNotification`) transcodes / degrades the
|
|
13337
|
+
* message to what the kind supports — callers never special-case a service.
|
|
13338
|
+
*
|
|
13339
|
+
* DESIGN DECISIONS (locked):
|
|
13340
|
+
* - Target CRUD lives on THIS cap (`upsertTarget` / `deleteTarget` /
|
|
13341
|
+
* `setTargetEnabled`), each provider persisting via the `settings-store`
|
|
13342
|
+
* cap. Rationale: the admin UI needs one uniform surface across the
|
|
13343
|
+
* notifiers addon AND the HA addon; the addon-`globalSettingsSchema`-array
|
|
13344
|
+
* alternative would fork the UI per addon and cannot host the
|
|
13345
|
+
* discovery→adopt flow.
|
|
13346
|
+
* - `listTargetKinds` / `listTargets` / `discoverTargets` return arrays →
|
|
13347
|
+
* the generated cap-mount auto-`concatCollection`-fans them across every
|
|
13348
|
+
* registered provider (notifiers addon + HA addon) so one catalog is
|
|
13349
|
+
* routable. `send` / `testTarget` / CRUD route to ONE provider by the
|
|
13350
|
+
* `addonId` the generated collection router extracts from the call input.
|
|
13351
|
+
* - `Attachment.bytes` is `Uint8Array`. Transport-safe: superjson (the tRPC
|
|
13352
|
+
* transformer) + UDS MsgPack both round-trip typed arrays — already used by
|
|
13353
|
+
* `storage` / `storage-provider` / `recording` caps over the same path. No
|
|
13354
|
+
* base64 fallback needed.
|
|
13355
|
+
*
|
|
13356
|
+
* TODO (deferred, closed-set change — separate decision): add
|
|
13357
|
+
* `providerKind: 'notify'` so notification providers surface on the unified
|
|
13358
|
+
* admin "Integrations" page.
|
|
13359
|
+
*/
|
|
13360
|
+
/**
|
|
13361
|
+
* Zentik-derived typed-media enum — the superset across every kind. Each
|
|
13362
|
+
* adapter picks what it supports and the degrade engine filters the rest.
|
|
13363
|
+
*/
|
|
13364
|
+
var AttachmentMediaTypeSchema = _enum([
|
|
13365
|
+
"image",
|
|
13366
|
+
"video",
|
|
13367
|
+
"gif",
|
|
13368
|
+
"audio",
|
|
13369
|
+
"icon"
|
|
13370
|
+
]);
|
|
13371
|
+
/**
|
|
13372
|
+
* A single attachment. Exactly one of `url` (remote source, most adapters
|
|
13373
|
+
* prefer this) or `bytes` (inline source; required for Pushover-style
|
|
13374
|
+
* bytes-only kinds) MUST be present — the degrade engine expresses a
|
|
13375
|
+
* url→bytes fetch as a `needsFetch` directive the adapter executes.
|
|
13376
|
+
*/
|
|
13377
|
+
var AttachmentSchema = object({
|
|
13378
|
+
mediaType: AttachmentMediaTypeSchema,
|
|
13379
|
+
url: string().optional(),
|
|
13380
|
+
bytes: _instanceof(Uint8Array).optional(),
|
|
13381
|
+
mime: string().optional(),
|
|
13382
|
+
name: string().optional()
|
|
13383
|
+
}).refine((a) => a.url !== void 0 || a.bytes !== void 0, { message: "Attachment requires either `url` or `bytes`" });
|
|
13384
|
+
var NotificationFormatSchema = _enum([
|
|
13385
|
+
"text",
|
|
13386
|
+
"markdown",
|
|
13387
|
+
"html"
|
|
13388
|
+
]);
|
|
13389
|
+
/** A single tap-through action button. */
|
|
13390
|
+
var NotificationActionSchema = object({
|
|
13391
|
+
id: string(),
|
|
13392
|
+
label: string(),
|
|
13393
|
+
url: string().optional()
|
|
13394
|
+
});
|
|
13395
|
+
/**
|
|
13396
|
+
* The canonical notification. `body` is the only hard field (Apprise model).
|
|
13397
|
+
* `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
|
|
13398
|
+
* NOT a fixed severity enum — each kind declares its own `caps.levels` and
|
|
13399
|
+
* the adapter maps this ordinal onto its native level. `level?` is an
|
|
13400
|
+
* optional kind-native level id (`emergency`, `silent`, …) that overrides
|
|
13401
|
+
* `priority` for that one target.
|
|
13402
|
+
*/
|
|
13403
|
+
var NotificationSchema = object({
|
|
13241
13404
|
body: string(),
|
|
13242
|
-
|
|
13405
|
+
title: string().optional(),
|
|
13406
|
+
format: NotificationFormatSchema.default("text"),
|
|
13407
|
+
priority: number().int().min(1).max(5).default(3),
|
|
13408
|
+
level: string().optional(),
|
|
13409
|
+
attachments: array(AttachmentSchema).optional(),
|
|
13410
|
+
clickUrl: string().optional(),
|
|
13411
|
+
actions: array(NotificationActionSchema).optional(),
|
|
13412
|
+
sound: string().optional(),
|
|
13413
|
+
ttl: number().optional(),
|
|
13414
|
+
tag: string().optional(),
|
|
13243
13415
|
deviceId: number().optional(),
|
|
13244
13416
|
eventId: string().optional(),
|
|
13245
|
-
priority: _enum([
|
|
13246
|
-
"low",
|
|
13247
|
-
"normal",
|
|
13248
|
-
"high",
|
|
13249
|
-
"critical"
|
|
13250
|
-
]).default("normal"),
|
|
13251
13417
|
metadata: record(string(), unknown()).optional()
|
|
13252
|
-
})
|
|
13418
|
+
});
|
|
13419
|
+
/** One declared native severity/priority level for a kind. */
|
|
13420
|
+
var TargetKindLevelSchema = object({
|
|
13421
|
+
id: string(),
|
|
13422
|
+
label: string(),
|
|
13423
|
+
/** Which canonical priority (1..5) this level maps to. `null` = qualitative-only. */
|
|
13424
|
+
ordinal: number().int().min(1).max(5).nullable(),
|
|
13425
|
+
flags: object({
|
|
13426
|
+
critical: boolean().optional(),
|
|
13427
|
+
silent: boolean().optional(),
|
|
13428
|
+
noPush: boolean().optional()
|
|
13429
|
+
}).optional(),
|
|
13430
|
+
/** e.g. Pushover `emergency` requires `retry` / `expire`. */
|
|
13431
|
+
requires: array(string()).optional(),
|
|
13432
|
+
description: string().optional()
|
|
13433
|
+
});
|
|
13434
|
+
/** The full capability block consulted before dispatch. */
|
|
13435
|
+
var TargetKindCapsSchema = object({
|
|
13436
|
+
attachments: object({
|
|
13437
|
+
mediaTypes: array(AttachmentMediaTypeSchema),
|
|
13438
|
+
mode: _enum([
|
|
13439
|
+
"url",
|
|
13440
|
+
"bytes",
|
|
13441
|
+
"both"
|
|
13442
|
+
]),
|
|
13443
|
+
max: number().int().nonnegative(),
|
|
13444
|
+
maxBytes: number().int().positive().optional()
|
|
13445
|
+
}),
|
|
13446
|
+
/** Max action buttons (0 = none). */
|
|
13447
|
+
actions: number().int().nonnegative(),
|
|
13448
|
+
levels: array(TargetKindLevelSchema),
|
|
13449
|
+
format: array(NotificationFormatSchema),
|
|
13450
|
+
clickUrl: boolean(),
|
|
13451
|
+
sound: boolean(),
|
|
13452
|
+
ttl: boolean(),
|
|
13453
|
+
bodyMaxLen: number().int().positive()
|
|
13454
|
+
});
|
|
13455
|
+
/**
|
|
13456
|
+
* `configSchema` is a `ConfigUISchema` tree passed through to the admin
|
|
13457
|
+
* FormBuilder. Stored as `z.unknown()` at the cap seam (mirrors
|
|
13458
|
+
* `device-provider.getChildCreationSchema` `CreationSchemaOutputSchema`) —
|
|
13459
|
+
* the union is large and not meant for runtime validation here; the exported
|
|
13460
|
+
* `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
|
|
13461
|
+
*/
|
|
13462
|
+
var ConfigSchemaPassthrough = unknown();
|
|
13463
|
+
var TargetKindSchema = object({
|
|
13464
|
+
kind: string(),
|
|
13465
|
+
label: string(),
|
|
13466
|
+
icon: string(),
|
|
13467
|
+
/** Stamped by each provider so the concat-fanned catalog stays routable. */
|
|
13468
|
+
addonId: string(),
|
|
13469
|
+
configSchema: ConfigSchemaPassthrough,
|
|
13470
|
+
supportsDiscovery: boolean(),
|
|
13471
|
+
caps: TargetKindCapsSchema
|
|
13472
|
+
});
|
|
13473
|
+
/**
|
|
13474
|
+
* A persisted target. `config` holds secrets; providers REDACT secret fields
|
|
13475
|
+
* (return a presence marker only) when serving `listTargets` — never
|
|
13476
|
+
* round-trip a stored secret to the UI.
|
|
13477
|
+
*/
|
|
13478
|
+
var TargetSchema = object({
|
|
13479
|
+
id: string(),
|
|
13480
|
+
name: string(),
|
|
13481
|
+
kind: string(),
|
|
13482
|
+
addonId: string(),
|
|
13483
|
+
enabled: boolean(),
|
|
13484
|
+
config: record(string(), unknown())
|
|
13485
|
+
});
|
|
13486
|
+
/** A discovery-surfaced candidate (config is partial + non-secret). */
|
|
13487
|
+
var DiscoveredTargetSchema = object({
|
|
13488
|
+
kind: string(),
|
|
13489
|
+
suggestedName: string(),
|
|
13490
|
+
config: record(string(), unknown())
|
|
13491
|
+
});
|
|
13492
|
+
/** The degrade engine's report — what was resolved / dropped / degraded. */
|
|
13493
|
+
var RenderedAsSchema = object({
|
|
13494
|
+
level: string(),
|
|
13495
|
+
format: NotificationFormatSchema,
|
|
13496
|
+
attachmentsSent: number().int().nonnegative(),
|
|
13497
|
+
actionsSent: number().int().nonnegative(),
|
|
13498
|
+
truncated: boolean(),
|
|
13499
|
+
dropped: array(string())
|
|
13500
|
+
});
|
|
13501
|
+
var SendResultSchema = object({
|
|
13253
13502
|
success: boolean(),
|
|
13254
|
-
error: string().optional()
|
|
13255
|
-
|
|
13503
|
+
error: string().optional(),
|
|
13504
|
+
renderedAs: RenderedAsSchema.optional()
|
|
13505
|
+
});
|
|
13506
|
+
/** Same shape as SendResult — kept as a distinct name for the test panel. */
|
|
13507
|
+
var TestResultSchema = SendResultSchema;
|
|
13508
|
+
method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema)), method(object({
|
|
13509
|
+
kind: string(),
|
|
13510
|
+
config: record(string(), unknown()).optional()
|
|
13511
|
+
}), array(DiscoveredTargetSchema)), method(object({
|
|
13512
|
+
targetId: string(),
|
|
13513
|
+
notification: NotificationSchema
|
|
13514
|
+
}), SendResultSchema, { kind: "mutation" }), method(object({
|
|
13515
|
+
targetId: string(),
|
|
13516
|
+
sample: NotificationSchema.optional()
|
|
13517
|
+
}), TestResultSchema, { kind: "mutation" }), method(object({ target: TargetSchema }), TargetSchema, { kind: "mutation" }), method(object({ targetId: string() }), _void(), { kind: "mutation" }), method(object({
|
|
13518
|
+
targetId: string(),
|
|
13519
|
+
enabled: boolean()
|
|
13520
|
+
}), _void(), { kind: "mutation" });
|
|
13256
13521
|
/**
|
|
13257
13522
|
* Zod schemas for persisted record types.
|
|
13258
13523
|
*
|
|
@@ -16441,6 +16706,16 @@ DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceI
|
|
|
16441
16706
|
kind: "mutation",
|
|
16442
16707
|
auth: "admin"
|
|
16443
16708
|
});
|
|
16709
|
+
/**
|
|
16710
|
+
* `recording` cap — footage availability + HLS playback manifests + per-device
|
|
16711
|
+
* recording config. NOTE on events (source of truth, R5/C3): this cap carries
|
|
16712
|
+
* NO event surface — `getPlaybackManifest` returns playlist URLs only. Timeline
|
|
16713
|
+
* events (motion/object/audio) come from `pipelineAnalytics` (durable SQLite
|
|
16714
|
+
* rows); the recorder's internal EventMap markers are ephemeral in-RAM
|
|
16715
|
+
* annotations that are not exposed here and must not be treated as an event
|
|
16716
|
+
* feed. Event<->footage joins are by time, padded with the shared `EVENT_PAD_MS`
|
|
16717
|
+
* (`interfaces/recording-config.ts`).
|
|
16718
|
+
*/
|
|
16444
16719
|
var RecordingStatusSchema = object({
|
|
16445
16720
|
deviceId: number(),
|
|
16446
16721
|
enabled: boolean(),
|
|
@@ -19247,13 +19522,49 @@ Object.freeze({
|
|
|
19247
19522
|
addonId: null,
|
|
19248
19523
|
access: "create"
|
|
19249
19524
|
},
|
|
19525
|
+
"notificationOutput.deleteTarget": {
|
|
19526
|
+
capName: "notification-output",
|
|
19527
|
+
capScope: "system",
|
|
19528
|
+
addonId: null,
|
|
19529
|
+
access: "delete"
|
|
19530
|
+
},
|
|
19531
|
+
"notificationOutput.discoverTargets": {
|
|
19532
|
+
capName: "notification-output",
|
|
19533
|
+
capScope: "system",
|
|
19534
|
+
addonId: null,
|
|
19535
|
+
access: "view"
|
|
19536
|
+
},
|
|
19537
|
+
"notificationOutput.listTargetKinds": {
|
|
19538
|
+
capName: "notification-output",
|
|
19539
|
+
capScope: "system",
|
|
19540
|
+
addonId: null,
|
|
19541
|
+
access: "view"
|
|
19542
|
+
},
|
|
19543
|
+
"notificationOutput.listTargets": {
|
|
19544
|
+
capName: "notification-output",
|
|
19545
|
+
capScope: "system",
|
|
19546
|
+
addonId: null,
|
|
19547
|
+
access: "view"
|
|
19548
|
+
},
|
|
19250
19549
|
"notificationOutput.send": {
|
|
19251
19550
|
capName: "notification-output",
|
|
19252
19551
|
capScope: "system",
|
|
19253
19552
|
addonId: null,
|
|
19254
19553
|
access: "create"
|
|
19255
19554
|
},
|
|
19256
|
-
"notificationOutput.
|
|
19555
|
+
"notificationOutput.setTargetEnabled": {
|
|
19556
|
+
capName: "notification-output",
|
|
19557
|
+
capScope: "system",
|
|
19558
|
+
addonId: null,
|
|
19559
|
+
access: "create"
|
|
19560
|
+
},
|
|
19561
|
+
"notificationOutput.testTarget": {
|
|
19562
|
+
capName: "notification-output",
|
|
19563
|
+
capScope: "system",
|
|
19564
|
+
addonId: null,
|
|
19565
|
+
access: "create"
|
|
19566
|
+
},
|
|
19567
|
+
"notificationOutput.upsertTarget": {
|
|
19257
19568
|
capName: "notification-output",
|
|
19258
19569
|
capScope: "system",
|
|
19259
19570
|
addonId: null,
|
|
@@ -21259,7 +21570,7 @@ var AgentUIAddon = class extends BaseAddon {
|
|
|
21259
21570
|
capability: adminUiCapability,
|
|
21260
21571
|
provider: {
|
|
21261
21572
|
getStaticDir: async () => ({ staticDir: path.resolve(__dirname) }),
|
|
21262
|
-
getVersion: async () => ({ version: "1.1.
|
|
21573
|
+
getVersion: async () => ({ version: "1.1.14" })
|
|
21263
21574
|
}
|
|
21264
21575
|
}];
|
|
21265
21576
|
}
|