Commit Graph
2222 Commits
Author SHA1 Message Date
b2ae12ad02 perf(agent): prewarm session integrations before first turn
## Summary

- prewarm session `connected_integrations` from the shared Composio cache during `from_config_*` agent construction
- synthesize delegation tools against the prewarmed integration view so fresh sessions start with the correct `delegate_<toolkit>` surface
- skip the turn-1 integration fetch and delegation-surface rebuild when the builder already had an authoritative cache snapshot
- carry the runtime `Config` snapshot on the session agent so mid-session integration-cache probes stop reloading config on the hot path
- add a regression test for the initialized/hash bookkeeping when integrations are injected onto an agent

## Problem

- Fresh agent sessions were doing avoidable cold-start work inside `Agent::turn()` before the first provider call.
- On a new session, the turn path loaded transcript state, fetched connected integrations, rebuilt delegation tools, fetched learned context, and only then froze the system prompt.
- The integration fetch itself reloaded `Config` inside the hot path, and the session builder always synthesized delegation tools against an empty integration set, guaranteeing a repair pass on turn 1.
- That inflated first-token latency for orchestrator-style sessions even when the Composio cache already had a valid integration snapshot.

## Solution

- Reuse `composio::cached_active_integrations(config)` during session construction to prewarm `connected_integrations` when the shared cache is already warm.
- Build delegation tools against that cached integration slice instead of hardcoding `&[]`, then persist the synthesized-tool name set onto the built `Agent`.
- Track whether a session's integration view is authoritative with `connected_integrations_initialized`; turn 1 now only fetches integrations and refreshes delegation tools when the builder could not prewarm the cache.
- Store the full runtime `Config` snapshot on the session agent so mid-session cache reads and fallback integration fetches do not call `Config::load_or_init()` on the hot path.
- Keep the existing fallback behavior for cold-cache sessions and shared-`Arc` reconciliation failures so correctness stays unchanged when prewarming is unavailable.

## Submission Checklist

> If a section does not apply to this change, mark the item as `N/A` with a one-line reason. Do not delete items.

- [x] Tests added or updated (happy path + at least one failure / edge case) per [Testing Strategy](../gitbooks/developing/testing-strategy.md#failure-path-requirement)
- [x] N/A: diff coverage is enforced by CI; local coverage commands were blocked in this environment (`pnpm` unavailable on PATH, focused Rust tests blocked by missing `cmake`).
- [x] Coverage matrix updated — `N/A: behaviour-only change`
- [x] All affected feature IDs from the matrix are listed in the PR description under `## Related`
- [x] No new external network dependencies introduced (mock backend used per [Testing Strategy](../gitbooks/developing/testing-strategy.md#mock-policy))
- [x] Manual smoke checklist updated if this touches release-cut surfaces ([`docs/RELEASE-MANUAL-SMOKE.md`](../docs/RELEASE-MANUAL-SMOKE.md))
- [x] Linked issue closed via `Closes #NNN` in the `## Related` section

## Impact

- Runtime/platform impact: desktop/in-process core agent sessions.
- Performance: reduces first-turn latency when the Composio cache is already warm by avoiding a redundant integration fetch, avoiding a redundant delegation-tool rebuild, and avoiding `Config::load_or_init()` on subsequent cache probes.
- Compatibility: cold-cache sessions preserve the old fallback behavior and still fetch integrations on turn 1 when no prewarmed snapshot exists.
- Security: no change in privilege or network surface; this only changes when cached integration metadata is reused.

## Related

- Closes:
- Follow-up PR(s)/TODOs:

---

## AI Authored PR Metadata (required for Codex/Linear PRs)

> Keep this section for AI-authored PRs. For human-only PRs, mark each field `N/A`.

### Linear Issue
- Key: N/A
- URL: N/A

### Commit & Branch
- Branch: feat/agent-spawn-depth-gate
- Commit SHA: 44ca700909

### Validation Run
- [x] N/A: local environment does not have `pnpm` on PATH, so this command could not be run here.
- [x] N/A: local environment does not have `pnpm` on PATH, so this command could not be run here.
- [x] N/A: focused Rust tests were attempted, but the build is blocked locally because `whisper-rs-sys` requires `cmake`, which is not installed in this environment.
- [x] Rust fmt/check (if changed): `cargo fmt --manifest-path Cargo.toml` passed; `git diff --check origin/main...HEAD` clean.
- [x] N/A: Tauri shell files were not changed in this PR; a local `cargo check --manifest-path app/src-tauri/Cargo.toml` attempt was also blocked because the vendored `tauri-cef` dependency tree is missing in this environment.

### Validation Blocked
- `command:` `GGML_NATIVE=OFF cargo test --manifest-path Cargo.toml set_connected_integrations_marks_session_initialized_and_updates_hash -- --nocapture` and `GGML_NATIVE=OFF cargo test --manifest-path Cargo.toml turn_without_tools_returns_text -- --nocapture`
- `error:` `whisper-rs-sys` build script failed because `cmake` is not installed in the local environment
- `impact:` focused Rust tests did not complete locally; correctness is based on source review plus the added regression coverage

### Behavior Changes
- Intended behavior change: sessions built from a warm Composio cache now start with prewarmed integrations and delegation tools instead of repairing that state inside the first turn
- User-visible effect: lower first-token latency for fresh orchestrator-style sessions when integration metadata is already cached

### Parity Contract
- Legacy behavior preserved: when the Composio cache is cold or unavailable, turn 1 still fetches integrations and rebuilds the delegation surface before freezing the prompt
- Guard/fallback/dispatch parity checks: shared-`Arc` reconciliation fallback, mid-session cache-driven refresh, and config-load fallback behavior remain intact

### Duplicate / Superseded PR Handling
- Duplicate PR(s): none
- Canonical PR: this PR
- Resolution (closed/superseded/updated): N/A


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Enforced sub-agent spawn-depth limit (max 3) with surfaced error on overflow.
  * Sessions now preload and track connected integrations and their runtime config.
  * Connected integrations now include a gated-tools catalogue describing hidden toolkit actions.

* **Tests**
  * Added tests for spawn-depth enforcement and reset behavior.
  * Added tests validating integration-initialization state and hash updates.

* **Documentation**
  * Marked spawn-depth runtime limiter as implemented in architecture docs.

<!-- review_stack_entry_start -->

[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/tinyhumansai/openhuman/pull/2454?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: SRIKANTH A <yatheendrudusrikanth@gmail.com>
Co-authored-by: M3gA-Mind <megamind@mahadao.com>
2026-05-22 19:01:37 +05:30
6bcc7948f3 ci(i18n): add zh-CN desktop bundle guard (#2403)
Co-authored-by: Aqil Aziz <aqilaziz@users.noreply.github.com>
2026-05-22 19:00:16 +05:30
3e22ffeedf fix(app): normalize cloud core RPC URLs
## Summary

- Normalize cloud core URLs so users can paste a core base URL like `https://example.trycloudflare.com` and still reach the JSON-RPC endpoint.
- Apply the same normalization in the cloud-mode picker, persisted URL reads/writes, restored core mode state, and direct RPC probing.
- Add regression coverage for Cloudflare-style base URLs, existing `/rpc` URLs, and previously persisted base URLs.

## Problem

- Users connecting the desktop client to a self-hosted core through Cloudflare Tunnel may paste the tunnel base URL instead of the `/rpc` endpoint.
- The core root is reachable, but JSON-RPC calls belong on `/rpc`; using the base URL can make the connection flow fail even though the tunnel itself is healthy.
- The issue report surfaced this as a 405 during remote-core connection setup.

## Solution

- Extend `normalizeRpcUrl` to append `/rpc` when the input URL has no path, while preserving existing `/rpc` URLs and non-root paths.
- Reuse `normalizeRpcUrl` across `BootCheckGate`, `coreRpcClient`, `configPersistence`, and `coreModeSlice` so test connection, boot check, cached URL resolution, and localStorage restoration all agree.
- Keep existing HTTP restrictions unchanged: public cloud URLs still require HTTPS, while local/private HTTP hosts remain allowed.

## Submission Checklist

> If a section does not apply to this change, mark the item as `N/A` with a one-line reason. Do not delete items.

- [x] Tests added or updated (happy path + at least one failure / edge case) per [Testing Strategy](../gitbooks/developing/testing-strategy.md#failure-path-requirement)
- [x] **Diff coverage >= 80%** — focused Vitest coverage was added for the changed URL normalization paths; CI will enforce the merged diff-coverage gate.
- [x] Coverage matrix updated — N/A: behaviour-only cloud URL normalization fix; no feature matrix row added/removed/renamed.
- [x] All affected feature IDs from the matrix are listed in the PR description under `## Related` — N/A: no coverage-matrix feature ID touched.
- [x] No new external network dependencies introduced (mock backend used per [Testing Strategy](../gitbooks/developing/testing-strategy.md#mock-policy))
- [x] Manual smoke checklist updated if this touches release-cut surfaces ([`docs/RELEASE-MANUAL-SMOKE.md`](../docs/RELEASE-MANUAL-SMOKE.md)) — N/A: no release-cut smoke checklist surface changed.
- [x] Linked issue closed via `Closes #NNN` in the `## Related` section

## Impact

- Runtime/platform: desktop/web app cloud-core connection setup and RPC URL resolution.
- Compatibility: existing stored `/rpc` URLs continue to resolve unchanged; previously stored base URLs now self-heal on read.
- Security: public HTTP cloud URLs are still rejected; no auth behavior or token storage behavior changes.

## Related

- Closes #2467
- Follow-up PR(s)/TODOs: none

---

## AI Authored PR Metadata (required for Codex/Linear PRs)

> Keep this section for AI-authored PRs. For human-only PRs, mark each field `N/A`.

### Linear Issue
- Key: N/A
- URL: N/A

### Commit & Branch
- Branch: `yuhao/fix-remote-core-cloudflare-2467`
- Commit SHA: `5e95aeed8a97acee5823d73b6dc8e92f04af00fb`

### Validation Run
- [x] `pnpm --filter openhuman-app format:check`
- [x] `pnpm typecheck`
- [x] Focused tests: `pnpm --dir app exec vitest run --config test/vitest.config.ts src/services/__tests__/coreRpcClient.test.ts src/utils/__tests__/configPersistence.test.ts src/store/coreModeSlice.test.ts src/components/BootCheckGate/__tests__/BootCheckGate.test.tsx` — 200 passed
- [x] Rust fmt/check (if changed): N/A: no Rust source changes; app format gate still ran Rust format checks.
- [x] Tauri fmt/check (if changed): N/A: no Tauri shell source changes; app format gate still ran Tauri Rust format checks.

### Validation Blocked
- `command:` N/A
- `error:` N/A
- `impact:` N/A

### Behavior Changes
- Intended behavior change: cloud core base URLs with no path are normalized to `/rpc`.
- User-visible effect: users can paste a Cloudflare Tunnel base URL into the cloud runtime picker without manually appending `/rpc`.

### Parity Contract
- Legacy behavior preserved: existing `/rpc` URLs, auth token handling, RPC POST envelopes, and public-HTTP rejection behavior are unchanged.
- Guard/fallback/dispatch parity checks: focused tests cover picker continuation, test connection, cached URL resolution, persisted URL reads/writes, and core-mode localStorage restoration.

### Duplicate / Superseded PR Handling
- Duplicate PR(s): none found for #2467 by current open issue/PR review.
- Canonical PR: this PR.
- Resolution (closed/superseded/updated): N/A.


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **Bug Fixes**
  * Consistently normalize cloud RPC URLs: trims input, handles trailing slashes, and ensures the /rpc endpoint across input, storage, retrieval, and connection probes.
  * Safer RPC logging: credentials/query/hash are redacted for logged URLs.

* **Tests**
  * Expanded coverage for URL normalization across connection flows, storage/readback, and boot checks.

* **Localization**
  * Added German translations for subconscious and MCP server/settings UI strings.

<!-- review_stack_entry_start -->

[![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/tinyhumansai/openhuman/pull/2480?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: YUHAO-corn <godcorn001@outlook.com>
Co-authored-by: M3gA-Mind <megamind@mahadao.com>
2026-05-22 18:52:13 +05:30
YOMXXXandGitHub 733fcfe7ca fix(security): allow Windows read commands (#2399) 2026-05-22 17:02:22 +05:30
Andrew BarnesandGitHub f9d94817dd fix: explain reset-data Windows file locks (#2395) 2026-05-22 17:01:15 +05:30
1b29d6b67c docs(cef): add Windows startup triage notes (#2393)
Co-authored-by: Cyrus Gray <144336577+graycyrus@users.noreply.github.com>
2026-05-22 16:57:05 +05:30
5bdc9c2ee5 docs(installer): print Linux AppImage fallback hint (#2392)
Co-authored-by: Aqil Aziz <aqilaziz@users.noreply.github.com>
2026-05-22 16:54:32 +05:30
Aqil AzizandGitHub ddbd0fcbe5 docs(linux): add AppImage failure notes (#2391) 2026-05-22 16:54:02 +05:30
Aqil AzizandGitHub e6f08c6319 docs(e2e): add desktop deep-link smoke (#2389) 2026-05-22 16:43:21 +05:30
Aqil AzizandGitHub c14a196967 docs(auth): add sign-in troubleshooting runbook (#2386) 2026-05-22 16:41:19 +05:30
Aqil AzizandGitHub 72fb7a8d5e docs(cef): document Linux shell fallback (#2387) 2026-05-22 16:40:32 +05:30
70ef42750b docs(local-ai): document local chat routing (#2383)
Co-authored-by: Aqil Aziz <aqilaziz@users.noreply.github.com>
2026-05-22 16:36:51 +05:30
Aqil AzizandGitHub 203367cb45 fix(auth): refresh RPC cache before deep-link session store (#2384) 2026-05-22 16:30:38 +05:30
Aqil AzizandGitHub e3948a3479 ci(release): reject AppImage with bad sharun lib path (#2385) 2026-05-22 16:24:47 +05:30
Aqil AzizandGitHub 6b3a7924bb fix(tools): preserve Windows process env (#2382) 2026-05-22 16:21:38 +05:30
CodeGhost21andGitHub 61dd544e2f fix(channels/discord): convert upstream 401/403 to domain-scoped error so card click can't sign user out (#2285) (#2376) 2026-05-22 16:14:36 +05:30
b2f053f5e1 composio: instagram oauth fails with http 429 in composio integration (#1952) (#2259)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 16:01:12 +05:30
Srinivas VaddiandGitHub 607a6a1db5 Add tool registry policy diagnostics (#2336) 2026-05-22 15:59:35 +05:30
oxoxDevandGitHub b08aa3ea8d fix(tauri): retry main-window lookup on Windows after SW_SHOW (#3A) (#2341) 2026-05-22 15:59:05 +05:30
002dc8d76d fix(subagent): dedup tool specs before sending to provider (#2485)
Co-authored-by: sanil-23 <sanil@alphahuman.xyz>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:29:03 +05:30
github-actions[bot] 0ad723595e chore(staging): v0.54.7 2026-05-22 08:55:46 +00:00
oxoxDevandGitHub 62727e1dc7 fix(core/socketio): accept http://tauri.localhost origin (#2331 follow-up) (#2482) 2026-05-22 14:09:40 +05:30
Srinivas VaddiandGitHub 80b92076d3 Add generated tool wrapper abstraction (#2333) 2026-05-22 14:05:24 +05:30
9d0cce77ce feat(embeddings): rate-limit cloud embedding requests to the backend's hard 60/min cap (#2461)
Co-authored-by: sanil-23 <sanil@alphahuman.xyz>
Co-authored-by: Claude <noreply@anthropic.com>
2026-05-22 13:58:06 +05:30
github-actions[bot] 7fe3dd06ba chore(staging): v0.54.6 2026-05-21 20:17:36 +00:00
OffByOneandGitHub c9ab4b9c12 Add German locale support (#2378) 2026-05-22 00:18:16 +05:30
CodeGhost21andGitHub b3e0021aae fix(channels): distinguish rate-limit sources in chat error classifier (#2364) (#2371) 2026-05-22 00:17:07 +05:30
a20f75bc4b fix(memory): accept time_window_days alias in query_global (#2350)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Cyrus Gray <144336577+graycyrus@users.noreply.github.com>
2026-05-22 00:12:15 +05:30
github-actions[bot] f02543b80a chore(staging): v0.54.5 2026-05-21 18:41:18 +00:00
Mega MindandGitHub 2a935d35b1 test(e2e): add E2E coverage for 15 Composio connector flows (#2351) 2026-05-22 00:08:11 +05:30
Mega MindandGitHub c6c9abbe18 refactor(tls): move tls.rs → tls/mod.rs per module-layout rule (#2460) 2026-05-22 00:08:01 +05:30
Srinivas VaddiandGitHub 0257a6cf79 Add approval audit history read path (#2335) 2026-05-21 23:52:52 +05:30
Srinivas VaddiandGitHub 190397c4cb Thread tool call context through policy (#2334) 2026-05-21 23:47:45 +05:30
oxoxDevandGitHub b1bbc53fce feat: tighten runtime policy + transport guards (#2331) 2026-05-21 23:39:05 +05:30
Mega MindandGitHub beba562df2 fix(windows): make pnpm dev:app:win work behind TLS-inspecting proxies (#2449) 2026-05-21 23:29:01 +05:30
YellowSnnowmannandGitHub 7aa1bf1f88 fix(agent): handle config rejection in streaming_chat path (#2346) 2026-05-21 23:24:07 +05:30
d7b27b94fc fix(memory): run memory_tree on TRUNCATE journal instead of WAL (#2455)
Co-authored-by: sanil-23 <sanil@alphahuman.xyz>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 23:16:51 +05:30
JAYcodrGitHubagent:skill-master <skill-master@openclaw>
013381e880 fix(i18n): complete zh-CN translations for workspace, mascot, MCP Ser… (#2440)
Co-authored-by: agent:skill-master <skill-master@openclaw>
2026-05-21 23:02:54 +05:30
oxoxDevandGitHub e031d85ed2 feat(agents): route prediction-market intents via new markets_agent specialist (#2427) (#2430) 2026-05-21 22:58:00 +05:30
YellowSnnowmannandGitHub f51f140234 fix(prompt-injection): rebalance detector + classify rejections as expected (#2429) 2026-05-21 22:57:55 +05:30
YellowSnnowmannandGitHub 208a64483b fix(auth-profiles): tolerate legacy kind values on load (#2439) 2026-05-21 22:57:49 +05:30
oxoxDevandGitHub dcec5858e0 fix(tauri): pre-flight every xdg-utils binary before register_all (#5V) (#2416) 2026-05-21 22:57:44 +05:30
Aqil AzizandGitHub ec9708ac6f fix(composio): surface Gmail scope errors as permissions (#2414) 2026-05-21 17:23:44 +05:30
6137b67811 fix(memory_tree,sync_status,scripts): IMMEDIATE-tx ingest, reembed skip-persistence, sidecar-based sync-status accounting, Windows dev-script PATH (#2349)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: sanil-23 <sanil@alphahuman.xyz>
2026-05-21 16:31:25 +05:30
JinHyuk SungandGitHub 7675c01c5c fix(billing): hide budget-complete prompt for free zero-budget plans (#2300) 2026-05-21 16:19:29 +05:30
Steven EnamakelandGitHub bf6f25e64c Update Product Hunt badges in README (#2425) 2026-05-21 01:27:25 -07:00
Steven EnamakelandGitHub d1f8305e20 Update README.md (#2424) 2026-05-21 01:21:00 -07:00
Steven EnamakelandGitHub c204a53de2 feat(mcp-clients): MCP client subsystem with Smithery registry + UI (#2409) 2026-05-20 23:05:14 -07:00
AryanandGitHub 6281aeaf42 docs(linux): add arch linux setup and build instructions (#2343) 2026-05-20 19:31:16 -07:00
48c4da4e2a fix(cron): classify agent job errors into actionable user messages (#2279) (#2340)
Co-authored-by: sanil-23 <sanil@alphahuman.xyz>
Co-authored-by: Claude <noreply@anthropic.com>
2026-05-20 19:30:59 -07:00