lindoai-cli 1.0.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.
- package/README.md +322 -0
- package/dist/index.cjs +2900 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +40 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +2875 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/live-preview-server.ts","../src/config.ts","../src/output.ts","../src/commands/config.ts","../src/commands/agents.ts","../src/commands/workflows.ts","../src/commands/workspace.ts","../src/commands/analytics.ts","../src/commands/clients.ts","../src/commands/websites.ts","../src/utils/browser.ts","../src/commands/pages.ts","../src/commands/blogs.ts","../src/utils/state.ts","../src/server/callback.ts","../src/commands/login.ts","../src/commands/agent.ts","../src/index.ts"],"names":["resolve","path2","fs2","http","os2","path","os","fs","Command","LindoClient","AuthenticationError","handleError","getClient","analytics","platform","exec","error","path3","os3","fs3","spawn","startLivePreviewServer","PID_FILE","path4","os4","PORT_FILE","fs4","terminateExistingPreviewServer","startBackgroundPreviewServer","startForegroundPreviewServer","cleanupPidFiles","crypto","url","URL","http2","path5","os5","execSync","fs5"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Live Preview Server with SSE Hot-Reload\n *\n * Provides a local HTTP server that serves HTML files with automatic\n * browser refresh via Server-Sent Events (SSE) when the file changes.\n *\n * @satisfies Requirements 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7\n */\n\nimport * as http from 'node:http';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\n/**\n * JavaScript snippet that establishes an SSE connection for live reload.\n * This script connects to the /__live-reload endpoint and reloads the page\n * when it receives a 'reload' event.\n */\nexport const LIVE_RELOAD_SCRIPT = `<script>\n(function() {\n var eventSource = new EventSource('/__live-reload');\n eventSource.onmessage = function(event) {\n if (event.data === 'reload') {\n window.location.reload();\n }\n };\n eventSource.onerror = function() {\n console.log('[Live Reload] Connection lost, attempting to reconnect...');\n };\n})();\n</script>`;\n\n/**\n * Injects the live reload script into HTML content.\n *\n * If the HTML contains a `</body>` tag, the script is inserted before it.\n * Otherwise, the script is appended at the end of the content.\n *\n * @param html - The HTML content to inject the script into\n * @returns The HTML content with the live reload script injected\n *\n * @example\n * ```typescript\n * // With </body> tag\n * injectLiveReload('<html><body><h1>Hello</h1></body></html>');\n * // Returns: '<html><body><h1>Hello</h1><script>...</script></body></html>'\n *\n * // Without </body> tag\n * injectLiveReload('<h1>Hello</h1>');\n * // Returns: '<h1>Hello</h1><script>...</script>'\n * ```\n *\n * @satisfies Requirements 8.2, 8.3\n */\nexport function injectLiveReload(html: string): string {\n // Case-insensitive search for </body> tag\n const bodyCloseTagRegex = /<\\/body>/i;\n const match = html.match(bodyCloseTagRegex);\n\n if (match && match.index !== undefined) {\n // Insert script before </body> tag\n return (\n html.slice(0, match.index) +\n LIVE_RELOAD_SCRIPT +\n html.slice(match.index)\n );\n }\n\n // No </body> tag found, append script at the end\n return html + LIVE_RELOAD_SCRIPT;\n}\n\n/**\n * Starts a live preview server for the specified HTML file.\n *\n * The server:\n * - Serves the HTML file on GET / with the live reload script injected\n * - Exposes an SSE endpoint at /__live-reload for browser connections\n * - Watches the file for changes and notifies connected clients with 100ms debounce\n * - Binds to 127.0.0.1 on a dynamically allocated port\n *\n * @param filePath - Path to the HTML file to serve\n * @returns Promise resolving to the port number the server is listening on\n *\n * @example\n * ```typescript\n * const port = await startLivePreviewServer('./page.html');\n * console.log(`Preview server running at http://127.0.0.1:${port}/`);\n * ```\n *\n * @satisfies Requirements 8.1, 8.4, 8.5, 8.6, 8.7\n */\nexport function startLivePreviewServer(filePath: string): Promise<number> {\n return new Promise((resolve, reject) => {\n // Resolve to absolute path\n const absolutePath = path.resolve(filePath);\n\n // Track connected SSE clients\n const sseClients: Set<http.ServerResponse> = new Set();\n\n // Debounce timer for file changes\n let debounceTimer: NodeJS.Timeout | null = null;\n const DEBOUNCE_MS = 100;\n\n /**\n * Notifies all connected SSE clients to reload.\n */\n function notifyClients(): void {\n for (const client of sseClients) {\n try {\n client.write('data: reload\\n\\n');\n } catch {\n // Client may have disconnected, remove from set\n sseClients.delete(client);\n }\n }\n }\n\n /**\n * Handles file change events with debouncing.\n */\n function handleFileChange(): void {\n // Clear existing timer if any\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n // Set new debounce timer\n debounceTimer = setTimeout(() => {\n notifyClients();\n debounceTimer = null;\n }, DEBOUNCE_MS);\n }\n\n /**\n * Handles incoming HTTP requests.\n */\n function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): void {\n const url = req.url || '/';\n const method = req.method || 'GET';\n\n // Only handle GET requests\n if (method !== 'GET') {\n res.writeHead(405, { 'Content-Type': 'text/plain' });\n res.end('Method Not Allowed');\n return;\n }\n\n // Handle SSE endpoint for live reload\n if (url === '/__live-reload') {\n // Set SSE headers\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n // Send initial connection message\n res.write('data: connected\\n\\n');\n\n // Add client to the set\n sseClients.add(res);\n\n // Remove client when connection closes\n req.on('close', () => {\n sseClients.delete(res);\n });\n\n return;\n }\n\n // Handle root path - serve the HTML file\n if (url === '/' || url === '/index.html') {\n try {\n // Read the HTML file\n const html = fs.readFileSync(absolutePath, 'utf-8');\n\n // Inject live reload script\n const injectedHtml = injectLiveReload(html);\n\n // Send response\n res.writeHead(200, {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Cache-Control': 'no-cache',\n });\n res.end(injectedHtml);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`<!DOCTYPE html>\n<html>\n<head><title>Error</title></head>\n<body>\n<h1>Error loading file</h1>\n<p>${errorMessage}</p>\n</body>\n</html>`);\n }\n return;\n }\n\n // All other paths return 404\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(`<!DOCTYPE html>\n<html>\n<head><title>Not Found</title></head>\n<body>\n<h1>404 Not Found</h1>\n<p>The requested resource was not found.</p>\n</body>\n</html>`);\n }\n\n // Create HTTP server\n const server = http.createServer(handleRequest);\n\n // Set up file watcher\n let watcher: fs.FSWatcher | null = null;\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start preview server: ${err.message}`));\n });\n\n // Bind to 127.0.0.1:0 (dynamically allocated port)\n // Requirement 8.6: bind to 127.0.0.1 on a dynamically allocated port\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (!address || typeof address === 'string') {\n reject(new Error('Failed to get server address'));\n return;\n }\n\n const port = address.port;\n\n // Start watching the file for changes\n // Requirement 8.5: watch file with 100ms debounce\n try {\n watcher = fs.watch(absolutePath, (eventType) => {\n if (eventType === 'change') {\n handleFileChange();\n }\n });\n\n watcher.on('error', (err) => {\n console.error(`[Live Preview] File watcher error: ${err.message}`);\n });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n console.error(`[Live Preview] Failed to watch file: ${errorMessage}`);\n }\n\n // Handle SIGTERM for graceful shutdown\n // Requirement 8.7: clean up PID and port files on SIGTERM\n const handleShutdown = () => {\n // Close file watcher\n if (watcher) {\n watcher.close();\n watcher = null;\n }\n\n // Clear debounce timer\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n debounceTimer = null;\n }\n\n // Close all SSE connections\n for (const client of sseClients) {\n try {\n client.end();\n } catch {\n // Ignore errors when closing\n }\n }\n sseClients.clear();\n\n // Clean up PID and port files\n const pidFilePath = path.join(os.tmpdir(), 'lindoai-pages-preview.pid');\n const portFilePath = path.join(os.tmpdir(), 'lindoai-pages-preview.port');\n\n try {\n if (fs.existsSync(pidFilePath)) {\n fs.unlinkSync(pidFilePath);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n\n try {\n if (fs.existsSync(portFilePath)) {\n fs.unlinkSync(portFilePath);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n\n // Close server\n server.close(() => {\n process.exit(0);\n });\n\n // Force exit after timeout\n setTimeout(() => {\n process.exit(0);\n }, 1000);\n };\n\n process.on('SIGTERM', handleShutdown);\n process.on('SIGINT', handleShutdown);\n\n resolve(port);\n });\n });\n}\n","/**\n * CLI Configuration Management\n *\n * Handles loading and saving CLI configuration.\n * Environment variables take precedence over config file values.\n *\n * @satisfies Requirements 7.3\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\n/**\n * Environment variable name for the API key.\n */\nexport const ENV_API_KEY = 'LINDO_API_KEY';\n\n/**\n * Environment variable name for the base URL.\n */\nexport const ENV_BASE_URL = 'LINDO_BASE_URL';\n\n/**\n * Default config directory name.\n */\nconst CONFIG_DIR = '.lindo';\n\n/**\n * Default config file name.\n */\nconst CONFIG_FILE = 'config.json';\n\n/**\n * Default base URL for the Lindo API.\n */\nconst DEFAULT_BASE_URL = 'https://api.lindo.ai';\n\n/**\n * Configuration values stored in the config file.\n */\nexport interface ConfigFile {\n /** API key for authentication */\n apiKey?: string;\n\n /** Base URL for API requests */\n baseUrl?: string;\n}\n\n/**\n * Resolved configuration with all values.\n */\nexport interface ResolvedConfig {\n /** API key for authentication (may be undefined if not configured) */\n apiKey?: string;\n\n /** Base URL for API requests */\n baseUrl: string;\n}\n\n/**\n * Gets the path to the config directory.\n *\n * @returns The absolute path to the config directory\n */\nexport function getConfigDir(): string {\n return path.join(os.homedir(), CONFIG_DIR);\n}\n\n/**\n * Gets the path to the config file.\n *\n * @returns The absolute path to the config file\n */\nexport function getConfigPath(): string {\n return path.join(getConfigDir(), CONFIG_FILE);\n}\n\n/**\n * Reads the config file from disk.\n *\n * @returns The parsed config file contents, or empty object if file doesn't exist\n */\nexport function readConfigFile(): ConfigFile {\n const configPath = getConfigPath();\n\n try {\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as ConfigFile;\n }\n } catch {\n // If file is corrupted or unreadable, return empty config\n }\n\n return {};\n}\n\n/**\n * Writes the config file to disk.\n *\n * @param config - The configuration to write\n */\nexport function writeConfigFile(config: ConfigFile): void {\n const configDir = getConfigDir();\n const configPath = getConfigPath();\n\n // Ensure config directory exists\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n}\n\n/**\n * Loads configuration with environment variable precedence.\n *\n * Priority order (highest to lowest):\n * 1. Environment variables (LINDO_API_KEY, LINDO_BASE_URL)\n * 2. Config file (~/.lindo/config.json)\n * 3. Default values\n *\n * @returns The resolved configuration\n */\nexport function loadConfig(): ResolvedConfig {\n const fileConfig = readConfigFile();\n\n // Environment variables take precedence over config file\n const apiKey = process.env[ENV_API_KEY] || fileConfig.apiKey;\n const baseUrl = process.env[ENV_BASE_URL] || fileConfig.baseUrl || DEFAULT_BASE_URL;\n\n return {\n apiKey,\n baseUrl,\n };\n}\n\n/**\n * Saves the API key to the config file.\n *\n * @param apiKey - The API key to save\n */\nexport function saveApiKey(apiKey: string): void {\n const config = readConfigFile();\n config.apiKey = apiKey;\n writeConfigFile(config);\n}\n\n/**\n * Saves the base URL to the config file.\n *\n * @param baseUrl - The base URL to save\n */\nexport function saveBaseUrl(baseUrl: string): void {\n const config = readConfigFile();\n config.baseUrl = baseUrl;\n writeConfigFile(config);\n}\n\n/**\n * Saves a configuration value by key.\n *\n * @param key - The configuration key ('apiKey' or 'baseUrl')\n * @param value - The value to save\n * @throws Error if the key is not recognized\n */\nexport function saveConfig(key: string, value: string): void {\n const config = readConfigFile();\n\n switch (key) {\n case 'apiKey':\n config.apiKey = value;\n break;\n case 'baseUrl':\n config.baseUrl = value;\n break;\n default:\n throw new Error(`Unknown configuration key: ${key}`);\n }\n\n writeConfigFile(config);\n}\n\n/**\n * Gets a configuration value by key.\n *\n * @param key - The configuration key ('apiKey' or 'baseUrl')\n * @returns The configuration value, or undefined if not set\n */\nexport function getConfigValue(key: string): string | undefined {\n const config = loadConfig();\n\n switch (key) {\n case 'apiKey':\n return config.apiKey;\n case 'baseUrl':\n return config.baseUrl;\n default:\n return undefined;\n }\n}\n\n/**\n * Checks if the API key is configured.\n *\n * @returns True if an API key is available\n */\nexport function hasApiKey(): boolean {\n const config = loadConfig();\n return !!config.apiKey;\n}\n","/**\n * CLI Output Utilities\n *\n * Provides formatting utilities for CLI output.\n * Supports JSON and table output formats.\n *\n * @satisfies Requirements 7.5\n */\n\n/**\n * Output format options.\n */\nexport type OutputFormat = 'json' | 'table';\n\n/**\n * ANSI color codes for terminal output.\n */\nconst colors = {\n reset: '\\x1b[0m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n};\n\n/**\n * Checks if colors should be used in output.\n *\n * @returns True if colors should be used\n */\nfunction useColors(): boolean {\n // Disable colors if NO_COLOR is set or stdout is not a TTY\n return !process.env.NO_COLOR && process.stdout.isTTY !== false;\n}\n\n/**\n * Applies color to text if colors are enabled.\n *\n * @param text - The text to colorize\n * @param color - The color code to apply\n * @returns The colorized text\n */\nfunction colorize(text: string, color: string): string {\n if (!useColors()) {\n return text;\n }\n return `${color}${text}${colors.reset}`;\n}\n\n/**\n * Prints a success message to stdout.\n *\n * @param message - The message to print\n */\nexport function success(message: string): void {\n console.log(colorize(`✓ ${message}`, colors.green));\n}\n\n/**\n * Prints an error message to stderr.\n *\n * @param message - The message to print\n */\nexport function error(message: string): void {\n console.error(colorize(`✗ ${message}`, colors.red));\n}\n\n/**\n * Prints a warning message to stderr.\n *\n * @param message - The message to print\n */\nexport function warn(message: string): void {\n console.warn(colorize(`⚠ ${message}`, colors.yellow));\n}\n\n/**\n * Prints an info message to stdout.\n *\n * @param message - The message to print\n */\nexport function info(message: string): void {\n console.log(colorize(`ℹ ${message}`, colors.blue));\n}\n\n/**\n * Formats data as JSON.\n *\n * @param data - The data to format\n * @returns The JSON string\n */\nexport function formatJson(data: unknown): string {\n return JSON.stringify(data, null, 2);\n}\n\n/**\n * Formats data as a table.\n *\n * @param data - The data to format (object or array of objects)\n * @returns The formatted table string\n */\nexport function formatTable(data: unknown): string {\n if (data === null || data === undefined) {\n return '';\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return 'No data';\n }\n\n // Get all unique keys from all objects\n const keys = new Set<string>();\n for (const item of data) {\n if (typeof item === 'object' && item !== null) {\n Object.keys(item).forEach((key) => keys.add(key));\n }\n }\n\n if (keys.size === 0) {\n // Array of primitives\n return data.map((item) => String(item)).join('\\n');\n }\n\n const columns = Array.from(keys);\n return formatTableFromRows(columns, data);\n }\n\n // Handle single object\n if (typeof data === 'object') {\n const obj = data as Record<string, unknown>;\n const entries = Object.entries(obj);\n\n if (entries.length === 0) {\n return 'No data';\n }\n\n // Format as key-value pairs\n const maxKeyLength = Math.max(...entries.map(([key]) => key.length));\n return entries\n .map(([key, value]) => {\n const paddedKey = key.padEnd(maxKeyLength);\n const formattedValue = formatValue(value);\n return `${colorize(paddedKey, colors.cyan)} ${formattedValue}`;\n })\n .join('\\n');\n }\n\n // Handle primitives\n return String(data);\n}\n\n/**\n * Formats a table from rows of data.\n *\n * @param columns - The column headers\n * @param rows - The data rows\n * @returns The formatted table string\n */\nfunction formatTableFromRows(columns: string[], rows: unknown[]): string {\n // Calculate column widths\n const widths: Record<string, number> = {};\n for (const col of columns) {\n widths[col] = col.length;\n }\n\n for (const row of rows) {\n if (typeof row === 'object' && row !== null) {\n const obj = row as Record<string, unknown>;\n for (const col of columns) {\n const value = formatValue(obj[col]);\n widths[col] = Math.max(widths[col], value.length);\n }\n }\n }\n\n // Build header\n const header = columns.map((col) => colorize(col.padEnd(widths[col]), colors.bold)).join(' ');\n\n // Build separator\n const separator = columns.map((col) => '-'.repeat(widths[col])).join(' ');\n\n // Build rows\n const dataRows = rows.map((row) => {\n if (typeof row === 'object' && row !== null) {\n const obj = row as Record<string, unknown>;\n return columns.map((col) => formatValue(obj[col]).padEnd(widths[col])).join(' ');\n }\n return String(row);\n });\n\n return [header, separator, ...dataRows].join('\\n');\n}\n\n/**\n * Formats a single value for display.\n *\n * @param value - The value to format\n * @returns The formatted string\n */\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) {\n return colorize('-', colors.gray);\n }\n\n if (typeof value === 'boolean') {\n return value ? colorize('true', colors.green) : colorize('false', colors.red);\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return `[${value.length} items]`;\n }\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/**\n * Outputs data in the specified format.\n *\n * @param data - The data to output\n * @param format - The output format ('json' or 'table')\n */\nexport function output(data: unknown, format: OutputFormat): void {\n if (format === 'json') {\n console.log(formatJson(data));\n } else {\n console.log(formatTable(data));\n }\n}\n\n/**\n * Prints a blank line.\n */\nexport function newline(): void {\n console.log();\n}\n\n/**\n * Prints a header.\n *\n * @param text - The header text\n */\nexport function header(text: string): void {\n console.log(colorize(text, colors.bold));\n}\n","/**\n * Config Commands\n *\n * Commands for managing CLI configuration.\n *\n * @satisfies Requirements 7.4\n */\n\nimport { Command } from 'commander';\nimport { saveConfig, getConfigValue, getConfigPath, loadConfig } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Valid configuration keys.\n */\nconst VALID_KEYS = ['apiKey', 'baseUrl'] as const;\n\n/**\n * Creates the config command.\n *\n * @returns The config command\n */\nexport function createConfigCommand(): Command {\n const config = new Command('config').description('Manage CLI configuration');\n\n // config set <key> <value>\n config\n .command('set <key> <value>')\n .description('Set a configuration value')\n .action((key: string, value: string) => {\n if (!VALID_KEYS.includes(key as (typeof VALID_KEYS)[number])) {\n error(`Invalid configuration key: ${key}`);\n info(`Valid keys: ${VALID_KEYS.join(', ')}`);\n process.exit(1);\n }\n\n try {\n saveConfig(key, value);\n success(`Configuration saved: ${key}`);\n info(`Config file: ${getConfigPath()}`);\n } catch (err) {\n error(`Failed to save configuration: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n });\n\n // config get <key>\n config\n .command('get <key>')\n .description('Get a configuration value')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action((key: string, options: { format: OutputFormat }) => {\n const value = getConfigValue(key);\n\n if (value === undefined) {\n if (options.format === 'json') {\n output({ key, value: null }, options.format);\n } else {\n info(`Configuration key '${key}' is not set`);\n }\n return;\n }\n\n if (options.format === 'json') {\n output({ key, value }, options.format);\n } else {\n // Mask API key for security\n const displayValue = key === 'apiKey' ? maskApiKey(value) : value;\n console.log(`${key}: ${displayValue}`);\n }\n });\n\n // config list\n config\n .command('list')\n .description('List all configuration values')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action((options: { format: OutputFormat }) => {\n const resolvedConfig = loadConfig();\n\n const configData = {\n apiKey: resolvedConfig.apiKey ? maskApiKey(resolvedConfig.apiKey) : '(not set)',\n baseUrl: resolvedConfig.baseUrl,\n configFile: getConfigPath(),\n };\n\n if (options.format === 'json') {\n // For JSON output, show actual values (still masked for apiKey)\n output(\n {\n apiKey: resolvedConfig.apiKey ? maskApiKey(resolvedConfig.apiKey) : null,\n baseUrl: resolvedConfig.baseUrl,\n configFile: getConfigPath(),\n },\n options.format\n );\n } else {\n output(configData, options.format);\n }\n });\n\n // config path\n config\n .command('path')\n .description('Show the config file path')\n .action(() => {\n console.log(getConfigPath());\n });\n\n return config;\n}\n\n/**\n * Masks an API key for display.\n *\n * @param apiKey - The API key to mask\n * @returns The masked API key\n */\nfunction maskApiKey(apiKey: string): string {\n if (apiKey.length <= 8) {\n return '*'.repeat(apiKey.length);\n }\n return `${apiKey.slice(0, 4)}${'*'.repeat(apiKey.length - 8)}${apiKey.slice(-4)}`;\n}\n","/**\n * Agents Commands\n *\n * Commands for running AI agents.\n *\n * @satisfies Requirements 7.4\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the agents command.\n *\n * @returns The agents command\n */\nexport function createAgentsCommand(): Command {\n const agents = new Command('agents').description('Run AI agents');\n\n // agents run <agent-id>\n agents\n .command('run <agent-id>')\n .description('Run an AI agent')\n .option('-i, --input <json>', 'Input data as JSON string', '{}')\n .option('-s, --stream', 'Stream the response', false)\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (agentId: string, options: { input: string; stream: boolean; format: OutputFormat }) => {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n const client = new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n\n let input: Record<string, unknown>;\n try {\n input = JSON.parse(options.input);\n } catch {\n error('Invalid JSON input');\n info('Example: --input \\'{\"prompt\": \"Hello!\"}\\'');\n process.exit(1);\n }\n\n try {\n info(`Running agent: ${agentId}`);\n\n const result = await client.agents.run({\n agent_id: agentId,\n input,\n stream: options.stream,\n });\n\n if (result.success) {\n success('Agent run completed');\n output(result, options.format);\n } else {\n error(`Agent run failed: ${result.error || 'Unknown error'}`);\n output(result, options.format);\n process.exit(1);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n return agents;\n}\n\n/**\n * Handles errors from API calls.\n *\n * @param err - The error to handle\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Workflows Commands\n *\n * Commands for managing workflows.\n *\n * @satisfies Requirements 7.4\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the workflows command.\n *\n * @returns The workflows command\n */\nexport function createWorkflowsCommand(): Command {\n const workflows = new Command('workflows').description('Manage workflows');\n\n // workflows list\n workflows\n .command('list')\n .description('List workflow logs')\n .option('-n, --name <name>', 'Filter by workflow name')\n .option('-s, --status <status>', 'Filter by status')\n .option('-w, --website <id>', 'Filter by website ID')\n .option('-c, --client <id>', 'Filter by client ID')\n .option('-l, --limit <number>', 'Maximum number of results', '50')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { name?: string; status?: string; website?: string; client?: string; limit: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const result = await client.workflows.list({\n workflow_name: options.name,\n status: options.status,\n website_id: options.website,\n client_id: options.client,\n limit: parseInt(options.limit),\n });\n\n if (result.success) {\n output(result.data, options.format);\n } else {\n error('Failed to list workflows');\n process.exit(1);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // workflows start <workflow-name>\n workflows\n .command('start <workflow-name>')\n .description('Start a workflow')\n .option('-p, --params <json>', 'Workflow parameters as JSON string', '{}')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (workflowName: string, options: { params: string; format: OutputFormat }) => {\n const client = getClient();\n\n let params: Record<string, unknown>;\n try {\n params = JSON.parse(options.params);\n } catch {\n error('Invalid JSON params');\n info('Example: --params \\'{\"page_id\": \"page-123\"}\\'');\n process.exit(1);\n }\n\n try {\n info(`Starting workflow: ${workflowName}`);\n\n const result = await client.workflows.start({\n workflow_name: workflowName,\n params,\n });\n\n if (result.success) {\n success(`Workflow started: ${result.instance_id}`);\n output(result, options.format);\n } else {\n error('Failed to start workflow');\n output(result, options.format);\n process.exit(1);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // workflows status <instance-id>\n workflows\n .command('status <instance-id>')\n .description('Get workflow status')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (instanceId: string, options: { format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const status = await client.workflows.getStatus(instanceId);\n output(status, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workflows pause <instance-id>\n workflows\n .command('pause <instance-id>')\n .description('Pause a running workflow')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (instanceId: string, options: { format: OutputFormat }) => {\n const client = getClient();\n\n try {\n info(`Pausing workflow: ${instanceId}`);\n const result = await client.workflows.pause(instanceId);\n\n if (result.success) {\n success(result.message);\n } else {\n error(result.message);\n process.exit(1);\n }\n\n output(result, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workflows resume <instance-id>\n workflows\n .command('resume <instance-id>')\n .description('Resume a paused workflow')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (instanceId: string, options: { format: OutputFormat }) => {\n const client = getClient();\n\n try {\n info(`Resuming workflow: ${instanceId}`);\n const result = await client.workflows.resume(instanceId);\n\n if (result.success) {\n success(result.message);\n } else {\n error(result.message);\n process.exit(1);\n }\n\n output(result, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workflows terminate <instance-id>\n workflows\n .command('terminate <instance-id>')\n .description('Terminate a workflow')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (instanceId: string, options: { format: OutputFormat }) => {\n const client = getClient();\n\n try {\n info(`Terminating workflow: ${instanceId}`);\n const result = await client.workflows.terminate(instanceId);\n\n if (result.success) {\n success(result.message);\n } else {\n error(result.message);\n process.exit(1);\n }\n\n output(result, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n return workflows;\n}\n\n/**\n * Gets an authenticated client.\n *\n * @returns The Lindo client\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n *\n * @param err - The error to handle\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Workspace Commands\n *\n * Commands for workspace operations.\n *\n * @satisfies Requirements 7.4\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the workspace command.\n *\n * @returns The workspace command\n */\nexport function createWorkspaceCommand(): Command {\n const workspace = new Command('workspace').description('Workspace operations');\n\n // workspace get\n workspace\n .command('get')\n .description('Get workspace details')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.get();\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace credits\n workspace\n .command('credits')\n .description('Get workspace credit balance')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { format: OutputFormat }) => {\n const client = getClient();\n try {\n const credits = await client.workspace.getCredits();\n output(credits, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace client-credits\n workspace\n .command('client-credits')\n .description('Get credit balance for a specific client')\n .requiredOption('-c, --client <id>', 'Client ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { client: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const credits = await client.workspace.getClientCredits(options.client);\n output(credits, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace update\n workspace\n .command('update')\n .description('Update workspace settings')\n .option('-n, --name <name>', 'Workspace name')\n .option('-l, --language <lang>', 'Workspace language')\n .option('-w, --webhook <url>', 'Webhook URL')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { name?: string; language?: string; webhook?: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.update({\n workspace_name: options.name,\n workspace_language: options.language,\n webhook_url: options.webhook,\n });\n if (response.success) {\n success('Workspace updated');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace team-add\n workspace\n .command('team-add')\n .description('Add a team member to the workspace')\n .requiredOption('-e, --email <email>', 'Team member email')\n .option('-r, --role <role>', 'Role (Team)', 'Team')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { email: string; role: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.addTeamMember(options.email, options.role as 'Team');\n if (response.success) {\n success('Team member added');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace team-remove\n workspace\n .command('team-remove')\n .description('Remove a team member from the workspace')\n .requiredOption('-m, --member <id>', 'Member ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { member: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.removeTeamMember(options.member);\n if (response.success) {\n success('Team member removed');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace integration-add\n workspace\n .command('integration-add')\n .description('Add an integration to the workspace')\n .requiredOption('-t, --type <type>', 'Integration type (e.g., matomo)')\n .requiredOption('-c, --config <json>', 'Integration config as JSON')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { type: string; config: string; format: OutputFormat }) => {\n const client = getClient();\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(options.config);\n } catch {\n error('Invalid JSON config');\n process.exit(1);\n }\n try {\n const response = await client.workspace.addIntegration({\n integration_type: options.type,\n config,\n });\n if (response.success) {\n success('Integration added');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace integration-remove\n workspace\n .command('integration-remove')\n .description('Remove an integration from the workspace')\n .requiredOption('-t, --type <type>', 'Integration type')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { type: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.removeIntegration(options.type);\n if (response.success) {\n success('Integration removed');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace whitelabel\n workspace\n .command('whitelabel')\n .description('Setup or update whitelabel settings')\n .option('-d, --domain <domain>', 'Custom domain')\n .option('-s, --subdomain <domain>', 'Subdomain domain')\n .option('-e, --email-sender <email>', 'Email sender address')\n .option('--enable-register', 'Enable client registration')\n .option('--disable-register', 'Disable client registration')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { domain?: string; subdomain?: string; emailSender?: string; enableRegister?: boolean; disableRegister?: boolean; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.setupWhitelabel({\n domain: options.domain,\n subdomain_domain: options.subdomain,\n email_sender: options.emailSender,\n wl_client_register: options.enableRegister ? true : options.disableRegister ? false : undefined,\n });\n if (response.success) {\n success('Whitelabel settings updated');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // workspace appearance\n workspace\n .command('appearance')\n .description('Update workspace appearance settings')\n .option('-p, --primary <color>', 'Primary color (hex)')\n .option('-s, --secondary <color>', 'Secondary color (hex)')\n .option('-m, --mode <mode>', 'Theme mode (light/dark)')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { primary?: string; secondary?: string; mode?: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.workspace.updateAppearance({\n primary_color: options.primary,\n secondary_color: options.secondary,\n theme_mode: options.mode as 'light' | 'dark' | undefined,\n });\n if (response.success) {\n success('Appearance settings updated');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n return workspace;\n}\n\n/**\n * Gets a configured LindoClient.\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n *\n * @param err - The error to handle\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Analytics Commands\n *\n * Commands for analytics operations.\n *\n * @satisfies Requirements 7.4\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the analytics command.\n *\n * @returns The analytics command\n */\nexport function createAnalyticsCommand(): Command {\n const analytics = new Command('analytics').description('Analytics operations');\n\n // analytics workspace\n analytics\n .command('workspace')\n .description('Get workspace analytics')\n .option('--from <date>', 'Start date (ISO format)')\n .option('--to <date>', 'End date (ISO format)')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { from?: string; to?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const analytics = await client.analytics.getWorkspace({\n from: options.from,\n to: options.to,\n });\n output(analytics, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // analytics website\n analytics\n .command('website')\n .description('Get website analytics')\n .requiredOption('-w, --website <id>', 'Website ID (required)')\n .option('--from <date>', 'Start date (ISO format)')\n .option('--to <date>', 'End date (ISO format)')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; from?: string; to?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const analytics = await client.analytics.getWebsite({\n website_id: options.website,\n from: options.from,\n to: options.to,\n });\n output(analytics, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n return analytics;\n}\n\n/**\n * Gets an authenticated client.\n *\n * @returns The Lindo client\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n *\n * @param err - The error to handle\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Clients Commands\n *\n * Commands for client management operations.\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the clients command.\n *\n * @returns The clients command\n */\nexport function createClientsCommand(): Command {\n const clients = new Command('clients').description('Client management operations');\n\n // clients list\n clients\n .command('list')\n .description('List all workspace clients')\n .option('-p, --page <page>', 'Page number', '1')\n .option('-s, --search <search>', 'Search term')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { page: string; search?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.clients.list({\n page: parseInt(options.page, 10),\n search: options.search,\n });\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.clients && response.clients.length > 0) {\n console.log('\\nClients:');\n console.log('--------');\n for (const c of response.clients) {\n console.log(` ID: ${c.record_id}`);\n console.log(` Email: ${c.email}`);\n console.log(` Website Limit: ${c.website_limit ?? 'N/A'}`);\n console.log(` Suspended: ${c.suspended ?? false}`);\n console.log('');\n }\n console.log(`Total: ${response.total ?? response.clients.length}`);\n } else {\n info('No clients found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // clients create\n clients\n .command('create')\n .description('Create a new workspace client')\n .requiredOption('-e, --email <email>', 'Client email address')\n .option('-l, --limit <limit>', 'Website limit', '5')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { email: string; limit: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.clients.create({\n email: options.email,\n website_limit: parseInt(options.limit, 10),\n });\n \n if (response.success && response.client) {\n success(`Client created: ${response.client.record_id}`);\n output(response.client, options.format);\n } else {\n error('Failed to create client');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // clients update\n clients\n .command('update')\n .description('Update a workspace client')\n .requiredOption('-i, --id <id>', 'Client ID')\n .option('-l, --limit <limit>', 'Website limit')\n .option('--suspend', 'Suspend the client')\n .option('--unsuspend', 'Unsuspend the client')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; limit?: string; suspend?: boolean; unsuspend?: boolean; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.clients.update({\n client_id: options.id,\n website_limit: options.limit ? parseInt(options.limit, 10) : undefined,\n suspended: options.suspend ? true : options.unsuspend ? false : undefined,\n });\n \n if (response.success) {\n success('Client updated');\n if (response.client) {\n output(response.client, options.format);\n }\n } else {\n error('Failed to update client');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // clients delete\n clients\n .command('delete')\n .description('Delete a workspace client')\n .requiredOption('-i, --id <id>', 'Client ID')\n .action(async (options: { id: string }) => {\n const client = getClient();\n\n try {\n const response = await client.clients.delete(options.id);\n \n if (response.success) {\n success('Client deleted');\n } else {\n error('Failed to delete client');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // clients magic-link\n clients\n .command('magic-link')\n .description('Create a magic link for client authentication')\n .requiredOption('-e, --email <email>', 'Client email address')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { email: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.clients.createMagicLink(options.email);\n \n if (response.success) {\n success('Magic link created');\n output(response, options.format);\n } else {\n error('Failed to create magic link');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n return clients;\n}\n\n/**\n * Gets a configured LindoClient.\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Websites Commands\n *\n * Commands for website management operations.\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\n\n/**\n * Creates the websites command.\n *\n * @returns The websites command\n */\nexport function createWebsitesCommand(): Command {\n const websites = new Command('websites').description('Website management operations');\n\n // websites list\n websites\n .command('list')\n .description('List all workspace websites')\n .option('-p, --page <page>', 'Page number', '1')\n .option('-s, --search <search>', 'Search term')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { page: string; search?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.websites.list({\n page: parseInt(options.page, 10),\n search: options.search,\n });\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.websites && response.websites.length > 0) {\n console.log('\\nWebsites:');\n console.log('---------');\n for (const w of response.websites) {\n console.log(` ID: ${w.record_id}`);\n console.log(` Business Name: ${w.business_name ?? 'N/A'}`);\n console.log(` Preview URL: ${w.preview_url ?? 'N/A'}`);\n console.log(` Activated: ${w.activated ?? false}`);\n console.log('');\n }\n console.log(`Total: ${response.total ?? response.websites.length}`);\n } else {\n info('No websites found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites get\n websites\n .command('get')\n .description('Get website details')\n .requiredOption('-i, --id <id>', 'Website ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.getDetails(options.id);\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites update\n websites\n .command('update')\n .description('Update a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .option('-n, --name <name>', 'Business name')\n .option('--activate', 'Activate the website')\n .option('--deactivate', 'Deactivate the website')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; name?: string; activate?: boolean; deactivate?: boolean; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.websites.update({\n website_id: options.id,\n business_name: options.name,\n activated: options.activate ? true : options.deactivate ? false : undefined,\n });\n \n if (response.success) {\n success('Website updated');\n if (response.website) {\n output(response.website, options.format);\n }\n } else {\n error('Failed to update website');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites settings\n websites\n .command('settings')\n .description('Update website settings')\n .requiredOption('-i, --id <id>', 'Website ID')\n .option('-n, --name <name>', 'Business name')\n .option('-l, --language <lang>', 'Language')\n .option('-d, --description <desc>', 'Business description')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; name?: string; language?: string; description?: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.updateSettings(options.id, {\n business_name: options.name,\n language: options.language,\n business_description: options.description,\n });\n if (response.success) {\n success('Website settings updated');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites delete\n websites\n .command('delete')\n .description('Delete a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .action(async (options: { id: string }) => {\n const client = getClient();\n\n try {\n const response = await client.websites.delete(options.id);\n \n if (response.success) {\n success('Website deleted');\n } else {\n error('Failed to delete website');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites assign\n websites\n .command('assign')\n .description('Assign a website to a client')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-c, --client <id>', 'Client ID')\n .action(async (options: { website: string; client: string }) => {\n const client = getClient();\n\n try {\n const response = await client.websites.assign({\n website_id: options.website,\n client_id: options.client,\n });\n \n if (response.success) {\n success('Website assigned to client');\n } else {\n error('Failed to assign website');\n if (response.errors) {\n for (const e of response.errors) {\n error(` ${e}`);\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites domain-add\n websites\n .command('domain-add')\n .description('Add a custom domain to a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .requiredOption('-d, --domain <domain>', 'Custom domain')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; domain: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.addDomain(options.id, options.domain);\n if (response.success) {\n success('Domain added');\n if (response.result?.dns_records) {\n console.log('\\nDNS Records to configure:');\n for (const record of response.result.dns_records) {\n console.log(` ${record.record_type} ${record.host} -> ${record.value}`);\n }\n }\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites domain-remove\n websites\n .command('domain-remove')\n .description('Remove a custom domain from a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.removeDomain(options.id);\n if (response.success) {\n success('Domain removed');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites integration-add\n websites\n .command('integration-add')\n .description('Add an integration to a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .requiredOption('-t, --type <type>', 'Integration type (e.g., matomo)')\n .requiredOption('-c, --config <json>', 'Integration config as JSON')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; type: string; config: string; format: OutputFormat }) => {\n const client = getClient();\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(options.config);\n } catch {\n error('Invalid JSON config');\n process.exit(1);\n }\n try {\n const response = await client.websites.addIntegration(options.id, {\n integration_type: options.type,\n config,\n });\n if (response.success) {\n success('Integration added');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites integration-remove\n websites\n .command('integration-remove')\n .description('Remove an integration from a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .requiredOption('-t, --type <type>', 'Integration type')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; type: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.removeIntegration(options.id, options.type);\n if (response.success) {\n success('Integration removed');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites team-add\n websites\n .command('team-add')\n .description('Add a team member to a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .requiredOption('-e, --email <email>', 'Team member email')\n .requiredOption('-r, --role <role>', 'Role (Editor or Commenter)')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; email: string; role: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.addTeamMember(options.id, options.email, options.role as 'Editor' | 'Commenter');\n if (response.success) {\n success('Team member added');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n // websites team-remove\n websites\n .command('team-remove')\n .description('Remove a team member from a website')\n .requiredOption('-i, --id <id>', 'Website ID')\n .requiredOption('-m, --member <memberId>', 'Member ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { id: string; member: string; format: OutputFormat }) => {\n const client = getClient();\n try {\n const response = await client.websites.removeTeamMember(options.id, options.member);\n if (response.success) {\n success('Team member removed');\n }\n output(response, options.format);\n } catch (err) {\n handleError(err);\n }\n });\n\n return websites;\n}\n\n/**\n * Gets a configured LindoClient.\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n","/**\n * Browser Opener Utilities\n *\n * Provides functions for opening URLs in the user's default browser\n * using platform-specific commands.\n *\n * @satisfies Requirements 1.3\n */\n\nimport { exec } from 'node:child_process';\nimport { platform } from 'node:os';\n\n/**\n * Opens a URL in the user's default browser.\n *\n * Uses platform-specific commands to open the browser:\n * - macOS: `open`\n * - Linux: `xdg-open`\n * - Windows: `start`\n *\n * @param url - The URL to open in the browser\n * @returns A promise that resolves to `true` if the browser was opened successfully, `false` otherwise\n *\n * @example\n * ```typescript\n * const success = await openBrowser('https://example.com');\n * if (!success) {\n * console.log('Failed to open browser. Please visit the URL manually.');\n * }\n * ```\n */\nexport function openBrowser(url: string): Promise<boolean> {\n return new Promise((resolve) => {\n const currentPlatform = platform();\n let command: string;\n\n switch (currentPlatform) {\n case 'darwin':\n // macOS\n command = `open \"${url}\"`;\n break;\n case 'win32':\n // Windows - use start command with empty title\n command = `start \"\" \"${url}\"`;\n break;\n default:\n // Linux and other Unix-like systems\n command = `xdg-open \"${url}\"`;\n break;\n }\n\n exec(command, (error) => {\n if (error) {\n resolve(false);\n } else {\n resolve(true);\n }\n });\n });\n}\n","/**\n * Pages Commands\n *\n * Commands for page management operations.\n *\n * @satisfies Requirements 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\nimport { openBrowser } from '../utils/browser';\n\n/**\n * PID file path for the pages preview server.\n * Located in the OS temp directory.\n */\nconst PID_FILE = path.join(os.tmpdir(), 'lindoai-pages-preview.pid');\n\n/**\n * Port file path for the pages preview server.\n * Located in the OS temp directory.\n */\nconst PORT_FILE = path.join(os.tmpdir(), 'lindoai-pages-preview.port');\n\n/**\n * Creates the pages command.\n *\n * @returns The pages command\n */\nexport function createPagesCommand(): Command {\n const pages = new Command('pages').description('Page management operations');\n\n // pages list\n pages\n .command('list')\n .description('List all pages for a website')\n .requiredOption('-w, --website <id>', 'Website ID')\n .option('-p, --page <page>', 'Page number', '1')\n .option('-s, --search <search>', 'Search term')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; page: string; search?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.pages.list(options.website, {\n page: parseInt(options.page, 10),\n search: options.search,\n });\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n const result = response.result;\n if (result?.list && result.list.length > 0) {\n console.log('\\nPages:');\n console.log('------');\n for (const p of result.list) {\n console.log(` ID: ${p.page_id}`);\n console.log(` Name: ${p.name ?? 'N/A'}`);\n console.log(` Path: ${p.path ?? 'N/A'}`);\n console.log(` Status: ${p.status ?? 'N/A'}`);\n console.log(` Published: ${p.publish_date ? new Date(p.publish_date * 1000).toISOString() : 'No'}`);\n console.log('');\n }\n console.log(`Total: ${result.total ?? result.list.length}`);\n } else {\n info('No pages found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages get\n pages\n .command('get')\n .description('Get details of a specific page')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Page ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.pages.get(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n const result = response.result;\n if (result) {\n console.log('\\nPage Details:');\n console.log('-------------');\n console.log(` ID: ${result.page_id}`);\n console.log(` Name: ${result.name ?? 'N/A'}`);\n console.log(` Path: ${result.path ?? 'N/A'}`);\n console.log(` Status: ${result.status ?? 'N/A'}`);\n console.log(` Published: ${result.publish_date ? new Date(result.publish_date * 1000).toISOString() : 'No'}`);\n console.log(` Created: ${result.created_date ?? 'N/A'}`);\n } else {\n error('Page not found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages publish\n pages\n .command('publish')\n .description('Publish a page')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Page ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.pages.publish(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.success) {\n success('Page published successfully');\n console.log(` Page ID: ${response.result?.page_id}`);\n console.log(` Published at: ${response.result?.publish_date ? new Date(response.result.publish_date * 1000).toISOString() : 'N/A'}`);\n } else {\n error('Failed to publish page');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages unpublish\n pages\n .command('unpublish')\n .description('Unpublish a page')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Page ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.pages.unpublish(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.success) {\n success('Page unpublished successfully');\n console.log(` Page ID: ${response.result?.page_id}`);\n } else {\n error('Failed to unpublish page');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages edit\n // Requirement 6.1: Fetch page HTML and save to local file\n // Requirement 6.2: --file option for custom output path\n // Requirement 6.3: --background flag for detached preview server\n // Requirement 6.4: Start preview server and open browser\n pages\n .command('edit')\n .description('Edit a page with live preview')\n .argument('<website_id>', 'Website ID')\n .argument('<page_id>', 'Page ID')\n .option('--file <path>', 'Output file path', './page.html')\n .option('--background', 'Run preview server in background')\n .action(async (websiteId: string, pageId: string, options: { file: string; background?: boolean }) => {\n const client = getClient();\n\n try {\n // Fetch page details to get the path\n info('Fetching page details...');\n const pageResponse = await client.pages.get(websiteId, pageId);\n \n if (!pageResponse.result) {\n error('Page not found');\n process.exit(1);\n }\n\n const pagePath = pageResponse.result.path;\n \n // Get website details to construct the URL\n const websiteResponse = await client.websites.getDetails(websiteId);\n if (!websiteResponse.result) {\n error('Website not found');\n process.exit(1);\n }\n\n // Construct the page URL\n const baseUrl = websiteResponse.result.custom_domain || websiteResponse.result.verified_domain || websiteResponse.result.preview_url;\n if (!baseUrl) {\n error('Could not determine website URL');\n process.exit(1);\n }\n\n const pageUrl = `https://${baseUrl}${pagePath}`;\n \n // Fetch the HTML content from the published page\n info(`Fetching HTML from ${pageUrl}...`);\n const htmlResponse = await fetch(pageUrl);\n \n if (!htmlResponse.ok) {\n error(`Failed to fetch page HTML: ${htmlResponse.status} ${htmlResponse.statusText}`);\n info('Make sure the page is published before editing');\n process.exit(1);\n }\n\n const html = await htmlResponse.text();\n\n // Save HTML to local file\n // Requirement 6.1, 6.2: Save to specified path or default ./page.html\n const outputPath = path.resolve(options.file);\n fs.writeFileSync(outputPath, html, 'utf-8');\n success(`HTML saved to ${outputPath}`);\n\n // Terminate any existing preview server\n // Requirement 9.6: Terminate existing server before starting new one\n await terminateExistingPreviewServer();\n\n if (options.background) {\n // Requirement 6.3, 9.1: Spawn detached preview server\n await startBackgroundPreviewServer(outputPath);\n } else {\n // Start preview server in foreground\n await startForegroundPreviewServer(outputPath);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages update\n // Requirement 6.5: Update page from local HTML file\n pages\n .command('update')\n .description('Update a page')\n .argument('<website_id>', 'Website ID')\n .argument('<page_id>', 'Page ID')\n .option('--html-file <path>', 'Path to local HTML file to upload')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (websiteId: string, pageId: string, options: { htmlFile?: string; format: OutputFormat }) => {\n const client = getClient();\n const config = loadConfig();\n\n try {\n if (!options.htmlFile) {\n error('--html-file option is required');\n info('Usage: lindoai pages update <website_id> <page_id> --html-file <path>');\n process.exit(1);\n }\n\n // Read the local HTML file\n const htmlPath = path.resolve(options.htmlFile);\n if (!fs.existsSync(htmlPath)) {\n error(`File not found: ${htmlPath}`);\n process.exit(1);\n }\n\n const html = fs.readFileSync(htmlPath, 'utf-8');\n info(`Read ${html.length} bytes from ${htmlPath}`);\n\n // Get the current page to get its path\n const pageResponse = await client.pages.get(websiteId, pageId);\n if (!pageResponse.result) {\n error('Page not found');\n process.exit(1);\n }\n\n const pagePath = pageResponse.result.path;\n\n // Update the page via API\n // The API endpoint is POST /v1/workspace/website/{website_id}/pages/{page_id}/update\n info('Updating page...');\n \n const apiBaseUrl = config.baseUrl || 'https://api.lindo.ai';\n const updateUrl = `${apiBaseUrl}/v1/workspace/website/${websiteId}/pages/${pageId}/update`;\n \n const response = await fetch(updateUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n html: html,\n path: pagePath,\n }),\n });\n\n const result = await response.json() as {\n success: boolean;\n result?: { page_id: string; publish_date?: number };\n errors?: string[];\n };\n\n if (options.format === 'json') {\n output(result, 'json');\n } else {\n if (result.success) {\n success('Page updated successfully');\n console.log(` Page ID: ${result.result?.page_id}`);\n if (result.result?.publish_date) {\n console.log(` Published at: ${new Date(result.result.publish_date * 1000).toISOString()}`);\n }\n } else {\n error('Failed to update page');\n if (result.errors) {\n for (const err of result.errors) {\n console.log(` ${err}`);\n }\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // pages stop-preview\n // Requirement 6.6, 9.4, 9.5: Stop background preview server\n pages\n .command('stop-preview')\n .description('Stop the background preview server')\n .action(async () => {\n try {\n // Check if PID file exists\n // Requirement 9.5: Display message if no preview server is running\n if (!fs.existsSync(PID_FILE)) {\n info('No preview server is running');\n return;\n }\n\n // Read PID from file\n const pid = parseInt(fs.readFileSync(PID_FILE, 'utf-8').trim(), 10);\n \n if (isNaN(pid)) {\n error('Invalid PID file');\n cleanupPidFiles();\n return;\n }\n\n // Send SIGTERM to the process\n // Requirement 9.4: Send SIGTERM to stop the server\n try {\n process.kill(pid, 'SIGTERM');\n success(`Preview server (PID ${pid}) stopped`);\n } catch (killErr: any) {\n if (killErr.code === 'ESRCH') {\n info('Preview server process not found (may have already stopped)');\n } else {\n error(`Failed to stop preview server: ${killErr.message}`);\n }\n }\n\n // Clean up PID and port files\n cleanupPidFiles();\n } catch (err) {\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n process.exit(1);\n }\n });\n\n return pages;\n}\n\n/**\n * Gets a configured LindoClient.\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n\n/**\n * Cleans up PID and port files.\n */\nfunction cleanupPidFiles(): void {\n try {\n if (fs.existsSync(PID_FILE)) {\n fs.unlinkSync(PID_FILE);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n\n try {\n if (fs.existsSync(PORT_FILE)) {\n fs.unlinkSync(PORT_FILE);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n}\n\n/**\n * Terminates any existing preview server.\n * Requirement 9.6: Terminate existing server before starting new one\n */\nasync function terminateExistingPreviewServer(): Promise<void> {\n if (!fs.existsSync(PID_FILE)) {\n return;\n }\n\n try {\n const pid = parseInt(fs.readFileSync(PID_FILE, 'utf-8').trim(), 10);\n if (!isNaN(pid)) {\n try {\n process.kill(pid, 'SIGTERM');\n info(`Terminated existing preview server (PID ${pid})`);\n // Wait a bit for the process to terminate\n await new Promise(resolve => setTimeout(resolve, 500));\n } catch {\n // Process may not exist, ignore\n }\n }\n } catch {\n // Ignore errors reading PID file\n }\n\n cleanupPidFiles();\n}\n\n/**\n * Starts the preview server in background mode.\n * Requirements 6.3, 9.1, 9.2, 9.3: Spawn detached process, write PID/port files\n */\nasync function startBackgroundPreviewServer(filePath: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n \n // Inline server code that will be executed in the child process\n // This is necessary because we need to spawn a completely detached process\n const serverCode = `\n const http = require('node:http');\n const fs = require('node:fs');\n const path = require('node:path');\n const os = require('node:os');\n\n const LIVE_RELOAD_SCRIPT = \\`<script>\n (function() {\n var eventSource = new EventSource('/__live-reload');\n eventSource.onmessage = function(event) {\n if (event.data === 'reload') {\n window.location.reload();\n }\n };\n eventSource.onerror = function() {\n console.log('[Live Reload] Connection lost, attempting to reconnect...');\n };\n })();\n </script>\\`;\n\n const filePath = ${JSON.stringify(absolutePath)};\n const pidFile = path.join(os.tmpdir(), 'lindoai-pages-preview.pid');\n const portFile = path.join(os.tmpdir(), 'lindoai-pages-preview.port');\n const sseClients = new Set();\n let debounceTimer = null;\n\n function injectLiveReload(html) {\n const bodyCloseTagRegex = /<\\\\/body>/i;\n const match = html.match(bodyCloseTagRegex);\n if (match && match.index !== undefined) {\n return html.slice(0, match.index) + LIVE_RELOAD_SCRIPT + html.slice(match.index);\n }\n return html + LIVE_RELOAD_SCRIPT;\n }\n\n function notifyClients() {\n for (const client of sseClients) {\n try {\n client.write('data: reload\\\\n\\\\n');\n } catch {\n sseClients.delete(client);\n }\n }\n }\n\n function handleFileChange() {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n notifyClients();\n debounceTimer = null;\n }, 100);\n }\n\n const server = http.createServer((req, res) => {\n const url = req.url || '/';\n if (req.method !== 'GET') {\n res.writeHead(405, { 'Content-Type': 'text/plain' });\n res.end('Method Not Allowed');\n return;\n }\n\n if (url === '/__live-reload') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n res.write('data: connected\\\\n\\\\n');\n sseClients.add(res);\n req.on('close', () => sseClients.delete(res));\n return;\n }\n\n if (url === '/' || url === '/index.html') {\n try {\n const html = fs.readFileSync(filePath, 'utf-8');\n const injectedHtml = injectLiveReload(html);\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(injectedHtml);\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end('<h1>Error loading file</h1><p>' + err.message + '</p>');\n }\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end('<h1>404 Not Found</h1>');\n });\n\n let watcher = null;\n\n const handleShutdown = () => {\n if (watcher) watcher.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n for (const client of sseClients) {\n try { client.end(); } catch {}\n }\n sseClients.clear();\n try { if (fs.existsSync(pidFile)) fs.unlinkSync(pidFile); } catch {}\n try { if (fs.existsSync(portFile)) fs.unlinkSync(portFile); } catch {}\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000);\n };\n\n process.on('SIGTERM', handleShutdown);\n process.on('SIGINT', handleShutdown);\n\n server.listen(0, '127.0.0.1', () => {\n const port = server.address().port;\n fs.writeFileSync(pidFile, process.pid.toString(), 'utf-8');\n fs.writeFileSync(portFile, port.toString(), 'utf-8');\n \n try {\n watcher = fs.watch(filePath, (eventType) => {\n if (eventType === 'change') handleFileChange();\n });\n } catch {}\n });\n `;\n\n // Spawn the server as a detached process\n const child = spawn(process.execPath, ['-e', serverCode], {\n detached: true,\n stdio: 'ignore',\n });\n\n child.unref();\n\n // Wait for the port file to be written\n let port: number | null = null;\n for (let i = 0; i < 50; i++) {\n await new Promise(resolve => setTimeout(resolve, 100));\n if (fs.existsSync(PORT_FILE)) {\n try {\n port = parseInt(fs.readFileSync(PORT_FILE, 'utf-8').trim(), 10);\n if (!isNaN(port)) break;\n } catch {\n // Continue waiting\n }\n }\n }\n\n if (!port) {\n error('Failed to start preview server');\n process.exit(1);\n }\n\n const previewUrl = `http://127.0.0.1:${port}/`;\n \n // Open browser\n // Requirement 6.4: Open browser to preview URL\n const browserOpened = await openBrowser(previewUrl);\n if (!browserOpened) {\n info(`Could not open browser. Visit: ${previewUrl}`);\n }\n\n success('Preview server started in background');\n console.log(` URL: ${previewUrl}`);\n console.log(` PID: ${child.pid}`);\n console.log('');\n info('To update the page: lindoai pages update <website_id> <page_id> --html-file <path>');\n info('To stop the server: lindoai pages stop-preview');\n}\n\n/**\n * Starts the preview server in foreground mode.\n * Requirement 6.4: Start preview server and open browser\n */\nasync function startForegroundPreviewServer(filePath: string): Promise<void> {\n // Import the live preview server\n const { startLivePreviewServer } = await import('../server/live-preview-server');\n \n info('Starting preview server...');\n const port = await startLivePreviewServer(filePath);\n const previewUrl = `http://127.0.0.1:${port}/`;\n\n // Write PID and port files for consistency\n fs.writeFileSync(PID_FILE, process.pid.toString(), 'utf-8');\n fs.writeFileSync(PORT_FILE, port.toString(), 'utf-8');\n\n // Open browser\n const browserOpened = await openBrowser(previewUrl);\n if (!browserOpened) {\n info(`Could not open browser. Visit: ${previewUrl}`);\n }\n\n success('Preview server started');\n console.log(` URL: ${previewUrl}`);\n console.log('');\n info('Press Ctrl+C to stop the server');\n info('Edit the HTML file and save to see changes in the browser');\n}\n","/**\n * Blogs Commands\n *\n * Commands for blog management operations.\n *\n * @satisfies Requirements 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6\n */\n\nimport { Command } from 'commander';\nimport { LindoClient, AuthenticationError } from 'lindoai';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport { loadConfig, hasApiKey } from '../config';\nimport { success, error, info, output, type OutputFormat } from '../output';\nimport { openBrowser } from '../utils/browser';\n\n/**\n * PID file path for the blogs preview server.\n * Located in the OS temp directory.\n */\nconst PID_FILE = path.join(os.tmpdir(), 'lindoai-blogs-preview.pid');\n\n/**\n * Port file path for the blogs preview server.\n * Located in the OS temp directory.\n */\nconst PORT_FILE = path.join(os.tmpdir(), 'lindoai-blogs-preview.port');\n\n/**\n * Creates the blogs command.\n *\n * @returns The blogs command\n */\nexport function createBlogsCommand(): Command {\n const blogs = new Command('blogs').description('Blog management operations');\n\n // blogs list\n blogs\n .command('list')\n .description('List all blogs for a website')\n .requiredOption('-w, --website <id>', 'Website ID')\n .option('-p, --page <page>', 'Page number', '1')\n .option('-s, --search <search>', 'Search term')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; page: string; search?: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.blogs.list(options.website, {\n page: parseInt(options.page, 10),\n search: options.search,\n });\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n const result = response.result;\n if (result?.list && result.list.length > 0) {\n console.log('\\nBlogs:');\n console.log('------');\n for (const b of result.list) {\n console.log(` ID: ${b.blog_id}`);\n console.log(` Name: ${b.name ?? 'N/A'}`);\n console.log(` Path: ${b.path ?? 'N/A'}`);\n console.log(` Status: ${b.status ?? 'N/A'}`);\n console.log(` Published: ${b.publish_date ? new Date(b.publish_date * 1000).toISOString() : 'No'}`);\n console.log('');\n }\n console.log(`Total: ${result.total ?? result.list.length}`);\n } else {\n info('No blogs found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs get\n blogs\n .command('get')\n .description('Get details of a specific blog')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Blog ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.blogs.get(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n const result = response.result;\n if (result) {\n console.log('\\nBlog Details:');\n console.log('-------------');\n console.log(` ID: ${result.blog_id}`);\n console.log(` Name: ${result.name ?? 'N/A'}`);\n console.log(` Path: ${result.path ?? 'N/A'}`);\n console.log(` Status: ${result.status ?? 'N/A'}`);\n console.log(` Published: ${result.publish_date ? new Date(result.publish_date * 1000).toISOString() : 'No'}`);\n console.log(` Created: ${result.created_date ?? 'N/A'}`);\n } else {\n error('Blog not found');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs publish\n blogs\n .command('publish')\n .description('Publish a blog')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Blog ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.blogs.publish(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.success) {\n success('Blog published successfully');\n console.log(` Blog ID: ${response.result?.blog_id}`);\n console.log(` Published at: ${response.result?.publish_date ? new Date(response.result.publish_date * 1000).toISOString() : 'N/A'}`);\n } else {\n error('Failed to publish blog');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs unpublish\n blogs\n .command('unpublish')\n .description('Unpublish a blog')\n .requiredOption('-w, --website <id>', 'Website ID')\n .requiredOption('-i, --id <id>', 'Blog ID')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (options: { website: string; id: string; format: OutputFormat }) => {\n const client = getClient();\n\n try {\n const response = await client.blogs.unpublish(options.website, options.id);\n \n if (options.format === 'json') {\n output(response, 'json');\n } else {\n if (response.success) {\n success('Blog unpublished successfully');\n console.log(` Blog ID: ${response.result?.blog_id}`);\n } else {\n error('Failed to unpublish blog');\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs edit\n // Requirement 7.1: Fetch blog HTML and save to local file\n // Requirement 7.2: --file option for custom output path\n // Requirement 7.3: --background flag for detached preview server\n // Requirement 7.4: Start preview server and open browser\n blogs\n .command('edit')\n .description('Edit a blog with live preview')\n .argument('<website_id>', 'Website ID')\n .argument('<blog_id>', 'Blog ID')\n .option('--file <path>', 'Output file path', './blog.html')\n .option('--background', 'Run preview server in background')\n .action(async (websiteId: string, blogId: string, options: { file: string; background?: boolean }) => {\n const client = getClient();\n\n try {\n // Fetch blog details to get the path\n info('Fetching blog details...');\n const blogResponse = await client.blogs.get(websiteId, blogId);\n \n if (!blogResponse.result) {\n error('Blog not found');\n process.exit(1);\n }\n\n const blogPath = blogResponse.result.path;\n \n // Get website details to construct the URL\n const websiteResponse = await client.websites.getDetails(websiteId);\n if (!websiteResponse.result) {\n error('Website not found');\n process.exit(1);\n }\n\n // Construct the blog URL\n const baseUrl = websiteResponse.result.custom_domain || websiteResponse.result.verified_domain || websiteResponse.result.preview_url;\n if (!baseUrl) {\n error('Could not determine website URL');\n process.exit(1);\n }\n\n const blogUrl = `https://${baseUrl}${blogPath}`;\n \n // Fetch the HTML content from the published blog\n info(`Fetching HTML from ${blogUrl}...`);\n const htmlResponse = await fetch(blogUrl);\n \n if (!htmlResponse.ok) {\n error(`Failed to fetch blog HTML: ${htmlResponse.status} ${htmlResponse.statusText}`);\n info('Make sure the blog is published before editing');\n process.exit(1);\n }\n\n const html = await htmlResponse.text();\n\n // Save HTML to local file\n // Requirement 7.1, 7.2: Save to specified path or default ./blog.html\n const outputPath = path.resolve(options.file);\n fs.writeFileSync(outputPath, html, 'utf-8');\n success(`HTML saved to ${outputPath}`);\n\n // Terminate any existing preview server\n // Requirement 9.6: Terminate existing server before starting new one\n await terminateExistingPreviewServer();\n\n if (options.background) {\n // Requirement 7.3, 9.1: Spawn detached preview server\n await startBackgroundPreviewServer(outputPath);\n } else {\n // Start preview server in foreground\n await startForegroundPreviewServer(outputPath);\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs update\n // Requirement 7.5: Update blog from local HTML file\n blogs\n .command('update')\n .description('Update a blog')\n .argument('<website_id>', 'Website ID')\n .argument('<blog_id>', 'Blog ID')\n .option('--html-file <path>', 'Path to local HTML file to upload')\n .option('-f, --format <format>', 'Output format (json, table)', 'table')\n .action(async (websiteId: string, blogId: string, options: { htmlFile?: string; format: OutputFormat }) => {\n const client = getClient();\n const config = loadConfig();\n\n try {\n if (!options.htmlFile) {\n error('--html-file option is required');\n info('Usage: lindoai blogs update <website_id> <blog_id> --html-file <path>');\n process.exit(1);\n }\n\n // Read the local HTML file\n const htmlPath = path.resolve(options.htmlFile);\n if (!fs.existsSync(htmlPath)) {\n error(`File not found: ${htmlPath}`);\n process.exit(1);\n }\n\n const html = fs.readFileSync(htmlPath, 'utf-8');\n info(`Read ${html.length} bytes from ${htmlPath}`);\n\n // Get the current blog to get its path\n const blogResponse = await client.blogs.get(websiteId, blogId);\n if (!blogResponse.result) {\n error('Blog not found');\n process.exit(1);\n }\n\n const blogPath = blogResponse.result.path;\n\n // Update the blog via API\n // The API endpoint is POST /v1/workspace/website/{website_id}/blogs/{blog_id}/update\n info('Updating blog...');\n \n const apiBaseUrl = config.baseUrl || 'https://api.lindo.ai';\n const updateUrl = `${apiBaseUrl}/v1/workspace/website/${websiteId}/blogs/${blogId}/update`;\n \n const response = await fetch(updateUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n html: html,\n path: blogPath,\n }),\n });\n\n const result = await response.json() as {\n success: boolean;\n result?: { blog_id: string; publish_date?: number };\n errors?: string[];\n };\n\n if (options.format === 'json') {\n output(result, 'json');\n } else {\n if (result.success) {\n success('Blog updated successfully');\n console.log(` Blog ID: ${result.result?.blog_id}`);\n if (result.result?.publish_date) {\n console.log(` Published at: ${new Date(result.result.publish_date * 1000).toISOString()}`);\n }\n } else {\n error('Failed to update blog');\n if (result.errors) {\n for (const err of result.errors) {\n console.log(` ${err}`);\n }\n }\n }\n }\n } catch (err) {\n handleError(err);\n }\n });\n\n // blogs stop-preview\n // Requirement 7.6, 9.4, 9.5: Stop background preview server\n blogs\n .command('stop-preview')\n .description('Stop the background preview server')\n .action(async () => {\n try {\n // Check if PID file exists\n // Requirement 9.5: Display message if no preview server is running\n if (!fs.existsSync(PID_FILE)) {\n info('No preview server is running');\n return;\n }\n\n // Read PID from file\n const pid = parseInt(fs.readFileSync(PID_FILE, 'utf-8').trim(), 10);\n \n if (isNaN(pid)) {\n error('Invalid PID file');\n cleanupPidFiles();\n return;\n }\n\n // Send SIGTERM to the process\n // Requirement 9.4: Send SIGTERM to stop the server\n try {\n process.kill(pid, 'SIGTERM');\n success(`Preview server (PID ${pid}) stopped`);\n } catch (killErr: any) {\n if (killErr.code === 'ESRCH') {\n info('Preview server process not found (may have already stopped)');\n } else {\n error(`Failed to stop preview server: ${killErr.message}`);\n }\n }\n\n // Clean up PID and port files\n cleanupPidFiles();\n } catch (err) {\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n process.exit(1);\n }\n });\n\n return blogs;\n}\n\n/**\n * Gets a configured LindoClient.\n */\nfunction getClient(): LindoClient {\n if (!hasApiKey()) {\n error('API key not configured');\n info('Run: lindo config set apiKey <your-api-key>');\n info('Or set the LINDO_API_KEY environment variable');\n process.exit(1);\n }\n\n const config = loadConfig();\n return new LindoClient({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n });\n}\n\n/**\n * Handles errors from API calls.\n */\nfunction handleError(err: unknown): never {\n if (err instanceof AuthenticationError) {\n error('Authentication failed');\n info('Your API key may be invalid or expired');\n info('Run: lindo config set apiKey <your-api-key>');\n process.exit(1);\n }\n\n if (err instanceof Error) {\n error(err.message);\n } else {\n error('An unexpected error occurred');\n }\n\n process.exit(1);\n}\n\n/**\n * Cleans up PID and port files.\n */\nfunction cleanupPidFiles(): void {\n try {\n if (fs.existsSync(PID_FILE)) {\n fs.unlinkSync(PID_FILE);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n\n try {\n if (fs.existsSync(PORT_FILE)) {\n fs.unlinkSync(PORT_FILE);\n }\n } catch {\n // Ignore errors when cleaning up\n }\n}\n\n/**\n * Terminates any existing preview server.\n * Requirement 9.6: Terminate existing server before starting new one\n */\nasync function terminateExistingPreviewServer(): Promise<void> {\n if (!fs.existsSync(PID_FILE)) {\n return;\n }\n\n try {\n const pid = parseInt(fs.readFileSync(PID_FILE, 'utf-8').trim(), 10);\n if (!isNaN(pid)) {\n try {\n process.kill(pid, 'SIGTERM');\n info(`Terminated existing preview server (PID ${pid})`);\n // Wait a bit for the process to terminate\n await new Promise(resolve => setTimeout(resolve, 500));\n } catch {\n // Process may not exist, ignore\n }\n }\n } catch {\n // Ignore errors reading PID file\n }\n\n cleanupPidFiles();\n}\n\n/**\n * Starts the preview server in background mode.\n * Requirements 7.3, 9.1, 9.2, 9.3: Spawn detached process, write PID/port files\n */\nasync function startBackgroundPreviewServer(filePath: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n \n // Inline server code that will be executed in the child process\n // This is necessary because we need to spawn a completely detached process\n const serverCode = `\n const http = require('node:http');\n const fs = require('node:fs');\n const path = require('node:path');\n const os = require('node:os');\n\n const LIVE_RELOAD_SCRIPT = \\`<script>\n (function() {\n var eventSource = new EventSource('/__live-reload');\n eventSource.onmessage = function(event) {\n if (event.data === 'reload') {\n window.location.reload();\n }\n };\n eventSource.onerror = function() {\n console.log('[Live Reload] Connection lost, attempting to reconnect...');\n };\n })();\n </script>\\`;\n\n const filePath = ${JSON.stringify(absolutePath)};\n const pidFile = path.join(os.tmpdir(), 'lindoai-blogs-preview.pid');\n const portFile = path.join(os.tmpdir(), 'lindoai-blogs-preview.port');\n const sseClients = new Set();\n let debounceTimer = null;\n\n function injectLiveReload(html) {\n const bodyCloseTagRegex = /<\\\\/body>/i;\n const match = html.match(bodyCloseTagRegex);\n if (match && match.index !== undefined) {\n return html.slice(0, match.index) + LIVE_RELOAD_SCRIPT + html.slice(match.index);\n }\n return html + LIVE_RELOAD_SCRIPT;\n }\n\n function notifyClients() {\n for (const client of sseClients) {\n try {\n client.write('data: reload\\\\n\\\\n');\n } catch {\n sseClients.delete(client);\n }\n }\n }\n\n function handleFileChange() {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n notifyClients();\n debounceTimer = null;\n }, 100);\n }\n\n const server = http.createServer((req, res) => {\n const url = req.url || '/';\n if (req.method !== 'GET') {\n res.writeHead(405, { 'Content-Type': 'text/plain' });\n res.end('Method Not Allowed');\n return;\n }\n\n if (url === '/__live-reload') {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n res.write('data: connected\\\\n\\\\n');\n sseClients.add(res);\n req.on('close', () => sseClients.delete(res));\n return;\n }\n\n if (url === '/' || url === '/index.html') {\n try {\n const html = fs.readFileSync(filePath, 'utf-8');\n const injectedHtml = injectLiveReload(html);\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-cache' });\n res.end(injectedHtml);\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end('<h1>Error loading file</h1><p>' + err.message + '</p>');\n }\n return;\n }\n\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end('<h1>404 Not Found</h1>');\n });\n\n let watcher = null;\n\n const handleShutdown = () => {\n if (watcher) watcher.close();\n if (debounceTimer) clearTimeout(debounceTimer);\n for (const client of sseClients) {\n try { client.end(); } catch {}\n }\n sseClients.clear();\n try { if (fs.existsSync(pidFile)) fs.unlinkSync(pidFile); } catch {}\n try { if (fs.existsSync(portFile)) fs.unlinkSync(portFile); } catch {}\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 1000);\n };\n\n process.on('SIGTERM', handleShutdown);\n process.on('SIGINT', handleShutdown);\n\n server.listen(0, '127.0.0.1', () => {\n const port = server.address().port;\n fs.writeFileSync(pidFile, process.pid.toString(), 'utf-8');\n fs.writeFileSync(portFile, port.toString(), 'utf-8');\n \n try {\n watcher = fs.watch(filePath, (eventType) => {\n if (eventType === 'change') handleFileChange();\n });\n } catch {}\n });\n `;\n\n // Spawn the server as a detached process\n const child = spawn(process.execPath, ['-e', serverCode], {\n detached: true,\n stdio: 'ignore',\n });\n\n child.unref();\n\n // Wait for the port file to be written\n let port: number | null = null;\n for (let i = 0; i < 50; i++) {\n await new Promise(resolve => setTimeout(resolve, 100));\n if (fs.existsSync(PORT_FILE)) {\n try {\n port = parseInt(fs.readFileSync(PORT_FILE, 'utf-8').trim(), 10);\n if (!isNaN(port)) break;\n } catch {\n // Continue waiting\n }\n }\n }\n\n if (!port) {\n error('Failed to start preview server');\n process.exit(1);\n }\n\n const previewUrl = `http://127.0.0.1:${port}/`;\n \n // Open browser\n // Requirement 7.4: Open browser to preview URL\n const browserOpened = await openBrowser(previewUrl);\n if (!browserOpened) {\n info(`Could not open browser. Visit: ${previewUrl}`);\n }\n\n success('Preview server started in background');\n console.log(` URL: ${previewUrl}`);\n console.log(` PID: ${child.pid}`);\n console.log('');\n info('To update the blog: lindoai blogs update <website_id> <blog_id> --html-file <path>');\n info('To stop the server: lindoai blogs stop-preview');\n}\n\n/**\n * Starts the preview server in foreground mode.\n * Requirement 7.4: Start preview server and open browser\n */\nasync function startForegroundPreviewServer(filePath: string): Promise<void> {\n // Import the live preview server\n const { startLivePreviewServer } = await import('../server/live-preview-server');\n \n info('Starting preview server...');\n const port = await startLivePreviewServer(filePath);\n const previewUrl = `http://127.0.0.1:${port}/`;\n\n // Write PID and port files for consistency\n fs.writeFileSync(PID_FILE, process.pid.toString(), 'utf-8');\n fs.writeFileSync(PORT_FILE, port.toString(), 'utf-8');\n\n // Open browser\n const browserOpened = await openBrowser(previewUrl);\n if (!browserOpened) {\n info(`Could not open browser. Visit: ${previewUrl}`);\n }\n\n success('Preview server started');\n console.log(` URL: ${previewUrl}`);\n console.log('');\n info('Press Ctrl+C to stop the server');\n info('Edit the HTML file and save to see changes in the browser');\n}\n","/**\n * State Token Utilities\n *\n * Provides functions for generating and verifying state tokens\n * used in the OAuth-like browser login flow for CSRF protection.\n *\n * @satisfies Requirements 1.2, 2.2\n */\n\nimport * as crypto from 'node:crypto';\n\n/**\n * Generates a cryptographically secure state token.\n *\n * The token consists of 32 bytes of random data encoded as hexadecimal,\n * resulting in a 64-character string. This is used for CSRF protection\n * during the browser login flow.\n *\n * @returns A 64-character hexadecimal string\n */\nexport function generateState(): string {\n return crypto.randomBytes(32).toString('hex');\n}\n\n/**\n * Verifies that a received state token matches the expected value.\n *\n * Performs an exact string comparison to ensure the state token\n * received in the callback matches the one originally generated.\n *\n * @param received - The state token received in the callback\n * @param expected - The state token that was originally generated\n * @returns True if the tokens match exactly, false otherwise\n */\nexport function verifyState(received: string, expected: string): boolean {\n return received === expected;\n}\n","/**\n * Callback Server for Browser Login Flow\n *\n * Provides a temporary HTTP server that receives OAuth-like callbacks\n * from the webapp after user authorization. The server binds exclusively\n * to localhost for security.\n *\n * @satisfies Requirements 1.1, 1.7, 1.8, 1.9, 1.10, 2.1, 2.3, 2.4\n */\n\nimport * as http from 'node:http';\nimport { URL } from 'node:url';\nimport { verifyState } from '../utils/state.js';\n\n/**\n * Result of a callback operation.\n */\nexport interface CallbackResult {\n /** Whether the callback was successful */\n success: boolean;\n /** The API key received (only present on success) */\n apiKey?: string;\n /** Error message (only present on failure) */\n error?: string;\n}\n\n/**\n * Parameters parsed from a callback URL.\n */\nexport interface CallbackParams {\n /** The API key (present on successful authorization) */\n key?: string;\n /** The state token for CSRF verification */\n state?: string;\n /** Error code (present when authorization failed) */\n error?: string;\n /** Human-readable error message */\n message?: string;\n}\n\n/**\n * Interface for the callback server.\n */\nexport interface CallbackServer {\n /**\n * Starts the server and returns connection info.\n * @returns Promise resolving to the port and full URL\n */\n start(): Promise<{ port: number; url: string }>;\n\n /**\n * Waits for a callback with the expected state token.\n * @param state - The expected state token\n * @param timeoutMs - Maximum time to wait in milliseconds\n * @returns Promise resolving to the callback result\n */\n waitForCallback(state: string, timeoutMs: number): Promise<CallbackResult>;\n\n /**\n * Stops the server and cleans up resources.\n */\n stop(): Promise<void>;\n}\n\n/**\n * Parses callback parameters from a URL string.\n *\n * Extracts the key, state, error, and message query parameters\n * from a callback URL.\n *\n * @param url - The URL string to parse (can be full URL or just path with query)\n * @returns The parsed callback parameters\n *\n * @example\n * ```typescript\n * parseCallbackParams('/callback?key=abc123&state=xyz');\n * // { key: 'abc123', state: 'xyz' }\n *\n * parseCallbackParams('/callback?error=access_denied&message=User%20cancelled');\n * // { error: 'access_denied', message: 'User cancelled' }\n * ```\n */\nexport function parseCallbackParams(url: string): CallbackParams {\n try {\n // Handle both full URLs and relative paths\n const fullUrl = url.startsWith('http') ? url : `http://localhost${url}`;\n const parsed = new URL(fullUrl);\n const params = parsed.searchParams;\n\n return {\n key: params.get('key') ?? undefined,\n state: params.get('state') ?? undefined,\n error: params.get('error') ?? undefined,\n message: params.get('message') ?? undefined,\n };\n } catch {\n // Return empty params for malformed URLs\n return {};\n }\n}\n\n/**\n * Generates an HTML success page for the browser.\n *\n * @returns HTML string for successful authorization\n */\nfunction generateSuccessHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authorization Successful - Lindo CLI</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: #fff;\n }\n .container {\n text-align: center;\n padding: 2rem;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 16px;\n backdrop-filter: blur(10px);\n max-width: 400px;\n }\n .icon {\n font-size: 4rem;\n margin-bottom: 1rem;\n }\n h1 {\n margin: 0 0 1rem 0;\n font-size: 1.5rem;\n }\n p {\n margin: 0;\n opacity: 0.9;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✓</div>\n <h1>Authorization Successful</h1>\n <p>You can close this window and return to your terminal.</p>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Generates an HTML error page for the browser.\n *\n * @param errorMessage - The error message to display\n * @returns HTML string for failed authorization\n */\nfunction generateErrorHtml(errorMessage: string): string {\n // Escape HTML entities to prevent XSS\n const escapedMessage = errorMessage\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authorization Failed - Lindo CLI</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);\n color: #fff;\n }\n .container {\n text-align: center;\n padding: 2rem;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 16px;\n backdrop-filter: blur(10px);\n max-width: 400px;\n }\n .icon {\n font-size: 4rem;\n margin-bottom: 1rem;\n }\n h1 {\n margin: 0 0 1rem 0;\n font-size: 1.5rem;\n }\n p {\n margin: 0;\n opacity: 0.9;\n }\n .error-message {\n margin-top: 1rem;\n padding: 1rem;\n background: rgba(0, 0, 0, 0.2);\n border-radius: 8px;\n font-family: monospace;\n font-size: 0.9rem;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"icon\">✗</div>\n <h1>Authorization Failed</h1>\n <p>Something went wrong during authorization.</p>\n <div class=\"error-message\">${escapedMessage}</div>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Generates an HTML 404 page for non-callback paths.\n *\n * @returns HTML string for 404 response\n */\nfunction generate404Html(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Not Found - Lindo CLI</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #f5f5f5;\n color: #333;\n }\n .container {\n text-align: center;\n padding: 2rem;\n }\n h1 {\n font-size: 3rem;\n margin: 0 0 1rem 0;\n color: #999;\n }\n p {\n margin: 0;\n color: #666;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <h1>404</h1>\n <p>This endpoint is not available.</p>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Creates a new callback server instance.\n *\n * The server binds exclusively to 127.0.0.1 for security, handles only\n * GET /callback requests, and returns HTML responses for both success\n * and error states.\n *\n * @returns A new CallbackServer instance\n *\n * @example\n * ```typescript\n * const server = createCallbackServer();\n * const { port, url } = await server.start();\n * console.log(`Callback server listening at ${url}`);\n *\n * const result = await server.waitForCallback(expectedState, 120000);\n * if (result.success) {\n * console.log(`Received API key: ${result.apiKey}`);\n * } else {\n * console.error(`Error: ${result.error}`);\n * }\n *\n * await server.stop();\n * ```\n */\nexport function createCallbackServer(): CallbackServer {\n let server: http.Server | null = null;\n let pendingCallback: {\n expectedState: string;\n resolve: (result: CallbackResult) => void;\n timeoutId: NodeJS.Timeout;\n } | null = null;\n\n /**\n * Handles incoming HTTP requests.\n */\n function handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse\n ): void {\n const url = req.url || '/';\n const method = req.method || 'GET';\n\n // Only handle GET requests to /callback (with optional query string)\n // The path must be exactly \"/callback\" - not \"/callbacks\", \"/callback/extra\", etc.\n // Requirement 2.3: respond with 404 for paths other than /callback\n const isCallbackPath = url === '/callback' || url.startsWith('/callback?');\n if (method !== 'GET' || !isCallbackPath) {\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generate404Html());\n return;\n }\n\n // Parse callback parameters\n const params = parseCallbackParams(url);\n\n // Check if we're waiting for a callback\n if (!pendingCallback) {\n res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generateErrorHtml('No pending authorization request'));\n return;\n }\n\n const { expectedState, resolve, timeoutId } = pendingCallback;\n\n // Clear the timeout since we received a callback\n clearTimeout(timeoutId);\n pendingCallback = null;\n\n // Check for error parameter\n if (params.error) {\n const errorMessage = params.message || params.error;\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generateErrorHtml(errorMessage));\n resolve({\n success: false,\n error: errorMessage,\n });\n return;\n }\n\n // Verify state token\n if (!params.state || !verifyState(params.state, expectedState)) {\n const errorMessage = 'State token mismatch - possible CSRF attack';\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generateErrorHtml(errorMessage));\n resolve({\n success: false,\n error: errorMessage,\n });\n return;\n }\n\n // Check for API key\n if (!params.key) {\n const errorMessage = 'No API key received';\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generateErrorHtml(errorMessage));\n resolve({\n success: false,\n error: errorMessage,\n });\n return;\n }\n\n // Success!\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(generateSuccessHtml());\n resolve({\n success: true,\n apiKey: params.key,\n });\n }\n\n return {\n async start(): Promise<{ port: number; url: string }> {\n return new Promise((resolve, reject) => {\n server = http.createServer(handleRequest);\n\n server.on('error', (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n // Bind exclusively to 127.0.0.1 for security (Requirement 2.1)\n server.listen(0, '127.0.0.1', () => {\n const address = server!.address();\n if (!address || typeof address === 'string') {\n reject(new Error('Failed to get server address'));\n return;\n }\n\n const port = address.port;\n const url = `http://127.0.0.1:${port}/callback`;\n resolve({ port, url });\n });\n });\n },\n\n waitForCallback(state: string, timeoutMs: number): Promise<CallbackResult> {\n return new Promise((resolve) => {\n // Set up timeout\n const timeoutId = setTimeout(() => {\n if (pendingCallback) {\n pendingCallback = null;\n resolve({\n success: false,\n error: 'Login timed out waiting for authorization',\n });\n }\n }, timeoutMs);\n\n // Store the pending callback info\n pendingCallback = {\n expectedState: state,\n resolve,\n timeoutId,\n };\n });\n },\n\n async stop(): Promise<void> {\n return new Promise((resolve) => {\n // Clear any pending callback\n if (pendingCallback) {\n clearTimeout(pendingCallback.timeoutId);\n pendingCallback = null;\n }\n\n if (server) {\n server.close(() => {\n server = null;\n resolve();\n });\n } else {\n resolve();\n }\n });\n },\n };\n}\n","/**\n * Login Command\n *\n * Implements browser-based authentication for the CLI.\n * Orchestrates the full login flow: start callback server → generate state →\n * open browser → wait for callback → save API key → shutdown.\n *\n * @satisfies Requirements 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.10\n */\n\nimport { Command } from 'commander';\nimport { createCallbackServer } from '../server/callback.js';\nimport { generateState } from '../utils/state.js';\nimport { openBrowser } from '../utils/browser.js';\nimport { saveApiKey, getConfigPath } from '../config.js';\nimport { success, error, info } from '../output.js';\n\n/**\n * The base URL for the Lindo webapp authorization page.\n */\nconst WEBAPP_BASE_URL = 'https://app.lindo.ai';\n\n/**\n * Default timeout for the login flow in seconds.\n */\nconst DEFAULT_TIMEOUT_SECONDS = 120;\n\n/**\n * Builds the authorization URL for the browser login flow.\n *\n * Constructs a URL to the webapp consent page with the state token\n * and callback URL as query parameters.\n *\n * @param state - The state token for CSRF protection\n * @param callbackPort - The port number of the callback server\n * @returns The full authorization URL\n *\n * @example\n * ```typescript\n * const url = buildAuthorizationUrl('abc123...', 3456);\n * // Returns: https://app.lindo.ai/cli/authorize?state=abc123...&callback_url=http://127.0.0.1:3456/callback\n * ```\n */\nexport function buildAuthorizationUrl(state: string, callbackPort: number): string {\n const callbackUrl = `http://127.0.0.1:${callbackPort}/callback`;\n const params = new URLSearchParams({\n state,\n callback_url: callbackUrl,\n });\n return `${WEBAPP_BASE_URL}/cli/authorize?${params.toString()}`;\n}\n\n/**\n * Creates the login command.\n *\n * The login command implements a browser-based OAuth-like flow:\n * 1. Starts a temporary callback server on localhost\n * 2. Generates a cryptographic state token for CSRF protection\n * 3. Opens the user's browser to the consent page\n * 4. Waits for the callback with the API key\n * 5. Saves the API key to the config file\n * 6. Shuts down the callback server\n *\n * @returns The login command\n *\n * @example\n * ```bash\n * # Basic login\n * lindoai login\n *\n * # Login with custom timeout\n * lindoai login --timeout 60\n *\n * # Login without opening browser (manual URL copy)\n * lindoai login --no-browser\n * ```\n */\nexport function createLoginCommand(): Command {\n const login = new Command('login')\n .description('Authenticate via browser to configure your API key')\n .option(\n '-t, --timeout <seconds>',\n 'Timeout in seconds for the login flow',\n String(DEFAULT_TIMEOUT_SECONDS)\n )\n .option(\n '--no-browser',\n 'Display the authorization URL without opening the browser'\n )\n .action(async (options: { timeout: string; browser: boolean }) => {\n const timeoutSeconds = parseInt(options.timeout, 10);\n const timeoutMs = timeoutSeconds * 1000;\n const shouldOpenBrowser = options.browser;\n\n // Create and start the callback server\n const server = createCallbackServer();\n let serverStarted = false;\n\n try {\n info('Starting authentication flow...');\n\n // Start the callback server (Requirement 1.1)\n const { port } = await server.start();\n serverStarted = true;\n\n // Generate state token for CSRF protection (Requirement 1.2)\n const state = generateState();\n\n // Build the authorization URL (Requirement 1.3)\n const authUrl = buildAuthorizationUrl(state, port);\n\n if (shouldOpenBrowser) {\n // Open browser to consent page (Requirement 1.3)\n info('Opening browser for authorization...');\n const browserOpened = await openBrowser(authUrl);\n\n if (!browserOpened) {\n // Browser failed to open, show URL for manual copy\n info('Could not open browser automatically.');\n console.log('\\nPlease open this URL in your browser:');\n console.log(`\\n ${authUrl}\\n`);\n }\n } else {\n // --no-browser option: display URL without opening (Requirement 1.4)\n console.log('\\nPlease open this URL in your browser:');\n console.log(`\\n ${authUrl}\\n`);\n }\n\n info(`Waiting for authorization (timeout: ${timeoutSeconds}s)...`);\n\n // Wait for callback with timeout (Requirements 1.5, 1.6, 1.7, 1.8, 1.9)\n const result = await server.waitForCallback(state, timeoutMs);\n\n if (result.success && result.apiKey) {\n // Save API key to config file (Requirement 1.7)\n saveApiKey(result.apiKey);\n success('Successfully authenticated!');\n info(`API key saved to: ${getConfigPath()}`);\n } else {\n // Handle errors (Requirements 1.6, 1.8, 1.9)\n error(result.error || 'Authentication failed');\n process.exit(1);\n }\n } catch (err) {\n // Handle server startup or other errors\n error(err instanceof Error ? err.message : 'An unexpected error occurred');\n process.exit(1);\n } finally {\n // Shutdown callback server (Requirement 1.10)\n if (serverStarted) {\n await server.stop();\n }\n }\n });\n\n return login;\n}\n","/**\n * Agent Command\n *\n * Implements AI agent integration via OpenCode.\n * Checks for OpenCode installation, installs skill file, and launches the agent.\n *\n * @satisfies Requirements 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7\n */\n\nimport { Command } from 'commander';\nimport { execSync, spawn } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { success, error, info } from '../output.js';\n\n/**\n * The directory where OpenCode skills are stored.\n */\nconst OPENCODE_SKILLS_DIR = path.join(os.homedir(), '.config', 'opencode', 'skills', 'lindoai');\n\n/**\n * The path to the skill file.\n */\nconst SKILL_FILE_PATH = path.join(OPENCODE_SKILLS_DIR, 'SKILL.md');\n\n/**\n * The skill file content that documents all CLI commands.\n * This teaches OpenCode about the lindoai CLI capabilities.\n *\n * @satisfies Requirement 10.5\n */\nconst SKILL_FILE_CONTENT = `---\nname: lindoai\ndescription: Lindo AI CLI - Command-line interface for the Lindo API\n---\n\n# Lindo AI CLI\n\nThe \\`lindoai\\` CLI provides commands for interacting with the Lindo API, including website management, page editing, blog management, and more.\n\n## Authentication\n\n### Login via Browser\n\\`\\`\\`bash\nlindoai login\n\\`\\`\\`\nOpens your browser to authenticate and automatically configures your API key.\n\nOptions:\n- \\`--timeout <seconds>\\` - Timeout for the login flow (default: 120)\n- \\`--no-browser\\` - Display the authorization URL without opening the browser\n\n### Manual Configuration\n\\`\\`\\`bash\nlindoai config set apiKey <your-api-key>\n\\`\\`\\`\n\n## Website Management\n\n### List Websites\n\\`\\`\\`bash\nlindoai websites list\n\\`\\`\\`\n\n### Get Website Details\n\\`\\`\\`bash\nlindoai websites get <website_id>\n\\`\\`\\`\n\n## Page Management\n\n### List Pages\n\\`\\`\\`bash\nlindoai pages list <website_id>\n\\`\\`\\`\n\n### Get Page Details\n\\`\\`\\`bash\nlindoai pages get <website_id> <page_id>\n\\`\\`\\`\n\n### Live Preview Editing Workflow\n\n1. **Start editing with live preview:**\n\\`\\`\\`bash\nlindoai pages edit <website_id> <page_id> --background\n\\`\\`\\`\nThis fetches the page HTML, saves it locally, starts a preview server, and opens your browser.\n\nOptions:\n- \\`--file <path>\\` - Save HTML to a specific path (default: ./page.html)\n- \\`--background\\` - Run the preview server in the background\n\n2. **Edit the HTML file** in your editor. The browser will automatically refresh when you save.\n\n3. **Update the page** when you're done:\n\\`\\`\\`bash\nlindoai pages update <website_id> <page_id> --html-file ./page.html\n\\`\\`\\`\n\n4. **Stop the preview server:**\n\\`\\`\\`bash\nlindoai pages stop-preview\n\\`\\`\\`\n\n## Blog Management\n\n### List Blogs\n\\`\\`\\`bash\nlindoai blogs list <website_id>\n\\`\\`\\`\n\n### Get Blog Details\n\\`\\`\\`bash\nlindoai blogs get <website_id> <blog_id>\n\\`\\`\\`\n\n### Live Preview Editing Workflow\n\n1. **Start editing with live preview:**\n\\`\\`\\`bash\nlindoai blogs edit <website_id> <blog_id> --background\n\\`\\`\\`\n\nOptions:\n- \\`--file <path>\\` - Save HTML to a specific path (default: ./blog.html)\n- \\`--background\\` - Run the preview server in the background\n\n2. **Edit the HTML file** in your editor. The browser will automatically refresh when you save.\n\n3. **Update the blog** when you're done:\n\\`\\`\\`bash\nlindoai blogs update <website_id> <blog_id> --html-file ./blog.html\n\\`\\`\\`\n\n4. **Stop the preview server:**\n\\`\\`\\`bash\nlindoai blogs stop-preview\n\\`\\`\\`\n\n## AI Agents\n\n### Run an Agent\n\\`\\`\\`bash\nlindoai agents run <agent_id> --input '{\"prompt\": \"Hello!\"}'\n\\`\\`\\`\n\nOptions:\n- \\`--input <json>\\` - Input data as JSON string\n- \\`--stream\\` - Stream the response\n- \\`--format <format>\\` - Output format (json, table)\n\n## Workflows\n\n### Start a Workflow\n\\`\\`\\`bash\nlindoai workflows start <workflow_id> --params '{\"key\": \"value\"}'\n\\`\\`\\`\n\n### Get Workflow Status\n\\`\\`\\`bash\nlindoai workflows status <instance_id>\n\\`\\`\\`\n\n## Workspace\n\n### Get Workspace Credits\n\\`\\`\\`bash\nlindoai workspace credits\n\\`\\`\\`\n\n## Analytics\n\n### Get Workspace Analytics\n\\`\\`\\`bash\nlindoai analytics workspace --from 2024-01-01 --to 2024-01-31\n\\`\\`\\`\n\n## Configuration\n\n### View Configuration\n\\`\\`\\`bash\nlindoai config get apiKey\nlindoai config get baseUrl\n\\`\\`\\`\n\n### Set Configuration\n\\`\\`\\`bash\nlindoai config set apiKey <value>\nlindoai config set baseUrl <value>\n\\`\\`\\`\n\n## Tips for AI Agents\n\n1. **Always authenticate first** using \\`lindoai login\\` or by setting the API key.\n2. **Use the live preview workflow** for editing pages and blogs - it provides instant visual feedback.\n3. **Run preview servers in background mode** (\\`--background\\`) to keep the terminal available.\n4. **Remember to stop preview servers** when done editing with \\`stop-preview\\`.\n5. **Use JSON format** (\\`--format json\\`) when you need to parse command output programmatically.\n`;\n\n/**\n * Checks if OpenCode is installed on the system.\n *\n * Uses platform-specific commands to check for the opencode binary:\n * - Windows: `where opencode`\n * - Unix/macOS: `which opencode`\n *\n * @returns True if OpenCode is installed, false otherwise\n *\n * @satisfies Requirement 10.1\n */\nexport function isOpenCodeInstalled(): boolean {\n try {\n const command = process.platform === 'win32' ? 'where opencode' : 'which opencode';\n execSync(command, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Attempts to install OpenCode globally via npm.\n *\n * Runs `npm install -g opencode-ai@latest` to install the latest version.\n *\n * @returns True if installation succeeded, false otherwise\n *\n * @satisfies Requirement 10.2\n */\nexport function installOpenCode(): boolean {\n try {\n info('Installing OpenCode...');\n execSync('npm install -g opencode-ai@latest', { stdio: 'inherit' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensures the skill file is installed in the OpenCode skills directory.\n *\n * Creates the directory structure if it doesn't exist and writes the\n * SKILL.md file that documents all CLI commands.\n *\n * @satisfies Requirements 10.4, 10.5\n */\nexport function ensureSkillInstalled(): void {\n // Create the skills directory if it doesn't exist\n if (!fs.existsSync(OPENCODE_SKILLS_DIR)) {\n fs.mkdirSync(OPENCODE_SKILLS_DIR, { recursive: true });\n }\n\n // Write the skill file\n fs.writeFileSync(SKILL_FILE_PATH, SKILL_FILE_CONTENT, 'utf-8');\n}\n\n/**\n * Creates the agent command.\n *\n * The agent command:\n * 1. Checks if OpenCode is installed\n * 2. Optionally installs OpenCode if --install flag is provided\n * 3. Installs the skill file to teach OpenCode about CLI commands\n * 4. Launches OpenCode with inherited stdio for direct interaction\n *\n * @returns The agent command\n *\n * @example\n * ```bash\n * # Launch the AI agent\n * lindoai agent\n *\n * # Install OpenCode if not present and launch\n * lindoai agent --install\n *\n * # Launch with a specific model\n * lindoai agent --model gpt-4\n * ```\n *\n * @satisfies Requirements 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7\n */\nexport function createAgentCommand(): Command {\n const agent = new Command('agent')\n .description('Launch an AI agent that understands all CLI commands')\n .option('--install', 'Install OpenCode if not already installed')\n .option('--model <model>', 'Specify the model to use with OpenCode')\n .action(async (options: { install?: boolean; model?: string }) => {\n // Check if OpenCode is installed (Requirement 10.1)\n if (!isOpenCodeInstalled()) {\n if (options.install) {\n // Attempt to install OpenCode (Requirement 10.2)\n const installed = installOpenCode();\n if (!installed) {\n error('Failed to install OpenCode');\n info('Please install manually: npm install -g opencode-ai@latest');\n process.exit(1);\n }\n success('OpenCode installed successfully');\n } else {\n // Display error with installation instructions (Requirement 10.3)\n error('OpenCode is not installed');\n info('');\n info('To install OpenCode, run one of the following:');\n info(' lindoai agent --install');\n info(' npm install -g opencode-ai@latest');\n process.exit(1);\n }\n }\n\n // Install the skill file (Requirements 10.4, 10.5)\n try {\n ensureSkillInstalled();\n info(`Skill file installed to: ${SKILL_FILE_PATH}`);\n } catch (err) {\n error(`Failed to install skill file: ${err instanceof Error ? err.message : 'Unknown error'}`);\n process.exit(1);\n }\n\n // Build the OpenCode command arguments\n const args: string[] = [];\n\n // Add model option if provided (Requirement 10.6)\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Launch OpenCode with inherited stdio (Requirement 10.7)\n info('Launching OpenCode...');\n \n const opencode = spawn('opencode', args, {\n stdio: 'inherit',\n shell: true,\n });\n\n opencode.on('error', (err) => {\n error(`Failed to launch OpenCode: ${err.message}`);\n process.exit(1);\n });\n\n opencode.on('close', (code) => {\n process.exit(code ?? 0);\n });\n });\n\n return agent;\n}\n","/**\n * @lindo/cli\n *\n * Command-line interface for the Lindo API.\n * Provides terminal commands for interacting with the Lindo API.\n *\n * @satisfies Requirements 7.7, 7.8\n *\n * @example\n * ```bash\n * # Configure API key\n * lindo config set apiKey your-api-key\n *\n * # Run an agent\n * lindo agents run my-agent --input '{\"prompt\": \"Hello!\"}'\n *\n * # Start a workflow\n * lindo workflows start publish-page --params '{\"page_id\": \"page-123\"}'\n *\n * # Get workflow status\n * lindo workflows status instance-123\n *\n * # Get workspace credits\n * lindo workspace credits\n *\n * # Get analytics\n * lindo analytics workspace --from 2024-01-01 --to 2024-01-31\n * ```\n */\n\nimport { Command } from 'commander';\nimport { AuthenticationError } from 'lindoai';\nimport {\n createConfigCommand,\n createAgentsCommand,\n createWorkflowsCommand,\n createWorkspaceCommand,\n createAnalyticsCommand,\n createClientsCommand,\n createWebsitesCommand,\n createPagesCommand,\n createBlogsCommand,\n createLoginCommand,\n createAgentCommand,\n} from './commands';\nimport { error, info } from './output';\n\n/**\n * CLI version - should match package.json version.\n */\nconst VERSION = '1.0.0';\n\n/**\n * Creates and configures the main CLI program.\n *\n * @returns The configured commander program\n */\nfunction createProgram(): Command {\n const program = new Command();\n\n program\n .name('lindo')\n .description('Command-line interface for the Lindo API')\n .version(VERSION, '-v, --version', 'Output the current version')\n .helpOption('-h, --help', 'Display help for command');\n\n // Register all commands\n program.addCommand(createConfigCommand());\n program.addCommand(createAgentsCommand());\n program.addCommand(createWorkflowsCommand());\n program.addCommand(createWorkspaceCommand());\n program.addCommand(createAnalyticsCommand());\n program.addCommand(createClientsCommand());\n program.addCommand(createWebsitesCommand());\n program.addCommand(createPagesCommand());\n program.addCommand(createBlogsCommand());\n program.addCommand(createLoginCommand());\n program.addCommand(createAgentCommand());\n\n // Add global error handling\n program.exitOverride((err) => {\n // Handle commander errors gracefully\n if (err.code === 'commander.help') {\n process.exit(0);\n }\n if (err.code === 'commander.version') {\n process.exit(0);\n }\n if (err.code === 'commander.missingArgument') {\n error(err.message);\n process.exit(1);\n }\n if (err.code === 'commander.unknownCommand') {\n error(err.message);\n info('Run \"lindo --help\" for available commands');\n process.exit(1);\n }\n throw err;\n });\n\n return program;\n}\n\n/**\n * Handles authentication errors with helpful messages.\n *\n * @param err - The error to handle\n */\nfunction handleAuthenticationError(_err: AuthenticationError): void {\n error('Authentication failed');\n info('');\n info('Your API key may be invalid or expired.');\n info('');\n info('To configure your API key:');\n info(' 1. Run: lindo config set apiKey <your-api-key>');\n info(' 2. Or set the LINDO_API_KEY environment variable');\n info('');\n info('To get an API key:');\n info(' Visit https://app.lindo.ai/settings/api-keys');\n}\n\n/**\n * Main entry point for the CLI.\n */\nasync function main(): Promise<void> {\n const program = createProgram();\n\n try {\n await program.parseAsync(process.argv);\n } catch (err) {\n if (err instanceof AuthenticationError) {\n handleAuthenticationError(err);\n process.exit(1);\n }\n\n // Re-throw other errors\n throw err;\n }\n}\n\n// Run the CLI\nmain().catch((err) => {\n // Handle any uncaught errors\n if (err instanceof Error) {\n error(`Unexpected error: ${err.message}`);\n } else {\n error('An unexpected error occurred');\n }\n process.exit(1);\n});\n\n// Export for testing\nexport { createProgram };\n"]}
|