@7365admin1/core 3.133.0 → 3.134.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -323,6 +323,7 @@ __export(src_exports, {
323
323
  ROBOT_TYPES: () => ROBOT_TYPES,
324
324
  RobotCloudError: () => RobotCloudError,
325
325
  RobotCredentialsError: () => RobotCredentialsError,
326
+ SECRET_SETTING: () => SECRET_SETTING,
326
327
  SELF_SERVICE_RESEND_COOLDOWN_MS: () => SELF_SERVICE_RESEND_COOLDOWN_MS,
327
328
  SELF_SIGNUP_PLATFORM: () => SELF_SIGNUP_PLATFORM,
328
329
  SELF_SIGNUP_STATUS: () => SELF_SIGNUP_STATUS,
@@ -619,18 +620,26 @@ __export(src_exports, {
619
620
  orgRoleSets: () => orgRoleSets,
620
621
  orgSchema: () => orgSchema,
621
622
  ounitechAlertRecord: () => ounitechAlertRecord,
623
+ ounitechAppAction: () => ounitechAppAction,
622
624
  ounitechCleaning: () => ounitechCleaning,
623
625
  ounitechConsumable: () => ounitechConsumable,
624
626
  ounitechCurrentMap: () => ounitechCurrentMap,
625
627
  ounitechFault: () => ounitechFault,
628
+ ounitechFloorMapHistory: () => ounitechFloorMapHistory,
626
629
  ounitechJobWords: () => ounitechJobWords,
627
630
  ounitechMapShare: () => ounitechMapShare,
631
+ ounitechMapVersion: () => ounitechMapVersion,
628
632
  ounitechMapView: () => ounitechMapView,
633
+ ounitechObstacleImage: () => ounitechObstacleImage,
629
634
  ounitechPowerPlan: () => ounitechPowerPlan,
630
635
  ounitechReadings: () => ounitechReadings,
631
636
  ounitechRobotFromHomeRow: () => ounitechRobotFromHomeRow,
637
+ ounitechSettings: () => ounitechSettings,
638
+ ounitechShapes: () => ounitechShapes,
639
+ ounitechStatusLog: () => ounitechStatusLog,
632
640
  ounitechTaskRecord: () => ounitechTaskRecord,
633
641
  ounitechTime: () => ounitechTime,
642
+ ounitechTrack: () => ounitechTrack,
634
643
  overnight_parking_requests_namespace_collection: () => overnight_parking_requests_namespace_collection,
635
644
  padbotAccountKey: () => padbotAccountKey,
636
645
  padbotAlarmFault: () => padbotAlarmFault,
@@ -64262,6 +64271,17 @@ var ROBOT_CLOUD_PATHS = {
64262
64271
  workHours: "/portal/workhours/get-work-hours",
64263
64272
  haltPlans: "/portal/halt-plan/get",
64264
64273
  stationState: "/portal/detailstate/get-station-detail-state",
64274
+ // Read-only map layers and logs (2026-09-30: every read in the document is used).
64275
+ wallList: "/portal/maps/get-wall-list",
64276
+ safeZoneList: "/portal/maps/get-safezone-list",
64277
+ slowZoneList: "/portal/maps/get-slowzone-list",
64278
+ obstacleLayer: "/portal/obstacles/get-obstacle-layer",
64279
+ teachTrack: "/portal/teach/get-teach-track",
64280
+ mapVersions: "/portal/maps/get-map-version-list",
64281
+ floorMapHistory: "/portal/maps/v2405/get-floor-maplist",
64282
+ robotLog: "/portal/report/get-robot-log-list",
64283
+ userLog: "/portal/userlog/get-user-logs",
64284
+ cleaningSetting: "/portal/setting/get-cleaning-setting",
64265
64285
  mapList: "/portal/maps/get-map-list",
64266
64286
  fileUrl: "/portal/maps/get-file-url",
64267
64287
  tracking: "/portal/robots/tracking",
@@ -64562,7 +64582,17 @@ var STEP_NAMES = {
64562
64582
  [ROBOT_CLOUD_PATHS.haltPlans]: "the power schedule",
64563
64583
  [ROBOT_CLOUD_PATHS.stationState]: "the base station state",
64564
64584
  [ROBOT_CLOUD_PATHS.alertList]: "the alert history",
64565
- [ROBOT_CLOUD_PATHS.liftList]: "the lift list"
64585
+ [ROBOT_CLOUD_PATHS.liftList]: "the lift list",
64586
+ [ROBOT_CLOUD_PATHS.wallList]: "the virtual walls",
64587
+ [ROBOT_CLOUD_PATHS.safeZoneList]: "the safe zones",
64588
+ [ROBOT_CLOUD_PATHS.slowZoneList]: "the slow zones",
64589
+ [ROBOT_CLOUD_PATHS.obstacleLayer]: "the obstacle layer",
64590
+ [ROBOT_CLOUD_PATHS.teachTrack]: "the taught route",
64591
+ [ROBOT_CLOUD_PATHS.mapVersions]: "the map versions",
64592
+ [ROBOT_CLOUD_PATHS.floorMapHistory]: "the floor's map history",
64593
+ [ROBOT_CLOUD_PATHS.robotLog]: "the robot status log",
64594
+ [ROBOT_CLOUD_PATHS.userLog]: "the app action log",
64595
+ [ROBOT_CLOUD_PATHS.cleaningSetting]: "the robot settings"
64566
64596
  };
64567
64597
  var robotCloudStepName = (path5) => STEP_NAMES[path5] ?? path5;
64568
64598
  var SUCCESS_CODES = /* @__PURE__ */ new Set(["0", "200"]);
@@ -64782,6 +64812,40 @@ function useRobotCloudService(credentials, options = {}) {
64782
64812
  );
64783
64813
  return data.state ?? null;
64784
64814
  }
64815
+ async function getMapShapes(kind, mapId) {
64816
+ const [path5, list] = kind === "walls" ? [ROBOT_CLOUD_PATHS.wallList, "wallList"] : kind === "safe" ? [ROBOT_CLOUD_PATHS.safeZoneList, "safeZoneList"] : [ROBOT_CLOUD_PATHS.slowZoneList, "slowZoneList"];
64817
+ const data = await post(path5, { mapId }, list);
64818
+ return Array.isArray(data[list]) ? data[list] : [];
64819
+ }
64820
+ async function getObstacleLayer(robotId) {
64821
+ return post(ROBOT_CLOUD_PATHS.obstacleLayer, { robotId, version: 0 });
64822
+ }
64823
+ async function getTeachTrack(robotId, offset) {
64824
+ return post(ROBOT_CLOUD_PATHS.teachTrack, { robotId, offset }, "trackList");
64825
+ }
64826
+ async function getMapVersions(mapId) {
64827
+ return post(ROBOT_CLOUD_PATHS.mapVersions, { mapId }, "versionList");
64828
+ }
64829
+ async function getFloorMapHistory(sceneId, floorNo2) {
64830
+ return post(ROBOT_CLOUD_PATHS.floorMapHistory, { sceneId, floorNo: floorNo2 }, "mapList");
64831
+ }
64832
+ async function getRobotLog(robotId, sceneId, timeFrom, timeTo) {
64833
+ return post(
64834
+ ROBOT_CLOUD_PATHS.robotLog,
64835
+ { robotId: String(robotId), sceneId: String(sceneId), timeFrom, timeTo, key: "", pageNo: 1, pageSize: 50 },
64836
+ "logList"
64837
+ );
64838
+ }
64839
+ async function getUserLogs(robotId, startTime, endTime) {
64840
+ return post(
64841
+ ROBOT_CLOUD_PATHS.userLog,
64842
+ { robotId, pageNo: 1, pageSize: 50, startTime, endTime, keyword: "" },
64843
+ "actionList"
64844
+ );
64845
+ }
64846
+ async function getCleaningSetting(robotId) {
64847
+ return post(ROBOT_CLOUD_PATHS.cleaningSetting, { robotId });
64848
+ }
64785
64849
  async function getMaps(robotSn) {
64786
64850
  const data = await post(
64787
64851
  ROBOT_CLOUD_PATHS.mapList,
@@ -64867,6 +64931,14 @@ function useRobotCloudService(credentials, options = {}) {
64867
64931
  getHaltPlans,
64868
64932
  getStationState,
64869
64933
  getLiftList,
64934
+ getMapShapes,
64935
+ getObstacleLayer,
64936
+ getTeachTrack,
64937
+ getMapVersions,
64938
+ getFloorMapHistory,
64939
+ getRobotLog,
64940
+ getUserLogs,
64941
+ getCleaningSetting,
64870
64942
  getMaps,
64871
64943
  getFileUrls,
64872
64944
  getPlans,
@@ -65061,22 +65133,48 @@ function ounitechFault(list) {
65061
65133
  return { code: "error", message: String(list[0]).slice(0, 200) };
65062
65134
  return { code: "error", message: "The robot reports an error" };
65063
65135
  }
65064
- function ounitechMapShare(map, x, y) {
65136
+ function ounitechMapShare(map, x, y, clamp4 = false) {
65065
65137
  const w = map?.width, h = map?.height, r = map?.resolution;
65066
65138
  const wx = num(x), wy = num(y);
65067
65139
  if (!finite(w) || !finite(h) || !finite(r) || w <= 0 || h <= 0 || r <= 0 || wx === void 0 || wy === void 0)
65068
65140
  return null;
65069
- const sx = (wx - (num(map?.originX) ?? 0)) / r / w * 100;
65070
- const sy = 100 - (wy - (num(map?.originY) ?? 0)) / r / h * 100;
65141
+ let sx = (wx - (num(map?.originX) ?? 0)) / r / w * 100;
65142
+ let sy = 100 - (wy - (num(map?.originY) ?? 0)) / r / h * 100;
65143
+ if (clamp4)
65144
+ sx = Math.min(100, Math.max(0, sx)), sy = Math.min(100, Math.max(0, sy));
65071
65145
  if (sx < 0 || sx > 100 || sy < 0 || sy > 100)
65072
65146
  return null;
65073
65147
  return { x: Math.round(sx * 100) / 100, y: Math.round(sy * 100) / 100 };
65074
65148
  }
65075
- function ounitechMapView(m, imageUrl, partitionImageUrl, size) {
65149
+ var SHAPE_WORDS = { wall: "Virtual wall", safe: "Safe zone", slow: "Slow zone" };
65150
+ function ounitechShapes(map, kind, list) {
65151
+ return (Array.isArray(list) ? list : []).flatMap((z5, i) => {
65152
+ const points = (Array.isArray(z5?.pointList) ? z5.pointList : []).flatMap((p) => {
65153
+ const at2 = Array.isArray(p) ? ounitechMapShare(map, p[0], p[1], true) : null;
65154
+ return at2 ? [at2] : [];
65155
+ });
65156
+ const name = String(z5?.wallName ?? z5?.zoneName ?? "").trim();
65157
+ return points.length >= 2 ? [{ kind, name: name || `${SHAPE_WORDS[kind]} ${i + 1}`, points }] : [];
65158
+ });
65159
+ }
65160
+ function ounitechTrack(map, list) {
65161
+ const on = (Array.isArray(list) ? list : []).filter((p) => p && (p.mapid == null || String(p.mapid) === map?.mapId));
65162
+ const step = Math.max(1, Math.ceil(on.length / 500));
65163
+ return on.filter((_, i) => i % step === 0).flatMap((p) => {
65164
+ const at2 = ounitechMapShare(map, p.x, p.y, true);
65165
+ return at2 ? [at2] : [];
65166
+ });
65167
+ }
65168
+ function ounitechMapView(m, imageUrl, partitionImageUrl, size, shapes = {}) {
65076
65169
  const floorNo2 = Number.isInteger(m.floorNo) ? m.floorNo : null;
65077
65170
  const width = size?.width ?? null;
65078
65171
  const height = size?.height ?? null;
65079
65172
  const frame2 = { width, height, resolution: m.resolution, originX: m.originX, originY: m.originY };
65173
+ const zones = [
65174
+ ...ounitechShapes(frame2, "wall", Array.isArray(shapes.walls) && shapes.walls.length ? shapes.walls : m.wallList),
65175
+ ...ounitechShapes(frame2, "safe", shapes.safe),
65176
+ ...ounitechShapes(frame2, "slow", shapes.slow)
65177
+ ];
65080
65178
  const areas = (Array.isArray(m.areaList) ? m.areaList : []).filter((a) => typeof a?.areaName === "string" && a.areaName.trim()).map((a) => {
65081
65179
  const px = num(a.x), py = num(a.y);
65082
65180
  const at2 = width && height && px !== void 0 && py !== void 0 && (px > 0 || py > 0) && px <= width && py <= height ? { x: Math.round(px / width * 1e4) / 100, y: Math.round(py / height * 1e4) / 100 } : null;
@@ -65106,7 +65204,11 @@ function ounitechMapView(m, imageUrl, partitionImageUrl, size) {
65106
65204
  positionApproximate: true,
65107
65205
  // The raw areas, kept for older screens.
65108
65206
  areaList: areas.map(({ at: _at, ...a }) => a),
65109
- areas: areas.map((a) => ({ name: a.areaName, at: a.at }))
65207
+ areas: areas.map((a) => ({ name: a.areaName, at: a.at })),
65208
+ /** Virtual walls (the robot never crosses), safe zones and slow zones, drawn on the map. */
65209
+ zones,
65210
+ /** The route the robot was taught (get-teach-track), set per robot by getMaps. */
65211
+ taughtRoute: []
65110
65212
  };
65111
65213
  }
65112
65214
  function ounitechCurrentMap(maps, taskMapId, floorNo2) {
@@ -65178,7 +65280,12 @@ function ounitechTaskRecord(t, maps = [], tz = 480) {
65178
65280
  };
65179
65281
  }
65180
65282
  var ALERT_WORDS = {
65283
+ "205": "Side brush driver offline",
65284
+ "206": "Button panel offline",
65181
65285
  "540": "Floor check: cliff sensor switched on",
65286
+ "588": "Switched off with the power button",
65287
+ "589": "Switched off by the timed power schedule",
65288
+ "593": "Still finding its position - try again shortly",
65182
65289
  "601": "Left wheel driver reset",
65183
65290
  "620": "Right wheel driver offline",
65184
65291
  "621": "Right wheel driver reset",
@@ -65199,7 +65306,8 @@ function ounitechAlertRecord(a, tz = 480) {
65199
65306
  return {
65200
65307
  code,
65201
65308
  level: lv ? ALERT_LEVEL_WORDS[lv[1].trim()] ?? lv[1].trim() : null,
65202
- message: ALERT_WORDS[code] ?? (rest || raw),
65309
+ // An untranslated Chinese text keeps its code up front, so the row is never only Chinese.
65310
+ message: ALERT_WORDS[code] ?? (/[㐀-鿿]/.test(rest || raw) && code ? `Robot alert ${code}: ${rest || raw}` : rest || raw),
65203
65311
  vendorText: rest || raw,
65204
65312
  resolved,
65205
65313
  at: ounitechTime(a.createTime, tz)
@@ -65309,11 +65417,12 @@ var PART_WORDS = {
65309
65417
  floor_brush_double_roller_structure: "Floor brush rollers",
65310
65418
  floor_mop_double_roller_structure: "Mop rollers"
65311
65419
  };
65420
+ var upFirst = (t) => t.charAt(0).toUpperCase() + t.slice(1);
65312
65421
  function ounitechConsumable(u) {
65313
65422
  const code = String(u.unitcode ?? "").trim();
65314
65423
  const minutes = num(u.workminutes);
65315
65424
  return {
65316
- part: PART_WORDS[code] ?? (code.replace(/_/g, " ") || String(u.unitname ?? "").trim() || "Part"),
65425
+ part: PART_WORDS[code] ?? upFirst(code.replace(/_/g, " ") || String(u.unitname ?? "").trim() || "Part"),
65317
65426
  hours: minutes !== void 0 ? Math.round(minutes / 6) / 10 : null,
65318
65427
  days: num(u.workdays) ?? null
65319
65428
  };
@@ -65326,10 +65435,115 @@ function ounitechPowerPlan(p) {
65326
65435
  enabled: p.enableFlag !== false
65327
65436
  };
65328
65437
  }
65438
+ function ounitechStatusLog(l, tz = 480) {
65439
+ const code = num(l.typeFlag);
65440
+ const words = code !== void 0 ? ROBOT_STATUS_NAMES[code] : void 0;
65441
+ return {
65442
+ at: ounitechTime(l.timeFrom, tz),
65443
+ status: words ? code === 15 || code === 16 ? `${words} (mid-job)` : words : String(l.typeName ?? "").trim() || `Status ${l.typeFlag ?? "?"}`
65444
+ };
65445
+ }
65446
+ var ACTION_WORDS = {
65447
+ \u539F\u5730\u505C\u6B62: "Stopped in place",
65448
+ \u4E0B\u53D1\u6E05\u6D01: "Started a cleaning job",
65449
+ \u793A\u6559\u8DEF\u5F84\u63A7\u5236: "Controlled a taught route",
65450
+ \u6682\u505C: "Paused",
65451
+ \u7EE7\u7EED: "Resumed",
65452
+ \u56DE\u5145: "Sent back to charge",
65453
+ \u7ED3\u675F\u6E05\u6D01: "Ended the cleaning job",
65454
+ \u5F00\u673A: "Switched on",
65455
+ \u5173\u673A: "Switched off"
65456
+ };
65457
+ function ounitechAppAction(a, tz = 480) {
65458
+ const raw = String(a.actionName ?? "").trim();
65459
+ return {
65460
+ at: ounitechTime(a.createTime, tz),
65461
+ action: ACTION_WORDS[raw] ?? (raw ? /[㐀-鿿]/.test(raw) ? `App action: ${raw}` : raw : "App action"),
65462
+ by: String(a.userName ?? "").trim() || null
65463
+ };
65464
+ }
65465
+ function ounitechMapVersion(v, tz = 480) {
65466
+ return { version: num(v.versionNo) ?? null, latest: v.latestFlag === true, createdAt: ounitechTime(v.createTime, tz) };
65467
+ }
65468
+ function ounitechFloorMapHistory(m, tz = 480) {
65469
+ const area = num(m.totalArea);
65470
+ return {
65471
+ name: String(m.mapName ?? "").trim() || `Map ${m.mapId ?? ""}`.trim(),
65472
+ areaM2: area !== void 0 ? Math.round(area * 10) / 10 : null,
65473
+ latest: m.latestFlag === true,
65474
+ inUse: m.enableFlag === true,
65475
+ createdAt: ounitechTime(m.createTime, tz),
65476
+ updatedAt: ounitechTime(m.updateTime, tz)
65477
+ };
65478
+ }
65479
+ var SETTINGS = {
65480
+ soundLevel: { group: "Sound", label: "Sound level", unit: "%" },
65481
+ enableWorkSound: { group: "Sound", label: "Sounds while working" },
65482
+ clean_speed_mode: { group: "Cleaning", label: "Cleaning speed" },
65483
+ fanLevel: { group: "Cleaning", label: "Suction level" },
65484
+ waterGear: { group: "Cleaning", label: "Water level" },
65485
+ planningWidth: { group: "Cleaning", label: "Cleaning path width" },
65486
+ alongWallFlag: { group: "Cleaning", label: "Edge cleaning" },
65487
+ alongWallDistance: { group: "Cleaning", label: "Edge distance" },
65488
+ enablePlanFlag: { group: "Cleaning", label: "Schedules switched on" },
65489
+ slowZoneSpeed: { group: "Cleaning", label: "Speed in slow zones", unit: "m/s" },
65490
+ minCleanBatteryPerc: { group: "Battery", label: "Lowest battery to start cleaning", unit: "%" },
65491
+ normalCleanBatteryPerc: { group: "Battery", label: "Normal cleaning battery", unit: "%" },
65492
+ backChargeThreshold: { group: "Battery", label: "Return-to-charge battery level", unit: "%" },
65493
+ chargeCompIntervalDay: { group: "Battery", label: "Full charge every", unit: "days" },
65494
+ obsAvoidSens: { group: "Safety", label: "Obstacle avoidance sensitivity" },
65495
+ obsDetectionHeight: { group: "Safety", label: "Obstacle detection height" },
65496
+ enableCliffDetect: { group: "Safety", label: "Cliff (drop) detection" },
65497
+ ultrasonicSwitch: { group: "Safety", label: "Ultrasonic sensors" },
65498
+ panicButtonMode: { group: "Safety", label: "Emergency button mode" },
65499
+ autoUpdateMap: { group: "Maps", label: "Update the map automatically" },
65500
+ autoUpdateVirtualWall: { group: "Maps", label: "Update virtual walls automatically" },
65501
+ autoUpdateZoneMap: { group: "Maps", label: "Update the area map automatically" },
65502
+ stationAutoDrain: { group: "Base station", label: "Station drains automatically" },
65503
+ language: { group: "Robot", label: "Robot language" },
65504
+ timeZone: { group: "Robot", label: "Robot time zone" }
65505
+ };
65506
+ var SECRET_SETTING = /wifi|pwd|password|secret|token/i;
65507
+ var LANG_WORDS = { zh: "Chinese", en: "English" };
65508
+ function ounitechSettings(s) {
65509
+ const out = [];
65510
+ for (const [key, v] of Object.entries(s ?? {})) {
65511
+ if (key === "ok" || key === "msg" || SECRET_SETTING.test(key) || v == null || typeof v === "object")
65512
+ continue;
65513
+ const raw = String(v).trim();
65514
+ if (raw === "")
65515
+ continue;
65516
+ const d = SETTINGS[key] ?? { group: "Other settings", label: key };
65517
+ let value;
65518
+ if (typeof v === "boolean")
65519
+ value = v ? "On" : "Off";
65520
+ else if (key === "language")
65521
+ value = LANG_WORDS[raw] ?? raw;
65522
+ else if (key === "timeZone" && num(raw) !== void 0)
65523
+ value = `UTC${num(raw) >= 0 ? "+" : ""}${raw}`;
65524
+ else
65525
+ value = d.unit ? `${raw} ${d.unit}` : raw;
65526
+ out.push({ key, group: d.group, label: d.label, value, attention: false });
65527
+ }
65528
+ const order = ["Cleaning", "Battery", "Safety", "Maps", "Sound", "Base station", "Robot", "Other settings"];
65529
+ return out.sort((a, b) => order.indexOf(a.group) - order.indexOf(b.group));
65530
+ }
65531
+ function ounitechObstacleImage(o) {
65532
+ const b64 = typeof o?.image === "string" ? o.image.replace(/^data:image\/\w+;base64,/, "").trim() : "";
65533
+ if (!b64 || !/^[A-Za-z0-9+/=\s]+$/.test(b64.slice(0, 200)))
65534
+ return null;
65535
+ if (b64.length > 15e5)
65536
+ return { version: num(o?.version) ?? null, image: null, tooLarge: true };
65537
+ const type = b64.startsWith("/9j/") ? "jpeg" : "png";
65538
+ return { version: num(o?.version) ?? null, image: `data:image/${type};base64,${b64}`, tooLarge: false };
65539
+ }
65329
65540
  var MAP_TTL_MS = 10 * 6e4;
65330
65541
  var RECORDS_TTL_MS = 2 * 6e4;
65331
65542
  var mapCache = /* @__PURE__ */ new Map();
65332
65543
  var recordsCache = /* @__PURE__ */ new Map();
65544
+ var SLOW_TTL_MS = 10 * 6e4;
65545
+ var slowCache = /* @__PURE__ */ new Map();
65546
+ var trackCache = /* @__PURE__ */ new Map();
65333
65547
  function cached2(cache3, field, key, ttl, load) {
65334
65548
  const hit = cache3.get(key);
65335
65549
  if (hit && Date.now() - hit.at < ttl)
@@ -65342,6 +65556,8 @@ function cached2(cache3, field, key, ttl, load) {
65342
65556
  function clearOunitechCaches() {
65343
65557
  mapCache.clear();
65344
65558
  recordsCache.clear();
65559
+ slowCache.clear();
65560
+ trackCache.clear();
65345
65561
  }
65346
65562
  var robotTime = (d) => robotCloudTimestamp(d, "yyyy-MM-dd HH:mm:ss", "Asia/Shanghai");
65347
65563
  function createOunitechAdapter(credentials, options) {
@@ -65355,12 +65571,15 @@ function createOunitechAdapter(credentials, options) {
65355
65571
  const keys = list.flatMap((m) => [m.backgroundFileKey, m.partitionFileKey]).filter((k) => typeof k === "string" && !!k);
65356
65572
  const files = keys.length ? await cloud.previewFiles(keys).catch(() => []) : [];
65357
65573
  const url2 = (k) => files.find((f) => f.fileKey === k)?.url || null;
65358
- return Promise.all(
65359
- list.map(async (m) => {
65360
- const imageUrl = url2(m.backgroundFileKey);
65361
- return ounitechMapView(m, imageUrl, url2(m.partitionFileKey), imageUrl ? await fetchPngSize(imageUrl) : null);
65362
- })
65363
- );
65574
+ const views = [];
65575
+ for (const m of list) {
65576
+ const imageUrl = url2(m.backgroundFileKey);
65577
+ const id = num(m.mapId);
65578
+ const layer = (kind) => id !== void 0 ? cloud.getMapShapes(kind, id).catch(() => []) : Promise.resolve([]);
65579
+ const shapes = { walls: await layer("walls"), safe: await layer("safe"), slow: await layer("slow") };
65580
+ views.push(ounitechMapView(m, imageUrl, url2(m.partitionFileKey), imageUrl ? await fetchPngSize(imageUrl) : null, shapes));
65581
+ }
65582
+ return views;
65364
65583
  });
65365
65584
  }
65366
65585
  async function placed(row, robot) {
@@ -65374,6 +65593,40 @@ function createOunitechAdapter(credentials, options) {
65374
65593
  robot.planPosition = robot.position ? ounitechMapShare(map, robot.position.x, robot.position.y) : null;
65375
65594
  return robot;
65376
65595
  }
65596
+ async function slowRecords(robotSn) {
65597
+ const row = await rowFor(robotSn);
65598
+ if (!row || !finite(row.robotId))
65599
+ return {};
65600
+ const robotId = row.robotId;
65601
+ const tz = finite(row.timezone) ? row.timezone : 480;
65602
+ const now = /* @__PURE__ */ new Date();
65603
+ const since = (days) => robotTime(new Date(now.getTime() - days * 864e5));
65604
+ const part = async (read2) => {
65605
+ try {
65606
+ return { items: await read2() };
65607
+ } catch (e) {
65608
+ return { items: [], error: String(e?.message ?? e).slice(0, 300) };
65609
+ }
65610
+ };
65611
+ const maps = finite(row.sceneId) ? await floorMaps(row.sceneId).catch(() => []) : [];
65612
+ const map = ounitechCurrentMap(maps, row.taskState?.mapId, Number.isInteger(row.floorNo) ? row.floorNo : null);
65613
+ const mapId = map ? num(map.mapId) : void 0;
65614
+ const floorNo2 = map?.floorNo ?? (Number.isInteger(row.floorNo) ? row.floorNo : null);
65615
+ const sceneId = finite(row.sceneId) ? row.sceneId : null;
65616
+ const statusLog = sceneId !== null ? await part(async () => ((await cloud.getRobotLog(robotId, sceneId, since(7), robotTime(now))).logList ?? []).map((l) => ounitechStatusLog(l, tz))) : { items: [] };
65617
+ const appActions = await part(async () => ((await cloud.getUserLogs(robotId, since(30), robotTime(now))).actionList ?? []).map((a) => ounitechAppAction(a, tz)));
65618
+ const settings = await part(async () => ounitechSettings(await cloud.getCleaningSetting(robotId)));
65619
+ const obstacles = await part(async () => {
65620
+ const o = ounitechObstacleImage(await cloud.getObstacleLayer(robotId));
65621
+ return o ? [o] : [];
65622
+ });
65623
+ const mapVersions = mapId !== void 0 ? await part(async () => ((await cloud.getMapVersions(mapId)).versionList ?? []).map((v) => ounitechMapVersion(v, tz))) : { items: [] };
65624
+ const mapHistory = sceneId !== null && floorNo2 !== null ? await part(async () => ((await cloud.getFloorMapHistory(sceneId, floorNo2)).mapList ?? []).map((m) => ounitechFloorMapHistory(m, tz))) : { items: [] };
65625
+ const mapLayers = {
65626
+ items: map ? [{ map: map.mapDisplayName || null, zones: map.zones.map((z5) => ({ kind: z5.kind, name: z5.name })) }] : []
65627
+ };
65628
+ return { statusLog, appActions, settings, obstacles, mapVersions, mapHistory, mapLayers };
65629
+ }
65377
65630
  async function rowFor(robotSn) {
65378
65631
  return (await cloud.getHomeRobots()).find((r) => r.robotSn === robotSn) ?? null;
65379
65632
  }
@@ -65437,7 +65690,18 @@ function createOunitechAdapter(credentials, options) {
65437
65690
  const row = await rowFor(robotSn);
65438
65691
  if (!row || !finite(row.sceneId))
65439
65692
  return [];
65440
- return floorMaps(row.sceneId);
65693
+ const maps = await floorMaps(row.sceneId);
65694
+ const robotId = row.robotId;
65695
+ if (!finite(robotId))
65696
+ return maps;
65697
+ const track = await cached2(
65698
+ trackCache,
65699
+ "value",
65700
+ `${options?.baseUrl ?? ""}|${credentials.appid}|${robotId}`,
65701
+ SLOW_TTL_MS,
65702
+ async () => (await cloud.getTeachTrack(robotId, robotTime(new Date(Date.now() - 365 * 864e5)))).trackList ?? []
65703
+ ).catch(() => []);
65704
+ return maps.map((m) => ({ ...m, taughtRoute: ounitechTrack(m, track) }));
65441
65705
  },
65442
65706
  async getMapImages(_robotSn, fileKeys) {
65443
65707
  return cloud.previewFiles(fileKeys);
@@ -65463,7 +65727,7 @@ function createOunitechAdapter(credentials, options) {
65463
65727
  * after another (gentler on the rate limit); each part carries its own error.
65464
65728
  */
65465
65729
  async getRecords(robotSn) {
65466
- return cached2(recordsCache, "value", `${options?.baseUrl ?? ""}|${credentials.appid}|${robotSn}`, RECORDS_TTL_MS, async () => {
65730
+ const fast = cached2(recordsCache, "value", `${options?.baseUrl ?? ""}|${credentials.appid}|${robotSn}`, RECORDS_TTL_MS, async () => {
65467
65731
  const row = await rowFor(robotSn);
65468
65732
  if (!row || !finite(row.robotId))
65469
65733
  return { supported: true, error: `Serial ${robotSn} is not on this Ounitech account.` };
@@ -65497,11 +65761,17 @@ function createOunitechAdapter(credentials, options) {
65497
65761
  ) : { items: [] };
65498
65762
  const readings = await part(async () => ounitechReadings((await cloud.getRobotState(robotId)).properties));
65499
65763
  const station = await part(async () => {
65500
- const st = await cloud.getStationState(robotId);
65764
+ const st = await cloud.getStationState(robotId).catch((e) => {
65765
+ if (/no station bound|e=59/i.test(String(e?.message ?? "")))
65766
+ return null;
65767
+ throw e;
65768
+ });
65501
65769
  return st ? [{ status: String(st.statusName ?? "").trim() || null, readings: ounitechReadings(st.properties, true) }] : [];
65502
65770
  });
65503
65771
  return { supported: true, readAt: now.toISOString(), tasks, alerts, consumables, power, lifts, readings, station };
65504
65772
  });
65773
+ const slow = await cached2(slowCache, "value", `${options?.baseUrl ?? ""}|${credentials.appid}|${robotSn}`, SLOW_TTL_MS, () => slowRecords(robotSn));
65774
+ return { ...slow, ...await fast };
65505
65775
  },
65506
65776
  /**
65507
65777
  * Staff Diagnose: every other read-only chapter-6 call, with the vendor's
@@ -65533,8 +65803,8 @@ function createOunitechAdapter(credentials, options) {
65533
65803
  return { count: list.length, robots: list.slice(0, 3).map((r) => ({ robotSn: r.robotSn, statusName: r.statusName })) };
65534
65804
  });
65535
65805
  await run("serial-based map list (chapter 2)", ROBOT_CLOUD_PATHS.mapList, { robotSn }, async () => {
65536
- const maps = await cloud.getMaps(robotSn);
65537
- return { count: maps.length, floors: maps.map((m) => m.floorNo) };
65806
+ const maps2 = await cloud.getMaps(robotSn);
65807
+ return { count: maps2.length, floors: maps2.map((m) => m.floorNo) };
65538
65808
  });
65539
65809
  const row = await rowFor(robotSn).catch(() => null);
65540
65810
  if (!row || !finite(row.robotId)) {
@@ -65586,6 +65856,50 @@ function createOunitechAdapter(credentials, options) {
65586
65856
  return (r.liftlist ?? []).map((l) => ({ liftno: l.liftno, liftname: l.liftname, floorno: l.floorno, onlineflag: l.onlineflag, enableflag: l.enableflag }));
65587
65857
  });
65588
65858
  }
65859
+ const maps = finite(row.sceneId) ? await floorMaps(row.sceneId).catch(() => []) : [];
65860
+ const map = ounitechCurrentMap(maps, row.taskState?.mapId, Number.isInteger(row.floorNo) ? row.floorNo : null);
65861
+ const mapId = map ? num(map.mapId) : void 0;
65862
+ if (mapId !== void 0) {
65863
+ await run("virtual walls (get-wall-list)", ROBOT_CLOUD_PATHS.wallList, { mapId }, async () => cut(await cloud.getMapShapes("walls", mapId)));
65864
+ await run("safe zones (get-safezone-list)", ROBOT_CLOUD_PATHS.safeZoneList, { mapId }, async () => cut(await cloud.getMapShapes("safe", mapId)));
65865
+ await run("slow zones (get-slowzone-list)", ROBOT_CLOUD_PATHS.slowZoneList, { mapId }, async () => cut(await cloud.getMapShapes("slow", mapId)));
65866
+ await run("map versions (get-map-version-list)", ROBOT_CLOUD_PATHS.mapVersions, { mapId }, async () => cut((await cloud.getMapVersions(mapId)).versionList ?? []));
65867
+ }
65868
+ if (finite(row.sceneId) && map?.floorNo != null) {
65869
+ const sceneId = row.sceneId;
65870
+ const floorNo2 = map.floorNo;
65871
+ await run(
65872
+ "floor map history (v2405/get-floor-maplist)",
65873
+ ROBOT_CLOUD_PATHS.floorMapHistory,
65874
+ { sceneId, floorNo: floorNo2 },
65875
+ async () => cut((await cloud.getFloorMapHistory(sceneId, floorNo2)).mapList ?? [])
65876
+ );
65877
+ }
65878
+ await run("obstacle layer (get-obstacle-layer)", ROBOT_CLOUD_PATHS.obstacleLayer, { robotId, version: 0 }, async () => {
65879
+ const o = await cloud.getObstacleLayer(robotId);
65880
+ return { version: o.version ?? null, imageChars: typeof o.image === "string" ? o.image.length : 0 };
65881
+ });
65882
+ await run("taught route (get-teach-track)", ROBOT_CLOUD_PATHS.teachTrack, { robotId, offset: window.timeFrom }, async () => {
65883
+ const r = await cloud.getTeachTrack(robotId, window.timeFrom);
65884
+ return { points: r.trackList?.length ?? 0, since: r.since ?? null, first: cut(r.trackList ?? []) };
65885
+ });
65886
+ if (finite(row.sceneId)) {
65887
+ const sceneId = row.sceneId;
65888
+ await run("robot status log, last 7 days (get-robot-log-list)", ROBOT_CLOUD_PATHS.robotLog, { robotId, sceneId, ...window }, async () => {
65889
+ const r = await cloud.getRobotLog(robotId, sceneId, window.timeFrom, window.timeTo);
65890
+ return { total: r.total ?? r.logList?.length ?? 0, latest: cut(r.logList ?? []) };
65891
+ });
65892
+ }
65893
+ await run("app action log, last 7 days (get-user-logs)", ROBOT_CLOUD_PATHS.userLog, { robotId, startTime: window.timeFrom, endTime: window.timeTo }, async () => {
65894
+ const r = await cloud.getUserLogs(robotId, window.timeFrom, window.timeTo);
65895
+ return { total: r.total ?? r.actionList?.length ?? 0, latest: cut((r.actionList ?? []).map(({ userPhone: _p, ...a }) => a)) };
65896
+ });
65897
+ await run(
65898
+ "robot settings (get-cleaning-setting)",
65899
+ ROBOT_CLOUD_PATHS.cleaningSetting,
65900
+ { robotId },
65901
+ async () => Object.fromEntries(Object.entries(await cloud.getCleaningSetting(robotId)).filter(([k]) => !SECRET_SETTING.test(k) && k !== "ok" && k !== "msg"))
65902
+ );
65589
65903
  steps.push({
65590
65904
  step: "current job (robot list taskState)",
65591
65905
  path: ROBOT_CLOUD_PATHS.homeRobotList,
@@ -107521,6 +107835,7 @@ function usePersonalEmergencyChainController() {
107521
107835
  ROBOT_TYPES,
107522
107836
  RobotCloudError,
107523
107837
  RobotCredentialsError,
107838
+ SECRET_SETTING,
107524
107839
  SELF_SERVICE_RESEND_COOLDOWN_MS,
107525
107840
  SELF_SIGNUP_PLATFORM,
107526
107841
  SELF_SIGNUP_STATUS,
@@ -107817,18 +108132,26 @@ function usePersonalEmergencyChainController() {
107817
108132
  orgRoleSets,
107818
108133
  orgSchema,
107819
108134
  ounitechAlertRecord,
108135
+ ounitechAppAction,
107820
108136
  ounitechCleaning,
107821
108137
  ounitechConsumable,
107822
108138
  ounitechCurrentMap,
107823
108139
  ounitechFault,
108140
+ ounitechFloorMapHistory,
107824
108141
  ounitechJobWords,
107825
108142
  ounitechMapShare,
108143
+ ounitechMapVersion,
107826
108144
  ounitechMapView,
108145
+ ounitechObstacleImage,
107827
108146
  ounitechPowerPlan,
107828
108147
  ounitechReadings,
107829
108148
  ounitechRobotFromHomeRow,
108149
+ ounitechSettings,
108150
+ ounitechShapes,
108151
+ ounitechStatusLog,
107830
108152
  ounitechTaskRecord,
107831
108153
  ounitechTime,
108154
+ ounitechTrack,
107832
108155
  overnight_parking_requests_namespace_collection,
107833
108156
  padbotAccountKey,
107834
108157
  padbotAlarmFault,