Repository navigation
feat(memory)!: remove Composio→memory sync - #7146
Conversation
Advance the vendored tinyagents and tinybox submodules to their latest commits. Both checkouts carry local modifications, so the recorded revisions are marked dirty. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Vendors the tinycomputer package so it can be used without relying on an external fetch. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce shared facet label helpers and wire them through the memory tabs, dialogs, and previews so facet names render consistently. Update the accompanying tests and vendor the tinydocs dependency. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Vendors the tinyhumans SDK so the project can depend on it without pulling it from an external source at build time. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Vendors the tinyjuice library so it can be used without relying on an external package source. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a service module for memory-related API calls so the app has a dedicated place to fetch and mutate memory data. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Refresh the vendored tinyagents, tinybox, tinycomputer, tinymemory, and tinyskills packages to their current revisions. Also drop the now-unused rpcMethods service file. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add shared label maps for memory lifecycle states and memory sources so the memory UI can render consistent human-readable names instead of duplicating strings across components. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Remove memory RPC method constants that no longer have handlers and delete an accidentally committed editor backup of rpcMethods.ts. The lifecycle label test now asserts the pdf source instead of web to match the current source list. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a memory chips component for displaying memory entries in the UI. The vendor/tinydocs submodule was also updated to a newer revision. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a settingsRouteElements module that maps settings routes to their components so the settings area can be composed from a single source. The vendor submodules were bumped alongside to pick up the matching SDK and styling changes. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a MemoryBrainTab component that renders the memory view for the memory section. This gives users a dedicated tab to inspect memory data alongside the existing memory views. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a MemoryBrainTab component and wire it into the Memory page so the brain view is reachable alongside the existing memory tabs. The tinymemory vendor submodule is updated to the revision the new tab depends on. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduces a dialog component for adding a source to a memory entry, giving users a dedicated flow to attach source material instead of relying on inline input. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Adds functions to execute Composio tools and to fetch a user's connected accounts, along with the types describing tool execution results and connection state. These give the app a way to run tools and check which integrations a user has already authorised. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Extract the connect flow logic from the modal into a dedicated hook so the modal component stays focused on presentation. Add tests covering the API interactions used by the flow. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests for the Composio API client to lock in request handling and response parsing. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Adds a modal component that lets users connect a Composio integration and covers the underlying API calls with tests. This gives the UI a dedicated flow for authorising integrations instead of relying on ad hoc handling. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests for the Composio connect modal covering its rendering and user interactions, so the component's behaviour is verified and regressions are caught. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests for the brain redirect component and the settings route elements so their routing behaviour is verified. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests for the memory chips component and the memory page, exercising chip selection and page rendering so the memory UI has regression coverage. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add tests for the memory brain tab, synced sources, and helper utilities, and update the tinyconnectors and tinymemory vendored dependencies to support them. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a MemoryBrainTab component that renders the memory view for the memory section. This gives users a dedicated tab to inspect memory data alongside the existing memory views. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Refresh the vendored tinyconnectors and tinymemory dependencies to their current revisions. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added the new translation strings to every supported locale file so the recently introduced UI text is localized instead of falling back to English. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Refresh the vendored tinyconnectors and tinymemory dependencies to their current revisions. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The memory page's brain tab and header now read "Files" and describe the tab as files synced from this device plus documents added by hand, rather than documents shared by every agent. Updated across all locales. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Refresh the vendored tinyconnectors and tinymemory dependencies to their current revisions. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add the tinymemory package to the vendor directory so it can be used without fetching it at build time. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
… Composio Memory sources can once again be web pages, GitHub repositories, RSS feeds and Composio toolkits, alongside local folders and files. Targets are normalized per kind, legacy v1 entries of these kinds migrate instead of being dropped, and synced items are filed under the connector they came from so removing a source erases exactly its documents. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a migration step that upgrades persisted memory configuration to the current schema, so older configs load without manual edits. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a memory sources module with sync logic so the brain can pull content from external sources, and cover the new paths with tests. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The end-to-end source tests now exercise link and github sources alongside folder and file, and the stale-config case keeps an rss entry instead of a file one. The composio rejection test was narrowed to composio alone so the remaining kinds are asserted as accepted rather than rejected. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Composio is no longer a memory source kind, so the docs and spec no longer list it among synced sources and the integration page no longer claims connections sync into memory. The personal assistant guide now points at folders, files and links instead. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
…gence catalog Adds a README describing the Composio integration bus and its event flow, and extends the about-app catalog with a conversation intelligence entry. The documentation and catalog entry were added to make the integration easier to discover and understand. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Document the Composio integration's purpose and usage so the module's behaviour and entry points are discoverable without reading the source. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The README claimed profile fetch, action execution, and sync all route through the loaded tinyconnectors module, but sync no longer does, so the sentence now names only profile fetch and action execution. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The sync schema and its test were removed, so the test asserting its required connection_id and optional reason fields no longer applies. The known-schema key list is updated to drop the sync entry. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The lockfile no longer lists chrono and tracing as dependencies of tinyconnectors-sync, reflecting that the crate stopped using them. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The delete connection request no longer sets clear_memory, since the field was removed from the request struct and is no longer accepted by the API. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the vendored tinyconnectors submodule to the latest commit. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Resolves the memory module split on main: roots.rs and versions.rs stay deleted (connector-only state), files.rs no longer records connection roots, and the memory-scenarios Composio connector scenario and its mock are removed with the sync they exercised. Co-authored-by: Medulla <medulla@tinyhumans.ai>
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configuration
⛔ Files ignored due to path filters (2)
📒 Files selected for processing (104)
Comment |
Update the vendored tinyconnectors submodule to the latest upstream commit. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the tinyconnectors module record to version 0.13.0 with refreshed archive names and checksums for every supported platform, and advance the tinyconnectors and tinymemory vendored submodules to their matching revisions. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the lockfiles to reflect the new versions of the tinyconnectors and tinymemory crates. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Tiny Sweeper reviewTiny Sweeper reviewed this change across 6 lane(s) and found 7 active actionable finding(s). Detailed lane evidence and any incomplete work are listed below. State: Changes requested Review snapshot
Completeness: Complete What changedThe review could not produce a supported behavioral summary; inspect the cited changed surface and lane details below. FeaturesNone identified with supported citations. TestsNo supported feature-to-test mapping was produced. Test execution is not inferred. Findings
Resolved this pass
Pending checks: Rust E2E (mock backend), Build Playwright E2E Artifact, E2E (Playwright / web lane), Desktop E2E (full suite, 3 OS) Before merge
How this fits togetherflowchart LR
n0["ComposioConnectModal<br/>changed"]:::changed
n1["useComposioConnectFlow<br/>changed"]:::changed
n0 -->|calls| n1
classDef changed fill:#0d4429,stroke:#238636,color:#e6edf3
classDef impacted fill:#161b22,stroke:#6e7681,color:#c9d1d9
classDef flagged fill:#5a1e02,stroke:#d93f0b,color:#ffffff
classDef blocking fill:#67060c,stroke:#f85149,color:#ffffff
Agent review detailscritique
security
tests
commits
description
e2e
Evidence and run details
|
There was a problem hiding this comment.
Requesting changes: 1 lane(s) blocking, worst finding is critical.
Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.
$0.0627 · 1,354,865 in / 47,933 out · 121,856 cached (9%) · gpt-5.6-luna, glm-5.3-flash
critique: $0.0330 · 623,205 in / 29,424 out · 74,521 cached (12%) · gpt-5.6-luna, glm-5.3-flash
security: $0.0214 · 419,542 in / 14,085 out · 47,335 cached (11%) · gpt-5.6-luna
tests: $0.0007 · 74,438 in / 101 out · 0 cached (0%) · glm-5.3-flash
description: $0.0007 · 74,376 in / 200 out · 0 cached (0%) · glm-5.3-flash
e2e: $0.0007 · 78,031 in / 553 out · 0 cached (0%) · glm-5.3-flash
| assert!(is_untrusted(&crate::flows::flow_meta("f", &[]))); | ||
| assert!(is_untrusted(&MemoryMeta::from_source( | ||
| SourceKind::Composio, | ||
| SourceKind::Import, |
There was a problem hiding this comment.
| // the synced memory and the identity facets — is this host's own | ||
| // bookkeeping about a connection it no longer has. | ||
| let mut resp = connectors::call::<_, ComposioDeleteResponse>( | ||
| // Only the Composio-side removal crosses the bus. The identity facets |
There was a problem hiding this comment.
Restore memory cleanup after deleting a connection
When a connection has synchronized memory, this operation now deletes it from Composio and removes identity facets but never calls crate::memory::sources::composio::forget_connection. The previous implementation performed that cleanup when clear_memory was requested, so a deletion with memory cleanup enabled now leaves connection-scoped records behind. Restore the cleanup behavior or provide an equivalent deletion path before removing this call.
[RULE] incomplete-cleanup ·
| await assertSessionNotNuked(); | ||
| }); | ||
|
|
||
| it('composio_execute routes a basic task', async function () { |
There was a problem hiding this comment.
Restore the sync session-preservation regression test
Removing this test means the Gmail suite no longer invokes openhuman.composio_sync or verifies that a sync failure leaves the user session intact. A regression specific to the sync route could therefore log the user out or break navigation without failing this suite; retain the test even if the request URL assertion is omitted.
[RULE] missing-regression-test ·
|
|
||
| - Open **Settings** and connect an integration (Gmail is the common starting point). Each connection is a one-click OAuth approval. | ||
| - Once connected, add the integration as a source under **Connections → Memory → Brain** (kind `composio`); it syncs into [Memory](../features/memory.md) on a schedule. | ||
| - Add folders, files or links as sources under **Connections → Memory** so they sync into [Memory](../features/memory.md) on a schedule. |
There was a problem hiding this comment.
Retain the integration-to-memory setup step
The preceding text still tells users to connect an integration such as Gmail, but this replacement removes the instruction to add that connected integration as a Memory source. A user following the documented Gmail path can complete OAuth without Gmail ever syncing into Memory. Keep the integration-specific step alongside the new folders/files/links guidance.
[RULE] incomplete-user-guidance ·
| // jobs (idempotent) and mark sources a killed process left `syncing` idle. | ||
| if plan.memory_jobs { | ||
| crate::memory::sources::state::reset_interrupted(&config.workspace_dir); | ||
| crate::memory::sources::state::remove_orphaned_connector_files(&config.workspace_dir); |
There was a problem hiding this comment.
Run orphan cleanup independently of memory job startup
This cleanup only runs inside the plan.memory_jobs branch. A valid configuration can enable integrations while disabling memory_sync—the adjacent tests exercise that combination—so existing connector_items.json and connection_roots.json files remain indefinitely for those workspaces. Since these files are obsolete regardless of whether memory cron jobs are enabled, invoke the cleanup outside the memory_jobs condition.
[RULE] conditional-cleanup ·
| seen += 1; | ||
| } | ||
| assert!(seen >= 5, "every state file was written: {seen}"); | ||
| assert!(seen >= 4, "every state file was written: {seen}"); |
There was a problem hiding this comment.
Keep the source-roots permission check covered
Removing the source-roots fixture and lowering the minimum count means this test can pass without ever creating or checking the source-roots state file. That weakens regression coverage for the owner-only file-permission contract this test is intended to enforce. Keep the source-roots write in the fixture and retain the corresponding count.
[RULE] missing-security-test-coverage ·
| pub deleted: bool, | ||
| } | ||
|
|
||
| pub async fn composio_delete_connection( |
There was a problem hiding this comment.
Drive the revised delete_connection RPC end to end
This changes the openhuman.composio_delete_connection RPC contract: the handler no longer takes clear_memory, the reply type changes from ComposioDeleteResponse to ComposioDeleteResult ({deleted: true} without memory_chunks_deleted), and the memory-forgetting side effect is gone. The frontend disconnect flow (ComposioConnectModal / useComposioConnectFlow / composioApi.deleteConnection) was updated to match, but only via rewritten unit tests that mock the RPC. No end-to-end test drives the new contract: tests/memory_v2_e2e.rs exercises memory_sources_add and composio_sync removal but never calls openhuman.composio_delete_connection, and the connector e2e specs only cover list_connections/composio_execute. An e2e test would need to connect a connector via the mock backend, call the disconnect flow (or the RPC with a single connection_id), and assert the connection disappears and the UI returns to the idle state with the new reply shape. Until that exists, the changed reply shape and the frontend's consumption of it are unverified beyond mocked units; if the reply shape drifts (e.g. unwrapCliEnvelope's handling of the new type), the disconnect button would break in the shipped app without CI noticing.
[RULE] e2e-uncovered ·
Main modified memory/sources/composio.rs (hard erasure of a connection's items) and added a pending-deletion queue whose Connection variant called forget_connection. Composio items are no longer synced into memory, so composio.rs stays deleted and the Connection variant is dropped; the queue keeps its Thread and Source deletions. The queue has not shipped in any release, so no persisted queue holds a Connection entry. Co-authored-by: Medulla <medulla@tinyhumans.ai>
Added Turkish locale strings to the i18n module so the app can display Turkish text. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
A merge on main left ten chat.sidebar keys defined twice in tr.ts (TS1117) and three search keys no other locale or component uses, which failed typecheck and the i18n coverage test. Co-authored-by: Medulla <medulla@tinyhumans.ai>
There was a problem hiding this comment.
Requesting changes: 2 lane(s) blocking, worst finding is critical.
Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.
$0.0381 · 600,645 in / 34,995 out · 96,353 cached (16%) · gpt-5.6-luna, glm-5.3-flash
critique: $0.0161 · 145,598 in / 15,899 out · 61,707 cached (42%) · gpt-5.6-luna, glm-5.3-flash
security: $0.0193 · 126,320 in / 10,637 out · 31,574 cached (25%) · gpt-5.6-luna
tests: $0.0006 · 78,451 in / 1,882 out · 1,536 cached (2%) · glm-5.3-flash
description: $0.0006 · 78,358 in / 1,395 out · 1,408 cached (2%) · glm-5.3-flash
e2e: $0.0007 · 81,992 in / 2,094 out · 0 cached (0%) · glm-5.3-flash
| import { migration } from "./migration.mjs"; | ||
|
|
||
| registerLocalOnly(connectors, migration); | ||
| registerLocalOnly(migration); |
There was a problem hiding this comment.
Use a declared SourceKind variant
The previous registration also included the connector scenario, but this now registers only migration. That makes the connector path—and therefore its SourceKind validation—unreachable from this runner rather than fixing the invalid variant. Keep the scenario registered while correcting the variant it exercises.
Additional security observation
Retain the integration-to-memory scenario
[RULE] missing-integration-coverage
This registration change removes the connectors scenario from the local run, leaving only the migration scenario registered from this file. As a result, the suite no longer exercises the integration-to-memory setup and related connector flows that were previously part of the local memory scenarios. Keep the connector scenario registered, or replace it with equivalent coverage before removing the mock setup.
Additional critique observation
Run orphan cleanup independently of memory job startup
[RULE] test-coverage-regression
Unregistering the connector scenario removes the path that exercises orphan cleanup independently of memory job startup. This hides the regression instead of ensuring cleanup still runs when the memory job does not start.
Additional critique observation
Drive the revised delete_connection RPC end to end
[RULE] test-coverage-regression
The connector scenario that drives the revised delete_connection RPC is no longer registered. This change therefore drops end-to-end coverage for the revised RPC instead of validating its caller behavior.
Additional critique observation
Drive the revised delete_connection RPC end to end
[RULE] test-coverage-regression
The connector scenario that drives the revised delete_connection RPC is no longer registered. This change therefore drops end-to-end coverage for the revised RPC instead of validating its caller behavior.
Additional critique observation
Keep the source-roots permission check covered
[RULE] test-coverage-regression
The connector scenario is no longer registered, so the source-roots permission check is absent from this run. Replacing the registration with migration-only coverage leaves that existing contract untested.
Additional critique observation
Restore the sync session-preservation regression test
[RULE] test-coverage-regression
The connector scenario is no longer passed to registerLocalOnly, so its sync session-preservation regression test cannot run. Restore that scenario or move the check into a scenario that remains registered.
Additional critique observation
Retain the integration-to-memory setup step
[RULE] test-coverage-regression
Only migration is registered now; the previously registered connector scenario is omitted. As a result, the integration-to-memory setup step is no longer performed or validated by this runner.
Additional critique observation
Restore memory cleanup after deleting a connection
[RULE] test-coverage-regression
Because the connector scenario is no longer registered, the delete-connection flow that checks memory cleanup is no longer executed by this script. This removes coverage for a previously identified high-impact regression; unregistering the scenario is not a fix for the cleanup behavior.
[RULE] test-coverage-regression ·
| .capabilities | ||
| .iter() | ||
| .any(|entry| { entry.toolkit == "gmail" && entry.native_provider && entry.memory_ingest })); | ||
| .any(|entry| { entry.toolkit == "gmail" && entry.native_provider })); |
There was a problem hiding this comment.
Retain the memory-ingest capability assertion
The predicate now accepts Gmail whenever native_provider is true, so a capability entry with memory_ingest == false will pass this regression test. The previous assertion covered the integration-to-memory setup contract; keep checking that field so a connector can’t silently lose memory ingestion while this suite remains green.
Additional security observation
Retain the integration-to-memory capability assertion
[RULE] regression-coverage
The previous assertion required the Gmail capability to advertise memory_ingest, but this change removes that requirement. That drops coverage for the integration-to-memory setup contract and can allow the capability matrix to lose memory ingestion support unnoticed. Keep the memory_ingest predicate unless the contract itself is intentionally being removed and covered elsewhere.
Suggested change for this observation (reference only)
.any(|entry| { entry.toolkit == "gmail" && entry.native_provider && entry.memory_ingest }));
Suggested change for the opening observation
| .any(|entry| { entry.toolkit == "gmail" && entry.native_provider })); | |
| .any(|entry| { entry.toolkit == "gmail" && entry.native_provider && entry.memory_ingest })); |
[RULE] regression-coverage ·
| #[serde(default, skip_serializing_if = "Option::is_none")] | ||
| toolkit: Option<String>, | ||
| }, | ||
| /// Every item a removed memory source stored. |
There was a problem hiding this comment.
Migrate persisted connection deletions before removing the variant
Users upgrading from a version that queued a disconnected connection can still have entries such as { "kind": "connection", "connection_id": "c", "toolkit": "gmail" } in pending_deletions.json. Removing the enum variant makes serde_json::from_str fail for that file; read then renames the whole file to .corrupt and returns an empty queue, so unrelated pending thread/source deletions are silently abandoned as well. Keep a compatibility deserialization path or explicitly migrate/drop only the retired connection entries while preserving the rest of the queue.
[RULE] backward-compatible-deserialization ·
| assert!(err.contains("unrecognized sync reason")); | ||
| } | ||
|
|
||
| #[tokio::test] |
There was a problem hiding this comment.
Restore the sync regression tests
This change removes the direct tests for sessionless sync and invalid sync reasons, including the check that invalid input is rejected before the client is touched. With them gone, regressions in sync’s session handling and reason validation can pass CI unnoticed. Restore these tests (and the sync session-preservation regression they previously accompanied) rather than deleting the coverage.
[RULE] regression-coverage ·
|
|
||
| // Memory: seed the `memory_context_refresh` / `memory_sources_sync` cron | ||
| // jobs (idempotent) and mark sources a killed process left `syncing` idle. | ||
| if plan.memory_jobs { |
There was a problem hiding this comment.
Run orphan cleanup independently of memory job startup
Still stands from the previous review, unchanged. remove_orphaned_connector_files runs inside if plan.memory_jobs, so a workspace whose ServiceSet has memory sync disabled never removes the dead connector_items. / connection_roots. files this PR obsoleted. Cleanup is a one-shot filesystem removal, not memory work; hoist it out of the gate (or run it from config load, where the composio sources are already being dropped).
[RULE] gated-cleanup ·
| let mut resp = connectors::call::<_, ComposioDeleteResponse>( | ||
| // Only the Composio-side removal crosses the bus. The identity facets | ||
| // are this host's own bookkeeping about a connection it no longer has. | ||
| let resp = connectors::call::<_, ComposioDeleteResponse>( |
There was a problem hiding this comment.
Provide a cleanup path for memory items synced before this change
The clear-memory path is removed along with the whole sync feature. Users who previously synced Composio data (emails, Notion pages) into memory now have no automatic removal on disconnect: forget_connection is gone, the composio source kind is dropped at config load so memory_sources_remove cannot target it, and remove_orphaned_connector_files deletes only the state JSON files, not the stored items. The items survive under their brain sources (e.g. source:notion); a user's only recourse is a manual whole-source brain forget, which is not discoverable as 'disconnecting this app'. Level moved from high to medium because the feature removal is deliberate, the items are user-visible and manually forgettable via brain forget, and no new items can be created. Consider a one-time migration that forgets items still tagged connection:<id> (the tag filter machinery the deletion queue already had), or at least documenting the manual path in the release notes.
[RULE] orphaned-legacy-data ·
| // the synced memory and the identity facets — is this host's own | ||
| // bookkeeping about a connection it no longer has. | ||
| let mut resp = connectors::call::<_, ComposioDeleteResponse>( | ||
| // Only the Composio-side removal crosses the bus. The identity facets |
There was a problem hiding this comment.
Keep forgetting a disconnected connection's memory items
Still outstanding from the earlier review, and the removal is now the PR's stated purpose rather than an oversight, but the consequence stands and must be recorded: composio_delete_connection no longer forgets the memory items the connection synced. Previously synced records carry a connection:<id> tag and were forgotten on disconnect (immediately, or queued via PendingDeletion::Connection when memory was off); that path is deleted entirely. A user who disconnects Gmail keeps every email's content in their memory store with no UI or RPC to remove it, and legacy_connector_slug in brain.rs goes out of its way to keep those documents filed under their nodes across migration — so the stale items are retained, not cleaned up incidentally. If the removal is deliberate, the deletion pipeline (deletion.rs PendingDeletion::Connection) should at minimum still be driven for already-queued deletions, or the retained items documented and surfaced; as reviewed, nothing in the product removes them.
[RULE] data-lifecycle ·
| // Memory: seed the `memory_context_refresh` / `memory_sources_sync` cron | ||
| // jobs (idempotent) and mark sources a killed process left `syncing` idle. | ||
| if plan.memory_jobs { | ||
| crate::memory::sources::state::reset_interrupted(&config.workspace_dir); |
There was a problem hiding this comment.
Run orphan connector-file cleanup independently of memory job startup
Still outstanding from the earlier review: remove_orphaned_connector_files sits inside the if plan.memory_jobs block, so it runs only when memory background jobs are enabled. The cleanup is a one-time removal of files nothing reads any more and has no dependency on the memory job machinery; a user whose ServiceSet disables memory_sync (or a preset that gates it off) keeps connector_items.json and connection_roots.json in their workspace indefinitely. Nothing about the code changed since the finding was raised, so the level is unchanged. The call belongs outside the gate, next to the other unconditional boot work.
[RULE] cleanup-gated ·
…ations #7146 removed the composio `sync` controller but the raw-coverage suite still listed it in the schema catalog and called it in the bad-params check, so `rust-core-coverage` has failed on main and on every PR rebased since. The two expectations are removed; the remaining 22 functions are unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Summary
openhuman.composio_syncis gone.composio.delete_connectiondropsclear_memoryand returns only{deleted}.folder,file,link,githubandrss.memory_sources_addrejectscomposio.syncConnectionclient call. Every Memory tab stays.vendor/tinyconnectors(sync engine removed, contract 1.12) andvendor/tinymemory(Composio source kind removed).Problem
Solution
memory/sources/{composio,versions,roots},integrations/composio/ops/{sync,pass_failure},contract/runs, thecomposio_synccontroller,module_client::call_slowand thecomposio_integration_syncplan flag.composioentry in[[memory.sources]]or the legacy[[memory_sources]]is dropped with awarn!, so old configs still load.connector_items.jsonandconnection_roots.jsonare deleted at memory startup.main:files.rsno longer records connection roots. The memory-scenariosD-connectorsscenario and its mock Composio are removed along with the sync they exercised.composiokind from the memory source types, labels and i18n in all locales. Also removes theclearMemoryplumbing fromdeleteConnectionand the modal, plus thecomposio_synce2e cases and the matching mock backend route.Submission Checklist
memory_v2_e2e:composiois rejected while folder, file, link, github and rss are accepted;composio_syncis an unknown method; a stale config loads. Unit tests cover config dropping a stale composio entry,apply_addrejecting composio, orphaned-file cleanup, and the add-source dialog not offering Composio.Impact
v0.13.0andv1.25.0. Both gitlinks sit on those tags, and the tinyconnectors module is repinned to v0.13.0. Its checksums are copied verbatim from the release'schecksum.toml, for the same 11 host platforms as before.import.Related
AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
remove-composio-memory-syncValidation Run
pnpm --filter openhuman-app format:check: Prettier clean on the changed filespnpm typecheck:tsc --noEmitcleancargo test -p openhuman --libmodules/memory/config/composio: 1457 passed against the release tags.in_process_all: 107 passed.memory_v2_e2e: 22 passed.cargo clippy -p openhuman --all-targets -D warningsclean, product-featurecargo check --tests,check-openhuman-rust-layout,check-feature-forwardingcargo check --manifest-path crates/openhuman-app/Cargo.tomlValidation Blocked
command:Playwright and WDIO e2e suiteserror:not run locallyimpact:the edited connector and memory specs only type-check here; CI runs themBehavior Changes