ima2-gen 1.1.20 → 1.1.21
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 +15 -25
- package/bin/commands/capabilities.js +2 -2
- package/bin/commands/capabilities.ts +2 -2
- package/bin/commands/defaults.js +2 -2
- package/bin/commands/defaults.ts +2 -2
- package/bin/commands/doctor.js +3 -3
- package/bin/commands/doctor.ts +3 -3
- package/bin/commands/edit.js +1 -1
- package/bin/commands/edit.ts +1 -1
- package/bin/commands/gen.js +1 -1
- package/bin/commands/gen.ts +1 -1
- package/bin/commands/grok.js +16 -11
- package/bin/commands/grok.ts +16 -11
- package/bin/commands/multimode.js +1 -1
- package/bin/commands/multimode.ts +1 -1
- package/bin/commands/observability.js +2 -2
- package/bin/commands/observability.ts +2 -2
- package/bin/commands/video.js +335 -13
- package/bin/commands/video.ts +249 -12
- package/bin/ima2.js +9 -9
- package/bin/ima2.ts +9 -9
- package/bin/lib/error-hints.js +2 -2
- package/bin/lib/error-hints.ts +2 -2
- package/docs/API.md +112 -3
- package/docs/CLI.md +61 -7
- package/docs/FAQ.ko.md +15 -20
- package/docs/FAQ.md +14 -19
- package/docs/NPX_QUICKSTART.md +40 -0
- package/docs/PROMPT_STUDIO.ko.md +1 -1
- package/docs/PROMPT_STUDIO.md +1 -1
- package/docs/README.ja.md +6 -16
- package/docs/README.ko.md +10 -20
- package/docs/README.zh-CN.md +7 -17
- package/docs/migration/runtime-test-inventory.md +8 -1
- package/lib/agentRuntime.js +19 -5
- package/lib/agentRuntime.ts +17 -5
- package/lib/capabilities.js +1 -1
- package/lib/capabilities.ts +1 -1
- package/lib/generationErrors.js +1 -1
- package/lib/generationErrors.ts +1 -1
- package/lib/grokProxyLauncher.js +26 -3
- package/lib/grokProxyLauncher.ts +27 -3
- package/lib/grokVideoAdapter.js +18 -89
- package/lib/grokVideoAdapter.ts +27 -88
- package/lib/grokVideoCanvas.js +25 -0
- package/lib/grokVideoCanvas.ts +26 -0
- package/lib/grokVideoDownload.js +58 -0
- package/lib/grokVideoDownload.ts +59 -0
- package/lib/grokVideoPlannerPrompt.js +64 -0
- package/lib/grokVideoPlannerPrompt.ts +67 -0
- package/lib/historyList.js +7 -1
- package/lib/historyList.ts +5 -1
- package/lib/oauthLauncher.js +21 -6
- package/lib/oauthLauncher.ts +22 -6
- package/lib/videoContinuity.js +149 -0
- package/lib/videoContinuity.ts +180 -0
- package/lib/videoFrameExtract.js +80 -0
- package/lib/videoFrameExtract.ts +78 -0
- package/node_modules/progrok/dist/index.js +187 -88
- package/node_modules/progrok/dist/index.js.map +1 -1
- package/node_modules/progrok/package.json +1 -1
- package/node_modules/progrok/skills/progrok/SKILL.md +33 -4
- package/package.json +2 -2
- package/routes/index.js +4 -0
- package/routes/index.ts +4 -0
- package/routes/quota.js +66 -0
- package/routes/quota.ts +89 -0
- package/routes/video.js +77 -15
- package/routes/video.ts +82 -14
- package/routes/videoExtended.js +293 -0
- package/routes/videoExtended.ts +284 -0
- package/server.js +6 -2
- package/server.ts +5 -2
- package/skills/ima2/SKILL.md +320 -7
- package/ui/dist/.vite/manifest.json +12 -12
- package/ui/dist/assets/{AgentWorkspace-DS8uvoLI.js → AgentWorkspace-B_hq9CLg.js} +2 -2
- package/ui/dist/assets/{CardNewsWorkspace-CYxMsE67.js → CardNewsWorkspace-wD12J7qk.js} +1 -1
- package/ui/dist/assets/{NodeCanvas-DccIc347.js → NodeCanvas-CI_wuPMf.js} +1 -1
- package/ui/dist/assets/{PromptBuilderPanel-BvxxwSJp.js → PromptBuilderPanel-CUTujJUV.js} +1 -1
- package/ui/dist/assets/{PromptImportDialog-u1_BFDRd.js → PromptImportDialog-CUi66jPK.js} +2 -2
- package/ui/dist/assets/{PromptImportDiscoverySection-C5uvkVSz.js → PromptImportDiscoverySection-Cm3vrjY4.js} +1 -1
- package/ui/dist/assets/{PromptImportFolderSection-D3E_O1SD.js → PromptImportFolderSection-DOtWTD9n.js} +1 -1
- package/ui/dist/assets/{PromptLibraryPanel-4gyf9CB9.js → PromptLibraryPanel-BMjQegRa.js} +2 -2
- package/ui/dist/assets/SettingsWorkspace-PiaVnsdA.js +1 -0
- package/ui/dist/assets/{index-DoKtXbod.js → index-31uVIdt4.js} +1 -1
- package/ui/dist/assets/index-CjgnNtgt.css +1 -0
- package/ui/dist/assets/index-Da2s4_-5.js +36 -0
- package/ui/dist/index.html +2 -2
- package/vendor/progrok-0.2.0.tgz +0 -0
- package/ui/dist/assets/SettingsWorkspace-F3eNu3mJ.js +0 -1
- package/ui/dist/assets/index-B6tcw_UF.css +0 -1
- package/ui/dist/assets/index-DYOh6gQD.js +0 -32
- package/vendor/progrok-0.1.1.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/constants.ts","../src/auth/discovery.ts","../src/auth/callback-server.ts","../src/auth/token-store.ts","../src/utils/logger.ts","../src/utils/open-url.ts","../src/auth/device-code.ts","../src/commands/logout.ts","../src/commands/proxy.ts","../src/proxy/server.ts","../src/commands/chat.ts","../src/chat/server.ts","../src/commands/models.ts","../src/commands/status.ts","../src/commands/skill.ts","../src/commands/capabilities.ts","../src/commands/search.ts","../src/commands/video.ts","../src/commands/image.ts","../src/utils/config.ts","../src/utils/star-prompt.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { proxyCommand } from \"./commands/proxy.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { skillCommand } from \"./commands/skill.js\";\nimport { capabilitiesCommand } from \"./commands/capabilities.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { videoCommand } from \"./commands/video.js\";\nimport { imageCommand } from \"./commands/image.js\";\nimport { showStarPrompt } from \"./utils/star-prompt.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf8\"),\n ) as { version: string };\n return pkg.version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"progrok\")\n .description(\n `Activate your xAI OAuth session as a local Grok API proxy and CLI tool surface.\n\n SuperGrok OAuth → local proxy → OpenAI-compatible API for any client.\n All xAI endpoints forwarded: responses, chat, images, video, tts, stt.\n\n Quick start:\n $ progrok login # OAuth via browser (or --device-code for SSH)\n $ progrok proxy # Start proxy on 127.0.0.1:18645\n $ curl localhost:18645/v1/chat/completions -d '{\"model\":\"grok-4.3\",...}'\n\n Proxy forwards ALL /v1/* paths to api.x.ai — no whitelist.\n Supported xAI surfaces:\n /v1/responses Responses API (streaming, tools, reasoning)\n /v1/chat/completions OpenAI-compatible chat\n /v1/models Model list\n /v1/language-models Detailed models (pricing, aliases, modalities)\n /v1/images/generations Image generation (grok-imagine-image)\n /v1/videos/generations Video generation (async, poll /v1/videos/{id})\n /v1/tts Text-to-speech\n /v1/stt Speech-to-text\n /v1/batch/completions Batch processing\n /v1/embeddings Embeddings`,\n )\n .version(getVersion());\n\nprogram.addCommand(loginCommand());\nprogram.addCommand(logoutCommand());\nprogram.addCommand(proxyCommand());\nprogram.addCommand(chatCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(statusCommand());\nprogram.addCommand(skillCommand());\nprogram.addCommand(capabilitiesCommand());\nprogram.addCommand(searchCommand());\nprogram.addCommand(videoCommand());\nprogram.addCommand(imageCommand());\n\nconst REAL_COMMANDS = new Set([\"login\", \"logout\", \"proxy\", \"chat\", \"models\", \"status\", \"skill\", \"capabilities\", \"search\", \"video\", \"image\"]);\nconst subcommand = process.argv[2];\nif (subcommand && REAL_COMMANDS.has(subcommand)) {\n await showStarPrompt();\n}\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { loginWithPKCE } from \"../auth/pkce.js\";\nimport { loginWithDeviceCode } from \"../auth/device-code.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function loginCommand(): Command {\n const cmd = new Command(\"login\")\n .description(\n `Log in to xAI via OAuth (SuperGrok subscription required).\n Default: device-code flow — displays URL + code for manual entry.\n Browser: --browser — opens browser, callback on 127.0.0.1:56121.\n Manual: --manual-paste — PKCE flow but paste the callback code manually.\n Tokens saved to ~/.progrok/auth.json, auto-refreshed before expiry.`,\n )\n .option(\n \"--device-code\",\n \"Use device code flow (default)\",\n )\n .option(\n \"--browser\",\n \"Use PKCE browser flow with loopback callback\",\n )\n .option(\n \"--manual-paste\",\n \"Use PKCE flow but paste the authorization code manually\",\n )\n .action(async (opts: { deviceCode?: boolean; browser?: boolean; manualPaste?: boolean }) => {\n try {\n if (opts.browser) {\n await loginWithPKCE();\n } else if (opts.manualPaste) {\n await loginWithPKCE({ manualPaste: true });\n } else {\n await loginWithDeviceCode();\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n return cmd;\n}\n","import { randomBytes, createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport {\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_SCOPE,\n XAI_OAUTH_REDIRECT_URI,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\nimport { fetchOIDCDiscovery } from \"./discovery.js\";\nimport { startCallbackServer } from \"./callback-server.js\";\nimport { saveTokens } from \"./token-store.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { log } from \"../utils/logger.js\";\n\nfunction generatePKCE(): { verifier: string; challenge: string } {\n const verifier = randomBytes(32).toString(\"hex\");\n const challenge = createHash(\"sha256\")\n .update(verifier)\n .digest(\"base64url\");\n return { verifier, challenge };\n}\n\ninterface PKCEOptions {\n manualPaste?: boolean;\n}\n\nfunction extractCodeFromInput(input: string): string | null {\n const trimmed = input.trim();\n // Full callback URL: http://127.0.0.1:56121/callback?code=XXX&state=YYY\n try {\n const url = new URL(trimmed);\n const code = url.searchParams.get(\"code\");\n if (code) return code;\n } catch { /* not a URL */ }\n // Query fragment: ?code=XXX&state=YYY\n if (trimmed.startsWith(\"?\")) {\n const params = new URLSearchParams(trimmed.slice(1));\n const code = params.get(\"code\");\n if (code) return code;\n }\n // Bare code (no whitespace, no = sign typically)\n if (trimmed.length > 10 && !trimmed.includes(\" \")) return trimmed;\n return null;\n}\n\nasync function promptForCode(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve, reject) => {\n rl.question(\"\\n Paste the callback URL or authorization code: \", (answer) => {\n rl.close();\n const code = extractCodeFromInput(answer);\n if (!code) {\n reject(new Error(\"Could not extract authorization code from input.\"));\n } else {\n resolve(code);\n }\n });\n });\n}\n\nexport async function loginWithPKCE(options: PKCEOptions = {}): Promise<void> {\n const discovery = await fetchOIDCDiscovery();\n const pkce = generatePKCE();\n const state = randomBytes(16).toString(\"hex\");\n\n const authorizeUrl = new URL(discovery.authorizationEndpoint);\n authorizeUrl.searchParams.set(\"client_id\", XAI_OAUTH_CLIENT_ID);\n authorizeUrl.searchParams.set(\"redirect_uri\", XAI_OAUTH_REDIRECT_URI);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"scope\", XAI_OAUTH_SCOPE);\n authorizeUrl.searchParams.set(\"state\", state);\n authorizeUrl.searchParams.set(\"code_challenge\", pkce.challenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n let code: string;\n\n if (options.manualPaste) {\n log.info(\"Opening browser for xAI login (manual-paste mode)...\");\n log.dim(\n `Visit this URL to authorize:\\n${authorizeUrl.toString()}`,\n );\n log.dim(\n `\\nAfter approving, paste the callback URL or the authorization code shown on the page.`,\n );\n await openUrl(authorizeUrl.toString());\n code = await promptForCode();\n } else {\n log.info(\"Opening browser for xAI login...\");\n log.dim(\n `If the browser doesn't open, visit:\\n${authorizeUrl.toString()}`,\n );\n const callbackPromise = startCallbackServer(state);\n await openUrl(authorizeUrl.toString());\n const result = await callbackPromise;\n code = result.code;\n }\n\n log.info(\"Exchanging authorization code...\");\n\n const tokenRes = await fetch(discovery.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: XAI_OAUTH_CLIENT_ID,\n code,\n redirect_uri: XAI_OAUTH_REDIRECT_URI,\n code_verifier: pkce.verifier,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!tokenRes.ok) {\n const err = await tokenRes.text();\n throw new Error(`Token exchange failed: ${err}`);\n }\n\n const tokens = (await tokenRes.json()) as Record<string, unknown>;\n\n await saveTokens({\n accessToken: tokens.access_token as string,\n refreshToken: tokens.refresh_token as string | undefined,\n expiresIn: tokens.expires_in as number | undefined,\n idToken: tokens.id_token as string | undefined,\n tokenEndpoint: discovery.tokenEndpoint,\n });\n\n log.success(\"Logged in to xAI successfully!\");\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n// xAI shared OAuth Client (same as hermes-agent & openclaw — MIT licensed)\nexport const XAI_OAUTH_CLIENT_ID = \"b1a00492-073a-47ea-816f-4c329264a828\";\nexport const XAI_OAUTH_SCOPE =\n \"openid profile email offline_access grok-cli:access api:access\";\nexport const XAI_OAUTH_ISSUER = \"https://auth.x.ai\";\nexport const XAI_OAUTH_DISCOVERY_URL = `${XAI_OAUTH_ISSUER}/.well-known/openid-configuration`;\n\n// OAuth callback (MUST match registered redirect URI)\nexport const XAI_OAUTH_CALLBACK_HOST = \"127.0.0.1\";\nexport const XAI_OAUTH_CALLBACK_PORT = 56121;\nexport const XAI_OAUTH_CALLBACK_PATH = \"/callback\";\nexport const XAI_OAUTH_REDIRECT_URI = `http://${XAI_OAUTH_CALLBACK_HOST}:${XAI_OAUTH_CALLBACK_PORT}${XAI_OAUTH_CALLBACK_PATH}`;\n\n// CORS origins for xAI auth\nexport const XAI_OAUTH_CORS_ORIGINS = [\"auth.x.ai\", \"accounts.x.ai\"];\n\n// Timeouts\nexport const XAI_OAUTH_TIMEOUT_MS = 5 * 60 * 1000;\nexport const XAI_OAUTH_FETCH_TIMEOUT_MS = 30 * 1000;\nexport const XAI_DEVICE_CODE_POLL_INTERVAL_MS = 5 * 1000;\n\n// Token refresh\nexport const TOKEN_REFRESH_SKEW_MS = 2 * 60 * 1000;\n\n// API\nexport const XAI_API_BASE_URL = \"https://api.x.ai/v1\";\nexport const DEFAULT_MODEL = \"grok-4.3\";\n\n// Proxy\nexport const PROXY_DEFAULT_PORT = 18645;\nexport const PROXY_DEFAULT_HOST = \"127.0.0.1\";\nexport const CHAT_DEFAULT_PORT = 18646;\n\n// Paths\nexport const CONFIG_DIR = join(homedir(), \".progrok\");\nexport const AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nexport const CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n// GitHub\nexport const GITHUB_REPO = \"lidge-jun/progrok\";\nexport const GITHUB_URL = `https://github.com/${GITHUB_REPO}`;\n","import {\n XAI_OAUTH_DISCOVERY_URL,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\n\nexport interface OIDCDiscovery {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n deviceAuthorizationEndpoint?: string;\n}\n\nfunction requireTrustedEndpoint(url: string, label: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"not HTTPS\");\n }\n if (parsed.hostname !== \"x.ai\" && !parsed.hostname.endsWith(\".x.ai\")) {\n throw new Error(\"not *.x.ai\");\n }\n return url;\n } catch {\n throw new Error(`OIDC discovery returned untrusted ${label}: ${url}`);\n }\n}\n\nexport async function fetchOIDCDiscovery(): Promise<OIDCDiscovery> {\n const res = await fetch(XAI_OAUTH_DISCOVERY_URL, {\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n throw new Error(`OIDC discovery failed: HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as Record<string, unknown>;\n\n const authorizationEndpoint = requireTrustedEndpoint(\n data.authorization_endpoint as string,\n \"authorization_endpoint\",\n );\n const tokenEndpoint = requireTrustedEndpoint(\n data.token_endpoint as string,\n \"token_endpoint\",\n );\n const deviceAuthorizationEndpoint = data.device_authorization_endpoint\n ? requireTrustedEndpoint(\n data.device_authorization_endpoint as string,\n \"device_authorization_endpoint\",\n )\n : undefined;\n\n return { authorizationEndpoint, tokenEndpoint, deviceAuthorizationEndpoint };\n}\n","import { createServer, type Server } from \"node:http\";\nimport {\n XAI_OAUTH_CALLBACK_HOST,\n XAI_OAUTH_CALLBACK_PORT,\n XAI_OAUTH_CALLBACK_PATH,\n XAI_OAUTH_CORS_ORIGINS,\n XAI_OAUTH_TIMEOUT_MS,\n} from \"./constants.js\";\n\ninterface CallbackResult {\n code: string;\n state: string;\n}\n\nexport function startCallbackServer(\n expectedState: string,\n): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n let server: Server | undefined;\n\n const timeout = setTimeout(() => {\n server?.close();\n reject(new Error(\"OAuth callback timed out (5 minutes)\"));\n }, XAI_OAUTH_TIMEOUT_MS);\n\n server = createServer((req, res) => {\n const url = new URL(\n req.url || \"/\",\n `http://${XAI_OAUTH_CALLBACK_HOST}`,\n );\n\n if (req.method === \"OPTIONS\") {\n const origin = req.headers.origin || \"\";\n try {\n const originHost = new URL(origin).hostname;\n if (XAI_OAUTH_CORS_ORIGINS.includes(originHost)) {\n res.writeHead(204, {\n \"Access-Control-Allow-Origin\": origin,\n \"Access-Control-Allow-Methods\": \"GET\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n });\n } else {\n res.writeHead(204);\n }\n } catch {\n res.writeHead(204);\n }\n res.end();\n return;\n }\n\n if (url.pathname !== XAI_OAUTH_CALLBACK_PATH) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n const desc = url.searchParams.get(\"error_description\") || error;\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n `<html><body><h2>Login failed</h2><p>${desc}</p><p>You can close this tab.</p></body></html>`,\n );\n clearTimeout(timeout);\n server?.close();\n reject(new Error(`OAuth error: ${desc}`));\n return;\n }\n\n if (!code || state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>Invalid callback</h2></body></html>\");\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n `<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">` +\n `<h2>Logged in to progrok</h2>` +\n `<p>You can close this tab and return to the terminal.</p>` +\n `</body></html>`,\n );\n\n clearTimeout(timeout);\n server?.close();\n resolve({ code, state });\n });\n\n server.listen(XAI_OAUTH_CALLBACK_PORT, XAI_OAUTH_CALLBACK_HOST, () => {});\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n reject(new Error(`Callback server failed: ${err.message}`));\n });\n });\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n unlinkSync,\n} from \"node:fs\";\nimport {\n CONFIG_DIR,\n AUTH_FILE,\n TOKEN_REFRESH_SKEW_MS,\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport interface TokenData {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n tokenEndpoint?: string;\n email?: string;\n idToken?: string;\n}\n\nexport interface SaveTokenInput {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n idToken?: string;\n tokenEndpoint?: string;\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport async function saveTokens(input: SaveTokenInput): Promise<void> {\n ensureConfigDir();\n\n const data: TokenData = {\n accessToken: input.accessToken,\n refreshToken: input.refreshToken,\n expiresAt: input.expiresIn\n ? Date.now() + input.expiresIn * 1000\n : undefined,\n tokenEndpoint: input.tokenEndpoint,\n idToken: input.idToken,\n };\n\n if (input.idToken) {\n try {\n const parts = input.idToken.split(\".\");\n if (parts[1]) {\n const payload = JSON.parse(\n Buffer.from(parts[1], \"base64url\").toString(),\n ) as Record<string, unknown>;\n if (typeof payload.email === \"string\") {\n data.email = payload.email;\n }\n }\n } catch {\n /* ignore malformed JWT */\n }\n }\n\n writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n try {\n const raw = readFileSync(AUTH_FILE, \"utf8\");\n return JSON.parse(raw) as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function deleteTokens(): void {\n try {\n unlinkSync(AUTH_FILE);\n } catch {\n /* ignore if not exists */\n }\n}\n\nexport async function getValidBearer(): Promise<string> {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n throw new Error(\"Not logged in. Run `progrok login` first.\");\n }\n\n if (\n tokens.expiresAt &&\n Date.now() + TOKEN_REFRESH_SKEW_MS >= tokens.expiresAt\n ) {\n if (!tokens.refreshToken || !tokens.tokenEndpoint) {\n throw new Error(\n \"Token expired and no refresh token available. Run `progrok login` again.\",\n );\n }\n\n log.dim(\"Refreshing access token...\");\n\n const res = await fetch(tokens.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: XAI_OAUTH_CLIENT_ID,\n refresh_token: tokens.refreshToken,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n throw new Error(\"Token refresh failed. Run `progrok login` again.\");\n }\n\n const refreshed = (await res.json()) as Record<string, unknown>;\n\n if (\n typeof refreshed.access_token !== \"string\" ||\n !refreshed.access_token\n ) {\n throw new Error(\n \"Token refresh returned invalid access_token. Run `progrok login` again.\",\n );\n }\n\n await saveTokens({\n accessToken: refreshed.access_token,\n refreshToken:\n (typeof refreshed.refresh_token === \"string\"\n ? refreshed.refresh_token\n : undefined) || tokens.refreshToken,\n expiresIn:\n typeof refreshed.expires_in === \"number\"\n ? refreshed.expires_in\n : undefined,\n tokenEndpoint: tokens.tokenEndpoint,\n });\n\n return refreshed.access_token;\n }\n\n return tokens.accessToken;\n}\n","const RESET = \"\\x1b[0m\";\nconst GREEN = \"\\x1b[32m\";\nconst RED = \"\\x1b[31m\";\nconst DIM = \"\\x1b[2m\";\nconst BOLD = \"\\x1b[1m\";\n\nexport const log = {\n info: (msg: string): void => {\n console.log(msg);\n },\n success: (msg: string): void => {\n console.log(`${GREEN}${msg}${RESET}`);\n },\n error: (msg: string): void => {\n console.error(`${RED}${msg}${RESET}`);\n },\n dim: (msg: string): void => {\n console.log(`${DIM}${msg}${RESET}`);\n },\n bold: (msg: string): void => {\n console.log(`${BOLD}${msg}${RESET}`);\n },\n};\n","import open from \"open\";\n\nexport async function openUrl(url: string): Promise<void> {\n try {\n await open(url);\n } catch {\n // Silently fail — URL is already printed to terminal\n }\n}\n","import {\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_SCOPE,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n XAI_DEVICE_CODE_POLL_INTERVAL_MS,\n} from \"./constants.js\";\nimport { fetchOIDCDiscovery } from \"./discovery.js\";\nimport { saveTokens } from \"./token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval?: number;\n}\n\nexport async function loginWithDeviceCode(): Promise<void> {\n const discovery = await fetchOIDCDiscovery();\n\n if (!discovery.deviceAuthorizationEndpoint) {\n throw new Error(\n \"xAI does not support device code flow via OIDC discovery\",\n );\n }\n\n log.info(\"Requesting device code...\");\n\n const dcRes = await fetch(discovery.deviceAuthorizationEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: XAI_OAUTH_CLIENT_ID,\n scope: XAI_OAUTH_SCOPE,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!dcRes.ok) {\n throw new Error(`Device code request failed: ${await dcRes.text()}`);\n }\n\n const dc = (await dcRes.json()) as DeviceCodeResponse;\n\n const url = dc.verification_uri_complete || dc.verification_uri;\n log.info(`\\nOpen this URL in your browser:\\n ${url}\\n`);\n log.info(`Enter code: ${dc.user_code}\\n`);\n\n const intervalMs = Math.max(\n (dc.interval || 5) * 1000,\n XAI_DEVICE_CODE_POLL_INTERVAL_MS,\n );\n const deadline = Date.now() + dc.expires_in * 1000;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n\n const pollRes = await fetch(discovery.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n client_id: XAI_OAUTH_CLIENT_ID,\n device_code: dc.device_code,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (pollRes.ok) {\n const tokens = (await pollRes.json()) as Record<string, unknown>;\n await saveTokens({\n accessToken: tokens.access_token as string,\n refreshToken: tokens.refresh_token as string | undefined,\n expiresIn: tokens.expires_in as number | undefined,\n idToken: tokens.id_token as string | undefined,\n tokenEndpoint: discovery.tokenEndpoint,\n });\n log.success(\"Logged in to xAI successfully!\");\n return;\n }\n\n const err = (await pollRes.json()) as Record<string, string>;\n if (err.error === \"authorization_pending\") continue;\n if (err.error === \"slow_down\") {\n await new Promise((r) => setTimeout(r, 5000));\n continue;\n }\n throw new Error(\n `Device code poll failed: ${err.error_description || err.error}`,\n );\n }\n\n throw new Error(\"Device code expired. Please try again.\");\n}\n","import { Command } from \"commander\";\nimport { deleteTokens } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function logoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Remove stored xAI credentials\")\n .action(() => {\n deleteTokens();\n log.success(\"Logged out. Credentials removed.\");\n });\n}\n","import { Command } from \"commander\";\nimport { startProxy } from \"../proxy/server.js\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport {\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function proxyCommand(): Command {\n return new Command(\"proxy\")\n .description(\n `Start OpenAI-compatible proxy server for Grok.\n Forwards ALL /v1/* requests to api.x.ai with your OAuth token injected.\n Any client (curl, OpenAI SDK, LangChain, etc.) can connect — no API key needed.\n Supports streaming (SSE), multipart (stt), and binary responses (tts).`,\n )\n .option(\"-p, --port <port>\", \"Port number\", String(PROXY_DEFAULT_PORT))\n .option(\"--host <host>\", \"Host to bind\", PROXY_DEFAULT_HOST)\n .action(async (opts: { port: string; host: string }) => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.error(\"Not logged in. Run `progrok login` first.\");\n process.exit(1);\n }\n\n try {\n await startProxy(parseInt(opts.port, 10), opts.host);\n await new Promise(() => {});\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import express, { type Request, type Response } from \"express\";\nimport {\n XAI_API_BASE_URL,\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nconst HOP_BY_HOP = new Set([\n \"host\",\n \"content-length\",\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailers\",\n \"transfer-encoding\",\n \"upgrade\",\n \"authorization\",\n]);\n\nfunction filterHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (!HOP_BY_HOP.has(key.toLowerCase()) && value) {\n out[key] = Array.isArray(value) ? value[0] : value;\n }\n }\n return out;\n}\n\nexport function createProxyApp(): express.Application {\n const app = express();\n\n app.get(\"/health\", (_req: Request, res: Response) => {\n res.json({ status: \"ok\", upstream: \"xAI Grok\", proxy: \"progrok\" });\n });\n\n app.all(\"/v1/*\", (req: Request, res: Response) => {\n void handleProxy(req, res);\n });\n\n return app;\n}\n\nasync function handleProxy(req: Request, res: Response): Promise<void> {\n const relPath = req.path.replace(/^\\/v1/, \"\");\n\n let bearer: string;\n try {\n bearer = await getValidBearer();\n } catch (err) {\n res.status(401).json({\n error: { message: (err as Error).message, type: \"auth_error\" },\n });\n return;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string));\n }\n const body = Buffer.concat(chunks);\n\n const qs = req.url.includes(\"?\") ? \"?\" + req.url.split(\"?\")[1] : \"\";\n const upstreamUrl = `${XAI_API_BASE_URL}${relPath}${qs}`;\n const fwdHeaders = filterHeaders(\n req.headers as Record<string, string>,\n );\n fwdHeaders[\"Authorization\"] = `Bearer ${bearer}`;\n\n try {\n const upstream = await fetch(upstreamUrl, {\n method: req.method,\n headers: fwdHeaders,\n body: body.length > 0 ? body : undefined,\n });\n\n res.status(upstream.status);\n\n for (const [key, value] of upstream.headers) {\n const lower = key.toLowerCase();\n if (\n !HOP_BY_HOP.has(lower) &&\n lower !== \"content-encoding\" &&\n lower !== \"content-length\"\n ) {\n res.setHeader(key, value);\n }\n }\n\n if (upstream.body) {\n const reader = (\n upstream.body as ReadableStream<Uint8Array>\n ).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n } catch {\n /* stream interrupted */\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.status(502).json({\n error: {\n message: `Upstream error: ${(err as Error).message}`,\n type: \"upstream_error\",\n },\n });\n }\n }\n}\n\nexport async function startProxy(\n port = PROXY_DEFAULT_PORT,\n host = PROXY_DEFAULT_HOST,\n): Promise<void> {\n const app = createProxyApp();\n\n return new Promise((resolve, reject) => {\n const server = app.listen(port, host, () => {\n log.success(\"progrok proxy running\");\n log.info(` Listening: http://${host}:${port}/v1`);\n log.info(` Forwarding: ${XAI_API_BASE_URL}`);\n log.dim(\n \" Client auth: any bearer token (proxy injects your OAuth credential)\",\n );\n log.info(\"\\nPress Ctrl+C to stop.\\n\");\n resolve();\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n reject(new Error(`Proxy failed to start: ${err.message}`));\n });\n\n process.on(\"SIGINT\", () => {\n log.info(\"\\nprogrok proxy stopped.\");\n server.close();\n process.exit(0);\n });\n });\n}\n","import { Command } from \"commander\";\nimport { startChat } from \"../chat/server.js\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport {\n CHAT_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function chatCommand(): Command {\n return new Command(\"chat\")\n .description(\n `Open Grok chat in your browser.\n Starts a web UI + proxy server on the same port.\n Features: sessions, markdown, code highlighting, tool results, model switching.\n Proxy is also available at the same port under /v1/*.`,\n )\n .option(\"-p, --port <port>\", \"Port number\", String(CHAT_DEFAULT_PORT))\n .option(\"--host <host>\", \"Host to bind\", PROXY_DEFAULT_HOST)\n .action(async (opts: { port: string; host: string }) => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.error(\"Not logged in. Run `progrok login` first.\");\n process.exit(1);\n }\n\n try {\n await startChat(parseInt(opts.port, 10), opts.host);\n await new Promise(() => {});\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import express from \"express\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createProxyApp } from \"../proxy/server.js\";\nimport { CHAT_DEFAULT_PORT, PROXY_DEFAULT_HOST } from \"../auth/constants.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { log } from \"../utils/logger.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport async function startChat(\n port = CHAT_DEFAULT_PORT,\n host = PROXY_DEFAULT_HOST,\n): Promise<void> {\n const app = createProxyApp();\n\n const publicDir = join(__dirname, \"public\");\n app.use(express.static(publicDir));\n\n app.get(\"/\", (_req, res) => {\n res.sendFile(join(publicDir, \"index.html\"));\n });\n\n return new Promise((resolve, reject) => {\n const server = app.listen(port, host, () => {\n const url = `http://${host}:${port}`;\n log.success(`progrok chat running at ${url}`);\n log.dim(`Proxy also available at ${url}/v1`);\n log.info(\"Press Ctrl+C to stop.\\n\");\n void openUrl(url);\n resolve();\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n reject(new Error(`Chat server failed: ${err.message}`));\n });\n\n process.on(\"SIGINT\", () => {\n log.info(\"\\nprogrok chat stopped.\");\n server.close();\n process.exit(0);\n });\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\ninterface LanguageModel {\n id: string;\n input_modalities?: string[];\n output_modalities?: string[];\n prompt_text_token_price?: number;\n completion_text_token_price?: number;\n aliases?: string[];\n}\n\ninterface SimpleModel {\n id: string;\n}\n\nfunction formatPrice(ticks: number | undefined): string {\n if (!ticks) return \"-\";\n // ticks = per-token price in 1e-10 USD; show per 1M tokens\n return `$${(ticks / 1e4).toFixed(2)}`;\n}\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"List available Grok models\")\n .option(\"--detail\", \"Show pricing and aliases from /v1/language-models\")\n .action(async (opts: { detail?: boolean }) => {\n try {\n const bearer = await getValidBearer();\n\n if (opts.detail) {\n const res = await fetch(`${XAI_API_BASE_URL}/language-models`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const data = (await res.json()) as { models: LanguageModel[] };\n\n log.info(\"Grok Models (detailed)\\n\");\n for (const m of data.models) {\n const input = (m.input_modalities || []).join(\", \");\n const inPrice = formatPrice(m.prompt_text_token_price);\n const outPrice = formatPrice(m.completion_text_token_price);\n console.log(` ${m.id}`);\n console.log(` Input: ${input} | Price: ${inPrice}/1M in, ${outPrice}/1M out`);\n if (m.aliases && m.aliases.length > 0) {\n console.log(` Aliases: ${m.aliases.slice(0, 5).join(\", \")}${m.aliases.length > 5 ? ` (+${m.aliases.length - 5} more)` : \"\"}`);\n }\n console.log();\n }\n return;\n }\n\n const res = await fetch(`${XAI_API_BASE_URL}/models`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const data = (await res.json()) as { data: SimpleModel[] };\n\n log.info(\"Available Grok models:\\n\");\n for (const m of data.data) {\n const tag = m.id.includes(\"reasoning\")\n ? \" [reasoning]\"\n : m.id.includes(\"non-reasoning\")\n ? \" [fast]\"\n : m.id.includes(\"build\") || m.id.includes(\"code\")\n ? \" [code]\"\n : m.id.includes(\"imagine-video\")\n ? \" [video]\"\n : m.id.includes(\"imagine\")\n ? \" [image]\"\n : \"\";\n console.log(` ${m.id}${tag}`);\n }\n log.dim(\"\\n Use --detail for pricing and aliases\");\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function statusCommand(): Command {\n return new Command(\"status\")\n .description(\"Show authentication status\")\n .action(() => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.info(\"Status: Not logged in\");\n log.dim(\"Run `progrok login` to authenticate.\");\n return;\n }\n\n const expired =\n tokens.expiresAt !== undefined && Date.now() >= tokens.expiresAt;\n const hasRefresh = !!tokens.refreshToken;\n\n log.info(\"Status: Logged in\");\n if (tokens.email) log.info(` Account: ${tokens.email}`);\n if (tokens.expiresAt) {\n const remaining = Math.max(\n 0,\n Math.floor((tokens.expiresAt - Date.now()) / 60000),\n );\n log.info(\n ` Token: ${expired ? \"expired\" : `valid (${remaining} min remaining)`}`,\n );\n }\n log.info(` Refresh: ${hasRefresh ? \"available\" : \"none\"}`);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join, relative } from \"node:path\";\n\n// tsup bundles to dist/index.js → one level up is the project root\nconst ROOT = join(dirname(fileURLToPath(import.meta.url)), \"..\");\nconst SKILL_PATH = join(ROOT, \"skills\", \"progrok\", \"SKILL.md\");\nconst PACKAGE_PATH = join(ROOT, \"package.json\");\n\nfunction readPackageVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(PACKAGE_PATH, \"utf-8\")) as {\n version?: string;\n };\n return pkg.version || \"?\";\n } catch {\n return \"?\";\n }\n}\n\nfunction readSkill(): string {\n if (!existsSync(SKILL_PATH)) {\n console.error(`packaged skill not found: ${SKILL_PATH}`);\n process.exit(5);\n }\n return readFileSync(SKILL_PATH, \"utf-8\");\n}\n\nexport function skillCommand(): Command {\n return new Command(\"skill\")\n .description(\n `Print the packaged progrok Markdown skill for agents.\n Designed to be piped into agent context or read programmatically.`,\n )\n .argument(\"[subcommand]\", '\"path\" to print the resolved skill file path')\n .option(\"--json\", \"Output as JSON wrapper around the Markdown skill\")\n .action((subcommand: string | undefined, opts: { json?: boolean }) => {\n if (subcommand === \"path\") {\n console.log(SKILL_PATH);\n return;\n }\n\n const content = readSkill();\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n name: \"progrok\",\n format: \"markdown-skill\",\n formatVersion: \"1\",\n packageVersion: readPackageVersion(),\n path: relative(ROOT, SKILL_PATH),\n source: \"package\",\n content,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(content.replace(/\\n$/, \"\"));\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport {\n XAI_API_BASE_URL,\n DEFAULT_MODEL,\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n CHAT_DEFAULT_PORT,\n} from \"../auth/constants.js\";\n\nconst ROOT = join(dirname(fileURLToPath(import.meta.url)), \"..\");\n\nfunction readPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(ROOT, \"package.json\"), \"utf-8\"),\n ) as { version?: string };\n return pkg.version || \"?\";\n } catch {\n return \"?\";\n }\n}\n\n// Endpoint surface mirrors the xAI REST API (https://docs.x.ai). Every HTTP\n// /v1/* path is forwarded by the proxy verbatim. WebSocket (wss) endpoints and\n// the management-api.x.ai host are NOT proxied — see `limitations`.\nconst ENDPOINTS = [\n // Chat & Responses\n { category: \"chat\", method: \"POST\", path: \"/v1/chat/completions\", type: \"streaming\", description: \"OpenAI-compatible chat + image understanding\" },\n { category: \"chat\", method: \"POST\", path: \"/v1/responses\", type: \"streaming\", description: \"Responses API — tools, reasoning, citations, stateful\" },\n { category: \"chat\", method: \"POST\", path: \"/v1/responses/compact\", type: \"sync\", description: \"Context compaction — shrink history for reuse\" },\n { category: \"chat\", method: \"GET\", path: \"/v1/responses/{id}\", type: \"sync\", description: \"Retrieve a stored response (kept 30 days)\" },\n { category: \"chat\", method: \"DELETE\", path: \"/v1/responses/{id}\", type: \"sync\", description: \"Delete a stored response\" },\n { category: \"chat\", method: \"GET\", path: \"/v1/chat/deferred-completion/{id}\", type: \"poll\", description: \"Fetch a deferred completion (202 pending / 200 done)\" },\n // Images (Imagine API)\n { category: \"images\", method: \"POST\", path: \"/v1/images/generations\", type: \"sync\", description: \"Text-to-image — aspect_ratio, resolution 1k/2k, n, url|b64_json\" },\n { category: \"images\", method: \"POST\", path: \"/v1/images/edits\", type: \"sync\", description: \"Edit / multi-image compose — image{} or images[] + prompt\" },\n // Videos (Imagine API, async)\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/generations\", type: \"async\", description: \"T2V / I2V / R2V — duration 1-15s, resolution 480p/720p/1080p\" },\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/edits\", type: \"async\", description: \"Edit a source video by prompt\" },\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/extensions\", type: \"async\", description: \"Extend a video (1-10s continuation)\" },\n { category: \"videos\", method: \"GET\", path: \"/v1/videos/{id}\", type: \"poll\", description: \"Poll generation: pending(progress) → done(video.url)\" },\n // Voice — HTTP\n { category: \"voice\", method: \"POST\", path: \"/v1/tts\", type: \"binary\", description: \"Text-to-speech — voice_id, output_format, speed, speech tags\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/tts/voices\", type: \"sync\", description: \"List built-in voices (ara, eve, leo, rex, sal)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/tts/voices/{voice_id}\", type: \"sync\", description: \"Get one built-in voice\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/stt\", type: \"multipart\", description: \"Speech-to-text — diarize, multichannel, keyterm, word timestamps\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/realtime/client_secrets\", type: \"sync\", description: \"Mint ephemeral token for browser Realtime/Voice Agent\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/custom-voices\", type: \"multipart\", description: \"Clone a custom voice from reference audio (≤120s)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices\", type: \"sync\", description: \"List custom voices (paginated)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Get one custom voice\" },\n { category: \"voice\", method: \"PATCH\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Update custom voice metadata\" },\n { category: \"voice\", method: \"DELETE\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Delete a custom voice\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices/{voice_id}/audio\", type: \"binary\", description: \"Download a custom voice's reference audio\" },\n // Models\n { category: \"models\", method: \"GET\", path: \"/v1/models\", type: \"sync\", description: \"List models (id + pricing)\" },\n { category: \"models\", method: \"GET\", path: \"/v1/models/{model_id}\", type: \"sync\", description: \"Get one model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/language-models\", type: \"sync\", description: \"Chat models with modalities + aliases + pricing\" },\n { category: \"models\", method: \"GET\", path: \"/v1/language-models/{model_id}\", type: \"sync\", description: \"Get one language model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/image-generation-models\", type: \"sync\", description: \"Image models with per-image pricing\" },\n { category: \"models\", method: \"GET\", path: \"/v1/image-generation-models/{model_id}\", type: \"sync\", description: \"Get one image model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/video-generation-models\", type: \"sync\", description: \"Video models with modalities\" },\n { category: \"models\", method: \"GET\", path: \"/v1/video-generation-models/{model_id}\", type: \"sync\", description: \"Get one video model\" },\n // Batches\n { category: \"batches\", method: \"POST\", path: \"/v1/batches\", type: \"sync\", description: \"Create a batch\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches\", type: \"sync\", description: \"List batches\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}\", type: \"sync\", description: \"Get batch state\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}/requests\", type: \"sync\", description: \"List requests in a batch\" },\n { category: \"batches\", method: \"POST\", path: \"/v1/batches/{id}/requests\", type: \"sync\", description: \"Add requests to a batch\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}/results\", type: \"sync\", description: \"List batch results\" },\n { category: \"batches\", method: \"POST\", path: \"/v1/batches/{id}:cancel\", type: \"sync\", description: \"Cancel all requests in a batch\" },\n // Files\n { category: \"files\", method: \"POST\", path: \"/v1/files\", type: \"multipart\", description: \"Upload a file (≤50MB) — referenced by file_id\" },\n { category: \"files\", method: \"GET\", path: \"/v1/files\", type: \"sync\", description: \"List files (AIP-160 filter, paginated)\" },\n { category: \"files\", method: \"GET\", path: \"/v1/files/{file_id}\", type: \"sync\", description: \"Get file metadata\" },\n { category: \"files\", method: \"DELETE\", path: \"/v1/files/{file_id}\", type: \"sync\", description: \"Delete a file\" },\n // Collections (search only via api.x.ai; management is on management-api.x.ai)\n { category: \"collections\", method: \"POST\", path: \"/v1/documents/search\", type: \"sync\", description: \"Semantic search over collections (RAG)\" },\n // Other\n { category: \"other\", method: \"GET\", path: \"/v1/api-key\", type: \"sync\", description: \"Inspect the active API key / ACLs\" },\n { category: \"other\", method: \"POST\", path: \"/v1/tokenize-text\", type: \"sync\", description: \"Tokenize text for a model\" },\n { category: \"other\", method: \"POST\", path: \"/v1/embeddings\", type: \"sync\", description: \"Text embeddings\" },\n { category: \"other\", method: \"*\", path: \"/v1/*\", type: \"passthrough\", description: \"Any other path forwarded to api.x.ai unchanged\" },\n] as const;\n\n// WebSocket endpoints — documented for completeness but NOT proxied by progrok\n// (the proxy handles HTTP only; connect directly with an ephemeral token).\nconst WEBSOCKET_ENDPOINTS = [\n { url: \"wss://api.x.ai/v1/realtime\", description: \"Voice Agent — realtime speech conversations + MCP tools\" },\n { url: \"wss://api.x.ai/v1/tts\", description: \"Streaming text-to-speech (incremental text → audio)\" },\n { url: \"wss://api.x.ai/v1/stt\", description: \"Streaming speech-to-text (binary audio → transcript)\" },\n] as const;\n\nexport function buildCapabilities() {\n return {\n ok: true,\n name: \"progrok\",\n version: readPackageVersion(),\n source: \"local\",\n upstream: XAI_API_BASE_URL,\n commands: [\n \"login\",\n \"logout\",\n \"proxy\",\n \"chat\",\n \"models\",\n \"status\",\n \"skill\",\n \"capabilities\",\n ],\n proxy: {\n host: PROXY_DEFAULT_HOST,\n port: PROXY_DEFAULT_PORT,\n baseUrl: `http://${PROXY_DEFAULT_HOST}:${PROXY_DEFAULT_PORT}/v1`,\n forwarding: \"all HTTP /v1/* paths — no whitelist\",\n },\n chat: {\n port: CHAT_DEFAULT_PORT,\n url: `http://${PROXY_DEFAULT_HOST}:${CHAT_DEFAULT_PORT}`,\n },\n defaults: {\n model: DEFAULT_MODEL,\n },\n endpoints: ENDPOINTS,\n websocketEndpoints: WEBSOCKET_ENDPOINTS,\n models: [\n {\n id: \"grok-4.3\",\n type: \"reasoning\",\n use: \"Flagship — chat, agentic tool calling, search, vision\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"1M tokens\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { configurable: true, nonReasoningMode: true, note: \"Supports non-reasoning mode for instant replies\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.3-latest\", \"grok-latest\", \"grok-4\", \"grok-4-latest\", \"grok-4-fast-reasoning\", \"grok-3\", \"grok-3-latest\", \"grok-3-mini\"],\n },\n {\n id: \"grok-4.20-0309-reasoning\",\n type: \"deep-reasoning\",\n use: \"Deep analysis, complex coding (legacy 4.20 line)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"high\"], default: \"low\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.20\", \"grok-4.20-reasoning\", \"grok-4.20-reasoning-latest\", \"grok-4.20-beta\", \"grok-4.20-beta-latest\"],\n },\n {\n id: \"grok-4.20-0309-non-reasoning\",\n type: \"fast\",\n use: \"Fast responses, no thinking overhead (legacy 4.20 line)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: false,\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.20-non-reasoning\", \"grok-4.20-non-reasoning-latest\", \"grok-4.20-beta-non-reasoning\", \"grok-4.20-beta-latest-non-reasoning\"],\n },\n {\n id: \"grok-4.20-multi-agent-0309\",\n type: \"multi-agent\",\n use: \"Deep research — 4 or 16 parallel agents (beta)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"medium\", \"high\", \"xhigh\"], default: \"low\", note: \"effort selects agent count: low/medium=4, high/xhigh=16\" },\n structuredOutput: true,\n functionCalling: false,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\"],\n notes: \"Responses API / xAI SDK only — not Chat Completions. No client-side function calling. No max_tokens.\",\n aliases: [\"grok-4.20-multi-agent\", \"grok-4.20-multi-agent-latest\", \"grok-4.20-multi-agent-beta-latest\"],\n },\n {\n id: \"grok-build-0.1\",\n type: \"code\",\n use: \"Fast agentic coding\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"256K tokens\",\n pricing: { inputPer1M: 1.0, cachedInputPer1M: 0.2, outputPer1M: 2.0, longContext: { thresholdTokens: 200000, inputPer1M: 2.0, cachedInputPer1M: 0.4, outputPer1M: 4.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"high\"], default: \"low\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"function\"],\n aliases: [\"grok-code-fast-1\", \"grok-code-fast\", \"grok-code-fast-1-0825\"],\n },\n {\n id: \"grok-imagine-image\",\n type: \"image\",\n use: \"Fast image generation / editing\",\n input: [\"text\", \"image\"],\n output: [\"image\"],\n maxPromptLength: 8000,\n pricing: { perImage: 0.02, unit: \"USD\", note: \"1k or 2k resolution\" },\n aliases: [\"grok-imagine-image-2026-03-02\"],\n },\n {\n id: \"grok-imagine-image-quality\",\n type: \"image-hq\",\n use: \"High-quality image generation / editing\",\n input: [\"text\", \"image\"],\n output: [\"image\"],\n maxPromptLength: 8000,\n pricing: { perImage: 0.04, unit: \"USD\", note: \"1k or 2k resolution\" },\n aliases: [\"grok-imagine-image-quality-latest\", \"grok-imagine-image-pro\"],\n },\n {\n id: \"grok-imagine-video\",\n type: \"video\",\n use: \"Video generation / edit / extension (async)\",\n input: [\"text\", \"image\"],\n output: [\"video\"],\n pricing: { perSecond: 0.05, unit: \"USD\", note: \"480p or 720p\" },\n aliases: [],\n },\n {\n id: \"grok-imagine-video-1.5-preview\",\n type: \"video\",\n use: \"Video v1.5 (preview) — improved I2V, T2V via white-canvas workaround\",\n input: [\"text\", \"image\"],\n output: [\"video\"],\n pricing: { perSecond: 0.05, unit: \"USD\", note: \"480p or 720p, T2V needs image injection\" },\n aliases: [],\n },\n ],\n voiceModels: [\n { id: \"grok-voice-latest\", use: \"Voice Agent / realtime — recommended\" },\n { id: \"grok-voice-fast-1.0\", use: \"Lower-latency voice agent\" },\n { id: \"grok-voice-think-fast-1.0\", use: \"Reasoning-capable voice agent\" },\n ],\n voicePricing: {\n agentPerHour: 3.0,\n ttsPer1MChars: 15.0,\n sttBatchPerHour: 0.1,\n sttStreamingPerHour: 0.2,\n unit: \"USD\",\n },\n tools: [\n { type: \"web_search\", description: \"Web search + browse. Params: allowed_domains, excluded_domains, enable_image_understanding, enable_image_search\" },\n { type: \"x_search\", description: \"X (Twitter) search with citations\" },\n { type: \"code_interpreter\", description: \"Server-side Python execution (a.k.a. Code Execution)\" },\n { type: \"collections_search\", description: \"RAG over your uploaded collections\" },\n { type: \"mcp\", description: \"Remote MCP server. Params: server_url, server_label, allowed_tools, authorization, headers\" },\n { type: \"function\", description: \"Custom client-side function calling (max 128)\" },\n ],\n searchParameters: {\n mode: [\"off\", \"on\", \"auto\"],\n sources: [\"web\", \"x\", \"news\", \"rss\"],\n params: [\"from_date\", \"to_date\", \"max_search_results\", \"return_citations\"],\n },\n limitations: [\n \"WebSocket endpoints (wss /v1/realtime, /v1/tts, /v1/stt) are NOT proxied — connect directly with an ephemeral token from POST /v1/realtime/client_secrets.\",\n \"Collection management lives on management-api.x.ai (Management API key) and is not reachable through this proxy; only POST /v1/documents/search is.\",\n \"The multi-agent model requires the Responses API (not Chat Completions).\",\n ],\n guidance: {\n auth: \"Run `progrok login` once. progrok activates the local xAI OAuth session for clients and commands.\",\n proxy:\n \"`progrok proxy` forwards all HTTP /v1/* paths. Set OPENAI_BASE_URL=http://127.0.0.1:18645/v1 and OPENAI_API_KEY=anything.\",\n streaming:\n \"Use stream:true for responses/chat. The proxy passes SSE through verbatim.\",\n video:\n \"Video gen is async: POST /v1/videos/generations → poll GET /v1/videos/{id} until status=done.\",\n models:\n \"Use the bare model name or `<model>-latest` to auto-track the newest version; `<model>-<date>` pins a specific release.\",\n },\n };\n}\n\ntype Capabilities = ReturnType<typeof buildCapabilities>;\n\nfunction printText(cap: Capabilities): void {\n console.log(`progrok capabilities (${cap.source})`);\n console.log(`version: ${cap.version}`);\n console.log(`upstream: ${cap.upstream}`);\n console.log(\"\");\n console.log(`proxy: ${cap.proxy.baseUrl}`);\n console.log(`chat: ${cap.chat.url}`);\n console.log(`model: ${cap.defaults.model}`);\n console.log(\"\");\n console.log(\"endpoints (HTTP — proxied):\");\n let lastCategory = \"\";\n for (const ep of cap.endpoints) {\n if (ep.category !== lastCategory) {\n console.log(` [${ep.category}]`);\n lastCategory = ep.category;\n }\n const label = ` ${ep.method.padEnd(6)} ${ep.path.padEnd(38)}`;\n console.log(`${label} ${ep.description}`);\n }\n console.log(\"\");\n console.log(\"websocket (NOT proxied — connect directly):\");\n for (const ws of cap.websocketEndpoints) {\n console.log(` ${ws.url.padEnd(30)} ${ws.description}`);\n }\n console.log(\"\");\n console.log(\"models:\");\n for (const m of cap.models) {\n console.log(` ${m.id.padEnd(30)} ${m.use}`);\n }\n console.log(\"\");\n console.log(\"tools:\");\n for (const t of cap.tools) {\n console.log(` ${t.type.padEnd(20)} ${t.description}`);\n }\n console.log(\"\");\n console.log(\"limitations:\");\n for (const l of cap.limitations) {\n console.log(` - ${l}`);\n }\n console.log(\"\");\n console.log(`commands: ${cap.commands.join(\", \")}`);\n}\n\nexport function capabilitiesCommand(): Command {\n return new Command(\"capabilities\")\n .description(\"Print agent-friendly capability metadata.\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts: { json?: boolean }) => {\n const cap = buildCapabilities();\n if (opts.json) {\n console.log(JSON.stringify(cap, null, 2));\n } else {\n printText(cap);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL, DEFAULT_MODEL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport interface SearchOptions {\n web?: boolean;\n x?: boolean;\n json?: boolean;\n model?: string;\n reasoning?: string;\n}\n\ninterface ResponsesTool {\n type: \"web_search\" | \"x_search\";\n}\n\n/**\n * Default behaviour: search both web and X. If either --web or --x is given,\n * restrict to only the requested source(s).\n */\nexport function buildSearchTools(opts: { web?: boolean; x?: boolean }): ResponsesTool[] {\n const explicit = Boolean(opts.web || opts.x);\n const useWeb = explicit ? Boolean(opts.web) : true;\n const useX = explicit ? Boolean(opts.x) : true;\n const tools: ResponsesTool[] = [];\n if (useWeb) tools.push({ type: \"web_search\" });\n if (useX) tools.push({ type: \"x_search\" });\n return tools;\n}\n\ninterface Annotation {\n type?: string;\n url?: string;\n title?: string;\n}\ninterface OutputTextContent {\n type?: string;\n text?: string;\n annotations?: Annotation[];\n}\ninterface OutputItem {\n type?: string;\n content?: OutputTextContent[];\n action?: { type?: string; query?: string };\n}\ninterface ResponsesUsage {\n num_sources_used?: number;\n cost_in_usd_ticks?: number;\n server_side_tool_usage_details?: Record<string, number>;\n}\ninterface ResponsesData {\n output?: OutputItem[];\n usage?: ResponsesUsage;\n}\n\nexport interface SearchResult {\n answer: string;\n citations: { url: string; title: string }[];\n queries: string[];\n usage?: ResponsesUsage;\n}\n\n/** Parse the /v1/responses output array into a flat search result. */\nexport function extractSearchResult(data: ResponsesData): SearchResult {\n const citations: { url: string; title: string }[] = [];\n const queries: string[] = [];\n const seen = new Set<string>();\n let answer = \"\";\n\n for (const item of data.output ?? []) {\n if (item.type === \"message\") {\n for (const c of item.content ?? []) {\n if (c.type === \"output_text\" && c.text) {\n answer += c.text;\n for (const a of c.annotations ?? []) {\n if (a.type === \"url_citation\" && a.url && !seen.has(a.url)) {\n seen.add(a.url);\n citations.push({ url: a.url, title: a.title ?? \"\" });\n }\n }\n }\n }\n } else if (\n (item.type === \"web_search_call\" || item.type === \"x_search_call\") &&\n item.action?.query\n ) {\n queries.push(item.action.query);\n }\n }\n\n return { answer: answer.trim(), citations, queries, usage: data.usage };\n}\n\nexport function searchCommand(): Command {\n return new Command(\"search\")\n .description(\"Search the web and X with Grok — AI summary + citations (no API key)\")\n .argument(\"<query>\", \"what to search for\")\n .option(\"--web\", \"web search only (default: web + X)\")\n .option(\"--x\", \"X (Twitter) search only\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--model <id>\", \"model to use\", DEFAULT_MODEL)\n .option(\n \"--reasoning <effort>\",\n \"reasoning effort: none|low|medium|high|xhigh (xhigh = multi-agent 16)\",\n )\n .action(async (query: string, opts: SearchOptions) => {\n try {\n const VALID_EFFORTS = new Set([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"]);\n if (opts.reasoning && !VALID_EFFORTS.has(opts.reasoning)) {\n throw new Error(\n `invalid --reasoning '${opts.reasoning}'. use: none|low|medium|high|xhigh`,\n );\n }\n const tools = buildSearchTools(opts);\n const bearer = await getValidBearer();\n\n const res = await fetch(`${XAI_API_BASE_URL}/responses`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: opts.model ?? DEFAULT_MODEL,\n input: query,\n tools,\n stream: false,\n ...(opts.reasoning ? { reasoning: { effort: opts.reasoning } } : {}),\n }),\n });\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`HTTP ${res.status}: ${body.slice(0, 300)}`);\n }\n\n const result = extractSearchResult((await res.json()) as ResponsesData);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n log.bold(`\\nSearch: ${query}\\n`);\n console.log(result.answer || \"(no answer returned)\");\n\n if (result.citations.length > 0) {\n log.dim(\"\\nSources:\");\n result.citations.forEach((c, i) => {\n console.log(` [${i + 1}] ${c.url}`);\n });\n }\n\n const d = result.usage?.server_side_tool_usage_details;\n if (d) {\n log.dim(\n `\\n(${d.web_search_calls ?? 0} web · ${d.x_search_calls ?? 0} X searches)`,\n );\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\n\nconst DEFAULT_VIDEO_MODEL = \"grok-imagine-video\";\nconst POLL_INTERVAL_MS = 5000;\n\n// 1x1 white PNG for video 1.5 T2V workaround\nconst WHITE_PIXEL_PNG =\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/58BAwAHBQKhPX8EOAAAAABJRU5ErkJggg==\";\n\nexport interface VideoOptions {\n model?: string;\n duration?: string;\n aspect?: string;\n resolution?: string;\n image?: string;\n output?: string;\n json?: boolean;\n timeout?: string;\n}\n\nfunction imageToDataUri(filePath: string): string {\n const abs = resolve(filePath);\n const buf = readFileSync(abs);\n const ext = abs.toLowerCase().endsWith(\".png\") ? \"png\" : \"jpeg\";\n return `data:image/${ext};base64,${buf.toString(\"base64\")}`;\n}\n\nexport function videoCommand(): Command {\n return new Command(\"video\")\n .description(\n `Generate video with Grok Imagine Video (T2V / I2V).\n Async: submits generation, polls until done, downloads result.\n\n Examples:\n $ progrok video \"A cat playing piano\"\n $ progrok video \"Animate this photo\" --image photo.jpg\n $ progrok video \"prompt\" --model grok-imagine-video-1.5-preview --duration 10`,\n )\n .argument(\"<prompt>\", \"video generation prompt\")\n .option(\"--model <id>\", \"video model\", DEFAULT_VIDEO_MODEL)\n .option(\"--duration <s>\", \"duration in seconds (1-15)\", \"5\")\n .option(\"--aspect <ratio>\", \"aspect ratio\", \"16:9\")\n .option(\"--resolution <r>\", \"480p or 720p\", \"480p\")\n .option(\"--image <path>\", \"source image for image-to-video\")\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--timeout <s>\", \"polling timeout in seconds\", \"600\")\n .action(async (prompt: string, opts: VideoOptions) => {\n try {\n const bearer = await getValidBearer();\n const duration = parseInt(opts.duration ?? \"5\", 10);\n const timeout = parseInt(opts.timeout ?? \"600\", 10) * 1000;\n\n // Build request body\n const body: Record<string, unknown> = {\n model: opts.model ?? DEFAULT_VIDEO_MODEL,\n prompt,\n duration,\n aspect_ratio: opts.aspect ?? \"16:9\",\n resolution: opts.resolution ?? \"480p\",\n };\n\n // I2V: attach source image\n if (opts.image) {\n const uri = opts.image.startsWith(\"data:\")\n ? opts.image\n : imageToDataUri(opts.image);\n body.image = { url: uri };\n } else if (\n opts.model?.includes(\"1.5\") &&\n !opts.image\n ) {\n // Video 1.5 T2V workaround: inject white canvas\n body.image = { url: WHITE_PIXEL_PNG };\n body.prompt = `${prompt}\\n\\nThis is not a start frame — generate freely as a new video.`;\n }\n\n // Submit generation\n const res = await fetch(`${XAI_API_BASE_URL}/videos/generations`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`HTTP ${res.status}: ${errBody.slice(0, 300)}`);\n }\n\n const { request_id } = (await res.json()) as { request_id: string };\n if (!opts.json) {\n log.info(`Video generation started (${request_id})`);\n log.dim(`Model: ${body.model} | ${duration}s | ${opts.aspect} | ${opts.resolution}`);\n }\n\n // Poll\n const deadline = Date.now() + timeout;\n let lastProgress = -1;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n\n const poll = await fetch(`${XAI_API_BASE_URL}/videos/${request_id}`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n\n if (!poll.ok) {\n throw new Error(`Poll HTTP ${poll.status}: ${(await poll.text()).slice(0, 200)}`);\n }\n\n const data = (await poll.json()) as {\n status: string;\n progress?: number;\n video?: { url: string; duration: number; respect_moderation: boolean };\n error?: { code: string; message: string };\n usage?: { cost_in_usd_ticks?: number };\n };\n\n if (data.status === \"done\" && data.video) {\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n // Download video\n const videoRes = await fetch(data.video.url);\n if (!videoRes.ok) throw new Error(`Download failed: HTTP ${videoRes.status}`);\n const videoBuffer = Buffer.from(await videoRes.arrayBuffer());\n\n const outPath = opts.output ?? `progrok-video-${request_id.slice(0, 8)}.mp4`;\n writeFileSync(outPath, videoBuffer);\n\n log.success(`\\nVideo saved: ${outPath}`);\n log.info(`Duration: ${data.video.duration}s`);\n if (data.usage?.cost_in_usd_ticks) {\n log.dim(`Cost: $${(data.usage.cost_in_usd_ticks / 10_000_000_000).toFixed(4)}`);\n }\n return;\n }\n\n if (data.status === \"failed\") {\n throw new Error(\n `Generation failed: ${data.error?.code ?? \"unknown\"} — ${data.error?.message ?? \"\"}`,\n );\n }\n\n if (data.status === \"expired\") {\n throw new Error(\"Generation expired\");\n }\n\n // Progress display\n if (!opts.json && data.progress !== undefined && data.progress !== lastProgress) {\n lastProgress = data.progress;\n process.stdout.write(`\\r Progress: ${Math.round(data.progress * 100)}%`);\n }\n }\n\n throw new Error(`Timeout after ${timeout / 1000}s — video still pending`);\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nconst DEFAULT_IMAGE_MODEL = \"grok-imagine-image\";\n\nexport interface ImageOptions {\n model?: string;\n aspect?: string;\n resolution?: string;\n ref?: string[];\n output?: string;\n json?: boolean;\n n?: string;\n}\n\nfunction imageToDataUri(filePath: string): string {\n const abs = resolve(filePath);\n const buf = readFileSync(abs);\n const ext = abs.toLowerCase().endsWith(\".png\") ? \"png\" : \"jpeg\";\n return `data:image/${ext};base64,${buf.toString(\"base64\")}`;\n}\n\nexport function imageCommand(): Command {\n return new Command(\"image\")\n .description(\n `Generate or edit images with Grok Imagine.\n\n Examples:\n $ progrok image \"A sunset over mountains\"\n $ progrok image \"Make it winter\" --ref photo.jpg\n $ progrok image \"prompt\" --model grok-imagine-image-quality --resolution 2k`,\n )\n .argument(\"<prompt>\", \"image generation/edit prompt\")\n .option(\"--model <id>\", \"image model\", DEFAULT_IMAGE_MODEL)\n .option(\"--aspect <ratio>\", \"aspect ratio (1:1, 16:9, 9:16, etc.)\", \"1:1\")\n .option(\"--resolution <r>\", \"1k or 2k\", \"1k\")\n .option(\"--ref <path>\", \"reference image(s) for editing (repeatable)\", collectRefs, [])\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--n <count>\", \"number of images\", \"1\")\n .action(async (prompt: string, opts: ImageOptions) => {\n try {\n const bearer = await getValidBearer();\n const refs = opts.ref ?? [];\n const n = parseInt(opts.n ?? \"1\", 10);\n const isEdit = refs.length > 0;\n\n const endpoint = isEdit ? \"images/edits\" : \"images/generations\";\n\n const body: Record<string, unknown> = {\n model: opts.model ?? DEFAULT_IMAGE_MODEL,\n prompt,\n n,\n response_format: \"b64_json\",\n aspect_ratio: opts.aspect ?? \"1:1\",\n resolution: opts.resolution ?? \"1k\",\n };\n\n if (isEdit) {\n if (refs.length === 1) {\n body.image = { type: \"image_url\", url: imageToDataUri(refs[0]) };\n } else {\n body.images = refs.map((r) => ({ type: \"image_url\", url: imageToDataUri(r) }));\n }\n }\n\n const res = await fetch(`${XAI_API_BASE_URL}/${endpoint}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`HTTP ${res.status}: ${errBody.slice(0, 300)}`);\n }\n\n const data = (await res.json()) as {\n data: { b64_json?: string; url?: string; revised_prompt?: string }[];\n usage?: { cost_in_usd_ticks?: number };\n };\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n for (let i = 0; i < data.data.length; i++) {\n const item = data.data[i];\n if (item.b64_json) {\n const suffix = data.data.length > 1 ? `-${i + 1}` : \"\";\n const outPath = opts.output\n ? opts.output.replace(/(\\.\\w+)$/, `${suffix}$1`)\n : `progrok-image${suffix}.png`;\n writeFileSync(outPath, Buffer.from(item.b64_json, \"base64\"));\n log.success(`Image saved: ${outPath}`);\n } else if (item.url) {\n log.info(`Image URL: ${item.url}`);\n }\n if (item.revised_prompt) {\n log.dim(`Revised: ${item.revised_prompt.slice(0, 100)}`);\n }\n }\n\n if (data.usage?.cost_in_usd_ticks) {\n log.dim(`Cost: $${(data.usage.cost_in_usd_ticks / 10_000_000_000).toFixed(4)}`);\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\nfunction collectRefs(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n mkdirSync,\n} from \"node:fs\";\nimport { CONFIG_DIR, CONFIG_FILE } from \"../auth/constants.js\";\n\ninterface AppConfig {\n onboarding?: {\n starPrompted?: boolean;\n };\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function readConfig(): AppConfig {\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf8\")) as AppConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n ensureConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n","import { GITHUB_URL } from \"../auth/constants.js\";\nimport { readConfig, writeConfig } from \"./config.js\";\nimport { log } from \"./logger.js\";\n\nexport async function showStarPrompt(): Promise<void> {\n const config = readConfig();\n if (config.onboarding?.starPrompted) return;\n\n log.dim(\"─\".repeat(50));\n log.info(\"⭐ If progrok is useful, star the repo!\");\n log.dim(` ${GITHUB_URL}`);\n log.dim(\"─\".repeat(50) + \"\\n\");\n\n writeConfig({\n ...config,\n onboarding: { ...config.onboarding, starPrompted: true },\n });\n}\n"],"mappings":"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","names":["Command","resolve","resolve","Command","Command","Command","resolve","Command","Command","express","join","join","express","resolve","Command","Command","Command","res","data","Command","Command","Command","existsSync","readFileSync","fileURLToPath","dirname","join","subcommand","Command","readFileSync","fileURLToPath","dirname","join","ROOT","join","dirname","fileURLToPath","readPackageVersion","readFileSync","Command","Command","Command","Command","readFileSync","writeFileSync","Command","Command","readFileSync","writeFileSync","resolve","imageToDataUri","Command","readFileSync","writeFileSync","existsSync","mkdirSync","ensureConfigDir","existsSync","mkdirSync","readFileSync","writeFileSync","readFileSync","fileURLToPath","dirname","join","__dirname","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/auth/pkce.ts","../src/auth/constants.ts","../src/auth/discovery.ts","../src/auth/callback-server.ts","../src/auth/token-store.ts","../src/utils/logger.ts","../src/utils/open-url.ts","../src/auth/device-code.ts","../src/commands/logout.ts","../src/commands/proxy.ts","../src/proxy/server.ts","../src/commands/chat.ts","../src/chat/server.ts","../src/commands/models.ts","../src/commands/status.ts","../src/commands/skill.ts","../src/commands/capabilities.ts","../src/commands/search.ts","../src/commands/video.ts","../src/commands/image.ts","../src/utils/config.ts","../src/utils/star-prompt.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { loginCommand } from \"./commands/login.js\";\nimport { logoutCommand } from \"./commands/logout.js\";\nimport { proxyCommand } from \"./commands/proxy.js\";\nimport { chatCommand } from \"./commands/chat.js\";\nimport { modelsCommand } from \"./commands/models.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { skillCommand } from \"./commands/skill.js\";\nimport { capabilitiesCommand } from \"./commands/capabilities.js\";\nimport { searchCommand } from \"./commands/search.js\";\nimport { videoCommand } from \"./commands/video.js\";\nimport { imageCommand } from \"./commands/image.js\";\nimport { showStarPrompt } from \"./utils/star-prompt.js\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf8\"),\n ) as { version: string };\n return pkg.version;\n } catch {\n return \"0.0.0\";\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"progrok\")\n .description(\n `Activate your xAI OAuth session as a local Grok API proxy and CLI tool surface.\n\n SuperGrok OAuth → local proxy → OpenAI-compatible API for any client.\n All xAI endpoints forwarded: responses, chat, images, video, tts, stt.\n\n Quick start:\n $ progrok login # OAuth via browser (or --device-code for SSH)\n $ progrok proxy # Start proxy on 127.0.0.1:18645\n $ curl localhost:18645/v1/chat/completions -d '{\"model\":\"grok-4.3\",...}'\n\n Proxy forwards ALL /v1/* paths to api.x.ai — no whitelist.\n Supported xAI surfaces:\n /v1/responses Responses API (streaming, tools, reasoning)\n /v1/chat/completions OpenAI-compatible chat\n /v1/models Model list\n /v1/language-models Detailed models (pricing, aliases, modalities)\n /v1/images/generations Image generation (grok-imagine-image)\n /v1/videos/generations Video generation (async, poll /v1/videos/{id})\n /v1/tts Text-to-speech\n /v1/stt Speech-to-text\n /v1/batch/completions Batch processing\n /v1/embeddings Embeddings`,\n )\n .version(getVersion());\n\nprogram.addCommand(loginCommand());\nprogram.addCommand(logoutCommand());\nprogram.addCommand(proxyCommand());\nprogram.addCommand(chatCommand());\nprogram.addCommand(modelsCommand());\nprogram.addCommand(statusCommand());\nprogram.addCommand(skillCommand());\nprogram.addCommand(capabilitiesCommand());\nprogram.addCommand(searchCommand());\nprogram.addCommand(videoCommand());\nprogram.addCommand(imageCommand());\n\nconst REAL_COMMANDS = new Set([\"login\", \"logout\", \"proxy\", \"chat\", \"models\", \"status\", \"skill\", \"capabilities\", \"search\", \"video\", \"image\"]);\nconst subcommand = process.argv[2];\nif (subcommand && REAL_COMMANDS.has(subcommand)) {\n await showStarPrompt();\n}\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { loginWithPKCE } from \"../auth/pkce.js\";\nimport { loginWithDeviceCode } from \"../auth/device-code.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function loginCommand(): Command {\n const cmd = new Command(\"login\")\n .description(\n `Log in to xAI via OAuth (SuperGrok subscription required).\n Default: device-code flow — displays URL + code for manual entry.\n Browser: --browser — opens browser, callback on 127.0.0.1:56121.\n Manual: --manual-paste — PKCE flow but paste the callback code manually.\n Tokens saved to ~/.progrok/auth.json, auto-refreshed before expiry.`,\n )\n .option(\n \"--device-code\",\n \"Use device code flow (default)\",\n )\n .option(\n \"--browser\",\n \"Use PKCE browser flow with loopback callback\",\n )\n .option(\n \"--manual-paste\",\n \"Use PKCE flow but paste the authorization code manually\",\n )\n .action(async (opts: { deviceCode?: boolean; browser?: boolean; manualPaste?: boolean }) => {\n try {\n if (opts.browser) {\n await loginWithPKCE();\n } else if (opts.manualPaste) {\n await loginWithPKCE({ manualPaste: true });\n } else {\n await loginWithDeviceCode();\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n return cmd;\n}\n","import { randomBytes, createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline\";\nimport {\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_SCOPE,\n XAI_OAUTH_REDIRECT_URI,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\nimport { fetchOIDCDiscovery } from \"./discovery.js\";\nimport { startCallbackServer } from \"./callback-server.js\";\nimport { saveTokens } from \"./token-store.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { log } from \"../utils/logger.js\";\n\nfunction generatePKCE(): { verifier: string; challenge: string } {\n const verifier = randomBytes(32).toString(\"hex\");\n const challenge = createHash(\"sha256\")\n .update(verifier)\n .digest(\"base64url\");\n return { verifier, challenge };\n}\n\ninterface PKCEOptions {\n manualPaste?: boolean;\n}\n\nfunction extractCodeFromInput(input: string): string | null {\n const trimmed = input.trim();\n // Full callback URL: http://127.0.0.1:56121/callback?code=XXX&state=YYY\n try {\n const url = new URL(trimmed);\n const code = url.searchParams.get(\"code\");\n if (code) return code;\n } catch { /* not a URL */ }\n // Query fragment: ?code=XXX&state=YYY\n if (trimmed.startsWith(\"?\")) {\n const params = new URLSearchParams(trimmed.slice(1));\n const code = params.get(\"code\");\n if (code) return code;\n }\n // Bare code (no whitespace, no = sign typically)\n if (trimmed.length > 10 && !trimmed.includes(\" \")) return trimmed;\n return null;\n}\n\nasync function promptForCode(): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve, reject) => {\n rl.question(\"\\n Paste the callback URL or authorization code: \", (answer) => {\n rl.close();\n const code = extractCodeFromInput(answer);\n if (!code) {\n reject(new Error(\"Could not extract authorization code from input.\"));\n } else {\n resolve(code);\n }\n });\n });\n}\n\nexport async function loginWithPKCE(options: PKCEOptions = {}): Promise<void> {\n const discovery = await fetchOIDCDiscovery();\n const pkce = generatePKCE();\n const state = randomBytes(16).toString(\"hex\");\n\n const authorizeUrl = new URL(discovery.authorizationEndpoint);\n authorizeUrl.searchParams.set(\"client_id\", XAI_OAUTH_CLIENT_ID);\n authorizeUrl.searchParams.set(\"redirect_uri\", XAI_OAUTH_REDIRECT_URI);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"scope\", XAI_OAUTH_SCOPE);\n authorizeUrl.searchParams.set(\"state\", state);\n authorizeUrl.searchParams.set(\"code_challenge\", pkce.challenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\n let code: string;\n\n if (options.manualPaste) {\n log.info(\"Opening browser for xAI login (manual-paste mode)...\");\n log.dim(\n `Visit this URL to authorize:\\n${authorizeUrl.toString()}`,\n );\n log.dim(\n `\\nAfter approving, paste the callback URL or the authorization code shown on the page.`,\n );\n await openUrl(authorizeUrl.toString());\n code = await promptForCode();\n } else {\n log.info(\"Opening browser for xAI login...\");\n log.dim(\n `If the browser doesn't open, visit:\\n${authorizeUrl.toString()}`,\n );\n const callbackPromise = startCallbackServer(state);\n await openUrl(authorizeUrl.toString());\n const result = await callbackPromise;\n code = result.code;\n }\n\n log.info(\"Exchanging authorization code...\");\n\n const tokenRes = await fetch(discovery.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: XAI_OAUTH_CLIENT_ID,\n code,\n redirect_uri: XAI_OAUTH_REDIRECT_URI,\n code_verifier: pkce.verifier,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!tokenRes.ok) {\n const err = await tokenRes.text();\n throw new Error(`Token exchange failed: ${err}`);\n }\n\n const tokens = (await tokenRes.json()) as Record<string, unknown>;\n\n await saveTokens({\n accessToken: tokens.access_token as string,\n refreshToken: tokens.refresh_token as string | undefined,\n expiresIn: tokens.expires_in as number | undefined,\n idToken: tokens.id_token as string | undefined,\n tokenEndpoint: discovery.tokenEndpoint,\n });\n\n log.success(\"Logged in to xAI successfully!\");\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n// xAI shared OAuth Client (same as hermes-agent & openclaw — MIT licensed)\nexport const XAI_OAUTH_CLIENT_ID = \"b1a00492-073a-47ea-816f-4c329264a828\";\nexport const XAI_OAUTH_SCOPE =\n \"openid profile email offline_access grok-cli:access api:access\";\nexport const XAI_OAUTH_ISSUER = \"https://auth.x.ai\";\nexport const XAI_OAUTH_DISCOVERY_URL = `${XAI_OAUTH_ISSUER}/.well-known/openid-configuration`;\n\n// OAuth callback (MUST match registered redirect URI)\nexport const XAI_OAUTH_CALLBACK_HOST = \"127.0.0.1\";\nexport const XAI_OAUTH_CALLBACK_PORT = 56121;\nexport const XAI_OAUTH_CALLBACK_PATH = \"/callback\";\nexport const XAI_OAUTH_REDIRECT_URI = `http://${XAI_OAUTH_CALLBACK_HOST}:${XAI_OAUTH_CALLBACK_PORT}${XAI_OAUTH_CALLBACK_PATH}`;\n\n// CORS origins for xAI auth\nexport const XAI_OAUTH_CORS_ORIGINS = [\"auth.x.ai\", \"accounts.x.ai\"];\n\n// Timeouts\nexport const XAI_OAUTH_TIMEOUT_MS = 5 * 60 * 1000;\nexport const XAI_OAUTH_FETCH_TIMEOUT_MS = 30 * 1000;\nexport const XAI_DEVICE_CODE_POLL_INTERVAL_MS = 5 * 1000;\n\n// Token refresh\nexport const TOKEN_REFRESH_SKEW_MS = 2 * 60 * 1000;\n\n// API\nexport const XAI_API_BASE_URL = \"https://api.x.ai/v1\";\nexport const DEFAULT_MODEL = \"grok-4.3\";\n\n// Proxy\nexport const PROXY_DEFAULT_PORT = 18645;\nexport const PROXY_DEFAULT_HOST = \"127.0.0.1\";\nexport const CHAT_DEFAULT_PORT = 18646;\n\n// Paths\nexport const CONFIG_DIR = join(homedir(), \".progrok\");\nexport const AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nexport const CONFIG_FILE = join(CONFIG_DIR, \"config.json\");\n\n// GitHub\nexport const GITHUB_REPO = \"lidge-jun/progrok\";\nexport const GITHUB_URL = `https://github.com/${GITHUB_REPO}`;\n","import {\n XAI_OAUTH_DISCOVERY_URL,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\n\nexport interface OIDCDiscovery {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n deviceAuthorizationEndpoint?: string;\n}\n\nfunction requireTrustedEndpoint(url: string, label: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"not HTTPS\");\n }\n if (parsed.hostname !== \"x.ai\" && !parsed.hostname.endsWith(\".x.ai\")) {\n throw new Error(\"not *.x.ai\");\n }\n return url;\n } catch {\n throw new Error(`OIDC discovery returned untrusted ${label}: ${url}`);\n }\n}\n\nexport async function fetchOIDCDiscovery(): Promise<OIDCDiscovery> {\n const res = await fetch(XAI_OAUTH_DISCOVERY_URL, {\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n throw new Error(`OIDC discovery failed: HTTP ${res.status}`);\n }\n\n const data = (await res.json()) as Record<string, unknown>;\n\n const authorizationEndpoint = requireTrustedEndpoint(\n data.authorization_endpoint as string,\n \"authorization_endpoint\",\n );\n const tokenEndpoint = requireTrustedEndpoint(\n data.token_endpoint as string,\n \"token_endpoint\",\n );\n const deviceAuthorizationEndpoint = data.device_authorization_endpoint\n ? requireTrustedEndpoint(\n data.device_authorization_endpoint as string,\n \"device_authorization_endpoint\",\n )\n : undefined;\n\n return { authorizationEndpoint, tokenEndpoint, deviceAuthorizationEndpoint };\n}\n","import { createServer, type Server } from \"node:http\";\nimport {\n XAI_OAUTH_CALLBACK_HOST,\n XAI_OAUTH_CALLBACK_PORT,\n XAI_OAUTH_CALLBACK_PATH,\n XAI_OAUTH_CORS_ORIGINS,\n XAI_OAUTH_TIMEOUT_MS,\n} from \"./constants.js\";\n\ninterface CallbackResult {\n code: string;\n state: string;\n}\n\nexport function startCallbackServer(\n expectedState: string,\n): Promise<CallbackResult> {\n return new Promise((resolve, reject) => {\n let server: Server | undefined;\n\n const timeout = setTimeout(() => {\n server?.close();\n reject(new Error(\"OAuth callback timed out (5 minutes)\"));\n }, XAI_OAUTH_TIMEOUT_MS);\n\n server = createServer((req, res) => {\n const url = new URL(\n req.url || \"/\",\n `http://${XAI_OAUTH_CALLBACK_HOST}`,\n );\n\n if (req.method === \"OPTIONS\") {\n const origin = req.headers.origin || \"\";\n try {\n const originHost = new URL(origin).hostname;\n if (XAI_OAUTH_CORS_ORIGINS.includes(originHost)) {\n res.writeHead(204, {\n \"Access-Control-Allow-Origin\": origin,\n \"Access-Control-Allow-Methods\": \"GET\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n });\n } else {\n res.writeHead(204);\n }\n } catch {\n res.writeHead(204);\n }\n res.end();\n return;\n }\n\n if (url.pathname !== XAI_OAUTH_CALLBACK_PATH) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n const desc = url.searchParams.get(\"error_description\") || error;\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n `<html><body><h2>Login failed</h2><p>${desc}</p><p>You can close this tab.</p></body></html>`,\n );\n clearTimeout(timeout);\n server?.close();\n reject(new Error(`OAuth error: ${desc}`));\n return;\n }\n\n if (!code || state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\"<html><body><h2>Invalid callback</h2></body></html>\");\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n `<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">` +\n `<h2>Logged in to progrok</h2>` +\n `<p>You can close this tab and return to the terminal.</p>` +\n `</body></html>`,\n );\n\n clearTimeout(timeout);\n server?.close();\n resolve({ code, state });\n });\n\n server.listen(XAI_OAUTH_CALLBACK_PORT, XAI_OAUTH_CALLBACK_HOST, () => {});\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n reject(new Error(`Callback server failed: ${err.message}`));\n });\n });\n}\n","import {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n unlinkSync,\n} from \"node:fs\";\nimport {\n CONFIG_DIR,\n AUTH_FILE,\n TOKEN_REFRESH_SKEW_MS,\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n} from \"./constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport interface TokenData {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n tokenEndpoint?: string;\n email?: string;\n idToken?: string;\n}\n\nexport interface SaveTokenInput {\n accessToken: string;\n refreshToken?: string;\n expiresIn?: number;\n idToken?: string;\n tokenEndpoint?: string;\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport async function saveTokens(input: SaveTokenInput): Promise<void> {\n ensureConfigDir();\n\n const data: TokenData = {\n accessToken: input.accessToken,\n refreshToken: input.refreshToken,\n expiresAt: input.expiresIn\n ? Date.now() + input.expiresIn * 1000\n : undefined,\n tokenEndpoint: input.tokenEndpoint,\n idToken: input.idToken,\n };\n\n if (input.idToken) {\n try {\n const parts = input.idToken.split(\".\");\n if (parts[1]) {\n const payload = JSON.parse(\n Buffer.from(parts[1], \"base64url\").toString(),\n ) as Record<string, unknown>;\n if (typeof payload.email === \"string\") {\n data.email = payload.email;\n }\n }\n } catch {\n /* ignore malformed JWT */\n }\n }\n\n writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), { mode: 0o600 });\n}\n\nexport function loadTokens(): TokenData | null {\n try {\n const raw = readFileSync(AUTH_FILE, \"utf8\");\n return JSON.parse(raw) as TokenData;\n } catch {\n return null;\n }\n}\n\nexport function deleteTokens(): void {\n try {\n unlinkSync(AUTH_FILE);\n } catch {\n /* ignore if not exists */\n }\n}\n\nexport async function getValidBearer(): Promise<string> {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n throw new Error(\"Not logged in. Run `progrok login` first.\");\n }\n\n if (\n tokens.expiresAt &&\n Date.now() + TOKEN_REFRESH_SKEW_MS >= tokens.expiresAt\n ) {\n if (!tokens.refreshToken || !tokens.tokenEndpoint) {\n throw new Error(\n \"Token expired and no refresh token available. Run `progrok login` again.\",\n );\n }\n\n log.dim(\"Refreshing access token...\");\n\n const res = await fetch(tokens.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: XAI_OAUTH_CLIENT_ID,\n refresh_token: tokens.refreshToken,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!res.ok) {\n throw new Error(\"Token refresh failed. Run `progrok login` again.\");\n }\n\n const refreshed = (await res.json()) as Record<string, unknown>;\n\n if (\n typeof refreshed.access_token !== \"string\" ||\n !refreshed.access_token\n ) {\n throw new Error(\n \"Token refresh returned invalid access_token. Run `progrok login` again.\",\n );\n }\n\n await saveTokens({\n accessToken: refreshed.access_token,\n refreshToken:\n (typeof refreshed.refresh_token === \"string\"\n ? refreshed.refresh_token\n : undefined) || tokens.refreshToken,\n expiresIn:\n typeof refreshed.expires_in === \"number\"\n ? refreshed.expires_in\n : undefined,\n tokenEndpoint: tokens.tokenEndpoint,\n });\n\n return refreshed.access_token;\n }\n\n return tokens.accessToken;\n}\n","const RESET = \"\\x1b[0m\";\nconst GREEN = \"\\x1b[32m\";\nconst RED = \"\\x1b[31m\";\nconst DIM = \"\\x1b[2m\";\nconst BOLD = \"\\x1b[1m\";\n\nexport const log = {\n info: (msg: string): void => {\n console.log(msg);\n },\n success: (msg: string): void => {\n console.log(`${GREEN}${msg}${RESET}`);\n },\n error: (msg: string): void => {\n console.error(`${RED}${msg}${RESET}`);\n },\n dim: (msg: string): void => {\n console.log(`${DIM}${msg}${RESET}`);\n },\n bold: (msg: string): void => {\n console.log(`${BOLD}${msg}${RESET}`);\n },\n};\n","import open from \"open\";\n\nexport async function openUrl(url: string): Promise<void> {\n try {\n await open(url);\n } catch {\n // Silently fail — URL is already printed to terminal\n }\n}\n","import {\n XAI_OAUTH_CLIENT_ID,\n XAI_OAUTH_SCOPE,\n XAI_OAUTH_FETCH_TIMEOUT_MS,\n XAI_DEVICE_CODE_POLL_INTERVAL_MS,\n} from \"./constants.js\";\nimport { fetchOIDCDiscovery } from \"./discovery.js\";\nimport { saveTokens } from \"./token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval?: number;\n}\n\nexport async function loginWithDeviceCode(): Promise<void> {\n const discovery = await fetchOIDCDiscovery();\n\n if (!discovery.deviceAuthorizationEndpoint) {\n throw new Error(\n \"xAI does not support device code flow via OIDC discovery\",\n );\n }\n\n log.info(\"Requesting device code...\");\n\n const dcRes = await fetch(discovery.deviceAuthorizationEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n client_id: XAI_OAUTH_CLIENT_ID,\n scope: XAI_OAUTH_SCOPE,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (!dcRes.ok) {\n throw new Error(`Device code request failed: ${await dcRes.text()}`);\n }\n\n const dc = (await dcRes.json()) as DeviceCodeResponse;\n\n const url = dc.verification_uri_complete || dc.verification_uri;\n log.info(`\\nOpen this URL in your browser:\\n ${url}\\n`);\n log.info(`Enter code: ${dc.user_code}\\n`);\n\n const intervalMs = Math.max(\n (dc.interval || 5) * 1000,\n XAI_DEVICE_CODE_POLL_INTERVAL_MS,\n );\n const deadline = Date.now() + dc.expires_in * 1000;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalMs));\n\n const pollRes = await fetch(discovery.tokenEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n client_id: XAI_OAUTH_CLIENT_ID,\n device_code: dc.device_code,\n }),\n signal: AbortSignal.timeout(XAI_OAUTH_FETCH_TIMEOUT_MS),\n });\n\n if (pollRes.ok) {\n const tokens = (await pollRes.json()) as Record<string, unknown>;\n await saveTokens({\n accessToken: tokens.access_token as string,\n refreshToken: tokens.refresh_token as string | undefined,\n expiresIn: tokens.expires_in as number | undefined,\n idToken: tokens.id_token as string | undefined,\n tokenEndpoint: discovery.tokenEndpoint,\n });\n log.success(\"Logged in to xAI successfully!\");\n return;\n }\n\n const err = (await pollRes.json()) as Record<string, string>;\n if (err.error === \"authorization_pending\") continue;\n if (err.error === \"slow_down\") {\n await new Promise((r) => setTimeout(r, 5000));\n continue;\n }\n throw new Error(\n `Device code poll failed: ${err.error_description || err.error}`,\n );\n }\n\n throw new Error(\"Device code expired. Please try again.\");\n}\n","import { Command } from \"commander\";\nimport { deleteTokens } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function logoutCommand(): Command {\n return new Command(\"logout\")\n .description(\"Remove stored xAI credentials\")\n .action(() => {\n deleteTokens();\n log.success(\"Logged out. Credentials removed.\");\n });\n}\n","import { Command } from \"commander\";\nimport { startProxy } from \"../proxy/server.js\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport {\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function proxyCommand(): Command {\n return new Command(\"proxy\")\n .description(\n `Start OpenAI-compatible proxy server for Grok.\n Forwards ALL /v1/* requests to api.x.ai with your OAuth token injected.\n Any client (curl, OpenAI SDK, LangChain, etc.) can connect — no API key needed.\n Supports streaming (SSE), multipart (stt), and binary responses (tts).`,\n )\n .option(\"-p, --port <port>\", \"Port number\", String(PROXY_DEFAULT_PORT))\n .option(\"--host <host>\", \"Host to bind\", PROXY_DEFAULT_HOST)\n .action(async (opts: { port: string; host: string }) => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.error(\"Not logged in. Run `progrok login` first.\");\n process.exit(1);\n }\n\n try {\n await startProxy(parseInt(opts.port, 10), opts.host);\n await new Promise(() => {});\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import express, { type Request, type Response } from \"express\";\nimport {\n XAI_API_BASE_URL,\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nconst HOP_BY_HOP = new Set([\n \"host\",\n \"content-length\",\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailers\",\n \"transfer-encoding\",\n \"upgrade\",\n \"authorization\",\n]);\n\nfunction filterHeaders(\n headers: Record<string, string | string[] | undefined>,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (!HOP_BY_HOP.has(key.toLowerCase()) && value) {\n out[key] = Array.isArray(value) ? value[0] : value;\n }\n }\n return out;\n}\n\nexport function createProxyApp(): express.Application {\n const app = express();\n\n app.get(\"/health\", (_req: Request, res: Response) => {\n res.json({ status: \"ok\", upstream: \"xAI Grok\", proxy: \"progrok\" });\n });\n\n app.all(\"/v1/*\", (req: Request, res: Response) => {\n void handleProxy(req, res);\n });\n\n return app;\n}\n\nasync function handleProxy(req: Request, res: Response): Promise<void> {\n const relPath = req.path.replace(/^\\/v1/, \"\");\n\n let bearer: string;\n try {\n bearer = await getValidBearer();\n } catch (err) {\n res.status(401).json({\n error: { message: (err as Error).message, type: \"auth_error\" },\n });\n return;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as string));\n }\n const body = Buffer.concat(chunks);\n\n const qs = req.url.includes(\"?\") ? \"?\" + req.url.split(\"?\")[1] : \"\";\n const upstreamUrl = `${XAI_API_BASE_URL}${relPath}${qs}`;\n const fwdHeaders = filterHeaders(\n req.headers as Record<string, string>,\n );\n fwdHeaders[\"Authorization\"] = `Bearer ${bearer}`;\n\n try {\n const upstream = await fetch(upstreamUrl, {\n method: req.method,\n headers: fwdHeaders,\n body: body.length > 0 ? body : undefined,\n });\n\n res.status(upstream.status);\n\n for (const [key, value] of upstream.headers) {\n const lower = key.toLowerCase();\n if (\n !HOP_BY_HOP.has(lower) &&\n lower !== \"content-encoding\" &&\n lower !== \"content-length\"\n ) {\n res.setHeader(key, value);\n }\n }\n\n if (upstream.body) {\n const reader = (\n upstream.body as ReadableStream<Uint8Array>\n ).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n } catch {\n /* stream interrupted */\n }\n }\n res.end();\n } catch (err) {\n if (!res.headersSent) {\n res.status(502).json({\n error: {\n message: `Upstream error: ${(err as Error).message}`,\n type: \"upstream_error\",\n },\n });\n }\n }\n}\n\nexport async function startProxy(\n port = PROXY_DEFAULT_PORT,\n host = PROXY_DEFAULT_HOST,\n): Promise<void> {\n const app = createProxyApp();\n\n return new Promise((resolve, reject) => {\n const server = app.listen(port, host, () => {\n log.success(\"progrok proxy running\");\n log.info(` Listening: http://${host}:${port}/v1`);\n log.info(` Forwarding: ${XAI_API_BASE_URL}`);\n log.dim(\n \" Client auth: any bearer token (proxy injects your OAuth credential)\",\n );\n log.info(\"\\nPress Ctrl+C to stop.\\n\");\n resolve();\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n reject(new Error(`Proxy failed to start: ${err.message}`));\n });\n\n process.on(\"SIGINT\", () => {\n log.info(\"\\nprogrok proxy stopped.\");\n server.close();\n process.exit(0);\n });\n });\n}\n","import { Command } from \"commander\";\nimport { startChat } from \"../chat/server.js\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport {\n CHAT_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n} from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function chatCommand(): Command {\n return new Command(\"chat\")\n .description(\n `Open Grok chat in your browser.\n Starts a web UI + proxy server on the same port.\n Features: sessions, markdown, code highlighting, tool results, model switching.\n Proxy is also available at the same port under /v1/*.`,\n )\n .option(\"-p, --port <port>\", \"Port number\", String(CHAT_DEFAULT_PORT))\n .option(\"--host <host>\", \"Host to bind\", PROXY_DEFAULT_HOST)\n .action(async (opts: { port: string; host: string }) => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.error(\"Not logged in. Run `progrok login` first.\");\n process.exit(1);\n }\n\n try {\n await startChat(parseInt(opts.port, 10), opts.host);\n await new Promise(() => {});\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import express from \"express\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createProxyApp } from \"../proxy/server.js\";\nimport { CHAT_DEFAULT_PORT, PROXY_DEFAULT_HOST } from \"../auth/constants.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { log } from \"../utils/logger.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport async function startChat(\n port = CHAT_DEFAULT_PORT,\n host = PROXY_DEFAULT_HOST,\n): Promise<void> {\n const app = createProxyApp();\n\n const publicDir = join(__dirname, \"public\");\n app.use(express.static(publicDir));\n\n app.get(\"/\", (_req, res) => {\n res.sendFile(join(publicDir, \"index.html\"));\n });\n\n return new Promise((resolve, reject) => {\n const server = app.listen(port, host, () => {\n const url = `http://${host}:${port}`;\n log.success(`progrok chat running at ${url}`);\n log.dim(`Proxy also available at ${url}/v1`);\n log.info(\"Press Ctrl+C to stop.\\n\");\n void openUrl(url);\n resolve();\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n reject(new Error(`Chat server failed: ${err.message}`));\n });\n\n process.on(\"SIGINT\", () => {\n log.info(\"\\nprogrok chat stopped.\");\n server.close();\n process.exit(0);\n });\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\ninterface LanguageModel {\n id: string;\n input_modalities?: string[];\n output_modalities?: string[];\n prompt_text_token_price?: number;\n completion_text_token_price?: number;\n aliases?: string[];\n}\n\ninterface SimpleModel {\n id: string;\n}\n\nfunction formatPrice(ticks: number | undefined): string {\n if (!ticks) return \"-\";\n // ticks = per-token price in 1e-10 USD; show per 1M tokens\n return `$${(ticks / 1e4).toFixed(2)}`;\n}\n\nexport function modelsCommand(): Command {\n return new Command(\"models\")\n .description(\"List available Grok models\")\n .option(\"--detail\", \"Show pricing and aliases from /v1/language-models\")\n .action(async (opts: { detail?: boolean }) => {\n try {\n const bearer = await getValidBearer();\n\n if (opts.detail) {\n const res = await fetch(`${XAI_API_BASE_URL}/language-models`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const data = (await res.json()) as { models: LanguageModel[] };\n\n log.info(\"Grok Models (detailed)\\n\");\n for (const m of data.models) {\n const input = (m.input_modalities || []).join(\", \");\n const inPrice = formatPrice(m.prompt_text_token_price);\n const outPrice = formatPrice(m.completion_text_token_price);\n console.log(` ${m.id}`);\n console.log(` Input: ${input} | Price: ${inPrice}/1M in, ${outPrice}/1M out`);\n if (m.aliases && m.aliases.length > 0) {\n console.log(` Aliases: ${m.aliases.slice(0, 5).join(\", \")}${m.aliases.length > 5 ? ` (+${m.aliases.length - 5} more)` : \"\"}`);\n }\n console.log();\n }\n return;\n }\n\n const res = await fetch(`${XAI_API_BASE_URL}/models`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n const data = (await res.json()) as { data: SimpleModel[] };\n\n log.info(\"Available Grok models:\\n\");\n for (const m of data.data) {\n const tag = m.id.includes(\"reasoning\")\n ? \" [reasoning]\"\n : m.id.includes(\"non-reasoning\")\n ? \" [fast]\"\n : m.id.includes(\"build\") || m.id.includes(\"code\")\n ? \" [code]\"\n : m.id.includes(\"imagine-video\")\n ? \" [video]\"\n : m.id.includes(\"imagine\")\n ? \" [image]\"\n : \"\";\n console.log(` ${m.id}${tag}`);\n }\n log.dim(\"\\n Use --detail for pricing and aliases\");\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { loadTokens } from \"../auth/token-store.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport function statusCommand(): Command {\n return new Command(\"status\")\n .description(\"Show authentication status\")\n .action(() => {\n const tokens = loadTokens();\n if (!tokens?.accessToken) {\n log.info(\"Status: Not logged in\");\n log.dim(\"Run `progrok login` to authenticate.\");\n return;\n }\n\n const expired =\n tokens.expiresAt !== undefined && Date.now() >= tokens.expiresAt;\n const hasRefresh = !!tokens.refreshToken;\n\n log.info(\"Status: Logged in\");\n if (tokens.email) log.info(` Account: ${tokens.email}`);\n if (tokens.expiresAt) {\n const remaining = Math.max(\n 0,\n Math.floor((tokens.expiresAt - Date.now()) / 60000),\n );\n log.info(\n ` Token: ${expired ? \"expired\" : `valid (${remaining} min remaining)`}`,\n );\n }\n log.info(` Refresh: ${hasRefresh ? \"available\" : \"none\"}`);\n });\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join, relative } from \"node:path\";\n\n// tsup bundles to dist/index.js → one level up is the project root\nconst ROOT = join(dirname(fileURLToPath(import.meta.url)), \"..\");\nconst SKILL_PATH = join(ROOT, \"skills\", \"progrok\", \"SKILL.md\");\nconst PACKAGE_PATH = join(ROOT, \"package.json\");\n\nfunction readPackageVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(PACKAGE_PATH, \"utf-8\")) as {\n version?: string;\n };\n return pkg.version || \"?\";\n } catch {\n return \"?\";\n }\n}\n\nfunction readSkill(): string {\n if (!existsSync(SKILL_PATH)) {\n console.error(`packaged skill not found: ${SKILL_PATH}`);\n process.exit(5);\n }\n return readFileSync(SKILL_PATH, \"utf-8\");\n}\n\nexport function skillCommand(): Command {\n return new Command(\"skill\")\n .description(\n `Print the packaged progrok Markdown skill for agents.\n Designed to be piped into agent context or read programmatically.`,\n )\n .argument(\"[subcommand]\", '\"path\" to print the resolved skill file path')\n .option(\"--json\", \"Output as JSON wrapper around the Markdown skill\")\n .action((subcommand: string | undefined, opts: { json?: boolean }) => {\n if (subcommand === \"path\") {\n console.log(SKILL_PATH);\n return;\n }\n\n const content = readSkill();\n\n if (opts.json) {\n console.log(\n JSON.stringify(\n {\n name: \"progrok\",\n format: \"markdown-skill\",\n formatVersion: \"1\",\n packageVersion: readPackageVersion(),\n path: relative(ROOT, SKILL_PATH),\n source: \"package\",\n content,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n console.log(content.replace(/\\n$/, \"\"));\n });\n}\n","import { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport {\n XAI_API_BASE_URL,\n DEFAULT_MODEL,\n PROXY_DEFAULT_PORT,\n PROXY_DEFAULT_HOST,\n CHAT_DEFAULT_PORT,\n} from \"../auth/constants.js\";\n\nconst ROOT = join(dirname(fileURLToPath(import.meta.url)), \"..\");\n\nfunction readPackageVersion(): string {\n try {\n const pkg = JSON.parse(\n readFileSync(join(ROOT, \"package.json\"), \"utf-8\"),\n ) as { version?: string };\n return pkg.version || \"?\";\n } catch {\n return \"?\";\n }\n}\n\n// Endpoint surface mirrors the xAI REST API (https://docs.x.ai). Every HTTP\n// /v1/* path is forwarded by the proxy verbatim. WebSocket (wss) endpoints and\n// the management-api.x.ai host are NOT proxied — see `limitations`.\nconst ENDPOINTS = [\n // Chat & Responses\n { category: \"chat\", method: \"POST\", path: \"/v1/chat/completions\", type: \"streaming\", description: \"OpenAI-compatible chat + image understanding\" },\n { category: \"chat\", method: \"POST\", path: \"/v1/responses\", type: \"streaming\", description: \"Responses API — tools, reasoning, citations, stateful\" },\n { category: \"chat\", method: \"POST\", path: \"/v1/responses/compact\", type: \"sync\", description: \"Context compaction — shrink history for reuse\" },\n { category: \"chat\", method: \"GET\", path: \"/v1/responses/{id}\", type: \"sync\", description: \"Retrieve a stored response (kept 30 days)\" },\n { category: \"chat\", method: \"DELETE\", path: \"/v1/responses/{id}\", type: \"sync\", description: \"Delete a stored response\" },\n { category: \"chat\", method: \"GET\", path: \"/v1/chat/deferred-completion/{id}\", type: \"poll\", description: \"Fetch a deferred completion (202 pending / 200 done)\" },\n // Images (Imagine API)\n { category: \"images\", method: \"POST\", path: \"/v1/images/generations\", type: \"sync\", description: \"Text-to-image — aspect_ratio, resolution 1k/2k, n, url|b64_json\" },\n { category: \"images\", method: \"POST\", path: \"/v1/images/edits\", type: \"sync\", description: \"Edit / multi-image compose — image{} or images[] + prompt\" },\n // Videos (Imagine API, async)\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/generations\", type: \"async\", description: \"T2V / I2V / R2V — duration 1-15s, resolution 480p/720p/1080p\" },\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/edits\", type: \"async\", description: \"Edit a source video by prompt\" },\n { category: \"videos\", method: \"POST\", path: \"/v1/videos/extensions\", type: \"async\", description: \"Extend a video (1-10s continuation)\" },\n { category: \"videos\", method: \"GET\", path: \"/v1/videos/{id}\", type: \"poll\", description: \"Poll generation: pending(progress) → done(video.url)\" },\n // Voice — HTTP\n { category: \"voice\", method: \"POST\", path: \"/v1/tts\", type: \"binary\", description: \"Text-to-speech — voice_id, output_format, speed, speech tags\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/tts/voices\", type: \"sync\", description: \"List built-in voices (ara, eve, leo, rex, sal)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/tts/voices/{voice_id}\", type: \"sync\", description: \"Get one built-in voice\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/stt\", type: \"multipart\", description: \"Speech-to-text — diarize, multichannel, keyterm, word timestamps\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/realtime/client_secrets\", type: \"sync\", description: \"Mint ephemeral token for browser Realtime/Voice Agent\" },\n { category: \"voice\", method: \"POST\", path: \"/v1/custom-voices\", type: \"multipart\", description: \"Clone a custom voice from reference audio (≤120s)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices\", type: \"sync\", description: \"List custom voices (paginated)\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Get one custom voice\" },\n { category: \"voice\", method: \"PATCH\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Update custom voice metadata\" },\n { category: \"voice\", method: \"DELETE\", path: \"/v1/custom-voices/{voice_id}\", type: \"sync\", description: \"Delete a custom voice\" },\n { category: \"voice\", method: \"GET\", path: \"/v1/custom-voices/{voice_id}/audio\", type: \"binary\", description: \"Download a custom voice's reference audio\" },\n // Models\n { category: \"models\", method: \"GET\", path: \"/v1/models\", type: \"sync\", description: \"List models (id + pricing)\" },\n { category: \"models\", method: \"GET\", path: \"/v1/models/{model_id}\", type: \"sync\", description: \"Get one model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/language-models\", type: \"sync\", description: \"Chat models with modalities + aliases + pricing\" },\n { category: \"models\", method: \"GET\", path: \"/v1/language-models/{model_id}\", type: \"sync\", description: \"Get one language model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/image-generation-models\", type: \"sync\", description: \"Image models with per-image pricing\" },\n { category: \"models\", method: \"GET\", path: \"/v1/image-generation-models/{model_id}\", type: \"sync\", description: \"Get one image model\" },\n { category: \"models\", method: \"GET\", path: \"/v1/video-generation-models\", type: \"sync\", description: \"Video models with modalities\" },\n { category: \"models\", method: \"GET\", path: \"/v1/video-generation-models/{model_id}\", type: \"sync\", description: \"Get one video model\" },\n // Batches\n { category: \"batches\", method: \"POST\", path: \"/v1/batches\", type: \"sync\", description: \"Create a batch\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches\", type: \"sync\", description: \"List batches\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}\", type: \"sync\", description: \"Get batch state\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}/requests\", type: \"sync\", description: \"List requests in a batch\" },\n { category: \"batches\", method: \"POST\", path: \"/v1/batches/{id}/requests\", type: \"sync\", description: \"Add requests to a batch\" },\n { category: \"batches\", method: \"GET\", path: \"/v1/batches/{id}/results\", type: \"sync\", description: \"List batch results\" },\n { category: \"batches\", method: \"POST\", path: \"/v1/batches/{id}:cancel\", type: \"sync\", description: \"Cancel all requests in a batch\" },\n // Files\n { category: \"files\", method: \"POST\", path: \"/v1/files\", type: \"multipart\", description: \"Upload a file (≤50MB) — referenced by file_id\" },\n { category: \"files\", method: \"GET\", path: \"/v1/files\", type: \"sync\", description: \"List files (AIP-160 filter, paginated)\" },\n { category: \"files\", method: \"GET\", path: \"/v1/files/{file_id}\", type: \"sync\", description: \"Get file metadata\" },\n { category: \"files\", method: \"DELETE\", path: \"/v1/files/{file_id}\", type: \"sync\", description: \"Delete a file\" },\n // Collections (search only via api.x.ai; management is on management-api.x.ai)\n { category: \"collections\", method: \"POST\", path: \"/v1/documents/search\", type: \"sync\", description: \"Semantic search over collections (RAG)\" },\n // Other\n { category: \"other\", method: \"GET\", path: \"/v1/api-key\", type: \"sync\", description: \"Inspect the active API key / ACLs\" },\n { category: \"other\", method: \"POST\", path: \"/v1/tokenize-text\", type: \"sync\", description: \"Tokenize text for a model\" },\n { category: \"other\", method: \"POST\", path: \"/v1/embeddings\", type: \"sync\", description: \"Text embeddings\" },\n { category: \"other\", method: \"*\", path: \"/v1/*\", type: \"passthrough\", description: \"Any other path forwarded to api.x.ai unchanged\" },\n] as const;\n\n// WebSocket endpoints — documented for completeness but NOT proxied by progrok\n// (the proxy handles HTTP only; connect directly with an ephemeral token).\nconst WEBSOCKET_ENDPOINTS = [\n { url: \"wss://api.x.ai/v1/realtime\", description: \"Voice Agent — realtime speech conversations + MCP tools\" },\n { url: \"wss://api.x.ai/v1/tts\", description: \"Streaming text-to-speech (incremental text → audio)\" },\n { url: \"wss://api.x.ai/v1/stt\", description: \"Streaming speech-to-text (binary audio → transcript)\" },\n] as const;\n\nexport function buildCapabilities() {\n return {\n ok: true,\n name: \"progrok\",\n version: readPackageVersion(),\n source: \"local\",\n upstream: XAI_API_BASE_URL,\n commands: [\n \"login\",\n \"logout\",\n \"proxy\",\n \"chat\",\n \"models\",\n \"status\",\n \"skill\",\n \"capabilities\",\n ],\n proxy: {\n host: PROXY_DEFAULT_HOST,\n port: PROXY_DEFAULT_PORT,\n baseUrl: `http://${PROXY_DEFAULT_HOST}:${PROXY_DEFAULT_PORT}/v1`,\n forwarding: \"all HTTP /v1/* paths — no whitelist\",\n },\n chat: {\n port: CHAT_DEFAULT_PORT,\n url: `http://${PROXY_DEFAULT_HOST}:${CHAT_DEFAULT_PORT}`,\n },\n defaults: {\n model: DEFAULT_MODEL,\n },\n endpoints: ENDPOINTS,\n websocketEndpoints: WEBSOCKET_ENDPOINTS,\n models: [\n {\n id: \"grok-4.3\",\n type: \"reasoning\",\n use: \"Flagship — chat, agentic tool calling, search, vision\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"1M tokens\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { configurable: true, nonReasoningMode: true, note: \"Supports non-reasoning mode for instant replies\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.3-latest\", \"grok-latest\", \"grok-4\", \"grok-4-latest\", \"grok-4-fast-reasoning\", \"grok-3\", \"grok-3-latest\", \"grok-3-mini\"],\n },\n {\n id: \"grok-4.20-0309-reasoning\",\n type: \"deep-reasoning\",\n use: \"Deep analysis, complex coding (legacy 4.20 line)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"high\"], default: \"low\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.20\", \"grok-4.20-reasoning\", \"grok-4.20-reasoning-latest\", \"grok-4.20-beta\", \"grok-4.20-beta-latest\"],\n },\n {\n id: \"grok-4.20-0309-non-reasoning\",\n type: \"fast\",\n use: \"Fast responses, no thinking overhead (legacy 4.20 line)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: false,\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\", \"function\"],\n aliases: [\"grok-4.20-non-reasoning\", \"grok-4.20-non-reasoning-latest\", \"grok-4.20-beta-non-reasoning\", \"grok-4.20-beta-latest-non-reasoning\"],\n },\n {\n id: \"grok-4.20-multi-agent-0309\",\n type: \"multi-agent\",\n use: \"Deep research — 4 or 16 parallel agents (beta)\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"200K+ (long-context pricing above 200K tokens)\",\n pricing: { inputPer1M: 1.25, cachedInputPer1M: 0.2, outputPer1M: 2.5, longContext: { thresholdTokens: 200000, inputPer1M: 2.5, cachedInputPer1M: 0.4, outputPer1M: 5.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"medium\", \"high\", \"xhigh\"], default: \"low\", note: \"effort selects agent count: low/medium=4, high/xhigh=16\" },\n structuredOutput: true,\n functionCalling: false,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"collections_search\", \"mcp\"],\n notes: \"Responses API / xAI SDK only — not Chat Completions. No client-side function calling. No max_tokens.\",\n aliases: [\"grok-4.20-multi-agent\", \"grok-4.20-multi-agent-latest\", \"grok-4.20-multi-agent-beta-latest\"],\n },\n {\n id: \"grok-build-0.1\",\n type: \"code\",\n use: \"Fast agentic coding\",\n input: [\"text\", \"image\"],\n output: [\"text\"],\n context: \"256K tokens\",\n pricing: { inputPer1M: 1.0, cachedInputPer1M: 0.2, outputPer1M: 2.0, longContext: { thresholdTokens: 200000, inputPer1M: 2.0, cachedInputPer1M: 0.4, outputPer1M: 4.0 }, searchPer1KSources: 25.0, unit: \"USD\" },\n reasoning: { effort: [\"low\", \"high\"], default: \"low\" },\n structuredOutput: true,\n functionCalling: true,\n tools: [\"web_search\", \"x_search\", \"code_interpreter\", \"function\"],\n aliases: [\"grok-code-fast-1\", \"grok-code-fast\", \"grok-code-fast-1-0825\"],\n },\n {\n id: \"grok-imagine-image\",\n type: \"image\",\n use: \"Fast image generation / editing\",\n input: [\"text\", \"image\"],\n output: [\"image\"],\n maxPromptLength: 8000,\n pricing: { perImage: 0.02, unit: \"USD\", note: \"1k or 2k resolution\" },\n aliases: [\"grok-imagine-image-2026-03-02\"],\n },\n {\n id: \"grok-imagine-image-quality\",\n type: \"image-hq\",\n use: \"High-quality image generation / editing\",\n input: [\"text\", \"image\"],\n output: [\"image\"],\n maxPromptLength: 8000,\n pricing: { perImage: 0.04, unit: \"USD\", note: \"1k or 2k resolution\" },\n aliases: [\"grok-imagine-image-quality-latest\", \"grok-imagine-image-pro\"],\n },\n {\n id: \"grok-imagine-video\",\n type: \"video\",\n use: \"Video generation / edit / extension (async)\",\n input: [\"text\", \"image\"],\n output: [\"video\"],\n pricing: { perSecond: 0.05, unit: \"USD\", note: \"480p or 720p\" },\n aliases: [],\n },\n {\n id: \"grok-imagine-video-1.5-preview\",\n type: \"video\",\n use: \"Video v1.5 (preview) — improved I2V, T2V via white-canvas workaround\",\n input: [\"text\", \"image\"],\n output: [\"video\"],\n pricing: { perSecond: 0.05, unit: \"USD\", note: \"480p or 720p, T2V needs image injection\" },\n aliases: [],\n },\n ],\n voiceModels: [\n { id: \"grok-voice-latest\", use: \"Voice Agent / realtime — recommended\" },\n { id: \"grok-voice-fast-1.0\", use: \"Lower-latency voice agent\" },\n { id: \"grok-voice-think-fast-1.0\", use: \"Reasoning-capable voice agent\" },\n ],\n voicePricing: {\n agentPerHour: 3.0,\n ttsPer1MChars: 15.0,\n sttBatchPerHour: 0.1,\n sttStreamingPerHour: 0.2,\n unit: \"USD\",\n },\n tools: [\n { type: \"web_search\", description: \"Web search + browse. Params: allowed_domains, excluded_domains, enable_image_understanding, enable_image_search\" },\n { type: \"x_search\", description: \"X (Twitter) search with citations\" },\n { type: \"code_interpreter\", description: \"Server-side Python execution (a.k.a. Code Execution)\" },\n { type: \"collections_search\", description: \"RAG over your uploaded collections\" },\n { type: \"mcp\", description: \"Remote MCP server. Params: server_url, server_label, allowed_tools, authorization, headers\" },\n { type: \"function\", description: \"Custom client-side function calling (max 128)\" },\n ],\n searchParameters: {\n mode: [\"off\", \"on\", \"auto\"],\n sources: [\"web\", \"x\", \"news\", \"rss\"],\n params: [\"from_date\", \"to_date\", \"max_search_results\", \"return_citations\"],\n },\n limitations: [\n \"WebSocket endpoints (wss /v1/realtime, /v1/tts, /v1/stt) are NOT proxied — connect directly with an ephemeral token from POST /v1/realtime/client_secrets.\",\n \"Collection management lives on management-api.x.ai (Management API key) and is not reachable through this proxy; only POST /v1/documents/search is.\",\n \"The multi-agent model requires the Responses API (not Chat Completions).\",\n ],\n guidance: {\n auth: \"Run `progrok login` once. progrok activates the local xAI OAuth session for clients and commands.\",\n proxy:\n \"`progrok proxy` forwards all HTTP /v1/* paths. Set OPENAI_BASE_URL=http://127.0.0.1:18645/v1 and OPENAI_API_KEY=anything.\",\n streaming:\n \"Use stream:true for responses/chat. The proxy passes SSE through verbatim.\",\n video:\n \"Video gen is async: POST /v1/videos/generations → poll GET /v1/videos/{id} until status=done.\",\n models:\n \"Use the bare model name or `<model>-latest` to auto-track the newest version; `<model>-<date>` pins a specific release.\",\n },\n };\n}\n\ntype Capabilities = ReturnType<typeof buildCapabilities>;\n\nfunction printText(cap: Capabilities): void {\n console.log(`progrok capabilities (${cap.source})`);\n console.log(`version: ${cap.version}`);\n console.log(`upstream: ${cap.upstream}`);\n console.log(\"\");\n console.log(`proxy: ${cap.proxy.baseUrl}`);\n console.log(`chat: ${cap.chat.url}`);\n console.log(`model: ${cap.defaults.model}`);\n console.log(\"\");\n console.log(\"endpoints (HTTP — proxied):\");\n let lastCategory = \"\";\n for (const ep of cap.endpoints) {\n if (ep.category !== lastCategory) {\n console.log(` [${ep.category}]`);\n lastCategory = ep.category;\n }\n const label = ` ${ep.method.padEnd(6)} ${ep.path.padEnd(38)}`;\n console.log(`${label} ${ep.description}`);\n }\n console.log(\"\");\n console.log(\"websocket (NOT proxied — connect directly):\");\n for (const ws of cap.websocketEndpoints) {\n console.log(` ${ws.url.padEnd(30)} ${ws.description}`);\n }\n console.log(\"\");\n console.log(\"models:\");\n for (const m of cap.models) {\n console.log(` ${m.id.padEnd(30)} ${m.use}`);\n }\n console.log(\"\");\n console.log(\"tools:\");\n for (const t of cap.tools) {\n console.log(` ${t.type.padEnd(20)} ${t.description}`);\n }\n console.log(\"\");\n console.log(\"limitations:\");\n for (const l of cap.limitations) {\n console.log(` - ${l}`);\n }\n console.log(\"\");\n console.log(`commands: ${cap.commands.join(\", \")}`);\n}\n\nexport function capabilitiesCommand(): Command {\n return new Command(\"capabilities\")\n .description(\"Print agent-friendly capability metadata.\")\n .option(\"--json\", \"Output as JSON\")\n .action((opts: { json?: boolean }) => {\n const cap = buildCapabilities();\n if (opts.json) {\n console.log(JSON.stringify(cap, null, 2));\n } else {\n printText(cap);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL, DEFAULT_MODEL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\n\nexport interface SearchOptions {\n web?: boolean;\n x?: boolean;\n json?: boolean;\n model?: string;\n reasoning?: string;\n}\n\ninterface ResponsesTool {\n type: \"web_search\" | \"x_search\";\n}\n\n/**\n * Default behaviour: search both web and X. If either --web or --x is given,\n * restrict to only the requested source(s).\n */\nexport function buildSearchTools(opts: { web?: boolean; x?: boolean }): ResponsesTool[] {\n const explicit = Boolean(opts.web || opts.x);\n const useWeb = explicit ? Boolean(opts.web) : true;\n const useX = explicit ? Boolean(opts.x) : true;\n const tools: ResponsesTool[] = [];\n if (useWeb) tools.push({ type: \"web_search\" });\n if (useX) tools.push({ type: \"x_search\" });\n return tools;\n}\n\ninterface Annotation {\n type?: string;\n url?: string;\n title?: string;\n}\ninterface OutputTextContent {\n type?: string;\n text?: string;\n annotations?: Annotation[];\n}\ninterface OutputItem {\n type?: string;\n content?: OutputTextContent[];\n action?: { type?: string; query?: string };\n}\ninterface ResponsesUsage {\n num_sources_used?: number;\n cost_in_usd_ticks?: number;\n server_side_tool_usage_details?: Record<string, number>;\n}\ninterface ResponsesData {\n output?: OutputItem[];\n usage?: ResponsesUsage;\n}\n\nexport interface SearchResult {\n answer: string;\n citations: { url: string; title: string }[];\n queries: string[];\n usage?: ResponsesUsage;\n}\n\n/** Parse the /v1/responses output array into a flat search result. */\nexport function extractSearchResult(data: ResponsesData): SearchResult {\n const citations: { url: string; title: string }[] = [];\n const queries: string[] = [];\n const seen = new Set<string>();\n let answer = \"\";\n\n for (const item of data.output ?? []) {\n if (item.type === \"message\") {\n for (const c of item.content ?? []) {\n if (c.type === \"output_text\" && c.text) {\n answer += c.text;\n for (const a of c.annotations ?? []) {\n if (a.type === \"url_citation\" && a.url && !seen.has(a.url)) {\n seen.add(a.url);\n citations.push({ url: a.url, title: a.title ?? \"\" });\n }\n }\n }\n }\n } else if (\n (item.type === \"web_search_call\" || item.type === \"x_search_call\") &&\n item.action?.query\n ) {\n queries.push(item.action.query);\n }\n }\n\n return { answer: answer.trim(), citations, queries, usage: data.usage };\n}\n\nexport function searchCommand(): Command {\n return new Command(\"search\")\n .description(\"Search the web and X with Grok — AI summary + citations (no API key)\")\n .argument(\"<query>\", \"what to search for\")\n .option(\"--web\", \"web search only (default: web + X)\")\n .option(\"--x\", \"X (Twitter) search only\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--model <id>\", \"model to use\", DEFAULT_MODEL)\n .option(\n \"--reasoning <effort>\",\n \"reasoning effort: none|low|medium|high|xhigh (xhigh = multi-agent 16)\",\n )\n .action(async (query: string, opts: SearchOptions) => {\n try {\n const VALID_EFFORTS = new Set([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"]);\n if (opts.reasoning && !VALID_EFFORTS.has(opts.reasoning)) {\n throw new Error(\n `invalid --reasoning '${opts.reasoning}'. use: none|low|medium|high|xhigh`,\n );\n }\n const tools = buildSearchTools(opts);\n const bearer = await getValidBearer();\n\n const res = await fetch(`${XAI_API_BASE_URL}/responses`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: opts.model ?? DEFAULT_MODEL,\n input: query,\n tools,\n stream: false,\n ...(opts.reasoning ? { reasoning: { effort: opts.reasoning } } : {}),\n }),\n });\n\n if (!res.ok) {\n const body = await res.text();\n throw new Error(`HTTP ${res.status}: ${body.slice(0, 300)}`);\n }\n\n const result = extractSearchResult((await res.json()) as ResponsesData);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n log.bold(`\\nSearch: ${query}\\n`);\n console.log(result.answer || \"(no answer returned)\");\n\n if (result.citations.length > 0) {\n log.dim(\"\\nSources:\");\n result.citations.forEach((c, i) => {\n console.log(` [${i + 1}] ${c.url}`);\n });\n }\n\n const d = result.usage?.server_side_tool_usage_details;\n if (d) {\n log.dim(\n `\\n(${d.web_search_calls ?? 0} web · ${d.x_search_calls ?? 0} X searches)`,\n );\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\n\nconst DEFAULT_VIDEO_MODEL = \"grok-imagine-video\";\nconst POLL_INTERVAL_MS = 5000;\n\n// 1x1 white PNG for video 1.5 T2V workaround\nconst WHITE_PIXEL_PNG =\n \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/58BAwAHBQKhPX8EOAAAAABJRU5ErkJggg==\";\n\nexport interface VideoOptions {\n model?: string;\n duration?: string;\n aspect?: string;\n resolution?: string;\n image?: string;\n output?: string;\n json?: boolean;\n timeout?: string;\n}\n\nexport interface VideoEditOptions {\n model?: string;\n video: string;\n output?: string;\n json?: boolean;\n timeout?: string;\n}\n\nexport interface VideoExtendOptions {\n model?: string;\n video: string;\n duration?: string;\n output?: string;\n json?: boolean;\n timeout?: string;\n}\n\nfunction imageToDataUri(filePath: string): string {\n const abs = resolve(filePath);\n const buf = readFileSync(abs);\n const ext = abs.toLowerCase().endsWith(\".png\") ? \"png\" : \"jpeg\";\n return `data:image/${ext};base64,${buf.toString(\"base64\")}`;\n}\n\nasync function pollUntilDone(requestId: string, bearer: string, timeout: number, json?: boolean): Promise<Record<string, unknown>> {\n const deadline = Date.now() + timeout;\n let lastProgress = -1;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n\n const poll = await fetch(`${XAI_API_BASE_URL}/videos/${requestId}`, {\n headers: { Authorization: `Bearer ${bearer}` },\n });\n\n if (!poll.ok) {\n throw new Error(`Poll HTTP ${poll.status}: ${(await poll.text()).slice(0, 200)}`);\n }\n\n const data = (await poll.json()) as Record<string, unknown>;\n const status = data.status as string;\n\n if (status === \"done\") return data;\n if (status === \"failed\") {\n const err = data.error as { code?: string; message?: string } | undefined;\n throw new Error(`Generation failed: ${err?.code ?? \"unknown\"} — ${err?.message ?? \"\"}`);\n }\n if (status === \"expired\") throw new Error(\"Generation expired\");\n\n if (!json && typeof data.progress === \"number\" && data.progress !== lastProgress) {\n lastProgress = data.progress as number;\n process.stdout.write(`\\r Progress: ${Math.round(lastProgress * 100)}%`);\n }\n }\n\n throw new Error(`Timeout after ${timeout / 1000}s — video still pending`);\n}\n\nasync function downloadAndSave(videoUrl: string, outPath: string): Promise<void> {\n const videoRes = await fetch(videoUrl);\n if (!videoRes.ok) throw new Error(`Download failed: HTTP ${videoRes.status}`);\n const videoBuffer = Buffer.from(await videoRes.arrayBuffer());\n writeFileSync(outPath, videoBuffer);\n}\n\nexport function videoCommand(): Command {\n const cmd = new Command(\"video\")\n .description(\n `Generate, edit, or extend video with Grok Imagine Video.\n\n Subcommands:\n generate (default) Text-to-video or image-to-video\n edit Edit existing video with text prompt (V2V)\n extend Continue video from its last frame\n\n Examples:\n $ progrok video \"A cat playing piano\"\n $ progrok video \"Animate this\" --image photo.jpg\n $ progrok video edit \"Make it sunset colors\" --video input.mp4\n $ progrok video extend \"Camera pulls back slowly\" --video input.mp4 --duration 5`,\n );\n\n // Default action: generate\n cmd\n .argument(\"[prompt]\", \"video generation prompt\")\n .option(\"--model <id>\", \"video model\", DEFAULT_VIDEO_MODEL)\n .option(\"--duration <s>\", \"duration in seconds (1-15)\", \"5\")\n .option(\"--aspect <ratio>\", \"aspect ratio\", \"16:9\")\n .option(\"--resolution <r>\", \"480p or 720p\", \"480p\")\n .option(\"--image <path>\", \"source image for image-to-video\")\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--timeout <s>\", \"polling timeout in seconds\", \"600\")\n .action(async (prompt: string | undefined, opts: VideoOptions) => {\n if (!prompt) { cmd.help(); return; }\n await generateAction(prompt, opts);\n });\n\n // Edit subcommand\n cmd\n .command(\"edit <prompt>\")\n .description(\"Edit existing video with a text prompt (real V2V). Model: grok-imagine-video only.\")\n .requiredOption(\"--video <url-or-path>\", \"source video URL or local .mp4 path\")\n .option(\"--model <id>\", \"video model (must be grok-imagine-video)\", DEFAULT_VIDEO_MODEL)\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--timeout <s>\", \"polling timeout in seconds\", \"600\")\n .action(async (prompt: string, opts: VideoEditOptions) => {\n await editAction(prompt, opts);\n });\n\n // Extend subcommand\n cmd\n .command(\"extend <prompt>\")\n .description(\"Extend video from its last frame. Model: grok-imagine-video only.\")\n .requiredOption(\"--video <url-or-path>\", \"source video URL or local .mp4 path\")\n .option(\"--model <id>\", \"video model (must be grok-imagine-video)\", DEFAULT_VIDEO_MODEL)\n .option(\"--duration <s>\", \"extension duration 2-10s (default 6)\", \"6\")\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--timeout <s>\", \"polling timeout in seconds\", \"600\")\n .action(async (prompt: string, opts: VideoExtendOptions) => {\n await extendAction(prompt, opts);\n });\n\n return cmd;\n}\n\nasync function generateAction(prompt: string, opts: VideoOptions): Promise<void> {\n try {\n const bearer = await getValidBearer();\n const duration = parseInt(opts.duration ?? \"5\", 10);\n const timeout = parseInt(opts.timeout ?? \"600\", 10) * 1000;\n\n const body: Record<string, unknown> = {\n model: opts.model ?? DEFAULT_VIDEO_MODEL,\n prompt,\n duration,\n aspect_ratio: opts.aspect ?? \"16:9\",\n resolution: opts.resolution ?? \"480p\",\n };\n\n if (opts.image) {\n const uri = opts.image.startsWith(\"data:\") ? opts.image : imageToDataUri(opts.image);\n body.image = { url: uri };\n } else if (opts.model?.includes(\"1.5\") && !opts.image) {\n body.image = { url: WHITE_PIXEL_PNG };\n body.prompt = `${prompt}\\n\\nThis is not a start frame — generate freely as a new video.`;\n }\n\n const res = await fetch(`${XAI_API_BASE_URL}/videos/generations`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${bearer}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`);\n\n const { request_id } = (await res.json()) as { request_id: string };\n if (!opts.json) {\n log.info(`Video generation started (${request_id})`);\n log.dim(`Model: ${body.model} | ${duration}s | ${opts.aspect} | ${opts.resolution}`);\n }\n\n const data = await pollUntilDone(request_id, bearer, timeout, opts.json);\n if (opts.json) { console.log(JSON.stringify(data, null, 2)); return; }\n\n const video = data.video as { url: string; duration: number } | undefined;\n if (!video) throw new Error(\"No video in response\");\n\n const outPath = opts.output ?? `progrok-video-${request_id.slice(0, 8)}.mp4`;\n await downloadAndSave(video.url, outPath);\n if (!opts.json) process.stdout.write(\"\\n\");\n log.success(`Video saved: ${outPath}`);\n log.info(`Duration: ${video.duration}s`);\n const usage = data.usage as { cost_in_usd_ticks?: number } | undefined;\n if (usage?.cost_in_usd_ticks) log.dim(`Cost: $${(usage.cost_in_usd_ticks / 10_000_000_000).toFixed(4)}`);\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function editAction(prompt: string, opts: VideoEditOptions): Promise<void> {\n try {\n const bearer = await getValidBearer();\n const timeout = parseInt(opts.timeout ?? \"600\", 10) * 1000;\n const model = opts.model ?? DEFAULT_VIDEO_MODEL;\n\n if (model.includes(\"1.5\")) {\n throw new Error(\"Video editing is only supported by grok-imagine-video (not 1.5-preview).\");\n }\n\n const videoUrl = opts.video.startsWith(\"http\") ? opts.video : (() => {\n throw new Error(\"--video must be a URL (local file upload not yet supported for editing).\");\n })();\n\n const res = await fetch(`${XAI_API_BASE_URL}/videos/edits`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${bearer}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ model, prompt, video: { url: videoUrl } }),\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`);\n\n const { request_id } = (await res.json()) as { request_id: string };\n if (!opts.json) {\n log.info(`Video edit started (${request_id})`);\n log.dim(`Model: ${model} | Edit: \"${prompt.slice(0, 60)}\"`);\n }\n\n const data = await pollUntilDone(request_id, bearer, timeout, opts.json);\n if (opts.json) { console.log(JSON.stringify(data, null, 2)); return; }\n\n const video = data.video as { url: string; duration: number } | undefined;\n if (!video) throw new Error(\"No video in response\");\n\n const outPath = opts.output ?? `progrok-edit-${request_id.slice(0, 8)}.mp4`;\n await downloadAndSave(video.url, outPath);\n if (!opts.json) process.stdout.write(\"\\n\");\n log.success(`Edited video saved: ${outPath}`);\n log.info(`Duration: ${video.duration}s`);\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function extendAction(prompt: string, opts: VideoExtendOptions): Promise<void> {\n try {\n const bearer = await getValidBearer();\n const timeout = parseInt(opts.timeout ?? \"600\", 10) * 1000;\n const duration = parseInt(opts.duration ?? \"6\", 10);\n const model = opts.model ?? DEFAULT_VIDEO_MODEL;\n\n if (model.includes(\"1.5\")) {\n throw new Error(\"Video extension is only supported by grok-imagine-video (not 1.5-preview).\");\n }\n if (duration < 2 || duration > 10) {\n throw new Error(\"Extension duration must be 2-10 seconds.\");\n }\n\n const videoUrl = opts.video.startsWith(\"http\") ? opts.video : (() => {\n throw new Error(\"--video must be a URL (local file upload not yet supported for extension).\");\n })();\n\n const res = await fetch(`${XAI_API_BASE_URL}/videos/extensions`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${bearer}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ model, prompt, duration, video: { url: videoUrl } }),\n });\n\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${(await res.text()).slice(0, 300)}`);\n\n const { request_id } = (await res.json()) as { request_id: string };\n if (!opts.json) {\n log.info(`Video extension started (${request_id})`);\n log.dim(`Model: ${model} | Extend: +${duration}s | \"${prompt.slice(0, 60)}\"`);\n }\n\n const data = await pollUntilDone(request_id, bearer, timeout, opts.json);\n if (opts.json) { console.log(JSON.stringify(data, null, 2)); return; }\n\n const video = data.video as { url: string; duration: number } | undefined;\n if (!video) throw new Error(\"No video in response\");\n\n const outPath = opts.output ?? `progrok-extend-${request_id.slice(0, 8)}.mp4`;\n await downloadAndSave(video.url, outPath);\n if (!opts.json) process.stdout.write(\"\\n\");\n log.success(`Extended video saved: ${outPath}`);\n log.info(`Total duration: ${video.duration}s (original + ${duration}s extension)`);\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport { getValidBearer } from \"../auth/token-store.js\";\nimport { XAI_API_BASE_URL } from \"../auth/constants.js\";\nimport { log } from \"../utils/logger.js\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nconst DEFAULT_IMAGE_MODEL = \"grok-imagine-image\";\n\nexport interface ImageOptions {\n model?: string;\n aspect?: string;\n resolution?: string;\n ref?: string[];\n output?: string;\n json?: boolean;\n n?: string;\n}\n\nfunction imageToDataUri(filePath: string): string {\n const abs = resolve(filePath);\n const buf = readFileSync(abs);\n const ext = abs.toLowerCase().endsWith(\".png\") ? \"png\" : \"jpeg\";\n return `data:image/${ext};base64,${buf.toString(\"base64\")}`;\n}\n\nexport function imageCommand(): Command {\n return new Command(\"image\")\n .description(\n `Generate or edit images with Grok Imagine.\n\n Examples:\n $ progrok image \"A sunset over mountains\"\n $ progrok image \"Make it winter\" --ref photo.jpg\n $ progrok image \"prompt\" --model grok-imagine-image-quality --resolution 2k`,\n )\n .argument(\"<prompt>\", \"image generation/edit prompt\")\n .option(\"--model <id>\", \"image model\", DEFAULT_IMAGE_MODEL)\n .option(\"--aspect <ratio>\", \"aspect ratio (1:1, 16:9, 9:16, etc.)\", \"1:1\")\n .option(\"--resolution <r>\", \"1k or 2k\", \"1k\")\n .option(\"--ref <path>\", \"reference image(s) for editing (repeatable)\", collectRefs, [])\n .option(\"--output <path>\", \"output file path\")\n .option(\"--json\", \"output structured JSON\")\n .option(\"--n <count>\", \"number of images\", \"1\")\n .action(async (prompt: string, opts: ImageOptions) => {\n try {\n const bearer = await getValidBearer();\n const refs = opts.ref ?? [];\n const n = parseInt(opts.n ?? \"1\", 10);\n const isEdit = refs.length > 0;\n\n const endpoint = isEdit ? \"images/edits\" : \"images/generations\";\n\n const body: Record<string, unknown> = {\n model: opts.model ?? DEFAULT_IMAGE_MODEL,\n prompt,\n n,\n response_format: \"b64_json\",\n aspect_ratio: opts.aspect ?? \"1:1\",\n resolution: opts.resolution ?? \"1k\",\n };\n\n if (isEdit) {\n if (refs.length === 1) {\n body.image = { type: \"image_url\", url: imageToDataUri(refs[0]) };\n } else {\n body.images = refs.map((r) => ({ type: \"image_url\", url: imageToDataUri(r) }));\n }\n }\n\n const res = await fetch(`${XAI_API_BASE_URL}/${endpoint}`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${bearer}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errBody = await res.text();\n throw new Error(`HTTP ${res.status}: ${errBody.slice(0, 300)}`);\n }\n\n const data = (await res.json()) as {\n data: { b64_json?: string; url?: string; revised_prompt?: string }[];\n usage?: { cost_in_usd_ticks?: number };\n };\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n for (let i = 0; i < data.data.length; i++) {\n const item = data.data[i];\n if (item.b64_json) {\n const suffix = data.data.length > 1 ? `-${i + 1}` : \"\";\n const outPath = opts.output\n ? opts.output.replace(/(\\.\\w+)$/, `${suffix}$1`)\n : `progrok-image${suffix}.png`;\n writeFileSync(outPath, Buffer.from(item.b64_json, \"base64\"));\n log.success(`Image saved: ${outPath}`);\n } else if (item.url) {\n log.info(`Image URL: ${item.url}`);\n }\n if (item.revised_prompt) {\n log.dim(`Revised: ${item.revised_prompt.slice(0, 100)}`);\n }\n }\n\n if (data.usage?.cost_in_usd_ticks) {\n log.dim(`Cost: $${(data.usage.cost_in_usd_ticks / 10_000_000_000).toFixed(4)}`);\n }\n } catch (err) {\n log.error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\nfunction collectRefs(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n mkdirSync,\n} from \"node:fs\";\nimport { CONFIG_DIR, CONFIG_FILE } from \"../auth/constants.js\";\n\ninterface AppConfig {\n onboarding?: {\n starPrompted?: boolean;\n };\n}\n\nfunction ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function readConfig(): AppConfig {\n try {\n return JSON.parse(readFileSync(CONFIG_FILE, \"utf8\")) as AppConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AppConfig): void {\n ensureConfigDir();\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });\n}\n","import { GITHUB_URL } from \"../auth/constants.js\";\nimport { readConfig, writeConfig } from \"./config.js\";\nimport { log } from \"./logger.js\";\n\nexport async function showStarPrompt(): Promise<void> {\n const config = readConfig();\n if (config.onboarding?.starPrompted) return;\n\n log.dim(\"─\".repeat(50));\n log.info(\"⭐ If progrok is useful, star the repo!\");\n log.dim(` ${GITHUB_URL}`);\n log.dim(\"─\".repeat(50) + \"\\n\");\n\n writeConfig({\n ...config,\n onboarding: { ...config.onboarding, starPrompted: true },\n });\n}\n"],"mappings":"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","names":["Command","resolve","resolve","Command","Command","Command","resolve","Command","Command","express","join","join","express","resolve","Command","Command","Command","res","data","Command","Command","Command","existsSync","readFileSync","fileURLToPath","dirname","join","subcommand","Command","readFileSync","fileURLToPath","dirname","join","ROOT","join","dirname","fileURLToPath","readPackageVersion","readFileSync","Command","Command","Command","Command","readFileSync","writeFileSync","Command","Command","readFileSync","writeFileSync","resolve","imageToDataUri","Command","readFileSync","writeFileSync","existsSync","mkdirSync","ensureConfigDir","existsSync","mkdirSync","readFileSync","writeFileSync","readFileSync","fileURLToPath","dirname","join","__dirname","Command"]}
|