@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/CHANGELOG.md +67 -0
- package/dist/index.d.ts +953 -4
- package/dist/index.js +5799 -4728
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5309 -4288
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/test/e2e/robot-scope.e2e.test.mjs +57 -33
- package/test/lift-contract.test.mjs +271 -0
- package/test/robot-apps.test.mjs +154 -0
- package/test/robot-cloud.test.mjs +222 -0
- package/test/robot-command.test.mjs +140 -0
- package/test/robot-permission.test.mjs +133 -0
- package/test/robot-tracking.test.mjs +231 -0
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 };
|