From cdf97afbc41ba14d03b611adcfca946ed38ff21f Mon Sep 17 00:00:00 2001 From: Huarch Date: Fri, 25 Sep 2026 16:02:10 +0800 Subject: [PATCH] fix(chat): preserve style defaults for omitted agent overrides --- src/components/chat/toolCallStyleHelpers.test.ts | 15 +++++++++++++++ src/components/chat/toolCallStyleHelpers.ts | 13 +++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/chat/toolCallStyleHelpers.test.ts b/src/components/chat/toolCallStyleHelpers.test.ts index 76bdd9a..52c42b3 100644 --- a/src/components/chat/toolCallStyleHelpers.test.ts +++ b/src/components/chat/toolCallStyleHelpers.test.ts @@ -1,4 +1,6 @@ import { parseApplyLayerStylePayload } from "./toolCallStyleHelpers"; +import { createDefaultLayerStyleState } from "@components/olmap/core/Controls/styleEditorPresets"; +import { validateStyleConfig } from "@components/olmap/core/Controls/styleEditorUtils"; describe("parseApplyLayerStylePayload", () => { it("accepts a valid snake_case interval contract", () => { @@ -47,4 +49,17 @@ describe("parseApplyLayerStylePayload", () => { }), ).toMatchObject({ layerId: "junctions", styleConfig: { opacity: 0.5 } }); }); + + it("preserves default palette indexes when only some style fields are provided", () => { + const payload = parseApplyLayerStylePayload({ + layer_id: "pipes", + style_config: { property: "flow", color_type: "gradient" }, + }); + expect(payload).not.toBeNull(); + const merged = { + ...createDefaultLayerStyleState("pipes").styleConfig, + ...payload?.styleConfig, + }; + expect(validateStyleConfig(merged)).toEqual({ valid: true, errors: [] }); + }); }); diff --git a/src/components/chat/toolCallStyleHelpers.ts b/src/components/chat/toolCallStyleHelpers.ts index f62fafc..d40e2aa 100644 --- a/src/components/chat/toolCallStyleHelpers.ts +++ b/src/components/chat/toolCallStyleHelpers.ts @@ -198,10 +198,15 @@ export const parseApplyLayerStylePayload = ( ) return null; } + const definedStyleConfig = styleConfig + ? (Object.fromEntries( + Object.entries(styleConfig).filter(([, value]) => value !== undefined), + ) as Partial) + : undefined; const hasStyleOverrides = - styleConfig && - Object.values(styleConfig).some((value) => - Array.isArray(value) ? value.length > 0 : value !== undefined, + definedStyleConfig && + Object.values(definedStyleConfig).some((value) => + Array.isArray(value) ? value.length > 0 : true, ); if (!resetToDefault && !hasStyleOverrides) { @@ -211,7 +216,7 @@ export const parseApplyLayerStylePayload = ( return { layerId, resetToDefault, - styleConfig: hasStyleOverrides ? styleConfig : undefined, + styleConfig: hasStyleOverrides ? definedStyleConfig : undefined, }; };