aemeathcli 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,13 +6,11 @@ import './chunk-CS5X3BWX.js';
6
6
  import './chunk-HCIHOHLX.js';
7
7
  import { AuthenticationError } from './chunk-ZGOHARPV.js';
8
8
  import { logger } from './chunk-JAXXTYID.js';
9
- import { execFile, spawn } from 'child_process';
10
- import { promisify } from 'util';
11
9
  import { existsSync, readFileSync } from 'fs';
12
10
  import { join } from 'path';
13
11
  import { homedir } from 'os';
12
+ import { execa } from 'execa';
14
13
 
15
- var execFileAsync = promisify(execFile);
16
14
  var CLI_COMMAND = "kimi";
17
15
  function getKimiHome() {
18
16
  return process.env["KIMI_HOME"] ?? join(homedir(), ".kimi");
@@ -124,34 +122,20 @@ var KimiLogin = class {
124
122
  ...expiresAt !== void 0 ? { expiresAt } : {}
125
123
  };
126
124
  }
127
- spawnInteractive(command, args) {
128
- return new Promise((resolve, reject) => {
129
- const child = spawn(command, [...args], {
130
- stdio: "inherit",
131
- timeout: 3e5,
132
- shell: process.platform === "win32"
133
- });
134
- child.on("close", (code) => {
135
- if (code === 0) resolve();
136
- else reject(new Error(`Process exited with code ${String(code)}`));
137
- });
138
- child.on("error", reject);
139
- });
125
+ async spawnInteractive(command, args) {
126
+ await execa(command, [...args], { stdio: "inherit", timeout: 3e5 });
140
127
  }
141
128
  async isCliAvailable() {
142
129
  try {
143
- const cmd = process.platform === "win32" ? "where" : "which";
144
- await execFileAsync(cmd, [CLI_COMMAND], {
145
- timeout: 3e3,
146
- shell: process.platform === "win32"
147
- });
130
+ await execa(CLI_COMMAND, ["--help"], { timeout: 5e3, stdin: "ignore", stdout: "ignore", stderr: "ignore" });
148
131
  return true;
149
- } catch {
150
- return false;
132
+ } catch (error) {
133
+ const code = error.code;
134
+ return code !== "ENOENT";
151
135
  }
152
136
  }
153
137
  };
154
138
 
155
139
  export { KimiLogin };
156
- //# sourceMappingURL=kimi-login-ACZILPNS.js.map
157
- //# sourceMappingURL=kimi-login-ACZILPNS.js.map
140
+ //# sourceMappingURL=kimi-login-ZR74MIY4.js.map
141
+ //# sourceMappingURL=kimi-login-ZR74MIY4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/providers/kimi-login.ts"],"names":["expiresAt"],"mappings":"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","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"]}
@@ -1,6 +1,6 @@
1
- export { ProviderRegistry, createDefaultRegistry } from './chunk-KY4VCEES.js';
1
+ export { ProviderRegistry, createDefaultRegistry } from './chunk-ASGRGXYK.js';
2
2
  import './chunk-HCIHOHLX.js';
3
3
  import './chunk-ZGOHARPV.js';
4
4
  import './chunk-JAXXTYID.js';
5
- //# sourceMappingURL=registry-GV3OEDOO.js.map
6
- //# sourceMappingURL=registry-GV3OEDOO.js.map
5
+ //# sourceMappingURL=registry-OYWYT7WL.js.map
6
+ //# sourceMappingURL=registry-OYWYT7WL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"registry-GV3OEDOO.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"registry-OYWYT7WL.js"}
@@ -1,4 +1,4 @@
1
- export { SessionManager } from './chunk-P2QRN6I6.js';
1
+ export { SessionManager } from './chunk-VUG4IZ7J.js';
2
2
  import './chunk-I5PZ4JTS.js';
3
3
  import './chunk-4IJD72YB.js';
4
4
  import './chunk-CGEV3ARR.js';
@@ -8,5 +8,5 @@ import './chunk-CS5X3BWX.js';
8
8
  import './chunk-HCIHOHLX.js';
9
9
  import './chunk-ZGOHARPV.js';
10
10
  import './chunk-JAXXTYID.js';
11
- //# sourceMappingURL=session-manager-VKLCFZWT.js.map
12
- //# sourceMappingURL=session-manager-VKLCFZWT.js.map
11
+ //# sourceMappingURL=session-manager-NYB2RKMS.js.map
12
+ //# sourceMappingURL=session-manager-NYB2RKMS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"session-manager-VKLCFZWT.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"session-manager-NYB2RKMS.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aemeathcli",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Next-generation multi-model CLI coding tool with agent teams and split-panel coordination",
5
5
  "type": "module",
6
6
  "bin": {