aemeathcli 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{App-TE3JJKOW.js → App-FKRSMFMB.js} +9 -9
- package/dist/{App-TE3JJKOW.js.map → App-FKRSMFMB.js.map} +1 -1
- package/dist/{chunk-VUG4IZ7J.js → chunk-DMBPX3RG.js} +5 -5
- package/dist/{chunk-VUG4IZ7J.js.map → chunk-DMBPX3RG.js.map} +1 -1
- package/dist/{chunk-ASGRGXYK.js → chunk-RWCNNAL7.js} +3 -3
- package/dist/{chunk-ASGRGXYK.js.map → chunk-RWCNNAL7.js.map} +1 -1
- package/dist/cli.js +10 -10
- package/dist/{codex-login-DDJBCT43.js → codex-login-GZIFXUWD.js} +9 -8
- package/dist/codex-login-GZIFXUWD.js.map +1 -0
- package/dist/{gemini-login-YEPK6GGW.js → gemini-login-AZGL3CE7.js} +5 -6
- package/dist/gemini-login-AZGL3CE7.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/{kimi-login-ZR74MIY4.js → kimi-login-6LUWB7P6.js} +10 -9
- package/dist/kimi-login-6LUWB7P6.js.map +1 -0
- package/dist/{registry-OYWYT7WL.js → registry-AZ2LOHHJ.js} +3 -3
- package/dist/{registry-OYWYT7WL.js.map → registry-AZ2LOHHJ.js.map} +1 -1
- package/dist/{session-manager-NYB2RKMS.js → session-manager-XOMDMC77.js} +3 -3
- package/dist/{session-manager-NYB2RKMS.js.map → session-manager-XOMDMC77.js.map} +1 -1
- package/package.json +1 -1
- package/dist/codex-login-DDJBCT43.js.map +0 -1
- package/dist/gemini-login-YEPK6GGW.js.map +0 -1
- package/dist/kimi-login-ZR74MIY4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/providers/gemini-login.ts"],"names":[],"mappings":"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","file":"gemini-login-YEPK6GGW.js","sourcesContent":["/**\n * Gemini (Google) delegated authentication\n * Reads cached credentials from ~/.gemini/oauth_creds.json (shared with the Gemini CLI).\n * If not authenticated, opens a new terminal window running `gemini` for interactive login,\n * then polls for credentials to appear.\n */\n\nimport { readFileSync, existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execa } from \"execa\";\nimport type { ICredential } from \"../../types/index.js\";\nimport { AuthenticationError } from \"../../types/index.js\";\nimport { CredentialStore } from \"../credential-store.js\";\nimport { logger } from \"../../utils/index.js\";\n\n// ── Gemini CLI Token Paths ──────────────────────────────────────────────\n\nconst CLI_COMMAND = \"gemini\";\nconst LOGIN_POLL_INTERVAL_MS = 2_000;\nconst LOGIN_POLL_TIMEOUT_MS = 120_000;\n\nfunction getGeminiHome(): string {\n return process.env[\"GEMINI_HOME\"] ?? join(homedir(), \".gemini\");\n}\n\nfunction getOAuthCredsPath(): string {\n return join(getGeminiHome(), \"oauth_creds.json\");\n}\n\nfunction getGoogleAccountsPath(): string {\n return join(getGeminiHome(), \"google_accounts.json\");\n}\n\n// ── Read existing tokens from Gemini CLI cache ──────────────────────────\n\ninterface IGeminiOAuthCreds {\n readonly access_token?: string;\n readonly scope?: string;\n readonly token_type?: string;\n readonly id_token?: string;\n readonly expiry_date?: number;\n readonly refresh_token?: string;\n}\n\ninterface IGoogleAccounts {\n readonly active?: string;\n}\n\nfunction readOAuthCreds(): IGeminiOAuthCreds | undefined {\n const credsPath = getOAuthCredsPath();\n if (!existsSync(credsPath)) return undefined;\n try {\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IGeminiOAuthCreds;\n } catch {\n return undefined;\n }\n}\n\nfunction readGoogleAccounts(): IGoogleAccounts | undefined {\n const accountsPath = getGoogleAccountsPath();\n if (!existsSync(accountsPath)) return undefined;\n try {\n return JSON.parse(readFileSync(accountsPath, \"utf-8\")) as IGoogleAccounts;\n } catch {\n return undefined;\n }\n}\n\nfunction getCredsMtime(): number {\n const credsPath = getOAuthCredsPath();\n try {\n return statSync(credsPath).mtimeMs;\n } catch {\n return 0;\n }\n}\n\nfunction extractEmailFromIdToken(idToken: string): string | undefined {\n try {\n const payload = idToken.split(\".\")[1];\n if (!payload) return undefined;\n const decoded = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as { email?: string };\n return decoded.email;\n } catch {\n return undefined;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// ── Open a new terminal window cross-platform ───────────────────────────\n\nasync function openTerminalWithGemini(): Promise<void> {\n const platform = process.platform;\n\n if (platform === \"win32\") {\n // Windows: open a new PowerShell window running gemini\n await execa(\"cmd\", [\"/c\", \"start\", \"powershell\", \"-NoExit\", \"-Command\", \"gemini\"], {\n stdin: \"ignore\",\n stdout: \"ignore\",\n stderr: \"ignore\",\n });\n } else if (platform === \"darwin\") {\n // macOS: open a new Terminal.app window running gemini\n await execa(\"osascript\", [\n \"-e\",\n 'tell application \"Terminal\" to do script \"gemini\"',\n \"-e\",\n 'tell application \"Terminal\" to activate',\n ], {\n stdin: \"ignore\",\n stdout: \"ignore\",\n stderr: \"ignore\",\n });\n } else {\n // Linux: try common terminal emulators\n const terminals = [\n { cmd: \"gnome-terminal\", args: [\"--\", \"gemini\"] },\n { cmd: \"konsole\", args: [\"-e\", \"gemini\"] },\n { cmd: \"xfce4-terminal\", args: [\"-e\", \"gemini\"] },\n { cmd: \"xterm\", args: [\"-e\", \"gemini\"] },\n ];\n\n for (const terminal of terminals) {\n try {\n await execa(terminal.cmd, terminal.args, {\n stdin: \"ignore\",\n stdout: \"ignore\",\n stderr: \"ignore\",\n detached: true,\n });\n return;\n } catch {\n // Try next terminal\n }\n }\n\n throw new Error(\"Could not find a terminal emulator. Please run `gemini` manually in a separate terminal.\");\n }\n}\n\n// ── GeminiLogin Class ───────────────────────────────────────────────────\n\nexport class GeminiLogin {\n private readonly credentialStore: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n }\n\n /**\n * Attempt to import credentials from the Gemini CLI cache.\n * If not found, opens a new terminal window running `gemini` for interactive\n * login, then polls for credentials to appear in ~/.gemini/oauth_creds.json.\n */\n async login(): Promise<ICredential> {\n // Try importing existing credentials from Gemini CLI's cache\n const existing = this.readCachedCredential();\n if (existing) {\n const isExpired = existing.expiresAt ? new Date() > existing.expiresAt : false;\n if (!isExpired) {\n logger.info(\"Found existing Gemini CLI credentials in ~/.gemini/oauth_creds.json\");\n await this.credentialStore.set(\"google\", existing);\n return existing;\n }\n }\n\n // Check if the CLI is installed\n const cliAvailable = await this.isCliAvailable();\n\n if (!cliAvailable) {\n throw new AuthenticationError(\n \"google\",\n \"Gemini CLI not found. Install it first:\\n\" +\n \" npm install -g @google/gemini-cli\\n\" +\n \"Then retry /login.\",\n );\n }\n\n // Record the current mtime so we can detect new credentials\n const beforeMtime = getCredsMtime();\n\n // Open a new terminal window running gemini for interactive login\n logger.info(\"Opening new terminal window for Gemini login\");\n try {\n await openTerminalWithGemini();\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new AuthenticationError(\"google\", msg);\n }\n\n // Poll for credentials to appear (user authenticates in the other window)\n const credential = await this.pollForCredentials(beforeMtime);\n if (!credential) {\n throw new AuthenticationError(\n \"google\",\n \"Login timed out. Please complete authentication in the Gemini terminal, then retry /login.\",\n );\n }\n\n await this.credentialStore.set(\"google\", credential);\n logger.info(\"Gemini credentials imported successfully\");\n return credential;\n }\n\n async logout(): Promise<void> {\n await this.credentialStore.delete(\"google\");\n logger.info(\"Google session revoked from AemeathCLI\");\n }\n\n async isLoggedIn(): Promise<boolean> {\n const credential = this.readCachedCredential();\n if (!credential) return false;\n if (credential.expiresAt && new Date() > credential.expiresAt && credential.refreshToken === undefined) {\n return false;\n }\n\n await this.credentialStore.set(\"google\", credential);\n return true;\n }\n\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\n const loggedIn = await this.isLoggedIn();\n if (!loggedIn) return { loggedIn: false };\n\n const credential = await this.credentialStore.get(\"google\");\n if (!credential) return { loggedIn: false };\n\n return {\n loggedIn: true,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n plan: \"Google AI\",\n };\n }\n\n async getCachedCredential(): Promise<ICredential | undefined> {\n const credential = this.readCachedCredential();\n if (credential) {\n await this.credentialStore.set(\"google\", credential);\n }\n return credential;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private readCachedCredential(): ICredential | undefined {\n const oauthCreds = readOAuthCreds();\n if (!oauthCreds?.access_token) return undefined;\n\n let email: string | undefined;\n const accounts = readGoogleAccounts();\n if (accounts?.active) {\n email = accounts.active;\n } else if (oauthCreds.id_token) {\n email = extractEmailFromIdToken(oauthCreds.id_token);\n }\n\n const expiresAt = oauthCreds.expiry_date ? new Date(oauthCreds.expiry_date) : undefined;\n\n return {\n provider: \"google\",\n method: \"native_login\",\n token: oauthCreds.access_token,\n ...(oauthCreds.refresh_token !== undefined ? { refreshToken: oauthCreds.refresh_token } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(email !== undefined ? { email } : {}),\n plan: \"Google AI\",\n };\n }\n\n /**\n * Poll for new credentials to appear in ~/.gemini/oauth_creds.json.\n * Detects new credentials by checking if the file mtime changed from beforeMtime.\n */\n private async pollForCredentials(beforeMtime: number): Promise<ICredential | undefined> {\n const deadline = Date.now() + LOGIN_POLL_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n await sleep(LOGIN_POLL_INTERVAL_MS);\n\n const currentMtime = getCredsMtime();\n if (currentMtime > beforeMtime) {\n const credential = this.readCachedCredential();\n if (credential) return credential;\n }\n }\n\n // One final check\n return this.readCachedCredential() ?? undefined;\n }\n\n private async isCliAvailable(): Promise<boolean> {\n try {\n await execa(CLI_COMMAND, [\"--help\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\n return true;\n } catch (error: unknown) {\n const code = (error as { code?: string }).code;\n return code !== \"ENOENT\";\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/providers/kimi-login.ts"],"names":["expiresAt"],"mappings":";;;;;;;;;;;;;AAkBA,IAAM,WAAA,GAAc,MAAA;AAEpB,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO,QAAQ,GAAA,CAAI,WAAW,KAAK,IAAA,CAAK,OAAA,IAAW,OAAO,CAAA;AAC5D;AAEA,SAAS,kBAAA,GAA6B;AACpC,EAAA,OAAO,IAAA,CAAK,WAAA,EAAY,EAAG,aAAA,EAAe,gBAAgB,CAAA;AAC5D;AAYA,SAAS,mBAAA,GAAoD;AAC3D,EAAA,MAAM,YAAY,kBAAA,EAAmB;AACrC,EAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,MAAA;AACnC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAIO,IAAM,YAAN,MAAgB;AAAA,EACJ,eAAA;AAAA,EAEjB,YAAY,KAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA,IAAS,IAAI,eAAA,EAAgB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAA8B;AAElC,IAAA,MAAM,QAAA,GAAW,KAAK,qBAAA,EAAsB;AAC5C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AACjD,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAC/C,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,cAAA,EAAe;AAC/C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,MAAA;AAAA,QACA,yCAAA,IACC,OAAA,CAAQ,QAAA,KAAa,OAAA,GAClB,oDACA,6CAAA,CAAA,GACJ;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,CAAC,OAAO,CAAC,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,EAAE,CAAA;AAAA,MAC7C,SAAS,MAAA,EAAiB;AACxB,QAAA,MAAM,MAAM,MAAA,YAAkB,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,OAAO,MAAM,CAAA;AACpE,QAAA,MAAM,IAAI,mBAAA,CAAoB,MAAA,EAAQ,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,qBAAA,EAAsB;AAC9C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AACjD,IAAA,MAAA,CAAO,KAAK,wCAAwC,CAAA;AACpD,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AACxC,IAAA,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,UAAA,GAA+B;AACnC,IAAA,MAAM,UAAA,GAAa,KAAK,qBAAA,EAAsB;AAC9C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,GAAmG;AACvG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,EAAW;AACvC,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,UAAU,KAAA,EAAM;AAExC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,MAAM,CAAA;AACxD,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAE,UAAU,KAAA,EAAM;AAE1C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,GAAI,WAAW,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA,EAAM,GAAI;AAAC,KACtE;AAAA,EACF;AAAA,EAEA,MAAM,mBAAA,GAAwD;AAC5D,IAAA,MAAM,UAAA,GAAa,KAAK,qBAAA,EAAsB;AAC9C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA,EAIQ,qBAAA,GAAiD;AACvD,IAAA,MAAM,YAAY,mBAAA,EAAoB;AACtC,IAAA,IAAI,CAAC,SAAA,EAAW,YAAA,EAAc,OAAO,MAAA;AAGrC,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,MAAMA,UAAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,aAAa,GAAI,CAAA;AACtD,MAAA,wBAAQ,IAAA,EAAK,GAAIA,UAAAA,IAAa,CAAC,UAAU,aAAA,EAAe;AACtD,QAAA,MAAA,CAAO,MAAM,8CAA8C,CAAA;AAC3D,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,UAAU,UAAA,GACxB,IAAI,KAAK,SAAA,CAAU,UAAA,GAAa,GAAI,CAAA,GACpC,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,cAAA;AAAA,MACR,OAAO,SAAA,CAAU,YAAA;AAAA,MACjB,GAAI,UAAU,aAAA,KAAkB,MAAA,GAAY,EAAE,YAAA,EAAc,SAAA,CAAU,aAAA,EAAc,GAAI,EAAC;AAAA,MACzF,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC,KACjD;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,CAAiB,OAAA,EAAiB,IAAA,EAAwC;AACtF,IAAA,MAAM,KAAA,CAAM,OAAA,EAAS,CAAC,GAAG,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,GAAA,EAAS,CAAA;AAAA,EACxE;AAAA,EAEA,MAAc,cAAA,GAAmC;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,CAAM,WAAA,EAAa,CAAC,QAAQ,GAAG,EAAE,OAAA,EAAS,GAAA,EAAM,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA;AAC3G,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,OAAQ,KAAA,CAA4B,IAAA;AAC1C,MAAA,OAAO,IAAA,KAAS,QAAA;AAAA,IAClB;AAAA,EACF;AACF","file":"kimi-login-ZR74MIY4.js","sourcesContent":["/**\n * Kimi (Moonshot) delegated authentication\n * Reads cached credentials from Kimi CLI's ~/.kimi/credentials/kimi-code.json.\n * If not found, spawns `kimi` CLI for interactive login.\n * Kimi's login opens a browser automatically from its interactive session.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { execa } from \"execa\";\nimport type { ICredential } from \"../../types/index.js\";\nimport { AuthenticationError } from \"../../types/index.js\";\nimport { CredentialStore } from \"../credential-store.js\";\nimport { logger } from \"../../utils/index.js\";\n\n// ── Kimi CLI Token Paths ────────────────────────────────────────────────\n\nconst CLI_COMMAND = \"kimi\";\n\nfunction getKimiHome(): string {\n return process.env[\"KIMI_HOME\"] ?? join(homedir(), \".kimi\");\n}\n\nfunction getCredentialsPath(): string {\n return join(getKimiHome(), \"credentials\", \"kimi-code.json\");\n}\n\n// ── kimi-code.json Schema ───────────────────────────────────────────────\n\ninterface IKimiCredentials {\n readonly access_token?: string;\n readonly refresh_token?: string;\n readonly expires_at?: number;\n readonly scope?: string;\n readonly token_type?: string;\n}\n\nfunction readKimiCredentials(): IKimiCredentials | undefined {\n const credsPath = getCredentialsPath();\n if (!existsSync(credsPath)) return undefined;\n try {\n return JSON.parse(readFileSync(credsPath, \"utf-8\")) as IKimiCredentials;\n } catch {\n return undefined;\n }\n}\n\n// ── KimiLogin Class ─────────────────────────────────────────────────────\n\nexport class KimiLogin {\n private readonly credentialStore: CredentialStore;\n\n constructor(store?: CredentialStore) {\n this.credentialStore = store ?? new CredentialStore();\n }\n\n /**\n * Login via the Kimi CLI.\n * First checks for cached credentials. If not found, spawns the Kimi CLI\n * interactive session which handles browser-based login automatically.\n */\n async login(): Promise<ICredential> {\n // Check if already logged in via cached tokens\n const existing = this.readCachedCredentials();\n if (existing) {\n logger.info(\"Found existing Kimi CLI credentials\");\n await this.credentialStore.set(\"kimi\", existing);\n return existing;\n }\n\n // Check if the CLI is available\n const cliAvailable = await this.isCliAvailable();\n if (!cliAvailable) {\n throw new AuthenticationError(\n \"kimi\",\n \"Kimi CLI not found. Install it first:\\n\" +\n (process.platform === \"win32\"\n ? \" irm https://code.kimi.com/install.ps1 | iex\\n\"\n : \" curl -L code.kimi.com/install.sh | bash\\n\") +\n \"Or set an API key: aemeathcli auth set-key kimi <key>\",\n );\n }\n\n // Spawn kimi CLI — it handles login with browser automatically\n logger.info(\"Spawning Kimi CLI for login (browser will open automatically)\");\n try {\n await this.spawnInteractive(CLI_COMMAND, [\"login\"]);\n } catch {\n // Some versions may not have `kimi login` — try spawning interactive session\n try {\n await this.spawnInteractive(CLI_COMMAND, []);\n } catch (error2: unknown) {\n const msg = error2 instanceof Error ? error2.message : String(error2);\n throw new AuthenticationError(\"kimi\", `Kimi login failed: ${msg}`);\n }\n }\n\n // Read the freshly cached credentials\n const credential = this.readCachedCredentials();\n if (!credential) {\n throw new AuthenticationError(\n \"kimi\",\n \"No Kimi credentials found after login. Please try again or set an API key: aemeathcli auth set-key kimi <key>\",\n );\n }\n\n await this.credentialStore.set(\"kimi\", credential);\n logger.info(\"Kimi credentials imported successfully\");\n return credential;\n }\n\n async logout(): Promise<void> {\n await this.credentialStore.delete(\"kimi\");\n logger.info(\"Kimi session revoked from AemeathCLI\");\n }\n\n async isLoggedIn(): Promise<boolean> {\n const credential = this.readCachedCredentials();\n if (!credential) {\n return false;\n }\n\n await this.credentialStore.set(\"kimi\", credential);\n return true;\n }\n\n async getStatus(): Promise<{ loggedIn: boolean; email?: string | undefined; plan?: string | undefined }> {\n const loggedIn = await this.isLoggedIn();\n if (!loggedIn) return { loggedIn: false };\n\n const credential = await this.credentialStore.get(\"kimi\");\n if (!credential) return { loggedIn: false };\n\n return {\n loggedIn: true,\n ...(credential.email !== undefined ? { email: credential.email } : {}),\n };\n }\n\n async getCachedCredential(): Promise<ICredential | undefined> {\n const credential = this.readCachedCredentials();\n if (credential) {\n await this.credentialStore.set(\"kimi\", credential);\n }\n return credential;\n }\n\n // ── Internal ──────────────────────────────────────────────────────────\n\n private readCachedCredentials(): ICredential | undefined {\n const kimiCreds = readKimiCredentials();\n if (!kimiCreds?.access_token) return undefined;\n\n // Check expiry (expires_at is seconds since epoch)\n if (kimiCreds.expires_at) {\n const expiresAt = new Date(kimiCreds.expires_at * 1000);\n if (new Date() > expiresAt && !kimiCreds.refresh_token) {\n logger.debug(\"Kimi CLI token expired with no refresh token\");\n return undefined;\n }\n }\n\n const expiresAt = kimiCreds.expires_at\n ? new Date(kimiCreds.expires_at * 1000)\n : undefined;\n\n return {\n provider: \"kimi\",\n method: \"native_login\",\n token: kimiCreds.access_token,\n ...(kimiCreds.refresh_token !== undefined ? { refreshToken: kimiCreds.refresh_token } : {}),\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n };\n }\n\n private async spawnInteractive(command: string, args: readonly string[]): Promise<void> {\n await execa(command, [...args], { stdio: \"inherit\", timeout: 300_000 });\n }\n\n private async isCliAvailable(): Promise<boolean> {\n try {\n await execa(CLI_COMMAND, [\"--help\"], { timeout: 5000, stdin: \"ignore\", stdout: \"ignore\", stderr: \"ignore\" });\n return true;\n } catch (error: unknown) {\n const code = (error as { code?: string }).code;\n return code !== \"ENOENT\";\n }\n }\n}\n"]}
|