@vybestack/llxprt-code-core 0.3.4 → 0.4.1-nightly.250923.fc764b9f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.js +4 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/auth/types.d.ts +2 -2
  6. package/dist/src/code_assist/codeAssist.d.ts +9 -2
  7. package/dist/src/code_assist/codeAssist.js +33 -0
  8. package/dist/src/code_assist/codeAssist.js.map +1 -1
  9. package/dist/src/code_assist/oauth2.d.ts +4 -0
  10. package/dist/src/code_assist/oauth2.js +102 -42
  11. package/dist/src/code_assist/oauth2.js.map +1 -1
  12. package/dist/src/config/config.d.ts +11 -1
  13. package/dist/src/config/config.js +62 -8
  14. package/dist/src/config/config.js.map +1 -1
  15. package/dist/src/core/client.d.ts +2 -2
  16. package/dist/src/core/client.js +10 -12
  17. package/dist/src/core/client.js.map +1 -1
  18. package/dist/src/core/contentGenerator.d.ts +2 -2
  19. package/dist/src/core/geminiChat.d.ts +14 -1
  20. package/dist/src/core/geminiChat.js +12 -1
  21. package/dist/src/core/geminiChat.js.map +1 -1
  22. package/dist/src/core/loggingContentGenerator.js +11 -11
  23. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  24. package/dist/src/core/subagent.d.ts +2 -0
  25. package/dist/src/core/subagent.js +13 -3
  26. package/dist/src/core/subagent.js.map +1 -1
  27. package/dist/src/core/turn.d.ts +26 -4
  28. package/dist/src/core/turn.js +64 -3
  29. package/dist/src/core/turn.js.map +1 -1
  30. package/dist/src/filters/EmojiFilter.js +1 -0
  31. package/dist/src/filters/EmojiFilter.js.map +1 -1
  32. package/dist/src/ide/ide-client.d.ts +6 -1
  33. package/dist/src/ide/ide-client.js +20 -2
  34. package/dist/src/ide/ide-client.js.map +1 -1
  35. package/dist/src/ide/ideContext.d.ts +44 -32
  36. package/dist/src/ide/ideContext.js +1 -0
  37. package/dist/src/ide/ideContext.js.map +1 -1
  38. package/dist/src/ide/process-utils.js +49 -33
  39. package/dist/src/ide/process-utils.js.map +1 -1
  40. package/dist/src/index.d.ts +3 -0
  41. package/dist/src/index.js +4 -0
  42. package/dist/src/index.js.map +1 -1
  43. package/dist/src/mcp/file-token-store.d.ts +20 -1
  44. package/dist/src/mcp/file-token-store.js +95 -14
  45. package/dist/src/mcp/file-token-store.js.map +1 -1
  46. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  47. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  48. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  49. package/dist/src/mcp/token-storage/file-token-storage.d.ts +24 -0
  50. package/dist/src/mcp/token-storage/file-token-storage.js +144 -0
  51. package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -0
  52. package/dist/src/mcp/token-storage/hybrid-token-storage.d.ts +23 -0
  53. package/dist/src/mcp/token-storage/hybrid-token-storage.js +78 -0
  54. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -0
  55. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +31 -0
  56. package/dist/src/mcp/token-storage/keychain-token-storage.js +190 -0
  57. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -0
  58. package/dist/src/mcp/token-storage/types.d.ts +40 -0
  59. package/dist/src/mcp/token-storage/types.js +11 -0
  60. package/dist/src/mcp/token-storage/types.js.map +1 -0
  61. package/dist/src/prompt-config/defaults/providers/openai/core.md +81 -0
  62. package/dist/src/prompt-config/defaults/providers/openai/tools/todo-pause.md +28 -0
  63. package/dist/src/prompt-config/defaults/providers/openai/tools/todo-read.md +5 -0
  64. package/dist/src/prompt-config/defaults/providers/openai/tools/todo-write.md +45 -0
  65. package/dist/src/providers/BaseProvider.d.ts +3 -3
  66. package/dist/src/providers/BaseProvider.js.map +1 -1
  67. package/dist/src/providers/anthropic/AnthropicProvider.js +1 -3
  68. package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
  69. package/dist/src/providers/openai/OpenAIProvider.d.ts +14 -0
  70. package/dist/src/providers/openai/OpenAIProvider.js +83 -1
  71. package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
  72. package/dist/src/providers/tokenizers/OpenAITokenizer.d.ts +1 -0
  73. package/dist/src/providers/tokenizers/OpenAITokenizer.js +3 -1
  74. package/dist/src/providers/tokenizers/OpenAITokenizer.js.map +1 -1
  75. package/dist/src/services/loopDetectionService.d.ts +23 -0
  76. package/dist/src/services/loopDetectionService.js +134 -1
  77. package/dist/src/services/loopDetectionService.js.map +1 -1
  78. package/dist/src/services/shellExecutionService.js +8 -7
  79. package/dist/src/services/shellExecutionService.js.map +1 -1
  80. package/dist/src/telemetry/sdk.js +2 -1
  81. package/dist/src/telemetry/sdk.js.map +1 -1
  82. package/dist/src/telemetry/types.d.ts +12 -0
  83. package/dist/src/telemetry/types.js +19 -0
  84. package/dist/src/telemetry/types.js.map +1 -1
  85. package/dist/src/test-utils/config.d.ts +10 -0
  86. package/dist/src/test-utils/config.js +24 -0
  87. package/dist/src/test-utils/config.js.map +1 -0
  88. package/dist/src/test-utils/index.d.ts +6 -0
  89. package/dist/src/test-utils/index.js +7 -0
  90. package/dist/src/test-utils/index.js.map +1 -0
  91. package/dist/src/test-utils/mock-tool.d.ts +41 -0
  92. package/dist/src/test-utils/mock-tool.js +51 -0
  93. package/dist/src/test-utils/mock-tool.js.map +1 -0
  94. package/dist/src/tools/edit.d.ts +2 -2
  95. package/dist/src/tools/edit.js +28 -35
  96. package/dist/src/tools/edit.js.map +1 -1
  97. package/dist/src/tools/mcp-client-manager.d.ts +8 -6
  98. package/dist/src/tools/mcp-client-manager.js +30 -5
  99. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  100. package/dist/src/tools/mcp-client.d.ts +5 -5
  101. package/dist/src/tools/mcp-client.js +13 -22
  102. package/dist/src/tools/mcp-client.js.map +1 -1
  103. package/dist/src/tools/mcp-tool.d.ts +3 -2
  104. package/dist/src/tools/mcp-tool.js +9 -9
  105. package/dist/src/tools/mcp-tool.js.map +1 -1
  106. package/dist/src/tools/memoryTool.js +5 -33
  107. package/dist/src/tools/memoryTool.js.map +1 -1
  108. package/dist/src/tools/shell.js +6 -3
  109. package/dist/src/tools/shell.js.map +1 -1
  110. package/dist/src/tools/smart-edit.d.ts +73 -0
  111. package/dist/src/tools/smart-edit.js +606 -0
  112. package/dist/src/tools/smart-edit.js.map +1 -0
  113. package/dist/src/tools/tool-registry.d.ts +2 -1
  114. package/dist/src/tools/tool-registry.js +6 -6
  115. package/dist/src/tools/tool-registry.js.map +1 -1
  116. package/dist/src/tools/web-fetch.js +3 -1
  117. package/dist/src/tools/web-fetch.js.map +1 -1
  118. package/dist/src/utils/editCorrector.js +2 -2
  119. package/dist/src/utils/editCorrector.js.map +1 -1
  120. package/dist/src/utils/fileUtils.d.ts +19 -3
  121. package/dist/src/utils/fileUtils.js +139 -28
  122. package/dist/src/utils/fileUtils.js.map +1 -1
  123. package/dist/src/utils/gitIgnoreParser.d.ts +1 -0
  124. package/dist/src/utils/gitIgnoreParser.js +101 -10
  125. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  126. package/dist/src/utils/ide-trust.d.ts +10 -0
  127. package/dist/src/utils/ide-trust.js +14 -0
  128. package/dist/src/utils/ide-trust.js.map +1 -0
  129. package/dist/src/utils/llm-edit-fixer.d.ts +25 -0
  130. package/dist/src/utils/llm-edit-fixer.js +111 -0
  131. package/dist/src/utils/llm-edit-fixer.js.map +1 -0
  132. package/dist/src/utils/memoryDiscovery.d.ts +5 -4
  133. package/dist/src/utils/memoryDiscovery.js +10 -9
  134. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  135. package/dist/src/utils/partUtils.d.ts +1 -2
  136. package/dist/src/utils/partUtils.js +0 -14
  137. package/dist/src/utils/partUtils.js.map +1 -1
  138. package/dist/src/utils/pathReader.d.ts +28 -0
  139. package/dist/src/utils/pathReader.js +47 -0
  140. package/dist/src/utils/pathReader.js.map +1 -0
  141. package/dist/src/utils/summarizer.js +2 -1
  142. package/dist/src/utils/summarizer.js.map +1 -1
  143. package/package.json +3 -3
@@ -10,11 +10,30 @@ import { BaseTokenStore, MCPOAuthToken, MCPOAuthCredentials } from './token-stor
10
10
  */
11
11
  export declare class FileTokenStore extends BaseTokenStore {
12
12
  private readonly tokenFilePath;
13
- constructor(tokenFilePath?: string);
13
+ private readonly encryptionKey;
14
+ private readonly serviceName;
15
+ constructor(tokenFilePath?: string, options?: {
16
+ serviceName?: string;
17
+ encryptionKey?: Buffer;
18
+ });
14
19
  /**
15
20
  * Ensure the config directory exists.
16
21
  */
17
22
  private ensureConfigDir;
23
+ /**
24
+ * Derive an encryption key for securing stored tokens.
25
+ */
26
+ private deriveEncryptionKey;
27
+ /**
28
+ * Encrypt token payload with AES-256-GCM.
29
+ */
30
+ private encrypt;
31
+ /**
32
+ * Decrypt stored payload. Falls back to plaintext for backward compatibility.
33
+ */
34
+ private decrypt;
35
+ private readTokenPayload;
36
+ private writeTokenPayload;
18
37
  /**
19
38
  * Load all stored MCP OAuth tokens.
20
39
  *
@@ -5,18 +5,44 @@
5
5
  */
6
6
  import { promises as fs } from 'node:fs';
7
7
  import * as path from 'node:path';
8
+ import * as os from 'node:os';
9
+ import * as crypto from 'node:crypto';
8
10
  import { Storage } from '../config/storage.js';
9
11
  import { getErrorMessage } from '../utils/errors.js';
10
12
  import { BaseTokenStore, } from './token-store.js';
13
+ const safeOsHostname = () => {
14
+ try {
15
+ return os.hostname();
16
+ }
17
+ catch (error) {
18
+ console.warn('Failed to resolve hostname, falling back to default', error);
19
+ return 'unknown-host';
20
+ }
21
+ };
22
+ const safeOsUsername = () => {
23
+ try {
24
+ return os.userInfo().username;
25
+ }
26
+ catch (error) {
27
+ const fallback = process.env.USER || process.env.USERNAME || 'unknown-user';
28
+ console.warn('Failed to resolve username, using fallback value', error);
29
+ return fallback;
30
+ }
31
+ };
11
32
  /**
12
33
  * File-based implementation of the BaseTokenStore.
13
34
  * Stores MCP OAuth tokens in a JSON file in the user's configuration directory.
14
35
  */
15
36
  export class FileTokenStore extends BaseTokenStore {
16
37
  tokenFilePath;
17
- constructor(tokenFilePath) {
38
+ encryptionKey;
39
+ serviceName;
40
+ constructor(tokenFilePath, options = {}) {
18
41
  super();
19
42
  this.tokenFilePath = tokenFilePath || Storage.getMcpOAuthTokensPath();
43
+ this.serviceName = options.serviceName ?? 'llxprt-cli-mcp-oauth';
44
+ this.encryptionKey =
45
+ options.encryptionKey ?? this.deriveEncryptionKey(this.serviceName);
20
46
  }
21
47
  /**
22
48
  * Ensure the config directory exists.
@@ -24,13 +50,70 @@ export class FileTokenStore extends BaseTokenStore {
24
50
  async ensureConfigDir() {
25
51
  const configDir = path.dirname(this.tokenFilePath);
26
52
  try {
27
- await fs.mkdir(configDir, { recursive: true });
53
+ await fs.mkdir(configDir, { recursive: true, mode: 0o700 });
28
54
  }
29
55
  catch (error) {
30
56
  console.error(`Failed to create config directory ${configDir}: ${getErrorMessage(error)}`);
31
57
  throw error;
32
58
  }
33
59
  }
60
+ /**
61
+ * Derive an encryption key for securing stored tokens.
62
+ */
63
+ deriveEncryptionKey(serviceName) {
64
+ const hostname = safeOsHostname();
65
+ const username = safeOsUsername();
66
+ const salt = `${hostname}:${username}:${serviceName}`;
67
+ return crypto.scryptSync('llxprt-cli-oauth', salt, 32);
68
+ }
69
+ /**
70
+ * Encrypt token payload with AES-256-GCM.
71
+ */
72
+ encrypt(payload) {
73
+ const iv = crypto.randomBytes(16);
74
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv);
75
+ let encrypted = cipher.update(payload, 'utf8', 'hex');
76
+ encrypted += cipher.final('hex');
77
+ const authTag = cipher.getAuthTag();
78
+ return [iv.toString('hex'), authTag.toString('hex'), encrypted].join(':');
79
+ }
80
+ /**
81
+ * Decrypt stored payload. Falls back to plaintext for backward compatibility.
82
+ */
83
+ decrypt(payload) {
84
+ const trimmed = payload.trim();
85
+ const encryptedPattern = /^[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/i;
86
+ if (!encryptedPattern.test(trimmed)) {
87
+ return payload;
88
+ }
89
+ const [ivHex, authTagHex, encryptedHex] = trimmed.split(':');
90
+ const iv = Buffer.from(ivHex, 'hex');
91
+ const authTag = Buffer.from(authTagHex, 'hex');
92
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, iv);
93
+ decipher.setAuthTag(authTag);
94
+ let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');
95
+ decrypted += decipher.final('utf8');
96
+ return decrypted;
97
+ }
98
+ async readTokenPayload() {
99
+ try {
100
+ return await fs.readFile(this.tokenFilePath, 'utf-8');
101
+ }
102
+ catch (error) {
103
+ const err = error;
104
+ if (err.code === 'ENOENT') {
105
+ return null;
106
+ }
107
+ console.error(`Failed to read MCP OAuth tokens from ${this.tokenFilePath}: ${getErrorMessage(error)}`);
108
+ throw error;
109
+ }
110
+ }
111
+ async writeTokenPayload(tokens) {
112
+ await this.ensureConfigDir();
113
+ const payload = JSON.stringify(tokens, null, 2);
114
+ const encrypted = this.encrypt(payload);
115
+ await fs.writeFile(this.tokenFilePath, encrypted, { mode: 0o600 });
116
+ }
34
117
  /**
35
118
  * Load all stored MCP OAuth tokens.
36
119
  *
@@ -39,8 +122,12 @@ export class FileTokenStore extends BaseTokenStore {
39
122
  async loadTokens() {
40
123
  const tokenMap = new Map();
41
124
  try {
42
- const data = await fs.readFile(this.tokenFilePath, 'utf-8');
43
- const tokens = JSON.parse(data);
125
+ const payload = await this.readTokenPayload();
126
+ if (!payload) {
127
+ return tokenMap;
128
+ }
129
+ const decrypted = this.decrypt(payload);
130
+ const tokens = JSON.parse(decrypted);
44
131
  // Validate the loaded data structure
45
132
  if (!Array.isArray(tokens)) {
46
133
  console.warn('Token file contains invalid data structure, ignoring');
@@ -56,10 +143,7 @@ export class FileTokenStore extends BaseTokenStore {
56
143
  }
57
144
  }
58
145
  catch (error) {
59
- // File doesn't exist or is invalid, return empty map
60
- if (error.code !== 'ENOENT') {
61
- console.error(`Failed to load MCP OAuth tokens from ${this.tokenFilePath}: ${getErrorMessage(error)}`);
62
- }
146
+ console.error(`Failed to load MCP OAuth tokens from ${this.tokenFilePath}: ${getErrorMessage(error)}`);
63
147
  }
64
148
  return tokenMap;
65
149
  }
@@ -73,13 +157,11 @@ export class FileTokenStore extends BaseTokenStore {
73
157
  * @param mcpServerUrl Optional MCP server URL
74
158
  */
75
159
  async saveToken(serverName, token, clientId, tokenUrl, mcpServerUrl) {
76
- await this.ensureConfigDir();
77
160
  const tokens = await this.loadTokens();
78
161
  const credential = this.createCredentials(serverName, token, clientId, tokenUrl, mcpServerUrl);
79
162
  tokens.set(serverName, credential);
80
- const tokenArray = Array.from(tokens.values());
81
163
  try {
82
- await fs.writeFile(this.tokenFilePath, JSON.stringify(tokenArray, null, 2), { mode: 0o600 });
164
+ await this.writeTokenPayload(Array.from(tokens.values()));
83
165
  // Token saved successfully
84
166
  }
85
167
  catch (error) {
@@ -109,15 +191,14 @@ export class FileTokenStore extends BaseTokenStore {
109
191
  this.validateServerName(serverName);
110
192
  const tokens = await this.loadTokens();
111
193
  if (tokens.delete(serverName)) {
112
- const tokenArray = Array.from(tokens.values());
113
194
  try {
114
- if (tokenArray.length === 0) {
195
+ if (tokens.size === 0) {
115
196
  // Remove file if no tokens left
116
197
  await fs.unlink(this.tokenFilePath);
117
198
  // Token file removed successfully
118
199
  }
119
200
  else {
120
- await fs.writeFile(this.tokenFilePath, JSON.stringify(tokenArray, null, 2), { mode: 0o600 });
201
+ await this.writeTokenPayload(Array.from(tokens.values()));
121
202
  // Token removed successfully
122
203
  }
123
204
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file-token-store.js","sourceRoot":"","sources":["../../../src/mcp/file-token-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-token-store.js","sourceRoot":"","sources":["../../../src/mcp/file-token-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { MCPOAuthCredentials } from '../token-store.js';
7
+ export declare abstract class BaseTokenStorage {
8
+ protected readonly serviceName: string;
9
+ constructor(serviceName: string);
10
+ abstract getCredentials(serverName: string): Promise<MCPOAuthCredentials | null>;
11
+ abstract setCredentials(credentials: MCPOAuthCredentials): Promise<void>;
12
+ abstract deleteCredentials(serverName: string): Promise<void>;
13
+ abstract listServers(): Promise<string[]>;
14
+ abstract getAllCredentials(): Promise<Map<string, MCPOAuthCredentials>>;
15
+ abstract clearAll(): Promise<void>;
16
+ protected validateCredentials(credentials: MCPOAuthCredentials): void;
17
+ protected isTokenExpired(credentials: MCPOAuthCredentials): boolean;
18
+ protected sanitizeServerName(serverName: string): string;
19
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export class BaseTokenStorage {
7
+ serviceName;
8
+ constructor(serviceName) {
9
+ this.serviceName = serviceName;
10
+ }
11
+ validateCredentials(credentials) {
12
+ if (!credentials.serverName) {
13
+ throw new Error('Server name is required');
14
+ }
15
+ if (!credentials.token) {
16
+ throw new Error('Token is required');
17
+ }
18
+ if (!credentials.token.accessToken) {
19
+ throw new Error('Access token is required');
20
+ }
21
+ if (!credentials.token.tokenType) {
22
+ throw new Error('Token type is required');
23
+ }
24
+ }
25
+ isTokenExpired(credentials) {
26
+ if (!credentials.token.expiresAt) {
27
+ return false;
28
+ }
29
+ const bufferMs = 5 * 60 * 1000;
30
+ return Date.now() > credentials.token.expiresAt - bufferMs;
31
+ }
32
+ sanitizeServerName(serverName) {
33
+ return serverName.replace(/[^a-zA-Z0-9-_.]/g, '_');
34
+ }
35
+ }
36
+ //# sourceMappingURL=base-token-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-token-storage.js","sourceRoot":"","sources":["../../../../src/mcp/token-storage/base-token-storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,OAAgB,gBAAgB;IACjB,WAAW,CAAS;IAEvC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAWS,mBAAmB,CAAC,WAAgC;QAC5D,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAES,cAAc,CAAC,WAAgC;QACvD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC7D,CAAC;IAES,kBAAkB,CAAC,UAAkB;QAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTokenStorage } from './base-token-storage.js';
7
+ import type { MCPOAuthCredentials } from '../token-store.js';
8
+ export declare class FileTokenStorage extends BaseTokenStorage {
9
+ private readonly tokenFilePath;
10
+ private readonly encryptionKey;
11
+ constructor(serviceName: string);
12
+ private deriveEncryptionKey;
13
+ private encrypt;
14
+ private decrypt;
15
+ private ensureDirectoryExists;
16
+ private loadTokens;
17
+ private saveTokens;
18
+ getCredentials(serverName: string): Promise<MCPOAuthCredentials | null>;
19
+ setCredentials(credentials: MCPOAuthCredentials): Promise<void>;
20
+ deleteCredentials(serverName: string): Promise<void>;
21
+ listServers(): Promise<string[]>;
22
+ getAllCredentials(): Promise<Map<string, MCPOAuthCredentials>>;
23
+ clearAll(): Promise<void>;
24
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import * as os from 'node:os';
9
+ import * as crypto from 'node:crypto';
10
+ import { BaseTokenStorage } from './base-token-storage.js';
11
+ export class FileTokenStorage extends BaseTokenStorage {
12
+ tokenFilePath;
13
+ encryptionKey;
14
+ constructor(serviceName) {
15
+ super(serviceName);
16
+ const configDir = path.join(os.homedir(), '.llxprt');
17
+ this.tokenFilePath = path.join(configDir, 'mcp-oauth-tokens-v2.json');
18
+ this.encryptionKey = this.deriveEncryptionKey();
19
+ }
20
+ deriveEncryptionKey() {
21
+ const salt = `${os.hostname()}-${os.userInfo().username}-llxprt-cli`;
22
+ return crypto.scryptSync('llxprt-cli-oauth', salt, 32);
23
+ }
24
+ encrypt(text) {
25
+ const iv = crypto.randomBytes(16);
26
+ const cipher = crypto.createCipheriv('aes-256-gcm', this.encryptionKey, iv);
27
+ let encrypted = cipher.update(text, 'utf8', 'hex');
28
+ encrypted += cipher.final('hex');
29
+ const authTag = cipher.getAuthTag();
30
+ return iv.toString('hex') + ':' + authTag.toString('hex') + ':' + encrypted;
31
+ }
32
+ decrypt(encryptedData) {
33
+ const parts = encryptedData.split(':');
34
+ if (parts.length !== 3) {
35
+ throw new Error('Invalid encrypted data format');
36
+ }
37
+ const iv = Buffer.from(parts[0], 'hex');
38
+ const authTag = Buffer.from(parts[1], 'hex');
39
+ const encrypted = parts[2];
40
+ const decipher = crypto.createDecipheriv('aes-256-gcm', this.encryptionKey, iv);
41
+ decipher.setAuthTag(authTag);
42
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
43
+ decrypted += decipher.final('utf8');
44
+ return decrypted;
45
+ }
46
+ async ensureDirectoryExists() {
47
+ const dir = path.dirname(this.tokenFilePath);
48
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
49
+ }
50
+ async loadTokens() {
51
+ try {
52
+ const data = await fs.readFile(this.tokenFilePath, 'utf-8');
53
+ const decrypted = this.decrypt(data);
54
+ const tokens = JSON.parse(decrypted);
55
+ return new Map(Object.entries(tokens));
56
+ }
57
+ catch (error) {
58
+ const err = error;
59
+ if (err.code === 'ENOENT') {
60
+ throw new Error('Token file does not exist');
61
+ }
62
+ if (err.message?.includes('Invalid encrypted data format') ||
63
+ err.message?.includes('Unsupported state or unable to authenticate data')) {
64
+ throw new Error('Token file corrupted');
65
+ }
66
+ throw error;
67
+ }
68
+ }
69
+ async saveTokens(tokens) {
70
+ await this.ensureDirectoryExists();
71
+ const data = Object.fromEntries(tokens);
72
+ const json = JSON.stringify(data, null, 2);
73
+ const encrypted = this.encrypt(json);
74
+ await fs.writeFile(this.tokenFilePath, encrypted, { mode: 0o600 });
75
+ }
76
+ async getCredentials(serverName) {
77
+ const tokens = await this.loadTokens();
78
+ const credentials = tokens.get(serverName);
79
+ if (!credentials) {
80
+ return null;
81
+ }
82
+ if (this.isTokenExpired(credentials)) {
83
+ return null;
84
+ }
85
+ return credentials;
86
+ }
87
+ async setCredentials(credentials) {
88
+ this.validateCredentials(credentials);
89
+ const tokens = await this.loadTokens();
90
+ const updatedCredentials = {
91
+ ...credentials,
92
+ updatedAt: Date.now(),
93
+ };
94
+ tokens.set(credentials.serverName, updatedCredentials);
95
+ await this.saveTokens(tokens);
96
+ }
97
+ async deleteCredentials(serverName) {
98
+ const tokens = await this.loadTokens();
99
+ if (!tokens.has(serverName)) {
100
+ throw new Error(`No credentials found for ${serverName}`);
101
+ }
102
+ tokens.delete(serverName);
103
+ if (tokens.size === 0) {
104
+ try {
105
+ await fs.unlink(this.tokenFilePath);
106
+ }
107
+ catch (error) {
108
+ const err = error;
109
+ if (err.code !== 'ENOENT') {
110
+ throw error;
111
+ }
112
+ }
113
+ }
114
+ else {
115
+ await this.saveTokens(tokens);
116
+ }
117
+ }
118
+ async listServers() {
119
+ const tokens = await this.loadTokens();
120
+ return Array.from(tokens.keys());
121
+ }
122
+ async getAllCredentials() {
123
+ const tokens = await this.loadTokens();
124
+ const result = new Map();
125
+ for (const [serverName, credentials] of tokens) {
126
+ if (!this.isTokenExpired(credentials)) {
127
+ result.set(serverName, credentials);
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ async clearAll() {
133
+ try {
134
+ await fs.unlink(this.tokenFilePath);
135
+ }
136
+ catch (error) {
137
+ const err = error;
138
+ if (err.code !== 'ENOENT') {
139
+ throw error;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=file-token-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-token-storage.js","sourceRoot":"","sources":["../../../../src/mcp/token-storage/file-token-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTokenStorage } from './base-token-storage.js';
7
+ import type { OAuthCredentials } from './types.js';
8
+ import { TokenStorageType } from './types.js';
9
+ export declare class HybridTokenStorage extends BaseTokenStorage {
10
+ private storage;
11
+ private storageType;
12
+ private storageInitPromise;
13
+ constructor(serviceName: string);
14
+ private initializeStorage;
15
+ private getStorage;
16
+ getCredentials(serverName: string): Promise<OAuthCredentials | null>;
17
+ setCredentials(credentials: OAuthCredentials): Promise<void>;
18
+ deleteCredentials(serverName: string): Promise<void>;
19
+ listServers(): Promise<string[]>;
20
+ getAllCredentials(): Promise<Map<string, OAuthCredentials>>;
21
+ clearAll(): Promise<void>;
22
+ getStorageType(): Promise<TokenStorageType>;
23
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTokenStorage } from './base-token-storage.js';
7
+ import { FileTokenStorage } from './file-token-storage.js';
8
+ import { TokenStorageType } from './types.js';
9
+ const FORCE_FILE_STORAGE_ENV_VAR = 'GEMINI_FORCE_FILE_STORAGE';
10
+ export class HybridTokenStorage extends BaseTokenStorage {
11
+ storage = null;
12
+ storageType = null;
13
+ storageInitPromise = null;
14
+ constructor(serviceName) {
15
+ super(serviceName);
16
+ }
17
+ async initializeStorage() {
18
+ const forceFileStorage = process.env[FORCE_FILE_STORAGE_ENV_VAR] === 'true';
19
+ if (!forceFileStorage) {
20
+ try {
21
+ const { KeychainTokenStorage } = await import('./keychain-token-storage.js');
22
+ const keychainStorage = new KeychainTokenStorage(this.serviceName);
23
+ const isAvailable = await keychainStorage.isAvailable();
24
+ if (isAvailable) {
25
+ this.storage = keychainStorage;
26
+ this.storageType = TokenStorageType.KEYCHAIN;
27
+ return this.storage;
28
+ }
29
+ }
30
+ catch (_e) {
31
+ // Fallback to file storage if keychain fails to initialize
32
+ }
33
+ }
34
+ this.storage = new FileTokenStorage(this.serviceName);
35
+ this.storageType = TokenStorageType.ENCRYPTED_FILE;
36
+ return this.storage;
37
+ }
38
+ async getStorage() {
39
+ if (this.storage !== null) {
40
+ return this.storage;
41
+ }
42
+ // Use a single initialization promise to avoid race conditions
43
+ if (!this.storageInitPromise) {
44
+ this.storageInitPromise = this.initializeStorage();
45
+ }
46
+ // Wait for initialization to complete
47
+ return await this.storageInitPromise;
48
+ }
49
+ async getCredentials(serverName) {
50
+ const storage = await this.getStorage();
51
+ return storage.getCredentials(serverName);
52
+ }
53
+ async setCredentials(credentials) {
54
+ const storage = await this.getStorage();
55
+ await storage.setCredentials(credentials);
56
+ }
57
+ async deleteCredentials(serverName) {
58
+ const storage = await this.getStorage();
59
+ await storage.deleteCredentials(serverName);
60
+ }
61
+ async listServers() {
62
+ const storage = await this.getStorage();
63
+ return storage.listServers();
64
+ }
65
+ async getAllCredentials() {
66
+ const storage = await this.getStorage();
67
+ return storage.getAllCredentials();
68
+ }
69
+ async clearAll() {
70
+ const storage = await this.getStorage();
71
+ await storage.clearAll();
72
+ }
73
+ async getStorageType() {
74
+ await this.getStorage();
75
+ return this.storageType;
76
+ }
77
+ }
78
+ //# sourceMappingURL=hybrid-token-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-token-storage.js","sourceRoot":"","sources":["../../../../src/mcp/token-storage/hybrid-token-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTokenStorage } from './base-token-storage.js';
7
+ import type { OAuthCredentials } from './types.js';
8
+ interface Keytar {
9
+ getPassword(service: string, account: string): Promise<string | null>;
10
+ setPassword(service: string, account: string, password: string): Promise<void>;
11
+ deletePassword(service: string, account: string): Promise<boolean>;
12
+ findCredentials(service: string): Promise<Array<{
13
+ account: string;
14
+ password: string;
15
+ }>>;
16
+ }
17
+ export declare class KeychainTokenStorage extends BaseTokenStorage {
18
+ private keychainAvailable;
19
+ private keytarModule;
20
+ private keytarLoadAttempted;
21
+ getKeytar(): Promise<Keytar | null>;
22
+ getCredentials(serverName: string): Promise<OAuthCredentials | null>;
23
+ setCredentials(credentials: OAuthCredentials): Promise<void>;
24
+ deleteCredentials(serverName: string): Promise<void>;
25
+ listServers(): Promise<string[]>;
26
+ getAllCredentials(): Promise<Map<string, OAuthCredentials>>;
27
+ clearAll(): Promise<void>;
28
+ checkKeychainAvailability(): Promise<boolean>;
29
+ isAvailable(): Promise<boolean>;
30
+ }
31
+ export {};