suna/backend/supabase/migrations/20250729105030_fix_agentpre...

78 lines
2.8 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION sanitize_config_for_template(input_config JSONB)
RETURNS JSONB
LANGUAGE plpgsql
AS $$
DECLARE
sanitized_config JSONB;
custom_mcp_array JSONB;
custom_mcp_item JSONB;
sanitized_mcp JSONB;
result_array JSONB := '[]'::jsonb;
agentpress_tools JSONB := '{}'::jsonb;
tool_name TEXT;
tool_config JSONB;
BEGIN
IF input_config->'tools'->'agentpress' IS NOT NULL THEN
FOR tool_name IN SELECT jsonb_object_keys(input_config->'tools'->'agentpress')
LOOP
tool_config := input_config->'tools'->'agentpress'->tool_name;
IF jsonb_typeof(tool_config) = 'boolean' THEN
agentpress_tools := jsonb_set(agentpress_tools, ARRAY[tool_name], tool_config);
ELSIF jsonb_typeof(tool_config) = 'object' AND tool_config ? 'enabled' THEN
agentpress_tools := jsonb_set(agentpress_tools, ARRAY[tool_name], tool_config->'enabled');
ELSE
agentpress_tools := jsonb_set(agentpress_tools, ARRAY[tool_name], 'false'::jsonb);
END IF;
END LOOP;
END IF;
sanitized_config := jsonb_build_object(
'system_prompt', COALESCE(input_config->>'system_prompt', ''),
'tools', jsonb_build_object(
'agentpress', agentpress_tools,
'mcp', COALESCE(input_config->'tools'->'mcp', '[]'::jsonb),
'custom_mcp', '[]'::jsonb
),
'metadata', jsonb_build_object(
'avatar', input_config->'metadata'->>'avatar',
'avatar_color', input_config->'metadata'->>'avatar_color'
)
);
custom_mcp_array := COALESCE(input_config->'tools'->'custom_mcp', '[]'::jsonb);
FOR custom_mcp_item IN SELECT jsonb_array_elements(custom_mcp_array)
LOOP
sanitized_mcp := jsonb_build_object(
'name', custom_mcp_item->>'name',
'type', custom_mcp_item->>'type',
'display_name', COALESCE(custom_mcp_item->>'display_name', custom_mcp_item->>'name'),
'enabledTools', COALESCE(custom_mcp_item->'enabledTools', '[]'::jsonb)
);
IF custom_mcp_item->>'type' = 'pipedream' THEN
sanitized_mcp := jsonb_set(
sanitized_mcp,
'{config}',
jsonb_build_object(
'url', custom_mcp_item->'config'->>'url',
'headers', COALESCE(custom_mcp_item->'config'->'headers', '{}'::jsonb) - 'profile_id'
)
);
ELSE
sanitized_mcp := jsonb_set(sanitized_mcp, '{config}', '{}'::jsonb);
END IF;
result_array := result_array || sanitized_mcp;
END LOOP;
sanitized_config := jsonb_set(
sanitized_config,
'{tools,custom_mcp}',
result_array
);
RETURN sanitized_config;
END;
$$;