feat(agent): refine ready state actions

This commit is contained in:
2026-07-15 18:30:21 +08:00
parent 055335e404
commit df2fb3ca38
10 changed files with 149 additions and 41 deletions
+24 -3
View File
@@ -9,6 +9,7 @@ export type TrustedMapAction =
type: "zoom_to_map";
center: [number, number];
zoom?: number;
durationMs?: number;
fallbackText?: string;
}
| {
@@ -49,6 +50,7 @@ export function toTrustedMapAction(action: string, params: unknown, fallbackText
}
const zoom = numberValue(params.zoom);
const durationMs = numberValue(params.duration_ms ?? params.durationMs);
if (center[0] < -180 || center[0] > 180 || center[1] < -90 || center[1] > 90 ||
(zoom !== undefined && (zoom < 0 || zoom > 24))) return null;
@@ -56,6 +58,7 @@ export function toTrustedMapAction(action: string, params: unknown, fallbackText
type: "zoom_to_map",
center,
zoom,
...(durationMs === undefined ? {} : { durationMs }),
fallbackText
};
}
@@ -91,22 +94,39 @@ export function toTrustedMapAction(action: string, params: unknown, fallbackText
}
function parseCenter(params: Record<string, unknown>): [number, number] | null {
const sourceCrs = params.source_crs ?? params.sourceCrs;
if (Array.isArray(params.center) && params.center.length >= 2) {
const lng = numberValue(params.center[0]);
const lat = numberValue(params.center[1]);
return lng === undefined || lat === undefined ? null : [lng, lat];
return lng === undefined || lat === undefined ? null : normalizeCenter(lng, lat, sourceCrs);
}
const rawCoordinate = params.coordinate ?? params.coordinates;
if (Array.isArray(rawCoordinate) && rawCoordinate.length >= 2) {
const lng = numberValue(rawCoordinate[0]);
const lat = numberValue(rawCoordinate[1]);
return lng === undefined || lat === undefined ? null : [lng, lat];
return lng === undefined || lat === undefined ? null : normalizeCenter(lng, lat, sourceCrs);
}
const lng = numberValue(params.lng ?? params.lon ?? params.longitude ?? params.x);
const lat = numberValue(params.lat ?? params.latitude ?? params.y);
return lng === undefined || lat === undefined ? null : [lng, lat];
return lng === undefined || lat === undefined ? null : normalizeCenter(lng, lat, sourceCrs);
}
function normalizeCenter(x: number, y: number, sourceCrs: unknown): [number, number] {
if (sourceCrs === "EPSG:3857") {
return webMercatorToLngLat(x, y);
}
return [x, y];
}
function webMercatorToLngLat(x: number, y: number): [number, number] {
const lng = (x / WEB_MERCATOR_RADIUS) * (180 / Math.PI);
const lat = (2 * Math.atan(Math.exp(y / WEB_MERCATOR_RADIUS)) - Math.PI / 2) * (180 / Math.PI);
return [lng, lat];
}
function stringValue(value: unknown) {
@@ -145,6 +165,7 @@ const LEGACY_LOCATE_ACTION_LAYERS: Record<string, string> = {
const RESULT_REF_PATTERN = /^res-[A-Za-z0-9_-]{8,128}$/;
const ALLOWED_LAYER_IDS = new Set(["junctions", "pipes"]);
const WEB_MERCATOR_RADIUS = 6378137;
const LOCATE_ID_PARAM_KEYS = [
"feature_ids",