FIX: Watched word tag action broken after TagChooser refactor by nattsw · Pull Request #38245 · discourse/discourse

TagChooser's _onChange was changed to pass tag objects instead of
name strings (9e99066), which broke watched words as
tags.join(",") on objects produced [object Object] fails
validation.

Instead of restoring the old string-based approach, this switches to
sending tag objects with ids to the backend. The controller resolves
existing tags by ID (we should always ref by id) and creates new
ones via DiscourseTagging.find_or_create_tags!. The legacy
replacement param still works for backward compatibility.