@danainnovations/cortex-mcp 1.0.86 → 1.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ openBrowser
4
+ } from "./chunk-BAM6HEKA.js";
5
+ export {
6
+ openBrowser
7
+ };
8
+ //# sourceMappingURL=browser-AJPM6AK7.js.map
@@ -97,6 +97,14 @@ var AVAILABLE_MCPS = [
97
97
  authMode: "personal"
98
98
  }
99
99
  ];
100
+ var SONANCE_BRAND_CONFIG = {
101
+ name: "sonance-brand",
102
+ displayName: "Sonance Brand",
103
+ description: "Brand guidelines, design tokens, component library, logos (28 tools)",
104
+ serverName: "sonance-brand",
105
+ command: "npx",
106
+ args: ["-y", "sonance-brand-mcp@latest"]
107
+ };
100
108
  var MCP_NAMES = AVAILABLE_MCPS.map((m) => m.name);
101
109
  var DEFAULT_MCPS = [...MCP_NAMES];
102
110
  var DEFAULT_API_KEY = "ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709";
@@ -108,6 +116,7 @@ export {
108
116
  DEFAULT_SERVER_URL,
109
117
  PROTOCOL_VERSION,
110
118
  AVAILABLE_MCPS,
119
+ SONANCE_BRAND_CONFIG,
111
120
  MCP_NAMES,
112
121
  DEFAULT_MCPS,
113
122
  DEFAULT_API_KEY,
@@ -115,4 +124,4 @@ export {
115
124
  CONFIG_FILE_NAME,
116
125
  CREDENTIALS_FILE_NAME
117
126
  };
118
- //# sourceMappingURL=chunk-D4PD3E6J.js.map
127
+ //# sourceMappingURL=chunk-3X6WPEWI.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default Cortex server URL */\nexport const DEFAULT_SERVER_URL = \"https://cortex-bice.vercel.app\";\n\n/** MCP protocol version supported by Cortex (Streamable HTTP) */\nexport const PROTOCOL_VERSION = \"2025-03-26\";\n\n/** Available MCPs with their metadata */\nexport const AVAILABLE_MCPS = [\n {\n name: \"m365\",\n displayName: \"Microsoft 365\",\n description: \"Email, calendar, OneDrive, Teams, meetings, contacts, tasks, notes (33 tools)\",\n serverName: \"cortex-m365\",\n authMode: \"personal\" as const,\n },\n {\n name: \"asana\",\n displayName: \"Asana\",\n description: \"Projects, tasks, teams, workspaces (17 tools)\",\n serverName: \"cortex-asana\",\n authMode: \"personal\" as const,\n },\n {\n name: \"github\",\n displayName: \"GitHub\",\n description: \"Repos, PRs, issues, branches, code review (30 tools)\",\n serverName: \"cortex-github\",\n authMode: \"company\" as const,\n },\n {\n name: \"vercel\",\n displayName: \"Vercel\",\n description: \"Deployments, projects, env vars (15 tools)\",\n serverName: \"cortex-vercel\",\n authMode: \"company\" as const,\n },\n {\n name: \"supabase\",\n displayName: \"Supabase\",\n description: \"Database, migrations, edge functions (20+ tools)\",\n serverName: \"cortex-supabase\",\n authMode: \"company\" as const,\n },\n {\n name: \"bestbuy\",\n displayName: \"Best Buy\",\n description: \"Product search, pricing, reviews, store locations (7 tools)\",\n serverName: \"cortex-bestbuy\",\n authMode: \"company\" as const,\n },\n {\n name: \"mailchimp\",\n displayName: \"Mailchimp\",\n description: \"Audiences, contacts, campaigns, templates, analytics (28 tools)\",\n serverName: \"cortex-mailchimp\",\n authMode: \"personal\" as const,\n },\n {\n name: \"salesforce\",\n displayName: \"Salesforce\",\n description: \"CRM queries, records, reports, and org data (14 tools)\",\n serverName: \"cortex-salesforce\",\n authMode: \"personal\" as const,\n },\n {\n name: \"monday\",\n displayName: \"Monday.com\",\n description: \"Boards, items, groups, updates, workspaces (18 tools)\",\n serverName: \"cortex-monday\",\n authMode: \"personal\" as const,\n installUrl: \"https://auth.monday.com/oauth2/authorize?client_id=c8d2c70bd792a4c36c6f023c0b707517&response_type=install\",\n },\n {\n name: \"slack\",\n displayName: \"Slack\",\n description: \"Messaging, channels, search, reactions, bookmarks (22 tools)\",\n serverName: \"cortex-slack\",\n authMode: \"personal\" as const,\n },\n {\n name: \"powerbi\",\n displayName: \"Power BI\",\n description: \"Workspaces, datasets, push data, DAX queries, reports, dashboards (14 tools)\",\n serverName: \"cortex-powerbi\",\n authMode: \"personal\" as const,\n },\n {\n name: \"databricks\",\n displayName: \"Databricks\",\n description: \"Unity Catalog discovery, SQL queries, data dictionary, jobs (18 tools)\",\n serverName: \"cortex-databricks\",\n authMode: \"company\" as const,\n },\n {\n name: \"concur\",\n displayName: \"SAP Concur\",\n description: \"Expense reports, entries, receipts, approvals (16 tools)\",\n serverName: \"cortex-concur\",\n authMode: \"personal\" as const,\n },\n] as const;\n\n/** All available MCP names */\nexport const MCP_NAMES: string[] = AVAILABLE_MCPS.map((m) => m.name);\n\n/** Default MCPs enabled on fresh setup */\nexport const DEFAULT_MCPS: string[] = [...MCP_NAMES];\n\n/** Shared API key embedded in the package (no user prompt needed) */\nexport const DEFAULT_API_KEY =\n \"ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709\";\n\n/** Config directory name */\nexport const CONFIG_DIR_NAME = \".cortex-mcp\";\n\n/** Config file name */\nexport const CONFIG_FILE_NAME = \"config.json\";\n\n/** Credentials file name (stores personal API key from login) */\nexport const CREDENTIALS_FILE_NAME = \"credentials.json\";\n"],"mappings":";;;AACO,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAGzB,IAAM,iBAAiB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AACF;AAGO,IAAM,YAAsB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAG5D,IAAM,eAAyB,CAAC,GAAG,SAAS;AAG5C,IAAM,kBACX;AAGK,IAAM,kBAAkB;AAGxB,IAAM,mBAAmB;AAGzB,IAAM,wBAAwB;","names":[]}
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/** Default Cortex server URL */\nexport const DEFAULT_SERVER_URL = \"https://cortex-bice.vercel.app\";\n\n/** MCP protocol version supported by Cortex (Streamable HTTP) */\nexport const PROTOCOL_VERSION = \"2025-03-26\";\n\n/** Available MCPs with their metadata */\nexport const AVAILABLE_MCPS = [\n {\n name: \"m365\",\n displayName: \"Microsoft 365\",\n description: \"Email, calendar, OneDrive, Teams, meetings, contacts, tasks, notes (33 tools)\",\n serverName: \"cortex-m365\",\n authMode: \"personal\" as const,\n },\n {\n name: \"asana\",\n displayName: \"Asana\",\n description: \"Projects, tasks, teams, workspaces (17 tools)\",\n serverName: \"cortex-asana\",\n authMode: \"personal\" as const,\n },\n {\n name: \"github\",\n displayName: \"GitHub\",\n description: \"Repos, PRs, issues, branches, code review (30 tools)\",\n serverName: \"cortex-github\",\n authMode: \"company\" as const,\n },\n {\n name: \"vercel\",\n displayName: \"Vercel\",\n description: \"Deployments, projects, env vars (15 tools)\",\n serverName: \"cortex-vercel\",\n authMode: \"company\" as const,\n },\n {\n name: \"supabase\",\n displayName: \"Supabase\",\n description: \"Database, migrations, edge functions (20+ tools)\",\n serverName: \"cortex-supabase\",\n authMode: \"company\" as const,\n },\n {\n name: \"bestbuy\",\n displayName: \"Best Buy\",\n description: \"Product search, pricing, reviews, store locations (7 tools)\",\n serverName: \"cortex-bestbuy\",\n authMode: \"company\" as const,\n },\n {\n name: \"mailchimp\",\n displayName: \"Mailchimp\",\n description: \"Audiences, contacts, campaigns, templates, analytics (28 tools)\",\n serverName: \"cortex-mailchimp\",\n authMode: \"personal\" as const,\n },\n {\n name: \"salesforce\",\n displayName: \"Salesforce\",\n description: \"CRM queries, records, reports, and org data (14 tools)\",\n serverName: \"cortex-salesforce\",\n authMode: \"personal\" as const,\n },\n {\n name: \"monday\",\n displayName: \"Monday.com\",\n description: \"Boards, items, groups, updates, workspaces (18 tools)\",\n serverName: \"cortex-monday\",\n authMode: \"personal\" as const,\n installUrl: \"https://auth.monday.com/oauth2/authorize?client_id=c8d2c70bd792a4c36c6f023c0b707517&response_type=install\",\n },\n {\n name: \"slack\",\n displayName: \"Slack\",\n description: \"Messaging, channels, search, reactions, bookmarks (22 tools)\",\n serverName: \"cortex-slack\",\n authMode: \"personal\" as const,\n },\n {\n name: \"powerbi\",\n displayName: \"Power BI\",\n description: \"Workspaces, datasets, push data, DAX queries, reports, dashboards (14 tools)\",\n serverName: \"cortex-powerbi\",\n authMode: \"personal\" as const,\n },\n {\n name: \"databricks\",\n displayName: \"Databricks\",\n description: \"Unity Catalog discovery, SQL queries, data dictionary, jobs (18 tools)\",\n serverName: \"cortex-databricks\",\n authMode: \"company\" as const,\n },\n {\n name: \"concur\",\n displayName: \"SAP Concur\",\n description: \"Expense reports, entries, receipts, approvals (16 tools)\",\n serverName: \"cortex-concur\",\n authMode: \"personal\" as const,\n },\n] as const;\n\n/** Sonance Brand MCP — standalone stdio server, not proxied through Cortex */\nexport const SONANCE_BRAND_CONFIG = {\n name: \"sonance-brand\",\n displayName: \"Sonance Brand\",\n description: \"Brand guidelines, design tokens, component library, logos (28 tools)\",\n serverName: \"sonance-brand\",\n command: \"npx\",\n args: [\"-y\", \"sonance-brand-mcp@latest\"],\n} as const;\n\n/** All available MCP names */\nexport const MCP_NAMES: string[] = AVAILABLE_MCPS.map((m) => m.name);\n\n/** Default MCPs enabled on fresh setup */\nexport const DEFAULT_MCPS: string[] = [...MCP_NAMES];\n\n/** Shared API key embedded in the package (no user prompt needed) */\nexport const DEFAULT_API_KEY =\n \"ctx_07d37a81_9f7be06af38d04753090a4034f907a65ec06cd675ed26f65653898388e2d1709\";\n\n/** Config directory name */\nexport const CONFIG_DIR_NAME = \".cortex-mcp\";\n\n/** Config file name */\nexport const CONFIG_FILE_NAME = \"config.json\";\n\n/** Credentials file name (stores personal API key from login) */\nexport const CREDENTIALS_FILE_NAME = \"credentials.json\";\n"],"mappings":";;;AACO,IAAM,qBAAqB;AAG3B,IAAM,mBAAmB;AAGzB,IAAM,iBAAiB;AAAA,EAC5B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,UAAU;AAAA,EACZ;AACF;AAGO,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,MAAM,CAAC,MAAM,0BAA0B;AACzC;AAGO,IAAM,YAAsB,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAG5D,IAAM,eAAyB,CAAC,GAAG,SAAS;AAG5C,IAAM,kBACX;AAGK,IAAM,kBAAkB;AAGxB,IAAM,mBAAmB;AAGzB,IAAM,wBAAwB;","names":[]}
@@ -122,7 +122,15 @@ function openBrowser(url) {
122
122
  return new Promise((resolve) => {
123
123
  const platform2 = getPlatform();
124
124
  const cmd = platform2 === "macos" ? `open "${url}"` : platform2 === "windows" ? `start "" "${url}"` : `xdg-open "${url}"`;
125
- exec(cmd, () => resolve());
125
+ exec(cmd, (err) => {
126
+ if (err) {
127
+ process.stderr.write(` Could not open browser automatically.
128
+ `);
129
+ process.stderr.write(` Please visit: ${url}
130
+ `);
131
+ }
132
+ resolve();
133
+ });
126
134
  });
127
135
  }
128
136
 
@@ -139,4 +147,4 @@ export {
139
147
  getCodexConfigPath,
140
148
  openBrowser
141
149
  };
142
- //# sourceMappingURL=chunk-HXROEPYY.js.map
150
+ //# sourceMappingURL=chunk-BAM6HEKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/browser.ts","../src/utils/platform.ts"],"sourcesContent":["import { exec } from \"node:child_process\";\nimport { getPlatform } from \"./platform.js\";\n\nexport function openBrowser(url: string): Promise<void> {\n return new Promise((resolve) => {\n const platform = getPlatform();\n const cmd =\n platform === \"macos\" ? `open \"${url}\"` :\n platform === \"windows\" ? `start \"\" \"${url}\"` :\n `xdg-open \"${url}\"`;\n exec(cmd, (err) => {\n if (err) {\n process.stderr.write(` Could not open browser automatically.\\n`);\n process.stderr.write(` Please visit: ${url}\\n`);\n }\n resolve();\n });\n });\n}\n","import { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, readdirSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\n\n/** Get the user's home directory */\nexport function getHomeDir(): string {\n return homedir();\n}\n\n/** Get the current platform */\nexport function getPlatform(): \"macos\" | \"windows\" | \"linux\" {\n const p = platform();\n if (p === \"darwin\") return \"macos\";\n if (p === \"win32\") return \"windows\";\n return \"linux\";\n}\n\n/** Detect if running inside Windows Subsystem for Linux */\nexport function isWSL(): boolean {\n if (getPlatform() !== \"linux\") return false;\n try {\n const version = readFileSync(\"/proc/version\", \"utf-8\");\n return /microsoft|wsl/i.test(version);\n } catch {\n return false;\n }\n}\n\n/** Resolve the Windows user home directory from within WSL via /mnt/c */\nfunction getWindowsHomeFromWSL(): string | null {\n try {\n // Try cmd.exe to get the Windows USERNAME\n const raw = execSync(\"cmd.exe /c echo %USERNAME%\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }).toString().trim().replace(/\\r/g, \"\");\n if (raw && raw !== \"%USERNAME%\") {\n return `/mnt/c/Users/${raw}`;\n }\n } catch {\n // cmd.exe may not be available — fall through\n }\n\n try {\n // Fallback: scan /mnt/c/Users for a single non-system user directory\n const dirs = readdirSync(\"/mnt/c/Users\").filter(\n (d) =>\n d !== \"Public\" &&\n d !== \"Default\" &&\n d !== \"Default User\" &&\n d !== \"All Users\" &&\n !d.startsWith(\".\")\n );\n if (dirs.length === 1) return `/mnt/c/Users/${dirs[0]}`;\n } catch {\n // /mnt/c not mounted\n }\n\n return null;\n}\n\n/**\n * Detect Microsoft Store Claude Desktop install path.\n * Store apps use a virtualized filesystem under LocalCache\\Roaming.\n */\nexport function getStoreClaudePath(): string | null {\n try {\n const localAppData = process.env.LOCALAPPDATA || join(homedir(), \"AppData\", \"Local\");\n const packagesDir = join(localAppData, \"Packages\");\n const dirs = readdirSync(packagesDir).filter((d) => d.startsWith(\"Claude_\"));\n if (dirs.length > 0) {\n return join(\n packagesDir,\n dirs[0],\n \"LocalCache\",\n \"Roaming\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n }\n } catch {\n // Not a Store install or can't read Packages dir\n }\n return null;\n}\n\n/**\n * Get the standard (non-Store) Claude Desktop config path on Windows.\n */\nexport function getStandardClaudeDesktopPath(): string {\n const home = homedir();\n return join(\n process.env.APPDATA || join(home, \"AppData\", \"Roaming\"),\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n}\n\n/**\n * Get the Claude Desktop config file path for the current platform.\n * On Windows, prefers the Microsoft Store virtualized path if detected.\n */\nexport function getClaudeDesktopConfigPath(): string {\n const home = getHomeDir();\n const p = getPlatform();\n\n // WSL: Claude Desktop is a Windows app — write to the Windows AppData path\n if (p === \"linux\" && isWSL()) {\n const winHome = getWindowsHomeFromWSL();\n if (winHome) {\n return join(winHome, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\");\n }\n }\n\n switch (p) {\n case \"macos\":\n return join(\n home,\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n case \"windows\": {\n // Prefer Microsoft Store path if installed (virtualized filesystem)\n const storePath = getStoreClaudePath();\n if (storePath) return storePath;\n return getStandardClaudeDesktopPath();\n }\n case \"linux\":\n return join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n }\n}\n\n/**\n * Get the Cursor MCP config file path for the current platform.\n */\nexport function getCursorConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".cursor\", \"mcp.json\");\n}\n\n/**\n * Get the VS Code MCP config file path for the current platform.\n */\nexport function getVSCodeMcpConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".vscode\", \"mcp.json\");\n}\n\n/**\n * Get the Antigravity MCP config file path for the current platform.\n */\nexport function getAntigravityConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".gemini\", \"antigravity\", \"mcp_config.json\");\n}\n\n/**\n * Get the Codex (OpenAI) config file path.\n * Shared by both Codex CLI and Codex IDE extension.\n */\nexport function getCodexConfigPath(): string {\n const home = getHomeDir();\n return join(home, \".codex\", \"config.toml\");\n}\n"],"mappings":"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","names":["platform"]}
package/dist/cli.js CHANGED
@@ -8,8 +8,9 @@ import {
8
8
  DEFAULT_MCPS,
9
9
  DEFAULT_SERVER_URL,
10
10
  MCP_NAMES,
11
- PROTOCOL_VERSION
12
- } from "./chunk-D4PD3E6J.js";
11
+ PROTOCOL_VERSION,
12
+ SONANCE_BRAND_CONFIG
13
+ } from "./chunk-3X6WPEWI.js";
13
14
  import {
14
15
  getAntigravityConfigPath,
15
16
  getClaudeDesktopConfigPath,
@@ -22,7 +23,7 @@ import {
22
23
  getVSCodeMcpConfigPath,
23
24
  isWSL,
24
25
  openBrowser
25
- } from "./chunk-HXROEPYY.js";
26
+ } from "./chunk-BAM6HEKA.js";
26
27
 
27
28
  // bin/cli.ts
28
29
  import { Command } from "commander";
@@ -877,6 +878,7 @@ function getWizardHtml() {
877
878
  powerbi: '<svg viewBox="0 0 16 16"><rect x="2" y="8" width="3" height="6" rx="1"/><rect x="6.5" y="5" width="3" height="9" rx="1"/><rect x="11" y="2" width="3" height="12" rx="1"/></svg>',
878
879
  bestbuy: '<svg viewBox="0 0 16 16"><path d="M2 3h12a1 1 0 011 1v8a1 1 0 01-1 1H2a1 1 0 01-1-1V4a1 1 0 011-1zm3 3v4h2V6H5zm4 0v4h2V6H9z"/></svg>',
879
880
  mailchimp: '<svg viewBox="0 0 16 16"><path d="M8 2a6 6 0 100 12A6 6 0 008 2zM6.5 10.5a1.5 1.5 0 110-3 1.5 1.5 0 010 3zm3 0a1.5 1.5 0 110-3 1.5 1.5 0 010 3z"/></svg>',
881
+ 'sonance-brand': '<svg viewBox="0 0 16 16"><path d="M2 3a1 1 0 011-1h2a1 1 0 011 1v10a1 1 0 01-1 1H3a1 1 0 01-1-1V3zm5 2a1 1 0 011-1h2a1 1 0 011 1v8a1 1 0 01-1 1H8a1 1 0 01-1-1V5zm5-3a1 1 0 011-1h1a1 1 0 011 1v11a1 1 0 01-1 1h-1a1 1 0 01-1-1V2z"/></svg>',
880
882
  };
881
883
 
882
884
  // \u2500\u2500 Client Icons (inline SVG) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
@@ -900,6 +902,8 @@ function getWizardHtml() {
900
902
  state.availableMcps = data.availableMcps || [];
901
903
  state.enabledMcps = data.enabledMcps || ['m365'];
902
904
  state.selectedMcps = (data.enabledMcps || ['m365']).slice();
905
+ state.sonanceBrand = data.sonanceBrand || null;
906
+ state.includeSonanceBrand = true;
903
907
  state.detectedClients = data.detectedClients || [];
904
908
  state.configuredClients = (data.config && data.config.configuredClients) || [];
905
909
  } catch (err) {
@@ -1066,6 +1070,7 @@ function getWizardHtml() {
1066
1070
  powerbi: 'Build dashboards and run data queries on your reports',
1067
1071
  bestbuy: 'Search products, compare prices, and find store locations',
1068
1072
  databricks: 'Query data warehouses, explore Unity Catalog, and manage jobs',
1073
+ 'sonance-brand': 'Brand guidelines, design tokens, component library, and logo assets for Sonance, IPORT, and Blaze Audio',
1069
1074
  };
1070
1075
 
1071
1076
  function renderMcpList(container) {
@@ -1098,6 +1103,28 @@ function getWizardHtml() {
1098
1103
  html += '</div></div>';
1099
1104
  }
1100
1105
 
1106
+ // Sonance Brand \u2014 internal design system MCP (always available)
1107
+ if (state.sonanceBrand) {
1108
+ var sbChecked = state.includeSonanceBrand !== false;
1109
+ html += '<div class="mcp-section">';
1110
+ html += '<div class="mcp-section-title">Internal Tools</div>';
1111
+ html += '<div class="mcp-section-subtitle">Standalone tools bundled with setup</div>';
1112
+ html += '<div class="mcp-list">';
1113
+ html += '<label class="mcp-item' + (sbChecked ? ' checked' : '') + '" data-mcp="sonance-brand">' +
1114
+ (MCP_TOOLTIPS['sonance-brand'] ? '<span class="mcp-tooltip">' + MCP_TOOLTIPS['sonance-brand'] + '</span>' : '') +
1115
+ '<input type="checkbox" value="sonance-brand"' + (sbChecked ? ' checked' : '') + '>' +
1116
+ (MCP_ICONS['sonance-brand'] ? '<div class="mcp-icon">' + MCP_ICONS['sonance-brand'] + '</div>' : '') +
1117
+ '<div class="mcp-check"><span class="mcp-check-icon">&#10003;</span></div>' +
1118
+ '<div class="mcp-info">' +
1119
+ '<span class="mcp-name">' + escapeHtml(state.sonanceBrand.displayName) +
1120
+ '<span class="mcp-badge company">internal</span>' +
1121
+ '</span>' +
1122
+ '<span class="mcp-desc">' + escapeHtml(state.sonanceBrand.description) + '</span>' +
1123
+ '</div>' +
1124
+ '</label>';
1125
+ html += '</div></div>';
1126
+ }
1127
+
1101
1128
  if (disabledMcps.length > 0) {
1102
1129
  html += '<div class="mcp-section">';
1103
1130
  html += '<div class="mcp-section-title">Coming Soon</div>';
@@ -1176,8 +1203,18 @@ function getWizardHtml() {
1176
1203
 
1177
1204
  function saveMcps() {
1178
1205
  var checkboxes = document.querySelectorAll('.mcp-item:not(.disabled) input[type="checkbox"]');
1179
- var selected = Array.from(checkboxes).filter(function(cb) { return cb.checked; }).map(function(cb) { return cb.value; });
1206
+ var selected = [];
1207
+ var includeBrand = false;
1208
+ Array.from(checkboxes).forEach(function(cb) {
1209
+ if (!cb.checked) return;
1210
+ if (cb.value === 'sonance-brand') {
1211
+ includeBrand = true;
1212
+ } else {
1213
+ selected.push(cb.value);
1214
+ }
1215
+ });
1180
1216
  state.selectedMcps = selected;
1217
+ state.includeSonanceBrand = includeBrand;
1181
1218
  goToStep('clients');
1182
1219
  }
1183
1220
 
@@ -1228,6 +1265,8 @@ function getWizardHtml() {
1228
1265
  el.innerHTML = html;
1229
1266
 
1230
1267
  el.querySelectorAll('.client-item:not(.disabled):not(.already-configured)').forEach(function(item) {
1268
+ // Auto-select all detected clients on first setup
1269
+ item.classList.add('checked');
1231
1270
  item.addEventListener('click', function(e) {
1232
1271
  e.preventDefault();
1233
1272
  item.classList.toggle('checked');
@@ -1235,6 +1274,10 @@ function getWizardHtml() {
1235
1274
  .map(function(i) { return i.dataset.client; });
1236
1275
  });
1237
1276
  });
1277
+
1278
+ // Sync selectedClients with all checked items (auto-selected + previously configured)
1279
+ state.selectedClients = Array.from(el.querySelectorAll('.client-item.checked'))
1280
+ .map(function(i) { return i.dataset.client; });
1238
1281
  }
1239
1282
 
1240
1283
  async function configureClients() {
@@ -1260,7 +1303,7 @@ function getWizardHtml() {
1260
1303
  var resp = await fetch('/api/clients/configure', {
1261
1304
  method: 'POST',
1262
1305
  headers: { 'Content-Type': 'application/json' },
1263
- body: JSON.stringify({ clients: state.selectedClients, mcps: state.selectedMcps }),
1306
+ body: JSON.stringify({ clients: state.selectedClients, mcps: state.selectedMcps, includeSonanceBrand: state.includeSonanceBrand !== false }),
1264
1307
  });
1265
1308
  var data = await resp.json();
1266
1309
 
@@ -1553,7 +1596,8 @@ function detectClients() {
1553
1596
  });
1554
1597
  let claudeCodeDetected = false;
1555
1598
  try {
1556
- execSync("which claude", { stdio: "pipe" });
1599
+ const whichCmd = getPlatform() === "windows" ? "where claude" : "which claude";
1600
+ execSync(whichCmd, { stdio: "pipe" });
1557
1601
  claudeCodeDetected = true;
1558
1602
  } catch {
1559
1603
  }
@@ -1590,7 +1634,8 @@ function detectClients() {
1590
1634
  let codexDetected = existsSync(join(home, ".codex"));
1591
1635
  if (!codexDetected) {
1592
1636
  try {
1593
- execSync("which codex", { stdio: "pipe" });
1637
+ const whichCmd = getPlatform() === "windows" ? "where codex" : "which codex";
1638
+ execSync(whichCmd, { stdio: "pipe" });
1594
1639
  codexDetected = true;
1595
1640
  } catch {
1596
1641
  }
@@ -1616,6 +1661,10 @@ function detectClients() {
1616
1661
  });
1617
1662
  return clients;
1618
1663
  }
1664
+ function buildSonanceBrandEntry() {
1665
+ const isWindowsTarget = getPlatform() === "windows" || isWSL();
1666
+ return isWindowsTarget ? { command: "cmd", args: ["/c", ...SONANCE_BRAND_CONFIG.args] } : { command: SONANCE_BRAND_CONFIG.command, args: [...SONANCE_BRAND_CONFIG.args] };
1667
+ }
1619
1668
  function buildHttpEntries(serverUrl, apiKey, mcps) {
1620
1669
  const entries = {};
1621
1670
  for (const mcp of AVAILABLE_MCPS) {
@@ -1627,13 +1676,21 @@ function buildHttpEntries(serverUrl, apiKey, mcps) {
1627
1676
  }
1628
1677
  return entries;
1629
1678
  }
1630
- function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
1679
+ function configureClaudeDesktop(_serverUrl, apiKey, _mcps, includeSonanceBrand = true) {
1631
1680
  const configPath = getClaudeDesktopConfigPath();
1632
1681
  const dir = dirname(configPath);
1633
1682
  if (!existsSync(dir)) {
1634
1683
  mkdirSync(dir, { recursive: true });
1635
1684
  }
1636
1685
  const isWindowsTarget = getPlatform() === "windows" || isWSL();
1686
+ try {
1687
+ const whichCmd = isWindowsTarget ? "where npx" : "which npx";
1688
+ execSync(whichCmd, { stdio: "pipe" });
1689
+ } catch {
1690
+ throw new Error(
1691
+ "Node.js is required but 'npx' was not found in your system PATH. Please install Node.js from https://nodejs.org and re-run setup."
1692
+ );
1693
+ }
1637
1694
  const cortexEntry = isWindowsTarget ? {
1638
1695
  command: "cmd",
1639
1696
  args: ["/c", "npx", "-y", "@danainnovations/cortex-mcp@latest", "serve"]
@@ -1655,11 +1712,14 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
1655
1712
  }
1656
1713
  const servers = config.mcpServers;
1657
1714
  for (const key of Object.keys(servers)) {
1658
- if (key.startsWith("cortex-") || key === "cortex") {
1715
+ if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
1659
1716
  delete servers[key];
1660
1717
  }
1661
1718
  }
1662
1719
  servers["cortex"] = cortexEntry;
1720
+ if (includeSonanceBrand) {
1721
+ servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1722
+ }
1663
1723
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
1664
1724
  if (getPlatform() === "windows") {
1665
1725
  const storePath = getStoreClaudePath();
@@ -1683,9 +1743,12 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
1683
1743
  }
1684
1744
  const altServers = altConfig.mcpServers;
1685
1745
  for (const key of Object.keys(altServers)) {
1686
- if (key.startsWith("cortex-") || key === "cortex") delete altServers[key];
1746
+ if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) delete altServers[key];
1687
1747
  }
1688
1748
  altServers["cortex"] = cortexEntry;
1749
+ if (includeSonanceBrand) {
1750
+ altServers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1751
+ }
1689
1752
  writeFileSync(altPath, JSON.stringify(altConfig, null, 2) + "\n");
1690
1753
  } catch {
1691
1754
  }
@@ -1693,7 +1756,7 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
1693
1756
  }
1694
1757
  if (isWindowsTarget) {
1695
1758
  const start = Date.now();
1696
- while (Date.now() - start < 500) {
1759
+ while (Date.now() - start < 1500) {
1697
1760
  }
1698
1761
  try {
1699
1762
  const verify = JSON.parse(readFileSync(configPath, "utf-8"));
@@ -1720,7 +1783,7 @@ function configureClaudeDesktop(_serverUrl, apiKey, _mcps) {
1720
1783
  `Failed to write config to ${configPath}. Claude Desktop may be overwriting the file. Please close Claude Desktop completely (quit from the system tray), then re-run setup.`
1721
1784
  );
1722
1785
  }
1723
- function configureClaudeCode(serverUrl, apiKey, mcps) {
1786
+ function configureClaudeCode(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1724
1787
  for (const mcp of AVAILABLE_MCPS) {
1725
1788
  if (!mcps.includes(mcp.name)) continue;
1726
1789
  const url = `${serverUrl}/mcp/${mcp.name}`;
@@ -1733,8 +1796,18 @@ function configureClaudeCode(serverUrl, apiKey, mcps) {
1733
1796
  { stdio: "pipe" }
1734
1797
  );
1735
1798
  }
1799
+ if (includeSonanceBrand) {
1800
+ try {
1801
+ execSync(`claude mcp remove ${SONANCE_BRAND_CONFIG.name}`, { stdio: "pipe" });
1802
+ } catch {
1803
+ }
1804
+ execSync(
1805
+ `claude mcp add ${SONANCE_BRAND_CONFIG.name} -- ${SONANCE_BRAND_CONFIG.command} ${SONANCE_BRAND_CONFIG.args.join(" ")}`,
1806
+ { stdio: "pipe" }
1807
+ );
1808
+ }
1736
1809
  }
1737
- function configureCursor(serverUrl, apiKey, mcps) {
1810
+ function configureCursor(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1738
1811
  const configPath = getCursorConfigPath();
1739
1812
  const dir = dirname(configPath);
1740
1813
  if (!existsSync(dir)) {
@@ -1752,15 +1825,18 @@ function configureCursor(serverUrl, apiKey, mcps) {
1752
1825
  }
1753
1826
  const servers = config.mcpServers;
1754
1827
  for (const key of Object.keys(servers)) {
1755
- if (key.startsWith("cortex-")) {
1828
+ if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
1756
1829
  delete servers[key];
1757
1830
  }
1758
1831
  }
1759
1832
  const entries = buildHttpEntries(serverUrl, apiKey, mcps);
1760
1833
  Object.assign(servers, entries);
1834
+ if (includeSonanceBrand) {
1835
+ servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1836
+ }
1761
1837
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
1762
1838
  }
1763
- function configureVSCode(serverUrl, apiKey, mcps) {
1839
+ function configureVSCode(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1764
1840
  const configPath = getVSCodeMcpConfigPath();
1765
1841
  const dir = dirname(configPath);
1766
1842
  if (!existsSync(dir)) {
@@ -1778,15 +1854,18 @@ function configureVSCode(serverUrl, apiKey, mcps) {
1778
1854
  }
1779
1855
  const servers = config.mcpServers;
1780
1856
  for (const key of Object.keys(servers)) {
1781
- if (key.startsWith("cortex-")) {
1857
+ if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
1782
1858
  delete servers[key];
1783
1859
  }
1784
1860
  }
1785
1861
  const entries = buildHttpEntries(serverUrl, apiKey, mcps);
1786
1862
  Object.assign(servers, entries);
1863
+ if (includeSonanceBrand) {
1864
+ servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1865
+ }
1787
1866
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
1788
1867
  }
1789
- function configureAntigravity(serverUrl, apiKey, mcps) {
1868
+ function configureAntigravity(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1790
1869
  const configPath = getAntigravityConfigPath();
1791
1870
  const dir = dirname(configPath);
1792
1871
  if (!existsSync(dir)) {
@@ -1804,15 +1883,18 @@ function configureAntigravity(serverUrl, apiKey, mcps) {
1804
1883
  }
1805
1884
  const servers = config.mcpServers;
1806
1885
  for (const key of Object.keys(servers)) {
1807
- if (key.startsWith("cortex-")) {
1886
+ if (key.startsWith("cortex-") || key === SONANCE_BRAND_CONFIG.name) {
1808
1887
  delete servers[key];
1809
1888
  }
1810
1889
  }
1811
1890
  const entries = buildHttpEntries(serverUrl, apiKey, mcps);
1812
1891
  Object.assign(servers, entries);
1892
+ if (includeSonanceBrand) {
1893
+ servers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1894
+ }
1813
1895
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
1814
1896
  }
1815
- function configureCodex(serverUrl, apiKey, mcps) {
1897
+ function configureCodex(serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1816
1898
  const configPath = getCodexConfigPath();
1817
1899
  const dir = dirname(configPath);
1818
1900
  if (!existsSync(dir)) {
@@ -1826,7 +1908,7 @@ function configureCodex(serverUrl, apiKey, mcps) {
1826
1908
  }
1827
1909
  }
1828
1910
  const cleaned = existingContent.replace(
1829
- /\[mcp_servers\.cortex-[^\]]*\][^[]*(?=\[|$)/g,
1911
+ /\[mcp_servers\.(?:cortex-[^\]]*|sonance-brand)\][^[]*(?=\[|$)/g,
1830
1912
  ""
1831
1913
  ).trim();
1832
1914
  const tomlEntries = [];
@@ -1838,10 +1920,17 @@ url = "${serverUrl}/mcp/${mcp.name}"
1838
1920
  http_headers = { "x-api-key" = "${apiKey}" }`
1839
1921
  );
1840
1922
  }
1923
+ if (includeSonanceBrand) {
1924
+ tomlEntries.push(
1925
+ `[mcp_servers.${SONANCE_BRAND_CONFIG.name}]
1926
+ command = "${SONANCE_BRAND_CONFIG.command}"
1927
+ args = [${SONANCE_BRAND_CONFIG.args.map((a) => `"${a}"`).join(", ")}]`
1928
+ );
1929
+ }
1841
1930
  const newContent = (cleaned ? cleaned + "\n\n" : "") + tomlEntries.join("\n\n") + "\n";
1842
1931
  writeFileSync(configPath, newContent);
1843
1932
  }
1844
- function configurePerplexity(serverUrl, _apiKey, mcps) {
1933
+ function configurePerplexity(serverUrl, _apiKey, mcps, _includeSonanceBrand = true) {
1845
1934
  const lines = [
1846
1935
  "Add each MCP as a separate connector in Perplexity:",
1847
1936
  " Settings \u2192 Connectors \u2192 Add custom connector",
@@ -1858,9 +1947,11 @@ function configurePerplexity(serverUrl, _apiKey, mcps) {
1858
1947
  lines.push(` Transport: Streamable HTTP`);
1859
1948
  lines.push("");
1860
1949
  }
1950
+ lines.push("Note: Sonance Brand MCP requires stdio transport (npx sonance-brand-mcp).");
1951
+ lines.push("Perplexity may not support stdio \u2014 use Claude Desktop or Claude Code for brand tools.");
1861
1952
  return lines.join("\n");
1862
1953
  }
1863
- function generateStdioSnippet(_apiKey) {
1954
+ function generateStdioSnippet(_apiKey, includeSonanceBrand = true) {
1864
1955
  const isWindowsTarget = getPlatform() === "windows" || isWSL();
1865
1956
  const config = {
1866
1957
  mcpServers: {
@@ -1873,6 +1964,9 @@ function generateStdioSnippet(_apiKey) {
1873
1964
  }
1874
1965
  }
1875
1966
  };
1967
+ if (includeSonanceBrand) {
1968
+ config.mcpServers[SONANCE_BRAND_CONFIG.name] = buildSonanceBrandEntry();
1969
+ }
1876
1970
  return JSON.stringify(config, null, 2);
1877
1971
  }
1878
1972
  function resetClaudeDesktop() {
@@ -1884,7 +1978,7 @@ function resetClaudeDesktop() {
1884
1978
  const servers = config.mcpServers;
1885
1979
  let removed = false;
1886
1980
  for (const key of Object.keys(servers)) {
1887
- if (key.startsWith("cortex-") || key === "cortex") {
1981
+ if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
1888
1982
  delete servers[key];
1889
1983
  removed = true;
1890
1984
  }
@@ -1906,7 +2000,7 @@ function resetCursor() {
1906
2000
  const servers = config.mcpServers;
1907
2001
  let removed = false;
1908
2002
  for (const key of Object.keys(servers)) {
1909
- if (key.startsWith("cortex-") || key === "cortex") {
2003
+ if (key.startsWith("cortex-") || key === "cortex" || key === SONANCE_BRAND_CONFIG.name) {
1910
2004
  delete servers[key];
1911
2005
  removed = true;
1912
2006
  }
@@ -1928,6 +2022,11 @@ function resetClaudeCode() {
1928
2022
  } catch {
1929
2023
  }
1930
2024
  }
2025
+ try {
2026
+ execSync(`claude mcp remove ${SONANCE_BRAND_CONFIG.name}`, { stdio: "pipe" });
2027
+ removed = true;
2028
+ } catch {
2029
+ }
1931
2030
  return removed;
1932
2031
  }
1933
2032
  function resetCodex() {
@@ -1936,7 +2035,7 @@ function resetCodex() {
1936
2035
  try {
1937
2036
  const content = readFileSync(configPath, "utf-8");
1938
2037
  const cleaned = content.replace(
1939
- /\[mcp_servers\.cortex-[^\]]*\][^[]*(?=\[|$)/g,
2038
+ /\[mcp_servers\.(?:cortex-[^\]]*|sonance-brand)\][^[]*(?=\[|$)/g,
1940
2039
  ""
1941
2040
  ).trim();
1942
2041
  if (cleaned !== content.trim()) {
@@ -1948,31 +2047,31 @@ function resetCodex() {
1948
2047
  return false;
1949
2048
  }
1950
2049
  }
1951
- function configureClient(clientType, serverUrl, apiKey, mcps) {
2050
+ function configureClient(clientType, serverUrl, apiKey, mcps, includeSonanceBrand = true) {
1952
2051
  switch (clientType) {
1953
2052
  case "claude-desktop": {
1954
- const path = configureClaudeDesktop(serverUrl, apiKey, mcps);
2053
+ const path = configureClaudeDesktop(serverUrl, apiKey, mcps, includeSonanceBrand);
1955
2054
  return `Claude Desktop configured (${path})`;
1956
2055
  }
1957
2056
  case "claude-code":
1958
- configureClaudeCode(serverUrl, apiKey, mcps);
2057
+ configureClaudeCode(serverUrl, apiKey, mcps, includeSonanceBrand);
1959
2058
  return "Claude Code configured";
1960
2059
  case "cursor":
1961
- configureCursor(serverUrl, apiKey, mcps);
2060
+ configureCursor(serverUrl, apiKey, mcps, includeSonanceBrand);
1962
2061
  return "Cursor configured";
1963
2062
  case "vscode":
1964
- configureVSCode(serverUrl, apiKey, mcps);
2063
+ configureVSCode(serverUrl, apiKey, mcps, includeSonanceBrand);
1965
2064
  return "VS Code configured";
1966
2065
  case "antigravity":
1967
- configureAntigravity(serverUrl, apiKey, mcps);
2066
+ configureAntigravity(serverUrl, apiKey, mcps, includeSonanceBrand);
1968
2067
  return "Antigravity configured";
1969
2068
  case "codex":
1970
- configureCodex(serverUrl, apiKey, mcps);
2069
+ configureCodex(serverUrl, apiKey, mcps, includeSonanceBrand);
1971
2070
  return "Codex configured";
1972
2071
  case "perplexity":
1973
- return configurePerplexity(serverUrl, apiKey, mcps);
2072
+ return configurePerplexity(serverUrl, apiKey, mcps, includeSonanceBrand);
1974
2073
  case "stdio":
1975
- return "Add this to your client config:\n\n" + generateStdioSnippet(apiKey);
2074
+ return "Add this to your client config:\n\n" + generateStdioSnippet(apiKey, includeSonanceBrand);
1976
2075
  }
1977
2076
  }
1978
2077
 
@@ -2114,6 +2213,11 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
2114
2213
  description: m.description,
2115
2214
  authMode: m.authMode
2116
2215
  })),
2216
+ sonanceBrand: {
2217
+ name: SONANCE_BRAND_CONFIG.name,
2218
+ displayName: SONANCE_BRAND_CONFIG.displayName,
2219
+ description: SONANCE_BRAND_CONFIG.description
2220
+ },
2117
2221
  detectedClients: clients
2118
2222
  });
2119
2223
  return true;
@@ -2207,6 +2311,7 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
2207
2311
  const body = await parseBody(req);
2208
2312
  const clients = body.clients || [];
2209
2313
  const mcps = body.mcps || [...DEFAULT_MCPS];
2314
+ const includeSonanceBrand = body.includeSonanceBrand !== false;
2210
2315
  const apiKey = getState().apiKey;
2211
2316
  const results = [];
2212
2317
  for (const clientType of clients) {
@@ -2215,7 +2320,8 @@ async function handleApiRoute(path, searchParams, req, res, options, onComplete)
2215
2320
  clientType,
2216
2321
  options.serverUrl,
2217
2322
  apiKey,
2218
- mcps
2323
+ mcps,
2324
+ includeSonanceBrand
2219
2325
  );
2220
2326
  results.push({ client: clientType, success: true, message: msg });
2221
2327
  } catch (err2) {
@@ -4239,8 +4345,8 @@ program.command("disconnect <provider>").description("Remove your personal OAuth
4239
4345
  }
4240
4346
  });
4241
4347
  program.command("connect-mobile").description("Connect Cortex to Claude on mobile \u2014 opens setup page in browser").action(async () => {
4242
- const { DEFAULT_SERVER_URL: DEFAULT_SERVER_URL3 } = await import("./constants-QSLA3TAZ.js");
4243
- const { openBrowser: openBrowser2 } = await import("./browser-RCYYNQJN.js");
4348
+ const { DEFAULT_SERVER_URL: DEFAULT_SERVER_URL3 } = await import("./constants-76SAPZ3D.js");
4349
+ const { openBrowser: openBrowser2 } = await import("./browser-AJPM6AK7.js");
4244
4350
  const url = `${DEFAULT_SERVER_URL3}/connect`;
4245
4351
  console.log("\nOpening Cortex connect page...");
4246
4352
  console.log(` ${url}