* fix(chat): deduplicate assistant messages by subscribing to canonical events only (#432)
The Rust core emits socket events with both snake_case and colon:case
aliases via emit_with_aliases(). The frontend was subscribing to both,
causing every chat event to fire twice and producing duplicate assistant
messages.
- Subscribe only to canonical snake_case events (tool_call, chat_segment,
chat_done, chat_error) instead of both naming conventions
- Add safety-net dedup layer in Conversations.tsx using a seen-events map
with TTL to guard against any remaining edge cases
- Add unit tests verifying only canonical events are processed
Closes#432
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* style: apply prettier formatting to chatService test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: display app version in settings panel
* fix(onboarding): auto-refresh accessibility state after grant (#351)
* style(onboarding): apply formatter for issue #351 fix
* fix(onboarding): ESLint + typed mock for ScreenPermissionsStep; clear flag in handler
Consolidate tauriCommands imports and drop redundant mock cast.
Handle granted accessibility in focus/visibility callback instead of a follow-up effect.
Made-with: Cursor
* feat(env): add support for custom dotenv path and update dependencies
- Introduced an optional environment variable `OPENHUMAN_DOTENV_PATH` to specify a custom path for dotenv files, enhancing configuration flexibility.
- Updated `Cargo.toml` to include the `dotenvy` dependency for improved dotenv file handling.
- Enhanced the `.env.example` file with a new comment for the custom dotenv path.
- Added data-testid attributes and button types in `SkillDebugModal` and `Skills` components for better testability.
- Created new tests for Gmail and Notion third-party skills to ensure proper functionality of sync and debug tools.
- Added documentation for memory sync functions to clarify usage patterns and function details.
* fix: address CodeRabbit review on PR #441
- Dotenv: treat empty OPENHUMAN_DOTENV_PATH as unset; propagate from_path errors
- Document OPENHUMAN_DOTENV_PATH parent-env requirement in .env.example
- Memory docs: MD040 fence language; clarify skill namespace vs integration id
- QuickJS bootstrap: modern helpers, generic platform.notify log, template URLs
- Skills UI: type=button on close/settings; async waitFor in sync tests
- Gmail OAuth e2e: workspace env matches MemoryClient; env/engine drop guards;
redact secrets from logs
- Add replace_global_engine for test teardown
Made-with: Cursor
Phase 1 of the upsell flow for free users:
- Shared `useUsageState` hook with module-level cache (60s TTL)
- Reusable `UpsellBanner` component (info/warning/upgrade variants)
- `UsageLimitModal` shown when user tries to send at hard limit
- `GlobalUpsellBanner` for app-level usage warnings
- Pre-limit warning banner in Conversations at 80%+ usage
- localStorage-based dismiss persistence with cooldown
Closes#403
- Introduced a new optional `bypassRateLimit` field in the TeamUsage interface to manage rate limit enforcement for specific users.
- Updated Conversations component to conditionally render limit indicators and messages based on the `bypassRateLimit` status, enhancing user experience by providing clearer feedback on usage limits.
* Implement referral system with UI components and API integration
- Added to document the referral system, including reward structure, rules, data model, migration, core services, and API endpoints.
- Created component to display referral stats and allow users to apply referral codes.
- Integrated referral functionality into the onboarding process with for applying referral codes.
- Updated page to include the new .
- Implemented API calls in for fetching referral stats and applying referral codes.
- Added tests for the referral API to ensure proper functionality and data normalization.
- Introduced device fingerprinting for referral code application to prevent abuse.
This commit establishes a comprehensive referral system, enhancing user engagement and incentivizing referrals.
* Update OLLAMA_BASE_URL to local development address
* Enhance referral system and onboarding process
- Added a new function to format reward rates from basis points to percentage for better display in the ReferralRewardsSection.
- Improved loading state management in the referral stats loading process to prevent race conditions.
- Updated the Onboarding component to handle referral step skipping more effectively, ensuring a smoother user experience.
- Fixed a typo in the WelcomeStep component's button label for clarity.
- Enhanced error handling in the referral API to provide clearer feedback on failures.
These changes improve the usability and reliability of the referral system and onboarding experience.
* fix(ui): state-aware bootstrap buttons with user feedback (#353)
When local AI state is "ready", replace the Bootstrap button with a
"Running" badge so clicking it no longer appears to do nothing.
Show "Retry" label when state is degraded. Add transient success/error
messages after manual bootstrap/re-bootstrap actions so the user always
gets clear feedback.
Closes#353
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test(ui): add unit tests for state-aware bootstrap buttons (#353)
Cover the four key rendering states of the Home local-AI card:
- "Running" badge when state is ready (Bootstrap button hidden)
- "Retry" label when state is degraded
- "Bootstrap" label when state is idle
- Transient "Re-bootstrap complete" message after successful re-bootstrap
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(settings): resolve blank state on first open
Keep CoreStateProvider bootstrapping alive on initial RPC failure instead
of immediately giving up — lets the 3s poll retry until the sidecar
responds (up to 5 attempts). Add catch-all route in Settings to redirect
unmatched sub-paths, and show RouteLoadingScreen during PersistGate
rehydration instead of rendering nothing.
Closes#413
* refactor: use async/await in poll handler for consistency
Address CodeRabbit nitpick — replace .then()/.catch() chain with
async/await in the setInterval poll callback to match the rest of the
codebase style.
- Updated comments and variable names in the billingHelpers, InferenceBudget, SubscriptionPlans, and Conversations components to reflect the new 10-hour rolling inference window.
- Adjusted UI labels and descriptions to ensure clarity regarding the 10-hour cap and its implications for users.
- Enhanced the TeamUsage interface documentation to accurately describe the rolling inference window and its associated limits.
* feat(onboarding): redesign WelcomeStep as auto-advancing carousel
Replace the static welcome screen with a 3-slide auto-rotating carousel
(Welcome, Integrations, Automation) that cycles every 5 seconds. The
"Let Start" button advances to the next onboarding step as before.
- WelcomeStep now contains internal carousel with dot pagination
- ProgressIndicator changed from bar segments to dot indicators
- Removed top-level ProgressIndicator from Onboarding.tsx
- Slides 2 and 3 have image placeholders for future visuals
* style: fix prettier formatting in Onboarding.tsx
* feat(onboarding): add visuals for integration and automation slides
Replace placeholder divs with actual images for onboarding carousel
slides 2 (manage work / integrations) and 3 (automate it all / tasks).
* feat(onboarding): navigate to conversations page after completion
Redirect user to /conversations after onboarding completes or is
skipped, so they land directly on the chat page.
* fix(test): wrap OnboardingOverlay tests in MemoryRouter
The useNavigate hook added in the previous commit requires a Router
context. Wrap all test renders in MemoryRouter to fix the failures.
* style: fix prettier formatting in OnboardingOverlay test
* feat(tree-summarizer): implement hierarchical summarization engine and event handling
- Introduced a new `tree_summarizer` module to manage hierarchical time-based summaries, organizing data into a tree structure (root → year → month → day → hour).
- Added functionality to ingest raw content, summarize it into hour leaves, and propagate summaries upward through the tree.
- Implemented event handling for summarization completion and tree rebuild events, enhancing observability and modularity.
- Created RPC operations for ingesting content, triggering summarization, querying the tree, and retrieving tree status.
- Added comprehensive tests to ensure the reliability of the summarization process and event handling.
This update significantly enhances the summarization capabilities of the system, allowing for efficient data organization and retrieval.
* feat(tree-summarizer): add CLI support for tree summarization commands
- Introduced a new `tree-summarizer` command to the CLI, allowing users to ingest content, run summarization jobs, query the summary tree, check status, and rebuild the tree.
- Updated the CLI help documentation to include the new command and its subcommands.
- Added a new module `tree_summarizer_cli` to encapsulate the tree summarization functionality.
This enhancement improves the usability of the summarization features, providing a streamlined interface for managing hierarchical summaries directly from the command line.
* style: apply cargo fmt to tree_summarizer module
* feat(tree-summarizer): implement TreeSummarizerEventSubscriber for observability logging
- Added a new `TreeSummarizerEventSubscriber` to log events related to tree summarization, enhancing observability.
- Updated the `start_channels` function to register the new subscriber.
- Refactored the `run_summarization` function to group buffered entries by hour and publish events upon completion of summarization.
- Improved documentation and added tests for the new subscriber functionality.
This update aims to provide better insights into the summarization process and facilitate future cross-module workflows.
* refactor(tree_summarizer): streamline buffer backup and function signature
- Simplified the buffer backup process by consolidating the rename operation with context handling for better error reporting.
- Cleaned up the function signature of `derive_node_ids_from_hour_id` for improved readability.
These changes enhance code clarity and maintainability within the tree summarization engine.
* feat(tree_summarizer): enhance tree summarization with metadata support
- Updated the `tree_summarizer_ingest` function to accept an optional metadata parameter, allowing users to include additional context during content ingestion.
- Refactored related functions to validate and handle metadata, improving the overall robustness of the summarization process.
- Adjusted the buffer write functionality to store metadata alongside content, enhancing the data structure for future retrieval and processing.
These changes aim to enrich the summarization capabilities and provide more context for ingested content.
* refactor(tree_summarizer): improve error message formatting in node ID validation
- Enhanced the formatting of error messages in the `validate_node_id` function for better readability and consistency.
- Adjusted the string formatting to use multi-line syntax, improving clarity in error reporting.
- Minor formatting changes in the `strip_buffer_frontmatter` function to enhance code readability.
These changes aim to improve the maintainability and clarity of error handling within the tree summarization module.
* refactor(tree_summarizer): enhance buffer management and summarization process
- Replaced the buffer draining mechanism with a non-destructive read approach, allowing for safer data handling during summarization.
- Introduced a new `buffer_delete` function to explicitly manage the deletion of buffer entries after successful processing.
- Updated the `run_summarization` function to reflect these changes, ensuring that buffer entries are only deleted after durable writes are confirmed.
- Improved the backup process for the buffer directory during tree rebuilds, ensuring it is preserved outside the tree structure.
These modifications aim to improve data integrity and clarity in the summarization workflow.
* refactor(tree_summarizer): improve markdown parsing and timestamp handling
- Updated the `parse_node_markdown` function to trim trailing whitespace from the body after splitting frontmatter, enhancing data cleanliness.
- Modified test cases to use specific timestamps instead of the current time, ensuring consistent and predictable test results.
- Adjusted assertions in tests to reflect the new timestamp-based ordering of entries.
These changes aim to improve the robustness of markdown parsing and the reliability of test outcomes in the tree summarization module.
* feat(settings): add 'Use Vision Model' option to Screen Intelligence Panel
- Introduced a new checkbox in the Screen Intelligence Panel to toggle the use of a vision model for richer context extraction from screenshots.
- Updated state management to handle the new option and integrated it into the configuration and processing logic.
- Adjusted related tests and configurations to support the new feature, ensuring compatibility across the application.
* feat(cli): add --no-vision-model option for screen intelligence
- Introduced a new command-line option `--no-vision-model` to allow users to skip the vision model and use OCR and text LLM only.
- Updated the CLI options parsing to handle the new flag and modified the bootstrap logic to respect this setting.
- Enhanced usage documentation to reflect the new option and its alias `--ocr-only` for clarity.
* fix(screen-intelligence): read use_vision_model from engine runtime config
The processing worker was reading use_vision_model from the persisted
config file (Config::load_or_init), so the CLI --no-vision-model flag
had no effect. Now reads from the engine's in-memory runtime config
which the CLI correctly overrides via apply_config(). Also moves image
compression before OCR pass.
* fix: add use_vision_model to test fixtures and fix rustfmt
Add the new use_vision_model field to all AccessibilityConfig test
fixtures so TypeScript compilation passes. Also includes rustfmt
auto-fix for screen_intelligence_cli.rs.
* feat: display app version in settings panel
* fix(onboarding): auto-refresh accessibility state after grant (#351)
* style(onboarding): apply formatter for issue #351 fix
* fix(onboarding): ESLint + typed mock for ScreenPermissionsStep; clear flag in handler
Consolidate tauriCommands imports and drop redundant mock cast.
Handle granted accessibility in focus/visibility callback instead of a follow-up effect.
Made-with: Cursor
* fix(release): gate OAuth deep links on minimum app version (#365)
- Add semver helpers and VITE_MINIMUM_SUPPORTED_APP_VERSION / download URL in app config
- Block openhuman://oauth/success when desktop build is below minimum; enqueue error,
open latest-release URL, dispatch oauth:stale-app
- Pass new Vite env vars through release.yml and build-windows.yml Build frontend
- Document policy in docs/RELEASE_POLICY.md; note vars in app/.env.example
Closes#365
Made-with: Cursor
* fix: import React in SkillSetupWizard component
* fix: address CodeRabbit review (OAuth gate, semver, logging)
- Anchor semver regex to full string; arrow-style exports; tests for bad inputs
- Never throw from evaluateOAuthAppVersionGate; try/catch in deep link + omit raw URL from error logs
- Document build-time vs runtime policy in config JSDoc and RELEASE_POLICY
- Remove unused React import in SkillSetupWizard (tsc)
Made-with: Cursor
* fix: CodeRabbit — fail-closed OAuth gate, tauri-action Vite env, runbook
- Block OAuth when minimum is set but getVersion fails or version is unparseable
- Pass VITE_MINIMUM_* through tauri-action env (release + Windows) so bundles match yarn build
- Expand RELEASE_POLICY: artifact retirement, dual workflow env note
- Friendlier copy when current version is unknown
Made-with: Cursor
* feat: display app version in settings panel
* fix(onboarding): auto-refresh accessibility state after grant (#351)
* style(onboarding): apply formatter for issue #351 fix
* fix(onboarding): ESLint + typed mock for ScreenPermissionsStep; clear flag in handler
Consolidate tauriCommands imports and drop redundant mock cast.
Handle granted accessibility in focus/visibility callback instead of a follow-up effect.
Made-with: Cursor
* feat(welcome): redesign sign-in page to match Figma card layout
Rebuild Welcome page using the same white-card design language as the
Home page — centered container with shadow, border, and consistent
spacing. Adds horizontal OAuth pill buttons (Google, GitHub, Twitter),
"Or" divider, email input field, and "Continue with email" CTA.
* fix(hooks): remove core crate from pre-push rust:check
The root Cargo.toml includes whisper-rs-sys which fails to build on
macOS due to -mcpu=native in its cmake/ggml layer. The Tauri shell
crate builds fine and is the only Rust target the app ships, so
scope rust:check to src-tauri only.
* fix(voice): add per-segment confidence validation in whisper engine (#385)
Reject whisper segments with avg token log-probability below -0.7 or
entropy above 2.4. Return TranscriptionResult with confidence metadata
instead of plain String. Update callers in speech.rs and streaming.rs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(voice): upgrade default STT model from tiny to base (#385)
Base model produces significantly fewer hallucinations than tiny,
especially in noisy/quiet conditions. User can still override via config.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(voice): add real-time silence gating in audio capture (#385)
Gate sustained silence (>500ms) from being sent to whisper to prevent
hallucinations. Maintain 100ms look-ahead ring buffer so speech onset
after pauses is not clipped. Thresholds adapt to source sample rate.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(voice): fix Fn key timing race condition in hotkey event loop (#385)
start_recording() blocks 1-7s on cpal device init but macOS fires Fn
Release almost immediately, causing skipped cycles. Move recording
start to spawn_blocking so the event loop stays responsive. Buffer
Release events during setup and ensure minimum 1.5s recording duration
when release arrives before recording handle is ready.
Also includes: capture focused app on hotkey press, pass through
pipeline for focus validation before paste.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(voice): validate and restore focus before paste, attempt regardless (#385)
Add expected_app parameter to insert_text(). Before Cmd+V, validate
focus via accessibility API and restore via AppleScript if shifted.
Don't abort paste on focus validation failure — attempt insertion
regardless so text is never silently lost.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(voice-ui): align voice server RPC response shape in settings panel (#385)
* style(voice): apply rustfmt formatting in text_input
* fix(voice): address CodeRabbit regressions in server, streaming, and settings polling
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* 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
* feat(onboarding): move Tools step from onboarding to Settings
Remove the Tools toggle step from onboarding (5 → 4 steps) and add it
as a dedicated Tools panel under Settings > AI & Skills. This reduces
onboarding friction while keeping tool configuration accessible.
* feat(onboarding): remove Local AI step from onboarding
Remove the Local AI download/consent step, reducing onboarding from
4 to 3 steps (Welcome → Screen Permissions → Skills). Local AI setup
is already accessible from Settings and auto-bootstraps from Home.
Remove the Tools toggle step from onboarding (5 → 4 steps) and add it
as a dedicated Tools panel under Settings > AI & Skills. This reduces
onboarding friction while keeping tool configuration accessible.
* 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>
* 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.
* 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>
* 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>
* 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>
* 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>
* 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>
* fix(settings): normalize padding across all settings panels
Remove max-w-md mx-auto constraints from BillingPanel,
RecoveryPhrasePanel, TeamPanel, TeamMembersPanel, TeamInvitesPanel,
and TeamManagementPanel so all panels use consistent p-4 padding
matching ConnectionsPanel and the other baseline panels.
* refactor(intelligence): move memory workspace to Settings > Developer Options
Move Memory, Memory Graph, Intelligence Insights, Activity Heatmap, and
File Management from the Intelligence page into a new "Memory Data" panel
under Settings > Developer Options. The Intelligence page now shows only
the search bar and actionable items, keeping it focused for end users.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* refactor(intelligence): move memory workspace to Settings > Developer Options
Move Memory, Memory Graph, Intelligence Insights, Activity Heatmap, and
File Management from the Intelligence page into a new "Memory Data" panel
under Settings > Developer Options. The Intelligence page now shows only
the search bar and actionable items, keeping it focused for end users.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove max-w-md mx-auto constraints from BillingPanel,
RecoveryPhrasePanel, TeamPanel, TeamMembersPanel, TeamInvitesPanel,
and TeamManagementPanel so all panels use consistent p-4 padding
matching ConnectionsPanel and the other baseline panels.
Uncomment the pre-defined Home tab entry in BottomTabBar so it appears
as the first item in the bottom navigation. Route, active-state logic,
and page component were already wired — only the tab array entry was
commented out.
Closes#356
* 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.
* 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>
* 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>