@7365admin1/core 3.80.0 → 3.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -6626,9 +6626,36 @@ type TRobotMetadata = {
6626
6626
  siteId?: string | ObjectId;
6627
6627
  administratorId?: string | ObjectId;
6628
6628
  };
6629
+ /**
6630
+ * Which kind of device this row is.
6631
+ *
6632
+ * Both kinds are managed through the one `robot-mgmt` module and this one
6633
+ * collection - they are one fleet with two device classes, not two features. The
6634
+ * apps differ only in which type they ask for: the cleaning robot appears in
6635
+ * Property Management, Hygiene, iMA365 and iClean365; the security robot in
6636
+ * Security.
6637
+ */
6638
+ declare const ROBOT_TYPES: readonly ["cleaning", "security"];
6639
+ type TRobotType = (typeof ROBOT_TYPES)[number];
6629
6640
  type TRobot = {
6630
6641
  _id?: ObjectId;
6631
6642
  name: string;
6643
+ type?: TRobotType;
6644
+ /**
6645
+ * The robot's serial as the vendor cloud knows it.
6646
+ *
6647
+ * Optional because the Add Robot form does not ask for it - it collects a
6648
+ * nickname and a credential pair. But EVERY per-robot cloud endpoint
6649
+ * (`get-map-list`, `tracking`, every cleaning command) takes `robotSn`, so
6650
+ * without it a registered robot cannot be reached at all. When it is absent
6651
+ * the fleet service discovers it from `get-robot-list` and stores it.
6652
+ *
6653
+ * ponytail: discovery covers both credential schemes while the vendor has not
6654
+ * answered whether appid/secret is issued per robot or per account (question 2
6655
+ * on the vendor sheet). If it turns out to be per account, this becomes a
6656
+ * picker instead of a lookup.
6657
+ */
6658
+ robotSn?: string;
6632
6659
  appKey: string;
6633
6660
  appToken: string;
6634
6661
  createdBy: string | ObjectId;
@@ -6642,6 +6669,15 @@ type TRobot = {
6642
6669
  declare const robotSchema: Joi.ObjectSchema<any>;
6643
6670
  declare function MRobot(value: TRobot): {
6644
6671
  name: string;
6672
+ /**
6673
+ * Defaulted, not required. Security robots are not integrated yet, so every
6674
+ * robot registered today is a cleaning robot; making the field mandatory
6675
+ * would break the existing Add Robot form for no gain. Rows written before
6676
+ * this field existed simply have no `type` and are matched by an unfiltered
6677
+ * query - nothing is backfilled.
6678
+ */
6679
+ type: "security" | "cleaning";
6680
+ robotSn: string;
6645
6681
  appKey: string;
6646
6682
  appToken: string;
6647
6683
  createdBy: string | ObjectId;
@@ -6661,7 +6697,7 @@ declare function useRobotRepo(): {
6661
6697
  createIndex: () => Promise<void>;
6662
6698
  createTextIndex: () => Promise<void>;
6663
6699
  createRobot: (value: TRobot, session?: ClientSession) => Promise<ObjectId>;
6664
- getRobots: ({ search, page, limit, sort, organization, site, status, from, to, }: {
6700
+ getRobots: ({ search, page, limit, sort, organization, site, status, type, from, to, }: {
6665
6701
  search?: string | undefined;
6666
6702
  page?: number | undefined;
6667
6703
  limit?: number | undefined;
@@ -6669,6 +6705,7 @@ declare function useRobotRepo(): {
6669
6705
  organization: string | ObjectId;
6670
6706
  site: string | ObjectId;
6671
6707
  status?: string | undefined;
6708
+ type?: string | undefined;
6672
6709
  from?: string | undefined;
6673
6710
  to?: string | undefined;
6674
6711
  }) => Promise<{
@@ -6679,8 +6716,8 @@ declare function useRobotRepo(): {
6679
6716
  };
6680
6717
 
6681
6718
  declare function useRobotService(): {
6682
- createRobot: (value: TRobot) => Promise<ObjectId>;
6683
- getRobots: ({ search, page, limit, sort, organization, site, status, from, to, }: {
6719
+ createRobot: (value: TRobot) => Promise<bson.ObjectId>;
6720
+ getRobots: ({ search, page, limit, sort, organization, site, status, type, from, to, }: {
6684
6721
  search?: string | undefined;
6685
6722
  page?: number | undefined;
6686
6723
  limit?: number | undefined;
@@ -6688,6 +6725,7 @@ declare function useRobotService(): {
6688
6725
  organization: string;
6689
6726
  site: string;
6690
6727
  status: string;
6728
+ type?: string | undefined;
6691
6729
  serviceProvider?: string | undefined;
6692
6730
  from?: string | undefined;
6693
6731
  to?: string | undefined;
@@ -6703,6 +6741,661 @@ declare function useRobotController(): {
6703
6741
  getRobots: (req: Request, res: Response, next: NextFunction) => Promise<void>;
6704
6742
  };
6705
6743
 
6744
+ /**
6745
+ * Cleaning-robot cloud: the pure parts.
6746
+ *
6747
+ * Everything here is a pure function so it can be tested without a network, a
6748
+ * database or a robot. The HTTP calls live in `robot-cloud.service.ts`; this
6749
+ * file owns the request signature, the status vocabulary and the two coordinate
6750
+ * conversions the cloud's own documentation leaves the caller to do.
6751
+ *
6752
+ * Source: "Robot Cloud API Document (2025.05.27)". The cloud is ours, so where
6753
+ * the document is ambiguous the ambiguity is recorded here rather than guessed
6754
+ * away - see ROBOT_CLOUD_DOC_CONFIRMATIONS at the bottom.
6755
+ */
6756
+ /**
6757
+ * The exact string the cloud hashes. Order is fixed by the spec:
6758
+ *
6759
+ * appid=[appid],timestamp=[timestamp],url=[path],secret=[secret]
6760
+ *
6761
+ * `path` is the request path as the document writes it, leading slash included
6762
+ * (e.g. `/portal/robots/get-robot-list`). It is part of the hash, so a trailing
6763
+ * slash or a missing one produces a different - rejected - signature.
6764
+ *
6765
+ * Exported for the tests: the assertion that matters is the string's shape, and
6766
+ * the shape is invisible once it has been hashed.
6767
+ */
6768
+ declare function robotCloudSigningString(appid: string, timestamp: string, path: string, secret: string): string;
6769
+ /** `yyyyMMddHHmmss`, the only format the cloud accepts. */
6770
+ declare function robotCloudTimestamp(now?: Date): string;
6771
+ /**
6772
+ * SHA-1 of the signing string, lower-case hex.
6773
+ *
6774
+ * SHA-1 is the cloud's choice, not ours; it is a request signature against a
6775
+ * shared secret, not a password hash. Changing it here would simply be rejected
6776
+ * at the other end.
6777
+ */
6778
+ declare function robotCloudSign(appid: string, timestamp: string, path: string, secret: string): string;
6779
+ /**
6780
+ * The signed envelope every endpoint expects, merged with the call's own
6781
+ * parameters. The secret goes into the hash and is NEVER a field - if it ever
6782
+ * appears in a request body, that is the bug to look for.
6783
+ */
6784
+ declare function robotCloudBody(appid: string, secret: string, path: string, params?: Record<string, unknown>, now?: Date): Record<string, unknown>;
6785
+ /** Every documented endpoint. The key is also the signed `url`. */
6786
+ declare const ROBOT_CLOUD_PATHS: {
6787
+ readonly robotList: "/portal/robots/get-robot-list";
6788
+ readonly mapList: "/portal/maps/get-map-list";
6789
+ readonly fileUrl: "/portal/maps/get-file-url";
6790
+ readonly tracking: "/portal/robots/tracking";
6791
+ readonly startFullCleaning: "/portal/robots/start-full-cleaning";
6792
+ readonly startAreaCleaning: "/portal/robots/start-area-cleaning";
6793
+ readonly startSpotCleaning: "/portal/robots/start-spot-cleaning";
6794
+ readonly returnToBase: "/portal/robots/return-to-base";
6795
+ readonly plansList: "/portal/plans/list";
6796
+ readonly plansSave: "/portal/plans/save";
6797
+ };
6798
+ type TRobotCloudPath = (typeof ROBOT_CLOUD_PATHS)[keyof typeof ROBOT_CLOUD_PATHS];
6799
+ /**
6800
+ * The cloud's 27 status codes, verbatim from the document (including its
6801
+ * "switching floow" typo, corrected here in the label only).
6802
+ */
6803
+ declare const ROBOT_STATUS_NAMES: Readonly<Record<number, string>>;
6804
+ /**
6805
+ * The vocabulary our own apps speak. Twenty-seven vendor codes are too many to
6806
+ * put in front of a cleaner on a phone, and they are not stable across firmware
6807
+ * - so every screen reads this, never `statusFlag`.
6808
+ */
6809
+ type TRobotMode = "IDLE" | "CHARGED" | "WORKING" | "PAUSED" | "CHARGING_CYCLE" | "MAINTENANCE" | "IN_TRANSIT" | "MANUAL" | "UNAVAILABLE";
6810
+ /**
6811
+ * An UNRECOGNISED code is UNAVAILABLE, not IDLE.
6812
+ *
6813
+ * This is the one branch in the file worth being careful about. A new firmware
6814
+ * status we have never seen must not read as "free, send it a job" - dispatching
6815
+ * onto an unknown state is how a robot gets two jobs at once. Fail closed.
6816
+ */
6817
+ declare function robotMode(statusFlag: unknown): TRobotMode;
6818
+ /** Only these two modes may be sent a new job. */
6819
+ declare function isDispatchable(statusFlag: unknown): boolean;
6820
+ /**
6821
+ * `onlineFlag` beats `statusFlag`. The list endpoint can report a cached status
6822
+ * for a robot that has since dropped off the network.
6823
+ */
6824
+ declare function robotModeFromList(item: {
6825
+ statusFlag?: unknown;
6826
+ onlineFlag?: unknown;
6827
+ }): TRobotMode;
6828
+ /**
6829
+ * The cloud uses TWO frames and never says so in one place:
6830
+ *
6831
+ * - `tracking` reports x/y in METRES in the map frame.
6832
+ * - `start-spot-cleaning` takes x/y in PIXELS of the map image.
6833
+ *
6834
+ * so anything that turns a click on the floor plan into a spot-clean, or a live
6835
+ * pose into a dot on that plan, goes through here.
6836
+ *
6837
+ * `imageHeight` is the background PNG's height in pixels. The vertical flip is
6838
+ * the standard occupancy-grid convention (image origin top-left, map origin
6839
+ * bottom-left) and is the one thing in this file NOT confirmed against a real
6840
+ * robot - see ROBOT_CLOUD_DOC_CONFIRMATIONS.
6841
+ */
6842
+ declare function pixelToMetres(px: number, py: number, map: {
6843
+ originX: number;
6844
+ originY: number;
6845
+ resolution: number;
6846
+ }, imageHeight: number): {
6847
+ x: number;
6848
+ y: number;
6849
+ };
6850
+ /** The inverse of `pixelToMetres`, rounded to whole pixels. */
6851
+ declare function metresToPixel(x: number, y: number, map: {
6852
+ originX: number;
6853
+ originY: number;
6854
+ resolution: number;
6855
+ }, imageHeight: number): {
6856
+ x: number;
6857
+ y: number;
6858
+ };
6859
+ type TAreaColour = {
6860
+ r: number;
6861
+ g: number;
6862
+ b: number;
6863
+ a: number;
6864
+ };
6865
+ /**
6866
+ * An area carries TWO identifiers and the cloud disagrees with itself on the
6867
+ * form: `get-map-list` returns `rgba` as a hex STRING ("FF0B0B83"), while
6868
+ * `plans/list` and `plans/save` use an OBJECT ({r,g,b,a}). `start-area-cleaning`
6869
+ * meanwhile keys off `areaName`. So selecting "the kitchen" means a different
6870
+ * payload depending on which endpoint you are calling, and these two convert.
6871
+ *
6872
+ * The hex is read in RGBA order, matching the field's name and the areaName
6873
+ * suffix ("AREA-FF0B0B83" -> rgba "FF0B0B83").
6874
+ */
6875
+ declare function hexToAreaColour(hex: string): TAreaColour;
6876
+ /** The inverse, upper-case and without a leading `#`, as the cloud returns it. */
6877
+ declare function areaColourToHex(c: TAreaColour): string;
6878
+ /** `rangeFlag` on a planned job. */
6879
+ declare const PLAN_RANGE: {
6880
+ readonly FULL_MAP: 1;
6881
+ readonly SPOT: 2;
6882
+ readonly AREA: 3;
6883
+ };
6884
+ /** `dateList` is 1..7 = Monday..Sunday - NOT JavaScript's 0 = Sunday. */
6885
+ declare function planDayFromJsDay(jsDay: number): number;
6886
+ /**
6887
+ * Read this before trusting a number that came out of this module.
6888
+ *
6889
+ * Each entry is a question for the robot-cloud team, not a defect in our code.
6890
+ * They are listed here rather than in a document because this is the file whose
6891
+ * behaviour changes when one of them is answered.
6892
+ */
6893
+ declare const ROBOT_CLOUD_DOC_CONFIRMATIONS: readonly string[];
6894
+
6895
+ /**
6896
+ * The live pose stream: the parts worth testing.
6897
+ *
6898
+ * `/portal/robots/tracking` is Server-Sent Events, one long-lived connection per
6899
+ * robot. Everything fiddly about that - reassembling events split across TCP
6900
+ * chunks, deciding when silence means the robot is gone rather than parked, and
6901
+ * backing off a reconnect without stampeding the cloud - is pure and lives here.
6902
+ * The socket itself is the supervisor's job.
6903
+ *
6904
+ * The stream carries `{status, x, y, theta}` and NOTHING else: no floor, no
6905
+ * battery, no heartbeat, no command id. Those are asked of the vendor; until they
6906
+ * arrive this module is careful to report what it does not know rather than
6907
+ * guess.
6908
+ */
6909
+ /** One decoded `data:` payload. */
6910
+ type TSseEvent = {
6911
+ data: string;
6912
+ };
6913
+ /**
6914
+ * An incremental SSE parser.
6915
+ *
6916
+ * Two things make this worth its own function rather than a `split("\n")` at the
6917
+ * call site:
6918
+ *
6919
+ * 1. **Chunks do not respect event boundaries.** A TCP read can end mid-JSON.
6920
+ * Splitting each chunk on its own silently drops or corrupts the event that
6921
+ * straddles the boundary - and at 5 Hz that is a robot that jumps.
6922
+ * 2. **Comment lines are the keep-alive.** A line beginning `:` is not an
6923
+ * event, but it IS proof the connection is alive. The watchdog must see it,
6924
+ * so `push` reports whether anything at all arrived, separately from the
6925
+ * events it decoded.
6926
+ */
6927
+ declare function createSseParser(): {
6928
+ push: (chunk: string) => {
6929
+ events: TSseEvent[];
6930
+ sawActivity: boolean;
6931
+ };
6932
+ reset: () => void;
6933
+ };
6934
+ type TRobotPose = {
6935
+ x: number;
6936
+ y: number;
6937
+ /** Radians. */
6938
+ theta: number;
6939
+ statusFlag: number;
6940
+ mode: TRobotMode;
6941
+ };
6942
+ /**
6943
+ * Decode one `data:` payload into a pose, or `null` if it is not one.
6944
+ *
6945
+ * Returns null rather than throwing: a stream is not a request. One malformed
6946
+ * frame - a truncated write, a future field we do not understand - must not tear
6947
+ * down a connection that is otherwise delivering good poses. The caller counts
6948
+ * nulls and reports them; it does not reconnect on them.
6949
+ *
6950
+ * A frame missing x, y, theta or status is rejected whole. A partial pose is
6951
+ * worse than none: it would place a robot at (0,0), which on these maps is a real
6952
+ * location.
6953
+ */
6954
+ declare function decodeTrackingFrame(data: string): TRobotPose | null;
6955
+ /**
6956
+ * How long silence may last before the robot is treated as lost.
6957
+ *
6958
+ * The stream has no documented heartbeat, so this is the ONLY thing standing
6959
+ * between "the network died" and "the robot is parked" - which look identical on
6960
+ * the wire. 15 s is long enough to ride out a hiccup at the stream's ~5 Hz and
6961
+ * short enough that a dispatcher is not offered a robot that left ten minutes
6962
+ * ago.
6963
+ */
6964
+ declare const TRACKING_IDLE_TIMEOUT_MS = 15000;
6965
+ /**
6966
+ * A stale stream is UNAVAILABLE, not the last mode we saw.
6967
+ *
6968
+ * This is the branch that matters. Holding the last known mode means a robot
6969
+ * whose connection died while IDLE stays "idle, ready for work" forever, and the
6970
+ * dispatcher keeps handing it jobs that nothing is listening for.
6971
+ */
6972
+ declare function isTrackingStale(lastActivityAt: number, now: number, idleMs?: number): boolean;
6973
+ declare const TRACKING_BACKOFF_BASE_MS = 1000;
6974
+ declare const TRACKING_BACKOFF_CAP_MS = 60000;
6975
+ /**
6976
+ * Exponential backoff with full jitter, capped.
6977
+ *
6978
+ * The jitter is not decoration. Every robot on a site streams from the same
6979
+ * cloud, so a cloud restart drops them all at the same instant; without jitter
6980
+ * they would all retry at the same instant too, repeatedly, and we would be the
6981
+ * reason it struggles to come back up.
6982
+ *
6983
+ * `random` is injectable so the spread is testable rather than hoped for.
6984
+ */
6985
+ declare function trackingBackoffMs(attempt: number, random?: () => number, baseMs?: number, capMs?: number): number;
6986
+ /**
6987
+ * What the fleet view shows for one robot.
6988
+ *
6989
+ * `floorNo` is nullable and `floorKnown` says whether it is real, because the
6990
+ * stream does not carry it. Anything that dispatches to a floor must check
6991
+ * `floorKnown` - the alternative is a module that quietly assumes the ground
6992
+ * floor and sends a robot to clean the wrong storey.
6993
+ */
6994
+ type TRobotLiveState = {
6995
+ robotSn: string;
6996
+ pose: TRobotPose | null;
6997
+ /** Epoch ms of the last byte received on this robot's stream. */
6998
+ lastActivityAt: number;
6999
+ connected: boolean;
7000
+ floorNo: number | null;
7001
+ floorKnown: boolean;
7002
+ };
7003
+ /** The state a robot starts in and returns to when its stream dies. */
7004
+ declare function disconnectedState(robotSn: string, at: number): TRobotLiveState;
7005
+ /**
7006
+ * Fold one decoded frame into a robot's live state.
7007
+ *
7008
+ * `floorNo` is carried forward untouched - it comes from elsewhere (a dispatch,
7009
+ * or the vendor adding it to the stream) and a pose update is not evidence about
7010
+ * the floor.
7011
+ */
7012
+ declare function applyTrackingFrame(previous: TRobotLiveState, pose: TRobotPose, at: number): TRobotLiveState;
7013
+ /**
7014
+ * The view a dispatcher sees. A robot is only offered work when its stream is
7015
+ * live AND its own status says it is free.
7016
+ */
7017
+ declare function isAvailableForWork(state: TRobotLiveState, now: number): boolean;
7018
+
7019
+ /**
7020
+ * Which robot types each application may SET UP, and which it may MONITOR.
7021
+ *
7022
+ * iService365 is the fleet manager for every robot on a property, not for one
7023
+ * device class - so the same `robot-mgmt` module serves cleaning robots and
7024
+ * security robots, and the APP decides which of them a user is looking at. The
7025
+ * shape follows `bulletin-service-apps.util.ts`: a declared table plus pure
7026
+ * lookups, so "which app sees what" can be asserted without a database, a
7027
+ * session or a robot.
7028
+ *
7029
+ * The rule the owner set (2026-09-22):
7030
+ *
7031
+ * - a CLEANING robot is set up in the cleaning applications;
7032
+ * - a SECURITY robot is set up in the security applications;
7033
+ * - PROPERTY MANAGEMENT sets up and monitors BOTH, because the property is
7034
+ * what the robots belong to;
7035
+ * - the SEVEN365 CONSOLE does everything, across every property, because
7036
+ * Seven365 supplies the solution;
7037
+ * - the MANAGING AGENT watches, and does not configure.
7038
+ *
7039
+ * `setup` and `monitor` are separate because they are separate jobs. A managing
7040
+ * agent must see every robot on their estate without being able to re-point one
7041
+ * at a different cloud, and a cleaner must never be shown a security patrol's
7042
+ * position.
7043
+ *
7044
+ * ## This table is NOT a security boundary - read this before relying on it
7045
+ *
7046
+ * `appSlug` arrives as a request parameter, the same way `notification.controller`
7047
+ * takes it. It is CLIENT-SUPPLIED, so a caller can claim to be any app. This
7048
+ * table therefore decides what each app SHOWS, not what a user is entitled to.
7049
+ *
7050
+ * The actual boundary is, and stays, session-derived: `requireSiteReach` for the
7051
+ * estate, the `robot-mgmt` module gate for the site, and the permission
7052
+ * (`see-all-robots`, `add-robot`, ...) for the action. A cleaner is kept away
7053
+ * from security patrols by NOT HOLDING the permission - never by this table
7054
+ * alone.
7055
+ *
7056
+ * ponytail: client-declared scope. If robot types ever need to be a real
7057
+ * boundary, the upgrade is to carry the app identity in the session at login
7058
+ * rather than to harden anything here.
7059
+ */
7060
+ type TRobotAppScope = {
7061
+ /** Robot types this app may register and edit. */
7062
+ setup: readonly TRobotType[];
7063
+ /** Robot types this app may list, track and dispatch. */
7064
+ monitor: readonly TRobotType[];
7065
+ };
7066
+ /**
7067
+ * Keyed by app slug, matching `APP_SLUG` in each mobile app's `app.config.ts`
7068
+ * and the web apps' deployment names.
7069
+ */
7070
+ declare const ROBOT_APP_SCOPES: Readonly<Record<string, TRobotAppScope>>;
7071
+ /**
7072
+ * What this app may do with robots.
7073
+ *
7074
+ * Fails CLOSED: an app slug nobody has declared - a new service app, a typo in
7075
+ * a deployment variable, a caller that sent no slug - gets no robots rather
7076
+ * than all of them. The alternative is a landscaping app quietly listing a
7077
+ * building's security patrols the first time someone renames a deployment.
7078
+ */
7079
+ declare function robotScopeForApp(appSlug: unknown): TRobotAppScope;
7080
+ /** May this app register a robot of this type? */
7081
+ declare function canSetUpRobotType(appSlug: unknown, type: unknown): type is TRobotType;
7082
+ /** May this app see a robot of this type? */
7083
+ declare function canMonitorRobotType(appSlug: unknown, type: unknown): boolean;
7084
+ /**
7085
+ * The types to filter a listing by, for an app that asked for `requested`.
7086
+ *
7087
+ * - asked for nothing -> everything the app may monitor
7088
+ * - asked for a type it may monitor -> that type
7089
+ * - asked for a type it may NOT monitor -> `[]`
7090
+ *
7091
+ * The empty array is the important case, and it is deliberately not the same as
7092
+ * "no filter". A caller must treat `[]` as "list nothing" - reading it as "no
7093
+ * constraint" turns a refusal into a listing of every robot on the estate,
7094
+ * which is exactly the bug this function exists to make impossible.
7095
+ */
7096
+ declare function robotTypesVisibleTo(appSlug: unknown, requested?: unknown): TRobotType[];
7097
+
7098
+ /**
7099
+ * Who may do what with a robot.
7100
+ *
7101
+ * The five permissions already exist in the client catalogue
7102
+ * (`layer-common/constants/permissions.ts`) and the Security app already gates
7103
+ * its menu on them. Nothing on the SERVER has ever enforced them: the two robot
7104
+ * routes carry `requireAuth` plus the estate check, so anybody who can reach an
7105
+ * estate can register a robot into it. This is the missing half, and it is
7106
+ * deliberately pure so web and server can be asserted to agree.
7107
+ *
7108
+ * ## The three rules, in the order they are applied
7109
+ *
7110
+ * 1. **`"*"` allows everything.** 85 client roles hold it; it is the platform's
7111
+ * established wildcard and short-circuits before anything else.
7112
+ *
7113
+ * 2. **An EMPTY list on a platform-admin role allows everything.**
7114
+ * `createDefaultUser()` seeds Seven365's own staff role with
7115
+ * `permissions: []`, not `["*"]`. Enforcing an empty list would refuse the
7116
+ * platform owner - and the owner's requirement is the opposite: the Seven365
7117
+ * Super Admin must be able to do everything, on every property. So an empty
7118
+ * list on a `type: "admin"` role means "not yet restricted", exactly as it
7119
+ * does for the console catalogue. The gate stays a no-op for those roles
7120
+ * until somebody ticks a module, which is what lets it ship with no role
7121
+ * write and no lockout.
7122
+ *
7123
+ * 3. **A non-empty list is enforced**, by exact `module:permission` string.
7124
+ *
7125
+ * Anything else is refused. An empty list on a CLIENT role is not "everything"
7126
+ * - rule 2 is scoped to `type: "admin"` on purpose, because widening it would
7127
+ * hand every unconfigured client role the whole module.
7128
+ *
7129
+ * This mirrors `useLocalPermission.ts` in the web apps deliberately. If the two
7130
+ * ever disagree, a button appears that the server then refuses - the parity
7131
+ * failure the project's rules exist to prevent.
7132
+ */
7133
+ /** The module these permissions hang off. Matches `module-gate.util.ts`. */
7134
+ declare const ROBOT_MODULE = "robot-mgmt";
7135
+ /**
7136
+ * The five permission strings, in `module:permission` form - the same shape as
7137
+ * `sites:manage-site-modules`.
7138
+ */
7139
+ declare const ROBOT_PERMISSIONS: {
7140
+ readonly seeAll: "robot-mgmt:see-all-robots";
7141
+ readonly add: "robot-mgmt:add-robot";
7142
+ readonly update: "robot-mgmt:update-robot";
7143
+ readonly seeDetails: "robot-mgmt:see-robot-details";
7144
+ readonly delete: "robot-mgmt:delete-robot";
7145
+ };
7146
+ type TRobotAction = keyof typeof ROBOT_PERMISSIONS;
7147
+ /** What the decision needs to know about the caller's role. */
7148
+ type TRobotPermissionActor = {
7149
+ /** The role's permission strings, as `getUserPermissions` returns them. */
7150
+ permissions?: readonly unknown[] | null;
7151
+ /** The role document's `type`. Only `"admin"` unlocks rule 2. */
7152
+ roleType?: string | null;
7153
+ };
7154
+ /**
7155
+ * May this caller take this action on a robot?
7156
+ *
7157
+ * Fails closed on anything it does not understand: no actor, a permissions
7158
+ * value that is not an array, an action that is not one of the five. A caller
7159
+ * that cannot be understood is not a caller that is allowed.
7160
+ */
7161
+ declare function allowsRobotAction(actor: TRobotPermissionActor | null | undefined, action: TRobotAction): boolean;
7162
+ /**
7163
+ * The action a listing needs. Split out because every read path asks for the
7164
+ * same one, and spelling it at each call site is how they drift apart.
7165
+ */
7166
+ declare function allowsRobotListing(actor: TRobotPermissionActor | null | undefined): boolean;
7167
+ /**
7168
+ * Every robot action this caller may take.
7169
+ *
7170
+ * The apps use it to decide which buttons to render, so the server answers the
7171
+ * question the UI is about to ask rather than the UI guessing and being refused
7172
+ * later.
7173
+ */
7174
+ declare function robotActionsFor(actor: TRobotPermissionActor | null | undefined): TRobotAction[];
7175
+
7176
+ /**
7177
+ * The cleaning-robot cloud's HTTP API.
7178
+ *
7179
+ * Nine request/response endpoints, signed per "Robot Cloud API Document
7180
+ * (2025.05.27)". The signature, the status vocabulary and the coordinate
7181
+ * conversions live in `../utils/robot-cloud.util` and are pure; this file is only
7182
+ * the transport.
7183
+ *
7184
+ * ## Two rules this file is built around
7185
+ *
7186
+ * **1. Credentials are arguments, never configuration.** `appid` and `secret`
7187
+ * are passed in by the caller, which reads them from the robot's own record. They
7188
+ * are never read from `process.env` here, never logged, and never placed in a
7189
+ * request body - the secret's only appearance is inside the SHA-1 hash. A stack
7190
+ * trace or a debug log from this file cannot disclose them.
7191
+ *
7192
+ * **2. Nothing retries.** A cleaning command that times out may still have been
7193
+ * accepted; the robot cloud gives us no `commandId` to check against, so a retry
7194
+ * risks a second job on the same robot with no way to tell the two apart. Every
7195
+ * call here fails once and reports it. Retrying is the caller's decision to make
7196
+ * with a human in the loop.
7197
+ *
7198
+ * The live pose stream (`/portal/robots/tracking`, Server-Sent Events) is
7199
+ * deliberately NOT here. It is a long-lived connection needing reconnection,
7200
+ * re-signing and an idle watchdog - a lifecycle, not a request - and it gets its
7201
+ * own supervisor.
7202
+ */
7203
+
7204
+ type TRobotCloudCredentials = {
7205
+ /** The cloud-provided app id. */
7206
+ appid: string;
7207
+ /** The cloud-provided secret. Hashed, never transmitted. */
7208
+ secret: string;
7209
+ };
7210
+ /** Every response carries `ok`; only the robot list omits it. */
7211
+ type TRobotCloudReply<T> = {
7212
+ ok?: boolean;
7213
+ msg?: string | null;
7214
+ } & T;
7215
+ type TCloudRobot = {
7216
+ robotSn: string;
7217
+ robotName?: string;
7218
+ ownerName?: string;
7219
+ ownerPhone?: string;
7220
+ statusFlag?: number;
7221
+ statusName?: string;
7222
+ onlineFlag?: boolean;
7223
+ };
7224
+ type TCloudArea = {
7225
+ areaName: string;
7226
+ /** 8 hex digits, RGBA. Note `plans` uses an object for the same thing. */
7227
+ rgba: string;
7228
+ x: number;
7229
+ y: number;
7230
+ };
7231
+ type TCloudMap = {
7232
+ floorNo: number;
7233
+ mapName: string;
7234
+ backgroundFileKey: string;
7235
+ partitionFileKey: string;
7236
+ originX: number;
7237
+ originY: number;
7238
+ /** Metres per pixel. */
7239
+ resolution: number;
7240
+ totalArea: number;
7241
+ baseX: number;
7242
+ baseY: number;
7243
+ /** Radians. */
7244
+ baseTheta: number;
7245
+ createTime: string;
7246
+ areaList?: TCloudArea[];
7247
+ };
7248
+ type TCloudFile = {
7249
+ fileKey: string;
7250
+ url: string;
7251
+ };
7252
+ /** 1 vacuum, 2 washing the floor, 3 dry dust mop. */
7253
+ type TCleanMode = 1 | 2 | 3;
7254
+ /** 0 no vacuum while washing, 1 also vacuum while washing. */
7255
+ type TCleanSubMode = 0 | 1;
7256
+ /** 1 standard, 2 strong, 3 silent. */
7257
+ type TCleanLevel = 1 | 2 | 3;
7258
+ type TCleanOptions = {
7259
+ /** 0 = forever, 1-99. */
7260
+ cleanTimes: number;
7261
+ modeFlag: TCleanMode;
7262
+ subModeFlag: TCleanSubMode;
7263
+ levelFlag: TCleanLevel;
7264
+ };
7265
+ type TCloudPlanJob = {
7266
+ floorNo: number;
7267
+ /** 1 full map, 2 spot, 3 area. See `PLAN_RANGE`. */
7268
+ rangeFlag: number;
7269
+ cleanTimes: number;
7270
+ pointList?: Array<{
7271
+ x: number;
7272
+ y: number;
7273
+ }>;
7274
+ /** Areas as colour OBJECTS here - the map endpoint returns hex strings. */
7275
+ colorList?: TAreaColour[];
7276
+ modeFlag: number;
7277
+ subModeFlag: number;
7278
+ levelFlag: number;
7279
+ };
7280
+ type TCloudPlan = {
7281
+ planId?: number;
7282
+ /** 1-7 = Monday-Sunday. */
7283
+ dateList: number[];
7284
+ /** `HH:MM`. */
7285
+ startTime: string;
7286
+ endTime: string;
7287
+ enableFlag: boolean;
7288
+ jobList: TCloudPlanJob[];
7289
+ };
7290
+ /**
7291
+ * A refusal from the cloud, or a failure to reach it.
7292
+ *
7293
+ * `ok: false` with a `msg` is a refusal by the robot cloud and is reported as
7294
+ * given - the message is written for an operator ("robot is offline"), so it is
7295
+ * worth surfacing rather than flattening into "request failed".
7296
+ */
7297
+ declare class RobotCloudError extends Error {
7298
+ readonly path: string;
7299
+ readonly statusCode?: number;
7300
+ /** True when the cloud answered and said no, rather than not answering. */
7301
+ readonly refused: boolean;
7302
+ constructor(path: string, message: string, opts?: {
7303
+ statusCode?: number;
7304
+ refused?: boolean;
7305
+ });
7306
+ }
7307
+ declare function useRobotCloudService(credentials: TRobotCloudCredentials, options?: {
7308
+ baseUrl?: string;
7309
+ timeoutMs?: number;
7310
+ }): {
7311
+ getRobots: () => Promise<TCloudRobot[]>;
7312
+ getMaps: (robotSn: string) => Promise<TCloudMap[]>;
7313
+ getFileUrls: (robotSn: string, fileKeys: string[]) => Promise<TCloudFile[]>;
7314
+ getPlans: (robotSn: string) => Promise<TCloudPlan[]>;
7315
+ startFullCleaning: (robotSn: string, opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7316
+ startAreaCleaning: (robotSn: string, areaList: string[], opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7317
+ startSpotCleaning: (robotSn: string, pointList: Array<{
7318
+ x: number;
7319
+ y: number;
7320
+ }>, opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7321
+ returnToBase: (robotSn: string) => Promise<TRobotCloudReply<Record<string, never>>>;
7322
+ savePlans: (robotSn: string, planList: TCloudPlan[]) => Promise<number[]>;
7323
+ };
7324
+
7325
+ /**
7326
+ * The bridge between a robot ROW and the robot CLOUD.
7327
+ *
7328
+ * A registered robot is a document holding a nickname and a credential pair.
7329
+ * Everything a user actually wants - where it is, what it is doing, its floors,
7330
+ * sending it to clean - lives in the vendor's cloud and is addressed by
7331
+ * `robotSn`. This is the only place those two halves meet.
7332
+ *
7333
+ * ## Why `robotSn` gets discovered rather than required
7334
+ *
7335
+ * The Add Robot form collects a nickname, an app key and an app token. It has
7336
+ * never asked for a serial. But every per-robot cloud endpoint takes one, so a
7337
+ * robot registered through that form cannot be reached at all.
7338
+ *
7339
+ * Rather than change the form (and every robot already registered through it),
7340
+ * a robot with no `robotSn` gets one from `get-robot-list` - which takes no
7341
+ * parameters and returns everything the credential can see. If that is exactly
7342
+ * one robot, the credential is per-robot and the answer is unambiguous. If it is
7343
+ * several, we cannot guess which, and say so instead of picking one: binding a
7344
+ * nickname to the wrong serial would send one building's cleaning command to
7345
+ * another building's robot.
7346
+ *
7347
+ * ponytail: discovery, not a form change, because the vendor has not yet said
7348
+ * whether a credential is issued per robot or per account (question 2 on the
7349
+ * vendor sheet). When they answer, this either stays as it is or becomes a
7350
+ * picker in the UI.
7351
+ */
7352
+ type TFleetRobot = {
7353
+ id: string;
7354
+ name: string;
7355
+ robotSn: string;
7356
+ /** The vendor's raw status code, kept so support can quote it. */
7357
+ statusFlag: number | null;
7358
+ /** The vendor's own label for that code. */
7359
+ statusName: string;
7360
+ /** Our normalised vocabulary - this is what screens should show. */
7361
+ mode: TRobotMode;
7362
+ online: boolean;
7363
+ dispatchable: boolean;
7364
+ };
7365
+ /** What the service needs from a robot row. */
7366
+ type TStoredRobot = TRobot & {
7367
+ _id?: unknown;
7368
+ };
7369
+ declare function useRobotFleetService(deps?: {
7370
+ /** Injected so the whole service runs in a test with no network. */
7371
+ cloudFor?: typeof useRobotCloudService;
7372
+ /** Persists a discovered serial. Omitted in tests. */
7373
+ saveRobotSn?: (robotId: string, robotSn: string) => Promise<unknown>;
7374
+ }): {
7375
+ resolveRobotSn: (robot: TStoredRobot) => Promise<string>;
7376
+ getFleetRobot: (robot: TStoredRobot) => Promise<TFleetRobot>;
7377
+ getMaps: (robot: TStoredRobot) => Promise<TCloudMap[]>;
7378
+ getMapImages: (robot: TStoredRobot, fileKeys: string[]) => Promise<TCloudFile[]>;
7379
+ dispatch: (robot: TStoredRobot, command: {
7380
+ kind: "full";
7381
+ options: TCleanOptions;
7382
+ } | {
7383
+ kind: "area";
7384
+ areas: string[];
7385
+ options: TCleanOptions;
7386
+ } | {
7387
+ kind: "spot";
7388
+ points: Array<{
7389
+ x: number;
7390
+ y: number;
7391
+ }>;
7392
+ options: TCleanOptions;
7393
+ } | {
7394
+ kind: "return";
7395
+ }) => Promise<TRobotCloudReply<Record<string, never>>>;
7396
+ getPlans: (robot: TStoredRobot) => Promise<TCloudPlan[]>;
7397
+ };
7398
+
6706
7399
  type TPatrolQuestion = {
6707
7400
  _id?: ObjectId;
6708
7401
  site: string | ObjectId;
@@ -15470,4 +16163,4 @@ declare function usePersonalEmergencyChainController(): {
15470
16163
  update: (req: Request, res: Response, next: NextFunction) => Promise<void>;
15471
16164
  };
15472
16165
 
15473
- export { ANPRMode, APP_BASE_URLS, AUDIT_VALUE_MAX_LENGTH, AccessTypeProps, AppKey, AppServiceType, AssignCardConfig, BLOCKLIST_CATEGORIES, BULK_CAMERA_COLUMNS, BidStatus, BidType, BuildingLevelStatus, BuildingStatus, BulkCameraAccepted, BulkCameraOutcome, BulkCameraPlan, BulkCameraResult, BulkCardUpdate, BulletinOrder, BulletinRecipient, BulletinSort, BulletinStatus, BulletinVideoOrder, BulletinVideoSort, CAMERA_ANPR_PERMISSIONS, CAMERA_CAPABILITIES, CAMERA_CAPABILITY_REASONS, CAMERA_MANAGE_ANY_PERMISSIONS, CAMERA_NOT_PATROL_OR_CCTV, CAMERA_NO_SUB_STREAM_TTL_SECONDS, CAMERA_PTZ_PERMISSIONS, CAMERA_RECORDINGS_PERMISSIONS, CAMERA_REQUEST_TIMEOUT_MS, CAMERA_RTSP_TIMEOUT_MS, CAMERA_SETUP_PERMISSIONS, CAMERA_SNAPSHOT_CACHE_SECONDS, CAMERA_SNAPSHOT_MAX_BYTES, CAMERA_TEST_MIN_INTERVAL_SECONDS, CAMERA_TEST_ROUND_LIMIT, CAMERA_TEST_ROUND_SECONDS, CAMERA_TYPE_ANPR, CAMERA_TYPE_IP, CAMERA_VIEW_PERMISSIONS, CLIENT_ACTIONS, CLOCK_DRIFT_WARN_SECONDS, CONSOLE_AUDIT_LABELS, CONSOLE_PERMISSIONS, CONTRACTOR_TYPE_LABELS, CROSS_CLIENT_GRANT, CURRENT_TIME_ENDPOINT, Camera, CameraAddressInput, CameraCapability, CameraCapabilityContext, CameraCapabilityDescriptor, CameraCapabilityEntry, CameraCapabilityReason, CameraCapabilityState, CameraCapabilityTrace, CameraDevice, CameraFrame, CameraMembership, CameraStream, CameraTestStatus, CameraTransport, CameraType, ConsoleAuditAction, ConsoleAuditTarget, ConsoleGrant, DEFAULT_RING_SECONDS, DEFAULT_SITE_TIMEZONE, DEVICE_STATUS, DOBStatus, DUPLICATE_TERMS_VERSION_MESSAGE, DayOfWeek, DeviceHttpTarget, DeviceProbeResult, DynamicFormFields, E164, EAccessCardTypes, EAccessCardUserTypes, EmailSender, EntryOrder, EntrySort, EventOrder, EventSort, EventStatus, EventType, FacilitySort, FacilityStatus, FormEntryStatus, GOVERNED_MODULES, GuestSort, GuestStatus, HID_CARD_VALUE_FACTOR, HID_PERMISSION_CATEGORIES, HID_UINT32_MAX, HID_UINT64_MAX, HidRawUint64, IAccessCard, IAccessCardTransaction, InviteActor, LIVE_ROLE, LIVE_VEHICLE_STATUSES, MANAGE_SITE_MODULES, MAX_BULK_CAMERA_ROWS, MAX_CAMERA_CHANNEL, MAX_CAMERA_NAME_LENGTH, MAX_PERSONAL_EMERGENCY_CONTACTS, MAX_RING_SECONDS, MAccessCard, MAccessCardTransaction, MAddress, MAttendance, MAttendanceSettings, MBidPreloved, MBillingConfiguration, MBillingItem, MBuilding, MBuildingLevel, MBuildingUnit, MBulletinBoard, MBulletinVideo, MCategoryPreloved, MChannelPreloved, MChat, MChatPreloved, MConsoleAudit, MCustomer, MCustomerSite, MDocumentManagement, MEMBER_TYPES, MEntryPassSettings, MEventManagement, MFeedback, MFile, MFormEntry, MGuestManagement, MHidAmicoEvent, MHidAmicoIdentity, MHidAmicoReader, MHidSipAccount, MHidSitePermissions, MIN_RING_SECONDS, MIncidentReport, MManpowerDesignations, MManpowerMonitoring, MManpowerRemarks, MManpowerSites, MMember, MNfcPatrolLog, MNfcPatrolRoute, MNfcPatrolSettings, MNfcPatrolSettingsUpdate, MNfcPatrolTag, MNotification, MNotificationPreference, MODULE_GATE_MODE_DEFAULT, MODULE_LIST_GATE_DEFAULT, MOccurrenceBook, MOccurrenceEntry, MOccurrenceSubject, MOnlineForm, MOrg, MOvernightParkingApprovalHours, MOvernightParkingRequest, MPatrolEmail, MPatrolLog, MPatrolQuestion, MPatrolRoute, MPerson, MPersonalEmergencyChain, MPlatformTerms, MPost, MPostFavorite, MPromoCode, MRobot, MRole, MRoleV2, MServiceProvider, MServiceProviderBilling, MSession, MSite, MSiteCamera, MSiteFacility, MSiteFacilityBooking, MStatementOfAccount, MSubcategoryPreloved, MSubscription, MSubscriptionPlan, MUnitBilling, MUser, MVehicle, MVehicleTransaction, MVerification, MVerificationV2, MVisitorTransaction, MWorkOrder, NOTIFICATION_CATEGORIES, NOTIFICATION_CHANNELS, NOTIFICATION_CHANNEL_LABELS, NOTIFICATION_NAMESPACE, NOTIFY_ACCESS_FILTER_DEFAULT, NotificationAppSlug, NotificationCategory, NotificationChannel, NotificationModule, NotificationPreferenceView, NotificationService, ORG_MARKETPLACE_VENDOR_FIELD, ORG_OWNER_REPAIR_CLAIM_STALE_MS, ORG_OWNER_REPAIR_CLAIM_TAKEN_REASON, ORG_OWNER_REPAIR_DEFAULT, ORG_OWNER_REPAIR_OFF_REASON, OrgNature, OvernightParkingRequestSort, OvernightParkingRequestStatus, PATROL_CCTV_CAMERA_FILTER, PATROL_EMAIL_MAX_LOGS, PATROL_EMAIL_MAX_PER_HOUR, PATROL_EMAIL_MAX_RECIPIENTS, PERSON_TYPES, PLATFORM_STAFF_MEMBER_TYPE, PLATFORM_STAFF_ROLE_TYPE, PLAYBACK_LINK_SECONDS, PLAYBACK_MAX_WINDOW_SECONDS, PROPERTY_MANAGEMENT_MEMBER_TYPES, PStatus, PTZ_ALLOWED_ACTIONS, PTZ_ALLOWED_CODES, Period, PersonStatus, PersonType, PersonTypes, PlatformTermsStatus, PostOrder, PostSort, PostStatus, QrTagProps, REALTIME_MAX_FANOUT, REGISTERED_VEHICLE_CATEGORIES, ResidentAppModuleKey, SELF_SERVICE_RESEND_COOLDOWN_MS, SELF_SIGNUP_PLATFORM, SELF_SIGNUP_STATUS, SELF_SIGNUP_TYPES, SERVICE_PROVIDER_INVITE_LABELS, SERVICE_PROVIDER_INVITE_TRANSITIONS, SERVICE_PROVIDER_SIGN_IN_SUBJECT, SERVICE_PROVIDER_SIGN_IN_TYPE, SERVICE_PROVIDER_SIGN_UP_SUBJECT, SERVICE_PROVIDER_SIGN_UP_TYPE, SOFTWARE_VERSION_ENDPOINT, ServiceProviderInviteAction, ServiceProviderInviteDecision, ServiceProviderInviteFacts, SiteAddress, SiteCategories, SiteStatus, SortFields, SortOrder, Status, SubjectOrder, SubjectSort, SubscriptionBillingMode, SubscriptionType, TAccessMngmntSettings, TActionStatus, TAddress, TAffectedEntities, TAffectedInjured, TAppServiceType, TApprovedBy, TApprover, TAttendance, TAttendanceCheckIn, TAttendanceCheckOut, TAttendanceCheckTime, TAttendanceLocation, TAttendanceSettings, TAttendanceSettingsGetBySite, TAuthorities, TAuthoritiesCalled, TBidPreloved, TBilling, TBillingConfiguration, TBillingItem, TBuilding, TBuildingLevel, TBuildingUnit, TBulletinBoard, TBulletinVideo, TCamera, TCameraHealthClaim, TCategoryPreloved, TChannelPreloved, TChat, TChatPreloved, TCheckPoint$1 as TCheckPoint, TComplaintInfo, TComplaintReceivedTo, TConsoleAudit, TConsoleAuditQuery, TCounter, TCreateNfcPatrolLog, TCustomer, TCustomerSite, TCustomerSitePropertyField, TDayNumber, TDaySchedule, TDefaultAccessCard, TDesignations, TDocs, TDocumentCreate, TDocumentManagement, TEntryPassSettings, TEventManagement, TFeedback, TFeedbackMetadata, TFeedbackUpdate, TFeedbackUpdateCategory, TFeedbackUpdateServiceProvider, TFeedbackUpdateStatus, TFeedbackUpdateToCompleted, TFile, TFiles, TFolderUpdate, TFormEntry, TGetAttendancesByUserQuery, TGetAttendancesQuery, TGuestManagement, THidAmicoEvent, THidAmicoGatewayJob, THidAmicoIdentity, THidAmicoPhysicalCard, THidAmicoReader, THidPermissionAssignment, THidPermissionCategory, THidPermissionUserBinding, THidPhysicalCardInput, THidPhysicalCardType$1 as THidPhysicalCardType, THidSipAccount, THidSitePermissions, TIncidentInformation, TIncidentReport, TIncidentTypeAndTime, TInvoice, TKeyRef, TManpowerDesignations, TManpowerDesignationsUpdate, TManpowerMonitoring, TManpowerMonitoringUpdate, TManpowerRemarks, TManpowerRemarksStatusUpdate, TManpowerRemarksUpdate, TManpowerSearchFilter, TManpowerSites, TMember, TMemberModulesDeps, TMemberUpdateStatus, TMessagePreloved, TMiniRole, TModuleAccess, TModuleGateMode, TModuleImpact, TNfcPatrolLog, TNfcPatrolRoute, TNfcPatrolRouteEdit, TNfcPatrolSettings, TNfcPatrolSettingsGetBySite, TNfcPatrolSettingsUpdate, TNfcPatrolTag, TNfcPatrolTagConfigureReset, TNfcPatrolTagEdit, TNfcPatrolTagUpdateData, TNotification, TNotificationPreference, TNotificationPreferenceOff, TNotifyAccessContext, TNotifyAccessMode, TNotifyAccessReport, TOccurrenceBook, TOccurrenceEntry, TOccurrenceSubject, TOnlineForm, TOrg, TOrgModulesDeps, TOrgOwnerRepairClaim, TOrgOwnerRepairDeps, TOrgOwnerRepairInput, TOrgOwnerRepairPayload, TOrgOwnerRepairPlan, TOvernightParkingApprovalHours, TOvernightParkingRequest, TPatrolEmail, TPatrolEmailCreatedBy, TPatrolEmailLogRef, TPatrolLog, TPatrolQuestion, TPatrolRoute, TPerson, TPersonalEmergencyChain, TPersonalEmergencyContact, TPlaceOfIncident, TPlates, TPlatformTerms, TPost, TPostFavorite, TPrice, TPriceType, TPromoCode, TPromoCurrencyInput, TPromoTier, TRANSPORT_DEVICE_HTTP, TRANSPORT_RELAY_PLAYBACK, TRANSPORT_RELAY_PLAYER, TRANSPORT_RTSP_FRAME, TRecipientOfComplaint, TRemarks, TResident, TResidentAppModules, TRobot, TRobotMetadata, TRole, TRolePermissionHistoryEntry, TRoleV2, TRoute, TSOABillingItem, TSOAStatus, TSelfServiceEmailOccasion, TSelfServiceEmailRecord, TSelfServiceResendDecision, TSelfServiceResendFacts, TServiceProvider, TServiceProviderBilling, TSession, TSessionCreate, TShifts, TSignNfcPatrolLog, TSite, TSiteCamera, TSiteDayBounds, TSiteFacility, TSiteFacilityBooking, TSiteInfo, TSiteInformation, TSiteMetadata, TSiteModulesDeps, TSiteUpdateBlock, TStatementOfAccount, TSubcategoryPreloved, TSubmissionForm, TSubscription, TSubscriptionPlan, TSubscriptionPlanApplication, TUnitBilling, TUnits, TUpdateFormEntry, TUpdateName, TUser, TUserCreate, TVehicle, TVehicleAnprCamera, TVehicleHistoryEntry, TVehicleTransaction, TVehicleUpdate, TVerification, TVerificationCode, TVerificationEvent, TVerificationMetadata, TVerificationMetadataV2, TVerificationOnboarding, TVerificationV2, TVisitorTransaction, TWorkOrder, TWorkOrderMetadata, TWorkOrderUpdate, TWorkOrderUpdateStatus, TWorkOrderUpdateToCompleted, TanyoneDamageToProperty, UNSTORED_COLUMNS, UseAccessManagementRepo, UserStatus, VEHICLE_HISTORY_LIMIT, VERIFICATION_OPEN_STATUSES, VehicleCategory, VehicleListView, VehicleOrder, VehicleSort, VehicleStatus, VehicleType, VerificationLinkType, VerificationStatus, VerificationSubjectType, VerificationType, VisitorSort, VisitorStatus, addressSchema, allowedFieldsSite, allowedNatures, allowedPlanApplications, attendanceSchema, attendanceSettingsSchema, buildSelfServiceEmailContext, building_level_namespace_collection, building_units_namespace_collection, buildings_namespace_collection, bulletin_boards_namespace_collection, callerAccountApproved, callerId, cameraBaseUrl, cameraCapabilitiesFor, cameraDevices, cameraGrant, cameraHealthClaim, cameraHealthSummary, cameraListClearConfirmation, cameraManagePermissions, cameraProbeCacheKey, cameraTransports, canManageSiteModules, canRevokeRefreshTokenFamily, categoriesForPermissions, categorySupportsChannel, chatPrelovedEvents, chatSchema, claimReadsAsStale, clampPtzSpeed, clockDriftSeconds, consoleRoleAllows, consoleRoleAllowsAll, consoleSpellings, console_audit_namespace_collection, createManpowerRemarksDaily, customerSchema, customerSitePropertyFields, decideSelfServiceResend, decideServiceProviderInvite, decodeHidPacsCard, deniedModules, deriveBulletinStatus, deriveCameraHost, describeCameraCapabilities, designationsSchema, deviceControlEnabled, deviceHttpEnabled, deviceHttpTargets, deviceHttpTimeoutMs, deviceProbeTtlSeconds, emitNotificationCreated, emptyPersonalEmergencyChain, encodeHidPacsCard, entitledSiteScope, events_namespace_collection, expandModules, expiredBulletinSweepFilter, expiredVehicleSweepFilter, facility_bookings_namespace_collection, feedbackSchema, feedbacks2_namespace_collection, feedbacks_namespace_collection, ffmpegFrameArgs, ffmpegPath, filterByAccess, formatCapabilityTrace, formatDahuaDate, getIO, getSessionIdFromRequest, grabWithSubStreamFallback, guests_namespace_collection, hasAnyCapability, hasAnyPermission, hasOrgInvitation, hasOrgOwnership, hasOrgSiteReach, hidRawUint64, holdsRole, incidentReport, incidentReportLog, incidents_namespace_collection, invitationOffersRole, isCameraEntitled, isDuplicateMemberError, isDuplicateVersionError, isLikelySelfServiceEmail, isLiveVehicleStatus, isPatrolCctvCamera, isPlatformOwner, isPromoCodeExpired, isRelayPlayerUrl, isSafeRelativePath, isSeasonPassVehicle, isSuperAdmin, isTermsCurrent, isValidTimezone, listStaffUserIds, liveStatusFor, logCamera, manpowerDesignationsSchema, manpowerEvents, manpowerMonitoringSchema, manpowerRemarksSchema, manpowerSitesSchema, mapWithLimit, maskNric, memberModulesHandlers, moduleDeniedForCaller, moduleGateEnforceKeys, moduleGateMode, moduleImpact, moduleListGateOn, nfcPatrolSettingsSchema, nfcPatrolSettingsSchemaUpdate, normalizeAcceptedTerms, normalizeHidCardValue, notificationAccessReport, notificationCategory, notificationCategoryLabel, notificationEvents, notificationRoom, notifyAccessMode, occasionForStatus, occurrence_book_namespace_collection, onBookTimezonesChanged, online_forms_namespace_collection, orgLevelRoles, orgModulesHandlers, orgOwnerRepairHandlers, orgOwnerRepairOn, orgQualifiesForOwnerRepair, orgSchema, overnight_parking_requests_namespace_collection, parseCameraChannel, parseCameraHost, parseDahuaFind, parseDeviceTime, parseHidJsonLossless, parsePromoExpiry, parseSoftwareVersion, pickAuditFields, pickCustomerSiteProperties, planBulkCameraImport, planOrgOwnerRepair, platform_terms_namespace_collection, playbackRelays, playbackWindowRefusal, promoCodeRefusal, promoCodeSchema, promoCodeStatusSchema, promoCodeUpdate, promoCodeUpdateSchema, ptzEndpoint, publicCameraFields, readsAsApprovedAccount, recordConsoleAction, refuseServiceProviderInviteAction, registerCameraTransport, relayForRecorder, remarksSchema, renderPagePdf, requireConsolePermission, requirePlatformStaff, resetCameraTransports, residentAppModuleKeys, residentAppModulesSchema, residentFormEntry, resolutionRefusalReason, resolveCamera, resolveDeviceHttp, resolveHidPhysicalCardValue, resolveInviteActor, resolveSiteTimezone, resolveStaffRole, robotSchema, rtspUrl, schema, schemaAppSlugNotification, schemaApprovedBy, schemaApprover, schemaBidPreloved, schemaBilling, schemaBillingConfiguration, schemaBillingItem, schemaBuilding, schemaBuildingLevel, schemaBuildingUnit, schemaBuildingUpdateOptions, schemaBulletinBoard, schemaBulletinVideo, schemaCategoryPreloved, schemaChannelPreloved, schemaChatPreloved, schemaConsoleAudit, schemaCreateHidAmicoIdentity, schemaCreateNfcPatrolLog, schemaCreateNotification, schemaCustomerSite, schemaDiscoverHidAmicoReader, schemaDocumentManagement, schemaEntryPassSettings, schemaEventManagement, schemaFiles, schemaFormEntry, schemaGuestManagement, schemaHidAmicoAccessLogQuery, schemaHidAmicoAssignUserCard, schemaHidAmicoConfiguration, schemaHidAmicoEnrollUserCard, schemaHidAmicoEvent, schemaHidAmicoExecuteActions, schemaHidAmicoIdentity, schemaHidAmicoIdentityIdParams, schemaHidAmicoIdentityQuery, schemaHidAmicoIntercomCall, schemaHidAmicoLogQuery, schemaHidAmicoMonitor, schemaHidAmicoNotificationParams, schemaHidAmicoObjectOperation, schemaHidAmicoOperatingMode, schemaHidAmicoReader, schemaHidAmicoReaderIdParams, schemaHidAmicoReaderListQuery, schemaHidAmicoReaderUserQuery, schemaHidAmicoSetConfiguration, schemaHidAmicoSiteIdParams, schemaHidAmicoSync, schemaHidAmicoUserCardIdParams, schemaHidAmicoUserCardParams, schemaHidAmicoUserImageParams, schemaHidAmicoUserImageUploadQuery, schemaHidAmicoUserPin, schemaHidAmicoUserPinParams, schemaHidAmicoVisitorImageParams, schemaHidAmicoVisitorImageUploadQuery, schemaHidAmicoVisitorQr, schemaHidPermissionCandidateQuery, schemaHidPermissionScopeQuery, schemaHidSipAccountRequest, schemaIncidentReport, schemaListNotification, schemaMultipleDocumentManagement, schemaNfcPatrolLog, schemaNfcPatrolRoute, schemaNfcPatrolTag, schemaNfcPatrolTagUpdateData, schemaNotification, schemaNotificationPreference, schemaNotificationPreferenceOff, schemaOccurrenceBook, schemaOccurrenceEntry, schemaOccurrenceSubject, schemaOnlineForm, schemaOvernightParkingApprovalHours, schemaOvernightParkingRequest, schemaPatrolEmail, schemaPatrolEmailCreatedBy, schemaPatrolEmailLogRef, schemaPatrolEmailQuery, schemaPatrolLog, schemaPatrolQuestion, schemaPatrolRoute, schemaPerson, schemaPersonalEmergencyContact, schemaPlate, schemaPlatformTerms, schemaPost, schemaPostFavorite, schemaResendPatrolEmail, schemaResidentSelfSignUp, schemaSelfServiceVisitor, schemaSendPatrolEmail, schemaServiceProvider, schemaServiceProviderBilling, schemaSignNfcPatrolLog, schemaSiteCamera, schemaSiteFacility, schemaSiteFacilityBooking, schemaStatementOfAccount, schemaSubcategoryPreloved, schemaUnitBilling, schemaUpdateBidPreloved, schemaUpdateBuildingLevel, schemaUpdateBulletinBoard, schemaUpdateBulletinVideo, schemaUpdateCategoryPreloved, schemaUpdateChatPreloved, schemaUpdateDocumentManagement, schemaUpdateEntryPassSettings, schemaUpdateEventManagement, schemaUpdateFolderManagement, schemaUpdateFormEntry, schemaUpdateGuestManagement, schemaUpdateHidAmicoIdentity, schemaUpdateHidAmicoReader, schemaUpdateHidSitePermissions, schemaUpdateIncidentReport, schemaUpdateNotification, schemaUpdateNotificationPreference, schemaUpdateOccurrenceBook, schemaUpdateOccurrenceEntry, schemaUpdateOccurrenceSubject, schemaUpdateOnlineForm, schemaUpdateOptions, schemaUpdateOvernightParkingRequest, schemaUpdatePatrolLog, schemaUpdatePatrolQuestion, schemaUpdatePatrolRoute, schemaUpdatePerson, schemaUpdatePersonalEmergencyChain, schemaUpdatePost, schemaUpdatePostFavorite, schemaUpdateServiceProviderBilling, schemaUpdateSiteBillingConfiguration, schemaUpdateSiteBillingItem, schemaUpdateSiteCamera, schemaUpdateSiteFacility, schemaUpdateSiteFacilityBooking, schemaUpdateSiteUnitBilling, schemaUpdateStatementOfAccount, schemaUpdateSubcategoryPreloved, schemaUpdateVisTrans, schemaVehicleTransaction, schemaVisitorTransaction, schemeCamera, schemeLogCamera, selectHealthTargets, selfServiceEmailSubject, serviceProviderInviteLabel, sessionSchema, setIO, shiftSchema, signLiveLink, signPlaybackLink, siteDayBounds, siteModulesHandlers, siteSchema, site_people_namespace_collection, snapshotEndpoint, snapshotRefusalReason, staffMayBypass, startTodaysBookForSite, stringifyHidJson, stripFacialImageMetadata, subscriptionPlanSchema, summariseBulkCameraPlan, updateRemarksStatusEod, updateRemarksisAcknowledged, updateSiteSchema, useAccessManagementController, useAddressRepo, useAttendanceController, useAttendanceRepository, useAttendanceSettingsController, useAttendanceSettingsRepository, useAttendanceSettingsService, useAuthController, useAuthControllerV2, useAuthService, useAuthServiceV2, useBidPrelovedController, useBidPrelovedRepo, useBidPrelovedService, useBuildingController, useBuildingLevelController, useBuildingLevelRepo, useBuildingLevelService, useBuildingRepo, useBuildingService, useBuildingUnitController, useBuildingUnitRepo, useBuildingUnitService, useBulletinBoardController, useBulletinBoardRepo, useBulletinBoardService, useBulletinVideoController, useBulletinVideoRepo, useBulletinVideoService, useCameraViewController, useCameraViewService, useCategoryPrelovedController, useCategoryPrelovedRepo, useChannelPrelovedController, useChannelPrelovedRepo, useChatController, useChatPrelovedController, useChatPrelovedRepo, useChatPrelovedService, useChatRepo, useConsoleAuditController, useConsoleAuditRepo, useCounterModel, useCounterRepo, useCustomerController, useCustomerRepo, useCustomerSiteController, useCustomerSiteRepo, useCustomerSiteService, useDahuaService, useDashboardController, useDashboardRepo, useDocumentManagementController, useDocumentManagementRepo, useDocumentManagementService, useEntryPassSettingsController, useEntryPassSettingsRepo, useEventManagementController, useEventManagementRepo, useEventManagementService, useFeedbackController, useFeedbackRepo, useFeedbackService, useFileController, useFileRepo, useFileService, useFormEntryController, useFormEntryRepo, useGuestManagementController, useGuestManagementRepo, useGuestManagementService, useHidAmicoController, useHidAmicoRepo, useHidAmicoService, useHrmLabsAttendanceCtrl, useHrmLabsAttendanceSrvc, useIncidentReportController, useIncidentReportRepo, useIncidentReportService, useInvoiceController, useInvoiceModel, useInvoiceRepo, useManpowerDesignationCtrl, useManpowerDesignationRepo, useManpowerMonitoringCtrl, useManpowerMonitoringRepo, useManpowerMonitoringSrvc, useManpowerRemarkCtrl, useManpowerRemarksRepo, useManpowerSitesCtrl, useManpowerSitesRepo, useManpowerSitesSrvc, useMemberController, useMemberRepo, useMemberService, useNewDashboardController, useNewDashboardRepo, useNfcPatrolLogController, useNfcPatrolLogRepo, useNfcPatrolLogService, useNfcPatrolRouteController, useNfcPatrolRouteRepo, useNfcPatrolRouteService, useNfcPatrolSettingsController, useNfcPatrolSettingsRepository, useNfcPatrolSettingsService, useNfcPatrolTagController, useNfcPatrolTagRepo, useNfcPatrolTagService, useNotificationController, useNotificationPreferenceController, useNotificationPreferenceRepo, useNotificationPreferenceService, useNotificationRepo, useOccurrenceBookController, useOccurrenceBookRepo, useOccurrenceBookService, useOccurrenceEntryController, useOccurrenceEntryRepo, useOccurrenceEntryService, useOccurrenceSubjectController, useOccurrenceSubjectRepo, useOccurrenceSubjectService, useOnlineFormController, useOnlineFormRepo, useOrgController, useOrgControllerV2, useOrgOwnerRepairRepo, useOrgRepo, useOvernightParkingController, useOvernightParkingRepo, useOvernightParkingRequestController, useOvernightParkingRequestRepo, useOvernightParkingRequestService, usePatrolEmailController, usePatrolEmailRepo, usePatrolEmailService, usePatrolLogController, usePatrolLogRepo, usePatrolLogService, usePatrolQuestionController, usePatrolQuestionRepo, usePatrolRouteController, usePatrolRouteRepo, usePersonController, usePersonRepo, usePersonalEmergencyChainController, usePersonalEmergencyChainRepo, usePersonalEmergencyChainService, usePlatformTermsController, usePlatformTermsRepo, usePlatformTermsService, usePostFavoriteController, usePostFavoriteRepo, usePostFavoriteService, usePostPrelovedController, usePostPrelovedRepo, usePriceController, usePriceModel, usePriceRepo, usePromoCodeController, usePromoCodeRepo, useRedDotPaymentController, useRedDotPaymentRepo, useRedDotPaymentSvc, useRobotController, useRobotRepo, useRobotService, useRoleController, useRoleControllerV2, useRoleRepo, useRoleRepoV2, useRoleServiceV2, useServiceProviderBillingController, useServiceProviderBillingRepo, useServiceProviderBillingService, useServiceProviderController, useServiceProviderInviteController, useServiceProviderInviteService, useServiceProviderRepo, useSessionRepo, useSiteBillingConfigurationController, useSiteBillingConfigurationRepo, useSiteBillingItemController, useSiteBillingItemRepo, useSiteCameraController, useSiteCameraRepo, useSiteCameraService, useSiteController, useSiteFacilityBookingController, useSiteFacilityBookingRepo, useSiteFacilityBookingService, useSiteFacilityController, useSiteFacilityRepo, useSiteFacilityService, useSiteRepo, useSiteService, useSiteUnitBillingController, useSiteUnitBillingRepo, useSiteUnitBillingService, useStatementOfAccountController, useStatementOfAccountRepo, useSubcategoryPrelovedController, useSubcategoryPrelovedRepo, useSubscriptionController, useSubscriptionPlanController, useSubscriptionPlanRepo, useSubscriptionRepo, useSubscriptionService, useUserController, useUserControllerV2, useUserRepo, useUserRepoV2, useUserService, useUserServiceV2, useVehicleController, useVehicleRepo, useVehicleService, useVerificationController, useVerificationControllerV2, useVerificationRepo, useVerificationRepoV2, useVerificationService, useVerificationServiceV2, useVisitorTransactionController, useVisitorTransactionRepo, useVisitorTransactionService, useWorkOrderController, useWorkOrderRepo, useWorkOrderService, userSchema, vehicleCategoryFor, vehicleHistoryEntry, vehicleListViewQuery, vehicleSchema, vehicleViewOf, vehicles_namespace_collection, visitorPersonRepo, visitorPersonService, visitorType, visitors_namespace_collection, wallConfig, withLiveLink, workOrderSchema, work_orders2_namespace_collection, work_orders_namespace_collection };
16166
+ export { ANPRMode, APP_BASE_URLS, AUDIT_VALUE_MAX_LENGTH, AccessTypeProps, AppKey, AppServiceType, AssignCardConfig, BLOCKLIST_CATEGORIES, BULK_CAMERA_COLUMNS, BidStatus, BidType, BuildingLevelStatus, BuildingStatus, BulkCameraAccepted, BulkCameraOutcome, BulkCameraPlan, BulkCameraResult, BulkCardUpdate, BulletinOrder, BulletinRecipient, BulletinSort, BulletinStatus, BulletinVideoOrder, BulletinVideoSort, CAMERA_ANPR_PERMISSIONS, CAMERA_CAPABILITIES, CAMERA_CAPABILITY_REASONS, CAMERA_MANAGE_ANY_PERMISSIONS, CAMERA_NOT_PATROL_OR_CCTV, CAMERA_NO_SUB_STREAM_TTL_SECONDS, CAMERA_PTZ_PERMISSIONS, CAMERA_RECORDINGS_PERMISSIONS, CAMERA_REQUEST_TIMEOUT_MS, CAMERA_RTSP_TIMEOUT_MS, CAMERA_SETUP_PERMISSIONS, CAMERA_SNAPSHOT_CACHE_SECONDS, CAMERA_SNAPSHOT_MAX_BYTES, CAMERA_TEST_MIN_INTERVAL_SECONDS, CAMERA_TEST_ROUND_LIMIT, CAMERA_TEST_ROUND_SECONDS, CAMERA_TYPE_ANPR, CAMERA_TYPE_IP, CAMERA_VIEW_PERMISSIONS, CLIENT_ACTIONS, CLOCK_DRIFT_WARN_SECONDS, CONSOLE_AUDIT_LABELS, CONSOLE_PERMISSIONS, CONTRACTOR_TYPE_LABELS, CROSS_CLIENT_GRANT, CURRENT_TIME_ENDPOINT, Camera, CameraAddressInput, CameraCapability, CameraCapabilityContext, CameraCapabilityDescriptor, CameraCapabilityEntry, CameraCapabilityReason, CameraCapabilityState, CameraCapabilityTrace, CameraDevice, CameraFrame, CameraMembership, CameraStream, CameraTestStatus, CameraTransport, CameraType, ConsoleAuditAction, ConsoleAuditTarget, ConsoleGrant, DEFAULT_RING_SECONDS, DEFAULT_SITE_TIMEZONE, DEVICE_STATUS, DOBStatus, DUPLICATE_TERMS_VERSION_MESSAGE, DayOfWeek, DeviceHttpTarget, DeviceProbeResult, DynamicFormFields, E164, EAccessCardTypes, EAccessCardUserTypes, EmailSender, EntryOrder, EntrySort, EventOrder, EventSort, EventStatus, EventType, FacilitySort, FacilityStatus, FormEntryStatus, GOVERNED_MODULES, GuestSort, GuestStatus, HID_CARD_VALUE_FACTOR, HID_PERMISSION_CATEGORIES, HID_UINT32_MAX, HID_UINT64_MAX, HidRawUint64, IAccessCard, IAccessCardTransaction, InviteActor, LIVE_ROLE, LIVE_VEHICLE_STATUSES, MANAGE_SITE_MODULES, MAX_BULK_CAMERA_ROWS, MAX_CAMERA_CHANNEL, MAX_CAMERA_NAME_LENGTH, MAX_PERSONAL_EMERGENCY_CONTACTS, MAX_RING_SECONDS, MAccessCard, MAccessCardTransaction, MAddress, MAttendance, MAttendanceSettings, MBidPreloved, MBillingConfiguration, MBillingItem, MBuilding, MBuildingLevel, MBuildingUnit, MBulletinBoard, MBulletinVideo, MCategoryPreloved, MChannelPreloved, MChat, MChatPreloved, MConsoleAudit, MCustomer, MCustomerSite, MDocumentManagement, MEMBER_TYPES, MEntryPassSettings, MEventManagement, MFeedback, MFile, MFormEntry, MGuestManagement, MHidAmicoEvent, MHidAmicoIdentity, MHidAmicoReader, MHidSipAccount, MHidSitePermissions, MIN_RING_SECONDS, MIncidentReport, MManpowerDesignations, MManpowerMonitoring, MManpowerRemarks, MManpowerSites, MMember, MNfcPatrolLog, MNfcPatrolRoute, MNfcPatrolSettings, MNfcPatrolSettingsUpdate, MNfcPatrolTag, MNotification, MNotificationPreference, MODULE_GATE_MODE_DEFAULT, MODULE_LIST_GATE_DEFAULT, MOccurrenceBook, MOccurrenceEntry, MOccurrenceSubject, MOnlineForm, MOrg, MOvernightParkingApprovalHours, MOvernightParkingRequest, MPatrolEmail, MPatrolLog, MPatrolQuestion, MPatrolRoute, MPerson, MPersonalEmergencyChain, MPlatformTerms, MPost, MPostFavorite, MPromoCode, MRobot, MRole, MRoleV2, MServiceProvider, MServiceProviderBilling, MSession, MSite, MSiteCamera, MSiteFacility, MSiteFacilityBooking, MStatementOfAccount, MSubcategoryPreloved, MSubscription, MSubscriptionPlan, MUnitBilling, MUser, MVehicle, MVehicleTransaction, MVerification, MVerificationV2, MVisitorTransaction, MWorkOrder, NOTIFICATION_CATEGORIES, NOTIFICATION_CHANNELS, NOTIFICATION_CHANNEL_LABELS, NOTIFICATION_NAMESPACE, NOTIFY_ACCESS_FILTER_DEFAULT, NotificationAppSlug, NotificationCategory, NotificationChannel, NotificationModule, NotificationPreferenceView, NotificationService, ORG_MARKETPLACE_VENDOR_FIELD, ORG_OWNER_REPAIR_CLAIM_STALE_MS, ORG_OWNER_REPAIR_CLAIM_TAKEN_REASON, ORG_OWNER_REPAIR_DEFAULT, ORG_OWNER_REPAIR_OFF_REASON, OrgNature, OvernightParkingRequestSort, OvernightParkingRequestStatus, PATROL_CCTV_CAMERA_FILTER, PATROL_EMAIL_MAX_LOGS, PATROL_EMAIL_MAX_PER_HOUR, PATROL_EMAIL_MAX_RECIPIENTS, PERSON_TYPES, PLAN_RANGE, PLATFORM_STAFF_MEMBER_TYPE, PLATFORM_STAFF_ROLE_TYPE, PLAYBACK_LINK_SECONDS, PLAYBACK_MAX_WINDOW_SECONDS, PROPERTY_MANAGEMENT_MEMBER_TYPES, PStatus, PTZ_ALLOWED_ACTIONS, PTZ_ALLOWED_CODES, Period, PersonStatus, PersonType, PersonTypes, PlatformTermsStatus, PostOrder, PostSort, PostStatus, QrTagProps, REALTIME_MAX_FANOUT, REGISTERED_VEHICLE_CATEGORIES, ROBOT_APP_SCOPES, ROBOT_CLOUD_DOC_CONFIRMATIONS, ROBOT_CLOUD_PATHS, ROBOT_MODULE, ROBOT_PERMISSIONS, ROBOT_STATUS_NAMES, ROBOT_TYPES, ResidentAppModuleKey, RobotCloudError, SELF_SERVICE_RESEND_COOLDOWN_MS, SELF_SIGNUP_PLATFORM, SELF_SIGNUP_STATUS, SELF_SIGNUP_TYPES, SERVICE_PROVIDER_INVITE_LABELS, SERVICE_PROVIDER_INVITE_TRANSITIONS, SERVICE_PROVIDER_SIGN_IN_SUBJECT, SERVICE_PROVIDER_SIGN_IN_TYPE, SERVICE_PROVIDER_SIGN_UP_SUBJECT, SERVICE_PROVIDER_SIGN_UP_TYPE, SOFTWARE_VERSION_ENDPOINT, ServiceProviderInviteAction, ServiceProviderInviteDecision, ServiceProviderInviteFacts, SiteAddress, SiteCategories, SiteStatus, SortFields, SortOrder, Status, SubjectOrder, SubjectSort, SubscriptionBillingMode, SubscriptionType, TAccessMngmntSettings, TActionStatus, TAddress, TAffectedEntities, TAffectedInjured, TAppServiceType, TApprovedBy, TApprover, TAreaColour, TAttendance, TAttendanceCheckIn, TAttendanceCheckOut, TAttendanceCheckTime, TAttendanceLocation, TAttendanceSettings, TAttendanceSettingsGetBySite, TAuthorities, TAuthoritiesCalled, TBidPreloved, TBilling, TBillingConfiguration, TBillingItem, TBuilding, TBuildingLevel, TBuildingUnit, TBulletinBoard, TBulletinVideo, TCamera, TCameraHealthClaim, TCategoryPreloved, TChannelPreloved, TChat, TChatPreloved, TCheckPoint$1 as TCheckPoint, TCleanLevel, TCleanMode, TCleanOptions, TCleanSubMode, TCloudArea, TCloudFile, TCloudMap, TCloudPlan, TCloudPlanJob, TCloudRobot, TComplaintInfo, TComplaintReceivedTo, TConsoleAudit, TConsoleAuditQuery, TCounter, TCreateNfcPatrolLog, TCustomer, TCustomerSite, TCustomerSitePropertyField, TDayNumber, TDaySchedule, TDefaultAccessCard, TDesignations, TDocs, TDocumentCreate, TDocumentManagement, TEntryPassSettings, TEventManagement, TFeedback, TFeedbackMetadata, TFeedbackUpdate, TFeedbackUpdateCategory, TFeedbackUpdateServiceProvider, TFeedbackUpdateStatus, TFeedbackUpdateToCompleted, TFile, TFiles, TFleetRobot, TFolderUpdate, TFormEntry, TGetAttendancesByUserQuery, TGetAttendancesQuery, TGuestManagement, THidAmicoEvent, THidAmicoGatewayJob, THidAmicoIdentity, THidAmicoPhysicalCard, THidAmicoReader, THidPermissionAssignment, THidPermissionCategory, THidPermissionUserBinding, THidPhysicalCardInput, THidPhysicalCardType$1 as THidPhysicalCardType, THidSipAccount, THidSitePermissions, TIncidentInformation, TIncidentReport, TIncidentTypeAndTime, TInvoice, TKeyRef, TManpowerDesignations, TManpowerDesignationsUpdate, TManpowerMonitoring, TManpowerMonitoringUpdate, TManpowerRemarks, TManpowerRemarksStatusUpdate, TManpowerRemarksUpdate, TManpowerSearchFilter, TManpowerSites, TMember, TMemberModulesDeps, TMemberUpdateStatus, TMessagePreloved, TMiniRole, TModuleAccess, TModuleGateMode, TModuleImpact, TNfcPatrolLog, TNfcPatrolRoute, TNfcPatrolRouteEdit, TNfcPatrolSettings, TNfcPatrolSettingsGetBySite, TNfcPatrolSettingsUpdate, TNfcPatrolTag, TNfcPatrolTagConfigureReset, TNfcPatrolTagEdit, TNfcPatrolTagUpdateData, TNotification, TNotificationPreference, TNotificationPreferenceOff, TNotifyAccessContext, TNotifyAccessMode, TNotifyAccessReport, TOccurrenceBook, TOccurrenceEntry, TOccurrenceSubject, TOnlineForm, TOrg, TOrgModulesDeps, TOrgOwnerRepairClaim, TOrgOwnerRepairDeps, TOrgOwnerRepairInput, TOrgOwnerRepairPayload, TOrgOwnerRepairPlan, TOvernightParkingApprovalHours, TOvernightParkingRequest, TPatrolEmail, TPatrolEmailCreatedBy, TPatrolEmailLogRef, TPatrolLog, TPatrolQuestion, TPatrolRoute, TPerson, TPersonalEmergencyChain, TPersonalEmergencyContact, TPlaceOfIncident, TPlates, TPlatformTerms, TPost, TPostFavorite, TPrice, TPriceType, TPromoCode, TPromoCurrencyInput, TPromoTier, TRACKING_BACKOFF_BASE_MS, TRACKING_BACKOFF_CAP_MS, TRACKING_IDLE_TIMEOUT_MS, TRANSPORT_DEVICE_HTTP, TRANSPORT_RELAY_PLAYBACK, TRANSPORT_RELAY_PLAYER, TRANSPORT_RTSP_FRAME, TRecipientOfComplaint, TRemarks, TResident, TResidentAppModules, TRobot, TRobotAction, TRobotAppScope, TRobotCloudCredentials, TRobotCloudPath, TRobotCloudReply, TRobotLiveState, TRobotMetadata, TRobotMode, TRobotPermissionActor, TRobotPose, TRobotType, TRole, TRolePermissionHistoryEntry, TRoleV2, TRoute, TSOABillingItem, TSOAStatus, TSelfServiceEmailOccasion, TSelfServiceEmailRecord, TSelfServiceResendDecision, TSelfServiceResendFacts, TServiceProvider, TServiceProviderBilling, TSession, TSessionCreate, TShifts, TSignNfcPatrolLog, TSite, TSiteCamera, TSiteDayBounds, TSiteFacility, TSiteFacilityBooking, TSiteInfo, TSiteInformation, TSiteMetadata, TSiteModulesDeps, TSiteUpdateBlock, TSseEvent, TStatementOfAccount, TSubcategoryPreloved, TSubmissionForm, TSubscription, TSubscriptionPlan, TSubscriptionPlanApplication, TUnitBilling, TUnits, TUpdateFormEntry, TUpdateName, TUser, TUserCreate, TVehicle, TVehicleAnprCamera, TVehicleHistoryEntry, TVehicleTransaction, TVehicleUpdate, TVerification, TVerificationCode, TVerificationEvent, TVerificationMetadata, TVerificationMetadataV2, TVerificationOnboarding, TVerificationV2, TVisitorTransaction, TWorkOrder, TWorkOrderMetadata, TWorkOrderUpdate, TWorkOrderUpdateStatus, TWorkOrderUpdateToCompleted, TanyoneDamageToProperty, UNSTORED_COLUMNS, UseAccessManagementRepo, UserStatus, VEHICLE_HISTORY_LIMIT, VERIFICATION_OPEN_STATUSES, VehicleCategory, VehicleListView, VehicleOrder, VehicleSort, VehicleStatus, VehicleType, VerificationLinkType, VerificationStatus, VerificationSubjectType, VerificationType, VisitorSort, VisitorStatus, addressSchema, allowedFieldsSite, allowedNatures, allowedPlanApplications, allowsRobotAction, allowsRobotListing, applyTrackingFrame, areaColourToHex, attendanceSchema, attendanceSettingsSchema, buildSelfServiceEmailContext, building_level_namespace_collection, building_units_namespace_collection, buildings_namespace_collection, bulletin_boards_namespace_collection, callerAccountApproved, callerId, cameraBaseUrl, cameraCapabilitiesFor, cameraDevices, cameraGrant, cameraHealthClaim, cameraHealthSummary, cameraListClearConfirmation, cameraManagePermissions, cameraProbeCacheKey, cameraTransports, canManageSiteModules, canMonitorRobotType, canRevokeRefreshTokenFamily, canSetUpRobotType, categoriesForPermissions, categorySupportsChannel, chatPrelovedEvents, chatSchema, claimReadsAsStale, clampPtzSpeed, clockDriftSeconds, consoleRoleAllows, consoleRoleAllowsAll, consoleSpellings, console_audit_namespace_collection, createManpowerRemarksDaily, createSseParser, customerSchema, customerSitePropertyFields, decideSelfServiceResend, decideServiceProviderInvite, decodeHidPacsCard, decodeTrackingFrame, deniedModules, deriveBulletinStatus, deriveCameraHost, describeCameraCapabilities, designationsSchema, deviceControlEnabled, deviceHttpEnabled, deviceHttpTargets, deviceHttpTimeoutMs, deviceProbeTtlSeconds, disconnectedState, emitNotificationCreated, emptyPersonalEmergencyChain, encodeHidPacsCard, entitledSiteScope, events_namespace_collection, expandModules, expiredBulletinSweepFilter, expiredVehicleSweepFilter, facility_bookings_namespace_collection, feedbackSchema, feedbacks2_namespace_collection, feedbacks_namespace_collection, ffmpegFrameArgs, ffmpegPath, filterByAccess, formatCapabilityTrace, formatDahuaDate, getIO, getSessionIdFromRequest, grabWithSubStreamFallback, guests_namespace_collection, hasAnyCapability, hasAnyPermission, hasOrgInvitation, hasOrgOwnership, hasOrgSiteReach, hexToAreaColour, hidRawUint64, holdsRole, incidentReport, incidentReportLog, incidents_namespace_collection, invitationOffersRole, isAvailableForWork, isCameraEntitled, isDispatchable, isDuplicateMemberError, isDuplicateVersionError, isLikelySelfServiceEmail, isLiveVehicleStatus, isPatrolCctvCamera, isPlatformOwner, isPromoCodeExpired, isRelayPlayerUrl, isSafeRelativePath, isSeasonPassVehicle, isSuperAdmin, isTermsCurrent, isTrackingStale, isValidTimezone, listStaffUserIds, liveStatusFor, logCamera, manpowerDesignationsSchema, manpowerEvents, manpowerMonitoringSchema, manpowerRemarksSchema, manpowerSitesSchema, mapWithLimit, maskNric, memberModulesHandlers, metresToPixel, moduleDeniedForCaller, moduleGateEnforceKeys, moduleGateMode, moduleImpact, moduleListGateOn, nfcPatrolSettingsSchema, nfcPatrolSettingsSchemaUpdate, normalizeAcceptedTerms, normalizeHidCardValue, notificationAccessReport, notificationCategory, notificationCategoryLabel, notificationEvents, notificationRoom, notifyAccessMode, occasionForStatus, occurrence_book_namespace_collection, onBookTimezonesChanged, online_forms_namespace_collection, orgLevelRoles, orgModulesHandlers, orgOwnerRepairHandlers, orgOwnerRepairOn, orgQualifiesForOwnerRepair, orgSchema, overnight_parking_requests_namespace_collection, parseCameraChannel, parseCameraHost, parseDahuaFind, parseDeviceTime, parseHidJsonLossless, parsePromoExpiry, parseSoftwareVersion, pickAuditFields, pickCustomerSiteProperties, pixelToMetres, planBulkCameraImport, planDayFromJsDay, planOrgOwnerRepair, platform_terms_namespace_collection, playbackRelays, playbackWindowRefusal, promoCodeRefusal, promoCodeSchema, promoCodeStatusSchema, promoCodeUpdate, promoCodeUpdateSchema, ptzEndpoint, publicCameraFields, readsAsApprovedAccount, recordConsoleAction, refuseServiceProviderInviteAction, registerCameraTransport, relayForRecorder, remarksSchema, renderPagePdf, requireConsolePermission, requirePlatformStaff, resetCameraTransports, residentAppModuleKeys, residentAppModulesSchema, residentFormEntry, resolutionRefusalReason, resolveCamera, resolveDeviceHttp, resolveHidPhysicalCardValue, resolveInviteActor, resolveSiteTimezone, resolveStaffRole, robotActionsFor, robotCloudBody, robotCloudSign, robotCloudSigningString, robotCloudTimestamp, robotMode, robotModeFromList, robotSchema, robotScopeForApp, robotTypesVisibleTo, rtspUrl, schema, schemaAppSlugNotification, schemaApprovedBy, schemaApprover, schemaBidPreloved, schemaBilling, schemaBillingConfiguration, schemaBillingItem, schemaBuilding, schemaBuildingLevel, schemaBuildingUnit, schemaBuildingUpdateOptions, schemaBulletinBoard, schemaBulletinVideo, schemaCategoryPreloved, schemaChannelPreloved, schemaChatPreloved, schemaConsoleAudit, schemaCreateHidAmicoIdentity, schemaCreateNfcPatrolLog, schemaCreateNotification, schemaCustomerSite, schemaDiscoverHidAmicoReader, schemaDocumentManagement, schemaEntryPassSettings, schemaEventManagement, schemaFiles, schemaFormEntry, schemaGuestManagement, schemaHidAmicoAccessLogQuery, schemaHidAmicoAssignUserCard, schemaHidAmicoConfiguration, schemaHidAmicoEnrollUserCard, schemaHidAmicoEvent, schemaHidAmicoExecuteActions, schemaHidAmicoIdentity, schemaHidAmicoIdentityIdParams, schemaHidAmicoIdentityQuery, schemaHidAmicoIntercomCall, schemaHidAmicoLogQuery, schemaHidAmicoMonitor, schemaHidAmicoNotificationParams, schemaHidAmicoObjectOperation, schemaHidAmicoOperatingMode, schemaHidAmicoReader, schemaHidAmicoReaderIdParams, schemaHidAmicoReaderListQuery, schemaHidAmicoReaderUserQuery, schemaHidAmicoSetConfiguration, schemaHidAmicoSiteIdParams, schemaHidAmicoSync, schemaHidAmicoUserCardIdParams, schemaHidAmicoUserCardParams, schemaHidAmicoUserImageParams, schemaHidAmicoUserImageUploadQuery, schemaHidAmicoUserPin, schemaHidAmicoUserPinParams, schemaHidAmicoVisitorImageParams, schemaHidAmicoVisitorImageUploadQuery, schemaHidAmicoVisitorQr, schemaHidPermissionCandidateQuery, schemaHidPermissionScopeQuery, schemaHidSipAccountRequest, schemaIncidentReport, schemaListNotification, schemaMultipleDocumentManagement, schemaNfcPatrolLog, schemaNfcPatrolRoute, schemaNfcPatrolTag, schemaNfcPatrolTagUpdateData, schemaNotification, schemaNotificationPreference, schemaNotificationPreferenceOff, schemaOccurrenceBook, schemaOccurrenceEntry, schemaOccurrenceSubject, schemaOnlineForm, schemaOvernightParkingApprovalHours, schemaOvernightParkingRequest, schemaPatrolEmail, schemaPatrolEmailCreatedBy, schemaPatrolEmailLogRef, schemaPatrolEmailQuery, schemaPatrolLog, schemaPatrolQuestion, schemaPatrolRoute, schemaPerson, schemaPersonalEmergencyContact, schemaPlate, schemaPlatformTerms, schemaPost, schemaPostFavorite, schemaResendPatrolEmail, schemaResidentSelfSignUp, schemaSelfServiceVisitor, schemaSendPatrolEmail, schemaServiceProvider, schemaServiceProviderBilling, schemaSignNfcPatrolLog, schemaSiteCamera, schemaSiteFacility, schemaSiteFacilityBooking, schemaStatementOfAccount, schemaSubcategoryPreloved, schemaUnitBilling, schemaUpdateBidPreloved, schemaUpdateBuildingLevel, schemaUpdateBulletinBoard, schemaUpdateBulletinVideo, schemaUpdateCategoryPreloved, schemaUpdateChatPreloved, schemaUpdateDocumentManagement, schemaUpdateEntryPassSettings, schemaUpdateEventManagement, schemaUpdateFolderManagement, schemaUpdateFormEntry, schemaUpdateGuestManagement, schemaUpdateHidAmicoIdentity, schemaUpdateHidAmicoReader, schemaUpdateHidSitePermissions, schemaUpdateIncidentReport, schemaUpdateNotification, schemaUpdateNotificationPreference, schemaUpdateOccurrenceBook, schemaUpdateOccurrenceEntry, schemaUpdateOccurrenceSubject, schemaUpdateOnlineForm, schemaUpdateOptions, schemaUpdateOvernightParkingRequest, schemaUpdatePatrolLog, schemaUpdatePatrolQuestion, schemaUpdatePatrolRoute, schemaUpdatePerson, schemaUpdatePersonalEmergencyChain, schemaUpdatePost, schemaUpdatePostFavorite, schemaUpdateServiceProviderBilling, schemaUpdateSiteBillingConfiguration, schemaUpdateSiteBillingItem, schemaUpdateSiteCamera, schemaUpdateSiteFacility, schemaUpdateSiteFacilityBooking, schemaUpdateSiteUnitBilling, schemaUpdateStatementOfAccount, schemaUpdateSubcategoryPreloved, schemaUpdateVisTrans, schemaVehicleTransaction, schemaVisitorTransaction, schemeCamera, schemeLogCamera, selectHealthTargets, selfServiceEmailSubject, serviceProviderInviteLabel, sessionSchema, setIO, shiftSchema, signLiveLink, signPlaybackLink, siteDayBounds, siteModulesHandlers, siteSchema, site_people_namespace_collection, snapshotEndpoint, snapshotRefusalReason, staffMayBypass, startTodaysBookForSite, stringifyHidJson, stripFacialImageMetadata, subscriptionPlanSchema, summariseBulkCameraPlan, trackingBackoffMs, updateRemarksStatusEod, updateRemarksisAcknowledged, updateSiteSchema, useAccessManagementController, useAddressRepo, useAttendanceController, useAttendanceRepository, useAttendanceSettingsController, useAttendanceSettingsRepository, useAttendanceSettingsService, useAuthController, useAuthControllerV2, useAuthService, useAuthServiceV2, useBidPrelovedController, useBidPrelovedRepo, useBidPrelovedService, useBuildingController, useBuildingLevelController, useBuildingLevelRepo, useBuildingLevelService, useBuildingRepo, useBuildingService, useBuildingUnitController, useBuildingUnitRepo, useBuildingUnitService, useBulletinBoardController, useBulletinBoardRepo, useBulletinBoardService, useBulletinVideoController, useBulletinVideoRepo, useBulletinVideoService, useCameraViewController, useCameraViewService, useCategoryPrelovedController, useCategoryPrelovedRepo, useChannelPrelovedController, useChannelPrelovedRepo, useChatController, useChatPrelovedController, useChatPrelovedRepo, useChatPrelovedService, useChatRepo, useConsoleAuditController, useConsoleAuditRepo, useCounterModel, useCounterRepo, useCustomerController, useCustomerRepo, useCustomerSiteController, useCustomerSiteRepo, useCustomerSiteService, useDahuaService, useDashboardController, useDashboardRepo, useDocumentManagementController, useDocumentManagementRepo, useDocumentManagementService, useEntryPassSettingsController, useEntryPassSettingsRepo, useEventManagementController, useEventManagementRepo, useEventManagementService, useFeedbackController, useFeedbackRepo, useFeedbackService, useFileController, useFileRepo, useFileService, useFormEntryController, useFormEntryRepo, useGuestManagementController, useGuestManagementRepo, useGuestManagementService, useHidAmicoController, useHidAmicoRepo, useHidAmicoService, useHrmLabsAttendanceCtrl, useHrmLabsAttendanceSrvc, useIncidentReportController, useIncidentReportRepo, useIncidentReportService, useInvoiceController, useInvoiceModel, useInvoiceRepo, useManpowerDesignationCtrl, useManpowerDesignationRepo, useManpowerMonitoringCtrl, useManpowerMonitoringRepo, useManpowerMonitoringSrvc, useManpowerRemarkCtrl, useManpowerRemarksRepo, useManpowerSitesCtrl, useManpowerSitesRepo, useManpowerSitesSrvc, useMemberController, useMemberRepo, useMemberService, useNewDashboardController, useNewDashboardRepo, useNfcPatrolLogController, useNfcPatrolLogRepo, useNfcPatrolLogService, useNfcPatrolRouteController, useNfcPatrolRouteRepo, useNfcPatrolRouteService, useNfcPatrolSettingsController, useNfcPatrolSettingsRepository, useNfcPatrolSettingsService, useNfcPatrolTagController, useNfcPatrolTagRepo, useNfcPatrolTagService, useNotificationController, useNotificationPreferenceController, useNotificationPreferenceRepo, useNotificationPreferenceService, useNotificationRepo, useOccurrenceBookController, useOccurrenceBookRepo, useOccurrenceBookService, useOccurrenceEntryController, useOccurrenceEntryRepo, useOccurrenceEntryService, useOccurrenceSubjectController, useOccurrenceSubjectRepo, useOccurrenceSubjectService, useOnlineFormController, useOnlineFormRepo, useOrgController, useOrgControllerV2, useOrgOwnerRepairRepo, useOrgRepo, useOvernightParkingController, useOvernightParkingRepo, useOvernightParkingRequestController, useOvernightParkingRequestRepo, useOvernightParkingRequestService, usePatrolEmailController, usePatrolEmailRepo, usePatrolEmailService, usePatrolLogController, usePatrolLogRepo, usePatrolLogService, usePatrolQuestionController, usePatrolQuestionRepo, usePatrolRouteController, usePatrolRouteRepo, usePersonController, usePersonRepo, usePersonalEmergencyChainController, usePersonalEmergencyChainRepo, usePersonalEmergencyChainService, usePlatformTermsController, usePlatformTermsRepo, usePlatformTermsService, usePostFavoriteController, usePostFavoriteRepo, usePostFavoriteService, usePostPrelovedController, usePostPrelovedRepo, usePriceController, usePriceModel, usePriceRepo, usePromoCodeController, usePromoCodeRepo, useRedDotPaymentController, useRedDotPaymentRepo, useRedDotPaymentSvc, useRobotCloudService, useRobotController, useRobotFleetService, useRobotRepo, useRobotService, useRoleController, useRoleControllerV2, useRoleRepo, useRoleRepoV2, useRoleServiceV2, useServiceProviderBillingController, useServiceProviderBillingRepo, useServiceProviderBillingService, useServiceProviderController, useServiceProviderInviteController, useServiceProviderInviteService, useServiceProviderRepo, useSessionRepo, useSiteBillingConfigurationController, useSiteBillingConfigurationRepo, useSiteBillingItemController, useSiteBillingItemRepo, useSiteCameraController, useSiteCameraRepo, useSiteCameraService, useSiteController, useSiteFacilityBookingController, useSiteFacilityBookingRepo, useSiteFacilityBookingService, useSiteFacilityController, useSiteFacilityRepo, useSiteFacilityService, useSiteRepo, useSiteService, useSiteUnitBillingController, useSiteUnitBillingRepo, useSiteUnitBillingService, useStatementOfAccountController, useStatementOfAccountRepo, useSubcategoryPrelovedController, useSubcategoryPrelovedRepo, useSubscriptionController, useSubscriptionPlanController, useSubscriptionPlanRepo, useSubscriptionRepo, useSubscriptionService, useUserController, useUserControllerV2, useUserRepo, useUserRepoV2, useUserService, useUserServiceV2, useVehicleController, useVehicleRepo, useVehicleService, useVerificationController, useVerificationControllerV2, useVerificationRepo, useVerificationRepoV2, useVerificationService, useVerificationServiceV2, useVisitorTransactionController, useVisitorTransactionRepo, useVisitorTransactionService, useWorkOrderController, useWorkOrderRepo, useWorkOrderService, userSchema, vehicleCategoryFor, vehicleHistoryEntry, vehicleListViewQuery, vehicleSchema, vehicleViewOf, vehicles_namespace_collection, visitorPersonRepo, visitorPersonService, visitorType, visitors_namespace_collection, wallConfig, withLiveLink, workOrderSchema, work_orders2_namespace_collection, work_orders_namespace_collection };