@camstack/types 1.2.392 → 1.2.394

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.
@@ -46,7 +46,7 @@ export { CustomModelDescriptorSchema, customModelRegistryCapability, ImportModel
46
46
  export { type DataStoreEngineInfo, dataStoreProviderCapability, EngineInfoSchema as DataStoreEngineInfoSchema, type IDataStoreProvider, } from './data-store-provider.cap.js';
47
47
  export { type ArchiveSqliteSnapshot, ArchiveSqliteSnapshotSchema, DATABASE_SNAPSHOT_PARTIAL_SUFFIX, DATABASE_SNAPSHOT_SUFFIX, DATABASE_SNAPSHOT_TIMEOUT_MS, type DatabaseSnapshotRequest, DatabaseSnapshotRequestSchema, type DatabaseSnapshotResult, DatabaseSnapshotResultSchema, type DatabaseSnapshotTable, DatabaseSnapshotTableSchema, type DatabaseSnapshotTargets, DatabaseSnapshotTargetsSchema, type DatabaseSnapshotWritten, DatabaseSnapshotWrittenSchema, databaseSnapshotCapability, type IDatabaseSnapshotProvider, } from './database-snapshot.cap.js';
48
48
  export { CALLER_STAMPED_CAPABILITIES, withoutCallerStamp } from './caller-stamp.js';
49
- export { type IStorageAdminProvider, STORAGE_ADMIN_MOVED_COLLECTIONS, STORAGE_ADMIN_SCOPED_BASES, type StorageKind, StorageKindSchema, type StorageTable, StorageTableSchema, storageAdminCapability, } from './storage-admin.cap.js';
49
+ export { type IStorageAdminProvider, type StorageKind, StorageKindSchema, type StorageTable, StorageTableSchema, storageAdminCapability, } from './storage-admin.cap.js';
50
50
  export { type DeclareKindResult, DeclareKindResultSchema, type IRecordsProvider, type RecordInput, RecordInputSchema, type RecordQueryInput, RecordQueryInputSchema, type RecordQueryResult, RecordQueryResultSchema, type RecordView, RecordViewSchema, type RecordWhere, RecordWhereSchema, type RecordWhereValue, RecordIdSchema, RecordBodySchema, RecordSecretRefsSchema, recordsCapability, } from './records.cap.js';
51
51
  export { type EntryKindInfo, EntryKindInfoSchema, type EntryView, EntryViewSchema, type IRecordEntriesProvider, recordEntriesCapability, } from './record-entries.cap.js';
52
52
  export { type IKeychainProvider, KEYCHAIN_MAX_REFS_PER_CALL, type KeychainResolveEntry, KeychainResolveEntrySchema, type KeychainResolveResult, KeychainResolveResultSchema, type KeychainSecretMeta, KeychainSecretMetaSchema, type KeychainState, KeychainStateSchema, type KeychainUnavailableReason, KeychainUnavailableReasonSchema, keychainCapability, } from './keychain.cap.js';
@@ -1097,6 +1097,7 @@ export declare const NcMediaPolicySchema: z.ZodObject<{
1097
1097
  "scene-boxes": "scene-boxes";
1098
1098
  }>>;
1099
1099
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
1100
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
1100
1101
  attach: z.ZodOptional<z.ZodEnum<{
1101
1102
  best: "best";
1102
1103
  "best-matching": "best-matching";
@@ -1434,6 +1435,7 @@ export declare const NcRuleInputSchema: z.ZodObject<{
1434
1435
  "scene-boxes": "scene-boxes";
1435
1436
  }>>;
1436
1437
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
1438
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
1437
1439
  attach: z.ZodOptional<z.ZodEnum<{
1438
1440
  best: "best";
1439
1441
  "best-matching": "best-matching";
@@ -1924,6 +1926,7 @@ export declare const NcRulePatchSchema: z.ZodObject<{
1924
1926
  "scene-boxes": "scene-boxes";
1925
1927
  }>>;
1926
1928
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
1929
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
1927
1930
  attach: z.ZodOptional<z.ZodEnum<{
1928
1931
  best: "best";
1929
1932
  "best-matching": "best-matching";
@@ -2323,6 +2326,7 @@ export declare const NcRuleUpdateInputSchema: z.ZodObject<{
2323
2326
  "scene-boxes": "scene-boxes";
2324
2327
  }>>;
2325
2328
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
2329
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
2326
2330
  attach: z.ZodOptional<z.ZodEnum<{
2327
2331
  best: "best";
2328
2332
  "best-matching": "best-matching";
@@ -2575,6 +2579,7 @@ export declare const NcRuleSchema: z.ZodObject<{
2575
2579
  "scene-boxes": "scene-boxes";
2576
2580
  }>>;
2577
2581
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
2582
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
2578
2583
  attach: z.ZodOptional<z.ZodEnum<{
2579
2584
  best: "best";
2580
2585
  "best-matching": "best-matching";
@@ -4706,6 +4711,7 @@ export declare const notificationRulesCapability: {
4706
4711
  "scene-boxes": "scene-boxes";
4707
4712
  }>>;
4708
4713
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
4714
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
4709
4715
  attach: z.ZodOptional<z.ZodEnum<{
4710
4716
  best: "best";
4711
4717
  "best-matching": "best-matching";
@@ -5073,6 +5079,7 @@ export declare const notificationRulesCapability: {
5073
5079
  "scene-boxes": "scene-boxes";
5074
5080
  }>>;
5075
5081
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
5082
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
5076
5083
  attach: z.ZodOptional<z.ZodEnum<{
5077
5084
  best: "best";
5078
5085
  "best-matching": "best-matching";
@@ -5438,6 +5445,7 @@ export declare const notificationRulesCapability: {
5438
5445
  "scene-boxes": "scene-boxes";
5439
5446
  }>>;
5440
5447
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
5448
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
5441
5449
  attach: z.ZodOptional<z.ZodEnum<{
5442
5450
  best: "best";
5443
5451
  "best-matching": "best-matching";
@@ -5797,6 +5805,7 @@ export declare const notificationRulesCapability: {
5797
5805
  "scene-boxes": "scene-boxes";
5798
5806
  }>>;
5799
5807
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
5808
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
5800
5809
  attach: z.ZodOptional<z.ZodEnum<{
5801
5810
  best: "best";
5802
5811
  "best-matching": "best-matching";
@@ -6287,6 +6296,7 @@ export declare const notificationRulesCapability: {
6287
6296
  "scene-boxes": "scene-boxes";
6288
6297
  }>>;
6289
6298
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
6299
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
6290
6300
  attach: z.ZodOptional<z.ZodEnum<{
6291
6301
  best: "best";
6292
6302
  "best-matching": "best-matching";
@@ -6537,6 +6547,7 @@ export declare const notificationRulesCapability: {
6537
6547
  "scene-boxes": "scene-boxes";
6538
6548
  }>>;
6539
6549
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
6550
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
6540
6551
  attach: z.ZodOptional<z.ZodEnum<{
6541
6552
  best: "best";
6542
6553
  "best-matching": "best-matching";
@@ -7095,6 +7106,7 @@ export declare const notificationRulesCapability: {
7095
7106
  "scene-boxes": "scene-boxes";
7096
7107
  }>>;
7097
7108
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
7109
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
7098
7110
  attach: z.ZodOptional<z.ZodEnum<{
7099
7111
  best: "best";
7100
7112
  "best-matching": "best-matching";
@@ -7479,6 +7491,7 @@ export declare const notificationRulesCapability: {
7479
7491
  "scene-boxes": "scene-boxes";
7480
7492
  }>>;
7481
7493
  showTriggerZone: z.ZodOptional<z.ZodBoolean>;
7494
+ showSubjectPath: z.ZodOptional<z.ZodBoolean>;
7482
7495
  attach: z.ZodOptional<z.ZodEnum<{
7483
7496
  best: "best";
7484
7497
  "best-matching": "best-matching";
@@ -102,25 +102,13 @@ export declare const StorageKindSchema: z.ZodObject<{
102
102
  }, z.core.$strip>;
103
103
  export type StorageKind = z.infer<typeof StorageKindSchema>;
104
104
  /**
105
- * The collections retired by exact name by D870 (their data became keys of the
106
- * camera's settings). No addon declares any of them any more; the engine still
107
- * refuses one a running addon declared this boot. `dropCollection` may remove
108
- * these, the per-addon scoped `addon-settings` / `addon-devices` / `sections`
109
- * tables, and the tables of owners that are no longer installed - nothing else.
110
- * The records-migration leftovers (D871 `stats-5m`, the phase-0 tables) were
111
- * dropped by hand on the operator hubs and left this list with D900.
112
- */
113
- export declare const STORAGE_ADMIN_MOVED_COLLECTIONS: readonly string[];
114
- /** The per-addon blob tables a scoped name may carry. */
115
- export declare const STORAGE_ADMIN_SCOPED_BASES: readonly string[];
116
- /**
117
- * storage-admin - the operator's maintenance reach into the settings database:
118
- * list its tables, drop one that nothing owns any more (D870).
105
+ * storage-admin - the operator's maintenance reach into the databases: list
106
+ * their tables and record kinds, read a kind for diagnosis. Read-only: a table
107
+ * the code no longer creates is dropped by hand, offline (D901).
119
108
  *
120
109
  * Hub-only, internal and `auth: 'admin'` explicitly (`internal` does not gate
121
- * the mount, see `data-store-provider`). Both methods are LOGGED by the engine
122
- * with the table and the counts. `dropCollection` is a ONE-SHOT of the D870
123
- * migration and is marked for removal once the last hub has run it.
110
+ * the mount, see `data-store-provider`). `listTables` is LOGGED by the engine
111
+ * with the counts.
124
112
  *
125
113
  * `listTables` is READ-ONLY: it never creates a table, which `count` and `get`
126
114
  * on an undeclared scoped name used to do.
@@ -146,23 +134,6 @@ export declare const storageAdminCapability: {
146
134
  declaredThisBoot: z.ZodBoolean;
147
135
  }, z.core.$strip>>;
148
136
  }, z.core.$strip>, import("./capability-definition.js").CapabilityMethodKind>;
149
- /**
150
- * Drop one table. REFUSES when an addon declared it since the engine
151
- * started (a running addon still owns it), when it is an engine or
152
- * canonical table, when it does not exist, or when its row count is not
153
- * `expectRows` - the caller states what it believes it is deleting. The
154
- * engine also refuses anything but `<owner>:(addon-settings|addon-devices|
155
- * sections)`, the retired collections by name, and tables of owners that
156
- * are not installed (and refuses when it cannot read the installed list).
157
- * Removed with the D870 migration script once the last hub ran it.
158
- */
159
- readonly dropCollection: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
160
- collection: z.ZodString;
161
- expectRows: z.ZodNumber;
162
- }, z.core.$strip>, z.ZodObject<{
163
- dropped: z.ZodLiteral<true>;
164
- rows: z.ZodNumber;
165
- }, z.core.$strip>, "mutation">;
166
137
  /** Every record kind of both files with rows, a size estimate, class and retention (D881). */
167
138
  readonly listKinds: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
168
139
  owner: z.ZodOptional<z.ZodString>;
package/dist/client.d.ts CHANGED
@@ -14,4 +14,4 @@
14
14
  * value this entry does not export — a missing name here is `undefined` at
15
15
  * runtime, not a build error.
16
16
  */
17
- export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, AlarmArmModeSchema, CLIP_BROKER_PACED_RATES, COCO_TO_MACRO, CamProfileSchema, ICON_CATEGORIES, ICON_ENTRIES, ICON_KEYS, ICON_VIEWER_MODULES, IconKeySchema, LOCATION_ICON_FALLBACK, DEFINITIVE_DEVICE_REFUSALS, DEVICE_CERT_RENEW_WINDOW_DAYS, DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE, DEVICE_REFRESH_REFUSAL_PREFIX, DEVICE_CERT_SIGNATURE, DEVICE_SIGNATURE_MESSAGE_VERSION, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DeviceType, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_TAXONOMY, MACRO_LABELS, NC_ALARM_DELAY_MAX_SEC, NC_ALARM_SENSORS_MAX, NC_ALARM_SYSTEM_EVENT_KINDS, NC_ALARM_TRIGGERED_MAX_SEC, NC_BATTERY_CONSUMABLE_SYSTEM_EVENT_KINDS, NC_CAMERA_SCOPE_CAP_NAME, NC_CONSUMABLE_LOW_PERCENT_DEFAULT, NC_CONSUMABLE_LOW_PERCENT_MAX, NC_GROUPING_DEFAULT_SEC, NC_GROUPING_MAX_SEC, NC_GROUPING_MIN_SEC, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_SENSOR_TRANSITION_UNSUPPORTED_REASON, NC_SYSTEM_EVENT_FAMILY_FILTERS, NC_SYSTEM_EVENT_KIND_GROUP_SPECS, NC_SYSTEM_EVENT_SUMMARY_FAMILIES, NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS, NC_TEMPLATE_VARS, NcAlarmConfigSchema, NcAlarmSensorsSchema, NcAlarmSettingsPatchSchema, NcHistoryEntrySchema, NcRuleLastRunsSchema, NodeDirectorySchema, RECORDING_EXPORT_MAX_READ_BYTES, RETRAIN_REVIEW_ADJUSTED_IOU, RETRAIN_REVIEW_MATCH_IOU, RETRAIN_REVIEW_STATUSES, RETRAIN_REVISION_CONFLICT, SystemMirror, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleSchema, YAMNET_TO_MACRO, alarmDeviceBlocksArming, alarmDeviceSecureOnArm, alarmPatchLanded, canonicalIconKey, buildDeviceEnrollmentLink, buildDeviceSignatureMessage, deviceRefusalFromMessage, isDefinitiveDeviceRefusal, classifyRetrainReview, conditionVisibleForKind, createSystemProxy, droppedConditionsForKind, iconCategoryLabel, iconEntry, iconsInCategory, isIconKey, isHeldBackTemplateVar, isSystemRuleKind, kindsForDiscriminator, locationIconKey, knownValues, nodePickerItems, parseDeviceEnrollmentLink, packagePickerItems, pickerForCondition, pickerForRuleClasses, parseRetrainRevisionConflict, resolveIconKey, resolveModeDelays, retrainBoxIou, retrainRevisionConflictMessage, ruleDeviceCompatCapNames, ruleEditorSectionsForKind, ruleGroupingApplies, ruleKindOf, ruleKindSpec, ruleSeedForSection, searchIcons, sensorTransitionNeverFires, sensorTransitionOffered, stateLabel, summarizeReview, systemEventDeliveryProblems, systemEventFilterAppliesToAnyKind, systemEventKindsOfFamily, systemFamilyOfKind, templateCarriesSummary, templateVarDeliveryApplies, templateVarKindApplies, templateVarSystemEventApplies, } from './index.js';
17
+ export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, AlarmArmModeSchema, CLIP_BROKER_PACED_RATES, COCO_TO_MACRO, CamProfileSchema, ICON_CATEGORIES, ICON_ENTRIES, ICON_KEYS, ICON_VIEWER_MODULES, IconKeySchema, LOCATION_ICON_FALLBACK, DEFINITIVE_DEVICE_REFUSALS, DEVICE_CERT_RENEW_WINDOW_DAYS, DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE, DEVICE_REFRESH_REFUSAL_PREFIX, DEVICE_CERT_SIGNATURE, DEVICE_SIGNATURE_MESSAGE_VERSION, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DeviceType, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_TAXONOMY, MACRO_LABELS, NC_ALARM_DELAY_MAX_SEC, NC_ALARM_SENSORS_MAX, NC_ALARM_SYSTEM_EVENT_KINDS, NC_ALARM_TRIGGERED_MAX_SEC, NC_BATTERY_CONSUMABLE_SYSTEM_EVENT_KINDS, NC_CAMERA_SCOPE_CAP_NAME, NC_CONSUMABLE_LOW_PERCENT_DEFAULT, NC_CONSUMABLE_LOW_PERCENT_MAX, NC_GROUPING_DEFAULT_SEC, NC_GROUPING_MAX_SEC, NC_GROUPING_MIN_SEC, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_SENSOR_TRANSITION_UNSUPPORTED_REASON, NC_SYSTEM_EVENT_FAMILY_FILTERS, NC_SYSTEM_EVENT_KIND_GROUP_SPECS, NC_SYSTEM_EVENT_SUMMARY_FAMILIES, NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS, NC_TEMPLATE_VARS, NcAlarmConfigSchema, NcAlarmSensorsSchema, NcAlarmSettingsPatchSchema, NcHistoryEntrySchema, NcRuleLastRunsSchema, NodeDirectorySchema, RECORDING_EXPORT_MAX_READ_BYTES, RETRAIN_REVIEW_ADJUSTED_IOU, RETRAIN_REVIEW_MATCH_IOU, RETRAIN_REVIEW_STATUSES, RETRAIN_REVISION_CONFLICT, SystemMirror, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleSchema, YAMNET_TO_MACRO, alarmDeviceBlocksArming, alarmDeviceSecureOnArm, alarmPatchLanded, canonicalIconKey, buildDeviceEnrollmentLink, buildDeviceSignatureMessage, deviceRefusalFromMessage, isDefinitiveDeviceRefusal, classifyRetrainReview, conditionVisibleForKind, createSystemProxy, droppedConditionsForKind, iconCategoryLabel, iconEntry, iconsInCategory, isIconKey, isHeldBackTemplateVar, isSystemRuleKind, kindsForDiscriminator, locationIconKey, knownValues, nodePickerItems, parseDeviceEnrollmentLink, packagePickerItems, pickerForCondition, pickerForRuleClasses, parseRetrainRevisionConflict, resolveIconKey, resolveModeDelays, retrainBoxIou, retrainRevisionConflictMessage, ruleDeviceCompatCapNames, ruleEditorSectionsForKind, ruleGroupingApplies, ruleKindOf, ruleKindSpec, ruleSeedForSection, searchIcons, sensorTransitionNeverFires, sensorTransitionOffered, stateLabel, summarizeReview, systemEventDeliveryProblems, systemEventFilterAppliesToAnyKind, systemEventKindsOfFamily, systemFamilyOfKind, templateCarriesSummary, templateVarDeliveryApplies, templateVarKindApplies, templateVarSystemEventApplies, buildSubjectPath, isDrawableSubjectPath, projectSubjectPath, subjectPathSampleFromBox, subjectPathSvgPoints, } from './index.js';
package/dist/client.js CHANGED
@@ -23121,6 +23121,15 @@ var NcMediaPolicySchema = zod.z.object({
23121
23121
  * Replaces `zoneCrop`.
23122
23122
  */
23123
23123
  showTriggerZone: zod.z.boolean().optional(),
23124
+ /**
23125
+ * Draw the SUBJECT'S PATH on the picture — a line in the subject's colour
23126
+ * through the track's positions up to the frame shown, the same path the
23127
+ * debug views draw (`buildSubjectPath`, D903). Every picture mode a subject
23128
+ * is drawn on: a `crop` maps the path into the crop and clips it. Valid only
23129
+ * on a rule whose subject is a tracked object (refused on a sound rule);
23130
+ * dropped on `image: 'none'`. Absent = off.
23131
+ */
23132
+ showSubjectPath: zod.z.boolean().optional(),
23124
23133
  /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
23125
23134
  attach: zod.z.enum([
23126
23135
  "best",
@@ -29375,6 +29384,182 @@ function ruleEditorSectionsForKind(kind) {
29375
29384
  }
29376
29385
  return sections;
29377
29386
  }
29387
+ var clamp01 = (n) => n < 0 ? 0 : n > 1 ? 1 : n;
29388
+ /** The sample of a normalised box: its centre, its extent. */
29389
+ function subjectPathSampleFromBox(bbox, timestamp) {
29390
+ return {
29391
+ x: bbox.x + bbox.w / 2,
29392
+ y: bbox.y + bbox.h / 2,
29393
+ w: bbox.w,
29394
+ h: bbox.h,
29395
+ ...timestamp !== void 0 ? { timestamp } : {}
29396
+ };
29397
+ }
29398
+ function isPlaceholder(s) {
29399
+ return s.w !== void 0 && s.h !== void 0 && s.w >= .85 && s.h >= .85;
29400
+ }
29401
+ function downsample(xs, max) {
29402
+ if (xs.length <= max || max < 2) return xs;
29403
+ const step = (xs.length - 1) / (max - 1);
29404
+ const out = [];
29405
+ for (let i = 0; i < max - 1; i++) {
29406
+ const x = xs[Math.round(i * step)];
29407
+ if (x !== void 0) out.push(x);
29408
+ }
29409
+ const last = xs[xs.length - 1];
29410
+ if (last !== void 0) out.push(last);
29411
+ return out;
29412
+ }
29413
+ function isFiniteSample(s) {
29414
+ return Number.isFinite(s.x) && Number.isFinite(s.y);
29415
+ }
29416
+ /**
29417
+ * The path of one track from its samples (normalised, oldest → newest).
29418
+ * Pure; never throws; malformed samples are skipped.
29419
+ */
29420
+ function buildSubjectPath(samples, opts) {
29421
+ const until = opts?.untilTimestamp;
29422
+ const nodes = [];
29423
+ let unlocalized = 0;
29424
+ let tail = null;
29425
+ for (let index = 0; index < samples.length; index++) {
29426
+ const s = samples[index];
29427
+ if (s === void 0 || !isFiniteSample(s)) continue;
29428
+ if (until !== void 0 && s.timestamp !== void 0 && s.timestamp > until) continue;
29429
+ if (isPlaceholder(s)) {
29430
+ unlocalized += 1;
29431
+ continue;
29432
+ }
29433
+ const ts = s.timestamp !== void 0 && Number.isFinite(s.timestamp) ? s.timestamp : index;
29434
+ const x = clamp01(s.x);
29435
+ const y = clamp01(s.y);
29436
+ const prev = nodes[nodes.length - 1];
29437
+ if (prev !== void 0 && Math.hypot(x - prev.x, y - prev.y) < .005) {
29438
+ nodes[nodes.length - 1] = {
29439
+ ...prev,
29440
+ samples: prev.samples + 1,
29441
+ lastTs: Math.max(prev.lastTs, ts)
29442
+ };
29443
+ tail = {
29444
+ x,
29445
+ y,
29446
+ samples: 1,
29447
+ firstTs: ts,
29448
+ lastTs: ts
29449
+ };
29450
+ continue;
29451
+ }
29452
+ tail = null;
29453
+ nodes.push({
29454
+ x,
29455
+ y,
29456
+ samples: 1,
29457
+ firstTs: ts,
29458
+ lastTs: ts
29459
+ });
29460
+ }
29461
+ const end = nodes[nodes.length - 1];
29462
+ if (tail !== null && end !== void 0 && end.samples > 1 && (tail.x !== end.x || tail.y !== end.y)) {
29463
+ nodes[nodes.length - 1] = {
29464
+ ...end,
29465
+ samples: end.samples - 1
29466
+ };
29467
+ nodes.push(tail);
29468
+ }
29469
+ return {
29470
+ nodes: downsample(nodes, opts?.maxPoints ?? 120),
29471
+ unlocalized
29472
+ };
29473
+ }
29474
+ /** True when the path has something to draw (two nodes or more). */
29475
+ function isDrawableSubjectPath(path) {
29476
+ return path.nodes.length >= 2;
29477
+ }
29478
+ function inside(p) {
29479
+ return p.x >= 0 && p.x <= 1 && p.y >= 0 && p.y <= 1;
29480
+ }
29481
+ /** Liang–Barsky: the part of segment a→b inside the unit square, or null. */
29482
+ function clipSegment(a, b) {
29483
+ const dx = b.x - a.x;
29484
+ const dy = b.y - a.y;
29485
+ let t0 = 0;
29486
+ let t1 = 1;
29487
+ const edges = [
29488
+ [-dx, a.x],
29489
+ [dx, 1 - a.x],
29490
+ [-dy, a.y],
29491
+ [dy, 1 - a.y]
29492
+ ];
29493
+ for (const [p, q] of edges) {
29494
+ if (p === 0) {
29495
+ if (q < 0) return null;
29496
+ continue;
29497
+ }
29498
+ const r = q / p;
29499
+ if (p < 0) {
29500
+ if (r > t1) return null;
29501
+ if (r > t0) t0 = r;
29502
+ } else {
29503
+ if (r < t0) return null;
29504
+ if (r < t1) t1 = r;
29505
+ }
29506
+ }
29507
+ return [{
29508
+ x: a.x + t0 * dx,
29509
+ y: a.y + t0 * dy
29510
+ }, {
29511
+ x: a.x + t1 * dx,
29512
+ y: a.y + t1 * dy
29513
+ }];
29514
+ }
29515
+ function samePoint(a, b) {
29516
+ return Math.abs(a.x - b.x) < 1e-9 && Math.abs(a.y - b.y) < 1e-9;
29517
+ }
29518
+ /**
29519
+ * The path as seen through `view` — a normalised rectangle of the frame (the
29520
+ * whole frame `{0,0,1,1}`, or the rectangle a crop cut). Points are re-mapped
29521
+ * into the view's own 0..1 space and the line is CLIPPED to it: a path that
29522
+ * leaves the crop and comes back is two runs. Runs of fewer than two points
29523
+ * are dropped, so an empty result means "nothing to draw".
29524
+ */
29525
+ function projectSubjectPath(points, view) {
29526
+ if (points.length < 2 || !(view.w > 0) || !(view.h > 0)) return [];
29527
+ const local = points.map((p) => ({
29528
+ x: (p.x - view.x) / view.w,
29529
+ y: (p.y - view.y) / view.h
29530
+ }));
29531
+ const runs = [];
29532
+ let run = [];
29533
+ for (let i = 1; i < local.length; i++) {
29534
+ const a = local[i - 1];
29535
+ const b = local[i];
29536
+ if (a === void 0 || b === void 0) continue;
29537
+ const seg = clipSegment(a, b);
29538
+ if (seg === null) {
29539
+ if (run.length >= 2) runs.push(run);
29540
+ run = [];
29541
+ continue;
29542
+ }
29543
+ const [from, to] = seg;
29544
+ const last = run[run.length - 1];
29545
+ if (last === void 0 || !samePoint(last, from)) {
29546
+ if (run.length >= 2) runs.push(run);
29547
+ run = [from];
29548
+ }
29549
+ run.push(to);
29550
+ if (!inside(b)) {
29551
+ if (run.length >= 2) runs.push(run);
29552
+ run = [];
29553
+ }
29554
+ }
29555
+ if (run.length >= 2) runs.push(run);
29556
+ return runs;
29557
+ }
29558
+ /** An SVG `points` attribute for a run in a `width` × `height` drawing ("x,y x,y …"). */
29559
+ function subjectPathSvgPoints(run, width, height) {
29560
+ const fmt = (v) => String(Math.round(v * 100) / 100);
29561
+ return run.map((p) => `${fmt(p.x * width)},${fmt(p.y * height)}`).join(" ");
29562
+ }
29378
29563
  //#endregion
29379
29564
  //#region src/notification/alarm-membership.ts
29380
29565
  var ARMED_WORD_PREFIX = "armed_";
@@ -31400,6 +31585,7 @@ exports.alarmDeviceSecureOnArm = alarmDeviceSecureOnArm;
31400
31585
  exports.alarmPatchLanded = alarmPatchLanded;
31401
31586
  exports.buildDeviceEnrollmentLink = buildDeviceEnrollmentLink;
31402
31587
  exports.buildDeviceSignatureMessage = buildDeviceSignatureMessage;
31588
+ exports.buildSubjectPath = buildSubjectPath;
31403
31589
  exports.canonicalIconKey = canonicalIconKey;
31404
31590
  exports.classifyRetrainReview = classifyRetrainReview;
31405
31591
  exports.conditionVisibleForKind = conditionVisibleForKind;
@@ -31410,6 +31596,7 @@ exports.iconCategoryLabel = iconCategoryLabel;
31410
31596
  exports.iconEntry = iconEntry;
31411
31597
  exports.iconsInCategory = iconsInCategory;
31412
31598
  exports.isDefinitiveDeviceRefusal = isDefinitiveDeviceRefusal;
31599
+ exports.isDrawableSubjectPath = isDrawableSubjectPath;
31413
31600
  exports.isHeldBackTemplateVar = isHeldBackTemplateVar;
31414
31601
  exports.isIconKey = isIconKey;
31415
31602
  exports.isSystemRuleKind = isSystemRuleKind;
@@ -31422,6 +31609,7 @@ exports.parseDeviceEnrollmentLink = parseDeviceEnrollmentLink;
31422
31609
  exports.parseRetrainRevisionConflict = parseRetrainRevisionConflict;
31423
31610
  exports.pickerForCondition = pickerForCondition;
31424
31611
  exports.pickerForRuleClasses = pickerForRuleClasses;
31612
+ exports.projectSubjectPath = projectSubjectPath;
31425
31613
  exports.resolveIconKey = resolveIconKey;
31426
31614
  exports.resolveModeDelays = resolveModeDelays;
31427
31615
  exports.retrainBoxIou = retrainBoxIou;
@@ -31436,6 +31624,8 @@ exports.searchIcons = searchIcons;
31436
31624
  exports.sensorTransitionNeverFires = sensorTransitionNeverFires;
31437
31625
  exports.sensorTransitionOffered = sensorTransitionOffered;
31438
31626
  exports.stateLabel = stateLabel;
31627
+ exports.subjectPathSampleFromBox = subjectPathSampleFromBox;
31628
+ exports.subjectPathSvgPoints = subjectPathSvgPoints;
31439
31629
  exports.summarizeReview = summarizeReview;
31440
31630
  exports.systemEventDeliveryProblems = systemEventDeliveryProblems;
31441
31631
  exports.systemEventFilterAppliesToAnyKind = systemEventFilterAppliesToAnyKind;
package/dist/client.mjs CHANGED
@@ -23120,6 +23120,15 @@ var NcMediaPolicySchema = z.object({
23120
23120
  * Replaces `zoneCrop`.
23121
23121
  */
23122
23122
  showTriggerZone: z.boolean().optional(),
23123
+ /**
23124
+ * Draw the SUBJECT'S PATH on the picture — a line in the subject's colour
23125
+ * through the track's positions up to the frame shown, the same path the
23126
+ * debug views draw (`buildSubjectPath`, D903). Every picture mode a subject
23127
+ * is drawn on: a `crop` maps the path into the crop and clips it. Valid only
23128
+ * on a rule whose subject is a tracked object (refused on a sound rule);
23129
+ * dropped on `image: 'none'`. Absent = off.
23130
+ */
23131
+ showSubjectPath: z.boolean().optional(),
23123
23132
  /** @deprecated D897 — accepted from an editor that predates `image`, folded into it on save. */
23124
23133
  attach: z.enum([
23125
23134
  "best",
@@ -29374,6 +29383,182 @@ function ruleEditorSectionsForKind(kind) {
29374
29383
  }
29375
29384
  return sections;
29376
29385
  }
29386
+ var clamp01 = (n) => n < 0 ? 0 : n > 1 ? 1 : n;
29387
+ /** The sample of a normalised box: its centre, its extent. */
29388
+ function subjectPathSampleFromBox(bbox, timestamp) {
29389
+ return {
29390
+ x: bbox.x + bbox.w / 2,
29391
+ y: bbox.y + bbox.h / 2,
29392
+ w: bbox.w,
29393
+ h: bbox.h,
29394
+ ...timestamp !== void 0 ? { timestamp } : {}
29395
+ };
29396
+ }
29397
+ function isPlaceholder(s) {
29398
+ return s.w !== void 0 && s.h !== void 0 && s.w >= .85 && s.h >= .85;
29399
+ }
29400
+ function downsample(xs, max) {
29401
+ if (xs.length <= max || max < 2) return xs;
29402
+ const step = (xs.length - 1) / (max - 1);
29403
+ const out = [];
29404
+ for (let i = 0; i < max - 1; i++) {
29405
+ const x = xs[Math.round(i * step)];
29406
+ if (x !== void 0) out.push(x);
29407
+ }
29408
+ const last = xs[xs.length - 1];
29409
+ if (last !== void 0) out.push(last);
29410
+ return out;
29411
+ }
29412
+ function isFiniteSample(s) {
29413
+ return Number.isFinite(s.x) && Number.isFinite(s.y);
29414
+ }
29415
+ /**
29416
+ * The path of one track from its samples (normalised, oldest → newest).
29417
+ * Pure; never throws; malformed samples are skipped.
29418
+ */
29419
+ function buildSubjectPath(samples, opts) {
29420
+ const until = opts?.untilTimestamp;
29421
+ const nodes = [];
29422
+ let unlocalized = 0;
29423
+ let tail = null;
29424
+ for (let index = 0; index < samples.length; index++) {
29425
+ const s = samples[index];
29426
+ if (s === void 0 || !isFiniteSample(s)) continue;
29427
+ if (until !== void 0 && s.timestamp !== void 0 && s.timestamp > until) continue;
29428
+ if (isPlaceholder(s)) {
29429
+ unlocalized += 1;
29430
+ continue;
29431
+ }
29432
+ const ts = s.timestamp !== void 0 && Number.isFinite(s.timestamp) ? s.timestamp : index;
29433
+ const x = clamp01(s.x);
29434
+ const y = clamp01(s.y);
29435
+ const prev = nodes[nodes.length - 1];
29436
+ if (prev !== void 0 && Math.hypot(x - prev.x, y - prev.y) < .005) {
29437
+ nodes[nodes.length - 1] = {
29438
+ ...prev,
29439
+ samples: prev.samples + 1,
29440
+ lastTs: Math.max(prev.lastTs, ts)
29441
+ };
29442
+ tail = {
29443
+ x,
29444
+ y,
29445
+ samples: 1,
29446
+ firstTs: ts,
29447
+ lastTs: ts
29448
+ };
29449
+ continue;
29450
+ }
29451
+ tail = null;
29452
+ nodes.push({
29453
+ x,
29454
+ y,
29455
+ samples: 1,
29456
+ firstTs: ts,
29457
+ lastTs: ts
29458
+ });
29459
+ }
29460
+ const end = nodes[nodes.length - 1];
29461
+ if (tail !== null && end !== void 0 && end.samples > 1 && (tail.x !== end.x || tail.y !== end.y)) {
29462
+ nodes[nodes.length - 1] = {
29463
+ ...end,
29464
+ samples: end.samples - 1
29465
+ };
29466
+ nodes.push(tail);
29467
+ }
29468
+ return {
29469
+ nodes: downsample(nodes, opts?.maxPoints ?? 120),
29470
+ unlocalized
29471
+ };
29472
+ }
29473
+ /** True when the path has something to draw (two nodes or more). */
29474
+ function isDrawableSubjectPath(path) {
29475
+ return path.nodes.length >= 2;
29476
+ }
29477
+ function inside(p) {
29478
+ return p.x >= 0 && p.x <= 1 && p.y >= 0 && p.y <= 1;
29479
+ }
29480
+ /** Liang–Barsky: the part of segment a→b inside the unit square, or null. */
29481
+ function clipSegment(a, b) {
29482
+ const dx = b.x - a.x;
29483
+ const dy = b.y - a.y;
29484
+ let t0 = 0;
29485
+ let t1 = 1;
29486
+ const edges = [
29487
+ [-dx, a.x],
29488
+ [dx, 1 - a.x],
29489
+ [-dy, a.y],
29490
+ [dy, 1 - a.y]
29491
+ ];
29492
+ for (const [p, q] of edges) {
29493
+ if (p === 0) {
29494
+ if (q < 0) return null;
29495
+ continue;
29496
+ }
29497
+ const r = q / p;
29498
+ if (p < 0) {
29499
+ if (r > t1) return null;
29500
+ if (r > t0) t0 = r;
29501
+ } else {
29502
+ if (r < t0) return null;
29503
+ if (r < t1) t1 = r;
29504
+ }
29505
+ }
29506
+ return [{
29507
+ x: a.x + t0 * dx,
29508
+ y: a.y + t0 * dy
29509
+ }, {
29510
+ x: a.x + t1 * dx,
29511
+ y: a.y + t1 * dy
29512
+ }];
29513
+ }
29514
+ function samePoint(a, b) {
29515
+ return Math.abs(a.x - b.x) < 1e-9 && Math.abs(a.y - b.y) < 1e-9;
29516
+ }
29517
+ /**
29518
+ * The path as seen through `view` — a normalised rectangle of the frame (the
29519
+ * whole frame `{0,0,1,1}`, or the rectangle a crop cut). Points are re-mapped
29520
+ * into the view's own 0..1 space and the line is CLIPPED to it: a path that
29521
+ * leaves the crop and comes back is two runs. Runs of fewer than two points
29522
+ * are dropped, so an empty result means "nothing to draw".
29523
+ */
29524
+ function projectSubjectPath(points, view) {
29525
+ if (points.length < 2 || !(view.w > 0) || !(view.h > 0)) return [];
29526
+ const local = points.map((p) => ({
29527
+ x: (p.x - view.x) / view.w,
29528
+ y: (p.y - view.y) / view.h
29529
+ }));
29530
+ const runs = [];
29531
+ let run = [];
29532
+ for (let i = 1; i < local.length; i++) {
29533
+ const a = local[i - 1];
29534
+ const b = local[i];
29535
+ if (a === void 0 || b === void 0) continue;
29536
+ const seg = clipSegment(a, b);
29537
+ if (seg === null) {
29538
+ if (run.length >= 2) runs.push(run);
29539
+ run = [];
29540
+ continue;
29541
+ }
29542
+ const [from, to] = seg;
29543
+ const last = run[run.length - 1];
29544
+ if (last === void 0 || !samePoint(last, from)) {
29545
+ if (run.length >= 2) runs.push(run);
29546
+ run = [from];
29547
+ }
29548
+ run.push(to);
29549
+ if (!inside(b)) {
29550
+ if (run.length >= 2) runs.push(run);
29551
+ run = [];
29552
+ }
29553
+ }
29554
+ if (run.length >= 2) runs.push(run);
29555
+ return runs;
29556
+ }
29557
+ /** An SVG `points` attribute for a run in a `width` × `height` drawing ("x,y x,y …"). */
29558
+ function subjectPathSvgPoints(run, width, height) {
29559
+ const fmt = (v) => String(Math.round(v * 100) / 100);
29560
+ return run.map((p) => `${fmt(p.x * width)},${fmt(p.y * height)}`).join(" ");
29561
+ }
29377
29562
  //#endregion
29378
29563
  //#region src/notification/alarm-membership.ts
29379
29564
  var ARMED_WORD_PREFIX = "armed_";
@@ -31336,4 +31521,4 @@ var TimelapseRuleSchema = TimelapseRuleInputSchema.extend({
31336
31521
  updatedAt: z.number()
31337
31522
  });
31338
31523
  //#endregion
31339
- export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, AlarmArmModeSchema, CLIP_BROKER_PACED_RATES, COCO_TO_MACRO, CamProfileSchema, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DEFINITIVE_DEVICE_REFUSALS, DEVICE_CERT_RENEW_WINDOW_DAYS, DEVICE_CERT_SIGNATURE, DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE, DEVICE_REFRESH_REFUSAL_PREFIX, DEVICE_SIGNATURE_MESSAGE_VERSION, DeviceType, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_TAXONOMY, ICON_CATEGORIES, ICON_ENTRIES, ICON_KEYS, ICON_VIEWER_MODULES, IconKeySchema, LOCATION_ICON_FALLBACK, MACRO_LABELS, NC_ALARM_DELAY_MAX_SEC, NC_ALARM_SENSORS_MAX, NC_ALARM_SYSTEM_EVENT_KINDS, NC_ALARM_TRIGGERED_MAX_SEC, NC_BATTERY_CONSUMABLE_SYSTEM_EVENT_KINDS, NC_CAMERA_SCOPE_CAP_NAME, NC_CONSUMABLE_LOW_PERCENT_DEFAULT, NC_CONSUMABLE_LOW_PERCENT_MAX, NC_GROUPING_DEFAULT_SEC, NC_GROUPING_MAX_SEC, NC_GROUPING_MIN_SEC, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_SENSOR_TRANSITION_UNSUPPORTED_REASON, NC_SYSTEM_EVENT_FAMILY_FILTERS, NC_SYSTEM_EVENT_KIND_GROUP_SPECS, NC_SYSTEM_EVENT_SUMMARY_FAMILIES, NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS, NC_TEMPLATE_VARS, NcAlarmConfigSchema, NcAlarmSensorsSchema, NcAlarmSettingsPatchSchema, NcHistoryEntrySchema, NcRuleLastRunsSchema, NodeDirectorySchema, RECORDING_EXPORT_MAX_READ_BYTES, RETRAIN_REVIEW_ADJUSTED_IOU, RETRAIN_REVIEW_MATCH_IOU, RETRAIN_REVIEW_STATUSES, RETRAIN_REVISION_CONFLICT, SystemMirror, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleSchema, YAMNET_TO_MACRO, alarmDeviceBlocksArming, alarmDeviceSecureOnArm, alarmPatchLanded, buildDeviceEnrollmentLink, buildDeviceSignatureMessage, canonicalIconKey, classifyRetrainReview, conditionVisibleForKind, createSystemProxy, deviceRefusalFromMessage, droppedConditionsForKind, iconCategoryLabel, iconEntry, iconsInCategory, isDefinitiveDeviceRefusal, isHeldBackTemplateVar, isIconKey, isSystemRuleKind, kindsForDiscriminator, knownValues, locationIconKey, nodePickerItems, packagePickerItems, parseDeviceEnrollmentLink, parseRetrainRevisionConflict, pickerForCondition, pickerForRuleClasses, resolveIconKey, resolveModeDelays, retrainBoxIou, retrainRevisionConflictMessage, ruleDeviceCompatCapNames, ruleEditorSectionsForKind, ruleGroupingApplies, ruleKindOf, ruleKindSpec, ruleSeedForSection, searchIcons, sensorTransitionNeverFires, sensorTransitionOffered, stateLabel, summarizeReview, systemEventDeliveryProblems, systemEventFilterAppliesToAnyKind, systemEventKindsOfFamily, systemFamilyOfKind, templateCarriesSummary, templateVarDeliveryApplies, templateVarKindApplies, templateVarSystemEventApplies };
31524
+ export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, AlarmArmModeSchema, CLIP_BROKER_PACED_RATES, COCO_TO_MACRO, CamProfileSchema, DEFAULT_TIMELAPSE_PREVIEW_TEXT, DEFINITIVE_DEVICE_REFUSALS, DEVICE_CERT_RENEW_WINDOW_DAYS, DEVICE_CERT_SIGNATURE, DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE, DEVICE_REFRESH_REFUSAL_PREFIX, DEVICE_SIGNATURE_MESSAGE_VERSION, DeviceType, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_TAXONOMY, ICON_CATEGORIES, ICON_ENTRIES, ICON_KEYS, ICON_VIEWER_MODULES, IconKeySchema, LOCATION_ICON_FALLBACK, MACRO_LABELS, NC_ALARM_DELAY_MAX_SEC, NC_ALARM_SENSORS_MAX, NC_ALARM_SYSTEM_EVENT_KINDS, NC_ALARM_TRIGGERED_MAX_SEC, NC_BATTERY_CONSUMABLE_SYSTEM_EVENT_KINDS, NC_CAMERA_SCOPE_CAP_NAME, NC_CONSUMABLE_LOW_PERCENT_DEFAULT, NC_CONSUMABLE_LOW_PERCENT_MAX, NC_GROUPING_DEFAULT_SEC, NC_GROUPING_MAX_SEC, NC_GROUPING_MIN_SEC, NC_RULE_EDITOR_SECTION_ORDER, NC_RULE_KIND_SPECS, NC_SENSOR_TRANSITION_UNSUPPORTED_REASON, NC_SYSTEM_EVENT_FAMILY_FILTERS, NC_SYSTEM_EVENT_KIND_GROUP_SPECS, NC_SYSTEM_EVENT_SUMMARY_FAMILIES, NC_TEMPLATE_HELD_BACK_SYSTEM_EVENT_KINDS, NC_TEMPLATE_VARS, NcAlarmConfigSchema, NcAlarmSensorsSchema, NcAlarmSettingsPatchSchema, NcHistoryEntrySchema, NcRuleLastRunsSchema, NodeDirectorySchema, RECORDING_EXPORT_MAX_READ_BYTES, RETRAIN_REVIEW_ADJUSTED_IOU, RETRAIN_REVIEW_MATCH_IOU, RETRAIN_REVIEW_STATUSES, RETRAIN_REVISION_CONFLICT, SystemMirror, TIMELAPSE_DENSE_FLOOR_SEC, TimelapseRuleSchema, YAMNET_TO_MACRO, alarmDeviceBlocksArming, alarmDeviceSecureOnArm, alarmPatchLanded, buildDeviceEnrollmentLink, buildDeviceSignatureMessage, buildSubjectPath, canonicalIconKey, classifyRetrainReview, conditionVisibleForKind, createSystemProxy, deviceRefusalFromMessage, droppedConditionsForKind, iconCategoryLabel, iconEntry, iconsInCategory, isDefinitiveDeviceRefusal, isDrawableSubjectPath, isHeldBackTemplateVar, isIconKey, isSystemRuleKind, kindsForDiscriminator, knownValues, locationIconKey, nodePickerItems, packagePickerItems, parseDeviceEnrollmentLink, parseRetrainRevisionConflict, pickerForCondition, pickerForRuleClasses, projectSubjectPath, resolveIconKey, resolveModeDelays, retrainBoxIou, retrainRevisionConflictMessage, ruleDeviceCompatCapNames, ruleEditorSectionsForKind, ruleGroupingApplies, ruleKindOf, ruleKindSpec, ruleSeedForSection, searchIcons, sensorTransitionNeverFires, sensorTransitionOffered, stateLabel, subjectPathSampleFromBox, subjectPathSvgPoints, summarizeReview, systemEventDeliveryProblems, systemEventFilterAppliesToAnyKind, systemEventKindsOfFamily, systemFamilyOfKind, templateCarriesSummary, templateVarDeliveryApplies, templateVarKindApplies, templateVarSystemEventApplies };
@@ -9137,13 +9137,6 @@ export type AppRouter = TrpcCoreRouter<{
9137
9137
  output: z.infer<typeof storageAdminCapability.methods.listTables.output>;
9138
9138
  meta: object;
9139
9139
  }>;
9140
- dropCollection: TRPCMutationProcedure<{
9141
- input: {
9142
- [x: string]: unknown;
9143
- } & z.input<typeof storageAdminCapability.methods.dropCollection.input>;
9144
- output: z.infer<typeof storageAdminCapability.methods.dropCollection.output>;
9145
- meta: object;
9146
- }>;
9147
9140
  listKinds: TRPCQueryProcedure<{
9148
9141
  input: {
9149
9142
  [x: string]: unknown;
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 1382 method paths across 179 capabilities.
9
+ * Coverage: 1381 method paths across 179 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {