@shareai-lab/kode 1.1.13 → 1.1.16
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/entrypoints/cli.js +2 -1
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/index.js +5 -26
- package/dist/package.json +4 -1
- package/package.json +9 -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,328 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Input Method Inspired Fuzzy Matching Algorithm
|
|
3
|
-
*
|
|
4
|
-
* Multi-algorithm weighted scoring system inspired by:
|
|
5
|
-
* - Sogou/Baidu Pinyin input method algorithms
|
|
6
|
-
* - Double-pinyin abbreviation matching
|
|
7
|
-
* - Terminal completion best practices (fzf, zsh, fish)
|
|
8
|
-
*
|
|
9
|
-
* Designed specifically for command/terminal completion scenarios
|
|
10
|
-
* where users type abbreviations like "nde" expecting "node"
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
export interface MatchResult {
|
|
14
|
-
score: number
|
|
15
|
-
algorithm: string // Which algorithm contributed most to the score
|
|
16
|
-
confidence: number // 0-1 confidence level
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface FuzzyMatcherConfig {
|
|
20
|
-
// Algorithm weights (must sum to 1.0)
|
|
21
|
-
weights: {
|
|
22
|
-
prefix: number // Direct prefix matching ("nod" → "node")
|
|
23
|
-
substring: number // Substring matching ("ode" → "node")
|
|
24
|
-
abbreviation: number // Key chars matching ("nde" → "node")
|
|
25
|
-
editDistance: number // Typo tolerance ("noda" → "node")
|
|
26
|
-
popularity: number // Common command boost
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Scoring parameters
|
|
30
|
-
minScore: number // Minimum score threshold
|
|
31
|
-
maxEditDistance: number // Maximum edits allowed
|
|
32
|
-
popularCommands: string[] // Commands to boost
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const DEFAULT_CONFIG: FuzzyMatcherConfig = {
|
|
36
|
-
weights: {
|
|
37
|
-
prefix: 0.35, // Strong weight for prefix matching
|
|
38
|
-
substring: 0.20, // Good for partial matches
|
|
39
|
-
abbreviation: 0.30, // Key for "nde"→"node" cases
|
|
40
|
-
editDistance: 0.10, // Typo tolerance
|
|
41
|
-
popularity: 0.05 // Slight bias for common commands
|
|
42
|
-
},
|
|
43
|
-
minScore: 10, // Lower threshold for better matching
|
|
44
|
-
maxEditDistance: 2,
|
|
45
|
-
popularCommands: [
|
|
46
|
-
'node', 'npm', 'git', 'ls', 'cd', 'cat', 'grep', 'find', 'cp', 'mv',
|
|
47
|
-
'python', 'java', 'docker', 'curl', 'wget', 'vim', 'nano'
|
|
48
|
-
]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export class FuzzyMatcher {
|
|
52
|
-
private config: FuzzyMatcherConfig
|
|
53
|
-
|
|
54
|
-
constructor(config: Partial<FuzzyMatcherConfig> = {}) {
|
|
55
|
-
this.config = { ...DEFAULT_CONFIG, ...config }
|
|
56
|
-
|
|
57
|
-
// Normalize weights to sum to 1.0
|
|
58
|
-
const weightSum = Object.values(this.config.weights).reduce((a, b) => a + b, 0)
|
|
59
|
-
if (Math.abs(weightSum - 1.0) > 0.01) {
|
|
60
|
-
Object.keys(this.config.weights).forEach(key => {
|
|
61
|
-
this.config.weights[key as keyof typeof this.config.weights] /= weightSum
|
|
62
|
-
})
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Calculate fuzzy match score for a candidate against a query
|
|
68
|
-
*/
|
|
69
|
-
match(candidate: string, query: string): MatchResult {
|
|
70
|
-
const text = candidate.toLowerCase()
|
|
71
|
-
const pattern = query.toLowerCase()
|
|
72
|
-
|
|
73
|
-
// Quick perfect match exits
|
|
74
|
-
if (text === pattern) {
|
|
75
|
-
return { score: 1000, algorithm: 'exact', confidence: 1.0 }
|
|
76
|
-
}
|
|
77
|
-
if (text.startsWith(pattern)) {
|
|
78
|
-
return {
|
|
79
|
-
score: 900 + (10 - pattern.length),
|
|
80
|
-
algorithm: 'prefix-exact',
|
|
81
|
-
confidence: 0.95
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Run all algorithms
|
|
86
|
-
const scores = {
|
|
87
|
-
prefix: this.prefixScore(text, pattern),
|
|
88
|
-
substring: this.substringScore(text, pattern),
|
|
89
|
-
abbreviation: this.abbreviationScore(text, pattern),
|
|
90
|
-
editDistance: this.editDistanceScore(text, pattern),
|
|
91
|
-
popularity: this.popularityScore(text)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Weighted combination
|
|
95
|
-
const rawScore = Object.entries(scores).reduce((total, [algorithm, score]) => {
|
|
96
|
-
const weight = this.config.weights[algorithm as keyof typeof this.config.weights]
|
|
97
|
-
return total + (score * weight)
|
|
98
|
-
}, 0)
|
|
99
|
-
|
|
100
|
-
// Length penalty (prefer shorter commands)
|
|
101
|
-
const lengthPenalty = Math.max(0, text.length - 6) * 1.5
|
|
102
|
-
const finalScore = Math.max(0, rawScore - lengthPenalty)
|
|
103
|
-
|
|
104
|
-
// Determine primary algorithm and confidence
|
|
105
|
-
const maxAlgorithm = Object.entries(scores).reduce((max, [alg, score]) =>
|
|
106
|
-
score > max.score ? { algorithm: alg, score } : max,
|
|
107
|
-
{ algorithm: 'none', score: 0 }
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
const confidence = Math.min(1.0, finalScore / 100)
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
score: finalScore,
|
|
114
|
-
algorithm: maxAlgorithm.algorithm,
|
|
115
|
-
confidence
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Algorithm 1: Prefix Matching (like pinyin prefix)
|
|
121
|
-
* Handles cases like "nod" → "node"
|
|
122
|
-
*/
|
|
123
|
-
private prefixScore(text: string, pattern: string): number {
|
|
124
|
-
if (!text.startsWith(pattern)) return 0
|
|
125
|
-
|
|
126
|
-
// Score based on prefix length vs total length
|
|
127
|
-
const coverage = pattern.length / text.length
|
|
128
|
-
return 100 * coverage
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Algorithm 2: Substring Matching (like pinyin contains)
|
|
133
|
-
* Handles cases like "ode" → "node", "py3" → "python3"
|
|
134
|
-
*/
|
|
135
|
-
private substringScore(text: string, pattern: string): number {
|
|
136
|
-
// Direct substring match
|
|
137
|
-
const index = text.indexOf(pattern)
|
|
138
|
-
if (index !== -1) {
|
|
139
|
-
// Earlier position and better coverage = higher score
|
|
140
|
-
const positionFactor = Math.max(0, 10 - index) / 10
|
|
141
|
-
const coverageFactor = pattern.length / text.length
|
|
142
|
-
return 80 * positionFactor * coverageFactor
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Special handling for numeric suffixes (py3 → python3)
|
|
146
|
-
// Check if pattern ends with a number and try prefix match + number
|
|
147
|
-
const numMatch = pattern.match(/^(.+?)(\d+)$/)
|
|
148
|
-
if (numMatch) {
|
|
149
|
-
const [, prefix, num] = numMatch
|
|
150
|
-
// Check if text starts with prefix and ends with the same number
|
|
151
|
-
if (text.startsWith(prefix) && text.endsWith(num)) {
|
|
152
|
-
// Good match for patterns like "py3" → "python3"
|
|
153
|
-
const coverageFactor = pattern.length / text.length
|
|
154
|
-
return 70 * coverageFactor + 20 // Bonus for numeric suffix match
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return 0
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Algorithm 3: Abbreviation Matching (key innovation)
|
|
163
|
-
* Handles cases like "nde" → "node", "pyt3" → "python3", "gp5" → "gpt-5"
|
|
164
|
-
*/
|
|
165
|
-
private abbreviationScore(text: string, pattern: string): number {
|
|
166
|
-
let score = 0
|
|
167
|
-
let textPos = 0
|
|
168
|
-
let perfectStart = false
|
|
169
|
-
let consecutiveMatches = 0
|
|
170
|
-
let wordBoundaryMatches = 0
|
|
171
|
-
|
|
172
|
-
// Split text by hyphens to handle word boundaries better
|
|
173
|
-
const textWords = text.split('-')
|
|
174
|
-
const textClean = text.replace(/-/g, '').toLowerCase()
|
|
175
|
-
|
|
176
|
-
for (let i = 0; i < pattern.length; i++) {
|
|
177
|
-
const char = pattern[i]
|
|
178
|
-
let charFound = false
|
|
179
|
-
|
|
180
|
-
// Try to find in clean text (no hyphens)
|
|
181
|
-
for (let j = textPos; j < textClean.length; j++) {
|
|
182
|
-
if (textClean[j] === char) {
|
|
183
|
-
charFound = true
|
|
184
|
-
|
|
185
|
-
// Check if this character is at a word boundary in original text
|
|
186
|
-
let originalPos = 0
|
|
187
|
-
let cleanPos = 0
|
|
188
|
-
for (let k = 0; k < text.length; k++) {
|
|
189
|
-
if (text[k] === '-') continue
|
|
190
|
-
if (cleanPos === j) {
|
|
191
|
-
originalPos = k
|
|
192
|
-
break
|
|
193
|
-
}
|
|
194
|
-
cleanPos++
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// Consecutive character bonus
|
|
198
|
-
if (j === textPos) {
|
|
199
|
-
consecutiveMatches++
|
|
200
|
-
} else {
|
|
201
|
-
consecutiveMatches = 1
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Position-sensitive scoring
|
|
205
|
-
if (i === 0 && j === 0) {
|
|
206
|
-
score += 50 // Perfect first character
|
|
207
|
-
perfectStart = true
|
|
208
|
-
} else if (originalPos === 0 || text[originalPos - 1] === '-') {
|
|
209
|
-
score += 35 // Word boundary match
|
|
210
|
-
wordBoundaryMatches++
|
|
211
|
-
} else if (j <= 2) {
|
|
212
|
-
score += 20 // Early position
|
|
213
|
-
} else if (j <= 6) {
|
|
214
|
-
score += 10 // Mid position
|
|
215
|
-
} else {
|
|
216
|
-
score += 5 // Late position
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Consecutive character bonus
|
|
220
|
-
if (consecutiveMatches > 1) {
|
|
221
|
-
score += consecutiveMatches * 5
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
textPos = j + 1
|
|
225
|
-
break
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
if (!charFound) return 0 // Invalid abbreviation
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Critical bonuses
|
|
233
|
-
if (perfectStart) score += 30
|
|
234
|
-
if (wordBoundaryMatches >= 2) score += 25 // Multiple word boundaries
|
|
235
|
-
if (textPos <= textClean.length * 0.8) score += 15 // Compact abbreviation
|
|
236
|
-
|
|
237
|
-
// Special bonus for number matching at end
|
|
238
|
-
const lastPatternChar = pattern[pattern.length - 1]
|
|
239
|
-
const lastTextChar = text[text.length - 1]
|
|
240
|
-
if (/\d/.test(lastPatternChar) && lastPatternChar === lastTextChar) {
|
|
241
|
-
score += 25
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return score
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Algorithm 4: Edit Distance (typo tolerance)
|
|
249
|
-
* Handles cases like "noda" → "node"
|
|
250
|
-
*/
|
|
251
|
-
private editDistanceScore(text: string, pattern: string): number {
|
|
252
|
-
if (pattern.length > text.length + this.config.maxEditDistance) return 0
|
|
253
|
-
|
|
254
|
-
// Simplified Levenshtein distance
|
|
255
|
-
const dp: number[][] = []
|
|
256
|
-
const m = pattern.length
|
|
257
|
-
const n = text.length
|
|
258
|
-
|
|
259
|
-
// Initialize DP table
|
|
260
|
-
for (let i = 0; i <= m; i++) {
|
|
261
|
-
dp[i] = []
|
|
262
|
-
for (let j = 0; j <= n; j++) {
|
|
263
|
-
if (i === 0) dp[i][j] = j
|
|
264
|
-
else if (j === 0) dp[i][j] = i
|
|
265
|
-
else {
|
|
266
|
-
const cost = pattern[i-1] === text[j-1] ? 0 : 1
|
|
267
|
-
dp[i][j] = Math.min(
|
|
268
|
-
dp[i-1][j] + 1, // deletion
|
|
269
|
-
dp[i][j-1] + 1, // insertion
|
|
270
|
-
dp[i-1][j-1] + cost // substitution
|
|
271
|
-
)
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const distance = dp[m][n]
|
|
277
|
-
if (distance > this.config.maxEditDistance) return 0
|
|
278
|
-
|
|
279
|
-
return Math.max(0, 30 - distance * 10)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Algorithm 5: Command Popularity (like frequency in input method)
|
|
284
|
-
* Boost common commands that users frequently type
|
|
285
|
-
*/
|
|
286
|
-
private popularityScore(text: string): number {
|
|
287
|
-
if (this.config.popularCommands.includes(text)) {
|
|
288
|
-
return 40
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Short commands are often more commonly used
|
|
292
|
-
if (text.length <= 5) return 10
|
|
293
|
-
|
|
294
|
-
return 0
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
/**
|
|
298
|
-
* Batch match multiple candidates and return sorted results
|
|
299
|
-
*/
|
|
300
|
-
matchMany(candidates: string[], query: string): Array<{candidate: string, result: MatchResult}> {
|
|
301
|
-
return candidates
|
|
302
|
-
.map(candidate => ({
|
|
303
|
-
candidate,
|
|
304
|
-
result: this.match(candidate, query)
|
|
305
|
-
}))
|
|
306
|
-
.filter(item => item.result.score >= this.config.minScore)
|
|
307
|
-
.sort((a, b) => b.result.score - a.result.score)
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Export convenience functions
|
|
312
|
-
export const defaultMatcher = new FuzzyMatcher()
|
|
313
|
-
|
|
314
|
-
export function matchCommand(command: string, query: string): MatchResult {
|
|
315
|
-
return defaultMatcher.match(command, query)
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Import the advanced matcher
|
|
319
|
-
import { matchManyAdvanced } from './advancedFuzzyMatcher'
|
|
320
|
-
|
|
321
|
-
export function matchCommands(commands: string[], query: string): Array<{command: string, score: number}> {
|
|
322
|
-
// Use the advanced matcher for better results
|
|
323
|
-
return matchManyAdvanced(commands, query, 5) // Lower threshold for better matching
|
|
324
|
-
.map(item => ({
|
|
325
|
-
command: item.candidate,
|
|
326
|
-
score: item.score
|
|
327
|
-
}))
|
|
328
|
-
}
|
package/src/utils/generators.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
const NO_VALUE = Symbol('NO_VALUE')
|
|
2
|
-
|
|
3
|
-
export async function lastX<A>(as: AsyncGenerator<A>): Promise<A> {
|
|
4
|
-
let lastValue: A | typeof NO_VALUE = NO_VALUE
|
|
5
|
-
for await (const a of as) {
|
|
6
|
-
lastValue = a
|
|
7
|
-
}
|
|
8
|
-
if (lastValue === NO_VALUE) {
|
|
9
|
-
throw new Error('No items in generator')
|
|
10
|
-
}
|
|
11
|
-
return lastValue
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
type QueuedGenerator<A> = {
|
|
15
|
-
done: boolean | void
|
|
16
|
-
value: A | void
|
|
17
|
-
generator: AsyncGenerator<A, void>
|
|
18
|
-
promise: Promise<QueuedGenerator<A>>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Run all generators concurrently up to a concurrency cap, yielding values as they come in
|
|
22
|
-
export async function* all<A>(
|
|
23
|
-
generators: AsyncGenerator<A, void>[],
|
|
24
|
-
concurrencyCap = Infinity,
|
|
25
|
-
): AsyncGenerator<A, void> {
|
|
26
|
-
const next = (generator: AsyncGenerator<A, void>) => {
|
|
27
|
-
const promise: Promise<QueuedGenerator<A>> = generator
|
|
28
|
-
.next()
|
|
29
|
-
.then(({ done, value }) => ({
|
|
30
|
-
done,
|
|
31
|
-
value,
|
|
32
|
-
generator,
|
|
33
|
-
promise,
|
|
34
|
-
}))
|
|
35
|
-
return promise
|
|
36
|
-
}
|
|
37
|
-
const waiting = [...generators]
|
|
38
|
-
const promises = new Set<Promise<QueuedGenerator<A>>>()
|
|
39
|
-
|
|
40
|
-
// Start initial batch up to concurrency cap
|
|
41
|
-
while (promises.size < concurrencyCap && waiting.length > 0) {
|
|
42
|
-
const gen = waiting.shift()!
|
|
43
|
-
promises.add(next(gen))
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
while (promises.size > 0) {
|
|
47
|
-
const { done, value, generator, promise } = await Promise.race(promises)
|
|
48
|
-
promises.delete(promise)
|
|
49
|
-
|
|
50
|
-
if (!done) {
|
|
51
|
-
promises.add(next(generator))
|
|
52
|
-
// TODO: Clean this up
|
|
53
|
-
if (value !== undefined) {
|
|
54
|
-
yield value as A
|
|
55
|
-
}
|
|
56
|
-
} else if (waiting.length > 0) {
|
|
57
|
-
// Start a new generator when one finishes
|
|
58
|
-
const nextGen = waiting.shift()!
|
|
59
|
-
promises.add(next(nextGen))
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
package/src/utils/git.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { memoize } from 'lodash-es'
|
|
2
|
-
import { execFileNoThrow } from './execFileNoThrow'
|
|
3
|
-
|
|
4
|
-
export const getIsGit = memoize(async (): Promise<boolean> => {
|
|
5
|
-
const { code } = await execFileNoThrow('git', [
|
|
6
|
-
'rev-parse',
|
|
7
|
-
'--is-inside-work-tree',
|
|
8
|
-
])
|
|
9
|
-
return code === 0
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
export const getHead = async (): Promise<string> => {
|
|
13
|
-
const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])
|
|
14
|
-
return stdout.trim()
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export const getBranch = async (): Promise<string> => {
|
|
18
|
-
const { stdout } = await execFileNoThrow(
|
|
19
|
-
'git',
|
|
20
|
-
['rev-parse', '--abbrev-ref', 'HEAD'],
|
|
21
|
-
undefined,
|
|
22
|
-
undefined,
|
|
23
|
-
false,
|
|
24
|
-
)
|
|
25
|
-
return stdout.trim()
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export const getRemoteUrl = async (): Promise<string | null> => {
|
|
29
|
-
// This might fail if there is no remote called origin
|
|
30
|
-
const { stdout, code } = await execFileNoThrow(
|
|
31
|
-
'git',
|
|
32
|
-
['remote', 'get-url', 'origin'],
|
|
33
|
-
undefined,
|
|
34
|
-
undefined,
|
|
35
|
-
false,
|
|
36
|
-
)
|
|
37
|
-
return code === 0 ? stdout.trim() : null
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export const getIsHeadOnRemote = async (): Promise<boolean> => {
|
|
41
|
-
const { code } = await execFileNoThrow(
|
|
42
|
-
'git',
|
|
43
|
-
['rev-parse', '@{u}'],
|
|
44
|
-
undefined,
|
|
45
|
-
undefined,
|
|
46
|
-
false,
|
|
47
|
-
)
|
|
48
|
-
return code === 0
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export const getIsClean = async (): Promise<boolean> => {
|
|
52
|
-
const { stdout } = await execFileNoThrow(
|
|
53
|
-
'git',
|
|
54
|
-
['status', '--porcelain'],
|
|
55
|
-
undefined,
|
|
56
|
-
undefined,
|
|
57
|
-
false,
|
|
58
|
-
)
|
|
59
|
-
return stdout.trim().length === 0
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface GitRepoState {
|
|
63
|
-
commitHash: string
|
|
64
|
-
branchName: string
|
|
65
|
-
remoteUrl: string | null
|
|
66
|
-
isHeadOnRemote: boolean
|
|
67
|
-
isClean: boolean
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export async function getGitState(): Promise<GitRepoState | null> {
|
|
71
|
-
try {
|
|
72
|
-
const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =
|
|
73
|
-
await Promise.all([
|
|
74
|
-
getHead(),
|
|
75
|
-
getBranch(),
|
|
76
|
-
getRemoteUrl(),
|
|
77
|
-
getIsHeadOnRemote(),
|
|
78
|
-
getIsClean(),
|
|
79
|
-
])
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
commitHash,
|
|
83
|
-
branchName,
|
|
84
|
-
remoteUrl,
|
|
85
|
-
isHeadOnRemote,
|
|
86
|
-
isClean,
|
|
87
|
-
}
|
|
88
|
-
} catch (_) {
|
|
89
|
-
// Fail silently - git state is best effort
|
|
90
|
-
return null
|
|
91
|
-
}
|
|
92
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 统一的全局日志系统
|
|
3
|
-
* 普通模式:完全静默,零日志输出
|
|
4
|
-
* 调试模式:详细日志输出
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// 环境检测 - 只在明确的调试标志下才启用日志
|
|
8
|
-
const isDebugMode = () =>
|
|
9
|
-
process.argv.includes('--debug') ||
|
|
10
|
-
process.argv.includes('--verbose') ||
|
|
11
|
-
process.env.NODE_ENV === 'development'
|
|
12
|
-
|
|
13
|
-
// 全局日志开关 - 普通模式下完全关闭
|
|
14
|
-
const LOGGING_ENABLED = isDebugMode()
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* 统一的日志接口
|
|
18
|
-
* 普通模式下所有调用都是空操作
|
|
19
|
-
*/
|
|
20
|
-
export const globalLogger = {
|
|
21
|
-
// 标准日志级别
|
|
22
|
-
debug: (...args: any[]) => {
|
|
23
|
-
if (LOGGING_ENABLED) console.debug(...args)
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
info: (...args: any[]) => {
|
|
27
|
-
if (LOGGING_ENABLED) console.info(...args)
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
warn: (...args: any[]) => {
|
|
31
|
-
if (LOGGING_ENABLED) console.warn(...args)
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
error: (...args: any[]) => {
|
|
35
|
-
if (LOGGING_ENABLED) console.error(...args)
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
log: (...args: any[]) => {
|
|
39
|
-
if (LOGGING_ENABLED) console.log(...args)
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
// 兼容现有的console.log调用
|
|
43
|
-
console: (...args: any[]) => {
|
|
44
|
-
if (LOGGING_ENABLED) console.log(...args)
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
// 模型切换相关日志
|
|
48
|
-
modelSwitch: (message: string, data?: any) => {
|
|
49
|
-
if (LOGGING_ENABLED) {
|
|
50
|
-
console.log(`🔄 Model Switch: ${message}`, data ? data : '')
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
// API 相关日志
|
|
55
|
-
api: (message: string, data?: any) => {
|
|
56
|
-
if (LOGGING_ENABLED) {
|
|
57
|
-
console.log(`🌐 API: ${message}`, data ? data : '')
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
|
|
61
|
-
// 用户友好的状态日志 - 只在调试模式下显示
|
|
62
|
-
status: (message: string) => {
|
|
63
|
-
if (LOGGING_ENABLED) {
|
|
64
|
-
console.log(`ℹ️ ${message}`)
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
// 检查日志是否启用
|
|
69
|
-
isEnabled: () => LOGGING_ENABLED
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// 兼容性:导出为默认console替代
|
|
73
|
-
export const logger = globalLogger
|
|
74
|
-
|
|
75
|
-
// 用于替换现有的console.log调用
|
|
76
|
-
export const debugLog = globalLogger.console
|
|
77
|
-
export const statusLog = globalLogger.status
|
package/src/utils/http.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP utility constants and helpers
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { MACRO } from '../constants/macros'
|
|
6
|
-
import { PRODUCT_COMMAND } from '../constants/product'
|
|
7
|
-
|
|
8
|
-
// WARNING: We rely on `claude-cli` in the user agent for log filtering.
|
|
9
|
-
// Please do NOT change this without making sure that logging also gets updated!
|
|
10
|
-
export const USER_AGENT = `${PRODUCT_COMMAND}/${MACRO.VERSION} (${process.env.USER_TYPE})`
|
package/src/utils/imagePaste.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'child_process'
|
|
2
|
-
import { readFileSync } from 'fs'
|
|
3
|
-
|
|
4
|
-
const SCREENSHOT_PATH = '/tmp/claude_cli_latest_screenshot.png'
|
|
5
|
-
|
|
6
|
-
export const CLIPBOARD_ERROR_MESSAGE =
|
|
7
|
-
'No image found in clipboard. Use Cmd + Ctrl + Shift + 4 to copy a screenshot to clipboard.'
|
|
8
|
-
|
|
9
|
-
export function getImageFromClipboard(): string | null {
|
|
10
|
-
if (process.platform !== 'darwin') {
|
|
11
|
-
// only support image paste on macOS for now
|
|
12
|
-
return null
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
// Check if clipboard has image
|
|
17
|
-
execSync(`osascript -e 'the clipboard as «class PNGf»'`, {
|
|
18
|
-
stdio: 'ignore',
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
// Save the image
|
|
22
|
-
execSync(
|
|
23
|
-
`osascript -e 'set png_data to (the clipboard as «class PNGf»)' -e 'set fp to open for access POSIX file "${SCREENSHOT_PATH}" with write permission' -e 'write png_data to fp' -e 'close access fp'`,
|
|
24
|
-
{ stdio: 'ignore' },
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
// Read the image and convert to base64
|
|
28
|
-
const imageBuffer = readFileSync(SCREENSHOT_PATH)
|
|
29
|
-
const base64Image = imageBuffer.toString('base64')
|
|
30
|
-
|
|
31
|
-
// Cleanup
|
|
32
|
-
execSync(`rm -f "${SCREENSHOT_PATH}"`, { stdio: 'ignore' })
|
|
33
|
-
|
|
34
|
-
return base64Image
|
|
35
|
-
} catch {
|
|
36
|
-
return null
|
|
37
|
-
}
|
|
38
|
-
}
|
package/src/utils/json.ts
DELETED