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":"SetupApp.js","names":["React","useState","useEffect","Box","Text","useApp","useInput","TextInput","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","saveConfig","colors","symbols","jsx","_jsx","jsxs","_jsxs","home","detectCLIs","name","configPath","configKey","detected","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","SetupApp","$","_c","exit","step","setStep","t0","Symbol","for","clis","setClis","supabaseUrl","setSupabaseUrl","supabaseKey","setSupabaseKey","storeId","setStoreId","anthropicKey","setAnthropicKey","t1","Set","selectedClis","setSelectedClis","installedCount","setInstalledCount","inputValue","setInputValue","t2","t3","filter","_temp","map","_temp2","timer","setTimeout","clearTimeout","t4","t5","timer_0","t6","value","bb20","trim","handleSubmit","t7","serverEntry","type","command","args","env","SUPABASE_URL","SUPABASE_SERVICE_ROLE_KEY","STORE_ID","count","cli","has","config","whale","supabase_url","supabase_key","store_id","anthropic_api_key","installToSelected","t8","_temp3","detectedClis","t9","color","brand","bold","children","t10","t11","dim","divider","repeat","height","t12","length","flexDirection","marginBottom","muted","_temp4","t13","text","t14","slice","t15","t16","check","t17","t18","t19","CLISelector","onToggle","prev","next","delete","add","t20","warning","ConfirmButton","t21","success","t22","padding","cli_0","cross","c_1","c","c_0","selected","onConfirm","cursor","setCursor","input","key","upArrow","_temp5","downArrow","Math","min","return","i","chevron","arrow","max","_input"],"sources":["../../../src/cli/setup/SetupApp.tsx"],"sourcesContent":["/**\n * Setup Wizard (Ink)\n *\n * Step-by-step wizard: detect CLIs → collect Supabase creds → collect Anthropic key\n * → pick CLIs to install → write configs + ~/.whale/config.json\n *\n * Usage: npx whale-code setup\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport SelectInput from \"ink-select-input\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { saveConfig } from \"../services/config-store.js\";\nimport { colors, symbols } from \"../shared/Theme.js\";\n\n// ============================================================================\n// CLI TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string;\n detected: boolean;\n}\n\nconst home = homedir();\n\nfunction detectCLIs(): CLITarget[] {\n return [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".claude\")),\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".cursor\")),\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".codeium\", \"windsurf\")),\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".gemini\")),\n },\n ];\n}\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ============================================================================\n// STEPS\n// ============================================================================\n\ntype Step = \"detect\" | \"supabase_url\" | \"supabase_key\" | \"store_id\" | \"anthropic_key\" | \"select_clis\" | \"done\";\n\nexport function SetupApp() {\n const { exit } = useApp();\n const [step, setStep] = useState<Step>(\"detect\");\n const [clis, setClis] = useState<CLITarget[]>([]);\n const [supabaseUrl, setSupabaseUrl] = useState(\"\");\n const [supabaseKey, setSupabaseKey] = useState(\"\");\n const [storeId, setStoreId] = useState(\"\");\n const [anthropicKey, setAnthropicKey] = useState(\"\");\n const [selectedClis, setSelectedClis] = useState<Set<string>>(new Set());\n const [installedCount, setInstalledCount] = useState(0);\n const [inputValue, setInputValue] = useState(\"\");\n\n // Detect CLIs on mount\n useEffect(() => {\n const detected = detectCLIs();\n setClis(detected);\n // Pre-select all detected CLIs\n setSelectedClis(new Set(detected.filter(c => c.detected).map(c => c.name)));\n // Skip detection screen, go straight to input\n const timer = setTimeout(() => setStep(\"supabase_url\"), 50);\n return () => clearTimeout(timer);\n }, []);\n\n // Auto-exit after done\n useEffect(() => {\n if (step === \"done\") {\n const timer = setTimeout(() => exit(), 200);\n return () => clearTimeout(timer);\n }\n }, [step, exit]);\n\n const handleSubmit = (value: string) => {\n switch (step) {\n case \"supabase_url\":\n if (!value.trim()) return;\n setSupabaseUrl(value.trim());\n setInputValue(\"\");\n setStep(\"supabase_key\");\n break;\n case \"supabase_key\":\n if (!value.trim()) return;\n setSupabaseKey(value.trim());\n setInputValue(\"\");\n setStep(\"store_id\");\n break;\n case \"store_id\":\n setStoreId(value.trim());\n setInputValue(\"\");\n setStep(\"anthropic_key\");\n break;\n case \"anthropic_key\":\n setAnthropicKey(value.trim());\n setInputValue(\"\");\n setStep(\"select_clis\");\n break;\n }\n };\n\n const installToSelected = () => {\n const serverEntry = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n env: {\n SUPABASE_URL: supabaseUrl,\n SUPABASE_SERVICE_ROLE_KEY: supabaseKey,\n ...(storeId ? { STORE_ID: storeId } : {}),\n },\n };\n\n let count = 0;\n for (const cli of clis) {\n if (!selectedClis.has(cli.name)) continue;\n const config = readJSON(cli.configPath);\n if (!config[cli.configKey]) config[cli.configKey] = {};\n config[cli.configKey].whale = serverEntry;\n writeJSON(cli.configPath, config);\n count++;\n }\n\n // Also save to ~/.whale/config.json\n saveConfig({\n supabase_url: supabaseUrl,\n supabase_key: supabaseKey,\n ...(storeId ? { store_id: storeId } : {}),\n ...(anthropicKey ? { anthropic_api_key: anthropicKey } : {}),\n });\n\n setInstalledCount(count);\n setStep(\"done\");\n };\n\n const detectedClis = clis.filter(c => c.detected);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={colors.brand} bold>Whale MCP — Setup</Text>\n <Text color={colors.dim}>{symbols.divider.repeat(40)}</Text>\n <Box height={1} />\n\n {/* CLI Detection */}\n {clis.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={colors.muted}>Detected CLIs:</Text>\n {clis.map(cli => (\n <Text key={cli.name} color={cli.detected ? colors.success : colors.dim}>\n {\" \"}{cli.detected ? symbols.check : symbols.cross} {cli.name}\n </Text>\n ))}\n </Box>\n )}\n\n {/* Supabase URL */}\n {step === \"supabase_url\" && (\n <Box>\n <Text color={colors.text}>Supabase URL: </Text>\n <TextInput value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} />\n </Box>\n )}\n {step !== \"supabase_url\" && supabaseUrl && (\n <Text color={colors.muted}>Supabase URL: {supabaseUrl.slice(0, 40)}...</Text>\n )}\n\n {/* Supabase Key */}\n {step === \"supabase_key\" && (\n <Box>\n <Text color={colors.text}>Service Role Key: </Text>\n <TextInput value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} />\n </Box>\n )}\n {step !== \"supabase_key\" && step !== \"supabase_url\" && supabaseKey && (\n <Text color={colors.muted}>Service Role Key: {symbols.check} Set</Text>\n )}\n\n {/* Store ID */}\n {step === \"store_id\" && (\n <Box>\n <Text color={colors.text}>Store ID (optional, enter to skip): </Text>\n <TextInput value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} />\n </Box>\n )}\n\n {/* Anthropic Key */}\n {step === \"anthropic_key\" && (\n <Box>\n <Text color={colors.text}>Anthropic API Key (for chat mode, enter to skip): </Text>\n <TextInput value={inputValue} onChange={setInputValue} onSubmit={handleSubmit} />\n </Box>\n )}\n\n {/* CLI Selection */}\n {step === \"select_clis\" && detectedClis.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={colors.text}>Install to detected CLIs? (Enter to confirm)</Text>\n <Box height={1} />\n <CLISelector\n clis={detectedClis}\n selected={selectedClis}\n onToggle={(name) => {\n setSelectedClis(prev => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }}\n onConfirm={installToSelected}\n />\n </Box>\n )}\n {step === \"select_clis\" && detectedClis.length === 0 && (\n <Box flexDirection=\"column\">\n <Text color={colors.warning}>No MCP clients detected. Saving config only.</Text>\n <ConfirmButton onConfirm={installToSelected} />\n </Box>\n )}\n\n {/* Done */}\n {step === \"done\" && (\n <Box flexDirection=\"column\">\n <Box height={1} />\n <Text color={colors.success} bold>\n {symbols.check} Setup complete!\n </Text>\n {installedCount > 0 && (\n <Text color={colors.muted}>\n Installed to {installedCount} CLI{installedCount > 1 ? \"s\" : \"\"}. Restart to load.\n </Text>\n )}\n <Text color={colors.muted}>Config saved to ~/.whale/config.json</Text>\n {anthropicKey && <Text color={colors.muted}>Chat mode ready: npx whale-code chat</Text>}\n </Box>\n )}\n </Box>\n );\n}\n\nfunction CLISelector({\n clis,\n selected,\n onToggle,\n onConfirm,\n}: {\n clis: CLITarget[];\n selected: Set<string>;\n onToggle: (name: string) => void;\n onConfirm: () => void;\n}) {\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) setCursor(c => Math.max(0, c - 1));\n else if (key.downArrow) setCursor(c => Math.min(clis.length, c + 1));\n else if (input === \" \" && cursor < clis.length) onToggle(clis[cursor].name);\n else if (key.return) onConfirm();\n });\n\n return (\n <Box flexDirection=\"column\">\n {clis.map((cli, i) => (\n <Text key={cli.name} color={i === cursor ? colors.brand : colors.text}>\n {i === cursor ? symbols.chevron : \" \"} [{selected.has(cli.name) ? \"x\" : \" \"}] {cli.name}\n </Text>\n ))}\n <Text color={cursor === clis.length ? colors.brand : colors.success}>\n {cursor === clis.length ? symbols.chevron : \" \"} {symbols.arrow} Confirm & Install\n </Text>\n <Box height={1} />\n <Text color={colors.dim}>Space to toggle, Enter to confirm</Text>\n </Box>\n );\n}\n\nfunction ConfirmButton({ onConfirm }: { onConfirm: () => void }) {\n useInput((_input, key) => {\n if (key.return) onConfirm();\n });\n\n return <Text color={colors.muted}>Press Enter to save config...</Text>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SetupApp.js","names":["React","useState","useEffect","Box","Text","useApp","useInput","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","colors","symbols","jsx","_jsx","jsxs","_jsxs","home","detectCLIs","name","configPath","configKey","detected","process","platform","readJSON","path","JSON","parse","writeJSON","data","dir","recursive","stringify","SetupApp","$","_c","exit","step","setStep","t0","Symbol","for","clis","setClis","t1","Set","selectedClis","setSelectedClis","installedCount","setInstalledCount","t2","t3","filter","_temp","map","_temp2","timer","setTimeout","clearTimeout","t4","t5","timer_0","t6","serverEntry","type","command","args","count","cli","has","config","whale","installToSelected","t7","_temp3","detectedClis","t8","color","brand","bold","children","t10","t9","dim","divider","repeat","height","t11","length","flexDirection","marginBottom","muted","_temp4","t12","t13","t14","text","CLISelector","onToggle","prev","next","delete","add","t15","warning","ConfirmButton","onConfirm","t16","success","check","t17","padding","cli_0","cross","c_1","c","c_0","selected","cursor","setCursor","input","key","upArrow","_temp5","downArrow","Math","min","return","i","chevron","arrow","max","_input"],"sources":["../../../src/cli/setup/SetupApp.tsx"],"sourcesContent":["/**\n * Setup Wizard (Ink)\n *\n * Detects installed MCP-compatible CLIs → registers whale-code as MCP server.\n * No API keys needed — authentication is handled by `whale login` (browser OAuth).\n *\n * Usage: npx whale-code setup\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { dirname, join } from \"path\";\nimport { colors, symbols } from \"../shared/Theme.js\";\n\n// ============================================================================\n// CLI TARGETS\n// ============================================================================\n\ninterface CLITarget {\n name: string;\n configPath: string;\n configKey: string;\n detected: boolean;\n}\n\nconst home = homedir();\n\nfunction detectCLIs(): CLITarget[] {\n return [\n {\n name: \"Claude Code\",\n configPath: join(home, \".claude\", \"settings.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".claude\")),\n },\n {\n name: \"Claude Desktop\",\n configPath:\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\", \"claude_desktop_config.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(\n process.platform === \"darwin\"\n ? join(home, \"Library\", \"Application Support\", \"Claude\")\n : join(home, \"AppData\", \"Roaming\", \"Claude\")\n ),\n },\n {\n name: \"Cursor\",\n configPath: join(home, \".cursor\", \"mcp.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".cursor\")),\n },\n {\n name: \"Windsurf\",\n configPath: join(home, \".codeium\", \"windsurf\", \"mcp_config.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".codeium\", \"windsurf\")),\n },\n {\n name: \"Gemini CLI\",\n configPath: join(home, \".gemini\", \"settings.json\"),\n configKey: \"mcpServers\",\n detected: existsSync(join(home, \".gemini\")),\n },\n ];\n}\n\nfunction readJSON(path: string): Record<string, any> {\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeJSON(path: string, data: Record<string, any>): void {\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ============================================================================\n// STEPS\n// ============================================================================\n\ntype Step = \"detect\" | \"select_clis\" | \"done\";\n\nexport function SetupApp() {\n const { exit } = useApp();\n const [step, setStep] = useState<Step>(\"detect\");\n const [clis, setClis] = useState<CLITarget[]>([]);\n const [selectedClis, setSelectedClis] = useState<Set<string>>(new Set());\n const [installedCount, setInstalledCount] = useState(0);\n\n // Detect CLIs on mount\n useEffect(() => {\n const detected = detectCLIs();\n setClis(detected);\n setSelectedClis(new Set(detected.filter(c => c.detected).map(c => c.name)));\n const timer = setTimeout(() => setStep(\"select_clis\"), 50);\n return () => clearTimeout(timer);\n }, []);\n\n // Auto-exit after done\n useEffect(() => {\n if (step === \"done\") {\n const timer = setTimeout(() => exit(), 200);\n return () => clearTimeout(timer);\n }\n }, [step, exit]);\n\n const installToSelected = () => {\n // No env vars needed — whale-code uses built-in platform credentials\n // and authenticates via `whale login` (browser OAuth → JWT in ~/.whaletools/session.json)\n const serverEntry = {\n type: \"stdio\",\n command: \"npx\",\n args: [\"-y\", \"whale-code\"],\n };\n\n let count = 0;\n for (const cli of clis) {\n if (!selectedClis.has(cli.name)) continue;\n const config = readJSON(cli.configPath);\n if (!config[cli.configKey]) config[cli.configKey] = {};\n config[cli.configKey].whale = serverEntry;\n writeJSON(cli.configPath, config);\n count++;\n }\n\n setInstalledCount(count);\n setStep(\"done\");\n };\n\n const detectedClis = clis.filter(c => c.detected);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color={colors.brand} bold>Whale MCP — Setup</Text>\n <Text color={colors.dim}>{symbols.divider.repeat(40)}</Text>\n <Box height={1} />\n\n {/* CLI Detection */}\n {clis.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={colors.muted}>Detected CLIs:</Text>\n {clis.map(cli => (\n <Text key={cli.name} color={cli.detected ? colors.success : colors.dim}>\n {\" \"}{cli.detected ? symbols.check : symbols.cross} {cli.name}\n </Text>\n ))}\n </Box>\n )}\n\n <Text color={colors.muted}>\n No API keys required — run `whale login` after setup to authenticate.\n </Text>\n <Box height={1} />\n\n {/* CLI Selection */}\n {step === \"select_clis\" && detectedClis.length > 0 && (\n <Box flexDirection=\"column\">\n <Text color={colors.text}>Install to detected CLIs? (Enter to confirm)</Text>\n <Box height={1} />\n <CLISelector\n clis={detectedClis}\n selected={selectedClis}\n onToggle={(name) => {\n setSelectedClis(prev => {\n const next = new Set(prev);\n if (next.has(name)) next.delete(name);\n else next.add(name);\n return next;\n });\n }}\n onConfirm={installToSelected}\n />\n </Box>\n )}\n {step === \"select_clis\" && detectedClis.length === 0 && (\n <Box flexDirection=\"column\">\n <Text color={colors.warning}>No MCP clients detected.</Text>\n <Text color={colors.muted}>Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.</Text>\n <ConfirmButton onConfirm={() => { setStep(\"done\"); }} />\n </Box>\n )}\n\n {/* Done */}\n {step === \"done\" && (\n <Box flexDirection=\"column\">\n <Box height={1} />\n <Text color={colors.success} bold>\n {symbols.check} Setup complete!\n </Text>\n {installedCount > 0 && (\n <Text color={colors.muted}>\n Installed to {installedCount} CLI{installedCount > 1 ? \"s\" : \"\"}. Restart to load.\n </Text>\n )}\n <Text color={colors.muted}>Run `whale login` to authenticate with your WhaleTools account.</Text>\n </Box>\n )}\n </Box>\n );\n}\n\nfunction CLISelector({\n clis,\n selected,\n onToggle,\n onConfirm,\n}: {\n clis: CLITarget[];\n selected: Set<string>;\n onToggle: (name: string) => void;\n onConfirm: () => void;\n}) {\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) setCursor(c => Math.max(0, c - 1));\n else if (key.downArrow) setCursor(c => Math.min(clis.length, c + 1));\n else if (input === \" \" && cursor < clis.length) onToggle(clis[cursor].name);\n else if (key.return) onConfirm();\n });\n\n return (\n <Box flexDirection=\"column\">\n {clis.map((cli, i) => (\n <Text key={cli.name} color={i === cursor ? colors.brand : colors.text}>\n {i === cursor ? symbols.chevron : \" \"} [{selected.has(cli.name) ? \"x\" : \" \"}] {cli.name}\n </Text>\n ))}\n <Text color={cursor === clis.length ? colors.brand : colors.success}>\n {cursor === clis.length ? symbols.chevron : \" \"} {symbols.arrow} Confirm & Install\n </Text>\n <Box height={1} />\n <Text color={colors.dim}>Space to toggle, Enter to confirm</Text>\n </Box>\n );\n}\n\nfunction ConfirmButton({ onConfirm }: { onConfirm: () => void }) {\n useInput((_input, key) => {\n if (key.return) onConfirm();\n });\n\n return <Text color={colors.muted}>Press Enter to continue...</Text>;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -210,9 +210,9 @@ export function StatusApp() {
|
|
|
210
210
|
label: "local tools",
|
|
211
211
|
value: `${status.localTools} (file, shell, search)`
|
|
212
212
|
}), !status.loggedIn && /*#__PURE__*/_jsx(Row, {
|
|
213
|
-
label: "
|
|
214
|
-
value:
|
|
215
|
-
color:
|
|
213
|
+
label: "auth",
|
|
214
|
+
value: "not logged in \u2014 run: whale login",
|
|
215
|
+
color: colors.warning
|
|
216
216
|
}), status.agents.length > 0 && /*#__PURE__*/_jsxs(_Fragment, {
|
|
217
217
|
children: [/*#__PURE__*/_jsx(Box, {
|
|
218
218
|
height: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusApp.js","names":["React","useState","useEffect","Box","Text","useApp","SpinnerSlot","createClient","resolveConfig","loadConfig","isLoggedIn","getValidToken","createAuthenticatedClient","LOCAL_TOOL_NAMES","WhaleBanner","colors","symbols","boxLine","readFileSync","dirname","join","fileURLToPath","jsxs","_jsxs","jsx","_jsx","Fragment","_Fragment","getVersion","__filename","import","meta","url","__dirname","pkg","JSON","parse","version","Row","t0","$","_c","label","value","color","t1","padEnd","t2","dim","children","t3","text","t4","t5","StatusApp","exit","status","setStatus","loading","setLoading","config","file","loggedIn","supabase","token","supabaseUrl","supabaseKey","supabaseOk","storeId","store_id","storeName","store_name","serverTools","localTools","size","agents","email","error","toolsRes","agentsRes","storeRes","Promise","all","from","select","eq","single","resolve","data","name","length","err","t","setTimeout","clearTimeout","flexDirection","padding","height","brand","muted","border","check","cross","success","warning","anthropicApiKey","map","agent","marginLeft","arrowRight","bold","model","subtle","enabled_tools","id"],"sources":["../../../src/cli/status/StatusApp.tsx"],"sourcesContent":["/**\n * Status Dashboard with whale branding\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp } from \"ink\";\nimport { SpinnerSlot } from \"../shared/SpinnerSlot.js\";\nimport { createClient } from \"@supabase/supabase-js\";\nimport { resolveConfig, loadConfig } from \"../services/config-store.js\";\nimport { isLoggedIn, getValidToken, createAuthenticatedClient } from \"../services/auth-service.js\";\nimport { LOCAL_TOOL_NAMES } from \"../services/local-tools.js\";\nimport { WhaleBanner } from \"../shared/WhaleBanner.js\";\nimport { colors, symbols, boxLine } from \"../shared/Theme.js\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nfunction getVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"..\", \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"?\";\n } catch { return \"?\"; }\n}\n\ninterface StatusData {\n version: string;\n supabaseOk: boolean;\n storeId: string;\n storeName: string;\n serverTools: number;\n localTools: number;\n agents: Array<{ id: string; name: string; model: string; enabled_tools: string[] }>;\n loggedIn: boolean;\n email: string;\n error?: string;\n}\n\nfunction Row({ label, value, color }: { label: string; value: string; color?: string }) {\n return (\n <Box>\n <Text color={colors.dim}> {label.padEnd(18)}</Text>\n <Text color={color || colors.text}>{value}</Text>\n </Box>\n );\n}\n\nexport function StatusApp() {\n const { exit } = useApp();\n const [status, setStatus] = useState<StatusData | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n (async () => {\n const config = resolveConfig();\n const file = loadConfig();\n const version = getVersion();\n const loggedIn = isLoggedIn();\n\n let supabase;\n if (loggedIn) {\n const token = await getValidToken();\n if (token) supabase = createAuthenticatedClient(token);\n } else if (config.supabaseUrl && config.supabaseKey) {\n supabase = createClient(config.supabaseUrl, config.supabaseKey);\n }\n\n if (!supabase) {\n setStatus({\n version, supabaseOk: false,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || \"\",\n serverTools: 0, localTools: LOCAL_TOOL_NAMES.size,\n agents: [], loggedIn, email: file.email || \"\",\n error: loggedIn ? \"Session expired. Run: whale login\" : \"Not configured. Run: whale login\",\n });\n setLoading(false); return;\n }\n\n try {\n const [toolsRes, agentsRes, storeRes] = await Promise.all([\n supabase.from(\"ai_tool_registry\").select(\"name\").eq(\"is_active\", true),\n supabase.from(\"ai_agent_config\").select(\"id, name, model, enabled_tools\").eq(\"is_active\", true),\n (config.storeId || file.store_id)\n ? supabase.from(\"stores\").select(\"name\").eq(\"id\", config.storeId || file.store_id).single()\n : Promise.resolve({ data: null, error: null }),\n ]);\n\n setStatus({\n version, supabaseOk: true,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || storeRes.data?.name || \"\",\n serverTools: toolsRes.data?.length || 0,\n localTools: LOCAL_TOOL_NAMES.size,\n agents: (agentsRes.data || []) as StatusData[\"agents\"],\n loggedIn, email: file.email || \"\",\n });\n } catch (err) {\n setStatus({\n version, supabaseOk: false,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || \"\",\n serverTools: 0, localTools: LOCAL_TOOL_NAMES.size,\n agents: [], loggedIn, email: file.email || \"\",\n error: `Connection failed: ${err}`,\n });\n }\n setLoading(false);\n })();\n }, []);\n\n useEffect(() => {\n if (!loading) { const t = setTimeout(() => exit(), 100); return () => clearTimeout(t); }\n }, [loading, exit]);\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <WhaleBanner version={getVersion()} />\n <Box height={1} />\n <Box>\n <Text color={colors.brand}> <SpinnerSlot /></Text>\n <Text color={colors.muted}> connecting…</Text>\n </Box>\n </Box>\n );\n }\n\n if (!status) return null;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <WhaleBanner version={status.version} />\n <Box height={1} />\n <Text color={colors.border}>{boxLine(44)}</Text>\n <Box height={1} />\n\n {/* Auth */}\n <Row\n label=\"auth\"\n value={status.loggedIn ? `${symbols.check} logged in` : `${symbols.cross} not logged in`}\n color={status.loggedIn ? colors.success : colors.warning}\n />\n {status.email && <Row label=\"user\" value={status.email} />}\n\n {/* Connection */}\n <Row\n label=\"supabase\"\n value={status.supabaseOk ? `${symbols.check} connected` : `${symbols.cross} disconnected`}\n color={status.supabaseOk ? colors.success : colors.error}\n />\n {status.storeName && <Row label=\"store\" value={status.storeName} />}\n {!status.storeName && <Row label=\"store id\" value={status.storeId} />}\n\n {/* Tools */}\n <Box height={1} />\n <Row label=\"server tools\" value={`${status.serverTools} (edge function)`} />\n <Row label=\"local tools\" value={`${status.localTools} (file, shell, search)`} />\n\n {/* Only show Anthropic key in legacy mode */}\n {!status.loggedIn && (\n <Row\n label=\"anthropic key\"\n value={resolveConfig().anthropicApiKey ? `${symbols.check} set` : `${symbols.cross} not set`}\n color={resolveConfig().anthropicApiKey ? colors.success : colors.warning}\n />\n )}\n\n {/* Agents */}\n {status.agents.length > 0 && (\n <>\n <Box height={1} />\n <Text color={colors.border}>{boxLine(44)}</Text>\n <Text color={colors.muted}> agents</Text>\n <Box height={1} />\n {status.agents.map((agent) => (\n <Box key={agent.id} marginLeft={2}>\n <Text color={colors.brand}>{symbols.arrowRight} </Text>\n <Text color={colors.text} bold>{agent.name}</Text>\n <Text color={colors.dim}> {agent.model}</Text>\n <Text color={colors.subtle}> ({agent.enabled_tools?.length || \"all\"} tools)</Text>\n </Box>\n ))}\n </>\n )}\n\n {status.error && (\n <>\n <Box height={1} />\n <Text color={colors.error}> {symbols.cross} {status.error}</Text>\n </>\n )}\n </Box>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"StatusApp.js","names":["React","useState","useEffect","Box","Text","useApp","SpinnerSlot","createClient","resolveConfig","loadConfig","isLoggedIn","getValidToken","createAuthenticatedClient","LOCAL_TOOL_NAMES","WhaleBanner","colors","symbols","boxLine","readFileSync","dirname","join","fileURLToPath","jsxs","_jsxs","jsx","_jsx","Fragment","_Fragment","getVersion","__filename","import","meta","url","__dirname","pkg","JSON","parse","version","Row","t0","$","_c","label","value","color","t1","padEnd","t2","dim","children","t3","text","t4","t5","StatusApp","exit","status","setStatus","loading","setLoading","config","file","loggedIn","supabase","token","supabaseUrl","supabaseKey","supabaseOk","storeId","store_id","storeName","store_name","serverTools","localTools","size","agents","email","error","toolsRes","agentsRes","storeRes","Promise","all","from","select","eq","single","resolve","data","name","length","err","t","setTimeout","clearTimeout","flexDirection","padding","height","brand","muted","border","check","cross","success","warning","map","agent","marginLeft","arrowRight","bold","model","subtle","enabled_tools","id"],"sources":["../../../src/cli/status/StatusApp.tsx"],"sourcesContent":["/**\n * Status Dashboard with whale branding\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp } from \"ink\";\nimport { SpinnerSlot } from \"../shared/SpinnerSlot.js\";\nimport { createClient } from \"@supabase/supabase-js\";\nimport { resolveConfig, loadConfig } from \"../services/config-store.js\";\nimport { isLoggedIn, getValidToken, createAuthenticatedClient } from \"../services/auth-service.js\";\nimport { LOCAL_TOOL_NAMES } from \"../services/local-tools.js\";\nimport { WhaleBanner } from \"../shared/WhaleBanner.js\";\nimport { colors, symbols, boxLine } from \"../shared/Theme.js\";\nimport { readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nfunction getVersion(): string {\n try {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"..\", \"..\", \"package.json\"), \"utf-8\"));\n return pkg.version || \"?\";\n } catch { return \"?\"; }\n}\n\ninterface StatusData {\n version: string;\n supabaseOk: boolean;\n storeId: string;\n storeName: string;\n serverTools: number;\n localTools: number;\n agents: Array<{ id: string; name: string; model: string; enabled_tools: string[] }>;\n loggedIn: boolean;\n email: string;\n error?: string;\n}\n\nfunction Row({ label, value, color }: { label: string; value: string; color?: string }) {\n return (\n <Box>\n <Text color={colors.dim}> {label.padEnd(18)}</Text>\n <Text color={color || colors.text}>{value}</Text>\n </Box>\n );\n}\n\nexport function StatusApp() {\n const { exit } = useApp();\n const [status, setStatus] = useState<StatusData | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n (async () => {\n const config = resolveConfig();\n const file = loadConfig();\n const version = getVersion();\n const loggedIn = isLoggedIn();\n\n let supabase;\n if (loggedIn) {\n const token = await getValidToken();\n if (token) supabase = createAuthenticatedClient(token);\n } else if (config.supabaseUrl && config.supabaseKey) {\n supabase = createClient(config.supabaseUrl, config.supabaseKey);\n }\n\n if (!supabase) {\n setStatus({\n version, supabaseOk: false,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || \"\",\n serverTools: 0, localTools: LOCAL_TOOL_NAMES.size,\n agents: [], loggedIn, email: file.email || \"\",\n error: loggedIn ? \"Session expired. Run: whale login\" : \"Not configured. Run: whale login\",\n });\n setLoading(false); return;\n }\n\n try {\n const [toolsRes, agentsRes, storeRes] = await Promise.all([\n supabase.from(\"ai_tool_registry\").select(\"name\").eq(\"is_active\", true),\n supabase.from(\"ai_agent_config\").select(\"id, name, model, enabled_tools\").eq(\"is_active\", true),\n (config.storeId || file.store_id)\n ? supabase.from(\"stores\").select(\"name\").eq(\"id\", config.storeId || file.store_id).single()\n : Promise.resolve({ data: null, error: null }),\n ]);\n\n setStatus({\n version, supabaseOk: true,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || storeRes.data?.name || \"\",\n serverTools: toolsRes.data?.length || 0,\n localTools: LOCAL_TOOL_NAMES.size,\n agents: (agentsRes.data || []) as StatusData[\"agents\"],\n loggedIn, email: file.email || \"\",\n });\n } catch (err) {\n setStatus({\n version, supabaseOk: false,\n storeId: config.storeId || file.store_id || \"—\",\n storeName: file.store_name || \"\",\n serverTools: 0, localTools: LOCAL_TOOL_NAMES.size,\n agents: [], loggedIn, email: file.email || \"\",\n error: `Connection failed: ${err}`,\n });\n }\n setLoading(false);\n })();\n }, []);\n\n useEffect(() => {\n if (!loading) { const t = setTimeout(() => exit(), 100); return () => clearTimeout(t); }\n }, [loading, exit]);\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <WhaleBanner version={getVersion()} />\n <Box height={1} />\n <Box>\n <Text color={colors.brand}> <SpinnerSlot /></Text>\n <Text color={colors.muted}> connecting…</Text>\n </Box>\n </Box>\n );\n }\n\n if (!status) return null;\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <WhaleBanner version={status.version} />\n <Box height={1} />\n <Text color={colors.border}>{boxLine(44)}</Text>\n <Box height={1} />\n\n {/* Auth */}\n <Row\n label=\"auth\"\n value={status.loggedIn ? `${symbols.check} logged in` : `${symbols.cross} not logged in`}\n color={status.loggedIn ? colors.success : colors.warning}\n />\n {status.email && <Row label=\"user\" value={status.email} />}\n\n {/* Connection */}\n <Row\n label=\"supabase\"\n value={status.supabaseOk ? `${symbols.check} connected` : `${symbols.cross} disconnected`}\n color={status.supabaseOk ? colors.success : colors.error}\n />\n {status.storeName && <Row label=\"store\" value={status.storeName} />}\n {!status.storeName && <Row label=\"store id\" value={status.storeId} />}\n\n {/* Tools */}\n <Box height={1} />\n <Row label=\"server tools\" value={`${status.serverTools} (edge function)`} />\n <Row label=\"local tools\" value={`${status.localTools} (file, shell, search)`} />\n\n {/* Prompt login if not authenticated */}\n {!status.loggedIn && (\n <Row\n label=\"auth\"\n value=\"not logged in — run: whale login\"\n color={colors.warning}\n />\n )}\n\n {/* Agents */}\n {status.agents.length > 0 && (\n <>\n <Box height={1} />\n <Text color={colors.border}>{boxLine(44)}</Text>\n <Text color={colors.muted}> agents</Text>\n <Box height={1} />\n {status.agents.map((agent) => (\n <Box key={agent.id} marginLeft={2}>\n <Text color={colors.brand}>{symbols.arrowRight} </Text>\n <Text color={colors.text} bold>{agent.name}</Text>\n <Text color={colors.dim}> {agent.model}</Text>\n <Text color={colors.subtle}> ({agent.enabled_tools?.length || \"all\"} tools)</Text>\n </Box>\n ))}\n </>\n )}\n\n {status.error && (\n <>\n <Box height={1} />\n <Text color={colors.error}> {symbols.cross} {status.error}</Text>\n </>\n )}\n </Box>\n );\n}\n"],"mappings":";AAAA;AACA;AACA;;AAEA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAClD,SAASC,GAAG,EAAEC,IAAI,EAAEC,MAAM,QAAQ,KAAK;AACvC,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,YAAY,QAAQ,uBAAuB;AACpD,SAASC,aAAa,EAAEC,UAAU,QAAQ,6BAA6B;AACvE,SAASC,UAAU,EAAEC,aAAa,EAAEC,yBAAyB,QAAQ,6BAA6B;AAClG,SAASC,gBAAgB,QAAQ,4BAA4B;AAC7D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,MAAM,EAAEC,OAAO,EAAEC,OAAO,QAAQ,oBAAoB;AAC7D,SAASC,YAAY,QAAQ,IAAI;AACjC,SAASC,OAAO,EAAEC,IAAI,QAAQ,MAAM;AACpC,SAASC,aAAa,QAAQ,KAAK;AAAC,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA;AAEpC,SAASC,UAAUA,CAAA,EAAW;EAC5B,IAAI;IACF,MAAMC,UAAU,GAAGR,aAAa,CAACS,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;IACjD,MAAMC,SAAS,GAAGd,OAAO,CAACU,UAAU,CAAC;IACrC,MAAMK,GAAG,GAAGC,IAAI,CAACC,KAAK,CAAClB,YAAY,CAACE,IAAI,CAACa,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;IAChG,OAAOC,GAAG,CAACG,OAAO,IAAI,GAAG;EAC3B,CAAC,CAAC,MAAM;IAAE,OAAO,GAAG;EAAE;AACxB;AAeA,SAAAC,IAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAC,EAAA;EAAa;IAAAC,KAAA;IAAAC,KAAA;IAAAC;EAAA,IAAAL,EAAyE;EAAA,IAAAM,EAAA;EAAA,IAAAL,CAAA,QAAAE,KAAA;IAGpDG,EAAA,GAAAH,KAAK,CAAAI,MAAO,CAAC,EAAE,CAAC;IAAAN,CAAA,MAAAE,KAAA;IAAAF,CAAA,MAAAK,EAAA;EAAA;IAAAA,EAAA,GAAAL,CAAA;EAAA;EAAA,IAAAO,EAAA;EAAA,IAAAP,CAAA,QAAAK,EAAA;IAA5CE,EAAA,gBAAAxB,KAAA,CAACnB,IAAI;MAAQwC,KAAU,EAAV7B,MAAM,CAAAiC,GAAI;MAAAC,QAAA,GAAE,IAAE,EAACJ,EAAgB;IAAA,CAAO,CAAC;IAAAL,CAAA,MAAAK,EAAA;IAAAL,CAAA,MAAAO,EAAA;EAAA;IAAAA,EAAA,GAAAP,CAAA;EAAA;EACvC,MAAAU,EAAA,GAAAN,KAAoB,IAAX7B,MAAM,CAAAoC,IAAK;EAAA,IAAAC,EAAA;EAAA,IAAAZ,CAAA,QAAAU,EAAA,IAAAV,CAAA,QAAAG,KAAA;IAAjCS,EAAA,gBAAA3B,IAAA,CAACrB,IAAI;MAAQwC,KAAoB,EAApBM,EAAoB;MAAAD,QAAA,EAAGN;IAAK,CAAO,CAAC;IAAAH,CAAA,MAAAU,EAAA;IAAAV,CAAA,MAAAG,KAAA;IAAAH,CAAA,MAAAY,EAAA;EAAA;IAAAA,EAAA,GAAAZ,CAAA;EAAA;EAAA,IAAAa,EAAA;EAAA,IAAAb,CAAA,QAAAO,EAAA,IAAAP,CAAA,QAAAY,EAAA;IAFnDC,EAAA,gBAAA9B,KAAA,CAACpB,GAAG;MAAA8C,QAAA,GACFF,EAAoD,EACpDK,EAAiD;IAAA,CAC9C,CAAC;IAAAZ,CAAA,MAAAO,EAAA;IAAAP,CAAA,MAAAY,EAAA;IAAAZ,CAAA,MAAAa,EAAA;EAAA;IAAAA,EAAA,GAAAb,CAAA;EAAA;EAAA,OAHNa,EAGM;AAAA;AAIV,OAAO,SAASC,SAASA,CAAA,EAAG;EAC1B,MAAM;IAAEC;EAAK,CAAC,GAAGlD,MAAM,CAAC,CAAC;EACzB,MAAM,CAACmD,MAAM,EAAEC,SAAS,CAAC,GAAGxD,QAAQ,CAAoB,IAAI,CAAC;EAC7D,MAAM,CAACyD,OAAO,EAAEC,UAAU,CAAC,GAAG1D,QAAQ,CAAC,IAAI,CAAC;EAE5CC,SAAS,CAAC,MAAM;IACd,CAAC,YAAY;MACX,MAAM0D,MAAM,GAAGpD,aAAa,CAAC,CAAC;MAC9B,MAAMqD,IAAI,GAAGpD,UAAU,CAAC,CAAC;MACzB,MAAM4B,OAAO,GAAGT,UAAU,CAAC,CAAC;MAC5B,MAAMkC,QAAQ,GAAGpD,UAAU,CAAC,CAAC;MAE7B,IAAIqD,QAAQ;MACZ,IAAID,QAAQ,EAAE;QACZ,MAAME,KAAK,GAAG,MAAMrD,aAAa,CAAC,CAAC;QACnC,IAAIqD,KAAK,EAAED,QAAQ,GAAGnD,yBAAyB,CAACoD,KAAK,CAAC;MACxD,CAAC,MAAM,IAAIJ,MAAM,CAACK,WAAW,IAAIL,MAAM,CAACM,WAAW,EAAE;QACnDH,QAAQ,GAAGxD,YAAY,CAACqD,MAAM,CAACK,WAAW,EAAEL,MAAM,CAACM,WAAW,CAAC;MACjE;MAEA,IAAI,CAACH,QAAQ,EAAE;QACbN,SAAS,CAAC;UACRpB,OAAO;UAAE8B,UAAU,EAAE,KAAK;UAC1BC,OAAO,EAAER,MAAM,CAACQ,OAAO,IAAIP,IAAI,CAACQ,QAAQ,IAAI,GAAG;UAC/CC,SAAS,EAAET,IAAI,CAACU,UAAU,IAAI,EAAE;UAChCC,WAAW,EAAE,CAAC;UAAEC,UAAU,EAAE5D,gBAAgB,CAAC6D,IAAI;UACjDC,MAAM,EAAE,EAAE;UAAEb,QAAQ;UAAEc,KAAK,EAAEf,IAAI,CAACe,KAAK,IAAI,EAAE;UAC7CC,KAAK,EAAEf,QAAQ,GAAG,mCAAmC,GAAG;QAC1D,CAAC,CAAC;QACFH,UAAU,CAAC,KAAK,CAAC;QAAE;MACrB;MAEA,IAAI;QACF,MAAM,CAACmB,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,CAAC,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACxDnB,QAAQ,CAACoB,IAAI,CAAC,kBAAkB,CAAC,CAACC,MAAM,CAAC,MAAM,CAAC,CAACC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EACtEtB,QAAQ,CAACoB,IAAI,CAAC,iBAAiB,CAAC,CAACC,MAAM,CAAC,gCAAgC,CAAC,CAACC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAC9FzB,MAAM,CAACQ,OAAO,IAAIP,IAAI,CAACQ,QAAQ,GAC5BN,QAAQ,CAACoB,IAAI,CAAC,QAAQ,CAAC,CAACC,MAAM,CAAC,MAAM,CAAC,CAACC,EAAE,CAAC,IAAI,EAAEzB,MAAM,CAACQ,OAAO,IAAIP,IAAI,CAACQ,QAAQ,CAAC,CAACiB,MAAM,CAAC,CAAC,GACzFL,OAAO,CAACM,OAAO,CAAC;UAAEC,IAAI,EAAE,IAAI;UAAEX,KAAK,EAAE;QAAK,CAAC,CAAC,CACjD,CAAC;QAEFpB,SAAS,CAAC;UACRpB,OAAO;UAAE8B,UAAU,EAAE,IAAI;UACzBC,OAAO,EAAER,MAAM,CAACQ,OAAO,IAAIP,IAAI,CAACQ,QAAQ,IAAI,GAAG;UAC/CC,SAAS,EAAET,IAAI,CAACU,UAAU,IAAIS,QAAQ,CAACQ,IAAI,EAAEC,IAAI,IAAI,EAAE;UACvDjB,WAAW,EAAEM,QAAQ,CAACU,IAAI,EAAEE,MAAM,IAAI,CAAC;UAC9BjB,UAAU,EAAE5D,gBAAgB,CAAC6D,IAAI;UAC1CC,MAAM,EAAGI,SAAS,CAACS,IAAI,IAAI,EAA2B;UACtD1B,QAAQ;UAAEc,KAAK,EAAEf,IAAI,CAACe,KAAK,IAAI;QACjC,CAAC,CAAC;MACJ,CAAC,CAAC,OAAOe,GAAG,EAAE;QACZlC,SAAS,CAAC;UACRpB,OAAO;UAAE8B,UAAU,EAAE,KAAK;UAC1BC,OAAO,EAAER,MAAM,CAACQ,OAAO,IAAIP,IAAI,CAACQ,QAAQ,IAAI,GAAG;UAC/CC,SAAS,EAAET,IAAI,CAACU,UAAU,IAAI,EAAE;UAChCC,WAAW,EAAE,CAAC;UAAEC,UAAU,EAAE5D,gBAAgB,CAAC6D,IAAI;UACjDC,MAAM,EAAE,EAAE;UAAEb,QAAQ;UAAEc,KAAK,EAAEf,IAAI,CAACe,KAAK,IAAI,EAAE;UAC7CC,KAAK,EAAE,sBAAsBc,GAAG;QAClC,CAAC,CAAC;MACJ;MACAhC,UAAU,CAAC,KAAK,CAAC;IACnB,CAAC,EAAE,CAAC;EACN,CAAC,EAAE,EAAE,CAAC;EAENzD,SAAS,CAAC,MAAM;IACd,IAAI,CAACwD,OAAO,EAAE;MAAE,MAAMkC,CAAC,GAAGC,UAAU,CAAC,MAAMtC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;MAAE,OAAO,MAAMuC,YAAY,CAACF,CAAC,CAAC;IAAE;EACzF,CAAC,EAAE,CAAClC,OAAO,EAAEH,IAAI,CAAC,CAAC;EAEnB,IAAIG,OAAO,EAAE;IACX,oBACEnC,KAAA,CAACpB,GAAG;MAAC4F,aAAa,EAAC,QAAQ;MAACC,OAAO,EAAE,CAAE;MAAA/C,QAAA,gBACrCxB,IAAA,CAACX,WAAW;QAACuB,OAAO,EAAET,UAAU,CAAC;MAAE,CAAE,CAAC,eACtCH,IAAA,CAACtB,GAAG;QAAC8F,MAAM,EAAE;MAAE,CAAE,CAAC,eAClB1E,KAAA,CAACpB,GAAG;QAAA8C,QAAA,gBACF1B,KAAA,CAACnB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACmF,KAAM;UAAAjD,QAAA,GAAC,IAAE,eAAAxB,IAAA,CAACnB,WAAW,IAAE,CAAC;QAAA,CAAM,CAAC,eACnDmB,IAAA,CAACrB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACoF,KAAM;UAAAlD,QAAA,EAAC;QAAY,CAAM,CAAC;MAAA,CAC3C,CAAC;IAAA,CACH,CAAC;EAEV;EAEA,IAAI,CAACO,MAAM,EAAE,OAAO,IAAI;EAExB,oBACEjC,KAAA,CAACpB,GAAG;IAAC4F,aAAa,EAAC,QAAQ;IAACC,OAAO,EAAE,CAAE;IAAA/C,QAAA,gBACrCxB,IAAA,CAACX,WAAW;MAACuB,OAAO,EAAEmB,MAAM,CAACnB;IAAQ,CAAE,CAAC,eACxCZ,IAAA,CAACtB,GAAG;MAAC8F,MAAM,EAAE;IAAE,CAAE,CAAC,eAClBxE,IAAA,CAACrB,IAAI;MAACwC,KAAK,EAAE7B,MAAM,CAACqF,MAAO;MAAAnD,QAAA,EAAEhC,OAAO,CAAC,EAAE;IAAC,CAAO,CAAC,eAChDQ,IAAA,CAACtB,GAAG;MAAC8F,MAAM,EAAE;IAAE,CAAE,CAAC,eAGlBxE,IAAA,CAACa,GAAG;MACFI,KAAK,EAAC,MAAM;MACZC,KAAK,EAAEa,MAAM,CAACM,QAAQ,GAAG,GAAG9C,OAAO,CAACqF,KAAK,YAAY,GAAG,GAAGrF,OAAO,CAACsF,KAAK,gBAAiB;MACzF1D,KAAK,EAAEY,MAAM,CAACM,QAAQ,GAAG/C,MAAM,CAACwF,OAAO,GAAGxF,MAAM,CAACyF;IAAQ,CAC1D,CAAC,EACDhD,MAAM,CAACoB,KAAK,iBAAInD,IAAA,CAACa,GAAG;MAACI,KAAK,EAAC,MAAM;MAACC,KAAK,EAAEa,MAAM,CAACoB;IAAM,CAAE,CAAC,eAG1DnD,IAAA,CAACa,GAAG;MACFI,KAAK,EAAC,UAAU;MAChBC,KAAK,EAAEa,MAAM,CAACW,UAAU,GAAG,GAAGnD,OAAO,CAACqF,KAAK,YAAY,GAAG,GAAGrF,OAAO,CAACsF,KAAK,eAAgB;MAC1F1D,KAAK,EAAEY,MAAM,CAACW,UAAU,GAAGpD,MAAM,CAACwF,OAAO,GAAGxF,MAAM,CAAC8D;IAAM,CAC1D,CAAC,EACDrB,MAAM,CAACc,SAAS,iBAAI7C,IAAA,CAACa,GAAG;MAACI,KAAK,EAAC,OAAO;MAACC,KAAK,EAAEa,MAAM,CAACc;IAAU,CAAE,CAAC,EAClE,CAACd,MAAM,CAACc,SAAS,iBAAI7C,IAAA,CAACa,GAAG;MAACI,KAAK,EAAC,UAAU;MAACC,KAAK,EAAEa,MAAM,CAACY;IAAQ,CAAE,CAAC,eAGrE3C,IAAA,CAACtB,GAAG;MAAC8F,MAAM,EAAE;IAAE,CAAE,CAAC,eAClBxE,IAAA,CAACa,GAAG;MAACI,KAAK,EAAC,cAAc;MAACC,KAAK,EAAE,GAAGa,MAAM,CAACgB,WAAW;IAAmB,CAAE,CAAC,eAC5E/C,IAAA,CAACa,GAAG;MAACI,KAAK,EAAC,aAAa;MAACC,KAAK,EAAE,GAAGa,MAAM,CAACiB,UAAU;IAAyB,CAAE,CAAC,EAG/E,CAACjB,MAAM,CAACM,QAAQ,iBACfrC,IAAA,CAACa,GAAG;MACFI,KAAK,EAAC,MAAM;MACZC,KAAK,EAAC,uCAAkC;MACxCC,KAAK,EAAE7B,MAAM,CAACyF;IAAQ,CACvB,CACF,EAGAhD,MAAM,CAACmB,MAAM,CAACe,MAAM,GAAG,CAAC,iBACvBnE,KAAA,CAAAI,SAAA;MAAAsB,QAAA,gBACExB,IAAA,CAACtB,GAAG;QAAC8F,MAAM,EAAE;MAAE,CAAE,CAAC,eAClBxE,IAAA,CAACrB,IAAI;QAACwC,KAAK,EAAE7B,MAAM,CAACqF,MAAO;QAAAnD,QAAA,EAAEhC,OAAO,CAAC,EAAE;MAAC,CAAO,CAAC,eAChDQ,IAAA,CAACrB,IAAI;QAACwC,KAAK,EAAE7B,MAAM,CAACoF,KAAM;QAAAlD,QAAA,EAAC;MAAQ,CAAM,CAAC,eAC1CxB,IAAA,CAACtB,GAAG;QAAC8F,MAAM,EAAE;MAAE,CAAE,CAAC,EACjBzC,MAAM,CAACmB,MAAM,CAAC8B,GAAG,CAAEC,KAAK,iBACvBnF,KAAA,CAACpB,GAAG;QAAgBwG,UAAU,EAAE,CAAE;QAAA1D,QAAA,gBAChC1B,KAAA,CAACnB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACmF,KAAM;UAAAjD,QAAA,GAAEjC,OAAO,CAAC4F,UAAU,EAAC,GAAC;QAAA,CAAM,CAAC,eACvDnF,IAAA,CAACrB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACoC,IAAK;UAAC0D,IAAI;UAAA5D,QAAA,EAAEyD,KAAK,CAACjB;QAAI,CAAO,CAAC,eAClDlE,KAAA,CAACnB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACiC,GAAI;UAAAC,QAAA,GAAC,IAAE,EAACyD,KAAK,CAACI,KAAK;QAAA,CAAO,CAAC,eAC/CvF,KAAA,CAACnB,IAAI;UAACwC,KAAK,EAAE7B,MAAM,CAACgG,MAAO;UAAA9D,QAAA,GAAC,KAAG,EAACyD,KAAK,CAACM,aAAa,EAAEtB,MAAM,IAAI,KAAK,EAAC,SAAO;QAAA,CAAM,CAAC;MAAA,GAJ3EgB,KAAK,CAACO,EAKX,CACN,CAAC;IAAA,CACF,CACH,EAEAzD,MAAM,CAACqB,KAAK,iBACXtD,KAAA,CAAAI,SAAA;MAAAsB,QAAA,gBACExB,IAAA,CAACtB,GAAG;QAAC8F,MAAM,EAAE;MAAE,CAAE,CAAC,eAClB1E,KAAA,CAACnB,IAAI;QAACwC,KAAK,EAAE7B,MAAM,CAAC8D,KAAM;QAAA5B,QAAA,GAAC,IAAE,EAACjC,OAAO,CAACsF,KAAK,EAAC,GAAC,EAAC9C,MAAM,CAACqB,KAAK;MAAA,CAAO,CAAC;IAAA,CAClE,CACH;EAAA,CACE,CAAC;AAEV","ignoreList":[]}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import { createClient } from "@supabase/supabase-js";
|
|
|
19
19
|
import { createRequire } from "module";
|
|
20
20
|
import { startUpdateLoop } from "./updater.js";
|
|
21
21
|
import { resolveConfig, loadConfig, updateConfig } from "./cli/services/config-store.js";
|
|
22
|
-
import { getValidToken, getStoresForUser, selectStore, SUPABASE_ANON_KEY } from "./cli/services/auth-service.js";
|
|
22
|
+
import { getValidToken, getStoresForUser, selectStore, createAuthenticatedClient, SUPABASE_ANON_KEY } from "./cli/services/auth-service.js";
|
|
23
23
|
import { signInWithBrowser } from "./cli/services/browser-auth.js";
|
|
24
24
|
import { LocalAgentConnection } from "./local-agent/connection.js";
|
|
25
25
|
import { initErrorLogger, setErrorLoggerUser, captureError } from "./cli/services/error-logger.js";
|
|
@@ -108,8 +108,18 @@ function reloadConfig() {
|
|
|
108
108
|
STORE_ID = config.storeId;
|
|
109
109
|
USER_ID = rawConfig.user_id || null;
|
|
110
110
|
USER_EMAIL = rawConfig.email || null;
|
|
111
|
-
if (
|
|
112
|
-
|
|
111
|
+
if (IS_SERVICE_ROLE && config.supabaseKey) {
|
|
112
|
+
// Service role — use key directly as apiKey
|
|
113
|
+
supabase = createClient(config.supabaseUrl, config.supabaseKey, {
|
|
114
|
+
auth: {
|
|
115
|
+
persistSession: false,
|
|
116
|
+
autoRefreshToken: false
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
isAuthenticated = true;
|
|
120
|
+
} else if (rawConfig.access_token) {
|
|
121
|
+
// User JWT — use built-in anon key + JWT header
|
|
122
|
+
supabase = createAuthenticatedClient(rawConfig.access_token);
|
|
113
123
|
isAuthenticated = true;
|
|
114
124
|
}
|
|
115
125
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Server","StdioServerTransport","CallToolRequestSchema","ListToolsRequestSchema","createClient","createRequire","startUpdateLoop","resolveConfig","loadConfig","updateConfig","getValidToken","getStoresForUser","selectStore","SUPABASE_ANON_KEY","signInWithBrowser","LocalAgentConnection","initErrorLogger","setErrorLoggerUser","captureError","require","import","meta","url","PKG_VERSION","version","config","rawConfig","SUPABASE_URL","supabaseUrl","INITIAL_SUPABASE_KEY","supabaseKey","STORE_ID","storeId","IS_SERVICE_ROLE","process","env","SUPABASE_SERVICE_ROLE_KEY","USER_ID","user_id","USER_EMAIL","email","access_token","refresh_token","now","Math","floor","Date","expires_at","console","error","freshToken","store_id","e","message","isAuthenticated","supabase","auth","persistSession","autoRefreshToken","global","headers","Authorization","reloadConfig","getAuthToken","token","SERVER_URL","serverUrl","SESSION_ID","crypto","randomUUID","WHALE_LOGIN_TOOL","name","description","inputSchema","type","properties","WHALE_STATUS_TOOL","WHALE_STORES_TOOL","LOCAL_TOOLS","toolDefinitions","toolsLoadedAt","TOOL_CACHE_TTL","loadToolDefinitions","force","length","data","from","select","eq","neq","map","t","definition","input_schema","err","executeToolRemote","toolName","args","traceId","response","fetch","method","body","JSON","stringify","mode","tool_name","conversation_id","trace_id","userId","userEmail","source","result","json","success","handleWhaleLogin","platformUrl","onBrowserOpening","onWaitingForCallback","onExchangingCode","content","text","isError","tools","server","notification","cfg","msg","store_name","stores","s","id","Error","String","handleWhaleStatus","lines","push","exp","toISOString","join","handleWhaleStores","switchToId","target","find","active","slug","capabilities","setRequestHandler","remoteTools","allTools","request","params","toolArgs","arguments","effectiveStoreId","undefined","slice","localAgent","getOrCreateAgentApiKey","agent_api_key","action","scopes","key_type","key","key_value","api_key","getAgentWsUrl","base","replace","wsBase","startLocalAgent","apiKey","wsUrl","onConnected","onDisconnected","reason","onError","onLog","connect","main","serviceName","transport","catch","on","disconnect","severity","tags","setTimeout","exit"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code MCP Server\n *\n * Thin proxy that connects any MCP client (Claude Code, Cursor, etc.)\n * to the WhaleTools platform.\n *\n * - Tool DEFINITIONS loaded from ai_tool_registry (database-driven)\n * - Tool EXECUTION proxied to the Fly.io server (server-driven)\n * - Auth via browser-based OAuth (`whale_login` tool) or env vars\n *\n * When tools change on the server, this MCP server automatically picks\n * them up — no code changes, no rebuild, no redeploy.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\nimport { createRequire } from \"module\";\nimport { startUpdateLoop } from \"./updater.js\";\nimport { resolveConfig, loadConfig, updateConfig } from \"./cli/services/config-store.js\";\nimport { getValidToken, getStoresForUser, selectStore, createAuthenticatedClient, SUPABASE_URL as AUTH_SUPABASE_URL, SUPABASE_ANON_KEY } from \"./cli/services/auth-service.js\";\nimport { signInWithBrowser } from \"./cli/services/browser-auth.js\";\nimport { LocalAgentConnection } from \"./local-agent/connection.js\";\nimport { initErrorLogger, setErrorLoggerUser, captureError } from \"./cli/services/error-logger.js\";\n\nconst require = createRequire(import.meta.url);\nconst PKG_VERSION: string = require(\"../package.json\").version;\n\n// ============================================================================\n// CONFIGURATION — env vars → ~/.whaletools/session.json (set by `whale login`)\n// ============================================================================\n\nlet config = resolveConfig();\nlet rawConfig = loadConfig();\nconst SUPABASE_URL = config.supabaseUrl;\nlet INITIAL_SUPABASE_KEY = config.supabaseKey;\nlet STORE_ID = config.storeId;\nconst IS_SERVICE_ROLE = !!process.env.SUPABASE_SERVICE_ROLE_KEY;\n\n// User identity — loaded from config (set by `whale login`)\nlet USER_ID = rawConfig.user_id || null;\nlet USER_EMAIL = rawConfig.email || null;\n\n// ============================================================================\n// AUTH STATE — auto-refresh expired tokens before connecting\n// ============================================================================\n\n// If using a user JWT (not service role), check if it needs refreshing\nif (!IS_SERVICE_ROLE && rawConfig.access_token && rawConfig.refresh_token) {\n const now = Math.floor(Date.now() / 1000);\n if (!rawConfig.expires_at || rawConfig.expires_at - 300 < now) {\n console.error(\"[MCP] Access token expired, refreshing...\");\n try {\n const freshToken = await getValidToken();\n if (freshToken) {\n INITIAL_SUPABASE_KEY = freshToken;\n // Reload config to get updated values\n rawConfig = loadConfig();\n USER_ID = rawConfig.user_id || USER_ID;\n USER_EMAIL = rawConfig.email || USER_EMAIL;\n STORE_ID = rawConfig.store_id || STORE_ID;\n console.error(\"[MCP] Token refreshed successfully\");\n } else {\n console.error(\"[MCP] Token refresh failed — run `whale login` to re-authenticate\");\n }\n } catch (e) {\n console.error(\"[MCP] Token refresh error:\", (e as Error).message);\n }\n }\n}\n\nlet isAuthenticated = !!(SUPABASE_URL && INITIAL_SUPABASE_KEY);\nlet supabase: SupabaseClient | null = null;\n\nif (isAuthenticated) {\n if (IS_SERVICE_ROLE) {\n // Service role key — use directly as apiKey (full access)\n supabase = createClient(SUPABASE_URL, INITIAL_SUPABASE_KEY, {\n auth: { persistSession: false, autoRefreshToken: false },\n });\n if (!USER_ID) {\n console.error(\"[MCP] WARNING: Using service role key without user login. Tools will work but store scoping is disabled.\");\n }\n } else {\n // User JWT — use anon key as apiKey, pass JWT via Authorization header\n supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {\n auth: { persistSession: false, autoRefreshToken: false },\n global: { headers: { Authorization: `Bearer ${INITIAL_SUPABASE_KEY}` } },\n });\n }\n} else {\n console.error(\"[MCP] Not authenticated. Use the whale_login tool to sign in, or run `whale login` in a terminal.\");\n}\n\n/** Reload config from disk and update in-memory state */\nfunction reloadConfig(): void {\n config = resolveConfig();\n rawConfig = loadConfig();\n INITIAL_SUPABASE_KEY = config.supabaseKey;\n STORE_ID = config.storeId;\n USER_ID = rawConfig.user_id || null;\n USER_EMAIL = rawConfig.email || null;\n\n if (config.supabaseUrl && config.supabaseKey) {\n supabase = createClient(config.supabaseUrl, config.supabaseKey);\n isAuthenticated = true;\n }\n}\n\n/** Get a fresh auth token — service role keys are static, JWTs auto-refresh */\nasync function getAuthToken(): Promise<string> {\n if (IS_SERVICE_ROLE) return INITIAL_SUPABASE_KEY!;\n // JWT user — refresh if needed\n const token = await getValidToken();\n return token || INITIAL_SUPABASE_KEY!;\n}\n\n// Fly.io server URL for tool execution\nconst SERVER_URL = config.serverUrl;\n\n// Session ID for tracing — links all tool calls in one conversation\nconst SESSION_ID = crypto.randomUUID();\n\n// ============================================================================\n// LOCAL TOOL DEFINITIONS (whale_login, whale_status, whale_stores)\n// ============================================================================\n\ninterface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n}\n\nconst WHALE_LOGIN_TOOL: ToolDefinition = {\n name: \"whale_login\",\n description: \"Log in to your WhaleTools account. Opens a browser for secure authentication. Use this when you see 'not authenticated' errors.\",\n inputSchema: { type: \"object\", properties: {} },\n};\n\nconst WHALE_STATUS_TOOL: ToolDefinition = {\n name: \"whale_status\",\n description: \"Check current authentication status, active store, and account info.\",\n inputSchema: { type: \"object\", properties: {} },\n};\n\nconst WHALE_STORES_TOOL: ToolDefinition = {\n name: \"whale_stores\",\n description: \"List your stores or switch the active store.\",\n inputSchema: {\n type: \"object\",\n properties: {\n store_id: {\n type: \"string\",\n description: \"Store ID to switch to. Omit to list all available stores.\",\n },\n },\n },\n};\n\nconst LOCAL_TOOLS = [WHALE_LOGIN_TOOL, WHALE_STATUS_TOOL, WHALE_STORES_TOOL];\n\n// ============================================================================\n// REMOTE TOOL DEFINITIONS (loaded from database)\n// ============================================================================\n\nlet toolDefinitions: ToolDefinition[] = [];\nlet toolsLoadedAt = 0;\nconst TOOL_CACHE_TTL = 300_000; // 5 minutes — tool defs rarely change mid-session\n\nasync function loadToolDefinitions(force = false): Promise<ToolDefinition[]> {\n if (!isAuthenticated || !supabase) return [];\n\n if (!force && toolDefinitions.length > 0 && Date.now() - toolsLoadedAt < TOOL_CACHE_TTL) {\n return toolDefinitions;\n }\n\n try {\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error) {\n console.error(\"[MCP] Failed to load tools from registry:\", error.message);\n return toolDefinitions; // Return stale cache on error\n }\n\n toolDefinitions = (data || []).map(t => ({\n name: t.name,\n description: t.description || t.definition?.description || `Execute ${t.name}`,\n inputSchema: t.definition?.input_schema || { type: \"object\", properties: {} }\n }));\n toolsLoadedAt = Date.now();\n\n return toolDefinitions;\n } catch (err) {\n console.error(\"[MCP] Error loading tool definitions:\", err);\n return toolDefinitions;\n }\n}\n\n// ============================================================================\n// TOOL EXECUTION (proxied to Fly.io server)\n// ============================================================================\n\ninterface RemoteToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nasync function executeToolRemote(\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n): Promise<RemoteToolResult> {\n try {\n const token = await getAuthToken();\n const response = await fetch(SERVER_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"tool\",\n tool_name: toolName,\n args,\n store_id: storeId,\n conversation_id: SESSION_ID,\n trace_id: traceId,\n userId: USER_ID,\n userEmail: USER_EMAIL,\n source: \"whale-code-mcp\",\n }),\n });\n\n const result = await response.json() as RemoteToolResult;\n return result;\n } catch (err: any) {\n return {\n success: false,\n error: `Server tool call failed: ${err.message}`,\n };\n }\n}\n\n// ============================================================================\n// LOCAL TOOL HANDLERS\n// ============================================================================\n\nasync function handleWhaleLogin(): Promise<{ content: Array<{ type: \"text\"; text: string }>; isError?: boolean }> {\n try {\n const result = await signInWithBrowser(config.platformUrl, {\n onBrowserOpening: (url) => {\n console.error(`[MCP] Opening browser for login: ${url}`);\n },\n onWaitingForCallback: () => {\n console.error(\"[MCP] Waiting for browser login...\");\n },\n onExchangingCode: () => {\n console.error(\"[MCP] Exchanging auth code...\");\n },\n });\n\n if (!result.success) {\n return {\n content: [{ type: \"text\", text: `Login failed: ${result.error}\\n\\nYou can also try running \\`whale login\\` in a terminal.` }],\n isError: true,\n };\n }\n\n // Reload config after successful login\n reloadConfig();\n\n // Force-reload tool definitions\n const tools = await loadToolDefinitions(true);\n\n // Notify MCP client that tools have changed\n server.notification({ method: \"notifications/tools/list_changed\" });\n\n const cfg = result.config!;\n let msg = `Logged in as ${cfg.email || \"unknown\"}`;\n if (cfg.store_name || cfg.store_id) {\n msg += `\\nActive store: ${cfg.store_name || cfg.store_id}`;\n }\n msg += `\\n${tools.length} tools now available.`;\n\n if (result.stores && result.stores.length > 1) {\n msg += `\\n\\nYou have ${result.stores.length} stores. Use whale_stores to switch:`;\n for (const s of result.stores) {\n msg += `\\n - ${s.name} (${s.id})`;\n }\n }\n\n return { content: [{ type: \"text\", text: msg }] };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: `Login error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n}\n\nfunction handleWhaleStatus(): { content: Array<{ type: \"text\"; text: string }> } {\n const cfg = loadConfig();\n const lines: string[] = [];\n\n if (isAuthenticated) {\n lines.push(\"Authenticated: yes\");\n lines.push(`User: ${cfg.email || \"(unknown)\"}`);\n lines.push(`User ID: ${cfg.user_id || \"(unknown)\"}`);\n lines.push(`Store: ${cfg.store_name || cfg.store_id || \"(none selected)\"}`);\n lines.push(`Auth method: ${IS_SERVICE_ROLE ? \"service role key (env var)\" : \"user JWT (whale login)\"}`);\n if (cfg.expires_at) {\n const exp = new Date(cfg.expires_at * 1000);\n lines.push(`Token expires: ${exp.toISOString()}`);\n }\n } else {\n lines.push(\"Authenticated: no\");\n lines.push(\"Use whale_login to sign in.\");\n }\n\n lines.push(`MCP version: ${PKG_VERSION}`);\n lines.push(`Server: ${SERVER_URL}`);\n lines.push(`Tools loaded: ${toolDefinitions.length}`);\n\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n}\n\nasync function handleWhaleStores(args: Record<string, any>): Promise<{ content: Array<{ type: \"text\"; text: string }>; isError?: boolean }> {\n if (!isAuthenticated) {\n return {\n content: [{ type: \"text\", text: \"Not authenticated. Use whale_login first.\" }],\n isError: true,\n };\n }\n\n const switchToId = args.store_id as string | undefined;\n\n if (switchToId) {\n // Switch store\n // Verify the store exists for this user\n const token = await getAuthToken();\n const stores = await getStoresForUser(token, USER_ID || \"\");\n\n const target = stores.find(s => s.id === switchToId);\n if (!target) {\n return {\n content: [{ type: \"text\", text: `Store not found: ${switchToId}\\nAvailable stores: ${stores.map(s => `${s.name} (${s.id})`).join(\", \")}` }],\n isError: true,\n };\n }\n\n selectStore(target.id, target.name);\n reloadConfig();\n\n // Notify MCP client that tools may have changed context\n server.notification({ method: \"notifications/tools/list_changed\" });\n\n return {\n content: [{ type: \"text\", text: `Switched to store: ${target.name} (${target.id})` }],\n };\n }\n\n // List stores\n const token = await getAuthToken();\n const stores = await getStoresForUser(token, USER_ID || \"\");\n\n if (stores.length === 0) {\n return { content: [{ type: \"text\", text: \"No stores found for your account.\" }] };\n }\n\n const cfg = loadConfig();\n const lines = [\"Your stores:\"];\n for (const s of stores) {\n const active = s.id === cfg.store_id ? \" (active)\" : \"\";\n lines.push(` - ${s.name}${s.slug ? ` [${s.slug}]` : \"\"}: ${s.id}${active}`);\n }\n lines.push(\"\\nTo switch: use whale_stores with store_id parameter\");\n\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n}\n\n// ============================================================================\n// MCP SERVER\n// ============================================================================\n\nconst server = new Server(\n { name: \"whale\", version: PKG_VERSION },\n { capabilities: { tools: {} } }\n);\n\n// List available tools — local auth tools always present; remote tools when authenticated\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n if (!isAuthenticated) {\n console.error(`[MCP] Returning ${LOCAL_TOOLS.length} tools (not authenticated)`);\n return {\n tools: LOCAL_TOOLS.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n }\n\n const remoteTools = await loadToolDefinitions();\n const allTools = [...LOCAL_TOOLS, ...remoteTools];\n console.error(`[MCP] Returning ${allTools.length} tools (${LOCAL_TOOLS.length} local + ${remoteTools.length} remote)`);\n\n return {\n tools: allTools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n});\n\n// Execute a tool — local auth tools handled here, everything else proxied to Fly.io\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n const toolArgs = (request.params.arguments || {}) as Record<string, any>;\n\n // ── Local tools (handled in-process) ──\n\n if (toolName === \"whale_login\") {\n return handleWhaleLogin();\n }\n\n if (toolName === \"whale_status\") {\n return handleWhaleStatus();\n }\n\n if (toolName === \"whale_stores\") {\n return handleWhaleStores(toolArgs);\n }\n\n // ── Auth gate for remote tools ──\n\n if (!isAuthenticated) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"Not authenticated. Please use the whale_login tool first to sign in to your WhaleTools account.\",\n }],\n isError: true,\n };\n }\n\n // ── Remote tool execution ──\n\n const traceId = crypto.randomUUID();\n\n // Allow tool-level store_id override (e.g. multi-store users switching context)\n const effectiveStoreId = (toolArgs.store_id as string) || STORE_ID || undefined;\n if (toolArgs.store_id) {\n delete toolArgs.store_id; // Don't send as a tool arg — it's a routing param\n }\n\n console.error(`[MCP] Executing: ${toolName} → Fly.io [${traceId.slice(0, 8)}] store=${effectiveStoreId?.slice(0, 8) || \"none\"}`);\n\n const result = await executeToolRemote(toolName, toolArgs, effectiveStoreId, traceId);\n\n if (result.success) {\n return {\n content: [{\n type: \"text\" as const,\n text: typeof result.data === \"string\"\n ? result.data\n : JSON.stringify(result.data, null, 2),\n }],\n };\n } else {\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ error: result.error }),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================================================\n// LOCAL AGENT (auto-spawned — shares this process with MCP server)\n// ============================================================================\n\nlet localAgent: LocalAgentConnection | null = null;\n\n/**\n * Get or create a store API key for the local agent WebSocket connection.\n * Persisted to ~/.whaletools/session.json so we reuse across restarts.\n */\nasync function getOrCreateAgentApiKey(): Promise<string | null> {\n const rawConfig = loadConfig();\n if (rawConfig.agent_api_key) return rawConfig.agent_api_key;\n\n // Auto-generate via the server's api_keys tool\n try {\n const result = await executeToolRemote(\"api_keys\", {\n action: \"generate\",\n name: \"local-agent-auto\",\n scopes: [\"*\"],\n key_type: \"live\",\n }, STORE_ID || undefined);\n\n if (result.success && result.data) {\n const data = result.data as any;\n const key = data.key_value || data.api_key || data.key;\n if (key) {\n updateConfig({ agent_api_key: key });\n console.error(\"[MCP] Auto-generated local agent API key\");\n return key;\n }\n }\n console.error(\"[MCP] Failed to auto-generate agent API key:\", result.error);\n return null;\n } catch (err: any) {\n console.error(\"[MCP] Error generating agent API key:\", err.message);\n return null;\n }\n}\n\n/**\n * Derive WebSocket URL from the HTTP server URL.\n * https://whale-agent.fly.dev → wss://whale-agent.fly.dev/agent/ws\n */\nfunction getAgentWsUrl(): string {\n const base = SERVER_URL.replace(/\\/$/, \"\");\n const wsBase = base.replace(/^https:/, \"wss:\").replace(/^http:/, \"ws:\");\n return `${wsBase}/agent/ws`;\n}\n\n/**\n * Start the local agent WebSocket connection in the background.\n * Non-blocking — MCP server continues even if this fails.\n */\nasync function startLocalAgent(): Promise<void> {\n const apiKey = await getOrCreateAgentApiKey();\n if (!apiKey) {\n console.error(\"[MCP] Skipping local agent — no API key available\");\n return;\n }\n\n const wsUrl = getAgentWsUrl();\n console.error(`[MCP] Starting local agent → ${wsUrl}`);\n\n localAgent = new LocalAgentConnection({\n apiKey,\n serverUrl: wsUrl,\n onConnected: () => console.error(\"[MCP] Local agent connected — WhaleChat can now use local tools\"),\n onDisconnected: (reason) => console.error(`[MCP] Local agent disconnected: ${reason}`),\n onError: (err) => console.error(`[MCP] Local agent error: ${err.message}`),\n onLog: (msg) => console.error(msg),\n });\n\n try {\n await localAgent.connect();\n } catch (err: any) {\n console.error(`[MCP] Local agent failed to connect: ${err.message} (non-fatal)`);\n }\n}\n\n// ============================================================================\n// STARTUP\n// ============================================================================\n\nasync function main() {\n // Initialize error logging for MCP mode\n initErrorLogger({ serviceName: \"whale-code-mcp\" });\n if (USER_ID || USER_EMAIL) {\n setErrorLoggerUser(USER_ID || undefined, USER_EMAIL || undefined, STORE_ID || undefined);\n }\n\n console.error(`[MCP] Whale MCP Server v${PKG_VERSION}`);\n console.error(`[MCP] Supabase: ${SUPABASE_URL}`);\n console.error(`[MCP] Server: ${SERVER_URL}`);\n console.error(`[MCP] Store: ${STORE_ID || \"(default)\"}`);\n console.error(`[MCP] User: ${USER_EMAIL || \"(unknown)\"} [${USER_ID?.slice(0, 8) || \"no-id\"}]`);\n console.error(`[MCP] Session: ${SESSION_ID}`);\n console.error(`[MCP] Authenticated: ${isAuthenticated ? \"yes\" : \"no — use whale_login tool\"}`);\n\n // Pre-load tools from database (only if authenticated)\n if (isAuthenticated) {\n const tools = await loadToolDefinitions(true);\n console.error(`[MCP] Loaded ${tools.length} tools from registry`);\n } else {\n console.error(`[MCP] Skipping tool load — not authenticated. ${LOCAL_TOOLS.length} auth tools available.`);\n }\n\n // Start OTA update checker (non-blocking, runs in background)\n startUpdateLoop(true);\n\n // Connect via stdio\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"[MCP] Ready\");\n\n // Start local agent in background — only if authenticated\n if (isAuthenticated) {\n startLocalAgent().catch((err) => {\n console.error(\"[MCP] Local agent startup error:\", err.message);\n });\n }\n}\n\n// Graceful shutdown — disconnect local agent\nprocess.on(\"SIGINT\", () => {\n localAgent?.disconnect();\n});\nprocess.on(\"SIGTERM\", () => {\n localAgent?.disconnect();\n});\n\nmain().catch((err) => {\n console.error(\"[MCP] Fatal:\", err);\n captureError({ error: err instanceof Error ? err : new Error(String(err)), severity: \"fatal\", tags: { source: \"mcp_main\" } });\n // Give error logger a moment to flush before exit\n setTimeout(() => process.exit(1), 500);\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Server","StdioServerTransport","CallToolRequestSchema","ListToolsRequestSchema","createClient","createRequire","startUpdateLoop","resolveConfig","loadConfig","updateConfig","getValidToken","getStoresForUser","selectStore","createAuthenticatedClient","SUPABASE_ANON_KEY","signInWithBrowser","LocalAgentConnection","initErrorLogger","setErrorLoggerUser","captureError","require","import","meta","url","PKG_VERSION","version","config","rawConfig","SUPABASE_URL","supabaseUrl","INITIAL_SUPABASE_KEY","supabaseKey","STORE_ID","storeId","IS_SERVICE_ROLE","process","env","SUPABASE_SERVICE_ROLE_KEY","USER_ID","user_id","USER_EMAIL","email","access_token","refresh_token","now","Math","floor","Date","expires_at","console","error","freshToken","store_id","e","message","isAuthenticated","supabase","auth","persistSession","autoRefreshToken","global","headers","Authorization","reloadConfig","getAuthToken","token","SERVER_URL","serverUrl","SESSION_ID","crypto","randomUUID","WHALE_LOGIN_TOOL","name","description","inputSchema","type","properties","WHALE_STATUS_TOOL","WHALE_STORES_TOOL","LOCAL_TOOLS","toolDefinitions","toolsLoadedAt","TOOL_CACHE_TTL","loadToolDefinitions","force","length","data","from","select","eq","neq","map","t","definition","input_schema","err","executeToolRemote","toolName","args","traceId","response","fetch","method","body","JSON","stringify","mode","tool_name","conversation_id","trace_id","userId","userEmail","source","result","json","success","handleWhaleLogin","platformUrl","onBrowserOpening","onWaitingForCallback","onExchangingCode","content","text","isError","tools","server","notification","cfg","msg","store_name","stores","s","id","Error","String","handleWhaleStatus","lines","push","exp","toISOString","join","handleWhaleStores","switchToId","target","find","active","slug","capabilities","setRequestHandler","remoteTools","allTools","request","params","toolArgs","arguments","effectiveStoreId","undefined","slice","localAgent","getOrCreateAgentApiKey","agent_api_key","action","scopes","key_type","key","key_value","api_key","getAgentWsUrl","base","replace","wsBase","startLocalAgent","apiKey","wsUrl","onConnected","onDisconnected","reason","onError","onLog","connect","main","serviceName","transport","catch","on","disconnect","severity","tags","setTimeout","exit"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Whale Code MCP Server\n *\n * Thin proxy that connects any MCP client (Claude Code, Cursor, etc.)\n * to the WhaleTools platform.\n *\n * - Tool DEFINITIONS loaded from ai_tool_registry (database-driven)\n * - Tool EXECUTION proxied to the Fly.io server (server-driven)\n * - Auth via browser-based OAuth (`whale_login` tool) or env vars\n *\n * When tools change on the server, this MCP server automatically picks\n * them up — no code changes, no rebuild, no redeploy.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\nimport { createRequire } from \"module\";\nimport { startUpdateLoop } from \"./updater.js\";\nimport { resolveConfig, loadConfig, updateConfig } from \"./cli/services/config-store.js\";\nimport { getValidToken, getStoresForUser, selectStore, createAuthenticatedClient, SUPABASE_URL as AUTH_SUPABASE_URL, SUPABASE_ANON_KEY } from \"./cli/services/auth-service.js\";\nimport { signInWithBrowser } from \"./cli/services/browser-auth.js\";\nimport { LocalAgentConnection } from \"./local-agent/connection.js\";\nimport { initErrorLogger, setErrorLoggerUser, captureError } from \"./cli/services/error-logger.js\";\n\nconst require = createRequire(import.meta.url);\nconst PKG_VERSION: string = require(\"../package.json\").version;\n\n// ============================================================================\n// CONFIGURATION — env vars → ~/.whaletools/session.json (set by `whale login`)\n// ============================================================================\n\nlet config = resolveConfig();\nlet rawConfig = loadConfig();\nconst SUPABASE_URL = config.supabaseUrl;\nlet INITIAL_SUPABASE_KEY = config.supabaseKey;\nlet STORE_ID = config.storeId;\nconst IS_SERVICE_ROLE = !!process.env.SUPABASE_SERVICE_ROLE_KEY;\n\n// User identity — loaded from config (set by `whale login`)\nlet USER_ID = rawConfig.user_id || null;\nlet USER_EMAIL = rawConfig.email || null;\n\n// ============================================================================\n// AUTH STATE — auto-refresh expired tokens before connecting\n// ============================================================================\n\n// If using a user JWT (not service role), check if it needs refreshing\nif (!IS_SERVICE_ROLE && rawConfig.access_token && rawConfig.refresh_token) {\n const now = Math.floor(Date.now() / 1000);\n if (!rawConfig.expires_at || rawConfig.expires_at - 300 < now) {\n console.error(\"[MCP] Access token expired, refreshing...\");\n try {\n const freshToken = await getValidToken();\n if (freshToken) {\n INITIAL_SUPABASE_KEY = freshToken;\n // Reload config to get updated values\n rawConfig = loadConfig();\n USER_ID = rawConfig.user_id || USER_ID;\n USER_EMAIL = rawConfig.email || USER_EMAIL;\n STORE_ID = rawConfig.store_id || STORE_ID;\n console.error(\"[MCP] Token refreshed successfully\");\n } else {\n console.error(\"[MCP] Token refresh failed — run `whale login` to re-authenticate\");\n }\n } catch (e) {\n console.error(\"[MCP] Token refresh error:\", (e as Error).message);\n }\n }\n}\n\nlet isAuthenticated = !!(SUPABASE_URL && INITIAL_SUPABASE_KEY);\nlet supabase: SupabaseClient | null = null;\n\nif (isAuthenticated) {\n if (IS_SERVICE_ROLE) {\n // Service role key — use directly as apiKey (full access)\n supabase = createClient(SUPABASE_URL, INITIAL_SUPABASE_KEY, {\n auth: { persistSession: false, autoRefreshToken: false },\n });\n if (!USER_ID) {\n console.error(\"[MCP] WARNING: Using service role key without user login. Tools will work but store scoping is disabled.\");\n }\n } else {\n // User JWT — use anon key as apiKey, pass JWT via Authorization header\n supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {\n auth: { persistSession: false, autoRefreshToken: false },\n global: { headers: { Authorization: `Bearer ${INITIAL_SUPABASE_KEY}` } },\n });\n }\n} else {\n console.error(\"[MCP] Not authenticated. Use the whale_login tool to sign in, or run `whale login` in a terminal.\");\n}\n\n/** Reload config from disk and update in-memory state */\nfunction reloadConfig(): void {\n config = resolveConfig();\n rawConfig = loadConfig();\n INITIAL_SUPABASE_KEY = config.supabaseKey;\n STORE_ID = config.storeId;\n USER_ID = rawConfig.user_id || null;\n USER_EMAIL = rawConfig.email || null;\n\n if (IS_SERVICE_ROLE && config.supabaseKey) {\n // Service role — use key directly as apiKey\n supabase = createClient(config.supabaseUrl, config.supabaseKey, {\n auth: { persistSession: false, autoRefreshToken: false },\n });\n isAuthenticated = true;\n } else if (rawConfig.access_token) {\n // User JWT — use built-in anon key + JWT header\n supabase = createAuthenticatedClient(rawConfig.access_token);\n isAuthenticated = true;\n }\n}\n\n/** Get a fresh auth token — service role keys are static, JWTs auto-refresh */\nasync function getAuthToken(): Promise<string> {\n if (IS_SERVICE_ROLE) return INITIAL_SUPABASE_KEY!;\n // JWT user — refresh if needed\n const token = await getValidToken();\n return token || INITIAL_SUPABASE_KEY!;\n}\n\n// Fly.io server URL for tool execution\nconst SERVER_URL = config.serverUrl;\n\n// Session ID for tracing — links all tool calls in one conversation\nconst SESSION_ID = crypto.randomUUID();\n\n// ============================================================================\n// LOCAL TOOL DEFINITIONS (whale_login, whale_status, whale_stores)\n// ============================================================================\n\ninterface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, any>;\n required?: string[];\n };\n}\n\nconst WHALE_LOGIN_TOOL: ToolDefinition = {\n name: \"whale_login\",\n description: \"Log in to your WhaleTools account. Opens a browser for secure authentication. Use this when you see 'not authenticated' errors.\",\n inputSchema: { type: \"object\", properties: {} },\n};\n\nconst WHALE_STATUS_TOOL: ToolDefinition = {\n name: \"whale_status\",\n description: \"Check current authentication status, active store, and account info.\",\n inputSchema: { type: \"object\", properties: {} },\n};\n\nconst WHALE_STORES_TOOL: ToolDefinition = {\n name: \"whale_stores\",\n description: \"List your stores or switch the active store.\",\n inputSchema: {\n type: \"object\",\n properties: {\n store_id: {\n type: \"string\",\n description: \"Store ID to switch to. Omit to list all available stores.\",\n },\n },\n },\n};\n\nconst LOCAL_TOOLS = [WHALE_LOGIN_TOOL, WHALE_STATUS_TOOL, WHALE_STORES_TOOL];\n\n// ============================================================================\n// REMOTE TOOL DEFINITIONS (loaded from database)\n// ============================================================================\n\nlet toolDefinitions: ToolDefinition[] = [];\nlet toolsLoadedAt = 0;\nconst TOOL_CACHE_TTL = 300_000; // 5 minutes — tool defs rarely change mid-session\n\nasync function loadToolDefinitions(force = false): Promise<ToolDefinition[]> {\n if (!isAuthenticated || !supabase) return [];\n\n if (!force && toolDefinitions.length > 0 && Date.now() - toolsLoadedAt < TOOL_CACHE_TTL) {\n return toolDefinitions;\n }\n\n try {\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error) {\n console.error(\"[MCP] Failed to load tools from registry:\", error.message);\n return toolDefinitions; // Return stale cache on error\n }\n\n toolDefinitions = (data || []).map(t => ({\n name: t.name,\n description: t.description || t.definition?.description || `Execute ${t.name}`,\n inputSchema: t.definition?.input_schema || { type: \"object\", properties: {} }\n }));\n toolsLoadedAt = Date.now();\n\n return toolDefinitions;\n } catch (err) {\n console.error(\"[MCP] Error loading tool definitions:\", err);\n return toolDefinitions;\n }\n}\n\n// ============================================================================\n// TOOL EXECUTION (proxied to Fly.io server)\n// ============================================================================\n\ninterface RemoteToolResult {\n success: boolean;\n data?: unknown;\n error?: string;\n}\n\nasync function executeToolRemote(\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n): Promise<RemoteToolResult> {\n try {\n const token = await getAuthToken();\n const response = await fetch(SERVER_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`,\n },\n body: JSON.stringify({\n mode: \"tool\",\n tool_name: toolName,\n args,\n store_id: storeId,\n conversation_id: SESSION_ID,\n trace_id: traceId,\n userId: USER_ID,\n userEmail: USER_EMAIL,\n source: \"whale-code-mcp\",\n }),\n });\n\n const result = await response.json() as RemoteToolResult;\n return result;\n } catch (err: any) {\n return {\n success: false,\n error: `Server tool call failed: ${err.message}`,\n };\n }\n}\n\n// ============================================================================\n// LOCAL TOOL HANDLERS\n// ============================================================================\n\nasync function handleWhaleLogin(): Promise<{ content: Array<{ type: \"text\"; text: string }>; isError?: boolean }> {\n try {\n const result = await signInWithBrowser(config.platformUrl, {\n onBrowserOpening: (url) => {\n console.error(`[MCP] Opening browser for login: ${url}`);\n },\n onWaitingForCallback: () => {\n console.error(\"[MCP] Waiting for browser login...\");\n },\n onExchangingCode: () => {\n console.error(\"[MCP] Exchanging auth code...\");\n },\n });\n\n if (!result.success) {\n return {\n content: [{ type: \"text\", text: `Login failed: ${result.error}\\n\\nYou can also try running \\`whale login\\` in a terminal.` }],\n isError: true,\n };\n }\n\n // Reload config after successful login\n reloadConfig();\n\n // Force-reload tool definitions\n const tools = await loadToolDefinitions(true);\n\n // Notify MCP client that tools have changed\n server.notification({ method: \"notifications/tools/list_changed\" });\n\n const cfg = result.config!;\n let msg = `Logged in as ${cfg.email || \"unknown\"}`;\n if (cfg.store_name || cfg.store_id) {\n msg += `\\nActive store: ${cfg.store_name || cfg.store_id}`;\n }\n msg += `\\n${tools.length} tools now available.`;\n\n if (result.stores && result.stores.length > 1) {\n msg += `\\n\\nYou have ${result.stores.length} stores. Use whale_stores to switch:`;\n for (const s of result.stores) {\n msg += `\\n - ${s.name} (${s.id})`;\n }\n }\n\n return { content: [{ type: \"text\", text: msg }] };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: `Login error: ${err instanceof Error ? err.message : String(err)}` }],\n isError: true,\n };\n }\n}\n\nfunction handleWhaleStatus(): { content: Array<{ type: \"text\"; text: string }> } {\n const cfg = loadConfig();\n const lines: string[] = [];\n\n if (isAuthenticated) {\n lines.push(\"Authenticated: yes\");\n lines.push(`User: ${cfg.email || \"(unknown)\"}`);\n lines.push(`User ID: ${cfg.user_id || \"(unknown)\"}`);\n lines.push(`Store: ${cfg.store_name || cfg.store_id || \"(none selected)\"}`);\n lines.push(`Auth method: ${IS_SERVICE_ROLE ? \"service role key (env var)\" : \"user JWT (whale login)\"}`);\n if (cfg.expires_at) {\n const exp = new Date(cfg.expires_at * 1000);\n lines.push(`Token expires: ${exp.toISOString()}`);\n }\n } else {\n lines.push(\"Authenticated: no\");\n lines.push(\"Use whale_login to sign in.\");\n }\n\n lines.push(`MCP version: ${PKG_VERSION}`);\n lines.push(`Server: ${SERVER_URL}`);\n lines.push(`Tools loaded: ${toolDefinitions.length}`);\n\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n}\n\nasync function handleWhaleStores(args: Record<string, any>): Promise<{ content: Array<{ type: \"text\"; text: string }>; isError?: boolean }> {\n if (!isAuthenticated) {\n return {\n content: [{ type: \"text\", text: \"Not authenticated. Use whale_login first.\" }],\n isError: true,\n };\n }\n\n const switchToId = args.store_id as string | undefined;\n\n if (switchToId) {\n // Switch store\n // Verify the store exists for this user\n const token = await getAuthToken();\n const stores = await getStoresForUser(token, USER_ID || \"\");\n\n const target = stores.find(s => s.id === switchToId);\n if (!target) {\n return {\n content: [{ type: \"text\", text: `Store not found: ${switchToId}\\nAvailable stores: ${stores.map(s => `${s.name} (${s.id})`).join(\", \")}` }],\n isError: true,\n };\n }\n\n selectStore(target.id, target.name);\n reloadConfig();\n\n // Notify MCP client that tools may have changed context\n server.notification({ method: \"notifications/tools/list_changed\" });\n\n return {\n content: [{ type: \"text\", text: `Switched to store: ${target.name} (${target.id})` }],\n };\n }\n\n // List stores\n const token = await getAuthToken();\n const stores = await getStoresForUser(token, USER_ID || \"\");\n\n if (stores.length === 0) {\n return { content: [{ type: \"text\", text: \"No stores found for your account.\" }] };\n }\n\n const cfg = loadConfig();\n const lines = [\"Your stores:\"];\n for (const s of stores) {\n const active = s.id === cfg.store_id ? \" (active)\" : \"\";\n lines.push(` - ${s.name}${s.slug ? ` [${s.slug}]` : \"\"}: ${s.id}${active}`);\n }\n lines.push(\"\\nTo switch: use whale_stores with store_id parameter\");\n\n return { content: [{ type: \"text\", text: lines.join(\"\\n\") }] };\n}\n\n// ============================================================================\n// MCP SERVER\n// ============================================================================\n\nconst server = new Server(\n { name: \"whale\", version: PKG_VERSION },\n { capabilities: { tools: {} } }\n);\n\n// List available tools — local auth tools always present; remote tools when authenticated\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n if (!isAuthenticated) {\n console.error(`[MCP] Returning ${LOCAL_TOOLS.length} tools (not authenticated)`);\n return {\n tools: LOCAL_TOOLS.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n }\n\n const remoteTools = await loadToolDefinitions();\n const allTools = [...LOCAL_TOOLS, ...remoteTools];\n console.error(`[MCP] Returning ${allTools.length} tools (${LOCAL_TOOLS.length} local + ${remoteTools.length} remote)`);\n\n return {\n tools: allTools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n});\n\n// Execute a tool — local auth tools handled here, everything else proxied to Fly.io\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const toolName = request.params.name;\n const toolArgs = (request.params.arguments || {}) as Record<string, any>;\n\n // ── Local tools (handled in-process) ──\n\n if (toolName === \"whale_login\") {\n return handleWhaleLogin();\n }\n\n if (toolName === \"whale_status\") {\n return handleWhaleStatus();\n }\n\n if (toolName === \"whale_stores\") {\n return handleWhaleStores(toolArgs);\n }\n\n // ── Auth gate for remote tools ──\n\n if (!isAuthenticated) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"Not authenticated. Please use the whale_login tool first to sign in to your WhaleTools account.\",\n }],\n isError: true,\n };\n }\n\n // ── Remote tool execution ──\n\n const traceId = crypto.randomUUID();\n\n // Allow tool-level store_id override (e.g. multi-store users switching context)\n const effectiveStoreId = (toolArgs.store_id as string) || STORE_ID || undefined;\n if (toolArgs.store_id) {\n delete toolArgs.store_id; // Don't send as a tool arg — it's a routing param\n }\n\n console.error(`[MCP] Executing: ${toolName} → Fly.io [${traceId.slice(0, 8)}] store=${effectiveStoreId?.slice(0, 8) || \"none\"}`);\n\n const result = await executeToolRemote(toolName, toolArgs, effectiveStoreId, traceId);\n\n if (result.success) {\n return {\n content: [{\n type: \"text\" as const,\n text: typeof result.data === \"string\"\n ? result.data\n : JSON.stringify(result.data, null, 2),\n }],\n };\n } else {\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ error: result.error }),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================================================\n// LOCAL AGENT (auto-spawned — shares this process with MCP server)\n// ============================================================================\n\nlet localAgent: LocalAgentConnection | null = null;\n\n/**\n * Get or create a store API key for the local agent WebSocket connection.\n * Persisted to ~/.whaletools/session.json so we reuse across restarts.\n */\nasync function getOrCreateAgentApiKey(): Promise<string | null> {\n const rawConfig = loadConfig();\n if (rawConfig.agent_api_key) return rawConfig.agent_api_key;\n\n // Auto-generate via the server's api_keys tool\n try {\n const result = await executeToolRemote(\"api_keys\", {\n action: \"generate\",\n name: \"local-agent-auto\",\n scopes: [\"*\"],\n key_type: \"live\",\n }, STORE_ID || undefined);\n\n if (result.success && result.data) {\n const data = result.data as any;\n const key = data.key_value || data.api_key || data.key;\n if (key) {\n updateConfig({ agent_api_key: key });\n console.error(\"[MCP] Auto-generated local agent API key\");\n return key;\n }\n }\n console.error(\"[MCP] Failed to auto-generate agent API key:\", result.error);\n return null;\n } catch (err: any) {\n console.error(\"[MCP] Error generating agent API key:\", err.message);\n return null;\n }\n}\n\n/**\n * Derive WebSocket URL from the HTTP server URL.\n * https://whale-agent.fly.dev → wss://whale-agent.fly.dev/agent/ws\n */\nfunction getAgentWsUrl(): string {\n const base = SERVER_URL.replace(/\\/$/, \"\");\n const wsBase = base.replace(/^https:/, \"wss:\").replace(/^http:/, \"ws:\");\n return `${wsBase}/agent/ws`;\n}\n\n/**\n * Start the local agent WebSocket connection in the background.\n * Non-blocking — MCP server continues even if this fails.\n */\nasync function startLocalAgent(): Promise<void> {\n const apiKey = await getOrCreateAgentApiKey();\n if (!apiKey) {\n console.error(\"[MCP] Skipping local agent — no API key available\");\n return;\n }\n\n const wsUrl = getAgentWsUrl();\n console.error(`[MCP] Starting local agent → ${wsUrl}`);\n\n localAgent = new LocalAgentConnection({\n apiKey,\n serverUrl: wsUrl,\n onConnected: () => console.error(\"[MCP] Local agent connected — WhaleChat can now use local tools\"),\n onDisconnected: (reason) => console.error(`[MCP] Local agent disconnected: ${reason}`),\n onError: (err) => console.error(`[MCP] Local agent error: ${err.message}`),\n onLog: (msg) => console.error(msg),\n });\n\n try {\n await localAgent.connect();\n } catch (err: any) {\n console.error(`[MCP] Local agent failed to connect: ${err.message} (non-fatal)`);\n }\n}\n\n// ============================================================================\n// STARTUP\n// ============================================================================\n\nasync function main() {\n // Initialize error logging for MCP mode\n initErrorLogger({ serviceName: \"whale-code-mcp\" });\n if (USER_ID || USER_EMAIL) {\n setErrorLoggerUser(USER_ID || undefined, USER_EMAIL || undefined, STORE_ID || undefined);\n }\n\n console.error(`[MCP] Whale MCP Server v${PKG_VERSION}`);\n console.error(`[MCP] Supabase: ${SUPABASE_URL}`);\n console.error(`[MCP] Server: ${SERVER_URL}`);\n console.error(`[MCP] Store: ${STORE_ID || \"(default)\"}`);\n console.error(`[MCP] User: ${USER_EMAIL || \"(unknown)\"} [${USER_ID?.slice(0, 8) || \"no-id\"}]`);\n console.error(`[MCP] Session: ${SESSION_ID}`);\n console.error(`[MCP] Authenticated: ${isAuthenticated ? \"yes\" : \"no — use whale_login tool\"}`);\n\n // Pre-load tools from database (only if authenticated)\n if (isAuthenticated) {\n const tools = await loadToolDefinitions(true);\n console.error(`[MCP] Loaded ${tools.length} tools from registry`);\n } else {\n console.error(`[MCP] Skipping tool load — not authenticated. ${LOCAL_TOOLS.length} auth tools available.`);\n }\n\n // Start OTA update checker (non-blocking, runs in background)\n startUpdateLoop(true);\n\n // Connect via stdio\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"[MCP] Ready\");\n\n // Start local agent in background — only if authenticated\n if (isAuthenticated) {\n startLocalAgent().catch((err) => {\n console.error(\"[MCP] Local agent startup error:\", err.message);\n });\n }\n}\n\n// Graceful shutdown — disconnect local agent\nprocess.on(\"SIGINT\", () => {\n localAgent?.disconnect();\n});\nprocess.on(\"SIGTERM\", () => {\n localAgent?.disconnect();\n});\n\nmain().catch((err) => {\n console.error(\"[MCP] Fatal:\", err);\n captureError({ error: err instanceof Error ? err : new Error(String(err)), severity: \"fatal\", tags: { source: \"mcp_main\" } });\n // Give error logger a moment to flush before exit\n setTimeout(() => process.exit(1), 500);\n});\n"],"mappings":"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","ignoreList":[]}
|
package/dist/setup.js
CHANGED
|
@@ -116,36 +116,16 @@ export async function runSetup() {
|
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
console.log("");
|
|
122
|
-
const supabaseUrl = await prompt(rl, " Supabase URL");
|
|
123
|
-
if (!supabaseUrl) {
|
|
124
|
-
console.log(" Supabase URL is required. Aborting.");
|
|
125
|
-
rl.close();
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const supabaseKey = await prompt(rl, " Supabase Service Role Key");
|
|
129
|
-
if (!supabaseKey) {
|
|
130
|
-
console.log(" Service Role Key is required. Aborting.");
|
|
131
|
-
rl.close();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const storeId = await prompt(rl, " Store ID (optional, press enter to skip)");
|
|
119
|
+
// No API keys needed — whale-code uses built-in platform credentials.
|
|
120
|
+
// Users authenticate via `whale login` (browser OAuth).
|
|
121
|
+
console.log(" No API keys required — authentication is handled by `whale login`.");
|
|
135
122
|
console.log("");
|
|
136
123
|
|
|
137
|
-
// Build MCP server entry
|
|
124
|
+
// Build MCP server entry — no env vars needed for normal users
|
|
138
125
|
const serverEntry = {
|
|
139
126
|
type: "stdio",
|
|
140
127
|
command: "npx",
|
|
141
|
-
args: ["-y", "whale-code"]
|
|
142
|
-
env: {
|
|
143
|
-
SUPABASE_URL: supabaseUrl,
|
|
144
|
-
SUPABASE_SERVICE_ROLE_KEY: supabaseKey,
|
|
145
|
-
...(storeId ? {
|
|
146
|
-
STORE_ID: storeId
|
|
147
|
-
} : {})
|
|
148
|
-
}
|
|
128
|
+
args: ["-y", "whale-code"]
|
|
149
129
|
};
|
|
150
130
|
|
|
151
131
|
// Install to each detected CLI
|