@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,353 @@
1
+ import { getTodos } from "../utils/todoStorage.js";
2
+ import { logEvent } from "./statsig.js";
3
+ class SystemReminderService {
4
+ sessionState = {
5
+ lastTodoUpdate: 0,
6
+ lastFileAccess: 0,
7
+ sessionStartTime: Date.now(),
8
+ remindersSent: /* @__PURE__ */ new Set(),
9
+ contextPresent: false,
10
+ reminderCount: 0,
11
+ config: {
12
+ todoEmptyReminder: true,
13
+ securityReminder: true,
14
+ performanceReminder: true,
15
+ maxRemindersPerSession: 10
16
+ }
17
+ };
18
+ eventDispatcher = /* @__PURE__ */ new Map();
19
+ reminderCache = /* @__PURE__ */ new Map();
20
+ constructor() {
21
+ this.setupEventDispatcher();
22
+ }
23
+ /**
24
+ * Conditional reminder injection - only when context is present
25
+ * Enhanced with performance optimizations and priority management
26
+ */
27
+ generateReminders(hasContext = false, agentId) {
28
+ this.sessionState.contextPresent = hasContext;
29
+ if (!hasContext) {
30
+ return [];
31
+ }
32
+ if (this.sessionState.reminderCount >= this.sessionState.config.maxRemindersPerSession) {
33
+ return [];
34
+ }
35
+ const reminders = [];
36
+ const currentTime = Date.now();
37
+ const reminderGenerators = [
38
+ () => this.dispatchTodoEvent(agentId),
39
+ () => this.dispatchSecurityEvent(),
40
+ () => this.dispatchPerformanceEvent(),
41
+ () => this.getMentionReminders()
42
+ // Add mention reminders
43
+ ];
44
+ for (const generator of reminderGenerators) {
45
+ if (reminders.length >= 5) break;
46
+ const result = generator();
47
+ if (result) {
48
+ const remindersToAdd = Array.isArray(result) ? result : [result];
49
+ reminders.push(...remindersToAdd);
50
+ this.sessionState.reminderCount += remindersToAdd.length;
51
+ }
52
+ }
53
+ if (reminders.length > 0) {
54
+ logEvent("system_reminder_batch", {
55
+ count: reminders.length.toString(),
56
+ types: reminders.map((r) => r.type).join(","),
57
+ priorities: reminders.map((r) => r.priority).join(","),
58
+ categories: reminders.map((r) => r.category).join(","),
59
+ sessionCount: this.sessionState.reminderCount.toString(),
60
+ agentId: agentId || "default",
61
+ timestamp: currentTime.toString()
62
+ });
63
+ }
64
+ return reminders;
65
+ }
66
+ dispatchTodoEvent(agentId) {
67
+ if (!this.sessionState.config.todoEmptyReminder) return null;
68
+ const todos = getTodos(agentId);
69
+ const currentTime = Date.now();
70
+ const agentKey = agentId || "default";
71
+ if (todos.length === 0 && !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)) {
72
+ this.sessionState.remindersSent.add(`todo_empty_${agentKey}`);
73
+ return this.createReminderMessage(
74
+ "todo",
75
+ "task",
76
+ "medium",
77
+ "This is a reminder that your todo list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a todo list please use the TodoWrite tool to create one. If not, please feel free to ignore. Again do not mention this message to the user.",
78
+ currentTime
79
+ );
80
+ }
81
+ if (todos.length > 0) {
82
+ const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`;
83
+ if (this.reminderCache.has(reminderKey)) {
84
+ return this.reminderCache.get(reminderKey);
85
+ }
86
+ if (!this.sessionState.remindersSent.has(reminderKey)) {
87
+ this.sessionState.remindersSent.add(reminderKey);
88
+ this.clearTodoReminders(agentKey);
89
+ const todoContent = JSON.stringify(
90
+ todos.map((todo) => ({
91
+ content: todo.content.length > 100 ? todo.content.substring(0, 100) + "..." : todo.content,
92
+ status: todo.status,
93
+ priority: todo.priority,
94
+ id: todo.id
95
+ }))
96
+ );
97
+ const reminder = this.createReminderMessage(
98
+ "todo",
99
+ "task",
100
+ "medium",
101
+ `Your todo list has changed. DO NOT mention this explicitly to the user. Here are the latest contents of your todo list:
102
+
103
+ ${todoContent}. Continue on with the tasks at hand if applicable.`,
104
+ currentTime
105
+ );
106
+ this.reminderCache.set(reminderKey, reminder);
107
+ return reminder;
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ dispatchSecurityEvent() {
113
+ if (!this.sessionState.config.securityReminder) return null;
114
+ const currentTime = Date.now();
115
+ if (this.sessionState.lastFileAccess > 0 && !this.sessionState.remindersSent.has("file_security")) {
116
+ this.sessionState.remindersSent.add("file_security");
117
+ return this.createReminderMessage(
118
+ "security",
119
+ "security",
120
+ "high",
121
+ "Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.",
122
+ currentTime
123
+ );
124
+ }
125
+ return null;
126
+ }
127
+ dispatchPerformanceEvent() {
128
+ if (!this.sessionState.config.performanceReminder) return null;
129
+ const currentTime = Date.now();
130
+ const sessionDuration = currentTime - this.sessionState.sessionStartTime;
131
+ if (sessionDuration > 30 * 60 * 1e3 && !this.sessionState.remindersSent.has("performance_long_session")) {
132
+ this.sessionState.remindersSent.add("performance_long_session");
133
+ return this.createReminderMessage(
134
+ "performance",
135
+ "performance",
136
+ "low",
137
+ "Long session detected. Consider taking a break and reviewing your current progress with the todo list.",
138
+ currentTime
139
+ );
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Retrieve cached mention reminders
145
+ * Returns recent mentions (within 5 seconds) that haven't expired
146
+ */
147
+ getMentionReminders() {
148
+ const currentTime = Date.now();
149
+ const MENTION_FRESHNESS_WINDOW = 5e3;
150
+ const reminders = [];
151
+ const expiredKeys = [];
152
+ for (const [key, reminder] of this.reminderCache.entries()) {
153
+ if (this.isMentionReminder(reminder)) {
154
+ const age = currentTime - reminder.timestamp;
155
+ if (age <= MENTION_FRESHNESS_WINDOW) {
156
+ reminders.push(reminder);
157
+ } else {
158
+ expiredKeys.push(key);
159
+ }
160
+ }
161
+ }
162
+ expiredKeys.forEach((key) => this.reminderCache.delete(key));
163
+ return reminders;
164
+ }
165
+ /**
166
+ * Type guard for mention reminders - centralized type checking
167
+ * Eliminates hardcoded type strings scattered throughout the code
168
+ */
169
+ isMentionReminder(reminder) {
170
+ const mentionTypes = ["agent_mention", "file_mention", "ask_model_mention"];
171
+ return mentionTypes.includes(reminder.type);
172
+ }
173
+ /**
174
+ * Generate reminders for external file changes
175
+ * Called when todo files are modified externally
176
+ */
177
+ generateFileChangeReminder(context) {
178
+ const { agentId, filePath, reminder } = context;
179
+ if (!reminder) {
180
+ return null;
181
+ }
182
+ const currentTime = Date.now();
183
+ const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`;
184
+ if (this.sessionState.remindersSent.has(reminderKey)) {
185
+ return null;
186
+ }
187
+ this.sessionState.remindersSent.add(reminderKey);
188
+ return this.createReminderMessage(
189
+ "file_changed",
190
+ "general",
191
+ "medium",
192
+ reminder,
193
+ currentTime
194
+ );
195
+ }
196
+ createReminderMessage(type, category, priority, content, timestamp) {
197
+ return {
198
+ role: "system",
199
+ content: `<system-reminder>
200
+ ${content}
201
+ </system-reminder>`,
202
+ isMeta: true,
203
+ timestamp,
204
+ type,
205
+ priority,
206
+ category
207
+ };
208
+ }
209
+ getTodoStateHash(todos) {
210
+ return todos.map((t) => `${t.id}:${t.status}`).sort().join("|");
211
+ }
212
+ clearTodoReminders(agentId) {
213
+ const agentKey = agentId || "default";
214
+ for (const key of this.sessionState.remindersSent) {
215
+ if (key.startsWith(`todo_updated_${agentKey}_`)) {
216
+ this.sessionState.remindersSent.delete(key);
217
+ }
218
+ }
219
+ }
220
+ setupEventDispatcher() {
221
+ this.addEventListener("session:startup", (context) => {
222
+ this.resetSession();
223
+ this.sessionState.sessionStartTime = Date.now();
224
+ this.sessionState.contextPresent = Object.keys(context.context || {}).length > 0;
225
+ logEvent("system_reminder_session_startup", {
226
+ agentId: context.agentId || "default",
227
+ contextKeys: Object.keys(context.context || {}).join(","),
228
+ messageCount: (context.messages || 0).toString(),
229
+ timestamp: context.timestamp.toString()
230
+ });
231
+ });
232
+ this.addEventListener("todo:changed", (context) => {
233
+ this.sessionState.lastTodoUpdate = Date.now();
234
+ this.clearTodoReminders(context.agentId);
235
+ });
236
+ this.addEventListener("todo:file_changed", (context) => {
237
+ const agentId = context.agentId || "default";
238
+ this.clearTodoReminders(agentId);
239
+ this.sessionState.lastTodoUpdate = Date.now();
240
+ const reminder = this.generateFileChangeReminder(context);
241
+ if (reminder) {
242
+ this.emitEvent("reminder:inject", {
243
+ reminder: reminder.content,
244
+ agentId,
245
+ type: "file_changed",
246
+ timestamp: Date.now()
247
+ });
248
+ }
249
+ });
250
+ this.addEventListener("file:read", (context) => {
251
+ this.sessionState.lastFileAccess = Date.now();
252
+ });
253
+ this.addEventListener("file:edited", (context) => {
254
+ });
255
+ this.addEventListener("agent:mentioned", (context) => {
256
+ this.createMentionReminder({
257
+ type: "agent_mention",
258
+ key: `agent_mention_${context.agentType}_${context.timestamp}`,
259
+ category: "task",
260
+ priority: "high",
261
+ content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type="${context.agentType}" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,
262
+ timestamp: context.timestamp
263
+ });
264
+ });
265
+ this.addEventListener("file:mentioned", (context) => {
266
+ this.createMentionReminder({
267
+ type: "file_mention",
268
+ key: `file_mention_${context.filePath}_${context.timestamp}`,
269
+ category: "general",
270
+ priority: "high",
271
+ content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,
272
+ timestamp: context.timestamp
273
+ });
274
+ });
275
+ this.addEventListener("ask-model:mentioned", (context) => {
276
+ this.createMentionReminder({
277
+ type: "ask_model_mention",
278
+ key: `ask_model_mention_${context.modelName}_${context.timestamp}`,
279
+ category: "task",
280
+ priority: "high",
281
+ content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,
282
+ timestamp: context.timestamp
283
+ });
284
+ });
285
+ }
286
+ addEventListener(event, callback) {
287
+ if (!this.eventDispatcher.has(event)) {
288
+ this.eventDispatcher.set(event, []);
289
+ }
290
+ this.eventDispatcher.get(event).push(callback);
291
+ }
292
+ emitEvent(event, context) {
293
+ const listeners = this.eventDispatcher.get(event) || [];
294
+ listeners.forEach((callback) => {
295
+ try {
296
+ callback(context);
297
+ } catch (error) {
298
+ console.error(`Error in event listener for ${event}:`, error);
299
+ }
300
+ });
301
+ }
302
+ /**
303
+ * Unified mention reminder creation - eliminates duplicate logic
304
+ * Centralizes reminder creation with consistent deduplication
305
+ */
306
+ createMentionReminder(params) {
307
+ if (!this.sessionState.remindersSent.has(params.key)) {
308
+ this.sessionState.remindersSent.add(params.key);
309
+ const reminder = this.createReminderMessage(
310
+ params.type,
311
+ params.category,
312
+ params.priority,
313
+ params.content,
314
+ params.timestamp
315
+ );
316
+ this.reminderCache.set(params.key, reminder);
317
+ }
318
+ }
319
+ resetSession() {
320
+ this.sessionState = {
321
+ lastTodoUpdate: 0,
322
+ lastFileAccess: 0,
323
+ sessionStartTime: Date.now(),
324
+ remindersSent: /* @__PURE__ */ new Set(),
325
+ contextPresent: false,
326
+ reminderCount: 0,
327
+ config: { ...this.sessionState.config }
328
+ // Preserve config across resets
329
+ };
330
+ this.reminderCache.clear();
331
+ }
332
+ updateConfig(config) {
333
+ this.sessionState.config = { ...this.sessionState.config, ...config };
334
+ }
335
+ getSessionState() {
336
+ return { ...this.sessionState };
337
+ }
338
+ }
339
+ const systemReminderService = new SystemReminderService();
340
+ const generateSystemReminders = (hasContext = false, agentId) => systemReminderService.generateReminders(hasContext, agentId);
341
+ const generateFileChangeReminder = (context) => systemReminderService.generateFileChangeReminder(context);
342
+ const emitReminderEvent = (event, context) => systemReminderService.emitEvent(event, context);
343
+ const resetReminderSession = () => systemReminderService.resetSession();
344
+ const getReminderSessionState = () => systemReminderService.getSessionState();
345
+ export {
346
+ emitReminderEvent,
347
+ generateFileChangeReminder,
348
+ generateSystemReminders,
349
+ getReminderSessionState,
350
+ resetReminderSession,
351
+ systemReminderService
352
+ };
353
+ //# sourceMappingURL=systemReminder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/systemReminder.ts"],
4
+ "sourcesContent": ["import { getTodos, TodoItem } from '../utils/todoStorage'\nimport { logEvent } from './statsig'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\ninterface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\ninterface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n config: ReminderConfig\n}\n\nclass SystemReminderService {\n private sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private eventDispatcher = new Map<string, Array<(context: any) => void>>()\n private reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n this.setupEventDispatcher()\n }\n\n /**\n * Conditional reminder injection - only when context is present\n * Enhanced with performance optimizations and priority management\n */\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n\n // Only inject when context is present (matching original behavior)\n if (!hasContext) {\n return []\n }\n\n // Check session reminder limit to prevent overload\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n const currentTime = Date.now()\n\n // Use lazy evaluation for performance with agent context\n const reminderGenerators = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => this.getMentionReminders(), // Add mention reminders\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break // Slightly increase limit to accommodate mentions\n\n const result = generator()\n if (result) {\n // Handle both single reminders and arrays\n const remindersToAdd = Array.isArray(result) ? result : [result]\n reminders.push(...remindersToAdd)\n this.sessionState.reminderCount += remindersToAdd.length\n }\n }\n\n // Log aggregated metrics instead of individual events for performance\n if (reminders.length > 0) {\n logEvent('system_reminder_batch', {\n count: reminders.length.toString(),\n types: reminders.map(r => r.type).join(','),\n priorities: reminders.map(r => r.priority).join(','),\n categories: reminders.map(r => r.category).join(','),\n sessionCount: this.sessionState.reminderCount.toString(),\n agentId: agentId || 'default',\n timestamp: currentTime.toString(),\n })\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n // Use agent-scoped todo access\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n // Check if this is a fresh session (no todos seen yet)\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your todo list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a todo list please use the TodoWrite tool to create one. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n // Check for todo updates since last seen\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${this.getTodoStateHash(todos)}`\n\n // Use cache for performance optimization\n if (this.reminderCache.has(reminderKey)) {\n return this.reminderCache.get(reminderKey)!\n }\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n // Clear previous todo state reminders for this agent\n this.clearTodoReminders(agentKey)\n\n // Optimize: only include essential todo data\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? todo.content.substring(0, 100) + '...'\n : todo.content,\n status: todo.status,\n priority: todo.priority,\n id: todo.id,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your todo list has changed. DO NOT mention this explicitly to the user. Here are the latest contents of your todo list:\\n\\n${todoContent}. Continue on with the tasks at hand if applicable.`,\n currentTime,\n )\n\n // Cache the reminder for reuse\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n\n // Only inject security reminder once per session when file operations occur\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n // Remind about performance after long sessions (30 minutes)\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the todo list.',\n currentTime,\n )\n }\n\n return null\n }\n\n /**\n * Retrieve cached mention reminders\n * Returns recent mentions (within 5 seconds) that haven't expired\n */\n private getMentionReminders(): ReminderMessage[] {\n const currentTime = Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000 // 5 seconds\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n // Single pass through cache for both collection and cleanup identification\n for (const [key, reminder] of this.reminderCache.entries()) {\n if (this.isMentionReminder(reminder)) {\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n }\n\n // Clean up expired mention reminders in separate pass for performance\n expiredKeys.forEach(key => this.reminderCache.delete(key))\n\n return reminders\n }\n\n /**\n * Type guard for mention reminders - centralized type checking\n * Eliminates hardcoded type strings scattered throughout the code\n */\n private isMentionReminder(reminder: ReminderMessage): boolean {\n const mentionTypes = ['agent_mention', 'file_mention', 'ask_model_mention']\n return mentionTypes.includes(reminder.type)\n }\n\n /**\n * Generate reminders for external file changes\n * Called when todo files are modified externally\n */\n public generateFileChangeReminder(context: any): ReminderMessage | null {\n const { agentId, filePath, reminder } = context\n\n if (!reminder) {\n return null\n }\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n // Ensure this specific file change reminder is only shown once\n if (this.sessionState.remindersSent.has(reminderKey)) {\n return null\n }\n\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n private getTodoStateHash(todos: TodoItem[]): string {\n return todos\n .map(t => `${t.id}:${t.status}`)\n .sort()\n .join('|')\n }\n\n private clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n private setupEventDispatcher(): void {\n // Session startup events\n this.addEventListener('session:startup', context => {\n // Reset session state on startup\n this.resetSession()\n\n // Initialize session tracking\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.contextPresent =\n Object.keys(context.context || {}).length > 0\n\n // Log session startup\n logEvent('system_reminder_session_startup', {\n agentId: context.agentId || 'default',\n contextKeys: Object.keys(context.context || {}).join(','),\n messageCount: (context.messages || 0).toString(),\n timestamp: context.timestamp.toString(),\n })\n })\n\n // Todo change events\n this.addEventListener('todo:changed', context => {\n this.sessionState.lastTodoUpdate = Date.now()\n this.clearTodoReminders(context.agentId)\n })\n\n // Todo file changed externally\n this.addEventListener('todo:file_changed', context => {\n // External file change detected, trigger reminder injection\n const agentId = context.agentId || 'default'\n this.clearTodoReminders(agentId)\n this.sessionState.lastTodoUpdate = Date.now()\n\n // Generate and inject file change reminder immediately\n const reminder = this.generateFileChangeReminder(context)\n if (reminder) {\n // Inject reminder into the latest user message through event system\n this.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n // File access events\n this.addEventListener('file:read', context => {\n this.sessionState.lastFileAccess = Date.now()\n })\n\n // File edit events for freshness detection\n this.addEventListener('file:edited', context => {\n // File edit handling\n })\n\n // Unified mention event handlers - eliminates code duplication\n this.addEventListener('agent:mentioned', context => {\n this.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${context.agentType}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type=\"${context.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,\n timestamp: context.timestamp\n })\n })\n\n this.addEventListener('file:mentioned', context => {\n this.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${context.filePath}_${context.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: context.timestamp\n })\n })\n\n this.addEventListener('ask-model:mentioned', context => {\n this.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${context.modelName}_${context.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,\n timestamp: context.timestamp\n })\n })\n }\n\n public addEventListener(\n event: string,\n callback: (context: any) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: any): void {\n const listeners = this.eventDispatcher.get(event) || []\n listeners.forEach(callback => {\n try {\n callback(context)\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error)\n }\n })\n }\n\n /**\n * Unified mention reminder creation - eliminates duplicate logic\n * Centralizes reminder creation with consistent deduplication\n */\n private createMentionReminder(params: {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n }): void {\n if (!this.sessionState.remindersSent.has(params.key)) {\n this.sessionState.remindersSent.add(params.key)\n \n const reminder = this.createReminderMessage(\n params.type,\n params.category,\n params.priority,\n params.content,\n params.timestamp\n )\n \n this.reminderCache.set(params.key, reminder)\n }\n }\n\n public resetSession(): void {\n this.sessionState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: { ...this.sessionState.config }, // Preserve config across resets\n }\n this.reminderCache.clear() // Clear cache on session reset\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: any) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: any) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,133 @@
1
+ import { createHash } from "crypto";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { dirname } from "path";
4
+ import { existsSync } from "fs";
5
+ import { env } from "../utils/env.js";
6
+ import { getCwd } from "../utils/state.js";
7
+ import * as path from "path";
8
+ import { mapValues } from "lodash-es";
9
+ async function withVCR(messages, f) {
10
+ if (process.env.NODE_ENV !== "test") {
11
+ return await f();
12
+ }
13
+ const dehydratedInput = mapMessages(
14
+ messages.map((_) => _.message.content),
15
+ dehydrateValue
16
+ );
17
+ const filename = `./fixtures/${dehydratedInput.map((_) => createHash("sha1").update(JSON.stringify(_)).digest("hex").slice(0, 6)).join("-")}.json`;
18
+ if (existsSync(filename)) {
19
+ const cached = JSON.parse(readFileSync(filename, "utf-8"));
20
+ return mapAssistantMessage(cached.output, hydrateValue);
21
+ }
22
+ if (env.isCI) {
23
+ console.warn(
24
+ `Anthropic API fixture missing. Re-run npm test locally, then commit the result. ${JSON.stringify({ input: dehydratedInput }, null, 2)}`
25
+ );
26
+ }
27
+ const result = await f();
28
+ if (env.isCI) {
29
+ return result;
30
+ }
31
+ if (!existsSync(dirname(filename))) {
32
+ mkdirSync(dirname(filename), { recursive: true });
33
+ }
34
+ writeFileSync(
35
+ filename,
36
+ JSON.stringify(
37
+ {
38
+ input: dehydratedInput,
39
+ output: mapAssistantMessage(result, dehydrateValue)
40
+ },
41
+ null,
42
+ 2
43
+ )
44
+ );
45
+ return result;
46
+ }
47
+ function mapMessages(messages, f) {
48
+ return messages.map((_) => {
49
+ if (typeof _ === "string") {
50
+ return f(_);
51
+ }
52
+ return _.map((_2) => {
53
+ switch (_2.type) {
54
+ case "tool_result":
55
+ if (typeof _2.content === "string") {
56
+ return { ..._2, content: f(_2.content) };
57
+ }
58
+ if (Array.isArray(_2.content)) {
59
+ return {
60
+ ..._2,
61
+ content: _2.content.map((_3) => {
62
+ switch (_3.type) {
63
+ case "text":
64
+ return { ..._3, text: f(_3.text) };
65
+ case "image":
66
+ return _3;
67
+ }
68
+ })
69
+ };
70
+ }
71
+ return _2;
72
+ case "text":
73
+ return { ..._2, text: f(_2.text) };
74
+ case "tool_use":
75
+ return {
76
+ ..._2,
77
+ input: mapValues(_2.input, f)
78
+ };
79
+ case "image":
80
+ return _2;
81
+ }
82
+ });
83
+ });
84
+ }
85
+ function mapAssistantMessage(message, f) {
86
+ return {
87
+ durationMs: "DURATION",
88
+ costUSD: "COST",
89
+ uuid: "UUID",
90
+ message: {
91
+ ...message.message,
92
+ content: message.message.content.map((_) => {
93
+ switch (_.type) {
94
+ case "text":
95
+ return {
96
+ ..._,
97
+ text: f(_.text),
98
+ citations: _.citations || []
99
+ };
100
+ // Ensure citations
101
+ case "tool_use":
102
+ return {
103
+ ..._,
104
+ input: mapValues(_.input, f)
105
+ };
106
+ default:
107
+ return _;
108
+ }
109
+ }).filter(Boolean)
110
+ },
111
+ type: "assistant"
112
+ };
113
+ }
114
+ function dehydrateValue(s) {
115
+ if (typeof s !== "string") {
116
+ return s;
117
+ }
118
+ const s1 = s.replace(/num_files="\d+"/g, 'num_files="[NUM]"').replace(/duration_ms="\d+"/g, 'duration_ms="[DURATION]"').replace(/cost_usd="\d+"/g, 'cost_usd="[COST]"').replace(/\//g, path.sep).replaceAll(getCwd(), "[CWD]");
119
+ if (s1.includes("Files modified by user:")) {
120
+ return "Files modified by user: [FILES]";
121
+ }
122
+ return s1;
123
+ }
124
+ function hydrateValue(s) {
125
+ if (typeof s !== "string") {
126
+ return s;
127
+ }
128
+ return s.replaceAll("[NUM]", "1").replaceAll("[DURATION]", "100").replaceAll("[CWD]", getCwd());
129
+ }
130
+ export {
131
+ withVCR
132
+ };
133
+ //# sourceMappingURL=vcr.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/vcr.ts"],
4
+ "sourcesContent": ["import { createHash, type UUID } from 'crypto'\nimport { mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { dirname } from 'path'\nimport type { AssistantMessage, UserMessage } from '../query'\nimport { existsSync } from 'fs'\nimport { env } from '../utils/env'\nimport { getCwd } from '../utils/state'\nimport * as path from 'path'\nimport { mapValues } from 'lodash-es'\nimport type { ContentBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nexport async function withVCR(\n messages: (UserMessage | AssistantMessage)[],\n f: () => Promise<AssistantMessage>,\n): Promise<AssistantMessage> {\n if (process.env.NODE_ENV !== 'test') {\n return await f()\n }\n\n const dehydratedInput = mapMessages(\n messages.map(_ => _.message.content),\n dehydrateValue,\n )\n const filename = `./fixtures/${dehydratedInput.map(_ => createHash('sha1').update(JSON.stringify(_)).digest('hex').slice(0, 6)).join('-')}.json`\n\n // Fetch cached fixture\n if (existsSync(filename)) {\n const cached = JSON.parse(readFileSync(filename, 'utf-8'))\n return mapAssistantMessage(cached.output, hydrateValue)\n }\n\n if (env.isCI) {\n console.warn(\n `Anthropic API fixture missing. Re-run npm test locally, then commit the result. ${JSON.stringify({ input: dehydratedInput }, null, 2)}`,\n )\n }\n\n // Create & write new fixture\n const result = await f()\n if (env.isCI) {\n return result\n }\n\n if (!existsSync(dirname(filename))) {\n mkdirSync(dirname(filename), { recursive: true })\n }\n writeFileSync(\n filename,\n JSON.stringify(\n {\n input: dehydratedInput,\n output: mapAssistantMessage(result, dehydrateValue),\n },\n null,\n 2,\n ),\n )\n return result\n}\n\nfunction mapMessages(\n messages: (UserMessage | AssistantMessage)['message']['content'][],\n f: (s: unknown) => unknown,\n): (UserMessage | AssistantMessage)['message']['content'][] {\n return messages.map(_ => {\n if (typeof _ === 'string') {\n return f(_)\n }\n return _.map(_ => {\n switch (_.type) {\n case 'tool_result':\n if (typeof _.content === 'string') {\n return { ..._, content: f(_.content) }\n }\n if (Array.isArray(_.content)) {\n return {\n ..._,\n content: _.content.map(_ => {\n switch (_.type) {\n case 'text':\n return { ..._, text: f(_.text) }\n case 'image':\n return _\n }\n }),\n }\n }\n return _\n case 'text':\n return { ..._, text: f(_.text) }\n case 'tool_use':\n return {\n ..._,\n input: mapValues(_.input as Record<string, unknown>, f),\n }\n case 'image':\n return _\n }\n })\n }) as (UserMessage | AssistantMessage)['message']['content'][]\n}\n\nfunction mapAssistantMessage(\n message: AssistantMessage,\n f: (s: unknown) => unknown,\n): AssistantMessage {\n return {\n durationMs: 'DURATION' as unknown as number,\n costUSD: 'COST' as unknown as number,\n uuid: 'UUID' as unknown as UUID,\n message: {\n ...message.message,\n content: message.message.content\n .map(_ => {\n switch (_.type) {\n case 'text':\n return {\n ..._,\n text: f(_.text) as string,\n citations: _.citations || [],\n } // Ensure citations\n case 'tool_use':\n return {\n ..._,\n input: mapValues(_.input as Record<string, unknown>, f),\n }\n default:\n return _ // Handle other block types unchanged\n }\n })\n .filter(Boolean) as ContentBlock[],\n },\n type: 'assistant',\n }\n}\n\nfunction dehydrateValue(s: unknown): unknown {\n if (typeof s !== 'string') {\n return s\n }\n const s1 = s\n .replace(/num_files=\"\\d+\"/g, 'num_files=\"[NUM]\"')\n .replace(/duration_ms=\"\\d+\"/g, 'duration_ms=\"[DURATION]\"')\n .replace(/cost_usd=\"\\d+\"/g, 'cost_usd=\"[COST]\"')\n .replace(/\\//g, path.sep)\n .replaceAll(getCwd(), '[CWD]')\n if (s1.includes('Files modified by user:')) {\n return 'Files modified by user: [FILES]'\n }\n return s1\n}\n\nfunction hydrateValue(s: unknown): unknown {\n if (typeof s !== 'string') {\n return s\n }\n return s\n .replaceAll('[NUM]', '1')\n .replaceAll('[DURATION]', '100')\n .replaceAll('[CWD]', getCwd())\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["_"]
7
+ }
@@ -0,0 +1,88 @@
1
+ import { ModelAdapterFactory } from '../services/modelAdapterFactory.js';
2
+ import { getModelCapabilities } from '../constants/modelCapabilities.js';
3
+ // Test different models' adapter selection
4
+ const testModels = [
5
+ {
6
+ name: 'GPT-5 Test',
7
+ modelName: 'gpt-5',
8
+ provider: 'openai',
9
+ apiKey: 'test-key',
10
+ maxTokens: 8192,
11
+ contextLength: 128000,
12
+ reasoningEffort: 'medium',
13
+ isActive: true,
14
+ createdAt: Date.now()
15
+ },
16
+ {
17
+ name: 'GPT-4o Test',
18
+ modelName: 'gpt-4o',
19
+ provider: 'openai',
20
+ apiKey: 'test-key',
21
+ maxTokens: 4096,
22
+ contextLength: 128000,
23
+ isActive: true,
24
+ createdAt: Date.now()
25
+ },
26
+ {
27
+ name: 'Claude Test',
28
+ modelName: 'claude-3-5-sonnet-20241022',
29
+ provider: 'anthropic',
30
+ apiKey: 'test-key',
31
+ maxTokens: 4096,
32
+ contextLength: 200000,
33
+ isActive: true,
34
+ createdAt: Date.now()
35
+ },
36
+ {
37
+ name: 'O1 Test',
38
+ modelName: 'o1',
39
+ provider: 'openai',
40
+ apiKey: 'test-key',
41
+ maxTokens: 4096,
42
+ contextLength: 128000,
43
+ isActive: true,
44
+ createdAt: Date.now()
45
+ },
46
+ {
47
+ name: 'GLM-5 Test',
48
+ modelName: 'glm-5',
49
+ provider: 'custom',
50
+ apiKey: 'test-key',
51
+ maxTokens: 8192,
52
+ contextLength: 128000,
53
+ baseURL: 'https://api.glm.ai/v1',
54
+ isActive: true,
55
+ createdAt: Date.now()
56
+ }
57
+ ];
58
+ console.log('๐Ÿงช Testing Model Adapter System\n');
59
+ console.log('='.repeat(60));
60
+ testModels.forEach(model => {
61
+ console.log(`\n๐Ÿ“Š Testing: ${model.name} (${model.modelName})`);
62
+ console.log('-'.repeat(40));
63
+ // Get capabilities
64
+ const capabilities = getModelCapabilities(model.modelName);
65
+ console.log(` โœ“ API Architecture: ${capabilities.apiArchitecture.primary}`);
66
+ console.log(` โœ“ Fallback: ${capabilities.apiArchitecture.fallback || 'none'}`);
67
+ console.log(` โœ“ Max Tokens Field: ${capabilities.parameters.maxTokensField}`);
68
+ console.log(` โœ“ Tool Calling Mode: ${capabilities.toolCalling.mode}`);
69
+ console.log(` โœ“ Supports Freeform: ${capabilities.toolCalling.supportsFreeform}`);
70
+ console.log(` โœ“ Supports Streaming: ${capabilities.streaming.supported}`);
71
+ // Test adapter creation
72
+ const adapter = ModelAdapterFactory.createAdapter(model);
73
+ console.log(` โœ“ Adapter Type: ${adapter.constructor.name}`);
74
+ // Test shouldUseResponsesAPI
75
+ const shouldUseResponses = ModelAdapterFactory.shouldUseResponsesAPI(model);
76
+ console.log(` โœ“ Should Use Responses API: ${shouldUseResponses}`);
77
+ // Test with custom endpoint
78
+ if (model.baseURL) {
79
+ const customModel = { ...model, baseURL: 'https://custom.api.com/v1' };
80
+ const customShouldUseResponses = ModelAdapterFactory.shouldUseResponsesAPI(customModel);
81
+ console.log(` โœ“ With Custom Endpoint: ${customShouldUseResponses ? 'Responses API' : 'Chat Completions'}`);
82
+ }
83
+ });
84
+ console.log('\n' + '='.repeat(60));
85
+ console.log('โœ… Adapter System Test Complete!');
86
+ console.log('\nTo enable the new system, set USE_NEW_ADAPTERS=true');
87
+ console.log('To use legacy system, set USE_NEW_ADAPTERS=false');
88
+ //# sourceMappingURL=testAdapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testAdapters.js","sourceRoot":"","sources":["../../src/test/testAdapters.ts"],"names":[],"mappings":"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"}