uilint-core 0.2.1 → 0.2.3

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/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/ollama/bootstrap.ts","../src/scanner/html-parser.ts","../src/styleguide/reader.ts","../src/utils/workspace-root.ts","../src/tailwind/config-reader.ts"],"sourcesContent":["/**\n * Shared logger for UILint packages\n * Outputs styled messages to stderr to avoid interfering with stdout\n */\n\nimport pc from \"picocolors\";\n\nconst PREFIX = pc.cyan(\"[uilint]\");\n\n/**\n * Log an info message to stderr\n */\nexport function logInfo(message: string): void {\n console.error(`${PREFIX} ${pc.blue(\"ℹ\")} ${message}`);\n}\n\n/**\n * Log a success message to stderr\n */\nexport function logSuccess(message: string): void {\n console.error(`${PREFIX} ${pc.green(\"✓\")} ${message}`);\n}\n\n/**\n * Log a warning message to stderr\n */\nexport function logWarning(message: string): void {\n console.error(`${PREFIX} ${pc.yellow(\"⚠\")} ${message}`);\n}\n\n/**\n * Log an error message to stderr\n */\nexport function logError(message: string): void {\n console.error(`${PREFIX} ${pc.red(\"✗\")} ${message}`);\n}\n\n/**\n * Log a debug message to stderr (dimmed)\n */\nexport function logDebug(message: string): void {\n console.error(`${PREFIX} ${pc.dim(message)}`);\n}\n\n/**\n * Create a progress logger that updates the same line\n * Returns methods to update and finish the progress\n */\nexport function createProgress(initialMessage: string) {\n let lastLength = 0;\n\n const write = (message: string) => {\n // Clear the previous line if needed\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n const line = `${PREFIX} ${pc.magenta(\"⟳\")} ${message}`;\n process.stderr.write(line);\n lastLength = line.length;\n };\n\n write(initialMessage);\n\n return {\n update: (message: string) => {\n write(message);\n },\n succeed: (message: string) => {\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n console.error(`${PREFIX} ${pc.green(\"✓\")} ${message}`);\n lastLength = 0;\n },\n fail: (message: string) => {\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n console.error(`${PREFIX} ${pc.red(\"✗\")} ${message}`);\n lastLength = 0;\n },\n };\n}\n\n// Re-export picocolors for consistent styling\nexport { pc };\n","/**\n * Ollama bootstrapping utilities (Node.js only).\n *\n * Goals:\n * - Detect whether Ollama is installed.\n * - Ensure the Ollama daemon is running (best effort: start `ollama serve` detached).\n * - Ensure a given model is pulled (best effort: run `ollama pull <model>`).\n */\n\nimport { spawn, spawnSync } from \"child_process\";\nimport readline from \"readline\";\nimport { OllamaClient } from \"./client.js\";\nimport { UILINT_DEFAULT_OLLAMA_MODEL } from \"./defaults.js\";\n\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isInteractiveTTY(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nasync function promptYesNo(question: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return await new Promise<boolean>((resolve) => {\n rl.question(`${question} (y/N) `, (answer) => {\n rl.close();\n const normalized = (answer || \"\").trim().toLowerCase();\n resolve(normalized === \"y\" || normalized === \"yes\");\n });\n });\n}\n\nexport function isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], { stdio: \"ignore\" });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction isBrewInstalled(): boolean {\n const result = spawnSync(\"brew\", [\"--version\"], { stdio: \"ignore\" });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction getInstallInstructions(): string[] {\n const lines: string[] = [\n \"Ollama is required for LLM-backed analysis.\",\n \"\",\n \"Install Ollama:\",\n \" - Download: https://ollama.ai\",\n ];\n\n if (process.platform === \"darwin\") {\n lines.push(\" - Homebrew: brew install ollama\");\n }\n\n lines.push(\"\");\n lines.push(\"Then start it:\");\n lines.push(\" ollama serve\");\n return lines;\n}\n\nasync function maybeInstallOllamaWithBrew(): Promise<boolean> {\n if (process.platform !== \"darwin\") return false;\n if (!isInteractiveTTY()) return false;\n\n if (!isBrewInstalled()) {\n // We can't auto-install without brew; leave instructions to the caller.\n return false;\n }\n\n const ok = await promptYesNo(\n \"Ollama is not installed. Install with Homebrew now?\"\n );\n if (!ok) return false;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"brew\", [\"install\", \"ollama\"], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`brew install ollama failed (exit ${code})`));\n });\n });\n\n return isOllamaInstalled();\n}\n\nexport async function ensureOllamaInstalledOrExplain(): Promise<void> {\n if (isOllamaInstalled()) return;\n\n const installedViaBrew = await maybeInstallOllamaWithBrew();\n if (installedViaBrew) return;\n\n const extra: string[] = [];\n if (process.platform === \"darwin\" && !isBrewInstalled()) {\n extra.push(\"\");\n extra.push(\"Homebrew is not installed. Install it first, then run:\");\n extra.push(\" brew install ollama\");\n }\n\n throw new Error([...getInstallInstructions(), ...extra].join(\"\\n\"));\n}\n\nexport async function ensureOllamaRunning(options?: {\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<void> {\n await ensureOllamaInstalledOrExplain();\n\n const baseUrl = options?.baseUrl || DEFAULT_OLLAMA_BASE_URL;\n const client = new OllamaClient({ baseUrl });\n const timeoutMs = options?.timeoutMs ?? 10_000;\n\n if (await client.isAvailable()) return;\n\n // Best-effort background start. We do not stop it later.\n try {\n const child = spawn(\"ollama\", [\"serve\"], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n } catch (err) {\n throw new Error(\n `Failed to start Ollama automatically.\\n\\n${getInstallInstructions().join(\n \"\\n\"\n )}\\n\\nDetails: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (await client.isAvailable()) return;\n await sleep(250);\n }\n\n throw new Error(\n [\n \"Ollama did not become ready in time.\",\n \"\",\n \"Try starting it manually:\",\n \" ollama serve\",\n ].join(\"\\n\")\n );\n}\n\nasync function fetchOllamaTags(baseUrl: string): Promise<string[]> {\n const res = await fetch(`${baseUrl}/api/tags`, {\n method: \"GET\",\n signal: AbortSignal.timeout(5000),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama tags endpoint returned ${res.status}`);\n }\n\n const data = (await res.json()) as { models?: Array<{ name?: string }> };\n const names = (data.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => typeof n === \"string\");\n return names;\n}\n\nexport async function ensureOllamaModelPulled(options?: {\n model?: string;\n baseUrl?: string;\n}): Promise<void> {\n const desired = (options?.model || UILINT_DEFAULT_OLLAMA_MODEL).trim();\n if (!desired) return;\n\n const baseUrl = options?.baseUrl || DEFAULT_OLLAMA_BASE_URL;\n const tags = await fetchOllamaTags(baseUrl);\n if (tags.includes(desired)) return;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"ollama\", [\"pull\", desired], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`ollama pull ${desired} failed (exit ${code})`));\n });\n });\n\n const tagsAfter = await fetchOllamaTags(baseUrl);\n if (!tagsAfter.includes(desired)) {\n throw new Error(\n `Model ${desired} did not appear in Ollama tags after pulling.`\n );\n }\n}\n\nexport async function ensureOllamaReady(options?: {\n model?: string;\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<void> {\n await ensureOllamaRunning({\n timeoutMs: options?.timeoutMs,\n baseUrl: options?.baseUrl,\n });\n await ensureOllamaModelPulled({\n model: options?.model,\n baseUrl: options?.baseUrl,\n });\n}\n","/**\n * HTML parser for extracting styles using JSDOM\n * Used by CLI and Node.js environments\n */\n\nimport { JSDOM } from \"jsdom\";\nimport type { ExtractedStyles, DOMSnapshot, SerializedStyles } from \"../types.js\";\nimport { extractStyles, deserializeStyles, truncateHTML } from \"./style-extractor.js\";\n\nexport interface ParseOptions {\n /**\n * If true, tries to load and process linked stylesheets\n */\n loadStylesheets?: boolean;\n /**\n * Max length for HTML in snapshot\n */\n maxHtmlLength?: number;\n}\n\n/**\n * Parses raw HTML and extracts styles using JSDOM\n */\nexport function parseHTML(\n html: string,\n options: ParseOptions = {}\n): DOMSnapshot {\n const { maxHtmlLength = 50000 } = options;\n\n const dom = new JSDOM(html, {\n runScripts: \"outside-only\",\n pretendToBeVisual: true,\n });\n\n const { document, getComputedStyle } = dom.window;\n const root = document.body || document.documentElement;\n\n const styles = extractStyles(root, getComputedStyle);\n const elementCount = root.querySelectorAll(\"*\").length;\n\n return {\n html: truncateHTML(html, maxHtmlLength),\n styles,\n elementCount,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Input format for CLI - can be raw HTML or pre-extracted JSON\n */\nexport interface CLIInput {\n html: string;\n styles?: SerializedStyles;\n}\n\n/**\n * Parses CLI input which can be either raw HTML or JSON with pre-extracted styles\n */\nexport function parseCLIInput(input: string): DOMSnapshot {\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(input) as CLIInput;\n \n if (parsed.html && parsed.styles) {\n // Pre-extracted styles from browser/test environment\n return {\n html: truncateHTML(parsed.html),\n styles: deserializeStyles(parsed.styles),\n elementCount: 0, // Not available for pre-extracted\n timestamp: Date.now(),\n };\n } else if (parsed.html) {\n // Just HTML in JSON format\n return parseHTML(parsed.html);\n }\n } catch {\n // Not JSON, treat as raw HTML\n }\n\n // Parse as raw HTML\n return parseHTML(input);\n}\n\n/**\n * Checks if a string looks like JSON\n */\nexport function isJSON(str: string): boolean {\n const trimmed = str.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n}\n\n/**\n * Reads input from stdin\n */\nexport async function readStdin(): Promise<string> {\n const chunks: Uint8Array[] = [];\n \n return new Promise((resolve, reject) => {\n process.stdin.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n process.stdin.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n process.stdin.on(\"error\", reject);\n });\n}\n\n/**\n * Detects if stdin has data\n */\nexport function hasStdin(): boolean {\n return !process.stdin.isTTY;\n}\n\n","/**\n * Style guide file operations\n */\n\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\n\nexport const STYLEGUIDE_PATHS = [\n \".uilint/styleguide.md\",\n \"styleguide.md\",\n \".uilint/style-guide.md\",\n];\n\n/**\n * Walk upward from a starting directory and look specifically for `.uilint/styleguide.md`.\n *\n * This is intended for flows where the \"project root\" is ambiguous (e.g., analyzing\n * an arbitrary file path) and we want the nearest `.uilint` config on the way up.\n */\nexport function findUILintStyleGuideUpwards(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, \".uilint\", \"styleguide.md\");\n if (existsSync(candidate)) return candidate;\n\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Finds the style guide file in a project\n */\nexport function findStyleGuidePath(projectPath: string): string | null {\n for (const relativePath of STYLEGUIDE_PATHS) {\n const fullPath = join(projectPath, relativePath);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Reads the style guide content\n */\nexport async function readStyleGuide(path: string): Promise<string> {\n return readFile(path, \"utf-8\");\n}\n\n/**\n * Reads style guide from project path, finding it automatically\n */\nexport async function readStyleGuideFromProject(\n projectPath: string\n): Promise<string | null> {\n const path = findStyleGuidePath(projectPath);\n if (!path) return null;\n return readStyleGuide(path);\n}\n\n/**\n * Writes style guide content to file\n */\nexport async function writeStyleGuide(\n path: string,\n content: string\n): Promise<void> {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true });\n await writeFile(path, content, \"utf-8\");\n}\n\n/**\n * Gets the default style guide path for a project\n */\nexport function getDefaultStyleGuidePath(projectPath: string): string {\n return join(projectPath, \".uilint\", \"styleguide.md\");\n}\n\n/**\n * Checks if a style guide exists\n */\nexport function styleGuideExists(projectPath: string): boolean {\n return findStyleGuidePath(projectPath) !== null;\n}\n","/**\n * Resolve the workspace/repo root from an arbitrary starting directory.\n *\n * This is primarily used in monorepos where runtime `process.cwd()` may point at\n * a sub-app (e.g. `apps/web`) but UI linting assets live at the workspace root.\n */\nimport { existsSync, readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\n\nfunction hasWorkspacesField(dir: string): boolean {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) return false;\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { workspaces?: unknown };\n return !!pkg.workspaces;\n } catch {\n return false;\n }\n}\n\nfunction hasRootMarker(dir: string): boolean {\n // pnpm is the primary supported monorepo layout in this repo\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return true;\n // fallbacks for other setups\n if (existsSync(join(dir, \".git\"))) return true;\n if (hasWorkspacesField(dir)) return true;\n return false;\n}\n\n/**\n * Walks up from `startDir` to find a likely workspace root.\n *\n * If none is found, returns `startDir`.\n */\nexport function findWorkspaceRoot(startDir: string): string {\n let dir = startDir;\n let lastFallback: string | null = null;\n\n for (;;) {\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return dir;\n\n if (hasRootMarker(dir)) {\n // keep walking to prefer the highest-level marker (esp. .git)\n lastFallback = dir;\n }\n\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return lastFallback || startDir;\n}\n","/**\n * Tailwind config reader (Node-only).\n *\n * Goals:\n * - Locate a Tailwind config file near a project directory.\n * - Load it (supports .ts via jiti).\n * - Produce compact token sets for styleguide + validation.\n *\n * Note: We intentionally extract tokens primarily from user-defined theme / extend\n * to avoid dumping Tailwind's full default palette into the style guide.\n */\n\nimport { existsSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport jiti from \"jiti\";\nimport type { TailwindThemeTokens } from \"../types.js\";\n\nconst CONFIG_CANDIDATES = [\n \"tailwind.config.ts\",\n \"tailwind.config.mts\",\n \"tailwind.config.cts\",\n \"tailwind.config.js\",\n \"tailwind.config.mjs\",\n \"tailwind.config.cjs\",\n];\n\nexport function findTailwindConfigPath(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n for (const name of CONFIG_CANDIDATES) {\n const full = join(dir, name);\n if (existsSync(full)) return full;\n }\n\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readTailwindThemeTokens(\n projectDir: string\n): TailwindThemeTokens | null {\n const configPath = findTailwindConfigPath(projectDir);\n if (!configPath) return null;\n\n const loader = jiti(import.meta.url, { interopDefault: true });\n const loaded = loader(configPath) as any;\n const config = (loaded?.default ?? loaded) as any;\n if (!config || typeof config !== \"object\") return null;\n\n // Best-effort: run resolveConfig to ensure config is valid/normalized.\n // We don’t use the resolved theme for token enumeration (to avoid defaults),\n // but we do want to surface loader/shape problems early for debugging.\n try {\n const require = createRequire(import.meta.url);\n const maybe = require(\"tailwindcss/resolveConfig\");\n const resolveConfig = (maybe?.default ?? maybe) as\n | ((cfg: any) => any)\n | undefined;\n if (typeof resolveConfig === \"function\") resolveConfig(config);\n } catch {\n // If resolve fails, still attempt to extract from raw object.\n }\n\n const theme =\n config.theme && typeof config.theme === \"object\" ? config.theme : {};\n const extend =\n theme.extend && typeof theme.extend === \"object\" ? theme.extend : {};\n\n const colors = new Set<string>();\n const spacingKeys = new Set<string>();\n const borderRadiusKeys = new Set<string>();\n const fontFamilyKeys = new Set<string>();\n const fontSizeKeys = new Set<string>();\n\n // Merge base + extend per category.\n addColorTokens(colors, theme.colors);\n addColorTokens(colors, extend.colors);\n\n addKeys(spacingKeys, theme.spacing);\n addKeys(spacingKeys, extend.spacing);\n\n addKeys(borderRadiusKeys, theme.borderRadius);\n addKeys(borderRadiusKeys, extend.borderRadius);\n\n addKeys(fontFamilyKeys, theme.fontFamily);\n addKeys(fontFamilyKeys, extend.fontFamily);\n\n addKeys(fontSizeKeys, theme.fontSize);\n addKeys(fontSizeKeys, extend.fontSize);\n\n // If user config didn’t specify tokens, we still return an object to signal\n // \"tailwind detected\", but with empty sets (downstream can choose defaults).\n return {\n configPath,\n colors: [...colors],\n spacingKeys: [...spacingKeys],\n borderRadiusKeys: [...borderRadiusKeys],\n fontFamilyKeys: [...fontFamilyKeys],\n fontSizeKeys: [...fontSizeKeys],\n };\n}\n\nfunction addKeys(out: Set<string>, obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n if (!key) continue;\n out.add(key);\n }\n}\n\nfunction addColorTokens(out: Set<string>, colors: unknown): void {\n if (!colors || typeof colors !== \"object\") return;\n\n for (const [name, value] of Object.entries(\n colors as Record<string, unknown>\n )) {\n if (!name) continue;\n\n if (typeof value === \"string\") {\n out.add(`tailwind:${name}`);\n continue;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n for (const shade of Object.keys(value as Record<string, unknown>)) {\n if (!shade) continue;\n out.add(`tailwind:${name}-${shade}`);\n }\n continue;\n }\n\n // Arrays / functions etc are ignored for token enumeration.\n }\n}\n"],"mappings":"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","names":["existsSync","dirname","join","existsSync","dirname","join","require"]}
1
+ {"version":3,"sources":["../src/logger.ts","../src/ollama/bootstrap.ts","../src/scanner/html-parser.ts","../src/styleguide/reader.ts","../src/utils/workspace-root.ts","../src/tailwind/config-reader.ts","../../../node_modules/.pnpm/ollama@0.6.3/node_modules/ollama/dist/index.mjs","../../../node_modules/.pnpm/whatwg-fetch@3.6.20/node_modules/whatwg-fetch/fetch.js","../../../node_modules/.pnpm/ollama@0.6.3/node_modules/ollama/dist/browser.mjs","../src/scanner/vision-analyzer.ts"],"sourcesContent":["/**\n * Shared logger for UILint packages\n * Outputs styled messages to stderr to avoid interfering with stdout\n */\n\nimport pc from \"picocolors\";\n\nconst PREFIX = pc.cyan(\"[uilint]\");\n\n/**\n * Log an info message to stderr\n */\nexport function logInfo(message: string): void {\n console.error(`${PREFIX} ${pc.blue(\"ℹ\")} ${message}`);\n}\n\n/**\n * Log a success message to stderr\n */\nexport function logSuccess(message: string): void {\n console.error(`${PREFIX} ${pc.green(\"✓\")} ${message}`);\n}\n\n/**\n * Log a warning message to stderr\n */\nexport function logWarning(message: string): void {\n console.error(`${PREFIX} ${pc.yellow(\"⚠\")} ${message}`);\n}\n\n/**\n * Log an error message to stderr\n */\nexport function logError(message: string): void {\n console.error(`${PREFIX} ${pc.red(\"✗\")} ${message}`);\n}\n\n/**\n * Log a debug message to stderr (dimmed)\n */\nexport function logDebug(message: string): void {\n console.error(`${PREFIX} ${pc.dim(message)}`);\n}\n\n/**\n * Create a progress logger that updates the same line\n * Returns methods to update and finish the progress\n */\nexport function createProgress(initialMessage: string) {\n let lastLength = 0;\n\n const write = (message: string) => {\n // Clear the previous line if needed\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n const line = `${PREFIX} ${pc.magenta(\"⟳\")} ${message}`;\n process.stderr.write(line);\n lastLength = line.length;\n };\n\n write(initialMessage);\n\n return {\n update: (message: string) => {\n write(message);\n },\n succeed: (message: string) => {\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n console.error(`${PREFIX} ${pc.green(\"✓\")} ${message}`);\n lastLength = 0;\n },\n fail: (message: string) => {\n if (lastLength > 0) {\n process.stderr.write(\"\\r\" + \" \".repeat(lastLength) + \"\\r\");\n }\n console.error(`${PREFIX} ${pc.red(\"✗\")} ${message}`);\n lastLength = 0;\n },\n };\n}\n\n// Re-export picocolors for consistent styling\nexport { pc };\n","/**\n * Ollama bootstrapping utilities (Node.js only).\n *\n * Goals:\n * - Detect whether Ollama is installed.\n * - Ensure the Ollama daemon is running (best effort: start `ollama serve` detached).\n * - Ensure a given model is pulled (best effort: run `ollama pull <model>`).\n */\n\nimport { spawn, spawnSync } from \"child_process\";\nimport readline from \"readline\";\nimport { OllamaClient } from \"./client.js\";\nimport { UILINT_DEFAULT_OLLAMA_MODEL } from \"./defaults.js\";\n\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isInteractiveTTY(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nasync function promptYesNo(question: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n return await new Promise<boolean>((resolve) => {\n rl.question(`${question} (y/N) `, (answer) => {\n rl.close();\n const normalized = (answer || \"\").trim().toLowerCase();\n resolve(normalized === \"y\" || normalized === \"yes\");\n });\n });\n}\n\nexport function isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], { stdio: \"ignore\" });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction isBrewInstalled(): boolean {\n const result = spawnSync(\"brew\", [\"--version\"], { stdio: \"ignore\" });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction getInstallInstructions(): string[] {\n const lines: string[] = [\n \"Ollama is required for LLM-backed analysis.\",\n \"\",\n \"Install Ollama:\",\n \" - Download: https://ollama.ai\",\n ];\n\n if (process.platform === \"darwin\") {\n lines.push(\" - Homebrew: brew install ollama\");\n }\n\n lines.push(\"\");\n lines.push(\"Then start it:\");\n lines.push(\" ollama serve\");\n return lines;\n}\n\nasync function maybeInstallOllamaWithBrew(): Promise<boolean> {\n if (process.platform !== \"darwin\") return false;\n if (!isInteractiveTTY()) return false;\n\n if (!isBrewInstalled()) {\n // We can't auto-install without brew; leave instructions to the caller.\n return false;\n }\n\n const ok = await promptYesNo(\n \"Ollama is not installed. Install with Homebrew now?\"\n );\n if (!ok) return false;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"brew\", [\"install\", \"ollama\"], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`brew install ollama failed (exit ${code})`));\n });\n });\n\n return isOllamaInstalled();\n}\n\nexport async function ensureOllamaInstalledOrExplain(): Promise<void> {\n if (isOllamaInstalled()) return;\n\n const installedViaBrew = await maybeInstallOllamaWithBrew();\n if (installedViaBrew) return;\n\n const extra: string[] = [];\n if (process.platform === \"darwin\" && !isBrewInstalled()) {\n extra.push(\"\");\n extra.push(\"Homebrew is not installed. Install it first, then run:\");\n extra.push(\" brew install ollama\");\n }\n\n throw new Error([...getInstallInstructions(), ...extra].join(\"\\n\"));\n}\n\nexport async function ensureOllamaRunning(options?: {\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<void> {\n await ensureOllamaInstalledOrExplain();\n\n const baseUrl = options?.baseUrl || DEFAULT_OLLAMA_BASE_URL;\n const client = new OllamaClient({ baseUrl });\n const timeoutMs = options?.timeoutMs ?? 10_000;\n\n if (await client.isAvailable()) return;\n\n // Best-effort background start. We do not stop it later.\n try {\n const child = spawn(\"ollama\", [\"serve\"], {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n } catch (err) {\n throw new Error(\n `Failed to start Ollama automatically.\\n\\n${getInstallInstructions().join(\n \"\\n\"\n )}\\n\\nDetails: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (await client.isAvailable()) return;\n await sleep(250);\n }\n\n throw new Error(\n [\n \"Ollama did not become ready in time.\",\n \"\",\n \"Try starting it manually:\",\n \" ollama serve\",\n ].join(\"\\n\")\n );\n}\n\nasync function fetchOllamaTags(baseUrl: string): Promise<string[]> {\n const res = await fetch(`${baseUrl}/api/tags`, {\n method: \"GET\",\n signal: AbortSignal.timeout(5000),\n });\n\n if (!res.ok) {\n throw new Error(`Ollama tags endpoint returned ${res.status}`);\n }\n\n const data = (await res.json()) as { models?: Array<{ name?: string }> };\n const names = (data.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => typeof n === \"string\");\n return names;\n}\n\nexport async function ensureOllamaModelPulled(options?: {\n model?: string;\n baseUrl?: string;\n}): Promise<void> {\n const desired = (options?.model || UILINT_DEFAULT_OLLAMA_MODEL).trim();\n if (!desired) return;\n\n const baseUrl = options?.baseUrl || DEFAULT_OLLAMA_BASE_URL;\n const tags = await fetchOllamaTags(baseUrl);\n if (tags.includes(desired)) return;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"ollama\", [\"pull\", desired], { stdio: \"inherit\" });\n child.on(\"error\", reject);\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`ollama pull ${desired} failed (exit ${code})`));\n });\n });\n\n const tagsAfter = await fetchOllamaTags(baseUrl);\n if (!tagsAfter.includes(desired)) {\n throw new Error(\n `Model ${desired} did not appear in Ollama tags after pulling.`\n );\n }\n}\n\nexport async function ensureOllamaReady(options?: {\n model?: string;\n timeoutMs?: number;\n baseUrl?: string;\n}): Promise<void> {\n await ensureOllamaRunning({\n timeoutMs: options?.timeoutMs,\n baseUrl: options?.baseUrl,\n });\n await ensureOllamaModelPulled({\n model: options?.model,\n baseUrl: options?.baseUrl,\n });\n}\n","/**\n * HTML parser for extracting styles using JSDOM\n * Used by CLI and Node.js environments\n */\n\nimport { JSDOM } from \"jsdom\";\nimport type { ExtractedStyles, DOMSnapshot, SerializedStyles } from \"../types.js\";\nimport { extractStyles, deserializeStyles, truncateHTML } from \"./style-extractor.js\";\n\nexport interface ParseOptions {\n /**\n * If true, tries to load and process linked stylesheets\n */\n loadStylesheets?: boolean;\n /**\n * Max length for HTML in snapshot\n */\n maxHtmlLength?: number;\n}\n\n/**\n * Parses raw HTML and extracts styles using JSDOM\n */\nexport function parseHTML(\n html: string,\n options: ParseOptions = {}\n): DOMSnapshot {\n const { maxHtmlLength = 50000 } = options;\n\n const dom = new JSDOM(html, {\n runScripts: \"outside-only\",\n pretendToBeVisual: true,\n });\n\n const { document, getComputedStyle } = dom.window;\n const root = document.body || document.documentElement;\n\n const styles = extractStyles(root, getComputedStyle);\n const elementCount = root.querySelectorAll(\"*\").length;\n\n return {\n html: truncateHTML(html, maxHtmlLength),\n styles,\n elementCount,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Input format for CLI - can be raw HTML or pre-extracted JSON\n */\nexport interface CLIInput {\n html: string;\n styles?: SerializedStyles;\n}\n\n/**\n * Parses CLI input which can be either raw HTML or JSON with pre-extracted styles\n */\nexport function parseCLIInput(input: string): DOMSnapshot {\n // Try to parse as JSON first\n try {\n const parsed = JSON.parse(input) as CLIInput;\n \n if (parsed.html && parsed.styles) {\n // Pre-extracted styles from browser/test environment\n return {\n html: truncateHTML(parsed.html),\n styles: deserializeStyles(parsed.styles),\n elementCount: 0, // Not available for pre-extracted\n timestamp: Date.now(),\n };\n } else if (parsed.html) {\n // Just HTML in JSON format\n return parseHTML(parsed.html);\n }\n } catch {\n // Not JSON, treat as raw HTML\n }\n\n // Parse as raw HTML\n return parseHTML(input);\n}\n\n/**\n * Checks if a string looks like JSON\n */\nexport function isJSON(str: string): boolean {\n const trimmed = str.trim();\n return trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n}\n\n/**\n * Reads input from stdin\n */\nexport async function readStdin(): Promise<string> {\n const chunks: Uint8Array[] = [];\n \n return new Promise((resolve, reject) => {\n process.stdin.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n process.stdin.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n process.stdin.on(\"error\", reject);\n });\n}\n\n/**\n * Detects if stdin has data\n */\nexport function hasStdin(): boolean {\n return !process.stdin.isTTY;\n}\n\n","/**\n * Style guide file operations\n */\n\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\n\nexport const STYLEGUIDE_PATHS = [\n \".uilint/styleguide.md\",\n \"styleguide.md\",\n \".uilint/style-guide.md\",\n];\n\n/**\n * Walk upward from a starting directory and look specifically for `.uilint/styleguide.md`.\n *\n * This is intended for flows where the \"project root\" is ambiguous (e.g., analyzing\n * an arbitrary file path) and we want the nearest `.uilint` config on the way up.\n */\nexport function findUILintStyleGuideUpwards(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, \".uilint\", \"styleguide.md\");\n if (existsSync(candidate)) return candidate;\n\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\n/**\n * Finds the style guide file in a project\n */\nexport function findStyleGuidePath(projectPath: string): string | null {\n for (const relativePath of STYLEGUIDE_PATHS) {\n const fullPath = join(projectPath, relativePath);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n return null;\n}\n\n/**\n * Reads the style guide content\n */\nexport async function readStyleGuide(path: string): Promise<string> {\n return readFile(path, \"utf-8\");\n}\n\n/**\n * Reads style guide from project path, finding it automatically\n */\nexport async function readStyleGuideFromProject(\n projectPath: string\n): Promise<string | null> {\n const path = findStyleGuidePath(projectPath);\n if (!path) return null;\n return readStyleGuide(path);\n}\n\n/**\n * Writes style guide content to file\n */\nexport async function writeStyleGuide(\n path: string,\n content: string\n): Promise<void> {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true });\n await writeFile(path, content, \"utf-8\");\n}\n\n/**\n * Gets the default style guide path for a project\n */\nexport function getDefaultStyleGuidePath(projectPath: string): string {\n return join(projectPath, \".uilint\", \"styleguide.md\");\n}\n\n/**\n * Checks if a style guide exists\n */\nexport function styleGuideExists(projectPath: string): boolean {\n return findStyleGuidePath(projectPath) !== null;\n}\n","/**\n * Resolve the workspace/repo root from an arbitrary starting directory.\n *\n * This is primarily used in monorepos where runtime `process.cwd()` may point at\n * a sub-app (e.g. `apps/web`) but UI linting assets live at the workspace root.\n */\nimport { existsSync, readFileSync } from \"fs\";\nimport { dirname, join } from \"path\";\n\nfunction hasWorkspacesField(dir: string): boolean {\n const pkgPath = join(dir, \"package.json\");\n if (!existsSync(pkgPath)) return false;\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { workspaces?: unknown };\n return !!pkg.workspaces;\n } catch {\n return false;\n }\n}\n\nfunction hasRootMarker(dir: string): boolean {\n // pnpm is the primary supported monorepo layout in this repo\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return true;\n // fallbacks for other setups\n if (existsSync(join(dir, \".git\"))) return true;\n if (hasWorkspacesField(dir)) return true;\n return false;\n}\n\n/**\n * Walks up from `startDir` to find a likely workspace root.\n *\n * If none is found, returns `startDir`.\n */\nexport function findWorkspaceRoot(startDir: string): string {\n let dir = startDir;\n let lastFallback: string | null = null;\n\n for (;;) {\n if (existsSync(join(dir, \"pnpm-workspace.yaml\"))) return dir;\n\n if (hasRootMarker(dir)) {\n // keep walking to prefer the highest-level marker (esp. .git)\n lastFallback = dir;\n }\n\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return lastFallback || startDir;\n}\n","/**\n * Tailwind config reader (Node-only).\n *\n * Goals:\n * - Locate a Tailwind config file near a project directory.\n * - Load it (supports .ts via jiti).\n * - Produce compact token sets for styleguide + validation.\n *\n * Note: We intentionally extract tokens primarily from user-defined theme / extend\n * to avoid dumping Tailwind's full default palette into the style guide.\n */\n\nimport { existsSync } from \"fs\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport jiti from \"jiti\";\nimport type { TailwindThemeTokens } from \"../types.js\";\n\nconst CONFIG_CANDIDATES = [\n \"tailwind.config.ts\",\n \"tailwind.config.mts\",\n \"tailwind.config.cts\",\n \"tailwind.config.js\",\n \"tailwind.config.mjs\",\n \"tailwind.config.cjs\",\n];\n\nexport function findTailwindConfigPath(startDir: string): string | null {\n let dir = startDir;\n for (;;) {\n for (const name of CONFIG_CANDIDATES) {\n const full = join(dir, name);\n if (existsSync(full)) return full;\n }\n\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport function readTailwindThemeTokens(\n projectDir: string\n): TailwindThemeTokens | null {\n const configPath = findTailwindConfigPath(projectDir);\n if (!configPath) return null;\n\n const loader = jiti(import.meta.url, { interopDefault: true });\n const loaded = loader(configPath) as any;\n const config = (loaded?.default ?? loaded) as any;\n if (!config || typeof config !== \"object\") return null;\n\n // Best-effort: run resolveConfig to ensure config is valid/normalized.\n // We don’t use the resolved theme for token enumeration (to avoid defaults),\n // but we do want to surface loader/shape problems early for debugging.\n try {\n const require = createRequire(import.meta.url);\n const maybe = require(\"tailwindcss/resolveConfig\");\n const resolveConfig = (maybe?.default ?? maybe) as\n | ((cfg: any) => any)\n | undefined;\n if (typeof resolveConfig === \"function\") resolveConfig(config);\n } catch {\n // If resolve fails, still attempt to extract from raw object.\n }\n\n const theme =\n config.theme && typeof config.theme === \"object\" ? config.theme : {};\n const extend =\n theme.extend && typeof theme.extend === \"object\" ? theme.extend : {};\n\n const colors = new Set<string>();\n const spacingKeys = new Set<string>();\n const borderRadiusKeys = new Set<string>();\n const fontFamilyKeys = new Set<string>();\n const fontSizeKeys = new Set<string>();\n\n // Merge base + extend per category.\n addColorTokens(colors, theme.colors);\n addColorTokens(colors, extend.colors);\n\n addKeys(spacingKeys, theme.spacing);\n addKeys(spacingKeys, extend.spacing);\n\n addKeys(borderRadiusKeys, theme.borderRadius);\n addKeys(borderRadiusKeys, extend.borderRadius);\n\n addKeys(fontFamilyKeys, theme.fontFamily);\n addKeys(fontFamilyKeys, extend.fontFamily);\n\n addKeys(fontSizeKeys, theme.fontSize);\n addKeys(fontSizeKeys, extend.fontSize);\n\n // If user config didn’t specify tokens, we still return an object to signal\n // \"tailwind detected\", but with empty sets (downstream can choose defaults).\n return {\n configPath,\n colors: [...colors],\n spacingKeys: [...spacingKeys],\n borderRadiusKeys: [...borderRadiusKeys],\n fontFamilyKeys: [...fontFamilyKeys],\n fontSizeKeys: [...fontSizeKeys],\n };\n}\n\nfunction addKeys(out: Set<string>, obj: unknown): void {\n if (!obj || typeof obj !== \"object\") return;\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n if (!key) continue;\n out.add(key);\n }\n}\n\nfunction addColorTokens(out: Set<string>, colors: unknown): void {\n if (!colors || typeof colors !== \"object\") return;\n\n for (const [name, value] of Object.entries(\n colors as Record<string, unknown>\n )) {\n if (!name) continue;\n\n if (typeof value === \"string\") {\n out.add(`tailwind:${name}`);\n continue;\n }\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n for (const shade of Object.keys(value as Record<string, unknown>)) {\n if (!shade) continue;\n out.add(`tailwind:${name}-${shade}`);\n }\n continue;\n }\n\n // Arrays / functions etc are ignored for token enumeration.\n }\n}\n","import fs, { promises } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { Ollama as Ollama$1 } from './browser.mjs';\nimport 'whatwg-fetch';\n\nclass Ollama extends Ollama$1 {\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n return Buffer.from(image).toString(\"base64\");\n }\n try {\n if (fs.existsSync(image)) {\n const fileBuffer = await promises.readFile(resolve(image));\n return Buffer.from(fileBuffer).toString(\"base64\");\n }\n } catch {\n }\n return image;\n }\n /**\n * checks if a file exists\n * @param path {string} - The path to the file\n * @private @internal\n * @returns {Promise<boolean>} - Whether the file exists or not\n */\n async fileExists(path) {\n try {\n await promises.access(path);\n return true;\n } catch {\n return false;\n }\n }\n async create(request) {\n if (request.from && await this.fileExists(resolve(request.from))) {\n throw Error(\"Creating with a local path is not currently supported from ollama-js\");\n }\n if (request.stream) {\n return super.create(request);\n } else {\n return super.create(request);\n }\n }\n}\nconst index = new Ollama();\n\nexport { Ollama, index as default };\n","/* eslint-disable no-prototype-builtins */\nvar g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {}\n\nvar support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type)\n var encoding = match ? match[1] : 'utf-8'\n reader.readAsText(blob, encoding)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._noBody = true;\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n try {\n headers.append(key, value)\n } catch (error) {\n console.warn('Response ' + error.message)\n }\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 200, statusText: ''})\n response.ok = false\n response.status = 0\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = g.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name))\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value)\n }\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!g.fetch) {\n g.fetch = fetch\n g.Headers = Headers\n g.Request = Request\n g.Response = Response\n}\n","import 'whatwg-fetch';\n\nconst defaultPort = \"11434\";\nconst defaultHost = `http://127.0.0.1:${defaultPort}`;\n\nconst version = \"0.6.3\";\n\nvar __defProp$1 = Object.defineProperty;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField$1 = (obj, key, value) => {\n __defNormalProp$1(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nclass ResponseError extends Error {\n constructor(error, status_code) {\n super(error);\n this.error = error;\n this.status_code = status_code;\n this.name = \"ResponseError\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ResponseError);\n }\n }\n}\nclass AbortableAsyncIterator {\n constructor(abortController, itr, doneCallback) {\n __publicField$1(this, \"abortController\");\n __publicField$1(this, \"itr\");\n __publicField$1(this, \"doneCallback\");\n this.abortController = abortController;\n this.itr = itr;\n this.doneCallback = doneCallback;\n }\n abort() {\n this.abortController.abort();\n }\n async *[Symbol.asyncIterator]() {\n for await (const message of this.itr) {\n if (\"error\" in message) {\n throw new Error(message.error);\n }\n yield message;\n if (message.done || message.status === \"success\") {\n this.doneCallback();\n return;\n }\n }\n throw new Error(\"Did not receive done or success response in stream.\");\n }\n}\nconst checkOk = async (response) => {\n if (response.ok) {\n return;\n }\n let message = `Error ${response.status}: ${response.statusText}`;\n let errorData = null;\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n try {\n errorData = await response.json();\n message = errorData.error || message;\n } catch (error) {\n console.log(\"Failed to parse error response as JSON\");\n }\n } else {\n try {\n console.log(\"Getting text from response\");\n const textResponse = await response.text();\n message = textResponse || message;\n } catch (error) {\n console.log(\"Failed to get text from error response\");\n }\n }\n throw new ResponseError(message, response.status);\n};\nfunction getPlatform() {\n if (typeof window !== \"undefined\" && window.navigator) {\n const nav = navigator;\n if (\"userAgentData\" in nav && nav.userAgentData?.platform) {\n return `${nav.userAgentData.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n if (navigator.platform) {\n return `${navigator.platform.toLowerCase()} Browser/${navigator.userAgent};`;\n }\n return `unknown Browser/${navigator.userAgent};`;\n } else if (typeof process !== \"undefined\") {\n return `${process.arch} ${process.platform} Node.js/${process.version}`;\n }\n return \"\";\n}\nfunction normalizeHeaders(headers) {\n if (headers instanceof Headers) {\n const obj = {};\n headers.forEach((value, key) => {\n obj[key] = value;\n });\n return obj;\n } else if (Array.isArray(headers)) {\n return Object.fromEntries(headers);\n } else {\n return headers || {};\n }\n}\nconst readEnvVar = (obj, key) => {\n return obj[key];\n};\nconst fetchWithHeaders = async (fetch, url, options = {}) => {\n const defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"User-Agent\": `ollama-js/${version} (${getPlatform()})`\n };\n options.headers = normalizeHeaders(options.headers);\n try {\n const parsed = new URL(url);\n if (parsed.protocol === \"https:\" && parsed.hostname === \"ollama.com\") {\n const apiKey = typeof process === \"object\" && process !== null && typeof process.env === \"object\" && process.env !== null ? readEnvVar(process.env, \"OLLAMA_API_KEY\") : void 0;\n const authorization = options.headers[\"authorization\"] || options.headers[\"Authorization\"];\n if (!authorization && apiKey) {\n options.headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n }\n } catch (error) {\n console.error(\"error parsing url\", error);\n }\n const customHeaders = Object.fromEntries(\n Object.entries(options.headers).filter(\n ([key]) => !Object.keys(defaultHeaders).some(\n (defaultKey) => defaultKey.toLowerCase() === key.toLowerCase()\n )\n )\n );\n options.headers = {\n ...defaultHeaders,\n ...customHeaders\n };\n return fetch(url, options);\n};\nconst get = async (fetch, host, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst post = async (fetch, host, data, options) => {\n const isRecord = (input) => {\n return input !== null && typeof input === \"object\" && !Array.isArray(input);\n };\n const formattedData = isRecord(data) ? JSON.stringify(data) : data;\n const response = await fetchWithHeaders(fetch, host, {\n method: \"POST\",\n body: formattedData,\n signal: options?.signal,\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst del = async (fetch, host, data, options) => {\n const response = await fetchWithHeaders(fetch, host, {\n method: \"DELETE\",\n body: JSON.stringify(data),\n headers: options?.headers\n });\n await checkOk(response);\n return response;\n};\nconst parseJSON = async function* (itr) {\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n const reader = itr.getReader();\n while (true) {\n const { done, value: chunk } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(chunk, { stream: true });\n const parts = buffer.split(\"\\n\");\n buffer = parts.pop() ?? \"\";\n for (const part of parts) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n }\n buffer += decoder.decode();\n for (const part of buffer.split(\"\\n\").filter((p) => p !== \"\")) {\n try {\n yield JSON.parse(part);\n } catch (error) {\n console.warn(\"invalid json: \", part);\n }\n }\n};\nconst formatHost = (host) => {\n if (!host) {\n return defaultHost;\n }\n let isExplicitProtocol = host.includes(\"://\");\n if (host.startsWith(\":\")) {\n host = `http://127.0.0.1${host}`;\n isExplicitProtocol = true;\n }\n if (!isExplicitProtocol) {\n host = `http://${host}`;\n }\n const url = new URL(host);\n let port = url.port;\n if (!port) {\n if (!isExplicitProtocol) {\n port = defaultPort;\n } else {\n port = url.protocol === \"https:\" ? \"443\" : \"80\";\n }\n }\n let auth = \"\";\n if (url.username) {\n auth = url.username;\n if (url.password) {\n auth += `:${url.password}`;\n }\n auth += \"@\";\n }\n let formattedHost = `${url.protocol}//${auth}${url.hostname}:${port}${url.pathname}`;\n if (formattedHost.endsWith(\"/\")) {\n formattedHost = formattedHost.slice(0, -1);\n }\n return formattedHost;\n};\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nlet Ollama$1 = class Ollama {\n constructor(config) {\n __publicField(this, \"config\");\n __publicField(this, \"fetch\");\n __publicField(this, \"ongoingStreamedRequests\", []);\n this.config = {\n host: \"\",\n headers: config?.headers\n };\n if (!config?.proxy) {\n this.config.host = formatHost(config?.host ?? defaultHost);\n }\n this.fetch = config?.fetch ?? fetch;\n }\n // Abort any ongoing streamed requests to Ollama\n abort() {\n for (const request of this.ongoingStreamedRequests) {\n request.abort();\n }\n this.ongoingStreamedRequests.length = 0;\n }\n /**\n * Processes a request to the Ollama server. If the request is streamable, it will return a\n * AbortableAsyncIterator that yields the response messages. Otherwise, it will return the response\n * object.\n * @param endpoint {string} - The endpoint to send the request to.\n * @param request {object} - The request object to send to the endpoint.\n * @protected {T | AbortableAsyncIterator<T>} - The response object or a AbortableAsyncIterator that yields\n * response messages.\n * @throws {Error} - If the response body is missing or if the response is an error.\n * @returns {Promise<T | AbortableAsyncIterator<T>>} - The response object or a AbortableAsyncIterator that yields the streamed response.\n */\n async processStreamableRequest(endpoint, request) {\n request.stream = request.stream ?? false;\n const host = `${this.config.host}/api/${endpoint}`;\n if (request.stream) {\n const abortController = new AbortController();\n const response2 = await post(this.fetch, host, request, {\n signal: abortController.signal,\n headers: this.config.headers\n });\n if (!response2.body) {\n throw new Error(\"Missing body\");\n }\n const itr = parseJSON(response2.body);\n const abortableAsyncIterator = new AbortableAsyncIterator(\n abortController,\n itr,\n () => {\n const i = this.ongoingStreamedRequests.indexOf(abortableAsyncIterator);\n if (i > -1) {\n this.ongoingStreamedRequests.splice(i, 1);\n }\n }\n );\n this.ongoingStreamedRequests.push(abortableAsyncIterator);\n return abortableAsyncIterator;\n }\n const response = await post(this.fetch, host, request, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Encodes an image to base64 if it is a Uint8Array.\n * @param image {Uint8Array | string} - The image to encode.\n * @returns {Promise<string>} - The base64 encoded image.\n */\n async encodeImage(image) {\n if (typeof image !== \"string\") {\n const uint8Array = new Uint8Array(image);\n let byteString = \"\";\n const len = uint8Array.byteLength;\n for (let i = 0; i < len; i++) {\n byteString += String.fromCharCode(uint8Array[i]);\n }\n return btoa(byteString);\n }\n return image;\n }\n /**\n * Generates a response from a text prompt.\n * @param request {GenerateRequest} - The request object.\n * @returns {Promise<GenerateResponse | AbortableAsyncIterator<GenerateResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async generate(request) {\n if (request.images) {\n request.images = await Promise.all(request.images.map(this.encodeImage.bind(this)));\n }\n return this.processStreamableRequest(\"generate\", request);\n }\n /**\n * Chats with the model. The request object can contain messages with images that are either\n * Uint8Arrays or base64 encoded strings. The images will be base64 encoded before sending the\n * request.\n * @param request {ChatRequest} - The request object.\n * @returns {Promise<ChatResponse | AbortableAsyncIterator<ChatResponse>>} - The response object or an\n * AbortableAsyncIterator that yields response messages.\n */\n async chat(request) {\n if (request.messages) {\n for (const message of request.messages) {\n if (message.images) {\n message.images = await Promise.all(\n message.images.map(this.encodeImage.bind(this))\n );\n }\n }\n }\n return this.processStreamableRequest(\"chat\", request);\n }\n /**\n * Creates a new model from a stream of data.\n * @param request {CreateRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or a stream of progress responses.\n */\n async create(request) {\n return this.processStreamableRequest(\"create\", {\n ...request\n });\n }\n /**\n * Pulls a model from the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PullRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async pull(request) {\n return this.processStreamableRequest(\"pull\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Pushes a model to the Ollama registry. The request object can contain a stream flag to indicate if the\n * response should be streamed.\n * @param request {PushRequest} - The request object.\n * @returns {Promise<ProgressResponse | AbortableAsyncIterator<ProgressResponse>>} - The response object or\n * an AbortableAsyncIterator that yields response messages.\n */\n async push(request) {\n return this.processStreamableRequest(\"push\", {\n name: request.model,\n stream: request.stream,\n insecure: request.insecure\n });\n }\n /**\n * Deletes a model from the server. The request object should contain the name of the model to\n * delete.\n * @param request {DeleteRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async delete(request) {\n await del(\n this.fetch,\n `${this.config.host}/api/delete`,\n { name: request.model },\n { headers: this.config.headers }\n );\n return { status: \"success\" };\n }\n /**\n * Copies a model from one name to another. The request object should contain the name of the\n * model to copy and the new name.\n * @param request {CopyRequest} - The request object.\n * @returns {Promise<StatusResponse>} - The response object.\n */\n async copy(request) {\n await post(this.fetch, `${this.config.host}/api/copy`, { ...request }, {\n headers: this.config.headers\n });\n return { status: \"success\" };\n }\n /**\n * Lists the models on the server.\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async list() {\n const response = await get(this.fetch, `${this.config.host}/api/tags`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Shows the metadata of a model. The request object should contain the name of the model.\n * @param request {ShowRequest} - The request object.\n * @returns {Promise<ShowResponse>} - The response object.\n */\n async show(request) {\n const response = await post(this.fetch, `${this.config.host}/api/show`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds text input into vectors.\n * @param request {EmbedRequest} - The request object.\n * @returns {Promise<EmbedResponse>} - The response object.\n */\n async embed(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embed`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Embeds a text prompt into a vector.\n * @param request {EmbeddingsRequest} - The request object.\n * @returns {Promise<EmbeddingsResponse>} - The response object.\n */\n async embeddings(request) {\n const response = await post(this.fetch, `${this.config.host}/api/embeddings`, {\n ...request\n }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Lists the running models on the server\n * @returns {Promise<ListResponse>} - The response object.\n * @throws {Error} - If the response body is missing.\n */\n async ps() {\n const response = await get(this.fetch, `${this.config.host}/api/ps`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Returns the Ollama server version.\n * @returns {Promise<VersionResponse>} - The server version object.\n */\n async version() {\n const response = await get(this.fetch, `${this.config.host}/api/version`, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Performs web search using the Ollama web search API\n * @param request {WebSearchRequest} - The search request containing query and options\n * @returns {Promise<WebSearchResponse>} - The search results\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webSearch(request) {\n if (!request.query || request.query.length === 0) {\n throw new Error(\"Query is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_search`, { ...request }, {\n headers: this.config.headers\n });\n return await response.json();\n }\n /**\n * Fetches a single page using the Ollama web fetch API\n * @param request {WebFetchRequest} - The fetch request containing a URL\n * @returns {Promise<WebFetchResponse>} - The fetch result\n * @throws {Error} - If the request is invalid or the server returns an error\n */\n async webFetch(request) {\n if (!request.url || request.url.length === 0) {\n throw new Error(\"URL is required\");\n }\n const response = await post(this.fetch, `https://ollama.com/api/web_fetch`, { ...request }, { headers: this.config.headers });\n return await response.json();\n }\n};\nconst browser = new Ollama$1();\n\nexport { Ollama$1 as Ollama, browser as default };\n","/**\n * Vision analyzer for Ollama vision LLM analysis\n *\n * This module provides functionality to analyze screenshots using Ollama's\n * vision models (e.g., qwen3-vl, llava) to detect UI consistency issues\n * that are only visible in rendered output.\n *\n * Uses the official ollama npm package with the chat API for proper vision support.\n */\n\nimport { Ollama } from \"ollama\";\nimport type {\n OllamaClientOptions,\n StreamProgressCallback,\n LLMInstrumentationCallbacks,\n InstrumentationSpan,\n} from \"../types.js\";\n\n/**\n * Default vision model - qwen3-vl is recommended for UI analysis\n */\nexport const UILINT_DEFAULT_VISION_MODEL = \"qwen3-vl:8b-instruct\";\n\n/**\n * Element manifest entry (matches uilint-react/scanner/vision-capture.ts)\n */\nexport interface ElementManifest {\n id: string;\n text: string;\n dataLoc: string;\n rect: { x: number; y: number; width: number; height: number };\n tagName: string;\n role?: string;\n instanceCount?: number;\n}\n\n/**\n * Vision analysis issue category\n */\nexport type VisionIssueCategory =\n | \"spacing\"\n | \"alignment\"\n | \"color\"\n | \"typography\"\n | \"layout\"\n | \"contrast\"\n | \"visual-hierarchy\";\n\n/**\n * Vision analysis issue severity\n */\nexport type VisionIssueSeverity = \"error\" | \"warning\" | \"info\";\n\n/**\n * Vision analysis issue\n */\nexport interface VisionIssue {\n /** Element text that the LLM referenced */\n elementText: string;\n /** Matched data-loc from manifest (after text matching) */\n dataLoc?: string;\n /** Issue description */\n message: string;\n /** Issue category */\n category: VisionIssueCategory;\n /** Issue severity */\n severity: VisionIssueSeverity;\n /** Suggested fix (optional) */\n suggestion?: string;\n}\n\n/**\n * Vision analysis result\n */\nexport interface VisionAnalysisResult {\n /** Detected issues */\n issues: VisionIssue[];\n /** Analysis time in milliseconds */\n analysisTime: number;\n /** Full prompt sent to the model (for debugging/reports) */\n prompt?: string;\n /** Raw LLM response (for debugging) */\n rawResponse?: string;\n}\n\nfunction stripCodeFences(input: string): string {\n const trimmed = (input ?? \"\").trim();\n if (!trimmed.startsWith(\"```\")) return trimmed;\n const m = trimmed.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i);\n return m ? m[1]!.trim() : trimmed;\n}\n\nfunction extractJsonObject(input: string): string {\n const s = stripCodeFences(input).trim();\n if (!s) return s;\n if (s.startsWith(\"{\") && s.endsWith(\"}\")) return s;\n const start = s.indexOf(\"{\");\n const end = s.lastIndexOf(\"}\");\n if (start !== -1 && end !== -1 && end > start) {\n return s.slice(start, end + 1).trim();\n }\n return s;\n}\n\n/**\n * Options for vision analysis\n */\nexport interface VisionAnalysisOptions {\n /** Style guide content (markdown) */\n styleGuide?: string | null;\n /** Progress callback for streaming */\n onProgress?: StreamProgressCallback;\n /** Custom prompt additions */\n additionalContext?: string;\n}\n\n/**\n * Vision analyzer client options\n */\nexport interface VisionAnalyzerOptions extends OllamaClientOptions {\n /** Vision model to use (default: qwen3-vl:30b) */\n visionModel?: string;\n}\n\nconst DEFAULT_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_TIMEOUT = 120000; // Vision models can be slower\n\n/**\n * Vision analyzer for UI screenshot analysis\n * Uses the ollama npm package with chat API for proper vision model support\n */\nexport class VisionAnalyzer {\n private baseUrl: string;\n private visionModel: string;\n private timeout: number;\n private instrumentation?: LLMInstrumentationCallbacks;\n private client: Ollama;\n\n constructor(options: VisionAnalyzerOptions = {}) {\n this.baseUrl = options.baseUrl || DEFAULT_BASE_URL;\n this.visionModel = options.visionModel || UILINT_DEFAULT_VISION_MODEL;\n this.timeout = options.timeout || DEFAULT_TIMEOUT;\n this.instrumentation = options.instrumentation;\n this.client = new Ollama({ host: this.baseUrl });\n }\n\n /**\n * Analyzes a screenshot with element manifest for UI consistency issues\n */\n async analyzeScreenshot(\n imageBase64: string,\n manifest: ElementManifest[],\n options: VisionAnalysisOptions = {}\n ): Promise<VisionAnalysisResult> {\n const startTime = Date.now();\n\n const prompt = this.buildVisionPrompt(manifest, options);\n\n // Start instrumentation span if available\n const spanResult = this.instrumentation?.onGenerationStart?.({\n name: \"vision-analyze\",\n model: this.visionModel,\n prompt,\n metadata: {\n manifestSize: manifest.length,\n hasStyleGuide: !!options.styleGuide,\n },\n });\n // Convert void to undefined for type compatibility\n const span: InstrumentationSpan | undefined = spanResult || undefined;\n\n try {\n const rawResponse = options.onProgress\n ? await this.chatVisionStreaming(\n imageBase64,\n prompt,\n options.onProgress,\n span\n )\n : await this.chatVision(imageBase64, prompt, span);\n\n const issues = this.parseVisionResponse(rawResponse, manifest);\n\n return {\n issues,\n analysisTime: Date.now() - startTime,\n prompt,\n rawResponse,\n };\n } catch (error) {\n const analysisTime = Date.now() - startTime;\n const err =\n error instanceof Error\n ? error\n : new Error(String(error ?? \"Unknown error\"));\n console.error(\"[VisionAnalyzer] Analysis failed\", {\n baseUrl: this.baseUrl,\n model: this.visionModel,\n manifestSize: manifest.length,\n analysisTime,\n error: err.message,\n });\n span?.end(\"\", { error: err.message });\n throw err;\n }\n }\n\n /**\n * Builds the vision analysis prompt\n */\n private buildVisionPrompt(\n manifest: ElementManifest[],\n options: VisionAnalysisOptions\n ): string {\n const styleGuideSection = options.styleGuide\n ? `## Style Guide\n${options.styleGuide}\n\n`\n : \"\";\n\n const additionalSection = options.additionalContext\n ? `## Additional Context\n${options.additionalContext}\n\n`\n : \"\";\n\n // Build element manifest section for context\n const manifestSection = this.buildManifestSection(manifest);\n\n return `You are a UI consistency analyzer examining a screenshot of a web page.\nAnalyze the visual appearance and identify any UI consistency issues.\n\n${styleGuideSection}${additionalSection}${manifestSection}\n\n## Task\n\nExamine the screenshot and identify visual consistency issues such as:\n1. **Spacing inconsistencies**: Elements with uneven padding, margins, or gaps\n2. **Alignment issues**: Elements that should be aligned but aren't\n3. **Color inconsistencies**: Similar colors that should be identical, or colors that don't match the style guide\n4. **Typography issues**: Inconsistent font sizes, weights, or families\n5. **Layout problems**: Broken layouts, overlapping elements, or visual hierarchy issues\n6. **Contrast issues**: Text that's hard to read or UI elements with insufficient contrast\n\nFor each issue found, reference the element by its visible text so we can map it back to the source code.\n\n## Response Format\n\nRespond with JSON ONLY. Return a single JSON object:\n\n\\`\\`\\`json\n{\n \"issues\": [\n {\n \"elementText\": \"Submit Order\",\n \"message\": \"Button has inconsistent padding compared to other buttons (appears larger)\",\n \"category\": \"spacing\",\n \"severity\": \"warning\"\n }\n ]\n}\n\\`\\`\\`\n\nCategories: spacing, alignment, color, typography, layout, contrast, visual-hierarchy\nSeverities: error (major issue), warning (should fix), info (minor/suggestion)\n\nIMPORTANT:\n- Reference elements by their visible text content\n- Be specific about what's wrong and what the expected state should be\n- Only report significant visual inconsistencies\n- If no issues are found, return {\"issues\": []}`;\n }\n\n /**\n * Builds the manifest section of the prompt\n */\n private buildManifestSection(manifest: ElementManifest[]): string {\n if (manifest.length === 0) {\n return \"\";\n }\n\n const elements = manifest.map((el) => {\n const parts = [`- \"${el.text}\"`];\n if (el.role) parts.push(`(${el.role})`);\n if (el.instanceCount && el.instanceCount > 1) {\n parts.push(`[${el.instanceCount} instances]`);\n }\n return parts.join(\" \");\n });\n\n return `## Page Elements\n\nThe following elements are visible on the page (reference by text when reporting issues):\n\n${elements.join(\"\\n\")}\n\n`;\n }\n\n /**\n * Non-streaming chat API call for vision\n */\n private async chatVision(\n imageBase64: string,\n prompt: string,\n span?: InstrumentationSpan\n ): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n // Strip data URL prefix if present\n const base64Data = imageBase64.includes(\",\")\n ? imageBase64.split(\",\")[1]!\n : imageBase64;\n\n const response = await this.client.chat({\n model: this.visionModel,\n messages: [\n {\n role: \"user\",\n content: prompt,\n images: [base64Data],\n },\n ],\n format: \"json\",\n options: {\n // Increase context window for large prompts\n num_ctx: 8192,\n },\n });\n\n const output = response.message?.content || \"\";\n\n if (!output.trim()) {\n const diag = JSON.stringify(\n {\n done_reason: response.done_reason,\n model: response.model,\n prompt_eval_count: response.prompt_eval_count,\n eval_count: response.eval_count,\n },\n null,\n 2\n );\n const errorMsg = `Vision model returned empty output. Diagnostics: ${diag}`;\n span?.end(\"\", { error: errorMsg });\n throw new Error(errorMsg);\n }\n\n span?.end(output, {\n promptTokens: response.prompt_eval_count,\n completionTokens: response.eval_count,\n totalTokens:\n (response.prompt_eval_count || 0) + (response.eval_count || 0) ||\n undefined,\n });\n\n return output;\n } catch (error) {\n span?.end(\"\", { error: String(error) });\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Streaming chat API call for vision\n * Uses ollama package's async iterator for streaming\n */\n private async chatVisionStreaming(\n imageBase64: string,\n prompt: string,\n onProgress: StreamProgressCallback,\n span?: InstrumentationSpan\n ): Promise<string> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n let promptTokens: number | undefined;\n let completionTokens: number | undefined;\n let chunksReceived = 0;\n let lastProgressAt = Date.now();\n let emittedWaitingLine = false;\n\n try {\n // Strip data URL prefix if present\n const base64Data = imageBase64.includes(\",\")\n ? imageBase64.split(\",\")[1]!\n : imageBase64;\n\n const stream = await this.client.chat({\n model: this.visionModel,\n messages: [\n {\n role: \"user\",\n content: prompt,\n images: [base64Data],\n },\n ],\n // Enable thinking for streaming so we can surface reasoning traces for thinking-capable models.\n // Models that don't support it should ignore it.\n think: false,\n stream: true,\n format: \"json\",\n options: {\n num_ctx: 8192,\n },\n });\n\n let fullResponse = \"\";\n let lastLatestLine = \"\";\n\n for await (const chunk of stream) {\n chunksReceived++;\n\n // Emit waiting message on first chunk if no content yet\n if (!emittedWaitingLine && !fullResponse.trim()) {\n onProgress(\"(waiting for model output…)\", fullResponse);\n emittedWaitingLine = true;\n }\n\n // Thinking-capable models stream `message.thinking` separately from `message.content`.\n const thinking = (chunk as any)?.message?.thinking || \"\";\n if (thinking) {\n onProgress(lastLatestLine, fullResponse, undefined, thinking);\n lastProgressAt = Date.now();\n }\n\n // Chat API uses message.content for text deltas (final answer)\n const content = chunk.message?.content || \"\";\n if (content) {\n fullResponse += content;\n\n // Get the latest line for progress display\n const responseLines = fullResponse.split(\"\\n\");\n const latestLine =\n responseLines[responseLines.length - 1] ||\n responseLines[responseLines.length - 2] ||\n \"\";\n\n // Stream the actual text delta to the callback\n lastLatestLine = latestLine.trim();\n onProgress(lastLatestLine, fullResponse, content);\n lastProgressAt = Date.now();\n }\n\n // Capture token counts from final chunk\n if (chunk.done) {\n promptTokens = chunk.prompt_eval_count;\n completionTokens = chunk.eval_count;\n }\n\n // Heartbeat if we're receiving chunks but no text output\n if (!fullResponse.trim() && Date.now() - lastProgressAt > 4000) {\n onProgress(\n `(streaming… received ${chunksReceived} chunks)`,\n fullResponse\n );\n lastProgressAt = Date.now();\n }\n }\n\n if (!fullResponse.trim()) {\n const diag = JSON.stringify(\n {\n chunksReceived,\n promptTokens,\n completionTokens,\n model: this.visionModel,\n },\n null,\n 2\n );\n const errorMsg = `Vision model returned empty output (streaming). Diagnostics: ${diag}`;\n span?.end(\"\", { error: errorMsg });\n throw new Error(errorMsg);\n }\n\n span?.end(fullResponse, {\n promptTokens,\n completionTokens,\n totalTokens: (promptTokens || 0) + (completionTokens || 0) || undefined,\n });\n\n return fullResponse;\n } catch (error) {\n span?.end(\"\", { error: String(error) });\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Parses the vision LLM response and matches elements to manifest\n */\n private parseVisionResponse(\n response: string,\n manifest: ElementManifest[]\n ): VisionIssue[] {\n try {\n const jsonText = extractJsonObject(response);\n const parsed = JSON.parse(jsonText);\n const rawIssues = parsed.issues || [];\n\n // Map elementText to dataLoc using manifest\n return rawIssues.map((issue: VisionIssue) => {\n const matchedElement = this.matchElementByText(\n issue.elementText,\n manifest\n );\n\n return {\n ...issue,\n dataLoc: matchedElement?.dataLoc,\n };\n });\n } catch {\n const s = response ?? \"\";\n const previewHead = s ? s.slice(0, 600) : \"\";\n const previewTail = s && s.length > 600 ? s.slice(-400) : \"\";\n throw new Error(\n `Vision model returned non-JSON output (expected JSON). length=${\n s.length\n } head=${JSON.stringify(previewHead)} tail=${JSON.stringify(\n previewTail\n )}`\n );\n }\n }\n\n /**\n * Matches element text from LLM response to manifest entries\n */\n private matchElementByText(\n elementText: string,\n manifest: ElementManifest[]\n ): ElementManifest | undefined {\n if (!elementText) return undefined;\n\n const normalizedSearch = elementText.toLowerCase().trim();\n\n // Exact match first\n for (const entry of manifest) {\n if (entry.text.toLowerCase().trim() === normalizedSearch) {\n return entry;\n }\n }\n\n // Partial match\n for (const entry of manifest) {\n const normalizedEntry = entry.text.toLowerCase().trim();\n if (\n normalizedEntry.includes(normalizedSearch) ||\n normalizedSearch.includes(normalizedEntry)\n ) {\n return entry;\n }\n }\n\n return undefined;\n }\n\n /**\n * Checks if the vision model is available\n */\n async isAvailable(): Promise<boolean> {\n try {\n const models = await this.client.list();\n return models.models.some(\n (m) =>\n m.name === this.visionModel ||\n m.name.startsWith(this.visionModel.split(\":\")[0])\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Gets the current vision model\n */\n getModel(): string {\n return this.visionModel;\n }\n\n /**\n * Gets the Ollama base URL (for diagnostics)\n */\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Sets the vision model\n */\n setModel(model: string): void {\n this.visionModel = model;\n }\n\n /**\n * Sets instrumentation callbacks\n */\n setInstrumentation(\n instrumentation: LLMInstrumentationCallbacks | undefined\n ): void {\n this.instrumentation = instrumentation;\n }\n}\n\n// Default singleton instance\nlet defaultAnalyzer: VisionAnalyzer | null = null;\n\n/**\n * Gets the default VisionAnalyzer instance\n */\nexport function getVisionAnalyzer(\n options?: VisionAnalyzerOptions\n): VisionAnalyzer {\n if (!defaultAnalyzer || options) {\n defaultAnalyzer = new VisionAnalyzer(options);\n }\n return defaultAnalyzer;\n}\n"],"mappings":"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","names":["resolve","resolve","existsSync","dirname","join","existsSync","dirname","join","require","Headers","resolve","fetch","fetch","Ollama","Ollama"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uilint-core",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Core library for UILint - AI-powered UI consistency checking",
5
5
  "author": "Peter Suggate",
6
6
  "repository": {
@@ -44,13 +44,14 @@
44
44
  "node": ">=20.0.0"
45
45
  },
46
46
  "dependencies": {
47
- "jsdom": "^27.4.0",
48
47
  "jiti": "^2.5.0",
48
+ "jsdom": "^27.4.0",
49
49
  "picocolors": "^1.1.1",
50
50
  "tailwindcss": "^4.1.11"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/jsdom": "^27.0.0",
54
+ "ollama": "^0.6.3",
54
55
  "tsup": "^8.5.1",
55
56
  "typescript": "^5.9.3"
56
57
  },