fix(agent): validate UI envelopes

This commit is contained in:
2026-07-14 11:01:07 +08:00
parent 1c85d938a6
commit ed60a13f12
6 changed files with 276 additions and 31 deletions
+17 -5
View File
@@ -31,6 +31,7 @@ export function toTrustedMapAction(action: string, params: unknown, fallbackText
if (action === "locate_features" || action in LEGACY_LOCATE_ACTION_LAYERS) {
const featureIds = readLocateIds(params);
if (featureIds.length === 0 || featureIds.length > 100 || featureIds.some((id) => id.length > 128)) return null;
return {
type: "locate_features",
featureIds,
@@ -47,27 +48,35 @@ export function toTrustedMapAction(action: string, params: unknown, fallbackText
return null;
}
const zoom = numberValue(params.zoom);
if (center[0] < -180 || center[0] > 180 || center[1] < -90 || center[1] > 90 ||
(zoom !== undefined && (zoom < 0 || zoom > 24))) return null;
return {
type: "zoom_to_map",
center,
zoom: numberValue(params.zoom),
zoom,
fallbackText
};
}
if (action === "apply_layer_style") {
const layerGroupId = stringValue(params.layer_group_id ?? params.layerGroupId);
const layerId = stringValue(params.layer_id ?? params.layerId);
const visible = booleanValue(params.visible);
if ((!layerGroupId && !layerId) || visible === undefined || (layerId && !ALLOWED_LAYER_IDS.has(layerId))) return null;
return {
type: "apply_layer_style",
layerGroupId: stringValue(params.layer_group_id ?? params.layerGroupId),
layerId: stringValue(params.layer_id ?? params.layerId),
visible: booleanValue(params.visible),
layerGroupId,
layerId,
visible,
fallbackText
};
}
if (action === "render_junctions") {
const renderRef = stringValue(params.render_ref ?? params.renderRef);
if (!renderRef) {
if (!renderRef || !RESULT_REF_PATTERN.test(renderRef)) {
return null;
}
@@ -134,6 +143,9 @@ const LEGACY_LOCATE_ACTION_LAYERS: Record<string, string> = {
locate_tanks: "geo_tanks"
};
const RESULT_REF_PATTERN = /^res-[A-Za-z0-9_-]{8,128}$/;
const ALLOWED_LAYER_IDS = new Set(["junctions", "pipes"]);
const LOCATE_ID_PARAM_KEYS = [
"feature_ids",
"feature_id",