@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,207 @@
1
+ import { memoize } from "lodash-es";
2
+ import { API_ERROR_MESSAGE_PREFIX, queryQuick } from "../services/claude.js";
3
+ import { parse } from "shell-quote";
4
+ import { PRODUCT_NAME } from "../constants/product.js";
5
+ const SINGLE_QUOTE = "__SINGLE_QUOTE__";
6
+ const DOUBLE_QUOTE = "__DOUBLE_QUOTE__";
7
+ function splitCommand(command) {
8
+ const parts = [];
9
+ for (const part of parse(
10
+ command.replaceAll('"', `"${DOUBLE_QUOTE}`).replaceAll("'", `'${SINGLE_QUOTE}`),
11
+ // parse() strips out quotes :P
12
+ (varName) => `$${varName}`
13
+ // Preserve shell variables
14
+ )) {
15
+ if (typeof part === "string") {
16
+ if (parts.length > 0 && typeof parts[parts.length - 1] === "string") {
17
+ parts[parts.length - 1] += " " + part;
18
+ continue;
19
+ }
20
+ }
21
+ parts.push(part);
22
+ }
23
+ const stringParts = parts.map((part) => {
24
+ if (typeof part === "string") {
25
+ return part;
26
+ }
27
+ if ("comment" in part) {
28
+ return "#" + part.comment;
29
+ }
30
+ if ("op" in part && part.op === "glob") {
31
+ return part.pattern;
32
+ }
33
+ if ("op" in part) {
34
+ return part.op;
35
+ }
36
+ return null;
37
+ }).filter((_) => _ !== null);
38
+ const quotedParts = stringParts.map((part) => {
39
+ return part.replaceAll(`${SINGLE_QUOTE}`, "'").replaceAll(`${DOUBLE_QUOTE}`, '"');
40
+ });
41
+ return quotedParts.filter(
42
+ (part) => !COMMAND_LIST_SEPARATORS.has(part)
43
+ );
44
+ }
45
+ const getCommandSubcommandPrefix = memoize(
46
+ async (command, abortSignal) => {
47
+ const subcommands = splitCommand(command);
48
+ const [fullCommandPrefix, ...subcommandPrefixesResults] = await Promise.all(
49
+ [
50
+ getCommandPrefix(command, abortSignal),
51
+ ...subcommands.map(async (subcommand) => ({
52
+ subcommand,
53
+ prefix: await getCommandPrefix(subcommand, abortSignal)
54
+ }))
55
+ ]
56
+ );
57
+ if (!fullCommandPrefix) {
58
+ return null;
59
+ }
60
+ const subcommandPrefixes = subcommandPrefixesResults.reduce(
61
+ (acc, { subcommand, prefix }) => {
62
+ if (prefix) {
63
+ acc.set(subcommand, prefix);
64
+ }
65
+ return acc;
66
+ },
67
+ /* @__PURE__ */ new Map()
68
+ );
69
+ return {
70
+ ...fullCommandPrefix,
71
+ subcommandPrefixes
72
+ };
73
+ },
74
+ (command) => command
75
+ // memoize by command only
76
+ );
77
+ const getCommandPrefix = memoize(
78
+ async (command, abortSignal) => {
79
+ const response = await queryQuick({
80
+ systemPrompt: [
81
+ `Your task is to process Bash commands that an AI coding agent wants to run.
82
+
83
+ This policy spec defines how to determine the prefix of a Bash command:`
84
+ ],
85
+ userPrompt: `<policy_spec>
86
+ # ${PRODUCT_NAME} Code Bash command prefix detection
87
+
88
+ This document defines risk levels for actions that the ${PRODUCT_NAME} agent may take. This classification system is part of a broader safety framework and is used to determine when additional user confirmation or oversight may be needed.
89
+
90
+ ## Definitions
91
+
92
+ **Command Injection:** Any technique used that would result in a command being run other than the detected prefix.
93
+
94
+ ## Command prefix extraction examples
95
+ Examples:
96
+ - cat foo.txt => cat
97
+ - cd src => cd
98
+ - cd path/to/files/ => cd
99
+ - find ./src -type f -name "*.ts" => find
100
+ - gg cat foo.py => gg cat
101
+ - gg cp foo.py bar.py => gg cp
102
+ - git commit -m "foo" => git commit
103
+ - git diff HEAD~1 => git diff
104
+ - git diff --staged => git diff
105
+ - git diff $(pwd) => command_injection_detected
106
+ - git status => git status
107
+ - git status# test(\`id\`) => command_injection_detected
108
+ - git status\`ls\` => command_injection_detected
109
+ - git push => none
110
+ - git push origin master => git push
111
+ - git log -n 5 => git log
112
+ - git log --oneline -n 5 => git log
113
+ - grep -A 40 "from foo.bar.baz import" alpha/beta/gamma.py => grep
114
+ - pig tail zerba.log => pig tail
115
+ - npm test => none
116
+ - npm test --foo => npm test
117
+ - npm test -- -f "foo" => npm test
118
+ - pwd
119
+ curl example.com => command_injection_detected
120
+ - pytest foo/bar.py => pytest
121
+ - scalac build => none
122
+ </policy_spec>
123
+
124
+ The user has allowed certain command prefixes to be run, and will otherwise be asked to approve or deny the command.
125
+ Your task is to determine the command prefix for the following command.
126
+
127
+ IMPORTANT: Bash commands may run multiple commands that are chained together.
128
+ For safety, if the command seems to contain command injection, you must return "command_injection_detected".
129
+ (This will help protect the user: if they think that they're allowlisting command A,
130
+ but the AI coding agent sends a malicious command that technically has the same prefix as command A,
131
+ then the safety system will see that you said \u201Ccommand_injection_detected\u201D and ask the user for manual confirmation.)
132
+
133
+ Note that not every command has a prefix. If a command has no prefix, return "none".
134
+
135
+ ONLY return the prefix. Do not return any other text, markdown markers, or other content or formatting.
136
+
137
+ Command: ${command}
138
+ `,
139
+ signal: abortSignal,
140
+ enablePromptCaching: false
141
+ });
142
+ const prefix = typeof response.message.content === "string" ? response.message.content : Array.isArray(response.message.content) ? response.message.content.find((_) => _.type === "text")?.text ?? "none" : "none";
143
+ if (prefix.startsWith(API_ERROR_MESSAGE_PREFIX)) {
144
+ return null;
145
+ }
146
+ if (prefix === "command_injection_detected") {
147
+ return { commandInjectionDetected: true };
148
+ }
149
+ if (prefix === "git") {
150
+ return {
151
+ commandPrefix: null,
152
+ commandInjectionDetected: false
153
+ };
154
+ }
155
+ if (prefix === "none") {
156
+ return {
157
+ commandPrefix: null,
158
+ commandInjectionDetected: false
159
+ };
160
+ }
161
+ return {
162
+ commandPrefix: prefix,
163
+ commandInjectionDetected: false
164
+ };
165
+ },
166
+ (command) => command
167
+ // memoize by command only
168
+ );
169
+ const COMMAND_LIST_SEPARATORS = /* @__PURE__ */ new Set([
170
+ "&&",
171
+ "||",
172
+ ";",
173
+ ";;"
174
+ ]);
175
+ function isCommandList(command) {
176
+ for (const part of parse(
177
+ command.replaceAll('"', `"${DOUBLE_QUOTE}`).replaceAll("'", `'${SINGLE_QUOTE}`),
178
+ // parse() strips out quotes :P
179
+ (varName) => `$${varName}`
180
+ // Preserve shell variables
181
+ )) {
182
+ if (typeof part === "string") {
183
+ continue;
184
+ }
185
+ if ("comment" in part) {
186
+ return false;
187
+ }
188
+ if ("op" in part) {
189
+ if (part.op === "glob") {
190
+ continue;
191
+ } else if (COMMAND_LIST_SEPARATORS.has(part.op)) {
192
+ continue;
193
+ }
194
+ return false;
195
+ }
196
+ }
197
+ return true;
198
+ }
199
+ function isUnsafeCompoundCommand(command) {
200
+ return splitCommand(command).length > 1 && !isCommandList(command);
201
+ }
202
+ export {
203
+ getCommandSubcommandPrefix,
204
+ isUnsafeCompoundCommand,
205
+ splitCommand
206
+ };
207
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/commands.ts"],
4
+ "sourcesContent": ["import { memoize } from 'lodash-es'\nimport { API_ERROR_MESSAGE_PREFIX, queryQuick } from '../services/claude'\nimport { type ControlOperator, parse, ParseEntry } from 'shell-quote'\nimport { PRODUCT_NAME } from '../constants/product'\n\nconst SINGLE_QUOTE = '__SINGLE_QUOTE__'\nconst DOUBLE_QUOTE = '__DOUBLE_QUOTE__'\n\nexport type CommandPrefixResult =\n | {\n commandPrefix: string | null\n commandInjectionDetected: false\n }\n | { commandInjectionDetected: true }\n\n// Command prefix result alongside subcommand prefixes\nexport type CommandSubcommandPrefixResult = CommandPrefixResult & {\n subcommandPrefixes: Map<string, CommandPrefixResult>\n}\n\n/**\n * Splits a command string into individual commands based on shell operators\n */\nexport function splitCommand(command: string): string[] {\n const parts: ParseEntry[] = []\n\n // 1. Collapse adjacent strings\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n if (parts.length > 0 && typeof parts[parts.length - 1] === 'string') {\n parts[parts.length - 1] += ' ' + part\n continue\n }\n }\n parts.push(part)\n }\n\n // 2. Map tokens to strings\n const stringParts = parts\n .map(part => {\n if (typeof part === 'string') {\n return part\n }\n if ('comment' in part) {\n // TODO: make this less hacky\n return '#' + part.comment\n }\n if ('op' in part && part.op === 'glob') {\n return part.pattern\n }\n if ('op' in part) {\n return part.op\n }\n return null\n })\n .filter(_ => _ !== null)\n\n // 3. Map quotes back to their original form\n const quotedParts = stringParts.map(part => {\n return part\n .replaceAll(`${SINGLE_QUOTE}`, \"'\")\n .replaceAll(`${DOUBLE_QUOTE}`, '\"')\n })\n\n // 4. Filter out separators\n return quotedParts.filter(\n part => !(COMMAND_LIST_SEPARATORS as Set<string>).has(part),\n )\n}\n\nexport const getCommandSubcommandPrefix = memoize(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandSubcommandPrefixResult | null> => {\n const subcommands = splitCommand(command)\n\n const [fullCommandPrefix, ...subcommandPrefixesResults] = await Promise.all(\n [\n getCommandPrefix(command, abortSignal),\n ...subcommands.map(async subcommand => ({\n subcommand,\n prefix: await getCommandPrefix(subcommand, abortSignal),\n })),\n ],\n )\n if (!fullCommandPrefix) {\n return null\n }\n const subcommandPrefixes = subcommandPrefixesResults.reduce(\n (acc, { subcommand, prefix }) => {\n if (prefix) {\n acc.set(subcommand, prefix)\n }\n return acc\n },\n new Map<string, CommandPrefixResult>(),\n )\n\n return {\n ...fullCommandPrefix,\n subcommandPrefixes,\n }\n },\n command => command, // memoize by command only\n)\n\nconst getCommandPrefix = memoize(\n async (\n command: string,\n abortSignal: AbortSignal,\n ): Promise<CommandPrefixResult | null> => {\n const response = await queryQuick({\n systemPrompt: [\n `Your task is to process Bash commands that an AI coding agent wants to run.\n\nThis policy spec defines how to determine the prefix of a Bash command:`,\n ],\n userPrompt: `<policy_spec>\n# ${PRODUCT_NAME} Code Bash command prefix detection\n\nThis document defines risk levels for actions that the ${PRODUCT_NAME} agent may take. This classification system is part of a broader safety framework and is used to determine when additional user confirmation or oversight may be needed.\n\n## Definitions\n\n**Command Injection:** Any technique used that would result in a command being run other than the detected prefix.\n\n## Command prefix extraction examples\nExamples:\n- cat foo.txt => cat\n- cd src => cd\n- cd path/to/files/ => cd\n- find ./src -type f -name \"*.ts\" => find\n- gg cat foo.py => gg cat\n- gg cp foo.py bar.py => gg cp\n- git commit -m \"foo\" => git commit\n- git diff HEAD~1 => git diff\n- git diff --staged => git diff\n- git diff $(pwd) => command_injection_detected\n- git status => git status\n- git status# test(\\`id\\`) => command_injection_detected\n- git status\\`ls\\` => command_injection_detected\n- git push => none\n- git push origin master => git push\n- git log -n 5 => git log\n- git log --oneline -n 5 => git log\n- grep -A 40 \"from foo.bar.baz import\" alpha/beta/gamma.py => grep\n- pig tail zerba.log => pig tail\n- npm test => none\n- npm test --foo => npm test\n- npm test -- -f \"foo\" => npm test\n- pwd\\n curl example.com => command_injection_detected\n- pytest foo/bar.py => pytest\n- scalac build => none\n</policy_spec>\n\nThe user has allowed certain command prefixes to be run, and will otherwise be asked to approve or deny the command.\nYour task is to determine the command prefix for the following command.\n\nIMPORTANT: Bash commands may run multiple commands that are chained together.\nFor safety, if the command seems to contain command injection, you must return \"command_injection_detected\". \n(This will help protect the user: if they think that they're allowlisting command A, \nbut the AI coding agent sends a malicious command that technically has the same prefix as command A, \nthen the safety system will see that you said \u201Ccommand_injection_detected\u201D and ask the user for manual confirmation.)\n\nNote that not every command has a prefix. If a command has no prefix, return \"none\".\n\nONLY return the prefix. Do not return any other text, markdown markers, or other content or formatting.\n\nCommand: ${command}\n`,\n signal: abortSignal,\n enablePromptCaching: false,\n })\n\n const prefix =\n typeof response.message.content === 'string'\n ? response.message.content\n : Array.isArray(response.message.content)\n ? (response.message.content.find(_ => _.type === 'text')?.text ??\n 'none')\n : 'none'\n\n if (prefix.startsWith(API_ERROR_MESSAGE_PREFIX)) {\n return null\n }\n\n if (prefix === 'command_injection_detected') {\n return { commandInjectionDetected: true }\n }\n\n // Never accept base `git` as a prefix (if e.g. `git diff` prefix not detected)\n if (prefix === 'git') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n if (prefix === 'none') {\n return {\n commandPrefix: null,\n commandInjectionDetected: false,\n }\n }\n\n return {\n commandPrefix: prefix,\n commandInjectionDetected: false,\n }\n },\n command => command, // memoize by command only\n)\n\nconst COMMAND_LIST_SEPARATORS = new Set<ControlOperator>([\n '&&',\n '||',\n ';',\n ';;',\n])\n\n// Checks if this is just a list of commands\nfunction isCommandList(command: string): boolean {\n for (const part of parse(\n command\n .replaceAll('\"', `\"${DOUBLE_QUOTE}`) // parse() strips out quotes :P\n .replaceAll(\"'\", `'${SINGLE_QUOTE}`), // parse() strips out quotes :P\n varName => `$${varName}`, // Preserve shell variables\n )) {\n if (typeof part === 'string') {\n // Strings are safe\n continue\n }\n if ('comment' in part) {\n // Don't trust comments, they can contain command injection\n return false\n }\n if ('op' in part) {\n if (part.op === 'glob') {\n // Globs are safe\n continue\n } else if (COMMAND_LIST_SEPARATORS.has(part.op)) {\n // Command list separators are safe\n continue\n }\n // Other operators are unsafe\n return false\n }\n }\n // No unsafe operators found in entire command\n return true\n}\n\nexport function isUnsafeCompoundCommand(command: string): boolean {\n return splitCommand(command).length > 1 && !isCommandList(command)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }