Skip to content

fix(memory-workspace): show all native Composio memory-sync sources (not Gmail-only)#2685

Merged
graycyrus merged 4 commits into
tinyhumansai:mainfrom
YellowSnnowmann:fix/memory-sync-toolkit-allowlist
May 27, 2026
Merged

fix(memory-workspace): show all native Composio memory-sync sources (not Gmail-only)#2685
graycyrus merged 4 commits into
tinyhumansai:mainfrom
YellowSnnowmann:fix/memory-sync-toolkit-allowlist

Conversation

@YellowSnnowmann
Copy link
Copy Markdown
Contributor

@YellowSnnowmann YellowSnnowmann commented May 26, 2026

Summary

  • Expanded Memory Workspace sync allowlist from gmail only to native provider-backed toolkits: clickup, github, gmail, linear, notion, slack.
  • Fixed the user-visible mismatch where connected non-Gmail sources were hidden from the Memory sync UI.
  • Updated Memory Workspace tests to assert provider-backed toolkits render sync rows while non-syncable toolkits remain hidden.
  • Updated stale comments/docs in frontend and Rust provider metadata to match current backend capabilities.

Problem

  • Users could connect and use GitHub/Notion/Slack/etc., but Memory Workspace only exposed Gmail sync controls.
  • This created a false impression that non-Gmail toolkits had no memory-ingest support, even though backend provider sync existed.
  • Review risk: enabling additional rows could introduce UI regressions or reveal toolkits without actual ingest support.

Solution

  • Kept the existing frontend guardrail pattern (explicit syncable allowlist), but aligned it with currently registered native memory-sync providers.
  • Verified backend capability path: providers are registered and synced through generic composio_sync dispatch (not Gmail-specific).
  • Updated tests to protect against regression in both directions:
  • provider-backed toolkits remain visible/actionable
  • non-syncable toolkits remain hidden
  • Tradeoff: allowlist is still static in frontend; a future improvement can source this dynamically from backend capability metadata.

Submission Checklist

  • 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/coverage.yml. Run pnpm test:coverage and pnpm test:rust locally; PRs below 80% on changed lines will not merge.
  • N/A: behaviour-only allowlist/test alignment; no feature-row add/remove/rename required in docs/TEST-COVERAGE-MATRIX.md
  • 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)
  • N/A: no release-cut surface changes requiring docs/RELEASE-MANUAL-SMOKE.md updates
  • Linked issue closed via Closes #NNN in the ## Related section

Impact

  • Runtime/platform: frontend desktop memory workspace behavior only (no new RPC/API surface).
  • Performance: negligible (renders more eligible rows; existing polling unchanged).
  • Security: no auth model changes, no new permissions, no new network dependencies.
  • Compatibility: backward-compatible; only broadens visibility of already-supported provider sync actions.

Related

Summary by CodeRabbit

  • New Features

    • Memory Sync now recognizes and supports multiple toolkits (e.g., Gmail, Slack, Notion), showing actionable sync rows for supported providers.
  • Documentation

    • Clarified when the per-identity Sync button appears and updated references for which toolkits are considered syncable.
  • Tests

    • Expanded tests to validate memory sync visibility and behavior across multiple toolkit scenarios.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 26, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 5069b88b-c440-4d57-93c1-83f5f2a65f7f

📥 Commits

Reviewing files that changed from the base of the PR and between f2bfaa9 and 38023b0.

📒 Files selected for processing (1)
  • app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • app/src/components/intelligence/tests/MemoryWorkspace.test.tsx

📝 Walkthrough

Walkthrough

The PR updates the Memory Sync allowlist to include multiple providers (clickup, github, gmail, linear, notion, slack), adjusts tests to expect sync rows for provider-backed toolkits and hide non-syncable toolkits, and rewords documentation comments in TypeScript and Rust to reference a parent-provided syncable allowlist.

Changes

Memory Sync Multi-Provider Support

Layer / File(s) Summary
Syncable providers allowlist expansion
app/src/components/intelligence/MemoryWorkspace.tsx
SYNCABLE_TOOLKITS expanded from only gmail to include clickup, github, gmail, linear, notion, and slack; documentation comment updated to point to Composio providers as source-of-truth.
Test assertions for multi-provider sync
app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx
Test updated to expect provider-backed toolkits (gmail, slack, notion) to render actionable sync rows while non-syncable toolkits (discord) remain hidden, replacing prior blanket-filter behavior.
Component and module documentation updates
app/src/components/intelligence/MemorySources.tsx, src/openhuman/memory_sync/composio/providers/mod.rs
Documentation comments reworded to describe a parent-provided syncable allowlist rather than toolkit-specific examples.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • tinyhumansai/openhuman#2413: Updates Memory Sync UI’s syncable-toolkit allow-list and related docs/tests, promoting GitHub to native memory-ingest provider.
  • tinyhumansai/openhuman#2488: Adds native GitHubProvider sync implementation, enabling GitHub as a syncable toolkit.

Poem

🐰 I hopped through code to spread the news,
Six toolkits now can share their views.
From Gmail to Notion, Slack to Git,
ClickUp, Linear—syncs now fit!
Tiny rabbit cheers: more memories to keep.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.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 accurately summarizes the main change: expanding Memory Workspace sync from Gmail-only to include all native Composio memory-sync sources.
Linked Issues check ✅ Passed The PR successfully addresses issue #2477 by exposing provider-backed memory-sync sources (clickup, github, gmail, linear, notion, slack) in the Memory Workspace UI instead of Gmail-only, aligning frontend visibility with backend-registered memory-sync providers.
Out of Scope Changes check ✅ Passed All changes are in-scope: documentation updates, SYNCABLE_TOOLKITS expansion, test updates, and provider metadata corrections directly support the objective of exposing multiple memory-sync sources.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint skipped: no ESLint configuration detected in root package.json. To enable, add eslint to devDependencies.


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

@YellowSnnowmann YellowSnnowmann marked this pull request as ready for review May 26, 2026 11:38
@YellowSnnowmann YellowSnnowmann requested a review from a team May 26, 2026 11:38
@coderabbitai coderabbitai Bot added the working A PR that is being worked on by the team. label May 26, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx (1)

238-254: ⚡ Quick win

Expand this assertion to cover all newly allowlisted toolkits.

Line 238’s test intent is good, but it currently asserts only 3 of 6 syncable toolkits. Add clickup, github, and linear rows here (or parameterize over the allowlist) so future drift is caught.

🤖 Prompt for 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.

In `@app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx` around
lines 238 - 254, The test case "shows sync rows for provider-backed toolkits and
hides non-syncable ones" in MemoryWorkspace.test.tsx currently asserts only
gmail, slack, and notion; update it to also assert presence of the newly
allowlisted syncable toolkits by adding checks for the Sync rows
'memory-source-sync-clickup', 'memory-source-sync-github', and
'memory-source-sync-linear' (or parameterize the expectations over the allowlist
used by MemoryWorkspace) so all allowlisted provider-backed toolkits are
verified to render actionable sync rows.
🤖 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.

Nitpick comments:
In `@app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx`:
- Around line 238-254: The test case "shows sync rows for provider-backed
toolkits and hides non-syncable ones" in MemoryWorkspace.test.tsx currently
asserts only gmail, slack, and notion; update it to also assert presence of the
newly allowlisted syncable toolkits by adding checks for the Sync rows
'memory-source-sync-clickup', 'memory-source-sync-github', and
'memory-source-sync-linear' (or parameterize the expectations over the allowlist
used by MemoryWorkspace) so all allowlisted provider-backed toolkits are
verified to render actionable sync rows.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a053f2d1-b052-4f37-a5b5-aa43ea10b60c

📥 Commits

Reviewing files that changed from the base of the PR and between 844a26c and f2bfaa9.

📒 Files selected for processing (4)
  • app/src/components/intelligence/MemorySources.tsx
  • app/src/components/intelligence/MemoryWorkspace.tsx
  • app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx
  • src/openhuman/memory_sync/composio/providers/mod.rs

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 26, 2026
graycyrus
graycyrus previously approved these changes May 26, 2026
Copy link
Copy Markdown
Contributor

@graycyrus graycyrus left a comment

Choose a reason for hiding this comment

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

Walkthrough: Expands the Memory Workspace sync allowlist from gmail-only to all six native provider-backed toolkits (clickup, github, gmail, linear, notion, slack). Verified each has a corresponding provider directory under src/openhuman/memory_sync/composio/providers/. Tests correctly assert provider-backed toolkits render sync rows while non-syncable toolkits (discord) stay hidden. Stale comments cleaned up in both frontend and Rust.

File Change
MemoryWorkspace.tsx Allowlist expanded from ['gmail'] → 6 toolkits; comment updated to reflect current provider path
MemorySources.tsx Comment fix: "passed by the parent" instead of "today: gmail"
MemoryWorkspace.test.tsx Test now asserts slack/notion visible + discord hidden (was: slack/notion hidden)
providers/mod.rs Removed stale comment claiming github has "no sync logic yet"

Clean, focused, well-tested. Nice fix — this was a real UX gap for users who connected non-Gmail providers and saw nothing in Memory Workspace.

One thought for a follow-up: the static allowlist will drift again as new providers land. A future PR could source this dynamically from capability_matrix() — but that's not blocking.

@graycyrus graycyrus merged commit fae1608 into tinyhumansai:main May 27, 2026
40 of 42 checks passed
* persist items via `store_skill_sync` into the memory tree.
*/
const SYNCABLE_TOOLKITS: ReadonlySet<string> = new Set(['gmail']);
const SYNCABLE_TOOLKITS: ReadonlySet<string> = new Set([
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.

💡 Refactor / suggestion (non-blocking) — static allowlist will drift from the Rust source of truth.

This SYNCABLE_TOOLKITS set is a hand-maintained mirror of the backend has_native_provider list in src/openhuman/memory_sync/composio/providers/mod.rs:110. The two have already drifted before — clickup (#2288), linear (#2400), and github became native providers in Rust while the UI stayed Gmail-only, which is the very bug this PR fixes. Nothing stops it recurring, and no test ties this TS set to the Rust capability matrix.

The core already exposes the authoritative data: composio.list_capabilities (openhuman.composio_list_capabilities) returns ComposioCapability[] with a per-toolkit memory_ingest flag derived from has_native_provider. Deriving the set from capabilities.filter(c => c.memory_ingest) would keep the Rust core as the single source of truth (consistent with the repo's "core is authoritative; frontend presents only" rule).

Not a blocker — the static list is correct today and the PR description flags this as a known tradeoff. If kept static, at least add a one-line comment pointing at has_native_provider as the thing to keep in sync.

* `src/openhuman/composio/providers/<toolkit>/` that call
* `ingest_page_into_memory_tree`. Today that's gmail. Add a slug here
* when a new provider lands a memory-tree ingest path.
* `src/openhuman/memory_sync/composio/providers/<toolkit>/` that
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.

Nitpick (doc accuracy). This says the source-of-truth providers "persist items via store_skill_sync into the memory tree." That's true for clickup/github/linear/notion (they go through persist_single_itemstore_skill_sync in memory_sync/composio/providers/sync_state.rs:306), but gmail and slack ingest via ingest_page_into_memory_tree (gmail/ingest.rs, slack/ingest.rs), not store_skill_sync. Consider generalizing, e.g. "…that ingest items into the memory tree (via store_skill_sync or a provider-specific ingest path)."

expect(screen.queryByTestId('memory-source-row-notion')).toBeNull();
expect(screen.queryByTestId('memory-source-sync-slack')).toBeNull();
expect(screen.queryByTestId('memory-source-sync-notion')).toBeNull();
expect(screen.getByTestId('memory-source-sync-slack')).toBeInTheDocument();
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.

Nitpick (test completeness). This test exercises 3 of the 6 newly-syncable toolkits (gmail/slack/notion) plus the hidden case (discord), but not clickup/github/linear. The filter is toolkit-agnostic (syncableToolkits.has(conn.toolkit)), so risk is low — but asserting all six would lock the PR's stated intent ("show all native sources") against future allowlist edits.

for (const tk of ['clickup', 'github', 'gmail', 'linear', 'notion', 'slack']) {
  expect(screen.getByTestId(`memory-source-sync-${tk}`)).toBeInTheDocument();
}

(with the corresponding connections added to the listConnections mock).

Copy link
Copy Markdown
Contributor

@sanil-23 sanil-23 left a comment

Choose a reason for hiding this comment

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

PR #2685 — fix(memory-workspace): show all native Composio memory-sync sources (not Gmail-only)

Walkthrough

This PR fixes a user-visible mismatch where Memory Workspace only surfaced a Gmail Sync row even though the Rust core ships native memory-sync providers for several more toolkits. It expands the frontend SYNCABLE_TOOLKITS allowlist from {gmail} to {clickup, github, gmail, linear, notion, slack}, refreshes stale doc comments in MemoryWorkspace.tsx / MemorySources.tsx and memory_sync/composio/providers/mod.rs, and updates the Vitest to assert provider-backed rows render while non-syncable toolkits stay hidden.

I verified the central correctness claim: the new allowlist is exactly the backend has_native_provider set in src/openhuman/memory_sync/composio/providers/mod.rs:110 (gmail | notion | slack | clickup | github | linear), and each provider genuinely ingests into the memory tree — clickup/github/linear/notion via persist_single_item then store_skill_sync, and gmail/slack via ingest_page_into_memory_tree. The change is correct, low-risk, and well-tested. No blockers. The only substantive note is a maintainability one (a static allowlist duplicating a Rust source of truth that can silently drift) — which the PR description already acknowledges as a deliberate tradeoff.

Changes

File Summary
app/src/components/intelligence/MemoryWorkspace.tsx Expands SYNCABLE_TOOLKITS from {gmail} to 6 native-provider toolkits; updates source-of-truth comment to the new memory_sync/composio/providers/ path.
app/src/components/intelligence/MemorySources.tsx Doc-comment-only: gate now described as the syncable allow-list passed by the parent instead of today: gmail.
app/src/components/intelligence/__tests__/MemoryWorkspace.test.tsx Rewrites the visibility test: gmail/slack/notion render Sync rows; discord stays hidden.
src/openhuman/memory_sync/composio/providers/mod.rs Doc-comment-only: drops the stale github-has-no-sync-logic-yet aside.

Actionable comments (1)

Refactor / suggestion

1. app/src/components/intelligence/MemoryWorkspace.tsx:60-67 — Static allowlist duplicates the Rust source of truth and will silently drift.
SYNCABLE_TOOLKITS is a hand-maintained mirror of backend has_native_provider (providers/mod.rs:110). The two have already drifted — clickup (issue 2288), linear (issue 2400), and github became native in Rust while the UI stayed Gmail-only (the bug this PR fixes). Nothing prevents recurrence, and no test ties the TS set to the Rust matrix. The core already exposes the authoritative data via composio.list_capabilities (ComposioCapability[] with a per-toolkit memory_ingest flag); deriving the set from capabilities.filter(c => c.memory_ingest) would keep Rust as the single source of truth. Non-blocking — the static list is correct today and the PR flags this as a known follow-up. If kept static, add a one-line comment pointing at has_native_provider as the thing to keep in sync.

Nitpicks (2)

  • MemoryWorkspace.tsx:56-58 — Comment says providers persist items via store_skill_sync; that is true for clickup/github/linear/notion, but gmail/slack ingest via ingest_page_into_memory_tree. Consider: ingest items into the memory tree (via store_skill_sync or a provider-specific ingest path).
  • MemoryWorkspace.test.tsx:238-255 — Test covers 3 of 6 new toolkits (gmail/slack/notion) + the hidden case (discord), not clickup/github/linear. Looping over all six would lock the show-all-native-sources intent against future edits.

Verified / looks good

  • Allowlist matches backend has_native_provider exactly.
  • All six providers genuinely write into the memory tree, so every Sync button maps to a real ingest path.
  • discord correctly excluded (native_provider = false) and asserted hidden.
  • MemorySources.tsx and providers/mod.rs comment updates are accurate (github is now a registered native provider).
  • Diff-coverage: the only executable change (the set) is exercised by the updated test.

Note: this PR was already merged (2026-05-27) before this review ran — posting as a post-hoc CodeRabbit-style review. The single actionable item is a non-blocking follow-up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

working A PR that is being worked on by the team.

Projects

None yet

3 participants