feat(composio): add Linear provider for Memory Tree ingest (#2402)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
This commit is contained in:
Justin
2026-05-22 20:43:32 -07:00
committed by GitHub
co-authored by Steven Enamakel
parent 1cb6a14686
commit 5b297251bb
5 changed files with 46 additions and 10 deletions
+22
View File
@@ -208,9 +208,31 @@ const de5: TranslationMap = {
'settings.developerMenu.composioRouting.title': 'Composio Routing (Direktmodus)',
'settings.developerMenu.composioRouting.desc':
'Bring deinen eigenen Composio API-Schlüssel mit und leite Anrufe direkt an backend.composio.dev weiter',
'settings.developerMenu.mcpServer.title': 'MCP Server',
'settings.developerMenu.mcpServer.desc':
'Konfiguriere externe MCP-Clients für die Verbindung mit OpenHuman',
'settings.developerMenu.integrationTriggers.title': 'Integrationsauslöser',
'settings.developerMenu.integrationTriggers.desc':
'Konfiguriere KI-Triage-Einstellungen für Composio-Integrationsauslöser',
'settings.mcpServer.title': 'MCP-Server',
'settings.mcpServer.toolsSectionTitle': 'Verfügbare Werkzeuge',
'settings.mcpServer.toolsSectionDesc':
'Werkzeuge, die über den MCP-Stdio-Server beim Ausführen von openhuman-core mcp bereitgestellt werden',
'settings.mcpServer.configSectionTitle': 'Client-Konfiguration',
'settings.mcpServer.configSectionDesc':
'Wähle deinen MCP-Client aus, um das richtige Konfigurations-Snippet zu generieren',
'settings.mcpServer.copySnippet': 'In die Zwischenablage kopieren',
'settings.mcpServer.copied': 'Kopiert!',
'settings.mcpServer.openConfigFile': 'Konfigurationsdatei öffnen',
'settings.mcpServer.binaryPathNotFound':
'OpenHuman-Binärdatei nicht gefunden. Wenn du aus dem Quellcode arbeitest, baue sie mit: cargo build --bin openhuman-core',
'settings.mcpServer.openConfigError': 'Konfigurationsdatei konnte nicht geöffnet werden',
'settings.mcpServer.clientClaudeDesktop': 'Claude Desktop',
'settings.mcpServer.clientCursor': 'Cursor',
'settings.mcpServer.clientCodex': 'Codex',
'settings.mcpServer.clientZed': 'Zed',
'settings.mcpServer.configFilePath': 'Konfigurationsdatei',
'settings.mcpServer.clientSelectorAriaLabel': 'MCP-Client-Auswahl',
'settings.appearance.menuDesc': 'Wähle hell, dunkel oder passend zu deinem Systemthema',
'settings.mascot.active': 'Aktiv',
'settings.mascot.characterDesc': 'Charakterbeschreibung',
@@ -31,4 +31,8 @@ pub use super::catalogs_microsoft::{EXCEL_CURATED, ONE_DRIVE_CURATED};
pub use super::catalogs_productivity::{
ASANA_CURATED, DROPBOX_CURATED, JIRA_CURATED, OUTLOOK_CURATED, TODOIST_CURATED, TRELLO_CURATED,
};
// `LINEAR_CURATED` moved into `super::linear::LINEAR_CURATED` alongside
// the native LinearProvider impl. `catalog_for_toolkit("linear")` now
// routes there directly. Removing the re-export keeps a single source
// of truth and matches how `gmail` / `notion` / `clickup` are wired.
pub use super::catalogs_social_media::{SPOTIFY_CURATED, TWITTER_CURATED, YOUTUBE_CURATED};
@@ -106,6 +106,14 @@ pub const OUTLOOK_CURATED: &[CuratedTool] = &[
},
];
// ── linear ──────────────────────────────────────────────────────────
//
// `LINEAR_CURATED` lives in `super::linear::tools` alongside the native
// `LinearProvider` impl (per-issue #2400). `catalog_for_toolkit("linear")`
// in `super::mod` routes through that constant directly. Removing the
// catalog-only declaration here keeps a single source of truth and
// matches how `gmail` / `notion` / `clickup` are wired.
// ── jira ────────────────────────────────────────────────────────────
pub const JIRA_CURATED: &[CuratedTool] = &[
CuratedTool {
@@ -20,7 +20,10 @@ pub fn toolkit_description(slug: &str) -> &'static str {
"google_sheets" => "Read, write, and manage Google Sheets spreadsheets",
"outlook" => "Send, read, and manage emails in Microsoft Outlook",
"microsoft_teams" => "Send messages and manage channels in Microsoft Teams",
"linear" => "Create and manage issues, projects, and cycles in Linear; sync assigned issues into Memory Tree",
"linear" => {
"Create, read, and manage issues, projects, and cycles in Linear; sync \
assigned issues into Memory Tree"
}
"jira" => "Create and manage issues, projects, and sprints in Jira",
"trello" => "Create and manage cards, lists, and boards in Trello",
"asana" => "Create and manage tasks, projects, and sections in Asana",
+8 -9
View File
@@ -187,6 +187,7 @@ pub fn catalog_for_toolkit(toolkit: &str) -> Option<&'static [CuratedTool]> {
"gmail" => Some(gmail::GMAIL_CURATED),
"notion" => Some(notion::NOTION_CURATED),
"github" => Some(github::GITHUB_CURATED),
"linear" => Some(linear::LINEAR_CURATED),
// Catalog-only toolkits
"slack" => Some(catalogs::SLACK_CURATED),
"discord" => Some(catalogs::DISCORD_CURATED),
@@ -197,7 +198,6 @@ pub fn catalog_for_toolkit(toolkit: &str) -> Option<&'static [CuratedTool]> {
"outlook" => Some(catalogs::OUTLOOK_CURATED),
// MICROSOFT_TEAMS_* slugs extract to "microsoft" via toolkit_from_slug.
"microsoft" | "microsoft_teams" => Some(catalogs::MICROSOFT_TEAMS_CURATED),
"linear" => Some(linear::LINEAR_CURATED),
"jira" => Some(catalogs::JIRA_CURATED),
"trello" => Some(catalogs::TRELLO_CURATED),
"asana" => Some(catalogs::ASANA_CURATED),
@@ -473,15 +473,14 @@ mod tests {
#[test]
fn capability_matrix_includes_linear_as_native_memory_provider() {
// Locks in the per-issue #2400 registration: a Linear row must
// appear in the capability matrix with the same native-provider
// flags Gmail/Notion/Slack/ClickUp already carry (`memory_ingest`,
// `periodic_sync`, non-zero `sync_interval_secs`). If a future
// change drops one of the four registration touchpoints
// Per-issue #2400 registration: a Linear row must appear in
// the capability matrix as a native memory-ingest provider,
// matching gmail / notion / slack / clickup. If a future
// change drops one of the five registration touchpoints
// (CAPABILITY_TOOLKITS, has_native_provider,
// native_provider_sync_interval, catalog_for_toolkit) this test
// fails loud rather than silently degrading the provider to
// catalog-only status.
// native_provider_sync_interval, catalog_for_toolkit,
// toolkit_description) this test fails loud rather than
// silently degrading the provider to catalog-only status.
let matrix = capability_matrix();
let linear = matrix
.iter()