@shareai-lab/kode 1.1.13 → 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.
Files changed (288) hide show
  1. package/dist/entrypoints/cli.js +59 -38
  2. package/dist/entrypoints/cli.js.map +3 -3
  3. package/dist/index.js +5 -26
  4. package/dist/package.json +4 -1
  5. package/package.json +11 -104
  6. package/dist/test/testAdapters.js +0 -88
  7. package/dist/test/testAdapters.js.map +0 -1
  8. package/src/ProjectOnboarding.tsx +0 -198
  9. package/src/Tool.ts +0 -83
  10. package/src/commands/agents.tsx +0 -3416
  11. package/src/commands/approvedTools.ts +0 -53
  12. package/src/commands/bug.tsx +0 -20
  13. package/src/commands/clear.ts +0 -43
  14. package/src/commands/compact.ts +0 -120
  15. package/src/commands/config.tsx +0 -19
  16. package/src/commands/cost.ts +0 -18
  17. package/src/commands/ctx_viz.ts +0 -209
  18. package/src/commands/doctor.ts +0 -24
  19. package/src/commands/help.tsx +0 -19
  20. package/src/commands/init.ts +0 -37
  21. package/src/commands/listen.ts +0 -42
  22. package/src/commands/login.tsx +0 -51
  23. package/src/commands/logout.tsx +0 -40
  24. package/src/commands/mcp.ts +0 -41
  25. package/src/commands/model.tsx +0 -40
  26. package/src/commands/modelstatus.tsx +0 -20
  27. package/src/commands/onboarding.tsx +0 -34
  28. package/src/commands/pr_comments.ts +0 -59
  29. package/src/commands/refreshCommands.ts +0 -54
  30. package/src/commands/release-notes.ts +0 -34
  31. package/src/commands/resume.tsx +0 -31
  32. package/src/commands/review.ts +0 -49
  33. package/src/commands/terminalSetup.ts +0 -221
  34. package/src/commands.ts +0 -139
  35. package/src/components/ApproveApiKey.tsx +0 -93
  36. package/src/components/AsciiLogo.tsx +0 -13
  37. package/src/components/AutoUpdater.tsx +0 -148
  38. package/src/components/Bug.tsx +0 -367
  39. package/src/components/Config.tsx +0 -293
  40. package/src/components/ConsoleOAuthFlow.tsx +0 -327
  41. package/src/components/Cost.tsx +0 -23
  42. package/src/components/CostThresholdDialog.tsx +0 -46
  43. package/src/components/CustomSelect/option-map.ts +0 -42
  44. package/src/components/CustomSelect/select-option.tsx +0 -78
  45. package/src/components/CustomSelect/select.tsx +0 -152
  46. package/src/components/CustomSelect/theme.ts +0 -45
  47. package/src/components/CustomSelect/use-select-state.ts +0 -414
  48. package/src/components/CustomSelect/use-select.ts +0 -35
  49. package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
  50. package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
  51. package/src/components/Help.tsx +0 -215
  52. package/src/components/HighlightedCode.tsx +0 -33
  53. package/src/components/InvalidConfigDialog.tsx +0 -113
  54. package/src/components/Link.tsx +0 -32
  55. package/src/components/LogSelector.tsx +0 -86
  56. package/src/components/Logo.tsx +0 -170
  57. package/src/components/MCPServerApprovalDialog.tsx +0 -100
  58. package/src/components/MCPServerDialogCopy.tsx +0 -25
  59. package/src/components/MCPServerMultiselectDialog.tsx +0 -109
  60. package/src/components/Message.tsx +0 -221
  61. package/src/components/MessageResponse.tsx +0 -15
  62. package/src/components/MessageSelector.tsx +0 -211
  63. package/src/components/ModeIndicator.tsx +0 -88
  64. package/src/components/ModelConfig.tsx +0 -301
  65. package/src/components/ModelListManager.tsx +0 -227
  66. package/src/components/ModelSelector.tsx +0 -3387
  67. package/src/components/ModelStatusDisplay.tsx +0 -230
  68. package/src/components/Onboarding.tsx +0 -274
  69. package/src/components/PressEnterToContinue.tsx +0 -11
  70. package/src/components/PromptInput.tsx +0 -760
  71. package/src/components/SentryErrorBoundary.ts +0 -39
  72. package/src/components/Spinner.tsx +0 -129
  73. package/src/components/StickerRequestForm.tsx +0 -16
  74. package/src/components/StructuredDiff.tsx +0 -191
  75. package/src/components/TextInput.tsx +0 -259
  76. package/src/components/TodoItem.tsx +0 -47
  77. package/src/components/TokenWarning.tsx +0 -31
  78. package/src/components/ToolUseLoader.tsx +0 -40
  79. package/src/components/TrustDialog.tsx +0 -106
  80. package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
  81. package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
  82. package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
  83. package/src/components/binary-feedback/utils.ts +0 -220
  84. package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
  85. package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
  86. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
  87. package/src/components/messages/AssistantTextMessage.tsx +0 -144
  88. package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
  89. package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
  90. package/src/components/messages/TaskProgressMessage.tsx +0 -32
  91. package/src/components/messages/TaskToolMessage.tsx +0 -58
  92. package/src/components/messages/UserBashInputMessage.tsx +0 -28
  93. package/src/components/messages/UserCommandMessage.tsx +0 -30
  94. package/src/components/messages/UserKodingInputMessage.tsx +0 -28
  95. package/src/components/messages/UserPromptMessage.tsx +0 -35
  96. package/src/components/messages/UserTextMessage.tsx +0 -39
  97. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
  98. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
  99. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
  100. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
  101. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
  102. package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
  103. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
  104. package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
  105. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
  106. package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
  107. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
  108. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
  109. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
  110. package/src/components/permissions/PermissionRequest.tsx +0 -101
  111. package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
  112. package/src/components/permissions/hooks.ts +0 -44
  113. package/src/components/permissions/toolUseOptions.ts +0 -59
  114. package/src/components/permissions/utils.ts +0 -23
  115. package/src/constants/betas.ts +0 -5
  116. package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
  117. package/src/constants/figures.ts +0 -4
  118. package/src/constants/keys.ts +0 -3
  119. package/src/constants/macros.ts +0 -11
  120. package/src/constants/modelCapabilities.ts +0 -179
  121. package/src/constants/models.ts +0 -1025
  122. package/src/constants/oauth.ts +0 -18
  123. package/src/constants/product.ts +0 -17
  124. package/src/constants/prompts.ts +0 -168
  125. package/src/constants/releaseNotes.ts +0 -7
  126. package/src/context/PermissionContext.tsx +0 -149
  127. package/src/context.ts +0 -278
  128. package/src/cost-tracker.ts +0 -84
  129. package/src/entrypoints/cli.tsx +0 -1561
  130. package/src/entrypoints/mcp.ts +0 -175
  131. package/src/history.ts +0 -25
  132. package/src/hooks/useApiKeyVerification.ts +0 -59
  133. package/src/hooks/useArrowKeyHistory.ts +0 -55
  134. package/src/hooks/useCanUseTool.ts +0 -138
  135. package/src/hooks/useCancelRequest.ts +0 -39
  136. package/src/hooks/useDoublePress.ts +0 -41
  137. package/src/hooks/useExitOnCtrlCD.ts +0 -31
  138. package/src/hooks/useInterval.ts +0 -25
  139. package/src/hooks/useLogMessages.ts +0 -16
  140. package/src/hooks/useLogStartupTime.ts +0 -12
  141. package/src/hooks/useNotifyAfterTimeout.ts +0 -65
  142. package/src/hooks/usePermissionRequestLogging.ts +0 -44
  143. package/src/hooks/useTerminalSize.ts +0 -49
  144. package/src/hooks/useTextInput.ts +0 -317
  145. package/src/hooks/useUnifiedCompletion.ts +0 -1405
  146. package/src/index.ts +0 -34
  147. package/src/messages.ts +0 -38
  148. package/src/permissions.ts +0 -268
  149. package/src/query.ts +0 -720
  150. package/src/screens/ConfigureNpmPrefix.tsx +0 -197
  151. package/src/screens/Doctor.tsx +0 -219
  152. package/src/screens/LogList.tsx +0 -68
  153. package/src/screens/REPL.tsx +0 -813
  154. package/src/screens/ResumeConversation.tsx +0 -68
  155. package/src/services/adapters/base.ts +0 -38
  156. package/src/services/adapters/chatCompletions.ts +0 -90
  157. package/src/services/adapters/responsesAPI.ts +0 -170
  158. package/src/services/browserMocks.ts +0 -66
  159. package/src/services/claude.ts +0 -2197
  160. package/src/services/customCommands.ts +0 -704
  161. package/src/services/fileFreshness.ts +0 -377
  162. package/src/services/gpt5ConnectionTest.ts +0 -340
  163. package/src/services/mcpClient.ts +0 -564
  164. package/src/services/mcpServerApproval.tsx +0 -50
  165. package/src/services/mentionProcessor.ts +0 -273
  166. package/src/services/modelAdapterFactory.ts +0 -69
  167. package/src/services/notifier.ts +0 -40
  168. package/src/services/oauth.ts +0 -357
  169. package/src/services/openai.ts +0 -1359
  170. package/src/services/responseStateManager.ts +0 -90
  171. package/src/services/sentry.ts +0 -3
  172. package/src/services/statsig.ts +0 -172
  173. package/src/services/statsigStorage.ts +0 -86
  174. package/src/services/systemReminder.ts +0 -507
  175. package/src/services/vcr.ts +0 -161
  176. package/src/test/testAdapters.ts +0 -96
  177. package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
  178. package/src/tools/ArchitectTool/prompt.ts +0 -15
  179. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
  180. package/src/tools/BashTool/BashTool.tsx +0 -243
  181. package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
  182. package/src/tools/BashTool/OutputLine.tsx +0 -49
  183. package/src/tools/BashTool/prompt.ts +0 -174
  184. package/src/tools/BashTool/utils.ts +0 -56
  185. package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
  186. package/src/tools/FileEditTool/prompt.ts +0 -51
  187. package/src/tools/FileEditTool/utils.ts +0 -58
  188. package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
  189. package/src/tools/FileReadTool/prompt.ts +0 -7
  190. package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
  191. package/src/tools/FileWriteTool/prompt.ts +0 -10
  192. package/src/tools/GlobTool/GlobTool.tsx +0 -119
  193. package/src/tools/GlobTool/prompt.ts +0 -8
  194. package/src/tools/GrepTool/GrepTool.tsx +0 -147
  195. package/src/tools/GrepTool/prompt.ts +0 -11
  196. package/src/tools/MCPTool/MCPTool.tsx +0 -107
  197. package/src/tools/MCPTool/prompt.ts +0 -3
  198. package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
  199. package/src/tools/MemoryReadTool/prompt.ts +0 -3
  200. package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
  201. package/src/tools/MemoryWriteTool/prompt.ts +0 -3
  202. package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
  203. package/src/tools/MultiEditTool/prompt.ts +0 -45
  204. package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
  205. package/src/tools/NotebookEditTool/prompt.ts +0 -3
  206. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
  207. package/src/tools/NotebookReadTool/prompt.ts +0 -3
  208. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
  209. package/src/tools/StickerRequestTool/prompt.ts +0 -19
  210. package/src/tools/TaskTool/TaskTool.tsx +0 -438
  211. package/src/tools/TaskTool/constants.ts +0 -1
  212. package/src/tools/TaskTool/prompt.ts +0 -92
  213. package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
  214. package/src/tools/ThinkTool/prompt.ts +0 -12
  215. package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
  216. package/src/tools/TodoWriteTool/prompt.ts +0 -63
  217. package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
  218. package/src/tools/URLFetcherTool/cache.ts +0 -55
  219. package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
  220. package/src/tools/URLFetcherTool/prompt.ts +0 -17
  221. package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
  222. package/src/tools/WebSearchTool/prompt.ts +0 -13
  223. package/src/tools/WebSearchTool/searchProviders.ts +0 -66
  224. package/src/tools/lsTool/lsTool.tsx +0 -272
  225. package/src/tools/lsTool/prompt.ts +0 -2
  226. package/src/tools.ts +0 -67
  227. package/src/types/PermissionMode.ts +0 -120
  228. package/src/types/RequestContext.ts +0 -72
  229. package/src/types/common.d.ts +0 -2
  230. package/src/types/conversation.ts +0 -51
  231. package/src/types/logs.ts +0 -58
  232. package/src/types/modelCapabilities.ts +0 -64
  233. package/src/types/notebook.ts +0 -87
  234. package/src/utils/Cursor.ts +0 -436
  235. package/src/utils/PersistentShell.ts +0 -552
  236. package/src/utils/advancedFuzzyMatcher.ts +0 -290
  237. package/src/utils/agentLoader.ts +0 -278
  238. package/src/utils/agentStorage.ts +0 -97
  239. package/src/utils/array.ts +0 -3
  240. package/src/utils/ask.tsx +0 -99
  241. package/src/utils/auth.ts +0 -13
  242. package/src/utils/autoCompactCore.ts +0 -223
  243. package/src/utils/autoUpdater.ts +0 -458
  244. package/src/utils/betas.ts +0 -20
  245. package/src/utils/browser.ts +0 -14
  246. package/src/utils/cleanup.ts +0 -72
  247. package/src/utils/commands.ts +0 -261
  248. package/src/utils/commonUnixCommands.ts +0 -161
  249. package/src/utils/config.ts +0 -945
  250. package/src/utils/conversationRecovery.ts +0 -55
  251. package/src/utils/debugLogger.ts +0 -1235
  252. package/src/utils/diff.ts +0 -42
  253. package/src/utils/env.ts +0 -57
  254. package/src/utils/errors.ts +0 -21
  255. package/src/utils/exampleCommands.ts +0 -109
  256. package/src/utils/execFileNoThrow.ts +0 -51
  257. package/src/utils/expertChatStorage.ts +0 -136
  258. package/src/utils/file.ts +0 -405
  259. package/src/utils/fileRecoveryCore.ts +0 -71
  260. package/src/utils/format.tsx +0 -44
  261. package/src/utils/fuzzyMatcher.ts +0 -328
  262. package/src/utils/generators.ts +0 -62
  263. package/src/utils/git.ts +0 -92
  264. package/src/utils/globalLogger.ts +0 -77
  265. package/src/utils/http.ts +0 -10
  266. package/src/utils/imagePaste.ts +0 -38
  267. package/src/utils/json.ts +0 -13
  268. package/src/utils/log.ts +0 -382
  269. package/src/utils/markdown.ts +0 -213
  270. package/src/utils/messageContextManager.ts +0 -294
  271. package/src/utils/messages.tsx +0 -945
  272. package/src/utils/model.ts +0 -914
  273. package/src/utils/permissions/filesystem.ts +0 -127
  274. package/src/utils/responseState.ts +0 -23
  275. package/src/utils/ripgrep.ts +0 -167
  276. package/src/utils/secureFile.ts +0 -564
  277. package/src/utils/sessionState.ts +0 -49
  278. package/src/utils/state.ts +0 -25
  279. package/src/utils/style.ts +0 -29
  280. package/src/utils/terminal.ts +0 -50
  281. package/src/utils/theme.ts +0 -127
  282. package/src/utils/thinking.ts +0 -144
  283. package/src/utils/todoStorage.ts +0 -431
  284. package/src/utils/tokens.ts +0 -43
  285. package/src/utils/toolExecutionController.ts +0 -163
  286. package/src/utils/unaryLogging.ts +0 -26
  287. package/src/utils/user.ts +0 -37
  288. 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
- }
@@ -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})`
@@ -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
@@ -1,13 +0,0 @@
1
- import { logError } from './log'
2
-
3
- export function safeParseJSON(json: string | null | undefined): unknown {
4
- if (!json) {
5
- return null
6
- }
7
- try {
8
- return JSON.parse(json)
9
- } catch (e) {
10
- logError(e)
11
- return null
12
- }
13
- }