@camstack/types 1.2.6 → 1.2.8

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.
@@ -0,0 +1,908 @@
1
+ import { z } from 'zod';
2
+ import { type InferProvider } from './capability-definition.js';
3
+ /**
4
+ * notification-rules — the Notification Center rule surface (P1 core).
5
+ *
6
+ * Spec: `docs/superpowers/specs/2026-07-22-notification-center-requirements.md`
7
+ * (operator decisions D-1/D-2/D-3 are binding):
8
+ *
9
+ * - D-2: rule EVALUATION lives in `addon-post-analysis` (the
10
+ * `notification-center` module), hooked on the durable persistence
11
+ * moments (object-event insert, TrackCloser.closeExpired) with a
12
+ * persisted outbox + retry — never the lossy telemetry bus (D8).
13
+ * - D-3: urgency belongs to the RULE. `delivery: 'immediate'` fires on the
14
+ * FIRST persisted detection matching the conditions (per-track dedup,
15
+ * `maxPerTrack` fixed at 1 — see {@link NC_MAX_PER_TRACK_IMMEDIATE});
16
+ * `delivery: 'track-end'` evaluates the finalized track record at close.
17
+ * - DISPATCH stays behind `notification-output` (rules reference targets
18
+ * by id; per-backend params are a passthrough blob capped by the
19
+ * target kind's own caps/degrade engine).
20
+ *
21
+ * P1 scope: admin-authored rules only (`createdBy` stamped from the
22
+ * server-injected caller identity — the first `caller: 'required'`
23
+ * adopter). The P1 condition subset is: devices, classes(+exclude),
24
+ * minConfidence, admin zones (any/all + exclude), weekly schedule
25
+ * windows, and the optional label/identity/plate matchers. User rules,
26
+ * private zones, per-recipient fan-out and the wider condition table are
27
+ * P2+ (see spec §7).
28
+ *
29
+ * All schemas here are the single source of truth — `NcRule` etc. are
30
+ * `z.infer` exports; no duplicate interfaces (the advanced-notifier
31
+ * schema/interface drift is explicitly not repeated).
32
+ */
33
+ /** D-3: the urgency of a rule — which persistence moment evaluates it. */
34
+ export declare const NcDeliverySchema: z.ZodEnum<{
35
+ immediate: "immediate";
36
+ "track-end": "track-end";
37
+ }>;
38
+ export type NcDelivery = z.infer<typeof NcDeliverySchema>;
39
+ /**
40
+ * `maxPerTrack` for `immediate` rules is FIXED at 1 (D-3): a single track
41
+ * fires an immediate rule at most once, enforced durably by the outbox
42
+ * unique key `(ruleId, trackId, targetId)`. Not a rule field in P1.
43
+ */
44
+ export declare const NC_MAX_PER_TRACK_IMMEDIATE = 1;
45
+ /** One weekly activation window. `startMinute > endMinute` crosses midnight. */
46
+ export declare const NcScheduleWindowSchema: z.ZodObject<{
47
+ days: z.ZodArray<z.ZodNumber>;
48
+ startMinute: z.ZodNumber;
49
+ endMinute: z.ZodNumber;
50
+ }, z.core.$strip>;
51
+ export type NcScheduleWindow = z.infer<typeof NcScheduleWindowSchema>;
52
+ /** Weekly schedule — OR of windows; absence on the rule = always active. */
53
+ export declare const NcScheduleSchema: z.ZodObject<{
54
+ windows: z.ZodArray<z.ZodObject<{
55
+ days: z.ZodArray<z.ZodNumber>;
56
+ startMinute: z.ZodNumber;
57
+ endMinute: z.ZodNumber;
58
+ }, z.core.$strip>>;
59
+ timezone: z.ZodOptional<z.ZodString>;
60
+ invert: z.ZodOptional<z.ZodBoolean>;
61
+ }, z.core.$strip>;
62
+ export type NcSchedule = z.infer<typeof NcScheduleSchema>;
63
+ /** Fuzzy plate matcher — OCR noise makes exact match useless (spec row 12/13). */
64
+ export declare const NcPlateMatcherSchema: z.ZodObject<{
65
+ values: z.ZodArray<z.ZodString>;
66
+ maxDistance: z.ZodDefault<z.ZodNumber>;
67
+ }, z.core.$strip>;
68
+ export type NcPlateMatcher = z.infer<typeof NcPlateMatcherSchema>;
69
+ /** Admin-zone membership condition (zone IDs as stamped by the ZoneEngine). */
70
+ export declare const NcZoneConditionSchema: z.ZodObject<{
71
+ ids: z.ZodArray<z.ZodString>;
72
+ match: z.ZodDefault<z.ZodEnum<{
73
+ any: "any";
74
+ all: "all";
75
+ }>>;
76
+ }, z.core.$strip>;
77
+ export type NcZoneCondition = z.infer<typeof NcZoneConditionSchema>;
78
+ /**
79
+ * The P1 condition set — a flat AND of groups; absent group = pass;
80
+ * membership lists are OR within the list (spec §2.3).
81
+ */
82
+ export declare const NcConditionsSchema: z.ZodObject<{
83
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
84
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
85
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
86
+ minConfidence: z.ZodOptional<z.ZodNumber>;
87
+ zones: z.ZodOptional<z.ZodObject<{
88
+ ids: z.ZodArray<z.ZodString>;
89
+ match: z.ZodDefault<z.ZodEnum<{
90
+ any: "any";
91
+ all: "all";
92
+ }>>;
93
+ }, z.core.$strip>>;
94
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
95
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
96
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
97
+ plates: z.ZodOptional<z.ZodObject<{
98
+ values: z.ZodArray<z.ZodString>;
99
+ maxDistance: z.ZodDefault<z.ZodNumber>;
100
+ }, z.core.$strip>>;
101
+ }, z.core.$strip>;
102
+ export type NcConditions = z.infer<typeof NcConditionsSchema>;
103
+ /** One delivery target: a `notification-output` Target ref + passthrough params. */
104
+ export declare const NcRuleTargetSchema: z.ZodObject<{
105
+ targetId: z.ZodString;
106
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
107
+ }, z.core.$strip>;
108
+ export type NcRuleTarget = z.infer<typeof NcRuleTargetSchema>;
109
+ /**
110
+ * Media attachment policy (P1 still-image subset). `best` = the best
111
+ * AVAILABLE media at dispatch time (D-3); `best-matching` (track-end
112
+ * condition-best) is deferred — operator open point.
113
+ */
114
+ export declare const NcMediaPolicySchema: z.ZodObject<{
115
+ attach: z.ZodDefault<z.ZodEnum<{
116
+ none: "none";
117
+ best: "best";
118
+ keyFrame: "keyFrame";
119
+ }>>;
120
+ }, z.core.$strip>;
121
+ export type NcMediaPolicy = z.infer<typeof NcMediaPolicySchema>;
122
+ /** Throttle — cooldown survives restarts (rebuilt from the outbox on boot). */
123
+ export declare const NcThrottleSchema: z.ZodObject<{
124
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
125
+ scope: z.ZodDefault<z.ZodEnum<{
126
+ rule: "rule";
127
+ "rule-device": "rule-device";
128
+ }>>;
129
+ }, z.core.$strip>;
130
+ export type NcThrottle = z.infer<typeof NcThrottleSchema>;
131
+ /** Client-supplied rule fields (server stamps id/createdBy/createdAt/updatedAt). */
132
+ export declare const NcRuleInputSchema: z.ZodObject<{
133
+ name: z.ZodString;
134
+ enabled: z.ZodDefault<z.ZodBoolean>;
135
+ delivery: z.ZodEnum<{
136
+ immediate: "immediate";
137
+ "track-end": "track-end";
138
+ }>;
139
+ conditions: z.ZodDefault<z.ZodObject<{
140
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
141
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
142
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
143
+ minConfidence: z.ZodOptional<z.ZodNumber>;
144
+ zones: z.ZodOptional<z.ZodObject<{
145
+ ids: z.ZodArray<z.ZodString>;
146
+ match: z.ZodDefault<z.ZodEnum<{
147
+ any: "any";
148
+ all: "all";
149
+ }>>;
150
+ }, z.core.$strip>>;
151
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
152
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
153
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
154
+ plates: z.ZodOptional<z.ZodObject<{
155
+ values: z.ZodArray<z.ZodString>;
156
+ maxDistance: z.ZodDefault<z.ZodNumber>;
157
+ }, z.core.$strip>>;
158
+ }, z.core.$strip>>;
159
+ schedule: z.ZodOptional<z.ZodObject<{
160
+ windows: z.ZodArray<z.ZodObject<{
161
+ days: z.ZodArray<z.ZodNumber>;
162
+ startMinute: z.ZodNumber;
163
+ endMinute: z.ZodNumber;
164
+ }, z.core.$strip>>;
165
+ timezone: z.ZodOptional<z.ZodString>;
166
+ invert: z.ZodOptional<z.ZodBoolean>;
167
+ }, z.core.$strip>>;
168
+ targets: z.ZodArray<z.ZodObject<{
169
+ targetId: z.ZodString;
170
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
171
+ }, z.core.$strip>>;
172
+ media: z.ZodDefault<z.ZodObject<{
173
+ attach: z.ZodDefault<z.ZodEnum<{
174
+ none: "none";
175
+ best: "best";
176
+ keyFrame: "keyFrame";
177
+ }>>;
178
+ }, z.core.$strip>>;
179
+ throttle: z.ZodDefault<z.ZodObject<{
180
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
181
+ scope: z.ZodDefault<z.ZodEnum<{
182
+ rule: "rule";
183
+ "rule-device": "rule-device";
184
+ }>>;
185
+ }, z.core.$strip>>;
186
+ template: z.ZodOptional<z.ZodObject<{
187
+ title: z.ZodOptional<z.ZodString>;
188
+ body: z.ZodOptional<z.ZodString>;
189
+ }, z.core.$strip>>;
190
+ priority: z.ZodDefault<z.ZodNumber>;
191
+ }, z.core.$strip>;
192
+ export type NcRuleInput = z.infer<typeof NcRuleInputSchema>;
193
+ /** Partial patch for `updateRule` — any subset of the input fields. */
194
+ export declare const NcRulePatchSchema: z.ZodObject<{
195
+ name: z.ZodOptional<z.ZodString>;
196
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
197
+ delivery: z.ZodOptional<z.ZodEnum<{
198
+ immediate: "immediate";
199
+ "track-end": "track-end";
200
+ }>>;
201
+ conditions: z.ZodOptional<z.ZodDefault<z.ZodObject<{
202
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
203
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
204
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
205
+ minConfidence: z.ZodOptional<z.ZodNumber>;
206
+ zones: z.ZodOptional<z.ZodObject<{
207
+ ids: z.ZodArray<z.ZodString>;
208
+ match: z.ZodDefault<z.ZodEnum<{
209
+ any: "any";
210
+ all: "all";
211
+ }>>;
212
+ }, z.core.$strip>>;
213
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
214
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
215
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
216
+ plates: z.ZodOptional<z.ZodObject<{
217
+ values: z.ZodArray<z.ZodString>;
218
+ maxDistance: z.ZodDefault<z.ZodNumber>;
219
+ }, z.core.$strip>>;
220
+ }, z.core.$strip>>>;
221
+ schedule: z.ZodOptional<z.ZodOptional<z.ZodObject<{
222
+ windows: z.ZodArray<z.ZodObject<{
223
+ days: z.ZodArray<z.ZodNumber>;
224
+ startMinute: z.ZodNumber;
225
+ endMinute: z.ZodNumber;
226
+ }, z.core.$strip>>;
227
+ timezone: z.ZodOptional<z.ZodString>;
228
+ invert: z.ZodOptional<z.ZodBoolean>;
229
+ }, z.core.$strip>>>;
230
+ targets: z.ZodOptional<z.ZodArray<z.ZodObject<{
231
+ targetId: z.ZodString;
232
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
233
+ }, z.core.$strip>>>;
234
+ media: z.ZodOptional<z.ZodDefault<z.ZodObject<{
235
+ attach: z.ZodDefault<z.ZodEnum<{
236
+ none: "none";
237
+ best: "best";
238
+ keyFrame: "keyFrame";
239
+ }>>;
240
+ }, z.core.$strip>>>;
241
+ throttle: z.ZodOptional<z.ZodDefault<z.ZodObject<{
242
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
243
+ scope: z.ZodDefault<z.ZodEnum<{
244
+ rule: "rule";
245
+ "rule-device": "rule-device";
246
+ }>>;
247
+ }, z.core.$strip>>>;
248
+ template: z.ZodOptional<z.ZodOptional<z.ZodObject<{
249
+ title: z.ZodOptional<z.ZodString>;
250
+ body: z.ZodOptional<z.ZodString>;
251
+ }, z.core.$strip>>>;
252
+ priority: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
253
+ }, z.core.$strip>;
254
+ export type NcRulePatch = z.infer<typeof NcRulePatchSchema>;
255
+ /** A persisted rule. */
256
+ export declare const NcRuleSchema: z.ZodObject<{
257
+ name: z.ZodString;
258
+ enabled: z.ZodDefault<z.ZodBoolean>;
259
+ delivery: z.ZodEnum<{
260
+ immediate: "immediate";
261
+ "track-end": "track-end";
262
+ }>;
263
+ conditions: z.ZodDefault<z.ZodObject<{
264
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
265
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
266
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
267
+ minConfidence: z.ZodOptional<z.ZodNumber>;
268
+ zones: z.ZodOptional<z.ZodObject<{
269
+ ids: z.ZodArray<z.ZodString>;
270
+ match: z.ZodDefault<z.ZodEnum<{
271
+ any: "any";
272
+ all: "all";
273
+ }>>;
274
+ }, z.core.$strip>>;
275
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
276
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
277
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
278
+ plates: z.ZodOptional<z.ZodObject<{
279
+ values: z.ZodArray<z.ZodString>;
280
+ maxDistance: z.ZodDefault<z.ZodNumber>;
281
+ }, z.core.$strip>>;
282
+ }, z.core.$strip>>;
283
+ schedule: z.ZodOptional<z.ZodObject<{
284
+ windows: z.ZodArray<z.ZodObject<{
285
+ days: z.ZodArray<z.ZodNumber>;
286
+ startMinute: z.ZodNumber;
287
+ endMinute: z.ZodNumber;
288
+ }, z.core.$strip>>;
289
+ timezone: z.ZodOptional<z.ZodString>;
290
+ invert: z.ZodOptional<z.ZodBoolean>;
291
+ }, z.core.$strip>>;
292
+ targets: z.ZodArray<z.ZodObject<{
293
+ targetId: z.ZodString;
294
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
295
+ }, z.core.$strip>>;
296
+ media: z.ZodDefault<z.ZodObject<{
297
+ attach: z.ZodDefault<z.ZodEnum<{
298
+ none: "none";
299
+ best: "best";
300
+ keyFrame: "keyFrame";
301
+ }>>;
302
+ }, z.core.$strip>>;
303
+ throttle: z.ZodDefault<z.ZodObject<{
304
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
305
+ scope: z.ZodDefault<z.ZodEnum<{
306
+ rule: "rule";
307
+ "rule-device": "rule-device";
308
+ }>>;
309
+ }, z.core.$strip>>;
310
+ template: z.ZodOptional<z.ZodObject<{
311
+ title: z.ZodOptional<z.ZodString>;
312
+ body: z.ZodOptional<z.ZodString>;
313
+ }, z.core.$strip>>;
314
+ priority: z.ZodDefault<z.ZodNumber>;
315
+ id: z.ZodString;
316
+ createdBy: z.ZodString;
317
+ createdAt: z.ZodNumber;
318
+ updatedAt: z.ZodNumber;
319
+ }, z.core.$strip>;
320
+ export type NcRule = z.infer<typeof NcRuleSchema>;
321
+ export declare const NcTestResultSchema: z.ZodObject<{
322
+ recordId: z.ZodString;
323
+ recordKind: z.ZodEnum<{
324
+ "object-event": "object-event";
325
+ track: "track";
326
+ }>;
327
+ deviceId: z.ZodNumber;
328
+ timestamp: z.ZodNumber;
329
+ wouldFire: z.ZodBoolean;
330
+ failedCondition: z.ZodOptional<z.ZodString>;
331
+ className: z.ZodOptional<z.ZodString>;
332
+ label: z.ZodOptional<z.ZodString>;
333
+ }, z.core.$strip>;
334
+ export type NcTestResult = z.infer<typeof NcTestResultSchema>;
335
+ export declare const NcConditionDescriptorSchema: z.ZodObject<{
336
+ id: z.ZodString;
337
+ group: z.ZodEnum<{
338
+ label: "label";
339
+ scope: "scope";
340
+ class: "class";
341
+ schedule: "schedule";
342
+ zones: "zones";
343
+ quality: "quality";
344
+ }>;
345
+ label: z.ZodString;
346
+ valueType: z.ZodEnum<{
347
+ schedule: "schedule";
348
+ deviceIdList: "deviceIdList";
349
+ stringList: "stringList";
350
+ number01: "number01";
351
+ zoneSelection: "zoneSelection";
352
+ zoneIdList: "zoneIdList";
353
+ plateMatcher: "plateMatcher";
354
+ }>;
355
+ operator: z.ZodEnum<{
356
+ in: "in";
357
+ notIn: "notIn";
358
+ anyOf: "anyOf";
359
+ allOf: "allOf";
360
+ gte: "gte";
361
+ fuzzyIn: "fuzzyIn";
362
+ withinSchedule: "withinSchedule";
363
+ }>;
364
+ appliesTo: z.ZodArray<z.ZodEnum<{
365
+ immediate: "immediate";
366
+ "track-end": "track-end";
367
+ }>>;
368
+ phase: z.ZodString;
369
+ description: z.ZodOptional<z.ZodString>;
370
+ }, z.core.$strip>;
371
+ export type NcConditionDescriptor = z.infer<typeof NcConditionDescriptorSchema>;
372
+ /**
373
+ * The P1 condition surface as data — served by `getConditionCatalog` so
374
+ * rule editors render from the catalog, not hardcoded forms (spec §4.2).
375
+ */
376
+ export declare const NC_CONDITION_CATALOG: readonly NcConditionDescriptor[];
377
+ export declare const notificationRulesCapability: {
378
+ readonly name: "notification-rules";
379
+ readonly scope: "system";
380
+ readonly mode: "singleton";
381
+ readonly methods: {
382
+ readonly listRules: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
383
+ rules: z.ZodArray<z.ZodObject<{
384
+ name: z.ZodString;
385
+ enabled: z.ZodDefault<z.ZodBoolean>;
386
+ delivery: z.ZodEnum<{
387
+ immediate: "immediate";
388
+ "track-end": "track-end";
389
+ }>;
390
+ conditions: z.ZodDefault<z.ZodObject<{
391
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
392
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
393
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
394
+ minConfidence: z.ZodOptional<z.ZodNumber>;
395
+ zones: z.ZodOptional<z.ZodObject<{
396
+ ids: z.ZodArray<z.ZodString>;
397
+ match: z.ZodDefault<z.ZodEnum<{
398
+ any: "any";
399
+ all: "all";
400
+ }>>;
401
+ }, z.core.$strip>>;
402
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
403
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
404
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
405
+ plates: z.ZodOptional<z.ZodObject<{
406
+ values: z.ZodArray<z.ZodString>;
407
+ maxDistance: z.ZodDefault<z.ZodNumber>;
408
+ }, z.core.$strip>>;
409
+ }, z.core.$strip>>;
410
+ schedule: z.ZodOptional<z.ZodObject<{
411
+ windows: z.ZodArray<z.ZodObject<{
412
+ days: z.ZodArray<z.ZodNumber>;
413
+ startMinute: z.ZodNumber;
414
+ endMinute: z.ZodNumber;
415
+ }, z.core.$strip>>;
416
+ timezone: z.ZodOptional<z.ZodString>;
417
+ invert: z.ZodOptional<z.ZodBoolean>;
418
+ }, z.core.$strip>>;
419
+ targets: z.ZodArray<z.ZodObject<{
420
+ targetId: z.ZodString;
421
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
422
+ }, z.core.$strip>>;
423
+ media: z.ZodDefault<z.ZodObject<{
424
+ attach: z.ZodDefault<z.ZodEnum<{
425
+ none: "none";
426
+ best: "best";
427
+ keyFrame: "keyFrame";
428
+ }>>;
429
+ }, z.core.$strip>>;
430
+ throttle: z.ZodDefault<z.ZodObject<{
431
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
432
+ scope: z.ZodDefault<z.ZodEnum<{
433
+ rule: "rule";
434
+ "rule-device": "rule-device";
435
+ }>>;
436
+ }, z.core.$strip>>;
437
+ template: z.ZodOptional<z.ZodObject<{
438
+ title: z.ZodOptional<z.ZodString>;
439
+ body: z.ZodOptional<z.ZodString>;
440
+ }, z.core.$strip>>;
441
+ priority: z.ZodDefault<z.ZodNumber>;
442
+ id: z.ZodString;
443
+ createdBy: z.ZodString;
444
+ createdAt: z.ZodNumber;
445
+ updatedAt: z.ZodNumber;
446
+ }, z.core.$strip>>;
447
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
448
+ readonly getRule: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
449
+ ruleId: z.ZodString;
450
+ }, z.core.$strip>, z.ZodObject<{
451
+ rule: z.ZodNullable<z.ZodObject<{
452
+ name: z.ZodString;
453
+ enabled: z.ZodDefault<z.ZodBoolean>;
454
+ delivery: z.ZodEnum<{
455
+ immediate: "immediate";
456
+ "track-end": "track-end";
457
+ }>;
458
+ conditions: z.ZodDefault<z.ZodObject<{
459
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
460
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
461
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
462
+ minConfidence: z.ZodOptional<z.ZodNumber>;
463
+ zones: z.ZodOptional<z.ZodObject<{
464
+ ids: z.ZodArray<z.ZodString>;
465
+ match: z.ZodDefault<z.ZodEnum<{
466
+ any: "any";
467
+ all: "all";
468
+ }>>;
469
+ }, z.core.$strip>>;
470
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
471
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
472
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
473
+ plates: z.ZodOptional<z.ZodObject<{
474
+ values: z.ZodArray<z.ZodString>;
475
+ maxDistance: z.ZodDefault<z.ZodNumber>;
476
+ }, z.core.$strip>>;
477
+ }, z.core.$strip>>;
478
+ schedule: z.ZodOptional<z.ZodObject<{
479
+ windows: z.ZodArray<z.ZodObject<{
480
+ days: z.ZodArray<z.ZodNumber>;
481
+ startMinute: z.ZodNumber;
482
+ endMinute: z.ZodNumber;
483
+ }, z.core.$strip>>;
484
+ timezone: z.ZodOptional<z.ZodString>;
485
+ invert: z.ZodOptional<z.ZodBoolean>;
486
+ }, z.core.$strip>>;
487
+ targets: z.ZodArray<z.ZodObject<{
488
+ targetId: z.ZodString;
489
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
490
+ }, z.core.$strip>>;
491
+ media: z.ZodDefault<z.ZodObject<{
492
+ attach: z.ZodDefault<z.ZodEnum<{
493
+ none: "none";
494
+ best: "best";
495
+ keyFrame: "keyFrame";
496
+ }>>;
497
+ }, z.core.$strip>>;
498
+ throttle: z.ZodDefault<z.ZodObject<{
499
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
500
+ scope: z.ZodDefault<z.ZodEnum<{
501
+ rule: "rule";
502
+ "rule-device": "rule-device";
503
+ }>>;
504
+ }, z.core.$strip>>;
505
+ template: z.ZodOptional<z.ZodObject<{
506
+ title: z.ZodOptional<z.ZodString>;
507
+ body: z.ZodOptional<z.ZodString>;
508
+ }, z.core.$strip>>;
509
+ priority: z.ZodDefault<z.ZodNumber>;
510
+ id: z.ZodString;
511
+ createdBy: z.ZodString;
512
+ createdAt: z.ZodNumber;
513
+ updatedAt: z.ZodNumber;
514
+ }, z.core.$strip>>;
515
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
516
+ readonly createRule: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
517
+ rule: z.ZodObject<{
518
+ name: z.ZodString;
519
+ enabled: z.ZodDefault<z.ZodBoolean>;
520
+ delivery: z.ZodEnum<{
521
+ immediate: "immediate";
522
+ "track-end": "track-end";
523
+ }>;
524
+ conditions: z.ZodDefault<z.ZodObject<{
525
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
526
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
527
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
528
+ minConfidence: z.ZodOptional<z.ZodNumber>;
529
+ zones: z.ZodOptional<z.ZodObject<{
530
+ ids: z.ZodArray<z.ZodString>;
531
+ match: z.ZodDefault<z.ZodEnum<{
532
+ any: "any";
533
+ all: "all";
534
+ }>>;
535
+ }, z.core.$strip>>;
536
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
537
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
538
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
539
+ plates: z.ZodOptional<z.ZodObject<{
540
+ values: z.ZodArray<z.ZodString>;
541
+ maxDistance: z.ZodDefault<z.ZodNumber>;
542
+ }, z.core.$strip>>;
543
+ }, z.core.$strip>>;
544
+ schedule: z.ZodOptional<z.ZodObject<{
545
+ windows: z.ZodArray<z.ZodObject<{
546
+ days: z.ZodArray<z.ZodNumber>;
547
+ startMinute: z.ZodNumber;
548
+ endMinute: z.ZodNumber;
549
+ }, z.core.$strip>>;
550
+ timezone: z.ZodOptional<z.ZodString>;
551
+ invert: z.ZodOptional<z.ZodBoolean>;
552
+ }, z.core.$strip>>;
553
+ targets: z.ZodArray<z.ZodObject<{
554
+ targetId: z.ZodString;
555
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
556
+ }, z.core.$strip>>;
557
+ media: z.ZodDefault<z.ZodObject<{
558
+ attach: z.ZodDefault<z.ZodEnum<{
559
+ none: "none";
560
+ best: "best";
561
+ keyFrame: "keyFrame";
562
+ }>>;
563
+ }, z.core.$strip>>;
564
+ throttle: z.ZodDefault<z.ZodObject<{
565
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
566
+ scope: z.ZodDefault<z.ZodEnum<{
567
+ rule: "rule";
568
+ "rule-device": "rule-device";
569
+ }>>;
570
+ }, z.core.$strip>>;
571
+ template: z.ZodOptional<z.ZodObject<{
572
+ title: z.ZodOptional<z.ZodString>;
573
+ body: z.ZodOptional<z.ZodString>;
574
+ }, z.core.$strip>>;
575
+ priority: z.ZodDefault<z.ZodNumber>;
576
+ }, z.core.$strip>;
577
+ }, z.core.$strip>, z.ZodObject<{
578
+ rule: z.ZodObject<{
579
+ name: z.ZodString;
580
+ enabled: z.ZodDefault<z.ZodBoolean>;
581
+ delivery: z.ZodEnum<{
582
+ immediate: "immediate";
583
+ "track-end": "track-end";
584
+ }>;
585
+ conditions: z.ZodDefault<z.ZodObject<{
586
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
587
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
588
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
589
+ minConfidence: z.ZodOptional<z.ZodNumber>;
590
+ zones: z.ZodOptional<z.ZodObject<{
591
+ ids: z.ZodArray<z.ZodString>;
592
+ match: z.ZodDefault<z.ZodEnum<{
593
+ any: "any";
594
+ all: "all";
595
+ }>>;
596
+ }, z.core.$strip>>;
597
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
598
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
599
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
600
+ plates: z.ZodOptional<z.ZodObject<{
601
+ values: z.ZodArray<z.ZodString>;
602
+ maxDistance: z.ZodDefault<z.ZodNumber>;
603
+ }, z.core.$strip>>;
604
+ }, z.core.$strip>>;
605
+ schedule: z.ZodOptional<z.ZodObject<{
606
+ windows: z.ZodArray<z.ZodObject<{
607
+ days: z.ZodArray<z.ZodNumber>;
608
+ startMinute: z.ZodNumber;
609
+ endMinute: z.ZodNumber;
610
+ }, z.core.$strip>>;
611
+ timezone: z.ZodOptional<z.ZodString>;
612
+ invert: z.ZodOptional<z.ZodBoolean>;
613
+ }, z.core.$strip>>;
614
+ targets: z.ZodArray<z.ZodObject<{
615
+ targetId: z.ZodString;
616
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
617
+ }, z.core.$strip>>;
618
+ media: z.ZodDefault<z.ZodObject<{
619
+ attach: z.ZodDefault<z.ZodEnum<{
620
+ none: "none";
621
+ best: "best";
622
+ keyFrame: "keyFrame";
623
+ }>>;
624
+ }, z.core.$strip>>;
625
+ throttle: z.ZodDefault<z.ZodObject<{
626
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
627
+ scope: z.ZodDefault<z.ZodEnum<{
628
+ rule: "rule";
629
+ "rule-device": "rule-device";
630
+ }>>;
631
+ }, z.core.$strip>>;
632
+ template: z.ZodOptional<z.ZodObject<{
633
+ title: z.ZodOptional<z.ZodString>;
634
+ body: z.ZodOptional<z.ZodString>;
635
+ }, z.core.$strip>>;
636
+ priority: z.ZodDefault<z.ZodNumber>;
637
+ id: z.ZodString;
638
+ createdBy: z.ZodString;
639
+ createdAt: z.ZodNumber;
640
+ updatedAt: z.ZodNumber;
641
+ }, z.core.$strip>;
642
+ }, z.core.$strip>, "mutation"> & {
643
+ readonly caller: "required";
644
+ };
645
+ readonly updateRule: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
646
+ ruleId: z.ZodString;
647
+ patch: z.ZodObject<{
648
+ name: z.ZodOptional<z.ZodString>;
649
+ enabled: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
650
+ delivery: z.ZodOptional<z.ZodEnum<{
651
+ immediate: "immediate";
652
+ "track-end": "track-end";
653
+ }>>;
654
+ conditions: z.ZodOptional<z.ZodDefault<z.ZodObject<{
655
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
656
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
657
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
658
+ minConfidence: z.ZodOptional<z.ZodNumber>;
659
+ zones: z.ZodOptional<z.ZodObject<{
660
+ ids: z.ZodArray<z.ZodString>;
661
+ match: z.ZodDefault<z.ZodEnum<{
662
+ any: "any";
663
+ all: "all";
664
+ }>>;
665
+ }, z.core.$strip>>;
666
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
667
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
668
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
669
+ plates: z.ZodOptional<z.ZodObject<{
670
+ values: z.ZodArray<z.ZodString>;
671
+ maxDistance: z.ZodDefault<z.ZodNumber>;
672
+ }, z.core.$strip>>;
673
+ }, z.core.$strip>>>;
674
+ schedule: z.ZodOptional<z.ZodOptional<z.ZodObject<{
675
+ windows: z.ZodArray<z.ZodObject<{
676
+ days: z.ZodArray<z.ZodNumber>;
677
+ startMinute: z.ZodNumber;
678
+ endMinute: z.ZodNumber;
679
+ }, z.core.$strip>>;
680
+ timezone: z.ZodOptional<z.ZodString>;
681
+ invert: z.ZodOptional<z.ZodBoolean>;
682
+ }, z.core.$strip>>>;
683
+ targets: z.ZodOptional<z.ZodArray<z.ZodObject<{
684
+ targetId: z.ZodString;
685
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
686
+ }, z.core.$strip>>>;
687
+ media: z.ZodOptional<z.ZodDefault<z.ZodObject<{
688
+ attach: z.ZodDefault<z.ZodEnum<{
689
+ none: "none";
690
+ best: "best";
691
+ keyFrame: "keyFrame";
692
+ }>>;
693
+ }, z.core.$strip>>>;
694
+ throttle: z.ZodOptional<z.ZodDefault<z.ZodObject<{
695
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
696
+ scope: z.ZodDefault<z.ZodEnum<{
697
+ rule: "rule";
698
+ "rule-device": "rule-device";
699
+ }>>;
700
+ }, z.core.$strip>>>;
701
+ template: z.ZodOptional<z.ZodOptional<z.ZodObject<{
702
+ title: z.ZodOptional<z.ZodString>;
703
+ body: z.ZodOptional<z.ZodString>;
704
+ }, z.core.$strip>>>;
705
+ priority: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
706
+ }, z.core.$strip>;
707
+ }, z.core.$strip>, z.ZodObject<{
708
+ rule: z.ZodObject<{
709
+ name: z.ZodString;
710
+ enabled: z.ZodDefault<z.ZodBoolean>;
711
+ delivery: z.ZodEnum<{
712
+ immediate: "immediate";
713
+ "track-end": "track-end";
714
+ }>;
715
+ conditions: z.ZodDefault<z.ZodObject<{
716
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
717
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
718
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
719
+ minConfidence: z.ZodOptional<z.ZodNumber>;
720
+ zones: z.ZodOptional<z.ZodObject<{
721
+ ids: z.ZodArray<z.ZodString>;
722
+ match: z.ZodDefault<z.ZodEnum<{
723
+ any: "any";
724
+ all: "all";
725
+ }>>;
726
+ }, z.core.$strip>>;
727
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
728
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
729
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
730
+ plates: z.ZodOptional<z.ZodObject<{
731
+ values: z.ZodArray<z.ZodString>;
732
+ maxDistance: z.ZodDefault<z.ZodNumber>;
733
+ }, z.core.$strip>>;
734
+ }, z.core.$strip>>;
735
+ schedule: z.ZodOptional<z.ZodObject<{
736
+ windows: z.ZodArray<z.ZodObject<{
737
+ days: z.ZodArray<z.ZodNumber>;
738
+ startMinute: z.ZodNumber;
739
+ endMinute: z.ZodNumber;
740
+ }, z.core.$strip>>;
741
+ timezone: z.ZodOptional<z.ZodString>;
742
+ invert: z.ZodOptional<z.ZodBoolean>;
743
+ }, z.core.$strip>>;
744
+ targets: z.ZodArray<z.ZodObject<{
745
+ targetId: z.ZodString;
746
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
747
+ }, z.core.$strip>>;
748
+ media: z.ZodDefault<z.ZodObject<{
749
+ attach: z.ZodDefault<z.ZodEnum<{
750
+ none: "none";
751
+ best: "best";
752
+ keyFrame: "keyFrame";
753
+ }>>;
754
+ }, z.core.$strip>>;
755
+ throttle: z.ZodDefault<z.ZodObject<{
756
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
757
+ scope: z.ZodDefault<z.ZodEnum<{
758
+ rule: "rule";
759
+ "rule-device": "rule-device";
760
+ }>>;
761
+ }, z.core.$strip>>;
762
+ template: z.ZodOptional<z.ZodObject<{
763
+ title: z.ZodOptional<z.ZodString>;
764
+ body: z.ZodOptional<z.ZodString>;
765
+ }, z.core.$strip>>;
766
+ priority: z.ZodDefault<z.ZodNumber>;
767
+ id: z.ZodString;
768
+ createdBy: z.ZodString;
769
+ createdAt: z.ZodNumber;
770
+ updatedAt: z.ZodNumber;
771
+ }, z.core.$strip>;
772
+ }, z.core.$strip>, "mutation"> & {
773
+ readonly caller: "required";
774
+ };
775
+ readonly deleteRule: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
776
+ ruleId: z.ZodString;
777
+ }, z.core.$strip>, z.ZodObject<{
778
+ success: z.ZodLiteral<true>;
779
+ }, z.core.$strip>, "mutation">;
780
+ readonly setRuleEnabled: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
781
+ ruleId: z.ZodString;
782
+ enabled: z.ZodBoolean;
783
+ }, z.core.$strip>, z.ZodObject<{
784
+ success: z.ZodLiteral<true>;
785
+ }, z.core.$strip>, "mutation">;
786
+ /**
787
+ * Dry-run a rule against recently persisted records (object events for
788
+ * `immediate`, closed tracks for `track-end`). Mutation kind only to
789
+ * carry the full rule object safely; no side effects.
790
+ */
791
+ readonly testRule: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
792
+ rule: z.ZodObject<{
793
+ name: z.ZodString;
794
+ enabled: z.ZodDefault<z.ZodBoolean>;
795
+ delivery: z.ZodEnum<{
796
+ immediate: "immediate";
797
+ "track-end": "track-end";
798
+ }>;
799
+ conditions: z.ZodDefault<z.ZodObject<{
800
+ devices: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
801
+ classes: z.ZodOptional<z.ZodArray<z.ZodString>>;
802
+ classesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
803
+ minConfidence: z.ZodOptional<z.ZodNumber>;
804
+ zones: z.ZodOptional<z.ZodObject<{
805
+ ids: z.ZodArray<z.ZodString>;
806
+ match: z.ZodDefault<z.ZodEnum<{
807
+ any: "any";
808
+ all: "all";
809
+ }>>;
810
+ }, z.core.$strip>>;
811
+ zonesExclude: z.ZodOptional<z.ZodArray<z.ZodString>>;
812
+ labelEquals: z.ZodOptional<z.ZodArray<z.ZodString>>;
813
+ identities: z.ZodOptional<z.ZodArray<z.ZodString>>;
814
+ plates: z.ZodOptional<z.ZodObject<{
815
+ values: z.ZodArray<z.ZodString>;
816
+ maxDistance: z.ZodDefault<z.ZodNumber>;
817
+ }, z.core.$strip>>;
818
+ }, z.core.$strip>>;
819
+ schedule: z.ZodOptional<z.ZodObject<{
820
+ windows: z.ZodArray<z.ZodObject<{
821
+ days: z.ZodArray<z.ZodNumber>;
822
+ startMinute: z.ZodNumber;
823
+ endMinute: z.ZodNumber;
824
+ }, z.core.$strip>>;
825
+ timezone: z.ZodOptional<z.ZodString>;
826
+ invert: z.ZodOptional<z.ZodBoolean>;
827
+ }, z.core.$strip>>;
828
+ targets: z.ZodArray<z.ZodObject<{
829
+ targetId: z.ZodString;
830
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
831
+ }, z.core.$strip>>;
832
+ media: z.ZodDefault<z.ZodObject<{
833
+ attach: z.ZodDefault<z.ZodEnum<{
834
+ none: "none";
835
+ best: "best";
836
+ keyFrame: "keyFrame";
837
+ }>>;
838
+ }, z.core.$strip>>;
839
+ throttle: z.ZodDefault<z.ZodObject<{
840
+ cooldownSec: z.ZodDefault<z.ZodNumber>;
841
+ scope: z.ZodDefault<z.ZodEnum<{
842
+ rule: "rule";
843
+ "rule-device": "rule-device";
844
+ }>>;
845
+ }, z.core.$strip>>;
846
+ template: z.ZodOptional<z.ZodObject<{
847
+ title: z.ZodOptional<z.ZodString>;
848
+ body: z.ZodOptional<z.ZodString>;
849
+ }, z.core.$strip>>;
850
+ priority: z.ZodDefault<z.ZodNumber>;
851
+ }, z.core.$strip>;
852
+ lookbackMinutes: z.ZodDefault<z.ZodNumber>;
853
+ }, z.core.$strip>, z.ZodObject<{
854
+ results: z.ZodArray<z.ZodObject<{
855
+ recordId: z.ZodString;
856
+ recordKind: z.ZodEnum<{
857
+ "object-event": "object-event";
858
+ track: "track";
859
+ }>;
860
+ deviceId: z.ZodNumber;
861
+ timestamp: z.ZodNumber;
862
+ wouldFire: z.ZodBoolean;
863
+ failedCondition: z.ZodOptional<z.ZodString>;
864
+ className: z.ZodOptional<z.ZodString>;
865
+ label: z.ZodOptional<z.ZodString>;
866
+ }, z.core.$strip>>;
867
+ }, z.core.$strip>, "mutation">;
868
+ readonly getConditionCatalog: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
869
+ catalog: z.ZodArray<z.ZodObject<{
870
+ id: z.ZodString;
871
+ group: z.ZodEnum<{
872
+ label: "label";
873
+ scope: "scope";
874
+ class: "class";
875
+ schedule: "schedule";
876
+ zones: "zones";
877
+ quality: "quality";
878
+ }>;
879
+ label: z.ZodString;
880
+ valueType: z.ZodEnum<{
881
+ schedule: "schedule";
882
+ deviceIdList: "deviceIdList";
883
+ stringList: "stringList";
884
+ number01: "number01";
885
+ zoneSelection: "zoneSelection";
886
+ zoneIdList: "zoneIdList";
887
+ plateMatcher: "plateMatcher";
888
+ }>;
889
+ operator: z.ZodEnum<{
890
+ in: "in";
891
+ notIn: "notIn";
892
+ anyOf: "anyOf";
893
+ allOf: "allOf";
894
+ gte: "gte";
895
+ fuzzyIn: "fuzzyIn";
896
+ withinSchedule: "withinSchedule";
897
+ }>;
898
+ appliesTo: z.ZodArray<z.ZodEnum<{
899
+ immediate: "immediate";
900
+ "track-end": "track-end";
901
+ }>>;
902
+ phase: z.ZodString;
903
+ description: z.ZodOptional<z.ZodString>;
904
+ }, z.core.$strip>>;
905
+ }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
906
+ };
907
+ };
908
+ export type INotificationRulesProvider = InferProvider<typeof notificationRulesCapability>;