lobster-cli 0.1.0 → 0.3.0

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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -268
  3. package/dist/agent/core.js +63 -0
  4. package/dist/agent/core.js.map +1 -1
  5. package/dist/agent/index.js +63 -0
  6. package/dist/agent/index.js.map +1 -1
  7. package/dist/browser/chrome-attach.js +102 -0
  8. package/dist/browser/chrome-attach.js.map +1 -0
  9. package/dist/browser/dom/compact-snapshot.js +162 -0
  10. package/dist/browser/dom/compact-snapshot.js.map +1 -0
  11. package/dist/browser/dom/index.js +160 -0
  12. package/dist/browser/dom/index.js.map +1 -1
  13. package/dist/browser/index.js +1201 -70
  14. package/dist/browser/index.js.map +1 -1
  15. package/dist/browser/manager.js +443 -11
  16. package/dist/browser/manager.js.map +1 -1
  17. package/dist/browser/page-adapter.js +370 -1
  18. package/dist/browser/page-adapter.js.map +1 -1
  19. package/dist/browser/profiles.js +238 -0
  20. package/dist/browser/profiles.js.map +1 -0
  21. package/dist/browser/semantic-find.js +152 -0
  22. package/dist/browser/semantic-find.js.map +1 -0
  23. package/dist/browser/stealth.js +187 -0
  24. package/dist/browser/stealth.js.map +1 -0
  25. package/dist/config/index.js +8 -1
  26. package/dist/config/index.js.map +1 -1
  27. package/dist/config/schema.js +8 -1
  28. package/dist/config/schema.js.map +1 -1
  29. package/dist/doc/index.js +31715 -0
  30. package/dist/doc/index.js.map +1 -0
  31. package/dist/domain-guard.js +103 -0
  32. package/dist/domain-guard.js.map +1 -0
  33. package/dist/index.js +32914 -262
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib.js +1488 -241
  36. package/dist/lib.js.map +1 -1
  37. package/dist/llm/client.js +63 -0
  38. package/dist/llm/client.js.map +1 -1
  39. package/dist/llm/index.js +63 -0
  40. package/dist/llm/index.js.map +1 -1
  41. package/dist/llm/openai-client.js +63 -0
  42. package/dist/llm/openai-client.js.map +1 -1
  43. package/dist/router/index.js +925 -61
  44. package/dist/router/index.js.map +1 -1
  45. package/package.json +16 -2
@@ -20,12 +20,19 @@ var configSchema = z.object({
20
20
  headless: z.boolean().default(true),
21
21
  connectTimeout: z.number().default(30),
22
22
  commandTimeout: z.number().default(60),
23
- cdpEndpoint: z.string().default("")
23
+ cdpEndpoint: z.string().default(""),
24
+ profile: z.string().default(""),
25
+ stealth: z.boolean().default(false)
24
26
  }).default({}),
25
27
  agent: z.object({
26
28
  maxSteps: z.number().int().default(40),
27
29
  stepDelay: z.number().default(0.4)
28
30
  }).default({}),
31
+ domains: z.object({
32
+ allow: z.array(z.string()).default([]),
33
+ block: z.array(z.string()).default([]),
34
+ blockMessage: z.string().default("")
35
+ }).default({}),
29
36
  output: z.object({
30
37
  defaultFormat: z.enum(["table", "json", "yaml", "markdown", "csv"]).default("table"),
31
38
  color: z.boolean().default(true)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/index.ts","../../src/config/schema.ts"],"sourcesContent":["import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport yaml from 'js-yaml';\nimport { configSchema, type LobsterConfig } from './schema.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\n\nexport type { LobsterConfig };\n\nconst CONFIG_DIR = join(homedir(), '.lobster');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function loadConfig(): LobsterConfig {\n ensureConfigDir();\n\n let fileConfig: Record<string, unknown> = {};\n if (existsSync(CONFIG_FILE)) {\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n fileConfig = (yaml.load(raw) as Record<string, unknown>) || {};\n }\n\n // Env var overrides\n const envOverrides: Record<string, unknown> = {};\n if (process.env.LOBSTER_API_KEY) {\n envOverrides.llm = { ...(fileConfig.llm as Record<string, unknown> || {}), apiKey: process.env.LOBSTER_API_KEY };\n }\n if (process.env.LOBSTER_MODEL) {\n envOverrides.llm = { ...(envOverrides.llm as Record<string, unknown> || fileConfig.llm as Record<string, unknown> || {}), model: process.env.LOBSTER_MODEL };\n }\n if (process.env.LOBSTER_BASE_URL) {\n envOverrides.llm = { ...(envOverrides.llm as Record<string, unknown> || fileConfig.llm as Record<string, unknown> || {}), baseURL: process.env.LOBSTER_BASE_URL };\n }\n if (process.env.LOBSTER_CDP_ENDPOINT) {\n envOverrides.browser = { ...(fileConfig.browser as Record<string, unknown> || {}), cdpEndpoint: process.env.LOBSTER_CDP_ENDPOINT };\n }\n if (process.env.LOBSTER_BROWSER_PATH) {\n envOverrides.browser = { ...(envOverrides.browser as Record<string, unknown> || fileConfig.browser as Record<string, unknown> || {}), executablePath: process.env.LOBSTER_BROWSER_PATH };\n }\n\n const merged = { ...fileConfig, ...envOverrides };\n return configSchema.parse(merged);\n}\n\nexport function saveConfig(config: Partial<LobsterConfig>): void {\n ensureConfigDir();\n const existing = loadConfig();\n const merged = deepMerge(existing, config);\n writeFileSync(CONFIG_FILE, yaml.dump(merged, { indent: 2 }), 'utf-8');\n}\n\nexport function setConfigValue(keyPath: string, value: string): void {\n const parts = keyPath.split('.');\n const obj: Record<string, unknown> = {};\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n // Try to parse as number or boolean\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value !== '') parsed = Number(value);\n\n current[parts[parts.length - 1]] = parsed;\n saveConfig(obj as Partial<LobsterConfig>);\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) &&\n target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\n result[key] = deepMerge(target[key] as Record<string, unknown>, source[key] as Record<string, unknown>);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n","import { z } from 'zod';\n\nexport const LLM_PROVIDERS = {\n openai: {\n name: 'OpenAI',\n baseURL: 'https://api.openai.com/v1',\n defaultModel: 'gpt-4o',\n keyPrefix: 'sk-',\n keyEnvHint: 'https://platform.openai.com/api-keys',\n models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o1-mini', 'o3-mini'],\n },\n anthropic: {\n name: 'Anthropic',\n baseURL: 'https://api.anthropic.com/v1',\n defaultModel: 'claude-sonnet-4-20250514',\n keyPrefix: 'sk-ant-',\n keyEnvHint: 'https://console.anthropic.com/settings/keys',\n models: ['claude-opus-4-20250514', 'claude-sonnet-4-20250514', 'claude-haiku-4-5-20251001'],\n },\n gemini: {\n name: 'Google Gemini',\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: 'gemini-2.5-flash',\n keyPrefix: 'AI',\n keyEnvHint: 'https://aistudio.google.com/apikey',\n models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-pro', 'gemini-3-flash-preview'],\n },\n ollama: {\n name: 'Ollama (local, free)',\n baseURL: 'http://localhost:11434/v1',\n defaultModel: 'llama3.1',\n keyPrefix: '',\n keyEnvHint: 'No API key needed — install from https://ollama.ai',\n models: ['llama3.1', 'llama3.2', 'mistral', 'codestral', 'qwen2.5', 'deepseek-r1'],\n },\n} as const;\n\nexport type LLMProvider = keyof typeof LLM_PROVIDERS;\n\nexport const configSchema = z.object({\n llm: z.object({\n provider: z.enum(['openai', 'anthropic', 'gemini', 'ollama']).default('openai'),\n baseURL: z.string().default('https://api.openai.com/v1'),\n model: z.string().default('gpt-4o'),\n apiKey: z.string().default(''),\n temperature: z.number().min(0).max(2).default(0.1),\n maxRetries: z.number().int().min(0).default(3),\n }).default({}),\n browser: z.object({\n executablePath: z.string().default(''),\n headless: z.boolean().default(true),\n connectTimeout: z.number().default(30),\n commandTimeout: z.number().default(60),\n cdpEndpoint: z.string().default(''),\n }).default({}),\n agent: z.object({\n maxSteps: z.number().int().default(40),\n stepDelay: z.number().default(0.4),\n }).default({}),\n output: z.object({\n defaultFormat: z.enum(['table', 'json', 'yaml', 'markdown', 'csv']).default('table'),\n color: z.boolean().default(true),\n }).default({}),\n});\n\nexport type LobsterConfig = z.infer<typeof configSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/config/index.ts","../../src/config/schema.ts"],"sourcesContent":["import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport yaml from 'js-yaml';\nimport { configSchema, type LobsterConfig } from './schema.js';\nimport { DEFAULT_CONFIG } from './defaults.js';\n\nexport type { LobsterConfig };\n\nconst CONFIG_DIR = join(homedir(), '.lobster');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.yaml');\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n}\n\nexport function loadConfig(): LobsterConfig {\n ensureConfigDir();\n\n let fileConfig: Record<string, unknown> = {};\n if (existsSync(CONFIG_FILE)) {\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n fileConfig = (yaml.load(raw) as Record<string, unknown>) || {};\n }\n\n // Env var overrides\n const envOverrides: Record<string, unknown> = {};\n if (process.env.LOBSTER_API_KEY) {\n envOverrides.llm = { ...(fileConfig.llm as Record<string, unknown> || {}), apiKey: process.env.LOBSTER_API_KEY };\n }\n if (process.env.LOBSTER_MODEL) {\n envOverrides.llm = { ...(envOverrides.llm as Record<string, unknown> || fileConfig.llm as Record<string, unknown> || {}), model: process.env.LOBSTER_MODEL };\n }\n if (process.env.LOBSTER_BASE_URL) {\n envOverrides.llm = { ...(envOverrides.llm as Record<string, unknown> || fileConfig.llm as Record<string, unknown> || {}), baseURL: process.env.LOBSTER_BASE_URL };\n }\n if (process.env.LOBSTER_CDP_ENDPOINT) {\n envOverrides.browser = { ...(fileConfig.browser as Record<string, unknown> || {}), cdpEndpoint: process.env.LOBSTER_CDP_ENDPOINT };\n }\n if (process.env.LOBSTER_BROWSER_PATH) {\n envOverrides.browser = { ...(envOverrides.browser as Record<string, unknown> || fileConfig.browser as Record<string, unknown> || {}), executablePath: process.env.LOBSTER_BROWSER_PATH };\n }\n\n const merged = { ...fileConfig, ...envOverrides };\n return configSchema.parse(merged);\n}\n\nexport function saveConfig(config: Partial<LobsterConfig>): void {\n ensureConfigDir();\n const existing = loadConfig();\n const merged = deepMerge(existing, config);\n writeFileSync(CONFIG_FILE, yaml.dump(merged, { indent: 2 }), 'utf-8');\n}\n\nexport function setConfigValue(keyPath: string, value: string): void {\n const parts = keyPath.split('.');\n const obj: Record<string, unknown> = {};\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n current[parts[i]] = {};\n current = current[parts[i]] as Record<string, unknown>;\n }\n // Try to parse as number or boolean\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value !== '') parsed = Number(value);\n\n current[parts[parts.length - 1]] = parsed;\n saveConfig(obj as Partial<LobsterConfig>);\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key]) &&\n target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\n result[key] = deepMerge(target[key] as Record<string, unknown>, source[key] as Record<string, unknown>);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n","import { z } from 'zod';\n\nexport const LLM_PROVIDERS = {\n openai: {\n name: 'OpenAI',\n baseURL: 'https://api.openai.com/v1',\n defaultModel: 'gpt-4o',\n keyPrefix: 'sk-',\n keyEnvHint: 'https://platform.openai.com/api-keys',\n models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o1-mini', 'o3-mini'],\n },\n anthropic: {\n name: 'Anthropic',\n baseURL: 'https://api.anthropic.com/v1',\n defaultModel: 'claude-sonnet-4-20250514',\n keyPrefix: 'sk-ant-',\n keyEnvHint: 'https://console.anthropic.com/settings/keys',\n models: ['claude-opus-4-20250514', 'claude-sonnet-4-20250514', 'claude-haiku-4-5-20251001'],\n },\n gemini: {\n name: 'Google Gemini',\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: 'gemini-2.5-flash',\n keyPrefix: 'AI',\n keyEnvHint: 'https://aistudio.google.com/apikey',\n models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-pro', 'gemini-3-flash-preview'],\n },\n ollama: {\n name: 'Ollama (local, free)',\n baseURL: 'http://localhost:11434/v1',\n defaultModel: 'llama3.1',\n keyPrefix: '',\n keyEnvHint: 'No API key needed — install from https://ollama.ai',\n models: ['llama3.1', 'llama3.2', 'mistral', 'codestral', 'qwen2.5', 'deepseek-r1'],\n },\n} as const;\n\nexport type LLMProvider = keyof typeof LLM_PROVIDERS;\n\nexport const configSchema = z.object({\n llm: z.object({\n provider: z.enum(['openai', 'anthropic', 'gemini', 'ollama']).default('openai'),\n baseURL: z.string().default('https://api.openai.com/v1'),\n model: z.string().default('gpt-4o'),\n apiKey: z.string().default(''),\n temperature: z.number().min(0).max(2).default(0.1),\n maxRetries: z.number().int().min(0).default(3),\n }).default({}),\n browser: z.object({\n executablePath: z.string().default(''),\n headless: z.boolean().default(true),\n connectTimeout: z.number().default(30),\n commandTimeout: z.number().default(60),\n cdpEndpoint: z.string().default(''),\n profile: z.string().default(''),\n stealth: z.boolean().default(false),\n }).default({}),\n agent: z.object({\n maxSteps: z.number().int().default(40),\n stepDelay: z.number().default(0.4),\n }).default({}),\n domains: z.object({\n allow: z.array(z.string()).default([]),\n block: z.array(z.string()).default([]),\n blockMessage: z.string().default(''),\n }).default({}),\n output: z.object({\n defaultFormat: z.enum(['table', 'json', 'yaml', 'markdown', 'csv']).default('table'),\n color: z.boolean().default(true),\n }).default({}),\n});\n\nexport type LobsterConfig = z.infer<typeof configSchema>;\n"],"mappings":"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","names":[]}
@@ -48,12 +48,19 @@ var configSchema = z.object({
48
48
  headless: z.boolean().default(true),
49
49
  connectTimeout: z.number().default(30),
50
50
  commandTimeout: z.number().default(60),
51
- cdpEndpoint: z.string().default("")
51
+ cdpEndpoint: z.string().default(""),
52
+ profile: z.string().default(""),
53
+ stealth: z.boolean().default(false)
52
54
  }).default({}),
53
55
  agent: z.object({
54
56
  maxSteps: z.number().int().default(40),
55
57
  stepDelay: z.number().default(0.4)
56
58
  }).default({}),
59
+ domains: z.object({
60
+ allow: z.array(z.string()).default([]),
61
+ block: z.array(z.string()).default([]),
62
+ blockMessage: z.string().default("")
63
+ }).default({}),
57
64
  output: z.object({
58
65
  defaultFormat: z.enum(["table", "json", "yaml", "markdown", "csv"]).default("table"),
59
66
  color: z.boolean().default(true)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const LLM_PROVIDERS = {\n openai: {\n name: 'OpenAI',\n baseURL: 'https://api.openai.com/v1',\n defaultModel: 'gpt-4o',\n keyPrefix: 'sk-',\n keyEnvHint: 'https://platform.openai.com/api-keys',\n models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o1-mini', 'o3-mini'],\n },\n anthropic: {\n name: 'Anthropic',\n baseURL: 'https://api.anthropic.com/v1',\n defaultModel: 'claude-sonnet-4-20250514',\n keyPrefix: 'sk-ant-',\n keyEnvHint: 'https://console.anthropic.com/settings/keys',\n models: ['claude-opus-4-20250514', 'claude-sonnet-4-20250514', 'claude-haiku-4-5-20251001'],\n },\n gemini: {\n name: 'Google Gemini',\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: 'gemini-2.5-flash',\n keyPrefix: 'AI',\n keyEnvHint: 'https://aistudio.google.com/apikey',\n models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-pro', 'gemini-3-flash-preview'],\n },\n ollama: {\n name: 'Ollama (local, free)',\n baseURL: 'http://localhost:11434/v1',\n defaultModel: 'llama3.1',\n keyPrefix: '',\n keyEnvHint: 'No API key needed — install from https://ollama.ai',\n models: ['llama3.1', 'llama3.2', 'mistral', 'codestral', 'qwen2.5', 'deepseek-r1'],\n },\n} as const;\n\nexport type LLMProvider = keyof typeof LLM_PROVIDERS;\n\nexport const configSchema = z.object({\n llm: z.object({\n provider: z.enum(['openai', 'anthropic', 'gemini', 'ollama']).default('openai'),\n baseURL: z.string().default('https://api.openai.com/v1'),\n model: z.string().default('gpt-4o'),\n apiKey: z.string().default(''),\n temperature: z.number().min(0).max(2).default(0.1),\n maxRetries: z.number().int().min(0).default(3),\n }).default({}),\n browser: z.object({\n executablePath: z.string().default(''),\n headless: z.boolean().default(true),\n connectTimeout: z.number().default(30),\n commandTimeout: z.number().default(60),\n cdpEndpoint: z.string().default(''),\n }).default({}),\n agent: z.object({\n maxSteps: z.number().int().default(40),\n stepDelay: z.number().default(0.4),\n }).default({}),\n output: z.object({\n defaultFormat: z.enum(['table', 'json', 'yaml', 'markdown', 'csv']).default('table'),\n color: z.boolean().default(true),\n }).default({}),\n});\n\nexport type LobsterConfig = z.infer<typeof configSchema>;\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,UAAU,eAAe,eAAe,MAAM,WAAW,SAAS;AAAA,EAC7E;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,0BAA0B,4BAA4B,2BAA2B;AAAA,EAC5F;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,oBAAoB,yBAAyB,kBAAkB,wBAAwB;AAAA,EAClG;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,YAAY,YAAY,WAAW,aAAa,WAAW,aAAa;AAAA,EACnF;AACF;AAIO,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,KAAK,EAAE,OAAO;AAAA,IACZ,UAAU,EAAE,KAAK,CAAC,UAAU,aAAa,UAAU,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AAAA,IAC9E,SAAS,EAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,IACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,IAClC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC7B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA,IACjD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,IAChB,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAClC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACpC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,OAAO,EAAE,OAAO;AAAA,IACd,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,IACrC,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACnC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,QAAQ,EAAE,OAAO;AAAA,IACf,eAAe,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,YAAY,KAAK,CAAC,EAAE,QAAQ,OAAO;AAAA,IACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/config/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const LLM_PROVIDERS = {\n openai: {\n name: 'OpenAI',\n baseURL: 'https://api.openai.com/v1',\n defaultModel: 'gpt-4o',\n keyPrefix: 'sk-',\n keyEnvHint: 'https://platform.openai.com/api-keys',\n models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o1-mini', 'o3-mini'],\n },\n anthropic: {\n name: 'Anthropic',\n baseURL: 'https://api.anthropic.com/v1',\n defaultModel: 'claude-sonnet-4-20250514',\n keyPrefix: 'sk-ant-',\n keyEnvHint: 'https://console.anthropic.com/settings/keys',\n models: ['claude-opus-4-20250514', 'claude-sonnet-4-20250514', 'claude-haiku-4-5-20251001'],\n },\n gemini: {\n name: 'Google Gemini',\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai',\n defaultModel: 'gemini-2.5-flash',\n keyPrefix: 'AI',\n keyEnvHint: 'https://aistudio.google.com/apikey',\n models: ['gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-pro', 'gemini-3-flash-preview'],\n },\n ollama: {\n name: 'Ollama (local, free)',\n baseURL: 'http://localhost:11434/v1',\n defaultModel: 'llama3.1',\n keyPrefix: '',\n keyEnvHint: 'No API key needed — install from https://ollama.ai',\n models: ['llama3.1', 'llama3.2', 'mistral', 'codestral', 'qwen2.5', 'deepseek-r1'],\n },\n} as const;\n\nexport type LLMProvider = keyof typeof LLM_PROVIDERS;\n\nexport const configSchema = z.object({\n llm: z.object({\n provider: z.enum(['openai', 'anthropic', 'gemini', 'ollama']).default('openai'),\n baseURL: z.string().default('https://api.openai.com/v1'),\n model: z.string().default('gpt-4o'),\n apiKey: z.string().default(''),\n temperature: z.number().min(0).max(2).default(0.1),\n maxRetries: z.number().int().min(0).default(3),\n }).default({}),\n browser: z.object({\n executablePath: z.string().default(''),\n headless: z.boolean().default(true),\n connectTimeout: z.number().default(30),\n commandTimeout: z.number().default(60),\n cdpEndpoint: z.string().default(''),\n profile: z.string().default(''),\n stealth: z.boolean().default(false),\n }).default({}),\n agent: z.object({\n maxSteps: z.number().int().default(40),\n stepDelay: z.number().default(0.4),\n }).default({}),\n domains: z.object({\n allow: z.array(z.string()).default([]),\n block: z.array(z.string()).default([]),\n blockMessage: z.string().default(''),\n }).default({}),\n output: z.object({\n defaultFormat: z.enum(['table', 'json', 'yaml', 'markdown', 'csv']).default('table'),\n color: z.boolean().default(true),\n }).default({}),\n});\n\nexport type LobsterConfig = z.infer<typeof configSchema>;\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,UAAU,eAAe,eAAe,MAAM,WAAW,SAAS;AAAA,EAC7E;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,0BAA0B,4BAA4B,2BAA2B;AAAA,EAC5F;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,oBAAoB,yBAAyB,kBAAkB,wBAAwB;AAAA,EAClG;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ,CAAC,YAAY,YAAY,WAAW,aAAa,WAAW,aAAa;AAAA,EACnF;AACF;AAIO,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,KAAK,EAAE,OAAO;AAAA,IACZ,UAAU,EAAE,KAAK,CAAC,UAAU,aAAa,UAAU,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AAAA,IAC9E,SAAS,EAAE,OAAO,EAAE,QAAQ,2BAA2B;AAAA,IACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,IAClC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC7B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG;AAAA,IACjD,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,IAChB,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAClC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACrC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAClC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC9B,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,OAAO,EAAE,OAAO;AAAA,IACd,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,IACrC,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACnC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,IAChB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACrC,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACrC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,QAAQ,EAAE,OAAO;AAAA,IACf,eAAe,EAAE,KAAK,CAAC,SAAS,QAAQ,QAAQ,YAAY,KAAK,CAAC,EAAE,QAAQ,OAAO;AAAA,IACnF,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;","names":[]}