@machina.ai/cell-cli-core 1.0.13-rc9 → 1.0.21-rc1
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 +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/package.json +12 -4
- package/dist/src/code_assist/converter.d.ts +6 -3
- package/dist/src/code_assist/converter.js +4 -2
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/converter.test.js +61 -11
- package/dist/src/code_assist/converter.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +43 -18
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +142 -9
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +2 -2
- package/dist/src/code_assist/server.js +5 -5
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +13 -10
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.js +49 -18
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +115 -9
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/config/config.d.ts +71 -13
- package/dist/src/config/config.js +154 -41
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +206 -21
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +19 -47
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -0
- package/dist/src/config/models.js +1 -0
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/core/client.d.ts +15 -16
- package/dist/src/core/client.js +247 -104
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +798 -49
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +2 -2
- package/dist/src/core/contentGenerator.js +23 -21
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +30 -126
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +23 -10
- package/dist/src/core/coreToolScheduler.js +201 -77
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +322 -94
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +8 -6
- package/dist/src/core/geminiChat.js +49 -51
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +2 -2
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiRequest.js +2 -37
- package/dist/src/core/geminiRequest.js.map +1 -1
- package/dist/src/core/logger.d.ts +24 -1
- package/dist/src/core/logger.js +128 -4
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/logger.test.js +157 -11
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +25 -0
- package/dist/src/core/loggingContentGenerator.js +95 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -0
- package/dist/src/core/nonInteractiveToolExecutor.js +39 -4
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +85 -62
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +43 -19
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +118 -1
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/subagent.d.ts +230 -0
- package/dist/src/core/subagent.js +447 -0
- package/dist/src/core/subagent.js.map +1 -0
- package/dist/src/core/subagent.test.js +515 -0
- package/dist/src/core/subagent.test.js.map +1 -0
- package/dist/src/core/tokenLimits.js +1 -0
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/turn.d.ts +3 -0
- package/dist/src/core/turn.js +4 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +4 -0
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +7 -0
- package/dist/src/generated/git-commit.js +10 -0
- package/dist/src/generated/git-commit.js.map +1 -0
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/detect-ide.d.ts +20 -0
- package/dist/src/ide/detect-ide.js +86 -0
- package/dist/src/ide/detect-ide.js.map +1 -0
- package/dist/src/ide/detect-ide.test.js +65 -0
- package/dist/src/ide/detect-ide.test.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +63 -0
- package/dist/src/ide/ide-client.js +320 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- package/dist/src/ide/ide-client.test.d.ts +6 -0
- package/dist/src/ide/ide-client.test.js +43 -0
- package/dist/src/ide/ide-client.test.js.map +1 -0
- package/dist/src/ide/ide-installer.d.ts +14 -0
- package/dist/src/ide/ide-installer.js +98 -0
- package/dist/src/ide/ide-installer.js.map +1 -0
- package/dist/src/ide/ide-installer.test.d.ts +6 -0
- package/dist/src/ide/ide-installer.test.js +53 -0
- package/dist/src/ide/ide-installer.test.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +374 -0
- package/dist/src/ide/ideContext.js +147 -0
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/ide/ideContext.test.d.ts +6 -0
- package/dist/src/ide/ideContext.test.js +265 -0
- package/dist/src/ide/ideContext.test.js.map +1 -0
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +17 -1
- package/dist/src/index.js +20 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +23 -0
- package/dist/src/mcp/google-auth-provider.js +72 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
- package/dist/src/mcp/google-auth-provider.test.js +89 -0
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
- package/dist/src/mcp/oauth-provider.d.ts +6 -2
- package/dist/src/mcp/oauth-provider.js +208 -53
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +222 -70
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.d.ts +3 -1
- package/dist/src/mcp/oauth-token-storage.js +3 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +52 -14
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +18 -3
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/mocks/msw.d.ts +6 -0
- package/dist/src/mocks/msw.js +8 -0
- package/dist/src/mocks/msw.js.map +1 -0
- package/dist/src/prompts/mcp-prompts.d.ts +8 -0
- package/dist/src/prompts/mcp-prompts.js +13 -0
- package/dist/src/prompts/mcp-prompts.js.map +1 -0
- package/dist/src/prompts/prompt-registry.d.ts +34 -0
- package/dist/src/prompts/prompt-registry.js +63 -0
- package/dist/src/prompts/prompt-registry.js.map +1 -0
- package/dist/src/services/chatRecordingService.d.ts +150 -0
- package/dist/src/services/chatRecordingService.js +318 -0
- package/dist/src/services/chatRecordingService.js.map +1 -0
- package/dist/src/services/chatRecordingService.test.d.ts +6 -0
- package/dist/src/services/chatRecordingService.test.js +288 -0
- package/dist/src/services/chatRecordingService.test.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.test.js +101 -60
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/fileSystemService.d.ts +31 -0
- package/dist/src/services/fileSystemService.js +18 -0
- package/dist/src/services/fileSystemService.js.map +1 -0
- package/dist/src/services/fileSystemService.test.d.ts +6 -0
- package/dist/src/services/fileSystemService.test.js +41 -0
- package/dist/src/services/fileSystemService.test.js.map +1 -0
- package/dist/src/services/gitService.test.js +67 -86
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +51 -5
- package/dist/src/services/loopDetectionService.js +152 -45
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +286 -89
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +70 -0
- package/dist/src/services/shellExecutionService.js +175 -0
- package/dist/src/services/shellExecutionService.js.map +1 -0
- package/dist/src/services/shellExecutionService.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.test.js +282 -0
- package/dist/src/services/shellExecutionService.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +81 -9
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +356 -182
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +17 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +342 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +19 -2
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +51 -9
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +4 -0
- package/dist/src/telemetry/constants.js +4 -0
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +28 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/integration.test.circular.js +1 -0
- package/dist/src/telemetry/integration.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +6 -1
- package/dist/src/telemetry/loggers.js +87 -6
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +9 -2
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +51 -11
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +7 -2
- package/dist/src/telemetry/metrics.js +26 -6
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +81 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.d.ts +1 -1
- package/dist/src/telemetry/sdk.js +77 -30
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.d.ts +6 -0
- package/dist/src/telemetry/sdk.test.js +82 -0
- package/dist/src/telemetry/sdk.test.js.map +1 -0
- package/dist/src/telemetry/telemetry.test.js +2 -2
- package/dist/src/telemetry/telemetry.test.js.map +1 -1
- package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
- package/dist/src/telemetry/tool-call-decision.js +29 -0
- package/dist/src/telemetry/tool-call-decision.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +74 -18
- package/dist/src/telemetry/types.js +110 -32
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +8 -1
- package/dist/src/telemetry/uiTelemetry.js +17 -2
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +60 -10
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/config.d.ts +16 -0
- package/dist/src/test-utils/config.js +32 -0
- package/dist/src/test-utils/config.js.map +1 -0
- package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
- package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
- package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
- package/dist/src/test-utils/tools.d.ts +44 -0
- package/dist/src/test-utils/tools.js +105 -0
- package/dist/src/test-utils/tools.js.map +1 -0
- package/dist/src/tools/diffOptions.d.ts +2 -0
- package/dist/src/tools/diffOptions.js +28 -0
- package/dist/src/tools/diffOptions.js.map +1 -1
- package/dist/src/tools/diffOptions.test.d.ts +6 -0
- package/dist/src/tools/diffOptions.test.js +119 -0
- package/dist/src/tools/diffOptions.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +10 -34
- package/dist/src/tools/edit.js +171 -131
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +220 -43
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.d.ts +4 -11
- package/dist/src/tools/glob.js +129 -97
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +73 -17
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +5 -37
- package/dist/src/tools/grep.js +175 -100
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +112 -28
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +4 -23
- package/dist/src/tools/ls.js +77 -78
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.d.ts +6 -0
- package/dist/src/tools/ls.test.js +384 -0
- package/dist/src/tools/ls.test.js.map +1 -0
- package/dist/src/tools/mcp-client-manager.d.ts +38 -0
- package/dist/src/tools/mcp-client-manager.js +74 -0
- package/dist/src/tools/mcp-client-manager.js.map +1 -0
- package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
- package/dist/src/tools/mcp-client-manager.test.js +39 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
- package/dist/src/tools/mcp-client.d.ts +86 -4
- package/dist/src/tools/mcp-client.js +730 -59
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +295 -22
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +6 -13
- package/dist/src/tools/mcp-tool.js +163 -76
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +400 -29
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +14 -3
- package/dist/src/tools/memoryTool.js +159 -40
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +116 -11
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.d.ts +9 -6
- package/dist/src/tools/modifiable-tool.js +6 -3
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +63 -74
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +4 -6
- package/dist/src/tools/read-file.js +100 -53
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +238 -111
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +3 -6
- package/dist/src/tools/read-many-files.js +232 -157
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +231 -34
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +6 -28
- package/dist/src/tools/shell.js +249 -366
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +305 -384
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +27 -0
- package/dist/src/tools/tool-error.js +32 -0
- package/dist/src/tools/tool-error.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +38 -23
- package/dist/src/tools/tool-registry.js +127 -99
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +37 -212
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +145 -92
- package/dist/src/tools/tools.js +188 -61
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.d.ts +6 -0
- package/dist/src/tools/tools.test.js +206 -0
- package/dist/src/tools/tools.test.js.map +1 -0
- package/dist/src/tools/web-fetch.d.ts +4 -7
- package/dist/src/tools/web-fetch.js +58 -64
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +8 -4
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +4 -5
- package/dist/src/tools/web-search.js +47 -51
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.d.ts +6 -0
- package/dist/src/tools/web-search.test.js +139 -0
- package/dist/src/tools/web-search.test.js.map +1 -0
- package/dist/src/tools/write-file.d.ts +20 -11
- package/dist/src/tools/write-file.js +198 -141
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +190 -76
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.js +51 -27
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +137 -136
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/browser.js +4 -3
- package/dist/src/utils/browser.js.map +1 -1
- package/dist/src/utils/editCorrector.js +23 -24
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editor.d.ts +2 -2
- package/dist/src/utils/editor.js +23 -6
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +67 -15
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +21 -0
- package/dist/src/utils/environmentContext.js +90 -0
- package/dist/src/utils/environmentContext.js.map +1 -0
- package/dist/src/utils/environmentContext.test.d.ts +6 -0
- package/dist/src/utils/environmentContext.test.js +140 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -0
- package/dist/src/utils/errorParsing.d.ts +8 -0
- package/dist/src/utils/errorParsing.js +93 -0
- package/dist/src/utils/errorParsing.js.map +1 -0
- package/dist/src/utils/errorParsing.test.d.ts +6 -0
- package/dist/src/utils/errorParsing.test.js +172 -0
- package/dist/src/utils/errorParsing.test.js.map +1 -0
- package/dist/src/utils/errorReporting.d.ts +1 -1
- package/dist/src/utils/errorReporting.js +2 -2
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +44 -38
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +9 -1
- package/dist/src/utils/fileUtils.js +27 -13
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +61 -18
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
- package/dist/src/utils/filesearch/crawlCache.js +57 -0
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
- package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawlCache.test.js +103 -0
- package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
- package/dist/src/utils/filesearch/crawler.test.js +468 -0
- package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +37 -0
- package/dist/src/utils/filesearch/fileSearch.js +186 -0
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
- package/dist/src/utils/filesearch/fileSearch.test.js +552 -0
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.d.ts +42 -0
- package/dist/src/utils/filesearch/ignore.js +106 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -0
- package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
- package/dist/src/utils/filesearch/ignore.test.js +144 -0
- package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
- package/dist/src/utils/filesearch/result-cache.js +59 -0
- package/dist/src/utils/filesearch/result-cache.js.map +1 -0
- package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
- package/dist/src/utils/filesearch/result-cache.test.js +46 -0
- package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
- package/dist/src/utils/flashFallback.integration.test.js +6 -0
- package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
- package/dist/src/utils/formatters.d.ts +6 -0
- package/dist/src/utils/formatters.js +16 -0
- package/dist/src/utils/formatters.js.map +1 -0
- package/dist/src/utils/getFolderStructure.test.js +11 -13
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +5 -11
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +58 -61
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +1 -1
- package/dist/src/utils/memoryDiscovery.js +76 -83
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +122 -372
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.d.ts +19 -12
- package/dist/src/utils/memoryImportProcessor.js +240 -85
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.test.js +593 -51
- package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.js +4 -25
- package/dist/src/utils/nextSpeakerChecker.js.map +1 -1
- package/dist/src/utils/partUtils.d.ts +14 -0
- package/dist/src/utils/partUtils.js +65 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/partUtils.test.d.ts +6 -0
- package/dist/src/utils/partUtils.test.js +130 -0
- package/dist/src/utils/partUtils.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +18 -2
- package/dist/src/utils/paths.js +39 -7
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.d.ts +6 -0
- package/dist/src/utils/paths.test.js +225 -0
- package/dist/src/utils/paths.test.js.map +1 -0
- package/dist/src/utils/quotaErrorDetection.d.ts +1 -5
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.d.ts +3 -0
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/schemaValidator.d.ts +1 -8
- package/dist/src/utils/schemaValidator.js +1 -32
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
- package/dist/src/utils/secure-browser-launcher.js +165 -0
- package/dist/src/utils/secure-browser-launcher.js.map +1 -0
- package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
- package/dist/src/utils/secure-browser-launcher.test.js +149 -0
- package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
- package/dist/src/utils/shell-utils.d.ts +117 -0
- package/dist/src/utils/shell-utils.js +376 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/shell-utils.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.test.js +328 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -0
- package/dist/src/utils/summarizer.js +3 -32
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/systemEncoding.js +1 -1
- package/dist/src/utils/systemEncoding.js.map +1 -1
- package/dist/src/utils/systemEncoding.test.js +23 -23
- package/dist/src/utils/systemEncoding.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +13 -0
- package/dist/src/utils/textUtils.js +28 -0
- package/dist/src/utils/textUtils.js.map +1 -0
- package/dist/src/utils/user_account.js +58 -48
- package/dist/src/utils/user_account.js.map +1 -1
- package/dist/src/utils/user_account.test.js +76 -9
- package/dist/src/utils/user_account.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +66 -0
- package/dist/src/utils/workspaceContext.js +165 -0
- package/dist/src/utils/workspaceContext.js.map +1 -0
- package/dist/src/utils/workspaceContext.test.d.ts +6 -0
- package/dist/src/utils/workspaceContext.test.js +293 -0
- package/dist/src/utils/workspaceContext.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -3
- package/dist/src/core/geminiRequest.test.js +0 -72
- package/dist/src/core/geminiRequest.test.js.map +0 -1
- package/dist/src/core/modelCheck.d.ts +0 -14
- package/dist/src/core/modelCheck.js +0 -62
- package/dist/src/core/modelCheck.js.map +0 -1
- package/dist/src/services/ideContext.d.ts +0 -178
- package/dist/src/services/ideContext.js +0 -105
- package/dist/src/services/ideContext.js.map +0 -1
- package/dist/src/services/ideContext.test.js +0 -111
- package/dist/src/services/ideContext.test.js.map +0 -1
- /package/dist/src/core/{geminiRequest.test.d.ts → subagent.test.d.ts} +0 -0
- /package/dist/src/{services/ideContext.test.d.ts → ide/detect-ide.test.d.ts} +0 -0
|
@@ -3,34 +3,102 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Buffer } from 'buffer';
|
|
7
|
-
import * as https from 'https';
|
|
8
6
|
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
9
|
-
import { EndSessionEvent, } from '../types.js';
|
|
10
7
|
import { EventMetadataKey } from './event-metadata-key.js';
|
|
11
|
-
import { getInstallationId } from '../../utils/user_id.js';
|
|
12
|
-
import { getCachedGoogleAccount, getLifetimeGoogleAccounts, } from '../../utils/user_account.js';
|
|
13
8
|
import { safeJsonStringify } from '../../utils/safeJsonStringify.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
9
|
+
import { getCachedGoogleAccount, getLifetimeGoogleAccounts, } from '../../utils/user_account.js';
|
|
10
|
+
import { getInstallationId } from '../../utils/user_id.js';
|
|
11
|
+
import { FixedDeque } from 'mnemonist';
|
|
12
|
+
import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js';
|
|
13
|
+
import { DetectedIde, detectIde } from '../../ide/detect-ide.js';
|
|
14
|
+
export var EventNames;
|
|
15
|
+
(function (EventNames) {
|
|
16
|
+
EventNames["START_SESSION"] = "start_session";
|
|
17
|
+
EventNames["NEW_PROMPT"] = "new_prompt";
|
|
18
|
+
EventNames["TOOL_CALL"] = "tool_call";
|
|
19
|
+
EventNames["API_REQUEST"] = "api_request";
|
|
20
|
+
EventNames["API_RESPONSE"] = "api_response";
|
|
21
|
+
EventNames["API_ERROR"] = "api_error";
|
|
22
|
+
EventNames["END_SESSION"] = "end_session";
|
|
23
|
+
EventNames["FLASH_FALLBACK"] = "flash_fallback";
|
|
24
|
+
EventNames["LOOP_DETECTED"] = "loop_detected";
|
|
25
|
+
EventNames["NEXT_SPEAKER_CHECK"] = "next_speaker_check";
|
|
26
|
+
EventNames["SLASH_COMMAND"] = "slash_command";
|
|
27
|
+
EventNames["MALFORMED_JSON_RESPONSE"] = "malformed_json_response";
|
|
28
|
+
EventNames["IDE_CONNECTION"] = "ide_connection";
|
|
29
|
+
EventNames["KITTY_SEQUENCE_OVERFLOW"] = "kitty_sequence_overflow";
|
|
30
|
+
EventNames["CHAT_COMPRESSION"] = "chat_compression";
|
|
31
|
+
})(EventNames || (EventNames = {}));
|
|
32
|
+
/**
|
|
33
|
+
* Determine the surface that the user is currently using. Surface is effectively the
|
|
34
|
+
* distribution channel in which the user is using Gemini CLI. Gemini CLI comes bundled
|
|
35
|
+
* w/ Firebase Studio and Cloud Shell. Users that manually download themselves will
|
|
36
|
+
* likely be "SURFACE_NOT_SET".
|
|
37
|
+
*
|
|
38
|
+
* This is computed based upon a series of environment variables these distribution
|
|
39
|
+
* methods might have in their runtimes.
|
|
40
|
+
*/
|
|
41
|
+
function determineSurface() {
|
|
42
|
+
if (process.env['SURFACE']) {
|
|
43
|
+
return process.env['SURFACE'];
|
|
44
|
+
}
|
|
45
|
+
else if (process.env['GITHUB_SHA']) {
|
|
46
|
+
return 'GitHub';
|
|
47
|
+
}
|
|
48
|
+
else if (process.env['TERM_PROGRAM'] === 'vscode') {
|
|
49
|
+
return detectIde() || DetectedIde.VSCode;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return 'SURFACE_NOT_SET';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clearcut URL to send logging events to.
|
|
57
|
+
*/
|
|
58
|
+
const CLEARCUT_URL = 'https://play.googleapis.com/log?format=json&hasfast=true';
|
|
59
|
+
/**
|
|
60
|
+
* Interval in which buffered events are sent to clearcut.
|
|
61
|
+
*/
|
|
62
|
+
const FLUSH_INTERVAL_MS = 1000 * 60;
|
|
63
|
+
/**
|
|
64
|
+
* Maximum amount of events to keep in memory. Events added after this amount
|
|
65
|
+
* are dropped until the next flush to clearcut, which happens periodically as
|
|
66
|
+
* defined by {@link FLUSH_INTERVAL_MS}.
|
|
67
|
+
*/
|
|
68
|
+
const MAX_EVENTS = 1000;
|
|
69
|
+
/**
|
|
70
|
+
* Maximum events to retry after a failed clearcut flush
|
|
71
|
+
*/
|
|
72
|
+
const MAX_RETRY_EVENTS = 100;
|
|
23
73
|
// Singleton class for batch posting log events to Clearcut. When a new event comes in, the elapsed time
|
|
24
74
|
// is checked and events are flushed to Clearcut if at least a minute has passed since the last flush.
|
|
25
75
|
export class ClearcutLogger {
|
|
26
76
|
static instance;
|
|
27
77
|
config;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
78
|
+
sessionData = [];
|
|
79
|
+
promptId = '';
|
|
80
|
+
/**
|
|
81
|
+
* Queue of pending events that need to be flushed to the server. New events
|
|
82
|
+
* are added to this queue and then flushed on demand (via `flushToClearcut`)
|
|
83
|
+
*/
|
|
84
|
+
events;
|
|
85
|
+
/**
|
|
86
|
+
* The last time that the events were successfully flushed to the server.
|
|
87
|
+
*/
|
|
88
|
+
lastFlushTime = Date.now();
|
|
89
|
+
/**
|
|
90
|
+
* the value is true when there is a pending flush happening. This prevents
|
|
91
|
+
* concurrent flush operations.
|
|
92
|
+
*/
|
|
93
|
+
flushing = false;
|
|
94
|
+
/**
|
|
95
|
+
* This value is true when a flush was requested during an ongoing flush.
|
|
96
|
+
*/
|
|
97
|
+
pendingFlush = false;
|
|
32
98
|
constructor(config) {
|
|
33
99
|
this.config = config;
|
|
100
|
+
this.events = new FixedDeque(Array, MAX_EVENTS);
|
|
101
|
+
this.promptId = config?.getSessionId() ?? '';
|
|
34
102
|
}
|
|
35
103
|
static getInstance(config) {
|
|
36
104
|
if (config === undefined || !config?.getUsageStatisticsEnabled())
|
|
@@ -40,27 +108,44 @@ export class ClearcutLogger {
|
|
|
40
108
|
}
|
|
41
109
|
return ClearcutLogger.instance;
|
|
42
110
|
}
|
|
43
|
-
|
|
111
|
+
/** For testing purposes only. */
|
|
112
|
+
static clearInstance() {
|
|
113
|
+
// @ts-expect-error - ClearcutLogger is a singleton, but we need to clear it for tests.
|
|
114
|
+
ClearcutLogger.instance = undefined;
|
|
115
|
+
}
|
|
44
116
|
enqueueLogEvent(event) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
117
|
+
try {
|
|
118
|
+
// Manually handle overflow for FixedDeque, which throws when full.
|
|
119
|
+
const wasAtCapacity = this.events.size >= MAX_EVENTS;
|
|
120
|
+
if (wasAtCapacity) {
|
|
121
|
+
this.events.shift(); // Evict oldest element to make space.
|
|
122
|
+
}
|
|
123
|
+
this.events.push([
|
|
124
|
+
{
|
|
125
|
+
event_time_ms: Date.now(),
|
|
126
|
+
source_extension_json: safeJsonStringify(event),
|
|
127
|
+
},
|
|
128
|
+
]);
|
|
129
|
+
if (wasAtCapacity && this.config?.getDebugMode()) {
|
|
130
|
+
console.debug(`ClearcutLogger: Dropped old event to prevent memory leak (queue size: ${this.events.size})`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (this.config?.getDebugMode()) {
|
|
135
|
+
console.error('ClearcutLogger: Failed to enqueue log event.', error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
51
138
|
}
|
|
52
|
-
createLogEvent(
|
|
139
|
+
createLogEvent(eventName, data = []) {
|
|
53
140
|
const email = getCachedGoogleAccount();
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
141
|
+
if (eventName !== EventNames.START_SESSION) {
|
|
142
|
+
data.push(...this.sessionData);
|
|
143
|
+
}
|
|
144
|
+
data = this.addDefaultFields(data);
|
|
60
145
|
const logEvent = {
|
|
61
146
|
console_type: 'GEMINI_CLI',
|
|
62
|
-
application: 102,
|
|
63
|
-
event_name:
|
|
147
|
+
application: 102, // GEMINI_CLI
|
|
148
|
+
event_name: eventName,
|
|
64
149
|
event_metadata: [data],
|
|
65
150
|
};
|
|
66
151
|
// Should log either email or install ID, not both. See go/cloudmill-1p-oss-instrumentation#define-sessionable-id
|
|
@@ -73,115 +158,86 @@ export class ClearcutLogger {
|
|
|
73
158
|
return logEvent;
|
|
74
159
|
}
|
|
75
160
|
flushIfNeeded() {
|
|
76
|
-
if (Date.now() - this.
|
|
161
|
+
if (Date.now() - this.lastFlushTime < FLUSH_INTERVAL_MS) {
|
|
77
162
|
return;
|
|
78
163
|
}
|
|
79
164
|
this.flushToClearcut().catch((error) => {
|
|
80
165
|
console.debug('Error flushing to Clearcut:', error);
|
|
81
166
|
});
|
|
82
167
|
}
|
|
83
|
-
flushToClearcut() {
|
|
168
|
+
async flushToClearcut() {
|
|
169
|
+
if (this.flushing) {
|
|
170
|
+
if (this.config?.getDebugMode()) {
|
|
171
|
+
console.debug('ClearcutLogger: Flush already in progress, marking pending flush.');
|
|
172
|
+
}
|
|
173
|
+
this.pendingFlush = true;
|
|
174
|
+
return Promise.resolve({});
|
|
175
|
+
}
|
|
176
|
+
this.flushing = true;
|
|
84
177
|
if (this.config?.getDebugMode()) {
|
|
85
178
|
console.log('Flushing log events to Clearcut.');
|
|
86
179
|
}
|
|
87
|
-
const eventsToSend =
|
|
88
|
-
this.events.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
hostname: 'play.googleapis.com',
|
|
100
|
-
path: '/log',
|
|
180
|
+
const eventsToSend = this.events.toArray();
|
|
181
|
+
this.events.clear();
|
|
182
|
+
const request = [
|
|
183
|
+
{
|
|
184
|
+
log_source_name: 'CONCORD',
|
|
185
|
+
request_time_ms: Date.now(),
|
|
186
|
+
log_event: eventsToSend,
|
|
187
|
+
},
|
|
188
|
+
];
|
|
189
|
+
let result = {};
|
|
190
|
+
try {
|
|
191
|
+
const response = await fetch(CLEARCUT_URL, {
|
|
101
192
|
method: 'POST',
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
...options,
|
|
107
|
-
agent: this.getProxyAgent(),
|
|
108
|
-
}, (res) => {
|
|
109
|
-
res.on('data', (buf) => bufs.push(buf));
|
|
110
|
-
res.on('end', () => {
|
|
111
|
-
resolve(Buffer.concat(bufs));
|
|
112
|
-
});
|
|
193
|
+
body: safeJsonStringify(request),
|
|
194
|
+
headers: {
|
|
195
|
+
'Content-Type': 'application/json',
|
|
196
|
+
},
|
|
113
197
|
});
|
|
114
|
-
|
|
198
|
+
const responseBody = await response.text();
|
|
199
|
+
if (response.status >= 200 && response.status < 300) {
|
|
200
|
+
this.lastFlushTime = Date.now();
|
|
201
|
+
const nextRequestWaitMs = Number(JSON.parse(responseBody)[0]);
|
|
202
|
+
result = {
|
|
203
|
+
...result,
|
|
204
|
+
nextRequestWaitMs,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
115
208
|
if (this.config?.getDebugMode()) {
|
|
116
|
-
console.
|
|
209
|
+
console.error(`Error flushing log events: HTTP ${response.status}: ${response.statusText}`);
|
|
117
210
|
}
|
|
118
|
-
//
|
|
119
|
-
this.
|
|
120
|
-
reject(e);
|
|
121
|
-
});
|
|
122
|
-
req.end(body);
|
|
123
|
-
})
|
|
124
|
-
.then((buf) => {
|
|
125
|
-
try {
|
|
126
|
-
this.last_flush_time = Date.now();
|
|
127
|
-
return this.decodeLogResponse(buf) || {};
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
console.error('Error flushing log events:', error);
|
|
131
|
-
return {};
|
|
211
|
+
// Re-queue failed events for retry
|
|
212
|
+
this.requeueFailedEvents(eventsToSend);
|
|
132
213
|
}
|
|
133
|
-
})
|
|
134
|
-
.catch((error) => {
|
|
135
|
-
// Handle all errors to prevent unhandled promise rejections
|
|
136
|
-
console.error('Error flushing log events:', error);
|
|
137
|
-
// Return empty response to maintain the Promise<LogResponse> contract
|
|
138
|
-
return {};
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
// Visible for testing. Decodes protobuf-encoded response from Clearcut server.
|
|
142
|
-
decodeLogResponse(buf) {
|
|
143
|
-
// TODO(obrienowen): return specific errors to facilitate debugging.
|
|
144
|
-
if (buf.length < 1) {
|
|
145
|
-
return undefined;
|
|
146
214
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
let ms = BigInt(0);
|
|
155
|
-
let cont = true;
|
|
156
|
-
// In each byte, the most significant bit is the continuation bit. If it's
|
|
157
|
-
// set, we keep going. The lowest 7 bits, are data bits. They are concatenated
|
|
158
|
-
// in reverse order to form the final number.
|
|
159
|
-
for (let i = 1; cont && i < buf.length; i++) {
|
|
160
|
-
const byte = buf.readUInt8(i);
|
|
161
|
-
ms |= BigInt(byte & 0x7f) << BigInt(7 * (i - 1));
|
|
162
|
-
cont = (byte & 0x80) !== 0;
|
|
215
|
+
catch (e) {
|
|
216
|
+
if (this.config?.getDebugMode()) {
|
|
217
|
+
console.error('Error flushing log events:', e);
|
|
218
|
+
}
|
|
219
|
+
// Re-queue failed events for retry
|
|
220
|
+
this.requeueFailedEvents(eventsToSend);
|
|
163
221
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
222
|
+
this.flushing = false;
|
|
223
|
+
// If a flush was requested while we were flushing, flush again
|
|
224
|
+
if (this.pendingFlush) {
|
|
225
|
+
this.pendingFlush = false;
|
|
226
|
+
// Fire and forget the pending flush
|
|
227
|
+
this.flushToClearcut().catch((error) => {
|
|
228
|
+
if (this.config?.getDebugMode()) {
|
|
229
|
+
console.debug('Error in pending flush to Clearcut:', error);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
168
232
|
}
|
|
169
|
-
|
|
170
|
-
nextRequestWaitMs: Number(ms),
|
|
171
|
-
};
|
|
172
|
-
return returnVal;
|
|
233
|
+
return result;
|
|
173
234
|
}
|
|
174
235
|
logStartSessionEvent(event) {
|
|
175
|
-
const surface = process.env.SURFACE || 'SURFACE_NOT_SET';
|
|
176
236
|
const data = [
|
|
177
237
|
{
|
|
178
238
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_MODEL,
|
|
179
239
|
value: event.model,
|
|
180
240
|
},
|
|
181
|
-
{
|
|
182
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
|
|
183
|
-
value: this.config?.getSessionId() ?? '',
|
|
184
|
-
},
|
|
185
241
|
{
|
|
186
242
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_EMBEDDING_MODEL,
|
|
187
243
|
value: event.embedding_model,
|
|
@@ -230,37 +286,23 @@ export class ClearcutLogger {
|
|
|
230
286
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_START_SESSION_TELEMETRY_LOG_USER_PROMPTS_ENABLED,
|
|
231
287
|
value: event.telemetry_log_user_prompts_enabled.toString(),
|
|
232
288
|
},
|
|
233
|
-
{
|
|
234
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE,
|
|
235
|
-
value: surface,
|
|
236
|
-
},
|
|
237
289
|
];
|
|
290
|
+
this.sessionData = data;
|
|
238
291
|
// Flush start event immediately
|
|
239
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
292
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.START_SESSION, data));
|
|
240
293
|
this.flushToClearcut().catch((error) => {
|
|
241
294
|
console.debug('Error flushing to Clearcut:', error);
|
|
242
295
|
});
|
|
243
296
|
}
|
|
244
297
|
logNewPromptEvent(event) {
|
|
298
|
+
this.promptId = event.prompt_id;
|
|
245
299
|
const data = [
|
|
246
300
|
{
|
|
247
301
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH,
|
|
248
302
|
value: JSON.stringify(event.prompt_length),
|
|
249
303
|
},
|
|
250
|
-
{
|
|
251
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
|
|
252
|
-
value: this.config?.getSessionId() ?? '',
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
256
|
-
value: JSON.stringify(event.prompt_id),
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
|
|
260
|
-
value: JSON.stringify(event.auth_type),
|
|
261
|
-
},
|
|
262
304
|
];
|
|
263
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
305
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.NEW_PROMPT, data));
|
|
264
306
|
this.flushIfNeeded();
|
|
265
307
|
}
|
|
266
308
|
logToolCallEvent(event) {
|
|
@@ -269,10 +311,6 @@ export class ClearcutLogger {
|
|
|
269
311
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_NAME,
|
|
270
312
|
value: JSON.stringify(event.function_name),
|
|
271
313
|
},
|
|
272
|
-
{
|
|
273
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
274
|
-
value: JSON.stringify(event.prompt_id),
|
|
275
|
-
},
|
|
276
314
|
{
|
|
277
315
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION,
|
|
278
316
|
value: JSON.stringify(event.decision),
|
|
@@ -293,8 +331,28 @@ export class ClearcutLogger {
|
|
|
293
331
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_ERROR_TYPE,
|
|
294
332
|
value: JSON.stringify(event.error_type),
|
|
295
333
|
},
|
|
334
|
+
{
|
|
335
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_TYPE,
|
|
336
|
+
value: JSON.stringify(event.tool_type),
|
|
337
|
+
},
|
|
296
338
|
];
|
|
297
|
-
|
|
339
|
+
if (event.metadata) {
|
|
340
|
+
const metadataMapping = {
|
|
341
|
+
ai_added_lines: EventMetadataKey.GEMINI_CLI_AI_ADDED_LINES,
|
|
342
|
+
ai_removed_lines: EventMetadataKey.GEMINI_CLI_AI_REMOVED_LINES,
|
|
343
|
+
user_added_lines: EventMetadataKey.GEMINI_CLI_USER_ADDED_LINES,
|
|
344
|
+
user_removed_lines: EventMetadataKey.GEMINI_CLI_USER_REMOVED_LINES,
|
|
345
|
+
};
|
|
346
|
+
for (const [key, gemini_cli_key] of Object.entries(metadataMapping)) {
|
|
347
|
+
if (event.metadata[key] !== undefined) {
|
|
348
|
+
data.push({
|
|
349
|
+
gemini_cli_key,
|
|
350
|
+
value: JSON.stringify(event.metadata[key]),
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
const logEvent = this.createLogEvent(EventNames.TOOL_CALL, data);
|
|
298
356
|
this.enqueueLogEvent(logEvent);
|
|
299
357
|
this.flushIfNeeded();
|
|
300
358
|
}
|
|
@@ -304,12 +362,8 @@ export class ClearcutLogger {
|
|
|
304
362
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL,
|
|
305
363
|
value: JSON.stringify(event.model),
|
|
306
364
|
},
|
|
307
|
-
{
|
|
308
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
309
|
-
value: JSON.stringify(event.prompt_id),
|
|
310
|
-
},
|
|
311
365
|
];
|
|
312
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
366
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.API_REQUEST, data));
|
|
313
367
|
this.flushIfNeeded();
|
|
314
368
|
}
|
|
315
369
|
logApiResponseEvent(event) {
|
|
@@ -318,10 +372,6 @@ export class ClearcutLogger {
|
|
|
318
372
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_MODEL,
|
|
319
373
|
value: JSON.stringify(event.model),
|
|
320
374
|
},
|
|
321
|
-
{
|
|
322
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
323
|
-
value: JSON.stringify(event.prompt_id),
|
|
324
|
-
},
|
|
325
375
|
{
|
|
326
376
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE,
|
|
327
377
|
value: JSON.stringify(event.status_code),
|
|
@@ -354,12 +404,8 @@ export class ClearcutLogger {
|
|
|
354
404
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_TOOL_TOKEN_COUNT,
|
|
355
405
|
value: JSON.stringify(event.tool_token_count),
|
|
356
406
|
},
|
|
357
|
-
{
|
|
358
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
|
|
359
|
-
value: JSON.stringify(event.auth_type),
|
|
360
|
-
},
|
|
361
407
|
];
|
|
362
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
408
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.API_RESPONSE, data));
|
|
363
409
|
this.flushIfNeeded();
|
|
364
410
|
}
|
|
365
411
|
logApiErrorEvent(event) {
|
|
@@ -368,10 +414,6 @@ export class ClearcutLogger {
|
|
|
368
414
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_MODEL,
|
|
369
415
|
value: JSON.stringify(event.model),
|
|
370
416
|
},
|
|
371
|
-
{
|
|
372
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
373
|
-
value: JSON.stringify(event.prompt_id),
|
|
374
|
-
},
|
|
375
417
|
{
|
|
376
418
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE,
|
|
377
419
|
value: JSON.stringify(event.error_type),
|
|
@@ -384,57 +426,155 @@ export class ClearcutLogger {
|
|
|
384
426
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_DURATION_MS,
|
|
385
427
|
value: JSON.stringify(event.duration_ms),
|
|
386
428
|
},
|
|
387
|
-
{
|
|
388
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
|
|
389
|
-
value: JSON.stringify(event.auth_type),
|
|
390
|
-
},
|
|
391
429
|
];
|
|
392
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
430
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.API_ERROR, data));
|
|
393
431
|
this.flushIfNeeded();
|
|
394
432
|
}
|
|
395
|
-
|
|
433
|
+
logChatCompressionEvent(event) {
|
|
396
434
|
const data = [
|
|
397
435
|
{
|
|
398
|
-
gemini_cli_key: EventMetadataKey.
|
|
399
|
-
value:
|
|
436
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_BEFORE,
|
|
437
|
+
value: `${event.tokens_before}`,
|
|
400
438
|
},
|
|
401
439
|
{
|
|
402
|
-
gemini_cli_key: EventMetadataKey.
|
|
403
|
-
value:
|
|
440
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_COMPRESSION_TOKENS_AFTER,
|
|
441
|
+
value: `${event.tokens_after}`,
|
|
404
442
|
},
|
|
405
443
|
];
|
|
406
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
444
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.CHAT_COMPRESSION, data));
|
|
445
|
+
}
|
|
446
|
+
logFlashFallbackEvent() {
|
|
447
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.FLASH_FALLBACK, []));
|
|
407
448
|
this.flushToClearcut().catch((error) => {
|
|
408
449
|
console.debug('Error flushing to Clearcut:', error);
|
|
409
450
|
});
|
|
410
451
|
}
|
|
411
452
|
logLoopDetectedEvent(event) {
|
|
412
453
|
const data = [
|
|
413
|
-
{
|
|
414
|
-
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
|
|
415
|
-
value: this.config?.getSessionId() ?? '',
|
|
416
|
-
},
|
|
417
454
|
{
|
|
418
455
|
gemini_cli_key: EventMetadataKey.GEMINI_CLI_LOOP_DETECTED_TYPE,
|
|
419
456
|
value: JSON.stringify(event.loop_type),
|
|
420
457
|
},
|
|
421
458
|
];
|
|
422
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
459
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.LOOP_DETECTED, data));
|
|
423
460
|
this.flushIfNeeded();
|
|
424
461
|
}
|
|
425
|
-
|
|
462
|
+
logNextSpeakerCheck(event) {
|
|
426
463
|
const data = [
|
|
427
464
|
{
|
|
428
|
-
gemini_cli_key: EventMetadataKey.
|
|
429
|
-
value: event
|
|
465
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_RESPONSE_FINISH_REASON,
|
|
466
|
+
value: JSON.stringify(event.finish_reason),
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_NEXT_SPEAKER_CHECK_RESULT,
|
|
470
|
+
value: JSON.stringify(event.result),
|
|
471
|
+
},
|
|
472
|
+
];
|
|
473
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.NEXT_SPEAKER_CHECK, data));
|
|
474
|
+
this.flushIfNeeded();
|
|
475
|
+
}
|
|
476
|
+
logSlashCommandEvent(event) {
|
|
477
|
+
const data = [
|
|
478
|
+
{
|
|
479
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_NAME,
|
|
480
|
+
value: JSON.stringify(event.command),
|
|
481
|
+
},
|
|
482
|
+
];
|
|
483
|
+
if (event.subcommand) {
|
|
484
|
+
data.push({
|
|
485
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_SUBCOMMAND,
|
|
486
|
+
value: JSON.stringify(event.subcommand),
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
if (event.status) {
|
|
490
|
+
data.push({
|
|
491
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SLASH_COMMAND_STATUS,
|
|
492
|
+
value: JSON.stringify(event.status),
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.SLASH_COMMAND, data));
|
|
496
|
+
this.flushIfNeeded();
|
|
497
|
+
}
|
|
498
|
+
logMalformedJsonResponseEvent(event) {
|
|
499
|
+
const data = [
|
|
500
|
+
{
|
|
501
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_MALFORMED_JSON_RESPONSE_MODEL,
|
|
502
|
+
value: JSON.stringify(event.model),
|
|
503
|
+
},
|
|
504
|
+
];
|
|
505
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.MALFORMED_JSON_RESPONSE, data));
|
|
506
|
+
this.flushIfNeeded();
|
|
507
|
+
}
|
|
508
|
+
logIdeConnectionEvent(event) {
|
|
509
|
+
const data = [
|
|
510
|
+
{
|
|
511
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_IDE_CONNECTION_TYPE,
|
|
512
|
+
value: JSON.stringify(event.connection_type),
|
|
430
513
|
},
|
|
431
514
|
];
|
|
515
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.IDE_CONNECTION, data));
|
|
516
|
+
this.flushIfNeeded();
|
|
517
|
+
}
|
|
518
|
+
logKittySequenceOverflowEvent(event) {
|
|
519
|
+
const data = [
|
|
520
|
+
{
|
|
521
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_KITTY_SEQUENCE_LENGTH,
|
|
522
|
+
value: event.sequence_length.toString(),
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_KITTY_TRUNCATED_SEQUENCE,
|
|
526
|
+
value: event.truncated_sequence,
|
|
527
|
+
},
|
|
528
|
+
];
|
|
529
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.KITTY_SEQUENCE_OVERFLOW, data));
|
|
530
|
+
this.flushIfNeeded();
|
|
531
|
+
}
|
|
532
|
+
logEndSessionEvent() {
|
|
432
533
|
// Flush immediately on session end.
|
|
433
|
-
this.enqueueLogEvent(this.createLogEvent(
|
|
534
|
+
this.enqueueLogEvent(this.createLogEvent(EventNames.END_SESSION, []));
|
|
434
535
|
this.flushToClearcut().catch((error) => {
|
|
435
536
|
console.debug('Error flushing to Clearcut:', error);
|
|
436
537
|
});
|
|
437
538
|
}
|
|
539
|
+
/**
|
|
540
|
+
* Adds default fields to data, and returns a new data array. This fields
|
|
541
|
+
* should exist on all log events.
|
|
542
|
+
*/
|
|
543
|
+
addDefaultFields(data) {
|
|
544
|
+
const totalAccounts = getLifetimeGoogleAccounts();
|
|
545
|
+
const surface = determineSurface();
|
|
546
|
+
const defaultLogMetadata = [
|
|
547
|
+
{
|
|
548
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SESSION_ID,
|
|
549
|
+
value: this.config?.getSessionId() ?? '',
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_AUTH_TYPE,
|
|
553
|
+
value: JSON.stringify(this.config?.getContentGeneratorConfig()?.authType),
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_GOOGLE_ACCOUNTS_COUNT,
|
|
557
|
+
value: `${totalAccounts}`,
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE,
|
|
561
|
+
value: surface,
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_VERSION,
|
|
565
|
+
value: CLI_VERSION,
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_GIT_COMMIT_HASH,
|
|
569
|
+
value: GIT_COMMIT_INFO,
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
|
573
|
+
value: this.promptId,
|
|
574
|
+
},
|
|
575
|
+
];
|
|
576
|
+
return [...data, ...defaultLogMetadata];
|
|
577
|
+
}
|
|
438
578
|
getProxyAgent() {
|
|
439
579
|
const proxyUrl = this.config?.getProxy();
|
|
440
580
|
if (!proxyUrl)
|
|
@@ -449,8 +589,42 @@ export class ClearcutLogger {
|
|
|
449
589
|
}
|
|
450
590
|
}
|
|
451
591
|
shutdown() {
|
|
452
|
-
|
|
453
|
-
|
|
592
|
+
this.logEndSessionEvent();
|
|
593
|
+
}
|
|
594
|
+
requeueFailedEvents(eventsToSend) {
|
|
595
|
+
// Add the events back to the front of the queue to be retried, but limit retry queue size
|
|
596
|
+
const eventsToRetry = eventsToSend.slice(-MAX_RETRY_EVENTS); // Keep only the most recent events
|
|
597
|
+
// Log a warning if we're dropping events
|
|
598
|
+
if (eventsToSend.length > MAX_RETRY_EVENTS && this.config?.getDebugMode()) {
|
|
599
|
+
console.warn(`ClearcutLogger: Dropping ${eventsToSend.length - MAX_RETRY_EVENTS} events due to retry queue limit. Total events: ${eventsToSend.length}, keeping: ${MAX_RETRY_EVENTS}`);
|
|
600
|
+
}
|
|
601
|
+
// Determine how many events can be re-queued
|
|
602
|
+
const availableSpace = MAX_EVENTS - this.events.size;
|
|
603
|
+
const numEventsToRequeue = Math.min(eventsToRetry.length, availableSpace);
|
|
604
|
+
if (numEventsToRequeue === 0) {
|
|
605
|
+
if (this.config?.getDebugMode()) {
|
|
606
|
+
console.debug(`ClearcutLogger: No events re-queued (queue size: ${this.events.size})`);
|
|
607
|
+
}
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
// Get the most recent events to re-queue
|
|
611
|
+
const eventsToRequeue = eventsToRetry.slice(eventsToRetry.length - numEventsToRequeue);
|
|
612
|
+
// Prepend events to the front of the deque to be retried first.
|
|
613
|
+
// We iterate backwards to maintain the original order of the failed events.
|
|
614
|
+
for (let i = eventsToRequeue.length - 1; i >= 0; i--) {
|
|
615
|
+
this.events.unshift(eventsToRequeue[i]);
|
|
616
|
+
}
|
|
617
|
+
// Clear any potential overflow
|
|
618
|
+
while (this.events.size > MAX_EVENTS) {
|
|
619
|
+
this.events.pop();
|
|
620
|
+
}
|
|
621
|
+
if (this.config?.getDebugMode()) {
|
|
622
|
+
console.debug(`ClearcutLogger: Re-queued ${numEventsToRequeue} events for retry (queue size: ${this.events.size})`);
|
|
623
|
+
}
|
|
454
624
|
}
|
|
455
625
|
}
|
|
626
|
+
export const TEST_ONLY = {
|
|
627
|
+
MAX_RETRY_EVENTS,
|
|
628
|
+
MAX_EVENTS,
|
|
629
|
+
};
|
|
456
630
|
//# sourceMappingURL=clearcut-logger.js.map
|