@vybestack/llxprt-code-core 0.2.24 → 0.3.4-nightly.250912.5e46408e
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/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/code_assist/converter.js +35 -3
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/oauth2.js +18 -25
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/config/config.d.ts +33 -2
- package/dist/src/config/config.js +73 -13
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/storage.d.ts +33 -0
- package/dist/src/config/storage.js +93 -0
- package/dist/src/config/storage.js.map +1 -0
- package/dist/src/core/client.d.ts +8 -5
- package/dist/src/core/client.js +119 -20
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/contentGenerator.js +11 -0
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +18 -12
- package/dist/src/core/coreToolScheduler.js +235 -241
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/logger.d.ts +3 -1
- package/dist/src/core/logger.js +5 -3
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +2 -2
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/subagent.js +2 -12
- package/dist/src/core/subagent.js.map +1 -1
- package/dist/src/core/turn.d.ts +13 -2
- package/dist/src/core/turn.js +15 -4
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/filters/EmojiFilter.d.ts +5 -0
- package/dist/src/filters/EmojiFilter.js +3 -2
- package/dist/src/filters/EmojiFilter.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +8 -3
- package/dist/src/ide/detect-ide.js +29 -11
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +5 -4
- package/dist/src/ide/ide-client.js +21 -17
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.d.ts +1 -1
- package/dist/src/ide/ide-installer.js +29 -20
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.d.ts +7 -5
- package/dist/src/ide/process-utils.js +80 -47
- package/dist/src/ide/process-utils.js.map +1 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/file-token-store.d.ts +58 -0
- package/dist/src/mcp/file-token-store.js +181 -0
- package/dist/src/mcp/file-token-store.js.map +1 -0
- package/dist/src/mcp/oauth-token-storage.d.ts +13 -28
- package/dist/src/mcp/oauth-token-storage.js +21 -87
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +8 -0
- package/dist/src/mcp/oauth-utils.js +41 -27
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/token-store.d.ts +99 -0
- package/dist/src/mcp/token-store.js +77 -0
- package/dist/src/mcp/token-store.js.map +1 -0
- package/dist/src/parsers/TextToolCallParser.d.ts +5 -0
- package/dist/src/parsers/TextToolCallParser.js +3 -13
- package/dist/src/parsers/TextToolCallParser.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.d.ts +5 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js +26 -8
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.js +16 -1
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.d.ts +15 -0
- package/dist/src/providers/openai/OpenAIProvider.js +99 -48
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/services/gitService.d.ts +3 -1
- package/dist/src/services/gitService.js +20 -10
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/history/ContentConverters.js +40 -1
- package/dist/src/services/history/ContentConverters.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +8 -2
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +2 -1
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/settings/SettingsService.d.ts +5 -0
- package/dist/src/settings/SettingsService.js +5 -0
- package/dist/src/settings/SettingsService.js.map +1 -1
- package/dist/src/settings/settingsServiceInstance.d.ts +5 -0
- package/dist/src/settings/settingsServiceInstance.js +5 -0
- package/dist/src/settings/settingsServiceInstance.js.map +1 -1
- package/dist/src/settings/types.d.ts +5 -0
- package/dist/src/settings/types.js +3 -1
- package/dist/src/settings/types.js.map +1 -1
- package/dist/src/tools/IToolFormatter.d.ts +5 -0
- package/dist/src/tools/IToolFormatter.js +3 -13
- package/dist/src/tools/IToolFormatter.js.map +1 -1
- package/dist/src/tools/ToolFormatter.d.ts +18 -0
- package/dist/src/tools/ToolFormatter.js +41 -13
- package/dist/src/tools/ToolFormatter.js.map +1 -1
- package/dist/src/tools/doubleEscapeUtils.d.ts +3 -13
- package/dist/src/tools/doubleEscapeUtils.js +5 -0
- package/dist/src/tools/doubleEscapeUtils.js.map +1 -1
- package/dist/src/tools/edit.js +10 -1
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/glob.d.ts +0 -4
- package/dist/src/tools/glob.js +18 -42
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/grep.d.ts +0 -4
- package/dist/src/tools/grep.js +41 -77
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.d.ts +2 -6
- package/dist/src/tools/ls.js +18 -13
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +7 -0
- package/dist/src/tools/mcp-client.js +26 -21
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +12 -2
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/memoryTool.js +7 -2
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/read-file.js +2 -30
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-many-files.js +29 -52
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +46 -0
- package/dist/src/tools/ripGrep.js +368 -0
- package/dist/src/tools/ripGrep.js.map +1 -0
- package/dist/src/tools/shell.js +13 -2
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/todo-pause.js +0 -1
- package/dist/src/tools/todo-pause.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +18 -2
- package/dist/src/tools/tool-error.js +27 -1
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +13 -2
- package/dist/src/tools/tool-registry.js +30 -2
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +7 -5
- package/dist/src/tools/tools.js +12 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +101 -76
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-search-invocation.js +13 -1
- package/dist/src/tools/web-search-invocation.js.map +1 -1
- package/dist/src/utils/deterministicEditCorrector.d.ts +28 -0
- package/dist/src/utils/deterministicEditCorrector.js +295 -0
- package/dist/src/utils/deterministicEditCorrector.js.map +1 -0
- package/dist/src/utils/editCorrector.d.ts +4 -4
- package/dist/src/utils/editCorrector.js +15 -213
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.js +1 -1
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/errors.d.ts +19 -0
- package/dist/src/utils/errors.js +32 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +2 -7
- package/dist/src/utils/fileUtils.js +16 -47
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +1 -0
- package/dist/src/utils/filesearch/fileSearch.js +14 -9
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/ignorePatterns.d.ts +103 -0
- package/dist/src/utils/ignorePatterns.js +220 -0
- package/dist/src/utils/ignorePatterns.js.map +1 -0
- package/dist/src/utils/installationManager.d.ts +16 -0
- package/dist/src/utils/installationManager.js +50 -0
- package/dist/src/utils/installationManager.js.map +1 -0
- package/dist/src/utils/memoryDiscovery.d.ts +1 -1
- package/dist/src/utils/memoryDiscovery.js +64 -43
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/paths.d.ts +0 -17
- package/dist/src/utils/paths.js +0 -26
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +4 -0
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +1 -1
- package/dist/src/utils/shell-utils.js +23 -29
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +19 -0
- package/dist/src/utils/tool-utils.js +58 -0
- package/dist/src/utils/tool-utils.js.map +1 -0
- package/dist/src/utils/userAccountManager.d.ts +20 -0
- package/dist/src/utils/userAccountManager.js +122 -0
- package/dist/src/utils/userAccountManager.js.map +1 -0
- package/dist/src/utils/workspaceContext.js +11 -5
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/package.json +7 -3
- package/dist/src/utils/nextSpeakerChecker.d.ts +0 -12
- package/dist/src/utils/nextSpeakerChecker.js +0 -97
- package/dist/src/utils/nextSpeakerChecker.js.map +0 -1
- package/dist/src/utils/user_account.d.ts +0 -9
- package/dist/src/utils/user_account.js +0 -109
- package/dist/src/utils/user_account.js.map +0 -1
- package/dist/src/utils/user_id.d.ts +0 -11
- package/dist/src/utils/user_id.js +0 -49
- package/dist/src/utils/user_id.js.map +0 -1
@@ -0,0 +1,122 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright 2025 Google LLC
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
5
|
+
*/
|
6
|
+
import path from 'node:path';
|
7
|
+
import { promises as fsp, readFileSync } from 'node:fs';
|
8
|
+
import { Storage } from '../config/storage.js';
|
9
|
+
export class UserAccountManager {
|
10
|
+
getGoogleAccountsCachePath() {
|
11
|
+
return Storage.getProviderAccountsPath();
|
12
|
+
}
|
13
|
+
/**
|
14
|
+
* Parses and validates the string content of an accounts file.
|
15
|
+
* @param content The raw string content from the file.
|
16
|
+
* @returns A valid UserAccounts object.
|
17
|
+
*/
|
18
|
+
parseAndValidateAccounts(content) {
|
19
|
+
const defaultState = { active: null, old: [] };
|
20
|
+
if (!content.trim()) {
|
21
|
+
return defaultState;
|
22
|
+
}
|
23
|
+
try {
|
24
|
+
const parsed = JSON.parse(content);
|
25
|
+
// Inlined validation logic
|
26
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
27
|
+
console.log('Invalid accounts file schema, starting fresh.');
|
28
|
+
return defaultState;
|
29
|
+
}
|
30
|
+
const { active, old } = parsed;
|
31
|
+
const isValid = (active === undefined ||
|
32
|
+
active === null ||
|
33
|
+
typeof active === 'string') &&
|
34
|
+
(old === undefined ||
|
35
|
+
(Array.isArray(old) && old.every((i) => typeof i === 'string')));
|
36
|
+
if (!isValid) {
|
37
|
+
console.log('Invalid accounts file schema, starting fresh.');
|
38
|
+
return defaultState;
|
39
|
+
}
|
40
|
+
return {
|
41
|
+
active: parsed.active ?? null,
|
42
|
+
old: parsed.old ?? [],
|
43
|
+
};
|
44
|
+
}
|
45
|
+
catch (error) {
|
46
|
+
console.log('Could not parse accounts file, starting fresh.', error);
|
47
|
+
return defaultState;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
readAccountsSync(filePath) {
|
51
|
+
const defaultState = { active: null, old: [] };
|
52
|
+
try {
|
53
|
+
const content = readFileSync(filePath, 'utf-8');
|
54
|
+
return this.parseAndValidateAccounts(content);
|
55
|
+
}
|
56
|
+
catch (error) {
|
57
|
+
if (error instanceof Error &&
|
58
|
+
'code' in error &&
|
59
|
+
error.code === 'ENOENT') {
|
60
|
+
return defaultState;
|
61
|
+
}
|
62
|
+
console.log('Error during sync read of accounts, starting fresh.', error);
|
63
|
+
return defaultState;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
async readAccounts(filePath) {
|
67
|
+
const defaultState = { active: null, old: [] };
|
68
|
+
try {
|
69
|
+
const content = await fsp.readFile(filePath, 'utf-8');
|
70
|
+
return this.parseAndValidateAccounts(content);
|
71
|
+
}
|
72
|
+
catch (error) {
|
73
|
+
if (error instanceof Error &&
|
74
|
+
'code' in error &&
|
75
|
+
error.code === 'ENOENT') {
|
76
|
+
return defaultState;
|
77
|
+
}
|
78
|
+
console.log('Could not parse accounts file, starting fresh.', error);
|
79
|
+
return defaultState;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
async cacheGoogleAccount(email) {
|
83
|
+
const filePath = this.getGoogleAccountsCachePath();
|
84
|
+
await fsp.mkdir(path.dirname(filePath), { recursive: true });
|
85
|
+
const accounts = await this.readAccounts(filePath);
|
86
|
+
if (accounts.active && accounts.active !== email) {
|
87
|
+
if (!accounts.old.includes(accounts.active)) {
|
88
|
+
accounts.old.push(accounts.active);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
// If the new email was in the old list, remove it
|
92
|
+
accounts.old = accounts.old.filter((oldEmail) => oldEmail !== email);
|
93
|
+
accounts.active = email;
|
94
|
+
await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
|
95
|
+
}
|
96
|
+
getCachedGoogleAccount() {
|
97
|
+
const filePath = this.getGoogleAccountsCachePath();
|
98
|
+
const accounts = this.readAccountsSync(filePath);
|
99
|
+
return accounts.active;
|
100
|
+
}
|
101
|
+
getLifetimeGoogleAccounts() {
|
102
|
+
const filePath = this.getGoogleAccountsCachePath();
|
103
|
+
const accounts = this.readAccountsSync(filePath);
|
104
|
+
const allAccounts = new Set(accounts.old);
|
105
|
+
if (accounts.active) {
|
106
|
+
allAccounts.add(accounts.active);
|
107
|
+
}
|
108
|
+
return allAccounts.size;
|
109
|
+
}
|
110
|
+
async clearCachedGoogleAccount() {
|
111
|
+
const filePath = this.getGoogleAccountsCachePath();
|
112
|
+
const accounts = await this.readAccounts(filePath);
|
113
|
+
if (accounts.active) {
|
114
|
+
if (!accounts.old.includes(accounts.active)) {
|
115
|
+
accounts.old.push(accounts.active);
|
116
|
+
}
|
117
|
+
accounts.active = null;
|
118
|
+
}
|
119
|
+
await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
|
120
|
+
}
|
121
|
+
}
|
122
|
+
//# sourceMappingURL=userAccountManager.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"userAccountManager.js","sourceRoot":"","sources":["../../../src/utils/userAccountManager.ts"],"names":[],"mappings":"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"}
|
@@ -6,6 +6,7 @@
|
|
6
6
|
import { isNodeError } from '../utils/errors.js';
|
7
7
|
import * as fs from 'fs';
|
8
8
|
import * as path from 'path';
|
9
|
+
import * as process from 'process';
|
9
10
|
/**
|
10
11
|
* WorkspaceContext manages multiple workspace directories and validates paths
|
11
12
|
* against them. This allows the CLI to operate on files from multiple directories
|
@@ -56,12 +57,17 @@ export class WorkspaceContext {
|
|
56
57
|
* @param basePath Optional base path for resolving relative paths (defaults to cwd)
|
57
58
|
*/
|
58
59
|
addDirectory(directory, basePath = process.cwd()) {
|
59
|
-
|
60
|
-
|
61
|
-
|
60
|
+
try {
|
61
|
+
const resolved = this.resolveAndValidateDir(directory, basePath);
|
62
|
+
if (this.directories.has(resolved)) {
|
63
|
+
return;
|
64
|
+
}
|
65
|
+
this.directories.add(resolved);
|
66
|
+
this.notifyDirectoriesChanged();
|
67
|
+
}
|
68
|
+
catch (err) {
|
69
|
+
console.warn(`[WARN] Skipping unreadable directory: ${directory} (${err instanceof Error ? err.message : String(err)})`);
|
62
70
|
}
|
63
|
-
this.directories.add(resolved);
|
64
|
-
this.notifyDirectoriesChanged();
|
65
71
|
}
|
66
72
|
resolveAndValidateDir(directory, basePath = process.cwd()) {
|
67
73
|
const absolutePath = path.isAbsolute(directory)
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
1
|
+
{"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@vybestack/llxprt-code-core",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.3.4-nightly.250912.5e46408e",
|
4
4
|
"description": "LLxprt Code Core",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -37,12 +37,15 @@
|
|
37
37
|
"@types/glob": "^8.1.0",
|
38
38
|
"@types/html-to-text": "^9.0.4",
|
39
39
|
"@xterm/headless": "5.5.0",
|
40
|
-
"ajv": "8.17.1",
|
40
|
+
"ajv": "^8.17.1",
|
41
|
+
"ajv-formats": "^3.0.0",
|
41
42
|
"chardet": "^2.1.0",
|
42
43
|
"debug": "^4.3.4",
|
43
44
|
"diff": "^7.0.0",
|
44
45
|
"dotenv": "^17.1.0",
|
45
46
|
"execa": "^9.6.0",
|
47
|
+
"fast-levenshtein": "^2.0.6",
|
48
|
+
"fast-uri": "^3.0.6",
|
46
49
|
"fdir": "^6.4.6",
|
47
50
|
"fzf": "^0.5.2",
|
48
51
|
"glob": "^10.4.5",
|
@@ -53,6 +56,7 @@
|
|
53
56
|
"marked": "^15.0.12",
|
54
57
|
"micromatch": "^4.0.8",
|
55
58
|
"mime-types": "^2.1.35",
|
59
|
+
"mnemonist": "^0.40.3",
|
56
60
|
"open": "^10.1.2",
|
57
61
|
"openai": "^5.10.1",
|
58
62
|
"picomatch": "^4.0.1",
|
@@ -75,7 +79,7 @@
|
|
75
79
|
"@types/debug": "^4.1.12",
|
76
80
|
"@types/diff": "^7.0.2",
|
77
81
|
"@types/dotenv": "^6.1.1",
|
78
|
-
"@types/
|
82
|
+
"@types/fast-levenshtein": "^0.0.4",
|
79
83
|
"@types/minimatch": "^5.1.2",
|
80
84
|
"@types/node": "^24.2.1",
|
81
85
|
"@types/picomatch": "^4.0.1",
|
@@ -1,12 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import { GeminiClient } from '../core/client.js';
|
7
|
-
import { GeminiChat } from '../core/geminiChat.js';
|
8
|
-
export interface NextSpeakerResponse {
|
9
|
-
reasoning: string;
|
10
|
-
next_speaker: 'user' | 'model';
|
11
|
-
}
|
12
|
-
export declare function checkNextSpeaker(chat: GeminiChat, geminiClient: GeminiClient, abortSignal: AbortSignal, providerName?: string): Promise<NextSpeakerResponse | null>;
|
@@ -1,97 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import { DEFAULT_GEMINI_FLASH_LITE_MODEL } from '../config/models.js';
|
7
|
-
import { isFunctionResponse } from './messageInspectors.js';
|
8
|
-
const CHECK_PROMPT = `Analyze *only* the content and structure of your immediately preceding response (your last turn in the conversation history). Based *strictly* on that response, determine who should logically speak next: the 'user' or the 'model' (you).
|
9
|
-
**Decision Rules (apply in order):**
|
10
|
-
1. **Model Continues:** If your last response explicitly states an immediate next action *you* intend to take (e.g., "Next, I will...", "Now I'll process...", "Moving on to analyze...", indicates an intended tool call that didn't execute), OR if the response seems clearly incomplete (cut off mid-thought without a natural conclusion), then the **'model'** should speak next.
|
11
|
-
2. **Question to User:** If your last response ends with a direct question specifically addressed *to the user*, then the **'user'** should speak next.
|
12
|
-
3. **Waiting for User:** If your last response completed a thought, statement, or task *and* does not meet the criteria for Rule 1 (Model Continues) or Rule 2 (Question to User), it implies a pause expecting user input or reaction. In this case, the **'user'** should speak next.`;
|
13
|
-
const RESPONSE_SCHEMA = {
|
14
|
-
type: 'object',
|
15
|
-
properties: {
|
16
|
-
reasoning: {
|
17
|
-
type: 'string',
|
18
|
-
description: "Brief explanation justifying the 'next_speaker' choice based *strictly* on the applicable rule and the content/structure of the preceding turn.",
|
19
|
-
},
|
20
|
-
next_speaker: {
|
21
|
-
type: 'string',
|
22
|
-
enum: ['user', 'model'],
|
23
|
-
description: 'Who should speak next based *only* on the preceding turn and the decision rules',
|
24
|
-
},
|
25
|
-
},
|
26
|
-
required: ['reasoning', 'next_speaker'],
|
27
|
-
};
|
28
|
-
export async function checkNextSpeaker(chat, geminiClient, abortSignal, providerName) {
|
29
|
-
// We need to capture the curated history because there are many moments when the model will return invalid turns
|
30
|
-
// that when passed back up to the endpoint will break subsequent calls. An example of this is when the model decides
|
31
|
-
// to respond with an empty part collection if you were to send that message back to the server it will respond with
|
32
|
-
// a 400 indicating that model part collections MUST have content.
|
33
|
-
const curatedHistory = chat.getHistory(/* curated */ true);
|
34
|
-
// Ensure there's a model response to analyze
|
35
|
-
if (curatedHistory.length === 0) {
|
36
|
-
// Cannot determine next speaker if history is empty.
|
37
|
-
return null;
|
38
|
-
}
|
39
|
-
const comprehensiveHistory = chat.getHistory();
|
40
|
-
// If comprehensiveHistory is empty, there is no last message to check.
|
41
|
-
// This case should ideally be caught by the curatedHistory.length check earlier,
|
42
|
-
// but as a safeguard:
|
43
|
-
if (comprehensiveHistory.length === 0) {
|
44
|
-
return null;
|
45
|
-
}
|
46
|
-
const lastComprehensiveMessage = comprehensiveHistory[comprehensiveHistory.length - 1];
|
47
|
-
// If the last message is a user message containing only function_responses,
|
48
|
-
// then the model should speak next.
|
49
|
-
if (lastComprehensiveMessage &&
|
50
|
-
isFunctionResponse(lastComprehensiveMessage)) {
|
51
|
-
return {
|
52
|
-
reasoning: 'The last message was a function response, so the model should speak next.',
|
53
|
-
next_speaker: 'model',
|
54
|
-
};
|
55
|
-
}
|
56
|
-
if (lastComprehensiveMessage &&
|
57
|
-
lastComprehensiveMessage.role === 'model' &&
|
58
|
-
lastComprehensiveMessage.parts &&
|
59
|
-
lastComprehensiveMessage.parts.length === 0) {
|
60
|
-
lastComprehensiveMessage.parts.push({ text: '' });
|
61
|
-
return {
|
62
|
-
reasoning: 'The last message was a filler model message with no content (nothing for user to act on), model should speak next.',
|
63
|
-
next_speaker: 'model',
|
64
|
-
};
|
65
|
-
}
|
66
|
-
// Things checked out. Let's proceed to potentially making an LLM request.
|
67
|
-
const lastMessage = curatedHistory[curatedHistory.length - 1];
|
68
|
-
if (!lastMessage || lastMessage.role !== 'model') {
|
69
|
-
// Cannot determine next speaker if the last turn wasn't from the model
|
70
|
-
// or if history is empty.
|
71
|
-
return null;
|
72
|
-
}
|
73
|
-
const contents = [
|
74
|
-
...curatedHistory,
|
75
|
-
{ role: 'user', parts: [{ text: CHECK_PROMPT }] },
|
76
|
-
];
|
77
|
-
try {
|
78
|
-
const parsedResponse = (await geminiClient.generateJson(contents, RESPONSE_SCHEMA, abortSignal, DEFAULT_GEMINI_FLASH_LITE_MODEL));
|
79
|
-
if (parsedResponse &&
|
80
|
-
parsedResponse.next_speaker &&
|
81
|
-
['user', 'model'].includes(parsedResponse.next_speaker)) {
|
82
|
-
return parsedResponse;
|
83
|
-
}
|
84
|
-
return null;
|
85
|
-
}
|
86
|
-
catch (error) {
|
87
|
-
const provider = providerName || 'provider';
|
88
|
-
console.warn(`Failed to talk to ${provider} endpoint when seeing if conversation should continue.`, error);
|
89
|
-
// Default to user speaking next when the check fails
|
90
|
-
// This prevents the conversation from hanging
|
91
|
-
return {
|
92
|
-
reasoning: 'Next speaker check failed, defaulting to user input',
|
93
|
-
next_speaker: 'user',
|
94
|
-
};
|
95
|
-
}
|
96
|
-
}
|
97
|
-
//# sourceMappingURL=nextSpeakerChecker.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"nextSpeakerChecker.js","sourceRoot":"","sources":["../../../src/utils/nextSpeakerChecker.ts"],"names":[],"mappings":"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"}
|
@@ -1,9 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
export declare function cacheGoogleAccount(email: string): Promise<void>;
|
7
|
-
export declare function getCachedGoogleAccount(): string | null;
|
8
|
-
export declare function getLifetimeGoogleAccounts(): number;
|
9
|
-
export declare function clearCachedGoogleAccount(): Promise<void>;
|
@@ -1,109 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import path from 'node:path';
|
7
|
-
import { promises as fsp, readFileSync } from 'node:fs';
|
8
|
-
import * as os from 'os';
|
9
|
-
import { LLXPRT_DIR, GOOGLE_ACCOUNTS_FILENAME } from './paths.js';
|
10
|
-
function getGoogleAccountsCachePath() {
|
11
|
-
return path.join(os.homedir(), LLXPRT_DIR, GOOGLE_ACCOUNTS_FILENAME);
|
12
|
-
}
|
13
|
-
/**
|
14
|
-
* Parses and validates the string content of an accounts file.
|
15
|
-
* @param content The raw string content from the file.
|
16
|
-
* @returns A valid UserAccounts object.
|
17
|
-
*/
|
18
|
-
function parseAndValidateAccounts(content) {
|
19
|
-
const defaultState = { active: null, old: [] };
|
20
|
-
if (!content.trim()) {
|
21
|
-
return defaultState;
|
22
|
-
}
|
23
|
-
const parsed = JSON.parse(content);
|
24
|
-
// Inlined validation logic
|
25
|
-
if (typeof parsed !== 'object' || parsed === null) {
|
26
|
-
console.log('Invalid accounts file schema, starting fresh.');
|
27
|
-
return defaultState;
|
28
|
-
}
|
29
|
-
const { active, old } = parsed;
|
30
|
-
const isValid = (active === undefined || active === null || typeof active === 'string') &&
|
31
|
-
(old === undefined ||
|
32
|
-
(Array.isArray(old) && old.every((i) => typeof i === 'string')));
|
33
|
-
if (!isValid) {
|
34
|
-
console.log('Invalid accounts file schema, starting fresh.');
|
35
|
-
return defaultState;
|
36
|
-
}
|
37
|
-
return {
|
38
|
-
active: parsed.active ?? null,
|
39
|
-
old: parsed.old ?? [],
|
40
|
-
};
|
41
|
-
}
|
42
|
-
function readAccountsSync(filePath) {
|
43
|
-
const defaultState = { active: null, old: [] };
|
44
|
-
try {
|
45
|
-
const content = readFileSync(filePath, 'utf-8');
|
46
|
-
return parseAndValidateAccounts(content);
|
47
|
-
}
|
48
|
-
catch (error) {
|
49
|
-
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
50
|
-
return defaultState;
|
51
|
-
}
|
52
|
-
console.log('Error during sync read of accounts, starting fresh.', error);
|
53
|
-
return defaultState;
|
54
|
-
}
|
55
|
-
}
|
56
|
-
async function readAccounts(filePath) {
|
57
|
-
const defaultState = { active: null, old: [] };
|
58
|
-
try {
|
59
|
-
const content = await fsp.readFile(filePath, 'utf-8');
|
60
|
-
return parseAndValidateAccounts(content);
|
61
|
-
}
|
62
|
-
catch (error) {
|
63
|
-
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
64
|
-
return defaultState;
|
65
|
-
}
|
66
|
-
console.log('Could not parse accounts file, starting fresh.', error);
|
67
|
-
return defaultState;
|
68
|
-
}
|
69
|
-
}
|
70
|
-
export async function cacheGoogleAccount(email) {
|
71
|
-
const filePath = getGoogleAccountsCachePath();
|
72
|
-
await fsp.mkdir(path.dirname(filePath), { recursive: true });
|
73
|
-
const accounts = await readAccounts(filePath);
|
74
|
-
if (accounts.active && accounts.active !== email) {
|
75
|
-
if (!accounts.old.includes(accounts.active)) {
|
76
|
-
accounts.old.push(accounts.active);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
// If the new email was in the old list, remove it
|
80
|
-
accounts.old = accounts.old.filter((oldEmail) => oldEmail !== email);
|
81
|
-
accounts.active = email;
|
82
|
-
await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
|
83
|
-
}
|
84
|
-
export function getCachedGoogleAccount() {
|
85
|
-
const filePath = getGoogleAccountsCachePath();
|
86
|
-
const accounts = readAccountsSync(filePath);
|
87
|
-
return accounts.active;
|
88
|
-
}
|
89
|
-
export function getLifetimeGoogleAccounts() {
|
90
|
-
const filePath = getGoogleAccountsCachePath();
|
91
|
-
const accounts = readAccountsSync(filePath);
|
92
|
-
const allAccounts = new Set(accounts.old);
|
93
|
-
if (accounts.active) {
|
94
|
-
allAccounts.add(accounts.active);
|
95
|
-
}
|
96
|
-
return allAccounts.size;
|
97
|
-
}
|
98
|
-
export async function clearCachedGoogleAccount() {
|
99
|
-
const filePath = getGoogleAccountsCachePath();
|
100
|
-
const accounts = await readAccounts(filePath);
|
101
|
-
if (accounts.active) {
|
102
|
-
if (!accounts.old.includes(accounts.active)) {
|
103
|
-
accounts.old.push(accounts.active);
|
104
|
-
}
|
105
|
-
accounts.active = null;
|
106
|
-
}
|
107
|
-
await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
|
108
|
-
}
|
109
|
-
//# sourceMappingURL=user_account.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"user_account.js","sourceRoot":"","sources":["../../../src/utils/user_account.ts"],"names":[],"mappings":"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"}
|
@@ -1,11 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
/**
|
7
|
-
* Retrieves the installation ID from a file, creating it if it doesn't exist.
|
8
|
-
* This ID is used for unique user installation tracking.
|
9
|
-
* @returns A UUID string for the user.
|
10
|
-
*/
|
11
|
-
export declare function getInstallationId(): string;
|
@@ -1,49 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* @license
|
3
|
-
* Copyright 2025 Google LLC
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
5
|
-
*/
|
6
|
-
import * as os from 'os';
|
7
|
-
import * as fs from 'fs';
|
8
|
-
import * as path from 'path';
|
9
|
-
import { randomUUID } from 'crypto';
|
10
|
-
import { LLXPRT_DIR } from './paths.js';
|
11
|
-
const homeDir = os.homedir() ?? '';
|
12
|
-
const llxprtDir = path.join(homeDir, LLXPRT_DIR);
|
13
|
-
const installationIdFile = path.join(llxprtDir, 'installation_id');
|
14
|
-
function ensureLlxprtDirExists() {
|
15
|
-
if (!fs.existsSync(llxprtDir)) {
|
16
|
-
fs.mkdirSync(llxprtDir, { recursive: true });
|
17
|
-
}
|
18
|
-
}
|
19
|
-
function readInstallationIdFromFile() {
|
20
|
-
if (fs.existsSync(installationIdFile)) {
|
21
|
-
const installationid = fs.readFileSync(installationIdFile, 'utf-8').trim();
|
22
|
-
return installationid || null;
|
23
|
-
}
|
24
|
-
return null;
|
25
|
-
}
|
26
|
-
function writeInstallationIdToFile(installationId) {
|
27
|
-
fs.writeFileSync(installationIdFile, installationId, 'utf-8');
|
28
|
-
}
|
29
|
-
/**
|
30
|
-
* Retrieves the installation ID from a file, creating it if it doesn't exist.
|
31
|
-
* This ID is used for unique user installation tracking.
|
32
|
-
* @returns A UUID string for the user.
|
33
|
-
*/
|
34
|
-
export function getInstallationId() {
|
35
|
-
try {
|
36
|
-
ensureLlxprtDirExists();
|
37
|
-
let installationId = readInstallationIdFromFile();
|
38
|
-
if (!installationId) {
|
39
|
-
installationId = randomUUID();
|
40
|
-
writeInstallationIdToFile(installationId);
|
41
|
-
}
|
42
|
-
return installationId;
|
43
|
-
}
|
44
|
-
catch (error) {
|
45
|
-
console.error('Error accessing installation ID file, generating ephemeral ID:', error);
|
46
|
-
return '123456789';
|
47
|
-
}
|
48
|
-
}
|
49
|
-
//# sourceMappingURL=user_id.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"user_id.js","sourceRoot":"","sources":["../../../src/utils/user_id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEnE,SAAS,qBAAqB;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,OAAO,cAAc,IAAI,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,cAAsB;IACvD,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,qBAAqB,EAAE,CAAC;QACxB,IAAI,cAAc,GAAG,0BAA0B,EAAE,CAAC;QAElD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,UAAU,EAAE,CAAC;YAC9B,yBAAyB,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,gEAAgE,EAChE,KAAK,CACN,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC"}
|