from __future__ import annotations from dataclasses import dataclass, field from typing import Any @dataclass class SetupAdapterRequest: channel_id: str user_id: str = "" config: dict[str, Any] = field(default_factory=dict) commands: list[str] = field(default_factory=list) @property def is_dm(self) -> bool: return self.channel_id.startswith("D") @dataclass class SetupAdapterResponse: text: str = "" blocks: list[dict[str, Any]] = field(default_factory=list) replace_original: bool = False delete_original: bool = False ephemeral: bool = True def handle_setup_command( request: SetupAdapterRequest, ) -> SetupAdapterResponse: if "wizard" in request.commands or "setup" in request.commands: return _render_wizard_response(request) if "status" in request.commands: return _render_status_response(request) if "help" in request.commands: return _render_help_response(request) return _render_help_response(request) def _render_wizard_response(request: SetupAdapterRequest) -> SetupAdapterResponse: return SetupAdapterResponse( text="*Slack Setup Wizard*\n\n" "Let's set up your Slack bot integration.\n\n" "1. *Bot Token* - Ensure `SLACK_BOT_TOKEN` is set in your environment\n" "2. *App Token* - For Socket Mode, set `SLACK_APP_TOKEN`\n" "3. *Events* - Subscribe to `message.channels`, `message.im` events\n" "4. *Scopes* - Ensure `chat:write`, `channels:history` scopes are added\n\n" "Use `/yuxi status` to check current configuration.", ephemeral=True, ) def _render_status_response(request: SetupAdapterRequest) -> SetupAdapterResponse: import os token_ok = bool(os.environ.get("SLACK_BOT_TOKEN", "") or request.config.get("token", "")) app_token_ok = bool(os.environ.get("SLACK_APP_TOKEN", "") or request.config.get("app_token", "")) security = request.config.get("security", {}) or {} pairing_enabled = bool(security.get("pairing", {}).get("enabled")) text = "*Slack Configuration Status*\n\n" text += f"Bot Token: {'✅' if token_ok else '❌'}\n" text += f"App Token: {'✅' if app_token_ok else '❌'}\n" text += f"Pairing: {'✅ Enabled' if pairing_enabled else '⚠️ Disabled'}\n" text += f"Config Keys: {len(request.config)} items\n" return SetupAdapterResponse(text=text, ephemeral=True) def _render_help_response(request: SetupAdapterRequest) -> SetupAdapterResponse: return SetupAdapterResponse( text="*Slack Setup Help*\n\n" "Available commands:\n" "• `/yuxi setup` - Start setup wizard\n" "• `/yuxi status` - View current configuration\n" "• `/yuxi help` - Show this help\n\n" "Configuration is managed via `config.yaml` or environment variables.", ephemeral=True, )