@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
package/src/utils/todoStorage.ts
DELETED
|
@@ -1,431 +0,0 @@
|
|
|
1
|
-
import { setSessionState, getSessionState } from './sessionState'
|
|
2
|
-
import { readAgentData, writeAgentData, resolveAgentId } from './agentStorage'
|
|
3
|
-
|
|
4
|
-
export interface TodoItem {
|
|
5
|
-
id: string
|
|
6
|
-
content: string
|
|
7
|
-
status: 'pending' | 'in_progress' | 'completed'
|
|
8
|
-
priority: 'high' | 'medium' | 'low'
|
|
9
|
-
createdAt?: number
|
|
10
|
-
updatedAt?: number
|
|
11
|
-
tags?: string[]
|
|
12
|
-
estimatedHours?: number
|
|
13
|
-
previousStatus?: 'pending' | 'in_progress' | 'completed'
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface TodoQuery {
|
|
17
|
-
status?: TodoItem['status'][]
|
|
18
|
-
priority?: TodoItem['priority'][]
|
|
19
|
-
contentMatch?: string
|
|
20
|
-
tags?: string[]
|
|
21
|
-
dateRange?: { from?: Date; to?: Date }
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface TodoStorageConfig {
|
|
25
|
-
maxTodos: number
|
|
26
|
-
autoArchiveCompleted: boolean
|
|
27
|
-
sortBy: 'createdAt' | 'updatedAt' | 'priority' | 'status'
|
|
28
|
-
sortOrder: 'asc' | 'desc'
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const TODO_STORAGE_KEY = 'todos'
|
|
32
|
-
const TODO_CONFIG_KEY = 'todoConfig'
|
|
33
|
-
const TODO_CACHE_KEY = 'todoCache'
|
|
34
|
-
|
|
35
|
-
// Default configuration
|
|
36
|
-
const DEFAULT_CONFIG: TodoStorageConfig = {
|
|
37
|
-
maxTodos: 100,
|
|
38
|
-
autoArchiveCompleted: false,
|
|
39
|
-
sortBy: 'status', // Using smart sorting now
|
|
40
|
-
sortOrder: 'desc',
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// In-memory cache for performance
|
|
44
|
-
let todoCache: TodoItem[] | null = null
|
|
45
|
-
let cacheTimestamp = 0
|
|
46
|
-
const CACHE_TTL = 5000 // 5 seconds cache
|
|
47
|
-
|
|
48
|
-
// Performance metrics
|
|
49
|
-
export interface TodoMetrics {
|
|
50
|
-
totalOperations: number
|
|
51
|
-
cacheHits: number
|
|
52
|
-
cacheMisses: number
|
|
53
|
-
lastOperation: number
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function invalidateCache(): void {
|
|
57
|
-
todoCache = null
|
|
58
|
-
cacheTimestamp = 0
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function updateMetrics(operation: string, cacheHit: boolean = false): void {
|
|
62
|
-
const sessionState = getSessionState() as any
|
|
63
|
-
const metrics = sessionState.todoMetrics || {
|
|
64
|
-
totalOperations: 0,
|
|
65
|
-
cacheHits: 0,
|
|
66
|
-
cacheMisses: 0,
|
|
67
|
-
lastOperation: 0,
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
metrics.totalOperations++
|
|
71
|
-
metrics.lastOperation = Date.now()
|
|
72
|
-
|
|
73
|
-
if (cacheHit) {
|
|
74
|
-
metrics.cacheHits++
|
|
75
|
-
} else {
|
|
76
|
-
metrics.cacheMisses++
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
setSessionState({
|
|
80
|
-
...sessionState,
|
|
81
|
-
todoMetrics: metrics,
|
|
82
|
-
})
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export function getTodoMetrics(): TodoMetrics {
|
|
86
|
-
const sessionState = getSessionState() as any
|
|
87
|
-
return (
|
|
88
|
-
sessionState.todoMetrics || {
|
|
89
|
-
totalOperations: 0,
|
|
90
|
-
cacheHits: 0,
|
|
91
|
-
cacheMisses: 0,
|
|
92
|
-
lastOperation: 0,
|
|
93
|
-
}
|
|
94
|
-
)
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function getTodos(agentId?: string): TodoItem[] {
|
|
98
|
-
const resolvedAgentId = resolveAgentId(agentId)
|
|
99
|
-
const now = Date.now()
|
|
100
|
-
|
|
101
|
-
// For agent-scoped storage, use file-based storage instead of session state
|
|
102
|
-
if (agentId) {
|
|
103
|
-
updateMetrics('getTodos', false)
|
|
104
|
-
const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []
|
|
105
|
-
|
|
106
|
-
// Update cache with agent-specific cache key
|
|
107
|
-
const agentCacheKey = `todoCache_${resolvedAgentId}`
|
|
108
|
-
// Note: In production, we'd want agent-specific caching
|
|
109
|
-
|
|
110
|
-
return agentTodos
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Original session-based storage for backward compatibility
|
|
114
|
-
// Check cache first
|
|
115
|
-
if (todoCache && now - cacheTimestamp < CACHE_TTL) {
|
|
116
|
-
updateMetrics('getTodos', true)
|
|
117
|
-
return todoCache
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
updateMetrics('getTodos', false)
|
|
121
|
-
const sessionState = getSessionState()
|
|
122
|
-
const todos = (sessionState as any)[TODO_STORAGE_KEY] || []
|
|
123
|
-
|
|
124
|
-
// Update cache
|
|
125
|
-
todoCache = [...todos]
|
|
126
|
-
cacheTimestamp = now
|
|
127
|
-
|
|
128
|
-
return todos
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export function setTodos(todos: TodoItem[], agentId?: string): void {
|
|
132
|
-
const resolvedAgentId = resolveAgentId(agentId)
|
|
133
|
-
const config = getTodoConfig()
|
|
134
|
-
const existingTodos = getTodos(agentId)
|
|
135
|
-
|
|
136
|
-
// For agent-scoped storage, use file-based storage
|
|
137
|
-
if (agentId) {
|
|
138
|
-
// Validate todo limit
|
|
139
|
-
if (todos.length > config.maxTodos) {
|
|
140
|
-
throw new Error(
|
|
141
|
-
`Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,
|
|
142
|
-
)
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Auto-archive completed todos if enabled
|
|
146
|
-
let processedTodos = todos
|
|
147
|
-
if (config.autoArchiveCompleted) {
|
|
148
|
-
processedTodos = todos.filter(todo => todo.status !== 'completed')
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const updatedTodos = processedTodos.map(todo => {
|
|
152
|
-
// Find existing todo to track status changes
|
|
153
|
-
const existingTodo = existingTodos.find(
|
|
154
|
-
existing => existing.id === todo.id,
|
|
155
|
-
)
|
|
156
|
-
|
|
157
|
-
return {
|
|
158
|
-
...todo,
|
|
159
|
-
updatedAt: Date.now(),
|
|
160
|
-
createdAt: todo.createdAt || Date.now(),
|
|
161
|
-
previousStatus:
|
|
162
|
-
existingTodo?.status !== todo.status
|
|
163
|
-
? existingTodo?.status
|
|
164
|
-
: todo.previousStatus,
|
|
165
|
-
}
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
// Smart sorting for agent todos
|
|
169
|
-
updatedTodos.sort((a, b) => {
|
|
170
|
-
// 1. Status priority: in_progress > pending > completed
|
|
171
|
-
const statusOrder = { in_progress: 3, pending: 2, completed: 1 }
|
|
172
|
-
const statusDiff = statusOrder[b.status] - statusOrder[a.status]
|
|
173
|
-
if (statusDiff !== 0) return statusDiff
|
|
174
|
-
|
|
175
|
-
// 2. For same status, sort by priority: high > medium > low
|
|
176
|
-
const priorityOrder = { high: 3, medium: 2, low: 1 }
|
|
177
|
-
const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]
|
|
178
|
-
if (priorityDiff !== 0) return priorityDiff
|
|
179
|
-
|
|
180
|
-
// 3. For same status and priority, sort by updatedAt (newest first)
|
|
181
|
-
const aTime = a.updatedAt || 0
|
|
182
|
-
const bTime = b.updatedAt || 0
|
|
183
|
-
return bTime - aTime
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
// Write to agent-specific storage
|
|
187
|
-
writeAgentData(resolvedAgentId, updatedTodos)
|
|
188
|
-
updateMetrics('setTodos')
|
|
189
|
-
return
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Original session-based logic for backward compatibility
|
|
193
|
-
// Validate todo limit
|
|
194
|
-
if (todos.length > config.maxTodos) {
|
|
195
|
-
throw new Error(
|
|
196
|
-
`Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Auto-archive completed todos if enabled
|
|
201
|
-
let processedTodos = todos
|
|
202
|
-
if (config.autoArchiveCompleted) {
|
|
203
|
-
processedTodos = todos.filter(todo => todo.status !== 'completed')
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const updatedTodos = processedTodos.map(todo => {
|
|
207
|
-
// Find existing todo to track status changes
|
|
208
|
-
const existingTodo = existingTodos.find(existing => existing.id === todo.id)
|
|
209
|
-
|
|
210
|
-
return {
|
|
211
|
-
...todo,
|
|
212
|
-
updatedAt: Date.now(),
|
|
213
|
-
createdAt: todo.createdAt || Date.now(),
|
|
214
|
-
previousStatus:
|
|
215
|
-
existingTodo?.status !== todo.status
|
|
216
|
-
? existingTodo?.status
|
|
217
|
-
: todo.previousStatus,
|
|
218
|
-
}
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
// Smart sorting: status -> priority -> updatedAt
|
|
222
|
-
updatedTodos.sort((a, b) => {
|
|
223
|
-
// 1. Status priority: in_progress > pending > completed
|
|
224
|
-
const statusOrder = { in_progress: 3, pending: 2, completed: 1 }
|
|
225
|
-
const statusDiff = statusOrder[b.status] - statusOrder[a.status]
|
|
226
|
-
if (statusDiff !== 0) return statusDiff
|
|
227
|
-
|
|
228
|
-
// 2. For same status, sort by priority: high > medium > low
|
|
229
|
-
const priorityOrder = { high: 3, medium: 2, low: 1 }
|
|
230
|
-
const priorityDiff = priorityOrder[b.priority] - priorityOrder[a.priority]
|
|
231
|
-
if (priorityDiff !== 0) return priorityDiff
|
|
232
|
-
|
|
233
|
-
// 3. For same status and priority, sort by updatedAt (newest first)
|
|
234
|
-
const aTime = a.updatedAt || 0
|
|
235
|
-
const bTime = b.updatedAt || 0
|
|
236
|
-
return bTime - aTime
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
setSessionState({
|
|
240
|
-
...getSessionState(),
|
|
241
|
-
[TODO_STORAGE_KEY]: updatedTodos,
|
|
242
|
-
} as any)
|
|
243
|
-
|
|
244
|
-
// Invalidate cache
|
|
245
|
-
invalidateCache()
|
|
246
|
-
updateMetrics('setTodos')
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
export function getTodoConfig(): TodoStorageConfig {
|
|
250
|
-
const sessionState = getSessionState() as any
|
|
251
|
-
return { ...DEFAULT_CONFIG, ...(sessionState[TODO_CONFIG_KEY] || {}) }
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export function setTodoConfig(config: Partial<TodoStorageConfig>): void {
|
|
255
|
-
const currentConfig = getTodoConfig()
|
|
256
|
-
const newConfig = { ...currentConfig, ...config }
|
|
257
|
-
|
|
258
|
-
setSessionState({
|
|
259
|
-
...getSessionState(),
|
|
260
|
-
[TODO_CONFIG_KEY]: newConfig,
|
|
261
|
-
} as any)
|
|
262
|
-
|
|
263
|
-
// Re-sort existing todos if sort order changed
|
|
264
|
-
if (config.sortBy || config.sortOrder) {
|
|
265
|
-
const todos = getTodos()
|
|
266
|
-
setTodos(todos) // This will re-sort according to new config
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
export function addTodo(
|
|
271
|
-
todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,
|
|
272
|
-
): TodoItem[] {
|
|
273
|
-
const todos = getTodos()
|
|
274
|
-
|
|
275
|
-
// Check for duplicate IDs
|
|
276
|
-
if (todos.some(existing => existing.id === todo.id)) {
|
|
277
|
-
throw new Error(`Todo with ID '${todo.id}' already exists`)
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const newTodo: TodoItem = {
|
|
281
|
-
...todo,
|
|
282
|
-
createdAt: Date.now(),
|
|
283
|
-
updatedAt: Date.now(),
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
const updatedTodos = [...todos, newTodo]
|
|
287
|
-
setTodos(updatedTodos)
|
|
288
|
-
updateMetrics('addTodo')
|
|
289
|
-
return updatedTodos
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
export function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {
|
|
293
|
-
const todos = getTodos()
|
|
294
|
-
const existingTodo = todos.find(todo => todo.id === id)
|
|
295
|
-
|
|
296
|
-
if (!existingTodo) {
|
|
297
|
-
throw new Error(`Todo with ID '${id}' not found`)
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const updatedTodos = todos.map(todo =>
|
|
301
|
-
todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
setTodos(updatedTodos)
|
|
305
|
-
updateMetrics('updateTodo')
|
|
306
|
-
return updatedTodos
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
export function deleteTodo(id: string): TodoItem[] {
|
|
310
|
-
const todos = getTodos()
|
|
311
|
-
const todoExists = todos.some(todo => todo.id === id)
|
|
312
|
-
|
|
313
|
-
if (!todoExists) {
|
|
314
|
-
throw new Error(`Todo with ID '${id}' not found`)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
const updatedTodos = todos.filter(todo => todo.id !== id)
|
|
318
|
-
setTodos(updatedTodos)
|
|
319
|
-
updateMetrics('deleteTodo')
|
|
320
|
-
return updatedTodos
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
export function clearTodos(): void {
|
|
324
|
-
setTodos([])
|
|
325
|
-
updateMetrics('clearTodos')
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
export function getTodoById(id: string): TodoItem | undefined {
|
|
329
|
-
const todos = getTodos()
|
|
330
|
-
updateMetrics('getTodoById')
|
|
331
|
-
return todos.find(todo => todo.id === id)
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
export function getTodosByStatus(status: TodoItem['status']): TodoItem[] {
|
|
335
|
-
const todos = getTodos()
|
|
336
|
-
updateMetrics('getTodosByStatus')
|
|
337
|
-
return todos.filter(todo => todo.status === status)
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
export function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {
|
|
341
|
-
const todos = getTodos()
|
|
342
|
-
updateMetrics('getTodosByPriority')
|
|
343
|
-
return todos.filter(todo => todo.priority === priority)
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Advanced query function
|
|
347
|
-
export function queryTodos(query: TodoQuery): TodoItem[] {
|
|
348
|
-
const todos = getTodos()
|
|
349
|
-
updateMetrics('queryTodos')
|
|
350
|
-
|
|
351
|
-
return todos.filter(todo => {
|
|
352
|
-
// Status filter
|
|
353
|
-
if (query.status && !query.status.includes(todo.status)) {
|
|
354
|
-
return false
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Priority filter
|
|
358
|
-
if (query.priority && !query.priority.includes(todo.priority)) {
|
|
359
|
-
return false
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// Content search
|
|
363
|
-
if (
|
|
364
|
-
query.contentMatch &&
|
|
365
|
-
!todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())
|
|
366
|
-
) {
|
|
367
|
-
return false
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// Tags filter
|
|
371
|
-
if (query.tags && todo.tags) {
|
|
372
|
-
const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))
|
|
373
|
-
if (!hasMatchingTag) return false
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// Date range filter
|
|
377
|
-
if (query.dateRange) {
|
|
378
|
-
const todoDate = new Date(todo.createdAt || 0)
|
|
379
|
-
if (query.dateRange.from && todoDate < query.dateRange.from) return false
|
|
380
|
-
if (query.dateRange.to && todoDate > query.dateRange.to) return false
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
return true
|
|
384
|
-
})
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
// Utility functions
|
|
388
|
-
export function getTodoStatistics() {
|
|
389
|
-
const todos = getTodos()
|
|
390
|
-
const metrics = getTodoMetrics()
|
|
391
|
-
|
|
392
|
-
return {
|
|
393
|
-
total: todos.length,
|
|
394
|
-
byStatus: {
|
|
395
|
-
pending: todos.filter(t => t.status === 'pending').length,
|
|
396
|
-
in_progress: todos.filter(t => t.status === 'in_progress').length,
|
|
397
|
-
completed: todos.filter(t => t.status === 'completed').length,
|
|
398
|
-
},
|
|
399
|
-
byPriority: {
|
|
400
|
-
high: todos.filter(t => t.priority === 'high').length,
|
|
401
|
-
medium: todos.filter(t => t.priority === 'medium').length,
|
|
402
|
-
low: todos.filter(t => t.priority === 'low').length,
|
|
403
|
-
},
|
|
404
|
-
metrics,
|
|
405
|
-
cacheEfficiency:
|
|
406
|
-
metrics.totalOperations > 0
|
|
407
|
-
? Math.round((metrics.cacheHits / metrics.totalOperations) * 100)
|
|
408
|
-
: 0,
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
export function optimizeTodoStorage(): void {
|
|
413
|
-
// Force cache refresh
|
|
414
|
-
invalidateCache()
|
|
415
|
-
|
|
416
|
-
// Compact storage by removing any invalid entries
|
|
417
|
-
const todos = getTodos()
|
|
418
|
-
const validTodos = todos.filter(
|
|
419
|
-
todo =>
|
|
420
|
-
todo.id &&
|
|
421
|
-
todo.content &&
|
|
422
|
-
['pending', 'in_progress', 'completed'].includes(todo.status) &&
|
|
423
|
-
['high', 'medium', 'low'].includes(todo.priority),
|
|
424
|
-
)
|
|
425
|
-
|
|
426
|
-
if (validTodos.length !== todos.length) {
|
|
427
|
-
setTodos(validTodos)
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
updateMetrics('optimizeTodoStorage')
|
|
431
|
-
}
|
package/src/utils/tokens.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Message } from '../query'
|
|
2
|
-
import { SYNTHETIC_ASSISTANT_MESSAGES } from './messages'
|
|
3
|
-
|
|
4
|
-
export function countTokens(messages: Message[]): number {
|
|
5
|
-
let i = messages.length - 1
|
|
6
|
-
while (i >= 0) {
|
|
7
|
-
const message = messages[i]
|
|
8
|
-
if (
|
|
9
|
-
message?.type === 'assistant' &&
|
|
10
|
-
'usage' in message.message &&
|
|
11
|
-
!(
|
|
12
|
-
message.message.content[0]?.type === 'text' &&
|
|
13
|
-
SYNTHETIC_ASSISTANT_MESSAGES.has(message.message.content[0].text)
|
|
14
|
-
)
|
|
15
|
-
) {
|
|
16
|
-
const { usage } = message.message
|
|
17
|
-
return (
|
|
18
|
-
usage.input_tokens +
|
|
19
|
-
(usage.cache_creation_input_tokens ?? 0) +
|
|
20
|
-
(usage.cache_read_input_tokens ?? 0) +
|
|
21
|
-
usage.output_tokens
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
i--
|
|
25
|
-
}
|
|
26
|
-
return 0
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function countCachedTokens(messages: Message[]): number {
|
|
30
|
-
let i = messages.length - 1
|
|
31
|
-
while (i >= 0) {
|
|
32
|
-
const message = messages[i]
|
|
33
|
-
if (message?.type === 'assistant' && 'usage' in message.message) {
|
|
34
|
-
const { usage } = message.message
|
|
35
|
-
return (
|
|
36
|
-
(usage.cache_creation_input_tokens ?? 0) +
|
|
37
|
-
(usage.cache_read_input_tokens ?? 0)
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
i--
|
|
41
|
-
}
|
|
42
|
-
return 0
|
|
43
|
-
}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'
|
|
2
|
-
import type { Tool } from '../Tool'
|
|
3
|
-
|
|
4
|
-
export interface ToolExecutionGroup {
|
|
5
|
-
concurrent: ToolUseBlock[]
|
|
6
|
-
sequential: ToolUseBlock[]
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Tool Execution Controller
|
|
11
|
-
* Manages tool execution based on concurrency safety and dependencies
|
|
12
|
-
*/
|
|
13
|
-
export class ToolExecutionController {
|
|
14
|
-
private tools: Tool[]
|
|
15
|
-
|
|
16
|
-
constructor(tools: Tool[]) {
|
|
17
|
-
this.tools = tools
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Group tools into concurrent and sequential execution groups
|
|
22
|
-
*/
|
|
23
|
-
groupToolsForExecution(
|
|
24
|
-
toolUseMessages: ToolUseBlock[],
|
|
25
|
-
): ToolExecutionGroup[] {
|
|
26
|
-
const groups: ToolExecutionGroup[] = []
|
|
27
|
-
let currentGroup: ToolExecutionGroup = { concurrent: [], sequential: [] }
|
|
28
|
-
|
|
29
|
-
for (const toolUse of toolUseMessages) {
|
|
30
|
-
const tool = this.findTool(toolUse.name)
|
|
31
|
-
|
|
32
|
-
if (!tool) {
|
|
33
|
-
// Unknown tool, execute sequentially for safety
|
|
34
|
-
this.flushCurrentGroup(groups, currentGroup)
|
|
35
|
-
currentGroup = { concurrent: [], sequential: [toolUse] }
|
|
36
|
-
continue
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (tool.isConcurrencySafe()) {
|
|
40
|
-
// Safe for concurrent execution
|
|
41
|
-
currentGroup.concurrent.push(toolUse)
|
|
42
|
-
} else {
|
|
43
|
-
// Must be executed sequentially
|
|
44
|
-
this.flushCurrentGroup(groups, currentGroup)
|
|
45
|
-
currentGroup = { concurrent: [], sequential: [toolUse] }
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Flush the last group
|
|
50
|
-
this.flushCurrentGroup(groups, currentGroup)
|
|
51
|
-
|
|
52
|
-
return groups.filter(
|
|
53
|
-
group => group.concurrent.length > 0 || group.sequential.length > 0,
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Check if all tools in a list can be executed concurrently
|
|
59
|
-
*/
|
|
60
|
-
canExecuteConcurrently(toolUseMessages: ToolUseBlock[]): boolean {
|
|
61
|
-
return toolUseMessages.every(msg => {
|
|
62
|
-
const tool = this.findTool(msg.name)
|
|
63
|
-
return tool?.isConcurrencySafe() ?? false
|
|
64
|
-
})
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Get tool concurrency safety status
|
|
69
|
-
*/
|
|
70
|
-
getToolConcurrencyInfo(toolName: string): {
|
|
71
|
-
found: boolean
|
|
72
|
-
isConcurrencySafe: boolean
|
|
73
|
-
isReadOnly: boolean
|
|
74
|
-
} {
|
|
75
|
-
const tool = this.findTool(toolName)
|
|
76
|
-
|
|
77
|
-
if (!tool) {
|
|
78
|
-
return { found: false, isConcurrencySafe: false, isReadOnly: false }
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
found: true,
|
|
83
|
-
isConcurrencySafe: tool.isConcurrencySafe(),
|
|
84
|
-
isReadOnly: tool.isReadOnly(),
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Analyze tool execution plan and provide recommendations
|
|
90
|
-
*/
|
|
91
|
-
analyzeExecutionPlan(toolUseMessages: ToolUseBlock[]): {
|
|
92
|
-
canOptimize: boolean
|
|
93
|
-
concurrentCount: number
|
|
94
|
-
sequentialCount: number
|
|
95
|
-
groups: ToolExecutionGroup[]
|
|
96
|
-
recommendations: string[]
|
|
97
|
-
} {
|
|
98
|
-
const groups = this.groupToolsForExecution(toolUseMessages)
|
|
99
|
-
const concurrentCount = groups.reduce(
|
|
100
|
-
(sum, g) => sum + g.concurrent.length,
|
|
101
|
-
0,
|
|
102
|
-
)
|
|
103
|
-
const sequentialCount = groups.reduce(
|
|
104
|
-
(sum, g) => sum + g.sequential.length,
|
|
105
|
-
0,
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
const recommendations: string[] = []
|
|
109
|
-
|
|
110
|
-
if (concurrentCount > 1) {
|
|
111
|
-
recommendations.push(
|
|
112
|
-
`${concurrentCount} tools can run concurrently for better performance`,
|
|
113
|
-
)
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
if (sequentialCount > 1) {
|
|
117
|
-
recommendations.push(
|
|
118
|
-
`${sequentialCount} tools must run sequentially for safety`,
|
|
119
|
-
)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (groups.length > 1) {
|
|
123
|
-
recommendations.push(
|
|
124
|
-
`Execution will be divided into ${groups.length} groups`,
|
|
125
|
-
)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return {
|
|
129
|
-
canOptimize: concurrentCount > 1,
|
|
130
|
-
concurrentCount,
|
|
131
|
-
sequentialCount,
|
|
132
|
-
groups,
|
|
133
|
-
recommendations,
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
private findTool(name: string): Tool | undefined {
|
|
138
|
-
return this.tools.find(t => t.name === name)
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
private flushCurrentGroup(
|
|
142
|
-
groups: ToolExecutionGroup[],
|
|
143
|
-
currentGroup: ToolExecutionGroup,
|
|
144
|
-
): void {
|
|
145
|
-
if (
|
|
146
|
-
currentGroup.concurrent.length > 0 ||
|
|
147
|
-
currentGroup.sequential.length > 0
|
|
148
|
-
) {
|
|
149
|
-
groups.push({ ...currentGroup })
|
|
150
|
-
currentGroup.concurrent = []
|
|
151
|
-
currentGroup.sequential = []
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Create a tool execution controller for the given tools
|
|
158
|
-
*/
|
|
159
|
-
export function createToolExecutionController(
|
|
160
|
-
tools: Tool[],
|
|
161
|
-
): ToolExecutionController {
|
|
162
|
-
return new ToolExecutionController(tools)
|
|
163
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { logEvent } from '../services/statsig'
|
|
2
|
-
|
|
3
|
-
export type CompletionType =
|
|
4
|
-
| 'str_replace_single'
|
|
5
|
-
| 'write_file_single'
|
|
6
|
-
| 'tool_use_single'
|
|
7
|
-
|
|
8
|
-
type LogEvent = {
|
|
9
|
-
completion_type: CompletionType
|
|
10
|
-
event: 'accept' | 'reject' | 'response'
|
|
11
|
-
metadata: {
|
|
12
|
-
language_name: string
|
|
13
|
-
message_id: string
|
|
14
|
-
platform: string
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function logUnaryEvent(event: LogEvent): void {
|
|
19
|
-
logEvent('tengu_unary_event', {
|
|
20
|
-
event: event.event,
|
|
21
|
-
completion_type: event.completion_type,
|
|
22
|
-
language_name: event.metadata.language_name,
|
|
23
|
-
message_id: event.metadata.message_id,
|
|
24
|
-
platform: event.metadata.platform,
|
|
25
|
-
})
|
|
26
|
-
}
|
package/src/utils/user.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { getGlobalConfig, getOrCreateUserID } from './config'
|
|
2
|
-
import { memoize } from 'lodash-es'
|
|
3
|
-
import { env } from './env'
|
|
4
|
-
import { type StatsigUser } from '@statsig/js-client'
|
|
5
|
-
import { execFileNoThrow } from './execFileNoThrow'
|
|
6
|
-
import { logError, SESSION_ID } from './log'
|
|
7
|
-
import { MACRO } from '../constants/macros'
|
|
8
|
-
export const getGitEmail = memoize(async (): Promise<string | undefined> => {
|
|
9
|
-
const result = await execFileNoThrow('git', ['config', 'user.email'])
|
|
10
|
-
if (result.code !== 0) {
|
|
11
|
-
logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)
|
|
12
|
-
return undefined
|
|
13
|
-
}
|
|
14
|
-
return result.stdout.trim() || undefined
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
export const getUser = memoize(async (): Promise<StatsigUser> => {
|
|
18
|
-
const userID = getOrCreateUserID()
|
|
19
|
-
const config = getGlobalConfig()
|
|
20
|
-
const email = undefined
|
|
21
|
-
return {
|
|
22
|
-
customIDs: {
|
|
23
|
-
// for session level tests
|
|
24
|
-
sessionId: SESSION_ID,
|
|
25
|
-
},
|
|
26
|
-
userID,
|
|
27
|
-
appVersion: MACRO.VERSION,
|
|
28
|
-
userAgent: env.platform,
|
|
29
|
-
email,
|
|
30
|
-
custom: {
|
|
31
|
-
nodeVersion: env.nodeVersion,
|
|
32
|
-
userType: process.env.USER_TYPE,
|
|
33
|
-
organizationUuid: config.oauthAccount?.organizationUuid,
|
|
34
|
-
accountUuid: config.oauthAccount?.accountUuid,
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
})
|