@vybestack/llxprt-code-tools 0.10.0-nightly.260613.1adad3b34

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 (364) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +294 -0
  3. package/dist/.last_build +0 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +2 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.d.ts +29 -0
  8. package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.js +30 -0
  9. package/dist/src/__tests__/fixtures/filesystem-tool-fixtures.js.map +1 -0
  10. package/dist/src/__tests__/fixtures/key-storage-fixtures.d.ts +39 -0
  11. package/dist/src/__tests__/fixtures/key-storage-fixtures.js +53 -0
  12. package/dist/src/__tests__/fixtures/key-storage-fixtures.js.map +1 -0
  13. package/dist/src/__tests__/fixtures/provider-formatting-fixtures.d.ts +140 -0
  14. package/dist/src/__tests__/fixtures/provider-formatting-fixtures.js +157 -0
  15. package/dist/src/__tests__/fixtures/provider-formatting-fixtures.js.map +1 -0
  16. package/dist/src/__tests__/red-test-helpers.d.ts +14 -0
  17. package/dist/src/__tests__/red-test-helpers.js +18 -0
  18. package/dist/src/__tests__/red-test-helpers.js.map +1 -0
  19. package/dist/src/formatters/IToolFormatter.d.ts +84 -0
  20. package/dist/src/formatters/IToolFormatter.js +6 -0
  21. package/dist/src/formatters/IToolFormatter.js.map +1 -0
  22. package/dist/src/formatters/ToolFormatter.d.ts +94 -0
  23. package/dist/src/formatters/ToolFormatter.js +379 -0
  24. package/dist/src/formatters/ToolFormatter.js.map +1 -0
  25. package/dist/src/formatters/ToolIdStrategy.d.ts +79 -0
  26. package/dist/src/formatters/ToolIdStrategy.js +173 -0
  27. package/dist/src/formatters/ToolIdStrategy.js.map +1 -0
  28. package/dist/src/formatters/doubleEscapeUtils.d.ts +46 -0
  29. package/dist/src/formatters/doubleEscapeUtils.js +223 -0
  30. package/dist/src/formatters/doubleEscapeUtils.js.map +1 -0
  31. package/dist/src/formatters/index.d.ts +21 -0
  32. package/dist/src/formatters/index.js +12 -0
  33. package/dist/src/formatters/index.js.map +1 -0
  34. package/dist/src/formatters/toolIdNormalization.d.ts +28 -0
  35. package/dist/src/formatters/toolIdNormalization.js +97 -0
  36. package/dist/src/formatters/toolIdNormalization.js.map +1 -0
  37. package/dist/src/formatters/toolNameUtils.d.ts +43 -0
  38. package/dist/src/formatters/toolNameUtils.js +143 -0
  39. package/dist/src/formatters/toolNameUtils.js.map +1 -0
  40. package/dist/src/index.d.ts +88 -0
  41. package/dist/src/index.js +68 -0
  42. package/dist/src/index.js.map +1 -0
  43. package/dist/src/interfaces/IAsyncTaskService.d.ts +57 -0
  44. package/dist/src/interfaces/IAsyncTaskService.js +6 -0
  45. package/dist/src/interfaces/IAsyncTaskService.js.map +1 -0
  46. package/dist/src/interfaces/IIdeService.d.ts +62 -0
  47. package/dist/src/interfaces/IIdeService.js +6 -0
  48. package/dist/src/interfaces/IIdeService.js.map +1 -0
  49. package/dist/src/interfaces/ILspService.d.ts +54 -0
  50. package/dist/src/interfaces/ILspService.js +6 -0
  51. package/dist/src/interfaces/ILspService.js.map +1 -0
  52. package/dist/src/interfaces/IMcpToolService.d.ts +47 -0
  53. package/dist/src/interfaces/IMcpToolService.js +6 -0
  54. package/dist/src/interfaces/IMcpToolService.js.map +1 -0
  55. package/dist/src/interfaces/IPromptRegistryService.d.ts +51 -0
  56. package/dist/src/interfaces/IPromptRegistryService.js +6 -0
  57. package/dist/src/interfaces/IPromptRegistryService.js.map +1 -0
  58. package/dist/src/interfaces/ISettingsService.d.ts +50 -0
  59. package/dist/src/interfaces/ISettingsService.js +6 -0
  60. package/dist/src/interfaces/ISettingsService.js.map +1 -0
  61. package/dist/src/interfaces/IShellExecutionService.d.ts +55 -0
  62. package/dist/src/interfaces/IShellExecutionService.js +6 -0
  63. package/dist/src/interfaces/IShellExecutionService.js.map +1 -0
  64. package/dist/src/interfaces/IShellToolHost.d.ts +176 -0
  65. package/dist/src/interfaces/IShellToolHost.js +6 -0
  66. package/dist/src/interfaces/IShellToolHost.js.map +1 -0
  67. package/dist/src/interfaces/ISkillService.d.ts +69 -0
  68. package/dist/src/interfaces/ISkillService.js +6 -0
  69. package/dist/src/interfaces/ISkillService.js.map +1 -0
  70. package/dist/src/interfaces/IStorageService.d.ts +42 -0
  71. package/dist/src/interfaces/IStorageService.js +6 -0
  72. package/dist/src/interfaces/IStorageService.js.map +1 -0
  73. package/dist/src/interfaces/ISubagentService.d.ts +112 -0
  74. package/dist/src/interfaces/ISubagentService.js +6 -0
  75. package/dist/src/interfaces/ISubagentService.js.map +1 -0
  76. package/dist/src/interfaces/ITaskToolHost.d.ts +185 -0
  77. package/dist/src/interfaces/ITaskToolHost.js +6 -0
  78. package/dist/src/interfaces/ITaskToolHost.js.map +1 -0
  79. package/dist/src/interfaces/ITodoService.d.ts +79 -0
  80. package/dist/src/interfaces/ITodoService.js +6 -0
  81. package/dist/src/interfaces/ITodoService.js.map +1 -0
  82. package/dist/src/interfaces/IToolHost.d.ts +91 -0
  83. package/dist/src/interfaces/IToolHost.js +6 -0
  84. package/dist/src/interfaces/IToolHost.js.map +1 -0
  85. package/dist/src/interfaces/IToolKeyStorage.d.ts +62 -0
  86. package/dist/src/interfaces/IToolKeyStorage.js +6 -0
  87. package/dist/src/interfaces/IToolKeyStorage.js.map +1 -0
  88. package/dist/src/interfaces/IToolMessageBus.d.ts +63 -0
  89. package/dist/src/interfaces/IToolMessageBus.js +6 -0
  90. package/dist/src/interfaces/IToolMessageBus.js.map +1 -0
  91. package/dist/src/interfaces/IToolRegistryHost.d.ts +43 -0
  92. package/dist/src/interfaces/IToolRegistryHost.js +6 -0
  93. package/dist/src/interfaces/IToolRegistryHost.js.map +1 -0
  94. package/dist/src/interfaces/IWebSearchService.d.ts +16 -0
  95. package/dist/src/interfaces/IWebSearchService.js +7 -0
  96. package/dist/src/interfaces/IWebSearchService.js.map +1 -0
  97. package/dist/src/interfaces/index.d.ts +33 -0
  98. package/dist/src/interfaces/index.js +6 -0
  99. package/dist/src/interfaces/index.js.map +1 -0
  100. package/dist/src/tools/activate-skill.d.ts +26 -0
  101. package/dist/src/tools/activate-skill.js +121 -0
  102. package/dist/src/tools/activate-skill.js.map +1 -0
  103. package/dist/src/tools/apply-patch.d.ts +65 -0
  104. package/dist/src/tools/apply-patch.js +528 -0
  105. package/dist/src/tools/apply-patch.js.map +1 -0
  106. package/dist/src/tools/ast-edit/ast-config.d.ts +67 -0
  107. package/dist/src/tools/ast-edit/ast-config.js +72 -0
  108. package/dist/src/tools/ast-edit/ast-config.js.map +1 -0
  109. package/dist/src/tools/ast-edit/ast-edit-invocation.d.ts +40 -0
  110. package/dist/src/tools/ast-edit/ast-edit-invocation.js +410 -0
  111. package/dist/src/tools/ast-edit/ast-edit-invocation.js.map +1 -0
  112. package/dist/src/tools/ast-edit/ast-query-extractor.d.ts +21 -0
  113. package/dist/src/tools/ast-edit/ast-query-extractor.js +178 -0
  114. package/dist/src/tools/ast-edit/ast-query-extractor.js.map +1 -0
  115. package/dist/src/tools/ast-edit/ast-read-file-invocation.d.ts +26 -0
  116. package/dist/src/tools/ast-edit/ast-read-file-invocation.js +149 -0
  117. package/dist/src/tools/ast-edit/ast-read-file-invocation.js.map +1 -0
  118. package/dist/src/tools/ast-edit/constants.d.ts +30 -0
  119. package/dist/src/tools/ast-edit/constants.js +36 -0
  120. package/dist/src/tools/ast-edit/constants.js.map +1 -0
  121. package/dist/src/tools/ast-edit/context-collector.d.ts +25 -0
  122. package/dist/src/tools/ast-edit/context-collector.js +115 -0
  123. package/dist/src/tools/ast-edit/context-collector.js.map +1 -0
  124. package/dist/src/tools/ast-edit/context-optimizer.d.ts +29 -0
  125. package/dist/src/tools/ast-edit/context-optimizer.js +86 -0
  126. package/dist/src/tools/ast-edit/context-optimizer.js.map +1 -0
  127. package/dist/src/tools/ast-edit/cross-file-analyzer.d.ts +41 -0
  128. package/dist/src/tools/ast-edit/cross-file-analyzer.js +294 -0
  129. package/dist/src/tools/ast-edit/cross-file-analyzer.js.map +1 -0
  130. package/dist/src/tools/ast-edit/edit-calculator.d.ts +71 -0
  131. package/dist/src/tools/ast-edit/edit-calculator.js +249 -0
  132. package/dist/src/tools/ast-edit/edit-calculator.js.map +1 -0
  133. package/dist/src/tools/ast-edit/edit-helpers.d.ts +22 -0
  134. package/dist/src/tools/ast-edit/edit-helpers.js +36 -0
  135. package/dist/src/tools/ast-edit/edit-helpers.js.map +1 -0
  136. package/dist/src/tools/ast-edit/language-analysis.d.ts +19 -0
  137. package/dist/src/tools/ast-edit/language-analysis.js +123 -0
  138. package/dist/src/tools/ast-edit/language-analysis.js.map +1 -0
  139. package/dist/src/tools/ast-edit/local-context-analyzer.d.ts +84 -0
  140. package/dist/src/tools/ast-edit/local-context-analyzer.js +267 -0
  141. package/dist/src/tools/ast-edit/local-context-analyzer.js.map +1 -0
  142. package/dist/src/tools/ast-edit/repository-context-provider.d.ts +22 -0
  143. package/dist/src/tools/ast-edit/repository-context-provider.js +139 -0
  144. package/dist/src/tools/ast-edit/repository-context-provider.js.map +1 -0
  145. package/dist/src/tools/ast-edit/types.d.ts +155 -0
  146. package/dist/src/tools/ast-edit/types.js +7 -0
  147. package/dist/src/tools/ast-edit/types.js.map +1 -0
  148. package/dist/src/tools/ast-edit/workspace-context-provider.d.ts +22 -0
  149. package/dist/src/tools/ast-edit/workspace-context-provider.js +39 -0
  150. package/dist/src/tools/ast-edit/workspace-context-provider.js.map +1 -0
  151. package/dist/src/tools/ast-edit.d.ts +43 -0
  152. package/dist/src/tools/ast-edit.js +183 -0
  153. package/dist/src/tools/ast-edit.js.map +1 -0
  154. package/dist/src/tools/ast-grep.d.ts +22 -0
  155. package/dist/src/tools/ast-grep.js +291 -0
  156. package/dist/src/tools/ast-grep.js.map +1 -0
  157. package/dist/src/tools/check-async-tasks.d.ts +46 -0
  158. package/dist/src/tools/check-async-tasks.js +241 -0
  159. package/dist/src/tools/check-async-tasks.js.map +1 -0
  160. package/dist/src/tools/codesearch.d.ts +25 -0
  161. package/dist/src/tools/codesearch.js +153 -0
  162. package/dist/src/tools/codesearch.js.map +1 -0
  163. package/dist/src/tools/delete_line_range.d.ts +41 -0
  164. package/dist/src/tools/delete_line_range.js +238 -0
  165. package/dist/src/tools/delete_line_range.js.map +1 -0
  166. package/dist/src/tools/direct-web-fetch.d.ts +22 -0
  167. package/dist/src/tools/direct-web-fetch.js +215 -0
  168. package/dist/src/tools/direct-web-fetch.js.map +1 -0
  169. package/dist/src/tools/edit-utils.d.ts +53 -0
  170. package/dist/src/tools/edit-utils.js +250 -0
  171. package/dist/src/tools/edit-utils.js.map +1 -0
  172. package/dist/src/tools/edit.d.ts +70 -0
  173. package/dist/src/tools/edit.js +816 -0
  174. package/dist/src/tools/edit.js.map +1 -0
  175. package/dist/src/tools/exa-web-search.d.ts +27 -0
  176. package/dist/src/tools/exa-web-search.js +153 -0
  177. package/dist/src/tools/exa-web-search.js.map +1 -0
  178. package/dist/src/tools/glob.d.ts +55 -0
  179. package/dist/src/tools/glob.js +284 -0
  180. package/dist/src/tools/glob.js.map +1 -0
  181. package/dist/src/tools/google-web-fetch.d.ts +34 -0
  182. package/dist/src/tools/google-web-fetch.js +417 -0
  183. package/dist/src/tools/google-web-fetch.js.map +1 -0
  184. package/dist/src/tools/google-web-search-invocation.d.ts +53 -0
  185. package/dist/src/tools/google-web-search-invocation.js +180 -0
  186. package/dist/src/tools/google-web-search-invocation.js.map +1 -0
  187. package/dist/src/tools/google-web-search.d.ts +16 -0
  188. package/dist/src/tools/google-web-search.js +34 -0
  189. package/dist/src/tools/google-web-search.js.map +1 -0
  190. package/dist/src/tools/grep.d.ts +56 -0
  191. package/dist/src/tools/grep.js +883 -0
  192. package/dist/src/tools/grep.js.map +1 -0
  193. package/dist/src/tools/insert_at_line.d.ts +41 -0
  194. package/dist/src/tools/insert_at_line.js +287 -0
  195. package/dist/src/tools/insert_at_line.js.map +1 -0
  196. package/dist/src/tools/list-subagents.d.ts +31 -0
  197. package/dist/src/tools/list-subagents.js +122 -0
  198. package/dist/src/tools/list-subagents.js.map +1 -0
  199. package/dist/src/tools/ls.d.ts +71 -0
  200. package/dist/src/tools/ls.js +238 -0
  201. package/dist/src/tools/ls.js.map +1 -0
  202. package/dist/src/tools/memoryTool.d.ts +66 -0
  203. package/dist/src/tools/memoryTool.js +435 -0
  204. package/dist/src/tools/memoryTool.js.map +1 -0
  205. package/dist/src/tools/modifiable-tool.d.ts +37 -0
  206. package/dist/src/tools/modifiable-tool.js +120 -0
  207. package/dist/src/tools/modifiable-tool.js.map +1 -0
  208. package/dist/src/tools/read-file.d.ts +49 -0
  209. package/dist/src/tools/read-file.js +279 -0
  210. package/dist/src/tools/read-file.js.map +1 -0
  211. package/dist/src/tools/read-many-files.d.ts +60 -0
  212. package/dist/src/tools/read-many-files.js +529 -0
  213. package/dist/src/tools/read-many-files.js.map +1 -0
  214. package/dist/src/tools/read_line_range.d.ts +47 -0
  215. package/dist/src/tools/read_line_range.js +248 -0
  216. package/dist/src/tools/read_line_range.js.map +1 -0
  217. package/dist/src/tools/ripGrep.d.ts +41 -0
  218. package/dist/src/tools/ripGrep.js +395 -0
  219. package/dist/src/tools/ripGrep.js.map +1 -0
  220. package/dist/src/tools/shell.d.ts +60 -0
  221. package/dist/src/tools/shell.js +735 -0
  222. package/dist/src/tools/shell.js.map +1 -0
  223. package/dist/src/tools/structural-analysis.d.ts +27 -0
  224. package/dist/src/tools/structural-analysis.js +1089 -0
  225. package/dist/src/tools/structural-analysis.js.map +1 -0
  226. package/dist/src/tools/stubs.d.ts +10 -0
  227. package/dist/src/tools/stubs.js +6 -0
  228. package/dist/src/tools/stubs.js.map +1 -0
  229. package/dist/src/tools/task.d.ts +41 -0
  230. package/dist/src/tools/task.js +195 -0
  231. package/dist/src/tools/task.js.map +1 -0
  232. package/dist/src/tools/todo-events.d.ts +22 -0
  233. package/dist/src/tools/todo-events.js +24 -0
  234. package/dist/src/tools/todo-events.js.map +1 -0
  235. package/dist/src/tools/todo-pause.d.ts +29 -0
  236. package/dist/src/tools/todo-pause.js +172 -0
  237. package/dist/src/tools/todo-pause.js.map +1 -0
  238. package/dist/src/tools/todo-read.d.ts +18 -0
  239. package/dist/src/tools/todo-read.js +98 -0
  240. package/dist/src/tools/todo-read.js.map +1 -0
  241. package/dist/src/tools/todo-store.d.ts +35 -0
  242. package/dist/src/tools/todo-store.js +124 -0
  243. package/dist/src/tools/todo-store.js.map +1 -0
  244. package/dist/src/tools/todo-write.d.ts +29 -0
  245. package/dist/src/tools/todo-write.js +366 -0
  246. package/dist/src/tools/todo-write.js.map +1 -0
  247. package/dist/src/tools/tool-registry.d.ts +156 -0
  248. package/dist/src/tools/tool-registry.js +623 -0
  249. package/dist/src/tools/tool-registry.js.map +1 -0
  250. package/dist/src/tools/tools.d.ts +403 -0
  251. package/dist/src/tools/tools.js +519 -0
  252. package/dist/src/tools/tools.js.map +1 -0
  253. package/dist/src/tools/write-file.d.ts +45 -0
  254. package/dist/src/tools/write-file.js +320 -0
  255. package/dist/src/tools/write-file.js.map +1 -0
  256. package/dist/src/types/index.d.ts +17 -0
  257. package/dist/src/types/index.js +9 -0
  258. package/dist/src/types/index.js.map +1 -0
  259. package/dist/src/types/provider-content-types.d.ts +56 -0
  260. package/dist/src/types/provider-content-types.js +6 -0
  261. package/dist/src/types/provider-content-types.js.map +1 -0
  262. package/dist/src/types/todo-schemas.d.ts +263 -0
  263. package/dist/src/types/todo-schemas.js +32 -0
  264. package/dist/src/types/todo-schemas.js.map +1 -0
  265. package/dist/src/types/tool-confirmation-types.d.ts +34 -0
  266. package/dist/src/types/tool-confirmation-types.js +29 -0
  267. package/dist/src/types/tool-confirmation-types.js.map +1 -0
  268. package/dist/src/types/tool-context.d.ts +31 -0
  269. package/dist/src/types/tool-context.js +6 -0
  270. package/dist/src/types/tool-context.js.map +1 -0
  271. package/dist/src/types/tool-error.d.ts +69 -0
  272. package/dist/src/types/tool-error.js +94 -0
  273. package/dist/src/types/tool-error.js.map +1 -0
  274. package/dist/src/types/tool-names.d.ts +57 -0
  275. package/dist/src/types/tool-names.js +64 -0
  276. package/dist/src/types/tool-names.js.map +1 -0
  277. package/dist/src/utils/EmojiFilter.d.ts +134 -0
  278. package/dist/src/utils/EmojiFilter.js +370 -0
  279. package/dist/src/utils/EmojiFilter.js.map +1 -0
  280. package/dist/src/utils/ast-grep-utils.d.ts +42 -0
  281. package/dist/src/utils/ast-grep-utils.js +140 -0
  282. package/dist/src/utils/ast-grep-utils.js.map +1 -0
  283. package/dist/src/utils/debugLogger.d.ts +11 -0
  284. package/dist/src/utils/debugLogger.js +16 -0
  285. package/dist/src/utils/debugLogger.js.map +1 -0
  286. package/dist/src/utils/diffOptions.d.ts +14 -0
  287. package/dist/src/utils/diffOptions.js +46 -0
  288. package/dist/src/utils/diffOptions.js.map +1 -0
  289. package/dist/src/utils/editor.d.ts +39 -0
  290. package/dist/src/utils/editor.js +212 -0
  291. package/dist/src/utils/editor.js.map +1 -0
  292. package/dist/src/utils/ensure-dirs.d.ts +10 -0
  293. package/dist/src/utils/ensure-dirs.js +16 -0
  294. package/dist/src/utils/ensure-dirs.js.map +1 -0
  295. package/dist/src/utils/errors.d.ts +59 -0
  296. package/dist/src/utils/errors.js +178 -0
  297. package/dist/src/utils/errors.js.map +1 -0
  298. package/dist/src/utils/fetch.d.ts +11 -0
  299. package/dist/src/utils/fetch.js +74 -0
  300. package/dist/src/utils/fetch.js.map +1 -0
  301. package/dist/src/utils/fileUtils.d.ts +32 -0
  302. package/dist/src/utils/fileUtils.js +363 -0
  303. package/dist/src/utils/fileUtils.js.map +1 -0
  304. package/dist/src/utils/fuzzy-replacer.d.ts +61 -0
  305. package/dist/src/utils/fuzzy-replacer.js +492 -0
  306. package/dist/src/utils/fuzzy-replacer.js.map +1 -0
  307. package/dist/src/utils/gitLineChanges.d.ts +12 -0
  308. package/dist/src/utils/gitLineChanges.js +171 -0
  309. package/dist/src/utils/gitLineChanges.js.map +1 -0
  310. package/dist/src/utils/gitUtils.d.ts +6 -0
  311. package/dist/src/utils/gitUtils.js +31 -0
  312. package/dist/src/utils/gitUtils.js.map +1 -0
  313. package/dist/src/utils/lsp-diagnostics-helper.d.ts +27 -0
  314. package/dist/src/utils/lsp-diagnostics-helper.js +62 -0
  315. package/dist/src/utils/lsp-diagnostics-helper.js.map +1 -0
  316. package/dist/src/utils/mediaUtils.d.ts +38 -0
  317. package/dist/src/utils/mediaUtils.js +22 -0
  318. package/dist/src/utils/mediaUtils.js.map +1 -0
  319. package/dist/src/utils/pathValidation.d.ts +7 -0
  320. package/dist/src/utils/pathValidation.js +39 -0
  321. package/dist/src/utils/pathValidation.js.map +1 -0
  322. package/dist/src/utils/paths.d.ts +7 -0
  323. package/dist/src/utils/paths.js +158 -0
  324. package/dist/src/utils/paths.js.map +1 -0
  325. package/dist/src/utils/resolveTextSearchTarget.d.ts +17 -0
  326. package/dist/src/utils/resolveTextSearchTarget.js +45 -0
  327. package/dist/src/utils/resolveTextSearchTarget.js.map +1 -0
  328. package/dist/src/utils/retry.d.ts +17 -0
  329. package/dist/src/utils/retry.js +185 -0
  330. package/dist/src/utils/retry.js.map +1 -0
  331. package/dist/src/utils/ripgrepPathResolver.d.ts +23 -0
  332. package/dist/src/utils/ripgrepPathResolver.js +179 -0
  333. package/dist/src/utils/ripgrepPathResolver.js.map +1 -0
  334. package/dist/src/utils/safeJsonStringify.d.ts +9 -0
  335. package/dist/src/utils/safeJsonStringify.js +21 -0
  336. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  337. package/dist/src/utils/schemaValidator.d.ts +13 -0
  338. package/dist/src/utils/schemaValidator.js +275 -0
  339. package/dist/src/utils/schemaValidator.js.map +1 -0
  340. package/dist/src/utils/terminalSerializer.d.ts +33 -0
  341. package/dist/src/utils/terminalSerializer.js +6 -0
  342. package/dist/src/utils/terminalSerializer.js.map +1 -0
  343. package/dist/src/utils/todoContextTracker.d.ts +12 -0
  344. package/dist/src/utils/todoContextTracker.js +28 -0
  345. package/dist/src/utils/todoContextTracker.js.map +1 -0
  346. package/dist/src/utils/todoFormatter.d.ts +24 -0
  347. package/dist/src/utils/todoFormatter.js +157 -0
  348. package/dist/src/utils/todoFormatter.js.map +1 -0
  349. package/dist/src/utils/todoReminderService.d.ts +22 -0
  350. package/dist/src/utils/todoReminderService.js +43 -0
  351. package/dist/src/utils/todoReminderService.js.map +1 -0
  352. package/dist/src/utils/tool-key-storage-facade.d.ts +32 -0
  353. package/dist/src/utils/tool-key-storage-facade.js +56 -0
  354. package/dist/src/utils/tool-key-storage-facade.js.map +1 -0
  355. package/dist/src/utils/tool-key-storage-types.d.ts +56 -0
  356. package/dist/src/utils/tool-key-storage-types.js +56 -0
  357. package/dist/src/utils/tool-key-storage-types.js.map +1 -0
  358. package/dist/src/utils/toolOutputLimiter.d.ts +29 -0
  359. package/dist/src/utils/toolOutputLimiter.js +107 -0
  360. package/dist/src/utils/toolOutputLimiter.js.map +1 -0
  361. package/dist/src/utils/unicodeUtils.d.ts +55 -0
  362. package/dist/src/utils/unicodeUtils.js +129 -0
  363. package/dist/src/utils/unicodeUtils.js.map +1 -0
  364. package/package.json +75 -0
@@ -0,0 +1,275 @@
1
+ /**
2
+ * @plan:PLAN-20260608-ISSUE1585.P11
3
+ * @requirement:REQ-PKG-BOUNDARY
4
+ */
5
+ /**
6
+ * @license
7
+ * Copyright 2025 Google LLC
8
+ * SPDX-License-Identifier: Apache-2.0
9
+ */
10
+ /**
11
+ * Package-local SchemaValidator for tool parameter validation.
12
+ *
13
+ * This is a self-contained copy of the SchemaValidator utility that
14
+ * was in packages/core/src/utils/schemaValidator.ts. It uses the `ajv`
15
+ * package directly with zero core imports.
16
+ *
17
+ * Tool files (tools.ts, ripGrep.ts, todo-pause.ts) need schema validation
18
+ * for their parameter schemas. Moving this utility into the tools package
19
+ * eliminates the core dependency.
20
+ */
21
+ // ajv v8 does not declare package "exports", so subpath imports like
22
+ // "ajv/dist/2020" are the only supported way to pull in the draft-2020-12
23
+ // build. See https://ajv.js.org/json-schema.html#draft-2020-12
24
+ // eslint-disable-next-line import/no-internal-modules
25
+ import Ajv2020Pkg from 'ajv/dist/2020.js';
26
+ import AjvPkg from 'ajv';
27
+ // Ajv's ESM/CJS interop: default/namespace dual export.
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ const Ajv2020Class = Ajv2020Pkg.default ?? Ajv2020Pkg;
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ const AjvClass = AjvPkg.default ?? AjvPkg;
32
+ /**
33
+ * The JSON Schema draft-07 meta-schema, inlined verbatim from ajv's
34
+ * `dist/refs/json-schema-draft-07.json`.
35
+ *
36
+ * This is inlined (rather than resolved via `createRequire` or a JSON
37
+ * import) so that it survives esbuild bundling into `bundle/llxprt.js`
38
+ * unchanged.
39
+ */
40
+ const draft07MetaSchema = {
41
+ $schema: 'http://json-schema.org/draft-07/schema#',
42
+ $id: 'http://json-schema.org/draft-07/schema#',
43
+ title: 'Core schema meta-schema',
44
+ definitions: {
45
+ schemaArray: {
46
+ type: 'array',
47
+ minItems: 1,
48
+ items: { $ref: '#' },
49
+ },
50
+ nonNegativeInteger: {
51
+ type: 'integer',
52
+ minimum: 0,
53
+ },
54
+ nonNegativeIntegerDefault0: {
55
+ allOf: [{ $ref: '#/definitions/nonNegativeInteger' }, { default: 0 }],
56
+ },
57
+ simpleTypes: {
58
+ enum: [
59
+ 'array',
60
+ 'boolean',
61
+ 'integer',
62
+ 'null',
63
+ 'number',
64
+ 'object',
65
+ 'string',
66
+ ],
67
+ },
68
+ stringArray: {
69
+ type: 'array',
70
+ items: { type: 'string' },
71
+ uniqueItems: true,
72
+ default: [],
73
+ },
74
+ },
75
+ type: ['object', 'boolean'],
76
+ properties: {
77
+ $id: { type: 'string', format: 'uri-reference' },
78
+ $schema: { type: 'string', format: 'uri' },
79
+ $ref: { type: 'string', format: 'uri-reference' },
80
+ $comment: { type: 'string' },
81
+ title: { type: 'string' },
82
+ description: { type: 'string' },
83
+ default: true,
84
+ readOnly: { type: 'boolean', default: false },
85
+ examples: { type: 'array', items: true },
86
+ multipleOf: { type: 'number', exclusiveMinimum: 0 },
87
+ maximum: { type: 'number' },
88
+ exclusiveMaximum: { type: 'number' },
89
+ minimum: { type: 'number' },
90
+ exclusiveMinimum: { type: 'number' },
91
+ maxLength: { $ref: '#/definitions/nonNegativeInteger' },
92
+ minLength: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
93
+ pattern: { type: 'string', format: 'regex' },
94
+ additionalItems: { $ref: '#' },
95
+ items: {
96
+ anyOf: [{ $ref: '#' }, { $ref: '#/definitions/schemaArray' }],
97
+ default: true,
98
+ },
99
+ maxItems: { $ref: '#/definitions/nonNegativeInteger' },
100
+ minItems: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
101
+ uniqueItems: { type: 'boolean', default: false },
102
+ contains: { $ref: '#' },
103
+ maxProperties: { $ref: '#/definitions/nonNegativeInteger' },
104
+ minProperties: { $ref: '#/definitions/nonNegativeIntegerDefault0' },
105
+ required: { $ref: '#/definitions/stringArray' },
106
+ additionalProperties: { $ref: '#' },
107
+ definitions: {
108
+ type: 'object',
109
+ additionalProperties: { $ref: '#' },
110
+ default: {},
111
+ },
112
+ properties: {
113
+ type: 'object',
114
+ additionalProperties: { $ref: '#' },
115
+ default: {},
116
+ },
117
+ patternProperties: {
118
+ type: 'object',
119
+ additionalProperties: { $ref: '#' },
120
+ propertyNames: { format: 'regex' },
121
+ default: {},
122
+ },
123
+ dependencies: {
124
+ type: 'object',
125
+ additionalProperties: {
126
+ anyOf: [{ $ref: '#' }, { $ref: '#/definitions/stringArray' }],
127
+ },
128
+ },
129
+ propertyNames: { $ref: '#' },
130
+ const: true,
131
+ enum: {
132
+ type: 'array',
133
+ items: true,
134
+ minItems: 1,
135
+ uniqueItems: true,
136
+ },
137
+ type: {
138
+ anyOf: [
139
+ { $ref: '#/definitions/simpleTypes' },
140
+ {
141
+ type: 'array',
142
+ items: { $ref: '#/definitions/simpleTypes' },
143
+ minItems: 1,
144
+ uniqueItems: true,
145
+ },
146
+ ],
147
+ },
148
+ format: { type: 'string' },
149
+ contentMediaType: { type: 'string' },
150
+ contentEncoding: { type: 'string' },
151
+ if: { $ref: '#' },
152
+ then: { $ref: '#' },
153
+ else: { $ref: '#' },
154
+ allOf: { $ref: '#/definitions/schemaArray' },
155
+ anyOf: { $ref: '#/definitions/schemaArray' },
156
+ oneOf: { $ref: '#/definitions/schemaArray' },
157
+ not: { $ref: '#' },
158
+ },
159
+ default: true,
160
+ };
161
+ // See: https://ajv.js.org/options.html#strict-mode-options
162
+ const ajvOptions = { strictSchema: false };
163
+ /**
164
+ * Two Ajv instances because draft-07 and draft-2020-12 are NOT
165
+ * behaviourally compatible. See the long comment in the core version
166
+ * of this file for details.
167
+ */
168
+ const ajValidator2020 = new Ajv2020Class(ajvOptions);
169
+ ajValidator2020.addMetaSchema(draft07MetaSchema);
170
+ const ajValidator07 = new AjvClass(ajvOptions);
171
+ /** Register custom formats on a given Ajv instance. */
172
+ function registerCustomFormats(instance) {
173
+ instance.addFormat('google-duration', {
174
+ type: 'string',
175
+ validate: () => true,
176
+ });
177
+ instance.addFormat('google-fieldmask', {
178
+ type: 'string',
179
+ validate: () => true,
180
+ });
181
+ instance.addFormat('something-totally-custom', {
182
+ type: 'string',
183
+ validate: () => true,
184
+ });
185
+ // eslint-disable-next-line sonarjs/regular-expr -- Static regex reviewed for lint hardening.
186
+ instance.addFormat('date', /^\d{4}-\d{2}-\d{2}$/);
187
+ }
188
+ registerCustomFormats(ajValidator2020);
189
+ registerCustomFormats(ajValidator07);
190
+ /** Returns true if the declared `$schema` URI refers to JSON Schema draft-07. */
191
+ function isDraft07SchemaUri(uri) {
192
+ return typeof uri === 'string' && /\/draft-07\/schema/.test(uri);
193
+ }
194
+ /**
195
+ * Package-local SchemaValidator utility for tool parameter validation.
196
+ * Zero core imports — uses ajv directly.
197
+ */
198
+ export class SchemaValidator {
199
+ static validate(schema, data) {
200
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
201
+ if (!schema) {
202
+ return null;
203
+ }
204
+ if (typeof data !== 'object' || data === null) {
205
+ return 'Value of params must be an object';
206
+ }
207
+ const extSchema = schema;
208
+ if (extSchema.requireOne) {
209
+ for (const oneOfGroup of extSchema.requireOne) {
210
+ const hasOne = oneOfGroup.some((prop) => data[prop] !== undefined &&
211
+ data[prop] !== null &&
212
+ data[prop] !== '');
213
+ if (!hasOne) {
214
+ return `params must have at least one of required properties: ${oneOfGroup.join(', ')}`;
215
+ }
216
+ }
217
+ }
218
+ const declaredSchemaUri = extSchema.$schema;
219
+ const instance = isDraft07SchemaUri(declaredSchemaUri)
220
+ ? ajValidator07
221
+ : ajValidator2020;
222
+ const ajvSchema = { ...extSchema };
223
+ delete ajvSchema.requireOne;
224
+ delete ajvSchema.$schema;
225
+ const validate = instance.compile(ajvSchema);
226
+ const valid = validate(data);
227
+ if (valid === false &&
228
+ validate.errors != null &&
229
+ validate.errors.length > 0) {
230
+ return SchemaValidator.formatErrors(validate.errors);
231
+ }
232
+ return null;
233
+ }
234
+ static formatPath(rawPath) {
235
+ if (rawPath === '') {
236
+ return 'params';
237
+ }
238
+ const normalized = rawPath
239
+ .replace(/\[(\d+)\]/g, '/$1')
240
+ .replace(/\.+/g, '/')
241
+ .replace(/\/+/g, '/')
242
+ .replace(/^\/+/, '');
243
+ return `params/${normalized}`;
244
+ }
245
+ static formatErrors(errors) {
246
+ const formattedErrors = errors.map((err) => {
247
+ /* eslint-disable @typescript-eslint/no-explicit-any */
248
+ const instancePath = err.instancePath;
249
+ const dataPath = err.dataPath;
250
+ /* eslint-enable @typescript-eslint/no-explicit-any */
251
+ const path = (typeof instancePath === 'string' && instancePath !== ''
252
+ ? instancePath
253
+ : null) ??
254
+ (typeof dataPath === 'string' && dataPath !== '' ? dataPath : null) ??
255
+ '';
256
+ const basePath = SchemaValidator.formatPath(path);
257
+ const message = err.message ?? 'is invalid';
258
+ return `${basePath} ${message}`;
259
+ });
260
+ const errorTextRaw = formattedErrors.join('; ');
261
+ const replaced = typeof errorTextRaw === 'string' && errorTextRaw !== ''
262
+ ? errorTextRaw.replace(/\bshould\b/gi, 'must')
263
+ : null;
264
+ let errorText = replaced ?? errorTextRaw;
265
+ if (typeof errorText === 'string' && errorText !== '') {
266
+ errorText = errorText.replace(/must NOT be shorter than (\d+) characters/gi, 'must NOT have fewer than $1 characters');
267
+ if (/anyOf/i.test(errorText) &&
268
+ !/must match a schema in anyOf/i.test(errorText)) {
269
+ errorText = `${errorText}; must match a schema in anyOf`;
270
+ }
271
+ }
272
+ return errorText;
273
+ }
274
+ }
275
+ //# sourceMappingURL=schemaValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../../src/utils/schemaValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @plan:PLAN-20260608-ISSUE1585.P11
3
+ * @requirement:REQ-PKG-BOUNDARY
4
+ */
5
+ /**
6
+ * @license
7
+ * Copyright 2025 Vybestack LLC
8
+ * SPDX-License-Identifier: Apache-2.0
9
+ */
10
+ /**
11
+ * Tools-owned structural type for terminal output.
12
+ *
13
+ * Replaces import of AnsiOutput from packages/core/src/utils/terminalSerializer.
14
+ * The full AnsiOutput type requires @xterm/headless which is a core dependency.
15
+ * Moved tool files that need AnsiOutput in their interfaces should use this
16
+ * package-local type instead.
17
+ *
18
+ * The type is structurally equivalent: an array of lines, where each line
19
+ * is an array of tokens. This avoids the @xterm/headless dependency while
20
+ * maintaining interface compatibility.
21
+ */
22
+ export interface AnsiToken {
23
+ text: string;
24
+ bold: boolean;
25
+ italic: boolean;
26
+ underline: boolean;
27
+ dim: boolean;
28
+ inverse: boolean;
29
+ fg: string;
30
+ bg: string;
31
+ }
32
+ export type AnsiLine = AnsiToken[];
33
+ export type AnsiOutput = AnsiLine[];
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @plan:PLAN-20260608-ISSUE1585.P11
3
+ * @requirement:REQ-PKG-BOUNDARY
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=terminalSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalSerializer.js","sourceRoot":"","sources":["../../../src/utils/terminalSerializer.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare class TodoContextTracker {
7
+ private activeTodoId;
8
+ static forAgent(sessionId: string, agentId: string): TodoContextTracker;
9
+ setActiveTodo(todoId: string | null): void;
10
+ clearActiveTodo(): void;
11
+ getActiveTodo(): string | null;
12
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const trackers = new Map();
7
+ export class TodoContextTracker {
8
+ activeTodoId = null;
9
+ static forAgent(sessionId, agentId) {
10
+ const key = `${sessionId}:${agentId}`;
11
+ let tracker = trackers.get(key);
12
+ if (!tracker) {
13
+ tracker = new TodoContextTracker();
14
+ trackers.set(key, tracker);
15
+ }
16
+ return tracker;
17
+ }
18
+ setActiveTodo(todoId) {
19
+ this.activeTodoId = todoId;
20
+ }
21
+ clearActiveTodo() {
22
+ this.activeTodoId = null;
23
+ }
24
+ getActiveTodo() {
25
+ return this.activeTodoId;
26
+ }
27
+ }
28
+ //# sourceMappingURL=todoContextTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoContextTracker.js","sourceRoot":"","sources":["../../../src/utils/todoContextTracker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEvD,MAAM,OAAO,kBAAkB;IACrB,YAAY,GAAkB,IAAI,CAAC;IAE3C,MAAM,CAAC,QAAQ,CAAC,SAAiB,EAAE,OAAe;QAChD,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,MAAqB;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,eAAe;QACb,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { type Todo, type TodoToolCall } from '../types/todo-schemas.js';
7
+ export interface GroupedToolCall {
8
+ toolCall: TodoToolCall;
9
+ count: number;
10
+ }
11
+ export interface TodoFormatterOptions {
12
+ header?: string;
13
+ includeSummary?: boolean;
14
+ maxToolCalls?: number;
15
+ getLiveToolCalls?: (todoId: string) => TodoToolCall[];
16
+ }
17
+ /**
18
+ * Groups consecutive identical tool calls to create a concise textual representation.
19
+ */
20
+ export declare const groupToolCalls: (toolCalls: TodoToolCall[]) => GroupedToolCall[];
21
+ /**
22
+ * Produces a textual representation of todos that mirrors the information shown in the Ink Todo panel.
23
+ */
24
+ export declare const formatTodoListForDisplay: (todos: Todo[], options?: TodoFormatterOptions) => string;
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const STATUS_ICONS = {
7
+ in_progress: '→',
8
+ pending: '○',
9
+ completed: '',
10
+ };
11
+ const STATUS_ORDER = {
12
+ in_progress: 0,
13
+ pending: 1,
14
+ completed: 2,
15
+ };
16
+ const DEFAULT_HEADER = '## Todo Progress';
17
+ const DEFAULT_MAX_TOOL_CALLS = 5;
18
+ /**
19
+ * Groups consecutive identical tool calls to create a concise textual representation.
20
+ */
21
+ export const groupToolCalls = (toolCalls) => {
22
+ if (toolCalls.length === 0) {
23
+ return [];
24
+ }
25
+ const grouped = [];
26
+ let currentGroup = {
27
+ toolCall: toolCalls[0],
28
+ count: 1,
29
+ };
30
+ for (let i = 1; i < toolCalls.length; i++) {
31
+ const current = toolCalls[i];
32
+ const previous = currentGroup.toolCall;
33
+ if (current.name === previous.name &&
34
+ JSON.stringify(current.parameters) === JSON.stringify(previous.parameters)) {
35
+ currentGroup.count++;
36
+ }
37
+ else {
38
+ grouped.push(currentGroup);
39
+ currentGroup = {
40
+ toolCall: current,
41
+ count: 1,
42
+ };
43
+ }
44
+ }
45
+ grouped.push(currentGroup);
46
+ return grouped;
47
+ };
48
+ const formatParameters = (parameters) => {
49
+ const segments = [];
50
+ const MAX_LENGTH = 40;
51
+ for (const [key, value] of Object.entries(parameters)) {
52
+ if (typeof value === 'string') {
53
+ let displayValue = value;
54
+ if (key === 'file_path' ||
55
+ key === 'absolute_path' ||
56
+ value.includes('/')) {
57
+ // eslint-disable-next-line sonarjs/nested-control-flow -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
58
+ if (displayValue.length > MAX_LENGTH) {
59
+ displayValue = '...' + displayValue.slice(-(MAX_LENGTH - 3));
60
+ }
61
+ }
62
+ else if (displayValue.length > MAX_LENGTH) {
63
+ displayValue = `${displayValue.substring(0, MAX_LENGTH - 3)}...`;
64
+ }
65
+ segments.push(`${key}: '${displayValue}'`);
66
+ }
67
+ else {
68
+ const jsonValue = JSON.stringify(value);
69
+ const displayValue = jsonValue.length > MAX_LENGTH
70
+ ? `${jsonValue.substring(0, MAX_LENGTH - 3)}...`
71
+ : jsonValue;
72
+ segments.push(`${key}: ${displayValue}`);
73
+ }
74
+ }
75
+ return segments.join(', ');
76
+ };
77
+ const pushToolCalls = (lines, toolCalls, indent, maxToolCalls) => {
78
+ if (toolCalls.length === 0) {
79
+ return;
80
+ }
81
+ const grouped = groupToolCalls(toolCalls);
82
+ if (grouped.length > maxToolCalls) {
83
+ const overflow = grouped.length - maxToolCalls;
84
+ lines.push(`${indent}↳ ...${overflow} more tool calls...`);
85
+ }
86
+ const visible = grouped.slice(-maxToolCalls);
87
+ for (const group of visible) {
88
+ const params = formatParameters(group.toolCall.parameters);
89
+ const countText = group.count > 1 ? ` ${group.count}x` : '';
90
+ lines.push(`${indent}↳ ${group.toolCall.name}(${params})${countText}`.trimEnd());
91
+ }
92
+ };
93
+ const calculateStats = (todos) => ({
94
+ total: todos.length,
95
+ completed: todos.filter((todo) => todo.status === 'completed').length,
96
+ inProgress: todos.filter((todo) => todo.status === 'in_progress').length,
97
+ pending: todos.filter((todo) => todo.status === 'pending').length,
98
+ });
99
+ const formatTodoEntry = (todo) => {
100
+ const marker = STATUS_ICONS[todo.status];
101
+ const currentSuffix = todo.status === 'in_progress' ? ' ← current' : '';
102
+ const statusText = todo.status === 'in_progress' ? ' (in_progress)' : '';
103
+ return `${marker} ${todo.content}${statusText}${currentSuffix}`;
104
+ };
105
+ const mergeToolCalls = (todo, getLiveToolCalls) => {
106
+ const baseCalls = todo.toolCalls ?? [];
107
+ if (!getLiveToolCalls) {
108
+ return baseCalls;
109
+ }
110
+ const seen = new Set(baseCalls.map((call) => call.id));
111
+ const liveCalls = getLiveToolCalls(todo.id).filter((call) => {
112
+ if (seen.has(call.id)) {
113
+ return false;
114
+ }
115
+ seen.add(call.id);
116
+ return true;
117
+ });
118
+ return [...baseCalls, ...liveCalls];
119
+ };
120
+ /**
121
+ * Produces a textual representation of todos that mirrors the information shown in the Ink Todo panel.
122
+ */
123
+ export const formatTodoListForDisplay = (todos, options = {}) => {
124
+ const header = options.header ?? DEFAULT_HEADER;
125
+ const maxToolCalls = options.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS;
126
+ const includeSummary = options.includeSummary ?? true;
127
+ if (todos.length === 0) {
128
+ return `${header}\n\nNo todos found.\n\nUse todo_write to create a task list when working on multi-step projects.`;
129
+ }
130
+ const lines = [header, ''];
131
+ if (includeSummary) {
132
+ const stats = calculateStats(todos);
133
+ lines.push(`${stats.total} tasks: ${stats.completed} completed, ${stats.inProgress} in progress, ${stats.pending} pending`);
134
+ lines.push('');
135
+ }
136
+ const orderedTodos = orderTodos(todos);
137
+ for (const todo of orderedTodos) {
138
+ lines.push(formatTodoEntry(todo));
139
+ if (todo.subtasks) {
140
+ for (const subtask of todo.subtasks) {
141
+ lines.push(` • ${subtask.content}`);
142
+ // eslint-disable-next-line sonarjs/nested-control-flow -- Existing structure is intentionally preserved; refactoring this boundary is outside the lint slice.
143
+ if (subtask.toolCalls && subtask.toolCalls.length > 0) {
144
+ pushToolCalls(lines, subtask.toolCalls, ' ', maxToolCalls);
145
+ }
146
+ }
147
+ }
148
+ const combinedToolCalls = mergeToolCalls(todo, options.getLiveToolCalls);
149
+ pushToolCalls(lines, combinedToolCalls, ' ', maxToolCalls);
150
+ lines.push('');
151
+ }
152
+ return lines.join('\n').trimEnd();
153
+ };
154
+ const orderTodos = (todos) =>
155
+ // Sort by status only, preserving original array order within each status group
156
+ [...todos].sort((a, b) => STATUS_ORDER[a.status] - STATUS_ORDER[b.status]);
157
+ //# sourceMappingURL=todoFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoFormatter.js","sourceRoot":"","sources":["../../../src/utils/todoFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Todo } from '../types/todo-schemas.js';
7
+ export interface TodoStateChange {
8
+ added: Todo[];
9
+ removed: Todo[];
10
+ statusChanged: Array<{
11
+ todo: Todo;
12
+ oldStatus: Todo['status'];
13
+ newStatus: Todo['status'];
14
+ }>;
15
+ }
16
+ export declare class TodoReminderService {
17
+ private static readonly EMPTY_TODO_REMINDER;
18
+ calculateStateChange(oldTodos: Todo[], newTodos: Todo[]): TodoStateChange;
19
+ shouldGenerateReminder(stateChange: TodoStateChange): boolean;
20
+ getReminderForStateChange(stateChange: TodoStateChange): string | undefined;
21
+ getReminderForEmptyTodos(isComplexTask: boolean): string;
22
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Vybestack LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export class TodoReminderService {
7
+ static EMPTY_TODO_REMINDER = `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.`;
8
+ calculateStateChange(oldTodos, newTodos) {
9
+ const oldById = new Map(oldTodos.map((todo) => [todo.id, todo]));
10
+ const newById = new Map(newTodos.map((todo) => [todo.id, todo]));
11
+ const added = newTodos.filter((todo) => !oldById.has(todo.id));
12
+ const removed = oldTodos.filter((todo) => !newById.has(todo.id));
13
+ const statusChanged = newTodos.flatMap((todo) => {
14
+ const oldTodo = oldById.get(todo.id);
15
+ if (!oldTodo || oldTodo.status === todo.status) {
16
+ return [];
17
+ }
18
+ return [
19
+ {
20
+ todo,
21
+ oldStatus: oldTodo.status,
22
+ newStatus: todo.status,
23
+ },
24
+ ];
25
+ });
26
+ return { added, removed, statusChanged };
27
+ }
28
+ shouldGenerateReminder(stateChange) {
29
+ return (stateChange.added.length > 0 ||
30
+ stateChange.removed.length > 0 ||
31
+ stateChange.statusChanged.length > 0);
32
+ }
33
+ getReminderForStateChange(stateChange) {
34
+ if (!this.shouldGenerateReminder(stateChange)) {
35
+ return undefined;
36
+ }
37
+ return 'Todo list updated. Continue using TodoWrite to keep progress current.';
38
+ }
39
+ getReminderForEmptyTodos(isComplexTask) {
40
+ return isComplexTask ? TodoReminderService.EMPTY_TODO_REMINDER : '';
41
+ }
42
+ }
43
+ //# sourceMappingURL=todoReminderService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todoReminderService.js","sourceRoot":"","sources":["../../../src/utils/todoReminderService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAU,mBAAmB,GAAG,uUAAuU,CAAC;IAEtX,oBAAoB,CAAC,QAAgB,EAAE,QAAgB;QACrD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO;gBACL;oBACE,IAAI;oBACJ,SAAS,EAAE,OAAO,CAAC,MAAM;oBACzB,SAAS,EAAE,IAAI,CAAC,MAAM;iBACvB;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3C,CAAC;IAED,sBAAsB,CAAC,WAA4B;QACjD,OAAO,CACL,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAC5B,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC9B,WAAW,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,WAA4B;QACpD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,uEAAuE,CAAC;IACjF,CAAC;IAED,wBAAwB,CAAC,aAAsB;QAC7C,OAAO,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,CAAC"}