Files
openhuman/docs/src/01-architecture.md
T
Steven EnamakelandGitHub bfaabd3b86 fix/rename (#20)
* chore: update AlphaHuman version to 0.49.3 and configure updater plugin in tauri.conf.json

- Bumped the AlphaHuman package version in Cargo.lock to 0.49.3.
- Added updater configuration in tauri.conf.json to enable automatic updates with specified endpoints.

* refactor: rename AlphaHuman to OpenHuman across the codebase

- Updated all instances of "AlphaHuman" to "OpenHuman" in comments, tooltips, and constants to reflect the new branding.
- Adjusted relevant documentation and prompts to ensure consistency with the new name.

* refactor: update documentation and configurations to reflect OpenHuman branding

- Replaced all instances of "AlphaHuman" with "OpenHuman" in documentation, comments, and configuration files to ensure consistency with the new branding.
- Updated deep link URLs and related authentication flows to use the new "openhuman://" scheme.
- Adjusted paths and references in the skills system and other related files to align with the new project name.te

* refactor: standardize OpenHuman references and update configurations

- Replaced all instances of "AlphaHuman" with "OpenHuman" across documentation, comments, and configuration files to maintain branding consistency.
- Updated URLs and paths to reflect the new "openhuman://" scheme.
- Adjusted environment variable names and related settings to align with the new project identity.
- Enhanced documentation for clarity and accuracy regarding the OpenHuman framework.r

* chore: update subproject commit reference in skills directory

* refactor: update backend URL to reflect new service domain

- Changed default backend URL from "https://api.openhuman.xyz" to "https://api.tinyhumans.ai" in both JavaScript and Rust configuration files.
- Ensured consistency across the codebase regarding the new backend service endpoint.

* feat: introduce identity and migration modules for OpenHuman

- Added a new identity module to support AIEOS v1.1 JSON format, including structures for identity, psychology, linguistics, motivations, capabilities, physicality, history, and interests.
- Implemented a migration module to facilitate data migration from OpenClaw memory, including SQLite and Markdown sources, with detailed reporting on migration statistics and warnings.
- Established utility functions for handling multimodal content and image processing within the OpenHuman framework.
- Enhanced the agent system with new dispatcher and classifier functionalities to improve tool management and message classification.

* chore: remove Android project files and configurations

- Deleted various Android project files including .editorconfig, .gitignore, build.gradle.kts, gradle.properties, and others to clean up the project structure.
- Removed all related resources, layouts, and source files from the Android app directory to streamline the codebase.
- This cleanup is part of a larger effort to refactor and simplify the project structure.

* refactor: update login flow and remove Telegram integration

- Removed the TelegramLoginButton component and its references from the OAuthLoginSection, streamlining the login options.
- Updated the AppRoutes to remove the login route, reflecting changes in the authentication flow.
- Enhanced the RotatingTetrahedronCanvas component with improved geometry and lighting effects for better visual presentation.
- Adjusted the TypewriterGreeting component's styling for consistency.
- Cleaned up the Welcome page to integrate the OAuthLoginSection directly, improving user experience.

* chore: update subproject commit reference in skills directory

* chore: update test configurations and improve test assertions

- Modified test scripts in package.json to use a specific Vitest configuration file for consistency.
- Updated assertions in loader tests to ensure loading durations are non-negative.
- Enhanced tool loading tests to clarify expected behavior regarding localStorage and cache management.
- Adjusted agent tool registry tests to improve error handling and ensure accurate statistics.
- Refined device detection tests to reflect updated fallback URLs.

* fix: enhance parameter formatting and remove unused components

- Updated the `formatParameters` function to handle cases where schema properties are empty, returning a more informative response.
- Deleted the `DownloadScreen` component and associated device detection utilities to streamline the codebase and remove unused functionality.
- Adjusted tests to reflect changes in the tool loading and agent tool registry, ensuring accuracy in assertions.

* chore: simplify Vitest configuration by removing unused include patterns

- Updated the Vitest configuration to remove unnecessary test file patterns, streamlining the test setup for better clarity and maintainability.

* refactor: update paths and comments for AI configuration and file watching

- Modified Vite configuration to ignore only the `src-tauri` directory.
- Updated logging messages to reflect the correct path for writing AI configuration files.
- Adjusted fetch calls in the file watcher to use the new path for `TOOLS.md`.
- Revised comments and logic in Rust code to clarify the handling of AI configuration file paths, including legacy fallback options.

* chore: remove unused updater secrets from GitHub Actions workflow

- Deleted UPDATER_GIST_URL and UPDATER_GIST_ID environment variables from the package-and-publish workflow, streamlining the configuration.

* chore: comment out Vitest thresholds for clarity

- Commented out the thresholds section in the Vitest configuration to improve clarity and maintainability, as it is currently not in use.

* ran formatter

* chore: update updater public key in tauri configuration

- Replaced the existing public key in the updater plugin configuration with a new value to ensure proper functionality and security.

* chore: update ESLint configuration and refactor components

- Added `localStorage` and `sessionStorage` as readonly globals in ESLint configuration for better linting support.
- Removed unused imports from `SkillsPanel.tsx` to clean up the code.
- Changed the type of `watcherInterval` in `file-watcher.ts` for improved type safety.
- Refactored toast management logic in `Intelligence.tsx` to enhance clarity and maintainability.
- Simplified import statements in `IntelligenceProvider.tsx` for consistency.
- Streamlined object property shorthand in `agentToolRegistry.ts` for cleaner code.

* refactor: improve error handling and type safety in Intelligence component

- Enhanced toast notification logic to defer state updates, preventing potential issues with setState in effects.
- Updated the source filter dispatch to use a more specific type for improved type safety.

* refactor: enhance type safety across various components and services

- Updated type definitions from `any` to `unknown` in multiple files to improve type safety and prevent potential runtime errors.
- Refactored state management in `TauriCommandsPanel` to use more specific types.
- Adjusted context and parameters in several interfaces to ensure consistent typing.
- Added ESLint directive to `polyfills.ts` for intentional global assignments.
- Streamlined type handling in utility functions and API responses for better clarity and maintainability.

* refactor: streamline import statements and improve code clarity

- Consolidated import statements in `agentToolRegistry.ts` and `intelligenceSlice.ts` for better readability.
- Simplified the `createTestStore` function in `test-utils.tsx` to enhance code conciseness.
- Cleaned up the `isExecutionStepProgressEvent` function in `intelligence-chat-api.ts` for improved clarity and maintainability.
2026-03-26 17:04:46 -07:00

6.1 KiB

Architecture Overview

System Architecture

The Outsourced platform is built on a layered architecture supporting:

  • Redux-based state management with persistence
  • Socket.io real-time communication
  • Telegram MTProto integration via service layer
  • 81-tool MCP (Model Context Protocol) system for AI interactions
  • Multi-step onboarding flow
  • URL-based settings modal system
  • Deep link authentication handoff
  • Cross-platform desktop compatibility (mobile not supported in product docs yet)

Entry Points

File Purpose
main.tsx React root, polyfill imports, lazy deep link listener init
App.tsx Provider chain: Redux → PersistGate → Socket → Telegram → HashRouter
AppRoutes.tsx Route definitions with route guards
polyfills.ts Node.js polyfills (Buffer, process, util) for telegram npm package

Provider Chain

The application wraps components in a specific order due to dependencies:

Redux Provider
  └─ PersistGate (rehydrate auth + telegram state from localStorage)
      └─ UserProvider
          └─ SocketProvider (manages Socket.io connection + MCP init)
              └─ TelegramProvider (manages MTProto connection)
                  └─ HashRouter
                      └─ AppRoutes (route definitions + SettingsModal overlay)

Why this order matters:

  1. Redux must be outermost for state access
  2. PersistGate rehydrates persisted state before rendering
  3. SocketProvider depends on Redux auth token
  4. TelegramProvider depends on Redux telegram state
  5. HashRouter provides navigation context to all routes

Module Relationships

main.tsx (entry)
  ↓
App.tsx (providers chain)
  ├─ Redux Store ←→ Persist
  ├─ SocketProvider
  │   ├─ listens to auth.token changes
  │   ├─ calls socketService.connect(token)
  │   └─ init MCP server when socket connected
  ├─ TelegramProvider
  │   ├─ listens to telegram state
  │   ├─ calls mtprotoService.initialize(userId)
  │   └─ exposes useTelegram hook
  └─ HashRouter + AppRoutes
      ├─ ProtectedRoute ← checks Redux auth + onboarded
      ├─ PublicRoute ← redirects authenticated users
      ├─ pages/Home
      │   ├─ uses useUser hook → calls userApi
      │   └─ uses useNavigate → opens /settings
      ├─ pages/Login
      │   ├─ uses TelegramLoginButton
      │   └─ calls deeplink.ts functions
      └─ SettingsModal
          ├─ listens to location.pathname
          ├─ uses useSettingsNavigation hook
          └─ renders panels with Redux state

Services Layer

Services Layer:
  ├─ apiClient (singleton)
  │   ├─ reads auth.token from Redux
  │   └─ makes HTTP requests to BACKEND_URL
  ├─ socketService (singleton)
  │   ├─ manages Socket.io connection
  │   └─ emits/listens for MCP messages
  └─ mtprotoService (singleton)
      ├─ manages TelegramClient
      └─ stores session in Redux telegram.byUser[userId].sessionString

MCP System

MCP System:
  ├─ TelegramMCPServer (instantiated in SocketProvider)
  ├─ SocketIOMCPTransport (wraps socketService)
  └─ 81 tools in telegram/tools/
      ├─ each tool calls mtprotoService
      └─ results returned via socket transport to backend MCP client

Data Flow

  1. User authenticates in browser → receives loginToken
  2. Browser redirects to openhuman://auth?token=<loginToken>
  3. Desktop app catches deep link via Tauri plugin
  4. desktopDeepLinkListener invokes Rust exchange_token command
  5. Rust calls backend POST /auth/desktop-exchange (CORS-free)
  6. Backend returns { sessionToken, user }
  7. App stores session in Redux, navigates to /onboarding or /home

Socket.io Connection Flow

  1. SocketProvider detects auth.token change
  2. Calls socketService.connect(token)
  3. On successful connection, initializes MCP server
  4. MCP server registers 81 Telegram tools
  5. Backend can invoke tools via JSON-RPC over Socket.io

Telegram Connection Flow

  1. TelegramProvider detects auth state
  2. Calls mtprotoService.initialize(userId) and connect() in parallel
  3. MTProto client authenticates with Telegram servers
  4. Session string stored in Redux telegram.byUser[userId].sessionString
  5. Chats/messages fetched and stored in Redux

Key Patterns

No localStorage Usage

  • Rule: Avoid localStorage; use Redux with persistence instead
  • Exceptions: Redux-persist's storage adapter (persistence layer)
  • Telegram session: Stored in telegram.byUser[userId].sessionString

Route Guard Pattern

  • PublicRoute: Redirects authenticated users away
  • ProtectedRoute: Requires token and optionally isOnboarded
  • DefaultRedirect: Fallback based on auth state

Settings Modal Pattern

  • Renders via createPortal when location.pathname.startsWith('/settings')
  • URL-based navigation without affecting main route
  • Uses useSettingsNavigation hook

MCP Tool Pattern

Each tool exports a handler:

export const toolName: TelegramMCPToolHandler = {
  call: async (args, { telegramClient, userId }) => {
    // Perform Telegram API operation
    return { success: true, data: result };
  },
};

File Organization

Feature-Based Structure

  • pages/ - Full-page route components
  • pages/onboarding/ - Onboarding flow with steps
  • components/settings/ - Settings modal system
  • lib/mcp/telegram/tools/ - Individual MCP tools

Slice-Based State

  • store/authSlice.ts - Authentication
  • store/socketSlice.ts - Socket connection
  • store/userSlice.ts - User profile
  • store/telegram/ - Complex Telegram state (5 files)

Singleton Services

  • services/socketService.ts - Socket.io
  • services/mtprotoService.ts - Telegram MTProto
  • services/apiClient.ts - HTTP REST

Next: State Management