Commit Graph
413 Commits
Author SHA1 Message Date
YellowSnnowmannandGitHub fb8987bcad Improve inline autocomplete reliability, sanitization, and debug logging (#407)
* Enhance autocomplete functionality and logging. Increased debounce time for autocomplete suggestions and added minimum context character requirement. Improved inline suggestion handling with new cleanup logic for tab acceptance. Introduced a new logging option for autocomplete-only logs in CLI. Updated various components to support these changes, including sanitization and error handling in the autocomplete engine.

* Add autocomplete CLI adapter for improved argument handling

This commit introduces a new module, , which encapsulates the argument parsing and logging logic specific to the autocomplete namespace in the CLI. Key features include extraction of leading verbose flags, handling of the  flag, and improved help message printing. The existing CLI command handling has been refactored to utilize this new adapter, enhancing code organization and maintainability.

* Refactor inline completion sanitization and enhance context handling
2026-04-07 09:11:42 -07:00
000b40bf43 fix(local_ai): Windows Ollama discovery + DirectML GPU acceleration for GLiNER RelEx (#416)
Ollama was not found on Windows because find_system_ollama_binary lacked
common Windows install paths (%LOCALAPPDATA%\Programs\Ollama). The server
spawn also silently swallowed errors, and the NSIS installer fallback
didn't check system paths after install.

GLiNER RelEx ONNX sessions were CPU-only — no execution providers were
configured. Now offers DirectML (Windows), CoreML (macOS), and CUDA as
GPU backends with automatic fallback. Updated the release to v0.5-onnx.2
with a DirectML-enabled onnxruntime.dll. Bundle completeness now requires
the platform DLL and verifies checksums to trigger re-download on update.

Changes:
- Add Windows common paths to find_system_ollama_binary (install.rs)
- Log and return spawn errors in start_and_wait_for_server (ollama_admin.rs)
- Fall back to find_system_ollama_binary after Windows installer (ollama_admin.rs)
- Add platform_execution_providers() with DirectML/CoreML/CUDA (relex.rs)
- Require ORT DLL in bundle_complete check (relex.rs)
- Verify platform DLL checksums in managed_bundle_complete (relex.rs)
- Update release URL and SHA256 hashes for v0.5-onnx.2 (relex.rs)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:11:19 -07:00
Steven EnamakelandGitHub 4afa751024 feat(memory): global singleton, CLI, graph extraction fixes & light storage (#383)
* feat(memory): add CLI support for memory commands

- Introduced a new `memory` subcommand in the CLI for memory ingestion, graph inspection, and debugging.
- Implemented various subcommands including `ingest`, `docs`, `graph`, `query`, and `namespaces` for comprehensive memory management.
- Updated the CLI entry point to route the `memory` command appropriately, enhancing the command-line interface functionality.

* refactor(memory_cli): streamline memory command ingestion and improve error handling

- Simplified the ingestion process by removing unnecessary workspace directory creation and embedding logic.
- Updated the ingestion function to utilize the `create_memory_client` for better client management.
- Changed the limit parameter type from `usize` to `u32` for consistency and improved error handling in command arguments.
- Enhanced logging for ingestion start to focus on model name only, removing redundant extraction mode information.

* refactor(memory): implement global memory client singleton for improved resource management

- Introduced a new `global.rs` module to manage a process-global memory client singleton, ensuring consistent access across subsystems.
- Updated `create_memory_client` to utilize the global client, enhancing memory management and reducing resource contention.
- Refactored various modules to replace local memory client instances with the global singleton, improving performance and reliability.
- Adjusted CLI and screen intelligence components to leverage the global memory client for document persistence and ingestion operations.

This refactor enhances the architecture by centralizing memory client management, leading to better resource utilization and simplified code structure.

* feat(memory): add put_doc_light for screen-intelligence, skip vectors/graph

Screen-intelligence captures are too frequent and ephemeral to justify
vector embedding and GLiNER graph extraction per frame. Adds a lightweight
storage path (put_doc_light) that persists the document row and markdown
file without chunking, embedding, or graph extraction.

Three-tier storage:
- put_doc_light: DB + markdown only (screen-intelligence)
- put_doc: DB + markdown + vectors + background graph (skill sync)
- ingest_doc: full synchronous pipeline (CLI, debugging)

* style: apply cargo fmt formatting

* fix: add missing window_id field in AppContext test helper

* fix(test): fall back to per-call MemoryClient when global not initialized

In tests with isolated OPENHUMAN_WORKSPACE, the process-global singleton
may not be initialized or may point at the wrong directory. Fall back to
creating a client from Config (which respects env vars) when the global
is not ready.

* fix(test): use per-call MemoryClient for screen-intelligence persistence

put_doc_light does no background work (no vectors, no graph), so a
per-call client created from Config is safe and avoids the global
singleton which may point at a different workspace in test suites.
2026-04-06 22:45:08 -07:00
a98817917c feat(screen-intelligence): standalone server with OCR + vision pipeline (#382)
* feat(screen-intelligence): add new commands for diagnostics and vision processing

- Introduced `doctor` command for system readiness diagnostics, checking permissions and platform support.
- Added `vision` command to analyze frames and persist vision summaries.
- Updated CLI usage documentation to reflect new command options and improved verbosity handling.
- Enhanced the `run_server` function to provide detailed endpoint information for better user guidance.

This update improves the functionality and usability of the screen intelligence CLI, enabling better diagnostics and vision processing capabilities.

* feat(screen-intelligence): update CLI endpoints for status monitoring

- Added `tower-http` dependency for enhanced HTTP capabilities.
- Updated endpoint documentation in `run_server` to reflect changes from SSE to long-polling for status updates.
- Renamed `/events` endpoint to `/watch` with a query parameter for interval control, improving clarity and usability.

This update enhances the screen intelligence CLI by providing more flexible status monitoring options.

* feat(screen-intelligence): integrate standalone server for screen intelligence

- Added a new `server` module to handle the standalone screen intelligence server functionality.
- Updated CLI commands to include an `--auto-start` option for initiating capture sessions on server boot.
- Enhanced the `run_server` function to provide detailed endpoint information and improved logging for server status.
- Integrated the screen intelligence engine with JSON-RPC and REST endpoints for better debugging and usability.

This update significantly enhances the screen intelligence capabilities by allowing it to run independently and providing more flexible configuration options.

* refactor(screen-intelligence): simplify CLI options and server configuration

- Removed the `--port` and `--auto-start` options from the CLI for the `screen-intelligence run` command, streamlining the command usage.
- Updated the server configuration to focus on session duration and logging, enhancing clarity and usability.
- Adjusted the documentation to reflect the new command structure and improved logging details for the screen intelligence server.

This refactor improves the user experience by simplifying command options and enhancing the clarity of server operations.

* feat(screen-intelligence): enhance screenshot management and CLI options

- Updated the CLI usage documentation to include the new `--keep` option for retaining screenshots after processing.
- Modified the server configuration to support the `keep_screenshots` flag, allowing for immediate saving of screenshots to disk.
- Enhanced the `run_server` function to reflect the updated configuration and logging details regarding screenshot retention.
- Improved the capture logic to prioritize window ID for more reliable screenshot capturing on macOS.

These changes improve the usability and functionality of the screen intelligence feature by providing better control over screenshot management.

* refactor(accessibility): improve capture logic and window ID handling

- Updated the capture mode logic to prioritize reliable window ID capture on macOS, falling back to fullscreen capture to avoid issues with region-based capture.
- Refactored the method for resolving the frontmost window ID to utilize Swift for better performance and reliability, replacing the previous JavaScript-based approach.
- Enhanced the frame processing in the accessibility engine to track processed timestamps, preventing re-analysis of the same screenshot and improving efficiency.
- Adjusted the vision summary parsing to support both JSON and plain text formats, ensuring better compatibility and usability.

These changes enhance the reliability and performance of the accessibility features, particularly in macOS environments.

* feat(accessibility): integrate Apple Vision OCR and enhance LLM context analysis

- Implemented Apple Vision OCR for extracting text from screenshots, improving accuracy and reducing hallucination.
- Refactored the vision processing flow to include structured prompts for LLM context analysis, enhancing the quality of the output summary.
- Updated the vision summary structure to include detailed fields such as APP, DOING, FOCUS, and MOOD, providing clearer insights into the captured content.
- Improved error handling and logging for image processing and OCR operations, ensuring better reliability and debugging capabilities.

These changes significantly enhance the accessibility engine's ability to analyze and summarize screen content effectively.

* refactor(screen-intelligence): enhance capture logic and summary structure

- Improved capture mode handling to prioritize window ID availability, with a fallback to bounds-based capture before defaulting to fullscreen.
- Updated the vision summary structure to clearly separate synthesized summaries, visual context, and raw OCR text for better clarity and usability.
- Enhanced logging to provide more informative output during capture operations, aiding in debugging and performance monitoring.

These changes improve the reliability and clarity of the screen intelligence features, particularly in managing capture contexts and summarizing visual information.

* refactor(accessibility): enhance capture logic to reject fullscreen fallback

- Updated the screen capture logic to prevent falling back to fullscreen mode when no valid window ID or bounds are available, improving privacy and user intent.
- Added detailed logging for cases where fullscreen capture is refused, aiding in debugging and understanding capture decisions.
- Introduced tests to ensure that the new logic correctly rejects fullscreen capture under invalid conditions, enhancing reliability.

These changes improve the accessibility engine's handling of screen captures, ensuring that only relevant content is captured.

* feat(screen-intelligence): implement capture and processing workers for enhanced vision analysis

- Introduced a dedicated `capture_worker` to manage screenshot capturing from the foreground context, ensuring efficient frame handling and immediate saving of screenshots when configured.
- Added a `processing_worker` to analyze captured frames using Apple Vision OCR and LLM, synthesizing insights and persisting results to unified memory.
- Refactored the `AccessibilityEngine` to integrate these workers, improving the overall architecture and separation of concerns in the screen intelligence module.
- Enhanced logging throughout the capture and processing workflows for better debugging and performance monitoring.

These changes significantly improve the screen intelligence capabilities by enabling real-time capture and analysis of visual data, enhancing user experience and functionality.

* Merge remote-tracking branch 'upstream/main' into fix/screen-intgellignce-2

* refactor(screen-intelligence): improve type handling and visibility in capture and processing modules

- Updated the calculation of baseline milliseconds in `capture_worker` to ensure proper type handling with floating-point division.
- Made several fields in `SessionRuntime` and `EngineState` public for better accessibility within the crate.
- Changed the visibility of the `analyze_frame` function in `processing_worker` to public within the crate, allowing it to be called from `engine.rs`.

These changes enhance type safety and improve the modularity of the screen intelligence components, facilitating better integration and usage across the codebase.

* refactor(screen-intelligence): update visibility and helper function usage in engine and processing modules

- Changed the `SessionRuntime` struct to be public within the crate, enhancing accessibility.
- Updated the `analyze_frame` function parameter to use a reference instead of a direct reference to the `AccessibilityEngine`, improving clarity.
- Refactored calls to `persist_vision_summary` to utilize the helper function from the `super::helpers` module, promoting better organization and code reuse.

These changes streamline the code structure and improve the modularity of the screen intelligence components.

* feat(screen-intelligence): introduce input handling and autocomplete features

- Added a new `input.rs` module to manage input actions, including keyboard/mouse automation and predictive text functionalities.
- Implemented methods for handling input actions, generating autocomplete suggestions, and committing selected suggestions within the `AccessibilityEngine`.
- Created a `state.rs` module to encapsulate engine state management, including session runtime and engine state structures.
- Enhanced the `engine.rs` module to support session lifecycle management and integrate new input functionalities.
- Introduced a `vision.rs` module for vision-related query methods, improving the overall architecture and modularity of the screen intelligence components.

These changes significantly enhance user interaction capabilities and streamline the management of input actions and vision processing.

* fix(screen-intelligence): update worker imports to use state module

Workers imported AccessibilityEngine from engine.rs but it was moved
to state.rs during the refactor. Fix the import paths.

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

* refactor(screen-intelligence): clean up formatting and improve readability in various modules

- Reformatted print statements in `screen_intelligence_cli.rs` for better readability.
- Simplified assertions in tests within `capture.rs` to enhance clarity.
- Streamlined function definitions and calls in `focus.rs`, `engine.rs`, and `processing_worker.rs` for improved code organization.
- Updated import statements in `mod.rs` and `server.rs` to maintain consistency and clarity.

These changes enhance the overall readability and maintainability of the codebase, promoting better coding practices across the screen intelligence components.

* refactor(screen-intelligence): update import paths for AccessibilityEngine and EngineState

- Changed the import statements in `tests.rs` to source `AccessibilityEngine` and `EngineState` from the `state` module instead of the `engine` module.
- This adjustment aligns with recent refactoring efforts to improve module organization and maintainability.

These changes enhance code clarity and ensure consistency in module usage across the screen intelligence components.

* fix(screen-intelligence): fix test compilation and assertions

- Update test imports from engine to state module
- Add mock env var path to processing_worker::analyze_frame for test support
- Update parser tests for plain-text mode (non-JSON fallback)
- Handle missing window_id gracefully in capture_scheduler test

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

* refactor(screen-intelligence): enhance code clarity and performance in various modules

- Updated command-line usage documentation in `screen_intelligence_cli.rs` to reflect new options.
- Improved string handling for truncation in `run_start_session` and `run_vision` functions to use character counts instead of byte lengths, ensuring accurate truncation for multi-byte characters.
- Added intentional blocking sleep in `resolve_frontmost_window_id` to minimize impact on the Tokio runtime during app switches.
- Implemented a consistent default confidence score in vision processing and improved YAML escaping in `persist_vision_summary`.
- Refactored session management in `capture_worker` and `engine` modules to reduce lock contention and improve performance during I/O operations.

These changes enhance the overall performance, maintainability, and user experience of the screen intelligence components.

* fix(tests): update confidence assertion in vision summary test

- Adjusted the expected confidence value in the `parse_vision_missing_fields` test to reflect the new default confidence score of 0.8, ensuring consistency across JSON and plain-text branches.

This change improves the accuracy of the test and aligns it with recent updates in the vision processing logic.

* refactor(screen-intelligence): improve code formatting and readability in various modules

- Enhanced string formatting for truncation in `run_vision` to improve clarity.
- Reformatted variable declarations in `capture_worker` for better readability.
- Updated YAML escaping logic in `helpers.rs` for consistency and clarity.

These changes contribute to improved maintainability and readability of the codebase.

* refactor(screen-intelligence): reorganize analyze_frame function for improved flow

- Moved configuration validation to the beginning of the `analyze_frame` function to ensure proper setup before processing.
- Reintroduced the Apple Vision OCR and Vision LLM steps in the correct order, enhancing the logical flow of the analysis process.

These changes improve the readability and maintainability of the code, ensuring a clearer structure for future modifications.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 21:16:49 -07:00
8627cee960 Feat/overlay (#378)
* feat(autocomplete): add overlay TTL configuration to AutocompletePanel

- Introduced `overlay_ttl_ms` parameter to the Autocomplete configuration, allowing users to set the overlay display duration.
- Updated AutocompletePanel to include a new input field for adjusting the overlay TTL in milliseconds.
- Enhanced parsing and saving logic to handle the new configuration parameter.
- Added corresponding tests to ensure functionality and validate the new overlay TTL feature.

This update improves user control over the autocomplete overlay behavior, enhancing the overall user experience.

* Refactor accessibility code for improved readability and consistency

- Simplified log statements in `precompile_helper_background` for better clarity.
- Reformatted `detect_input_monitoring_permission` check in `keys.rs` for enhanced readability.
- Rearranged imports in `mod.rs` to maintain consistent structure.
- Improved formatting of `ElementBounds` initialization across multiple test cases in `overlay.rs` and `types.rs` for better visual alignment.
- Enhanced test context creation in `types.rs` for improved clarity.

These changes enhance code maintainability and readability across the accessibility module.

* fix(overlay): parent core RPC, voice toggle, and debug for #342

- Pass OPENHUMAN_OVERLAY_PARENT_RPC_URL from sidecar spawn and strip inherited
  OPENHUMAN_CORE_PORT so the overlay no longer fights for the parent listen port.
- Overlay UI uses HTTP JSON-RPC to the parent sidecar for globe, debug, and voice
  STT so state matches the main app; add parentCoreRpc helper mirroring legacy
  method aliases.
- Skip embedded JSON-RPC server when parent URL is set; use
  OPENHUMAN_OVERLAY_EMBEDDED_CORE_PORT (default 7799) for standalone dev.
- Fix screen intelligence status method name; add voice_status polling, STT
  section, collapsible debug summary, and connection banner when core is unreachable.
- Voice capture switch gates the mic with real STT availability from voice_status.

Closes #342

Made-with: Cursor

* fix: address CodeRabbit review on overlay/autocomplete (PR #378)

- helper: correlate JSON-RPC replies with monotonic request ids; discard mismatched
  lines until deadline (fixes stale response after timeout).
- helper: serialize Swift compile via HELPER_COMPILE_LOCK (precompile vs first use).
- Overlay Tab hint: pass tab_hint from Rust from accept_with_tab; Swift hides hint when empty.
- keys: re-check Input Monitoring on an interval when denied so grant without restart works.
- engine: use non-zero confidence placeholder (0.75) until inline_complete returns scores.
- overlay dedupe: suppress identical badge only within 400ms, not for process lifetime.

Co-authored-by: Code review feedback <noreply@github.com>
Made-with: Cursor

* fix(ci): resolve clippy and warning issues for Rust gates

- Use match on anchor_bounds in autocomplete overlay (avoid unnecessary unwrap)
- Drop unused test imports in registry_ops and rpc dispatch
- Prefix unused notion_doc_id in subconscious integration test

Made-with: Cursor

* fix(overlay): improve parent RPC URL handling in App component

- Updated the useEffect hook to manage the parent RPC URL more robustly by introducing a mounted flag to prevent state updates on unmounted components.
- Added error handling to set the parent RPC URL to null in case of invocation failure, enhancing the reliability of the component's behavior.

* feat(overlay): implement timeout handling for parent core RPC requests

- Introduced a default timeout for parent core RPC requests, enhancing reliability by preventing indefinite waiting for responses.
- Added an AbortController to manage request timeouts, throwing a specific error message when a timeout occurs.
- Updated the `callParentCoreRpc` function to accept a customizable timeout parameter, improving flexibility for RPC calls.

* fix(overlay): allow stopping active recording regardless of config state

- Updated the main button handler in the App component to always permit stopping an active recording when the status is "listening", improving user experience and control over the recording process.
- Removed redundant code that previously checked the status before stopping the recording, streamlining the logic.

* feat(overlay): update Cargo.lock with new dependencies and versions

- Added new packages including `alsa`, `alsa-sys`, `arboard`, `block`, `cocoa`, `core-foundation`, `core-graphics`, `coreaudio-rs`, `coreaudio-sys`, `cpal`, `crunchy`, and `dasp_sample` to enhance functionality and support for audio processing and system interactions.
- Updated existing dependencies to their latest versions for improved performance and compatibility.
- Modified the `show_overlay` function in `ops.rs` to include an additional parameter, enhancing the overlay display functionality.

* feat(autocomplete): add overlay_ttl_ms parameter to Autocomplete interfaces

- Introduced a new optional parameter `overlay_ttl_ms` to both `AutocompleteSetStyleParams` and `AutocompleteConfig` interfaces, allowing for customizable overlay timeout settings.
- This enhancement improves the flexibility of the autocomplete feature by enabling developers to specify how long the overlay should remain visible.

---------

Co-authored-by: Code review feedback <noreply@github.com>
Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
2026-04-06 21:11:27 -07:00
Steven EnamakelandGitHub e8fd08c800 feat(memory): use timestamp-prefixed document IDs for chronological sorting (#381)
Replace random UUID document IDs with `{unix_seconds}_{8char_hex}` format
so memory documents sort chronologically by filename and ID.
2026-04-06 19:46:15 -07:00
Steven EnamakelandGitHub 3851d1ef67 fix(voice): anti-hallucination, clipboard paste, Fn key reliability (#380)
* fix(dictation): update hotkey default value and documentation

- Changed the default global hotkey for dictation from "CmdOrCtrl+Shift+D" to "Fn" in both the configuration schema and the associated documentation.
- Updated the hotkey parsing function to recognize "Fn" as a valid key, enhancing the flexibility of hotkey configurations.
- Added a test case to ensure the "Fn" key can be parsed correctly, improving the robustness of the hotkey handling functionality.

* fix(voice): update default activation mode and hotkey in configuration

- Changed the default activation mode for voice and dictation from "tap" to "push" in the respective configuration schemas.
- Updated the default hotkey for voice commands from "ctrl+shift+space" to "Fn" across various modules and documentation.
- Adjusted related tests to reflect the new defaults, ensuring consistency in behavior and expectations.

* feat(voice): integrate embedded global voice server startup

- Added a new asynchronous function `start_if_enabled` to the voice server module, which initializes the embedded voice server based on configuration settings.
- Updated the server run logic to check if the voice server should auto-start, enhancing the startup process for the core application.
- Integrated the new server startup function into the main server run logic, ensuring the voice server is launched if enabled in the configuration.

* feat(voice): add VoicePanel for managing voice server settings

- Introduced a new `VoicePanel` component to handle voice server configurations, including startup options, hotkeys, and runtime controls.
- Updated routing in the settings page to include the new voice settings section.
- Enhanced the `useSettingsNavigation` hook to support navigation to the voice settings.
- Added tests for the `VoicePanel` to ensure functionality and reliability of the voice server management features.

* refactor(dictation): update documentation and improve component initialization

- Revised comments in `DictationHotkeyManager` to clarify the component's mounting process within the app tree.
- Removed unused imports and unnecessary state management from `ServiceBlockingGate`, streamlining the component's logic.
- Updated tests for `ServiceBlockingGate` to reflect changes in behavior, ensuring accurate rendering of child components based on service status.
- Enhanced the `Cargo.lock` file by updating dependencies to their latest versions for improved stability and security.

* fix(voice): update default skip_cleanup setting and enhance VoicePanel options

- Changed the default value of `skip_cleanup` in the voice server configuration from `false` to `true` to improve transcription handling.
- Reordered options in the `VoicePanel` component to ensure "Natural cleanup" is displayed alongside "Verbatim transcription" for better user clarity.
- Updated tests to reflect the new default settings and ensure proper functionality of the VoicePanel component.

* feat(window): add window management commands for Tauri application

- Introduced a new module `window.ts` containing functions for managing window visibility and state in a Tauri application.
- Implemented commands to show, hide, toggle visibility, minimize, maximize, close, and set the title of the main window.
- Added checks to ensure commands are only executed in a Tauri environment, enhancing compatibility with web contexts.

* feat(tauriCommands): add comprehensive Tauri command modules

- Introduced multiple new modules for Tauri commands, including `accessibility`, `autocomplete`, `config`, `conscious`, `core`, `cron`, `hardware`, `localAi`, and `window`.
- Each module contains functions for managing specific functionalities such as accessibility permissions, autocomplete suggestions, configuration settings, and hardware interactions.
- Implemented checks to ensure commands are executed only in a Tauri environment, enhancing compatibility and reliability.
- This addition significantly expands the command capabilities of the Tauri application, providing a robust framework for future development.

* feat(voice): enhance audio transcription with initial prompt support

- Added functionality to transcribe audio with an optional initial prompt, allowing for vocabulary bias and improved conversational continuity.
- Updated the `transcribe_pcm_f32` and `transcribe_wav_file` functions to accept an `initial_prompt` parameter, enhancing recognition of specific vocabulary.
- Implemented peak RMS energy tracking during audio recording for silence detection, ensuring recordings below a defined threshold are skipped.
- Enhanced the voice server configuration to include a silence threshold and custom dictionary for better transcription context.
- Introduced methods to build and manage recent transcripts for improved continuity across consecutive recordings.
- Updated tests to validate new features and ensure proper functionality of the transcription process.

* feat(voice): enhance VoiceServerConfig with silence detection and custom dictionary

- Added `silence_threshold` to the `VoiceServerConfig` for improved silence detection, allowing recordings with low RMS energy to be skipped.
- Introduced `custom_dictionary` to bias transcription towards specific vocabulary, enhancing recognition of names and technical terms.
- Updated the `voice_transcribe` and `voice_transcribe_bytes` functions to utilize the new `initial_prompt` parameter for better context during transcription.
- Adjusted the `transcribe_pcm_i16` function to accept additional parameters for improved flexibility in handling audio input.

* feat(voice): add silence threshold and custom dictionary features to VoicePanel

- Implemented a new input for setting the silence threshold, allowing recordings with low RMS energy to be skipped.
- Added functionality for a custom dictionary, enabling users to add specific vocabulary words to improve transcription accuracy.
- Updated the VoiceServerSettings interface and related functions to support the new features, ensuring seamless integration with existing settings.
- Enhanced the UI in the VoicePanel to facilitate user interaction with the new settings.

* feat(voice): propagate silence threshold and custom dictionary to voice server command

- Added `silence_threshold` and `custom_dictionary` parameters to the `run_voice_server_command` function, ensuring these settings are utilized during voice server operations.
- Enhanced integration with the existing voice server configuration to support improved transcription accuracy and silence detection.

* fix(tauriCommands): update import paths for coreRpcClient

- Adjusted import paths for `callCoreRpc` in multiple Tauri command modules to ensure correct referencing from the updated directory structure.
- This change enhances module organization and maintains consistency across the codebase.

* feat(dependencies): update Cargo.lock and Cargo.toml for new packages and versions

- Added new dependencies including `arboard`, `fax`, `fax_derive`, `gethostname`, `half`, `quick-error`, `tiff`, and `x11rb` to enhance functionality and support for clipboard operations, transcription improvements, and system interactions.
- Updated existing dependencies to their latest versions for better performance and compatibility.
- Modified `VoicePanel` to utilize the updated settings and ensure proper handling of voice server configurations.
- Enhanced the text input mechanism to use clipboard-paste for improved reliability in text insertion.

* fix(voice): update skip_cleanup default value and enhance logging

- Changed the default value of `skip_cleanup` in `VoiceServerConfig` from `true` to `false` to align with expected behavior and improve transcription handling.
- Added detailed logging in the transcription cleanup process to provide better insights into the LLM state and cleanup decisions.
- Removed unused functions related to unreliable key releases in hotkey handling to simplify the codebase.
- Updated tests to reflect the new default settings for `skip_cleanup` and ensure proper functionality across components.

* style: apply linter formatting fixes

* fix(voice): remove unused warn import in hotkey module

* test(voice): add silence threshold and custom dictionary to VoicePanel tests

- Updated tests for the VoicePanel component to include new parameters: `silence_threshold` and `custom_dictionary`.
- Ensured that the tests reflect the latest configuration settings for improved transcription accuracy and functionality.
2026-04-06 18:15:48 -07:00
11f718d8bc feat(voice): standalone voice dictation server with hotkey support (#368)
* feat: add standalone voice dictation server with hotkey support

- Introduced a new `voice` subcommand to the CLI for running a standalone voice dictation server that listens for a hotkey, records audio, transcribes it using Whisper, and inserts the result into the active text field.
- Implemented configuration options for the voice server, including hotkey combination, activation mode (tap or push), and an option to skip LLM post-processing.
- Added audio capture functionality using the `cpal` crate and integrated hotkey listening with the `rdev` crate for global key event handling.
- Enhanced the configuration schema to include voice server settings and updated the main configuration structure accordingly.
- Updated relevant modules and tests to ensure consistent behavior and functionality across the application.

This feature enhances user interaction by allowing voice dictation directly into any active text field, improving accessibility and usability.

* feat: add voice dictation server with hotkey support

- Introduced a standalone voice dictation server that listens for a configurable hotkey to start recording audio, transcribes it using whisper, and inserts the transcribed text into the active text field.
- Added CLI support for the `voice` command, allowing users to manage the voice server's configuration, including hotkey and activation mode settings.
- Implemented configuration structures for the voice server, including options for automatic start, hotkey combination, activation mode, and cleanup behavior.
- Enhanced audio capture functionality using the `cpal` library for microphone input and integrated text insertion using the `enigo` library for simulating keyboard input.
- Updated relevant modules and schemas to support the new voice server features, ensuring a cohesive integration within the OpenHuman platform.

* refactor: streamline voice server command and enhance audio capture functionality

- Updated the `run_voice_server_command` function to initialize the configuration with environment overrides instead of loading from a file, improving performance and flexibility.
- Refactored the audio capture logic in `start_recording` to enhance thread management and error handling, ensuring a more robust audio stream setup.
- Improved the handling of audio stream creation and playback, ensuring that all cpal objects are managed on the same thread as required, enhancing stability during recording operations.

* fix: remove unused import in voice server module

- Eliminated the `HotkeyListenerHandle` import from the `server.rs` file, streamlining the code and improving clarity by removing unnecessary dependencies.

* feat(voice): auto-enable LLM cleanup when local model is ready

The postprocessor now checks the local LLM state and automatically
enables transcription cleanup when the model is downloaded and ready,
even if not explicitly configured. Falls back gracefully to raw text
when the LLM is unavailable.

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

* style: apply cargo fmt + prettier formatting

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

* feat(voice): dictation config, hotkey lifecycle, and WebSocket streaming (#332)

Add the foundational infrastructure for voice dictation (EPIC #332):

**Rust core:**
- New `DictationConfig` schema with serde defaults and env var overrides
  (enabled, hotkey, activation_mode, llm_refinement, streaming, interval)
- RPC controllers: `config_get_dictation_settings` / `config_update_dictation_settings`
- WebSocket endpoint `/ws/dictation` for streaming PCM16 transcription
  with periodic partial inference and final LLM refinement
- Microphone permission declaration (`NSMicrophoneUsageDescription`) in
  Tauri macOS bundle config

**Frontend:**
- `useDictationHotkey` hook: fetches config from core RPC, auto-registers
  global hotkey, listens for `dictation://toggle` events
- `DictationHotkeyManager` headless component mounted in App.tsx
- Fix voice RPC response type mismatch: voice handlers return flat results
  (no `{result, logs}` wrapper), so remove incorrect `CommandResponse<T>`
  wrapping from `openhumanVoiceStatus`, `openhumanVoiceTranscribe`,
  `openhumanVoiceTranscribeBytes`, and `openhumanVoiceTts`

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tauri): remove invalid infoPlist config that breaks tauri dev

The `infoPlist` field in tauri.conf.json expects a string path, not an
inline object. Remove it for now — microphone permission will be added
via a proper Info.plist supplement in the production build pipeline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: apply Prettier formatting to dictation files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* format files

* feat(dictation): integrate dictation listener and event broadcasting

- Added a global dictation hotkey listener that activates based on configuration.
- Implemented a web channel bridge to handle dictation events and broadcast them to connected clients.
- Updated the voice module to include the new dictation listener functionality.

This enhances the voice dictation capabilities by ensuring real-time event handling and client communication.

* update code

* format

* feat(voice): enhance voice server configuration and functionality

- Updated `Cargo.toml` to mark voice-related dependencies as optional.
- Introduced `VoiceActivationMode` enum for better control over voice server activation.
- Refactored voice server command handling and dictation event broadcasting to support new features.
- Added conditional compilation for voice features across various modules, ensuring they are only included when enabled.

This commit improves the modularity and configurability of the voice server, allowing for more flexible integration and usage.

* refactor: clean up whitespace and formatting in core and voice modules

- Removed unnecessary blank lines in `cli.rs`, `jsonrpc.rs`, `schemas.rs`, and `socketio.rs` to improve code readability.
- Adjusted import order in `mod.rs` for better organization.

This commit enhances the overall code quality by ensuring consistent formatting across multiple files.

* chore: update Dockerfile and test workflow to install additional system dependencies

- Added installation of system dependencies (cmake, ALSA, X11) in the Dockerfile for improved build support.
- Updated the GitHub Actions workflow to reflect the new dependencies, ensuring consistent environment setup for testing.

This commit enhances the build environment by including necessary libraries for audio and GUI support.

* format

* fix claude

* format

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: oxoxDev <nikhil@tinyhumans.ai>
2026-04-06 16:08:52 -07:00
07b1df4f24 feat(event_bus): wire webhooks, channels & skills through the event bus (#379)
* feat(event_bus): enhance domain event handling across modules

- Added new `DomainEvent` variants for channel and skill events, including `ChannelMessageReceived`, `ChannelMessageProcessed`, `ChannelConnected`, `ChannelDisconnected`, `SkillLoaded`, `SkillStopped`, and `SkillStartFailed`.
- Implemented event publishing in the channels and skills modules to track message processing and skill lifecycle events.
- Created dedicated event bus handler files for the skills and webhooks domains, preparing for future subscriber implementations.
- Updated documentation in `CLAUDE.md` to reflect the new domain events and their usage.

These changes improve the observability and modularity of the system by leveraging an event-driven architecture for cross-module communication.

* feat(event_bus): implement channel and webhook event handling

- Introduced `ChannelInboundSubscriber` to handle inbound channel messages, triggering the agent inference loop and sending replies via the backend REST API.
- Added `WebhookRequestSubscriber` to manage incoming webhook requests, routing them to the appropriate skill and handling responses.
- Updated the global event bus initialization in `bootstrap_skill_runtime` to register both channel and webhook subscribers.
- Enhanced `DomainEvent` with new variants for channel inbound messages and webhook requests, improving event-driven communication across modules.

These changes enhance the modularity and responsiveness of the system by leveraging an event-driven architecture for channel and webhook interactions.

* refactor(event_bus): update domain event documentation and subscriber initialization

- Revised the documentation in `CLAUDE.md` to provide a concise overview of domain events and their associated subscriber files, enhancing clarity for future development.
- Updated the `start_channels` function to initialize `WebhookRequestSubscriber` and `ChannelInboundSubscriber`, ensuring proper event handling for webhooks and channel messages.
- Streamlined the event bus subscriber registration process, reinforcing the modular architecture of the system.

These changes improve the maintainability and usability of the event bus framework, facilitating better cross-module communication.

* style: apply cargo fmt formatting

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

* fix(event_bus): remove duplicate subscriber registration in start_channels

WebhookRequestSubscriber and ChannelInboundSubscriber were registered in
both bootstrap_skill_runtime() and start_channels(), causing events to
be handled twice when both paths run in the same process.

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

* fix(event_bus): prevent subscriber handles from being dropped on function exit

SubscriptionHandle::drop aborts the background task. Since
bootstrap_skill_runtime() returns immediately after setup, the local
handles were dropped, cancelling both subscribers. Use std::mem::forget
to leak the handles so the tasks live for the entire process.

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

* fix(event_bus): ensure subscriber handles persist beyond function exit

Modified the handling of subscriber registration to prevent premature dropping of handles in `bootstrap_skill_runtime()`. This change ensures that the background tasks for subscribers remain active for the entire process lifecycle, enhancing event handling reliability.

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

* fix(webhooks): use proper JSON serialization for error response bodies

Hand-escaped JSON strings only handled double quotes, not backslashes,
newlines, or other control chars. Replaced with serde_json serialization
via an error_body() helper.

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

* fix(webhooks): use proper JSON serialization for error response bodies

Hand-escaped JSON strings only handled double quotes, not backslashes,
newlines, or other control chars. Replaced with serde_json serialization
via an error_body() helper.

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-06 15:58:50 -07:00
5affb1e75f feat(integrations): add agent integration tools for Twilio, Google Places, and Parallel (#375)
* feat(integrations): add agent integration tools for Twilio, Google Places, and Parallel

Add a new `src/openhuman/integrations/` module with 5 backend-proxied tools
that give agents access to phone calls, location search, and web search/extraction.
Each tool calls the backend API which handles external API keys, billing, rate
limiting, and markup — no pricing logic on the client side.

Tools added:
- TwilioCallTool (scope: CLI/RPC only — requires explicit user action)
- GooglePlacesSearchTool, GooglePlacesDetailsTool (scope: All)
- ParallelSearchTool, ParallelExtractTool (scope: All)

Includes IntegrationsConfig with per-integration toggles, shared IntegrationClient
with pricing cache (fetched from backend GET /agent-integrations/pricing), ToolScope
enum for future scope-based filtering, and 33 unit tests.

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

* feat(integrations): add agent integration tools for Twilio, Google Places, and Parallel

Add a new `src/openhuman/integrations/` module with 5 backend-proxied tools
that give agents access to phone calls, location search, and web search/extraction.
Each tool calls the backend API which handles external API keys, billing, rate
limiting, and markup — no pricing logic on the client side.

Tools added:
- TwilioCallTool (scope: CLI/RPC only — requires explicit user action)
- GooglePlacesSearchTool, GooglePlacesDetailsTool (scope: All)
- ParallelSearchTool, ParallelExtractTool (scope: All)

Includes IntegrationsConfig with per-integration toggles, shared IntegrationClient
with pricing cache (fetched from backend GET /agent-integrations/pricing), ToolScope
enum for future scope-based filtering, and 33 unit tests.

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

* fix code

* format code

* Refactor tool integration code to improve clarity and error handling

- Updated `tool_loop.rs` to cache the result of `find_tool` for efficiency and clarity in logging.
- Removed unused `scope` methods from `GooglePlacesSearchTool`, `ParallelSearchTool`, and `TwilioCallTool`, simplifying the codebase.
- Modified `BackendResponse` structure in `mod.rs` to use `Option<T>` for `data`, enhancing error handling when no data is returned from the backend.
- Updated related tests to reflect changes in the response structure and ensure proper handling of cases with no data.

These changes enhance code maintainability and improve the robustness of the integration tools.

* Remove comments

* Add shared HTTP client for integration tools

- Introduced `IntegrationClient` to manage backend interactions, including methods for POST and GET requests with error handling.
- Implemented caching for pricing information fetched from the backend.
- Created a new `types` module to define shared types such as `BackendResponse` and `IntegrationPricing`, enhancing code organization and clarity.
- Updated `mod.rs` to include the new client and types, ensuring proper module structure.

These changes improve the maintainability and functionality of the integration tools by providing a robust client for backend communication.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:45:42 -07:00
45d15cd510 feat: text_input domain module for focused field read/insert/ghost text (#377)
* feat: add text_input domain module for focused field read/insert/ghost text

Thin orchestration layer over accessibility APIs — provides a clean RPC
surface for reading, inserting, and previewing text in OS-focused input
fields. Consumed by autocomplete and voice control.

Five RPC methods: read_field, insert_text, show_ghost, dismiss_ghost,
accept_ghost. Standalone CLI (`openhuman text-input`) and JSON-RPC
server mode for testing.

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

* style: apply cargo fmt to text_input module

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-06 14:41:17 -07:00
88257d3231 feat(update): core sidecar self-update with version detection (#372)
* update

* update

* Refactor code style for consistency and readability in core update module

- Reformatted platform_triple function to improve readability by aligning braces.
- Simplified async function calls and error handling in various places for better clarity.
- Enhanced logging statements for improved observability during update processes.

These changes enhance the maintainability of the codebase while ensuring consistent formatting across the module.

* feat(update): periodic background update checker with config flag

Add a periodic update scheduler that checks GitHub Releases for newer
core binary versions on a configurable interval (default: 1 hour).
Controlled by `[update]` config section with `enabled = true` by default.

- New `UpdateConfig` in config schema (enabled, interval_minutes)
- Env var overrides: OPENHUMAN_AUTO_UPDATE_ENABLED, OPENHUMAN_AUTO_UPDATE_INTERVAL_MINUTES
- Background scheduler spawned at server startup in run_server()
- Reports to health registry as "update_checker" component

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

* fix(update): address PR review — restart path, security, version tracking

- CoreProcessHandle: add set_core_bin/effective_core_bin so ensure_running
  launches the newly staged binary instead of the original one
- check_and_update_core: add `force` param — auto-check uses MINIMUM_CORE_VERSION,
  manual apply_core_update uses latest release (force=true)
- Acquire restart_lock before download+staging to prevent concurrent updates;
  shutdown old process before staging; use unique temp filename
- check_core_update Tauri command now queries GitHub for latest_version and
  returns update_available alongside outdated
- Harden update_apply RPC: validate download URL is GitHub HTTPS, validate
  asset_name is safe filename starting with openhuman-core-, ignore caller
  staging_dir (always use safe default)
- download_and_stage accepts target_version so installed_version reflects the
  staged release, not the running process
- Add update.check and update.apply to about_app capability catalog
- ops.rs: unwrap_or_default → unwrap_or_else with error context
- tauriCommands.ts: convert to arrow-function exports, add latest_version
  and update_available to CoreUpdateStatus interface

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

* format

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:21:13 -07:00
264bfe4081 feat(local_ai): sentiment analysis, GIF decision & Tenor search (#373)
* feat(local_ai): add sentiment analysis, GIF decision, and Tenor search

Extend the local model with two new capabilities:
- Emotion/sentiment analysis (joy/sadness/anger/etc + valence + confidence)
  via a lightweight prompt, designed to run periodically (~hourly)
- GIF decision + Tenor search: local model decides when a GIF response
  fits, generates a search query, and proxies through the backend's new
  Tenor API (POST /agent-integrations/tenor/search)

New RPC endpoints:
- openhuman.local_ai_analyze_sentiment
- openhuman.local_ai_should_send_gif
- openhuman.local_ai_tenor_search

Frontend integrates with cadence-based invocation:
- Reactions: every message (unchanged)
- GIF decisions: every ~7 messages
- Sentiment analysis: every ~1 hour

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

* style: apply formatter fixes

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

* merge
g Please enter the commit message for your changes. Lines starting

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:20:58 -07:00
a36535330b feat: add typed event bus for cross-module decoupling (#374)
* Add event bus integration to channels module

- Introduced an `event_bus` module to facilitate event-driven communication within the channels.
- Updated `ChannelRuntimeContext` to include an `event_bus` field for managing events.
- Enhanced the `start_channels` function to initialize the global event bus and register a tracing subscriber for logging domain events.
- Modified the cron scheduler to publish delivery requests as events, decoupling the delivery logic from specific channel implementations.
- Updated tests to ensure proper initialization and usage of the event bus across various contexts.

This change improves the modularity and scalability of the channels system by leveraging an event-driven architecture.

* refactor: move CronDeliverySubscriber to cron/bus.rs

Each domain owns its event bus handlers — move the delivery subscriber
from channels/cron_delivery.rs into cron/bus.rs so the cron module
contains both its publisher and subscriber logic.

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

* chore: update Dockerfile to install system dependencies and refactor event bus logging

- Added installation of system dependencies (cmake, ALSA, X11) in the Dockerfile to support build requirements.
- Refactored event bus logging in various files for improved readability by consolidating multi-line log statements into single lines.

* chore: update Dockerfile to include webkit2gtk-driver installation

- Added installation of webkit2gtk-driver in the Dockerfile to support additional system dependencies.
- Removed redundant apt-get update command to streamline the installation process.

* docs: add event bus usage guide to CLAUDE.md

Documents the event bus pattern, core types, global access, and the
convention for adding domain events and subscribers so future modules
follow the established design.

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

* chore: update Dockerfile to streamline Node.js installation

- Removed redundant cleanup command after installing yarn in the Dockerfile, simplifying the installation process.

* chore: update Dockerfile to fix yarn installation command

- Removed unnecessary trailing whitespace in the yarn installation command in the Dockerfile, ensuring cleaner code and consistency.

* chore: consolidate system dependencies installation in Dockerfile

- Merged the installation of webkit2gtk-driver with other system dependencies in the Dockerfile to streamline the setup process and reduce the number of RUN commands.

* refactor: enforce EventBus as a singleton

- Make EventBus::create() pub(crate) — only tests can construct isolated
  instances; production code must use the global singleton
- Add subscribe_global() convenience for subscribing from any module
- Remove event_bus field from ChannelRuntimeContext — all modules use
  init_global/publish_global/subscribe_global instead of passing instances
- Update CLAUDE.md to document the singleton API as the only way to use
  the event bus

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

* fix: address PR review — panic safety, init_global, Dockerfiles, tests

- Wrap handler.handle() in catch_unwind so a panicking subscriber does
  not silently kill its task — logs the panic and continues the loop
- Call init_global() in cron scheduler::run() so delivery events are not
  silently dropped when the scheduler starts before start_channels()
- Export DEFAULT_CAPACITY and use it everywhere instead of hard-coded 256
- Add ALSA/X11/input dev libraries to e2e/Dockerfile to mirror CI runner
- Remove duplicate cmake install from .github/Dockerfile
- Add 4 unit tests for CronDeliverySubscriber (ignore non-delivery,
  dispatch to channel, missing channel, send failure)
- Replace scheduler announce-mode test with one that verifies event
  payload is actually received by a subscriber

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-06 14:16:27 -07:00
200db04fc7 feat: scope user data to per-user directories (#370)
* feat(config): add user ID retrieval and workspace scoping for authenticated users

- Implemented `read_authenticated_user_id` to extract the user's ID from `auth-profiles.json`, avoiding a dependency cycle with the credentials module.
- Introduced `maybe_scope_workspace_to_user` to create user-specific workspace directories based on the authenticated user ID, ensuring isolated workspace data.
- Updated the configuration loading process to call `maybe_scope_workspace_to_user`, enhancing user data management.
- Added unit tests for the new functionality, ensuring correct behavior in various scenarios.

This change improves user experience by providing personalized workspace management based on authentication status.

* feat(config): enhance user management with active user state handling

- Added functions to manage the active user state, including `read_active_user_id`, `write_active_user_id`, and `clear_active_user`, allowing for user-specific configuration and workspace isolation.
- Introduced `default_root_openhuman_dir` to standardize the retrieval of the root directory for user data.
- Updated configuration loading to support user-scoped directories, improving the overall user experience by ensuring personalized settings and workspace management.

This change enhances the OpenHuman platform by enabling better user data management and isolation.

* feat(credentials): enhance user directory management during session storage

- Added logic to create and activate user-scoped directories based on the resolved user ID when storing session data, ensuring credentials are saved in the correct location.
- Implemented error handling for directory creation and active user ID writing, with appropriate logging for failures.
- Updated the configuration loading process to reflect the newly activated user directory, improving user-specific settings management.
- Enhanced the `get_data_dir` function to return user-scoped directories if an active user is set, streamlining data access.

This change improves user experience by ensuring that session data is correctly organized and accessible based on user context.

* refactor(tests): update user ID handling and improve test coverage

- Renamed and refactored tests to better reflect functionality, focusing on active user ID management.
- Removed the `write_auth_profiles` helper function and replaced it with direct calls to `write_active_user_id` for clarity.
- Enhanced tests to cover scenarios for reading and clearing active user IDs, ensuring accurate behavior in user-specific configurations.
- Added a new test for building user directory paths, improving overall test coverage for user management features.

This change streamlines the testing process and enhances the clarity of user ID handling in the configuration schema.

* refactor(paths): streamline model and binary path resolution

- Introduced a new `shared_root_dir` function to centralize the logic for determining the shared root openhuman directory, improving code clarity and reducing duplication.
- Updated `workspace_ollama_dir` and `workspace_local_models_dir` functions to utilize the new shared root directory, ensuring consistent path resolution for user-specific and shared resources.
- Enhanced the `model_artifact_path` function to leverage the new directory structure, improving the organization of model artifacts.

This refactor enhances maintainability and clarity in the path management for local AI resources.

* style: apply cargo fmt formatting

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

* refactor(paths): streamline directory management for model artifacts

- Updated the `model_artifact_path` function to utilize a new `shared_root_dir` function, which centralizes the logic for determining the root openhuman directory.
- Enhanced the `config_root_dir` function to improve clarity and maintainability.
- Adjusted the `workspace_ollama_dir` and `workspace_local_models_dir` functions to leverage the new shared directory logic, ensuring consistent path resolution across the application.

These changes improve the organization of directory management and enhance the overall clarity of the codebase.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:51:17 -07:00
df503a23fd Fix: decouple chat from local Ollama, route inference through Rust (#369)
* refactor: streamline Conversations component by removing local response delivery logic

- Eliminated the `deliverLocalResponse` function, which handled segmenting and dispatching local model responses, simplifying the message delivery process.
- Updated socket status checks to remove unnecessary local model condition, ensuring clarity in connection handling.
- Adjusted comments to reflect the new routing logic for cloud backend interactions, emphasizing that local models are now used only for supplementary features.

* refactor: update chat service to utilize core RPC for message handling

- Replaced Socket.IO message sending with core RPC calls for sending and canceling chat messages, enhancing the communication mechanism.
- Improved error handling for socket connection checks, ensuring robust event routing.
- Updated documentation to reflect the new RPC-based approach for chat message processing.

* feat: enhance chat response handling with segmentation and emoji reactions

- Introduced a new `ChatSegmentEvent` interface to support segmented message delivery, allowing for more natural chat interactions.
- Updated the `Conversations` component to handle segmented responses and apply emoji reactions based on user messages.
- Refactored the message delivery logic to improve clarity and maintainability, ensuring that responses are dispatched correctly based on segmentation.
- Enhanced the chat service to emit segment events, facilitating a smoother user experience during conversations.

* refactor: simplify Conversations component by removing unused imports and optimizing rendering logic

- Removed unnecessary imports related to local model status and message segmentation, streamlining the codebase.
- Updated the rendering logic to enhance clarity by simplifying conditions for displaying sending and delivering states in the chat interface.
- Improved overall readability and maintainability of the Conversations component.

* style: apply formatter fixes (prettier + cargo fmt)

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

* updated convos

* fix test

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:25:10 -07:00
9b73d00b2e fix(agent): inject skill tools into agent registry and unify ToolResult (#341) (#360)
* fix(agent): inject skill tools into agent registry and unify ToolResult (#341)

Skill tools (Notion, Gmail, etc.) from the QuickJS runtime were invisible
to the agent's tool loop — the LLM could never call them. This change:

1. Adds SkillToolBridge to wrap skill ToolDefinitions as Tool trait impls
   and inject them into the agent's tool registry via collect_skill_tools().

2. Unifies ToolResult across built-in and skill tools — both now use the
   MCP-spec type (content blocks + is_error) from skills::types, eliminating
   the need for result conversion between the two systems.

3. Adds convenience constructors (ToolResult::success/error/json) and
   accessor methods (output/text) to simplify all tool implementations.

4. Adds diagnostic logging in the tool loop for tool registry contents
   and tool lookup results.

Verified: agent_chat RPC successfully called Notion list-all-pages tool
and returned real workspace data through the agent loop.

Closes #341

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

* fix(tools): address CodeRabbit review feedback on PR #360

- cron_run: preserve execution details (result_output) on failure
- delegate: fix mismatched bracket in agent response header format string
- run_linter: include lint diagnostics in error output, not just exit code
- run_tests: include test output in error result, not just exit code
- skill_bridge: prevent namespaced tool-name collisions with dedup + __
  delimiter validation; sanitize runtime errors in model-facing output

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

* style: apply cargo fmt to skill_bridge.rs

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-06 10:03:07 -07:00
faa881c5f1 Feat/343 screen intelligence e2e tests (#359)
* test(screen_intelligence): add E2E pipeline proof tests for #343

Add layered test coverage proving the full capture → vision → memory
pipeline: screenshot save/cleanup disk paths, VisionSummary serde
roundtrip, JSON-RPC shape tests for status and vision_recent endpoints.

- tests/screen_intelligence_vision_e2e.rs: save_screenshot_to_disk
  creates a PNG and keep_screenshots=false cleanup removes it;
  VisionSummary struct serializes/persists/is queryable end-to-end;
  platform support table + macOS checklist added to module doc
- tests/json_rpc_e2e.rs: screen_intelligence_status shape test
  (platform_supported, session.active, permissions.screen_recording);
  vision_recent returns empty summaries without an active session
- src/openhuman/screen_intelligence/tests.rs: save_screenshot_to_disk
  unit tests for the write path and the no-image-ref error path

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(screen_intelligence): enhance vision summary persistence and error handling

- Added new fields to track vision persistence count, last persisted key, and last persist error in SessionRuntime and SessionStatus.
- Implemented error handling for vision summary persistence, ensuring errors are logged and state is updated accordingly.
- Introduced a new method  to analyze a frame and persist the summary, improving the vision processing pipeline.
- Updated tests to validate the new functionality and ensure proper behavior with mocked vision outputs.

This commit improves the robustness of the screen intelligence pipeline by enhancing the tracking and handling of vision summary persistence.

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 22:04:50 +05:30
YellowSnnowmannandGitHub 1acc916244 feat: extract and load user working memory from skill sync payloads (#357)
* feat: implement user working memory extraction from skill sync payloads

- Added functionality to enable the extraction of user working memory from successful skill syncs, allowing for persistent storage of user preferences, goals, constraints, and entities.
- Introduced a new configuration option in  to toggle working memory extraction.
- Created comprehensive documentation on the working memory extraction process, detailing its implementation and privacy considerations.
- Updated memory loading logic to include working memory entries in the context provided to agents, enhancing personalization capabilities.
- Enhanced logging for memory extraction processes to improve observability and debugging.

This feature enhances the user experience by allowing skills to maintain context across interactions, improving the overall effectiveness of the OpenHuman platform.

* docs: update architecture documentation to include user working memory integration

* refactor: centralize working memory constants and enhance extraction logic

- Moved `WORKING_MEMORY_KEY_PREFIX` and `WORKING_MEMORY_LIMIT` constants to `memory_context.rs` for better organization and accessibility.
- Updated `MemoryLoader` to utilize these constants, improving code clarity.
- Enhanced working memory extraction logic in `MemoryWriteJob` to conditionally persist user working-memory documents based on the job type.
- Improved logging for memory extraction processes to provide clearer insights during execution.
- Adjusted tests to ensure consistent behavior with the new working memory extraction logic.

* chore: update OpenHuman version to 0.51.8 and refactor JSON-RPC test for clarity

- Bumped the OpenHuman version in Cargo.lock from 0.51.6 to 0.51.8.
- Refactored the JSON-RPC end-to-end test to improve readability by encapsulating the result assertion logic within a block, enhancing clarity in the flow of data handling.
2026-04-06 22:04:31 +05:30
b8ae9674b3 fix(memory): graph query returns namespace data and add sync e2e tests (#344) (#363)
* fix(memory): graph query returns namespace data and add sync e2e tests (#344)

The knowledge graph UI showed empty because graph_query(None) only queried
the graph_global table, while ingestion writes to graph_namespace. Now
graph_query(None) queries both tables via graph_query_all(), merging results.

Changes:
- Added graph_query_all() in unified graph store to query across all namespaces
- MemoryClient::graph_query(None) now uses graph_query_all() instead of
  graph_query_global()
- MemoryWorkspace passes selectedNamespace to the RPC call
- Added diagnostic logging in ingestion pipeline (RelEx model availability,
  extraction counts)
- Added debug logging in tauriCommands for unexpected response shapes
- Added 2 integration tests proving document sync populates the graph
  (ignored by default for CI, run with --ignored)

Closes #344

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

* style: remove trailing comma for Prettier compliance

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-06 22:03:32 +05:30
YellowSnnowmannandGitHub 0c14aea96a Improve autocomplete observability and runtime controls in settings + JSON-RPC (#308)
* Enhance AutocompletePanel logging and functionality

- Introduced MAX_LOG_ENTRIES constant to limit log entries to 200.
- Updated log formatting to include timestamps with milliseconds for better precision.
- Added UI logging for various actions (e.g., saving settings, starting/stopping autocomplete) to improve traceability.
- Enhanced error handling in refreshStatus, acceptSuggestion, and other functions to log specific failure messages.
- Added unit tests for AutocompletePanel to ensure functionality and logging behavior.

This update improves the overall user experience by providing clearer logs and better error handling in the Autocomplete feature.

* Refactor accessibility and autocomplete components for improved error handling and logging

- Updated  to log role changes as debug information instead of returning an error, allowing for more flexible handling of role fluctuations.
- Increased the timeout for autocomplete refresh operations from 15 seconds to 120 seconds to accommodate longer processing times, enhancing reliability.
- Improved error handling in the autocomplete engine to preserve previous suggestions and provide clearer error messages when operations are aborted.

These changes enhance the user experience by providing better logging and more robust handling of focus and autocomplete functionalities.

* Enhance AutocompletePanel functionality and improve error handling

- Refactored loadHistory to return an empty array when Tauri is not available, improving error handling.
- Introduced waitForAcceptedHistoryEntry to ensure the history is loaded before accepting suggestions, enhancing user experience.
- Updated the accept suggestion logic to use the new waitForAcceptedHistoryEntry function, ensuring the correct suggestion is applied.
- Modified tests to reflect changes in the accept suggestion API, ensuring accurate functionality.

These changes improve the reliability and responsiveness of the autocomplete feature.
2026-04-06 18:14:02 +05:30
24b892439d feat(channels): Discord server/channel wiring and picker (#289) (#349)
* feat(channels): add channel_id to DiscordConfig schema

Add optional channel_id field to DiscordConfig for restricting the bot
to a specific Discord channel, matching the pattern used by SlackConfig
and MattermostConfig.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): add channel_id field to Discord definition

Expose channel_id as an optional field in the Discord BotToken auth mode
so users can specify a default channel for outbound messages via the UI.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): create Discord API helper module for guild/channel discovery

Refactor discord.rs into discord/ folder module and add api.rs with:
- list_bot_guilds: GET /users/@me/guilds
- list_guild_channels: GET /guilds/{id}/channels (filtered to text channels)
- check_channel_permissions: compute bot permissions from roles + overwrites

Includes unit tests for type serialization and permission bit constants.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): add Discord RPC handlers for guild/channel discovery

Add three new RPC endpoints:
- openhuman.channels_discord_list_guilds: list servers the bot is in
- openhuman.channels_discord_list_channels: list text channels in a guild
- openhuman.channels_discord_check_permissions: validate bot permissions

These retrieve the stored Discord bot token from credentials and call
the Discord REST API directly from the Rust core.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): wire channel_id into Discord provider for channel filtering

Add channel_id field to DiscordChannel struct and update all construction
sites. When channel_id is set, the listen loop only processes messages
from that specific channel, enabling server+channel-scoped operation.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): add Discord guild/channel API types and RPC methods

Add TypeScript types for DiscordGuild, DiscordTextChannel, and
BotPermissionCheck. Wire up three new RPC methods in channelConnectionsApi
for listing guilds, listing channels, and checking bot permissions.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): create DiscordServerChannelPicker component

Add server and channel selection UI that loads guilds and channels from
the Discord API via the Rust core RPC. Includes permission checking with
visual feedback for missing permissions.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(channels): integrate server/channel picker into DiscordConfig

Show DiscordServerChannelPicker below the connect buttons when the
bot_token connection is active. Guild and channel selections flow back
into the credential field values for persistence.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test(channels): add unit tests for Discord channel_id and config serde

Add tests for:
- DiscordConfig TOML/JSON deserialization with and without channel_id
- channel_id field storage on DiscordChannel struct
- Config roundtrip serialization

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* test(channels): add Vitest tests for DiscordServerChannelPicker

Test guild loading, rendering, and placeholder states with mocked
RPC responses. Verifies the component renders heading, loads guilds
from the mock, and shows the select placeholder.

Refs: #289

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(ci): resolve discord module conflict and format drift

* fix(reviews): address CodeRabbit Discord picker and permission issues

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 17:35:55 +05:30
b589a29e77 Extract socket controller into dedicated domain module (#340)
* refactor: remove global_engine usage in tests and instantiate AccessibilityEngine directly

- Updated the test suite to eliminate the use of global_engine, replacing it with a direct instantiation of AccessibilityEngine.
- This change enhances test isolation and clarity by ensuring that each test operates with its own instance of the engine, improving reliability and maintainability.

* feat: add socket module for skill communication

- Introduced a new `socket` module to facilitate communication between skills, enhancing the modularity and organization of the codebase.
- Updated imports in `qjs_engine.rs` to reference the new `SocketManager` from the `socket` module, streamlining socket management for skill interactions.
- Removed the deprecated `socket_manager` module from the skills module, improving clarity and reducing redundancy in the code structure.

* feat: integrate socket controllers and schemas into core functionality

- Added socket-related registered controllers and schemas to the core build functions, enhancing the communication capabilities within the OpenHuman framework.
- Updated the `build_registered_controllers` and `build_declared_controller_schemas` functions to include socket components, ensuring comprehensive integration of the new socket module.

* feat: enhance QuickJS skill runtime with socket manager integration

- Updated the `bootstrap_skill_runtime` function to initialize and register the `SocketManager` globally, allowing RPC handlers to access socket functionalities.
- Improved documentation to reflect the addition of socket management capabilities alongside the QuickJS skill runtime.
- Cleaned up imports in `event_handlers.rs` to streamline the codebase.

* refactor: remove socket manager integration from skill runtime

- Removed the `SocketManager` integration from the `bootstrap_skill_runtime` function, simplifying the socket management process.
- Eliminated the `socket_manager` field and related methods from the `RuntimeEngine` struct, streamlining the codebase.
- Cleaned up unused MCP handlers and socket-related imports in the event handlers, enhancing code clarity and maintainability.

* refactor: remove sync_tools calls from skill status handling

- Eliminated unnecessary calls to `sync_tools()` in the `RuntimeEngine` during skill status changes, simplifying the skill lifecycle management.
- This change enhances performance by reducing redundant synchronization operations during skill execution and shutdown processes.

* feat: enhance socket event handling with improved logging

- Added logging for incoming socket events to improve observability, including event name and data size.
- Implemented detailed debug logging for event payloads, ensuring clarity on the data being processed.
- Updated event handling logic to streamline routing for webhook requests and inbound channel messages, enhancing the overall responsiveness of the system.
- Introduced logging for unhandled events to aid in debugging and monitoring.

* feat: enhance socket management and auto-connect functionality

- Updated the `bootstrap_skill_runtime` function to clone the `SocketManager` instance for global registration, ensuring proper socket management.
- Introduced background tasks for auto-starting skills and auto-connecting to the backend using stored session tokens, improving startup efficiency and user experience.
- Added detailed logging for session token checks and connection attempts, enhancing observability and debugging capabilities during socket operations.

* feat: enhance skill selection and tool management in tests

- Introduced a new `manifests_in_dir` function to retrieve skill manifests from a specified directory, improving skill discovery.
- Added `select_skill_id` function to prioritize skill selection based on environment variables and preferred candidates, enhancing flexibility in test configurations.
- Updated the test suite to utilize the new skill selection logic, ensuring more robust and configurable test scenarios.
- Improved handling of tool selection with enhanced logging and fallback mechanisms for better debugging and usability.

* format code:wq

* feat: add Rust checks and formatting commands to package.json

- Introduced new scripts for Rust checks and formatting in both the main and app package.json files.
- Updated pre-push hook to include Rust compile checks, enhancing pre-push validation.
- Modified existing format commands to integrate Rust formatting, ensuring consistency across codebases.

* fix: improve formatting of the "Keep Screenshots" label description

- Adjusted the formatting of the description text for better readability by breaking it into multiple lines within the `ScreenIntelligencePanel` component.

* fix: install rustls crypto provider before WebSocket TLS connect

The socket auto-connect was panicking with "Could not automatically
determine the process-level CryptoProvider" because tokio-tungstenite
uses rustls for wss:// but no crypto provider was installed. Install
the ring provider before each connect attempt.

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

* fix: use dynamically selected skill in sync memory tests

The tests hardcoded 'example-skill' which no longer exists in the
skills directory. Now dynamically picks the first available skill
(preferring server-ping) so tests work regardless of which skills
are present.

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:53:58 -07:00
bb1f2c3c8d feat: screen intelligence pipeline + CLI + keep_screenshots config (#339)
* feat: add keep_screenshots functionality to Screen Intelligence settings

- Introduced a new `keep_screenshots` option in the Screen Intelligence settings, allowing users to save captured screenshots to the workspace instead of deleting them after processing.
- Updated relevant components and tests to reflect this new feature, ensuring consistent behavior across the application.
- Enhanced the user interface to include a checkbox for the `keep_screenshots` setting, improving user experience and configurability.

* feat: add `openhuman screen-intelligence` CLI for standalone testing

Adds a dedicated CLI (mirroring `openhuman skills`) to run the screen
intelligence capture + vision pipeline without the full desktop app.

Subcommands: run, status, capture, start, stop.
Makes save_screenshot_to_disk public so the CLI capture --keep flag works.

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

* fix: add keep_screenshots to ScreenIntelligencePanel test assertion

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:17:10 -07:00
Steven EnamakelandGitHub 8757bb9f15 Feat/docs (#331)
* Enhance documentation and structure across core modules

- Added comprehensive module-level documentation for `lib.rs`, `main.rs`, `cli.rs`, `jsonrpc.rs`, `mod.rs`, `config.rs`, and `skills.rs`, detailing their functionalities and responsibilities within the OpenHuman platform.
- Improved function-level documentation to clarify arguments, return types, and error handling for key functions such as `run_core_from_args`, `rpc_handler`, and `run_from_cli_args`.
- Enhanced comments throughout the code to improve readability and maintainability, ensuring a clearer understanding of the codebase for future development.

* Enhance documentation for RuntimeEngine and SkillRegistry

- Improved struct and function-level documentation in `qjs_engine.rs` to clarify the lifecycle management of JavaScript-based skills, including skill discovery, startup, and shutdown processes.
- Updated comments in `skill_registry.rs` to provide clearer descriptions of the registry's role in managing active skills and their communication channels.
- Added detailed explanations for key methods, enhancing understanding of their functionality and usage within the OpenHuman platform.

* Enhance documentation across skill modules

- Improved module-level and struct-level documentation in `manifest.rs`, `ops.rs`, `socket_manager.rs`, and `types.rs` to clarify the purpose and functionality of various components within the skills system.
- Added detailed comments for key structs and functions, including `SkillSetup`, `Skill`, and `SocketManager`, enhancing understanding of their roles in skill management and communication.
- Updated descriptions for enums and message types to provide clearer context for their usage in the skill lifecycle and internal messaging.

* Enhance documentation across skills modules

- Added comprehensive module-level documentation for `registry_ops.rs`, `registry_types.rs`, `schemas.rs`, and `qjs_skill_instance` modules, detailing their functionalities and responsibilities within the OpenHuman skills system.
- Improved function-level comments to clarify the purpose and usage of key functions, including `registry_fetch`, `registry_search`, and `skill_install`.
- Enhanced descriptions for structs and enums, providing clearer context for their roles in skill management and execution.
- Updated comments throughout the code to improve readability and maintainability, ensuring a clearer understanding of the codebase for future development.

* Enhance documentation for QuickJS and IndexedDB modules

- Improved module-level documentation in `quickjs_libs/mod.rs` to clarify the purpose and functionality of the QuickJS runtime support.
- Enhanced comments in `storage.rs` to provide detailed descriptions of the IndexedDB storage layer, including its features and compatibility with the browser's IndexedDB API.
- Updated function-level comments to improve clarity on database connection management and object store operations, ensuring better understanding for future development.

* Enhance documentation across memory modules

- Added comprehensive module-level documentation for `mod.rs`, `ops.rs`, `rpc_models.rs`, `schemas.rs`, and `traits.rs`, detailing their functionalities within the OpenHuman memory system.
- Improved function-level comments to clarify the purpose and usage of key functions, enhancing understanding of memory operations, RPC handling, and data structures.
- Updated comments throughout the code to improve readability and maintainability, ensuring a clearer understanding of the memory system for future development.

* Enhance documentation for memory modules

- Updated module-level documentation in `chunker.rs`, `embeddings.rs`, and `relex.rs` to provide clear descriptions of their functionalities within the OpenHuman memory system.
- Improved function-level comments to clarify the purpose and usage of key functions, enhancing understanding of markdown chunking, embedding providers, and relation extraction processes.
- Added detailed explanations for structs and enums, ensuring better context for their roles in memory operations and data handling.

* Enhance documentation across memory modules

- Updated module-level documentation in `ingestion_queue.rs`, `ingestion.rs`, `response_cache.rs`, `client.rs`, and `mod.rs` to provide clearer descriptions of their functionalities within the OpenHuman memory system.
- Improved function-level comments to clarify the purpose and usage of key functions, enhancing understanding of document ingestion, caching mechanisms, and memory client interactions.
- Added detailed explanations for structs and enums, ensuring better context for their roles in memory operations and data handling.

* Enhance documentation for memory store modules

- Added comprehensive module-level documentation for `factories.rs` and `memory_trait.rs`, detailing their functionalities within the OpenHuman memory system.
- Improved function-level comments to clarify the purpose and usage of key functions, enhancing understanding of memory instance creation and management.
- Included detailed explanations for the `UnifiedMemory` implementation, ensuring better context for its role as a generic memory backend.

* Refactor and enhance documentation across various modules

- Removed unnecessary blank lines in `main.rs`, `chunker.rs`, `embeddings.rs`, `ingestion.rs`, `relex.rs`, `rpc_models.rs`, `memory_trait.rs`, `manifest.rs`, `mod.rs`, `ops.rs`, `qjs_engine.rs`, `socket_manager.rs`, and other files to improve code readability.
- Improved comments and documentation in several modules to clarify the purpose and functionality of key components, enhancing overall understanding of the codebase.
- Ensured consistent formatting and organization of comments throughout the code, contributing to better maintainability and clarity for future development.

* fix import

* format
2026-04-05 22:14:29 -07:00
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
09b627ccc9 Redesign billing: pay-as-you-go first-class + coupon redemption (#337)
* Refactor BillingPanel and introduce new billing components

- Refactored the BillingPanel component to streamline its structure and improve readability by removing unused constants and functions.
- Introduced new components: AutoRechargeSection, InferenceBudget, PayAsYouGoCard, and SubscriptionPlans to modularize billing functionalities.
- Added coupon redemption functionality in the credits API, allowing users to redeem coupon codes for credits.
- Enhanced the overall billing experience by improving the layout and organization of billing-related UI elements.

* style: apply prettier formatting to billing 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:06:31 -07:00
7bce9d2bbe UI polish: skill encryption key, disconnect fix, settings layout cleanup (#330)
* feat: add overlay process launcher for OpenHuman (#328)

- Introduced a new `overlay` module to manage the lifecycle of the `openhuman-overlay` Tauri application.
- Implemented the `spawn_overlay` function to discover and launch the overlay as a child process, enhancing the user experience with a transparent debug/voice panel.
- Updated the `jsonrpc.rs` file to invoke the overlay process when the core server starts, ensuring seamless integration.
- Enhanced module organization by adding the `overlay` module to the `openhuman` namespace.

* feat: add animated mesh gradient background to App component

- Introduced a new `MeshGradient` component that renders an animated WebGL mesh gradient background, enhancing the visual appeal of the application.
- Updated the `App` component to include the `MeshGradient`, ensuring it renders behind the dotted canvas overlay for improved aesthetics.
- Modified the CSS for the `app-dotted-canvas` to use a transparent background and adjusted the gradient styling for better integration with the new component.
- Added TypeScript definitions and implementation for the `Gradient` class to manage the mesh gradient functionality.

* style: update MeshGradient component colors and opacity

- Changed the opacity of the mesh gradient from 20% to 10% for a more subtle effect.
- Updated gradient colors to enhance visual appeal, replacing previous colors with a new palette for better integration with the overall design.

* feat: enhance SkillSetupWizard with encryption key support

- Added a new input field for client-side encryption key in the OAuthLoginView component, improving security during manual integration.
- Implemented validation to ensure the encryption key is provided before submission, enhancing error handling.
- Updated the layout to accommodate both integration ID and encryption key inputs, improving user experience in development mode.
- Refactored related logic to streamline the handling of integration ID and encryption key during OAuth completion.

* feat: integrate skill installation check in SkillSetupWizard

- Updated the OAuthLoginView component to ensure skills are installed before starting the runtime, enhancing reliability during the setup process.
- Added error handling to manage cases where the skill may already be installed, improving user experience and reducing potential runtime errors.

* fix: improve base directory resolution in skill runtime

- Updated the base directory resolution logic in both `jsonrpc.rs` and `skills_cli.rs` to filter out empty workspace paths, enhancing robustness.
- Added debug logging in `qjs_engine.rs` to provide better visibility into skill startup processes, including checks for manifest existence and workspace directory status.

* feat: enhance SkillManager with skill stopping and client key cleanup

- Implemented the `stopSkill` method to halt the frontend-side runtime and added a call to `rpcStopSkill` for stopping the core sidecar skill process.
- Introduced `removePersistedClientKey` function to clear the client-side encryption key, ensuring better security and resource management during skill revocation.
- Added error handling and debug logging for both stopping the skill and cleaning up the client key, improving observability and reliability.

* style: update OnboardingOverlay background opacity and refine settings warning message

- Changed the background opacity of the OnboardingOverlay from 95% to 50% for a more subtle appearance.
- Revised the warning message in SettingsHome to clarify the local data deletion process, improving user understanding of the consequences of signing out.

* refactor: simplify layout structure in settings components

- Removed unnecessary overflow properties from the main container divs in SettingsHome, SettingsSectionPage, and SettingsPanelLayout components, improving layout clarity.
- Adjusted child divs to ensure proper content display without overflow, enhancing user experience in the settings interface.

* style: adjust padding and spacing in SettingsSectionPage component

- Updated padding in the main container from `p-4` to `py-4` for improved vertical spacing.
- Increased horizontal padding of the description text from `px-1` to `px-5`, enhancing readability and visual appeal.

* style: refine layout and spacing in settings components

- Adjusted padding and spacing in SettingsSectionPage, SettingsBackButton, and SettingsHeader components for improved visual consistency.
- Updated font sizes and margins to enhance readability and user experience across the settings interface.

* style: simplify layout and improve spacing in settings panels

- Removed unnecessary flex properties and adjusted padding in various settings panels for a cleaner layout.
- Standardized spacing across panels to enhance visual consistency and user experience.
- Updated component structures to eliminate redundant overflow properties, improving content display.

* style: simplify section layouts and improve spacing in settings panels

- Removed unnecessary border and background properties from multiple sections in the Accessibility, Screen Intelligence, and other settings panels for a cleaner appearance.
- Standardized section spacing and padding across various panels to enhance visual consistency and user experience.
- Updated font sizes for better readability and adjusted button styles for improved interaction.

* style: standardize panel headings from text-lg to text-sm

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

* style: update heading for connected skills section to improve clarity

- Changed the section title from "Connected Skills" to "3rd Party Skills" for better representation of the content.

* style: improve code formatting and spacing in various components

- Enhanced readability by adjusting spacing and formatting in SettingsBackButton, MemoryDebugPanel, WebhooksDebugPanel, and other components.
- Standardized the layout of JSX elements for better visual consistency across the application.
- Cleaned up log messages in Rust files for improved clarity and debugging.

* fix: enhance MeshGradient cleanup and improve settings warning message

- Added a call to `gradient.disconnect()` in the MeshGradient component to ensure proper cleanup on unmount.
- Updated the warning message in SettingsHome to use a list format for better clarity regarding local data deletion consequences.
- Removed unused 'tauri-commands' route from settings navigation for cleaner code.
- Added validation for the encryption key in SkillSetupWizard to prevent invalid characters.
- Updated the Gradient class to include additional checks for canvas element and WebGL context during initialization.
- Improved error handling in SkillManager's `stopSkill` method for better debugging and reliability.

* style: correct comment formatting in meshGradient.js

- Updated comment syntax in the Gradient class to ensure proper code documentation and readability.

* fix: add encryption key validation and remove double transition in dev setup

- Validate devEncryptionKey for invalid characters (quotes, backslashes,
  control chars) before using as X-Encryption-Key header
- Remove explicit onManualComplete() call — let the snapshot effect handle
  the connected→setup transition to avoid double-firing startSkill/startSetup

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

* fix: improve encryption key validation in SkillSetupWizard

- Enhanced validation for the devEncryptionKey to check for quotes, backslashes, and control characters, ensuring only valid characters are accepted.
- This change prevents potential issues when using the encryption key in the application.

* fix: resolve lint errors in MeshGradient, meshGradient.js, and SkillSetupWizard

- Fix canvasRef.current stale ref warning by capturing to local variable
- Add eslint-disable for browser globals in vendored meshGradient.js
- Replace control character regex with printable-range check
- Remove unused onManualComplete from dependency array

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 17:21:05 -07:00
Steven EnamakelandGitHub a0abda956a Fix/encryption (#329)
* refactor: simplify OAuth deep link handling by removing client key fetch logic

- Removed the client key share fetching logic from the OAuth deep link handler, simplifying the process.
- Updated logging to reflect the success of the OAuth process and the presence of the client key share directly from URL parameters.
- Adjusted comments to maintain clarity in the flow of the deep link handling function.

* feat: trigger initial sync after successful OAuth completion

- Updated the OAuth deep link handler to automatically trigger an initial data sync upon successful authentication, enhancing data availability for skills.
- Adjusted comments to clarify the new behavior and its integration with the skill runtime, ensuring immediate data fetching post-authentication.

* feat: trigger initial sync on startup if credentials are present

- Added logic to check for persisted OAuth credentials at startup and trigger an initial data sync if found, ensuring immediate data availability for skills.
- Enhanced logging to provide feedback on the sync process, including success and failure messages for better monitoring.

* refactor: enhance logging format and improve initial sync comments

- Updated logging format in `logging.rs` to remove angle brackets from log levels and adjust time formatting for consistency.
- Improved comments in `instance.rs` to clarify the non-blocking nature of the initial sync process, enhancing code readability and understanding.

* refactor: remove automatic initial sync on startup and after auth completion

- Eliminated the logic that triggered an initial sync automatically at startup if credentials were present or after successful OAuth completion, shifting to a manual or cron-scheduled sync approach.
- Updated comments to clarify the new sync behavior, enhancing code readability and understanding.
2026-04-05 14:52:36 -07:00
Steven EnamakelandGitHub e13980d8ca feat: encrypted OAuth token flow with XOR key-splitting (#327)
* feat: implement encrypted OAuth flow and client key management

- Updated the SkillSetupWizard to include an encryption mode parameter in the OAuth connection URL.
- Enhanced the SkillManager to handle client key shares during OAuth completion, allowing skills to use encrypted proxy requests.
- Introduced a new API endpoint for fetching client key shares, facilitating secure communication.
- Modified the OAuth deep link handler to retrieve and pass the client key share to the skill runtime.
- Implemented client key persistence and restoration in the skill instance, ensuring secure access during runtime.
- Updated the JavaScript fetch implementation to utilize the client key for encrypted proxy requests.

* refactor: improve registry URL handling in registry_cache.rs

- Updated the registry_url function to filter out empty environment variable values for SKILLS_REGISTRY_URL, ensuring a valid URL is always returned.
- Enhanced the code readability by using method chaining for better clarity in the URL retrieval process.

* feat: enhance SkillSetupWizard with manual integration ID entry for dev mode

- Added support for manual entry of integration IDs in development mode within the OAuthLoginView component.
- Implemented functionality to handle OAuth completion using the provided integration ID, including error handling and state management.
- Updated the component's props to include skillId and onManualComplete for better integration with the setup wizard flow.

* feat: enhance SkillSetupWizard with skill runtime readiness check

- Added a mechanism to wait for the skill runtime to be fully running after starting it, improving reliability in the OAuthLoginView component.
- Introduced a new JSON file for skill preferences, enabling configuration for skills like Notion, including setup completion status.

* refactor: streamline code formatting and improve readability in various files

- Simplified the formatting of function calls and JSON output definitions in `desktopDeepLinkListener.ts`, `rest.rs`, and `schemas.rs` for better clarity.
- Cleaned up import statements in `instance.rs` to enhance organization and maintainability.

* feat: remove dictation functionality and related components

- Deleted the DictationOverlay component and its associated hooks, streamlining the application by removing unused dictation features.
- Updated the App component to reflect the removal of dictation-related UI elements.
- Cleaned up settings and navigation to eliminate references to dictation settings and panels, enhancing overall code maintainability.

* refactor: update MemoryWorkspace title and enhance skill runtime error handling

- Changed the title in MemoryWorkspace from "Memory (EverMind)" to "Memory" for clarity.
- Improved error handling in SkillSetupWizard during skill runtime startup, ensuring more informative error messages and a timeout check for skill readiness.
2026-04-04 20:44:42 -07:00
Steven EnamakelandGitHub ffb4c8924b feat: improve overlay debug visibility and triggers (#326)
* feat: initialize OpenHuman overlay with log viewer and Tauri integration

- Added a new overlay project for OpenHuman, featuring a transparent window with a log viewer.
- Implemented core components including TitleBar, ModuleFilter, LogViewer, and StatusBar for enhanced user interaction.
- Integrated Tauri for desktop application capabilities, allowing for real-time log monitoring and management.
- Configured TypeScript, Tailwind CSS, and Vite for a modern development experience.
- Included necessary files such as package.json, tsconfig.json, and README.md to guide setup and usage.

* refactor: update async task spawning in Tauri integration

- Replaced `tokio::spawn` with `tauri::async_runtime::spawn` for improved compatibility with Tauri's async runtime.
- This change enhances the integration of the OpenHuman core server within the Tauri application, ensuring better performance and stability.

* feat: implement click-through toggle in overlay title bar

- Added a click-through toggle feature to the TitleBar component, allowing mouse events to pass through the overlay.
- Updated the App component to manage the click-through state and handle its toggling.
- Enhanced the MODULE_LABELS in types.ts to include additional known modules for filtering.
- Modified Tauri backend to support the click-through functionality, ensuring proper state management and event handling.

* feat: implement audio transcription functionality in overlay

- Added audio recording and transcription capabilities to the overlay, allowing users to capture and transcribe speech.
- Introduced functions for audio processing, including converting audio blobs to WAV format and handling audio streams.
- Updated the App component to manage recording states and display transcription results.
- Enhanced the user interface with a microphone icon indicating recording status.
- Adjusted window dimensions and properties in the Tauri configuration for improved user experience.

* feat: enhance transcript insertion and logging in overlay

- Implemented a new function to insert transcribed text into the currently focused field of the active application, improving user experience.
- Added detailed logging for overlay actions, including recording start/stop events and transcript insertion attempts, to aid in debugging and monitoring.
- Updated the App component to utilize the new insertion functionality and log relevant information during transcription processes.

* feat: implement macOS Globe/Fn key listener integration

- Added a new Globe/Fn key listener feature for macOS, enabling the application to respond to Globe key events.
- Implemented functions to start, poll, and stop the Globe listener, enhancing user interaction with the overlay.
- Updated the App component to manage the listener's lifecycle and display relevant status messages.
- Modified Tauri configuration to adjust overlay visibility settings for improved user experience.
- Introduced a new module for Globe listener management, encapsulating related functionality and improving code organization.

* feat: add macOS support for accessory activation policy and create Info.plist

- Introduced a new Info.plist file to configure macOS application settings.
- Implemented accessory activation policy for the overlay on macOS, enhancing user experience by allowing the app to run in the background without a dock icon.
- Updated the application setup to include macOS-specific configurations for improved functionality.

* feat: enhance overlay debug state and UI components

- Introduced new interfaces for managing accessibility and autocomplete statuses, improving the structure of debug information.
- Implemented a polling mechanism to refresh the overlay debug state, capturing accessibility and autocomplete data in real-time.
- Updated the App component to display active application and window titles, along with autocomplete suggestions and phases.
- Adjusted the overlay dimensions in Tauri configuration for better user experience and visibility.
- Enhanced logging for debug snapshot updates, aiding in monitoring and troubleshooting.

* refactor: improve code formatting and readability in accessibility and screen intelligence modules

- Reformatted code in `globe.rs`, `ops.rs`, `schemas.rs`, and `types.rs` for better clarity and consistency.
- Enhanced logging statements and function definitions to follow a more uniform style.
- Updated imports in `types.rs` to maintain organization and improve accessibility module integration.
2026-04-04 20:28:19 -07:00
73e214bb37 feat: background ingestion queue for memory graph extraction (#325)
* feat: implement background ingestion queue for document processing

- Introduced a new `IngestionQueue` module to handle background processing of documents through the entity/relation extraction pipeline, ensuring that `doc_put` calls do not block.
- Added `IngestionJob` struct to represent jobs submitted to the ingestion worker.
- Implemented the `start_worker` function to initialize the ingestion worker on a dedicated Tokio task, processing jobs sequentially.
- Updated `MemoryClient` to utilize the ingestion queue for asynchronous document ingestion, enhancing performance and responsiveness.

* refactor: reorder ingestion_queue imports for consistency

- Moved the `IngestionJob` and `IngestionQueue` imports to maintain a consistent structure in the `memory` module.
- This change improves code organization and readability without altering functionality.

* fix: eliminate double upsert in background ingestion queue

- Extract `upsert_graph_relations` helper from `ingest_document` to
  share graph-write logic between full ingestion and extraction-only.
- Add `extract_graph` method on UnifiedMemory that runs entity/relation
  extraction and graph upserts without re-calling `upsert_document`.
- Worker now calls `extract_graph` instead of `ingest_document`, since
  the document is already persisted by `put_doc`/`store_skill_sync`.
- Change `IngestionJob` to carry an explicit `document_id` field.
- Change `IngestionQueue::submit` to return `bool` for enqueue status.

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-04 20:26:22 -07:00
Steven EnamakelandGitHub e925e8a319 Fix local reset flow and Accessibility permission handling (#324)
* refactor: clean up imports and improve code structure in skills_cli and registry_ops

- Removed unused imports in `skills_cli.rs` and `registry_ops.rs` to enhance code clarity.
- Streamlined import statements for better organization and readability.
- Minor adjustments in `engine.rs` to maintain consistency in import usage.

* fix: update UI text and styles for MemoryWorkspace and SkillSetupWizard components

- Changed the title in MemoryWorkspace to "Memory (EverMind)" for clarity.
- Updated text colors in SkillSetupWizard for better visibility and consistency.
- Enhanced button styles and loading indicators for improved user experience.

* feat: implement reset functionality for OpenHuman data and enhance app data clearing process

- Added a new utility function `resetOpenHumanDataAndRestartCore` to reset local OpenHuman data and restart the core process.
- Updated `clearAllAppData` in `SettingsHome` to utilize the new reset function, improving the app's data clearing process.
- Enhanced error handling during the data reset and session clearing operations to ensure robustness.
- Introduced tests for the new reset functionality to validate its behavior and integration.

* refactor: remove screen recording permission from AccessibilityPanel

- Eliminated the screen recording permission check and associated UI elements from the AccessibilityPanel component.
- Updated tests to ensure the screen recording option is no longer present in the rendered output, improving clarity and focus on relevant permissions.

* chore: update package.json files to integrate Husky for Git hooks

- Added Husky as a dev dependency in both package.json files to manage Git hooks.
- Included "prepare" and "postinstall" scripts in the main package.json to ensure Husky is set up correctly.
- Cleaned up the app's package.json by removing the "prepare" script, as it is now handled in the main package.json.
- Enhanced logging in tauriCommands.ts for better debugging during the reset process.

* fix: update variable name for clarity in ops.rs test assertions

- Changed the variable name from `data` to `value` in the test assertions to enhance clarity and better reflect its purpose.
- Ensured that the assertions remain functional and maintain the integrity of the test logic.

* feat: enhance skill selection logic in skills_debug_e2e.rs

- Introduced a new function `select_skill_id` to improve skill selection based on environment variables and preferred skills.
- Updated the skill ID retrieval process to prioritize user-defined skills while maintaining a fallback to the default skill.
- Enhanced documentation to clarify the usage of environment variables for skill testing.

* format
2026-04-04 20:26:08 -07:00
Steven EnamakelandGitHub fa1c618ca9 feat: add skills CLI for standalone skill development runtime (#323)
* feat(cli): add skills command for skill development runtime

- Introduced a new `skills` command in the CLI to facilitate skill development, allowing users to run, list, start, call, and test skills.
- Added a dedicated `skills_cli` module to handle the new command's functionality.
- Updated the general help output to include usage instructions for the `skills` command, enhancing user guidance.

* refactor(skills_cli): replace logging initialization with quiet logging function

- Updated the `run_skills_list`, `run_skills_start`, `run_skills_call`, and `run_skills_test` functions to use a new `init_quiet_logging` function for improved logging behavior.
- Introduced `init_quiet_logging` to set the logging level to `warn` unless verbose mode is enabled, streamlining logging setup for non-server subcommands.

* refactor(skills_cli): improve code formatting and readability

- Reformatted several functions in `skills_cli.rs` for better readability, including `bootstrap_skills_runtime`, `run_skills_server`, and `run_skills_list`.
- Enhanced logging statements for clarity and consistency.
- Updated help output formatting in `print_skills_help` and other functions to improve user guidance.
- Streamlined error handling and JSON parsing in `run_skills_call` and `run_skills_list` functions.
2026-04-04 14:45:06 -07:00
Steven EnamakelandGitHub ef708bdd20 refactor(core): move app state ownership into the Rust core (#320)
* refactor(core): integrate CoreStateProvider and streamline state management

- Replaced UserProvider with CoreStateProvider in App component to centralize state management.
- Updated various components to utilize the new CoreStateProvider for accessing session tokens and user data.
- Refactored hooks and components to eliminate direct Redux store dependencies, enhancing modularity and maintainability.
- Introduced a new core state management structure to improve the handling of user authentication and onboarding states.

This refactor aims to simplify state access across the application and improve overall code clarity.

* fix: restore polyfills import and clean up component imports

- Reintroduced the import of polyfills in main.tsx to ensure compatibility.
- Adjusted import statements in PrivacyPanel and SocketProvider for consistency.
- Simplified conditional expressions in TeamInvitesPanel and TeamMembersPanel for better readability.
- Refactored CoreStateProvider and store.ts to streamline state initialization.
- Enhanced formatting in various files for improved code clarity and maintainability.

* refactor(tests): streamline onboarding and protected route tests

- Updated OnboardingOverlay tests to utilize mock state management and simplify assertions.
- Refactored ProtectedRoute tests to improve readability and ensure consistent use of mock state.
- Enhanced teamApi tests to replace direct API calls with core RPC method calls, improving test isolation and clarity.
- Adjusted socketSelectors tests to utilize a centralized core state snapshot for better state management during tests.

* refactor(onboarding): simplify onboarding state management and improve loading logic

- Removed unnecessary local state for onboarding completion in OnboardingOverlay, directly utilizing snapshot data.
- Enhanced loading logic to prevent unnecessary renders and improve user experience during onboarding.
- Updated PrivacyPanel to handle analytics consent persistence with error handling.
- Refactored TeamManagementPanel and TeamPanel to improve team data fetching logic and loading states.
- Streamlined CoreStateProvider to manage session token synchronization and state updates more effectively.

* chore(deps): update tempfile dependency and refactor app state management

- Added `tempfile` dependency to Cargo.toml for improved temporary file handling.
- Refactored app state loading and saving functions to enhance error handling and ensure data integrity.
- Introduced quarantine mechanism for corrupted app state files to prevent application crashes.
- Updated URL parsing logic to ensure proper formatting of API URLs.
- Adjusted type definitions in schemas for better clarity and consistency.

* refactor(tests): simplify mock state usage in onboarding and protected route tests

- Consolidated mock state management in OnboardingOverlay and ProtectedRoute tests for improved readability.
- Streamlined assertions by reducing unnecessary lines in test setups.
- Enhanced consistency in mock return values across tests to ensure clarity and maintainability.

* refactor(tests): enhance PublicRoute tests with mock state and routing

- Updated PublicRoute tests to utilize MemoryRouter for improved routing simulation.
- Simplified mock state management by integrating `useCoreState` for user authentication scenarios.
- Streamlined test assertions and removed redundant preloaded state configurations for clarity and maintainability.

* refactor(tests): streamline mock state usage in PublicRoute and Mnemonic tests

- Simplified mock state management in PublicRoute and Mnemonic tests for improved readability.
- Consolidated mock return values to reduce redundancy and enhance clarity in test setups.
- Improved consistency in the usage of `useCoreState` across test files.

* Refactor billing components for improved readability

- Cleaned up import statements in BillingPanel.tsx for better organization.
- Enhanced formatting of billing plan descriptions in billingHelpers.ts for consistency.
- Improved readability of conditional checks in BillingPanel component.

* Refactor API endpoint handling for clarity and consistency

- Updated references from `/settings` to `/auth/me` in various modules to standardize user authentication flows.
- Renamed `parse_settings_response_json` to `parse_api_response_json` for improved clarity in response handling.
- Adjusted user ID extraction functions to reflect the new endpoint structure, enhancing maintainability across the codebase.
- Updated test cases to align with the new endpoint naming conventions, ensuring consistency in API interactions.
2026-04-04 03:20:18 -07:00
Steven EnamakelandGitHub 24876497df Update billing discount messaging (#321)
* feat(billing): enhance billing plan structure and display

- Added new properties to the PlanMeta interface for monthly and weekly budgets, five-hour cap, margin percentage, and storage limits.
- Updated billing plans with new budget and storage details for Free, Basic, and Pro tiers.
- Introduced utility functions for formatting USD amounts and storage limits.
- Enhanced the BillingPanel component to display new plan details, including budget and storage information, improving user clarity on subscription benefits.

* fix(tests): update billing plan tests to reflect backend configuration changes

- Adjusted test cases for the Free, Basic, and Pro plans to align with updated pricing and budget details.
- Added assertions for new properties such as margin percentage and budget limits.
- Modified display price calculations to match the revised annual pricing structure.

* refactor(billing): rename marginPercent to discountPercent in billing plans

- Updated the PlanMeta interface and billing plans to replace marginPercent with discountPercent for clarity.
- Adjusted related display elements in the BillingPanel component to reflect the new terminology.
- Modified unit tests to ensure they align with the updated property names and values.
2026-04-04 03:01:45 -07:00
8381283c52 Fix/update api (#319)
* feat(webhooks): refactor webhook URL handling and enhance API endpoints

- Introduced a new utility function `buildWebhookIngressUrl` to standardize the construction of webhook URLs across components.
- Updated `WebhooksDebugPanel` and `TunnelList` components to utilize the new URL builder for improved consistency and maintainability.
- Refactored API endpoints in `tunnelsApi` to reflect changes in webhook routing, ensuring all references to tunnel management are aligned with the new structure.
- Adjusted user API calls to replace `/telegram/me` with `/auth/me` for better clarity and consistency in authentication flows.
- Enhanced socket service to normalize channel connection update payloads, improving error handling and data integrity.

These changes streamline webhook management and enhance the overall developer experience when working with webhooks.

* feat(messaging): enhance Telegram and Discord channel linking functionality

- Added support for managed DM linking with Telegram and OAuth flow for Discord.
- Introduced `createChannelLinkToken` API to generate short-lived link tokens for messaging channels.
- Updated `MessagingPanel` to handle managed linking flows, including building launch URLs and user instructions.
- Enhanced configuration to include a Telegram bot username for fallback linking.
- Updated tests to mock new configuration values for consistent testing.

These changes improve the user experience for linking messaging channels and streamline the authentication process.

* feat(api): introduce core command client and refactor API calls

- Added a new `coreCommandClient` to facilitate RPC calls to core services.
- Refactored existing API endpoints in `authApi`, `billingApi`, `creditsApi`, `tunnelsApi`, and `userApi` to utilize the new command client for improved consistency and maintainability.
- Updated the billing API to include new endpoints for fetching balance, transactions, and managing auto-recharge settings.
- Enhanced the user API to streamline user data retrieval.
- Improved error handling and logging across the refactored API calls.

These changes enhance the overall architecture of the API services, making them more modular and easier to maintain.

* refactor(api): streamline API calls and enhance error handling

- Refactored `creditsApi` and `tunnelsApi` to ensure consistent use of the new core command client.
- Updated API methods to improve error handling and response parsing.
- Introduced a new `authed_json` method in `BackendOAuthClient` for standardized authenticated requests.
- Cleaned up unused imports and optimized code structure across various modules.

These changes enhance the maintainability and reliability of the API services.

* refactor(api): streamline API calls and improve code readability

- Reorganized API calls in `authApi`, `billingApi`, `creditsApi`, and `tunnelsApi` to enhance consistency and maintainability.
- Updated function formatting for better readability, ensuring parameters are clearly defined.
- Cleaned up import statements and removed unnecessary line breaks to improve code clarity.

These changes contribute to a more maintainable codebase and enhance the overall developer experience.

* refactor(MessagingPanel): clean up imports and remove unused constants

- Reorganized import statements for clarity and consistency.
- Removed unused constants related to channel definitions and status styles to streamline the component.
- Simplified the `updateField` function call in the rendering logic for better readability.

These changes enhance the maintainability of the MessagingPanel component.

* fix: restore helper functions removed during merge cleanup

buildManagedChannelLaunchUrl and buildManagedChannelInstruction were
stripped by the linter after merge resolution, breaking the build.

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

* feat(messaging): enhance MessagingPanel with pending instruction handling

- Introduced a new state for pending instructions to improve user feedback during channel connection processes.
- Updated error handling to ensure users receive clear instructions, including URLs for manual access if automatic opening fails.
- Refactored connection status updates to streamline the dispatch process and improve code readability.
- Enhanced the rendering logic to display pending instructions in the UI, providing better context for users during authentication flows.

* fix(api): encode channel and ID parameters in webhook and OAuth URLs

- Updated the URL construction in the BackendOAuthClient to encode the channel parameter, ensuring proper formatting for requests.
- Modified the get_tunnel, update_tunnel, and delete_tunnel functions to encode the ID parameter in webhook URLs, enhancing security and compatibility with special characters.

* fix(auth): validate channel input for link token creation

- Added validation to ensure the channel is not empty and is one of the supported types (telegram, discord).
- Converted the channel string to lowercase for consistent matching.
- Updated the call to create_channel_link_token to use a reference to the channel variable.

* chore(todos): update TODO list with completed tasks and new feature requests

- Marked several tasks as completed, including integration of the custom memory engine and skills registry into the core.
- Added new items to the TODO list, including improvements for voiceover functionalities, screen intelligence, and Gmail skill enhancements.
- Included tasks for debugging skills from the UI and improving prompts to reduce hallucinations.

* refactor(webhooks): improve formatting of get_tunnel function for readability

- Reformatted the get_tunnel function to enhance code clarity by adjusting the indentation and line breaks in the call to get_authed_value.
- This change improves the maintainability of the code and aligns with the overall code style.

* test(userApi): enhance userApi tests with improved mocking and error handling

- Added a mock function for core command calls to streamline test setup.
- Introduced a helper function to generate mock user data for consistent test cases.
- Updated tests to use the mock function for simulating API responses, improving clarity and maintainability.
- Enhanced error handling in tests to cover various API error scenarios, ensuring robustness in userApi.getMe functionality.

* refactor(billingApi): update tests to use core command mocking and improve error handling

- Replaced apiClient mocks with core command mocks for better alignment with the new API structure.
- Updated test cases to reflect changes in API call expectations, enhancing clarity and maintainability.
- Improved error handling in tests to ensure proper propagation of errors from core command calls.

* refactor(billingApi): simplify test cases by consolidating mock function calls

- Streamlined mock function calls in billingApi tests for improved readability and consistency.
- Removed unnecessary line breaks in mock responses, enhancing clarity in test definitions.
- Ensured that error handling and API call expectations are clearly represented in the tests.

* refactor(api): rename settings endpoint to current_user for clarity

- Updated the endpoint handling authenticated profile fetches to improve clarity in the codebase.
- Adjusted the routing to reflect the new function name, enhancing maintainability and understanding of the API's purpose.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 02:59:31 -07:00
Steven EnamakelandGitHub acfa5497ef feat(skills): advanced authentication modes for skills (#315)
* feat(auth): implement advanced authentication modes and UI selector

- Introduced a new `AuthModeSelector` component for selecting authentication methods (managed, self-hosted, text).
- Enhanced the `SkillManager` to handle revocation of both OAuth and auth credentials.
- Updated the API to support advanced auth configurations with multiple modes.
- Added functionality to persist and restore auth credentials in the skill's data directory.
- Updated relevant types and interfaces to accommodate the new auth structure.

* feat(auth): enhance SkillSetupWizard with multi-phase authentication flow

- Updated `SkillSetupWizard` to support a two-phase authentication process: an optional auth mode selection followed by the setup phase.
- Integrated `AuthModeSelector` for users to choose between managed, self-hosted, and text authentication methods.
- Improved state management to handle various auth phases, including error handling and transitions to the setup phase upon successful authentication.
- Refactored relevant types and interfaces to accommodate the new authentication structure.

* refactor(skills): remove unused loader module and clean up bridge imports

- Deleted the unused `loader.rs` module, which was reserved for future ES module import support.
- Removed references to the `loader` module in `mod.rs`.
- Cleaned up the `bridge` module by removing several unused bridge files, including `cron_bridge.rs`, `db.rs`, `log_bridge.rs`, `skills_bridge.rs`, `store.rs`, and `tauri_bridge.rs`.
- Added comprehensive tests for the `manifest.rs`, `ops.rs`, and `preferences.rs` modules to ensure functionality remains intact after the refactor.

* feat(registry): introduce registry cache management for remote skill registry

- Added a new `registry_cache.rs` module to handle disk-based caching for the remote skill registry.
- Implemented functions for managing cache, including reading, writing, and checking cache freshness.
- Updated `registry_ops.rs` to utilize the new caching functions, improving performance and reducing redundant network calls.
- Introduced a new `event_loop` module to manage the QuickJS runtime, including handling incoming messages and persisting state to memory.
- Added webhook request handling and RPC message handlers to facilitate communication with external services.
- Removed the obsolete `event_loop.rs` file, consolidating functionality into the new structure.

* fix(tests): update imports in registry_ops tests to include cache management functions

- Modified test module imports in `registry_ops.rs` to include new cache management functions from `registry_cache`.
- This change ensures that tests can utilize the updated caching functionality introduced in the recent registry cache management feature.

* chore(deps): update OpenHuman version to 0.51.6 and clean up code formatting

- Updated the OpenHuman dependency version in `Cargo.lock` to 0.51.6.
- Refactored code in several files for improved readability by adjusting formatting and removing unnecessary line breaks.
- Ensured consistent logging format in `event_loop` and `rpc_handlers` modules for better clarity in log messages.

* refactor(conversations): improve team usage display logic and formatting

- Refactored the Conversations component to enhance the display of team usage information, including clearer conditional rendering for budget exhaustion messages.
- Improved formatting of budget display for both 5-hour and weekly limits, ensuring consistent presentation.
- Streamlined the import of the core HTTP base URL in the WebhooksDebugPanel for better code organization.

* refactor(auth): enhance credential management and validation process

- Updated the SkillManager to attempt revoking auth credentials even if the auth mode is unknown, improving robustness.
- Introduced a new deserialization function to ensure that at least one authentication mode is provided in the SkillAuthConfig.
- Enhanced the handling of temporary credential injection during the auth completion process, ensuring credentials are only persisted upon successful validation.
- Improved the handling of OAuth credentials in JavaScript, ensuring stale credentials are cleared for non-managed modes.
- Added checks for existing Authorization headers to prevent redundant injections in self-hosted modes.

* test(manifest): add unit tests for authentication mode deserialization

- Introduced tests to validate the deserialization of known authentication modes in the SkillManifest.
- Added checks to ensure invalid authentication types and empty mode lists are correctly rejected.
- These tests enhance the robustness of the authentication configuration handling in the manifest module.

* refactor(messaging): simplify MessagingPanel by removing unused constants and improving input handling

- Removed unused constants related to channel statuses, authentication modes, and fallback definitions to streamline the MessagingPanel component.
- Updated input handling to use a more concise onChange function, enhancing code readability.
- Commented out placeholder and className properties for input fields to improve clarity and focus on essential functionality.

* refactor(webhooks): streamline TunnelList imports for improved clarity

- Combined the import statements for Tunnel type and tunnelsApi from the same module into a single line, enhancing code readability and organization.
2026-04-04 02:20:39 -07:00
Steven EnamakelandGitHub 530cb5c5c4 Update webhook routes for backend contract (#316) 2026-04-04 01:43:08 -07:00
Steven EnamakelandGitHub 90f7a0dc54 feat(webhooks): add developer webhook debug panel (#314)
* feat(webhooks): add Webhooks Debug Panel and related functionality

- Introduced a new Webhooks Debug Panel for inspecting registered webhook tunnels and viewing captured request/response logs.
- Added necessary backend support for listing webhook registrations and logs, as well as clearing logs.
- Updated Developer Options to include a route for the new Webhooks Debug Panel.
- Enhanced core RPC client to support new webhook-related commands and events.
- Implemented logging and error handling for webhook requests in the backend.

This feature enhances developer tooling for monitoring and debugging webhook interactions.

* feat(webhooks): add Webhooks Debug Panel and related functionality

- Introduced a new Webhooks Debug Panel for inspecting registered webhook tunnels and captured request logs.
- Added functionality to list webhook registrations and logs, clear logs, and display real-time updates.
- Updated Developer Options to include the new Webhooks section.
- Enhanced core RPC client to support new webhook-related commands and events.
- Implemented backend support for webhook event handling and logging.

This feature aims to improve developer tooling for monitoring and debugging webhook interactions.

* feat(webhooks): enhance TunnelList and useWebhooks for echo registration

- Updated TunnelList component to include functionality for registering and unregistering echo for tunnels.
- Enhanced useWebhooks hook to support echo registration and unregistration, including real-time updates for tunnel activity.
- Added connection status display in the Webhooks page to indicate the connection state to the core service.
- Improved error handling and user feedback for echo toggle actions in the TunnelCard component.

These changes improve the user experience for managing webhook tunnels and their associated echo registrations.

* refactor(webhooks): streamline import of WebhookActivityEntry type

- Removed redundant import statement for WebhookActivityEntry in useWebhooks.ts.
- Updated the import to use a direct reference from the webhooksSlice, improving code clarity and maintainability.

* ran formatter
2026-04-03 15:04:45 -07:00
53b3d67460 fix(memory): ingest entities/relations after skill sync (#292) (#313)
* fix(memory): ingest entities/relations after skill sync (#292)

After store_skill_sync persists a raw document, call ingest_doc to
extract entities and relations into the memory graph. For Notion syncs,
individual pages are extracted from the sync blob and ingested
separately (keyed by page ID) so GLiNER operates on clean page text
rather than a monolithic JSON blob. Other skills ingest the full
content as a single document.

Closes #292

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

* style: apply cargo fmt to event_loop.rs

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

* fix(memory): use page_key for ingestion dedup, strip credentials

- Use page_key (page-{id}) as the ingestion document key to match
  store_skill_sync, ensuring consistent dedup on re-sync
- Strip __oauth_credential from content before ingesting in the
  fallback (non-Notion) branch to prevent credentials in the graph
- Add tests for strip_credentials

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-03 11:38:34 -07:00
Steven EnamakelandGitHub 9bf2b68a11 Fix Ollama download retries and progress reporting (#312)
* Fix Ollama download retry loop after interruptions

* Aggregate Ollama pull progress across layers
2026-04-03 10:39:20 -07:00
Steven EnamakelandGitHub 4022b40a02 Fix Ollama workspace install flow (#310) 2026-04-03 10:13:32 -07:00
735152cb3f feat(memory): surface entity types in recall/query API and UI (#207) (#302)
* fix: patch whisper-rs-sys for Windows MSVC static CRT (/MT)

The upstream whisper-rs-sys builds whisper.cpp via CMake which
defaults to /MD (dynamic CRT), but Rust and all other C deps
use /MT (static CRT). This causes LNK2038/LNK1169 linker errors
on Windows.

Patch whisper-rs-sys from tinyhumansai/whisper-rs-sys fork which
adds config.static_crt(true) and overrides all per-config CMake
flags (Debug/Release/MinSizeRel/RelWithDebInfo) from /MD to /MT.

Closes #273

* feat: surface entity types in memory recall/query text context

Entity types extracted by GLiNER (person, project, organization, etc.)
were stored in graph attrs but not rendered in LLM context text.
Relations now display as Alice (PERSON) -[OWNS]-> Atlas (PROJECT)
instead of Alice -[OWNS]-> Atlas.

Closes #207

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

* feat(memory): add entity type UI rendering (#207)

- New MemoryTextWithEntities component with colour-coded type badges
- MemoryWorkspace + MemoryDebugPanel pass structured entity data
- MemoryGraphMap shows entity types below node labels
- MemoryInsights shows EntityTypeBadge for subject/object types
- tauriCommands returns typed MemoryQueryResult with entities
- Updated useConsciousItems and tests for new return types

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

* style: fix prettier formatting

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

* style: fix cargo fmt in query.rs

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

* fix: use local regex instead of mutating module-level lastIndex

Avoids react-hooks/immutability ESLint error by using a non-global
regex for the .test() check instead of resetting ENTITY_TYPE_RE.lastIndex.

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

---------

Co-authored-by: sanil jain <jainsanil18@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 20:34:55 +05:30
YellowSnnowmannandGitHub 15ee9220a8 Local AI: unified preset bootstrap, first-run Home flow, and resilient model pulls (#304)
* feat(local-ai): unify preset bootstrap, first-run Home flow, and pull retries

- Add localAiBootstrap helpers (preset apply + asset download with retries)
- Expose selected_tier from local_ai.presets; apply recommended tier in core bootstrap when unset
- Extend Ollama pull and large-asset HTTP timeouts; retry interrupted pulls
- Wire Home/onboarding to unified bootstrap; improve download snackbar vs status
- Add Vitest/Rust tests for bootstrap and UI flows

* fix: synchronize Local AI progress UI and add error logging for manual bootstrap attempts

* refactor(tests): streamline skill installation tests by removing HTTP server setup

- Simplified test_skill_install_creates_files and test_skill_install_checksum_verification by replacing the HTTP server setup with direct file creation using tempfile.
- Updated download and manifest URLs to point to local file paths instead of server endpoints, enhancing test reliability and performance.

* feat(home): implement retry logic for local AI bootstrap attempts

- Added a mechanism to track and limit the number of bootstrap attempts for local AI initialization in the Home component.
- Introduced a constant for maximum attempts and updated error handling to log failures after exceeding the limit, improving robustness during the first-run process.
2026-04-03 20:29:38 +05:30
4027f50c9e feat(memory): add bulk namespace clear operation (#205) (#301)
* fix: patch whisper-rs-sys for Windows MSVC static CRT (/MT)

The upstream whisper-rs-sys builds whisper.cpp via CMake which
defaults to /MD (dynamic CRT), but Rust and all other C deps
use /MT (static CRT). This causes LNK2038/LNK1169 linker errors
on Windows.

Patch whisper-rs-sys from tinyhumansai/whisper-rs-sys fork which
adds config.static_crt(true) and overrides all per-config CMake
flags (Debug/Release/MinSizeRel/RelWithDebInfo) from /MD to /MT.

Closes #273

* feat: add bulk namespace clear operation for memory

Add memory_clear_namespace RPC that atomically deletes all documents,
vector chunks, KV entries, and graph relations in a namespace. Includes
Tauri command wrapper and three tests verifying cleanup, no-op on empty
namespaces, and cross-namespace safety.

Closes #205

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

* feat(memory): add Clear Namespace UI to MemoryDebugPanel (#205)

Adds namespace selector, confirmation dialog, success/error feedback,
and auto-refresh after clearing.

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

* style: fix prettier and cargo fmt formatting

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

* fix: unwrap RpcOutcome envelope in memoryClearNamespace

callCoreRpc returns { result: T }, but memoryClearNamespace was returning
the raw envelope instead of unwrapping .result like other callers do.

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

---------

Co-authored-by: sanil jain <jainsanil18@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:23:23 +05:30
bd8d3ed15a fix(memory): clean up unused JWT token parameter in memory init (#204) (#300)
* fix: patch whisper-rs-sys for Windows MSVC static CRT (/MT)

The upstream whisper-rs-sys builds whisper.cpp via CMake which
defaults to /MD (dynamic CRT), but Rust and all other C deps
use /MT (static CRT). This causes LNK2038/LNK1169 linker errors
on Windows.

Patch whisper-rs-sys from tinyhumansai/whisper-rs-sys fork which
adds config.static_crt(true) and overrides all per-config CMake
flags (Debug/Release/MinSizeRel/RelWithDebInfo) from /MD to /MT.

Closes #273

* fix: clean up unused JWT token parameter in memory init

Memory is local-only (SQLite). The from_token() method accepted a JWT
but ignored it, always falling back to new_local(). Remove the dead
method, make jwt_token optional in MemoryInitRequest for backward
compat, and document the local-only design.

Closes #204

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

---------

Co-authored-by: sanil jain <jainsanil18@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:23:02 +05:30
Mega MindandGitHub 04146bf0bf Fix/191 skills reliability upstream (#282)
* feat(skills): core RPC data stats, tool timeout env, ping state merge (#191)

- Add openhuman.skills_data_stats and SkillDataDirectoryStats (disk usage).
- Centralize tool execution timeout via OPENHUMAN_TOOL_TIMEOUT_SECS (tool_timeout).
- Apply timeout to skill event loop, agent tool loop, harness default, delegate.
- Ping scheduler: merge connection_error into published_state via registry.
- JSON-RPC e2e: assert skills_data_stats.

Closes #214
Closes #218
Part of #213 (backend)

Made-with: Cursor

* feat(app): skills sync stats UI, reconnect resync, FE timeouts, chat errors (#191)

- useSkillDataDirectoryStats + Skills.tsx merge disk stats with skill state.
- resyncRunningSkillsAfterReconnect on socket connect; disconnectSkill OAuth cleanup in finally.
- withTimeout for callTool/triggerSync; VITE_TOOL_TIMEOUT_SECS in app .env.example.
- Structured ChatSendError in Conversations (data-chat-send-error-code).

Closes #213
Closes #215
Closes #216
Closes #217
Closes #219

Made-with: Cursor

* test(e2e): onboarding helpers and skills smoke specs (#191)

- shared-flows: 5-step onboarding, completeOnboardingIfVisible.
- auth-access-control + voice-mode use shared helpers.
- skills-registry: named skill assertion; new skill-oauth, multi-round, reconnect, lifecycle specs.

Closes #220
Closes #221
Closes #222
Closes #223
Closes #224
Part of #189 (E2E helpers)

Made-with: Cursor

* style: rustfmt + Prettier for CI (PR #282)

Fix Type Check workflow: prettier --check and cargo fmt --check.

Made-with: Cursor

* fix: PR #282 review — tool timeout config, tool_timeout module, CI diagnostics

- Centralize VITE_TOOL_TIMEOUT_SECS in config.ts (TOOL_TIMEOUT_SECS)
- Move tool_timeout to folder module; merge_published_state broadcasts SKILL_STATE_CHANGED
- Resync guard after socket reconnect; qjs_engine logs data dir stat errors
- E2E: registry/lifecycle/multi-round failure diagnostics; onboarding label constant
- chatSendError arrow export; rustfmt/import grouping in event_loop

Made-with: Cursor

* test(e2e): add Gmail skill end-to-end tests

- Introduced a comprehensive end-to-end test suite for the Gmail skill, covering the full lifecycle from discovery to OAuth completion and email management.
- Implemented two modes: a lifecycle-only mode that validates the skill's event loop without real credentials, and a live mode that interacts with the Gmail API using actual credentials.
- Added detailed environment variable requirements and usage instructions for both testing modes.

Closes #XXX (replace with relevant issue number if applicable)
2026-04-02 15:25:31 -07:00
sanil-23andGitHub 945a5c4a02 feat: subconscious loop — local-model background awareness via heartbeat (#268)
* feat: subconscious loop — local-model background awareness via heartbeat

Add a subconscious inference layer to the heartbeat engine. On each
tick, the engine reads HEARTBEAT.md tasks, builds a delta-based
situation report (memory docs, graph relations, skills health,
environment), and evaluates them with the local Ollama model.

Architecture:
- HeartbeatEngine (scheduler) delegates to SubconsciousEngine (brain)
- HeartbeatConfig extended with inference_enabled, context_budget_tokens
- No separate SubconsciousConfig — all config lives under [heartbeat]
- Default HEARTBEAT.md ships with 3 active tasks (email, deadlines, skills)

Subconscious module (src/openhuman/subconscious/):
- engine.rs: tick logic, local model inference, escalation to cloud model
- situation_report.rs: delta assembler (memory, graph, skills, env, tasks)
- prompt.rs: task-driven system prompt for local model
- decision_log.rs: dedup tracking with 24h TTL and acknowledgment
- types.rs: Decision (noop/act/escalate), TickOutput, RecommendedAction
- schemas.rs: RPC controllers (subconscious_status, subconscious_trigger)
- integration_test.rs: two-tick lifecycle test with fixtures

Decision flow:
- noop: no changes, skip — no LLM call wasted
- act: local model recommends actions → stored in memory KV
- escalate: calls cloud model to resolve → concrete actions stored

Verified with real Ollama inference (gemma3:4b):
- Tick 1: ingested gmail+notion → "act: deadline needs attention" (high)
- Tick 2: ingested state changes → "act: deadline moved" (high)
- Skills health section populated from live skill registry

Closes #145

* feat: add subconscious_actions RPC endpoint

New endpoint openhuman.subconscious_actions returns stored action
entries from the subconscious KV namespace, sorted by most recent
first, with configurable limit (default 20).

Response format:
{
  "entries": [
    { "tick_at": 1775117975.58, "actions": [...] }
  ],
  "count": 1
}

The upcoming subconscious page will call this to display
notifications and recommended actions to the user.

* fix: budget underflow and UTF-8 panic in situation report truncation

- Use saturating_add for newline byte to prevent underflow when
  section exactly fills the remaining budget
- Truncate at valid UTF-8 char boundary using char_indices instead
  of raw byte slicing, which panicked on multibyte characters
- Add tests for exact-fit and multibyte truncation

* fix: address CodeRabbit review — shared engine, dedup, consistent schema

Fixes from CodeRabbit review on PR #268:

- #8 Two engine instances: Add global.rs singleton shared between
  HeartbeatEngine::run() and RPC handlers. Both use get_or_init_engine()
  so decision log, counters, and last_tick_at are always in sync.

- #3 Dedup disabled: tick() now extracts actual document IDs from
  memory via build_situation_report_with_doc_ids() and passes them
  to decision_log.record(). filter_unsurfaced() actually filters now.

- #5 Decision log not loaded on trigger: tick() loads persisted log
  from KV on first execution (total_ticks == 0), not only from run().

- #4 Inconsistent action schema: handle_escalation() normalizes agent
  response into RecommendedAction[] via normalize_escalation_response().
  Both act and escalate paths store the same schema.

- #7 Key collision: store_actions() uses millisecond timestamp + random
  suffix instead of second-precision truncation.

- #10 No-changes unreachable: tick() checks has_new_data (unsurfaced
  doc IDs) OR has_memory_changes (report text) instead of naive string
  matching on environment section.

* fix: include document content in situation report, not just titles

The local model needs actual content to evaluate HEARTBEAT.md tasks
meaningfully. Previously it only saw titles like "Deadline reminder"
with no way to know if it's urgent.

Now recalls content per namespace (up to 500 chars each, max 10
namespaces) via client.recall_namespace(). The model sees actual
email text and page content alongside the task checklist.

* fix: timestamp parsing, byte-boundary slicing, and truncation overshoot

- schemas.rs: split on first ':' after 'actions:' prefix before parsing
  timestamp, so keys like 'actions:123456:xyz' parse correctly
- situation_report.rs: use truncate_at_char_boundary() for error strings
  instead of raw byte slice which panics on multibyte characters
- situation_report.rs: fix append_section and truncate_at_char_boundary
  to use char END offset (i + len_utf8) in take_while condition, so
  multibyte chars that start before but end after the budget are excluded
2026-04-02 21:51:09 +05:30
YellowSnnowmannandGitHub 8acd34d2a9 Feat/add dictation (#278)
* feat(dictation): implement voice dictation feature with overlay and settings panel

- Added DictationOverlay component for real-time speech-to-text functionality, including recording, transcribing, and error handling.
- Introduced useDictation hook to manage audio recording and transcription processes.
- Created DictationPanel for configuring dictation settings, including hotkey registration and floating launcher preferences.
- Updated SettingsHome to include a navigation option for the new dictation feature.
- Integrated dictation state management with Redux, allowing for persistent settings and status checks.
- Enhanced Tauri commands for registering global hotkeys and managing dictation state.

This update provides a comprehensive voice dictation experience, enabling users to transcribe speech to text using local AI.

* fix(dictation): update DictationOverlay to conditionally render based on floating launcher state

- Reintroduced the useAppDispatch and useAppSelector hooks for state management.
- Added showFloatingLauncher to the state selection, ensuring the overlay only renders when the floating launcher is active.
- Simplified the return statement for position calculations in the drag handler.
- Improved code readability by formatting JSX elements for better clarity.

This update enhances the user experience by ensuring the dictation overlay behaves correctly based on the application's state.

* feat(settings): add dictation route and panel to settings navigation

- Updated the SettingsRoute type to include 'dictation' as a new route.
- Integrated DictationPanel into the Settings page for user configuration.
- Enhanced dictation state management by adding showFloatingLauncher to the dictationSlice, allowing for better control of the dictation overlay.

This update improves the settings navigation and user experience by providing access to dictation features directly from the settings menu.

* feat(dictation): integrate DictationOverlay and enhance dictation settings

- Added DictationOverlay component to the main App for improved user interaction with dictation features.
- Updated DictationPanel to include a new preference for showing a floating launcher, enhancing user control over dictation functionality.
- Enhanced state management by incorporating showFloatingLauncher into the dictationSlice, allowing for better configuration of the dictation experience.

This update improves the overall user experience by providing direct access to dictation features and customizable settings.

* feat(dictation): enhance DictationOverlay and Conversations for improved text insertion

- Added functionality to insert text into editable elements from the DictationOverlay, improving user interaction with dictation features.
- Implemented event listener in Conversations to handle custom dictation insert events, allowing seamless integration of transcribed text into the input field.
- Updated state management to ensure the correct editable target is used for text insertion, enhancing overall user experience.

This update streamlines the dictation process, making it more intuitive and responsive to user actions.

* fix(dictation): refine STT availability logic in dictationSlice

- Updated the logic for determining STT availability to ensure it only considers the model file as available when both the model file exists and there is a method to run inference (either the in-process engine is loaded or a whisper binary is present).
- This change prevents misleading user experiences by avoiding the display of the overlay when the necessary components for transcription are not available.

This update enhances the reliability of the dictation feature by providing clearer conditions for STT availability.

* refactor(dictation): streamline position management in DictationOverlay

- Removed redundant state management for the position of the dictation overlay, consolidating logic to initialize and reset the position based on the current status.
- Introduced a new `resetLauncherPosition` function to simplify resetting the overlay's position when necessary.
- Updated event handling to ensure the overlay's position is reset appropriately after text insertion actions.

This update enhances the clarity and efficiency of the DictationOverlay component, improving user experience during dictation interactions.

* refactor(dictation): improve hotkey registration and unregistration process

- Streamlined the logic for registering and unregistering dictation hotkeys, ensuring that old shortcuts are properly managed before new ones are registered.
- Introduced rollback mechanisms to restore previous shortcuts in case of registration failures, enhancing reliability.
- Simplified error handling and logging for better clarity during the hotkey management process.

This update enhances the robustness of the dictation feature by ensuring a smoother transition between hotkey states.

* refactor:  delete unncessesary pr md file

* refactor(dictation): enhance dictation functionality and error handling
 compatibility.

* refactor(dictation): improve code formatting and readability across components

- Enhanced formatting in DictationOverlay for better clarity in asynchronous action handling.
- Streamlined text extraction logic in useDictation for improved readability.
- Consolidated model directory setting in DictationPanel to a single line for simplicity.
- Improved logging consistency in tauriCommands and speech service files.

These changes enhance the maintainability and readability of the dictation-related components.

* refactor(dictation): manage DictationOverlay position based on status changes

- Introduced a reference to track the previous status of the dictation overlay.
- Updated the effect to reset the overlay's position when transitioning from 'idle' to any other status, enhancing user experience during dictation sessions.

This change improves the responsiveness of the DictationOverlay component to status changes, ensuring a smoother interaction for users.

* refactor(tests): update MemoryWorkspace tests to specify span selector

- Modified test assertions in MemoryWorkspace.test.tsx to include a selector for 'span' elements when checking for text presence.
- This change enhances the specificity of the tests, ensuring they accurately target the intended elements in the rendered component.

These updates improve the reliability of the MemoryWorkspace component tests.
2026-04-02 20:54:46 +05:30