* fix(auth): update RPC method names for authentication calls
Refactor authentication-related RPC method names to use underscores instead of dots for consistency. Updated methods include `get_state`, `get_session_token`, `clear_session`, and `store_session`.
chore: update OpenHuman version to 0.51.19
style: standardize string formatting in quickjs_libs/bootstrap.js and other files
- Replace single quotes with double quotes for string literals in various functions.
- Ensure consistent formatting across console logging and error handling.
fix(config): improve token retrieval logic in ops_core.rs
- Enhance the logic for retrieving the active session token from the credentials store, accommodating user-specific directories.
* test: align auth and OAuth assertions with current behavior
Update stale test expectations for underscore-style auth RPC methods and light-theme OAuth button classes, and make the bypass-login E2E assertion resilient to the current auth persistence model.
Made-with: Cursor
* chore: apply formatter output for login flow spec
Include Prettier formatting adjustments produced by the pre-push hook so the branch can pass repository push checks cleanly.
Made-with: Cursor
* fix(subconscious): seed defaults and spawn heartbeat on startup
The subconscious engine was only constructed lazily on the first
engine-routed RPC (trigger, tasks_add, status). Because
handle_tasks_list bypasses the engine and reads the store directly,
a fresh install showed an empty Subconscious panel until the user
clicked "Run now", even though SubconsciousEngine::new() seeds the
3 default system tasks on construction.
Separately, HeartbeatEngine::run() — the periodic tick loop — was
never spawned in production code. The only callers of HeartbeatEngine
were tests, so ticks never fired automatically; users had to trigger
each evaluation manually.
Both issues are fixed together in run_server_inner, following the
existing start_if_enabled pattern used by voice, screen_intelligence,
and autocomplete:
1. Call get_or_init_engine() at startup to construct the
SubconsciousEngine eagerly, which runs seed_default_tasks via
from_heartbeat_config. Construction is idempotent via OnceLock;
seeding is idempotent by title match, so repeat startups do not
duplicate the defaults.
2. Construct HeartbeatEngine with the heartbeat config and
workspace_dir, then tokio::spawn heartbeat.run() so the periodic
tick loop runs for the process lifetime. The loop re-acquires
the shared engine via get_or_init_engine() on each tick.
Guarded by config.heartbeat.enabled so users who disable the
heartbeat get neither startup seeding nor the background loop.
Add engine_construction_seeds_default_tasks integration test that
locks in the invariant: constructing SubconsciousEngine on a fresh
workspace_dir must leave the 3 default system tasks in the store,
with no tick, trigger, or explicit seed call. Also asserts that
reconstructing the engine on the same workspace does not duplicate
the defaults.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(subconscious): defer engine bootstrap until after login
Default system tasks seeded at sidecar startup into the pre-login global
workspace (`~/.openhuman/workspace/`) instead of the per-user workspace
(`~/.openhuman/users/<id>/workspace/`) the UI reads from after login.
The engine singleton is built lazily via `get_or_init_engine()` and
cached in a `OnceLock`. `Config::load_or_init` resolves `workspace_dir`
from `active_user.toml` — which does not exist until after login. When
the engine was constructed on startup it therefore seeded into the
global default, then the frozen singleton kept pointing at that path
for the rest of the session while RPC handlers like `tasks_list`
re-loaded config per call and read from the correct per-user path,
silently returning an empty list.
Fix:
- `subconscious/global.rs`: add `bootstrap_after_login()` (idempotent
via `BOOTSTRAPPED: AtomicBool`) which builds the engine against the
now-correct per-user workspace and spawns the heartbeat loop. Track
the heartbeat `JoinHandle` in a static so it can be aborted cleanly.
Add `reset_engine_for_user_switch()` that aborts the heartbeat,
clears the engine option, and resets the bootstrap flag.
- `core/jsonrpc.rs`: replace the unconditional eager init on startup
with a conditional one that only bootstraps if `active_user.toml`
already exists (so a user logged in from a previous session still
gets the engine up immediately after restart).
- `credentials/ops.rs`: call `bootstrap_after_login()` at the end of
`verify_and_store_session` so a fresh login triggers seeding against
the per-user workspace. Call `reset_engine_for_user_switch()` in
`clear_session` so logout tears down the engine + heartbeat loop and
a subsequent login rebuilds them against the new user.
Verified locally: sidecar restart with no `active_user.toml` logs
"bootstrap deferred — waiting for login"; post-login logs "seeded 3
tasks on init" + "heartbeat periodic loop spawned"; and
`subconscious.tasks_list` returns the 3 system defaults from the
per-user DB.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(subconscious): bound config load + guard frontend poll
Two related fixes for the Intelligence page freezing on a stale
subconscious activity-log snapshot while ticks kept progressing in the
sidecar.
Root cause (backend): the subconscious RPC handlers were the only
outlier in the entire JSON-RPC surface that called the raw
`Config::load_or_init()` instead of the shared
`load_config_with_timeout()` wrapper that every other domain schemas.rs
uses (cron, webhooks, voice, team, skills, service, referral, doctor,
…). `load_or_init` constructs a fresh `SecretStore` and runs a chain
of `decrypt_optional_secret` calls on every invocation, which may IPC
to the OS keychain — slow, unbounded, no caching. Under the Intelligence
page's 3-second poll (4 parallel RPCs × ~7 keychain round-trips each =
~28 keychain calls every 3s), this pileup was enough to pin the
frontend's `Promise.all` past the poll interval.
Root cause (frontend): `useSubconscious.refresh()` uses `fetchingRef`
as an in-flight guard. The ref is only cleared inside the `finally`
block that runs after `Promise.all` settles. With no per-RPC timeout
on the client side either, a single slow backend call would leave the
ref stuck `true`, and every subsequent 3s `setInterval` tick would
silently early-return at the top of `refresh`. The poller kept firing,
but every call was a no-op — so the UI froze on whatever snapshot it
last successfully fetched, even though the backend was still ticking
through new decisions.
Backend fix (`src/openhuman/subconscious/schemas.rs`):
- Replace the local `load_config()` helper body to delegate to
`crate::openhuman::config::load_config_with_timeout()`. Matches the
28 other domain schemas.rs files and brings subconscious handlers
under the same 30s bound used everywhere else.
Frontend fix (`app/src/hooks/useSubconscious.ts`):
- Add a `withTimeout` helper (2.5s per-RPC, strictly less than the
3s poll interval) that races each of the 4 parallel RPCs against
a timeout and resolves `null` on timeout — matching the existing
`.catch(() => null)` contract so downstream setState logic is
unchanged.
- Clear `fetchingRef.current = false` in the useEffect cleanup so a
late-returning request or a React Strict Mode double-mount in dev
can't leave the ref stuck `true` for the next mount.
Defense in depth: the backend bound prevents a permanent hang and
matches repo conventions, while the frontend bound guarantees the 3s
poll loop can never be pinned beyond one tick regardless of
server-side latency. Verified locally — `cargo check` clean,
`tsc --noEmit` clean, all 18 pre-existing warnings in unrelated modules.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style(jsonrpc): cargo fmt the startup bootstrap block
CI ran `cargo fmt --all -- --check` and flagged the conditional
bootstrap block in `run_server_inner` — `let already_logged_in`
should fold onto one line, the `.and_then` closure body should
inline, the `match ... .await` chain should fold, and the short
log!() calls should not break across lines. No behavior change.
Fixes three jobs on PR #462 that were all failing at the same
`cargo fmt --all -- --check` step (Rust Quality, Rust Tests,
Type Check TypeScript — the last one chains cargo fmt after
its prettier check).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Place "Restart & Refresh" and "Request Permissions" side by side,
move "Continue" directly below them, and push hint/error text to
the bottom so the button group is visually cohesive.
* fix(onboarding): clean up referral step UI and error display
Remove progress bar from onboarding overlay, remove back button from
referral step, place Skip/Apply buttons inline, and parse API errors
into user-friendly messages instead of showing raw response bodies.
* fix: remove unused onBack prop from ReferralApplyStep destructuring
All three OAuth CTAs (Google, GitHub, Twitter) now share a consistent
white pill-button style with light border instead of individual brand
colors. Email login section commented out as the backend flow is not
yet implemented.
* feat(settings,skills): reorganize settings and skills pages for consistency and usability
- Remove dead code: TauriCommandsPanel, useSettingsAnimation, SettingsPanelLayout,
SettingsBackButton, ProfilePanel, AdvancedPanel, SkillsPanel, SkillsGrid (~1900 lines)
- Standardize settings panel padding to p-4 space-y-4 across all panels
- Add breadcrumb navigation to SettingsHeader with route-derived breadcrumbs
- Decompose oversized panels: LocalModelPanel, AutocompletePanel, CronJobsPanel,
ScreenIntelligencePanel into sub-components in dedicated subdirectories
- Deduplicate skills management: move browser access toggle to Skills page,
remove redundant /settings/skills route
- Unify skill card layout: UnifiedSkillCard component with overflow menu for
secondary actions, consistent status/CTA patterns across all skill types
- Add skill search bar and category filter with grouped results
Closes#396
* fix(settings,skills): address CodeRabbit review feedback
- Use semantic nav/ol/li for breadcrumbs with aria-hidden separators
- Fix duplicate text-xs class in CompletionStyleSection
- Use interface instead of type for CronSkillConfig
- Disable cron option inputs when parent skill is disabled
- Deduplicate preset error rendering in DeviceCapabilitySection
- Fix low-contrast labels: text-stone-300 → text-stone-700, text-stone-200 → text-stone-600
- Disable "Set Path" button when input is empty
- Add aria-pressed to category filter buttons
- Convert SkillCategoryFilter to arrow function
- Use void operator for async onClick handler
- Simplify redundant conditional in ThirdPartySkillCard
- Use async/await instead of .then() in BrowserAccessToggle
* fix(tests): update Skills page tests for unified card layout
- Mock openhumanGetRuntimeFlags/openhumanSetBrowserAllowAll for BrowserAccessToggle
- Open overflow menu before clicking sync/debug buttons (now in secondary actions)
- Remove assertion for deleted "3rd Party Skills" heading
* fix(skills): show per-card loading state instead of hiding entire skill list on enable
When clicking Enable on a third-party skill (e.g. Gmail, Notion), the
entire skill list was replaced with a loading message. Now only the
clicked card's button shows "Enabling..." with a disabled state while
the install RPC runs, keeping all other cards visible and interactive.
* feat(settings,skills): reorganize settings and skills pages for consistency and usability
- Remove dead code: TauriCommandsPanel, useSettingsAnimation, SettingsPanelLayout,
SettingsBackButton, ProfilePanel, AdvancedPanel, SkillsPanel, SkillsGrid (~1900 lines)
- Standardize settings panel padding to p-4 space-y-4 across all panels
- Add breadcrumb navigation to SettingsHeader with route-derived breadcrumbs
- Decompose oversized panels: LocalModelPanel, AutocompletePanel, CronJobsPanel,
ScreenIntelligencePanel into sub-components in dedicated subdirectories
- Deduplicate skills management: move browser access toggle to Skills page,
remove redundant /settings/skills route
- Unify skill card layout: UnifiedSkillCard component with overflow menu for
secondary actions, consistent status/CTA patterns across all skill types
- Add skill search bar and category filter with grouped results
Closes#396
* fix(settings,skills): address CodeRabbit review feedback
- Use semantic nav/ol/li for breadcrumbs with aria-hidden separators
- Fix duplicate text-xs class in CompletionStyleSection
- Use interface instead of type for CronSkillConfig
- Disable cron option inputs when parent skill is disabled
- Deduplicate preset error rendering in DeviceCapabilitySection
- Fix low-contrast labels: text-stone-300 → text-stone-700, text-stone-200 → text-stone-600
- Disable "Set Path" button when input is empty
- Add aria-pressed to category filter buttons
- Convert SkillCategoryFilter to arrow function
- Use void operator for async onClick handler
- Simplify redundant conditional in ThirdPartySkillCard
- Use async/await instead of .then() in BrowserAccessToggle
* fix(tests): update Skills page tests for unified card layout
- Mock openhumanGetRuntimeFlags/openhumanSetBrowserAllowAll for BrowserAccessToggle
- Open overflow menu before clicking sync/debug buttons (now in secondary actions)
- Remove assertion for deleted "3rd Party Skills" heading
* feat(subconscious): stabilize heartbeat + subconscious loop (#392)
- Enable heartbeat by default (enabled=true, inference_enabled=true, 5min interval)
- Seed system tasks on engine init, not first tick
- SQLite-backed task/log/escalation persistence
- Overlap guard with generation counter — stale ticks are cancelled
- Single log entry per task per tick, updated in place (in_progress → act/noop/escalate/failed/cancelled)
- Rate-limit retry (429 only) for agentic-v1 cloud model calls
- Approval gate: unsolicited write actions on read-only tasks require user approval
- Analysis-only mode for agentic-v1 on read-only escalations
- Non-blocking status RPC — reads from DB, never blocks on engine mutex
- Frontend: system vs user task distinction, toggle switches, expandable activity log
- Frontend: 3s auto-poll on Subconscious tab, skill-related escalation navigation
- Consecutive failure counter in status (resets on success)
- last_tick_at only advances on successful evaluation
- Missing LLM evaluation fallback — unevaluated tasks default to noop
- Docs: subconscious.md architecture guide, memory-sync-functions.md reference
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style: fix Prettier formatting for subconscious frontend files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* ci: retrigger checks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(heartbeat): use disabled config in run_returns_immediately_when_disabled test
HeartbeatConfig::default() has enabled: true, so run() entered the infinite
loop and never returned — hanging the test (and CI) indefinitely.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(subconscious): remove HEARTBEAT.md task import, use SQLite as sole task source
Tasks are now managed exclusively in SQLite via the Subconscious UI.
HEARTBEAT.md is retained for instructions/context only, not as a task list.
Situation report now reads pending tasks from SQLite instead of HEARTBEAT.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* style: cargo fmt on subconscious engine
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(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>