114 lines
4.0 KiB
TypeScript
114 lines
4.0 KiB
TypeScript
import { tool } from "@opencode-ai/plugin";
|
|
|
|
export default tool({
|
|
description:
|
|
"在前端地图上对节点或管道图层应用样式,或重置为默认样式。样式参数应尽量与前端样式编辑器字段保持一致。",
|
|
args: {
|
|
reason: tool.schema
|
|
.string()
|
|
.describe(
|
|
"Why this style action is needed for the current user request.",
|
|
),
|
|
layer_id: tool.schema
|
|
.enum(["junctions", "pipes"])
|
|
.describe("Target layer id. Must be exactly 'junctions' or 'pipes'."),
|
|
reset_to_default: tool.schema
|
|
.boolean()
|
|
.optional()
|
|
.describe("Whether to reset the target layer to its default style."),
|
|
style_config: tool.schema
|
|
.object({
|
|
property: tool.schema
|
|
.string()
|
|
.optional()
|
|
.describe("Data property to render."),
|
|
classification_method: tool.schema
|
|
.enum(["pretty_breaks", "custom_breaks"])
|
|
.optional()
|
|
.describe("Classification method."),
|
|
segments: tool.schema
|
|
.number()
|
|
.int()
|
|
.min(2)
|
|
.max(10)
|
|
.optional()
|
|
.describe("Number of rendered intervals, from 2 to 10."),
|
|
min_size: tool.schema
|
|
.number()
|
|
.optional()
|
|
.describe("Minimum point radius."),
|
|
max_size: tool.schema
|
|
.number()
|
|
.optional()
|
|
.describe("Maximum point radius."),
|
|
min_stroke_width: tool.schema
|
|
.number()
|
|
.optional()
|
|
.describe("Minimum line width."),
|
|
max_stroke_width: tool.schema
|
|
.number()
|
|
.optional()
|
|
.describe("Maximum line width."),
|
|
fixed_stroke_width: tool.schema
|
|
.number()
|
|
.optional()
|
|
.describe("Fixed line width when width is not data-driven."),
|
|
color_type: tool.schema
|
|
.enum(["single", "gradient", "rainbow", "custom"])
|
|
.optional()
|
|
.describe("Color strategy."),
|
|
single_palette_index: tool.schema.number().int().min(0).max(6).optional(),
|
|
gradient_palette_index: tool.schema.number().int().min(0).max(2).optional(),
|
|
rainbow_palette_index: tool.schema.number().int().min(0).max(1).optional(),
|
|
show_labels: tool.schema
|
|
.boolean()
|
|
.optional()
|
|
.describe("Whether to show labels."),
|
|
show_id: tool.schema
|
|
.boolean()
|
|
.optional()
|
|
.describe("Whether to show ids."),
|
|
opacity: tool.schema.number().min(0).max(1).optional().describe("Opacity in [0, 1]."),
|
|
adjust_width_by_property: tool.schema
|
|
.boolean()
|
|
.optional()
|
|
.describe("Whether line width is driven by the rendered property."),
|
|
custom_breaks: tool.schema
|
|
.array(tool.schema.number())
|
|
.optional()
|
|
.describe("Strictly increasing boundaries. Length must equal segments + 1."),
|
|
custom_colors: tool.schema
|
|
.array(tool.schema.string())
|
|
.optional()
|
|
.describe("Custom CSS colors. Length must equal segments."),
|
|
})
|
|
.optional()
|
|
.describe(
|
|
"Optional style config overrides. Omit when reset_to_default is true.",
|
|
),
|
|
},
|
|
async execute(args) {
|
|
const layerLabel = args.layer_id === "junctions" ? "节点" : "管道";
|
|
if (args.reset_to_default) {
|
|
return `已提交${layerLabel}图层默认样式重置请求。`;
|
|
}
|
|
const style = args.style_config;
|
|
if (style?.custom_breaks) {
|
|
if (
|
|
style.custom_breaks.some(
|
|
(value, index, values) => index > 0 && value <= values[index - 1],
|
|
)
|
|
) {
|
|
throw new Error("custom_breaks must be strictly increasing");
|
|
}
|
|
if (style.segments && style.custom_breaks.length !== style.segments + 1) {
|
|
throw new Error("custom_breaks length must equal segments + 1");
|
|
}
|
|
}
|
|
if (style?.segments && style.custom_colors && style.custom_colors.length !== style.segments) {
|
|
throw new Error("custom_colors length must equal segments");
|
|
}
|
|
return `已提交${layerLabel}图层样式请求。`;
|
|
},
|
|
});
|