@shareai-lab/kode 1.1.12 → 1.1.13

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 (593) hide show
  1. package/cli.js +44 -23
  2. package/dist/ProjectOnboarding.js +99 -0
  3. package/dist/ProjectOnboarding.js.map +7 -0
  4. package/dist/Tool.js +1 -0
  5. package/dist/Tool.js.map +7 -0
  6. package/dist/commands/agents.js +2087 -0
  7. package/dist/commands/agents.js.map +7 -0
  8. package/dist/commands/approvedTools.js +36 -0
  9. package/dist/commands/approvedTools.js.map +7 -0
  10. package/dist/commands/bug.js +21 -0
  11. package/dist/commands/bug.js.map +7 -0
  12. package/dist/commands/clear.js +37 -0
  13. package/dist/commands/clear.js.map +7 -0
  14. package/dist/commands/compact.js +104 -0
  15. package/dist/commands/compact.js.map +7 -0
  16. package/dist/commands/config.js +20 -0
  17. package/dist/commands/config.js.map +7 -0
  18. package/dist/commands/cost.js +19 -0
  19. package/dist/commands/cost.js.map +7 -0
  20. package/dist/commands/ctx_viz.js +152 -0
  21. package/dist/commands/ctx_viz.js.map +7 -0
  22. package/dist/commands/doctor.js +25 -0
  23. package/dist/commands/doctor.js.map +7 -0
  24. package/dist/commands/help.js +20 -0
  25. package/dist/commands/help.js.map +7 -0
  26. package/dist/commands/init.js +38 -0
  27. package/dist/commands/init.js.map +7 -0
  28. package/dist/commands/listen.js +37 -0
  29. package/dist/commands/listen.js.map +7 -0
  30. package/dist/commands/login.js +37 -0
  31. package/dist/commands/login.js.map +7 -0
  32. package/dist/commands/logout.js +33 -0
  33. package/dist/commands/logout.js.map +7 -0
  34. package/dist/commands/mcp.js +34 -0
  35. package/dist/commands/mcp.js.map +7 -0
  36. package/dist/commands/model.js +41 -0
  37. package/dist/commands/model.js.map +7 -0
  38. package/dist/commands/modelstatus.js +21 -0
  39. package/dist/commands/modelstatus.js.map +7 -0
  40. package/dist/commands/onboarding.js +36 -0
  41. package/dist/commands/onboarding.js.map +7 -0
  42. package/dist/commands/pr_comments.js +61 -0
  43. package/dist/commands/pr_comments.js.map +7 -0
  44. package/dist/commands/refreshCommands.js +37 -0
  45. package/dist/commands/refreshCommands.js.map +7 -0
  46. package/dist/commands/release-notes.js +30 -0
  47. package/dist/commands/release-notes.js.map +7 -0
  48. package/dist/commands/resume.js +35 -0
  49. package/dist/commands/resume.js.map +7 -0
  50. package/dist/commands/review.js +51 -0
  51. package/dist/commands/review.js.map +7 -0
  52. package/dist/commands/terminalSetup.js +163 -0
  53. package/dist/commands/terminalSetup.js.map +7 -0
  54. package/dist/commands.js +84 -0
  55. package/dist/commands.js.map +7 -0
  56. package/dist/components/ApproveApiKey.js +74 -0
  57. package/dist/components/ApproveApiKey.js.map +7 -0
  58. package/dist/components/AsciiLogo.js +12 -0
  59. package/dist/components/AsciiLogo.js.map +7 -0
  60. package/dist/components/AutoUpdater.js +74 -0
  61. package/dist/components/AutoUpdater.js.map +7 -0
  62. package/dist/components/Bug.js +147 -0
  63. package/dist/components/Bug.js.map +7 -0
  64. package/dist/components/Config.js +166 -0
  65. package/dist/components/Config.js.map +7 -0
  66. package/dist/components/ConsoleOAuthFlow.js +188 -0
  67. package/dist/components/ConsoleOAuthFlow.js.map +7 -0
  68. package/dist/components/Cost.js +13 -0
  69. package/dist/components/Cost.js.map +7 -0
  70. package/dist/components/CostThresholdDialog.js +38 -0
  71. package/dist/components/CostThresholdDialog.js.map +7 -0
  72. package/dist/components/CustomSelect/option-map.js +32 -0
  73. package/dist/components/CustomSelect/option-map.js.map +7 -0
  74. package/dist/components/CustomSelect/select-option.js +34 -0
  75. package/dist/components/CustomSelect/select-option.js.map +7 -0
  76. package/dist/components/CustomSelect/select.js +64 -0
  77. package/dist/components/CustomSelect/select.js.map +7 -0
  78. package/dist/components/CustomSelect/theme.js +1 -0
  79. package/dist/components/CustomSelect/theme.js.map +7 -0
  80. package/dist/components/CustomSelect/use-select-state.js +220 -0
  81. package/dist/components/CustomSelect/use-select-state.js.map +7 -0
  82. package/dist/components/CustomSelect/use-select.js +21 -0
  83. package/dist/components/CustomSelect/use-select.js.map +7 -0
  84. package/dist/components/FallbackToolUseRejectedMessage.js +11 -0
  85. package/dist/components/FallbackToolUseRejectedMessage.js.map +7 -0
  86. package/dist/components/FileEditToolUpdatedMessage.js +31 -0
  87. package/dist/components/FileEditToolUpdatedMessage.js.map +7 -0
  88. package/dist/components/Help.js +41 -0
  89. package/dist/components/Help.js.map +7 -0
  90. package/dist/components/HighlightedCode.js +30 -0
  91. package/dist/components/HighlightedCode.js.map +7 -0
  92. package/dist/components/InvalidConfigDialog.js +83 -0
  93. package/dist/components/InvalidConfigDialog.js.map +7 -0
  94. package/dist/components/Link.js +18 -0
  95. package/dist/components/Link.js.map +7 -0
  96. package/dist/components/LogSelector.js +50 -0
  97. package/dist/components/LogSelector.js.map +7 -0
  98. package/dist/components/Logo.js +89 -0
  99. package/dist/components/Logo.js.map +7 -0
  100. package/dist/components/MCPServerApprovalDialog.js +79 -0
  101. package/dist/components/MCPServerApprovalDialog.js.map +7 -0
  102. package/dist/components/MCPServerDialogCopy.js +11 -0
  103. package/dist/components/MCPServerDialogCopy.js.map +7 -0
  104. package/dist/components/MCPServerMultiselectDialog.js +80 -0
  105. package/dist/components/MCPServerMultiselectDialog.js.map +7 -0
  106. package/dist/components/Message.js +146 -0
  107. package/dist/components/Message.js.map +7 -0
  108. package/dist/components/MessageResponse.js +9 -0
  109. package/dist/components/MessageResponse.js.map +7 -0
  110. package/dist/components/MessageSelector.js +133 -0
  111. package/dist/components/MessageSelector.js.map +7 -0
  112. package/dist/components/ModeIndicator.js +38 -0
  113. package/dist/components/ModeIndicator.js.map +7 -0
  114. package/dist/components/ModelConfig.js +208 -0
  115. package/dist/components/ModelConfig.js.map +7 -0
  116. package/dist/components/ModelListManager.js +140 -0
  117. package/dist/components/ModelListManager.js.map +7 -0
  118. package/dist/components/ModelSelector.js +1985 -0
  119. package/dist/components/ModelSelector.js.map +7 -0
  120. package/dist/components/ModelStatusDisplay.js +87 -0
  121. package/dist/components/ModelStatusDisplay.js.map +7 -0
  122. package/dist/components/Onboarding.js +153 -0
  123. package/dist/components/Onboarding.js.map +7 -0
  124. package/dist/components/PressEnterToContinue.js +10 -0
  125. package/dist/components/PressEnterToContinue.js.map +7 -0
  126. package/dist/components/PromptInput.js +501 -0
  127. package/dist/components/PromptInput.js.map +7 -0
  128. package/dist/components/SentryErrorBoundary.js +27 -0
  129. package/dist/components/SentryErrorBoundary.js.map +7 -0
  130. package/dist/components/Spinner.js +101 -0
  131. package/dist/components/Spinner.js.map +7 -0
  132. package/dist/components/StickerRequestForm.js +7 -0
  133. package/dist/components/StickerRequestForm.js.map +7 -0
  134. package/dist/components/StructuredDiff.js +148 -0
  135. package/dist/components/StructuredDiff.js.map +7 -0
  136. package/dist/components/TextInput.js +100 -0
  137. package/dist/components/TextInput.js.map +7 -0
  138. package/dist/components/TodoItem.js +35 -0
  139. package/dist/components/TodoItem.js.map +7 -0
  140. package/dist/components/TokenWarning.js +19 -0
  141. package/dist/components/TokenWarning.js.map +7 -0
  142. package/dist/components/ToolUseLoader.js +24 -0
  143. package/dist/components/ToolUseLoader.js.map +7 -0
  144. package/dist/components/TrustDialog.js +76 -0
  145. package/dist/components/TrustDialog.js.map +7 -0
  146. package/dist/components/binary-feedback/BinaryFeedback.js +50 -0
  147. package/dist/components/binary-feedback/BinaryFeedback.js.map +7 -0
  148. package/dist/components/binary-feedback/BinaryFeedbackOption.js +94 -0
  149. package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +7 -0
  150. package/dist/components/binary-feedback/BinaryFeedbackView.js +139 -0
  151. package/dist/components/binary-feedback/BinaryFeedbackView.js.map +7 -0
  152. package/dist/components/binary-feedback/utils.js +161 -0
  153. package/dist/components/binary-feedback/utils.js.map +7 -0
  154. package/dist/components/messages/AssistantBashOutputMessage.js +23 -0
  155. package/dist/components/messages/AssistantBashOutputMessage.js.map +7 -0
  156. package/dist/components/messages/AssistantLocalCommandOutputMessage.js +36 -0
  157. package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +7 -0
  158. package/dist/components/messages/AssistantRedactedThinkingMessage.js +12 -0
  159. package/dist/components/messages/AssistantRedactedThinkingMessage.js.map +7 -0
  160. package/dist/components/messages/AssistantTextMessage.js +78 -0
  161. package/dist/components/messages/AssistantTextMessage.js.map +7 -0
  162. package/dist/components/messages/AssistantThinkingMessage.js +27 -0
  163. package/dist/components/messages/AssistantThinkingMessage.js.map +7 -0
  164. package/dist/components/messages/AssistantToolUseMessage.js +91 -0
  165. package/dist/components/messages/AssistantToolUseMessage.js.map +7 -0
  166. package/dist/components/messages/TaskProgressMessage.js +11 -0
  167. package/dist/components/messages/TaskProgressMessage.js.map +7 -0
  168. package/dist/components/messages/TaskToolMessage.js +39 -0
  169. package/dist/components/messages/TaskToolMessage.js.map +7 -0
  170. package/dist/components/messages/UserBashInputMessage.js +18 -0
  171. package/dist/components/messages/UserBashInputMessage.js.map +7 -0
  172. package/dist/components/messages/UserCommandMessage.js +20 -0
  173. package/dist/components/messages/UserCommandMessage.js.map +7 -0
  174. package/dist/components/messages/UserKodingInputMessage.js +18 -0
  175. package/dist/components/messages/UserKodingInputMessage.js.map +7 -0
  176. package/dist/components/messages/UserPromptMessage.js +20 -0
  177. package/dist/components/messages/UserPromptMessage.js.map +7 -0
  178. package/dist/components/messages/UserTextMessage.js +25 -0
  179. package/dist/components/messages/UserTextMessage.js.map +7 -0
  180. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js +10 -0
  181. package/dist/components/messages/UserToolResultMessage/UserToolCanceledMessage.js.map +7 -0
  182. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js +15 -0
  183. package/dist/components/messages/UserToolResultMessage/UserToolErrorMessage.js.map +7 -0
  184. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +25 -0
  185. package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +7 -0
  186. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +47 -0
  187. package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +7 -0
  188. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +23 -0
  189. package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +7 -0
  190. package/dist/components/messages/UserToolResultMessage/utils.js +42 -0
  191. package/dist/components/messages/UserToolResultMessage/utils.js.map +7 -0
  192. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js +112 -0
  193. package/dist/components/permissions/BashPermissionRequest/BashPermissionRequest.js.map +7 -0
  194. package/dist/components/permissions/FallbackPermissionRequest.js +131 -0
  195. package/dist/components/permissions/FallbackPermissionRequest.js.map +7 -0
  196. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js +159 -0
  197. package/dist/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.js.map +7 -0
  198. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js +58 -0
  199. package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +7 -0
  200. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js +153 -0
  201. package/dist/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.js.map +7 -0
  202. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js +70 -0
  203. package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +7 -0
  204. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +212 -0
  205. package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +7 -0
  206. package/dist/components/permissions/PermissionRequest.js +70 -0
  207. package/dist/components/permissions/PermissionRequest.js.map +7 -0
  208. package/dist/components/permissions/PermissionRequestTitle.js +52 -0
  209. package/dist/components/permissions/PermissionRequestTitle.js.map +7 -0
  210. package/dist/components/permissions/hooks.js +28 -0
  211. package/dist/components/permissions/hooks.js.map +7 -0
  212. package/dist/components/permissions/toolUseOptions.js +46 -0
  213. package/dist/components/permissions/toolUseOptions.js.map +7 -0
  214. package/dist/components/permissions/utils.js +21 -0
  215. package/dist/components/permissions/utils.js.map +7 -0
  216. package/dist/constants/betas.js +11 -0
  217. package/dist/constants/betas.js.map +7 -0
  218. package/dist/constants/claude-asterisk-ascii-art.js +242 -0
  219. package/dist/constants/claude-asterisk-ascii-art.js.map +7 -0
  220. package/dist/constants/figures.js +6 -0
  221. package/dist/constants/figures.js.map +7 -0
  222. package/dist/constants/keys.js +7 -0
  223. package/dist/constants/keys.js.map +7 -0
  224. package/dist/constants/macros.js +13 -0
  225. package/dist/constants/macros.js.map +7 -0
  226. package/dist/constants/modelCapabilities.js +154 -0
  227. package/dist/constants/modelCapabilities.js.map +7 -0
  228. package/dist/constants/models.js +1029 -0
  229. package/dist/constants/models.js.map +7 -0
  230. package/dist/constants/oauth.js +18 -0
  231. package/dist/constants/oauth.js.map +7 -0
  232. package/dist/constants/product.js +26 -0
  233. package/dist/constants/product.js.map +7 -0
  234. package/dist/constants/prompts.js +168 -0
  235. package/dist/constants/prompts.js.map +7 -0
  236. package/dist/constants/releaseNotes.js +9 -0
  237. package/dist/constants/releaseNotes.js.map +7 -0
  238. package/dist/context/PermissionContext.js +111 -0
  239. package/dist/context/PermissionContext.js.map +7 -0
  240. package/dist/context.js +259 -0
  241. package/dist/context.js.map +7 -0
  242. package/dist/cost-tracker.js +76 -0
  243. package/dist/cost-tracker.js.map +7 -0
  244. package/dist/entrypoints/cli.js +1101 -0
  245. package/dist/entrypoints/cli.js.map +7 -0
  246. package/dist/entrypoints/mcp.js +150 -0
  247. package/dist/entrypoints/mcp.js.map +7 -0
  248. package/dist/history.js +25 -0
  249. package/dist/history.js.map +7 -0
  250. package/dist/hooks/useApiKeyVerification.js +12 -0
  251. package/dist/hooks/useApiKeyVerification.js.map +7 -0
  252. package/dist/hooks/useArrowKeyHistory.js +50 -0
  253. package/dist/hooks/useArrowKeyHistory.js.map +7 -0
  254. package/dist/hooks/useCanUseTool.js +112 -0
  255. package/dist/hooks/useCanUseTool.js.map +7 -0
  256. package/dist/hooks/useCancelRequest.js +30 -0
  257. package/dist/hooks/useCancelRequest.js.map +7 -0
  258. package/dist/hooks/useDoublePress.js +31 -0
  259. package/dist/hooks/useDoublePress.js.map +7 -0
  260. package/dist/hooks/useExitOnCtrlCD.js +26 -0
  261. package/dist/hooks/useExitOnCtrlCD.js.map +7 -0
  262. package/dist/hooks/useInterval.js +18 -0
  263. package/dist/hooks/useInterval.js.map +7 -0
  264. package/dist/hooks/useLogMessages.js +14 -0
  265. package/dist/hooks/useLogMessages.js.map +7 -0
  266. package/dist/hooks/useLogStartupTime.js +15 -0
  267. package/dist/hooks/useLogStartupTime.js.map +7 -0
  268. package/dist/hooks/useNotifyAfterTimeout.js +42 -0
  269. package/dist/hooks/useNotifyAfterTimeout.js.map +7 -0
  270. package/dist/hooks/usePermissionRequestLogging.js +28 -0
  271. package/dist/hooks/usePermissionRequestLogging.js.map +7 -0
  272. package/dist/hooks/useTerminalSize.js +38 -0
  273. package/dist/hooks/useTerminalSize.js.map +7 -0
  274. package/dist/hooks/useTextInput.js +250 -0
  275. package/dist/hooks/useTextInput.js.map +7 -0
  276. package/dist/hooks/useUnifiedCompletion.js +929 -0
  277. package/dist/hooks/useUnifiedCompletion.js.map +7 -0
  278. package/dist/index.js +26 -0
  279. package/dist/index.js.map +7 -0
  280. package/dist/messages.js +33 -0
  281. package/dist/messages.js.map +7 -0
  282. package/dist/package.json +1 -0
  283. package/dist/permissions.js +194 -0
  284. package/dist/permissions.js.map +7 -0
  285. package/dist/query.js +492 -0
  286. package/dist/query.js.map +7 -0
  287. package/dist/screens/ConfigureNpmPrefix.js +128 -0
  288. package/dist/screens/ConfigureNpmPrefix.js.map +7 -0
  289. package/dist/screens/Doctor.js +143 -0
  290. package/dist/screens/Doctor.js.map +7 -0
  291. package/dist/screens/LogList.js +55 -0
  292. package/dist/screens/LogList.js.map +7 -0
  293. package/dist/screens/REPL.js +596 -0
  294. package/dist/screens/REPL.js.map +7 -0
  295. package/dist/screens/ResumeConversation.js +56 -0
  296. package/dist/screens/ResumeConversation.js.map +7 -0
  297. package/dist/services/adapters/base.js +29 -0
  298. package/dist/services/adapters/base.js.map +7 -0
  299. package/dist/services/adapters/chatCompletions.js +69 -0
  300. package/dist/services/adapters/chatCompletions.js.map +7 -0
  301. package/dist/services/adapters/responsesAPI.js +126 -0
  302. package/dist/services/adapters/responsesAPI.js.map +7 -0
  303. package/dist/services/browserMocks.js +48 -0
  304. package/dist/services/browserMocks.js.map +7 -0
  305. package/dist/services/claude.js +1605 -0
  306. package/dist/services/claude.js.map +7 -0
  307. package/dist/services/customCommands.js +359 -0
  308. package/dist/services/customCommands.js.map +7 -0
  309. package/dist/services/fileFreshness.js +280 -0
  310. package/dist/services/fileFreshness.js.map +7 -0
  311. package/dist/services/gpt5ConnectionTest.js +248 -0
  312. package/dist/services/gpt5ConnectionTest.js.map +7 -0
  313. package/dist/services/mcpClient.js +435 -0
  314. package/dist/services/mcpClient.js.map +7 -0
  315. package/dist/services/mcpServerApproval.js +55 -0
  316. package/dist/services/mcpServerApproval.js.map +7 -0
  317. package/dist/services/mentionProcessor.js +200 -0
  318. package/dist/services/mentionProcessor.js.map +7 -0
  319. package/dist/services/modelAdapterFactory.js +47 -0
  320. package/dist/services/modelAdapterFactory.js.map +7 -0
  321. package/dist/services/notifier.js +35 -0
  322. package/dist/services/notifier.js.map +7 -0
  323. package/dist/services/oauth.js +259 -0
  324. package/dist/services/oauth.js.map +7 -0
  325. package/dist/services/openai.js +998 -0
  326. package/dist/services/openai.js.map +7 -0
  327. package/dist/services/responseStateManager.js +68 -0
  328. package/dist/services/responseStateManager.js.map +7 -0
  329. package/dist/services/sentry.js +9 -0
  330. package/dist/services/sentry.js.map +7 -0
  331. package/dist/services/statsig.js +112 -0
  332. package/dist/services/statsig.js.map +7 -0
  333. package/dist/services/statsigStorage.js +75 -0
  334. package/dist/services/statsigStorage.js.map +7 -0
  335. package/dist/services/systemReminder.js +353 -0
  336. package/dist/services/systemReminder.js.map +7 -0
  337. package/dist/services/vcr.js +133 -0
  338. package/dist/services/vcr.js.map +7 -0
  339. package/dist/test/testAdapters.js +88 -0
  340. package/dist/test/testAdapters.js.map +1 -0
  341. package/dist/tools/ArchitectTool/ArchitectTool.js +119 -0
  342. package/dist/tools/ArchitectTool/ArchitectTool.js.map +7 -0
  343. package/dist/tools/ArchitectTool/prompt.js +18 -0
  344. package/dist/tools/ArchitectTool/prompt.js.map +7 -0
  345. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +423 -0
  346. package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +7 -0
  347. package/dist/tools/BashTool/BashTool.js +188 -0
  348. package/dist/tools/BashTool/BashTool.js.map +7 -0
  349. package/dist/tools/BashTool/BashToolResultMessage.js +21 -0
  350. package/dist/tools/BashTool/BashToolResultMessage.js.map +7 -0
  351. package/dist/tools/BashTool/OutputLine.js +30 -0
  352. package/dist/tools/BashTool/OutputLine.js.map +7 -0
  353. package/dist/tools/BashTool/prompt.js +179 -0
  354. package/dist/tools/BashTool/prompt.js.map +7 -0
  355. package/dist/tools/BashTool/utils.js +51 -0
  356. package/dist/tools/BashTool/utils.js.map +7 -0
  357. package/dist/tools/FileEditTool/FileEditTool.js +228 -0
  358. package/dist/tools/FileEditTool/FileEditTool.js.map +7 -0
  359. package/dist/tools/FileEditTool/prompt.js +54 -0
  360. package/dist/tools/FileEditTool/prompt.js.map +7 -0
  361. package/dist/tools/FileEditTool/utils.js +42 -0
  362. package/dist/tools/FileEditTool/utils.js.map +7 -0
  363. package/dist/tools/FileReadTool/FileReadTool.js +272 -0
  364. package/dist/tools/FileReadTool/FileReadTool.js.map +7 -0
  365. package/dist/tools/FileReadTool/prompt.js +10 -0
  366. package/dist/tools/FileReadTool/prompt.js.map +7 -0
  367. package/dist/tools/FileWriteTool/FileWriteTool.js +204 -0
  368. package/dist/tools/FileWriteTool/FileWriteTool.js.map +7 -0
  369. package/dist/tools/FileWriteTool/prompt.js +14 -0
  370. package/dist/tools/FileWriteTool/prompt.js.map +7 -0
  371. package/dist/tools/GlobTool/GlobTool.js +88 -0
  372. package/dist/tools/GlobTool/GlobTool.js.map +7 -0
  373. package/dist/tools/GlobTool/prompt.js +12 -0
  374. package/dist/tools/GlobTool/prompt.js.map +7 -0
  375. package/dist/tools/GrepTool/GrepTool.js +107 -0
  376. package/dist/tools/GrepTool/GrepTool.js.map +7 -0
  377. package/dist/tools/GrepTool/prompt.js +15 -0
  378. package/dist/tools/GrepTool/prompt.js.map +7 -0
  379. package/dist/tools/MCPTool/MCPTool.js +90 -0
  380. package/dist/tools/MCPTool/MCPTool.js.map +7 -0
  381. package/dist/tools/MCPTool/prompt.js +7 -0
  382. package/dist/tools/MCPTool/prompt.js.map +7 -0
  383. package/dist/tools/MemoryReadTool/MemoryReadTool.js +103 -0
  384. package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +7 -0
  385. package/dist/tools/MemoryReadTool/prompt.js +7 -0
  386. package/dist/tools/MemoryReadTool/prompt.js.map +7 -0
  387. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +77 -0
  388. package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +7 -0
  389. package/dist/tools/MemoryWriteTool/prompt.js +7 -0
  390. package/dist/tools/MemoryWriteTool/prompt.js.map +7 -0
  391. package/dist/tools/MultiEditTool/MultiEditTool.js +293 -0
  392. package/dist/tools/MultiEditTool/MultiEditTool.js.map +7 -0
  393. package/dist/tools/MultiEditTool/prompt.js +48 -0
  394. package/dist/tools/MultiEditTool/prompt.js.map +7 -0
  395. package/dist/tools/NotebookEditTool/NotebookEditTool.js +238 -0
  396. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +7 -0
  397. package/dist/tools/NotebookEditTool/prompt.js +7 -0
  398. package/dist/tools/NotebookEditTool/prompt.js.map +7 -0
  399. package/dist/tools/NotebookReadTool/NotebookReadTool.js +212 -0
  400. package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +7 -0
  401. package/dist/tools/NotebookReadTool/prompt.js +7 -0
  402. package/dist/tools/NotebookReadTool/prompt.js.map +7 -0
  403. package/dist/tools/StickerRequestTool/StickerRequestTool.js +86 -0
  404. package/dist/tools/StickerRequestTool/StickerRequestTool.js.map +7 -0
  405. package/dist/tools/StickerRequestTool/prompt.js +23 -0
  406. package/dist/tools/StickerRequestTool/prompt.js.map +7 -0
  407. package/dist/tools/TaskTool/TaskTool.js +308 -0
  408. package/dist/tools/TaskTool/TaskTool.js.map +7 -0
  409. package/dist/tools/TaskTool/constants.js +5 -0
  410. package/dist/tools/TaskTool/constants.js.map +7 -0
  411. package/dist/tools/TaskTool/prompt.js +82 -0
  412. package/dist/tools/TaskTool/prompt.js.map +7 -0
  413. package/dist/tools/ThinkTool/ThinkTool.js +48 -0
  414. package/dist/tools/ThinkTool/ThinkTool.js.map +7 -0
  415. package/dist/tools/ThinkTool/prompt.js +16 -0
  416. package/dist/tools/ThinkTool/prompt.js.map +7 -0
  417. package/dist/tools/TodoWriteTool/TodoWriteTool.js +216 -0
  418. package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +7 -0
  419. package/dist/tools/TodoWriteTool/prompt.js +66 -0
  420. package/dist/tools/TodoWriteTool/prompt.js.map +7 -0
  421. package/dist/tools/URLFetcherTool/URLFetcherTool.js +137 -0
  422. package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +7 -0
  423. package/dist/tools/URLFetcherTool/cache.js +45 -0
  424. package/dist/tools/URLFetcherTool/cache.js.map +7 -0
  425. package/dist/tools/URLFetcherTool/htmlToMarkdown.js +42 -0
  426. package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +7 -0
  427. package/dist/tools/URLFetcherTool/prompt.js +22 -0
  428. package/dist/tools/URLFetcherTool/prompt.js.map +7 -0
  429. package/dist/tools/WebSearchTool/WebSearchTool.js +86 -0
  430. package/dist/tools/WebSearchTool/WebSearchTool.js.map +7 -0
  431. package/dist/tools/WebSearchTool/prompt.js +17 -0
  432. package/dist/tools/WebSearchTool/prompt.js.map +7 -0
  433. package/dist/tools/WebSearchTool/searchProviders.js +48 -0
  434. package/dist/tools/WebSearchTool/searchProviders.js.map +7 -0
  435. package/dist/tools/lsTool/lsTool.js +201 -0
  436. package/dist/tools/lsTool/lsTool.js.map +7 -0
  437. package/dist/tools/lsTool/prompt.js +5 -0
  438. package/dist/tools/lsTool/prompt.js.map +7 -0
  439. package/dist/tools.js +64 -0
  440. package/dist/tools.js.map +7 -0
  441. package/dist/types/PermissionMode.js +82 -0
  442. package/dist/types/PermissionMode.js.map +7 -0
  443. package/dist/types/RequestContext.js +47 -0
  444. package/dist/types/RequestContext.js.map +7 -0
  445. package/dist/types/common.d.js +1 -0
  446. package/dist/types/common.d.js.map +7 -0
  447. package/dist/types/conversation.js +1 -0
  448. package/dist/types/conversation.js.map +7 -0
  449. package/dist/types/logs.js +1 -0
  450. package/dist/types/logs.js.map +7 -0
  451. package/dist/types/modelCapabilities.js +1 -0
  452. package/dist/types/modelCapabilities.js.map +7 -0
  453. package/dist/types/notebook.js +1 -0
  454. package/dist/types/notebook.js.map +7 -0
  455. package/dist/utils/Cursor.js +313 -0
  456. package/dist/utils/Cursor.js.map +7 -0
  457. package/dist/utils/PersistentShell.js +382 -0
  458. package/dist/utils/PersistentShell.js.map +7 -0
  459. package/dist/utils/advancedFuzzyMatcher.js +206 -0
  460. package/dist/utils/advancedFuzzyMatcher.js.map +7 -0
  461. package/dist/utils/agentLoader.js +199 -0
  462. package/dist/utils/agentLoader.js.map +7 -0
  463. package/dist/utils/agentStorage.js +59 -0
  464. package/dist/utils/agentStorage.js.map +7 -0
  465. package/dist/utils/array.js +7 -0
  466. package/dist/utils/array.js.map +7 -0
  467. package/dist/utils/ask.js +77 -0
  468. package/dist/utils/ask.js.map +7 -0
  469. package/dist/utils/auth.js +11 -0
  470. package/dist/utils/auth.js.map +7 -0
  471. package/dist/utils/autoCompactCore.js +149 -0
  472. package/dist/utils/autoCompactCore.js.map +7 -0
  473. package/dist/utils/autoUpdater.js +362 -0
  474. package/dist/utils/autoUpdater.js.map +7 -0
  475. package/dist/utils/betas.js +21 -0
  476. package/dist/utils/betas.js.map +7 -0
  477. package/dist/utils/browser.js +15 -0
  478. package/dist/utils/browser.js.map +7 -0
  479. package/dist/utils/cleanup.js +54 -0
  480. package/dist/utils/cleanup.js.map +7 -0
  481. package/dist/utils/commands.js +207 -0
  482. package/dist/utils/commands.js.map +7 -0
  483. package/dist/utils/commonUnixCommands.js +687 -0
  484. package/dist/utils/commonUnixCommands.js.map +7 -0
  485. package/dist/utils/config.js +655 -0
  486. package/dist/utils/config.js.map +7 -0
  487. package/dist/utils/conversationRecovery.js +35 -0
  488. package/dist/utils/conversationRecovery.js.map +7 -0
  489. package/dist/utils/debugLogger.js +891 -0
  490. package/dist/utils/debugLogger.js.map +7 -0
  491. package/dist/utils/diff.js +32 -0
  492. package/dist/utils/diff.js.map +7 -0
  493. package/dist/utils/env.js +44 -0
  494. package/dist/utils/env.js.map +7 -0
  495. package/dist/utils/errors.js +23 -0
  496. package/dist/utils/errors.js.map +7 -0
  497. package/dist/utils/exampleCommands.js +80 -0
  498. package/dist/utils/exampleCommands.js.map +7 -0
  499. package/dist/utils/execFileNoThrow.js +44 -0
  500. package/dist/utils/execFileNoThrow.js.map +7 -0
  501. package/dist/utils/expertChatStorage.js +78 -0
  502. package/dist/utils/expertChatStorage.js.map +7 -0
  503. package/dist/utils/file.js +282 -0
  504. package/dist/utils/file.js.map +7 -0
  505. package/dist/utils/fileRecoveryCore.js +41 -0
  506. package/dist/utils/fileRecoveryCore.js.map +7 -0
  507. package/dist/utils/format.js +41 -0
  508. package/dist/utils/format.js.map +7 -0
  509. package/dist/utils/fuzzyMatcher.js +252 -0
  510. package/dist/utils/fuzzyMatcher.js.map +7 -0
  511. package/dist/utils/generators.js +46 -0
  512. package/dist/utils/generators.js.map +7 -0
  513. package/dist/utils/git.js +83 -0
  514. package/dist/utils/git.js.map +7 -0
  515. package/dist/utils/globalLogger.js +54 -0
  516. package/dist/utils/globalLogger.js.map +7 -0
  517. package/dist/utils/http.js +7 -0
  518. package/dist/utils/http.js.map +7 -0
  519. package/dist/utils/imagePaste.js +29 -0
  520. package/dist/utils/imagePaste.js.map +7 -0
  521. package/dist/utils/json.js +16 -0
  522. package/dist/utils/json.js.map +7 -0
  523. package/dist/utils/log.js +298 -0
  524. package/dist/utils/log.js.map +7 -0
  525. package/dist/utils/markdown.js +187 -0
  526. package/dist/utils/markdown.js.map +7 -0
  527. package/dist/utils/messageContextManager.js +195 -0
  528. package/dist/utils/messageContextManager.js.map +7 -0
  529. package/dist/utils/messages.js +633 -0
  530. package/dist/utils/messages.js.map +7 -0
  531. package/dist/utils/model.js +687 -0
  532. package/dist/utils/model.js.map +7 -0
  533. package/dist/utils/permissions/filesystem.js +80 -0
  534. package/dist/utils/permissions/filesystem.js.map +7 -0
  535. package/dist/utils/responseState.js +20 -0
  536. package/dist/utils/responseState.js.map +7 -0
  537. package/dist/utils/ripgrep.js +131 -0
  538. package/dist/utils/ripgrep.js.map +7 -0
  539. package/dist/utils/secureFile.js +483 -0
  540. package/dist/utils/secureFile.js.map +7 -0
  541. package/dist/utils/sessionState.js +31 -0
  542. package/dist/utils/sessionState.js.map +7 -0
  543. package/dist/utils/state.js +24 -0
  544. package/dist/utils/state.js.map +7 -0
  545. package/dist/utils/style.js +31 -0
  546. package/dist/utils/style.js.map +7 -0
  547. package/dist/utils/terminal.js +43 -0
  548. package/dist/utils/terminal.js.map +7 -0
  549. package/dist/utils/theme.js +102 -0
  550. package/dist/utils/theme.js.map +7 -0
  551. package/dist/utils/thinking.js +103 -0
  552. package/dist/utils/thinking.js.map +7 -0
  553. package/dist/utils/todoStorage.js +291 -0
  554. package/dist/utils/todoStorage.js.map +7 -0
  555. package/dist/utils/tokens.js +30 -0
  556. package/dist/utils/tokens.js.map +7 -0
  557. package/dist/utils/toolExecutionController.js +109 -0
  558. package/dist/utils/toolExecutionController.js.map +7 -0
  559. package/dist/utils/unaryLogging.js +14 -0
  560. package/dist/utils/unaryLogging.js.map +7 -0
  561. package/dist/utils/user.js +40 -0
  562. package/dist/utils/user.js.map +7 -0
  563. package/dist/utils/validate.js +132 -0
  564. package/dist/utils/validate.js.map +7 -0
  565. package/dist/yoga.wasm +0 -0
  566. package/package.json +28 -7
  567. package/src/Tool.ts +4 -3
  568. package/src/commands/agents.tsx +10 -4
  569. package/src/components/messages/AssistantToolUseMessage.tsx +5 -6
  570. package/src/constants/macros.ts +5 -2
  571. package/src/entrypoints/cli.tsx +38 -19
  572. package/src/entrypoints/mcp.ts +1 -2
  573. package/src/hooks/useDoublePress.ts +0 -1
  574. package/src/hooks/useTextInput.ts +4 -5
  575. package/src/hooks/useUnifiedCompletion.ts +2 -2
  576. package/src/index.ts +34 -0
  577. package/src/query.ts +13 -8
  578. package/src/screens/Doctor.tsx +1 -1
  579. package/src/screens/REPL.tsx +13 -9
  580. package/src/services/openai.ts +25 -4
  581. package/src/tools/ArchitectTool/ArchitectTool.tsx +18 -5
  582. package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +21 -14
  583. package/src/tools/FileEditTool/FileEditTool.tsx +6 -2
  584. package/src/tools/FileWriteTool/FileWriteTool.tsx +7 -3
  585. package/src/tools/MultiEditTool/MultiEditTool.tsx +26 -4
  586. package/src/tools/NotebookReadTool/NotebookReadTool.tsx +1 -1
  587. package/src/tools/StickerRequestTool/StickerRequestTool.tsx +28 -14
  588. package/src/tools/TaskTool/TaskTool.tsx +8 -36
  589. package/src/types/common.d.ts +2 -0
  590. package/src/utils/generators.ts +1 -1
  591. package/src/utils/messageContextManager.ts +5 -0
  592. package/src/utils/messages.tsx +8 -2
  593. package/src/utils/thinking.ts +1 -1
@@ -0,0 +1,282 @@
1
+ import {
2
+ readFileSync,
3
+ writeFileSync,
4
+ openSync,
5
+ readSync,
6
+ closeSync,
7
+ existsSync,
8
+ readdirSync
9
+ } from "fs";
10
+ import { logError } from "./log.js";
11
+ import {
12
+ isAbsolute,
13
+ normalize,
14
+ resolve,
15
+ resolve as resolvePath,
16
+ relative,
17
+ sep,
18
+ basename,
19
+ dirname,
20
+ extname,
21
+ join
22
+ } from "path";
23
+ import { glob as globLib } from "glob";
24
+ import { cwd } from "process";
25
+ import { listAllContentFiles } from "./ripgrep.js";
26
+ import { LRUCache } from "lru-cache";
27
+ import { getCwd } from "./state.js";
28
+ async function glob(filePattern, cwd2, { limit, offset }, abortSignal) {
29
+ const paths = await globLib([filePattern], {
30
+ cwd: cwd2,
31
+ nocase: true,
32
+ nodir: true,
33
+ signal: abortSignal,
34
+ stat: true,
35
+ withFileTypes: true
36
+ });
37
+ const sortedPaths = paths.sort((a, b) => (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0));
38
+ const truncated = sortedPaths.length > offset + limit;
39
+ return {
40
+ files: sortedPaths.slice(offset, offset + limit).map((path) => path.fullpath()),
41
+ truncated
42
+ };
43
+ }
44
+ function readFileSafe(filepath) {
45
+ try {
46
+ return readFileSync(filepath, "utf-8");
47
+ } catch (error) {
48
+ logError(error);
49
+ return null;
50
+ }
51
+ }
52
+ function isInDirectory(relativePath, relativeCwd) {
53
+ if (relativePath === ".") {
54
+ return true;
55
+ }
56
+ if (relativePath.startsWith("~")) {
57
+ return false;
58
+ }
59
+ if (relativePath.includes("\0") || relativeCwd.includes("\0")) {
60
+ return false;
61
+ }
62
+ let normalizedPath = normalize(relativePath);
63
+ let normalizedCwd = normalize(relativeCwd);
64
+ normalizedPath = normalizedPath.endsWith(sep) ? normalizedPath : normalizedPath + sep;
65
+ normalizedCwd = normalizedCwd.endsWith(sep) ? normalizedCwd : normalizedCwd + sep;
66
+ const fullPath = resolvePath(cwd(), normalizedCwd, normalizedPath);
67
+ const fullCwd = resolvePath(cwd(), normalizedCwd);
68
+ const rel = relative(fullCwd, fullPath);
69
+ if (!rel || rel === "") return true;
70
+ if (rel.startsWith("..")) return false;
71
+ if (isAbsolute(rel)) return false;
72
+ return true;
73
+ }
74
+ function readTextContent(filePath, offset = 0, maxLines) {
75
+ const enc = detectFileEncoding(filePath);
76
+ const content = readFileSync(filePath, enc);
77
+ const lines = content.split(/\r?\n/);
78
+ const toReturn = maxLines !== void 0 && lines.length - offset > maxLines ? lines.slice(offset, offset + maxLines) : lines.slice(offset);
79
+ return {
80
+ content: toReturn.join("\n"),
81
+ // TODO: This probably won't work for Windows
82
+ lineCount: toReturn.length,
83
+ totalLines: lines.length
84
+ };
85
+ }
86
+ function writeTextContent(filePath, content, encoding, endings) {
87
+ let toWrite = content;
88
+ if (endings === "CRLF") {
89
+ toWrite = content.split("\n").join("\r\n");
90
+ }
91
+ writeFileSync(filePath, toWrite, { encoding, flush: true });
92
+ }
93
+ const repoEndingCache = new LRUCache({
94
+ fetchMethod: (path) => detectRepoLineEndingsDirect(path),
95
+ ttl: 5 * 60 * 1e3,
96
+ ttlAutopurge: false,
97
+ max: 1e3
98
+ });
99
+ async function detectRepoLineEndings(filePath) {
100
+ return repoEndingCache.fetch(resolve(filePath));
101
+ }
102
+ async function detectRepoLineEndingsDirect(cwd2) {
103
+ const abortController = new AbortController();
104
+ setTimeout(() => {
105
+ abortController.abort();
106
+ }, 1e3);
107
+ const allFiles = await listAllContentFiles(cwd2, abortController.signal, 15);
108
+ let crlfCount = 0;
109
+ for (const file of allFiles) {
110
+ const lineEnding = detectLineEndings(file);
111
+ if (lineEnding === "CRLF") {
112
+ crlfCount++;
113
+ }
114
+ }
115
+ return crlfCount > 3 ? "CRLF" : "LF";
116
+ }
117
+ function fetch(cache, key, value) {
118
+ if (cache.has(key)) {
119
+ return cache.get(key);
120
+ }
121
+ const v = value();
122
+ cache.set(key, v);
123
+ return v;
124
+ }
125
+ const fileEncodingCache = new LRUCache({
126
+ fetchMethod: (path) => detectFileEncodingDirect(path),
127
+ ttl: 5 * 60 * 1e3,
128
+ ttlAutopurge: false,
129
+ max: 1e3
130
+ });
131
+ function detectFileEncoding(filePath) {
132
+ const k = resolve(filePath);
133
+ return fetch(fileEncodingCache, k, () => detectFileEncodingDirect(k));
134
+ }
135
+ function detectFileEncodingDirect(filePath) {
136
+ const BUFFER_SIZE = 4096;
137
+ const buffer = Buffer.alloc(BUFFER_SIZE);
138
+ let fd = void 0;
139
+ try {
140
+ fd = openSync(filePath, "r");
141
+ const bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0);
142
+ if (bytesRead >= 2) {
143
+ if (buffer[0] === 255 && buffer[1] === 254) return "utf16le";
144
+ }
145
+ if (bytesRead >= 3 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
146
+ return "utf8";
147
+ }
148
+ const isUtf8 = buffer.slice(0, bytesRead).toString("utf8").length > 0;
149
+ return isUtf8 ? "utf8" : "ascii";
150
+ } catch (error) {
151
+ logError(`Error detecting encoding for file ${filePath}: ${error}`);
152
+ return "utf8";
153
+ } finally {
154
+ if (fd) closeSync(fd);
155
+ }
156
+ }
157
+ const lineEndingCache = new LRUCache({
158
+ fetchMethod: (path) => detectLineEndingsDirect(path),
159
+ ttl: 5 * 60 * 1e3,
160
+ ttlAutopurge: false,
161
+ max: 1e3
162
+ });
163
+ function detectLineEndings(filePath) {
164
+ const k = resolve(filePath);
165
+ return fetch(lineEndingCache, k, () => detectLineEndingsDirect(k));
166
+ }
167
+ function detectLineEndingsDirect(filePath, encoding = "utf8") {
168
+ try {
169
+ const buffer = Buffer.alloc(4096);
170
+ const fd = openSync(filePath, "r");
171
+ const bytesRead = readSync(fd, buffer, 0, 4096, 0);
172
+ closeSync(fd);
173
+ const content = buffer.toString(encoding, 0, bytesRead);
174
+ let crlfCount = 0;
175
+ let lfCount = 0;
176
+ for (let i = 0; i < content.length; i++) {
177
+ if (content[i] === "\n") {
178
+ if (i > 0 && content[i - 1] === "\r") {
179
+ crlfCount++;
180
+ } else {
181
+ lfCount++;
182
+ }
183
+ }
184
+ }
185
+ return crlfCount > lfCount ? "CRLF" : "LF";
186
+ } catch (error) {
187
+ logError(`Error detecting line endings for file ${filePath}: ${error}`);
188
+ return "LF";
189
+ }
190
+ }
191
+ function normalizeFilePath(filePath) {
192
+ const absoluteFilePath = isAbsolute(filePath) ? filePath : resolve(getCwd(), filePath);
193
+ if (absoluteFilePath.endsWith(" AM.png")) {
194
+ return absoluteFilePath.replace(
195
+ " AM.png",
196
+ `${String.fromCharCode(8239)}AM.png`
197
+ );
198
+ }
199
+ if (absoluteFilePath.endsWith(" PM.png")) {
200
+ return absoluteFilePath.replace(
201
+ " PM.png",
202
+ `${String.fromCharCode(8239)}PM.png`
203
+ );
204
+ }
205
+ return absoluteFilePath;
206
+ }
207
+ function getAbsolutePath(path) {
208
+ return path ? isAbsolute(path) ? path : resolve(getCwd(), path) : void 0;
209
+ }
210
+ function getAbsoluteAndRelativePaths(path) {
211
+ const absolutePath = getAbsolutePath(path);
212
+ const relativePath = absolutePath ? relative(getCwd(), absolutePath) : void 0;
213
+ return { absolutePath, relativePath };
214
+ }
215
+ function findSimilarFile(filePath) {
216
+ try {
217
+ const dir = dirname(filePath);
218
+ const fileBaseName = basename(filePath, extname(filePath));
219
+ if (!existsSync(dir)) {
220
+ return void 0;
221
+ }
222
+ const files = readdirSync(dir);
223
+ const similarFiles = files.filter(
224
+ (file) => basename(file, extname(file)) === fileBaseName && join(dir, file) !== filePath
225
+ );
226
+ const firstMatch = similarFiles[0];
227
+ if (firstMatch) {
228
+ return firstMatch;
229
+ }
230
+ return void 0;
231
+ } catch (error) {
232
+ logError(`Error finding similar file for ${filePath}: ${error}`);
233
+ return void 0;
234
+ }
235
+ }
236
+ function addLineNumbers({
237
+ content,
238
+ // 1-indexed
239
+ startLine
240
+ }) {
241
+ if (!content) {
242
+ return "";
243
+ }
244
+ return content.split(/\r?\n/).map((line, index) => {
245
+ const lineNum = index + startLine;
246
+ const numStr = String(lineNum);
247
+ if (numStr.length >= 6) {
248
+ return `${numStr} ${line}`;
249
+ }
250
+ const n = numStr.padStart(6, " ");
251
+ return `${n} ${line}`;
252
+ }).join("\n");
253
+ }
254
+ function isDirEmpty(dirPath) {
255
+ try {
256
+ const entries = readdirSync(dirPath);
257
+ return entries.length === 0;
258
+ } catch (error) {
259
+ logError(`Error checking directory: ${error}`);
260
+ return false;
261
+ }
262
+ }
263
+ export {
264
+ addLineNumbers,
265
+ detectFileEncoding,
266
+ detectFileEncodingDirect,
267
+ detectLineEndings,
268
+ detectLineEndingsDirect,
269
+ detectRepoLineEndings,
270
+ detectRepoLineEndingsDirect,
271
+ findSimilarFile,
272
+ getAbsoluteAndRelativePaths,
273
+ getAbsolutePath,
274
+ glob,
275
+ isDirEmpty,
276
+ isInDirectory,
277
+ normalizeFilePath,
278
+ readFileSafe,
279
+ readTextContent,
280
+ writeTextContent
281
+ };
282
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/file.ts"],
4
+ "sourcesContent": ["import {\n readFileSync,\n writeFileSync,\n openSync,\n readSync,\n closeSync,\n existsSync,\n readdirSync,\n} from 'fs'\nimport { logError } from './log'\nimport {\n isAbsolute,\n normalize,\n resolve,\n resolve as resolvePath,\n relative,\n sep,\n basename,\n dirname,\n extname,\n join,\n} from 'path'\nimport { glob as globLib } from 'glob'\nimport { cwd } from 'process'\nimport { listAllContentFiles } from './ripgrep'\nimport { LRUCache } from 'lru-cache'\nimport { getCwd } from './state'\n\nexport type File = {\n filename: string\n content: string\n}\n\nexport type LineEndingType = 'CRLF' | 'LF'\n\nexport async function glob(\n filePattern: string,\n cwd: string,\n { limit, offset }: { limit: number; offset: number },\n abortSignal: AbortSignal,\n): Promise<{ files: string[]; truncated: boolean }> {\n // TODO: Use worker threads\n const paths = await globLib([filePattern], {\n cwd,\n nocase: true,\n nodir: true,\n signal: abortSignal,\n stat: true,\n withFileTypes: true,\n })\n const sortedPaths = paths.sort((a, b) => (a.mtimeMs ?? 0) - (b.mtimeMs ?? 0))\n const truncated = sortedPaths.length > offset + limit\n return {\n files: sortedPaths\n .slice(offset, offset + limit)\n .map(path => path.fullpath()),\n truncated,\n }\n}\n\nexport function readFileSafe(filepath: string): string | null {\n try {\n return readFileSync(filepath, 'utf-8')\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function isInDirectory(\n relativePath: string,\n relativeCwd: string,\n): boolean {\n if (relativePath === '.') {\n return true\n }\n\n // Reject paths starting with ~ (home directory)\n if (relativePath.startsWith('~')) {\n return false\n }\n\n // Reject paths containing null bytes or other sneaky characters\n if (relativePath.includes('\\0') || relativeCwd.includes('\\0')) {\n return false\n }\n\n // Normalize paths to resolve any '..' or '.' segments\n // and add trailing slashes\n let normalizedPath = normalize(relativePath)\n let normalizedCwd = normalize(relativeCwd)\n\n normalizedPath = normalizedPath.endsWith(sep)\n ? normalizedPath\n : normalizedPath + sep\n normalizedCwd = normalizedCwd.endsWith(sep)\n ? normalizedCwd\n : normalizedCwd + sep\n\n // Join with a base directory to make them absolute-like for comparison\n const fullPath = resolvePath(cwd(), normalizedCwd, normalizedPath)\n const fullCwd = resolvePath(cwd(), normalizedCwd)\n\n // Robust subpath check using path.relative (case-insensitive on Windows)\n const rel = relative(fullCwd, fullPath)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n}\n\nexport function readTextContent(\n filePath: string,\n offset = 0,\n maxLines?: number,\n): { content: string; lineCount: number; totalLines: number } {\n const enc = detectFileEncoding(filePath)\n const content = readFileSync(filePath, enc)\n const lines = content.split(/\\r?\\n/)\n\n // Truncate number of lines if needed\n const toReturn =\n maxLines !== undefined && lines.length - offset > maxLines\n ? lines.slice(offset, offset + maxLines)\n : lines.slice(offset)\n\n return {\n content: toReturn.join('\\n'), // TODO: This probably won't work for Windows\n lineCount: toReturn.length,\n totalLines: lines.length,\n }\n}\n\nexport function writeTextContent(\n filePath: string,\n content: string,\n encoding: BufferEncoding,\n endings: LineEndingType,\n): void {\n let toWrite = content\n if (endings === 'CRLF') {\n toWrite = content.split('\\n').join('\\r\\n')\n }\n\n writeFileSync(filePath, toWrite, { encoding, flush: true })\n}\n\nconst repoEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectRepoLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport async function detectRepoLineEndings(\n filePath: string,\n): Promise<LineEndingType | undefined> {\n return repoEndingCache.fetch(resolve(filePath))\n}\n\nexport async function detectRepoLineEndingsDirect(\n cwd: string,\n): Promise<LineEndingType> {\n const abortController = new AbortController()\n setTimeout(() => {\n abortController.abort()\n }, 1_000)\n const allFiles = await listAllContentFiles(cwd, abortController.signal, 15)\n\n let crlfCount = 0\n for (const file of allFiles) {\n const lineEnding = detectLineEndings(file)\n if (lineEnding === 'CRLF') {\n crlfCount++\n }\n }\n\n return crlfCount > 3 ? 'CRLF' : 'LF'\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nfunction fetch<K extends {}, V extends {}>(\n cache: LRUCache<K, V>,\n key: K,\n value: () => V,\n): V {\n if (cache.has(key)) {\n return cache.get(key)!\n }\n\n const v = value()\n cache.set(key, v)\n return v\n}\n\nconst fileEncodingCache = new LRUCache<string, BufferEncoding>({\n fetchMethod: path => detectFileEncodingDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectFileEncoding(filePath: string): BufferEncoding {\n const k = resolve(filePath)\n return fetch(fileEncodingCache, k, () => detectFileEncodingDirect(k))\n}\n\nexport function detectFileEncodingDirect(filePath: string): BufferEncoding {\n const BUFFER_SIZE = 4096\n const buffer = Buffer.alloc(BUFFER_SIZE)\n\n let fd: number | undefined = undefined\n try {\n fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, BUFFER_SIZE, 0)\n\n if (bytesRead >= 2) {\n if (buffer[0] === 0xff && buffer[1] === 0xfe) return 'utf16le'\n }\n\n if (\n bytesRead >= 3 &&\n buffer[0] === 0xef &&\n buffer[1] === 0xbb &&\n buffer[2] === 0xbf\n ) {\n return 'utf8'\n }\n\n const isUtf8 = buffer.slice(0, bytesRead).toString('utf8').length > 0\n return isUtf8 ? 'utf8' : 'ascii'\n } catch (error) {\n logError(`Error detecting encoding for file ${filePath}: ${error}`)\n return 'utf8'\n } finally {\n if (fd) closeSync(fd)\n }\n}\n\nconst lineEndingCache = new LRUCache<string, LineEndingType>({\n fetchMethod: path => detectLineEndingsDirect(path),\n ttl: 5 * 60 * 1000,\n ttlAutopurge: false,\n max: 1000,\n})\n\nexport function detectLineEndings(filePath: string): LineEndingType {\n const k = resolve(filePath)\n return fetch(lineEndingCache, k, () => detectLineEndingsDirect(k))\n}\n\nexport function detectLineEndingsDirect(\n filePath: string,\n encoding: BufferEncoding = 'utf8',\n): LineEndingType {\n try {\n const buffer = Buffer.alloc(4096)\n const fd = openSync(filePath, 'r')\n const bytesRead = readSync(fd, buffer, 0, 4096, 0)\n closeSync(fd)\n\n const content = buffer.toString(encoding, 0, bytesRead)\n let crlfCount = 0\n let lfCount = 0\n\n for (let i = 0; i < content.length; i++) {\n if (content[i] === '\\n') {\n if (i > 0 && content[i - 1] === '\\r') {\n crlfCount++\n } else {\n lfCount++\n }\n }\n }\n\n return crlfCount > lfCount ? 'CRLF' : 'LF'\n } catch (error) {\n logError(`Error detecting line endings for file ${filePath}: ${error}`)\n return 'LF'\n }\n}\n\nexport function normalizeFilePath(filePath: string): string {\n const absoluteFilePath = isAbsolute(filePath)\n ? filePath\n : resolve(getCwd(), filePath)\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' AM.png')) {\n return absoluteFilePath.replace(\n ' AM.png',\n `${String.fromCharCode(8239)}AM.png`,\n )\n }\n\n // One weird trick for half-width space characters in MacOS screenshot filenames\n if (absoluteFilePath.endsWith(' PM.png')) {\n return absoluteFilePath.replace(\n ' PM.png',\n `${String.fromCharCode(8239)}PM.png`,\n )\n }\n\n return absoluteFilePath\n}\n\nexport function getAbsolutePath(path: string | undefined): string | undefined {\n return path ? (isAbsolute(path) ? path : resolve(getCwd(), path)) : undefined\n}\n\nexport function getAbsoluteAndRelativePaths(path: string | undefined): {\n absolutePath: string | undefined\n relativePath: string | undefined\n} {\n const absolutePath = getAbsolutePath(path)\n const relativePath = absolutePath\n ? relative(getCwd(), absolutePath)\n : undefined\n return { absolutePath, relativePath }\n}\n\n/**\n * Find files with the same name but different extensions in the same directory\n * @param filePath The path to the file that doesn't exist\n * @returns The found file with a different extension, or undefined if none found\n */\n\nexport function findSimilarFile(filePath: string): string | undefined {\n try {\n const dir = dirname(filePath)\n const fileBaseName = basename(filePath, extname(filePath))\n\n // Check if directory exists\n if (!existsSync(dir)) {\n return undefined\n }\n\n // Get all files in the directory\n const files = readdirSync(dir)\n\n // Find files with the same base name but different extension\n const similarFiles = files.filter(\n file =>\n basename(file, extname(file)) === fileBaseName &&\n join(dir, file) !== filePath,\n )\n\n // Return just the filename of the first match if found\n const firstMatch = similarFiles[0]\n if (firstMatch) {\n return firstMatch\n }\n return undefined\n } catch (error) {\n // In case of any errors, return undefined\n logError(`Error finding similar file for ${filePath}: ${error}`)\n return undefined\n }\n}\n\n/**\n * Adds cat -n style line numbers to the content\n */\nexport function addLineNumbers({\n content,\n // 1-indexed\n startLine,\n}: {\n content: string\n startLine: number\n}): string {\n if (!content) {\n return ''\n }\n\n return content\n .split(/\\r?\\n/)\n .map((line, index) => {\n const lineNum = index + startLine\n const numStr = String(lineNum)\n // Handle large numbers differently\n if (numStr.length >= 6) {\n return `${numStr}\\t${line}`\n }\n // Regular numbers get padding to 6 characters\n const n = numStr.padStart(6, ' ')\n return `${n}\\t${line}`\n })\n .join('\\n') // TODO: This probably won't work for Windows\n}\n\n/**\n * Checks if a directory is empty by efficiently reading just the first entry\n * @param dirPath The path to the directory to check\n * @returns true if the directory is empty, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n try {\n const entries = readdirSync(dirPath)\n return entries.length === 0\n } catch (error) {\n logError(`Error checking directory: ${error}`)\n return false\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["cwd"]
7
+ }
@@ -0,0 +1,41 @@
1
+ import { readTextContent } from "./file.js";
2
+ import { fileFreshnessService } from "../services/fileFreshness.js";
3
+ const MAX_FILES_TO_RECOVER = 5;
4
+ const MAX_TOKENS_PER_FILE = 1e4;
5
+ const MAX_TOTAL_FILE_TOKENS = 5e4;
6
+ async function selectAndReadFiles() {
7
+ const importantFiles = fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER);
8
+ const results = [];
9
+ let totalTokens = 0;
10
+ for (const fileInfo of importantFiles) {
11
+ try {
12
+ const { content } = readTextContent(fileInfo.path);
13
+ const estimatedTokens = Math.ceil(content.length * 0.25);
14
+ let finalContent = content;
15
+ let truncated = false;
16
+ if (estimatedTokens > MAX_TOKENS_PER_FILE) {
17
+ const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25);
18
+ finalContent = content.substring(0, maxChars);
19
+ truncated = true;
20
+ }
21
+ const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE);
22
+ if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {
23
+ break;
24
+ }
25
+ totalTokens += finalTokens;
26
+ results.push({
27
+ path: fileInfo.path,
28
+ content: finalContent,
29
+ tokens: finalTokens,
30
+ truncated
31
+ });
32
+ } catch (error) {
33
+ console.error(`Failed to read file for recovery: ${fileInfo.path}`, error);
34
+ }
35
+ }
36
+ return results;
37
+ }
38
+ export {
39
+ selectAndReadFiles
40
+ };
41
+ //# sourceMappingURL=fileRecoveryCore.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/fileRecoveryCore.ts"],
4
+ "sourcesContent": ["import { readTextContent } from './file'\nimport { fileFreshnessService } from '../services/fileFreshness'\n\n/**\n * File recovery configuration for auto-compact feature\n * These limits ensure recovered files don't overwhelm the compressed context\n */\nconst MAX_FILES_TO_RECOVER = 5\nconst MAX_TOKENS_PER_FILE = 10_000\nconst MAX_TOTAL_FILE_TOKENS = 50_000\n\n/**\n * Selects and reads recently accessed files for context recovery\n *\n * During auto-compact, this function preserves development context by:\n * - Selecting files based on recent access patterns\n * - Enforcing token budgets to prevent context bloat\n * - Truncating large files while preserving essential content\n *\n * @returns Array of file data with content, token counts, and truncation flags\n */\nexport async function selectAndReadFiles(): Promise<\n Array<{\n path: string\n content: string\n tokens: number\n truncated: boolean\n }>\n> {\n const importantFiles =\n fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER)\n const results = []\n let totalTokens = 0\n\n for (const fileInfo of importantFiles) {\n try {\n const { content } = readTextContent(fileInfo.path)\n const estimatedTokens = Math.ceil(content.length * 0.25)\n\n // Apply per-file token limit to prevent any single file from dominating context\n let finalContent = content\n let truncated = false\n\n if (estimatedTokens > MAX_TOKENS_PER_FILE) {\n const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25)\n finalContent = content.substring(0, maxChars)\n truncated = true\n }\n\n const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE)\n\n // Enforce total token budget to maintain auto-compact effectiveness\n if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {\n break\n }\n\n totalTokens += finalTokens\n results.push({\n path: fileInfo.path,\n content: finalContent,\n tokens: finalTokens,\n truncated,\n })\n } catch (error) {\n // Skip files that cannot be read, don't let one failure stop the process\n console.error(`Failed to read file for recovery: ${fileInfo.path}`, error)\n }\n }\n\n return results\n}\n"],
5
+ "mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAMrC,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAY9B,eAAsB,qBAOpB;AACA,QAAM,iBACJ,qBAAqB,kBAAkB,oBAAoB;AAC7D,QAAM,UAAU,CAAC;AACjB,MAAI,cAAc;AAElB,aAAW,YAAY,gBAAgB;AACrC,QAAI;AACF,YAAM,EAAE,QAAQ,IAAI,gBAAgB,SAAS,IAAI;AACjD,YAAM,kBAAkB,KAAK,KAAK,QAAQ,SAAS,IAAI;AAGvD,UAAI,eAAe;AACnB,UAAI,YAAY;AAEhB,UAAI,kBAAkB,qBAAqB;AACzC,cAAM,WAAW,KAAK,MAAM,sBAAsB,IAAI;AACtD,uBAAe,QAAQ,UAAU,GAAG,QAAQ;AAC5C,oBAAY;AAAA,MACd;AAEA,YAAM,cAAc,KAAK,IAAI,iBAAiB,mBAAmB;AAGjE,UAAI,cAAc,cAAc,uBAAuB;AACrD;AAAA,MACF;AAEA,qBAAe;AACf,cAAQ,KAAK;AAAA,QACX,MAAM,SAAS;AAAA,QACf,SAAS;AAAA,QACT,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AAEd,cAAQ,MAAM,qCAAqC,SAAS,IAAI,IAAI,KAAK;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ function wrapText(text, width) {
2
+ const lines = [];
3
+ let currentLine = "";
4
+ for (const char of text) {
5
+ if ([...currentLine].length < width) {
6
+ currentLine += char;
7
+ } else {
8
+ lines.push(currentLine);
9
+ currentLine = char;
10
+ }
11
+ }
12
+ if (currentLine) lines.push(currentLine);
13
+ return lines;
14
+ }
15
+ function formatDuration(ms) {
16
+ if (ms < 6e4) {
17
+ return `${(ms / 1e3).toFixed(1)}s`;
18
+ }
19
+ const hours = Math.floor(ms / 36e5);
20
+ const minutes = Math.floor(ms % 36e5 / 6e4);
21
+ const seconds = (ms % 6e4 / 1e3).toFixed(1);
22
+ if (hours > 0) {
23
+ return `${hours}h ${minutes}m ${seconds}s`;
24
+ }
25
+ if (minutes > 0) {
26
+ return `${minutes}m ${seconds}s`;
27
+ }
28
+ return `${seconds}s`;
29
+ }
30
+ function formatNumber(number) {
31
+ return new Intl.NumberFormat("en", {
32
+ notation: "compact",
33
+ maximumFractionDigits: 1
34
+ }).format(number).toLowerCase();
35
+ }
36
+ export {
37
+ formatDuration,
38
+ formatNumber,
39
+ wrapText
40
+ };
41
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/format.tsx"],
4
+ "sourcesContent": ["export function wrapText(text: string, width: number): string[] {\n const lines: string[] = []\n let currentLine = ''\n\n for (const char of text) {\n // Important: we need the spread to properly count multi-plane UTF-8 characters (eg. \uD805\uDE96)\n if ([...currentLine].length < width) {\n currentLine += char\n } else {\n lines.push(currentLine)\n currentLine = char\n }\n }\n\n if (currentLine) lines.push(currentLine)\n return lines\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(1)}s`\n }\n\n const hours = Math.floor(ms / 3600000)\n const minutes = Math.floor((ms % 3600000) / 60000)\n const seconds = ((ms % 60000) / 1000).toFixed(1)\n\n if (hours > 0) {\n return `${hours}h ${minutes}m ${seconds}s`\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds}s`\n }\n return `${seconds}s`\n}\n\nexport function formatNumber(number: number): string {\n return new Intl.NumberFormat('en', {\n notation: 'compact',\n maximumFractionDigits: 1,\n })\n .format(number) // eg. \"1321\" => \"1.3K\"\n .toLowerCase() // eg. \"1.3K\" => \"1.3k\"\n}\n"],
5
+ "mappings": "AAAO,SAAS,SAAS,MAAc,OAAyB;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,aAAW,QAAQ,MAAM;AAEvB,QAAI,CAAC,GAAG,WAAW,EAAE,SAAS,OAAO;AACnC,qBAAe;AAAA,IACjB,OAAO;AACL,YAAM,KAAK,WAAW;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,YAAa,OAAM,KAAK,WAAW;AACvC,SAAO;AACT;AAEO,SAAS,eAAe,IAAoB;AACjD,MAAI,KAAK,KAAO;AACd,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAEA,QAAM,QAAQ,KAAK,MAAM,KAAK,IAAO;AACrC,QAAM,UAAU,KAAK,MAAO,KAAK,OAAW,GAAK;AACjD,QAAM,WAAY,KAAK,MAAS,KAAM,QAAQ,CAAC;AAE/C,MAAI,QAAQ,GAAG;AACb,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO;AAAA,EACzC;AACA,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,KAAK,OAAO;AAAA,EAC/B;AACA,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,aAAa,QAAwB;AACnD,SAAO,IAAI,KAAK,aAAa,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,uBAAuB;AAAA,EACzB,CAAC,EACE,OAAO,MAAM,EACb,YAAY;AACjB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,252 @@
1
+ const DEFAULT_CONFIG = {
2
+ weights: {
3
+ prefix: 0.35,
4
+ // Strong weight for prefix matching
5
+ substring: 0.2,
6
+ // Good for partial matches
7
+ abbreviation: 0.3,
8
+ // Key for "nde"→"node" cases
9
+ editDistance: 0.1,
10
+ // Typo tolerance
11
+ popularity: 0.05
12
+ // Slight bias for common commands
13
+ },
14
+ minScore: 10,
15
+ // Lower threshold for better matching
16
+ maxEditDistance: 2,
17
+ popularCommands: [
18
+ "node",
19
+ "npm",
20
+ "git",
21
+ "ls",
22
+ "cd",
23
+ "cat",
24
+ "grep",
25
+ "find",
26
+ "cp",
27
+ "mv",
28
+ "python",
29
+ "java",
30
+ "docker",
31
+ "curl",
32
+ "wget",
33
+ "vim",
34
+ "nano"
35
+ ]
36
+ };
37
+ class FuzzyMatcher {
38
+ config;
39
+ constructor(config = {}) {
40
+ this.config = { ...DEFAULT_CONFIG, ...config };
41
+ const weightSum = Object.values(this.config.weights).reduce((a, b) => a + b, 0);
42
+ if (Math.abs(weightSum - 1) > 0.01) {
43
+ Object.keys(this.config.weights).forEach((key) => {
44
+ this.config.weights[key] /= weightSum;
45
+ });
46
+ }
47
+ }
48
+ /**
49
+ * Calculate fuzzy match score for a candidate against a query
50
+ */
51
+ match(candidate, query) {
52
+ const text = candidate.toLowerCase();
53
+ const pattern = query.toLowerCase();
54
+ if (text === pattern) {
55
+ return { score: 1e3, algorithm: "exact", confidence: 1 };
56
+ }
57
+ if (text.startsWith(pattern)) {
58
+ return {
59
+ score: 900 + (10 - pattern.length),
60
+ algorithm: "prefix-exact",
61
+ confidence: 0.95
62
+ };
63
+ }
64
+ const scores = {
65
+ prefix: this.prefixScore(text, pattern),
66
+ substring: this.substringScore(text, pattern),
67
+ abbreviation: this.abbreviationScore(text, pattern),
68
+ editDistance: this.editDistanceScore(text, pattern),
69
+ popularity: this.popularityScore(text)
70
+ };
71
+ const rawScore = Object.entries(scores).reduce((total, [algorithm, score]) => {
72
+ const weight = this.config.weights[algorithm];
73
+ return total + score * weight;
74
+ }, 0);
75
+ const lengthPenalty = Math.max(0, text.length - 6) * 1.5;
76
+ const finalScore = Math.max(0, rawScore - lengthPenalty);
77
+ const maxAlgorithm = Object.entries(scores).reduce(
78
+ (max, [alg, score]) => score > max.score ? { algorithm: alg, score } : max,
79
+ { algorithm: "none", score: 0 }
80
+ );
81
+ const confidence = Math.min(1, finalScore / 100);
82
+ return {
83
+ score: finalScore,
84
+ algorithm: maxAlgorithm.algorithm,
85
+ confidence
86
+ };
87
+ }
88
+ /**
89
+ * Algorithm 1: Prefix Matching (like pinyin prefix)
90
+ * Handles cases like "nod" → "node"
91
+ */
92
+ prefixScore(text, pattern) {
93
+ if (!text.startsWith(pattern)) return 0;
94
+ const coverage = pattern.length / text.length;
95
+ return 100 * coverage;
96
+ }
97
+ /**
98
+ * Algorithm 2: Substring Matching (like pinyin contains)
99
+ * Handles cases like "ode" → "node", "py3" → "python3"
100
+ */
101
+ substringScore(text, pattern) {
102
+ const index = text.indexOf(pattern);
103
+ if (index !== -1) {
104
+ const positionFactor = Math.max(0, 10 - index) / 10;
105
+ const coverageFactor = pattern.length / text.length;
106
+ return 80 * positionFactor * coverageFactor;
107
+ }
108
+ const numMatch = pattern.match(/^(.+?)(\d+)$/);
109
+ if (numMatch) {
110
+ const [, prefix, num] = numMatch;
111
+ if (text.startsWith(prefix) && text.endsWith(num)) {
112
+ const coverageFactor = pattern.length / text.length;
113
+ return 70 * coverageFactor + 20;
114
+ }
115
+ }
116
+ return 0;
117
+ }
118
+ /**
119
+ * Algorithm 3: Abbreviation Matching (key innovation)
120
+ * Handles cases like "nde" → "node", "pyt3" → "python3", "gp5" → "gpt-5"
121
+ */
122
+ abbreviationScore(text, pattern) {
123
+ let score = 0;
124
+ let textPos = 0;
125
+ let perfectStart = false;
126
+ let consecutiveMatches = 0;
127
+ let wordBoundaryMatches = 0;
128
+ const textWords = text.split("-");
129
+ const textClean = text.replace(/-/g, "").toLowerCase();
130
+ for (let i = 0; i < pattern.length; i++) {
131
+ const char = pattern[i];
132
+ let charFound = false;
133
+ for (let j = textPos; j < textClean.length; j++) {
134
+ if (textClean[j] === char) {
135
+ charFound = true;
136
+ let originalPos = 0;
137
+ let cleanPos = 0;
138
+ for (let k = 0; k < text.length; k++) {
139
+ if (text[k] === "-") continue;
140
+ if (cleanPos === j) {
141
+ originalPos = k;
142
+ break;
143
+ }
144
+ cleanPos++;
145
+ }
146
+ if (j === textPos) {
147
+ consecutiveMatches++;
148
+ } else {
149
+ consecutiveMatches = 1;
150
+ }
151
+ if (i === 0 && j === 0) {
152
+ score += 50;
153
+ perfectStart = true;
154
+ } else if (originalPos === 0 || text[originalPos - 1] === "-") {
155
+ score += 35;
156
+ wordBoundaryMatches++;
157
+ } else if (j <= 2) {
158
+ score += 20;
159
+ } else if (j <= 6) {
160
+ score += 10;
161
+ } else {
162
+ score += 5;
163
+ }
164
+ if (consecutiveMatches > 1) {
165
+ score += consecutiveMatches * 5;
166
+ }
167
+ textPos = j + 1;
168
+ break;
169
+ }
170
+ }
171
+ if (!charFound) return 0;
172
+ }
173
+ if (perfectStart) score += 30;
174
+ if (wordBoundaryMatches >= 2) score += 25;
175
+ if (textPos <= textClean.length * 0.8) score += 15;
176
+ const lastPatternChar = pattern[pattern.length - 1];
177
+ const lastTextChar = text[text.length - 1];
178
+ if (/\d/.test(lastPatternChar) && lastPatternChar === lastTextChar) {
179
+ score += 25;
180
+ }
181
+ return score;
182
+ }
183
+ /**
184
+ * Algorithm 4: Edit Distance (typo tolerance)
185
+ * Handles cases like "noda" → "node"
186
+ */
187
+ editDistanceScore(text, pattern) {
188
+ if (pattern.length > text.length + this.config.maxEditDistance) return 0;
189
+ const dp = [];
190
+ const m = pattern.length;
191
+ const n = text.length;
192
+ for (let i = 0; i <= m; i++) {
193
+ dp[i] = [];
194
+ for (let j = 0; j <= n; j++) {
195
+ if (i === 0) dp[i][j] = j;
196
+ else if (j === 0) dp[i][j] = i;
197
+ else {
198
+ const cost = pattern[i - 1] === text[j - 1] ? 0 : 1;
199
+ dp[i][j] = Math.min(
200
+ dp[i - 1][j] + 1,
201
+ // deletion
202
+ dp[i][j - 1] + 1,
203
+ // insertion
204
+ dp[i - 1][j - 1] + cost
205
+ // substitution
206
+ );
207
+ }
208
+ }
209
+ }
210
+ const distance = dp[m][n];
211
+ if (distance > this.config.maxEditDistance) return 0;
212
+ return Math.max(0, 30 - distance * 10);
213
+ }
214
+ /**
215
+ * Algorithm 5: Command Popularity (like frequency in input method)
216
+ * Boost common commands that users frequently type
217
+ */
218
+ popularityScore(text) {
219
+ if (this.config.popularCommands.includes(text)) {
220
+ return 40;
221
+ }
222
+ if (text.length <= 5) return 10;
223
+ return 0;
224
+ }
225
+ /**
226
+ * Batch match multiple candidates and return sorted results
227
+ */
228
+ matchMany(candidates, query) {
229
+ return candidates.map((candidate) => ({
230
+ candidate,
231
+ result: this.match(candidate, query)
232
+ })).filter((item) => item.result.score >= this.config.minScore).sort((a, b) => b.result.score - a.result.score);
233
+ }
234
+ }
235
+ const defaultMatcher = new FuzzyMatcher();
236
+ function matchCommand(command, query) {
237
+ return defaultMatcher.match(command, query);
238
+ }
239
+ import { matchManyAdvanced } from "./advancedFuzzyMatcher.js";
240
+ function matchCommands(commands, query) {
241
+ return matchManyAdvanced(commands, query, 5).map((item) => ({
242
+ command: item.candidate,
243
+ score: item.score
244
+ }));
245
+ }
246
+ export {
247
+ FuzzyMatcher,
248
+ defaultMatcher,
249
+ matchCommand,
250
+ matchCommands
251
+ };
252
+ //# sourceMappingURL=fuzzyMatcher.js.map