diff --git a/.env.example b/.env.example index a171a1415e..cd14465fd7 100644 --- a/.env.example +++ b/.env.example @@ -336,6 +336,25 @@ OPENHUMAN_SKILLS_WORKING_MEMORY_ENABLED=true # [optional] Reserved cache directory for future managed CPython installs. # OPENHUMAN_RUNTIME_PYTHON_CACHE_DIR= +# --------------------------------------------------------------------------- +# Shared language-runtime pool (#5106) +# --------------------------------------------------------------------------- +# Reuse a small, bounded set of warm node/python worker processes across skill +# runs and node_exec instead of forking one interpreter child per run. Full +# tuning lives in config.toml `[runtime_pool]`; these are the operator knobs. +# Node pooling is ON by default (each job runs in an isolated worker_thread). +# Python pooling is OFF by default (jobs share one interpreter, so reuse can +# leak globals across runs); opt in with `[runtime_pool.python] enabled = true`. +# [optional] Master kill switch. Default: true. `false` reverts every caller to +# the legacy per-call spawn (no behavioural change, just no reuse). +# OPENHUMAN_RUNTIME_POOL_ENABLED=true +# [optional] Max concurrently-resident node workers (default 2). Work beyond +# this queues rather than forking a new interpreter. +# OPENHUMAN_RUNTIME_POOL_NODE_MAX_WORKERS=2 +# [optional] Max concurrently-resident python workers (default 2). Only takes +# effect when python pooling is explicitly enabled (see above). +# OPENHUMAN_RUNTIME_POOL_PYTHON_MAX_WORKERS=2 + # --------------------------------------------------------------------------- # TokenJuice — content-aware tool-output compaction (the content router) # --------------------------------------------------------------------------- diff --git a/.github/tauri-cef-expected-sha b/.github/tauri-cef-expected-sha index 0bc836bb06..9e09716ab2 100644 --- a/.github/tauri-cef-expected-sha +++ b/.github/tauri-cef-expected-sha @@ -1 +1 @@ -11ef51edbeadcca4517b18a037fff858a5dfae0f +455b47debb9d1f5d0f1527266e48af1670ad4bc5 diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 976a50fd2a..fe5816aae3 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -172,6 +172,8 @@ jobs: rustup target add aarch64-apple-darwin x86_64-apple-darwin - name: Install Tauri dependencies (ubuntu only) if: startsWith(matrix.settings.platform, 'ubuntu-') + env: + MATRIX_TARGET: ${{ matrix.settings.target }} run: | sudo apt-get update sudo apt-get install -y \ @@ -180,7 +182,12 @@ jobs: libevdev-dev libssl-dev libclang-dev desktop-file-utils \ libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \ - libgbm1 libpango-1.0-0 libcairo2 libatspi2.0-0 libxshmfence1 libu2f-udev + libgbm1 libpango-1.0-0 libcairo2 libatspi2.0-0 libxshmfence1 libu2f-udev \ + xvfb + if [ "$MATRIX_TARGET" = "x86_64-unknown-linux-gnu" ] \ + && ! command -v apparmor_parser >/dev/null 2>&1; then + sudo apt-get install -y apparmor + fi # NOTE: The post-build dump lives further down (after `cargo tauri build`) # so the binary actually exists when ldd runs. Running it here pre-build # silently no-op'd and gave us no signal during the @@ -528,19 +535,19 @@ jobs: done # Strip host graphics libraries (Mesa/libdrm/libva/libgbm) that lib4bin - # ldd-walks into the AppImage. Those drivers must come from the user's - # host system — even on a current Ubuntu runner the bundled Mesa can - # fail to initialize newer GPUs (RDNA3, Intel Arc, Lovelace) and - # crashes CEF on launch because the bundled libs shadow the host's - # working ones on LD_LIBRARY_PATH. CEF's own SwiftShader subdir is - # untouched. Re-signs the AppImage + updater tarball when signing - # is enabled. - - name: Strip host graphics libs from AppImage + # ldd-walks into the AppImage. Final-artifact validation runs before + # re-signing: amd64 also gets a bounded Xvfb launch from a foreign CWD, + # while arm64 receives static validation in this change. CEF's own + # SwiftShader subdir is untouched, and updater archives are rebuilt only + # after the validated image is final. + - name: Strip host graphics libs and validate final AppImage if: startsWith(matrix.settings.platform, 'ubuntu-') shell: bash env: MATRIX_TARGET: ${{ matrix.settings.target }} PROFILE: ${{ inputs.build_profile }} + APPIMAGE_RUNTIME_SMOKE: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' && '1' || '0' }} + APPIMAGE_RUNTIME_APPARMOR_USERNS: ${{ matrix.settings.target == 'x86_64-unknown-linux-gnu' && '1' || '0' }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY || secrets.UPDATER_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD || secrets.UPDATER_PRIVATE_KEY_PASSWORD }} run: | diff --git a/.github/workflows/ci-full.yml b/.github/workflows/ci-full.yml index 124b0f43c2..734c048912 100644 --- a/.github/workflows/ci-full.yml +++ b/.github/workflows/ci-full.yml @@ -287,13 +287,21 @@ jobs: mkdir -p "$OPENHUMAN_WORKSPACE" bash scripts/ci-cancel-aware.sh bash app/scripts/e2e-web-session.sh + - name: Pack Playwright E2E failure artifacts + if: failure() + run: | + mkdir -p .ci/artifacts + tar -czf .ci/artifacts/openhuman-playwright-failure-logs.tar.gz \ + -C "$OPENHUMAN_WORKSPACE" . + env: + OPENHUMAN_WORKSPACE: ${{ runner.temp }}/openhuman-playwright-workspace + - name: Upload Playwright E2E failure artifacts if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: e2e-playwright-failure-logs-${{ github.run_id }} - path: | - ${{ runner.temp }}/openhuman-playwright-workspace/** + path: .ci/artifacts/openhuman-playwright-failure-logs.tar.gz retention-days: 7 if-no-files-found: ignore diff --git a/.github/workflows/ci-lite.yml b/.github/workflows/ci-lite.yml index 4ae6ae2029..cdb5f5636c 100644 --- a/.github/workflows/ci-lite.yml +++ b/.github/workflows/ci-lite.yml @@ -430,7 +430,7 @@ jobs: run: | bash scripts/ci-cancel-aware.sh cargo test --manifest-path Cargo.toml \ --no-default-features --features tokenjuice-treesitter --lib -- \ - core::all:: core::cli:: core::jsonrpc:: core::legacy_aliases:: agent_registry::agents::loader:: + core::all:: core::cli:: core::jsonrpc:: core::legacy_aliases:: core::runtime:: agent_registry::agents::loader:: - name: Guard — new feature-gated test modules must be acknowledged # Self-maintaining coverage: the set of source files that #[cfg]-gate a test on @@ -446,6 +446,7 @@ jobs: core/cli_tests.rs core/jsonrpc_tests.rs core/legacy_aliases.rs + core/runtime/services.rs openhuman/agent/harness/builtin_definitions.rs openhuman/agent/harness/definition_tests.rs openhuman/agent/harness/session/tests.rs @@ -462,7 +463,7 @@ jobs: openhuman/x402/stub.rs EOF ) - ACTUAL=$(grep -rlE '#\[cfg\((not\()?feature = "(voice|media|web3|meet|mcp|skills|flows)"' src --include='*.rs' \ + ACTUAL=$(grep -rlE '#\[cfg\((not\()?feature = "(voice|media|web3|meet|mcp|skills|flows|channels)"' src --include='*.rs' \ | xargs grep -lE '#\[test\]|#\[tokio::test\]|fn .*_test' 2>/dev/null | sed 's|^src/||' | sort -u) if ! diff <(echo "$EXPECTED" | sed 's/^ *//' | sort -u) <(echo "$ACTUAL"); then echo "::error::Gated-test file set changed. Update the EXPECTED allowlist in the rust-feature-gate-smoke lane, and extend the scoped 'cargo test' filter if the new module can carry an ungated-assert regression (see #5022)." @@ -470,6 +471,54 @@ jobs: fi echo "gate-contract test coverage allowlist is current" + # Report-only (#5046). Measures steady-state RSS of an embedded openhuman_core + # agent roster and uploads the raw samples + a human summary. Deliberately NOT + # in `pr-ci-gate.needs`, so it can never fail a PR — it exists to accrue a + # baseline and its runner variance before the 30 MiB gate is flipped to + # blocking in a follow-up (add this job to pr-ci-gate + a threshold step then). + rust-rss-bench: + name: Rust RSS Benchmark (report-only) + needs: [changes] + if: needs.changes.outputs['rust-core'] == 'true' + runs-on: ubuntu-22.04 + timeout-minutes: 40 + container: + image: ghcr.io/tinyhumansai/openhuman_ci:rust-1.93.0 + env: + CARGO_INCREMENTAL: "0" + steps: + - name: Checkout code + uses: actions/checkout@v7 + with: + fetch-depth: 1 + persist-credentials: false + submodules: recursive + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: | + . -> target + cache-on-failure: true + shared-key: pr-rust-rss-bench + + # Fixture-contract signal: the gated bin's unit tests (build_roster, + # warm-up turn) never enter the default coverage lane, so run them here. + - name: Run rss-bench fixture tests + run: bash scripts/ci-cancel-aware.sh cargo test --features rss-bench --bin rss-bench + + - name: Build stripped-release rss-bench + run: bash scripts/ci-cancel-aware.sh cargo build --release --features rss-bench --bin rss-bench + + - name: Measure embedded RSS (5 fresh procs x {1,8} agents) + run: ./target/release/rss-bench --out bench-rss.json | tee -a "$GITHUB_STEP_SUMMARY" + + - name: Upload raw RSS samples + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: rss-bench-report + path: bench-rss.json + rust-core-coverage: name: Rust Core Coverage (cargo-llvm-cov) needs: [changes, rust-quality] @@ -806,7 +855,7 @@ jobs: key: tinycortex - name: Run TinyCortex engine and Composio sync tests - run: bash scripts/ci-cancel-aware.sh cargo test --manifest-path vendor/tinycortex/Cargo.toml --features git-diff,sync + run: bash scripts/ci-cancel-aware.sh cargo test --manifest-path vendor/tinycortex/Cargo.toml --features git-diff,sync,persona pr-ci-gate: name: PR CI Gate diff --git a/.github/workflows/e2e-playwright.yml b/.github/workflows/e2e-playwright.yml index b99adf6484..1ee21ff721 100644 --- a/.github/workflows/e2e-playwright.yml +++ b/.github/workflows/e2e-playwright.yml @@ -26,7 +26,10 @@ jobs: runs-on: ubuntu-22.04 container: image: ghcr.io/tinyhumansai/openhuman_ci:latest - timeout-minutes: 30 + # The complete serial web suite currently takes about 45 minutes on the + # shared runner; keep the standalone diagnostic workflow aligned with the + # 90-minute budget used by CI Full. + timeout-minutes: 90 steps: - name: Checkout code uses: actions/checkout@v7 @@ -73,12 +76,20 @@ jobs: mkdir -p "$OPENHUMAN_WORKSPACE" bash scripts/ci-cancel-aware.sh bash app/scripts/e2e-web-session.sh + - name: Pack Playwright E2E failure artifacts + if: failure() + run: | + mkdir -p .ci/artifacts + tar -czf .ci/artifacts/openhuman-playwright-failure-logs.tar.gz \ + -C "$OPENHUMAN_WORKSPACE" . + env: + OPENHUMAN_WORKSPACE: ${{ runner.temp }}/openhuman-playwright-workspace + - name: Upload Playwright E2E failure artifacts if: failure() uses: actions/upload-artifact@v7 with: name: e2e-playwright-failure-logs-${{ github.run_id }} - path: | - ${{ runner.temp }}/openhuman-playwright-workspace/** + path: .ci/artifacts/openhuman-playwright-failure-logs.tar.gz retention-days: 7 if-no-files-found: ignore diff --git a/.github/workflows/e2e-reusable.yml b/.github/workflows/e2e-reusable.yml index 2e0432060a..36cf2670b3 100644 --- a/.github/workflows/e2e-reusable.yml +++ b/.github/workflows/e2e-reusable.yml @@ -291,7 +291,8 @@ jobs: - { name: provider-web, suites: "provider-web" } - { name: webhooks, suites: "webhooks" } - { name: connectors, suites: "connectors" } - - { name: commerce, suites: "payments,settings" } + - { name: payments, suites: "payments" } + - { name: settings, suites: "settings" } steps: - name: Checkout code uses: actions/checkout@v7 @@ -727,6 +728,9 @@ jobs: - name: Build E2E app run: bash scripts/ci-cancel-aware.sh pnpm --filter openhuman-app test:e2e:build + - name: Clippy (macOS-gated Rust) + run: bash scripts/ci-cancel-aware.sh pnpm rust:clippy + - name: Package build artifact run: | # Stage the same runner-visible layout Linux/Windows use. The .app is @@ -765,7 +769,8 @@ jobs: - { name: provider-web, suites: "provider-web" } - { name: webhooks, suites: "webhooks" } - { name: connectors, suites: "connectors" } - - { name: commerce, suites: "payments,settings" } + - { name: payments, suites: "payments" } + - { name: settings, suites: "settings" } steps: - name: Checkout code uses: actions/checkout@v7 @@ -976,7 +981,8 @@ jobs: - { name: provider-web, suites: "provider-web" } - { name: webhooks, suites: "webhooks" } - { name: connectors, suites: "connectors" } - - { name: commerce, suites: "payments,settings" } + - { name: payments, suites: "payments" } + - { name: settings, suites: "settings" } steps: - name: Checkout code uses: actions/checkout@v7 diff --git a/.gitignore b/.gitignore index 4ab2b54663..df79dac508 100644 --- a/.gitignore +++ b/.gitignore @@ -133,3 +133,5 @@ distribution.cer CHANGELOG.preview.md *.profraw *.diff + +.claude/worktrees/ diff --git a/AGENTS.md b/AGENTS.md index a9e637719a..5034093610 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -163,7 +163,7 @@ No `UserProvider`/`AIProvider`/`SkillProvider` — auth lives in `CoreStateProvi ## Tauri shell (`app/src-tauri/`) -Thin desktop host. Key modules: `core_process`, `core_rpc`, `cdp`, `cef_preflight`, `cef_profile`, `dictation_hotkeys`, `file_logging`, `mascot_native_window`, `screen_capture`, `window_state`, per-provider scanners (`discord_scanner`, `slack_scanner`, `telegram_scanner`, `whatsapp_scanner`, `wechat_scanner`, `gmessages_scanner`, `imessage_scanner`, `meet_scanner`), `meet_audio`/`meet_call`/`meet_video`, `fake_camera`, `webview_accounts`, `webview_apis`. +Thin desktop host. Key modules: `core_process`, `core_rpc`, `cdp`, `cef_preflight`, `cef_profile`, `dictation_hotkeys`, `file_logging`, `mascot_native_window`, `window_state`, per-provider scanners (`discord_scanner`, `slack_scanner`, `telegram_scanner`, `whatsapp_scanner`, `wechat_scanner`, `gmessages_scanner`, `imessage_scanner`, `meet_scanner`), `meet_audio`/`meet_call`/`meet_video`, `fake_camera`, `webview_accounts`, `webview_apis`. IPC commands (authoritative list: `generate_handler!` in `app/src-tauri/src/lib.rs`): `core_rpc::relay_http_rpc`, `core_rpc_url`, `core_rpc_token`, `start_core_process`/`restart_core_process`, update commands (`check_app_update`, `apply_core_update`, …), window commands (`activate_main_window`, `mascot_window_*`, `notch_window_*`), `webview_accounts::*`, `workspace_paths::*`, `artifact_commands::*`, hotkeys (dictation/PTT/companion), `meet_call::*`, `native_notifications::*`, `mcp_commands::*`, `loopback_oauth::*`. @@ -177,7 +177,7 @@ Embedded provider webviews **must not** grow new JS injection. No new `.js` unde ### Domain layout (`src/openhuman/`) -~130 domain directories — authoritative list: `ls -d src/openhuman/*/`. Major families: agent (`agent`, `agent_experience`, `agent_meetings`, `agent_memory`, `agent_orchestration`, `agent_registry`, `agent_tool_policy`, `agentbox`, `orchestration`), memory (`memory`, `memory_archivist`, `memory_conversations`, `memory_diff`, `memory_goals`, `memory_queue`, `memory_search`, `memory_sources`, `memory_store`, `memory_sync`, `memory_tools`, `memory_tree`, `tinycortex`), skills/flows (`skills`, `skill_registry`, `skill_runtime`, `flows`, `tinyflows`, `tinyagents`, `rhai_workflows`), inference/AI (`inference`, `model_council`, `council_registry`, `embeddings`, `routing`), MCP (`mcp_audit`, `mcp_client`, `mcp_registry`, `mcp_server`), runtimes (`runtime_node`, `runtime_python`, `runtime_python_server`, `javascript`, `sandbox`, `cwd_jail`), channels/webviews (`channels`, `webview_accounts`, `webview_apis`, `webview_notifications`, `whatsapp_data`), meet (`meet`, `meet_agent`), web3 (`wallet`, `web3`, `x402`, `tokenjuice`), plus platform domains (`about_app`, `approval`, `config`, `cron`, `credentials`, `keyring`, `security`, `threads`, `tools`, `update`, `voice`, …). +~130 domain directories — authoritative list: `ls -d src/openhuman/*/`. Major families: agent (`agent`, `agent_experience`, `agent_meetings`, `agent_memory`, `agent_orchestration`, `agent_registry`, `agent_tool_policy`, `agentbox`, `orchestration`), memory (`memory`, `memory_archivist`, `memory_conversations`, `memory_diff`, `memory_goals`, `memory_queue`, `memory_search`, `memory_sources`, `memory_store`, `memory_sync`, `memory_tools`, `memory_tree`, `tinycortex`), skills/flows (`skills`, `skill_registry`, `skill_runtime`, `flows`, `tinyflows`, `tinyagents`, `rhai_workflows`), inference/AI (`inference`, `embeddings`, `routing`), MCP (`mcp_audit`, `mcp_client`, `mcp_registry`, `mcp_server`), runtimes (`runtime_node`, `runtime_python`, `runtime_python_server`, `javascript`, `sandbox`, `cwd_jail`), channels/webviews (`channels`, `whatsapp_data`), meet (`meet`, `meet_agent`), web3 (`wallet`, `web3`, `x402`, `tokenjuice`), plus platform domains (`about_app`, `approval`, `config`, `cron`, `credentials`, `keyring`, `security`, `threads`, `tools`, `update`, `voice`, …). **Skills runtime**: the QuickJS per-skill VM engine is gone. `src/openhuman/skills/` holds skill metadata/tool descriptors; execution of installed `SKILL.md` workflows lives in `src/openhuman/skill_runtime/` (starts/cancels runs, hosts the `skill_executor` agent, reuses `runtime_node`/`runtime_python`). @@ -243,7 +243,8 @@ GGML_NATIVE=OFF cargo check --manifest-path Cargo.toml \ | `skills` | ON | `openhuman::skills` + `openhuman::skill_runtime` + `openhuman::skill_registry` domains — SKILL.md discovery/parse/install, workflow execution + run logs, remote catalogs, the `skill_setup` / `skill_executor` builtin agents, and the 16 skill agent tools | none (see below) | | `flows` | ON | `openhuman::flows` (saved automation graphs — create/run/schedule, the `workflow_builder` + `flow_discovery` agents), `openhuman::tinyflows` (engine seam), `openhuman::rhai_workflows` (`.ragsh` language-workflow tool) | `tinyflows`, `jaq-core`, `jaq-std`, `jaq-json`, `rhai` | | `mcp` | ON | `openhuman::mcp_server` (the `openhuman mcp` stdio/HTTP server), `openhuman::mcp_registry` (dynamic Smithery installs — `mcp_clients` RPC namespace, SQLite, boot spawn, supervisor, OAuth), `openhuman::mcp_audit` (write-audit log), and the static config-declared server set in `openhuman::mcp_client`. ~19 agent tools, ~20k LOC | **none** (see scope note) | -| `tui` | ON | `openhuman::tui` — the `openhuman tui` (alias `chat`) CLI subcommand: a ratatui/crossterm terminal chat UI onto the `web_chat` surface, running the core in-process. No controllers, no agent tools. **Intentionally NOT forwarded to the desktop shell** (allowlisted in `check-feature-forwarding.mjs`). | `ratatui`, `crossterm` | +| `tui` | ON | `openhuman::tui` — the tabbed ratatui/crossterm CLI UI (Logs, Chat, Config, Settings), auto-opened by bare `openhuman` on interactive non-container hosts and forced with `openhuman tui` (alias `chat`). Runs the core in-process. No controllers, no agent tools. **Intentionally NOT forwarded to the desktop shell** (allowlisted in `check-feature-forwarding.mjs`). | `ratatui`, `crossterm` | +| `channels` | ON | `openhuman::channels` (external-messaging providers — Telegram/Discord/Slack/Signal/WhatsApp/iMessage/IRC/… — plus the channel runtime, controllers, host, proactive messaging + inbound dispatch) and the `webview_accounts` / `webview_apis` / `webview_notifications` / `whatsapp_data` webview-bridge domains (incl. the 3 `whatsapp_data_*` agent tools). **Carve-outs `channels::{traits, cli}` stay ungated.** | **none** (`tinychannels` is load-bearing) | **Facade pattern (pathfinder for the other gates).** `pub mod voice;` is **always compiled** as a facade: the real submodules are `#[cfg(feature = "voice")]`, and a `#[cfg(not(feature = "voice"))] mod stub;` (`src/openhuman/voice/stub.rs`) re-exposes the same public surface that always-on / other-gated callers use (`server`, `dictation_listener`, `streaming`, `reply_speech`, `cloud_transcribe`, `cli`, `create_stt_provider`, `effective_stt_provider`, `publish_ptt_transcript_committed`) with no-op / `None` / disabled-error bodies. Callers therefore do **not** need per-call `#[cfg]`. When voice is off: the voice/audio controllers are unregistered (unknown-method over `/rpc`, absent from `/schema`), the `audio_generate_podcast` agent tools are absent, and `openhuman voice` returns a "voice disabled" error. Stub signatures must match the real ones exactly — the disabled build (`--no-default-features --features tokenjuice-treesitter`) is the **only** thing that catches drift, so run it before pushing any change to the voice surface. @@ -255,12 +256,11 @@ GGML_NATIVE=OFF cargo check --manifest-path Cargo.toml \ **`meet` gate (#4800)** — uses all three module patterns, one per domain, chosen by the rule *"does always-compiled code reach a non-registration symbol in here?"*: - **`meet` → leaf-gate.** `#[cfg(feature = "meet")] pub mod meet;` outright. Its only outside reference is the registration site in `src/core/all.rs`, so no facade is needed (same shape as `audio_toolkit`). -- **`meet_agent` → facade + carve-out, no stub file.** Every submodule is gated **except `wav`** (below). Nothing outside the Meet domain calls the gated submodules. +- **`meet_agent` → leaf-gate.** Every submodule (including `wav`) is `#[cfg(feature = "meet")]`. Nothing outside the Meet domain calls into it. (`wav` was formerly ungated for the always-on `desktop_companion` STT path; that domain was removed, so the carve-out is gone and `wav` gates with the rest.) - **`agent_meetings` → facade + stub.** Three always-compiled call sites reach in — the heartbeat planner (`calendar::handle_calendar_meeting_candidate`) and two subscriber registrations (`core::jsonrpc`, `channels::runtime::startup`) — so `src/openhuman/agent_meetings/stub.rs` supplies no-op equivalents and those callers need no `#[cfg]`. **No deps to shed (do not re-litigate).** Unlike `voice`, this gate drops **zero** dependencies — the Meet domains have no exclusive crates. `meet_agent::wav` is a hand-rolled 79-line RIFF writer with no `use` statements, written precisely so Meet never needed `hound` (which `voice` already owns and sheds). The dependency shed was pre-paid; this gate's value is compile-time surface and binary size, not the dep tree. -**⚠ The `wav` carve-out is load-bearing.** `meet_agent::wav::pack_pcm16le_mono_wav` is called by `desktop_companion::pipeline::stt`, which is `DomainGroup::Platform` and compiled in **every** build. `pub mod wav;` must stay **ungated** so that call site keeps its real implementation — it costs nothing, since `wav.rs` is dependency-free. If someone gates it, the `--no-default-features` build fails loudly at `desktop_companion`; that failure is correct. Do **not** "fix" it by stubbing `pack_pcm16le_mono_wav` — that trades a compile error for green CI while silently corrupting desktop-companion STT (the STT backend would receive a malformed WAV). Revert the cfg instead. **Both-ways tests.** `src/core/all_tests.rs` pins the gate in both directions (`meet_controllers_registered_when_feature_on` / `meet_controllers_absent_when_feature_off`). The negative half is the one that proves the gate removes anything. Note CI's smoke lane runs `cargo check` only and never compiles test code, so a disabled-build **test** break is invisible to it — run `cargo test --lib --no-default-features --features tokenjuice-treesitter core::all::tests` locally after touching any gated surface. @@ -309,14 +309,26 @@ Follows the voice facade+stub pattern for `mcp_server` / `mcp_registry` / `mcp_a #### The `tui` gate -The terminal chat UI (`openhuman tui` / alias `chat`) lives in `src/openhuman/tui/` and follows the **`mcp`/`voice` facade+stub** pattern: `pub mod tui;` is always compiled; the behavioural submodules (`app`, `render`, `state`, `terminal`, `runner`) are `#[cfg(feature = "tui")]`; and `#[cfg(not(feature = "tui"))] mod stub;` re-exposes the one symbol an always-compiled caller reaches — `run_from_cli` — with a build-fact error body (`"tui feature disabled at compile time … --features tui"`). +The tabbed terminal UI (`openhuman`, or explicitly `openhuman tui` / alias `chat`) lives in `src/openhuman/tui/` and follows the **`mcp`/`voice` facade+stub** pattern: `pub mod tui;` is always compiled; the behavioural submodules (`app`, `render`, `state`, `terminal`, `runner`) are `#[cfg(feature = "tui")]`; and `#[cfg(not(feature = "tui"))] mod stub;` re-exposes the one symbol an always-compiled caller reaches — `run_from_cli` — with a build-fact error body (`"tui feature disabled at compile time … --features tui"`). Bare-command auto-launch requires terminal stdin/stdout and `HostKind::Cli`; Docker, CI, pipes, and `--no-tui` retain the non-TUI CLI path. - **The `"tui" | "chat"` CLI arm in `src/core/cli.rs` is un-`#[cfg]`'d on purpose.** In a slim build it resolves to `tui::stub::run_from_cli`, which bails with the disabled-error rather than falling through to `unknown namespace: tui` (which reads like a typo, not a build fact). Same reasoning as the `mcp` arm. Pinned by `tui_subcommand_reports_disabled_build_when_gate_off` / `chat_alias_reports_disabled_build_when_gate_off` in `src/core/cli_tests.rs` (both `#[cfg(not(feature = "tui"))]`). `"tui" | "chat"` is also added to the banner-suppression `matches!` (a TUI owns the terminal — a banner would corrupt it). -- **No controllers, no agent tools, no `all.rs` changes.** The TUI is a pure *client* of the existing `web_chat` surface — it boots the core in-process (`CoreBuilder::new(HostKind::Cli).domains(DomainSet::full()).services(ServiceSet::none())`), sends turns via `runtime.invoke("openhuman.channel_web_chat", …)`, and streams by draining `web_chat::subscribe_web_channel_events()` filtered by its own `client_id`. `openhuman.channel_web_chat` needs `DomainGroup::Channels`, so `DomainSet::full()` (not `harness()`) is required. +- **No controllers, no agent tools, no `all.rs` changes.** The TUI is a pure *client* of existing registered controllers — it boots the core in-process (`CoreBuilder::new(HostKind::detect_standalone()).domains(DomainSet::full()).services(ServiceSet::none())`), sends chat turns through `web_chat`, reads a bounded in-memory copy of the file-only core log stream, edits only curated safe config getters/updaters, and invokes auth controllers for account/status actions. Never render `config.get` wholesale because the full snapshot can contain secrets. - **Terminal hygiene is load-bearing.** `logging::init_for_tui` installs a **file-only** subscriber (never stderr) — a single core boot log on stdout/stderr would corrupt the alternate-screen UI. `terminal::TerminalGuard` restores raw mode + the main screen on `Drop`, and a panic hook chains a restore ahead of the default hook. All `[tui]` state-transition logs go to the file, never `println!`. - **Intentionally NOT forwarded to the desktop shell** (the app ships its own Tauri UI). It carries the only current entry in `INTENTIONALLY_NOT_FORWARDED` in `scripts/ci/check-feature-forwarding.mjs`; the pure reducer lives in `src/openhuman/tui/state.rs` (`TranscriptState::apply_event`) with unit tests, so most behaviour is testable without a terminal. Drops the exclusive `ratatui` + `crossterm` deps when off. Verify with `cargo tree -i ratatui --no-default-features --features tokenjuice-treesitter` (must return nothing). +#### The `channels` gate (#4801 — last child of #4795) + +Leaf-gate pattern with **two ungated carve-outs and no stub file** — the reach-map put every gated symbol at a *registration/leaf* call site, so absence (unknown-method / omitted tool), not a disabled-error stub, is the correct off-state (same rationale as `flows` / `meet`). + +- **Sheds ZERO dependencies — do NOT re-litigate.** `tinychannels` stays always-compiled regardless of the gate: `config/schema/channels.rs` re-exports its config types, `event_bus/events.rs`'s `DomainEvent` embeds `tinychannels::ChannelInboundEnvelope`, and `security/pairing.rs` re-exports its pairing helpers. The `channels = []` feature list is intentionally empty. The gate's value is compile-time surface + binary size. (`whatsapp-web` is a **refinement inside** the gate — `whatsapp-web = ["channels", "tinychannels/whatsapp-web"]`.) +- **Two ungated carve-outs.** `pub mod traits;` (a one-line `tinychannels` `Channel`/`SendMessage` re-export) and `pub mod cli;` (`CliChannel`, a dependency-free local stdin/stdout REPL) stay compiled in **all** builds — both are reached by the always-on agent-harness interactive loop (`agent::harness::session::runtime::run_interactive`). Same shape as the `meet_agent::wav` carve-out. `channels::mod.rs` `#[cfg(feature = "channels")]`s everything else; nothing inside the gated submodules changes. +- **The in-app web chat is NOT gated.** `openhuman::web_chat` (RPC namespace `channel`, decoupled from `channels/` in #5002 + #5003 which also moved `learning` out) is core product surface and stays always-compiled even though its runtime tag is `DomainGroup::Channels`. Its registration push in `src/core/all.rs` is deliberately left ungated; the both-ways test pins `channel` present with the feature OFF. +- **Three mis-housed imports were retargeted to `tinychannels` (no stub needed).** `cron/bus.rs` (`Channel`/`SendMessage`/`ChannelMessage`), `memory_conversations/bus.rs` (`ChannelMessage` + `context::conversation_history_key`), and `audio_toolkit/ops.rs` (`providers::email_channel::EmailChannel`) reached the gated domain only to pick up symbols that actually live in `tinychannels`; pointing them straight at the crate removes the always-on → gated edge (and the voice→channels cross-gate edge). The old `channels::` paths were 1-line delegations / `pub use` re-exports of exactly these. +- **Leaf-gated call sites** (each carries its own `#[cfg]`): the 5 controller-registration pushes in `src/core/all.rs` (channels controllers, `webview_apis`, `webview_notifications`, public + internal `whatsapp_data`), the `ChannelInboundSubscriber` + web-only-proactive block in `src/core/jsonrpc.rs`, `spawn_channels_service` in `src/core/runtime/services.rs`, the `whatsapp_data::global::init` block in `src/core/runtime/context.rs`, and the `whatsapp_data::tools::*` glob + 3 `WhatsAppData*Tool` registrations in `src/openhuman/tools/{mod,ops}.rs`. The `webview_accounts` / `webview_apis` / `webview_notifications` / `whatsapp_data` `pub mod` declarations in `src/openhuman/mod.rs` are leaf-gated too. String-match arms (`"channels" =>` descriptions, `whatsapp_data_` in `group_for_namespace`) stay **ungated** — they are data. +- **`start_bootstrap_jobs`' `services.channels` block keeps running slim** — it drives composio sync / workspace-memory sync / orchestration drain and names **no** `channels::` symbol, so it stays ungated by design. +- **No CLI change.** There is no `openhuman channels` subcommand; generic namespace resolution yields "unknown namespace" when off (the `flows` precedent — acceptable). +- **Both-ways tests.** `channels_controllers_{registered_when_feature_on,absent_when_feature_off}` in `src/core/all_tests.rs` pin the controller surface (the OFF half also asserts `channel`/web_chat survives), and `whatsapp_data_tools_{present_when_channels_on,absent_when_channels_off}` in `src/openhuman/tools/ops_tests.rs` pin the 3 agent tools (that module has the full-tool-list machinery). CI's smoke lane runs `cargo check` only, so run `cargo test --lib --no-default-features --features tokenjuice-treesitter core::all::tests` locally after touching any gated surface. ### Event bus (`src/core/event_bus/`) diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000..d49bdf0ef3 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,27 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it using these metadata." +title: "OpenHuman" +type: "software" +authors: + - name: "tinyhumansai" + - name: "OpenHuman Contributors" +repository-code: "https://github.com/tinyhumansai/openhuman" +url: "https://github.com/tinyhumansai/openhuman" +abstract: "OpenHuman is an open‑source AI platform for building and orchestrating autonomous agents and workflows." +license: "GPL-3.0" +version: "0.63.1" +date-released: "2026-07-21" +keywords: + - "ai" + - "agents" + - "workflows" + - "orchestration" + - "openhuman" +preferred-citation: + type: "software" + title: "OpenHuman" + authors: + - name: "tinyhumansai" + year: "2026" + url: "https://github.com/tinyhumansai/openhuman" + version: "0.63.1" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 016854cbeb..bb726ce933 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,9 +37,9 @@ This project adheres to the [Contributor Covenant Code of Conduct](CODE_OF_CONDU | Git | Current stable | Required for cloning and updating vendored submodules. | | Node.js | `>=24.0.0` from [`app/package.json`](app/package.json) | Install the current Node 24 release or newer. | | pnpm | `pnpm@10.10.0` from [`package.json`](package.json) | The repo enforces pnpm via the root `packageManager` field. | -| Rust | `1.93.0` from [`rust-toolchain.toml`](rust-toolchain.toml) | Install with `rustup`; `rustfmt` and `clippy` are required components. | +| Rust | `1.96.1` from [`rust-toolchain.toml`](rust-toolchain.toml) | Install with `rustup`; `rustfmt` and `clippy` are required components. | | CMake | Current stable | Required by native Rust dependencies such as Whisper bindings. | -| Ninja | Current stable | Required on macOS to build the bundled CEF helper. CMake delegates the actual compile to Ninja; without it the `cef-dll-sys` build script aborts. | +| Ninja | Current stable | Required on macOS and Windows to build the bundled CEF helper. CMake delegates the actual compile to Ninja; without it the `cef-dll-sys` build script aborts. | | ripgrep (`rg`) | Current stable | Used by the `lint:commands-tokens` pre-push step (scans `app/src/components/commands/`). Without it, `git push` fails the hook with `rg: command not found`. | | Tauri vendored sources | Git submodules under `app/src-tauri/vendor/` | Required for the CEF-aware Tauri CLI and notification plugin patches. | | macOS tools | Xcode Command Line Tools | Needed for local desktop builds on macOS. | @@ -53,15 +53,24 @@ Windows requires several additional tools that are not needed on macOS or Linux. Rust's `cargo` needs a linker on Windows. The easiest way to get one is during `rustup-init`: select option **1** (Default installation) when prompted, which includes MSVC v143 and the Windows 11 SDK. This is the full Visual Studio installer, not the VS Code lightweight editor — it lives only on `C:` and consumes ~5.4 GB. -**2. LLVM / Clang** +**2. Rust** -`whisper-rs-sys` depends on `libclang`. Download the Windows x86_64 release from [github.com/llvm/llvm-project/releases](https://github.com/llvm/llvm-project/releases) (~822 MB). During install, check **"Add LLVM to system PATH for all users"**. If you see a "PATH too long" warning, skip the PATH step and set the environment variable manually: +Install the pinned toolchain and required components with `rustup`: +```powershell +rustup toolchain install 1.96.1 --profile minimal +rustup component add rustfmt clippy --toolchain 1.96.1 ``` -LIBCLANG_PATH=C:\Program Files\LLVM\bin + +**3. LLVM / Clang** + +`whisper-rs-sys` depends on `libclang`. Download the Windows x86_64 release from [github.com/llvm/llvm-project/releases](https://github.com/llvm/llvm-project/releases) (~822 MB). During install, check **"Add LLVM to system PATH for all users"**. If you see a "PATH too long" warning, skip the PATH step and set the environment variable manually: + +```powershell +$env:LIBCLANG_PATH = "C:\Program Files\LLVM\bin" ``` -**3. CMake** +**4. CMake** `whisper.cpp` requires CMake. Install via winget: @@ -69,7 +78,15 @@ LIBCLANG_PATH=C:\Program Files\LLVM\bin winget install Kitware.CMake ``` -**4. Node.js and pnpm** +**5. Ninja** + +The CEF build uses Ninja as its CMake generator. Install it via winget: + +```powershell +winget install --id Ninja-build.Ninja -e +``` + +**6. Node.js and pnpm** Install Node.js 24+ and pnpm@10.10.0 as usual. @@ -78,8 +95,8 @@ Install Node.js 24+ and pnpm@10.10.0 as usual. 1. VS Build Tools → restart terminal 2. Rust (`rustup`) → restart terminal 3. LLVM → restart terminal -4. CMake → restart terminal -5. Node.js + pnpm +4. CMake + Ninja → restart terminal +5. Node.js + pnpm → restart terminal **Quick dependency check** @@ -89,6 +106,7 @@ rustc --version cargo --version clang --version cmake --version +ninja --version node --version pnpm --version @@ -100,10 +118,10 @@ clang -v #### Platform notes - **Web-only development** needs Node, pnpm, and the Rust toolchain present in the repo. You can usually ignore desktop-only system packages. -- **Desktop development** needs the vendored Tauri/CEF setup. The preferred entrypoint is `pnpm --filter openhuman-app dev:app`, which ensures the vendored Tauri CLI is installed and configures `CEF_PATH`. +- **Desktop development** needs the vendored Tauri/CEF setup. Use `pnpm --filter openhuman-app dev:app` on macOS and `pnpm dev:app:win` on native Windows; both entrypoints configure the platform-specific CEF environment. - **Linux desktop builds** require extra system packages beyond Node/Rust. Follow the distro-specific Tauri dependency list before running desktop commands, then use the OpenHuman scripts below. For deeper platform troubleshooting, see [`gitbooks/developing/getting-set-up.md`](gitbooks/developing/getting-set-up.md). - **Windows 10 WSL + classic X11 forwarding** is unsupported for the desktop app. The Tauri/CEF stack can hang, render blank windows, or crash before useful app logs are available. Use native Windows development, or Windows 11 WSLg if you need a Linux GUI workflow. OpenHuman logs a startup warning when it detects WSL with `DISPLAY` set but no `WAYLAND_DISPLAY`/WSLg markers. -- **Windows desktop builds** additionally require Visual Studio C++ Build Tools (MSVC v143), LLVM/Clang, and CMake. See [Windows-specific setup](#windows-specific-setup) for the full list and install order. +- **Windows desktop builds** additionally require Visual Studio C++ Build Tools (MSVC v143), LLVM/Clang, CMake, and Ninja. See [Windows-specific setup](#windows-specific-setup) for the full list and install order. - **macOS desktop builds** require a one-time codesigning cert. After cloning, run `bash scripts/setup-dev-codesign.sh` once to create the local "OpenHuman Dev Signer" self-signed certificate that Tauri uses when bundling dev builds. Without it, `pnpm --filter openhuman-app dev:app` fails at the bundle/sign step with `OpenHuman Dev Signer: no identity found`. - **Skills development** happens in the separate [`tinyhumansai/openhuman-skills`](https://github.com/tinyhumansai/openhuman-skills) repository. This repo consumes built skill bundles from GitHub or a local override path; it does not vendor the skills source as a submodule. @@ -111,8 +129,8 @@ Example macOS bootstrap with Homebrew: ```bash brew install node@24 pnpm rustup-init cmake ninja ripgrep -rustup toolchain install 1.93.0 --profile minimal -rustup component add rustfmt clippy --toolchain 1.93.0 +rustup toolchain install 1.96.1 --profile minimal +rustup component add rustfmt clippy --toolchain 1.96.1 # CEF builds a universal binary, so the x86_64 target is required even on Apple Silicon rustup target add x86_64-apple-darwin ``` @@ -170,9 +188,12 @@ pnpm install # Web-only development (Vite dev server) pnpm dev -# Preferred desktop development path (sets up vendored Tauri CLI + CEF env) +# Preferred macOS desktop development path (sets up vendored Tauri CLI + CEF env) pnpm --filter openhuman-app dev:app +# Preferred native Windows desktop development path (run from PowerShell) +pnpm dev:app:win + # Lower-level Tauri command entrypoint pnpm tauri dev @@ -183,9 +204,32 @@ cargo run --manifest-path Cargo.toml --bin openhuman-core Which mode to choose: - `pnpm dev`: frontend-only iteration in the browser. -- `pnpm --filter openhuman-app dev:app`: full desktop app flow with Tauri + CEF. +- `pnpm --filter openhuman-app dev:app`: full desktop app flow with Tauri + CEF on macOS. +- `pnpm dev:app:win`: full desktop app flow on native Windows. This invokes the repository's Git Bash bootstrap to configure MSVC, Ninja, the vendored Tauri CLI, and the Windows CEF runtime. - `cargo run --bin openhuman-core`: core/RPC work when you want the Rust server without the desktop shell. +#### Windows desktop troubleshooting + +The default development port is `1420`. Hyper-V or WSL can reserve ranges that include this port. Check the excluded TCP ranges from an elevated PowerShell prompt: + +```powershell +netsh interface ipv4 show excludedportrange protocol=tcp +``` + +If `1420` is excluded or already in use, choose a port `N` such that both `N` and `N + 1` are available and outside the listed ranges; use a value below `65535`. `dev:app:win` applies `OPENHUMAN_DEV_PORT` to both Vite and Tauri, so their URLs remain synchronized: + +```powershell +$env:OPENHUMAN_DEV_PORT = "14320" +pnpm dev:app:win +``` + +On systems using a non-UTF-8 code page, native CEF or Whisper compilation can fail with MSVC errors `C4819` and `C2220`. Opt into UTF-8 for the current PowerShell session before starting the app: + +```powershell +$env:CL = "/utf-8" +pnpm dev:app:win +``` + ### 5. Verify your setup If setup is correct, these commands should all succeed: diff --git a/Cargo.lock b/Cargo.lock index e13c636797..9fa7d756e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -533,7 +533,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.2", "shlex", "syn 2.0.117", ] @@ -765,9 +765,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -958,15 +958,6 @@ dependencies = [ "strsim", ] -[[package]] -name = "clap_complete" -version = "4.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" -dependencies = [ - "clap", -] - [[package]] name = "clap_derive" version = "4.6.1" @@ -1033,7 +1024,7 @@ dependencies = [ "bs58", "coins-core", "digest 0.10.7", - "hmac 0.12.1", + "hmac", "k256", "serde", "sha2 0.10.9", @@ -1048,7 +1039,7 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac 0.12.1", + "hmac", "once_cell", "pbkdf2 0.12.2", "rand 0.8.6", @@ -1748,16 +1739,19 @@ dependencies = [ ] [[package]] -name = "dialoguer" -version = "0.12.0" +name = "dhat" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" +checksum = "98cd11d84628e233de0ce467de10b8633f4ddaecafadefc86e13b84b8739b827" dependencies = [ - "console", - "fuzzy-matcher", - "shell-words", - "tempfile", - "zeroize", + "backtrace", + "lazy_static", + "mintex", + "parking_lot", + "rustc-hash 1.1.0", + "serde", + "serde_json", + "thousands", ] [[package]] @@ -1781,7 +1775,6 @@ dependencies = [ "block-buffer 0.12.0", "const-oid 0.10.2", "crypto-common 0.2.1", - "ctutils", ] [[package]] @@ -2123,7 +2116,7 @@ dependencies = [ "ctr", "digest 0.10.7", "hex", - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "rand 0.8.6", "scrypt", @@ -2274,12 +2267,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -2643,15 +2630,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2691,7 +2669,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -2914,7 +2892,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac 0.12.1", + "hmac", ] [[package]] @@ -2926,15 +2904,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "hmac" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" -dependencies = [ - "digest 0.11.3", -] - [[package]] name = "hostname" version = "0.4.2" @@ -3110,7 +3079,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core 0.57.0", ] [[package]] @@ -3873,7 +3842,7 @@ dependencies = [ "indexmap", "itoa", "log", - "md-5 0.10.6", + "md-5", "nom 8.0.0", "nom_locate", "rand 0.9.4", @@ -3941,9 +3910,9 @@ dependencies = [ [[package]] name = "mail-parser" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2420e9ce11c2b0583ca97ddff7ab2398c8a613154e9b72e3bafdbf767f1d7" +checksum = "47785d444be4d32c1709171c6219a90f667c0ad0ffe68b4b179e794f31f4f9e8" dependencies = [ "hashify", ] @@ -3982,16 +3951,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "md-5" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" -dependencies = [ - "cfg-if", - "digest 0.11.3", -] - [[package]] name = "md5" version = "0.8.0" @@ -4060,6 +4019,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mintex" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c505b3e17ed6b70a7ed2e67fbb2c560ee327353556120d6e72f5232b6880d536" + [[package]] name = "mio" version = "1.2.0" @@ -4068,7 +4033,7 @@ checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "windows-sys 0.61.2", ] @@ -4581,15 +4546,6 @@ dependencies = [ "objc2-foundation 0.3.2", ] -[[package]] -name = "objc2-system-configuration" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" -dependencies = [ - "objc2-core-foundation", -] - [[package]] name = "objc2-ui-kit" version = "0.3.2" @@ -4708,7 +4664,6 @@ dependencies = [ "anyhow", "arboard", "argon2", - "async-imap", "async-trait", "axum", "base64 0.22.1", @@ -4720,14 +4675,13 @@ dependencies = [ "chrono", "chrono-tz", "clap", - "clap_complete", "coins-bip39", "console", "cpal", "cron", "crossterm", "curve25519-dalek", - "dialoguer", + "dhat", "directories", "dirs 5.0.1", "docx-rs", @@ -4747,7 +4701,7 @@ dependencies = [ "glob", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "hostname", "hound", "iana-time-zone", @@ -4757,30 +4711,22 @@ dependencies = [ "lettre", "libc", "log", - "mail-parser", "motosan-ai-oauth", "nu-ansi-term 0.46.0", "objc2 0.6.4", "objc2-contacts", "objc2-foundation 0.3.2", "once_cell", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", "parking_lot", "pdf-extract", - "postgres", "ppt-rs", - "prometheus", "proptest", - "prost", "rand 0.10.1", "ratatui", "rdev", "regex", "reqwest 0.12.28", "ring", - "ripemd", "rppal", "rusqlite", "rustls", @@ -4793,7 +4739,6 @@ dependencies = [ "serde_yaml", "sha1", "sha2 0.10.9", - "shellexpand", "similar", "socketioxide", "starship-battery", @@ -4801,7 +4746,7 @@ dependencies = [ "tar", "tempfile", "thiserror 2.0.18", - "tinyagents 1.9.0", + "tinyagents", "tinychannels", "tinycortex", "tinyflows", @@ -4818,13 +4763,6 @@ dependencies = [ "tracing-appender", "tracing-log", "tracing-subscriber", - "tree-sitter", - "tree-sitter-python", - "tree-sitter-rust", - "tree-sitter-typescript", - "uiautomation", - "unicode-normalization", - "unicode-segmentation", "unicode-width", "url", "urlencoding", @@ -4884,75 +4822,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.18", -] - -[[package]] -name = "opentelemetry-http" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" -dependencies = [ - "async-trait", - "bytes", - "http 1.4.0", - "opentelemetry", - "reqwest 0.13.1", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" -dependencies = [ - "http 1.4.0", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "reqwest 0.13.1", - "thiserror 2.0.18", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" -dependencies = [ - "opentelemetry", - "opentelemetry_sdk", - "prost", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368afaed344110f40b179bb8fbe54bc52d98f9bd2b281799ef32487c2650c956" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "portable-atomic", - "rand 0.9.4", - "thiserror 2.0.18", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -5100,7 +4969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", "password-hash 0.4.2", "sha2 0.10.9", ] @@ -5112,7 +4981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", ] [[package]] @@ -5217,7 +5086,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ "phf_shared 0.13.1", - "serde", ] [[package]] @@ -5429,50 +5297,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "postgres" -version = "0.19.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aacf632d0554ff75f58183694f41dc8999c8a3a43a386994d0ec2d034f1dfbe1" -dependencies = [ - "bytes", - "fallible-iterator 0.2.0", - "futures-util", - "log", - "tokio", - "tokio-postgres", -] - -[[package]] -name = "postgres-protocol" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" -dependencies = [ - "base64 0.22.1", - "byteorder", - "bytes", - "fallible-iterator 0.2.0", - "hmac 0.13.0", - "md-5 0.11.0", - "memchr", - "rand 0.10.1", - "sha2 0.11.0", - "stringprep", -] - -[[package]] -name = "postgres-types" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" -dependencies = [ - "bytes", - "chrono", - "fallible-iterator 0.2.0", - "postgres-protocol", -] - [[package]] name = "postscript" version = "0.14.1" @@ -5562,20 +5386,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prometheus" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot", - "thiserror 2.0.18", -] - [[package]] name = "proptest" version = "1.11.0" @@ -5711,7 +5521,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.2", "rustls", "socket2", "thiserror 2.0.18", @@ -5732,7 +5542,7 @@ dependencies = [ "lru-slab", "rand 0.9.4", "ring", - "rustc-hash", + "rustc-hash 2.1.2", "rustls", "rustls-pki-types", "slab", @@ -6170,7 +5980,6 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.7", ] [[package]] @@ -6179,7 +5988,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -6283,7 +6092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b3492ea85308705c3a5cc24fb9b9cf77273d30590349070db42991202b214c4" dependencies = [ "bitflags 2.13.1", - "fallible-iterator 0.3.0", + "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", @@ -6297,6 +6106,12 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.2" @@ -6520,7 +6335,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "salsa20", "sha2 0.10.9", @@ -6897,21 +6712,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" - -[[package]] -name = "shellexpand" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" -dependencies = [ - "dirs 6.0.0", -] - [[package]] name = "shlex" version = "1.3.0" @@ -7460,6 +7260,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "thousands" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" + [[package]] name = "thread_local" version = "1.1.9" @@ -7527,7 +7333,7 @@ dependencies = [ [[package]] name = "tinyagents" -version = "1.9.0" +version = "2.1.0" dependencies = [ "async-trait", "bytes", @@ -7544,23 +7350,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tinyagents" -version = "2.0.0" -dependencies = [ - "async-trait", - "bytes", - "chrono", - "futures", - "reqwest 0.12.28", - "serde", - "serde_json", - "sha2 0.11.0", - "thiserror 2.0.18", - "tokio", - "tracing", -] - [[package]] name = "tinychannels" version = "0.1.0" @@ -7575,7 +7364,7 @@ dependencies = [ "futures", "futures-util", "hex", - "hmac 0.12.1", + "hmac", "lettre", "mail-parser", "parking_lot", @@ -7626,7 +7415,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "thiserror 2.0.18", - "tinyagents 2.0.0", + "tinyagents", "tokio", "toml 0.8.23", "tracing", @@ -7646,7 +7435,7 @@ dependencies = [ "serde", "serde_json", "thiserror 2.0.18", - "tinyagents 1.9.0", + "tinyagents", "tracing", ] @@ -7687,7 +7476,7 @@ dependencies = [ "ed25519-dalek", "futures-util", "hkdf", - "hmac 0.12.1", + "hmac", "rand 0.8.6", "reqwest 0.12.28", "serde", @@ -7772,32 +7561,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-postgres" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" -dependencies = [ - "async-trait", - "byteorder", - "bytes", - "fallible-iterator 0.2.0", - "futures-channel", - "futures-util", - "log", - "parking_lot", - "percent-encoding", - "phf 0.13.1", - "pin-project-lite", - "postgres-protocol", - "postgres-types", - "rand 0.10.1", - "socket2", - "tokio", - "tokio-util", - "whoami", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -8246,29 +8009,6 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" -[[package]] -name = "uiautomation" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68495a701b9f2f21f29353ac446f0d27dd0d7ce97aa9ccf9061bca0446cd744" -dependencies = [ - "chrono", - "uiautomation_derive", - "windows 0.62.2", - "windows-core 0.62.2", -] - -[[package]] -name = "uiautomation_derive" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcc4d404aa1c03a848f95cf5feadc3e63946d7f095bf388770b85550093d388" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "uint" version = "0.9.5" @@ -8545,7 +8285,7 @@ dependencies = [ "futures", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "log", "md5", "once_cell", @@ -8632,7 +8372,7 @@ dependencies = [ "ghash 0.6.0", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "log", "prost", "rand 0.10.1", @@ -8711,15 +8451,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -8738,15 +8469,6 @@ dependencies = [ "wit-bindgen 0.51.0", ] -[[package]] -name = "wasite" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" -dependencies = [ - "wasi 0.14.7+wasi-0.2.4", -] - [[package]] name = "wasm-bindgen" version = "0.2.121" @@ -9079,19 +8801,6 @@ dependencies = [ "semver", ] -[[package]] -name = "whoami" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" -dependencies = [ - "libc", - "libredox", - "objc2-system-configuration", - "wasite", - "web-sys", -] - [[package]] name = "winapi" version = "0.3.9" @@ -9114,7 +8823,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -9153,27 +8862,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections", - "windows-core 0.62.2", - "windows-future", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - [[package]] name = "windows-core" version = "0.54.0" @@ -9209,30 +8897,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link", - "windows-threading", -] - [[package]] name = "windows-implement" version = "0.57.0" @@ -9255,17 +8919,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "windows-interface" version = "0.57.0" @@ -9288,33 +8941,12 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link", -] - [[package]] name = "windows-registry" version = "0.6.1" @@ -9480,15 +9112,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -10082,7 +9705,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "flate2", - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "sha1", "time", diff --git a/Cargo.toml b/Cargo.toml index 7dae352c16..2623ab25ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,25 @@ path = "src/bin/test_mcp_stub.rs" [[bin]] name = "openhuman-fleet" path = "src/bin/fleet.rs" +# The fleet supervisor embeds the axum control-plane server, so it only builds +# with the HTTP transport compiled in (#5048). Under `--no-default-features` +# (no `http-server`) this target is skipped rather than failing to link. +required-features = ["http-server"] + +# Embedded-RSS benchmark harness (#5046). Gated behind the default-OFF +# `rss-bench` feature so no benchmark code enters the shipped build. Build with +# `cargo build --release --features rss-bench --bin rss-bench`. +[[bin]] +name = "rss-bench" +path = "src/bin/rss_bench.rs" +required-features = ["rss-bench"] + +# Stateful library profiling workloads (memory ingestion + real sub-agent +# delegation under a hermetic mock provider). Local/dev only. +[[bin]] +name = "library-profile" +path = "src/bin/library_profile/main.rs" +required-features = ["rss-bench"] [lib] name = "openhuman_core" @@ -53,9 +72,9 @@ crate-type = ["rlib"] tinyplace = "2.0" # tinyflows — host-agnostic workflow engine (typed node graph → validate → compile → # run on tinyagents). Powers the "Workflows" feature via the seam in -# `src/openhuman/tinyflows/` + the `flows::` domain. Pulls tinyagents 1.7 transitively -# (same version openhuman already uses — no conflict). Published on crates.io -# and patched below to the vendored submodule. +# `src/openhuman/tinyflows/` + the `flows::` domain. Pulls tinyagents 2.1 transitively +# (same version OpenHuman uses directly, preserving one trait identity). Published +# on crates.io and patched below to the vendored submodule. # # `mock` feature: enables `tinyflows::caps::mock::mock_capabilities()` — the # deterministic in-memory capability bundle the flows `dry_run_workflow` agent @@ -85,28 +104,27 @@ tinyjuice = { version = "0.2.1", default-features = false } # NOT enabled here — the default-ON `flows` feature turns it on via # `tinyagents/repl` (#4797), so a slim build without `flows` sheds `rhai`. # The crate itself can never be dropped: 26+ domains consume tinyagents. -tinyagents = { version = "1.7", features = ["sqlite"] } +tinyagents = { version = "2.1", features = ["sqlite"] } # TinyCortex — Rust core for the memory engine (store/chunks/tree/retrieval/ # queue/ingest/score + long tail), vendored as a git submodule and patched # below to `vendor/tinycortex`. OpenHuman's memory subsystem migrates onto this # crate through the adapter seam in `src/openhuman/tinycortex/` (mirroring the -# tinyagents seam): engine logic in the crate; RPC, agent tools, live sync, -# security gating, and the global singleton stay host-side. rusqlite/git2 are +# tinyagents seam): engine logic (including provider sync pipelines) in the +# crate; RPC, agent tools, sync scheduling/credentials/events, security gating, +# and the global singleton stay host-side. rusqlite/git2 are # aligned to the host pins (=0.40 / 0.21) so one bundled SQLite + one libgit2 -# link. Keep the version pin in lockstep with the submodule tag. +# link. The submodule intentionally tracks reviewed upstream main commits; +# keep this semver requirement compatible with the vendored crate version. tinycortex = { version = "0.1", features = ["git-diff", "persona", "sync"] } tinychannels = { version = "0.1", features = ["relay-websocket"] } -# TokenJuice code compressor — AST-aware signature extraction. Optional (C build) -# behind the default `tokenjuice-treesitter` feature; disabling it falls back to -# the language-agnostic brace-depth heuristic. See src/openhuman/tokenjuice/compressors/code.rs. -tree-sitter = { version = "0.26", optional = true } -tree-sitter-rust = { version = "0.24", optional = true } -tree-sitter-typescript = { version = "0.23", optional = true } -tree-sitter-python = { version = "0.25", optional = true } serde = { version = "1", features = ["derive"] } serde_json = "1" serde_repr = "0.1" serde_yaml = "0.9" +# dhat — heap profiler for the offline `library-profile` benchmark binary only. +# Default-OFF, dev-only: pulled in solely by the `rss-bench-dhat` feature so it +# never enters the shipped desktop/library build (same posture as `rss-bench`). +dhat = { version = "0.3", optional = true } # (Removed `html2md` dep. dhat-rs profiling on real Gmail inboxes # showed `html2md::walk` and `html2md::tables::handle` allocating # ~894 MB peak heap on a 10 KB HTML input from Otter.ai-style emails @@ -117,7 +135,15 @@ serde_yaml = "0.9" # stripper (`fast_html_to_text` in # providers/gmail/post_process.rs) and prefer the email's # `text/plain` MIME part when available.) -reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "rustls-tls", "native-tls", "stream", "http2", "multipart", "socks"] } +# TLS: rustls only in the base declaration, so Linux/macOS — including the +# headless embedding target (#5046) — link a single TLS stack + cert set +# (Mozilla webpki-roots). Windows re-adds `native-tls` via the +# `[target.'cfg(windows)'.dependencies]` block below (Cargo unions features +# per target), because `src/openhuman/tls/mod.rs` deliberately routes the +# Windows client through the SChannel/OS cert store for corporate MITM + +# AV root CAs. So the two TLS backends coexist only on Windows, never on +# the RAM-sensitive platforms. +reqwest = { version = "0.12", default-features = false, features = ["json", "blocking", "rustls-tls", "stream", "http2", "multipart", "socks"] } # Already in-tree via reqwest/hyper; named directly so `IntegrationClient::get_bytes` # can return `bytes::Bytes` without a copy. bytes = "1" @@ -180,21 +206,16 @@ cron = "0.12" futures-util = "0.3" directories = "6" toml = "1.0" -shellexpand = "3.1" schemars = "1.2" tracing = { version = "0.1", default-features = false } tracing-log = "0.2" tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter"] } tracing-appender = "0.2" -prometheus = { version = "0.14", default-features = false } urlencoding = "2.1" motosan-ai-oauth = { version = "0.2", features = ["codex"] } thiserror = "2.0" ring = "0.17" -prost = { version = "0.14", default-features = false } -postgres = { version = "0.19", features = ["with-chrono-0_4"] } chrono-tz = "0.10" -dialoguer = { version = "0.12", features = ["fuzzy-select"] } dotenvy = "0.15" console = "0.16" regex = "1.10" @@ -206,14 +227,6 @@ regex = "1.10" aho-corasick = "1.1" walkdir = "2" glob = "0.3" -unicode-segmentation = "1" -unicode-width = "0.2" -# NFKC + combining-mark detection for the cross-thread search inverted -# index (`memory_conversations::tokenize`). NFKC unifies CJK half/full- -# width variants and Arabic presentation forms; `canonical_combining_class` -# lets us strip diacritics across all scripts (Polish ą→a, Arabic harakat, -# Hebrew niqqud, etc.) without per-language tables. -unicode-normalization = "0.1" hostname = "0.4.2" rustls = { version = "0.23", features = ["ring"] } rustls-pki-types = "1.14.0" @@ -222,23 +235,23 @@ webpki-roots = "1.0.6" sysinfo = { version = "0.33", default-features = false, features = ["system"] } keyring = { version = "3", features = ["apple-native", "windows-native", "linux-native"] } clap = { version = "4.5", features = ["derive"] } -clap_complete = "4.5" lettre = { version = "0.11.22", default-features = false, features = ["builder", "smtp-transport", "rustls-tls"], optional = true } -mail-parser = "0.11.2" -async-imap = { version = "0.11", features = ["runtime-tokio"], default-features = false } -axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"] } -tower = { version = "0.5", default-features = false } -opentelemetry = { version = "0.32", default-features = false, features = ["trace", "metrics"] } -opentelemetry_sdk = { version = "0.32", default-features = false, features = ["trace", "metrics"] } -opentelemetry-otlp = { version = "0.32", default-features = false, features = ["trace", "metrics", "http-proto", "reqwest-client", "reqwest-rustls-webpki-roots"] } -sentry = { version = "0.47.0", default-features = false, features = ["backtrace", "contexts", "panic", "tracing", "debug-images", "reqwest", "rustls"] } +# HTTP + Socket.IO server transport — the `/rpc` JSON-RPC endpoint, `/v1` +# OpenAI-compat router, agentbox/http_host sub-servers, and the Socket.IO +# live-event bridge. Exclusive to the default-ON `http-server` feature (#5048): +# a slim/embedded build without it (`--no-default-features`) sheds `axum` + +# `socketioxide` and never binds a listener — the core still runs background +# services and answers over the CLI/native dispatch surface. See the +# `http-server` feature note below and `src/core/http_server_status.rs`. +axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"], optional = true } +sentry = { version = "0.47.0", default-features = false, optional = true, features = ["backtrace", "contexts", "panic", "tracing", "debug-images", "reqwest", "rustls"] } tokio-stream = { version = "0.1.18", features = ["full"] } url = "2" -socketioxide = { version = "0.15", features = ["extensions"] } -whisper-rs = "0.16" +socketioxide = { version = "0.15", features = ["extensions"], optional = true } +whisper-rs = { version = "0.16", optional = true } image = { version = "0.25", default-features = false, features = ["png", "jpeg"] } tempfile = "3" -cpal = "0.15" +cpal = { version = "0.15", optional = true } hound = { version = "3.5", optional = true } enigo = "0.3" arboard = "3" @@ -255,11 +268,9 @@ ethers-signers = { version = "2.0.14", default-features = false } # - bitcoin: P2WPKH PSBT build/sign/broadcast (includes secp256k1). # - ed25519-dalek: Solana transaction signing. # - bs58: Solana base58 addresses + Tron base58check addresses. -# - ripemd: RIPEMD160 for BTC HASH160 (P2WPKH) and Tron address hash. bitcoin = { version = "0.32", default-features = false, features = ["std", "secp-recovery", "rand-std"], optional = true } ed25519-dalek = { version = "2", default-features = false, features = ["std", "rand_core"] } bs58 = { version = "0.5", default-features = false, features = ["std", "check"] } -ripemd = "0.1" # Shared BIP-39 mnemonic → seed for non-EVM chains (BTC P2WPKH derivation, # Tron secp256k1 derivation, Solana ed25519 SLIP-0010 derivation). Same crate # ethers-signers uses internally, exposed as a direct dep so we can derive @@ -269,11 +280,11 @@ coins-bip39 = "0.8" curve25519-dalek = { version = "4", default-features = false, features = ["alloc"], optional = true } fantoccini = { version = "0.22.0", optional = true, default-features = false, features = ["rustls-tls"] } -pdf-extract = "0.10" +pdf-extract = { version = "0.10", optional = true } # The WhatsApp Web provider (and its `whatsapp-rust` / `wacore` / `serde-big-array` # stack) now lives in the tinychannels crate; the `whatsapp-web` feature forwards # to `tinychannels/whatsapp-web`. -ppt-rs = "0.2.14" +ppt-rs = { version = "0.2.14", optional = true } # Terminal chat UI (`openhuman tui` / `chat`). Exclusive to the default-ON # `tui` feature (see `[features]` below): a slim / headless build without `tui` # drops both `ratatui` and `crossterm`. Kept in lockstep — ratatui 0.30 @@ -282,39 +293,41 @@ ppt-rs = "0.2.14" # `src/openhuman/tui/` behind `#[cfg(feature = "tui")]`. ratatui = { version = "0.30", optional = true } crossterm = { version = "0.29", optional = true } +# Terminal column-width measurement for the `tui` chat renderer +# (`src/openhuman/tui/render.rs`); only compiled behind `#[cfg(feature = "tui")]`. +unicode-width = { version = "0.2", optional = true } # Native-Rust `.docx` writer for the `generate_document` tool (GH #4847). # Pure Rust (no subprocess / managed runtime), MIT-licensed, actively # maintained (2.8M downloads, last release 0.4.20 — Apr 2026). Mirrors the # `ppt-rs` presentation engine: synthesise bytes in-process, hand them to # the byte-agnostic artifact pipeline. `default-features` keeps the crate's # image support (unused here, but avoids a bespoke feature list drifting). -docx-rs = "0.4.20" +docx-rs = { version = "0.4.20", optional = true } [target.'cfg(windows)'.dependencies] # Windows: tokio-tungstenite uses native-tls (schannel) so wss:// # connections honor the Windows cert store, including corporate CAs # installed by AV / TLS-inspection proxies. See run-dev-win.sh notes. tokio-tungstenite = { version = "0.24", default-features = false, features = ["connect", "handshake", "native-tls"] } +# Windows re-adds reqwest's native-tls backend (dropped from the base decl in +# `[dependencies]`) so `tls::tls_client_builder()` can call `.use_native_tls()` +# and reach the SChannel/OS cert store — same rationale as tokio-tungstenite +# above. Cargo unions these features with the base rustls decl, so on Windows +# reqwest carries both backends; Linux/macOS keep rustls only. +reqwest = { version = "0.12", default-features = false, features = ["native-tls"] } # AppContainer / process-jail backend in `openhuman::cwd_jail`. # Feature list mirrors the Win32 surface used by cwd_jail/windows.rs: # AppContainer profile APIs, ACL editing, STARTUPINFOEXW process spawn, -# and the GENERIC_* file access masks. `Win32_System_Com` is used by the -# UIA accessibility backend (`accessibility::uia_interact`) to initialise COM -# on the worker thread before creating the UI Automation client. +# and the GENERIC_* file access masks. windows-sys = { version = "0.61", features = [ "Win32_Foundation", "Win32_Security", "Win32_Security_Authorization", "Win32_Security_Isolation", "Win32_Storage_FileSystem", - "Win32_System_Com", "Win32_System_Memory", "Win32_System_Threading", ] } -# Microsoft UI Automation (UIA) bindings — the Windows backend for the -# `ax_interact` tool (`accessibility::uia_interact`). Safe Rust wrappers over -# the UIA COM API; the Windows analogue of the macOS AXUIElement Swift helper. -uiautomation = "0.25" [target.'cfg(not(windows))'.dependencies] # macOS / Linux: keep rustls + Mozilla webpki-roots — the historical @@ -322,7 +335,7 @@ uiautomation = "0.25" tokio-tungstenite = { version = "0.24", default-features = false, features = ["connect", "handshake", "rustls-tls-webpki-roots"] } [target.'cfg(target_os = "macos")'.dependencies] -whisper-rs = { version = "0.16", features = ["metal"] } +whisper-rs = { version = "0.16", features = ["metal"], optional = true } # Contacts framework bindings for address book seeding. objc2 = "0.6" objc2-foundation = { version = "0.3", features = ["NSArray", "NSError", "NSObject", "NSString", "NSPredicate"] } @@ -341,6 +354,18 @@ rppal = { version = "0.22", optional = true } # crates we never use (and that bloat the dev Cargo.lock noticeably). # TestTransport only needs the `test` feature. sentry = { version = "0.47.0", default-features = false, features = ["test"] } +# axum is optional in `[dependencies]` (exclusive to the default-ON +# `http-server` feature, #5048), but ~17 `#[cfg(test)]` modules stand up +# in-process axum mock servers / call `build_core_http_router` regardless of +# the feature set under test. Declaring a plain (non-optional) dev-dep keeps +# those tests compiling in ALL test builds without per-file `#[cfg]` — mirrors +# the `sentry` dual-declaration above. The prod fns those tests exercise are +# still gated, so the *tests* naming them carry `#[cfg(feature = "http-server")]`. +axum = { version = "0.8", default-features = false, features = ["http1", "json", "tokio", "query", "ws", "macros"] } +# `tower` was a plain runtime dep only for its re-exports in the axum server +# path; with `http-server` optional it is test-only (tower::ServiceExt::oneshot +# drives the mock routers), so it lives here as a dev-dep now. +tower = { version = "0.5", default-features = false } # Mock HTTP server for provider E2E tests (inference_provider_e2e). wiremock = "0.6" # Used in json_rpc_e2e to backdate mtime on stale lock files. @@ -355,12 +380,56 @@ tokio = { version = "1", features = ["test-util"] } proptest = "1" [features] -default = ["tokenjuice-treesitter", "voice", "web3", "media", "meet", "skills", "flows", "mcp", "tui"] +default = ["tokenjuice-treesitter", "inference", "voice", "web3", "media", "documents", "meet", "skills", "flows", "mcp", "crash-reporting", "http-server", "channels", "tui", "medulla-local"] +# HTTP + Socket.IO server transport (#5048): the `/rpc` JSON-RPC endpoint and +# its auth middleware/CORS layer (`core::jsonrpc`, `core::auth`), the `/v1` +# OpenAI-compatible router (`inference::http`), the ad-hoc static-dir file +# server (`openhuman::http_host`), the AgentBox `/run` HTTP surface +# (`agentbox::http`), the WebSocket dictation stream +# (`inference::voice::streaming`), the `openhuman text-input run` dev server, +# the MCP Streamable-HTTP transport (`mcp_server::http`, additionally gated by +# `mcp`), and the Socket.IO live-event bridge (`core::socketio`). Default-ON — +# the desktop shell REQUIRES it (see the `HTTP_SERVER_COMPILED_IN` compile +# assert in `app/src-tauri/src/lib.rs`). Slim / headless-embedding builds opt +# out via `--no-default-features --features ""`, which drops the exclusive `axum` + `socketioxide` deps; the +# core then runs background services without binding a listener (`serve()` +# returns early) and is driven over the CLI / native dispatch surface instead. +# +# TYPE CARVE-OUT (see AGENTS.md): `core::socketio`'s inert event payload types +# (`WebChannelEvent`, `TurnUsagePayload`, `SubagentUsagePayload`, +# `SubagentProgressDetail`) stay compiled in BOTH builds — ~10 always-on +# domains construct them — so `pub mod socketio;` is UNGATED and only the +# socketioxide/axum-touching bodies are gated. Likewise `inference::http::types` +# and `EXTERNAL_OPENAI_COMPAT_PROVIDER` stay compiled for `core::auth`. +http-server = ["dep:axum", "dep:socketioxide"] # AST-aware code compression (tree-sitter Rust/TS/Python grammars; C build). # On by default; disable to fall back to the brace-depth heuristic. tokenjuice-treesitter = [ "tinyjuice/tinyjuice-treesitter", ] +# In-process inference engine: the whisper.cpp STT engine +# (`inference::local::service::whisper_engine`) plus the `cpal` audio-device +# probe shared by voice capture and the accessibility microphone-permission +# check. Default-ON. Slim / headless builds opt out via +# `--no-default-features --features ""`, which +# drops the exclusive `whisper-rs` (including the macOS `metal` variant and the +# `whisper-rs-sys` patch, which go inert once whisper-rs leaves the graph) and +# `cpal` dependencies. When off, the whisper facade resolves to +# `whisper_engine::stub` — in-process STT returns a disabled error, while the +# local-AI service still reaches Ollama / LM Studio over HTTP — and the +# microphone probe reports `Unknown`. `voice` requires this gate, so building +# `voice` always pulls `inference` in transitively. +inference = ["dep:whisper-rs", "dep:cpal"] +# Office-document tools: the `generate_presentation` (ppt-rs) and +# `generate_document` (docx-rs) agent tools, plus `pdf-extract` for PDF text +# extraction during multimodal file ingest. Default-ON. Slim / headless builds +# opt out via `--no-default-features --features ""`, which drops all three crates. Leaf gate (no stub facade): when +# off, the two tools are absent from the tool list rather than degraded to an +# error, and PDF ingest degrades the file to a reference instead of extracted +# text (`agent::multimodal::extract_pdf_text`). +documents = ["dep:pdf-extract", "dep:ppt-rs", "dep:docx-rs"] # Voice + audio_toolkit domains: STT/TTS providers, the standalone dictation # server, always-on listening, and podcast audio generation/email delivery. # Default-ON — the desktop app always ships with voice. Slim / headless builds @@ -368,10 +437,9 @@ tokenjuice-treesitter = [ # which also drops the exclusive `hound` (WAV I/O) + `lettre` (podcast email) # dependencies. Composes with the runtime `DomainSet::voice` flag (#4796): the # feature narrows the compile-time surface, `DomainSet` gates it at runtime. -# NOTE: this gate does NOT drop whisper-rs / llama / cpal — those live in the -# inference domain (shared with accessibility for cpal) and await a separate -# `inference` gate. -voice = ["dep:hound", "dep:lettre"] +# Requires `inference` (the whisper engine + the cpal capture stack), so +# enabling `voice` turns `inference` on transitively. +voice = ["inference", "dep:hound", "dep:lettre"] # Web3 domains: openhuman::wallet + openhuman::web3 + openhuman::x402 — the # crypto wallet (multi-chain sign/broadcast), the high-level swap/bridge/dapp # surface, and the x402 machine-payment protocol. Default-ON — the desktop app @@ -466,9 +534,32 @@ skills = [] # `sanitize::sanitize_for_llm`). The gate follows the real dependency graph, # not the directory name. mcp = [] -# Terminal chat UI: the `openhuman tui` (alias `chat`) CLI subcommand, a -# ratatui/crossterm terminal front-end onto the same `web_chat` surface the -# desktop app drives. Default-ON for the standalone `openhuman-core` binary, but +# Sentry crash/error reporting: the `sentry::init` guard + secret-scrubbing +# `before_send` hook (src/main.rs), the sentry-tracing bridge layer +# (core::logging), the ~24 `before_send` Event classifiers + the two +# `report_*_message` capture paths (core::observability), the session-boundary +# scope binding (credentials::sentry_scope), and the `openhuman sentry-test` +# CLI probe. Default-ON — the desktop app always ships with crash reporting. +# Slim / headless builds opt out via `--no-default-features --features +# ""`, which drops the exclusive +# `sentry` dependency (and its transitive backtrace/contexts/panic/tracing/ +# debug-images/reqwest/rustls stack) from the non-test build. +# +# TYPE CARVE-OUT (see AGENTS.md "Compile-time domain gates"): the sentry-free +# string classifiers (`is_transient_message_failure`, +# `is_insufficient_credits_message`, `contains_transient_transport_phrase`, …) +# and the `report_*_message` / `sentry_scope::{bind,clear}` signatures stay +# compiled in BOTH builds — only the `sentry::`-touching bodies are gated — so +# NO stub file is needed and always-on callers need no per-call `#[cfg]`. When +# off, `report_error_message`/`report_warning_message` still emit their +# `tracing::{error,warn}!` diagnostic, `sentry_tracing_layer()` degrades to a +# no-op `Identity` layer, and `openhuman sentry-test` returns a "built without +# the crash-reporting feature" error. +crash-reporting = ["dep:sentry"] + +# Tabbed terminal UI: the `openhuman tui` (alias `chat`) CLI subcommand, a +# ratatui/crossterm front-end for logs, orchestrator chat, curated configuration, +# and account settings. Default-ON for the standalone `openhuman-core` binary, but # INTENTIONALLY NOT forwarded to the desktop shell (the desktop app ships its own # Tauri UI and never needs a terminal one) — see the allowlist entry in # `scripts/ci/check-feature-forwarding.mjs`. Slim / headless builds opt out via @@ -478,7 +569,54 @@ mcp = [] # are `#[cfg(feature = "tui")]`; when off, `tui::stub::run_from_cli` returns a # build-fact "tui feature disabled at compile time" error from the untouched # `"tui" | "chat"` CLI arm (mirrors the `mcp` stub pattern). -tui = ["dep:ratatui", "dep:crossterm"] +tui = ["dep:ratatui", "dep:crossterm", "dep:unicode-width"] +# Local Medulla brain (plan Flavor A, §3.1–§3.2): the `medulla_local` domain — +# a supervised `medulla-serve` Node child speaking the serve NDJSON protocol, +# host-side inference + tools port callbacks, the `medulla_local` RPC namespace, +# and the subconscious-replacement draft (`subconscious.engine = "medulla"`, +# §5.2). Default-ON — the desktop app ships it — and therefore FORWARDED to the +# Tauri shell's `openhuman_core` features (default-features=false there). Slim / +# headless builds opt out via `--no-default-features --features ""`. The module is `#[cfg(feature = "medulla-local")]` at its +# `pub mod` declaration (a registration-site gate, like `flows`); the +# `subconscious.engine` config field stays compiled in ALL builds (inert serde), +# and the subconscious tick's medulla branch is `#[cfg]`-gated so the default +# (`local`) path is byte-identical whether or not this feature is on. +# Sheds ZERO exclusive dependencies — tokio net/process, reqwest, serde are all +# load-bearing for other domains; the value is compile-time surface. +# The serve transport is unix-only (unix domain sockets): on non-unix targets +# (Windows desktop) the feature still compiles via a supervisor stub that +# reports a typed unsupported-platform error, so forwarding the default-ON +# gate to the Tauri shell never breaks Windows packaging. +medulla-local = [] + +# Channels domain: `openhuman::channels` (external-messaging providers — Telegram, +# Discord, Slack, Signal, WhatsApp, iMessage, IRC, … — plus the channel runtime, +# controllers, host, proactive messaging and inbound dispatch) together with the +# `webview_accounts` / `webview_apis` / `webview_notifications` / `whatsapp_data` +# webview-bridge domains. Default-ON — the desktop app always ships with +# channels. Slim / headless builds opt out via `--no-default-features --features +# ""`. Composes with the runtime +# `DomainSet::Channels` flag (#4796): this feature narrows the compile-time +# surface, `DomainSet` gates it at runtime. +# +# INTENTIONALLY EMPTY — do NOT "fix" this by adding `dep:` entries. This gate +# sheds ZERO dependencies: `tinychannels` stays load-bearing regardless +# (`config/schema/channels.rs` re-exports its config types, `event_bus/events.rs` +# `DomainEvent` embeds `tinychannels::ChannelInboundEnvelope`, and +# `security/pairing.rs` re-exports its pairing helpers), so it is always +# compiled. The gate's value is compile-time surface + binary size, not the dep +# tree. (`whatsapp-web` refines this gate — see below — forwarding to the +# `tinychannels/whatsapp-web` provider feature.) +# +# NOTE: the in-app web chat (`openhuman::web_chat`, RPC namespace `channel`) is +# NOT gated by this feature even though its runtime tag is +# `DomainGroup::Channels` — it is core product surface and stays always +# compiled (decoupled from `channels/` in #5002). The `channels::{traits, cli}` +# carve-outs also stay ungated — `traits` is a 1-line tinychannels re-export and +# `cli::CliChannel` is the dep-free local REPL used by the always-on agent +# harness interactive loop. See AGENTS.md "channels gate" + `channels/mod.rs`. +channels = [] sandbox-landlock = ["dep:landlock"] sandbox-bubblewrap = [] peripheral-rpi = ["dep:rppal"] @@ -486,11 +624,22 @@ browser-native = ["dep:fantoccini"] fantoccini = ["browser-native"] landlock = ["sandbox-landlock"] # The WhatsApp Web provider now lives in tinychannels; forward to its feature. -whatsapp-web = ["tinychannels/whatsapp-web"] +# It is a refinement INSIDE the `channels` gate — enabling it pulls in the whole +# channels domain (the provider re-exports live under `channels/providers/`). +whatsapp-web = ["channels", "tinychannels/whatsapp-web"] # Exposes the destructive `openhuman.test_reset` RPC. Off by default; the E2E # build (app/scripts/e2e-build.sh) flips it on. Shipped binaries never have # this feature so the wipe RPC isn't even registered, let alone reachable. e2e-test-support = [] +# Builds the `rss-bench` benchmark binary (#5046). Default-OFF, so it is never +# part of the shipped desktop/library build and the feature-forwarding gate +# (which only inspects the `default` list) never requires forwarding it. +rss-bench = [] +# Adds dhat heap profiling on top of `rss-bench` for the `library-profile` +# binary. Default-OFF, dev-only: installs dhat's global allocator, which +# perturbs RSS/timing numbers, so it is a separate opt-in feature rather than +# folded into `rss-bench`. Never forwarded to the shipped build. +rss-bench-dhat = ["rss-bench", "dep:dhat"] [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage)'] } @@ -529,12 +678,6 @@ tinyjuice = { path = "vendor/tinyjuice" } tinychannels = { path = "vendor/tinychannels" } tinyplace = { path = "vendor/tinyplace/sdk/rust" } -# TinyCortex temporarily pins the embedding API port while tinyagents #58 is -# pending. Resolve that git source to the same vendored crate so host adapters -# and TinyCortex share one `EmbeddingModel` trait identity. -[patch."https://github.com/senamakel/tinyagents"] -tinyagents = { path = "vendor/tinyagents" } - # Emit just enough DWARF in release builds for Sentry to symbolicate Rust # panics + render surrounding source lines. `line-tables-only` keeps the # binary small (only file+line tables, no full type info) while still diff --git a/Dockerfile b/Dockerfile index d7884f3278..b41f0b8643 100644 --- a/Dockerfile +++ b/Dockerfile @@ -110,6 +110,14 @@ RUN sed -i 's/\r$//' /usr/local/bin/docker-entrypoint-core.sh \ # The entrypoint runs as root so it can chown the mounted volume, then execs # gosu to drop to the openhuman user before starting the binary. +# +# CAUTION: because the image default user is root, `docker exec ...` lands +# as root and does NOT run the entrypoint — so running `openhuman-core` that way +# creates a root-owned `config.toml` (the core writes it at mode 0600), which +# uid 10001 then cannot read on the next start. Use +# `docker exec -u openhuman openhuman-core ...` for any CLI poking around. +# The entrypoint heals a workspace already in that state, but prevention is +# cheaper than a restart loop. USER root # Default workspace directory @@ -117,6 +125,8 @@ ENV OPENHUMAN_WORKSPACE=/home/openhuman/.openhuman # Bind to all interfaces so the container is reachable ENV OPENHUMAN_CORE_HOST=0.0.0.0 ENV OPENHUMAN_CORE_PORT=7788 +# Stable first-party signal for CLI launch policy; containers default headless. +ENV OPENHUMAN_DOCKER=1 ENV RUST_LOG=info # AgentBox marketplace mode — off by default for desktop builds. The # AgentBox console flips this on per deployment, along with GMI_MAAS_*. diff --git a/INSTALL.md b/INSTALL.md index 16827c72dd..e830eb7391 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,11 +6,10 @@ Download installers from [tinyhumans.ai/openhuman](https://tinyhumans.ai/openhum These paths use native installer surfaces. Homebrew and MSI provide their normal signing/integrity checks; Debian/Ubuntu uses `apt-get` to install the release `.deb` and resolve system dependencies. -**macOS (Homebrew tap):** +**macOS (Homebrew Cask):** ```bash -brew tap tinyhumansai/core -brew install openhuman +brew install --cask openhuman ``` **Linux (Debian/Ubuntu, release `.deb`):** diff --git a/app/knip.json b/app/knip.json index 668da51ad8..fc50631c6c 100644 --- a/app/knip.json +++ b/app/knip.json @@ -1,27 +1,28 @@ { "$schema": "https://unpkg.com/knip@6/schema.json", - "entry": ["src/main.tsx", "test/e2e/specs/**/*.spec.ts"], - "project": [ - "src/**/*.{ts,tsx}", - "test/**/*.{ts,tsx}", - "test/e2e/globals.d.ts", - "*.config.{js,ts}" + "entry": [ + "src/main.tsx", + "src/features/conversations/index.ts", + "vite.config.ts", + "test/vitest.config.ts", + "test/wdio.conf.ts", + "playwright.config.ts", + "test/e2e/specs/**/*.spec.ts", + "test/playwright/specs/**/*.spec.ts" ], + "project": ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}", "*.config.{js,ts}"], + "tags": ["-knipignore"], "ignoreDependencies": [ - "@tauri-apps/cli", - "@testing-library/dom", "@wdio/appium-service", "@wdio/cli", "@wdio/local-runner", "@wdio/mocha-framework", "@wdio/spec-reporter", "buffer", - "eslint", "husky", "os-browserify", - "prettier", "process", "util" ], - "ignoreBinaries": ["eslint", "knip", "open", "prettier", "tauri", "tsc", "vite", "vitest"] + "ignoreBinaries": ["open"] } diff --git a/app/package.json b/app/package.json index 0379630a62..7b6b499024 100644 --- a/app/package.json +++ b/app/package.json @@ -78,8 +78,6 @@ "@noble/secp256k1": "^3.0.0", "@radix-ui/react-dialog": "^1.1.15", "@reduxjs/toolkit": "^2.11.2", - "@remotion/player": "4.0.454", - "@remotion/zod-types": "4.0.454", "@rive-app/react-webgl2": "^4.28.6", "@scure/base": "^2.2.0", "@scure/bip32": "^2.0.1", @@ -97,14 +95,12 @@ "d3-force": "^3.0.0", "debug": "^4.4.3", "katex": "^0.16.47", - "lottie-react": "^2.4.1", "os-browserify": "^0.3.0", "pixi.js": "^8.18.1", "process": "^0.11.10", "qrcode.react": "^4.2.0", "react": "^19.1.0", "react-dom": "^19.1.0", - "react-ga4": "^3.0.1", "react-icons": "^5.6.0", "react-joyride": "^3.1.0", "react-markdown": "^10.1.0", @@ -116,7 +112,6 @@ "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", "remark-math": "^6.0.0", - "remotion": "4.0.454", "socket.io-client": "^4.8.3", "tauri-plugin-ptt-api": "workspace:*", "three": "^0.183.2", @@ -148,9 +143,11 @@ "@vitest/coverage-v8": "^4.0.18", "@wdio/appium-service": "^9.24.0", "@wdio/cli": "^9.24.0", + "@wdio/globals": "^9.24.0", "@wdio/local-runner": "^9.24.0", "@wdio/mocha-framework": "^9.24.0", "@wdio/spec-reporter": "^9.24.0", + "@wdio/types": "^9.24.0", "autoprefixer": "^10.4.23", "cross-env": "^10.1.0", "eslint": "^9.39.2", @@ -169,6 +166,7 @@ "typescript": "~5.8.3", "vite": "^8.0.0", "vite-plugin-node-polyfills": "^0.26.0", - "vitest": "^4.0.18" + "vitest": "^4.0.18", + "webdriverio": "^9.24.0" } } diff --git a/app/pnpm-lock.yaml b/app/pnpm-lock.yaml index ff2f8cea7f..695177c307 100644 --- a/app/pnpm-lock.yaml +++ b/app/pnpm-lock.yaml @@ -46,9 +46,6 @@ importers: debug: specifier: ^4.4.3 version: 4.4.3(supports-color@8.1.1) - lottie-react: - specifier: ^2.4.1 - version: 2.4.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) os-browserify: specifier: ^0.3.0 version: 0.3.0 @@ -149,6 +146,9 @@ importers: '@wdio/cli': specifier: ^9.24.0 version: 9.27.0(@types/node@25.6.0)(expect-webdriverio@5.6.5) + '@wdio/globals': + specifier: ^9.24.0 + version: 9.27.0(expect-webdriverio@5.6.5)(webdriverio@9.27.0) '@wdio/local-runner': specifier: ^9.24.0 version: 9.27.0(@wdio/globals@9.27.0)(webdriverio@9.27.0) @@ -158,6 +158,9 @@ importers: '@wdio/spec-reporter': specifier: ^9.24.0 version: 9.27.0 + '@wdio/types': + specifier: ^9.24.0 + version: 9.27.0 autoprefixer: specifier: ^10.4.23 version: 10.5.0(postcss@8.5.10) @@ -206,6 +209,9 @@ importers: vitest: specifier: ^4.0.18 version: 4.1.5(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(jsdom@28.1.0(@noble/hashes@2.2.0))(vite@7.3.2(@types/node@25.6.0)(jiti@1.21.7)(tsx@4.21.0)(yaml@2.8.3)) + webdriverio: + specifier: ^9.24.0 + version: 9.27.0 packages: '@acemir/cssom@0.9.31': @@ -5748,21 +5754,6 @@ packages: } hasBin: true - lottie-react@2.4.1: - resolution: - { - integrity: sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==, - } - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - lottie-web@5.13.0: - resolution: - { - integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==, - } - lru-cache@10.4.3: resolution: { @@ -12146,14 +12137,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lottie-react@2.4.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): - dependencies: - lottie-web: 5.13.0 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - - lottie-web@5.13.0: {} - lru-cache@10.4.3: {} lru-cache@11.3.5: {} diff --git a/app/schema.json b/app/schema.json index 2bed0647be..7ec1cca42a 100644 --- a/app/schema.json +++ b/app/schema.json @@ -834,70 +834,6 @@ } ] }, - { - "description": "Update screen intelligence runtime settings.", - "function": "update_screen_intelligence_settings", - "inputs": [ - { - "comment": "Enable screen intelligence.", - "name": "enabled", - "required": false, - "ty": { "Option": "Bool" } - }, - { - "comment": "Capture policy mode.", - "name": "capture_policy", - "required": false, - "ty": { "Option": "String" } - }, - { - "comment": "Policy mode override.", - "name": "policy_mode", - "required": false, - "ty": { "Option": "String" } - }, - { - "comment": "Baseline capture FPS.", - "name": "baseline_fps", - "required": false, - "ty": { "Option": "F64" } - }, - { - "comment": "Enable vision analysis.", - "name": "vision_enabled", - "required": false, - "ty": { "Option": "Bool" } - }, - { - "comment": "Enable autocomplete integration.", - "name": "autocomplete_enabled", - "required": false, - "ty": { "Option": "Bool" } - }, - { - "comment": "Allowed app list.", - "name": "allowlist", - "required": false, - "ty": { "Option": { "Array": "String" } } - }, - { - "comment": "Denied app list.", - "name": "denylist", - "required": false, - "ty": { "Option": { "Array": "String" } } - } - ], - "method": "openhuman.config_update_screen_intelligence_settings", - "namespace": "config", - "outputs": [ - { - "comment": "Updated config snapshot.", - "name": "snapshot", - "required": true, - "ty": "Json" - } - ] - }, { "description": "Replace tunnel settings with provided config payload.", "function": "update_tunnel_settings", @@ -1246,167 +1182,6 @@ } ] }, - { - "description": "Capture screenshot and return image ref.", - "function": "capture_image_ref", - "inputs": [], - "method": "openhuman.screen_intelligence_capture_image_ref", - "namespace": "screen_intelligence", - "outputs": [ - { - "comment": "Capture image_ref payload.", - "name": "capture", - "required": true, - "ty": "Json" - } - ] - }, - { - "description": "Trigger immediate screen capture.", - "function": "capture_now", - "inputs": [], - "method": "openhuman.screen_intelligence_capture_now", - "namespace": "screen_intelligence", - "outputs": [ - { "comment": "Capture result payload.", "name": "capture", "required": true, "ty": "Json" } - ] - }, - { - "description": "Perform input action through accessibility automation.", - "function": "input_action", - "inputs": [ - { - "comment": "Input action payload.", - "name": "action", - "required": true, - "ty": { "Ref": "InputActionParams" } - } - ], - "method": "openhuman.screen_intelligence_input_action", - "namespace": "screen_intelligence", - "outputs": [ - { - "comment": "Input action result payload.", - "name": "result", - "required": true, - "ty": "Json" - } - ] - }, - { - "description": "Request one accessibility permission.", - "function": "request_permission", - "inputs": [ - { "comment": "Permission name.", "name": "permission", "required": true, "ty": "String" } - ], - "method": "openhuman.screen_intelligence_request_permission", - "namespace": "screen_intelligence", - "outputs": [ - { - "comment": "Permission status payload.", - "name": "permissions", - "required": true, - "ty": "Json" - } - ] - }, - { - "description": "Request required accessibility permissions.", - "function": "request_permissions", - "inputs": [], - "method": "openhuman.screen_intelligence_request_permissions", - "namespace": "screen_intelligence", - "outputs": [ - { - "comment": "Permission status payload.", - "name": "permissions", - "required": true, - "ty": "Json" - } - ] - }, - { - "description": "Start screen intelligence session.", - "function": "start_session", - "inputs": [ - { - "comment": "Capture interval in milliseconds.", - "name": "sample_interval_ms", - "required": false, - "ty": { "Option": "U64" } - }, - { - "comment": "Capture policy mode.", - "name": "capture_policy", - "required": false, - "ty": { "Option": "String" } - } - ], - "method": "openhuman.screen_intelligence_start_session", - "namespace": "screen_intelligence", - "outputs": [ - { "comment": "Session status payload.", "name": "session", "required": true, "ty": "Json" } - ] - }, - { - "description": "Read screen intelligence accessibility status.", - "function": "status", - "inputs": [], - "method": "openhuman.screen_intelligence_status", - "namespace": "screen_intelligence", - "outputs": [ - { - "comment": "Accessibility status payload.", - "name": "status", - "required": true, - "ty": "Json" - } - ] - }, - { - "description": "Stop screen intelligence session.", - "function": "stop_session", - "inputs": [ - { - "comment": "Optional stop reason.", - "name": "reason", - "required": false, - "ty": { "Option": "String" } - } - ], - "method": "openhuman.screen_intelligence_stop_session", - "namespace": "screen_intelligence", - "outputs": [ - { "comment": "Session status payload.", "name": "session", "required": true, "ty": "Json" } - ] - }, - { - "description": "Flush stored vision summaries.", - "function": "vision_flush", - "inputs": [], - "method": "openhuman.screen_intelligence_vision_flush", - "namespace": "screen_intelligence", - "outputs": [ - { "comment": "Vision flush payload.", "name": "result", "required": true, "ty": "Json" } - ] - }, - { - "description": "Read recent vision summaries.", - "function": "vision_recent", - "inputs": [ - { - "comment": "Maximum number of summaries.", - "name": "limit", - "required": false, - "ty": { "Option": "U64" } - } - ], - "method": "openhuman.screen_intelligence_vision_recent", - "namespace": "screen_intelligence", - "outputs": [ - { "comment": "Vision recent payload.", "name": "result", "required": true, "ty": "Json" } - ] - }, { "description": "Manage desktop service lifecycle.", "function": "install", diff --git a/app/scripts/e2e-run-all-flows.sh b/app/scripts/e2e-run-all-flows.sh index 2bfa50d8ea..37f50ab5f0 100755 --- a/app/scripts/e2e-run-all-flows.sh +++ b/app/scripts/e2e-run-all-flows.sh @@ -293,7 +293,6 @@ if should_run_suite "notifications"; then run "test/e2e/specs/memory-roundtrip.spec.ts" "memory-roundtrip" "notifications" run "test/e2e/specs/coding-session-memory.spec.ts" "coding-session-memory" "notifications" run "test/e2e/specs/cron-jobs-flow.spec.ts" "cron-jobs" "notifications" - run "test/e2e/specs/autocomplete-flow.spec.ts" "autocomplete" "notifications" _mini_summary "notifications" fi @@ -404,7 +403,7 @@ if should_run_suite "settings"; then fi # --------------------------------------------------------------------------- -# System / AI / voice / screen / Tauri +# System / AI / voice / Tauri # linux-cef-deb-runtime.spec.ts is Linux-only (tests /usr/bin path resolution # for .deb package installs) — skipped on macOS/Windows. # --------------------------------------------------------------------------- @@ -413,7 +412,6 @@ if should_run_suite "system"; then echo "## Running suite: system" run "test/e2e/specs/local-model-runtime.spec.ts" "local-model" "system" run "test/e2e/specs/voice-mode.spec.ts" "voice-mode" "system" - run "test/e2e/specs/screen-intelligence.spec.ts" "screen-intelligence" "system" run "test/e2e/specs/audio-toolkit-flow.spec.ts" "audio-toolkit" "system" run "test/e2e/specs/tauri-commands.spec.ts" "tauri-commands" "system" # service-connectivity-flow tests the old sidecar service model removed in diff --git a/app/scripts/e2e-run-shards.sh b/app/scripts/e2e-run-shards.sh index f6f9b8d5cc..62fb5b63f6 100755 --- a/app/scripts/e2e-run-shards.sh +++ b/app/scripts/e2e-run-shards.sh @@ -18,7 +18,8 @@ # chat = chat, skills, journeys # integrations = providers, webhooks, notifications # connectors = connectors -# commerce = payments, settings +# payments = payments +# settings = settings # set -uo pipefail @@ -32,7 +33,8 @@ SHARDS=( "providers:providers,notifications" "webhooks:webhooks" "connectors:connectors" - "commerce:payments,settings" + "payments:payments" + "settings:settings" ) # Allow filtering: `bash e2e-run-shards.sh foundation chat` diff --git a/app/src-tauri/Cargo.lock b/app/src-tauri/Cargo.lock index 2c5d600232..f50d47e9d7 100644 --- a/app/src-tauri/Cargo.lock +++ b/app/src-tauri/Cargo.lock @@ -12,6 +12,7 @@ dependencies = [ "block2 0.6.2", "cef", "chrono", + "cpal", "directories 5.0.1", "env_logger", "futures-util", @@ -28,6 +29,7 @@ dependencies = [ "openhuman", "parking_lot", "rand 0.9.4", + "regex", "reqwest 0.12.28", "resvg", "rfd", @@ -53,6 +55,7 @@ dependencies = [ "tokio-util", "toml 0.8.2", "url", + "uuid 1.23.1", "windows-sys 0.59.0", ] @@ -205,7 +208,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -216,7 +219,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -912,9 +915,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -1217,15 +1220,6 @@ dependencies = [ "strsim", ] -[[package]] -name = "clap_complete" -version = "4.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" -dependencies = [ - "clap", -] - [[package]] name = "clap_derive" version = "4.6.1" @@ -1262,12 +1256,6 @@ dependencies = [ "cc", ] -[[package]] -name = "cmov" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" - [[package]] name = "cocoa" version = "0.22.0" @@ -1292,7 +1280,7 @@ dependencies = [ "bs58", "coins-core", "digest 0.10.7", - "hmac 0.12.1", + "hmac", "k256", "serde", "sha2 0.10.9", @@ -1307,7 +1295,7 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac 0.12.1", + "hmac", "once_cell", "pbkdf2 0.12.2", "rand 0.8.6", @@ -1805,15 +1793,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "ctutils" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" -dependencies = [ - "cmov", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1999,19 +1978,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "dialoguer" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" -dependencies = [ - "console", - "fuzzy-matcher", - "shell-words", - "tempfile", - "zeroize", -] - [[package]] name = "digest" version = "0.10.7" @@ -2033,7 +1999,6 @@ dependencies = [ "block-buffer 0.12.0", "const-oid 0.10.2", "crypto-common 0.2.1", - "ctutils", ] [[package]] @@ -2099,7 +2064,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2517,7 +2482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2536,7 +2501,7 @@ dependencies = [ "ctr", "digest 0.10.7", "hex", - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "rand 0.8.6", "scrypt", @@ -2687,12 +2652,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -3047,15 +3006,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - [[package]] name = "fxhash" version = "0.2.1" @@ -3563,7 +3513,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "hmac 0.12.1", + "hmac", ] [[package]] @@ -3575,15 +3525,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "hmac" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" -dependencies = [ - "digest 0.11.3", -] - [[package]] name = "hostname" version = "0.4.2" @@ -3768,7 +3709,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core 0.57.0", ] [[package]] @@ -4169,7 +4110,7 @@ dependencies = [ "portable-atomic", "portable-atomic-util", "serde_core", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -4598,7 +4539,7 @@ dependencies = [ "indexmap 2.14.0", "itoa", "log", - "md-5 0.10.6", + "md-5", "nom 8.0.0", "nom_locate", "rand 0.9.4", @@ -4665,9 +4606,9 @@ dependencies = [ [[package]] name = "mail-parser" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2420e9ce11c2b0583ca97ddff7ab2398c8a613154e9b72e3bafdbf767f1d7" +checksum = "47785d444be4d32c1709171c6219a90f667c0ad0ffe68b4b179e794f31f4f9e8" dependencies = [ "hashify", ] @@ -4748,16 +4689,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "md-5" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" -dependencies = [ - "cfg-if", - "digest 0.11.3", -] - [[package]] name = "memchr" version = "2.8.0" @@ -5063,7 +4994,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -5452,15 +5383,6 @@ dependencies = [ "objc2-core-foundation", ] -[[package]] -name = "objc2-system-configuration" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396" -dependencies = [ - "objc2-core-foundation", -] - [[package]] name = "objc2-ui-kit" version = "0.3.2" @@ -5610,7 +5532,6 @@ dependencies = [ "anyhow", "arboard", "argon2", - "async-imap", "async-trait", "axum", "base64 0.22.1", @@ -5622,13 +5543,11 @@ dependencies = [ "chrono", "chrono-tz", "clap", - "clap_complete", "coins-bip39", "console", "cpal", "cron", "curve25519-dalek", - "dialoguer", "directories 6.0.0", "dirs 5.0.1", "docx-rs", @@ -5646,7 +5565,7 @@ dependencies = [ "glob", "hex", "hkdf", - "hmac 0.12.1", + "hmac", "hostname", "hound", "iana-time-zone", @@ -5655,28 +5574,20 @@ dependencies = [ "lettre", "libc", "log", - "mail-parser", "motosan-ai-oauth", "nu-ansi-term 0.46.0", "objc2 0.6.4", "objc2-contacts", "objc2-foundation 0.3.2", "once_cell", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", "parking_lot", "pdf-extract", - "postgres", "ppt-rs", - "prometheus", - "prost", "rand 0.10.1", "rdev", "regex", "reqwest 0.12.28", "ring", - "ripemd", "rusqlite", "rustls", "rustls-pki-types", @@ -5688,7 +5599,6 @@ dependencies = [ "serde_yaml", "sha1", "sha2 0.10.9", - "shellexpand", "similar", "socketioxide", "starship-battery", @@ -5696,7 +5606,7 @@ dependencies = [ "tar", "tempfile", "thiserror 2.0.18", - "tinyagents 1.9.0", + "tinyagents", "tinychannels", "tinycortex", "tinyflows", @@ -5708,15 +5618,10 @@ dependencies = [ "tokio-tungstenite 0.24.0", "tokio-util", "toml 1.1.2+spec-1.1.0", - "tower", "tracing", "tracing-appender", "tracing-log", "tracing-subscriber", - "uiautomation", - "unicode-normalization", - "unicode-segmentation", - "unicode-width", "url", "urlencoding", "uuid 1.23.1", @@ -5774,75 +5679,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.18", -] - -[[package]] -name = "opentelemetry-http" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry", - "reqwest 0.13.1", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" -dependencies = [ - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "reqwest 0.13.1", - "thiserror 2.0.18", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" -dependencies = [ - "opentelemetry", - "opentelemetry_sdk", - "prost", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368afaed344110f40b179bb8fbe54bc52d98f9bd2b281799ef32487c2650c956" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "portable-atomic", - "rand 0.9.4", - "thiserror 2.0.18", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -6022,7 +5858,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", "password-hash 0.4.2", "sha2 0.10.9", ] @@ -6034,7 +5870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", ] [[package]] @@ -6433,50 +6269,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "postgres" -version = "0.19.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aacf632d0554ff75f58183694f41dc8999c8a3a43a386994d0ec2d034f1dfbe1" -dependencies = [ - "bytes", - "fallible-iterator 0.2.0", - "futures-util", - "log", - "tokio", - "tokio-postgres", -] - -[[package]] -name = "postgres-protocol" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08808e3c483c46e999108051c78334f473d5adb59d78bb80a1268c7e6aa6c514" -dependencies = [ - "base64 0.22.1", - "byteorder", - "bytes", - "fallible-iterator 0.2.0", - "hmac 0.13.0", - "md-5 0.11.0", - "memchr", - "rand 0.10.1", - "sha2 0.11.0", - "stringprep", -] - -[[package]] -name = "postgres-types" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "851ca9db4932932d69f3ea811b1abe63087a0f740a47692619dd40d4899b68be" -dependencies = [ - "bytes", - "chrono", - "fallible-iterator 0.2.0", - "postgres-protocol", -] - [[package]] name = "postscript" version = "0.14.1" @@ -6617,20 +6409,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prometheus" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ca5326d8d0b950a9acd87e6a3f94745394f62e4dae1b1ee22b2bc0c394af43a" -dependencies = [ - "cfg-if", - "fnv", - "lazy_static", - "memchr", - "parking_lot", - "thiserror 2.0.18", -] - [[package]] name = "proptest" version = "1.11.0" @@ -7146,7 +6924,6 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.7", ] [[package]] @@ -7169,7 +6946,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -7303,7 +7080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b3492ea85308705c3a5cc24fb9b9cf77273d30590349070db42991202b214c4" dependencies = [ "bitflags 2.11.1", - "fallible-iterator 0.3.0", + "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", @@ -7358,7 +7135,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7417,7 +7194,7 @@ dependencies = [ "security-framework 3.7.0", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7576,7 +7353,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "salsa20", "sha2 0.10.9", @@ -8076,21 +7853,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" - -[[package]] -name = "shellexpand" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" -dependencies = [ - "dirs 6.0.0", -] - [[package]] name = "shlex" version = "1.3.0" @@ -8189,7 +7951,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -9049,7 +8811,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -9210,7 +8972,7 @@ dependencies = [ [[package]] name = "tinyagents" -version = "1.9.0" +version = "2.1.0" dependencies = [ "async-trait", "bytes", @@ -9227,23 +8989,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tinyagents" -version = "2.0.0" -dependencies = [ - "async-trait", - "bytes", - "chrono", - "futures", - "reqwest 0.12.28", - "serde", - "serde_json", - "sha2 0.11.0", - "thiserror 2.0.18", - "tokio", - "tracing", -] - [[package]] name = "tinychannels" version = "0.1.0" @@ -9258,7 +9003,7 @@ dependencies = [ "futures", "futures-util", "hex", - "hmac 0.12.1", + "hmac", "lettre", "mail-parser", "parking_lot", @@ -9304,7 +9049,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "thiserror 2.0.18", - "tinyagents 2.0.0", + "tinyagents", "tokio", "toml 0.8.2", "tracing", @@ -9324,7 +9069,7 @@ dependencies = [ "serde", "serde_json", "thiserror 2.0.18", - "tinyagents 1.9.0", + "tinyagents", "tracing", ] @@ -9365,7 +9110,7 @@ dependencies = [ "ed25519-dalek", "futures-util", "hkdf", - "hmac 0.12.1", + "hmac", "rand 0.8.6", "reqwest 0.12.28", "serde", @@ -9442,32 +9187,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-postgres" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528f7d280f6d5b9cd149635c8705b0dd049754bc67d81d31fa25169a93809d3" -dependencies = [ - "async-trait", - "byteorder", - "bytes", - "fallible-iterator 0.2.0", - "futures-channel", - "futures-util", - "log", - "parking_lot", - "percent-encoding", - "phf 0.13.1", - "pin-project-lite", - "postgres-protocol", - "postgres-types", - "rand 0.10.1", - "socket2", - "tokio", - "tokio-util", - "whoami", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -9936,30 +9655,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.61.2", -] - -[[package]] -name = "uiautomation" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68495a701b9f2f21f29353ac446f0d27dd0d7ce97aa9ccf9061bca0446cd744" -dependencies = [ - "chrono", - "uiautomation_derive", - "windows 0.62.2", - "windows-core 0.62.2", -] - -[[package]] -name = "uiautomation_derive" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffcc4d404aa1c03a848f95cf5feadc3e63946d7f095bf388770b85550093d388" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "windows-sys 0.60.2", ] [[package]] @@ -10364,15 +10060,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" @@ -10391,15 +10078,6 @@ dependencies = [ "wit-bindgen 0.51.0", ] -[[package]] -name = "wasite" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fe902b4a6b8028a753d5424909b764ccf79b7a209eac9bf97e59cda9f71a42" -dependencies = [ - "wasi 0.14.7+wasi-0.2.4", -] - [[package]] name = "wasm-bindgen" version = "0.2.121" @@ -10728,19 +10406,6 @@ dependencies = [ "semver", ] -[[package]] -name = "whoami" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" -dependencies = [ - "libc", - "libredox", - "objc2-system-configuration", - "wasite", - "web-sys", -] - [[package]] name = "winapi" version = "0.3.9" @@ -10763,7 +10428,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -10823,23 +10488,11 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections 0.2.0", + "windows-collections", "windows-core 0.61.2", - "windows-future 0.2.1", + "windows-future", "windows-link 0.1.3", - "windows-numerics 0.2.0", -] - -[[package]] -name = "windows" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" -dependencies = [ - "windows-collections 0.3.2", - "windows-core 0.62.2", - "windows-future 0.3.2", - "windows-numerics 0.3.1", + "windows-numerics", ] [[package]] @@ -10851,15 +10504,6 @@ dependencies = [ "windows-core 0.61.2", ] -[[package]] -name = "windows-collections" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" -dependencies = [ - "windows-core 0.62.2", -] - [[package]] name = "windows-core" version = "0.54.0" @@ -10908,19 +10552,6 @@ dependencies = [ "windows-strings 0.4.2", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - [[package]] name = "windows-future" version = "0.2.1" @@ -10929,18 +10560,7 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading 0.1.0", -] - -[[package]] -name = "windows-future" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", - "windows-threading 0.2.1", + "windows-threading", ] [[package]] @@ -11031,16 +10651,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-numerics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" -dependencies = [ - "windows-core 0.62.2", - "windows-link 0.2.1", -] - [[package]] name = "windows-registry" version = "0.5.3" @@ -11079,15 +10689,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-strings" version = "0.1.0" @@ -11107,15 +10708,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -11242,15 +10834,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-threading" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-version" version = "0.1.7" @@ -11915,7 +11498,7 @@ dependencies = [ "crc32fast", "crossbeam-utils", "flate2", - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "sha1", "time", diff --git a/app/src-tauri/Cargo.toml b/app/src-tauri/Cargo.toml index 8a46322f24..198b861fb3 100644 --- a/app/src-tauri/Cargo.toml +++ b/app/src-tauri/Cargo.toml @@ -107,9 +107,18 @@ sentry = { version = "0.47.0", default-features = false, features = ["backtrace" # Used by the imessage_scanner module. anyhow = "1.0" +# SQLite for the shell-side whatsapp_data store (relocated from the core). All +# platforms — the store persists on Windows/Linux/macOS. Pinned to match the +# core crate so a single bundled SQLite is linked. (The macOS-only iMessage +# scanner also uses rusqlite; this general dep covers it too.) +rusqlite = { version = "=0.40.0", features = ["bundled"] } parking_lot = "0.12" chrono = "0.4" async-trait = "0.1" +# Desktop companion: native mic capture + POINT-tag parsing + session ids. +cpal = "0.15" +regex = "1" +uuid = { version = "1", features = ["v4"] } # Mascot fake-camera pipeline (meet_call): rasterizes the OpenHuman # mascot SVG to a PNG once, converts it to a YUV420 Y4M frame, and # points CEF's `--use-file-for-fake-video-capture` flag at the cached @@ -161,14 +170,23 @@ cef = { version = "=146.4.1", default-features = false } # `scripts/ci/check-feature-forwarding.mjs` fails CI when this list drifts from # the core's `[features] default` (#4919) — do not hand-maintain it from memory. openhuman_core = { path = "../..", package = "openhuman", default-features = false, features = [ + "channels", "media", "tokenjuice-treesitter", + "inference", "voice", "web3", + "documents", "flows", "meet", "skills", "mcp", + "crash-reporting", + # The desktop shell reaches the in-process core only over + # http://127.0.0.1:/rpc, so it REQUIRES the HTTP + Socket.IO transport + # (#5048). Enforced by the HTTP_SERVER_COMPILED_IN compile assert in lib.rs. + "http-server", + "medulla-local", ] } tinyjuice = { version = "0.2.1", default-features = false } @@ -179,8 +197,8 @@ nix = { version = "0.29", default-features = false, features = ["hostname", "sig objc2 = "0.6" objc2-app-kit = "0.3.2" mac-notification-sys = "0.6" -# iMessage scanner reads ~/Library/Messages/chat.db read-only on macOS. -rusqlite = { version = "=0.40.0", features = ["bundled"] } +# iMessage scanner reads ~/Library/Messages/chat.db read-only on macOS +# (rusqlite is declared once in the general [dependencies] table above). objc2-user-notifications = "0.3.2" block2 = "0.6.2" objc2-foundation = { version = "0.3.2", features = ["NSTimer", "block2"] } @@ -285,11 +303,6 @@ tauri-plugin-global-shortcut = { git = "https://github.com/tauri-apps/plugins-wo tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", rev = "c6561ab6b4f9e7f650d4fc8c53fd8acc9b65b9b2" } tauri-plugin-notification = { path = "vendor/tauri-plugin-notification" } -# Match the root Cargo world: TinyCortex's temporary git pin must resolve to -# the vendored TinyAgents crate to preserve one embedding trait identity. -[patch."https://github.com/senamakel/tinyagents"] -tinyagents = { path = "../../vendor/tinyagents" } - [dev-dependencies] # `test-util` enables `#[tokio::test(start_paused = true)]` for the # idle-watchdog unit tests in `cdp/session.rs` (#1213). diff --git a/app/src-tauri/entitlements.sidecar.plist b/app/src-tauri/entitlements.sidecar.plist index cdad97f19f..abeaaa8d7b 100644 --- a/app/src-tauri/entitlements.sidecar.plist +++ b/app/src-tauri/entitlements.sidecar.plist @@ -22,14 +22,13 @@ (JSON-RPC server, Socket.IO) under the macOS Hardened Runtime. --> com.apple.security.network.server - + com.apple.security.automation.apple-events