skillo 0.2.6 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +198 -198
  2. package/dist/api-client-BF6GDR7Q.js +12 -0
  3. package/dist/{chunk-WJKZWKER.js → chunk-63FVALWX.js} +1 -1
  4. package/dist/chunk-63FVALWX.js.map +1 -0
  5. package/dist/chunk-6GOJPFZ7.js +113 -0
  6. package/dist/chunk-6GOJPFZ7.js.map +1 -0
  7. package/dist/chunk-6UGTWBUW.js +89 -0
  8. package/dist/chunk-6UGTWBUW.js.map +1 -0
  9. package/dist/{chunk-2CVEPT6U.js → chunk-73NUWYUO.js} +2 -2
  10. package/dist/chunk-73NUWYUO.js.map +1 -0
  11. package/dist/chunk-QIV4VIXA.js +221 -0
  12. package/dist/chunk-QIV4VIXA.js.map +1 -0
  13. package/dist/{chunk-CPL3P2OF.js → chunk-QUXHHRRK.js} +2 -2
  14. package/dist/chunk-QUXHHRRK.js.map +1 -0
  15. package/dist/{chunk-ODOZM4QV.js → chunk-RQ2SC5HW.js} +72 -10
  16. package/dist/chunk-RQ2SC5HW.js.map +1 -0
  17. package/dist/chunk-U53QWUOR.js +727 -0
  18. package/dist/chunk-U53QWUOR.js.map +1 -0
  19. package/dist/chunk-VAQ73XPE.js +68 -0
  20. package/dist/chunk-VAQ73XPE.js.map +1 -0
  21. package/dist/chunk-XLJGCOVT.js +975 -0
  22. package/dist/chunk-XLJGCOVT.js.map +1 -0
  23. package/dist/{claude-watcher-N6GN6WHJ.js → claude-watcher-WKGBJYKN.js} +65 -3
  24. package/dist/claude-watcher-WKGBJYKN.js.map +1 -0
  25. package/dist/cli.js +495 -1846
  26. package/dist/cli.js.map +1 -1
  27. package/dist/{config-P5EM5L7N.js → config-ZOKAP2LJ.js} +3 -3
  28. package/dist/daemon-6DTCMOJB.js +28 -0
  29. package/dist/daemon-runner.js +338 -71
  30. package/dist/daemon-runner.js.map +1 -1
  31. package/dist/database-KQY5OSCS.js +9 -0
  32. package/dist/git-OGUSYBJS.js +16 -0
  33. package/dist/git-OGUSYBJS.js.map +1 -0
  34. package/dist/git-OUAHIOY2.js +110 -0
  35. package/dist/git-OUAHIOY2.js.map +1 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/{paths-INOKEM66.js → paths-MPOZBOKE.js} +2 -2
  38. package/dist/paths-MPOZBOKE.js.map +1 -0
  39. package/dist/project-OFU2W6MH.js +19 -0
  40. package/dist/project-OFU2W6MH.js.map +1 -0
  41. package/dist/shell-NZABRJLA.js +16 -0
  42. package/dist/shell-NZABRJLA.js.map +1 -0
  43. package/dist/skill-installer-F67OAOQN.js +121 -0
  44. package/dist/skill-installer-F67OAOQN.js.map +1 -0
  45. package/dist/{skill-usage-detector-EO26MRYV.js → skill-usage-detector-MSW5VWQZ.js} +2 -2
  46. package/dist/skill-usage-detector-MSW5VWQZ.js.map +1 -0
  47. package/dist/tray-WKFGUUTO.js +346 -0
  48. package/dist/tray-WKFGUUTO.js.map +1 -0
  49. package/package.json +62 -63
  50. package/scripts/postinstall.mjs +415 -364
  51. package/scripts/tray-helper-darwin +0 -0
  52. package/scripts/tray-helper-darwin.swift +180 -180
  53. package/scripts/tray-helper-linux.py +322 -0
  54. package/scripts/tray-helper-windows.cs +322 -0
  55. package/dist/api-client-KUQW7FSC.js +0 -12
  56. package/dist/chunk-2CVEPT6U.js.map +0 -1
  57. package/dist/chunk-CPL3P2OF.js.map +0 -1
  58. package/dist/chunk-ODOZM4QV.js.map +0 -1
  59. package/dist/chunk-WJKZWKER.js.map +0 -1
  60. package/dist/claude-watcher-N6GN6WHJ.js.map +0 -1
  61. package/dist/database-F3BFFZKG.js +0 -9
  62. package/dist/skill-usage-detector-EO26MRYV.js.map +0 -1
  63. package/dist/tray-UCAI2U2C.js +0 -408
  64. package/dist/tray-UCAI2U2C.js.map +0 -1
  65. /package/dist/{api-client-KUQW7FSC.js.map → api-client-BF6GDR7Q.js.map} +0 -0
  66. /package/dist/{config-P5EM5L7N.js.map → config-ZOKAP2LJ.js.map} +0 -0
  67. /package/dist/{database-F3BFFZKG.js.map → daemon-6DTCMOJB.js.map} +0 -0
  68. /package/dist/{paths-INOKEM66.js.map → database-KQY5OSCS.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/shell.ts"],"sourcesContent":["/**\r\n * Shell command - Start a tracked terminal session.\r\n */\r\n\r\nimport { existsSync, writeFileSync, readFileSync, appendFileSync } from \"fs\";\r\nimport { spawn } from \"child_process\";\r\nimport { homedir } from \"os\";\r\nimport { join } from \"path\";\r\nimport { Command } from \"commander\";\r\nimport { SkilloDatabase } from \"../core/database.js\";\r\nimport { loadConfig } from \"../core/config.js\";\r\nimport { getDbPath, getConfigFile, ensureDirectory, getDataDir } from \"../utils/paths.js\";\r\nimport logger from \"../utils/logger.js\";\r\n\r\nconst UNSYNCED_REMINDER_THRESHOLD = 50;\r\n\r\n/**\r\n * Check if the user is logged in via API client.\r\n * Shared across setup-shell and record commands for consistent detection.\r\n */\r\nasync function checkLoginStatus(): Promise<boolean> {\r\n try {\r\n const { getApiClient } = await import(\"../core/api-client.js\");\r\n const client = getApiClient();\r\n return client.hasApiKey();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Track unsynced command count using a simple counter file.\r\n * Note: read-increment-write is non-atomic but acceptable for sequential CLI usage.\r\n */\r\nfunction getUnsyncedCounterPath(): string {\r\n return join(getDataDir(), \"unsynced-count\");\r\n}\r\n\r\nfunction incrementUnsyncedCounter(): number {\r\n const counterPath = getUnsyncedCounterPath();\r\n let count = 0;\r\n try {\r\n if (existsSync(counterPath)) {\r\n const parsed = parseInt(readFileSync(counterPath, \"utf-8\").trim(), 10);\r\n count = Number.isFinite(parsed) && parsed >= 0 ? parsed : 0;\r\n }\r\n } catch {\r\n // Ignore read errors\r\n }\r\n count++;\r\n try {\r\n writeFileSync(counterPath, String(count), \"utf-8\");\r\n } catch {\r\n // Ignore write errors\r\n }\r\n return count;\r\n}\r\n\r\nfunction resetUnsyncedCounter(): void {\r\n try {\r\n writeFileSync(getUnsyncedCounterPath(), \"0\", \"utf-8\");\r\n } catch {\r\n // Ignore errors\r\n }\r\n}\r\n\r\n/**\r\n * Normalize a command by replacing variable parts with placeholders.\r\n * This helps with pattern detection.\r\n */\r\nfunction normalizeCommand(cmd: string): { normalized: string; variables: Record<string, string> } {\r\n const variables: Record<string, string> = {};\r\n let normalized = cmd;\r\n let varIndex = 0;\r\n\r\n // Replace file paths\r\n normalized = normalized.replace(/(?:^|\\s)(\\/[\\w\\-.\\/]+)/g, (match, path) => {\r\n const key = `$PATH${varIndex++}`;\r\n variables[key] = path;\r\n return match.replace(path, key);\r\n });\r\n\r\n // Replace URLs\r\n normalized = normalized.replace(\r\n /https?:\\/\\/[^\\s]+/g,\r\n (match) => {\r\n const key = `$URL${varIndex++}`;\r\n variables[key] = match;\r\n return key;\r\n }\r\n );\r\n\r\n // Replace numbers (but not in common commands)\r\n normalized = normalized.replace(/\\b\\d{4,}\\b/g, (match) => {\r\n const key = `$NUM${varIndex++}`;\r\n variables[key] = match;\r\n return key;\r\n });\r\n\r\n // Replace quoted strings\r\n normalized = normalized.replace(/\"[^\"]+\"/g, (match) => {\r\n const key = `$STR${varIndex++}`;\r\n variables[key] = match;\r\n return key;\r\n });\r\n\r\n normalized = normalized.replace(/'[^']+'/g, (match) => {\r\n const key = `$STR${varIndex++}`;\r\n variables[key] = match;\r\n return key;\r\n });\r\n\r\n return { normalized: normalized.trim(), variables };\r\n}\r\n\r\nexport const shellCommand = new Command(\"shell\")\r\n .description(\"Start a tracked terminal session\")\r\n .option(\"-s, --shell <shell>\", \"Shell to use (default: $SHELL or cmd on Windows)\")\r\n .option(\"-p, --project <path>\", \"Project path to track\")\r\n .action(async (options: { shell?: string; project?: string }) => {\r\n // Check if initialized\r\n if (!existsSync(getConfigFile())) {\r\n logger.error(\"Skillo not initialized. Run 'skillo init' first.\");\r\n process.exit(1);\r\n }\r\n\r\n const config = loadConfig();\r\n\r\n // Determine shell to use\r\n let shell = options.shell || config.defaultShell;\r\n if (!shell) {\r\n if (process.platform === \"win32\") {\r\n shell = process.env.COMSPEC || \"cmd.exe\";\r\n } else {\r\n shell = process.env.SHELL || \"/bin/bash\";\r\n }\r\n }\r\n\r\n const projectPath = options.project || process.cwd();\r\n\r\n logger.blank();\r\n logger.info(\"Starting tracked shell session...\");\r\n logger.dim(`Shell: ${shell}`);\r\n logger.dim(`Project: ${projectPath}`);\r\n logger.blank();\r\n logger.dim(\"All commands will be tracked. Type 'exit' to end the session.\");\r\n logger.blank();\r\n\r\n // Initialize database and create session\r\n const db = new SkilloDatabase();\r\n await db.initialize();\r\n const sessionId = await db.createSession(shell, projectPath);\r\n\r\n let commandCount = 0;\r\n let currentCommand = \"\";\r\n let commandStartTime: number | null = null;\r\n\r\n // Spawn shell process\r\n const shellArgs = process.platform === \"win32\" ? [] : [\"-i\"];\r\n\r\n const child = spawn(shell, shellArgs, {\r\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\r\n shell: false,\r\n cwd: projectPath,\r\n env: {\r\n ...process.env,\r\n SKILLO_SESSION: sessionId,\r\n SKILLO_TRACKING: \"1\",\r\n },\r\n });\r\n\r\n // Handle shell exit\r\n child.on(\"exit\", async (code) => {\r\n await db.endSession(sessionId);\r\n db.close();\r\n\r\n logger.blank();\r\n logger.success(`Session ended. Tracked ${commandCount} command(s).`);\r\n logger.dim(`Session ID: ${sessionId.slice(0, 8)}`);\r\n logger.blank();\r\n\r\n process.exit(code || 0);\r\n });\r\n\r\n // Handle errors\r\n child.on(\"error\", async (error) => {\r\n logger.error(`Failed to start shell: ${error.message}`);\r\n await db.endSession(sessionId);\r\n db.close();\r\n process.exit(1);\r\n });\r\n\r\n // Note: For proper command tracking, we would need to use node-pty\r\n // or integrate with shell hooks (like bash PROMPT_COMMAND or zsh precmd)\r\n // This basic implementation spawns an interactive shell but doesn't\r\n // capture individual commands without additional shell integration.\r\n\r\n // For now, we'll rely on shell integration scripts that users can install\r\n // to send commands to Skillo via a local API or file-based IPC.\r\n });\r\n\r\n// Additional command to record a command (called by shell integration)\r\nexport const recordCommand = new Command(\"record\")\r\n .description(\"Record a command (used by shell integration)\")\r\n .argument(\"<command>\", \"Command that was executed\")\r\n .option(\"--session <id>\", \"Session ID\")\r\n .option(\"--cwd <path>\", \"Working directory\")\r\n .option(\"--exit-code <code>\", \"Exit code\")\r\n .option(\"--duration <ms>\", \"Duration in milliseconds\")\r\n .option(\"--no-sync\", \"Don't sync to platform\")\r\n .action(\r\n async (\r\n command: string,\r\n options: {\r\n session?: string;\r\n cwd?: string;\r\n exitCode?: string;\r\n duration?: string;\r\n sync?: boolean;\r\n }\r\n ) => {\r\n const cwd = options.cwd || process.cwd();\r\n const exitCode = options.exitCode ? parseInt(options.exitCode, 10) : null;\r\n const durationMs = options.duration ? parseInt(options.duration, 10) : null;\r\n const sessionId = options.session || process.env.SKILLO_SESSION || \"default\";\r\n\r\n const { normalized, variables } = normalizeCommand(command);\r\n\r\n // Store locally\r\n const db = new SkilloDatabase();\r\n await db.initialize();\r\n await db.addCommand({\r\n command,\r\n normalized,\r\n cwd,\r\n sessionId,\r\n exitCode,\r\n durationMs,\r\n variables: Object.keys(variables).length > 0 ? variables : null,\r\n });\r\n db.close();\r\n\r\n // Sync to platform if logged in (unless --no-sync)\r\n if (options.sync !== false) {\r\n try {\r\n const isLoggedIn = await checkLoginStatus();\r\n\r\n if (isLoggedIn) {\r\n const { getApiClient } = await import(\"../core/api-client.js\");\r\n const client = getApiClient();\r\n await client.syncCommands([{\r\n timestamp: new Date().toISOString(),\r\n command,\r\n normalized,\r\n cwd,\r\n exitCode,\r\n durationMs,\r\n sessionId: sessionId !== \"default\" ? sessionId : undefined,\r\n variables: Object.keys(variables).length > 0 ? variables : null,\r\n }]);\r\n resetUnsyncedCounter();\r\n } else {\r\n const count = incrementUnsyncedCounter();\r\n if (count === UNSYNCED_REMINDER_THRESHOLD) {\r\n // Use stderr so the message is visible even when shell hooks redirect stdout\r\n process.stderr.write(\r\n `\\x1b[33m[!] You have ${UNSYNCED_REMINDER_THRESHOLD}+ commands tracked locally but not synced. Run 'skillo login' to enable cloud sync.\\x1b[0m\\n`\r\n );\r\n }\r\n }\r\n } catch {\r\n // Silently ignore sync errors\r\n }\r\n }\r\n\r\n // Silent success - this is called by shell integration\r\n }\r\n );\r\n\r\n// Shell integration setup command\r\nexport const setupShellCommand = new Command(\"setup-shell\")\r\n .description(\"Set up shell integration for automatic command tracking\")\r\n .option(\"--bash\", \"Set up Bash integration\")\r\n .option(\"--zsh\", \"Set up Zsh integration\")\r\n .option(\"--powershell\", \"Set up PowerShell integration\")\r\n .option(\"--fish\", \"Set up Fish integration\")\r\n .option(\"--uninstall\", \"Remove shell integration\")\r\n .action(async (options: {\r\n bash?: boolean;\r\n zsh?: boolean;\r\n powershell?: boolean;\r\n fish?: boolean;\r\n uninstall?: boolean;\r\n }) => {\r\n logger.blank();\r\n\r\n const home = homedir();\r\n const dataDir = getDataDir();\r\n ensureDirectory(dataDir);\r\n\r\n // Auto-detect shell if none specified\r\n let shell: string | null = null;\r\n if (options.bash) shell = \"bash\";\r\n else if (options.zsh) shell = \"zsh\";\r\n else if (options.powershell) shell = \"powershell\";\r\n else if (options.fish) shell = \"fish\";\r\n else {\r\n // Auto-detect\r\n if (process.platform === \"win32\") {\r\n // Git Bash / MSYS / MinGW detection\r\n if (\r\n process.env.MSYSTEM ||\r\n process.env.SHELL?.includes(\"bash\") ||\r\n process.env.TERM === \"mintty\"\r\n ) {\r\n shell = \"bash\";\r\n } else {\r\n shell = \"powershell\";\r\n }\r\n } else {\r\n const currentShell = process.env.SHELL || \"\";\r\n if (currentShell.includes(\"zsh\")) shell = \"zsh\";\r\n else if (currentShell.includes(\"fish\")) shell = \"fish\";\r\n else shell = \"bash\";\r\n }\r\n logger.info(`Detected shell: ${shell}`);\r\n }\r\n\r\n if (options.uninstall) {\r\n logger.info(`Removing ${shell} integration...`);\r\n await uninstallShellIntegration(shell, home);\r\n logger.success(\"Shell integration removed.\");\r\n logger.dim(\"Restart your terminal for changes to take effect.\");\r\n logger.blank();\r\n return;\r\n }\r\n\r\n const isLoggedIn = await checkLoginStatus();\r\n\r\n logger.info(`Setting up ${shell} integration...`);\r\n logger.blank();\r\n\r\n await installShellIntegration(shell, home, dataDir);\r\n\r\n logger.blank();\r\n logger.success(\"Shell integration installed!\");\r\n logger.blank();\r\n\r\n if (!isLoggedIn) {\r\n logger.warn(\"You're not logged in. Commands will be tracked locally only.\");\r\n logger.dim(\"Run 'skillo login' to enable cloud sync.\");\r\n logger.blank();\r\n }\r\n\r\n logger.dim(\"Restart your terminal or run:\");\r\n if (shell === \"powershell\") {\r\n logger.highlight(\" . $PROFILE\");\r\n } else if (shell === \"bash\") {\r\n logger.highlight(\" source ~/.bashrc\");\r\n } else if (shell === \"zsh\") {\r\n logger.highlight(\" source ~/.zshrc\");\r\n } else if (shell === \"fish\") {\r\n logger.highlight(\" source ~/.config/fish/config.fish\");\r\n }\r\n logger.blank();\r\n if (isLoggedIn) {\r\n logger.dim(\"All commands you run will now be tracked and synced to Skillo.\");\r\n } else {\r\n logger.dim(\"All commands will be tracked locally. Login to sync to Skillo.\");\r\n }\r\n logger.blank();\r\n });\r\n\r\n/**\r\n * Generate POSIX-compatible shell lines to check login status and show sync message.\r\n * Used by bash and zsh integration scripts. Fish and PowerShell have their own syntax.\r\n */\r\nfunction generatePosixSyncStatusLines(): string[] {\r\n return [\r\n \"# Show sync status on startup (respects SKILLO_CONFIG_DIR and XDG_CONFIG_HOME)\",\r\n 'if [ -n \"$SKILLO_CONFIG_DIR\" ]; then',\r\n ' _skillo_config=\"$SKILLO_CONFIG_DIR/config.yaml\"',\r\n 'elif [ -n \"$XDG_CONFIG_HOME\" ]; then',\r\n ' _skillo_config=\"$XDG_CONFIG_HOME/skillo/config.yaml\"',\r\n \"else\",\r\n ' _skillo_config=\"$HOME/.config/skillo/config.yaml\"',\r\n \"fi\",\r\n 'if [ -f \"$_skillo_config\" ] && grep -q \"api_key:\" \"$_skillo_config\" 2>/dev/null; then',\r\n ' echo -e \"\\\\033[90mSkillo: Command tracking enabled (syncing to platform)\\\\033[0m\"',\r\n \"else\",\r\n ' echo -e \"\\\\033[33mSkillo: Command tracking enabled (local only — run \\'skillo login\\' to sync)\\\\033[0m\"',\r\n \"fi\",\r\n ];\r\n}\r\n\r\nasync function installShellIntegration(shell: string, home: string, dataDir: string) {\r\n const scriptPath = join(dataDir, \"shell-integration\");\r\n ensureDirectory(scriptPath);\r\n\r\n if (shell === \"powershell\") {\r\n // PowerShell integration\r\n // Works in two modes:\r\n // 1. Platform mode: Uses SKILLO_SESSION and SKILLO_USER_ID env vars (set by platform launch)\r\n // 2. Standalone mode: Uses skillo CLI which handles auth via API key\r\n const psScript = `# Skillo CLI Integration\r\n# Records commands to Skillo platform\r\n# Works in two modes:\r\n# 1. Platform mode: Uses SKILLO_SESSION and SKILLO_USER_ID env vars (set by platform launch)\r\n# 2. Standalone mode: Uses skillo CLI which handles auth via API key\r\n\r\n$Global:SkilloLastHistoryId = 0\r\n$Global:SkilloStandaloneSessionId = $null\r\n$Global:SkilloSessionStartTime = $null\r\n\r\n# Check if launched from platform (has session/user env vars) or standalone\r\n$Global:SkilloPlatformMode = $false\r\nif ($env:SKILLO_SESSION -and $env:SKILLO_USER_ID) {\r\n $Global:SkilloPlatformMode = $true\r\n $Global:SkilloSessionId = $env:SKILLO_SESSION\r\n $Global:SkilloUserId = $env:SKILLO_USER_ID\r\n $Global:SkilloBaseUrl = if ($env:SKILLO_API_URL) { $env:SKILLO_API_URL } else { 'http://localhost:3000' }\r\n}\r\n\r\nfunction Send-SkilloCommandPlatform {\r\n param($Command, $Duration, $ExitCode, $Cwd)\r\n\r\n try {\r\n $body = @{\r\n type = 'commands'\r\n data = @(@{\r\n timestamp = (Get-Date).ToString('o')\r\n command = $Command\r\n normalized = $Command\r\n cwd = $Cwd\r\n exitCode = $ExitCode\r\n durationMs = $Duration\r\n sessionId = $Global:SkilloSessionId\r\n })\r\n } | ConvertTo-Json -Depth 3 -Compress\r\n\r\n $uri = \"$($Global:SkilloBaseUrl)/api/cli/sync\"\r\n\r\n $webRequest = [System.Net.HttpWebRequest]::Create($uri)\r\n $webRequest.Method = 'POST'\r\n $webRequest.ContentType = 'application/json'\r\n $webRequest.Headers.Add('x-skillo-session', $Global:SkilloSessionId)\r\n $webRequest.Headers.Add('x-skillo-user-id', $Global:SkilloUserId)\r\n $webRequest.Timeout = 5000\r\n\r\n $bytes = [System.Text.Encoding]::UTF8.GetBytes($body)\r\n $webRequest.ContentLength = $bytes.Length\r\n $stream = $webRequest.GetRequestStream()\r\n $stream.Write($bytes, 0, $bytes.Length)\r\n $stream.Close()\r\n\r\n $response = $webRequest.GetResponse()\r\n $response.Close()\r\n } catch {\r\n # Silently ignore errors\r\n }\r\n}\r\n\r\nfunction Send-SkilloCommandCLI {\r\n param($Command, $Duration, $ExitCode, $Cwd)\r\n\r\n # Create session on first command if not exists\r\n if (-not $Global:SkilloStandaloneSessionId) {\r\n $Global:SkilloSessionStartTime = (Get-Date).ToString('o')\r\n try {\r\n $result = & skillo session start --shell \"PowerShell\" 2>$null\r\n if ($result -match 'Session ID: ([a-f0-9-]+)') {\r\n $Global:SkilloStandaloneSessionId = $Matches[1]\r\n # Write PID file for session cleanup\r\n $_pidDir = Join-Path (Join-Path $env:USERPROFILE '.skillo') 'active-sessions'\r\n if (-not (Test-Path $_pidDir)) { New-Item -ItemType Directory -Path $_pidDir -Force | Out-Null }\r\n $_json = '{\"sessionId\":\"' + $Global:SkilloStandaloneSessionId + '\",\"pid\":' + $PID + '}'\r\n [IO.File]::WriteAllText((Join-Path $_pidDir \"$PID.json\"), $_json)\r\n }\r\n } catch {\r\n # If session command doesn't exist, generate a local ID\r\n $Global:SkilloStandaloneSessionId = [guid]::NewGuid().ToString()\r\n }\r\n }\r\n\r\n # Run skillo record in background with session ID\r\n Start-Job -ScriptBlock {\r\n param($cmd, $cwd, $exit, $dur, $sessionId)\r\n & skillo record $cmd --cwd $cwd --exit-code $exit --duration $dur --session $sessionId 2>$null\r\n } -ArgumentList $Command, $Cwd, $ExitCode, $Duration, $Global:SkilloStandaloneSessionId | Out-Null\r\n}\r\n\r\n# Override prompt to capture commands after execution\r\n$Global:SkilloOriginalPrompt = $function:prompt\r\nfunction Global:prompt {\r\n $lastCmd = Get-History -Count 1 -ErrorAction SilentlyContinue\r\n\r\n if ($lastCmd -and $lastCmd.Id -gt $Global:SkilloLastHistoryId) {\r\n $Global:SkilloLastHistoryId = $lastCmd.Id\r\n\r\n $duration = 0\r\n if ($lastCmd.EndExecutionTime -and $lastCmd.StartExecutionTime) {\r\n $duration = [int]($lastCmd.EndExecutionTime - $lastCmd.StartExecutionTime).TotalMilliseconds\r\n }\r\n $exit = if ($null -eq $LASTEXITCODE) { 0 } else { $LASTEXITCODE }\r\n $cwd = (Get-Location).Path\r\n\r\n if ($Global:SkilloPlatformMode) {\r\n Send-SkilloCommandPlatform -Command $lastCmd.CommandLine -Duration $duration -ExitCode $exit -Cwd $cwd\r\n } else {\r\n Send-SkilloCommandCLI -Command $lastCmd.CommandLine -Duration $duration -ExitCode $exit -Cwd $cwd\r\n }\r\n }\r\n\r\n & $Global:SkilloOriginalPrompt\r\n}\r\n\r\n# Register exit handler to end session when terminal closes\r\n$null = Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {\r\n if ($Global:SkilloPlatformMode -and $Global:SkilloSessionId) {\r\n # End platform session\r\n try {\r\n $body = @{ sessionId = $Global:SkilloSessionId } | ConvertTo-Json -Compress\r\n $uri = \"$($Global:SkilloBaseUrl)/api/sessions\"\r\n\r\n $webRequest = [System.Net.HttpWebRequest]::Create($uri)\r\n $webRequest.Method = 'PATCH'\r\n $webRequest.ContentType = 'application/json'\r\n $webRequest.Headers.Add('x-skillo-session', $Global:SkilloSessionId)\r\n $webRequest.Headers.Add('x-skillo-user-id', $Global:SkilloUserId)\r\n $webRequest.Timeout = 3000\r\n\r\n $bytes = [System.Text.Encoding]::UTF8.GetBytes($body)\r\n $webRequest.ContentLength = $bytes.Length\r\n $stream = $webRequest.GetRequestStream()\r\n $stream.Write($bytes, 0, $bytes.Length)\r\n $stream.Close()\r\n\r\n $response = $webRequest.GetResponse()\r\n $response.Close()\r\n } catch {\r\n # Ignore errors on exit\r\n }\r\n } elseif ($Global:SkilloStandaloneSessionId) {\r\n # End standalone session via CLI\r\n try {\r\n & skillo session end --session $Global:SkilloStandaloneSessionId 2>$null\r\n } catch {\r\n # Ignore errors on exit\r\n }\r\n # Clean up PID file\r\n $_pidFile = Join-Path (Join-Path (Join-Path $env:USERPROFILE '.skillo') 'active-sessions') \"$PID.json\"\r\n if (Test-Path $_pidFile) { Remove-Item $_pidFile -Force -ErrorAction SilentlyContinue }\r\n }\r\n}\r\n\r\n# Show sync status on startup\r\nif ($Global:SkilloPlatformMode) {\r\n Write-Host \"Skillo: Command tracking enabled (syncing to platform)\" -ForegroundColor DarkGray\r\n} else {\r\n # Check if logged in by looking for api_key in config (respects SKILLO_CONFIG_DIR and XDG_CONFIG_HOME)\r\n if ($env:SKILLO_CONFIG_DIR) {\r\n $skilloConfigPath = Join-Path $env:SKILLO_CONFIG_DIR \"config.yaml\"\r\n } elseif ($env:XDG_CONFIG_HOME) {\r\n $skilloConfigPath = Join-Path $env:XDG_CONFIG_HOME \"skillo\" \"config.yaml\"\r\n } else {\r\n $skilloConfigPath = Join-Path $HOME \".config\" \"skillo\" \"config.yaml\"\r\n }\r\n $skilloLoggedIn = $false\r\n if (Test-Path $skilloConfigPath) {\r\n $skilloLoggedIn = (Select-String -Path $skilloConfigPath -Pattern \"api_key:\" -Quiet) -eq $true\r\n }\r\n if ($skilloLoggedIn) {\r\n Write-Host \"Skillo: Command tracking enabled (syncing to platform)\" -ForegroundColor DarkGray\r\n } else {\r\n Write-Host \"Skillo: Command tracking enabled (local only - run 'skillo login' to sync)\" -ForegroundColor Yellow\r\n }\r\n}\r\n`;\r\n\r\n const psScriptFile = join(scriptPath, \"skillo.ps1\");\r\n writeFileSync(psScriptFile, psScript, \"utf-8\");\r\n logger.success(`Created ${psScriptFile}`);\r\n\r\n // Add to PowerShell profile\r\n const profilePath = join(home, \"Documents\", \"WindowsPowerShell\", \"Microsoft.PowerShell_profile.ps1\");\r\n const profileDir = join(home, \"Documents\", \"WindowsPowerShell\");\r\n ensureDirectory(profileDir);\r\n\r\n const sourceLine = `\\n# Skillo CLI Integration\\n. \"${psScriptFile}\"\\n`;\r\n\r\n if (existsSync(profilePath)) {\r\n const content = readFileSync(profilePath, \"utf-8\");\r\n if (!content.includes(\"Skillo CLI Integration\")) {\r\n appendFileSync(profilePath, sourceLine);\r\n logger.success(\"Added to PowerShell profile\");\r\n } else {\r\n logger.dim(\"Already in PowerShell profile\");\r\n }\r\n } else {\r\n writeFileSync(profilePath, sourceLine, \"utf-8\");\r\n logger.success(\"Created PowerShell profile\");\r\n }\r\n\r\n } else if (shell === \"bash\") {\r\n // Bash integration - command recording + CWD-based session auto-detection\r\n const bashScript = [\r\n \"# Skillo CLI Integration\",\r\n \"# Records commands and auto-detects tracked projects\",\r\n \"\",\r\n '_skillo_session=\"$' + '{SKILLO_SESSION:-default}\"',\r\n \"_skillo_last_cwd=\",\r\n \"\",\r\n \"_skillo_preexec() {\",\r\n ' _skillo_cmd=\"$1\"',\r\n \" _skillo_start_time=$(date +%s)\",\r\n \"}\",\r\n \"\",\r\n \"_skillo_check_project() {\",\r\n ' # Fast path: skip if CWD unchanged',\r\n ' if [ \"$PWD\" = \"$_skillo_last_cwd\" ]; then',\r\n \" return\",\r\n \" fi\",\r\n ' _skillo_last_cwd=\"$PWD\"',\r\n \"\",\r\n ' # Run session-auto (handles create/end via cache file)',\r\n ' local result _pid',\r\n ' _pid=$(cat /proc/$$/winpid 2>/dev/null || echo $$)',\r\n ' result=$(skillo session-auto \"$PWD\" --pid $_pid --shell bash 2>/dev/null)',\r\n ' if [ -n \"$result\" ]; then',\r\n ' export SKILLO_SESSION=\"$result\"',\r\n ' _skillo_session=\"$result\"',\r\n \" fi\",\r\n \"}\",\r\n \"\",\r\n \"_skillo_precmd() {\",\r\n \" local exit_code=$?\",\r\n \"\",\r\n \" # Check for project change\",\r\n \" _skillo_check_project\",\r\n \"\",\r\n ' if [ -n \"$_skillo_cmd\" ]; then',\r\n \" local duration=0\",\r\n ' if [ -n \"$_skillo_start_time\" ]; then',\r\n \" local end_time=$(date +%s)\",\r\n \" duration=$(( (end_time - _skillo_start_time) * 1000 ))\",\r\n \" fi\",\r\n ' (skillo record \"$_skillo_cmd\" --cwd \"$PWD\" --exit-code \"$exit_code\" --duration \"$duration\" --session \"$_skillo_session\" >/dev/null &)',\r\n ' _skillo_cmd=\"\"',\r\n \" fi\",\r\n \"}\",\r\n \"\",\r\n \"# Clean up session on terminal exit\",\r\n '_skillo_cleanup() {',\r\n ' if [ -n \"$SKILLO_SESSION\" ] && [ \"$SKILLO_SESSION\" != \"default\" ]; then',\r\n ' skillo session end --session \"$SKILLO_SESSION\" >/dev/null 2>&1',\r\n \" fi\",\r\n \"}\",\r\n \"trap _skillo_cleanup EXIT\",\r\n \"\",\r\n \"# Use DEBUG trap for preexec\",\r\n \"trap '_skillo_preexec \\\"$BASH_COMMAND\\\"' DEBUG\",\r\n \"\",\r\n \"# Add precmd to PROMPT_COMMAND\",\r\n 'if [[ ! \"$PROMPT_COMMAND\" =~ _skillo_precmd ]]; then',\r\n ' PROMPT_COMMAND=\"_skillo_precmd$' + '{PROMPT_COMMAND:+;$PROMPT_COMMAND}\"',\r\n \"fi\",\r\n \"\",\r\n \"# Initial project check\",\r\n \"_skillo_check_project\",\r\n \"\",\r\n ...generatePosixSyncStatusLines(),\r\n ].join(\"\\n\");\r\n\r\n const bashScriptFile = join(scriptPath, \"skillo.bash\");\r\n writeFileSync(bashScriptFile, bashScript, \"utf-8\");\r\n logger.success(`Created ${bashScriptFile}`);\r\n\r\n // Add to .bashrc\r\n const bashrcPath = join(home, \".bashrc\");\r\n const sourceLine = `\\n# Skillo CLI Integration\\n[ -f \"${bashScriptFile}\" ] && source \"${bashScriptFile}\"\\n`;\r\n\r\n if (existsSync(bashrcPath)) {\r\n const content = readFileSync(bashrcPath, \"utf-8\");\r\n if (!content.includes(\"Skillo CLI Integration\")) {\r\n appendFileSync(bashrcPath, sourceLine);\r\n logger.success(\"Added to ~/.bashrc\");\r\n } else {\r\n logger.dim(\"Already in ~/.bashrc\");\r\n }\r\n } else {\r\n writeFileSync(bashrcPath, sourceLine, \"utf-8\");\r\n logger.success(\"Created ~/.bashrc\");\r\n }\r\n\r\n } else if (shell === \"zsh\") {\r\n // Zsh integration - command recording + CWD-based session auto-detection\r\n const zshScript = [\r\n \"# Skillo CLI Integration\",\r\n \"# Records commands and auto-detects tracked projects\",\r\n \"\",\r\n '_skillo_session=\"$' + '{SKILLO_SESSION:-default}\"',\r\n \"_skillo_last_cwd=\",\r\n \"\",\r\n \"_skillo_preexec() {\",\r\n ' _skillo_cmd=\"$1\"',\r\n \" _skillo_start_time=$(date +%s)\",\r\n \"}\",\r\n \"\",\r\n \"_skillo_check_project() {\",\r\n ' # Fast path: skip if CWD unchanged',\r\n ' if [[ \"$PWD\" == \"$_skillo_last_cwd\" ]]; then',\r\n \" return\",\r\n \" fi\",\r\n ' _skillo_last_cwd=\"$PWD\"',\r\n \"\",\r\n ' # Run session-auto (handles create/end via cache file)',\r\n ' local result _pid',\r\n ' _pid=$(cat /proc/$$/winpid 2>/dev/null || echo $$)',\r\n ' result=$(skillo session-auto \"$PWD\" --pid $_pid --shell zsh 2>/dev/null)',\r\n ' if [[ -n \"$result\" ]]; then',\r\n ' export SKILLO_SESSION=\"$result\"',\r\n ' _skillo_session=\"$result\"',\r\n \" fi\",\r\n \"}\",\r\n \"\",\r\n \"_skillo_precmd() {\",\r\n \" local exit_code=$?\",\r\n \"\",\r\n \" # Check for project change\",\r\n \" _skillo_check_project\",\r\n \"\",\r\n ' if [[ -n \"$_skillo_cmd\" ]]; then',\r\n \" local duration=0\",\r\n ' if [[ -n \"$_skillo_start_time\" ]]; then',\r\n \" local end_time=$(date +%s)\",\r\n \" duration=$(( (end_time - _skillo_start_time) * 1000 ))\",\r\n \" fi\",\r\n ' (skillo record \"$_skillo_cmd\" --cwd \"$PWD\" --exit-code \"$exit_code\" --duration \"$duration\" --session \"$_skillo_session\" >/dev/null &)',\r\n ' _skillo_cmd=\"\"',\r\n \" fi\",\r\n \"}\",\r\n \"\",\r\n \"# Clean up session on terminal exit\",\r\n '_skillo_cleanup() {',\r\n ' if [[ -n \"$SKILLO_SESSION\" ]] && [[ \"$SKILLO_SESSION\" != \"default\" ]]; then',\r\n ' skillo session end --session \"$SKILLO_SESSION\" >/dev/null 2>&1',\r\n \" fi\",\r\n \"}\",\r\n \"trap _skillo_cleanup EXIT\",\r\n \"\",\r\n \"autoload -Uz add-zsh-hook\",\r\n \"add-zsh-hook preexec _skillo_preexec\",\r\n \"add-zsh-hook precmd _skillo_precmd\",\r\n \"\",\r\n \"# Initial project check\",\r\n \"_skillo_check_project\",\r\n \"\",\r\n ...generatePosixSyncStatusLines(),\r\n ].join(\"\\n\");\r\n\r\n const zshScriptFile = join(scriptPath, \"skillo.zsh\");\r\n writeFileSync(zshScriptFile, zshScript, \"utf-8\");\r\n logger.success(`Created ${zshScriptFile}`);\r\n\r\n // Add to .zshrc\r\n const zshrcPath = join(home, \".zshrc\");\r\n const sourceLine = `\\n# Skillo CLI Integration\\n[ -f \"${zshScriptFile}\" ] && source \"${zshScriptFile}\"\\n`;\r\n\r\n if (existsSync(zshrcPath)) {\r\n const content = readFileSync(zshrcPath, \"utf-8\");\r\n if (!content.includes(\"Skillo CLI Integration\")) {\r\n appendFileSync(zshrcPath, sourceLine);\r\n logger.success(\"Added to ~/.zshrc\");\r\n } else {\r\n logger.dim(\"Already in ~/.zshrc\");\r\n }\r\n } else {\r\n writeFileSync(zshrcPath, sourceLine, \"utf-8\");\r\n logger.success(\"Created ~/.zshrc\");\r\n }\r\n\r\n } else if (shell === \"fish\") {\r\n // Fish integration\r\n const fishScript = [\r\n \"# Skillo CLI Integration\",\r\n \"# Records commands to Skillo platform\",\r\n \"\",\r\n 'set -q SKILLO_SESSION; or set -g SKILLO_SESSION \"default\"',\r\n \"\",\r\n \"function _skillo_postexec --on-event fish_postexec\",\r\n \" set -l cmd $argv[1]\",\r\n \" set -l exit_code $status\",\r\n ' skillo record \"$cmd\" --cwd (pwd) --exit-code $exit_code --session $SKILLO_SESSION >/dev/null &',\r\n \"end\",\r\n \"\",\r\n \"# Show sync status on startup (respects SKILLO_CONFIG_DIR and XDG_CONFIG_HOME)\",\r\n 'if set -q SKILLO_CONFIG_DIR',\r\n ' set _skillo_config \"$SKILLO_CONFIG_DIR/config.yaml\"',\r\n 'else if set -q XDG_CONFIG_HOME',\r\n ' set _skillo_config \"$XDG_CONFIG_HOME/skillo/config.yaml\"',\r\n \"else\",\r\n ' set _skillo_config \"$HOME/.config/skillo/config.yaml\"',\r\n \"end\",\r\n 'if test -f \"$_skillo_config\"; and grep -q \"api_key:\" \"$_skillo_config\" 2>/dev/null',\r\n ' echo -e \"\\\\033[90mSkillo: Command tracking enabled (syncing to platform)\\\\033[0m\"',\r\n \"else\",\r\n ' echo -e \"\\\\033[33mSkillo: Command tracking enabled (local only — run \\'skillo login\\' to sync)\\\\033[0m\"',\r\n \"end\",\r\n ].join(\"\\n\");\r\n\r\n const fishScriptFile = join(scriptPath, \"skillo.fish\");\r\n writeFileSync(fishScriptFile, fishScript, \"utf-8\");\r\n logger.success(`Created ${fishScriptFile}`);\r\n\r\n // Add to fish config\r\n const fishConfigDir = join(home, \".config\", \"fish\");\r\n ensureDirectory(fishConfigDir);\r\n const fishConfigPath = join(fishConfigDir, \"config.fish\");\r\n const sourceLine = `\\n# Skillo CLI Integration\\nif test -f \"${fishScriptFile}\"\\n source \"${fishScriptFile}\"\\nend\\n`;\r\n\r\n if (existsSync(fishConfigPath)) {\r\n const content = readFileSync(fishConfigPath, \"utf-8\");\r\n if (!content.includes(\"Skillo CLI Integration\")) {\r\n appendFileSync(fishConfigPath, sourceLine);\r\n logger.success(\"Added to ~/.config/fish/config.fish\");\r\n } else {\r\n logger.dim(\"Already in fish config\");\r\n }\r\n } else {\r\n writeFileSync(fishConfigPath, sourceLine, \"utf-8\");\r\n logger.success(\"Created fish config\");\r\n }\r\n }\r\n}\r\n\r\nasync function uninstallShellIntegration(shell: string, home: string) {\r\n const removeFromFile = (filePath: string) => {\r\n if (!existsSync(filePath)) return;\r\n let content = readFileSync(filePath, \"utf-8\");\r\n // Remove the Skillo integration section\r\n content = content.replace(/\\n# Skillo CLI Integration\\n[^\\n]*\\n/g, \"\\n\");\r\n writeFileSync(filePath, content, \"utf-8\");\r\n };\r\n\r\n if (shell === \"powershell\") {\r\n const profilePath = join(home, \"Documents\", \"WindowsPowerShell\", \"Microsoft.PowerShell_profile.ps1\");\r\n removeFromFile(profilePath);\r\n } else if (shell === \"bash\") {\r\n removeFromFile(join(home, \".bashrc\"));\r\n } else if (shell === \"zsh\") {\r\n removeFromFile(join(home, \".zshrc\"));\r\n } else if (shell === \"fish\") {\r\n removeFromFile(join(home, \".config\", \"fish\", \"config.fish\"));\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/utils/logger.ts
4
+ import chalk from "chalk";
5
+ var logger = {
6
+ info: (message) => {
7
+ console.log(chalk.cyan(message));
8
+ },
9
+ success: (message) => {
10
+ console.log(chalk.green(`[+] ${message}`));
11
+ },
12
+ warn: (message) => {
13
+ console.log(chalk.yellow(`[!] ${message}`));
14
+ },
15
+ error: (message) => {
16
+ console.log(chalk.red(`[x] ${message}`));
17
+ },
18
+ dim: (message) => {
19
+ console.log(chalk.dim(message));
20
+ },
21
+ bold: (message) => {
22
+ console.log(chalk.bold(message));
23
+ },
24
+ highlight: (message) => {
25
+ console.log(chalk.bold.cyan(message));
26
+ },
27
+ // Status indicators
28
+ running: (message) => {
29
+ console.log(chalk.green(`(*) ${message}`));
30
+ },
31
+ stopped: (message) => {
32
+ console.log(chalk.dim(`(-) ${message}`));
33
+ },
34
+ // For lists and tables
35
+ item: (label, value) => {
36
+ console.log(` ${chalk.dim(label)}: ${chalk.white(value)}`);
37
+ },
38
+ // Blank line
39
+ blank: () => {
40
+ console.log();
41
+ },
42
+ // Box/panel output
43
+ box: (title, content) => {
44
+ const lines = content.split("\n");
45
+ const maxLen = Math.max(title.length, ...lines.map((l) => l.length));
46
+ const border = "\u2500".repeat(maxLen + 2);
47
+ console.log(chalk.dim(`\u250C${border}\u2510`));
48
+ console.log(chalk.dim("\u2502 ") + chalk.bold(title.padEnd(maxLen)) + chalk.dim(" \u2502"));
49
+ console.log(chalk.dim(`\u251C${border}\u2524`));
50
+ lines.forEach((line) => {
51
+ console.log(chalk.dim("\u2502 ") + line.padEnd(maxLen) + chalk.dim(" \u2502"));
52
+ });
53
+ console.log(chalk.dim(`\u2514${border}\u2518`));
54
+ },
55
+ // Table output
56
+ table: (rows) => {
57
+ const maxLabel = Math.max(...rows.map(([label]) => label.length));
58
+ rows.forEach(([label, value]) => {
59
+ console.log(` ${chalk.dim(label.padEnd(maxLabel))} ${chalk.white(value)}`);
60
+ });
61
+ }
62
+ };
63
+ var logger_default = logger;
64
+
65
+ export {
66
+ logger_default
67
+ };
68
+ //# sourceMappingURL=chunk-VAQ73XPE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/logger.ts"],"sourcesContent":["/**\r\n * Logger utilities for Skillo CLI.\r\n * Uses chalk for colored output.\r\n */\r\n\r\nimport chalk from \"chalk\";\r\n\r\nexport const logger = {\r\n info: (message: string) => {\r\n console.log(chalk.cyan(message));\r\n },\r\n\r\n success: (message: string) => {\r\n console.log(chalk.green(`[+] ${message}`));\r\n },\r\n\r\n warn: (message: string) => {\r\n console.log(chalk.yellow(`[!] ${message}`));\r\n },\r\n\r\n error: (message: string) => {\r\n console.log(chalk.red(`[x] ${message}`));\r\n },\r\n\r\n dim: (message: string) => {\r\n console.log(chalk.dim(message));\r\n },\r\n\r\n bold: (message: string) => {\r\n console.log(chalk.bold(message));\r\n },\r\n\r\n highlight: (message: string) => {\r\n console.log(chalk.bold.cyan(message));\r\n },\r\n\r\n // Status indicators\r\n running: (message: string) => {\r\n console.log(chalk.green(`(*) ${message}`));\r\n },\r\n\r\n stopped: (message: string) => {\r\n console.log(chalk.dim(`(-) ${message}`));\r\n },\r\n\r\n // For lists and tables\r\n item: (label: string, value: string | number) => {\r\n console.log(` ${chalk.dim(label)}: ${chalk.white(value)}`);\r\n },\r\n\r\n // Blank line\r\n blank: () => {\r\n console.log();\r\n },\r\n\r\n // Box/panel output\r\n box: (title: string, content: string) => {\r\n const lines = content.split(\"\\n\");\r\n const maxLen = Math.max(title.length, ...lines.map((l) => l.length));\r\n const border = \"─\".repeat(maxLen + 2);\r\n\r\n console.log(chalk.dim(`┌${border}┐`));\r\n console.log(chalk.dim(\"│ \") + chalk.bold(title.padEnd(maxLen)) + chalk.dim(\" │\"));\r\n console.log(chalk.dim(`├${border}┤`));\r\n lines.forEach((line) => {\r\n console.log(chalk.dim(\"│ \") + line.padEnd(maxLen) + chalk.dim(\" │\"));\r\n });\r\n console.log(chalk.dim(`└${border}┘`));\r\n },\r\n\r\n // Table output\r\n table: (rows: Array<[string, string | number]>) => {\r\n const maxLabel = Math.max(...rows.map(([label]) => label.length));\r\n rows.forEach(([label, value]) => {\r\n console.log(` ${chalk.dim(label.padEnd(maxLabel))} ${chalk.white(value)}`);\r\n });\r\n },\r\n};\r\n\r\nexport default logger;\r\n"],"mappings":";;;AAKA,OAAO,WAAW;AAEX,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,YAAoB;AACzB,YAAQ,IAAI,MAAM,KAAK,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,SAAS,CAAC,YAAoB;AAC5B,YAAQ,IAAI,MAAM,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,CAAC,YAAoB;AACzB,YAAQ,IAAI,MAAM,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,EAC5C;AAAA,EAEA,OAAO,CAAC,YAAoB;AAC1B,YAAQ,IAAI,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,EACzC;AAAA,EAEA,KAAK,CAAC,YAAoB;AACxB,YAAQ,IAAI,MAAM,IAAI,OAAO,CAAC;AAAA,EAChC;AAAA,EAEA,MAAM,CAAC,YAAoB;AACzB,YAAQ,IAAI,MAAM,KAAK,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,WAAW,CAAC,YAAoB;AAC9B,YAAQ,IAAI,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,EACtC;AAAA;AAAA,EAGA,SAAS,CAAC,YAAoB;AAC5B,YAAQ,IAAI,MAAM,MAAM,OAAO,OAAO,EAAE,CAAC;AAAA,EAC3C;AAAA,EAEA,SAAS,CAAC,YAAoB;AAC5B,YAAQ,IAAI,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,CAAC,OAAe,UAA2B;AAC/C,YAAQ,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,MAAM,MAAM,KAAK,CAAC,EAAE;AAAA,EAC5D;AAAA;AAAA,EAGA,OAAO,MAAM;AACX,YAAQ,IAAI;AAAA,EACd;AAAA;AAAA,EAGA,KAAK,CAAC,OAAe,YAAoB;AACvC,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACnE,UAAM,SAAS,SAAI,OAAO,SAAS,CAAC;AAEpC,YAAQ,IAAI,MAAM,IAAI,SAAI,MAAM,QAAG,CAAC;AACpC,YAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC,IAAI,MAAM,IAAI,SAAI,CAAC;AAChF,YAAQ,IAAI,MAAM,IAAI,SAAI,MAAM,QAAG,CAAC;AACpC,UAAM,QAAQ,CAAC,SAAS;AACtB,cAAQ,IAAI,MAAM,IAAI,SAAI,IAAI,KAAK,OAAO,MAAM,IAAI,MAAM,IAAI,SAAI,CAAC;AAAA,IACrE,CAAC;AACD,YAAQ,IAAI,MAAM,IAAI,SAAI,MAAM,QAAG,CAAC;AAAA,EACtC;AAAA;AAAA,EAGA,OAAO,CAAC,SAA2C;AACjD,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,MAAM,CAAC;AAChE,SAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM;AAC/B,cAAQ,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,QAAQ,CAAC,CAAC,KAAK,MAAM,MAAM,KAAK,CAAC,EAAE;AAAA,IAC7E,CAAC;AAAA,EACH;AACF;AAEA,IAAO,iBAAQ;","names":[]}