import { z } from "zod"; import { viewCommandVariants } from "./command.js"; import type { FrontendActionManifest } from "./types.js"; export { safeChartInput } from "./command.js"; const deviceId = z.string().trim().min(1).max(128); const scadaLevel = z.enum(["high", "medium", "low", "unrated"]); const levelCounts = z.object({ high: z.number().int().nonnegative(), medium: z.number().int().nonnegative(), low: z.number().int().nonnegative(), unrated: z.number().int().nonnegative(), }).strict(); const cleared = z.object({ cleared: z.literal(true) }).strict(); const outputs: Record = { highlight_features: z.object({ highlighted_ids: z.array(deviceId).min(1), missing_ids: z.array(deviceId), fitted: z.boolean() }).strict(), close_chart: z.object({ closed: z.literal(true) }).strict(), set_overlay: z.object({ displayed: z.literal(true), feature_count: z.number().int().positive() }).strict(), locate_features: z.object({ located_ids: z.array(deviceId).min(1), missing_ids: z.array(deviceId), fitted: z.literal(true) }).strict(), zoom_to_map: z.object({ fitted: z.literal(true) }).strict(), open_chart: z.object({ displayed: z.literal(true), series_count: z.number().int().positive() }).strict(), render_scada_analysis: z.object({ rendered_ids: z.array(deviceId), missing_ids: z.array(deviceId), level_counts: levelCounts, fitted: z.literal(true) }).strict(), }; const definitions = viewCommandVariants.map(inputSchema => { const id = inputSchema.shape.action.value; const manifest: FrontendActionManifest = { id, version: "frontend-action@2", risk: "view", timeoutMs: 15000, supportedSurfaces: id.includes("chart") ? ["side_panel", "canvas"] : ["map_overlay"] }; return { manifest, inputSchema, outputSchema: outputs[id] ?? cleared }; }); export const frontendActionRegistry = definitions.map(item => item.manifest); export const getFrontendActionDefinition = (name: string) => definitions.find(item => item.manifest.id === name); export const frontendActionRegistryResponse = { schema_version: "frontend-action-registry@2" as const, actions: frontendActionRegistry };