@shareai-lab/kode 1.1.14 → 1.1.16-dev.1
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/cli.js +77 -82
- package/dist/entrypoints/cli.js +59 -38
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/index.js +5 -26
- package/dist/package.json +4 -1
- package/package.json +11 -104
- package/dist/test/testAdapters.js +0 -88
- package/dist/test/testAdapters.js.map +0 -1
- package/src/ProjectOnboarding.tsx +0 -198
- package/src/Tool.ts +0 -83
- package/src/commands/agents.tsx +0 -3416
- package/src/commands/approvedTools.ts +0 -53
- package/src/commands/bug.tsx +0 -20
- package/src/commands/clear.ts +0 -43
- package/src/commands/compact.ts +0 -120
- package/src/commands/config.tsx +0 -19
- package/src/commands/cost.ts +0 -18
- package/src/commands/ctx_viz.ts +0 -209
- package/src/commands/doctor.ts +0 -24
- package/src/commands/help.tsx +0 -19
- package/src/commands/init.ts +0 -37
- package/src/commands/listen.ts +0 -42
- package/src/commands/login.tsx +0 -51
- package/src/commands/logout.tsx +0 -40
- package/src/commands/mcp.ts +0 -41
- package/src/commands/model.tsx +0 -40
- package/src/commands/modelstatus.tsx +0 -20
- package/src/commands/onboarding.tsx +0 -34
- package/src/commands/pr_comments.ts +0 -59
- package/src/commands/refreshCommands.ts +0 -54
- package/src/commands/release-notes.ts +0 -34
- package/src/commands/resume.tsx +0 -31
- package/src/commands/review.ts +0 -49
- package/src/commands/terminalSetup.ts +0 -221
- package/src/commands.ts +0 -139
- package/src/components/ApproveApiKey.tsx +0 -93
- package/src/components/AsciiLogo.tsx +0 -13
- package/src/components/AutoUpdater.tsx +0 -148
- package/src/components/Bug.tsx +0 -367
- package/src/components/Config.tsx +0 -293
- package/src/components/ConsoleOAuthFlow.tsx +0 -327
- package/src/components/Cost.tsx +0 -23
- package/src/components/CostThresholdDialog.tsx +0 -46
- package/src/components/CustomSelect/option-map.ts +0 -42
- package/src/components/CustomSelect/select-option.tsx +0 -78
- package/src/components/CustomSelect/select.tsx +0 -152
- package/src/components/CustomSelect/theme.ts +0 -45
- package/src/components/CustomSelect/use-select-state.ts +0 -414
- package/src/components/CustomSelect/use-select.ts +0 -35
- package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
- package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
- package/src/components/Help.tsx +0 -215
- package/src/components/HighlightedCode.tsx +0 -33
- package/src/components/InvalidConfigDialog.tsx +0 -113
- package/src/components/Link.tsx +0 -32
- package/src/components/LogSelector.tsx +0 -86
- package/src/components/Logo.tsx +0 -170
- package/src/components/MCPServerApprovalDialog.tsx +0 -100
- package/src/components/MCPServerDialogCopy.tsx +0 -25
- package/src/components/MCPServerMultiselectDialog.tsx +0 -109
- package/src/components/Message.tsx +0 -221
- package/src/components/MessageResponse.tsx +0 -15
- package/src/components/MessageSelector.tsx +0 -211
- package/src/components/ModeIndicator.tsx +0 -88
- package/src/components/ModelConfig.tsx +0 -301
- package/src/components/ModelListManager.tsx +0 -227
- package/src/components/ModelSelector.tsx +0 -3387
- package/src/components/ModelStatusDisplay.tsx +0 -230
- package/src/components/Onboarding.tsx +0 -274
- package/src/components/PressEnterToContinue.tsx +0 -11
- package/src/components/PromptInput.tsx +0 -760
- package/src/components/SentryErrorBoundary.ts +0 -39
- package/src/components/Spinner.tsx +0 -129
- package/src/components/StickerRequestForm.tsx +0 -16
- package/src/components/StructuredDiff.tsx +0 -191
- package/src/components/TextInput.tsx +0 -259
- package/src/components/TodoItem.tsx +0 -47
- package/src/components/TokenWarning.tsx +0 -31
- package/src/components/ToolUseLoader.tsx +0 -40
- package/src/components/TrustDialog.tsx +0 -106
- package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
- package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
- package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
- package/src/components/binary-feedback/utils.ts +0 -220
- package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
- package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
- package/src/components/messages/AssistantTextMessage.tsx +0 -144
- package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
- package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
- package/src/components/messages/TaskProgressMessage.tsx +0 -32
- package/src/components/messages/TaskToolMessage.tsx +0 -58
- package/src/components/messages/UserBashInputMessage.tsx +0 -28
- package/src/components/messages/UserCommandMessage.tsx +0 -30
- package/src/components/messages/UserKodingInputMessage.tsx +0 -28
- package/src/components/messages/UserPromptMessage.tsx +0 -35
- package/src/components/messages/UserTextMessage.tsx +0 -39
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
- package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
- package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
- package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
- package/src/components/permissions/PermissionRequest.tsx +0 -101
- package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
- package/src/components/permissions/hooks.ts +0 -44
- package/src/components/permissions/toolUseOptions.ts +0 -59
- package/src/components/permissions/utils.ts +0 -23
- package/src/constants/betas.ts +0 -5
- package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
- package/src/constants/figures.ts +0 -4
- package/src/constants/keys.ts +0 -3
- package/src/constants/macros.ts +0 -11
- package/src/constants/modelCapabilities.ts +0 -179
- package/src/constants/models.ts +0 -1025
- package/src/constants/oauth.ts +0 -18
- package/src/constants/product.ts +0 -17
- package/src/constants/prompts.ts +0 -168
- package/src/constants/releaseNotes.ts +0 -7
- package/src/context/PermissionContext.tsx +0 -149
- package/src/context.ts +0 -278
- package/src/cost-tracker.ts +0 -84
- package/src/entrypoints/cli.tsx +0 -1561
- package/src/entrypoints/mcp.ts +0 -175
- package/src/history.ts +0 -25
- package/src/hooks/useApiKeyVerification.ts +0 -59
- package/src/hooks/useArrowKeyHistory.ts +0 -55
- package/src/hooks/useCanUseTool.ts +0 -138
- package/src/hooks/useCancelRequest.ts +0 -39
- package/src/hooks/useDoublePress.ts +0 -41
- package/src/hooks/useExitOnCtrlCD.ts +0 -31
- package/src/hooks/useInterval.ts +0 -25
- package/src/hooks/useLogMessages.ts +0 -16
- package/src/hooks/useLogStartupTime.ts +0 -12
- package/src/hooks/useNotifyAfterTimeout.ts +0 -65
- package/src/hooks/usePermissionRequestLogging.ts +0 -44
- package/src/hooks/useTerminalSize.ts +0 -49
- package/src/hooks/useTextInput.ts +0 -317
- package/src/hooks/useUnifiedCompletion.ts +0 -1405
- package/src/index.ts +0 -34
- package/src/messages.ts +0 -38
- package/src/permissions.ts +0 -268
- package/src/query.ts +0 -720
- package/src/screens/ConfigureNpmPrefix.tsx +0 -197
- package/src/screens/Doctor.tsx +0 -219
- package/src/screens/LogList.tsx +0 -68
- package/src/screens/REPL.tsx +0 -813
- package/src/screens/ResumeConversation.tsx +0 -68
- package/src/services/adapters/base.ts +0 -38
- package/src/services/adapters/chatCompletions.ts +0 -90
- package/src/services/adapters/responsesAPI.ts +0 -170
- package/src/services/browserMocks.ts +0 -66
- package/src/services/claude.ts +0 -2197
- package/src/services/customCommands.ts +0 -704
- package/src/services/fileFreshness.ts +0 -377
- package/src/services/gpt5ConnectionTest.ts +0 -340
- package/src/services/mcpClient.ts +0 -564
- package/src/services/mcpServerApproval.tsx +0 -50
- package/src/services/mentionProcessor.ts +0 -273
- package/src/services/modelAdapterFactory.ts +0 -69
- package/src/services/notifier.ts +0 -40
- package/src/services/oauth.ts +0 -357
- package/src/services/openai.ts +0 -1359
- package/src/services/responseStateManager.ts +0 -90
- package/src/services/sentry.ts +0 -3
- package/src/services/statsig.ts +0 -172
- package/src/services/statsigStorage.ts +0 -86
- package/src/services/systemReminder.ts +0 -507
- package/src/services/vcr.ts +0 -161
- package/src/test/testAdapters.ts +0 -96
- package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
- package/src/tools/ArchitectTool/prompt.ts +0 -15
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
- package/src/tools/BashTool/BashTool.tsx +0 -243
- package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
- package/src/tools/BashTool/OutputLine.tsx +0 -49
- package/src/tools/BashTool/prompt.ts +0 -174
- package/src/tools/BashTool/utils.ts +0 -56
- package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
- package/src/tools/FileEditTool/prompt.ts +0 -51
- package/src/tools/FileEditTool/utils.ts +0 -58
- package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
- package/src/tools/FileReadTool/prompt.ts +0 -7
- package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
- package/src/tools/FileWriteTool/prompt.ts +0 -10
- package/src/tools/GlobTool/GlobTool.tsx +0 -119
- package/src/tools/GlobTool/prompt.ts +0 -8
- package/src/tools/GrepTool/GrepTool.tsx +0 -147
- package/src/tools/GrepTool/prompt.ts +0 -11
- package/src/tools/MCPTool/MCPTool.tsx +0 -107
- package/src/tools/MCPTool/prompt.ts +0 -3
- package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
- package/src/tools/MemoryReadTool/prompt.ts +0 -3
- package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
- package/src/tools/MemoryWriteTool/prompt.ts +0 -3
- package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
- package/src/tools/MultiEditTool/prompt.ts +0 -45
- package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
- package/src/tools/NotebookEditTool/prompt.ts +0 -3
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
- package/src/tools/NotebookReadTool/prompt.ts +0 -3
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
- package/src/tools/StickerRequestTool/prompt.ts +0 -19
- package/src/tools/TaskTool/TaskTool.tsx +0 -438
- package/src/tools/TaskTool/constants.ts +0 -1
- package/src/tools/TaskTool/prompt.ts +0 -92
- package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
- package/src/tools/ThinkTool/prompt.ts +0 -12
- package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
- package/src/tools/TodoWriteTool/prompt.ts +0 -63
- package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
- package/src/tools/URLFetcherTool/cache.ts +0 -55
- package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
- package/src/tools/URLFetcherTool/prompt.ts +0 -17
- package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
- package/src/tools/WebSearchTool/prompt.ts +0 -13
- package/src/tools/WebSearchTool/searchProviders.ts +0 -66
- package/src/tools/lsTool/lsTool.tsx +0 -272
- package/src/tools/lsTool/prompt.ts +0 -2
- package/src/tools.ts +0 -67
- package/src/types/PermissionMode.ts +0 -120
- package/src/types/RequestContext.ts +0 -72
- package/src/types/common.d.ts +0 -2
- package/src/types/conversation.ts +0 -51
- package/src/types/logs.ts +0 -58
- package/src/types/modelCapabilities.ts +0 -64
- package/src/types/notebook.ts +0 -87
- package/src/utils/Cursor.ts +0 -436
- package/src/utils/PersistentShell.ts +0 -552
- package/src/utils/advancedFuzzyMatcher.ts +0 -290
- package/src/utils/agentLoader.ts +0 -278
- package/src/utils/agentStorage.ts +0 -97
- package/src/utils/array.ts +0 -3
- package/src/utils/ask.tsx +0 -99
- package/src/utils/auth.ts +0 -13
- package/src/utils/autoCompactCore.ts +0 -223
- package/src/utils/autoUpdater.ts +0 -458
- package/src/utils/betas.ts +0 -20
- package/src/utils/browser.ts +0 -14
- package/src/utils/cleanup.ts +0 -72
- package/src/utils/commands.ts +0 -261
- package/src/utils/commonUnixCommands.ts +0 -161
- package/src/utils/config.ts +0 -945
- package/src/utils/conversationRecovery.ts +0 -55
- package/src/utils/debugLogger.ts +0 -1235
- package/src/utils/diff.ts +0 -42
- package/src/utils/env.ts +0 -57
- package/src/utils/errors.ts +0 -21
- package/src/utils/exampleCommands.ts +0 -109
- package/src/utils/execFileNoThrow.ts +0 -51
- package/src/utils/expertChatStorage.ts +0 -136
- package/src/utils/file.ts +0 -405
- package/src/utils/fileRecoveryCore.ts +0 -71
- package/src/utils/format.tsx +0 -44
- package/src/utils/fuzzyMatcher.ts +0 -328
- package/src/utils/generators.ts +0 -62
- package/src/utils/git.ts +0 -92
- package/src/utils/globalLogger.ts +0 -77
- package/src/utils/http.ts +0 -10
- package/src/utils/imagePaste.ts +0 -38
- package/src/utils/json.ts +0 -13
- package/src/utils/log.ts +0 -382
- package/src/utils/markdown.ts +0 -213
- package/src/utils/messageContextManager.ts +0 -294
- package/src/utils/messages.tsx +0 -945
- package/src/utils/model.ts +0 -914
- package/src/utils/permissions/filesystem.ts +0 -127
- package/src/utils/responseState.ts +0 -23
- package/src/utils/ripgrep.ts +0 -167
- package/src/utils/secureFile.ts +0 -564
- package/src/utils/sessionState.ts +0 -49
- package/src/utils/state.ts +0 -25
- package/src/utils/style.ts +0 -29
- package/src/utils/terminal.ts +0 -50
- package/src/utils/theme.ts +0 -127
- package/src/utils/thinking.ts +0 -144
- package/src/utils/todoStorage.ts +0 -431
- package/src/utils/tokens.ts +0 -43
- package/src/utils/toolExecutionController.ts +0 -163
- package/src/utils/unaryLogging.ts +0 -26
- package/src/utils/user.ts +0 -37
- package/src/utils/validate.ts +0 -165
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GPT-5 Responses API state management
|
|
3
|
-
* Manages previous_response_id for conversation continuity and reasoning context reuse
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
interface ConversationState {
|
|
7
|
-
previousResponseId?: string
|
|
8
|
-
lastUpdate: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
class ResponseStateManager {
|
|
12
|
-
private conversationStates = new Map<string, ConversationState>()
|
|
13
|
-
|
|
14
|
-
// Cache cleanup after 1 hour of inactivity
|
|
15
|
-
private readonly CLEANUP_INTERVAL = 60 * 60 * 1000
|
|
16
|
-
|
|
17
|
-
constructor() {
|
|
18
|
-
// Periodic cleanup of stale conversations
|
|
19
|
-
setInterval(() => {
|
|
20
|
-
this.cleanup()
|
|
21
|
-
}, this.CLEANUP_INTERVAL)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Set the previous response ID for a conversation
|
|
26
|
-
*/
|
|
27
|
-
setPreviousResponseId(conversationId: string, responseId: string): void {
|
|
28
|
-
this.conversationStates.set(conversationId, {
|
|
29
|
-
previousResponseId: responseId,
|
|
30
|
-
lastUpdate: Date.now()
|
|
31
|
-
})
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Get the previous response ID for a conversation
|
|
36
|
-
*/
|
|
37
|
-
getPreviousResponseId(conversationId: string): string | undefined {
|
|
38
|
-
const state = this.conversationStates.get(conversationId)
|
|
39
|
-
if (state) {
|
|
40
|
-
// Update last access time
|
|
41
|
-
state.lastUpdate = Date.now()
|
|
42
|
-
return state.previousResponseId
|
|
43
|
-
}
|
|
44
|
-
return undefined
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Clear state for a conversation
|
|
49
|
-
*/
|
|
50
|
-
clearConversation(conversationId: string): void {
|
|
51
|
-
this.conversationStates.delete(conversationId)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Clear all conversation states
|
|
56
|
-
*/
|
|
57
|
-
clearAll(): void {
|
|
58
|
-
this.conversationStates.clear()
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Clean up stale conversations
|
|
63
|
-
*/
|
|
64
|
-
private cleanup(): void {
|
|
65
|
-
const now = Date.now()
|
|
66
|
-
for (const [conversationId, state] of this.conversationStates.entries()) {
|
|
67
|
-
if (now - state.lastUpdate > this.CLEANUP_INTERVAL) {
|
|
68
|
-
this.conversationStates.delete(conversationId)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Get current state size (for debugging/monitoring)
|
|
75
|
-
*/
|
|
76
|
-
getStateSize(): number {
|
|
77
|
-
return this.conversationStates.size
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Singleton instance
|
|
82
|
-
export const responseStateManager = new ResponseStateManager()
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Helper to generate conversation ID from context
|
|
86
|
-
*/
|
|
87
|
-
export function getConversationId(agentId?: string, messageId?: string): string {
|
|
88
|
-
// Use agentId as primary identifier, fallback to messageId or timestamp
|
|
89
|
-
return agentId || messageId || `conv_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
|
90
|
-
}
|
package/src/services/sentry.ts
DELETED
package/src/services/statsig.ts
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { memoize } from 'lodash-es'
|
|
3
|
-
import chalk from 'chalk'
|
|
4
|
-
import {
|
|
5
|
-
StatsigClient,
|
|
6
|
-
StatsigOptions,
|
|
7
|
-
StatsigEvent,
|
|
8
|
-
LogLevel,
|
|
9
|
-
} from '@statsig/js-client'
|
|
10
|
-
import './browserMocks.js' // Initialize browser mocks
|
|
11
|
-
import { FileSystemStorageProvider } from './statsigStorage'
|
|
12
|
-
import { STATSIG_CLIENT_KEY } from '../constants/keys'
|
|
13
|
-
import { env } from '../utils/env'
|
|
14
|
-
import { getUser } from '../utils/user'
|
|
15
|
-
import { logError } from '../utils/log'
|
|
16
|
-
import { SESSION_ID } from '../utils/log'
|
|
17
|
-
import { getBetas } from '../utils/betas'
|
|
18
|
-
import { getIsGit } from '../utils/git'
|
|
19
|
-
import { getModelManager } from '../utils/model'
|
|
20
|
-
import { MACRO } from '../constants/macros'
|
|
21
|
-
const gateValues: Record<string, boolean> = {}
|
|
22
|
-
let client: StatsigClient | null = null
|
|
23
|
-
|
|
24
|
-
export const initializeStatsig = memoize(
|
|
25
|
-
async (): Promise<StatsigClient | null> => {
|
|
26
|
-
if (env.isCI || process.env.NODE_ENV === 'test') {
|
|
27
|
-
return null
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const user = await getUser()
|
|
31
|
-
const options: StatsigOptions = {
|
|
32
|
-
networkConfig: {
|
|
33
|
-
api: 'https://statsig.anthropic.com/v1/',
|
|
34
|
-
},
|
|
35
|
-
environment: {
|
|
36
|
-
tier:
|
|
37
|
-
env.isCI ||
|
|
38
|
-
['test', 'development'].includes(process.env.NODE_ENV ?? '')
|
|
39
|
-
? 'dev'
|
|
40
|
-
: 'production',
|
|
41
|
-
},
|
|
42
|
-
logLevel: LogLevel.None,
|
|
43
|
-
storageProvider: new FileSystemStorageProvider(),
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
client = new StatsigClient(STATSIG_CLIENT_KEY, user, options)
|
|
47
|
-
client.on('error', errorEvent => {
|
|
48
|
-
logError(`Statsig error: ${errorEvent}`)
|
|
49
|
-
})
|
|
50
|
-
await client.initializeAsync()
|
|
51
|
-
process.on('exit', () => {
|
|
52
|
-
client?.flush()
|
|
53
|
-
})
|
|
54
|
-
return client
|
|
55
|
-
},
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
export function logEvent(
|
|
59
|
-
eventName: string,
|
|
60
|
-
metadata: { [key: string]: string | undefined },
|
|
61
|
-
): void {
|
|
62
|
-
// console.log('logEvent', eventName, metadata)
|
|
63
|
-
if (env.isCI || process.env.NODE_ENV === 'test') {
|
|
64
|
-
return
|
|
65
|
-
}
|
|
66
|
-
Promise.all([
|
|
67
|
-
initializeStatsig(),
|
|
68
|
-
getIsGit(),
|
|
69
|
-
getBetas(),
|
|
70
|
-
metadata.model ? Promise.resolve(metadata.model) : Promise.resolve(getModelManager().getModelName('main') || 'unknown'),
|
|
71
|
-
]).then(([statsigClient, isGit, betas, model]) => {
|
|
72
|
-
if (!statsigClient) return
|
|
73
|
-
|
|
74
|
-
const eventMetadata: Record<string, string> = {
|
|
75
|
-
...metadata,
|
|
76
|
-
model,
|
|
77
|
-
sessionId: SESSION_ID,
|
|
78
|
-
userType: process.env.USER_TYPE || '',
|
|
79
|
-
...(process.env.SWE_BENCH_RUN_ID
|
|
80
|
-
? { sweBenchId: process.env.SWE_BENCH_RUN_ID }
|
|
81
|
-
: {}),
|
|
82
|
-
...(betas.length > 0 ? { betas: betas.join(',') } : {}),
|
|
83
|
-
env: JSON.stringify({
|
|
84
|
-
isGit,
|
|
85
|
-
platform: env.platform,
|
|
86
|
-
nodeVersion: env.nodeVersion,
|
|
87
|
-
terminal: env.terminal,
|
|
88
|
-
version: MACRO.VERSION,
|
|
89
|
-
}),
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Debug logging when debug mode is enabled
|
|
93
|
-
if (process.argv.includes('--debug') || process.argv.includes('-d')) {
|
|
94
|
-
console.log(
|
|
95
|
-
chalk.dim(
|
|
96
|
-
`[DEBUG-ONLY] Statsig event: ${eventName} ${JSON.stringify(metadata, null, 0)}`,
|
|
97
|
-
),
|
|
98
|
-
)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const event: StatsigEvent = {
|
|
102
|
-
eventName,
|
|
103
|
-
metadata: eventMetadata,
|
|
104
|
-
}
|
|
105
|
-
// statsigClient.logEvent(event)
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export const checkGate = memoize(async (gateName: string): Promise<boolean> => {
|
|
110
|
-
// Default to disabled gates when Statsig is not active
|
|
111
|
-
return false
|
|
112
|
-
// if (env.isCI || process.env.NODE_ENV === 'test') {
|
|
113
|
-
// return false
|
|
114
|
-
// }
|
|
115
|
-
// const statsigClient = await initializeStatsig()
|
|
116
|
-
// if (!statsigClient) return false
|
|
117
|
-
|
|
118
|
-
// const value = statsigClient.checkGate(gateName)
|
|
119
|
-
// gateValues[gateName] = value
|
|
120
|
-
// return value
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
export const useStatsigGate = (gateName: string, defaultValue = false) => {
|
|
124
|
-
return false
|
|
125
|
-
// const [gateValue, setGateValue] = React.useState(defaultValue)
|
|
126
|
-
// React.useEffect(() => {
|
|
127
|
-
// checkGate(gateName).then(setGateValue)
|
|
128
|
-
// }, [gateName])
|
|
129
|
-
// return gateValue
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function getGateValues(): Record<string, boolean> {
|
|
133
|
-
return { ...gateValues }
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export const getExperimentValue = memoize(
|
|
137
|
-
async <T>(experimentName: string, defaultValue: T): Promise<T> => {
|
|
138
|
-
return defaultValue
|
|
139
|
-
// if (env.isCI || process.env.NODE_ENV === 'test') {
|
|
140
|
-
// return defaultValue
|
|
141
|
-
// }
|
|
142
|
-
// const statsigClient = await initializeStatsig()
|
|
143
|
-
// if (!statsigClient) return defaultValue
|
|
144
|
-
|
|
145
|
-
// const experiment = statsigClient.getExperiment(experimentName)
|
|
146
|
-
// if (Object.keys(experiment.value).length === 0) {
|
|
147
|
-
// logError(`getExperimentValue got empty value for ${experimentName}`)
|
|
148
|
-
// return defaultValue
|
|
149
|
-
// }
|
|
150
|
-
// return experiment.value as T
|
|
151
|
-
},
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
// NB Not memoized like other methods, to allow for dynamic config changes
|
|
155
|
-
export const getDynamicConfig = async <T>(
|
|
156
|
-
configName: string,
|
|
157
|
-
defaultValue: T,
|
|
158
|
-
): Promise<T> => {
|
|
159
|
-
return defaultValue
|
|
160
|
-
// if (env.isCI || process.env.NODE_ENV === 'test') {
|
|
161
|
-
// return defaultValue
|
|
162
|
-
// }
|
|
163
|
-
// const statsigClient = await initializeStatsig()
|
|
164
|
-
// if (!statsigClient) return defaultValue
|
|
165
|
-
|
|
166
|
-
// const config = statsigClient.getDynamicConfig(configName)
|
|
167
|
-
// if (Object.keys(config.value).length === 0) {
|
|
168
|
-
// logError(`getDynamicConfig got empty value for ${configName}`)
|
|
169
|
-
// return defaultValue
|
|
170
|
-
// }
|
|
171
|
-
// return config.value as T
|
|
172
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { StorageProvider } from '@statsig/client-core'
|
|
2
|
-
import * as fs from 'fs'
|
|
3
|
-
import * as path from 'path'
|
|
4
|
-
import { homedir } from 'os'
|
|
5
|
-
import { logError } from '../utils/log'
|
|
6
|
-
import { existsSync, unlinkSync } from 'fs'
|
|
7
|
-
import { CONFIG_BASE_DIR } from '../constants/product'
|
|
8
|
-
|
|
9
|
-
// Support both KODE_CONFIG_DIR and CLAUDE_CONFIG_DIR environment variables
|
|
10
|
-
const CONFIG_DIR = process.env.KODE_CONFIG_DIR ?? process.env.CLAUDE_CONFIG_DIR ?? path.join(homedir(), CONFIG_BASE_DIR)
|
|
11
|
-
const STATSIG_DIR = path.join(CONFIG_DIR, 'statsig')
|
|
12
|
-
|
|
13
|
-
// Ensure the directory exists
|
|
14
|
-
try {
|
|
15
|
-
fs.mkdirSync(STATSIG_DIR, { recursive: true })
|
|
16
|
-
} catch (error) {
|
|
17
|
-
logError(`Failed to create statsig storage directory: ${error}`)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class FileSystemStorageProvider implements StorageProvider {
|
|
21
|
-
private cache: Map<string, string> = new Map()
|
|
22
|
-
private ready = false
|
|
23
|
-
|
|
24
|
-
constructor() {
|
|
25
|
-
// Load all existing files into cache on startup
|
|
26
|
-
try {
|
|
27
|
-
if (!fs.existsSync(STATSIG_DIR)) {
|
|
28
|
-
fs.mkdirSync(STATSIG_DIR, { recursive: true })
|
|
29
|
-
}
|
|
30
|
-
const files = fs.readdirSync(STATSIG_DIR)
|
|
31
|
-
for (const file of files) {
|
|
32
|
-
const key = decodeURIComponent(file)
|
|
33
|
-
const value = fs.readFileSync(path.join(STATSIG_DIR, file), 'utf8')
|
|
34
|
-
this.cache.set(key, value)
|
|
35
|
-
}
|
|
36
|
-
this.ready = true
|
|
37
|
-
} catch (error) {
|
|
38
|
-
logError(`Failed to initialize statsig storage: ${error}`)
|
|
39
|
-
this.ready = true // Still mark as ready to avoid blocking
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
isReady(): boolean {
|
|
44
|
-
return this.ready
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
isReadyResolver(): Promise<void> | null {
|
|
48
|
-
return this.ready ? Promise.resolve() : null
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
getProviderName(): string {
|
|
52
|
-
return 'FileSystemStorageProvider'
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
getItem(key: string): string | null {
|
|
56
|
-
return this.cache.get(key) ?? null
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
setItem(key: string, value: string): void {
|
|
60
|
-
this.cache.set(key, value)
|
|
61
|
-
try {
|
|
62
|
-
const encodedKey = encodeURIComponent(key)
|
|
63
|
-
fs.writeFileSync(path.join(STATSIG_DIR, encodedKey), value, 'utf8')
|
|
64
|
-
} catch (error) {
|
|
65
|
-
logError(`Failed to write statsig storage item: ${error}`)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
removeItem(key: string): void {
|
|
70
|
-
this.cache.delete(key)
|
|
71
|
-
const encodedKey = encodeURIComponent(key)
|
|
72
|
-
const file = path.join(STATSIG_DIR, encodedKey)
|
|
73
|
-
if (!existsSync(file)) {
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
unlinkSync(file)
|
|
78
|
-
} catch (error) {
|
|
79
|
-
logError(`Failed to remove statsig storage item: ${error}`)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getAllKeys(): readonly string[] {
|
|
84
|
-
return Array.from(this.cache.keys())
|
|
85
|
-
}
|
|
86
|
-
}
|