Files
openhuman/scripts/test-channel-messaging.sh
T
8aa5547af4 feat: Telegram managed login, channel messaging, and inbound agent loop (#338)
* feat: add managed Telegram login flow and API endpoints

- Introduced a new managed Telegram login flow, allowing users to link their Telegram accounts via a deep link.
- Added `telegram_login_start` and `telegram_login_check` functions to handle the creation of link tokens and status checks for user linking.
- Updated the API with new endpoints for managing Telegram login, including detailed response structures for link token creation and status verification.
- Enhanced the `.env.example` file to include a configuration option for the Telegram bot username, facilitating easier setup for developers.

* refactor: update Telegram integration to use core RPC for login flow

- Replaced the managed DM API with core RPC calls for initiating and checking Telegram login status.
- Introduced new API methods `telegramLoginStart` and `telegramLoginCheck` to handle link token creation and verification.
- Updated the TelegramConfig and MessagingPanel components to utilize the new login flow, enhancing the user experience and simplifying the codebase.
- Adjusted tests to reflect changes in the login process and ensure proper functionality.

* docs: update TODO list with new user interaction registration task for memory skill

* feat: add ChannelSetupModal for configuring channel integrations

- Introduced a new reusable modal component, ChannelSetupModal, for configuring channel integrations such as Telegram and Discord.
- The modal can be opened from the Skills page or Settings, enhancing user experience by providing a centralized configuration interface.
- Updated MessagingPanel and Skills components to integrate the new modal, allowing users to easily manage their channel settings.
- Implemented channel-specific configuration components for better modularity and maintainability.

* feat: add ChannelSetupModal for configuring channel integrations

- Introduced a new reusable modal component, ChannelSetupModal, for configuring channel integrations such as Telegram and Discord.
- The modal can be opened from the Skills page or Settings, enhancing user experience by providing a centralized configuration interface.
- Updated MessagingPanel and Skills components to integrate the new modal, allowing users to easily manage their channel settings.
- Implemented channel-specific configuration components for better modularity and maintainability.

* style: update channel components for improved UI consistency

- Refactored styles across various channel configuration components, including ChannelCapabilities, ChannelConfigPanel, ChannelFieldInput, ChannelSelector, DiscordConfig, TelegramConfig, and WebChannelConfig.
- Enhanced color schemes and layout for better readability and visual appeal, ensuring a cohesive design across the application.
- Updated status badge styles in definitions.ts to align with the new design standards.
- Improved error message visibility and loading indicators in Channels page for a more user-friendly experience.

* refactor: update WebChannelConfig and tests for improved clarity and functionality

- Renamed the `definition` prop in WebChannelConfig to `_definition` for clarity.
- Updated test cases in DiscordConfig and TelegramConfig to reflect changes in auth mode labels, ensuring accurate rendering of UI elements.
- Adjusted the TelegramConfig test to fix the click event on the connect button, enhancing test reliability.
- Modified channel definitions to streamline the managed DM auth mode, improving code organization and maintainability.

* fix: enhance WebGL error handling in MeshGradient and RotatingTetrahedronCanvas components

- Added error handling in the MeshGradient component to gracefully catch WebGL initialization failures, ensuring the app remains functional when the GPU context is unavailable.
- Updated the RotatingTetrahedronCanvas component to verify WebGL context availability before initializing the renderer, preventing crashes and improving user experience.
- Modified channel definitions to update auth mode labels for clarity and consistency across the application.

* style: update RotatingTetrahedronCanvas colors and animation speed

- Changed fill and edge colors in the RotatingTetrahedronCanvas component for improved visual appeal.
- Adjusted opacity of the fill material to enhance transparency effects.
- Introduced a speed multiplier for rotation animations, allowing for more dynamic visual effects.

* refactor: improve WebGL error handling and cleanup in MeshGradient component

- Removed unused canvas reference and WebGL context probing to streamline the MeshGradient component.
- Enhanced error handling during shader compilation to throw an error when WebGL context may be lost, improving robustness.
- Wrapped initialization logic in a try-catch block to gracefully handle failures, ensuring the gradient functionality is disabled if initialization fails.

* refactor: simplify Telegram login flow by removing unused link token check

- Removed the `check_channel_link_status` method from the `BackendOAuthClient`, streamlining the authentication process.
- Updated `telegram_login_check` to directly fetch the user profile and determine link status based on the presence of `telegramId`, enhancing clarity and reducing complexity.
- Adjusted logging to reflect the new flow and ensure accurate debugging information.

* feat: enhance JSON-RPC method invocation with session expiration handling

- Added logic to automatically clear stored session on receiving a 401 error from the backend, improving user experience by ensuring users are redirected to the login page when their session expires.
- Introduced a helper function to identify session expiration errors, enhancing code clarity and maintainability.
- Refactored the `invoke_method` function to incorporate this new error handling mechanism, ensuring robust session management during RPC calls.

* style: update app-dotted-canvas background gradient for improved visibility

- Changed the radial gradient background color in the app-dotted-canvas from rgba(0, 0, 0, 0.2) to rgba(0, 0, 0, 0.5), enhancing the contrast and overall visual appeal of the component.

* feat: implement channel messaging API with end-to-end testing script

- Added a new script `test-channel-messaging.sh` for end-to-end testing of message sending to Telegram via the backend API.
- Implemented new backend API methods for sending messages, reactions, creating threads, updating threads, and listing threads in channels.
- Enhanced the `BackendOAuthClient` with methods to handle channel messaging operations.
- Updated controller schemas and handlers to support the new messaging functionalities, ensuring robust interaction with the backend.
- Improved logging for better debugging and tracking of channel operations.

* feat: add test-channel-receive script for real-time channel message listening

- Introduced a new script `test-channel-receive.mjs` that connects to the backend Socket.IO server and listens for incoming channel messages.
- Implemented session token retrieval and validation against the backend, ensuring secure message handling.
- Added options for debugging and sending test messages, enhancing the script's usability for testing purposes.
- Improved logging for better visibility of connection status and incoming messages.

* feat: implement inbound channel message handling for real-time responses

- Added functionality to handle inbound messages from channels (e.g., Telegram, Discord) by introducing the `handle_channel_inbound_message` function.
- Implemented agent inference loop to process messages and send replies back to the originating channel via the REST API.
- Enhanced logging for better tracking of message reception and response handling.
- Integrated timeout handling to manage long-running requests effectively.

* style: fix prettier formatting for channel components

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 22:08:17 -07:00

142 lines
5.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# ──────────────────────────────────────────────────────────────────────
# test-channel-messaging.sh
#
# End-to-end test: sends a message from the backend to the user's
# linked Telegram account via the Rust core RPC.
#
# Usage:
# bash scripts/test-channel-messaging.sh
# bash scripts/test-channel-messaging.sh "Custom message text"
#
# Prerequisites:
# - Active session token (login via the app first)
# - Telegram account linked (completed managed DM flow)
# - Core binary built: cargo build --bin openhuman-core
# ──────────────────────────────────────────────────────────────────────
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
# Load env
if [[ -f "$ROOT_DIR/scripts/load-dotenv.sh" ]]; then
source "$ROOT_DIR/scripts/load-dotenv.sh" 2>/dev/null || true
fi
CORE_BIN="${OPENHUMAN_CORE_BIN:-}"
if [[ -z "$CORE_BIN" ]]; then
CORE_BIN="$ROOT_DIR/target/debug/openhuman-core"
if [[ ! -x "$CORE_BIN" ]]; then
echo "Building openhuman-core..."
cargo build --manifest-path "$ROOT_DIR/Cargo.toml" --bin openhuman-core 2>&1 | tail -2
fi
fi
MESSAGE="${1:-Hello from OpenHuman! 🚀 This is a test message sent via the channel messaging API.}"
divider() { echo "────────────────────────────────────────────────"; }
echo ""
echo "🧪 Channel Messaging E2E Test"
divider
# ── Step 1: Check session ────────────────────────────────────────────
echo ""
echo "1️⃣ Checking session..."
AUTH_STATE=$("$CORE_BIN" auth get_state 2>&1 | grep -A20 '{' || true)
IS_AUTH=$(echo "$AUTH_STATE" | grep -o '"isAuthenticated": *true' || true)
if [[ -z "$IS_AUTH" ]]; then
echo " ❌ Not authenticated. Please login via the app first."
echo " Auth state:"
echo "$AUTH_STATE" | head -10
exit 1
fi
echo " ✅ Authenticated"
# ── Step 2: Validate session against backend ─────────────────────────
echo ""
echo "2️⃣ Validating session with backend (GET /auth/me)..."
ME_RESULT=$("$CORE_BIN" auth get_me 2>&1 || true)
if echo "$ME_RESULT" | grep -qi "401\|Invalid token\|expired\|failed"; then
echo " ❌ Session token expired or invalid."
echo " $ME_RESULT" | tail -3
echo ""
echo " Please re-login via the app to get a fresh token."
exit 1
fi
TELEGRAM_ID=$(echo "$ME_RESULT" | grep -o '"telegramId": *"[^"]*"' | head -1 | sed 's/.*: *"//;s/"//' || true)
USERNAME=$(echo "$ME_RESULT" | grep -o '"username": *"[^"]*"' | head -1 | sed 's/.*: *"//;s/"//' || true)
echo " ✅ Session valid — user: ${USERNAME:-unknown}, telegramId: ${TELEGRAM_ID:-not linked}"
if [[ -z "$TELEGRAM_ID" ]]; then
echo ""
echo " ⚠️ No telegramId found on your profile."
echo " Complete the Telegram managed DM linking flow first."
echo " (Skills page → Telegram → Login with OpenHuman → click Start in Telegram)"
exit 1
fi
# ── Step 3: Send a text message via Telegram ─────────────────────────
echo ""
echo "3️⃣ Sending message to Telegram..."
echo " Channel: telegram"
echo " Message: $MESSAGE"
divider
SEND_RESULT=$("$CORE_BIN" channels send_message \
--channel telegram \
--message "{\"text\": \"$MESSAGE\"}" 2>&1 || true)
echo "$SEND_RESULT" | grep -A20 '{' | head -20
if echo "$SEND_RESULT" | grep -qi '"success": *true\|"messageId"'; then
echo ""
echo " ✅ Message sent successfully! Check your Telegram."
else
echo ""
echo " ❌ Message send may have failed. Check output above."
fi
# ── Step 4: Send a message with a button ─────────────────────────────
echo ""
echo "4️⃣ Sending message with inline button..."
BUTTON_MSG=$("$CORE_BIN" channels send_message \
--channel telegram \
--message '{"text": "Here is a link for you:", "buttons": [{"label": "OpenHuman GitHub", "url": "https://github.com/tinyhumansai/openhuman"}]}' 2>&1 || true)
echo "$BUTTON_MSG" | grep -A20 '{' | head -15
if echo "$BUTTON_MSG" | grep -qi '"success": *true\|"messageId"'; then
echo " ✅ Button message sent!"
else
echo " ❌ Button message may have failed."
fi
# ── Step 5: List threads ─────────────────────────────────────────────
echo ""
echo "5️⃣ Listing Telegram threads..."
THREADS=$("$CORE_BIN" channels list_threads \
--channel telegram 2>&1 || true)
# Show the JSON result (skip the banner lines)
echo "$THREADS" | tail -5
echo " ✅ Threads listed."
# ── Done ─────────────────────────────────────────────────────────────
divider
echo ""
echo "✅ Channel messaging E2E test complete."
echo ""
echo "Available RPC methods:"
echo " openhuman.channels_send_message — Send rich message (text, photo, stickers, buttons)"
echo " openhuman.channels_send_reaction — React to a message with emoji"
echo " openhuman.channels_create_thread — Create a conversation thread"
echo " openhuman.channels_update_thread — Close or reopen a thread"
echo " openhuman.channels_list_threads — List threads for a channel"
echo ""