whale-code 6.5.9 → 6.5.11
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.
- package/dist/cli/commands/doctor.js +1 -6
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/services/agent-loop-tools.js +1 -1
- package/dist/cli/services/agent-loop-tools.js.map +1 -1
- package/dist/cli/services/agent-loop.js +1 -1
- package/dist/cli/services/agent-loop.js.map +1 -1
- package/dist/cli/services/config-store.d.ts +8 -10
- package/dist/cli/services/config-store.js +10 -11
- package/dist/cli/services/config-store.js.map +1 -1
- package/dist/cli/setup/SetupApp.d.ts +2 -2
- package/dist/cli/setup/SetupApp.js +91 -254
- package/dist/cli/setup/SetupApp.js.map +1 -1
- package/dist/cli/status/StatusApp.js +3 -3
- package/dist/cli/status/StatusApp.js.map +1 -1
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/setup.js +5 -25
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-store.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","homedir","join","CONFIG_DIR","SESSION_PATH","PREFS_PATH","LEGACY_CONFIG_DIR","LEGACY_CONFIG_PATH","migrationChecked","ensureMigration","legacy","JSON","parse","recursive","mode","access_token","refresh_token","session","user_id","email","store_id","store_name","expires_at","stringify","encoding","prefs","default_model","thinking_enabled","undefined","permission_mode","platform_url","Object","keys","length","loadConfig","loadPreferences","err","console","error","Error","message","saveConfig","config","authFields","version","stores","updated_at","Math","floor","Date","now","newPrefs","savePreferences","updateConfig","partial","prefUpdates","existingSession","clearConfig","WHALE_SERVER_URL","DEFAULT_SUPABASE_URL","resolveConfig","file","supabaseUrl","process","env","SUPABASE_URL","supabase_url","supabaseKey","SUPABASE_SERVICE_ROLE_KEY","supabase_key","storeId","STORE_ID","anthropicApiKey","ANTHROPIC_API_KEY","anthropic_api_key","defaultAgentId","default_agent_id","serverUrl","platformUrl","WHALETOOLS_PLATFORM_URL","getConfigPath","getProxyUrl","DEFAULT_SUPABASE_ANON_KEY","resolveDefaultAgentId","_serverUrl","getToken","createClient","token","anonKey","SUPABASE_ANON_KEY","supabase","global","headers","Authorization","data","from","select","eq","order","ascending","limit","single","id"],"sources":["../../../src/cli/services/config-store.ts"],"sourcesContent":["/**\n * Config Store\n *\n * Unified auth session at ~/.whaletools/session.json\n * User preferences at ~/.whaletools/preferences.json\n *\n * v2.0: Raw Supabase/Anthropic keys (for MCP server env vars)\n * v2.1: Auth tokens from login flow (for CLI chat/status)\n * v4.0: Shared auth with Swift apps via ~/.whaletools/session.json\n *\n * Environment variables always override file-based config for MCP server mode.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface WhaleConfig {\n // v2.0 — MCP server mode (env var override)\n supabase_url?: string;\n supabase_key?: string; // service role key for MCP server\n anthropic_api_key?: string; // only used by MCP server setup\n default_agent_id?: string;\n\n // v2.1 — Auth mode (login flow)\n access_token?: string;\n refresh_token?: string;\n user_id?: string;\n email?: string;\n store_id?: string;\n store_name?: string;\n expires_at?: number; // unix epoch seconds\n\n // v3.0 — User preferences (persisted across sessions)\n default_model?: string; // model alias e.g. \"opus\", \"gemini-3-pro\"\n thinking_enabled?: boolean; // extended thinking toggle\n permission_mode?: string; // \"default\" | \"plan\" | \"yolo\"\n\n // v3.1 — Local agent (auto-spawned from MCP server)\n agent_api_key?: string; // store API key for local agent WebSocket auth\n\n // v3.2 — Browser OAuth\n platform_url?: string; // whaletools.dev override (dev/staging)\n\n // v4.0 — Multi-store support (from login flow)\n stores?: Array<{ id: string; name: string; role?: string }>;\n}\n\n/** Preferences that survive sign-out (stored in preferences.json) */\nexport interface WhalePreferences {\n default_model?: string;\n thinking_enabled?: boolean;\n permission_mode?: string;\n platform_url?: string;\n theme?: string;\n}\n\n// ============================================================================\n// PATHS\n// ============================================================================\n\nconst CONFIG_DIR = join(homedir(), \".whaletools\");\nconst SESSION_PATH = join(CONFIG_DIR, \"session.json\");\nconst PREFS_PATH = join(CONFIG_DIR, \"preferences.json\");\n\n// Legacy paths for migration\nconst LEGACY_CONFIG_DIR = join(homedir(), \".swagmanager\");\nconst LEGACY_CONFIG_PATH = join(LEGACY_CONFIG_DIR, \"config.json\");\n\n// ============================================================================\n// AUTO-MIGRATION from ~/.swagmanager to ~/.whaletools\n// ============================================================================\n\nlet migrationChecked = false;\n\nfunction ensureMigration(): void {\n if (migrationChecked) return;\n migrationChecked = true;\n\n // Skip if new session already exists\n if (existsSync(SESSION_PATH)) return;\n\n // Check for legacy config\n if (!existsSync(LEGACY_CONFIG_PATH)) return;\n\n try {\n const legacy: WhaleConfig = JSON.parse(readFileSync(LEGACY_CONFIG_PATH, \"utf-8\"));\n\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n\n // Split auth fields into session.json\n if (legacy.access_token && legacy.refresh_token) {\n const session: Partial<WhaleConfig> = {\n access_token: legacy.access_token,\n refresh_token: legacy.refresh_token,\n user_id: legacy.user_id,\n email: legacy.email,\n store_id: legacy.store_id,\n store_name: legacy.store_name,\n expires_at: legacy.expires_at,\n };\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n }\n\n // Split preference fields into preferences.json\n const prefs: WhalePreferences = {};\n if (legacy.default_model) prefs.default_model = legacy.default_model;\n if (legacy.thinking_enabled !== undefined) prefs.thinking_enabled = legacy.thinking_enabled;\n if (legacy.permission_mode) prefs.permission_mode = legacy.permission_mode;\n if (legacy.platform_url) prefs.platform_url = legacy.platform_url;\n\n if (Object.keys(prefs).length > 0) {\n writeFileSync(PREFS_PATH, JSON.stringify(prefs, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n }\n } catch {\n // Migration failed — not fatal, user can re-login\n }\n}\n\n// ============================================================================\n// READ / WRITE — session.json (auth tokens + store)\n// ============================================================================\n\nexport function loadConfig(): WhaleConfig {\n ensureMigration();\n try {\n if (existsSync(SESSION_PATH)) {\n const session = JSON.parse(readFileSync(SESSION_PATH, \"utf-8\"));\n // Merge preferences so callers see a unified config\n const prefs = loadPreferences();\n return { ...prefs, ...session };\n }\n } catch (err) {\n console.error(`[config] Warning: Failed to parse ${SESSION_PATH}: ${err instanceof Error ? err.message : err}`);\n console.error(\"[config] Using empty config. You may need to re-login with: whale login\");\n }\n // Even if no session, return preferences\n return { ...loadPreferences() };\n}\n\nexport function saveConfig(config: WhaleConfig): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n\n // Split: auth fields go to session.json, prefs go to preferences.json\n const { default_model, thinking_enabled, permission_mode, platform_url, ...authFields } = config;\n // Ensure fields required by Swift WhaleSession are present\n const session = {\n version: 2,\n ...authFields,\n stores: authFields.stores ?? [],\n updated_at: Math.floor(Date.now() / 1000),\n };\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n\n // Update preferences if any pref fields are present\n const newPrefs: WhalePreferences = {};\n if (default_model !== undefined) newPrefs.default_model = default_model;\n if (thinking_enabled !== undefined) newPrefs.thinking_enabled = thinking_enabled;\n if (permission_mode !== undefined) newPrefs.permission_mode = permission_mode;\n if (platform_url !== undefined) newPrefs.platform_url = platform_url;\n if (Object.keys(newPrefs).length > 0) {\n savePreferences({ ...loadPreferences(), ...newPrefs });\n }\n}\n\nexport function updateConfig(partial: Partial<WhaleConfig>): void {\n // Only write the fields that are actually being changed.\n // Split into auth fields (session.json) and pref fields (preferences.json)\n // to avoid stale in-memory values overwriting the file.\n const { default_model, thinking_enabled, permission_mode, platform_url, ...authFields } = partial;\n\n // Update preferences.json — merge only the provided pref fields\n const prefUpdates: WhalePreferences = {};\n if (default_model !== undefined) prefUpdates.default_model = default_model;\n if (thinking_enabled !== undefined) prefUpdates.thinking_enabled = thinking_enabled;\n if (permission_mode !== undefined) prefUpdates.permission_mode = permission_mode;\n if (platform_url !== undefined) prefUpdates.platform_url = platform_url;\n if (Object.keys(prefUpdates).length > 0) {\n savePreferences({ ...loadPreferences(), ...prefUpdates });\n }\n\n // Update session.json — merge only the provided auth fields\n if (Object.keys(authFields).length > 0) {\n const existingSession = (() => {\n try {\n if (existsSync(SESSION_PATH)) return JSON.parse(readFileSync(SESSION_PATH, \"utf-8\"));\n } catch { /* ignore */ }\n return {};\n })();\n const session = { version: 2, ...existingSession, ...authFields, updated_at: Math.floor(Date.now() / 1000) };\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n }\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(SESSION_PATH)) unlinkSync(SESSION_PATH);\n } catch { /* ignore */ }\n // Preferences are preserved across sign-out\n}\n\n// ============================================================================\n// READ / WRITE — preferences.json (survives sign-out)\n// ============================================================================\n\nexport function loadPreferences(): WhalePreferences {\n try {\n if (existsSync(PREFS_PATH)) {\n return JSON.parse(readFileSync(PREFS_PATH, \"utf-8\"));\n }\n } catch { /* ignore */ }\n return {};\n}\n\nexport function savePreferences(prefs: WhalePreferences): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n writeFileSync(PREFS_PATH, JSON.stringify(prefs, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\n// ============================================================================\n// RESOLVED CONFIG (env vars override file — used by MCP server)\n// ============================================================================\n\nexport interface ResolvedConfig {\n supabaseUrl: string;\n supabaseKey: string;\n storeId: string;\n anthropicApiKey: string;\n defaultAgentId: string;\n serverUrl: string;\n platformUrl: string;\n}\n\n/** Default Fly.io agent server URL */\nexport const WHALE_SERVER_URL = \"https://whale-agent.fly.dev\";\n\n/** Default Supabase URL — fallback when env var and config are both empty */\nconst DEFAULT_SUPABASE_URL = \"https://uaednwpxursknmwdeejn.supabase.co\";\n\nexport function resolveConfig(): ResolvedConfig {\n const file = loadConfig();\n return {\n supabaseUrl: process.env.SUPABASE_URL || file.supabase_url || DEFAULT_SUPABASE_URL,\n // User JWT preferred over legacy service role key from config file;\n // env var SUPABASE_SERVICE_ROLE_KEY still wins (explicit MCP setup)\n supabaseKey: process.env.SUPABASE_SERVICE_ROLE_KEY || file.access_token || file.supabase_key || \"\",\n storeId: process.env.STORE_ID || file.store_id || \"\",\n anthropicApiKey: process.env.ANTHROPIC_API_KEY || file.anthropic_api_key || \"\",\n defaultAgentId: file.default_agent_id || \"\",\n serverUrl: process.env.WHALE_SERVER_URL || WHALE_SERVER_URL,\n platformUrl: process.env.WHALETOOLS_PLATFORM_URL || file.platform_url || \"https://whaletools.dev\",\n };\n}\n\nexport function getConfigPath(): string {\n return SESSION_PATH;\n}\n\n/** Lazy proxy URL — avoids reading config at import time */\nexport function getProxyUrl(): string {\n return resolveConfig().serverUrl;\n}\n\n/** Default Supabase anon key — used for client-side queries */\nconst DEFAULT_SUPABASE_ANON_KEY = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVhZWRud3B4dXJza25td2RlZWpuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjA5OTcyMzMsImV4cCI6MjA3NjU3MzIzM30.N8jPwlyCBB5KJB5I-XaK6m-mq88rSR445AWFJJmwRCg\";\n\n/**\n * Resolve default agent ID — queries ai_agent_config for the store's first\n * active agent if not already configured, then caches the result.\n */\nexport async function resolveDefaultAgentId(\n _serverUrl: string,\n storeId: string,\n getToken: () => Promise<string | null>,\n): Promise<string | null> {\n // Check cached value first\n const config = loadConfig();\n if (config.default_agent_id) return config.default_agent_id;\n\n try {\n const { createClient } = await import(\"@supabase/supabase-js\");\n const token = await getToken();\n if (!token) return null;\n\n const supabaseUrl = process.env.SUPABASE_URL || config.supabase_url || DEFAULT_SUPABASE_URL;\n const anonKey = process.env.SUPABASE_ANON_KEY || DEFAULT_SUPABASE_ANON_KEY;\n const supabase = createClient(supabaseUrl, anonKey, {\n global: { headers: { Authorization: `Bearer ${token}` } },\n });\n\n const { data } = await supabase\n .from(\"ai_agent_config\")\n .select(\"id\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true)\n .order(\"created_at\", { ascending: true })\n .limit(1)\n .single();\n\n if (!data?.id) return null;\n\n // Cache for next time\n updateConfig({ default_agent_id: data.id });\n return data.id;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"config-store.js","names":["existsSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","homedir","join","CONFIG_DIR","SESSION_PATH","PREFS_PATH","LEGACY_CONFIG_DIR","LEGACY_CONFIG_PATH","migrationChecked","ensureMigration","legacy","JSON","parse","recursive","mode","access_token","refresh_token","session","user_id","email","store_id","store_name","expires_at","stringify","encoding","prefs","default_model","thinking_enabled","undefined","permission_mode","platform_url","Object","keys","length","loadConfig","loadPreferences","err","console","error","Error","message","saveConfig","config","authFields","version","stores","updated_at","Math","floor","Date","now","newPrefs","savePreferences","updateConfig","partial","prefUpdates","existingSession","clearConfig","WHALE_SERVER_URL","DEFAULT_SUPABASE_URL","resolveConfig","file","supabaseUrl","process","env","SUPABASE_URL","supabaseKey","SUPABASE_SERVICE_ROLE_KEY","storeId","STORE_ID","defaultAgentId","default_agent_id","serverUrl","platformUrl","WHALETOOLS_PLATFORM_URL","getConfigPath","getProxyUrl","DEFAULT_SUPABASE_ANON_KEY","resolveDefaultAgentId","_serverUrl","getToken","createClient","token","anonKey","SUPABASE_ANON_KEY","supabase","global","headers","Authorization","data","from","select","eq","order","ascending","limit","single","id"],"sources":["../../../src/cli/services/config-store.ts"],"sourcesContent":["/**\n * Config Store\n *\n * Unified auth session at ~/.whaletools/session.json\n * User preferences at ~/.whaletools/preferences.json\n *\n * Platform credentials (Supabase URL, anon key) are built-in constants —\n * users never need to provide API keys. Authentication is handled by\n * `whale login` (browser OAuth → JWT stored in session.json).\n *\n * Environment variables (SUPABASE_SERVICE_ROLE_KEY, etc.) are only for\n * dev/self-hosted deployments and override the built-in defaults.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface WhaleConfig {\n // Auth tokens (from `whale login` browser OAuth flow)\n access_token?: string;\n refresh_token?: string;\n user_id?: string;\n email?: string;\n store_id?: string;\n store_name?: string;\n expires_at?: number; // unix epoch seconds\n\n // Agent config\n default_agent_id?: string;\n agent_api_key?: string; // store API key for local agent WebSocket auth\n\n // User preferences (persisted across sessions)\n default_model?: string; // model alias e.g. \"opus\", \"gemini-3-pro\"\n thinking_enabled?: boolean; // extended thinking toggle\n permission_mode?: string; // \"default\" | \"plan\" | \"yolo\"\n\n // Browser OAuth\n platform_url?: string; // whaletools.dev override (dev/staging)\n\n // Multi-store support (from login flow)\n stores?: Array<{ id: string; name: string; role?: string }>;\n}\n\n/** Preferences that survive sign-out (stored in preferences.json) */\nexport interface WhalePreferences {\n default_model?: string;\n thinking_enabled?: boolean;\n permission_mode?: string;\n platform_url?: string;\n theme?: string;\n}\n\n// ============================================================================\n// PATHS\n// ============================================================================\n\nconst CONFIG_DIR = join(homedir(), \".whaletools\");\nconst SESSION_PATH = join(CONFIG_DIR, \"session.json\");\nconst PREFS_PATH = join(CONFIG_DIR, \"preferences.json\");\n\n// Legacy paths for migration\nconst LEGACY_CONFIG_DIR = join(homedir(), \".swagmanager\");\nconst LEGACY_CONFIG_PATH = join(LEGACY_CONFIG_DIR, \"config.json\");\n\n// ============================================================================\n// AUTO-MIGRATION from ~/.swagmanager to ~/.whaletools\n// ============================================================================\n\nlet migrationChecked = false;\n\nfunction ensureMigration(): void {\n if (migrationChecked) return;\n migrationChecked = true;\n\n // Skip if new session already exists\n if (existsSync(SESSION_PATH)) return;\n\n // Check for legacy config\n if (!existsSync(LEGACY_CONFIG_PATH)) return;\n\n try {\n const legacy: WhaleConfig = JSON.parse(readFileSync(LEGACY_CONFIG_PATH, \"utf-8\"));\n\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n\n // Split auth fields into session.json\n if (legacy.access_token && legacy.refresh_token) {\n const session: Partial<WhaleConfig> = {\n access_token: legacy.access_token,\n refresh_token: legacy.refresh_token,\n user_id: legacy.user_id,\n email: legacy.email,\n store_id: legacy.store_id,\n store_name: legacy.store_name,\n expires_at: legacy.expires_at,\n };\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n }\n\n // Split preference fields into preferences.json\n const prefs: WhalePreferences = {};\n if (legacy.default_model) prefs.default_model = legacy.default_model;\n if (legacy.thinking_enabled !== undefined) prefs.thinking_enabled = legacy.thinking_enabled;\n if (legacy.permission_mode) prefs.permission_mode = legacy.permission_mode;\n if (legacy.platform_url) prefs.platform_url = legacy.platform_url;\n\n if (Object.keys(prefs).length > 0) {\n writeFileSync(PREFS_PATH, JSON.stringify(prefs, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n }\n } catch {\n // Migration failed — not fatal, user can re-login\n }\n}\n\n// ============================================================================\n// READ / WRITE — session.json (auth tokens + store)\n// ============================================================================\n\nexport function loadConfig(): WhaleConfig {\n ensureMigration();\n try {\n if (existsSync(SESSION_PATH)) {\n const session = JSON.parse(readFileSync(SESSION_PATH, \"utf-8\"));\n // Merge preferences so callers see a unified config\n const prefs = loadPreferences();\n return { ...prefs, ...session };\n }\n } catch (err) {\n console.error(`[config] Warning: Failed to parse ${SESSION_PATH}: ${err instanceof Error ? err.message : err}`);\n console.error(\"[config] Using empty config. You may need to re-login with: whale login\");\n }\n // Even if no session, return preferences\n return { ...loadPreferences() };\n}\n\nexport function saveConfig(config: WhaleConfig): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n\n // Split: auth fields go to session.json, prefs go to preferences.json\n const { default_model, thinking_enabled, permission_mode, platform_url, ...authFields } = config;\n // Ensure fields required by Swift WhaleSession are present\n const session = {\n version: 2,\n ...authFields,\n stores: authFields.stores ?? [],\n updated_at: Math.floor(Date.now() / 1000),\n };\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n\n // Update preferences if any pref fields are present\n const newPrefs: WhalePreferences = {};\n if (default_model !== undefined) newPrefs.default_model = default_model;\n if (thinking_enabled !== undefined) newPrefs.thinking_enabled = thinking_enabled;\n if (permission_mode !== undefined) newPrefs.permission_mode = permission_mode;\n if (platform_url !== undefined) newPrefs.platform_url = platform_url;\n if (Object.keys(newPrefs).length > 0) {\n savePreferences({ ...loadPreferences(), ...newPrefs });\n }\n}\n\nexport function updateConfig(partial: Partial<WhaleConfig>): void {\n // Only write the fields that are actually being changed.\n // Split into auth fields (session.json) and pref fields (preferences.json)\n // to avoid stale in-memory values overwriting the file.\n const { default_model, thinking_enabled, permission_mode, platform_url, ...authFields } = partial;\n\n // Update preferences.json — merge only the provided pref fields\n const prefUpdates: WhalePreferences = {};\n if (default_model !== undefined) prefUpdates.default_model = default_model;\n if (thinking_enabled !== undefined) prefUpdates.thinking_enabled = thinking_enabled;\n if (permission_mode !== undefined) prefUpdates.permission_mode = permission_mode;\n if (platform_url !== undefined) prefUpdates.platform_url = platform_url;\n if (Object.keys(prefUpdates).length > 0) {\n savePreferences({ ...loadPreferences(), ...prefUpdates });\n }\n\n // Update session.json — merge only the provided auth fields\n if (Object.keys(authFields).length > 0) {\n const existingSession = (() => {\n try {\n if (existsSync(SESSION_PATH)) return JSON.parse(readFileSync(SESSION_PATH, \"utf-8\"));\n } catch { /* ignore */ }\n return {};\n })();\n const session = { version: 2, ...existingSession, ...authFields, updated_at: Math.floor(Date.now() / 1000) };\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(SESSION_PATH, JSON.stringify(session, null, 2) + \"\\n\", { encoding: \"utf-8\", mode: 0o600 });\n }\n}\n\nexport function clearConfig(): void {\n try {\n if (existsSync(SESSION_PATH)) unlinkSync(SESSION_PATH);\n } catch { /* ignore */ }\n // Preferences are preserved across sign-out\n}\n\n// ============================================================================\n// READ / WRITE — preferences.json (survives sign-out)\n// ============================================================================\n\nexport function loadPreferences(): WhalePreferences {\n try {\n if (existsSync(PREFS_PATH)) {\n return JSON.parse(readFileSync(PREFS_PATH, \"utf-8\"));\n }\n } catch { /* ignore */ }\n return {};\n}\n\nexport function savePreferences(prefs: WhalePreferences): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n writeFileSync(PREFS_PATH, JSON.stringify(prefs, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\n// ============================================================================\n// RESOLVED CONFIG (env vars override file — used by MCP server)\n// ============================================================================\n\nexport interface ResolvedConfig {\n supabaseUrl: string;\n /** Service role key — only set via SUPABASE_SERVICE_ROLE_KEY env var (dev/self-hosted). Empty for normal users. */\n supabaseKey: string;\n storeId: string;\n defaultAgentId: string;\n serverUrl: string;\n platformUrl: string;\n}\n\n/** Default Fly.io agent server URL */\nexport const WHALE_SERVER_URL = \"https://whale-agent.fly.dev\";\n\n/** Built-in platform Supabase URL */\nconst DEFAULT_SUPABASE_URL = \"https://uaednwpxursknmwdeejn.supabase.co\";\n\nexport function resolveConfig(): ResolvedConfig {\n const file = loadConfig();\n return {\n supabaseUrl: process.env.SUPABASE_URL || DEFAULT_SUPABASE_URL,\n // Service role key — env var only, never from user config file\n supabaseKey: process.env.SUPABASE_SERVICE_ROLE_KEY || \"\",\n storeId: process.env.STORE_ID || file.store_id || \"\",\n defaultAgentId: file.default_agent_id || \"\",\n serverUrl: process.env.WHALE_SERVER_URL || WHALE_SERVER_URL,\n platformUrl: process.env.WHALETOOLS_PLATFORM_URL || file.platform_url || \"https://whaletools.dev\",\n };\n}\n\nexport function getConfigPath(): string {\n return SESSION_PATH;\n}\n\n/** Lazy proxy URL — avoids reading config at import time */\nexport function getProxyUrl(): string {\n return resolveConfig().serverUrl;\n}\n\n/** Default Supabase anon key — used for client-side queries */\nconst DEFAULT_SUPABASE_ANON_KEY = \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVhZWRud3B4dXJza25td2RlZWpuIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjA5OTcyMzMsImV4cCI6MjA3NjU3MzIzM30.N8jPwlyCBB5KJB5I-XaK6m-mq88rSR445AWFJJmwRCg\";\n\n/**\n * Resolve default agent ID — queries ai_agent_config for the store's first\n * active agent if not already configured, then caches the result.\n */\nexport async function resolveDefaultAgentId(\n _serverUrl: string,\n storeId: string,\n getToken: () => Promise<string | null>,\n): Promise<string | null> {\n // Check cached value first\n const config = loadConfig();\n if (config.default_agent_id) return config.default_agent_id;\n\n try {\n const { createClient } = await import(\"@supabase/supabase-js\");\n const token = await getToken();\n if (!token) return null;\n\n const supabaseUrl = process.env.SUPABASE_URL || DEFAULT_SUPABASE_URL;\n const anonKey = process.env.SUPABASE_ANON_KEY || DEFAULT_SUPABASE_ANON_KEY;\n const supabase = createClient(supabaseUrl, anonKey, {\n global: { headers: { Authorization: `Bearer ${token}` } },\n });\n\n const { data } = await supabase\n .from(\"ai_agent_config\")\n .select(\"id\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true)\n .order(\"created_at\", { ascending: true })\n .limit(1)\n .single();\n\n if (!data?.id) return null;\n\n // Cache for next time\n updateConfig({ default_agent_id: data.id });\n return data.id;\n } catch {\n return null;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,UAAU,EAAEC,SAAS,EAAEC,YAAY,EAAEC,aAAa,EAAEC,UAAU,QAAQ,IAAI;AACnF,SAASC,OAAO,QAAQ,IAAI;AAC5B,SAASC,IAAI,QAAQ,MAAM;;AAE3B;AACA;AACA;;AA4BA;;AASA;AACA;AACA;;AAEA,MAAMC,UAAU,GAAGD,IAAI,CAACD,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC;AACjD,MAAMG,YAAY,GAAGF,IAAI,CAACC,UAAU,EAAE,cAAc,CAAC;AACrD,MAAME,UAAU,GAAGH,IAAI,CAACC,UAAU,EAAE,kBAAkB,CAAC;;AAEvD;AACA,MAAMG,iBAAiB,GAAGJ,IAAI,CAACD,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC;AACzD,MAAMM,kBAAkB,GAAGL,IAAI,CAACI,iBAAiB,EAAE,aAAa,CAAC;;AAEjE;AACA;AACA;;AAEA,IAAIE,gBAAgB,GAAG,KAAK;AAE5B,SAASC,eAAeA,CAAA,EAAS;EAC/B,IAAID,gBAAgB,EAAE;EACtBA,gBAAgB,GAAG,IAAI;;EAEvB;EACA,IAAIZ,UAAU,CAACQ,YAAY,CAAC,EAAE;;EAE9B;EACA,IAAI,CAACR,UAAU,CAACW,kBAAkB,CAAC,EAAE;EAErC,IAAI;IACF,MAAMG,MAAmB,GAAGC,IAAI,CAACC,KAAK,CAACd,YAAY,CAACS,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEjF,IAAI,CAACX,UAAU,CAACO,UAAU,CAAC,EAAE;MAC3BN,SAAS,CAACM,UAAU,EAAE;QAAEU,SAAS,EAAE,IAAI;QAAEC,IAAI,EAAE;MAAM,CAAC,CAAC;IACzD;;IAEA;IACA,IAAIJ,MAAM,CAACK,YAAY,IAAIL,MAAM,CAACM,aAAa,EAAE;MAC/C,MAAMC,OAA6B,GAAG;QACpCF,YAAY,EAAEL,MAAM,CAACK,YAAY;QACjCC,aAAa,EAAEN,MAAM,CAACM,aAAa;QACnCE,OAAO,EAAER,MAAM,CAACQ,OAAO;QACvBC,KAAK,EAAET,MAAM,CAACS,KAAK;QACnBC,QAAQ,EAAEV,MAAM,CAACU,QAAQ;QACzBC,UAAU,EAAEX,MAAM,CAACW,UAAU;QAC7BC,UAAU,EAAEZ,MAAM,CAACY;MACrB,CAAC;MACDvB,aAAa,CAACK,YAAY,EAAEO,IAAI,CAACY,SAAS,CAACN,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACnEO,QAAQ,EAAE,OAAO;QACjBV,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;;IAEA;IACA,MAAMW,KAAuB,GAAG,CAAC,CAAC;IAClC,IAAIf,MAAM,CAACgB,aAAa,EAAED,KAAK,CAACC,aAAa,GAAGhB,MAAM,CAACgB,aAAa;IACpE,IAAIhB,MAAM,CAACiB,gBAAgB,KAAKC,SAAS,EAAEH,KAAK,CAACE,gBAAgB,GAAGjB,MAAM,CAACiB,gBAAgB;IAC3F,IAAIjB,MAAM,CAACmB,eAAe,EAAEJ,KAAK,CAACI,eAAe,GAAGnB,MAAM,CAACmB,eAAe;IAC1E,IAAInB,MAAM,CAACoB,YAAY,EAAEL,KAAK,CAACK,YAAY,GAAGpB,MAAM,CAACoB,YAAY;IAEjE,IAAIC,MAAM,CAACC,IAAI,CAACP,KAAK,CAAC,CAACQ,MAAM,GAAG,CAAC,EAAE;MACjClC,aAAa,CAACM,UAAU,EAAEM,IAAI,CAACY,SAAS,CAACE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC/DD,QAAQ,EAAE,OAAO;QACjBV,IAAI,EAAE;MACR,CAAC,CAAC;IACJ;EACF,CAAC,CAAC,MAAM;IACN;EAAA;AAEJ;;AAEA;AACA;AACA;;AAEA,OAAO,SAASoB,UAAUA,CAAA,EAAgB;EACxCzB,eAAe,CAAC,CAAC;EACjB,IAAI;IACF,IAAIb,UAAU,CAACQ,YAAY,CAAC,EAAE;MAC5B,MAAMa,OAAO,GAAGN,IAAI,CAACC,KAAK,CAACd,YAAY,CAACM,YAAY,EAAE,OAAO,CAAC,CAAC;MAC/D;MACA,MAAMqB,KAAK,GAAGU,eAAe,CAAC,CAAC;MAC/B,OAAO;QAAE,GAAGV,KAAK;QAAE,GAAGR;MAAQ,CAAC;IACjC;EACF,CAAC,CAAC,OAAOmB,GAAG,EAAE;IACZC,OAAO,CAACC,KAAK,CAAC,qCAAqClC,YAAY,KAAKgC,GAAG,YAAYG,KAAK,GAAGH,GAAG,CAACI,OAAO,GAAGJ,GAAG,EAAE,CAAC;IAC/GC,OAAO,CAACC,KAAK,CAAC,yEAAyE,CAAC;EAC1F;EACA;EACA,OAAO;IAAE,GAAGH,eAAe,CAAC;EAAE,CAAC;AACjC;AAEA,OAAO,SAASM,UAAUA,CAACC,MAAmB,EAAQ;EACpD,IAAI,CAAC9C,UAAU,CAACO,UAAU,CAAC,EAAE;IAC3BN,SAAS,CAACM,UAAU,EAAE;MAAEU,SAAS,EAAE,IAAI;MAAEC,IAAI,EAAE;IAAM,CAAC,CAAC;EACzD;;EAEA;EACA,MAAM;IAAEY,aAAa;IAAEC,gBAAgB;IAAEE,eAAe;IAAEC,YAAY;IAAE,GAAGa;EAAW,CAAC,GAAGD,MAAM;EAChG;EACA,MAAMzB,OAAO,GAAG;IACd2B,OAAO,EAAE,CAAC;IACV,GAAGD,UAAU;IACbE,MAAM,EAAEF,UAAU,CAACE,MAAM,IAAI,EAAE;IAC/BC,UAAU,EAAEC,IAAI,CAACC,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI;EAC1C,CAAC;EACDnD,aAAa,CAACK,YAAY,EAAEO,IAAI,CAACY,SAAS,CAACN,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;IACnEO,QAAQ,EAAE,OAAO;IACjBV,IAAI,EAAE;EACR,CAAC,CAAC;;EAEF;EACA,MAAMqC,QAA0B,GAAG,CAAC,CAAC;EACrC,IAAIzB,aAAa,KAAKE,SAAS,EAAEuB,QAAQ,CAACzB,aAAa,GAAGA,aAAa;EACvE,IAAIC,gBAAgB,KAAKC,SAAS,EAAEuB,QAAQ,CAACxB,gBAAgB,GAAGA,gBAAgB;EAChF,IAAIE,eAAe,KAAKD,SAAS,EAAEuB,QAAQ,CAACtB,eAAe,GAAGA,eAAe;EAC7E,IAAIC,YAAY,KAAKF,SAAS,EAAEuB,QAAQ,CAACrB,YAAY,GAAGA,YAAY;EACpE,IAAIC,MAAM,CAACC,IAAI,CAACmB,QAAQ,CAAC,CAAClB,MAAM,GAAG,CAAC,EAAE;IACpCmB,eAAe,CAAC;MAAE,GAAGjB,eAAe,CAAC,CAAC;MAAE,GAAGgB;IAAS,CAAC,CAAC;EACxD;AACF;AAEA,OAAO,SAASE,YAAYA,CAACC,OAA6B,EAAQ;EAChE;EACA;EACA;EACA,MAAM;IAAE5B,aAAa;IAAEC,gBAAgB;IAAEE,eAAe;IAAEC,YAAY;IAAE,GAAGa;EAAW,CAAC,GAAGW,OAAO;;EAEjG;EACA,MAAMC,WAA6B,GAAG,CAAC,CAAC;EACxC,IAAI7B,aAAa,KAAKE,SAAS,EAAE2B,WAAW,CAAC7B,aAAa,GAAGA,aAAa;EAC1E,IAAIC,gBAAgB,KAAKC,SAAS,EAAE2B,WAAW,CAAC5B,gBAAgB,GAAGA,gBAAgB;EACnF,IAAIE,eAAe,KAAKD,SAAS,EAAE2B,WAAW,CAAC1B,eAAe,GAAGA,eAAe;EAChF,IAAIC,YAAY,KAAKF,SAAS,EAAE2B,WAAW,CAACzB,YAAY,GAAGA,YAAY;EACvE,IAAIC,MAAM,CAACC,IAAI,CAACuB,WAAW,CAAC,CAACtB,MAAM,GAAG,CAAC,EAAE;IACvCmB,eAAe,CAAC;MAAE,GAAGjB,eAAe,CAAC,CAAC;MAAE,GAAGoB;IAAY,CAAC,CAAC;EAC3D;;EAEA;EACA,IAAIxB,MAAM,CAACC,IAAI,CAACW,UAAU,CAAC,CAACV,MAAM,GAAG,CAAC,EAAE;IACtC,MAAMuB,eAAe,GAAG,CAAC,MAAM;MAC7B,IAAI;QACF,IAAI5D,UAAU,CAACQ,YAAY,CAAC,EAAE,OAAOO,IAAI,CAACC,KAAK,CAACd,YAAY,CAACM,YAAY,EAAE,OAAO,CAAC,CAAC;MACtF,CAAC,CAAC,MAAM,CAAE;MACV,OAAO,CAAC,CAAC;IACX,CAAC,EAAE,CAAC;IACJ,MAAMa,OAAO,GAAG;MAAE2B,OAAO,EAAE,CAAC;MAAE,GAAGY,eAAe;MAAE,GAAGb,UAAU;MAAEG,UAAU,EAAEC,IAAI,CAACC,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI;IAAE,CAAC;IAC5G,IAAI,CAACtD,UAAU,CAACO,UAAU,CAAC,EAAEN,SAAS,CAACM,UAAU,EAAE;MAAEU,SAAS,EAAE,IAAI;MAAEC,IAAI,EAAE;IAAM,CAAC,CAAC;IACpFf,aAAa,CAACK,YAAY,EAAEO,IAAI,CAACY,SAAS,CAACN,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;MAAEO,QAAQ,EAAE,OAAO;MAAEV,IAAI,EAAE;IAAM,CAAC,CAAC;EAC1G;AACF;AAEA,OAAO,SAAS2C,WAAWA,CAAA,EAAS;EAClC,IAAI;IACF,IAAI7D,UAAU,CAACQ,YAAY,CAAC,EAAEJ,UAAU,CAACI,YAAY,CAAC;EACxD,CAAC,CAAC,MAAM,CAAE;EACV;AACF;;AAEA;AACA;AACA;;AAEA,OAAO,SAAS+B,eAAeA,CAAA,EAAqB;EAClD,IAAI;IACF,IAAIvC,UAAU,CAACS,UAAU,CAAC,EAAE;MAC1B,OAAOM,IAAI,CAACC,KAAK,CAACd,YAAY,CAACO,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD;EACF,CAAC,CAAC,MAAM,CAAE;EACV,OAAO,CAAC,CAAC;AACX;AAEA,OAAO,SAAS+C,eAAeA,CAAC3B,KAAuB,EAAQ;EAC7D,IAAI,CAAC7B,UAAU,CAACO,UAAU,CAAC,EAAE;IAC3BN,SAAS,CAACM,UAAU,EAAE;MAAEU,SAAS,EAAE,IAAI;MAAEC,IAAI,EAAE;IAAM,CAAC,CAAC;EACzD;EACAf,aAAa,CAACM,UAAU,EAAEM,IAAI,CAACY,SAAS,CAACE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;IAC/DD,QAAQ,EAAE,OAAO;IACjBV,IAAI,EAAE;EACR,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;;AAYA;AACA,OAAO,MAAM4C,gBAAgB,GAAG,6BAA6B;;AAE7D;AACA,MAAMC,oBAAoB,GAAG,0CAA0C;AAEvE,OAAO,SAASC,aAAaA,CAAA,EAAmB;EAC9C,MAAMC,IAAI,GAAG3B,UAAU,CAAC,CAAC;EACzB,OAAO;IACL4B,WAAW,EAAEC,OAAO,CAACC,GAAG,CAACC,YAAY,IAAIN,oBAAoB;IAC7D;IACAO,WAAW,EAAEH,OAAO,CAACC,GAAG,CAACG,yBAAyB,IAAI,EAAE;IACxDC,OAAO,EAAEL,OAAO,CAACC,GAAG,CAACK,QAAQ,IAAIR,IAAI,CAACzC,QAAQ,IAAI,EAAE;IACpDkD,cAAc,EAAET,IAAI,CAACU,gBAAgB,IAAI,EAAE;IAC3CC,SAAS,EAAET,OAAO,CAACC,GAAG,CAACN,gBAAgB,IAAIA,gBAAgB;IAC3De,WAAW,EAAEV,OAAO,CAACC,GAAG,CAACU,uBAAuB,IAAIb,IAAI,CAAC/B,YAAY,IAAI;EAC3E,CAAC;AACH;AAEA,OAAO,SAAS6C,aAAaA,CAAA,EAAW;EACtC,OAAOvE,YAAY;AACrB;;AAEA;AACA,OAAO,SAASwE,WAAWA,CAAA,EAAW;EACpC,OAAOhB,aAAa,CAAC,CAAC,CAACY,SAAS;AAClC;;AAEA;AACA,MAAMK,yBAAyB,GAAG,kNAAkN;;AAEpP;AACA;AACA;AACA;AACA,OAAO,eAAeC,qBAAqBA,CACzCC,UAAkB,EAClBX,OAAe,EACfY,QAAsC,EACd;EACxB;EACA,MAAMtC,MAAM,GAAGR,UAAU,CAAC,CAAC;EAC3B,IAAIQ,MAAM,CAAC6B,gBAAgB,EAAE,OAAO7B,MAAM,CAAC6B,gBAAgB;EAE3D,IAAI;IACF,MAAM;MAAEU;IAAa,CAAC,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC;IAC9D,MAAMC,KAAK,GAAG,MAAMF,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAACE,KAAK,EAAE,OAAO,IAAI;IAEvB,MAAMpB,WAAW,GAAGC,OAAO,CAACC,GAAG,CAACC,YAAY,IAAIN,oBAAoB;IACpE,MAAMwB,OAAO,GAAGpB,OAAO,CAACC,GAAG,CAACoB,iBAAiB,IAAIP,yBAAyB;IAC1E,MAAMQ,QAAQ,GAAGJ,YAAY,CAACnB,WAAW,EAAEqB,OAAO,EAAE;MAClDG,MAAM,EAAE;QAAEC,OAAO,EAAE;UAAEC,aAAa,EAAE,UAAUN,KAAK;QAAG;MAAE;IAC1D,CAAC,CAAC;IAEF,MAAM;MAAEO;IAAK,CAAC,GAAG,MAAMJ,QAAQ,CAC5BK,IAAI,CAAC,iBAAiB,CAAC,CACvBC,MAAM,CAAC,IAAI,CAAC,CACZC,EAAE,CAAC,UAAU,EAAExB,OAAO,CAAC,CACvBwB,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CACrBC,KAAK,CAAC,YAAY,EAAE;MAAEC,SAAS,EAAE;IAAK,CAAC,CAAC,CACxCC,KAAK,CAAC,CAAC,CAAC,CACRC,MAAM,CAAC,CAAC;IAEX,IAAI,CAACP,IAAI,EAAEQ,EAAE,EAAE,OAAO,IAAI;;IAE1B;IACA5C,YAAY,CAAC;MAAEkB,gBAAgB,EAAEkB,IAAI,CAACQ;IAAG,CAAC,CAAC;IAC3C,OAAOR,IAAI,CAACQ,EAAE;EAChB,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF","ignoreList":[]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Setup Wizard (Ink)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Detects installed MCP-compatible CLIs → registers whale-code as MCP server.
|
|
5
|
+
* No API keys needed — authentication is handled by `whale login` (browser OAuth).
|
|
6
6
|
*
|
|
7
7
|
* Usage: npx whale-code setup
|
|
8
8
|
*/
|
|
@@ -2,19 +2,17 @@ import { c as _c } from "react/compiler-runtime";
|
|
|
2
2
|
/**
|
|
3
3
|
* Setup Wizard (Ink)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Detects installed MCP-compatible CLIs → registers whale-code as MCP server.
|
|
6
|
+
* No API keys needed — authentication is handled by `whale login` (browser OAuth).
|
|
7
7
|
*
|
|
8
8
|
* Usage: npx whale-code setup
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import React, { useState, useEffect } from "react";
|
|
12
12
|
import { Box, Text, useApp, useInput } from "ink";
|
|
13
|
-
import TextInput from "ink-text-input";
|
|
14
13
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
15
14
|
import { homedir } from "os";
|
|
16
15
|
import { dirname, join } from "path";
|
|
17
|
-
import { saveConfig } from "../services/config-store.js";
|
|
18
16
|
import { colors, symbols } from "../shared/Theme.js";
|
|
19
17
|
|
|
20
18
|
// ============================================================================
|
|
@@ -70,7 +68,7 @@ function writeJSON(path, data) {
|
|
|
70
68
|
// ============================================================================
|
|
71
69
|
|
|
72
70
|
export function SetupApp() {
|
|
73
|
-
const $ = _c(
|
|
71
|
+
const $ = _c(36);
|
|
74
72
|
const {
|
|
75
73
|
exit
|
|
76
74
|
} = useApp();
|
|
@@ -83,10 +81,6 @@ export function SetupApp() {
|
|
|
83
81
|
t0 = $[0];
|
|
84
82
|
}
|
|
85
83
|
const [clis, setClis] = useState(t0);
|
|
86
|
-
const [supabaseUrl, setSupabaseUrl] = useState("");
|
|
87
|
-
const [supabaseKey, setSupabaseKey] = useState("");
|
|
88
|
-
const [storeId, setStoreId] = useState("");
|
|
89
|
-
const [anthropicKey, setAnthropicKey] = useState("");
|
|
90
84
|
let t1;
|
|
91
85
|
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
|
|
92
86
|
t1 = new Set();
|
|
@@ -96,7 +90,6 @@ export function SetupApp() {
|
|
|
96
90
|
}
|
|
97
91
|
const [selectedClis, setSelectedClis] = useState(t1);
|
|
98
92
|
const [installedCount, setInstalledCount] = useState(0);
|
|
99
|
-
const [inputValue, setInputValue] = useState("");
|
|
100
93
|
let t2;
|
|
101
94
|
let t3;
|
|
102
95
|
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
@@ -104,7 +97,7 @@ export function SetupApp() {
|
|
|
104
97
|
const detected = detectCLIs();
|
|
105
98
|
setClis(detected);
|
|
106
99
|
setSelectedClis(new Set(detected.filter(_temp).map(_temp2)));
|
|
107
|
-
const timer = setTimeout(() => setStep("
|
|
100
|
+
const timer = setTimeout(() => setStep("select_clis"), 50);
|
|
108
101
|
return () => clearTimeout(timer);
|
|
109
102
|
};
|
|
110
103
|
t3 = [];
|
|
@@ -135,64 +128,12 @@ export function SetupApp() {
|
|
|
135
128
|
}
|
|
136
129
|
useEffect(t4, t5);
|
|
137
130
|
let t6;
|
|
138
|
-
if ($[8] !==
|
|
139
|
-
t6 =
|
|
140
|
-
bb20: switch (step) {
|
|
141
|
-
case "supabase_url":
|
|
142
|
-
{
|
|
143
|
-
if (!value.trim()) {
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
setSupabaseUrl(value.trim());
|
|
147
|
-
setInputValue("");
|
|
148
|
-
setStep("supabase_key");
|
|
149
|
-
break bb20;
|
|
150
|
-
}
|
|
151
|
-
case "supabase_key":
|
|
152
|
-
{
|
|
153
|
-
if (!value.trim()) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
setSupabaseKey(value.trim());
|
|
157
|
-
setInputValue("");
|
|
158
|
-
setStep("store_id");
|
|
159
|
-
break bb20;
|
|
160
|
-
}
|
|
161
|
-
case "store_id":
|
|
162
|
-
{
|
|
163
|
-
setStoreId(value.trim());
|
|
164
|
-
setInputValue("");
|
|
165
|
-
setStep("anthropic_key");
|
|
166
|
-
break bb20;
|
|
167
|
-
}
|
|
168
|
-
case "anthropic_key":
|
|
169
|
-
{
|
|
170
|
-
setAnthropicKey(value.trim());
|
|
171
|
-
setInputValue("");
|
|
172
|
-
setStep("select_clis");
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
};
|
|
176
|
-
$[8] = step;
|
|
177
|
-
$[9] = t6;
|
|
178
|
-
} else {
|
|
179
|
-
t6 = $[9];
|
|
180
|
-
}
|
|
181
|
-
const handleSubmit = t6;
|
|
182
|
-
let t7;
|
|
183
|
-
if ($[10] !== anthropicKey || $[11] !== clis || $[12] !== selectedClis || $[13] !== storeId || $[14] !== supabaseKey || $[15] !== supabaseUrl) {
|
|
184
|
-
t7 = () => {
|
|
131
|
+
if ($[8] !== clis || $[9] !== selectedClis) {
|
|
132
|
+
t6 = () => {
|
|
185
133
|
const serverEntry = {
|
|
186
134
|
type: "stdio",
|
|
187
135
|
command: "npx",
|
|
188
|
-
args: ["-y", "whale-code"]
|
|
189
|
-
env: {
|
|
190
|
-
SUPABASE_URL: supabaseUrl,
|
|
191
|
-
SUPABASE_SERVICE_ROLE_KEY: supabaseKey,
|
|
192
|
-
...(storeId ? {
|
|
193
|
-
STORE_ID: storeId
|
|
194
|
-
} : {})
|
|
195
|
-
}
|
|
136
|
+
args: ["-y", "whale-code"]
|
|
196
137
|
};
|
|
197
138
|
let count = 0;
|
|
198
139
|
for (const cli of clis) {
|
|
@@ -207,69 +148,55 @@ export function SetupApp() {
|
|
|
207
148
|
writeJSON(cli.configPath, config);
|
|
208
149
|
count++;
|
|
209
150
|
}
|
|
210
|
-
saveConfig({
|
|
211
|
-
supabase_url: supabaseUrl,
|
|
212
|
-
supabase_key: supabaseKey,
|
|
213
|
-
...(storeId ? {
|
|
214
|
-
store_id: storeId
|
|
215
|
-
} : {}),
|
|
216
|
-
...(anthropicKey ? {
|
|
217
|
-
anthropic_api_key: anthropicKey
|
|
218
|
-
} : {})
|
|
219
|
-
});
|
|
220
151
|
setInstalledCount(count);
|
|
221
152
|
setStep("done");
|
|
222
153
|
};
|
|
223
|
-
$[
|
|
224
|
-
$[
|
|
225
|
-
$[
|
|
226
|
-
$[13] = storeId;
|
|
227
|
-
$[14] = supabaseKey;
|
|
228
|
-
$[15] = supabaseUrl;
|
|
229
|
-
$[16] = t7;
|
|
154
|
+
$[8] = clis;
|
|
155
|
+
$[9] = selectedClis;
|
|
156
|
+
$[10] = t6;
|
|
230
157
|
} else {
|
|
231
|
-
|
|
158
|
+
t6 = $[10];
|
|
232
159
|
}
|
|
233
|
-
const installToSelected =
|
|
234
|
-
let
|
|
235
|
-
if ($[
|
|
236
|
-
|
|
237
|
-
$[
|
|
238
|
-
$[
|
|
160
|
+
const installToSelected = t6;
|
|
161
|
+
let t7;
|
|
162
|
+
if ($[11] !== clis) {
|
|
163
|
+
t7 = clis.filter(_temp3);
|
|
164
|
+
$[11] = clis;
|
|
165
|
+
$[12] = t7;
|
|
239
166
|
} else {
|
|
240
|
-
|
|
167
|
+
t7 = $[12];
|
|
241
168
|
}
|
|
242
|
-
const detectedClis =
|
|
243
|
-
let
|
|
244
|
-
if ($[
|
|
245
|
-
|
|
169
|
+
const detectedClis = t7;
|
|
170
|
+
let t8;
|
|
171
|
+
if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
|
|
172
|
+
t8 = /*#__PURE__*/_jsx(Text, {
|
|
246
173
|
color: colors.brand,
|
|
247
174
|
bold: true,
|
|
248
175
|
children: "Whale MCP \u2014 Setup"
|
|
249
176
|
});
|
|
250
|
-
$[
|
|
177
|
+
$[13] = t8;
|
|
251
178
|
} else {
|
|
252
|
-
|
|
179
|
+
t8 = $[13];
|
|
253
180
|
}
|
|
254
181
|
let t10;
|
|
255
|
-
let
|
|
256
|
-
if ($[
|
|
257
|
-
|
|
182
|
+
let t9;
|
|
183
|
+
if ($[14] === Symbol.for("react.memo_cache_sentinel")) {
|
|
184
|
+
t9 = /*#__PURE__*/_jsx(Text, {
|
|
258
185
|
color: colors.dim,
|
|
259
186
|
children: symbols.divider.repeat(40)
|
|
260
187
|
});
|
|
261
|
-
|
|
188
|
+
t10 = /*#__PURE__*/_jsx(Box, {
|
|
262
189
|
height: 1
|
|
263
190
|
});
|
|
264
|
-
$[
|
|
265
|
-
$[
|
|
191
|
+
$[14] = t10;
|
|
192
|
+
$[15] = t9;
|
|
266
193
|
} else {
|
|
267
|
-
t10 = $[
|
|
268
|
-
|
|
194
|
+
t10 = $[14];
|
|
195
|
+
t9 = $[15];
|
|
269
196
|
}
|
|
270
|
-
let
|
|
271
|
-
if ($[
|
|
272
|
-
|
|
197
|
+
let t11;
|
|
198
|
+
if ($[16] !== clis) {
|
|
199
|
+
t11 = clis.length > 0 && /*#__PURE__*/_jsxs(Box, {
|
|
273
200
|
flexDirection: "column",
|
|
274
201
|
marginBottom: 1,
|
|
275
202
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
@@ -277,114 +204,30 @@ export function SetupApp() {
|
|
|
277
204
|
children: "Detected CLIs:"
|
|
278
205
|
}), clis.map(_temp4)]
|
|
279
206
|
});
|
|
280
|
-
$[
|
|
281
|
-
$[
|
|
207
|
+
$[16] = clis;
|
|
208
|
+
$[17] = t11;
|
|
282
209
|
} else {
|
|
283
|
-
|
|
210
|
+
t11 = $[17];
|
|
284
211
|
}
|
|
212
|
+
let t12;
|
|
285
213
|
let t13;
|
|
286
|
-
if ($[
|
|
287
|
-
|
|
288
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
289
|
-
color: colors.text,
|
|
290
|
-
children: "Supabase URL: "
|
|
291
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
292
|
-
value: inputValue,
|
|
293
|
-
onChange: setInputValue,
|
|
294
|
-
onSubmit: handleSubmit
|
|
295
|
-
})]
|
|
296
|
-
});
|
|
297
|
-
$[24] = handleSubmit;
|
|
298
|
-
$[25] = inputValue;
|
|
299
|
-
$[26] = step;
|
|
300
|
-
$[27] = t13;
|
|
301
|
-
} else {
|
|
302
|
-
t13 = $[27];
|
|
303
|
-
}
|
|
304
|
-
let t14;
|
|
305
|
-
if ($[28] !== step || $[29] !== supabaseUrl) {
|
|
306
|
-
t14 = step !== "supabase_url" && supabaseUrl && /*#__PURE__*/_jsxs(Text, {
|
|
214
|
+
if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
|
|
215
|
+
t12 = /*#__PURE__*/_jsx(Text, {
|
|
307
216
|
color: colors.muted,
|
|
308
|
-
children:
|
|
217
|
+
children: "No API keys required \u2014 run `whale login` after setup to authenticate."
|
|
309
218
|
});
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
$[30] = t14;
|
|
313
|
-
} else {
|
|
314
|
-
t14 = $[30];
|
|
315
|
-
}
|
|
316
|
-
let t15;
|
|
317
|
-
if ($[31] !== handleSubmit || $[32] !== inputValue || $[33] !== step) {
|
|
318
|
-
t15 = step === "supabase_key" && /*#__PURE__*/_jsxs(Box, {
|
|
319
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
320
|
-
color: colors.text,
|
|
321
|
-
children: "Service Role Key: "
|
|
322
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
323
|
-
value: inputValue,
|
|
324
|
-
onChange: setInputValue,
|
|
325
|
-
onSubmit: handleSubmit
|
|
326
|
-
})]
|
|
327
|
-
});
|
|
328
|
-
$[31] = handleSubmit;
|
|
329
|
-
$[32] = inputValue;
|
|
330
|
-
$[33] = step;
|
|
331
|
-
$[34] = t15;
|
|
332
|
-
} else {
|
|
333
|
-
t15 = $[34];
|
|
334
|
-
}
|
|
335
|
-
let t16;
|
|
336
|
-
if ($[35] !== step || $[36] !== supabaseKey) {
|
|
337
|
-
t16 = step !== "supabase_key" && step !== "supabase_url" && supabaseKey && /*#__PURE__*/_jsxs(Text, {
|
|
338
|
-
color: colors.muted,
|
|
339
|
-
children: ["Service Role Key: ", symbols.check, " Set"]
|
|
340
|
-
});
|
|
341
|
-
$[35] = step;
|
|
342
|
-
$[36] = supabaseKey;
|
|
343
|
-
$[37] = t16;
|
|
344
|
-
} else {
|
|
345
|
-
t16 = $[37];
|
|
346
|
-
}
|
|
347
|
-
let t17;
|
|
348
|
-
if ($[38] !== handleSubmit || $[39] !== inputValue || $[40] !== step) {
|
|
349
|
-
t17 = step === "store_id" && /*#__PURE__*/_jsxs(Box, {
|
|
350
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
351
|
-
color: colors.text,
|
|
352
|
-
children: "Store ID (optional, enter to skip): "
|
|
353
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
354
|
-
value: inputValue,
|
|
355
|
-
onChange: setInputValue,
|
|
356
|
-
onSubmit: handleSubmit
|
|
357
|
-
})]
|
|
358
|
-
});
|
|
359
|
-
$[38] = handleSubmit;
|
|
360
|
-
$[39] = inputValue;
|
|
361
|
-
$[40] = step;
|
|
362
|
-
$[41] = t17;
|
|
363
|
-
} else {
|
|
364
|
-
t17 = $[41];
|
|
365
|
-
}
|
|
366
|
-
let t18;
|
|
367
|
-
if ($[42] !== handleSubmit || $[43] !== inputValue || $[44] !== step) {
|
|
368
|
-
t18 = step === "anthropic_key" && /*#__PURE__*/_jsxs(Box, {
|
|
369
|
-
children: [/*#__PURE__*/_jsx(Text, {
|
|
370
|
-
color: colors.text,
|
|
371
|
-
children: "Anthropic API Key (for chat mode, enter to skip): "
|
|
372
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
373
|
-
value: inputValue,
|
|
374
|
-
onChange: setInputValue,
|
|
375
|
-
onSubmit: handleSubmit
|
|
376
|
-
})]
|
|
219
|
+
t13 = /*#__PURE__*/_jsx(Box, {
|
|
220
|
+
height: 1
|
|
377
221
|
});
|
|
378
|
-
$[
|
|
379
|
-
$[
|
|
380
|
-
$[44] = step;
|
|
381
|
-
$[45] = t18;
|
|
222
|
+
$[18] = t12;
|
|
223
|
+
$[19] = t13;
|
|
382
224
|
} else {
|
|
383
|
-
|
|
225
|
+
t12 = $[18];
|
|
226
|
+
t13 = $[19];
|
|
384
227
|
}
|
|
385
|
-
let
|
|
386
|
-
if ($[
|
|
387
|
-
|
|
228
|
+
let t14;
|
|
229
|
+
if ($[20] !== detectedClis || $[21] !== installToSelected || $[22] !== selectedClis || $[23] !== step) {
|
|
230
|
+
t14 = step === "select_clis" && detectedClis.length > 0 && /*#__PURE__*/_jsxs(Box, {
|
|
388
231
|
flexDirection: "column",
|
|
389
232
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
390
233
|
color: colors.text,
|
|
@@ -408,35 +251,39 @@ export function SetupApp() {
|
|
|
408
251
|
onConfirm: installToSelected
|
|
409
252
|
})]
|
|
410
253
|
});
|
|
411
|
-
$[
|
|
412
|
-
$[
|
|
413
|
-
$[
|
|
414
|
-
$[
|
|
415
|
-
$[
|
|
254
|
+
$[20] = detectedClis;
|
|
255
|
+
$[21] = installToSelected;
|
|
256
|
+
$[22] = selectedClis;
|
|
257
|
+
$[23] = step;
|
|
258
|
+
$[24] = t14;
|
|
416
259
|
} else {
|
|
417
|
-
|
|
260
|
+
t14 = $[24];
|
|
418
261
|
}
|
|
419
|
-
let
|
|
420
|
-
if ($[
|
|
421
|
-
|
|
262
|
+
let t15;
|
|
263
|
+
if ($[25] !== detectedClis || $[26] !== step) {
|
|
264
|
+
t15 = step === "select_clis" && detectedClis.length === 0 && /*#__PURE__*/_jsxs(Box, {
|
|
422
265
|
flexDirection: "column",
|
|
423
266
|
children: [/*#__PURE__*/_jsx(Text, {
|
|
424
267
|
color: colors.warning,
|
|
425
|
-
children: "No MCP clients detected.
|
|
268
|
+
children: "No MCP clients detected."
|
|
269
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
270
|
+
color: colors.muted,
|
|
271
|
+
children: "Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first."
|
|
426
272
|
}), /*#__PURE__*/_jsx(ConfirmButton, {
|
|
427
|
-
onConfirm:
|
|
273
|
+
onConfirm: () => {
|
|
274
|
+
setStep("done");
|
|
275
|
+
}
|
|
428
276
|
})]
|
|
429
277
|
});
|
|
430
|
-
$[
|
|
431
|
-
$[
|
|
432
|
-
$[
|
|
433
|
-
$[54] = t20;
|
|
278
|
+
$[25] = detectedClis;
|
|
279
|
+
$[26] = step;
|
|
280
|
+
$[27] = t15;
|
|
434
281
|
} else {
|
|
435
|
-
|
|
282
|
+
t15 = $[27];
|
|
436
283
|
}
|
|
437
|
-
let
|
|
438
|
-
if ($[
|
|
439
|
-
|
|
284
|
+
let t16;
|
|
285
|
+
if ($[28] !== installedCount || $[29] !== step) {
|
|
286
|
+
t16 = step === "done" && /*#__PURE__*/_jsxs(Box, {
|
|
440
287
|
flexDirection: "column",
|
|
441
288
|
children: [/*#__PURE__*/_jsx(Box, {
|
|
442
289
|
height: 1
|
|
@@ -449,41 +296,31 @@ export function SetupApp() {
|
|
|
449
296
|
children: ["Installed to ", installedCount, " CLI", installedCount > 1 ? "s" : "", ". Restart to load."]
|
|
450
297
|
}), /*#__PURE__*/_jsx(Text, {
|
|
451
298
|
color: colors.muted,
|
|
452
|
-
children: "
|
|
453
|
-
}), anthropicKey && /*#__PURE__*/_jsx(Text, {
|
|
454
|
-
color: colors.muted,
|
|
455
|
-
children: "Chat mode ready: npx whale-code chat"
|
|
299
|
+
children: "Run `whale login` to authenticate with your WhaleTools account."
|
|
456
300
|
})]
|
|
457
301
|
});
|
|
458
|
-
$[
|
|
459
|
-
$[
|
|
460
|
-
$[
|
|
461
|
-
$[58] = t21;
|
|
302
|
+
$[28] = installedCount;
|
|
303
|
+
$[29] = step;
|
|
304
|
+
$[30] = t16;
|
|
462
305
|
} else {
|
|
463
|
-
|
|
306
|
+
t16 = $[30];
|
|
464
307
|
}
|
|
465
|
-
let
|
|
466
|
-
if ($[
|
|
467
|
-
|
|
308
|
+
let t17;
|
|
309
|
+
if ($[31] !== t11 || $[32] !== t14 || $[33] !== t15 || $[34] !== t16) {
|
|
310
|
+
t17 = /*#__PURE__*/_jsxs(Box, {
|
|
468
311
|
flexDirection: "column",
|
|
469
312
|
padding: 1,
|
|
470
|
-
children: [t9, t10, t11, t12, t13, t14, t15, t16
|
|
313
|
+
children: [t8, t9, t10, t11, t12, t13, t14, t15, t16]
|
|
471
314
|
});
|
|
472
|
-
$[
|
|
473
|
-
$[
|
|
474
|
-
$[
|
|
475
|
-
$[
|
|
476
|
-
$[
|
|
477
|
-
$[64] = t17;
|
|
478
|
-
$[65] = t18;
|
|
479
|
-
$[66] = t19;
|
|
480
|
-
$[67] = t20;
|
|
481
|
-
$[68] = t21;
|
|
482
|
-
$[69] = t22;
|
|
315
|
+
$[31] = t11;
|
|
316
|
+
$[32] = t14;
|
|
317
|
+
$[33] = t15;
|
|
318
|
+
$[34] = t16;
|
|
319
|
+
$[35] = t17;
|
|
483
320
|
} else {
|
|
484
|
-
|
|
321
|
+
t17 = $[35];
|
|
485
322
|
}
|
|
486
|
-
return
|
|
323
|
+
return t17;
|
|
487
324
|
}
|
|
488
325
|
function _temp4(cli_0) {
|
|
489
326
|
return /*#__PURE__*/_jsxs(Text, {
|
|
@@ -628,7 +465,7 @@ function ConfirmButton(t0) {
|
|
|
628
465
|
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
629
466
|
t2 = /*#__PURE__*/_jsx(Text, {
|
|
630
467
|
color: colors.muted,
|
|
631
|
-
children: "Press Enter to
|
|
468
|
+
children: "Press Enter to continue..."
|
|
632
469
|
});
|
|
633
470
|
$[2] = t2;
|
|
634
471
|
} else {
|