@shareai-lab/kode 1.1.14 → 1.1.16-dev.2

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