Skip to content

feat(search): attribute managed web search to the resolved provider - #5206

Merged
M3gA-Mind merged 3 commits into
tinyhumansai:mainfrom
M3gA-Mind:fix/GH-5136-exa-search-attribution
Jul 27, 2026
Merged

feat(search): attribute managed web search to the resolved provider#5206
M3gA-Mind merged 3 commits into
tinyhumansai:mainfrom
M3gA-Mind:fix/GH-5136-exa-search-attribution

Conversation

@M3gA-Mind

@M3gA-Mind M3gA-Mind commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • A completed web_search tool call is now titled "Searched with Exa" (or whatever provider actually served it) instead of a generic search row; the query moves to the detail line.
  • The provider name is resolved, not hardcoded — the core reads it from the managed backend's response and only falls back to "Exa" when the backend does not name one, so a future routing change surfaces with no code edit.
  • Connections → Search engine → OpenHuman Managed now names Exa as the current underlying provider, in English and all 13 other locales.
  • Attribution lands on every tool-call surface at once (Chat, processing transcript, past-turn insights, source panel) because they all render through the same formatTimelineEntry.
  • The tools.web_search RPC returns and logs the same resolved provider, so that surface attributes a call identically.

Problem

Exa powers the overwhelming majority of managed search traffic, but nothing in the product said so. A user on the default OpenHuman Managed engine saw:

  • a tool-call row with no indication of which provider served the search, and
  • a Connections description ("Routed through the OpenHuman backend: no API key required") that read like a generic, unattributed black box.

The core made this worse by hardcoding the attribution marker to (via backend Parallel) — naming the proxy rather than the provider, and unable to reflect reality if routing changed. Meanwhile the BYOK engines already tagged their output (via Brave) / (via Querit) / (via Seltz), so the managed path was the odd one out.

Solution

Core — carry the resolved provider through the result

  • SearchResponse (src/openhuman/search/tools/parallel.rs) gains an optional provider field, aliased resolvedProvider / searchProvider so an upstream rename does not silently drop attribution. #[serde(default)] keeps older backends that omit it deserializing unchanged.
  • resolve_managed_provider() (web_search.rs) prefers the backend-reported value (trimmed) and falls back to MANAGED_DEFAULT_PROVIDER = "Exa" only when it is absent or blank. The constant is a fallback label, not the source of truth — this is what keeps the acceptance criterion "not hardcoded" honest while still being correct today.
  • Both renderers (plain text + markdown) take the provider, so the heading line reads Search results for: … (via Exa), adopting the marker convention the BYOK engines already emit.
  • handle_web_search in src/openhuman/tools/schemas.rs reuses the same resolver (exported pub(crate)) so the RPC surface cannot drift from the agent-facing tool.

Frontend — one formatter, every surface

  • formatToolDetail now receives entry.result, so the web_search case can label a completed call with the provider that served it. Running rows keep "Searching: …" because no result exists yet.
  • New exported extractSearchProvider() reads the (via …) marker from the heading line only and rejects markers longer than 32 characters — a (via …) string inside a result excerpt cannot be mistaken for the provider, and a malformed marker cannot blow up a timeline row.
  • formatTimelineEntry is the single funnel behind ChatThreadView, ToolTimelineBlock, ProcessingTranscriptView, PastTurnInsights, AgentProcessSourcePanel, mapDisplayItems and chatRuntimeSlice, so consistency across surfaces falls out of one change rather than being maintained per-component.

Design note. Attribution is read back from the result text rather than plumbed through a new socket/persistence field. That reuses the marker convention every search engine already emits, needs no change to the tool-result transport or the persisted turn-state round-trip, and means BYOK engines get correct attribution for free.

Deliberately out of scope: backend managed-search routing, and Exa BYOK / user-configurable provider wiring (#5137).

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.

  • Tests added or updated (happy path + at least one failure / edge case) per Testing Strategy
  • Diff coverage ≥ 80% — changed lines (Vitest + cargo-llvm-cov merged via diff-cover) meet the gate enforced by .github/workflows/ci-lite.yml. Run pnpm test:coverage and pnpm test:rust locally; PRs below 80% on changed lines will not merge. — every changed line is exercised by the new/updated tests below; full local test:coverage / test:rust matrix not run (fills the disk on this machine), so the CI coverage lane is the authority.
  • Coverage matrix updated — added/removed/renamed feature rows in docs/TEST-COVERAGE-MATRIX.md reflect this change (or N/A: behaviour-only change) — N/A: behaviour-only change, no feature added, removed or renamed.
  • All affected feature IDs from the matrix are listed in the PR description under ## Related
  • No new external network dependencies introduced (mock backend used per Testing Strategy) — the new execute() test drives the existing in-process axum mock backend.
  • Manual smoke checklist updated if this touches release-cut surfaces (docs/RELEASE-MANUAL-SMOKE.md) — N/A: label/copy change on an existing flow, no new release-cut surface.
  • Linked issue closed via Closes #NNN in the ## Related section

Impact

  • Platform: desktop UI + Rust core. No mobile/CLI-specific behaviour.
  • User-visible: a completed web-search row is titled by provider; the query stays visible on the detail line. In-flight rows are unchanged.
  • Compatibility: provider is optional and defaulted, so a backend that does not yet send it keeps working and simply attributes to the managed default. BYOK engines are untouched — they already emitted the marker this reads.
  • Behaviour change in the agent-visible result text: the managed heading is now (via <Provider>) rather than (via backend Parallel). It stays a one-line heading in the same position and format, so nothing downstream parses it differently.
  • Performance / security / migration: none. No new dependency, no persisted-schema migration, no secret or PII in the new log line (provider name only).

Related


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

Commit & Branch

  • Branch: fix/GH-5136-exa-search-attribution
  • Commit SHA: fefe14990

Validation Run

  • pnpm --filter openhuman-app format:check — ran as prettier --check over the changed files: all match Prettier style. eslint over the same files is clean.
  • pnpm typecheck — clean (tsc --noEmit).
  • Focused tests: vitest run src/utils/__tests__/toolTimelineFormatting.test.ts → 45 passed; vitest run src/lib/i18n/__tests__/coverage.test.ts → 67 passed; cargo test --lib search::tools:: → 93 passed; targeted search_response_reads* / web_search_schema_shape → 6 passed. Also pnpm i18n:check (0 missing / 0 extra) and pnpm i18n:english:check (0 unexpected English).
  • Rust fmt/check (if changed): cargo fmt --check clean; GGML_NATIVE=OFF cargo check --tests clean (only pre-existing warnings in untouched files).
  • Tauri fmt/check (if changed): N/A — no files under app/src-tauri/ changed.

Validation Blocked

  • command: pnpm test:coverage / pnpm test:rust (full suites)
  • error: not attempted — running the full test/build matrix locally exhausts disk on this machine.
  • impact: low. Every changed line is covered by the focused suites listed above, which were run and pass; the CI coverage lane re-runs the full matrix and gates the merge.

Behavior Changes

  • Intended behavior change: surface the search provider the managed backend actually resolved to, in the tool-call timeline and in the Connections description, without hardcoding the provider name.
  • User-visible effect: a completed web search reads "Searched with Exa" (query on the detail line) instead of a generic search row, and OpenHuman Managed is described as "currently powered by Exa".

Parity Contract

  • Legacy behavior preserved: in-flight rows still read "Searching: "; empty-result text is unchanged; BYOK engines (Brave / Querit / Seltz) are untouched and already emitted the (via …) marker this reads; SearchResponse still rejects the same missing required fields.
  • Guard/fallback/dispatch parity checks: provider is #[serde(default)] with aliases, so a backend that omits or renames it still deserializes; a blank or whitespace-only value falls back to the managed default; the frontend returns undefined (keeping the old label) when there is no result yet, no marker, or an implausibly long one. Both the agent tool and the tools.web_search RPC call the same resolver, so they cannot diverge.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): N/A — no other open PR targets this issue.
  • Canonical PR: this PR.
  • Resolution (closed/superseded/updated): N/A — nothing superseded.

Summary by CodeRabbit

  • New Features
    • Completed web searches now show which provider was used, defaulting to Exa when the backend doesn’t supply one.
    • Timeline/tool entries and web search markdown use consistent “(via …)” attribution for managed searches.
    • Web search tool responses now include provider information for client display.
  • Localization
    • Updated the managed-search description text across supported languages to say the default is powered by Exa and requires no API key.
  • Tests
    • Expanded coverage for provider attribution, formatting, and managed-search messaging across languages and tools.

Managed search routes through the OpenHuman backend, which serves the
overwhelming majority of traffic via Exa, but nothing in the product said
so: a completed web search rendered as a generic "Searching the web" row
and the Connections copy described the managed path as an unattributed
proxy.

Carry the provider the backend actually resolved to through the result and
surface it, without hardcoding a name:

- SearchResponse gains an optional `provider` field (aliased
  `resolvedProvider`/`searchProvider`); older backends that omit it
  deserialize unchanged and fall back to the managed default.
- resolve_managed_provider() prefers the backend-reported value and falls
  back to "Exa" only when it is absent or blank, so a future routing
  change surfaces with no code edit. The result heading now reads
  "(via <Provider>)", matching the marker the Brave/Querit/Seltz engines
  already emit, in place of the fixed "(via backend Parallel)".
- The tools.web_search RPC returns and logs the same resolved provider.
- The tool timeline titles a completed web_search "Searched with <Provider>"
  and moves the query to the detail line; running rows are unchanged. The
  marker is read from the heading line only and capped in length so a
  "(via ...)" string inside a result excerpt cannot be misread as the
  provider. formatTimelineEntry backs every tool-call surface, so Chat, the
  processing transcript, past-turn insights and the source panel all agree.
- Connections -> Search engine now names Exa as the current provider, in
  English and all 13 other locales.
@M3gA-Mind
M3gA-Mind requested a review from a team July 27, 2026 07:07
@M3gA-Mind

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

No new commits to review since the last review.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: cc9b91f0-e8a6-4428-a077-f6509749728d

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Managed search now propagates its resolved provider from backend responses through RPC results and tool timelines. Attribution is dynamic, defaults to Exa when absent, supports response aliases, and appears in managed-search translations across locales.

Changes

Search provider attribution

Layer / File(s) Summary
Backend provider resolution and RPC output
src/openhuman/search/tools/*, src/openhuman/tools/schemas.rs
Search responses accept provider metadata and aliases; managed search resolves the provider with an Exa fallback, formats attribution, and exposes it through the RPC schema and payload.
Tool timeline provider display
app/src/utils/toolTimelineFormatting.ts, app/src/utils/__tests__/toolTimelineFormatting.test.ts
Completed search results are parsed for valid provider markers and displayed as “Searched with …”, with coverage for alternate tool names, missing results, and invalid markers.
Managed-search attribution copy
app/src/lib/i18n/{ar,bn,de,en,es,fr,hi,id,it,ko,pl,pt,ru,zh-CN}.ts, app/src/lib/i18n/__tests__/coverage.test.ts
Managed-search descriptions mention Exa, and locale coverage verifies the attribution is present in every supported translation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SearchBackend
  participant SearchRPC
  participant ToolTimeline
  SearchBackend->>SearchRPC: return results and resolved provider
  SearchRPC->>SearchRPC: apply provider fallback and format attribution
  SearchRPC-->>ToolTimeline: return attributed search result
  ToolTimeline->>ToolTimeline: extract provider marker
  ToolTimeline-->>ToolTimeline: display Searched with provider
Loading

Possibly related PRs

Suggested labels: feature, rust-core

Poem

I’m a rabbit with searches that hop,
Now Exa gets credit atop.
Through backend and line,
The provider will shine,
With translations in every shop.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 76.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: managed web search attribution now uses the resolved provider.
Linked Issues check ✅ Passed The PR updates managed search attribution, Exa mentions in settings copy, and provider propagation across tool surfaces as required by #5136.
Out of Scope Changes check ✅ Passed The changes stay focused on search attribution and locale copy updates, with no clear unrelated feature work or backend-routing/BYOK changes.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot added feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. labels Jul 27, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fefe149908

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread app/src/utils/toolTimelineFormatting.ts
Comment thread app/src/utils/toolTimelineFormatting.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@app/src/utils/toolTimelineFormatting.ts`:
- Around line 515-524: Update the completed-search formatting flow around
extractSearchProvider so the title is supplied through an i18n-aware caller
using useT() rather than the hard-coded “Searched with” string. Add the
corresponding translation key to en.ts and every real locale, while preserving
the provider interpolation and existing query detail behavior.

In `@src/openhuman/search/tools/web_search.rs`:
- Around line 62-66: Update the empty-result renderers in the web search result
formatting flow to include the provider attribution marker `(via {provider})`,
matching the non-empty format. Apply this consistently to both empty-result
formats, including the empty-result timeline case, so extractSearchProvider can
identify completed searches.

In `@src/openhuman/tools/schemas.rs`:
- Around line 544-551: Update the log construction in the web-search handling
flow around resolve_managed_provider so it never includes the raw query text.
Replace query in the tools.web_search log with a safe query_len and/or
non-reversible correlation fingerprint, while preserving the existing results
count and provider fields.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e419a432-44a0-406e-879a-98c081b543df

📥 Commits

Reviewing files that changed from the base of the PR and between fd04d37 and fefe149.

📒 Files selected for processing (22)
  • app/src/lib/i18n/__tests__/coverage.test.ts
  • app/src/lib/i18n/ar.ts
  • app/src/lib/i18n/bn.ts
  • app/src/lib/i18n/de.ts
  • app/src/lib/i18n/en.ts
  • app/src/lib/i18n/es.ts
  • app/src/lib/i18n/fr.ts
  • app/src/lib/i18n/hi.ts
  • app/src/lib/i18n/id.ts
  • app/src/lib/i18n/it.ts
  • app/src/lib/i18n/ko.ts
  • app/src/lib/i18n/pl.ts
  • app/src/lib/i18n/pt.ts
  • app/src/lib/i18n/ru.ts
  • app/src/lib/i18n/zh-CN.ts
  • app/src/utils/__tests__/toolTimelineFormatting.test.ts
  • app/src/utils/toolTimelineFormatting.ts
  • src/openhuman/search/tools/mod.rs
  • src/openhuman/search/tools/parallel.rs
  • src/openhuman/search/tools/parallel_tests.rs
  • src/openhuman/search/tools/web_search.rs
  • src/openhuman/tools/schemas.rs

Comment thread app/src/utils/toolTimelineFormatting.ts
Comment thread src/openhuman/search/tools/web_search.rs
Comment thread src/openhuman/tools/schemas.rs
@greptile-apps

greptile-apps Bot commented Jul 27, 2026

Copy link
Copy Markdown

Greptile Summary

This PR surfaces the resolved search provider on every tool-call timeline surface by embedding a (via <Provider>) marker in search result text and reading it back in the formatter — no new transport or persistence fields needed. The managed backend path gains a dynamic resolve_managed_provider helper that prefers the backend-reported value and falls back to "Exa", while BYOK engines (Brave, Querit, Seltz) get consistent (via …) markers added to their markdown renderers to match what the plain-text renderers already emitted.

  • Core (Rust): SearchResponse gains an optional, aliased provider field; resolve_managed_provider is shared between WebSearchTool and the tools.web_search RPC so both surfaces attribute identically; the RPC log switches from query text to query_len for privacy parity with sibling handlers.
  • Frontend (TypeScript): extractSearchProvider uses a $-anchored regex on the heading line only, with a 32-char length guard, correctly resolving the trailing marker even when the echoed query itself contains a (via …) string.
  • i18n: All 14 locale strings for settings.search.engineManagedDesc updated to name Exa, enforced by a new it.each locale coverage test.

Confidence Score: 5/5

Safe to merge — all changes are additive, backward-compatible, and confined to attribution display logic with no schema migration or new external dependency.

The attribution marker is read back from result text that already existed in the transport, so there is no new failure mode if the backend omits the field. The $-anchored regex correctly handles the decoy-via-in-query edge case raised in the previous thread, and the 32-char length guard prevents malformed markers from affecting the UI. BYOK engines are only changed to normalise their existing marker format, with tests confirming the heading line ends with the expected string. The optional provider field on SearchResponse degrades gracefully via #[serde(default)]. Every non-trivial branch is covered by focused unit tests.

Files Needing Attention: No files require special attention.

Important Files Changed

Filename Overview
app/src/utils/toolTimelineFormatting.ts Adds extractSearchProvider (anchored regex, max-length guard), plumbs entry.result into formatToolDetail, and registers web_search_tool as a known client tool.
src/openhuman/search/tools/web_search.rs Adds resolve_managed_provider (backend value preferred, static fallback) and threads provider through both renderers; lifetime/borrow usage is sound.
src/openhuman/search/tools/parallel.rs Adds optional provider field to SearchResponse with #[serde(default)] and two aliases; older backends that omit it continue to deserialize cleanly.
src/openhuman/tools/schemas.rs Exposes provider in the tools.web_search RPC output schema and switches the log line from query text to query_len for privacy consistency.
src/openhuman/search/tools/brave.rs Normalises markdown heading from (Brave) to (via Brave) and adds the marker to the empty-result string so the timeline can parse attribution in all cases.
app/src/utils/tests/toolTimelineFormatting.test.ts Comprehensive new test suite for extractSearchProvider and formatTimelineEntry over both tool name variants and completion states.
app/src/lib/i18n/en.ts Updates settings.search.engineManagedDesc to name Exa as the current provider; same change applied across all 13 other locale files.

Sequence Diagram

sequenceDiagram
    participant Agent
    participant WebSearchTool
    participant Backend as Managed Backend
    participant Timeline as formatTimelineEntry

    Agent->>WebSearchTool: execute(query)
    WebSearchTool->>Backend: POST /agent-integrations/parallel/search
    Backend-->>WebSearchTool: "SearchResponse { results, provider? }"
    WebSearchTool->>WebSearchTool: resolve_managed_provider(resp)
    WebSearchTool-->>Agent: ToolResult text with (via Exa) marker
    Agent->>Timeline: formatTimelineEntry(entry)
    Timeline->>Timeline: extractSearchProvider(result)
    Timeline-->>Agent: "{ title: Searched with Exa, detail: query }"
Loading

Reviews (3): Last reviewed commit: "fix(tools): stop logging the raw web-sea..." | Re-trigger Greptile

Comment thread app/src/utils/toolTimelineFormatting.ts
Review found three ways the attribution never actually surfaced, plus a
parsing bug:

- The canonical search slot is registered and streamed as `web_search_tool`
  (src/openhuman/search/registry.rs); `web_search` is only the settings
  family id and never reaches a timeline row. The formatter matched the
  latter, so every real search fell through to the humanized "Web Search
  Tool" and the new attribution never ran. Handle both names, and add
  `web_search_tool` to the client-known set so the client label wins over
  the server's default.

- Production renders tool results as markdown (`output_for_llm(true)`), so
  the markdown heading is what the timeline parses. Brave emitted
  `(Brave)` and Seltz/Querit emitted no marker at all, so BYOK engines
  could not be attributed. All three now emit the shared `(via <Provider>)`
  marker their plain-text renderers already carried.

- Empty-result renderings carried no marker, so a completed search that
  found nothing kept rendering as still in progress. Both managed forms and
  the three BYOK markdown forms now attribute an empty result too.

- The heading echoes the user's query, so a query containing "(via ...)"
  won over the real trailing marker ("login (via OAuth) (via Exa)" resolved
  to OAuth). Anchor the match to the end of the heading line.

Regression tests cover each: the streamed tool name running and completed,
markdown and empty-result attribution, the decoy-marker query, and the
per-engine markdown markers.
@coderabbitai coderabbitai Bot added working A PR that is being worked on by the team. and removed rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. labels Jul 27, 2026
The tools.web_search RPC echoed the user's query text into its log line.
A search query is user-authored and can carry PII or credentials, so log
its length instead — matching the sibling seltz/querit handlers in the
same file, which already log query_len only.
@M3gA-Mind

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Pushed three commits addressing every review item. Summary:

Fixed

  • web_search_tool vs web_search (Codex P1) — the core registers and streams the canonical search slot as web_search_tool; web_search is only the settings-family id, so the formatter's case never matched and the attribution never ran in production. Both names handled now, and web_search_tool added to the client-known set.
  • BYOK markdown markers (Codex P2) — production renders results as markdown (output_for_llm(true)); Brave emitted (Brave) and Seltz/Querit emitted nothing. All three now emit the shared (via <Provider>) marker.
  • Empty results unattributed (CodeRabbit) — a completed search that found nothing kept rendering as in-progress. Managed + all three BYOK empty forms now carry the marker.
  • Decoy marker in the echoed query (Greptile)login (via OAuth) (via Exa) resolved to OAuth; the match is now anchored to the end of the heading line.
  • Raw query in the RPC log (CodeRabbit) — pre-existing on the line I touched; now logs query_len, matching the sibling seltz/querit handlers.

Declined, with reasoning in-thread

  • Localising Searched with <provider> — this module is uniformly hard-coded English (~50 labels) and formatTimelineEntry is called from a Redux reducer where useT() is unavailable. Translating one string mid-list is worse than uniform English, and doing it properly is a key+params refactor across seven call sites. Happy to open a follow-up issue.

Docstring coverage check — the shortfall is new #[test] functions; /// on test fns is not idiomatic Rust, so they carry // explanatory comments instead. Added a doc comment to the one non-test helper.

Verification: vitest timeline suite 50 passed, related frontend suites 163 passed, cargo test --lib search::tools:: 96 passed, cargo check --tests clean, cargo fmt --check / prettier / eslint / tsc --noEmit clean.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

@M3gA-Mind Thanks for the detailed follow-up. I’ll review the newly pushed commits, including the production tool-name path, provider-marker parsing, empty-result handling, and RPC logging changes.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot added rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. and removed working A PR that is being worked on by the team. labels Jul 27, 2026
@M3gA-Mind
M3gA-Mind merged commit 7e8c088 into tinyhumansai:main Jul 27, 2026
25 of 29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Surface Exa as the provider during tool calls when OpenHuman Managed search is active

1 participant