@7365admin1/core 3.80.0 → 3.82.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<{
@@ -6676,11 +6713,15 @@ declare function useRobotRepo(): {
6676
6713
  pages: number;
6677
6714
  pageRange: string;
6678
6715
  } | TRobot>;
6716
+ getRobotById: (id: string | ObjectId) => Promise<TRobot & {
6717
+ _id: ObjectId;
6718
+ }>;
6719
+ setRobotSn: (id: string | ObjectId, robotSn: string) => Promise<void>;
6679
6720
  };
6680
6721
 
6681
6722
  declare function useRobotService(): {
6682
- createRobot: (value: TRobot) => Promise<ObjectId>;
6683
- getRobots: ({ search, page, limit, sort, organization, site, status, from, to, }: {
6723
+ createRobot: (value: TRobot) => Promise<bson.ObjectId>;
6724
+ getRobots: ({ search, page, limit, sort, organization, site, status, type, from, to, }: {
6684
6725
  search?: string | undefined;
6685
6726
  page?: number | undefined;
6686
6727
  limit?: number | undefined;
@@ -6688,6 +6729,7 @@ declare function useRobotService(): {
6688
6729
  organization: string;
6689
6730
  site: string;
6690
6731
  status: string;
6732
+ type?: string | undefined;
6691
6733
  serviceProvider?: string | undefined;
6692
6734
  from?: string | undefined;
6693
6735
  to?: string | undefined;
@@ -6703,6 +6745,913 @@ declare function useRobotController(): {
6703
6745
  getRobots: (req: Request, res: Response, next: NextFunction) => Promise<void>;
6704
6746
  };
6705
6747
 
6748
+ /**
6749
+ * Cleaning-robot cloud: the pure parts.
6750
+ *
6751
+ * Everything here is a pure function so it can be tested without a network, a
6752
+ * database or a robot. The HTTP calls live in `robot-cloud.service.ts`; this
6753
+ * file owns the request signature, the status vocabulary and the two coordinate
6754
+ * conversions the cloud's own documentation leaves the caller to do.
6755
+ *
6756
+ * Source: "Robot Cloud API Document (2025.05.27)". The cloud is ours, so where
6757
+ * the document is ambiguous the ambiguity is recorded here rather than guessed
6758
+ * away - see ROBOT_CLOUD_DOC_CONFIRMATIONS at the bottom.
6759
+ */
6760
+ /**
6761
+ * The exact string the cloud hashes. Order is fixed by the spec:
6762
+ *
6763
+ * appid=[appid],timestamp=[timestamp],url=[path],secret=[secret]
6764
+ *
6765
+ * `path` is the request path as the document writes it, leading slash included
6766
+ * (e.g. `/portal/robots/get-robot-list`). It is part of the hash, so a trailing
6767
+ * slash or a missing one produces a different - rejected - signature.
6768
+ *
6769
+ * Exported for the tests: the assertion that matters is the string's shape, and
6770
+ * the shape is invisible once it has been hashed.
6771
+ */
6772
+ declare function robotCloudSigningString(appid: string, timestamp: string, path: string, secret: string): string;
6773
+ /** `yyyyMMddHHmmss`, the only format the cloud accepts. */
6774
+ declare function robotCloudTimestamp(now?: Date): string;
6775
+ /**
6776
+ * SHA-1 of the signing string, lower-case hex.
6777
+ *
6778
+ * SHA-1 is the cloud's choice, not ours; it is a request signature against a
6779
+ * shared secret, not a password hash. Changing it here would simply be rejected
6780
+ * at the other end.
6781
+ */
6782
+ declare function robotCloudSign(appid: string, timestamp: string, path: string, secret: string): string;
6783
+ /**
6784
+ * The signed envelope every endpoint expects, merged with the call's own
6785
+ * parameters. The secret goes into the hash and is NEVER a field - if it ever
6786
+ * appears in a request body, that is the bug to look for.
6787
+ */
6788
+ declare function robotCloudBody(appid: string, secret: string, path: string, params?: Record<string, unknown>, now?: Date): Record<string, unknown>;
6789
+ /** Every documented endpoint. The key is also the signed `url`. */
6790
+ declare const ROBOT_CLOUD_PATHS: {
6791
+ readonly robotList: "/portal/robots/get-robot-list";
6792
+ readonly mapList: "/portal/maps/get-map-list";
6793
+ readonly fileUrl: "/portal/maps/get-file-url";
6794
+ readonly tracking: "/portal/robots/tracking";
6795
+ readonly startFullCleaning: "/portal/robots/start-full-cleaning";
6796
+ readonly startAreaCleaning: "/portal/robots/start-area-cleaning";
6797
+ readonly startSpotCleaning: "/portal/robots/start-spot-cleaning";
6798
+ readonly returnToBase: "/portal/robots/return-to-base";
6799
+ readonly plansList: "/portal/plans/list";
6800
+ readonly plansSave: "/portal/plans/save";
6801
+ };
6802
+ type TRobotCloudPath = (typeof ROBOT_CLOUD_PATHS)[keyof typeof ROBOT_CLOUD_PATHS];
6803
+ /**
6804
+ * The cloud's 27 status codes, verbatim from the document (including its
6805
+ * "switching floow" typo, corrected here in the label only).
6806
+ */
6807
+ declare const ROBOT_STATUS_NAMES: Readonly<Record<number, string>>;
6808
+ /**
6809
+ * The vocabulary our own apps speak. Twenty-seven vendor codes are too many to
6810
+ * put in front of a cleaner on a phone, and they are not stable across firmware
6811
+ * - so every screen reads this, never `statusFlag`.
6812
+ */
6813
+ type TRobotMode = "IDLE" | "CHARGED" | "WORKING" | "PAUSED" | "CHARGING_CYCLE" | "MAINTENANCE" | "IN_TRANSIT" | "MANUAL" | "UNAVAILABLE";
6814
+ /**
6815
+ * An UNRECOGNISED code is UNAVAILABLE, not IDLE.
6816
+ *
6817
+ * This is the one branch in the file worth being careful about. A new firmware
6818
+ * status we have never seen must not read as "free, send it a job" - dispatching
6819
+ * onto an unknown state is how a robot gets two jobs at once. Fail closed.
6820
+ */
6821
+ declare function robotMode(statusFlag: unknown): TRobotMode;
6822
+ /** Only these two modes may be sent a new job. */
6823
+ declare function isDispatchable(statusFlag: unknown): boolean;
6824
+ /**
6825
+ * `onlineFlag` beats `statusFlag`. The list endpoint can report a cached status
6826
+ * for a robot that has since dropped off the network.
6827
+ */
6828
+ declare function robotModeFromList(item: {
6829
+ statusFlag?: unknown;
6830
+ onlineFlag?: unknown;
6831
+ }): TRobotMode;
6832
+ /**
6833
+ * The cloud uses TWO frames and never says so in one place:
6834
+ *
6835
+ * - `tracking` reports x/y in METRES in the map frame.
6836
+ * - `start-spot-cleaning` takes x/y in PIXELS of the map image.
6837
+ *
6838
+ * so anything that turns a click on the floor plan into a spot-clean, or a live
6839
+ * pose into a dot on that plan, goes through here.
6840
+ *
6841
+ * `imageHeight` is the background PNG's height in pixels. The vertical flip is
6842
+ * the standard occupancy-grid convention (image origin top-left, map origin
6843
+ * bottom-left) and is the one thing in this file NOT confirmed against a real
6844
+ * robot - see ROBOT_CLOUD_DOC_CONFIRMATIONS.
6845
+ */
6846
+ declare function pixelToMetres(px: number, py: number, map: {
6847
+ originX: number;
6848
+ originY: number;
6849
+ resolution: number;
6850
+ }, imageHeight: number): {
6851
+ x: number;
6852
+ y: number;
6853
+ };
6854
+ /** The inverse of `pixelToMetres`, rounded to whole pixels. */
6855
+ declare function metresToPixel(x: number, y: number, map: {
6856
+ originX: number;
6857
+ originY: number;
6858
+ resolution: number;
6859
+ }, imageHeight: number): {
6860
+ x: number;
6861
+ y: number;
6862
+ };
6863
+ type TAreaColour = {
6864
+ r: number;
6865
+ g: number;
6866
+ b: number;
6867
+ a: number;
6868
+ };
6869
+ /**
6870
+ * An area carries TWO identifiers and the cloud disagrees with itself on the
6871
+ * form: `get-map-list` returns `rgba` as a hex STRING ("FF0B0B83"), while
6872
+ * `plans/list` and `plans/save` use an OBJECT ({r,g,b,a}). `start-area-cleaning`
6873
+ * meanwhile keys off `areaName`. So selecting "the kitchen" means a different
6874
+ * payload depending on which endpoint you are calling, and these two convert.
6875
+ *
6876
+ * The hex is read in RGBA order, matching the field's name and the areaName
6877
+ * suffix ("AREA-FF0B0B83" -> rgba "FF0B0B83").
6878
+ */
6879
+ declare function hexToAreaColour(hex: string): TAreaColour;
6880
+ /** The inverse, upper-case and without a leading `#`, as the cloud returns it. */
6881
+ declare function areaColourToHex(c: TAreaColour): string;
6882
+ /** `rangeFlag` on a planned job. */
6883
+ declare const PLAN_RANGE: {
6884
+ readonly FULL_MAP: 1;
6885
+ readonly SPOT: 2;
6886
+ readonly AREA: 3;
6887
+ };
6888
+ /** `dateList` is 1..7 = Monday..Sunday - NOT JavaScript's 0 = Sunday. */
6889
+ declare function planDayFromJsDay(jsDay: number): number;
6890
+ /**
6891
+ * Read this before trusting a number that came out of this module.
6892
+ *
6893
+ * Each entry is a question for the robot-cloud team, not a defect in our code.
6894
+ * They are listed here rather than in a document because this is the file whose
6895
+ * behaviour changes when one of them is answered.
6896
+ */
6897
+ declare const ROBOT_CLOUD_DOC_CONFIRMATIONS: readonly string[];
6898
+ type TRobotCommand = {
6899
+ kind: "full";
6900
+ options: TCleanOptionValues;
6901
+ } | {
6902
+ kind: "area";
6903
+ areas: string[];
6904
+ options: TCleanOptionValues;
6905
+ } | {
6906
+ kind: "spot";
6907
+ points: Array<{
6908
+ x: number;
6909
+ y: number;
6910
+ }>;
6911
+ options: TCleanOptionValues;
6912
+ } | {
6913
+ kind: "return";
6914
+ };
6915
+ type TCleanOptionValues = {
6916
+ cleanTimes: number;
6917
+ modeFlag: 1 | 2 | 3;
6918
+ subModeFlag: 0 | 1;
6919
+ levelFlag: 1 | 2 | 3;
6920
+ };
6921
+ /**
6922
+ * Turn a request body into a command, or say why it is not one.
6923
+ *
6924
+ * Pure, so the rules can be asserted without a robot, a database or a session.
6925
+ *
6926
+ * The rule worth stating: options and shape fields are REFUSED on the commands
6927
+ * that do not use them, rather than ignored. A caller that sends a spot polygon
6928
+ * with `kind: "area"` has misunderstood something, and silently dropping the
6929
+ * polygon would send the robot to clean the wrong thing while reporting success.
6930
+ */
6931
+ declare function parseRobotCommand(body: unknown): {
6932
+ ok: true;
6933
+ command: TRobotCommand;
6934
+ } | {
6935
+ ok: false;
6936
+ message: string;
6937
+ };
6938
+
6939
+ /**
6940
+ * The live pose stream: the parts worth testing.
6941
+ *
6942
+ * `/portal/robots/tracking` is Server-Sent Events, one long-lived connection per
6943
+ * robot. Everything fiddly about that - reassembling events split across TCP
6944
+ * chunks, deciding when silence means the robot is gone rather than parked, and
6945
+ * backing off a reconnect without stampeding the cloud - is pure and lives here.
6946
+ * The socket itself is the supervisor's job.
6947
+ *
6948
+ * The stream carries `{status, x, y, theta}` and NOTHING else: no floor, no
6949
+ * battery, no heartbeat, no command id. Those are asked of the vendor; until they
6950
+ * arrive this module is careful to report what it does not know rather than
6951
+ * guess.
6952
+ */
6953
+ /** One decoded `data:` payload. */
6954
+ type TSseEvent = {
6955
+ data: string;
6956
+ };
6957
+ /**
6958
+ * An incremental SSE parser.
6959
+ *
6960
+ * Two things make this worth its own function rather than a `split("\n")` at the
6961
+ * call site:
6962
+ *
6963
+ * 1. **Chunks do not respect event boundaries.** A TCP read can end mid-JSON.
6964
+ * Splitting each chunk on its own silently drops or corrupts the event that
6965
+ * straddles the boundary - and at 5 Hz that is a robot that jumps.
6966
+ * 2. **Comment lines are the keep-alive.** A line beginning `:` is not an
6967
+ * event, but it IS proof the connection is alive. The watchdog must see it,
6968
+ * so `push` reports whether anything at all arrived, separately from the
6969
+ * events it decoded.
6970
+ */
6971
+ declare function createSseParser(): {
6972
+ push: (chunk: string) => {
6973
+ events: TSseEvent[];
6974
+ sawActivity: boolean;
6975
+ };
6976
+ reset: () => void;
6977
+ };
6978
+ type TRobotPose = {
6979
+ x: number;
6980
+ y: number;
6981
+ /** Radians. */
6982
+ theta: number;
6983
+ statusFlag: number;
6984
+ mode: TRobotMode;
6985
+ };
6986
+ /**
6987
+ * Decode one `data:` payload into a pose, or `null` if it is not one.
6988
+ *
6989
+ * Returns null rather than throwing: a stream is not a request. One malformed
6990
+ * frame - a truncated write, a future field we do not understand - must not tear
6991
+ * down a connection that is otherwise delivering good poses. The caller counts
6992
+ * nulls and reports them; it does not reconnect on them.
6993
+ *
6994
+ * A frame missing x, y, theta or status is rejected whole. A partial pose is
6995
+ * worse than none: it would place a robot at (0,0), which on these maps is a real
6996
+ * location.
6997
+ */
6998
+ declare function decodeTrackingFrame(data: string): TRobotPose | null;
6999
+ /**
7000
+ * How long silence may last before the robot is treated as lost.
7001
+ *
7002
+ * The stream has no documented heartbeat, so this is the ONLY thing standing
7003
+ * between "the network died" and "the robot is parked" - which look identical on
7004
+ * the wire. 15 s is long enough to ride out a hiccup at the stream's ~5 Hz and
7005
+ * short enough that a dispatcher is not offered a robot that left ten minutes
7006
+ * ago.
7007
+ */
7008
+ declare const TRACKING_IDLE_TIMEOUT_MS = 15000;
7009
+ /**
7010
+ * A stale stream is UNAVAILABLE, not the last mode we saw.
7011
+ *
7012
+ * This is the branch that matters. Holding the last known mode means a robot
7013
+ * whose connection died while IDLE stays "idle, ready for work" forever, and the
7014
+ * dispatcher keeps handing it jobs that nothing is listening for.
7015
+ */
7016
+ declare function isTrackingStale(lastActivityAt: number, now: number, idleMs?: number): boolean;
7017
+ declare const TRACKING_BACKOFF_BASE_MS = 1000;
7018
+ declare const TRACKING_BACKOFF_CAP_MS = 60000;
7019
+ /**
7020
+ * Exponential backoff with full jitter, capped.
7021
+ *
7022
+ * The jitter is not decoration. Every robot on a site streams from the same
7023
+ * cloud, so a cloud restart drops them all at the same instant; without jitter
7024
+ * they would all retry at the same instant too, repeatedly, and we would be the
7025
+ * reason it struggles to come back up.
7026
+ *
7027
+ * `random` is injectable so the spread is testable rather than hoped for.
7028
+ */
7029
+ declare function trackingBackoffMs(attempt: number, random?: () => number, baseMs?: number, capMs?: number): number;
7030
+ /**
7031
+ * What the fleet view shows for one robot.
7032
+ *
7033
+ * `floorNo` is nullable and `floorKnown` says whether it is real, because the
7034
+ * stream does not carry it. Anything that dispatches to a floor must check
7035
+ * `floorKnown` - the alternative is a module that quietly assumes the ground
7036
+ * floor and sends a robot to clean the wrong storey.
7037
+ */
7038
+ type TRobotLiveState = {
7039
+ robotSn: string;
7040
+ pose: TRobotPose | null;
7041
+ /** Epoch ms of the last byte received on this robot's stream. */
7042
+ lastActivityAt: number;
7043
+ connected: boolean;
7044
+ floorNo: number | null;
7045
+ floorKnown: boolean;
7046
+ };
7047
+ /** The state a robot starts in and returns to when its stream dies. */
7048
+ declare function disconnectedState(robotSn: string, at: number): TRobotLiveState;
7049
+ /**
7050
+ * Fold one decoded frame into a robot's live state.
7051
+ *
7052
+ * `floorNo` is carried forward untouched - it comes from elsewhere (a dispatch,
7053
+ * or the vendor adding it to the stream) and a pose update is not evidence about
7054
+ * the floor.
7055
+ */
7056
+ declare function applyTrackingFrame(previous: TRobotLiveState, pose: TRobotPose, at: number): TRobotLiveState;
7057
+ /**
7058
+ * The view a dispatcher sees. A robot is only offered work when its stream is
7059
+ * live AND its own status says it is free.
7060
+ */
7061
+ declare function isAvailableForWork(state: TRobotLiveState, now: number): boolean;
7062
+
7063
+ /**
7064
+ * Which robot types each application may SET UP, and which it may MONITOR.
7065
+ *
7066
+ * iService365 is the fleet manager for every robot on a property, not for one
7067
+ * device class - so the same `robot-mgmt` module serves cleaning robots and
7068
+ * security robots, and the APP decides which of them a user is looking at. The
7069
+ * shape follows `bulletin-service-apps.util.ts`: a declared table plus pure
7070
+ * lookups, so "which app sees what" can be asserted without a database, a
7071
+ * session or a robot.
7072
+ *
7073
+ * The rule the owner set (2026-09-22):
7074
+ *
7075
+ * - a CLEANING robot is set up in the cleaning applications;
7076
+ * - a SECURITY robot is set up in the security applications;
7077
+ * - PROPERTY MANAGEMENT sets up and monitors BOTH, because the property is
7078
+ * what the robots belong to;
7079
+ * - the SEVEN365 CONSOLE does everything, across every property, because
7080
+ * Seven365 supplies the solution;
7081
+ * - the MANAGING AGENT watches, and does not configure.
7082
+ *
7083
+ * `setup` and `monitor` are separate because they are separate jobs. A managing
7084
+ * agent must see every robot on their estate without being able to re-point one
7085
+ * at a different cloud, and a cleaner must never be shown a security patrol's
7086
+ * position.
7087
+ *
7088
+ * ## This table is NOT a security boundary - read this before relying on it
7089
+ *
7090
+ * `appSlug` arrives as a request parameter, the same way `notification.controller`
7091
+ * takes it. It is CLIENT-SUPPLIED, so a caller can claim to be any app. This
7092
+ * table therefore decides what each app SHOWS, not what a user is entitled to.
7093
+ *
7094
+ * The actual boundary is, and stays, session-derived: `requireSiteReach` for the
7095
+ * estate, the `robot-mgmt` module gate for the site, and the permission
7096
+ * (`see-all-robots`, `add-robot`, ...) for the action. A cleaner is kept away
7097
+ * from security patrols by NOT HOLDING the permission - never by this table
7098
+ * alone.
7099
+ *
7100
+ * ponytail: client-declared scope. If robot types ever need to be a real
7101
+ * boundary, the upgrade is to carry the app identity in the session at login
7102
+ * rather than to harden anything here.
7103
+ */
7104
+ type TRobotAppScope = {
7105
+ /** Robot types this app may register and edit. */
7106
+ setup: readonly TRobotType[];
7107
+ /** Robot types this app may list, track and dispatch. */
7108
+ monitor: readonly TRobotType[];
7109
+ };
7110
+ /**
7111
+ * Keyed by app slug, matching `APP_SLUG` in each mobile app's `app.config.ts`
7112
+ * and the web apps' deployment names.
7113
+ */
7114
+ declare const ROBOT_APP_SCOPES: Readonly<Record<string, TRobotAppScope>>;
7115
+ /**
7116
+ * What this app may do with robots.
7117
+ *
7118
+ * Fails CLOSED: an app slug nobody has declared - a new service app, a typo in
7119
+ * a deployment variable, a caller that sent no slug - gets no robots rather
7120
+ * than all of them. The alternative is a landscaping app quietly listing a
7121
+ * building's security patrols the first time someone renames a deployment.
7122
+ */
7123
+ declare function robotScopeForApp(appSlug: unknown): TRobotAppScope;
7124
+ /** May this app register a robot of this type? */
7125
+ declare function canSetUpRobotType(appSlug: unknown, type: unknown): type is TRobotType;
7126
+ /** May this app see a robot of this type? */
7127
+ declare function canMonitorRobotType(appSlug: unknown, type: unknown): boolean;
7128
+ /**
7129
+ * The types to filter a listing by, for an app that asked for `requested`.
7130
+ *
7131
+ * - asked for nothing -> everything the app may monitor
7132
+ * - asked for a type it may monitor -> that type
7133
+ * - asked for a type it may NOT monitor -> `[]`
7134
+ *
7135
+ * The empty array is the important case, and it is deliberately not the same as
7136
+ * "no filter". A caller must treat `[]` as "list nothing" - reading it as "no
7137
+ * constraint" turns a refusal into a listing of every robot on the estate,
7138
+ * which is exactly the bug this function exists to make impossible.
7139
+ */
7140
+ declare function robotTypesVisibleTo(appSlug: unknown, requested?: unknown): TRobotType[];
7141
+
7142
+ /**
7143
+ * Who may do what with a robot.
7144
+ *
7145
+ * The five permissions already exist in the client catalogue
7146
+ * (`layer-common/constants/permissions.ts`) and the Security app already gates
7147
+ * its menu on them. Nothing on the SERVER has ever enforced them: the two robot
7148
+ * routes carry `requireAuth` plus the estate check, so anybody who can reach an
7149
+ * estate can register a robot into it. This is the missing half, and it is
7150
+ * deliberately pure so web and server can be asserted to agree.
7151
+ *
7152
+ * ## The three rules, in the order they are applied
7153
+ *
7154
+ * 1. **`"*"` allows everything.** 85 client roles hold it; it is the platform's
7155
+ * established wildcard and short-circuits before anything else.
7156
+ *
7157
+ * 2. **An EMPTY list on a platform-admin role allows everything.**
7158
+ * `createDefaultUser()` seeds Seven365's own staff role with
7159
+ * `permissions: []`, not `["*"]`. Enforcing an empty list would refuse the
7160
+ * platform owner - and the owner's requirement is the opposite: the Seven365
7161
+ * Super Admin must be able to do everything, on every property. So an empty
7162
+ * list on a `type: "admin"` role means "not yet restricted", exactly as it
7163
+ * does for the console catalogue. The gate stays a no-op for those roles
7164
+ * until somebody ticks a module, which is what lets it ship with no role
7165
+ * write and no lockout.
7166
+ *
7167
+ * 3. **A non-empty list is enforced**, by exact `module:permission` string.
7168
+ *
7169
+ * Anything else is refused. An empty list on a CLIENT role is not "everything"
7170
+ * - rule 2 is scoped to `type: "admin"` on purpose, because widening it would
7171
+ * hand every unconfigured client role the whole module.
7172
+ *
7173
+ * This mirrors `useLocalPermission.ts` in the web apps deliberately. If the two
7174
+ * ever disagree, a button appears that the server then refuses - the parity
7175
+ * failure the project's rules exist to prevent.
7176
+ */
7177
+ /** The module these permissions hang off. Matches `module-gate.util.ts`. */
7178
+ declare const ROBOT_MODULE = "robot-mgmt";
7179
+ /**
7180
+ * The five permission strings, in `module:permission` form - the same shape as
7181
+ * `sites:manage-site-modules`.
7182
+ */
7183
+ declare const ROBOT_PERMISSIONS: {
7184
+ readonly seeAll: "robot-mgmt:see-all-robots";
7185
+ readonly add: "robot-mgmt:add-robot";
7186
+ readonly update: "robot-mgmt:update-robot";
7187
+ readonly seeDetails: "robot-mgmt:see-robot-details";
7188
+ readonly delete: "robot-mgmt:delete-robot";
7189
+ };
7190
+ type TRobotAction = keyof typeof ROBOT_PERMISSIONS;
7191
+ /** What the decision needs to know about the caller's role. */
7192
+ type TRobotPermissionActor = {
7193
+ /** The role's permission strings, as `getUserPermissions` returns them. */
7194
+ permissions?: readonly unknown[] | null;
7195
+ /** The role document's `type`. Only `"admin"` unlocks rule 2. */
7196
+ roleType?: string | null;
7197
+ };
7198
+ /**
7199
+ * May this caller take this action on a robot?
7200
+ *
7201
+ * Fails closed on anything it does not understand: no actor, a permissions
7202
+ * value that is not an array, an action that is not one of the five. A caller
7203
+ * that cannot be understood is not a caller that is allowed.
7204
+ */
7205
+ declare function allowsRobotAction(actor: TRobotPermissionActor | null | undefined, action: TRobotAction): boolean;
7206
+ /**
7207
+ * The action a listing needs. Split out because every read path asks for the
7208
+ * same one, and spelling it at each call site is how they drift apart.
7209
+ */
7210
+ declare function allowsRobotListing(actor: TRobotPermissionActor | null | undefined): boolean;
7211
+ /**
7212
+ * Every robot action this caller may take.
7213
+ *
7214
+ * The apps use it to decide which buttons to render, so the server answers the
7215
+ * question the UI is about to ask rather than the UI guessing and being refused
7216
+ * later.
7217
+ */
7218
+ declare function robotActionsFor(actor: TRobotPermissionActor | null | undefined): TRobotAction[];
7219
+
7220
+ /**
7221
+ * The lift contract, shaped after Open-RMF's `rmf_lift_msgs`.
7222
+ *
7223
+ * iService365 sits between the robots and the lift: the robot never addresses
7224
+ * the lift, and the lift never hears from a robot. This file is the vocabulary
7225
+ * the middle speaks, and it is deliberately NOT Inovance-shaped.
7226
+ *
7227
+ * ## Why RMF's shape, when we are not using RMF
7228
+ *
7229
+ * Open-RMF (open-rmf.org, github.com/open-rmf) is a coordination layer, not a
7230
+ * capability layer: it assumes robots can already navigate and lifts already
7231
+ * accept commands, so adopting it would close none of our gaps. It is deferred
7232
+ * until a third-party fleet shares one of our buildings.
7233
+ *
7234
+ * But its lift contract is the most widely-implemented description of "a robot
7235
+ * is using a lift" that exists, and it costs nothing to match it. The field
7236
+ * names and enum values below are taken from `rmf_lift_msgs/LiftState.msg` and
7237
+ * `LiftRequest.msg` verbatim, so that if we ever do adopt RMF, the adapter is a
7238
+ * rename rather than a redesign - and in the meantime we get a vocabulary that
7239
+ * has already survived contact with real lifts.
7240
+ *
7241
+ * Taken from RMF as-is, because each one encodes a real state we would
7242
+ * otherwise have discovered the hard way:
7243
+ *
7244
+ * - `DOOR_MOVING` is separate from open and closed. A door that is closing is
7245
+ * not a door that is open, and a robot must not be told to enter during it.
7246
+ * - `motion_state` has an explicit `UNKNOWN`, because a lift that has not
7247
+ * reported is not a lift that is stopped.
7248
+ * - `current_mode` carries read-only modes we can never set - `FIRE`,
7249
+ * `EMERGENCY`, `OFFLINE`. A lift in fire mode is not available, and no
7250
+ * amount of asking will change that.
7251
+ * - a session id: one party holds the lift at a time, which is the same
7252
+ * one-robot-per-trip rule we settled on independently.
7253
+ *
7254
+ * ## What this file is not
7255
+ *
7256
+ * It holds no Modbus, no register numbers and no Inovance specifics. The
7257
+ * MCTC-KZ-B0S open-protocol register map has not been supplied by Inovance - it
7258
+ * is NOT in the board manual we hold, which documents the ports, the function
7259
+ * codes and the open-MASTER frame configuration, and never says which register
7260
+ * carries the floor or registers a call. Any register number written before that
7261
+ * document arrives would be a guess, and this is a passenger lift.
7262
+ *
7263
+ * So the driver is a separate, later file behind `TLiftDriver`. Everything here
7264
+ * can be built, tested and reviewed today, and the simulator below means the
7265
+ * queue and session logic is exercised long before a real car is involved.
7266
+ */
7267
+ declare const LIFT_DOOR: {
7268
+ readonly CLOSED: 0;
7269
+ readonly MOVING: 1;
7270
+ readonly OPEN: 2;
7271
+ };
7272
+ type TLiftDoorState = (typeof LIFT_DOOR)[keyof typeof LIFT_DOOR];
7273
+ declare const LIFT_MOTION: {
7274
+ readonly STOPPED: 0;
7275
+ readonly UP: 1;
7276
+ readonly DOWN: 2;
7277
+ readonly UNKNOWN: 3;
7278
+ };
7279
+ type TLiftMotionState = (typeof LIFT_MOTION)[keyof typeof LIFT_MOTION];
7280
+ declare const LIFT_MODE: {
7281
+ readonly UNKNOWN: 0;
7282
+ readonly HUMAN: 1;
7283
+ readonly AGV: 2;
7284
+ readonly FIRE: 3;
7285
+ readonly OFFLINE: 4;
7286
+ readonly EMERGENCY: 5;
7287
+ };
7288
+ type TLiftMode = (typeof LIFT_MODE)[keyof typeof LIFT_MODE];
7289
+ type TLiftState = {
7290
+ liftName: string;
7291
+ /** When this reading was taken. Epoch ms. */
7292
+ liftTime: number;
7293
+ /** Floor names, as the building calls them - "L1", "B2", not indices. */
7294
+ availableFloors: string[];
7295
+ currentFloor: string;
7296
+ destinationFloor: string;
7297
+ doorState: TLiftDoorState;
7298
+ motionState: TLiftMotionState;
7299
+ currentMode: TLiftMode;
7300
+ /** Who currently holds the lift, or "" when nobody does. */
7301
+ sessionId: string;
7302
+ };
7303
+ declare const LIFT_REQUEST: {
7304
+ readonly END_SESSION: 0;
7305
+ readonly AGV_MODE: 1;
7306
+ readonly HUMAN_MODE: 2;
7307
+ };
7308
+ type TLiftRequestType = (typeof LIFT_REQUEST)[keyof typeof LIFT_REQUEST];
7309
+ type TLiftRequest = {
7310
+ liftName: string;
7311
+ /** Unique per requester. Ours is the journey id. */
7312
+ sessionId: string;
7313
+ requestType: TLiftRequestType;
7314
+ destinationFloor: string;
7315
+ /**
7316
+ * Only meaningful in HUMAN mode. In AGV mode RMF assumes the doors are held
7317
+ * open while the car is stopped; a passenger lift times its doors out, so the
7318
+ * hold has to be refreshed - which is why this is carried even for AGV.
7319
+ */
7320
+ doorState: TLiftDoorState;
7321
+ };
7322
+ /**
7323
+ * What a lift driver must be able to do.
7324
+ *
7325
+ * One implementation exists today - the simulator. The Inovance driver is
7326
+ * blocked on the register map, and putting it behind this interface means the
7327
+ * queue, the session machine and the console can all be finished and tested
7328
+ * first.
7329
+ */
7330
+ type TLiftDriver = {
7331
+ name: string;
7332
+ /** Current state, or null when the lift has never reported. */
7333
+ read(): Promise<TLiftState | null>;
7334
+ /** Ask for the lift. Resolves when the request is accepted, not completed. */
7335
+ request(request: TLiftRequest): Promise<void>;
7336
+ /**
7337
+ * Refresh the hold. MUST be called more often than the lift's door dwell
7338
+ * timeout or the doors close on a robot that is still moving.
7339
+ */
7340
+ refresh(sessionId: string): Promise<void>;
7341
+ /** Give the lift back. Must be safe to call twice. */
7342
+ release(sessionId: string): Promise<void>;
7343
+ };
7344
+ /**
7345
+ * Is this lift usable by a robot at all?
7346
+ *
7347
+ * Fails closed on every mode we cannot set, and on a lift that has not reported.
7348
+ * `FIRE` and `EMERGENCY` are the ones that matter: during an evacuation the lift
7349
+ * belongs to the fire service, and a robot must never be queued for it.
7350
+ */
7351
+ declare function isLiftAvailable(state: TLiftState | null): boolean;
7352
+ /**
7353
+ * May a robot be told to enter or leave the car right now?
7354
+ *
7355
+ * Three conditions, all required: the car is at the floor we want, it is not
7356
+ * moving, and the doors are fully OPEN. `DOOR_MOVING` is not open - telling a
7357
+ * robot to cross a closing door plane is how a robot gets struck.
7358
+ */
7359
+ declare function isSafeToCross(state: TLiftState | null, floor: string): boolean;
7360
+ /**
7361
+ * Does this session hold the lift?
7362
+ *
7363
+ * An empty `sessionId` means nobody holds it, so it must never match an empty
7364
+ * request id - otherwise a caller that forgot to set one would be handed a lift
7365
+ * somebody else is riding.
7366
+ */
7367
+ declare function holdsLift(state: TLiftState | null, sessionId: string): boolean;
7368
+ /** A floor the lift itself says it does not serve is not a destination. */
7369
+ declare function servesFloor(state: TLiftState | null, floor: string): boolean;
7370
+ /**
7371
+ * A lift that behaves like a lift, in memory.
7372
+ *
7373
+ * It exists so the queue, the session state machine and the console can be
7374
+ * built and tested now, with no register map, no bench rig and no risk to a
7375
+ * passenger lift. `tick(ms)` advances it, so a test drives time explicitly
7376
+ * rather than sleeping.
7377
+ *
7378
+ * ponytail: one floor per tick interval, no acceleration curve, no load cell.
7379
+ * The point is the state sequence, not the physics - model those when there is a
7380
+ * real lift to measure against.
7381
+ */
7382
+ declare function createLiftSimulator(options: {
7383
+ name: string;
7384
+ floors: string[];
7385
+ startFloor?: string;
7386
+ /** Milliseconds per floor travelled. */
7387
+ msPerFloor?: number;
7388
+ /** How long the doors stay open before closing themselves. */
7389
+ doorDwellMs?: number;
7390
+ }): TLiftDriver & {
7391
+ tick: (ms: number) => void;
7392
+ state: TLiftState;
7393
+ };
7394
+
7395
+ /**
7396
+ * The cleaning-robot cloud's HTTP API.
7397
+ *
7398
+ * Nine request/response endpoints, signed per "Robot Cloud API Document
7399
+ * (2025.05.27)". The signature, the status vocabulary and the coordinate
7400
+ * conversions live in `../utils/robot-cloud.util` and are pure; this file is only
7401
+ * the transport.
7402
+ *
7403
+ * ## Two rules this file is built around
7404
+ *
7405
+ * **1. Credentials are arguments, never configuration.** `appid` and `secret`
7406
+ * are passed in by the caller, which reads them from the robot's own record. They
7407
+ * are never read from `process.env` here, never logged, and never placed in a
7408
+ * request body - the secret's only appearance is inside the SHA-1 hash. A stack
7409
+ * trace or a debug log from this file cannot disclose them.
7410
+ *
7411
+ * **2. Nothing retries.** A cleaning command that times out may still have been
7412
+ * accepted; the robot cloud gives us no `commandId` to check against, so a retry
7413
+ * risks a second job on the same robot with no way to tell the two apart. Every
7414
+ * call here fails once and reports it. Retrying is the caller's decision to make
7415
+ * with a human in the loop.
7416
+ *
7417
+ * The live pose stream (`/portal/robots/tracking`, Server-Sent Events) is
7418
+ * deliberately NOT here. It is a long-lived connection needing reconnection,
7419
+ * re-signing and an idle watchdog - a lifecycle, not a request - and it gets its
7420
+ * own supervisor.
7421
+ */
7422
+
7423
+ type TRobotCloudCredentials = {
7424
+ /** The cloud-provided app id. */
7425
+ appid: string;
7426
+ /** The cloud-provided secret. Hashed, never transmitted. */
7427
+ secret: string;
7428
+ };
7429
+ /** Every response carries `ok`; only the robot list omits it. */
7430
+ type TRobotCloudReply<T> = {
7431
+ ok?: boolean;
7432
+ msg?: string | null;
7433
+ } & T;
7434
+ type TCloudRobot = {
7435
+ robotSn: string;
7436
+ robotName?: string;
7437
+ ownerName?: string;
7438
+ ownerPhone?: string;
7439
+ statusFlag?: number;
7440
+ statusName?: string;
7441
+ onlineFlag?: boolean;
7442
+ };
7443
+ type TCloudArea = {
7444
+ areaName: string;
7445
+ /** 8 hex digits, RGBA. Note `plans` uses an object for the same thing. */
7446
+ rgba: string;
7447
+ x: number;
7448
+ y: number;
7449
+ };
7450
+ type TCloudMap = {
7451
+ floorNo: number;
7452
+ mapName: string;
7453
+ backgroundFileKey: string;
7454
+ partitionFileKey: string;
7455
+ originX: number;
7456
+ originY: number;
7457
+ /** Metres per pixel. */
7458
+ resolution: number;
7459
+ totalArea: number;
7460
+ baseX: number;
7461
+ baseY: number;
7462
+ /** Radians. */
7463
+ baseTheta: number;
7464
+ createTime: string;
7465
+ areaList?: TCloudArea[];
7466
+ };
7467
+ type TCloudFile = {
7468
+ fileKey: string;
7469
+ url: string;
7470
+ };
7471
+ /** 1 vacuum, 2 washing the floor, 3 dry dust mop. */
7472
+ type TCleanMode = 1 | 2 | 3;
7473
+ /** 0 no vacuum while washing, 1 also vacuum while washing. */
7474
+ type TCleanSubMode = 0 | 1;
7475
+ /** 1 standard, 2 strong, 3 silent. */
7476
+ type TCleanLevel = 1 | 2 | 3;
7477
+ type TCleanOptions = {
7478
+ /** 0 = forever, 1-99. */
7479
+ cleanTimes: number;
7480
+ modeFlag: TCleanMode;
7481
+ subModeFlag: TCleanSubMode;
7482
+ levelFlag: TCleanLevel;
7483
+ };
7484
+ type TCloudPlanJob = {
7485
+ floorNo: number;
7486
+ /** 1 full map, 2 spot, 3 area. See `PLAN_RANGE`. */
7487
+ rangeFlag: number;
7488
+ cleanTimes: number;
7489
+ pointList?: Array<{
7490
+ x: number;
7491
+ y: number;
7492
+ }>;
7493
+ /** Areas as colour OBJECTS here - the map endpoint returns hex strings. */
7494
+ colorList?: TAreaColour[];
7495
+ modeFlag: number;
7496
+ subModeFlag: number;
7497
+ levelFlag: number;
7498
+ };
7499
+ type TCloudPlan = {
7500
+ planId?: number;
7501
+ /** 1-7 = Monday-Sunday. */
7502
+ dateList: number[];
7503
+ /** `HH:MM`. */
7504
+ startTime: string;
7505
+ endTime: string;
7506
+ enableFlag: boolean;
7507
+ jobList: TCloudPlanJob[];
7508
+ };
7509
+ /**
7510
+ * A refusal from the cloud, or a failure to reach it.
7511
+ *
7512
+ * `ok: false` with a `msg` is a refusal by the robot cloud and is reported as
7513
+ * given - the message is written for an operator ("robot is offline"), so it is
7514
+ * worth surfacing rather than flattening into "request failed".
7515
+ */
7516
+ declare class RobotCloudError extends Error {
7517
+ readonly path: string;
7518
+ readonly statusCode?: number;
7519
+ /** True when the cloud answered and said no, rather than not answering. */
7520
+ readonly refused: boolean;
7521
+ constructor(path: string, message: string, opts?: {
7522
+ statusCode?: number;
7523
+ refused?: boolean;
7524
+ });
7525
+ }
7526
+ declare function useRobotCloudService(credentials: TRobotCloudCredentials, options?: {
7527
+ baseUrl?: string;
7528
+ timeoutMs?: number;
7529
+ }): {
7530
+ getRobots: () => Promise<TCloudRobot[]>;
7531
+ getMaps: (robotSn: string) => Promise<TCloudMap[]>;
7532
+ getFileUrls: (robotSn: string, fileKeys: string[]) => Promise<TCloudFile[]>;
7533
+ getPlans: (robotSn: string) => Promise<TCloudPlan[]>;
7534
+ startFullCleaning: (robotSn: string, opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7535
+ startAreaCleaning: (robotSn: string, areaList: string[], opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7536
+ startSpotCleaning: (robotSn: string, pointList: Array<{
7537
+ x: number;
7538
+ y: number;
7539
+ }>, opts: TCleanOptions) => Promise<TRobotCloudReply<Record<string, never>>>;
7540
+ returnToBase: (robotSn: string) => Promise<TRobotCloudReply<Record<string, never>>>;
7541
+ savePlans: (robotSn: string, planList: TCloudPlan[]) => Promise<number[]>;
7542
+ };
7543
+
7544
+ /**
7545
+ * The bridge between a robot ROW and the robot CLOUD.
7546
+ *
7547
+ * A registered robot is a document holding a nickname and a credential pair.
7548
+ * Everything a user actually wants - where it is, what it is doing, its floors,
7549
+ * sending it to clean - lives in the vendor's cloud and is addressed by
7550
+ * `robotSn`. This is the only place those two halves meet.
7551
+ *
7552
+ * ## Why `robotSn` gets discovered rather than required
7553
+ *
7554
+ * The Add Robot form collects a nickname, an app key and an app token. It has
7555
+ * never asked for a serial. But every per-robot cloud endpoint takes one, so a
7556
+ * robot registered through that form cannot be reached at all.
7557
+ *
7558
+ * Rather than change the form (and every robot already registered through it),
7559
+ * a robot with no `robotSn` gets one from `get-robot-list` - which takes no
7560
+ * parameters and returns everything the credential can see. If that is exactly
7561
+ * one robot, the credential is per-robot and the answer is unambiguous. If it is
7562
+ * several, we cannot guess which, and say so instead of picking one: binding a
7563
+ * nickname to the wrong serial would send one building's cleaning command to
7564
+ * another building's robot.
7565
+ *
7566
+ * ponytail: discovery, not a form change, because the vendor has not yet said
7567
+ * whether a credential is issued per robot or per account (question 2 on the
7568
+ * vendor sheet). When they answer, this either stays as it is or becomes a
7569
+ * picker in the UI.
7570
+ */
7571
+ type TFleetRobot = {
7572
+ id: string;
7573
+ name: string;
7574
+ robotSn: string;
7575
+ /** The vendor's raw status code, kept so support can quote it. */
7576
+ statusFlag: number | null;
7577
+ /** The vendor's own label for that code. */
7578
+ statusName: string;
7579
+ /** Our normalised vocabulary - this is what screens should show. */
7580
+ mode: TRobotMode;
7581
+ online: boolean;
7582
+ dispatchable: boolean;
7583
+ };
7584
+ /** What the service needs from a robot row. */
7585
+ type TStoredRobot = TRobot & {
7586
+ _id?: unknown;
7587
+ };
7588
+ declare function useRobotFleetService(deps?: {
7589
+ /** Injected so the whole service runs in a test with no network. */
7590
+ cloudFor?: typeof useRobotCloudService;
7591
+ /** Persists a discovered serial. Omitted in tests. */
7592
+ saveRobotSn?: (robotId: string, robotSn: string) => Promise<unknown>;
7593
+ }): {
7594
+ resolveRobotSn: (robot: TStoredRobot) => Promise<string>;
7595
+ getFleetRobot: (robot: TStoredRobot) => Promise<TFleetRobot>;
7596
+ getMaps: (robot: TStoredRobot) => Promise<TCloudMap[]>;
7597
+ getMapImages: (robot: TStoredRobot, fileKeys: string[]) => Promise<TCloudFile[]>;
7598
+ dispatch: (robot: TStoredRobot, command: {
7599
+ kind: "full";
7600
+ options: TCleanOptions;
7601
+ } | {
7602
+ kind: "area";
7603
+ areas: string[];
7604
+ options: TCleanOptions;
7605
+ } | {
7606
+ kind: "spot";
7607
+ points: Array<{
7608
+ x: number;
7609
+ y: number;
7610
+ }>;
7611
+ options: TCleanOptions;
7612
+ } | {
7613
+ kind: "return";
7614
+ }) => Promise<TRobotCloudReply<Record<string, never>>>;
7615
+ getPlans: (robot: TStoredRobot) => Promise<TCloudPlan[]>;
7616
+ };
7617
+
7618
+ /**
7619
+ * The fleet endpoints: everything about a robot that lives in the vendor cloud.
7620
+ *
7621
+ * The existing robot controller manages the RECORD - register a robot, list the
7622
+ * robots at a site. This one manages the ROBOT: where it is, what floors it
7623
+ * knows, and sending it to clean. `robot-fleet.service.ts` does the talking;
7624
+ * this decides who is allowed to ask.
7625
+ *
7626
+ * ## Three rules every handler here follows
7627
+ *
7628
+ * **1. The estate decides, and it comes from the stored robot.** A robot names
7629
+ * its estate in `metadata.siteId`. Every handler loads the robot first and
7630
+ * checks THAT site against the caller's session, never a site named in the
7631
+ * request - otherwise a caller could reach another client's robot by quoting its
7632
+ * id. A robot the caller cannot reach answers exactly as one that does not
7633
+ * exist, so robot ids cannot be enumerated.
7634
+ *
7635
+ * **2. Credentials never leave this process.** `getRobotById` returns the row
7636
+ * WITH `appKey`/`appToken` because the connector needs them to sign. No handler
7637
+ * here puts a robot row into a response; each returns only the fleet data.
7638
+ *
7639
+ * **3. The app narrows what it may see.** A cleaning app must not drive a
7640
+ * security patrol. `appSlug` is client-supplied so this is a visibility rule
7641
+ * rather than a boundary - the boundary is rule 1 plus the permission gate on
7642
+ * the route - but it is applied consistently so an app cannot address a robot
7643
+ * class it does not present.
7644
+ */
7645
+ declare function useRobotFleetController(deps?: {
7646
+ fleet?: ReturnType<typeof useRobotFleetService>;
7647
+ }): {
7648
+ getState: (req: Request, res: Response, next: NextFunction) => Promise<void>;
7649
+ getMaps: (req: Request, res: Response, next: NextFunction) => Promise<void>;
7650
+ getMapImages: (req: Request, res: Response, next: NextFunction) => Promise<void>;
7651
+ getPlans: (req: Request, res: Response, next: NextFunction) => Promise<void>;
7652
+ sendCommand: (req: Request, res: Response, next: NextFunction) => Promise<void>;
7653
+ };
7654
+
6706
7655
  type TPatrolQuestion = {
6707
7656
  _id?: ObjectId;
6708
7657
  site: string | ObjectId;
@@ -15470,4 +16419,4 @@ declare function usePersonalEmergencyChainController(): {
15470
16419
  update: (req: Request, res: Response, next: NextFunction) => Promise<void>;
15471
16420
  };
15472
16421
 
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 };
16422
+ 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, LIFT_DOOR, LIFT_MODE, LIFT_MOTION, LIFT_REQUEST, 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, TCleanOptionValues, 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, TLiftDoorState, TLiftDriver, TLiftMode, TLiftMotionState, TLiftRequest, TLiftRequestType, TLiftState, 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, TRobotCommand, 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, createLiftSimulator, 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, holdsLift, holdsRole, incidentReport, incidentReportLog, incidents_namespace_collection, invitationOffersRole, isAvailableForWork, isCameraEntitled, isDispatchable, isDuplicateMemberError, isDuplicateVersionError, isLiftAvailable, isLikelySelfServiceEmail, isLiveVehicleStatus, isPatrolCctvCamera, isPlatformOwner, isPromoCodeExpired, isRelayPlayerUrl, isSafeRelativePath, isSafeToCross, 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, parseRobotCommand, 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, servesFloor, 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, useRobotFleetController, 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 };