@google/gemini-cli-core 0.0.44-beta.0 → 0.0.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -10
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/src/config/config.d.ts +8 -17
- package/dist/src/config/config.js +11 -31
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +0 -4
- package/dist/src/core/baseLlmClient.js +2 -5
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +0 -23
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +2 -3
- package/dist/src/core/client.js +23 -32
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +67 -57
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +3 -12
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +0 -99
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +3 -4
- package/dist/src/core/geminiChat.js +56 -54
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +27 -234
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/prompts.js +2 -3
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/turn.d.ts +4 -1
- package/dist/src/core/turn.js +12 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +14 -44
- package/dist/src/ide/detect-ide.js +69 -29
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +46 -29
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +4 -4
- package/dist/src/ide/ide-client.js +25 -26
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-client.test.js +7 -4
- package/dist/src/ide/ide-client.test.js.map +1 -1
- package/dist/src/ide/ide-installer.d.ts +2 -2
- package/dist/src/ide/ide-installer.js +9 -7
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +13 -20
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/index.d.ts +2 -5
- package/dist/src/index.js +2 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +1 -5
- package/dist/src/mcp/oauth-provider.js +39 -50
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +1 -137
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.js +0 -1
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/policy/policy-engine.js +2 -11
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +0 -45
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/routing/strategies/compositeStrategy.js +3 -4
- package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +1 -1
- package/dist/src/services/chatRecordingService.js +1 -1
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +15 -30
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +11 -43
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -8
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +2 -59
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +0 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +1 -128
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -10
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +0 -18
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +0 -21
- package/dist/src/telemetry/constants.js +0 -23
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -5
- package/dist/src/telemetry/index.js +1 -11
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +1 -6
- package/dist/src/telemetry/loggers.js +2 -91
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +4 -174
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +1 -40
- package/dist/src/telemetry/metrics.js +2 -248
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +1 -387
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.js +1 -4
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.js +0 -13
- package/dist/src/telemetry/sdk.test.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +3 -26
- package/dist/src/telemetry/types.js +6 -49
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -1
- package/dist/src/telemetry/uiTelemetry.js +3 -2
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +11 -11
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/edit.js +0 -6
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +0 -41
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.js +1 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/ls.js +1 -1
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +12 -2
- package/dist/src/tools/mcp-client.js +64 -5
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +154 -9
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +2 -30
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +0 -117
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/shell.js +2 -5
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/smart-edit.js +2 -8
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/smart-edit.test.js +2 -47
- package/dist/src/tools/smart-edit.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +0 -1
- package/dist/src/tools/tool-error.js +0 -1
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tools.d.ts +3 -11
- package/dist/src/tools/tools.js +3 -94
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.d.ts +1 -1
- package/dist/src/utils/getFolderStructure.d.ts +1 -1
- package/dist/src/utils/getFolderStructure.js +1 -1
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/llm-edit-fixer.js +0 -1
- package/dist/src/utils/llm-edit-fixer.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +1 -1
- package/dist/src/utils/memoryDiscovery.js +1 -1
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/retry.js +1 -7
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +0 -29
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +1 -11
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/shell-utils.js +1 -5
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +0 -5
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/src/config/constants.d.ts +0 -11
- package/dist/src/config/constants.js +0 -16
- package/dist/src/config/constants.js.map +0 -1
- package/dist/src/telemetry/activity-detector.d.ts +0 -41
- package/dist/src/telemetry/activity-detector.js +0 -61
- package/dist/src/telemetry/activity-detector.js.map +0 -1
- package/dist/src/telemetry/activity-detector.test.d.ts +0 -6
- package/dist/src/telemetry/activity-detector.test.js +0 -136
- package/dist/src/telemetry/activity-detector.test.js.map +0 -1
- package/dist/src/telemetry/activity-types.d.ts +0 -19
- package/dist/src/telemetry/activity-types.js +0 -21
- package/dist/src/telemetry/activity-types.js.map +0 -1
- package/dist/src/telemetry/config.d.ts +0 -31
- package/dist/src/telemetry/config.js +0 -76
- package/dist/src/telemetry/config.js.map +0 -1
- package/dist/src/telemetry/config.test.d.ts +0 -6
- package/dist/src/telemetry/config.test.js +0 -124
- package/dist/src/telemetry/config.test.js.map +0 -1
- package/dist/src/tools/message-bus-integration.test.d.ts +0 -6
- package/dist/src/tools/message-bus-integration.test.js +0 -183
- package/dist/src/tools/message-bus-integration.test.js.map +0 -1
- package/dist/src/tools/write-todos.d.ts +0 -25
- package/dist/src/tools/write-todos.js +0 -150
- package/dist/src/tools/write-todos.js.map +0 -1
- package/dist/src/tools/write-todos.test.d.ts +0 -6
- package/dist/src/tools/write-todos.test.js +0 -89
- package/dist/src/tools/write-todos.test.js.map +0 -1
- package/dist/src/utils/schemaValidator.test.d.ts +0 -6
- package/dist/src/utils/schemaValidator.test.js +0 -113
- package/dist/src/utils/schemaValidator.test.js.map +0 -1
- package/dist/src/utils/thoughtUtils.d.ts +0 -21
- package/dist/src/utils/thoughtUtils.js +0 -39
- package/dist/src/utils/thoughtUtils.js.map +0 -1
- package/dist/src/utils/thoughtUtils.test.d.ts +0 -6
- package/dist/src/utils/thoughtUtils.test.js +0 -78
- package/dist/src/utils/thoughtUtils.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@google/gemini-cli-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.88",
|
|
4
4
|
"description": "Gemini CLI Core",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"lint": "eslint . --ext .ts,.tsx",
|
|
14
14
|
"format": "prettier --write .",
|
|
15
15
|
"test": "vitest run",
|
|
16
|
-
"test:ci": "vitest run",
|
|
16
|
+
"test:ci": "vitest run --coverage",
|
|
17
17
|
"typecheck": "tsc --noEmit"
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
export interface FileFilteringOptions {
|
|
7
|
-
respectGitIgnore: boolean;
|
|
8
|
-
respectGeminiIgnore: boolean;
|
|
9
|
-
}
|
|
10
|
-
export declare const DEFAULT_MEMORY_FILE_FILTERING_OPTIONS: FileFilteringOptions;
|
|
11
|
-
export declare const DEFAULT_FILE_FILTERING_OPTIONS: FileFilteringOptions;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
// For memory files
|
|
7
|
-
export const DEFAULT_MEMORY_FILE_FILTERING_OPTIONS = {
|
|
8
|
-
respectGitIgnore: false,
|
|
9
|
-
respectGeminiIgnore: true,
|
|
10
|
-
};
|
|
11
|
-
// For all other files
|
|
12
|
-
export const DEFAULT_FILE_FILTERING_OPTIONS = {
|
|
13
|
-
respectGitIgnore: true,
|
|
14
|
-
respectGeminiIgnore: true,
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,mBAAmB;AACnB,MAAM,CAAC,MAAM,qCAAqC,GAAyB;IACzE,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,IAAI;CAC1B,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,8BAA8B,GAAyB;IAClE,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;CAC1B,CAAC"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Tracks user activity state to determine when memory monitoring should be active
|
|
8
|
-
*/
|
|
9
|
-
export declare class ActivityDetector {
|
|
10
|
-
private lastActivityTime;
|
|
11
|
-
private readonly idleThresholdMs;
|
|
12
|
-
constructor(idleThresholdMs?: number);
|
|
13
|
-
/**
|
|
14
|
-
* Record user activity (called by CLI when user types, adds messages, etc.)
|
|
15
|
-
*/
|
|
16
|
-
recordActivity(): void;
|
|
17
|
-
/**
|
|
18
|
-
* Check if user is currently active (activity within idle threshold)
|
|
19
|
-
*/
|
|
20
|
-
isUserActive(): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Get time since last activity in milliseconds
|
|
23
|
-
*/
|
|
24
|
-
getTimeSinceLastActivity(): number;
|
|
25
|
-
/**
|
|
26
|
-
* Get last activity timestamp
|
|
27
|
-
*/
|
|
28
|
-
getLastActivityTime(): number;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Get global activity detector instance
|
|
32
|
-
*/
|
|
33
|
-
export declare function getActivityDetector(): ActivityDetector;
|
|
34
|
-
/**
|
|
35
|
-
* Record user activity (convenience function for CLI to call)
|
|
36
|
-
*/
|
|
37
|
-
export declare function recordUserActivity(): void;
|
|
38
|
-
/**
|
|
39
|
-
* Check if user is currently active (convenience function)
|
|
40
|
-
*/
|
|
41
|
-
export declare function isUserActive(): boolean;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Tracks user activity state to determine when memory monitoring should be active
|
|
8
|
-
*/
|
|
9
|
-
export class ActivityDetector {
|
|
10
|
-
lastActivityTime = Date.now();
|
|
11
|
-
idleThresholdMs;
|
|
12
|
-
constructor(idleThresholdMs = 30000) {
|
|
13
|
-
this.idleThresholdMs = idleThresholdMs;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Record user activity (called by CLI when user types, adds messages, etc.)
|
|
17
|
-
*/
|
|
18
|
-
recordActivity() {
|
|
19
|
-
this.lastActivityTime = Date.now();
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Check if user is currently active (activity within idle threshold)
|
|
23
|
-
*/
|
|
24
|
-
isUserActive() {
|
|
25
|
-
const timeSinceActivity = Date.now() - this.lastActivityTime;
|
|
26
|
-
return timeSinceActivity < this.idleThresholdMs;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Get time since last activity in milliseconds
|
|
30
|
-
*/
|
|
31
|
-
getTimeSinceLastActivity() {
|
|
32
|
-
return Date.now() - this.lastActivityTime;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Get last activity timestamp
|
|
36
|
-
*/
|
|
37
|
-
getLastActivityTime() {
|
|
38
|
-
return this.lastActivityTime;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
// Global activity detector instance (eagerly created with default threshold)
|
|
42
|
-
const globalActivityDetector = new ActivityDetector();
|
|
43
|
-
/**
|
|
44
|
-
* Get global activity detector instance
|
|
45
|
-
*/
|
|
46
|
-
export function getActivityDetector() {
|
|
47
|
-
return globalActivityDetector;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Record user activity (convenience function for CLI to call)
|
|
51
|
-
*/
|
|
52
|
-
export function recordUserActivity() {
|
|
53
|
-
globalActivityDetector.recordActivity();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Check if user is currently active (convenience function)
|
|
57
|
-
*/
|
|
58
|
-
export function isUserActive() {
|
|
59
|
-
return globalActivityDetector.isUserActive();
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=activity-detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity-detector.js","sourceRoot":"","sources":["../../../src/telemetry/activity-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,gBAAgB,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,eAAe,CAAS;IAEzC,YAAY,kBAA0B,KAAK;QACzC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC7D,OAAO,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,wBAAwB;QACtB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,sBAAsB,GAAqB,IAAI,gBAAgB,EAAE,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,sBAAsB,CAAC,cAAc,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,sBAAsB,CAAC,YAAY,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
7
|
-
import { ActivityDetector, getActivityDetector, recordUserActivity, isUserActive, } from './activity-detector.js';
|
|
8
|
-
describe('ActivityDetector', () => {
|
|
9
|
-
let detector;
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
detector = new ActivityDetector(1000); // 1 second idle threshold for testing
|
|
12
|
-
});
|
|
13
|
-
describe('constructor', () => {
|
|
14
|
-
it('should initialize with default idle threshold', () => {
|
|
15
|
-
const defaultDetector = new ActivityDetector();
|
|
16
|
-
expect(defaultDetector).toBeInstanceOf(ActivityDetector);
|
|
17
|
-
});
|
|
18
|
-
it('should initialize with custom idle threshold', () => {
|
|
19
|
-
const customDetector = new ActivityDetector(5000);
|
|
20
|
-
expect(customDetector).toBeInstanceOf(ActivityDetector);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe('recordActivity', () => {
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
vi.useFakeTimers();
|
|
26
|
-
});
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
vi.useRealTimers();
|
|
29
|
-
});
|
|
30
|
-
it('should update last activity time', () => {
|
|
31
|
-
const beforeTime = detector.getLastActivityTime();
|
|
32
|
-
vi.advanceTimersByTime(100);
|
|
33
|
-
detector.recordActivity();
|
|
34
|
-
const afterTime = detector.getLastActivityTime();
|
|
35
|
-
expect(afterTime).toBeGreaterThan(beforeTime);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
describe('isUserActive', () => {
|
|
39
|
-
beforeEach(() => {
|
|
40
|
-
vi.useFakeTimers();
|
|
41
|
-
});
|
|
42
|
-
afterEach(() => {
|
|
43
|
-
vi.useRealTimers();
|
|
44
|
-
});
|
|
45
|
-
it('should return true immediately after construction', () => {
|
|
46
|
-
expect(detector.isUserActive()).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
it('should return true within idle threshold', () => {
|
|
49
|
-
detector.recordActivity();
|
|
50
|
-
expect(detector.isUserActive()).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
it('should return false after idle threshold', () => {
|
|
53
|
-
// Advance time beyond idle threshold
|
|
54
|
-
vi.advanceTimersByTime(2000); // 2 seconds, threshold is 1 second
|
|
55
|
-
expect(detector.isUserActive()).toBe(false);
|
|
56
|
-
});
|
|
57
|
-
it('should return true again after recording new activity', () => {
|
|
58
|
-
// Go idle
|
|
59
|
-
vi.advanceTimersByTime(2000);
|
|
60
|
-
expect(detector.isUserActive()).toBe(false);
|
|
61
|
-
// Record new activity
|
|
62
|
-
detector.recordActivity();
|
|
63
|
-
expect(detector.isUserActive()).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
describe('getTimeSinceLastActivity', () => {
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
vi.useFakeTimers();
|
|
69
|
-
});
|
|
70
|
-
afterEach(() => {
|
|
71
|
-
vi.useRealTimers();
|
|
72
|
-
});
|
|
73
|
-
it('should return time elapsed since last activity', () => {
|
|
74
|
-
detector.recordActivity();
|
|
75
|
-
vi.advanceTimersByTime(500);
|
|
76
|
-
const timeSince = detector.getTimeSinceLastActivity();
|
|
77
|
-
expect(timeSince).toBe(500);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
describe('getLastActivityTime', () => {
|
|
81
|
-
it('should return the timestamp of last activity', () => {
|
|
82
|
-
const before = Date.now();
|
|
83
|
-
detector.recordActivity();
|
|
84
|
-
const activityTime = detector.getLastActivityTime();
|
|
85
|
-
const after = Date.now();
|
|
86
|
-
expect(activityTime).toBeGreaterThanOrEqual(before);
|
|
87
|
-
expect(activityTime).toBeLessThanOrEqual(after);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe('Global Activity Detector Functions', () => {
|
|
92
|
-
describe('global instance', () => {
|
|
93
|
-
it('should expose a global ActivityDetector via getActivityDetector', () => {
|
|
94
|
-
const detector = getActivityDetector();
|
|
95
|
-
expect(detector).toBeInstanceOf(ActivityDetector);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
describe('getActivityDetector', () => {
|
|
99
|
-
it('should always return the global instance', () => {
|
|
100
|
-
const detector = getActivityDetector();
|
|
101
|
-
const detectorAgain = getActivityDetector();
|
|
102
|
-
expect(detectorAgain).toBe(detector);
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
describe('recordUserActivity', () => {
|
|
106
|
-
beforeEach(() => {
|
|
107
|
-
vi.useFakeTimers();
|
|
108
|
-
});
|
|
109
|
-
afterEach(() => {
|
|
110
|
-
vi.useRealTimers();
|
|
111
|
-
});
|
|
112
|
-
it('should record activity on existing detector', () => {
|
|
113
|
-
const detector = getActivityDetector();
|
|
114
|
-
const beforeTime = detector.getLastActivityTime();
|
|
115
|
-
vi.advanceTimersByTime(100);
|
|
116
|
-
recordUserActivity();
|
|
117
|
-
const afterTime = detector.getLastActivityTime();
|
|
118
|
-
expect(afterTime).toBeGreaterThan(beforeTime);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
describe('isUserActive', () => {
|
|
122
|
-
beforeEach(() => {
|
|
123
|
-
vi.useFakeTimers();
|
|
124
|
-
});
|
|
125
|
-
afterEach(() => {
|
|
126
|
-
vi.useRealTimers();
|
|
127
|
-
});
|
|
128
|
-
it('should reflect global detector state', () => {
|
|
129
|
-
expect(isUserActive()).toBe(true);
|
|
130
|
-
// Default idle threshold is 30s; advance beyond it
|
|
131
|
-
vi.advanceTimersByTime(31000);
|
|
132
|
-
expect(isUserActive()).toBe(false);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
//# sourceMappingURL=activity-detector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity-detector.test.js","sourceRoot":"","sources":["../../../src/telemetry/activity-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Types of user activities that can be tracked
|
|
8
|
-
*/
|
|
9
|
-
export declare enum ActivityType {
|
|
10
|
-
USER_INPUT_START = "user_input_start",
|
|
11
|
-
USER_INPUT_END = "user_input_end",
|
|
12
|
-
MESSAGE_ADDED = "message_added",
|
|
13
|
-
TOOL_CALL_SCHEDULED = "tool_call_scheduled",
|
|
14
|
-
TOOL_CALL_COMPLETED = "tool_call_completed",
|
|
15
|
-
STREAM_START = "stream_start",
|
|
16
|
-
STREAM_END = "stream_end",
|
|
17
|
-
HISTORY_UPDATED = "history_updated",
|
|
18
|
-
MANUAL_TRIGGER = "manual_trigger"
|
|
19
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Types of user activities that can be tracked
|
|
8
|
-
*/
|
|
9
|
-
export var ActivityType;
|
|
10
|
-
(function (ActivityType) {
|
|
11
|
-
ActivityType["USER_INPUT_START"] = "user_input_start";
|
|
12
|
-
ActivityType["USER_INPUT_END"] = "user_input_end";
|
|
13
|
-
ActivityType["MESSAGE_ADDED"] = "message_added";
|
|
14
|
-
ActivityType["TOOL_CALL_SCHEDULED"] = "tool_call_scheduled";
|
|
15
|
-
ActivityType["TOOL_CALL_COMPLETED"] = "tool_call_completed";
|
|
16
|
-
ActivityType["STREAM_START"] = "stream_start";
|
|
17
|
-
ActivityType["STREAM_END"] = "stream_end";
|
|
18
|
-
ActivityType["HISTORY_UPDATED"] = "history_updated";
|
|
19
|
-
ActivityType["MANUAL_TRIGGER"] = "manual_trigger";
|
|
20
|
-
})(ActivityType || (ActivityType = {}));
|
|
21
|
-
//# sourceMappingURL=activity-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"activity-types.js","sourceRoot":"","sources":["../../../src/telemetry/activity-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAN,IAAY,YAUX;AAVD,WAAY,YAAY;IACtB,qDAAqC,CAAA;IACrC,iDAAiC,CAAA;IACjC,+CAA+B,CAAA;IAC/B,2DAA2C,CAAA;IAC3C,2DAA2C,CAAA;IAC3C,6CAA6B,CAAA;IAC7B,yCAAyB,CAAA;IACzB,mDAAmC,CAAA;IACnC,iDAAiC,CAAA;AACnC,CAAC,EAVW,YAAY,KAAZ,YAAY,QAUvB"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import type { TelemetrySettings } from '../config/config.js';
|
|
7
|
-
import { TelemetryTarget } from './index.js';
|
|
8
|
-
/**
|
|
9
|
-
* Parse a boolean environment flag. Accepts 'true'/'1' as true.
|
|
10
|
-
*/
|
|
11
|
-
export declare function parseBooleanEnvFlag(value: string | undefined): boolean | undefined;
|
|
12
|
-
/**
|
|
13
|
-
* Normalize a telemetry target value into TelemetryTarget or undefined.
|
|
14
|
-
*/
|
|
15
|
-
export declare function parseTelemetryTargetValue(value: string | TelemetryTarget | undefined): TelemetryTarget | undefined;
|
|
16
|
-
export interface TelemetryArgOverrides {
|
|
17
|
-
telemetry?: boolean;
|
|
18
|
-
telemetryTarget?: string | TelemetryTarget;
|
|
19
|
-
telemetryOtlpEndpoint?: string;
|
|
20
|
-
telemetryOtlpProtocol?: string;
|
|
21
|
-
telemetryLogPrompts?: boolean;
|
|
22
|
-
telemetryOutfile?: string;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Build TelemetrySettings by resolving from argv (highest), env, then settings.
|
|
26
|
-
*/
|
|
27
|
-
export declare function resolveTelemetrySettings(options: {
|
|
28
|
-
argv?: TelemetryArgOverrides;
|
|
29
|
-
env?: Record<string, string | undefined>;
|
|
30
|
-
settings?: TelemetrySettings;
|
|
31
|
-
}): Promise<TelemetrySettings>;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { FatalConfigError } from '../utils/errors.js';
|
|
7
|
-
import { TelemetryTarget } from './index.js';
|
|
8
|
-
/**
|
|
9
|
-
* Parse a boolean environment flag. Accepts 'true'/'1' as true.
|
|
10
|
-
*/
|
|
11
|
-
export function parseBooleanEnvFlag(value) {
|
|
12
|
-
if (value === undefined)
|
|
13
|
-
return undefined;
|
|
14
|
-
return value === 'true' || value === '1';
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Normalize a telemetry target value into TelemetryTarget or undefined.
|
|
18
|
-
*/
|
|
19
|
-
export function parseTelemetryTargetValue(value) {
|
|
20
|
-
if (value === undefined)
|
|
21
|
-
return undefined;
|
|
22
|
-
if (value === TelemetryTarget.LOCAL || value === 'local') {
|
|
23
|
-
return TelemetryTarget.LOCAL;
|
|
24
|
-
}
|
|
25
|
-
if (value === TelemetryTarget.GCP || value === 'gcp') {
|
|
26
|
-
return TelemetryTarget.GCP;
|
|
27
|
-
}
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Build TelemetrySettings by resolving from argv (highest), env, then settings.
|
|
32
|
-
*/
|
|
33
|
-
export async function resolveTelemetrySettings(options) {
|
|
34
|
-
const argv = options.argv ?? {};
|
|
35
|
-
const env = options.env ?? {};
|
|
36
|
-
const settings = options.settings ?? {};
|
|
37
|
-
const enabled = argv.telemetry ??
|
|
38
|
-
parseBooleanEnvFlag(env['GEMINI_TELEMETRY_ENABLED']) ??
|
|
39
|
-
settings.enabled;
|
|
40
|
-
const rawTarget = argv.telemetryTarget ??
|
|
41
|
-
env['GEMINI_TELEMETRY_TARGET'] ??
|
|
42
|
-
settings.target;
|
|
43
|
-
const target = parseTelemetryTargetValue(rawTarget);
|
|
44
|
-
if (rawTarget !== undefined && target === undefined) {
|
|
45
|
-
throw new FatalConfigError(`Invalid telemetry target: ${String(rawTarget)}. Valid values are: local, gcp`);
|
|
46
|
-
}
|
|
47
|
-
const otlpEndpoint = argv.telemetryOtlpEndpoint ??
|
|
48
|
-
env['GEMINI_TELEMETRY_OTLP_ENDPOINT'] ??
|
|
49
|
-
env['OTEL_EXPORTER_OTLP_ENDPOINT'] ??
|
|
50
|
-
settings.otlpEndpoint;
|
|
51
|
-
const rawProtocol = argv.telemetryOtlpProtocol ??
|
|
52
|
-
env['GEMINI_TELEMETRY_OTLP_PROTOCOL'] ??
|
|
53
|
-
settings.otlpProtocol;
|
|
54
|
-
const otlpProtocol = ['grpc', 'http'].find((p) => p === rawProtocol);
|
|
55
|
-
if (rawProtocol !== undefined && otlpProtocol === undefined) {
|
|
56
|
-
throw new FatalConfigError(`Invalid telemetry OTLP protocol: ${String(rawProtocol)}. Valid values are: grpc, http`);
|
|
57
|
-
}
|
|
58
|
-
const logPrompts = argv.telemetryLogPrompts ??
|
|
59
|
-
parseBooleanEnvFlag(env['GEMINI_TELEMETRY_LOG_PROMPTS']) ??
|
|
60
|
-
settings.logPrompts;
|
|
61
|
-
const outfile = argv.telemetryOutfile ??
|
|
62
|
-
env['GEMINI_TELEMETRY_OUTFILE'] ??
|
|
63
|
-
settings.outfile;
|
|
64
|
-
const useCollector = parseBooleanEnvFlag(env['GEMINI_TELEMETRY_USE_COLLECTOR']) ??
|
|
65
|
-
settings.useCollector;
|
|
66
|
-
return {
|
|
67
|
-
enabled,
|
|
68
|
-
target,
|
|
69
|
-
otlpEndpoint,
|
|
70
|
-
otlpProtocol,
|
|
71
|
-
logPrompts,
|
|
72
|
-
outfile,
|
|
73
|
-
useCollector,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/telemetry/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Google LLC
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect } from 'vitest';
|
|
7
|
-
import { parseBooleanEnvFlag, parseTelemetryTargetValue, resolveTelemetrySettings, } from './config.js';
|
|
8
|
-
import { TelemetryTarget } from './index.js';
|
|
9
|
-
describe('telemetry/config helpers', () => {
|
|
10
|
-
describe('parseBooleanEnvFlag', () => {
|
|
11
|
-
it('returns undefined for undefined', () => {
|
|
12
|
-
expect(parseBooleanEnvFlag(undefined)).toBeUndefined();
|
|
13
|
-
});
|
|
14
|
-
it('parses true values', () => {
|
|
15
|
-
expect(parseBooleanEnvFlag('true')).toBe(true);
|
|
16
|
-
expect(parseBooleanEnvFlag('1')).toBe(true);
|
|
17
|
-
});
|
|
18
|
-
it('parses false/other values as false', () => {
|
|
19
|
-
expect(parseBooleanEnvFlag('false')).toBe(false);
|
|
20
|
-
expect(parseBooleanEnvFlag('0')).toBe(false);
|
|
21
|
-
expect(parseBooleanEnvFlag('TRUE')).toBe(false);
|
|
22
|
-
expect(parseBooleanEnvFlag('random')).toBe(false);
|
|
23
|
-
expect(parseBooleanEnvFlag('')).toBe(false);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
describe('parseTelemetryTargetValue', () => {
|
|
27
|
-
it('parses string values', () => {
|
|
28
|
-
expect(parseTelemetryTargetValue('local')).toBe(TelemetryTarget.LOCAL);
|
|
29
|
-
expect(parseTelemetryTargetValue('gcp')).toBe(TelemetryTarget.GCP);
|
|
30
|
-
});
|
|
31
|
-
it('accepts enum values', () => {
|
|
32
|
-
expect(parseTelemetryTargetValue(TelemetryTarget.LOCAL)).toBe(TelemetryTarget.LOCAL);
|
|
33
|
-
expect(parseTelemetryTargetValue(TelemetryTarget.GCP)).toBe(TelemetryTarget.GCP);
|
|
34
|
-
});
|
|
35
|
-
it('returns undefined for unknown', () => {
|
|
36
|
-
expect(parseTelemetryTargetValue('other')).toBeUndefined();
|
|
37
|
-
expect(parseTelemetryTargetValue(undefined)).toBeUndefined();
|
|
38
|
-
});
|
|
39
|
-
});
|
|
40
|
-
describe('resolveTelemetrySettings', () => {
|
|
41
|
-
it('falls back to settings when no argv/env provided', async () => {
|
|
42
|
-
const settings = {
|
|
43
|
-
enabled: false,
|
|
44
|
-
target: TelemetryTarget.LOCAL,
|
|
45
|
-
otlpEndpoint: 'http://localhost:4317',
|
|
46
|
-
otlpProtocol: 'grpc',
|
|
47
|
-
logPrompts: false,
|
|
48
|
-
outfile: 'settings.log',
|
|
49
|
-
useCollector: false,
|
|
50
|
-
};
|
|
51
|
-
const resolved = await resolveTelemetrySettings({ settings });
|
|
52
|
-
expect(resolved).toEqual(settings);
|
|
53
|
-
});
|
|
54
|
-
it('uses env over settings and argv over env', async () => {
|
|
55
|
-
const settings = {
|
|
56
|
-
enabled: false,
|
|
57
|
-
target: TelemetryTarget.LOCAL,
|
|
58
|
-
otlpEndpoint: 'http://settings:4317',
|
|
59
|
-
otlpProtocol: 'grpc',
|
|
60
|
-
logPrompts: false,
|
|
61
|
-
outfile: 'settings.log',
|
|
62
|
-
useCollector: false,
|
|
63
|
-
};
|
|
64
|
-
const env = {
|
|
65
|
-
GEMINI_TELEMETRY_ENABLED: '1',
|
|
66
|
-
GEMINI_TELEMETRY_TARGET: 'gcp',
|
|
67
|
-
GEMINI_TELEMETRY_OTLP_ENDPOINT: 'http://env:4317',
|
|
68
|
-
GEMINI_TELEMETRY_OTLP_PROTOCOL: 'http',
|
|
69
|
-
GEMINI_TELEMETRY_LOG_PROMPTS: 'true',
|
|
70
|
-
GEMINI_TELEMETRY_OUTFILE: 'env.log',
|
|
71
|
-
GEMINI_TELEMETRY_USE_COLLECTOR: 'true',
|
|
72
|
-
};
|
|
73
|
-
const argv = {
|
|
74
|
-
telemetry: false,
|
|
75
|
-
telemetryTarget: 'local',
|
|
76
|
-
telemetryOtlpEndpoint: 'http://argv:4317',
|
|
77
|
-
telemetryOtlpProtocol: 'grpc',
|
|
78
|
-
telemetryLogPrompts: false,
|
|
79
|
-
telemetryOutfile: 'argv.log',
|
|
80
|
-
};
|
|
81
|
-
const resolvedEnv = await resolveTelemetrySettings({ env, settings });
|
|
82
|
-
expect(resolvedEnv).toEqual({
|
|
83
|
-
enabled: true,
|
|
84
|
-
target: TelemetryTarget.GCP,
|
|
85
|
-
otlpEndpoint: 'http://env:4317',
|
|
86
|
-
otlpProtocol: 'http',
|
|
87
|
-
logPrompts: true,
|
|
88
|
-
outfile: 'env.log',
|
|
89
|
-
useCollector: true,
|
|
90
|
-
});
|
|
91
|
-
const resolvedArgv = await resolveTelemetrySettings({
|
|
92
|
-
argv,
|
|
93
|
-
env,
|
|
94
|
-
settings,
|
|
95
|
-
});
|
|
96
|
-
expect(resolvedArgv).toEqual({
|
|
97
|
-
enabled: false,
|
|
98
|
-
target: TelemetryTarget.LOCAL,
|
|
99
|
-
otlpEndpoint: 'http://argv:4317',
|
|
100
|
-
otlpProtocol: 'grpc',
|
|
101
|
-
logPrompts: false,
|
|
102
|
-
outfile: 'argv.log',
|
|
103
|
-
useCollector: true, // from env as no argv option
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
it('falls back to OTEL_EXPORTER_OTLP_ENDPOINT when GEMINI var is missing', async () => {
|
|
107
|
-
const settings = {};
|
|
108
|
-
const env = {
|
|
109
|
-
OTEL_EXPORTER_OTLP_ENDPOINT: 'http://otel:4317',
|
|
110
|
-
};
|
|
111
|
-
const resolved = await resolveTelemetrySettings({ env, settings });
|
|
112
|
-
expect(resolved.otlpEndpoint).toBe('http://otel:4317');
|
|
113
|
-
});
|
|
114
|
-
it('throws on unknown protocol values', async () => {
|
|
115
|
-
const env = { GEMINI_TELEMETRY_OTLP_PROTOCOL: 'unknown' };
|
|
116
|
-
await expect(resolveTelemetrySettings({ env })).rejects.toThrow(/Invalid telemetry OTLP protocol/i);
|
|
117
|
-
});
|
|
118
|
-
it('throws on unknown target values', async () => {
|
|
119
|
-
const env = { GEMINI_TELEMETRY_TARGET: 'unknown' };
|
|
120
|
-
await expect(resolveTelemetrySettings({ env })).rejects.toThrow(/Invalid telemetry target/i);
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../src/telemetry/config.test.ts"],"names":[],"mappings":"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"}
|