Implement metadata-driven frontend (remove hardcoded service logic)
## Context The frontend wizard components contained multiple hardcoded constants and conditional logic tied to specific service/trigger/action IDs: - `AUTO_OPERATOR_TRIGGERS` - list of trigger IDs that should auto-set the operator - `TRIGGER_MESSAGE_TEMPLATES` - hardcoded default message templates per trigger - `CHANNEL_ACTION_IDS` - hardcoded action IDs that need channel selection - `HIDDEN_CONFIG_FIELDS` - hardcoded list of fields to hide in the UI - Various `if (triggerId === 'weather_...')` conditions This approach means adding a new service requires modifying multiple frontend files. ## Implementation ### Backend: Add UI metadata to service definitions Each trigger/action definition now includes metadata properties: - `format`: `'template'`, `'template-multiline'`, `'column-select'`, `'location'` - controls which UI component renders - `hidden: true` - hides the field from user input (auto-populated) - `defaultTemplate` - pre-fills the action message template when this trigger is selected - `autoOperator` - auto-sets the operator value and hides the operator selector - `channelType` - `'discord'` or `'slack'` - shows the channel picker for this action - `supportsEnrichment` - shows the data enrichment panel for this trigger - `requiresLocation` - shows the location picker for this trigger ### Frontend: Consume metadata dynamically - `wizardStore.js`: Remove all hardcoded constants; read metadata from trigger/action objects - `DynamicFormFields.jsx`: Render components based on `prop.format` and `prop.hidden` - `StepTriggers.jsx`: Use `trigger.requiresLocation` and `trigger.supportsEnrichment` instead of ID checks - `StepActions.jsx`: Use `action.channelType` instead of hardcoded action ID lists - `StepReview.jsx`: Use `getSchemaHiddenFields(schema)` utility for display filtering ## Key Files - `frontend/src/features/rules/stores/wizardStore.js` - `frontend/src/features/rules/components/DynamicFormFields.jsx` - `frontend/src/features/rules/components/wizard/StepTriggers.jsx` - `frontend/src/features/rules/components/wizard/StepActions.jsx` - `frontend/src/features/rules/components/wizard/StepReview.jsx` - All `backend/src/services/*/index.js` (metadata additions) - `backend/src/services/weather/triggers.js` (metadata additions) ## Acceptance Criteria - [x] No hardcoded service/trigger/action IDs remain in frontend components - [x] All removed constants (`AUTO_OPERATOR_TRIGGERS`, `TRIGGER_MESSAGE_TEMPLATES`, `CHANNEL_ACTION_IDS`, `HIDDEN_CONFIG_FIELDS`) are fully replaced by metadata reads - [x] Adding a new service with triggers/actions requires zero frontend code changes - [x] All existing rule creation wizard flows work identically to before - [x] All tests pass
issue