@camstack/types 1.2.364 → 1.2.366

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.
Files changed (93) hide show
  1. package/dist/addon.js +3 -2
  2. package/dist/addon.mjs +3 -2
  3. package/dist/auth/device-certificate.d.ts +372 -0
  4. package/dist/auth/request-origin.d.ts +43 -0
  5. package/dist/capabilities/air-quality-sensor.cap.d.ts +32 -0
  6. package/dist/capabilities/alarm-panel.cap.d.ts +4 -0
  7. package/dist/capabilities/ambient-light-sensor.cap.d.ts +13 -0
  8. package/dist/capabilities/audio-metrics.cap.d.ts +4 -0
  9. package/dist/capabilities/automation-control.cap.d.ts +4 -0
  10. package/dist/capabilities/battery.cap.d.ts +11 -0
  11. package/dist/capabilities/binary.cap.d.ts +10 -0
  12. package/dist/capabilities/brightness.cap.d.ts +12 -0
  13. package/dist/capabilities/camera-streams.cap.d.ts +4 -0
  14. package/dist/capabilities/capability-definition.d.ts +70 -0
  15. package/dist/capabilities/carbon-monoxide.cap.d.ts +10 -0
  16. package/dist/capabilities/climate-control.cap.d.ts +32 -0
  17. package/dist/capabilities/color.cap.d.ts +4 -0
  18. package/dist/capabilities/connectivity.cap.d.ts +4 -0
  19. package/dist/capabilities/consumables.cap.d.ts +4 -0
  20. package/dist/capabilities/contact.cap.d.ts +10 -0
  21. package/dist/capabilities/control.cap.d.ts +4 -0
  22. package/dist/capabilities/cover.cap.d.ts +12 -0
  23. package/dist/capabilities/day-night.cap.d.ts +4 -0
  24. package/dist/capabilities/device-credentials.cap.d.ts +174 -0
  25. package/dist/capabilities/device-discovery.cap.d.ts +4 -0
  26. package/dist/capabilities/device-status.cap.d.ts +10 -0
  27. package/dist/capabilities/doorbell.cap.d.ts +4 -0
  28. package/dist/capabilities/enum-sensor.cap.d.ts +4 -0
  29. package/dist/capabilities/event-emitter.cap.d.ts +4 -0
  30. package/dist/capabilities/fan-control.cap.d.ts +15 -0
  31. package/dist/capabilities/feature-probe.cap.d.ts +4 -0
  32. package/dist/capabilities/flood.cap.d.ts +10 -0
  33. package/dist/capabilities/gas.cap.d.ts +10 -0
  34. package/dist/capabilities/humidifier.cap.d.ts +15 -0
  35. package/dist/capabilities/humidity-sensor.cap.d.ts +12 -0
  36. package/dist/capabilities/image-settings.cap.d.ts +4 -0
  37. package/dist/capabilities/image.cap.d.ts +4 -0
  38. package/dist/capabilities/index.d.ts +7 -3
  39. package/dist/capabilities/intercom.cap.d.ts +4 -0
  40. package/dist/capabilities/lawn-mower-control.cap.d.ts +12 -0
  41. package/dist/capabilities/lock-control.cap.d.ts +4 -0
  42. package/dist/capabilities/media-player.cap.d.ts +4 -0
  43. package/dist/capabilities/motion-trigger.cap.d.ts +4 -0
  44. package/dist/capabilities/motion-zones.cap.d.ts +4 -0
  45. package/dist/capabilities/motion.cap.d.ts +11 -0
  46. package/dist/capabilities/native-object-detection.cap.d.ts +4 -0
  47. package/dist/capabilities/navigation.cap.d.ts +4 -0
  48. package/dist/capabilities/network-link.cap.d.ts +19 -0
  49. package/dist/capabilities/node-certificates.cap.d.ts +128 -0
  50. package/dist/capabilities/notifier.cap.d.ts +4 -0
  51. package/dist/capabilities/numeric-sensor.cap.d.ts +12 -0
  52. package/dist/capabilities/pet-feeder.cap.d.ts +25 -0
  53. package/dist/capabilities/power-meter.cap.d.ts +43 -0
  54. package/dist/capabilities/presence.cap.d.ts +12 -0
  55. package/dist/capabilities/pressure-sensor.cap.d.ts +12 -0
  56. package/dist/capabilities/privacy-mask.cap.d.ts +4 -0
  57. package/dist/capabilities/ptz-autotrack.cap.d.ts +4 -0
  58. package/dist/capabilities/recording-onboard.cap.d.ts +4 -0
  59. package/dist/capabilities/recording-signal.cap.d.ts +4 -0
  60. package/dist/capabilities/scene-monitor.cap.d.ts +4 -0
  61. package/dist/capabilities/script-runner.cap.d.ts +4 -0
  62. package/dist/capabilities/smoke.cap.d.ts +10 -0
  63. package/dist/capabilities/stream-catalog.cap.d.ts +4 -0
  64. package/dist/capabilities/stream-params.cap.d.ts +4 -0
  65. package/dist/capabilities/stream-signals.cap.d.ts +4 -0
  66. package/dist/capabilities/switch.cap.d.ts +10 -0
  67. package/dist/capabilities/tamper.cap.d.ts +10 -0
  68. package/dist/capabilities/temperature-sensor.cap.d.ts +12 -0
  69. package/dist/capabilities/update.cap.d.ts +4 -0
  70. package/dist/capabilities/vacuum-control.cap.d.ts +32 -0
  71. package/dist/capabilities/valve.cap.d.ts +12 -0
  72. package/dist/capabilities/vibration.cap.d.ts +10 -0
  73. package/dist/capabilities/water-heater.cap.d.ts +17 -0
  74. package/dist/capabilities/weather.cap.d.ts +27 -0
  75. package/dist/capabilities/zone-analytics.cap.d.ts +4 -0
  76. package/dist/capabilities/zone-rules.cap.d.ts +4 -0
  77. package/dist/capabilities/zones.cap.d.ts +4 -0
  78. package/dist/client.d.ts +1 -1
  79. package/dist/client.js +255 -0
  80. package/dist/client.mjs +245 -1
  81. package/dist/generated/addon-api.d.ts +797 -4
  82. package/dist/generated/cap-input-defaults.d.ts +1 -1
  83. package/dist/generated/capability-router-map.d.ts +8 -2
  84. package/dist/generated/history-catalog.d.ts +11 -0
  85. package/dist/generated/method-access-map.d.ts +1 -1
  86. package/dist/generated/system-proxy.d.ts +2 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.js +1574 -34
  89. package/dist/index.mjs +1522 -35
  90. package/dist/interfaces/auth.d.ts +6 -0
  91. package/dist/{sleep-BBF1iXUi.mjs → sleep-DxJdzHni.mjs} +26 -1
  92. package/dist/{sleep-BBXNq778.js → sleep-NZlEFYGX.js} +37 -0
  93. package/package.json +1 -1
package/dist/client.mjs CHANGED
@@ -558,6 +558,240 @@ z.object({
558
558
  resolution: CamStreamResolutionSchema.optional()
559
559
  });
560
560
  //#endregion
561
+ //#region src/auth/device-certificate.ts
562
+ /**
563
+ * Device certificates (D855) — the wire contract shared by the hub, the admin
564
+ * UI and the native viewer.
565
+ *
566
+ * A device (a phone) generates its OWN P-256 key pair in hardware (Secure
567
+ * Enclave / Android Keystore / a non-extractable WebCrypto key). The private
568
+ * key never travels. The hub signs the PUBLIC key into an X.509 leaf under a
569
+ * dedicated device CA; the device later proves possession of the key by
570
+ * signing a hub-issued nonce, and the hub answers with the same session a
571
+ * password login opens.
572
+ *
573
+ * Everything on the wire is a small string (a PEM, a base64url signature):
574
+ * D613 is about bulk bytes, and a certificate is ~600 bytes.
575
+ */
576
+ /** Signature algorithm of every device credential: ECDSA, curve P-256, SHA-256. */
577
+ var DEVICE_CERT_SIGNATURE = "ecdsa-p256-sha256";
578
+ /** First line of every signed message; a change of format bumps the version. */
579
+ var DEVICE_SIGNATURE_MESSAGE_VERSION = "camstack-device-cert-v1";
580
+ z.enum([
581
+ "login",
582
+ "renew",
583
+ "revoke"
584
+ ]);
585
+ var DEVICE_CERT_RENEW_WINDOW_DAYS = 30;
586
+ /**
587
+ * The exact bytes a device signs (UTF-8, `\n` separators, no trailing newline):
588
+ *
589
+ * camstack-device-cert-v1
590
+ * <login|renew>
591
+ * <origin> the hub origin returned by `getDeviceChallenge`
592
+ * <nonce>
593
+ *
594
+ * The origin is part of the message so a signature collected by a look-alike
595
+ * hub is worthless on the real one; the hub additionally binds the nonce to
596
+ * the origin it issued it for and refuses any other.
597
+ */
598
+ function buildDeviceSignatureMessage(input) {
599
+ return [
600
+ DEVICE_SIGNATURE_MESSAGE_VERSION,
601
+ input.purpose,
602
+ input.origin,
603
+ input.nonce
604
+ ].join("\n");
605
+ }
606
+ /** The deep link a QR carries: `camstack://enroll?hub=<origin>&code=<code>`. */
607
+ function buildDeviceEnrollmentLink(input) {
608
+ const query = new URLSearchParams();
609
+ if (input.hub !== void 0) query.set("hub", input.hub);
610
+ query.set("code", input.code);
611
+ return `${input.scheme ?? "camstack"}://enroll?${query.toString()}`;
612
+ }
613
+ /** Parse an enrollment deep link; `null` when it is not one. `hub` is absent when the link names none. */
614
+ function parseDeviceEnrollmentLink(raw) {
615
+ let url;
616
+ try {
617
+ url = new URL(raw);
618
+ } catch {
619
+ return null;
620
+ }
621
+ if (url.protocol !== "camstack:" && url.protocol !== "camstack.dev:") return null;
622
+ if (url.hostname !== "enroll") return null;
623
+ const code = url.searchParams.get("code");
624
+ if (code === null || code === "") return null;
625
+ const hub = url.searchParams.get("hub");
626
+ return {
627
+ hub: hub === null || hub === "" ? null : hub,
628
+ code
629
+ };
630
+ }
631
+ var DevicePlatformSchema = z.enum([
632
+ "ios",
633
+ "android",
634
+ "web",
635
+ "other"
636
+ ]);
637
+ var Base64UrlSchema = z.string().min(1).max(4096).regex(/^[A-Za-z0-9_-]+$/);
638
+ var PemSchema = z.string().min(1).max(16384);
639
+ /**
640
+ * Why a device-certificate endpoint said no. Distinct from a transport / 5xx
641
+ * failure: those carry no reason and mean "try again", never "the credential is
642
+ * dead". The viewer switches on this exhaustively.
643
+ */
644
+ var DeviceRefusalReasonSchema = z.enum([
645
+ "revoked",
646
+ "unknown-credential",
647
+ "expired",
648
+ "bad-signature",
649
+ "nonce-invalid",
650
+ "rate-limited",
651
+ "invalid-certificate",
652
+ "superseded",
653
+ "user-gone",
654
+ "unavailable",
655
+ "code-invalid",
656
+ "self-enrollment-disabled",
657
+ "step-up-required",
658
+ "bad-public-key"
659
+ ]);
660
+ /** The only answers after which the app may count towards deleting its credential. */
661
+ var DEFINITIVE_DEVICE_REFUSALS = [
662
+ "revoked",
663
+ "unknown-credential",
664
+ "user-gone"
665
+ ];
666
+ /** Consecutive DEFINITIVE answers before the app deletes its key and certificate. */
667
+ var DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = 3;
668
+ function isDefinitiveDeviceRefusal(reason) {
669
+ return DEFINITIVE_DEVICE_REFUSALS.includes(reason);
670
+ }
671
+ var DeviceRefusalSchema = z.object({
672
+ ok: z.literal(false),
673
+ reason: DeviceRefusalReasonSchema,
674
+ definitive: z.boolean(),
675
+ retryAfterSeconds: z.number().optional()
676
+ });
677
+ /**
678
+ * A credential-bound session that can no longer refresh answers
679
+ * `auth.refreshSession` with UNAUTHORIZED whose message is this prefix + the
680
+ * reason; {@link deviceRefusalFromMessage} reads it back.
681
+ */
682
+ var DEVICE_REFRESH_REFUSAL_PREFIX = "device-credential:";
683
+ function deviceRefusalFromMessage(message) {
684
+ if (!message.startsWith("device-credential:")) return null;
685
+ const parsed = DeviceRefusalReasonSchema.safeParse(message.slice(18));
686
+ return parsed.success ? parsed.data : null;
687
+ }
688
+ z.object({
689
+ code: z.string().min(1).max(256),
690
+ /** SubjectPublicKeyInfo DER of the device's P-256 public key, base64url. */
691
+ publicKeySpki: Base64UrlSchema,
692
+ deviceName: z.string().min(1).max(80).optional(),
693
+ platform: DevicePlatformSchema
694
+ });
695
+ var CompleteEnrollmentOutputSchema = z.object({
696
+ credentialId: z.string(),
697
+ certPem: PemSchema,
698
+ /** The device CA certificate the leaf chains to. */
699
+ chainPem: PemSchema,
700
+ notAfter: z.number(),
701
+ user: z.object({
702
+ id: z.string(),
703
+ username: z.string()
704
+ })
705
+ });
706
+ z.discriminatedUnion("ok", [CompleteEnrollmentOutputSchema.extend({ ok: z.literal(true) }), DeviceRefusalSchema]);
707
+ z.object({
708
+ /** The single-use step-up proof (`auth.deviceEnrollProofFrom…`). */
709
+ proof: z.string().min(1).max(512),
710
+ publicKeySpki: Base64UrlSchema,
711
+ deviceName: z.string().min(1).max(80),
712
+ platform: DevicePlatformSchema
713
+ });
714
+ z.object({
715
+ proof: z.string(),
716
+ expiresAt: z.number()
717
+ });
718
+ var DeviceChallengeSchema = z.object({
719
+ nonce: z.string(),
720
+ /** The origin to put in the signed message. The app compares it to the hub it dialled. */
721
+ origin: z.string(),
722
+ expiresAt: z.number(),
723
+ signature: z.literal(DEVICE_CERT_SIGNATURE)
724
+ });
725
+ z.discriminatedUnion("ok", [DeviceChallengeSchema.extend({ ok: z.literal(true) }), DeviceRefusalSchema]);
726
+ z.object({
727
+ certPem: PemSchema,
728
+ nonce: z.string().min(1).max(256),
729
+ /** ECDSA P-256 SHA-256 over {@link buildDeviceSignatureMessage}; raw r||s or DER, base64url. */
730
+ signature: Base64UrlSchema
731
+ });
732
+ var RenewDeviceCertificateOutputSchema = z.object({
733
+ credentialId: z.string(),
734
+ certPem: PemSchema,
735
+ chainPem: PemSchema,
736
+ notAfter: z.number()
737
+ });
738
+ z.discriminatedUnion("ok", [RenewDeviceCertificateOutputSchema.extend({ ok: z.literal(true) }), DeviceRefusalSchema]);
739
+ z.discriminatedUnion("ok", [z.object({
740
+ ok: z.literal(true),
741
+ credentialId: z.string(),
742
+ sessionsEnded: z.number().int()
743
+ }), DeviceRefusalSchema]);
744
+ var DeviceCredentialStatusSchema = z.enum([
745
+ "active",
746
+ "expired",
747
+ "revoked"
748
+ ]);
749
+ z.object({
750
+ id: z.string(),
751
+ userId: z.string(),
752
+ username: z.string().nullable(),
753
+ deviceName: z.string(),
754
+ platform: DevicePlatformSchema,
755
+ enrolledVia: z.enum(["qr", "self"]),
756
+ /** SHA-256 of the leaf certificate DER, colon-hex. */
757
+ fingerprint: z.string(),
758
+ issuedAt: z.number(),
759
+ expiresAt: z.number(),
760
+ lastUsedAt: z.number().nullable(),
761
+ lastUsedFrom: z.string().nullable(),
762
+ revokedAt: z.number().nullable(),
763
+ /** `admin:<userId>` | `user:<userId>` | `device` | `user-deleted`. */
764
+ revokedBy: z.string().nullable(),
765
+ status: DeviceCredentialStatusSchema
766
+ });
767
+ z.object({
768
+ /** Shown once; only its hash is kept. */
769
+ code: z.string(),
770
+ expiresAt: z.number(),
771
+ /** `camstack://enroll?hub=…&code=…` — what the QR encodes. */
772
+ enrollUrl: z.string(),
773
+ /** The hub origin in the link, or `null` when the hub could not name one (the link then has no `hub`). */
774
+ hubOrigin: z.string().nullable(),
775
+ /** Every origin the apps may try (role `appConnections`). */
776
+ hubOrigins: z.array(z.string())
777
+ });
778
+ z.object({
779
+ kind: z.literal("device-certificate"),
780
+ id: z.literal("device-certificate"),
781
+ label: z.string(),
782
+ stage: z.literal("primary"),
783
+ /** tRPC paths under the hub's `auth` router, so a client names no literal. */
784
+ challengePath: z.literal("auth.getDeviceChallenge"),
785
+ revokePath: z.literal("auth.revokeOwnDeviceCertificate"),
786
+ enrollSelfPath: z.literal("auth.enrollSelf"),
787
+ loginPath: z.literal("auth.loginWithDeviceCertificate"),
788
+ renewPath: z.literal("auth.renewDeviceCertificate"),
789
+ signature: z.literal(DEVICE_CERT_SIGNATURE),
790
+ messageVersion: z.literal(DEVICE_SIGNATURE_MESSAGE_VERSION),
791
+ /** Which clients can execute it: a native app silently, a browser with a non-extractable WebCrypto key. */
792
+ clients: z.array(z.enum(["native", "web"]))
793
+ });
794
+ //#endregion
561
795
  //#region src/catalogs/sensor-active-state.ts
562
796
  /**
563
797
  * THE table "which boolean of this device type counts as HIGH", and the
@@ -27411,6 +27645,16 @@ function createSystemProxy(api) {
27411
27645
  release: (input) => dispatch("deviceAdoption", "release", "mutation", input),
27412
27646
  resync: (input) => dispatch("deviceAdoption", "resync", "mutation", input)
27413
27647
  },
27648
+ deviceCredentials: {
27649
+ listDeviceCredentials: (input) => dispatch("deviceCredentials", "listDeviceCredentials", "query", input),
27650
+ startEnrollment: (input) => dispatch("deviceCredentials", "startEnrollment", "mutation", input),
27651
+ revokeDeviceCredential: (input) => dispatch("deviceCredentials", "revokeDeviceCredential", "mutation", input),
27652
+ getDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "getDeviceCertificateSettings", "query", input),
27653
+ setDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "setDeviceCertificateSettings", "mutation", input),
27654
+ deleteDeviceCredential: (input) => dispatch("deviceCredentials", "deleteDeviceCredential", "mutation", input),
27655
+ getDeviceCaStatus: (input) => dispatch("deviceCredentials", "getDeviceCaStatus", "query", input),
27656
+ renameDeviceCredential: (input) => dispatch("deviceCredentials", "renameDeviceCredential", "mutation", input)
27657
+ },
27414
27658
  deviceExport: {
27415
27659
  getStatus: (input) => dispatch("deviceExport", "getStatus", "query", input),
27416
27660
  listSupportedDeviceKinds: (input) => dispatch("deviceExport", "listSupportedDeviceKinds", "query", input),
@@ -30873,4 +31117,4 @@ var TimelapseRuleSchema = TimelapseRuleInputSchema.extend({
30873
31117
  updatedAt: z.number()
30874
31118
  });
30875
31119
  //#endregion
30876
- export { APPLE_SA_TO_MACRO, AUDIO_MACRO_LABELS, AlarmArmModeSchema, CLIP_BROKER_PACED_RATES, COCO_TO_MACRO, CamProfileSchema, DEFAULT_TIMELAPSE_PREVIEW_TEXT, 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, canonicalIconKey, classifyRetrainReview, conditionVisibleForKind, createSystemProxy, droppedConditionsForKind, iconCategoryLabel, iconEntry, iconsInCategory, isHeldBackTemplateVar, isIconKey, isSystemRuleKind, kindsForDiscriminator, knownValues, locationIconKey, nodePickerItems, packagePickerItems, 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 };
31120
+ 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 };