@shareai-lab/kode 1.1.12 → 1.1.14

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 +83 -57
  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,216 @@
1
+ import { Box, Text } from "ink";
2
+ import * as React from "react";
3
+ import { z } from "zod";
4
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
5
+ import { setTodos, getTodos } from "../../utils/todoStorage.js";
6
+ import { emitReminderEvent } from "../../services/systemReminder.js";
7
+ import { startWatchingTodoFile } from "../../services/fileFreshness.js";
8
+ import { DESCRIPTION, PROMPT } from "./prompt.js";
9
+ import { getTheme } from "../../utils/theme.js";
10
+ const TodoItemSchema = z.object({
11
+ content: z.string().min(1).describe("The task description or content"),
12
+ status: z.enum(["pending", "in_progress", "completed"]).describe("Current status of the task"),
13
+ priority: z.enum(["high", "medium", "low"]).describe("Priority level of the task"),
14
+ id: z.string().min(1).describe("Unique identifier for the task")
15
+ });
16
+ const inputSchema = z.strictObject({
17
+ todos: z.array(TodoItemSchema).describe("The updated todo list")
18
+ });
19
+ function validateTodos(todos) {
20
+ const ids = todos.map((todo) => todo.id);
21
+ const uniqueIds = new Set(ids);
22
+ if (ids.length !== uniqueIds.size) {
23
+ return {
24
+ result: false,
25
+ errorCode: 1,
26
+ message: "Duplicate todo IDs found",
27
+ meta: {
28
+ duplicateIds: ids.filter((id, index) => ids.indexOf(id) !== index)
29
+ }
30
+ };
31
+ }
32
+ const inProgressTasks = todos.filter((todo) => todo.status === "in_progress");
33
+ if (inProgressTasks.length > 1) {
34
+ return {
35
+ result: false,
36
+ errorCode: 2,
37
+ message: "Only one task can be in_progress at a time",
38
+ meta: { inProgressTaskIds: inProgressTasks.map((t) => t.id) }
39
+ };
40
+ }
41
+ for (const todo of todos) {
42
+ if (!todo.content?.trim()) {
43
+ return {
44
+ result: false,
45
+ errorCode: 3,
46
+ message: `Todo with ID "${todo.id}" has empty content`,
47
+ meta: { todoId: todo.id }
48
+ };
49
+ }
50
+ if (!["pending", "in_progress", "completed"].includes(todo.status)) {
51
+ return {
52
+ result: false,
53
+ errorCode: 4,
54
+ message: `Invalid status "${todo.status}" for todo "${todo.id}"`,
55
+ meta: { todoId: todo.id, invalidStatus: todo.status }
56
+ };
57
+ }
58
+ if (!["high", "medium", "low"].includes(todo.priority)) {
59
+ return {
60
+ result: false,
61
+ errorCode: 5,
62
+ message: `Invalid priority "${todo.priority}" for todo "${todo.id}"`,
63
+ meta: { todoId: todo.id, invalidPriority: todo.priority }
64
+ };
65
+ }
66
+ }
67
+ return { result: true };
68
+ }
69
+ function generateTodoSummary(todos) {
70
+ const stats = {
71
+ total: todos.length,
72
+ pending: todos.filter((t) => t.status === "pending").length,
73
+ inProgress: todos.filter((t) => t.status === "in_progress").length,
74
+ completed: todos.filter((t) => t.status === "completed").length
75
+ };
76
+ let summary = `Updated ${stats.total} todo(s)`;
77
+ if (stats.total > 0) {
78
+ summary += ` (${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed)`;
79
+ }
80
+ summary += ". Continue tracking your progress with the todo list.";
81
+ return summary;
82
+ }
83
+ const TodoWriteTool = {
84
+ name: "TodoWrite",
85
+ async description() {
86
+ return DESCRIPTION;
87
+ },
88
+ async prompt() {
89
+ return PROMPT;
90
+ },
91
+ inputSchema,
92
+ userFacingName() {
93
+ return "Update Todos";
94
+ },
95
+ async isEnabled() {
96
+ return true;
97
+ },
98
+ isReadOnly() {
99
+ return false;
100
+ },
101
+ isConcurrencySafe() {
102
+ return false;
103
+ },
104
+ needsPermissions() {
105
+ return false;
106
+ },
107
+ renderResultForAssistant(result) {
108
+ return "Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable";
109
+ },
110
+ renderToolUseMessage(input, { verbose }) {
111
+ return "{ params.todo }";
112
+ },
113
+ renderToolUseRejectedMessage() {
114
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
115
+ },
116
+ renderToolResultMessage(output) {
117
+ const isError = typeof output === "string" && output.startsWith("Error");
118
+ if (!isError && typeof output === "string") {
119
+ const currentTodos = getTodos();
120
+ if (currentTodos.length === 0) {
121
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: "#6B7280" }, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: "#9CA3AF" }, "No todos currently")));
122
+ }
123
+ const sortedTodos = [...currentTodos].sort((a, b) => {
124
+ const order = ["completed", "in_progress", "pending"];
125
+ return order.indexOf(a.status) - order.indexOf(b.status) || a.content.localeCompare(b.content);
126
+ });
127
+ const nextPendingIndex = sortedTodos.findIndex((todo) => todo.status === "pending");
128
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%" }, sortedTodos.map((todo, index) => {
129
+ let checkbox;
130
+ let textColor;
131
+ let isBold = false;
132
+ let isStrikethrough = false;
133
+ if (todo.status === "completed") {
134
+ checkbox = "\u2612";
135
+ textColor = "#6B7280";
136
+ isStrikethrough = true;
137
+ } else if (todo.status === "in_progress") {
138
+ checkbox = "\u2610";
139
+ textColor = "#10B981";
140
+ isBold = true;
141
+ } else if (todo.status === "pending") {
142
+ checkbox = "\u2610";
143
+ if (index === nextPendingIndex) {
144
+ textColor = "#8B5CF6";
145
+ isBold = true;
146
+ } else {
147
+ textColor = "#9CA3AF";
148
+ }
149
+ }
150
+ return /* @__PURE__ */ React.createElement(Box, { key: todo.id || index, flexDirection: "row", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Text, { color: "#6B7280" }, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", flexGrow: 1 }, /* @__PURE__ */ React.createElement(Text, { color: textColor, bold: isBold, strikethrough: isStrikethrough }, checkbox), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, { color: textColor, bold: isBold, strikethrough: isStrikethrough }, todo.content)));
151
+ }));
152
+ }
153
+ return /* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between", overflowX: "hidden", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, { color: isError ? getTheme().error : getTheme().success }, "\xA0\xA0\u23BF \xA0", typeof output === "string" ? output : JSON.stringify(output))));
154
+ },
155
+ async validateInput({ todos }) {
156
+ const todoItems = todos;
157
+ const validation = validateTodos(todoItems);
158
+ if (!validation.result) {
159
+ return validation;
160
+ }
161
+ return { result: true };
162
+ },
163
+ async *call({ todos }, context) {
164
+ try {
165
+ const agentId = context?.agentId;
166
+ if (agentId) {
167
+ startWatchingTodoFile(agentId);
168
+ }
169
+ const previousTodos = getTodos(agentId);
170
+ const todoItems = todos;
171
+ setTodos(todoItems, agentId);
172
+ const hasChanged = JSON.stringify(previousTodos) !== JSON.stringify(todoItems);
173
+ if (hasChanged) {
174
+ emitReminderEvent("todo:changed", {
175
+ previousTodos,
176
+ newTodos: todoItems,
177
+ timestamp: Date.now(),
178
+ agentId: agentId || "default",
179
+ changeType: todoItems.length > previousTodos.length ? "added" : todoItems.length < previousTodos.length ? "removed" : "modified"
180
+ });
181
+ }
182
+ const summary = generateTodoSummary(todoItems);
183
+ const resultData = {
184
+ oldTodos: previousTodos,
185
+ newTodos: todoItems,
186
+ summary
187
+ };
188
+ yield {
189
+ type: "result",
190
+ data: summary,
191
+ // Return string to satisfy interface
192
+ resultForAssistant: summary
193
+ // Store todo data in a way accessible to the renderer
194
+ // We'll modify the renderToolResultMessage to get todos from storage
195
+ };
196
+ } catch (error) {
197
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
198
+ const errorResult = `Error updating todos: ${errorMessage}`;
199
+ emitReminderEvent("todo:error", {
200
+ error: errorMessage,
201
+ timestamp: Date.now(),
202
+ agentId: context?.agentId || "default",
203
+ context: "TodoWriteTool.call"
204
+ });
205
+ yield {
206
+ type: "result",
207
+ data: errorResult,
208
+ resultForAssistant: errorResult
209
+ };
210
+ }
211
+ }
212
+ };
213
+ export {
214
+ TodoWriteTool
215
+ };
216
+ //# sourceMappingURL=TodoWriteTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TodoWriteTool/TodoWriteTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'\nimport { TodoItem as TodoItemComponent } from '../../components/TodoItem'\nimport { Tool, ValidationResult } from '../../Tool'\nimport { setTodos, getTodos, TodoItem } from '../../utils/todoStorage'\nimport { emitReminderEvent } from '../../services/systemReminder'\nimport { startWatchingTodoFile } from '../../services/fileFreshness'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '../../utils/theme'\n\nconst TodoItemSchema = z.object({\n content: z.string().min(1).describe('The task description or content'),\n status: z\n .enum(['pending', 'in_progress', 'completed'])\n .describe('Current status of the task'),\n priority: z\n .enum(['high', 'medium', 'low'])\n .describe('Priority level of the task'),\n id: z.string().min(1).describe('Unique identifier for the task'),\n})\n\nconst inputSchema = z.strictObject({\n todos: z.array(TodoItemSchema).describe('The updated todo list'),\n})\n\nfunction validateTodos(todos: TodoItem[]): ValidationResult {\n // Check for duplicate IDs\n const ids = todos.map(todo => todo.id)\n const uniqueIds = new Set(ids)\n if (ids.length !== uniqueIds.size) {\n return {\n result: false,\n errorCode: 1,\n message: 'Duplicate todo IDs found',\n meta: {\n duplicateIds: ids.filter((id, index) => ids.indexOf(id) !== index),\n },\n }\n }\n\n // Check for multiple in_progress tasks\n const inProgressTasks = todos.filter(todo => todo.status === 'in_progress')\n if (inProgressTasks.length > 1) {\n return {\n result: false,\n errorCode: 2,\n message: 'Only one task can be in_progress at a time',\n meta: { inProgressTaskIds: inProgressTasks.map(t => t.id) },\n }\n }\n\n // Validate each todo\n for (const todo of todos) {\n if (!todo.content?.trim()) {\n return {\n result: false,\n errorCode: 3,\n message: `Todo with ID \"${todo.id}\" has empty content`,\n meta: { todoId: todo.id },\n }\n }\n if (!['pending', 'in_progress', 'completed'].includes(todo.status)) {\n return {\n result: false,\n errorCode: 4,\n message: `Invalid status \"${todo.status}\" for todo \"${todo.id}\"`,\n meta: { todoId: todo.id, invalidStatus: todo.status },\n }\n }\n if (!['high', 'medium', 'low'].includes(todo.priority)) {\n return {\n result: false,\n errorCode: 5,\n message: `Invalid priority \"${todo.priority}\" for todo \"${todo.id}\"`,\n meta: { todoId: todo.id, invalidPriority: todo.priority },\n }\n }\n }\n\n return { result: true }\n}\n\nfunction generateTodoSummary(todos: TodoItem[]): string {\n const stats = {\n total: todos.length,\n pending: todos.filter(t => t.status === 'pending').length,\n inProgress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n }\n\n // Enhanced summary with statistics\n let summary = `Updated ${stats.total} todo(s)`\n if (stats.total > 0) {\n summary += ` (${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed)`\n }\n summary += '. Continue tracking your progress with the todo list.'\n\n return summary\n}\n\nexport const TodoWriteTool = {\n name: 'TodoWrite',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Update Todos'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false // TodoWrite modifies state, not safe for concurrent execution\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(result) {\n // Match official implementation - return static confirmation message\n return 'Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable'\n },\n renderToolUseMessage(input, { verbose }) {\n // Show a simple confirmation message when the tool is being used\n return '{ params.todo }'\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output) {\n const isError = typeof output === 'string' && output.startsWith('Error')\n\n // For non-error output, get current todos from storage and render them\n if (!isError && typeof output === 'string') {\n const currentTodos = getTodos()\n \n if (currentTodos.length === 0) {\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text color=\"#6B7280\">&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color=\"#9CA3AF\">No todos currently</Text>\n </Box>\n </Box>\n )\n }\n\n // Sort: [completed, in_progress, pending]\n const sortedTodos = [...currentTodos].sort((a, b) => {\n const order = ['completed', 'in_progress', 'pending']\n return (\n order.indexOf(a.status) - order.indexOf(b.status) ||\n a.content.localeCompare(b.content)\n )\n })\n\n // Find the next pending task (first pending task after sorting)\n const nextPendingIndex = sortedTodos.findIndex(todo => todo.status === 'pending')\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n {sortedTodos.map((todo: TodoItem, index: number) => {\n // Determine checkbox symbol and colors\n let checkbox: string\n let textColor: string\n let isBold = false\n let isStrikethrough = false\n\n if (todo.status === 'completed') {\n checkbox = '\u2612'\n textColor = '#6B7280' // Professional gray for completed\n isStrikethrough = true\n } else if (todo.status === 'in_progress') {\n checkbox = '\u2610'\n textColor = '#10B981' // Professional green for in progress\n isBold = true\n } else if (todo.status === 'pending') {\n checkbox = '\u2610'\n // Only the FIRST pending task gets purple highlight\n if (index === nextPendingIndex) {\n textColor = '#8B5CF6' // Professional purple for next pending\n isBold = true\n } else {\n textColor = '#9CA3AF' // Muted gray for other pending\n }\n }\n\n return (\n <Box key={todo.id || index} flexDirection=\"row\" marginBottom={0}>\n <Text color=\"#6B7280\">&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Box flexDirection=\"row\" flexGrow={1}>\n <Text color={textColor} bold={isBold} strikethrough={isStrikethrough}>\n {checkbox}\n </Text>\n <Text> </Text>\n <Text color={textColor} bold={isBold} strikethrough={isStrikethrough}>\n {todo.content}\n </Text>\n </Box>\n </Box>\n )\n })}\n </Box>\n )\n }\n\n // Fallback to simple text rendering for errors or string output\n return (\n <Box justifyContent=\"space-between\" overflowX=\"hidden\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text color={isError ? getTheme().error : getTheme().success}>\n &nbsp;&nbsp;\u23BF &nbsp;\n {typeof output === 'string' ? output : JSON.stringify(output)}\n </Text>\n </Box>\n </Box>\n )\n },\n async validateInput({ todos }: z.infer<typeof inputSchema>) {\n // Type assertion to ensure todos match TodoItem[] interface\n const todoItems = todos as TodoItem[]\n const validation = validateTodos(todoItems)\n if (!validation.result) {\n return validation\n }\n return { result: true }\n },\n async *call({ todos }: z.infer<typeof inputSchema>, context) {\n try {\n // Get agent ID from context\n const agentId = context?.agentId\n\n // Start watching todo file for this agent if not already watching\n if (agentId) {\n startWatchingTodoFile(agentId)\n }\n\n // Store previous todos for comparison (agent-scoped)\n const previousTodos = getTodos(agentId)\n\n // Type assertion to ensure todos match TodoItem[] interface\n const todoItems = todos as TodoItem[]\n\n // Note: Validation already done in validateInput, no need for duplicate validation\n // This eliminates the double validation issue\n\n // Update the todos in storage (agent-scoped)\n setTodos(todoItems, agentId)\n\n // Emit todo change event for system reminders (optimized - only if todos actually changed)\n const hasChanged =\n JSON.stringify(previousTodos) !== JSON.stringify(todoItems)\n if (hasChanged) {\n emitReminderEvent('todo:changed', {\n previousTodos,\n newTodos: todoItems,\n timestamp: Date.now(),\n agentId: agentId || 'default',\n changeType:\n todoItems.length > previousTodos.length\n ? 'added'\n : todoItems.length < previousTodos.length\n ? 'removed'\n : 'modified',\n })\n }\n\n // Generate enhanced summary\n const summary = generateTodoSummary(todoItems)\n\n // Enhanced result data for rendering\n const resultData = {\n oldTodos: previousTodos,\n newTodos: todoItems,\n summary,\n }\n\n yield {\n type: 'result',\n data: summary, // Return string to satisfy interface\n resultForAssistant: summary,\n // Store todo data in a way accessible to the renderer\n // We'll modify the renderToolResultMessage to get todos from storage\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n const errorResult = `Error updating todos: ${errorMessage}`\n\n // Emit error event for system monitoring\n emitReminderEvent('todo:error', {\n error: errorMessage,\n timestamp: Date.now(),\n agentId: context?.agentId || 'default',\n context: 'TodoWriteTool.call',\n })\n\n yield {\n type: 'result',\n data: errorResult,\n resultForAssistant: errorResult,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, string>\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAG/C,SAAS,UAAU,gBAA0B;AAC7C,SAAS,yBAAyB;AAClC,SAAS,6BAA6B;AACtC,SAAS,aAAa,cAAc;AACpC,SAAS,gBAAgB;AAEzB,MAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,iCAAiC;AAAA,EACrE,QAAQ,EACL,KAAK,CAAC,WAAW,eAAe,WAAW,CAAC,EAC5C,SAAS,4BAA4B;AAAA,EACxC,UAAU,EACP,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,EAC9B,SAAS,4BAA4B;AAAA,EACxC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,gCAAgC;AACjE,CAAC;AAED,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,OAAO,EAAE,MAAM,cAAc,EAAE,SAAS,uBAAuB;AACjE,CAAC;AAED,SAAS,cAAc,OAAqC;AAE1D,QAAM,MAAM,MAAM,IAAI,UAAQ,KAAK,EAAE;AACrC,QAAM,YAAY,IAAI,IAAI,GAAG;AAC7B,MAAI,IAAI,WAAW,UAAU,MAAM;AACjC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,MACT,MAAM;AAAA,QACJ,cAAc,IAAI,OAAO,CAAC,IAAI,UAAU,IAAI,QAAQ,EAAE,MAAM,KAAK;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM,OAAO,UAAQ,KAAK,WAAW,aAAa;AAC1E,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,MACT,MAAM,EAAE,mBAAmB,gBAAgB,IAAI,OAAK,EAAE,EAAE,EAAE;AAAA,IAC5D;AAAA,EACF;AAGA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,KAAK,GAAG;AACzB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS,iBAAiB,KAAK,EAAE;AAAA,QACjC,MAAM,EAAE,QAAQ,KAAK,GAAG;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,CAAC,CAAC,WAAW,eAAe,WAAW,EAAE,SAAS,KAAK,MAAM,GAAG;AAClE,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS,mBAAmB,KAAK,MAAM,eAAe,KAAK,EAAE;AAAA,QAC7D,MAAM,EAAE,QAAQ,KAAK,IAAI,eAAe,KAAK,OAAO;AAAA,MACtD;AAAA,IACF;AACA,QAAI,CAAC,CAAC,QAAQ,UAAU,KAAK,EAAE,SAAS,KAAK,QAAQ,GAAG;AACtD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS,qBAAqB,KAAK,QAAQ,eAAe,KAAK,EAAE;AAAA,QACjE,MAAM,EAAE,QAAQ,KAAK,IAAI,iBAAiB,KAAK,SAAS;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,KAAK;AACxB;AAEA,SAAS,oBAAoB,OAA2B;AACtD,QAAM,QAAQ;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,IACnD,YAAY,MAAM,OAAO,OAAK,EAAE,WAAW,aAAa,EAAE;AAAA,IAC1D,WAAW,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,EACzD;AAGA,MAAI,UAAU,WAAW,MAAM,KAAK;AACpC,MAAI,MAAM,QAAQ,GAAG;AACnB,eAAW,KAAK,MAAM,OAAO,aAAa,MAAM,UAAU,iBAAiB,MAAM,SAAS;AAAA,EAC5F;AACA,aAAW;AAEX,SAAO;AACT;AAEO,MAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAQ;AAE/B,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAO,EAAE,QAAQ,GAAG;AAEvC,WAAO;AAAA,EACT;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAQ;AAC9B,UAAM,UAAU,OAAO,WAAW,YAAY,OAAO,WAAW,OAAO;AAGvE,QAAI,CAAC,WAAW,OAAO,WAAW,UAAU;AAC1C,YAAM,eAAe,SAAS;AAE9B,UAAI,aAAa,WAAW,GAAG;AAC7B,eACE,oCAAC,OAAI,eAAc,UAAS,OAAM,UAChC,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAM,aAAU,qBAAoB,GAC1C,oCAAC,QAAK,OAAM,aAAU,oBAAkB,CAC1C,CACF;AAAA,MAEJ;AAGA,YAAM,cAAc,CAAC,GAAG,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM;AACnD,cAAM,QAAQ,CAAC,aAAa,eAAe,SAAS;AACpD,eACE,MAAM,QAAQ,EAAE,MAAM,IAAI,MAAM,QAAQ,EAAE,MAAM,KAChD,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,MAErC,CAAC;AAGD,YAAM,mBAAmB,YAAY,UAAU,UAAQ,KAAK,WAAW,SAAS;AAEhF,aACE,oCAAC,OAAI,eAAc,UAAS,OAAM,UAC/B,YAAY,IAAI,CAAC,MAAgB,UAAkB;AAElD,YAAI;AACJ,YAAI;AACJ,YAAI,SAAS;AACb,YAAI,kBAAkB;AAEtB,YAAI,KAAK,WAAW,aAAa;AAC/B,qBAAW;AACX,sBAAY;AACZ,4BAAkB;AAAA,QACpB,WAAW,KAAK,WAAW,eAAe;AACxC,qBAAW;AACX,sBAAY;AACZ,mBAAS;AAAA,QACX,WAAW,KAAK,WAAW,WAAW;AACpC,qBAAW;AAEX,cAAI,UAAU,kBAAkB;AAC9B,wBAAY;AACZ,qBAAS;AAAA,UACX,OAAO;AACL,wBAAY;AAAA,UACd;AAAA,QACF;AAEA,eACE,oCAAC,OAAI,KAAK,KAAK,MAAM,OAAO,eAAc,OAAM,cAAc,KAC5D,oCAAC,QAAK,OAAM,aAAU,qBAAoB,GAC1C,oCAAC,OAAI,eAAc,OAAM,UAAU,KACjC,oCAAC,QAAK,OAAO,WAAW,MAAM,QAAQ,eAAe,mBAClD,QACH,GACA,oCAAC,YAAK,GAAC,GACP,oCAAC,QAAK,OAAO,WAAW,MAAM,QAAQ,eAAe,mBAClD,KAAK,OACR,CACF,CACF;AAAA,MAEJ,CAAC,CACH;AAAA,IAEJ;AAGA,WACE,oCAAC,OAAI,gBAAe,iBAAgB,WAAU,UAAS,OAAM,UAC3D,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,UAAU,SAAS,EAAE,QAAQ,SAAS,EAAE,WAAS,uBAE3D,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM,CAC9D,CACF,CACF;AAAA,EAEJ;AAAA,EACA,MAAM,cAAc,EAAE,MAAM,GAAgC;AAE1D,UAAM,YAAY;AAClB,UAAM,aAAa,cAAc,SAAS;AAC1C,QAAI,CAAC,WAAW,QAAQ;AACtB,aAAO;AAAA,IACT;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,EAAE,MAAM,GAAgC,SAAS;AAC3D,QAAI;AAEF,YAAM,UAAU,SAAS;AAGzB,UAAI,SAAS;AACX,8BAAsB,OAAO;AAAA,MAC/B;AAGA,YAAM,gBAAgB,SAAS,OAAO;AAGtC,YAAM,YAAY;AAMlB,eAAS,WAAW,OAAO;AAG3B,YAAM,aACJ,KAAK,UAAU,aAAa,MAAM,KAAK,UAAU,SAAS;AAC5D,UAAI,YAAY;AACd,0BAAkB,gBAAgB;AAAA,UAChC;AAAA,UACA,UAAU;AAAA,UACV,WAAW,KAAK,IAAI;AAAA,UACpB,SAAS,WAAW;AAAA,UACpB,YACE,UAAU,SAAS,cAAc,SAC7B,UACA,UAAU,SAAS,cAAc,SAC/B,YACA;AAAA,QACV,CAAC;AAAA,MACH;AAGA,YAAM,UAAU,oBAAoB,SAAS;AAG7C,YAAM,aAAa;AAAA,QACjB,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA;AAAA,QACN,oBAAoB;AAAA;AAAA;AAAA,MAGtB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,YAAM,cAAc,yBAAyB,YAAY;AAGzD,wBAAkB,cAAc;AAAA,QAC9B,OAAO;AAAA,QACP,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS,SAAS,WAAW;AAAA,QAC7B,SAAS;AAAA,MACX,CAAC;AAED,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,66 @@
1
+ const DESCRIPTION = "Creates and manages todo items for task tracking and progress management in the current session.";
2
+ const PROMPT = `Use this tool to create and manage todo items for tracking tasks and progress. This tool provides comprehensive todo management:
3
+
4
+ ## When to Use This Tool
5
+
6
+ Use this tool proactively in these scenarios:
7
+
8
+ 1. **Complex multi-step tasks** - When a task requires 3 or more distinct steps or actions
9
+ 2. **Non-trivial and complex tasks** - Tasks that require careful planning or multiple operations
10
+ 3. **User explicitly requests todo list** - When the user directly asks you to use the todo list
11
+ 4. **User provides multiple tasks** - When users provide a list of things to be done (numbered or comma-separated)
12
+ 5. **After receiving new instructions** - Immediately capture user requirements as todos
13
+ 6. **When you start working on a task** - Mark it as in_progress BEFORE beginning work. Ideally you should only have one todo as in_progress at a time
14
+ 7. **After completing a task** - Mark it as completed and add any new follow-up tasks discovered during implementation
15
+
16
+ ## When NOT to Use This Tool
17
+
18
+ Skip using this tool when:
19
+ 1. There is only a single, straightforward task
20
+ 2. The task is trivial and tracking it provides no organizational benefit
21
+ 3. The task can be completed in less than 3 trivial steps
22
+ 4. The task is purely conversational or informational
23
+
24
+ ## Task States and Management
25
+
26
+ 1. **Task States**: Use these states to track progress:
27
+ - pending: Task not yet started
28
+ - in_progress: Currently working on (limit to ONE task at a time)
29
+ - completed: Task finished successfully
30
+
31
+ 2. **Task Management**:
32
+ - Update task status in real-time as you work
33
+ - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)
34
+ - Only have ONE task in_progress at any time
35
+ - Complete current tasks before starting new ones
36
+ - Remove tasks that are no longer relevant from the list entirely
37
+
38
+ 3. **Task Completion Requirements**:
39
+ - ONLY mark a task as completed when you have FULLY accomplished it
40
+ - If you encounter errors, blockers, or cannot finish, keep the task as in_progress
41
+ - When blocked, create a new task describing what needs to be resolved
42
+ - Never mark a task as completed if:
43
+ - Tests are failing
44
+ - Implementation is partial
45
+ - You encountered unresolved errors
46
+ - You couldn't find necessary files or dependencies
47
+
48
+ 4. **Task Breakdown**:
49
+ - Create specific, actionable items
50
+ - Break complex tasks into smaller, manageable steps
51
+ - Use clear, descriptive task names
52
+
53
+ ## Tool Capabilities
54
+
55
+ - **Create new todos**: Add tasks with content, priority, and status
56
+ - **Update existing todos**: Modify any aspect of a todo (status, priority, content)
57
+ - **Delete todos**: Remove completed or irrelevant tasks
58
+ - **Batch operations**: Update multiple todos in a single operation
59
+ - **Clear all todos**: Reset the entire todo list
60
+
61
+ When in doubt, use this tool. Being proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully.`;
62
+ export {
63
+ DESCRIPTION,
64
+ PROMPT
65
+ };
66
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TodoWriteTool/prompt.ts"],
4
+ "sourcesContent": ["export const DESCRIPTION =\n 'Creates and manages todo items for task tracking and progress management in the current session.'\n\nexport const PROMPT = `Use this tool to create and manage todo items for tracking tasks and progress. This tool provides comprehensive todo management:\n\n## When to Use This Tool\n\nUse this tool proactively in these scenarios:\n\n1. **Complex multi-step tasks** - When a task requires 3 or more distinct steps or actions\n2. **Non-trivial and complex tasks** - Tasks that require careful planning or multiple operations\n3. **User explicitly requests todo list** - When the user directly asks you to use the todo list\n4. **User provides multiple tasks** - When users provide a list of things to be done (numbered or comma-separated)\n5. **After receiving new instructions** - Immediately capture user requirements as todos\n6. **When you start working on a task** - Mark it as in_progress BEFORE beginning work. Ideally you should only have one todo as in_progress at a time\n7. **After completing a task** - Mark it as completed and add any new follow-up tasks discovered during implementation\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. There is only a single, straightforward task\n2. The task is trivial and tracking it provides no organizational benefit\n3. The task can be completed in less than 3 trivial steps\n4. The task is purely conversational or informational\n\n## Task States and Management\n\n1. **Task States**: Use these states to track progress:\n - pending: Task not yet started\n - in_progress: Currently working on (limit to ONE task at a time)\n - completed: Task finished successfully\n\n2. **Task Management**:\n - Update task status in real-time as you work\n - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)\n - Only have ONE task in_progress at any time\n - Complete current tasks before starting new ones\n - Remove tasks that are no longer relevant from the list entirely\n\n3. **Task Completion Requirements**:\n - ONLY mark a task as completed when you have FULLY accomplished it\n - If you encounter errors, blockers, or cannot finish, keep the task as in_progress\n - When blocked, create a new task describing what needs to be resolved\n - Never mark a task as completed if:\n - Tests are failing\n - Implementation is partial\n - You encountered unresolved errors\n - You couldn't find necessary files or dependencies\n\n4. **Task Breakdown**:\n - Create specific, actionable items\n - Break complex tasks into smaller, manageable steps\n - Use clear, descriptive task names\n\n## Tool Capabilities\n\n- **Create new todos**: Add tasks with content, priority, and status\n- **Update existing todos**: Modify any aspect of a todo (status, priority, content)\n- **Delete todos**: Remove completed or irrelevant tasks\n- **Batch operations**: Update multiple todos in a single operation\n- **Clear all todos**: Reset the entire todo list\n\nWhen in doubt, use this tool. Being proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully.`\n"],
5
+ "mappings": "AAAO,MAAM,cACX;AAEK,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,137 @@
1
+ import { Box, Text } from "ink";
2
+ import React from "react";
3
+ import { z } from "zod";
4
+ import fetch from "node-fetch";
5
+ import { Cost } from "../../components/Cost.js";
6
+ import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
7
+ import { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from "./prompt.js";
8
+ import { convertHtmlToMarkdown } from "./htmlToMarkdown.js";
9
+ import { urlCache } from "./cache.js";
10
+ import { queryQuick } from "../../services/claude.js";
11
+ const inputSchema = z.strictObject({
12
+ url: z.string().url().describe("The URL to fetch content from"),
13
+ prompt: z.string().describe("The prompt to run on the fetched content")
14
+ });
15
+ function normalizeUrl(url) {
16
+ if (url.startsWith("http://")) {
17
+ return url.replace("http://", "https://");
18
+ }
19
+ return url;
20
+ }
21
+ const URLFetcherTool = {
22
+ name: TOOL_NAME_FOR_PROMPT,
23
+ async description() {
24
+ return DESCRIPTION;
25
+ },
26
+ userFacingName: () => "URL Fetcher",
27
+ inputSchema,
28
+ isReadOnly: () => true,
29
+ isConcurrencySafe: () => true,
30
+ async isEnabled() {
31
+ return true;
32
+ },
33
+ needsPermissions() {
34
+ return false;
35
+ },
36
+ async prompt() {
37
+ return DESCRIPTION;
38
+ },
39
+ renderToolUseMessage({ url, prompt }) {
40
+ return `Fetching content from ${url} and analyzing with prompt: "${prompt}"`;
41
+ },
42
+ renderToolUseRejectedMessage() {
43
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
44
+ },
45
+ renderToolResultMessage(output) {
46
+ const statusText = output.fromCache ? "from cache" : "fetched";
47
+ return /* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between", width: "100%" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0Content "), /* @__PURE__ */ React.createElement(Text, { bold: true }, statusText, " "), /* @__PURE__ */ React.createElement(Text, null, "and analyzed")), /* @__PURE__ */ React.createElement(Cost, { costUSD: 0, durationMs: 0, debug: false }));
48
+ },
49
+ renderResultForAssistant(output) {
50
+ if (!output.aiAnalysis.trim()) {
51
+ return `No content could be analyzed from URL: ${output.url}`;
52
+ }
53
+ return output.aiAnalysis;
54
+ },
55
+ async *call({ url, prompt }, {}) {
56
+ const normalizedUrl = normalizeUrl(url);
57
+ try {
58
+ let content;
59
+ let fromCache = false;
60
+ const cachedContent = urlCache.get(normalizedUrl);
61
+ if (cachedContent) {
62
+ content = cachedContent;
63
+ fromCache = true;
64
+ } else {
65
+ const abortController = new AbortController();
66
+ const timeout = setTimeout(() => abortController.abort(), 3e4);
67
+ const response = await fetch(normalizedUrl, {
68
+ method: "GET",
69
+ headers: {
70
+ "User-Agent": "Mozilla/5.0 (compatible; URLFetcher/1.0)",
71
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
72
+ "Accept-Language": "en-US,en;q=0.5",
73
+ "Accept-Encoding": "gzip, deflate",
74
+ "Connection": "keep-alive",
75
+ "Upgrade-Insecure-Requests": "1"
76
+ },
77
+ signal: abortController.signal,
78
+ redirect: "follow"
79
+ });
80
+ clearTimeout(timeout);
81
+ if (!response.ok) {
82
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
83
+ }
84
+ const contentType = response.headers.get("content-type") || "";
85
+ if (!contentType.includes("text/") && !contentType.includes("application/")) {
86
+ throw new Error(`Unsupported content type: ${contentType}`);
87
+ }
88
+ const html = await response.text();
89
+ content = convertHtmlToMarkdown(html);
90
+ urlCache.set(normalizedUrl, content);
91
+ fromCache = false;
92
+ }
93
+ const maxContentLength = 5e4;
94
+ const truncatedContent = content.length > maxContentLength ? content.substring(0, maxContentLength) + "\n\n[Content truncated due to length]" : content;
95
+ const systemPrompt = [
96
+ "You are analyzing web content based on a user's specific request.",
97
+ "The content has been extracted from a webpage and converted to markdown.",
98
+ "Provide a focused response that directly addresses the user's prompt."
99
+ ];
100
+ const userPrompt = `Here is the content from ${normalizedUrl}:
101
+
102
+ ${truncatedContent}
103
+
104
+ User request: ${prompt}`;
105
+ const aiResponse = await queryQuick({
106
+ systemPrompt,
107
+ userPrompt,
108
+ enablePromptCaching: false
109
+ });
110
+ const output = {
111
+ url: normalizedUrl,
112
+ fromCache,
113
+ aiAnalysis: aiResponse.message.content[0]?.text || "Unable to analyze content"
114
+ };
115
+ yield {
116
+ type: "result",
117
+ resultForAssistant: this.renderResultForAssistant(output),
118
+ data: output
119
+ };
120
+ } catch (error) {
121
+ const output = {
122
+ url: normalizedUrl,
123
+ fromCache: false,
124
+ aiAnalysis: ""
125
+ };
126
+ yield {
127
+ type: "result",
128
+ resultForAssistant: `Error processing URL ${normalizedUrl}: ${error.message}`,
129
+ data: output
130
+ };
131
+ }
132
+ }
133
+ };
134
+ export {
135
+ URLFetcherTool
136
+ };
137
+ //# sourceMappingURL=URLFetcherTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/URLFetcherTool/URLFetcherTool.tsx"],
4
+ "sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport fetch from 'node-fetch'\nimport { Cost } from '../../components/Cost'\nimport { FallbackToolUseRejectedMessage } from '../../components/FallbackToolUseRejectedMessage'\nimport { Tool, ToolUseContext } from '../../Tool'\nimport { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { convertHtmlToMarkdown } from './htmlToMarkdown'\nimport { urlCache } from './cache'\nimport { queryQuick } from '../../services/claude'\n\nconst inputSchema = z.strictObject({\n url: z.string().url().describe('The URL to fetch content from'),\n prompt: z.string().describe('The prompt to run on the fetched content'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n url: string\n fromCache: boolean\n aiAnalysis: string\n}\n\nfunction normalizeUrl(url: string): string {\n // Auto-upgrade HTTP to HTTPS\n if (url.startsWith('http://')) {\n return url.replace('http://', 'https://')\n }\n return url\n}\n\nexport const URLFetcherTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName: () => 'URL Fetcher',\n inputSchema,\n isReadOnly: () => true,\n isConcurrencySafe: () => true,\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return false\n },\n async prompt() {\n return DESCRIPTION\n },\n renderToolUseMessage({ url, prompt }: Input) {\n return `Fetching content from ${url} and analyzing with prompt: \"${prompt}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n const statusText = output.fromCache ? 'from cache' : 'fetched'\n \n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;Content </Text>\n <Text bold>{statusText} </Text>\n <Text>and analyzed</Text>\n </Box>\n <Cost costUSD={0} durationMs={0} debug={false} />\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n if (!output.aiAnalysis.trim()) {\n return `No content could be analyzed from URL: ${output.url}`\n }\n \n return output.aiAnalysis\n },\n async *call({ url, prompt }: Input, {}: ToolUseContext) {\n const normalizedUrl = normalizeUrl(url)\n \n try {\n let content: string\n let fromCache = false\n\n // Check cache first\n const cachedContent = urlCache.get(normalizedUrl)\n if (cachedContent) {\n content = cachedContent\n fromCache = true\n } else {\n // Fetch from URL with AbortController for timeout\n const abortController = new AbortController()\n const timeout = setTimeout(() => abortController.abort(), 30000)\n \n const response = await fetch(normalizedUrl, {\n method: 'GET',\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; URLFetcher/1.0)',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n 'Accept-Language': 'en-US,en;q=0.5',\n 'Accept-Encoding': 'gzip, deflate',\n 'Connection': 'keep-alive',\n 'Upgrade-Insecure-Requests': '1',\n },\n signal: abortController.signal,\n redirect: 'follow',\n })\n \n clearTimeout(timeout)\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const contentType = response.headers.get('content-type') || ''\n if (!contentType.includes('text/') && !contentType.includes('application/')) {\n throw new Error(`Unsupported content type: ${contentType}`)\n }\n\n const html = await response.text()\n content = convertHtmlToMarkdown(html)\n \n // Cache the result\n urlCache.set(normalizedUrl, content)\n fromCache = false\n }\n\n // Truncate content if too large (keep within reasonable token limits)\n const maxContentLength = 50000 // ~15k tokens approximately\n const truncatedContent = content.length > maxContentLength \n ? content.substring(0, maxContentLength) + '\\n\\n[Content truncated due to length]'\n : content\n\n // AI Analysis - always performed fresh, even with cached content\n const systemPrompt = [\n 'You are analyzing web content based on a user\\'s specific request.',\n 'The content has been extracted from a webpage and converted to markdown.',\n 'Provide a focused response that directly addresses the user\\'s prompt.',\n ]\n\n const userPrompt = `Here is the content from ${normalizedUrl}:\n\n${truncatedContent}\n\nUser request: ${prompt}`\n\n const aiResponse = await queryQuick({\n systemPrompt,\n userPrompt,\n enablePromptCaching: false,\n })\n\n const output: Output = {\n url: normalizedUrl,\n fromCache,\n aiAnalysis: aiResponse.message.content[0]?.text || 'Unable to analyze content',\n }\n\n yield {\n type: 'result' as const,\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n } catch (error: any) {\n const output: Output = {\n url: normalizedUrl,\n fromCache: false,\n aiAnalysis: '',\n }\n \n yield {\n type: 'result' as const,\n resultForAssistant: `Error processing URL ${normalizedUrl}: ${error.message}`,\n data: output,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,45 @@
1
+ class URLCache {
2
+ cache = /* @__PURE__ */ new Map();
3
+ CACHE_DURATION = 15 * 60 * 1e3;
4
+ // 15 minutes in milliseconds
5
+ set(url, content) {
6
+ this.cache.set(url, {
7
+ content,
8
+ timestamp: Date.now()
9
+ });
10
+ }
11
+ get(url) {
12
+ const entry = this.cache.get(url);
13
+ if (!entry) {
14
+ return null;
15
+ }
16
+ if (Date.now() - entry.timestamp > this.CACHE_DURATION) {
17
+ this.cache.delete(url);
18
+ return null;
19
+ }
20
+ return entry.content;
21
+ }
22
+ clear() {
23
+ this.cache.clear();
24
+ }
25
+ // Clean expired entries
26
+ cleanExpired() {
27
+ const now = Date.now();
28
+ for (const [url, entry] of this.cache.entries()) {
29
+ if (now - entry.timestamp > this.CACHE_DURATION) {
30
+ this.cache.delete(url);
31
+ }
32
+ }
33
+ }
34
+ // Auto-clean expired entries every 5 minutes
35
+ constructor() {
36
+ setInterval(() => {
37
+ this.cleanExpired();
38
+ }, 5 * 60 * 1e3);
39
+ }
40
+ }
41
+ const urlCache = new URLCache();
42
+ export {
43
+ urlCache
44
+ };
45
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/URLFetcherTool/cache.ts"],
4
+ "sourcesContent": ["interface CacheEntry {\n content: string\n timestamp: number\n}\n\nclass URLCache {\n private cache = new Map<string, CacheEntry>()\n private readonly CACHE_DURATION = 15 * 60 * 1000 // 15 minutes in milliseconds\n\n set(url: string, content: string): void {\n this.cache.set(url, {\n content,\n timestamp: Date.now()\n })\n }\n\n get(url: string): string | null {\n const entry = this.cache.get(url)\n if (!entry) {\n return null\n }\n\n // Check if entry has expired\n if (Date.now() - entry.timestamp > this.CACHE_DURATION) {\n this.cache.delete(url)\n return null\n }\n\n return entry.content\n }\n\n clear(): void {\n this.cache.clear()\n }\n\n // Clean expired entries\n private cleanExpired(): void {\n const now = Date.now()\n for (const [url, entry] of this.cache.entries()) {\n if (now - entry.timestamp > this.CACHE_DURATION) {\n this.cache.delete(url)\n }\n }\n }\n\n // Auto-clean expired entries every 5 minutes\n constructor() {\n setInterval(() => {\n this.cleanExpired()\n }, 5 * 60 * 1000) // 5 minutes\n }\n}\n\n// Export singleton instance\nexport const urlCache = new URLCache()"],
5
+ "mappings": "AAKA,MAAM,SAAS;AAAA,EACL,QAAQ,oBAAI,IAAwB;AAAA,EAC3B,iBAAiB,KAAK,KAAK;AAAA;AAAA,EAE5C,IAAI,KAAa,SAAuB;AACtC,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,KAA4B;AAC9B,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY,KAAK,gBAAgB;AACtD,WAAK,MAAM,OAAO,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA,EAGQ,eAAqB;AAC3B,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,QAAQ,GAAG;AAC/C,UAAI,MAAM,MAAM,YAAY,KAAK,gBAAgB;AAC/C,aAAK,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,cAAc;AACZ,gBAAY,MAAM;AAChB,WAAK,aAAa;AAAA,IACpB,GAAG,IAAI,KAAK,GAAI;AAAA,EAClB;AACF;AAGO,MAAM,WAAW,IAAI,SAAS;",
6
+ "names": []
7
+ }
@@ -0,0 +1,42 @@
1
+ import TurndownService from "turndown";
2
+ const turndownService = new TurndownService({
3
+ headingStyle: "atx",
4
+ hr: "---",
5
+ bulletListMarker: "-",
6
+ codeBlockStyle: "fenced",
7
+ fence: "```",
8
+ emDelimiter: "_",
9
+ strongDelimiter: "**"
10
+ });
11
+ turndownService.addRule("removeScripts", {
12
+ filter: ["script", "style", "noscript"],
13
+ replacement: () => ""
14
+ });
15
+ turndownService.addRule("removeComments", {
16
+ filter: (node) => node.nodeType === 8,
17
+ // Comment nodes
18
+ replacement: () => ""
19
+ });
20
+ turndownService.addRule("cleanLinks", {
21
+ filter: "a",
22
+ replacement: (content, node) => {
23
+ const href = node.getAttribute("href");
24
+ if (!href || href.startsWith("javascript:") || href.startsWith("#")) {
25
+ return content;
26
+ }
27
+ return `[${content}](${href})`;
28
+ }
29
+ });
30
+ function convertHtmlToMarkdown(html) {
31
+ try {
32
+ const cleanHtml = html.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "").replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "").replace(/<!--[\s\S]*?-->/g, "").replace(/\s+/g, " ").trim();
33
+ const markdown = turndownService.turndown(cleanHtml);
34
+ return markdown.replace(/\n{3,}/g, "\n\n").replace(/^\s+|\s+$/gm, "").trim();
35
+ } catch (error) {
36
+ throw new Error(`Failed to convert HTML to markdown: ${error instanceof Error ? error.message : String(error)}`);
37
+ }
38
+ }
39
+ export {
40
+ convertHtmlToMarkdown
41
+ };
42
+ //# sourceMappingURL=htmlToMarkdown.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/URLFetcherTool/htmlToMarkdown.ts"],
4
+ "sourcesContent": ["import TurndownService from 'turndown'\n\nconst turndownService = new TurndownService({\n headingStyle: 'atx',\n hr: '---',\n bulletListMarker: '-',\n codeBlockStyle: 'fenced',\n fence: '```',\n emDelimiter: '_',\n strongDelimiter: '**'\n})\n\n// Configure rules to handle common HTML elements\nturndownService.addRule('removeScripts', {\n filter: ['script', 'style', 'noscript'],\n replacement: () => ''\n})\n\nturndownService.addRule('removeComments', {\n filter: (node) => node.nodeType === 8, // Comment nodes\n replacement: () => ''\n})\n\nturndownService.addRule('cleanLinks', {\n filter: 'a',\n replacement: (content, node) => {\n const href = node.getAttribute('href')\n if (!href || href.startsWith('javascript:') || href.startsWith('#')) {\n return content\n }\n return `[${content}](${href})`\n }\n})\n\nexport function convertHtmlToMarkdown(html: string): string {\n try {\n // Clean up the HTML before conversion\n const cleanHtml = html\n .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '') // Remove script tags\n .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '') // Remove style tags\n .replace(/<!--[\\s\\S]*?-->/g, '') // Remove HTML comments\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .trim()\n\n const markdown = turndownService.turndown(cleanHtml)\n \n // Clean up the resulting markdown\n return markdown\n .replace(/\\n{3,}/g, '\\n\\n') // Remove excessive line breaks\n .replace(/^\\s+|\\s+$/gm, '') // Remove leading/trailing spaces on each line\n .trim()\n } catch (error) {\n throw new Error(`Failed to convert HTML to markdown: ${error instanceof Error ? error.message : String(error)}`)\n }\n}"],
5
+ "mappings": "AAAA,OAAO,qBAAqB;AAE5B,MAAM,kBAAkB,IAAI,gBAAgB;AAAA,EAC1C,cAAc;AAAA,EACd,IAAI;AAAA,EACJ,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,aAAa;AAAA,EACb,iBAAiB;AACnB,CAAC;AAGD,gBAAgB,QAAQ,iBAAiB;AAAA,EACvC,QAAQ,CAAC,UAAU,SAAS,UAAU;AAAA,EACtC,aAAa,MAAM;AACrB,CAAC;AAED,gBAAgB,QAAQ,kBAAkB;AAAA,EACxC,QAAQ,CAAC,SAAS,KAAK,aAAa;AAAA;AAAA,EACpC,aAAa,MAAM;AACrB,CAAC;AAED,gBAAgB,QAAQ,cAAc;AAAA,EACpC,QAAQ;AAAA,EACR,aAAa,CAAC,SAAS,SAAS;AAC9B,UAAM,OAAO,KAAK,aAAa,MAAM;AACrC,QAAI,CAAC,QAAQ,KAAK,WAAW,aAAa,KAAK,KAAK,WAAW,GAAG,GAAG;AACnE,aAAO;AAAA,IACT;AACA,WAAO,IAAI,OAAO,KAAK,IAAI;AAAA,EAC7B;AACF,CAAC;AAEM,SAAS,sBAAsB,MAAsB;AAC1D,MAAI;AAEF,UAAM,YAAY,KACf,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,mCAAmC,EAAE,EAC7C,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAER,UAAM,WAAW,gBAAgB,SAAS,SAAS;AAGnD,WAAO,SACJ,QAAQ,WAAW,MAAM,EACzB,QAAQ,eAAe,EAAE,EACzB,KAAK;AAAA,EACV,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uCAAuC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EACjH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ const TOOL_NAME_FOR_PROMPT = "URLFetcher";
2
+ const DESCRIPTION = `- Fetches content from a specified URL and processes it using an AI model
3
+ - Takes a URL and a prompt as input
4
+ - Fetches the URL content, converts HTML to markdown
5
+ - Processes the content with the prompt using a small, fast model
6
+ - Returns the model's response about the content
7
+ - Use this tool when you need to retrieve and analyze web content
8
+
9
+ Usage notes:
10
+ - IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions. All MCP-provided tools start with "mcp__".
11
+ - The URL must be a fully-formed valid URL (e.g., https://example.com)
12
+ - HTTP URLs will be automatically upgraded to HTTPS
13
+ - The prompt should describe what information you want to extract from the page
14
+ - This tool is read-only and does not modify any files
15
+ - Results may be summarized if the content is very large
16
+ - Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL
17
+ - When a URL redirects, the tool will inform you and provide the redirect URL in a special format. You should then make a new URLFetcher request with the redirect URL to fetch the content.`;
18
+ export {
19
+ DESCRIPTION,
20
+ TOOL_NAME_FOR_PROMPT
21
+ };
22
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/URLFetcherTool/prompt.ts"],
4
+ "sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'URLFetcher'\nexport const DESCRIPTION = `- Fetches content from a specified URL and processes it using an AI model\n- Takes a URL and a prompt as input\n- Fetches the URL content, converts HTML to markdown\n- Processes the content with the prompt using a small, fast model\n- Returns the model's response about the content\n- Use this tool when you need to retrieve and analyze web content\n\nUsage notes:\n- IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions. All MCP-provided tools start with \"mcp__\".\n- The URL must be a fully-formed valid URL (e.g., https://example.com)\n- HTTP URLs will be automatically upgraded to HTTPS\n- The prompt should describe what information you want to extract from the page\n- This tool is read-only and does not modify any files\n- Results may be summarized if the content is very large\n- Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL\n- When a URL redirects, the tool will inform you and provide the redirect URL in a special format. You should then make a new URLFetcher request with the redirect URL to fetch the content.`\n"],
5
+ "mappings": "AAAO,MAAM,uBAAuB;AAC7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }