whale-code 6.5.9 → 6.5.10

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.
@@ -250,9 +250,8 @@ export function resolveConfig() {
250
250
  const file = loadConfig();
251
251
  return {
252
252
  supabaseUrl: process.env.SUPABASE_URL || file.supabase_url || DEFAULT_SUPABASE_URL,
253
- // User JWT preferred over legacy service role key from config file;
254
- // env var SUPABASE_SERVICE_ROLE_KEY still wins (explicit MCP setup)
255
- supabaseKey: process.env.SUPABASE_SERVICE_ROLE_KEY || file.access_token || file.supabase_key || "",
253
+ // Service role key only user JWTs go through getValidToken() in auth-service
254
+ supabaseKey: process.env.SUPABASE_SERVICE_ROLE_KEY || file.supabase_key || "",
256
255
  storeId: process.env.STORE_ID || file.store_id || "",
257
256
  anthropicApiKey: process.env.ANTHROPIC_API_KEY || file.anthropic_api_key || "",
258
257
  defaultAgentId: file.default_agent_id || "",
@@ -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","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 // Service role key only — user JWTs go through getValidToken() in auth-service\n supabaseKey: process.env.SUPABASE_SERVICE_ROLE_KEY || 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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whale-code",
3
- "version": "6.5.9",
3
+ "version": "6.5.10",
4
4
  "description": "whale code — local-first AI agent CLI for inventory, orders, and analytics powered by MCP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",