@nanocollective/nanocoder 1.22.5 → 1.24.0

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 (590) hide show
  1. package/LICENSE.md +1 -15
  2. package/README.md +25 -821
  3. package/assets/nanocoder-vscode.vsix +0 -0
  4. package/dist/ai-sdk-client/ai-sdk-client.d.ts +3 -2
  5. package/dist/ai-sdk-client/ai-sdk-client.d.ts.map +1 -1
  6. package/dist/ai-sdk-client/ai-sdk-client.js +16 -2
  7. package/dist/ai-sdk-client/ai-sdk-client.js.map +1 -1
  8. package/dist/ai-sdk-client/chat/chat-handler.d.ts +2 -1
  9. package/dist/ai-sdk-client/chat/chat-handler.d.ts.map +1 -1
  10. package/dist/ai-sdk-client/chat/chat-handler.js +37 -70
  11. package/dist/ai-sdk-client/chat/chat-handler.js.map +1 -1
  12. package/dist/ai-sdk-client/chat/streaming-handler.d.ts +2 -2
  13. package/dist/ai-sdk-client/chat/streaming-handler.d.ts.map +1 -1
  14. package/dist/ai-sdk-client/chat/streaming-handler.js +4 -23
  15. package/dist/ai-sdk-client/chat/streaming-handler.js.map +1 -1
  16. package/dist/ai-sdk-client/error-handling/error-parser.d.ts.map +1 -1
  17. package/dist/ai-sdk-client/error-handling/error-parser.js +11 -3
  18. package/dist/ai-sdk-client/error-handling/error-parser.js.map +1 -1
  19. package/dist/ai-sdk-client/providers/provider-factory.d.ts +2 -1
  20. package/dist/ai-sdk-client/providers/provider-factory.d.ts.map +1 -1
  21. package/dist/ai-sdk-client/providers/provider-factory.js +55 -0
  22. package/dist/ai-sdk-client/providers/provider-factory.js.map +1 -1
  23. package/dist/app/App.d.ts +1 -1
  24. package/dist/app/App.d.ts.map +1 -1
  25. package/dist/app/App.js +148 -37
  26. package/dist/app/App.js.map +1 -1
  27. package/dist/app/components/chat-input.d.ts +9 -1
  28. package/dist/app/components/chat-input.d.ts.map +1 -1
  29. package/dist/app/components/chat-input.js +11 -8
  30. package/dist/app/components/chat-input.js.map +1 -1
  31. package/dist/app/components/modal-selectors.d.ts +6 -7
  32. package/dist/app/components/modal-selectors.d.ts.map +1 -1
  33. package/dist/app/components/modal-selectors.js +11 -7
  34. package/dist/app/components/modal-selectors.js.map +1 -1
  35. package/dist/app/components/settings-selector.d.ts.map +1 -1
  36. package/dist/app/components/settings-selector.js +3 -3
  37. package/dist/app/components/settings-selector.js.map +1 -1
  38. package/dist/app/helpers.d.ts.map +1 -1
  39. package/dist/app/helpers.js +2 -4
  40. package/dist/app/helpers.js.map +1 -1
  41. package/dist/app/index.d.ts +0 -1
  42. package/dist/app/index.d.ts.map +1 -1
  43. package/dist/app/index.js +0 -1
  44. package/dist/app/index.js.map +1 -1
  45. package/dist/app/types.d.ts +2 -0
  46. package/dist/app/types.d.ts.map +1 -1
  47. package/dist/app/utils/app-util.d.ts +1 -0
  48. package/dist/app/utils/app-util.d.ts.map +1 -1
  49. package/dist/app/utils/app-util.js +69 -204
  50. package/dist/app/utils/app-util.js.map +1 -1
  51. package/dist/app/utils/handlers/compact-handler.d.ts +6 -0
  52. package/dist/app/utils/handlers/compact-handler.d.ts.map +1 -0
  53. package/dist/app/utils/handlers/compact-handler.js +148 -0
  54. package/dist/app/utils/handlers/compact-handler.js.map +1 -0
  55. package/dist/app/utils/handlers/context-max-handler.d.ts +11 -0
  56. package/dist/app/utils/handlers/context-max-handler.d.ts.map +1 -0
  57. package/dist/app/utils/handlers/context-max-handler.js +102 -0
  58. package/dist/app/utils/handlers/context-max-handler.js.map +1 -0
  59. package/dist/app/utils/handlers/create-handler.d.ts +17 -0
  60. package/dist/app/utils/handlers/create-handler.d.ts.map +1 -0
  61. package/dist/app/utils/handlers/create-handler.js +112 -0
  62. package/dist/app/utils/handlers/create-handler.js.map +1 -0
  63. package/dist/app/utils/handlers/session-handler.d.ts +8 -0
  64. package/dist/app/utils/handlers/session-handler.d.ts.map +1 -0
  65. package/dist/app/utils/handlers/session-handler.js +99 -0
  66. package/dist/app/utils/handlers/session-handler.js.map +1 -0
  67. package/dist/auth/github-copilot.d.ts +44 -0
  68. package/dist/auth/github-copilot.d.ts.map +1 -0
  69. package/dist/auth/github-copilot.js +178 -0
  70. package/dist/auth/github-copilot.js.map +1 -0
  71. package/dist/cli.js +64 -3
  72. package/dist/cli.js.map +1 -1
  73. package/dist/client-factory.d.ts +1 -1
  74. package/dist/client-factory.d.ts.map +1 -1
  75. package/dist/client-factory.js +42 -10
  76. package/dist/client-factory.js.map +1 -1
  77. package/dist/commands/compact.d.ts +1 -6
  78. package/dist/commands/compact.d.ts.map +1 -1
  79. package/dist/commands/compact.js +2 -13
  80. package/dist/commands/compact.js.map +1 -1
  81. package/dist/commands/context-max.d.ts +14 -0
  82. package/dist/commands/context-max.d.ts.map +1 -0
  83. package/dist/commands/context-max.js +15 -0
  84. package/dist/commands/context-max.js.map +1 -0
  85. package/dist/commands/copilot-login-command.d.ts +3 -0
  86. package/dist/commands/copilot-login-command.d.ts.map +1 -0
  87. package/dist/commands/copilot-login-command.js +9 -0
  88. package/dist/commands/copilot-login-command.js.map +1 -0
  89. package/dist/commands/copilot-login.d.ts +9 -0
  90. package/dist/commands/copilot-login.d.ts.map +1 -0
  91. package/dist/commands/copilot-login.js +70 -0
  92. package/dist/commands/copilot-login.js.map +1 -0
  93. package/dist/commands/create-stub-command.d.ts +8 -0
  94. package/dist/commands/create-stub-command.d.ts.map +1 -0
  95. package/dist/commands/create-stub-command.js +14 -0
  96. package/dist/commands/create-stub-command.js.map +1 -0
  97. package/dist/commands/custom-commands.d.ts.map +1 -1
  98. package/dist/commands/custom-commands.js +88 -4
  99. package/dist/commands/custom-commands.js.map +1 -1
  100. package/dist/commands/exit.d.ts.map +1 -1
  101. package/dist/commands/exit.js +5 -8
  102. package/dist/commands/exit.js.map +1 -1
  103. package/dist/commands/explorer.d.ts +1 -2
  104. package/dist/commands/explorer.d.ts.map +1 -1
  105. package/dist/commands/explorer.js +2 -9
  106. package/dist/commands/explorer.js.map +1 -1
  107. package/dist/commands/help.d.ts.map +1 -1
  108. package/dist/commands/help.js +1 -1
  109. package/dist/commands/help.js.map +1 -1
  110. package/dist/commands/ide.d.ts +2 -0
  111. package/dist/commands/ide.d.ts.map +1 -0
  112. package/dist/commands/ide.js +3 -0
  113. package/dist/commands/ide.js.map +1 -0
  114. package/dist/commands/index.d.ts +5 -0
  115. package/dist/commands/index.d.ts.map +1 -1
  116. package/dist/commands/index.js +5 -0
  117. package/dist/commands/index.js.map +1 -1
  118. package/dist/commands/init.d.ts.map +1 -1
  119. package/dist/commands/init.js +2 -1
  120. package/dist/commands/init.js.map +1 -1
  121. package/dist/commands/model.d.ts +1 -2
  122. package/dist/commands/model.d.ts.map +1 -1
  123. package/dist/commands/model.js +2 -10
  124. package/dist/commands/model.js.map +1 -1
  125. package/dist/commands/provider.d.ts +1 -2
  126. package/dist/commands/provider.d.ts.map +1 -1
  127. package/dist/commands/provider.js +2 -10
  128. package/dist/commands/provider.js.map +1 -1
  129. package/dist/commands/resume.d.ts +8 -0
  130. package/dist/commands/resume.d.ts.map +1 -0
  131. package/dist/commands/resume.js +11 -0
  132. package/dist/commands/resume.js.map +1 -0
  133. package/dist/commands/schedule.d.ts +3 -0
  134. package/dist/commands/schedule.d.ts.map +1 -0
  135. package/dist/commands/schedule.js +177 -0
  136. package/dist/commands/schedule.js.map +1 -0
  137. package/dist/commands/settings.d.ts +1 -2
  138. package/dist/commands/settings.d.ts.map +1 -1
  139. package/dist/commands/settings.js +2 -10
  140. package/dist/commands/settings.js.map +1 -1
  141. package/dist/commands/status.d.ts +1 -2
  142. package/dist/commands/status.d.ts.map +1 -1
  143. package/dist/commands/status.js +2 -10
  144. package/dist/commands/status.js.map +1 -1
  145. package/dist/commands/usage.d.ts.map +1 -1
  146. package/dist/commands/usage.js +4 -3
  147. package/dist/commands/usage.js.map +1 -1
  148. package/dist/components/assistant-message.d.ts.map +1 -1
  149. package/dist/components/assistant-message.js +2 -27
  150. package/dist/components/assistant-message.js.map +1 -1
  151. package/dist/components/development-mode-indicator.d.ts +3 -2
  152. package/dist/components/development-mode-indicator.d.ts.map +1 -1
  153. package/dist/components/development-mode-indicator.js +23 -9
  154. package/dist/components/development-mode-indicator.js.map +1 -1
  155. package/dist/components/ide-selector.d.ts +7 -0
  156. package/dist/components/ide-selector.d.ts.map +1 -0
  157. package/dist/components/ide-selector.js +17 -0
  158. package/dist/components/ide-selector.js.map +1 -0
  159. package/dist/components/provider-selector.d.ts.map +1 -1
  160. package/dist/components/provider-selector.js +4 -3
  161. package/dist/components/provider-selector.js.map +1 -1
  162. package/dist/components/question-prompt.d.ts +8 -0
  163. package/dist/components/question-prompt.d.ts.map +1 -0
  164. package/dist/components/question-prompt.js +58 -0
  165. package/dist/components/question-prompt.js.map +1 -0
  166. package/dist/components/scheduler-view.d.ts +14 -0
  167. package/dist/components/scheduler-view.d.ts.map +1 -0
  168. package/dist/components/scheduler-view.js +17 -0
  169. package/dist/components/scheduler-view.js.map +1 -0
  170. package/dist/components/session-selector.d.ts +12 -0
  171. package/dist/components/session-selector.d.ts.map +1 -0
  172. package/dist/components/session-selector.js +108 -0
  173. package/dist/components/session-selector.js.map +1 -0
  174. package/dist/components/text-input.d.ts +13 -0
  175. package/dist/components/text-input.d.ts.map +1 -0
  176. package/dist/components/text-input.js +175 -0
  177. package/dist/components/text-input.js.map +1 -0
  178. package/dist/components/tool-confirmation.d.ts.map +1 -1
  179. package/dist/components/tool-confirmation.js +9 -6
  180. package/dist/components/tool-confirmation.js.map +1 -1
  181. package/dist/components/ui/styled-title.js +2 -2
  182. package/dist/components/ui/styled-title.js.map +1 -1
  183. package/dist/components/user-input.d.ts +4 -1
  184. package/dist/components/user-input.d.ts.map +1 -1
  185. package/dist/components/user-input.js +29 -24
  186. package/dist/components/user-input.js.map +1 -1
  187. package/dist/components/user-message.d.ts.map +1 -1
  188. package/dist/components/user-message.js +1 -23
  189. package/dist/components/user-message.js.map +1 -1
  190. package/dist/components/vscode-extension-prompt.d.ts +6 -1
  191. package/dist/components/vscode-extension-prompt.d.ts.map +1 -1
  192. package/dist/components/vscode-extension-prompt.js +80 -36
  193. package/dist/components/vscode-extension-prompt.js.map +1 -1
  194. package/dist/config/copilot-credentials.d.ts +27 -0
  195. package/dist/config/copilot-credentials.d.ts.map +1 -0
  196. package/dist/config/copilot-credentials.js +81 -0
  197. package/dist/config/copilot-credentials.js.map +1 -0
  198. package/dist/config/index.d.ts +0 -2
  199. package/dist/config/index.d.ts.map +1 -1
  200. package/dist/config/index.js +63 -27
  201. package/dist/config/index.js.map +1 -1
  202. package/dist/config/mcp-config-loader.d.ts +2 -3
  203. package/dist/config/mcp-config-loader.d.ts.map +1 -1
  204. package/dist/config/mcp-config-loader.js +136 -181
  205. package/dist/config/mcp-config-loader.js.map +1 -1
  206. package/dist/config/nanocoder-tools-config.js +2 -2
  207. package/dist/config/nanocoder-tools-config.js.map +1 -1
  208. package/dist/config/themes.d.ts.map +1 -1
  209. package/dist/config/themes.js +9 -746
  210. package/dist/config/themes.js.map +1 -1
  211. package/dist/config/validation.d.ts.map +1 -1
  212. package/dist/config/validation.js +0 -19
  213. package/dist/config/validation.js.map +1 -1
  214. package/dist/custom-commands/command-integration.d.ts +24 -0
  215. package/dist/custom-commands/command-integration.d.ts.map +1 -0
  216. package/dist/custom-commands/command-integration.js +68 -0
  217. package/dist/custom-commands/command-integration.js.map +1 -0
  218. package/dist/custom-commands/executor.d.ts.map +1 -1
  219. package/dist/custom-commands/executor.js +12 -2
  220. package/dist/custom-commands/executor.js.map +1 -1
  221. package/dist/custom-commands/loader.d.ts +33 -5
  222. package/dist/custom-commands/loader.d.ts.map +1 -1
  223. package/dist/custom-commands/loader.js +191 -18
  224. package/dist/custom-commands/loader.js.map +1 -1
  225. package/dist/custom-commands/parser.d.ts.map +1 -1
  226. package/dist/custom-commands/parser.js +106 -48
  227. package/dist/custom-commands/parser.js.map +1 -1
  228. package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts +6 -1
  229. package/dist/hooks/chat-handler/conversation/conversation-loop.d.ts.map +1 -1
  230. package/dist/hooks/chat-handler/conversation/conversation-loop.js +89 -76
  231. package/dist/hooks/chat-handler/conversation/conversation-loop.js.map +1 -1
  232. package/dist/hooks/chat-handler/conversation/tool-executor.d.ts +7 -2
  233. package/dist/hooks/chat-handler/conversation/tool-executor.d.ts.map +1 -1
  234. package/dist/hooks/chat-handler/conversation/tool-executor.js +109 -41
  235. package/dist/hooks/chat-handler/conversation/tool-executor.js.map +1 -1
  236. package/dist/hooks/chat-handler/types.d.ts +6 -1
  237. package/dist/hooks/chat-handler/types.d.ts.map +1 -1
  238. package/dist/hooks/chat-handler/useChatHandler.d.ts +1 -1
  239. package/dist/hooks/chat-handler/useChatHandler.d.ts.map +1 -1
  240. package/dist/hooks/chat-handler/useChatHandler.js +19 -5
  241. package/dist/hooks/chat-handler/useChatHandler.js.map +1 -1
  242. package/dist/hooks/useAppHandlers.d.ts +10 -1
  243. package/dist/hooks/useAppHandlers.d.ts.map +1 -1
  244. package/dist/hooks/useAppHandlers.js +124 -13
  245. package/dist/hooks/useAppHandlers.js.map +1 -1
  246. package/dist/hooks/useAppInitialization.d.ts +5 -3
  247. package/dist/hooks/useAppInitialization.d.ts.map +1 -1
  248. package/dist/hooks/useAppInitialization.js +54 -30
  249. package/dist/hooks/useAppInitialization.js.map +1 -1
  250. package/dist/hooks/useAppState.d.ts +27 -7
  251. package/dist/hooks/useAppState.d.ts.map +1 -1
  252. package/dist/hooks/useAppState.js +54 -22
  253. package/dist/hooks/useAppState.js.map +1 -1
  254. package/dist/hooks/useContextPercentage.d.ts +17 -0
  255. package/dist/hooks/useContextPercentage.d.ts.map +1 -0
  256. package/dist/hooks/useContextPercentage.js +71 -0
  257. package/dist/hooks/useContextPercentage.js.map +1 -0
  258. package/dist/hooks/useModeHandlers.d.ts +9 -12
  259. package/dist/hooks/useModeHandlers.d.ts.map +1 -1
  260. package/dist/hooks/useModeHandlers.js +31 -91
  261. package/dist/hooks/useModeHandlers.js.map +1 -1
  262. package/dist/hooks/useNonInteractiveMode.d.ts +7 -0
  263. package/dist/hooks/useNonInteractiveMode.d.ts.map +1 -1
  264. package/dist/hooks/useNonInteractiveMode.js +42 -3
  265. package/dist/hooks/useNonInteractiveMode.js.map +1 -1
  266. package/dist/hooks/useSchedulerMode.d.ts +30 -0
  267. package/dist/hooks/useSchedulerMode.d.ts.map +1 -0
  268. package/dist/hooks/useSchedulerMode.js +99 -0
  269. package/dist/hooks/useSchedulerMode.js.map +1 -0
  270. package/dist/hooks/useSessionAutosave.d.ts +16 -0
  271. package/dist/hooks/useSessionAutosave.d.ts.map +1 -0
  272. package/dist/hooks/useSessionAutosave.js +133 -0
  273. package/dist/hooks/useSessionAutosave.js.map +1 -0
  274. package/dist/hooks/useToolHandler.d.ts +2 -1
  275. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  276. package/dist/hooks/useToolHandler.js +9 -3
  277. package/dist/hooks/useToolHandler.js.map +1 -1
  278. package/dist/lsp/lsp-manager.d.ts.map +1 -1
  279. package/dist/lsp/lsp-manager.js +10 -0
  280. package/dist/lsp/lsp-manager.js.map +1 -1
  281. package/dist/mcp/mcp-client.d.ts.map +1 -1
  282. package/dist/mcp/mcp-client.js +23 -3
  283. package/dist/mcp/mcp-client.js.map +1 -1
  284. package/dist/mcp/transport-factory.d.ts.map +1 -1
  285. package/dist/mcp/transport-factory.js +4 -36
  286. package/dist/mcp/transport-factory.js.map +1 -1
  287. package/dist/models/index.d.ts +1 -1
  288. package/dist/models/index.d.ts.map +1 -1
  289. package/dist/models/index.js +1 -1
  290. package/dist/models/index.js.map +1 -1
  291. package/dist/models/models-dev-client.d.ts +8 -1
  292. package/dist/models/models-dev-client.d.ts.map +1 -1
  293. package/dist/models/models-dev-client.js +71 -15
  294. package/dist/models/models-dev-client.js.map +1 -1
  295. package/dist/schedule/cron.d.ts +14 -0
  296. package/dist/schedule/cron.d.ts.map +1 -0
  297. package/dist/schedule/cron.js +107 -0
  298. package/dist/schedule/cron.js.map +1 -0
  299. package/dist/schedule/index.d.ts +4 -0
  300. package/dist/schedule/index.d.ts.map +1 -0
  301. package/dist/schedule/index.js +4 -0
  302. package/dist/schedule/index.js.map +1 -0
  303. package/dist/schedule/runner.d.ts +42 -0
  304. package/dist/schedule/runner.d.ts.map +1 -0
  305. package/dist/schedule/runner.js +136 -0
  306. package/dist/schedule/runner.js.map +1 -0
  307. package/dist/schedule/storage.d.ts +9 -0
  308. package/dist/schedule/storage.d.ts.map +1 -0
  309. package/dist/schedule/storage.js +68 -0
  310. package/dist/schedule/storage.js.map +1 -0
  311. package/dist/schedule/types.d.ts +24 -0
  312. package/dist/schedule/types.d.ts.map +1 -0
  313. package/dist/schedule/types.js +2 -0
  314. package/dist/schedule/types.js.map +1 -0
  315. package/dist/services/bash-executor.d.ts.map +1 -1
  316. package/dist/services/bash-executor.js +5 -0
  317. package/dist/services/bash-executor.js.map +1 -1
  318. package/dist/session/session-manager.d.ts +57 -0
  319. package/dist/session/session-manager.d.ts.map +1 -0
  320. package/dist/session/session-manager.js +361 -0
  321. package/dist/session/session-manager.js.map +1 -0
  322. package/dist/test-utils/render-with-theme.d.ts.map +1 -1
  323. package/dist/test-utils/render-with-theme.js +2 -1
  324. package/dist/test-utils/render-with-theme.js.map +1 -1
  325. package/dist/tool-calling/tool-parser.d.ts +4 -3
  326. package/dist/tool-calling/tool-parser.d.ts.map +1 -1
  327. package/dist/tool-calling/tool-parser.js +17 -34
  328. package/dist/tool-calling/tool-parser.js.map +1 -1
  329. package/dist/tool-calling/xml-parser.d.ts +8 -4
  330. package/dist/tool-calling/xml-parser.d.ts.map +1 -1
  331. package/dist/tool-calling/xml-parser.js +15 -5
  332. package/dist/tool-calling/xml-parser.js.map +1 -1
  333. package/dist/tools/ask-question.d.ts +3 -0
  334. package/dist/tools/ask-question.d.ts.map +1 -0
  335. package/dist/tools/ask-question.js +66 -0
  336. package/dist/tools/ask-question.js.map +1 -0
  337. package/dist/tools/execute-bash.d.ts.map +1 -1
  338. package/dist/tools/execute-bash.js +6 -1
  339. package/dist/tools/execute-bash.js.map +1 -1
  340. package/dist/tools/fetch-url.d.ts.map +1 -1
  341. package/dist/tools/fetch-url.js +11 -2
  342. package/dist/tools/fetch-url.js.map +1 -1
  343. package/dist/tools/file-ops/copy-file.d.ts +3 -0
  344. package/dist/tools/file-ops/copy-file.d.ts.map +1 -0
  345. package/dist/tools/file-ops/copy-file.js +96 -0
  346. package/dist/tools/file-ops/copy-file.js.map +1 -0
  347. package/dist/tools/file-ops/create-directory.d.ts +3 -0
  348. package/dist/tools/file-ops/create-directory.d.ts.map +1 -0
  349. package/dist/tools/file-ops/create-directory.js +59 -0
  350. package/dist/tools/file-ops/create-directory.js.map +1 -0
  351. package/dist/tools/file-ops/delete-file.d.ts +3 -0
  352. package/dist/tools/file-ops/delete-file.d.ts.map +1 -0
  353. package/dist/tools/file-ops/delete-file.js +74 -0
  354. package/dist/tools/file-ops/delete-file.js.map +1 -0
  355. package/dist/tools/file-ops/index.d.ts +3 -0
  356. package/dist/tools/file-ops/index.d.ts.map +1 -0
  357. package/dist/tools/file-ops/index.js +8 -0
  358. package/dist/tools/file-ops/index.js.map +1 -0
  359. package/dist/tools/file-ops/move-file.d.ts +3 -0
  360. package/dist/tools/file-ops/move-file.d.ts.map +1 -0
  361. package/dist/tools/file-ops/move-file.js +96 -0
  362. package/dist/tools/file-ops/move-file.js.map +1 -0
  363. package/dist/tools/file-ops/string-replace-preview.d.ts +10 -0
  364. package/dist/tools/file-ops/string-replace-preview.d.ts.map +1 -0
  365. package/dist/tools/file-ops/string-replace-preview.js +171 -0
  366. package/dist/tools/file-ops/string-replace-preview.js.map +1 -0
  367. package/dist/tools/file-ops/string-replace.d.ts +3 -0
  368. package/dist/tools/file-ops/string-replace.d.ts.map +1 -0
  369. package/dist/tools/file-ops/string-replace.js +178 -0
  370. package/dist/tools/file-ops/string-replace.js.map +1 -0
  371. package/dist/tools/file-ops/write-file.d.ts +3 -0
  372. package/dist/tools/file-ops/write-file.d.ts.map +1 -0
  373. package/dist/tools/{write-file.js → file-ops/write-file.js} +34 -79
  374. package/dist/tools/file-ops/write-file.js.map +1 -0
  375. package/dist/tools/find-files.d.ts.map +1 -1
  376. package/dist/tools/find-files.js +1 -0
  377. package/dist/tools/find-files.js.map +1 -1
  378. package/dist/tools/git/git-diff.d.ts.map +1 -1
  379. package/dist/tools/git/git-diff.js +1 -0
  380. package/dist/tools/git/git-diff.js.map +1 -1
  381. package/dist/tools/git/git-log.d.ts.map +1 -1
  382. package/dist/tools/git/git-log.js +1 -0
  383. package/dist/tools/git/git-log.js.map +1 -1
  384. package/dist/tools/git/git-reset.js +1 -1
  385. package/dist/tools/git/git-reset.js.map +1 -1
  386. package/dist/tools/git/git-status.d.ts.map +1 -1
  387. package/dist/tools/git/git-status.js +1 -0
  388. package/dist/tools/git/git-status.js.map +1 -1
  389. package/dist/tools/git/index.js +3 -3
  390. package/dist/tools/git/index.js.map +1 -1
  391. package/dist/tools/git/utils.d.ts +4 -0
  392. package/dist/tools/git/utils.d.ts.map +1 -1
  393. package/dist/tools/git/utils.js +12 -0
  394. package/dist/tools/git/utils.js.map +1 -1
  395. package/dist/tools/index.d.ts +1 -0
  396. package/dist/tools/index.d.ts.map +1 -1
  397. package/dist/tools/index.js +15 -2
  398. package/dist/tools/index.js.map +1 -1
  399. package/dist/tools/list-directory.d.ts.map +1 -1
  400. package/dist/tools/list-directory.js +2 -1
  401. package/dist/tools/list-directory.js.map +1 -1
  402. package/dist/tools/lsp-get-diagnostics.d.ts.map +1 -1
  403. package/dist/tools/lsp-get-diagnostics.js +1 -5
  404. package/dist/tools/lsp-get-diagnostics.js.map +1 -1
  405. package/dist/tools/read-file.d.ts.map +1 -1
  406. package/dist/tools/read-file.js +1 -0
  407. package/dist/tools/read-file.js.map +1 -1
  408. package/dist/tools/search-file-contents.d.ts.map +1 -1
  409. package/dist/tools/search-file-contents.js +60 -10
  410. package/dist/tools/search-file-contents.js.map +1 -1
  411. package/dist/tools/tasks/list-tasks.d.ts.map +1 -1
  412. package/dist/tools/tasks/list-tasks.js +1 -0
  413. package/dist/tools/tasks/list-tasks.js.map +1 -1
  414. package/dist/tools/tool-manager.d.ts +10 -0
  415. package/dist/tools/tool-manager.d.ts.map +1 -1
  416. package/dist/tools/tool-manager.js +25 -2
  417. package/dist/tools/tool-manager.js.map +1 -1
  418. package/dist/tools/tool-registry.d.ts +9 -1
  419. package/dist/tools/tool-registry.d.ts.map +1 -1
  420. package/dist/tools/tool-registry.js +17 -1
  421. package/dist/tools/tool-registry.js.map +1 -1
  422. package/dist/tools/web-search.d.ts.map +1 -1
  423. package/dist/tools/web-search.js +1 -0
  424. package/dist/tools/web-search.js.map +1 -1
  425. package/dist/types/app.d.ts +5 -0
  426. package/dist/types/app.d.ts.map +1 -1
  427. package/dist/types/commands.d.ts +20 -1
  428. package/dist/types/commands.d.ts.map +1 -1
  429. package/dist/types/config.d.ts +11 -15
  430. package/dist/types/config.d.ts.map +1 -1
  431. package/dist/types/core.d.ts +15 -4
  432. package/dist/types/core.d.ts.map +1 -1
  433. package/dist/types/core.js +7 -0
  434. package/dist/types/core.js.map +1 -1
  435. package/dist/types/markdown-parser.d.ts +2 -10
  436. package/dist/types/markdown-parser.d.ts.map +1 -1
  437. package/dist/types/mcp.d.ts +2 -28
  438. package/dist/types/mcp.d.ts.map +1 -1
  439. package/dist/types/ui.d.ts +1 -1
  440. package/dist/types/ui.d.ts.map +1 -1
  441. package/dist/utils/ansi-truncate.d.ts +6 -0
  442. package/dist/utils/ansi-truncate.d.ts.map +1 -0
  443. package/dist/utils/ansi-truncate.js +39 -0
  444. package/dist/utils/ansi-truncate.js.map +1 -0
  445. package/dist/utils/auto-compact.d.ts.map +1 -1
  446. package/dist/utils/auto-compact.js +13 -7
  447. package/dist/utils/auto-compact.js.map +1 -1
  448. package/dist/utils/installation-detector.d.ts +6 -0
  449. package/dist/utils/installation-detector.d.ts.map +1 -1
  450. package/dist/utils/installation-detector.js +33 -19
  451. package/dist/utils/installation-detector.js.map +1 -1
  452. package/dist/utils/logging/health-monitor/checks/memory-check.d.ts.map +1 -1
  453. package/dist/utils/logging/health-monitor/checks/memory-check.js +2 -1
  454. package/dist/utils/logging/health-monitor/checks/memory-check.js.map +1 -1
  455. package/dist/utils/logging/health-monitor/core/health-monitor.d.ts.map +1 -1
  456. package/dist/utils/logging/health-monitor/core/health-monitor.js +3 -2
  457. package/dist/utils/logging/health-monitor/core/health-monitor.js.map +1 -1
  458. package/dist/utils/logging/index.d.ts.map +1 -1
  459. package/dist/utils/logging/index.js +18 -30
  460. package/dist/utils/logging/index.js.map +1 -1
  461. package/dist/utils/logging/performance.d.ts.map +1 -1
  462. package/dist/utils/logging/performance.js +21 -17
  463. package/dist/utils/logging/performance.js.map +1 -1
  464. package/dist/utils/logging/pino-logger.d.ts.map +1 -1
  465. package/dist/utils/logging/pino-logger.js +7 -8
  466. package/dist/utils/logging/pino-logger.js.map +1 -1
  467. package/dist/utils/logging/redaction.d.ts.map +1 -1
  468. package/dist/utils/logging/redaction.js +2 -0
  469. package/dist/utils/logging/redaction.js.map +1 -1
  470. package/dist/utils/logging/request-tracker.d.ts.map +1 -1
  471. package/dist/utils/logging/request-tracker.js +6 -5
  472. package/dist/utils/logging/request-tracker.js.map +1 -1
  473. package/dist/utils/logging/safe-process.d.ts +16 -0
  474. package/dist/utils/logging/safe-process.d.ts.map +1 -0
  475. package/dist/utils/logging/safe-process.js +37 -0
  476. package/dist/utils/logging/safe-process.js.map +1 -0
  477. package/dist/utils/logging/types.d.ts +0 -3
  478. package/dist/utils/logging/types.d.ts.map +1 -1
  479. package/dist/utils/message-builder.d.ts +0 -5
  480. package/dist/utils/message-builder.d.ts.map +1 -1
  481. package/dist/utils/message-builder.js +0 -8
  482. package/dist/utils/message-builder.js.map +1 -1
  483. package/dist/utils/path-validation.d.ts.map +1 -1
  484. package/dist/utils/path-validation.js +3 -1
  485. package/dist/utils/path-validation.js.map +1 -1
  486. package/dist/utils/path-validators.d.ts +16 -0
  487. package/dist/utils/path-validators.d.ts.map +1 -0
  488. package/dist/utils/path-validators.js +55 -0
  489. package/dist/utils/path-validators.js.map +1 -0
  490. package/dist/utils/question-queue.d.ts +15 -0
  491. package/dist/utils/question-queue.d.ts.map +1 -0
  492. package/dist/utils/question-queue.js +25 -0
  493. package/dist/utils/question-queue.js.map +1 -0
  494. package/dist/utils/response-formatter.d.ts +108 -0
  495. package/dist/utils/response-formatter.d.ts.map +1 -0
  496. package/dist/utils/response-formatter.js +372 -0
  497. package/dist/utils/response-formatter.js.map +1 -0
  498. package/dist/utils/shutdown/index.d.ts +7 -0
  499. package/dist/utils/shutdown/index.d.ts.map +1 -0
  500. package/dist/utils/shutdown/index.js +6 -0
  501. package/dist/utils/shutdown/index.js.map +1 -0
  502. package/dist/utils/shutdown/shutdown-manager.d.ts +19 -0
  503. package/dist/utils/shutdown/shutdown-manager.d.ts.map +1 -0
  504. package/dist/utils/shutdown/shutdown-manager.js +100 -0
  505. package/dist/utils/shutdown/shutdown-manager.js.map +1 -0
  506. package/dist/utils/shutdown/types.d.ts +9 -0
  507. package/dist/utils/shutdown/types.d.ts.map +1 -0
  508. package/dist/utils/shutdown/types.js +2 -0
  509. package/dist/utils/shutdown/types.js.map +1 -0
  510. package/dist/utils/text-wrapping.d.ts +8 -0
  511. package/dist/utils/text-wrapping.d.ts.map +1 -0
  512. package/dist/utils/text-wrapping.js +29 -0
  513. package/dist/utils/text-wrapping.js.map +1 -0
  514. package/dist/utils/tool-approval.d.ts +6 -0
  515. package/dist/utils/tool-approval.d.ts.map +1 -0
  516. package/dist/utils/tool-approval.js +15 -0
  517. package/dist/utils/tool-approval.js.map +1 -0
  518. package/dist/utils/tool-result-display.d.ts +15 -1
  519. package/dist/utils/tool-result-display.d.ts.map +1 -1
  520. package/dist/utils/tool-result-display.js +93 -3
  521. package/dist/utils/tool-result-display.js.map +1 -1
  522. package/dist/utils/type-helpers.d.ts +140 -0
  523. package/dist/utils/type-helpers.d.ts.map +1 -0
  524. package/dist/utils/type-helpers.js +220 -0
  525. package/dist/utils/type-helpers.js.map +1 -0
  526. package/dist/utils/url-utils.d.ts +6 -0
  527. package/dist/utils/url-utils.d.ts.map +1 -0
  528. package/dist/utils/url-utils.js +22 -0
  529. package/dist/utils/url-utils.js.map +1 -0
  530. package/dist/vscode/extension-installer.d.ts +34 -7
  531. package/dist/vscode/extension-installer.d.ts.map +1 -1
  532. package/dist/vscode/extension-installer.js +151 -64
  533. package/dist/vscode/extension-installer.js.map +1 -1
  534. package/dist/vscode/index.d.ts +1 -1
  535. package/dist/vscode/index.d.ts.map +1 -1
  536. package/dist/vscode/index.js +1 -1
  537. package/dist/vscode/index.js.map +1 -1
  538. package/dist/vscode/vscode-server.d.ts.map +1 -1
  539. package/dist/vscode/vscode-server.js +10 -0
  540. package/dist/vscode/vscode-server.js.map +1 -1
  541. package/dist/wizards/mcp-wizard.d.ts.map +1 -1
  542. package/dist/wizards/mcp-wizard.js +2 -1
  543. package/dist/wizards/mcp-wizard.js.map +1 -1
  544. package/dist/wizards/provider-wizard.d.ts.map +1 -1
  545. package/dist/wizards/provider-wizard.js +4 -2
  546. package/dist/wizards/provider-wizard.js.map +1 -1
  547. package/dist/wizards/steps/location-step.d.ts.map +1 -1
  548. package/dist/wizards/steps/location-step.js +2 -1
  549. package/dist/wizards/steps/location-step.js.map +1 -1
  550. package/dist/wizards/steps/mcp-step.d.ts.map +1 -1
  551. package/dist/wizards/steps/mcp-step.js +3 -2
  552. package/dist/wizards/steps/mcp-step.js.map +1 -1
  553. package/dist/wizards/steps/provider-step.d.ts.map +1 -1
  554. package/dist/wizards/steps/provider-step.js +5 -2
  555. package/dist/wizards/steps/provider-step.js.map +1 -1
  556. package/dist/wizards/steps/summary-step.d.ts.map +1 -1
  557. package/dist/wizards/steps/summary-step.js +2 -1
  558. package/dist/wizards/steps/summary-step.js.map +1 -1
  559. package/dist/wizards/templates/mcp-templates.d.ts +0 -8
  560. package/dist/wizards/templates/mcp-templates.d.ts.map +1 -1
  561. package/dist/wizards/templates/mcp-templates.js +8 -6
  562. package/dist/wizards/templates/mcp-templates.js.map +1 -1
  563. package/dist/wizards/templates/provider-templates.d.ts.map +1 -1
  564. package/dist/wizards/templates/provider-templates.js +59 -0
  565. package/dist/wizards/templates/provider-templates.js.map +1 -1
  566. package/dist/wizards/validation.d.ts.map +1 -1
  567. package/dist/wizards/validation.js +2 -4
  568. package/dist/wizards/validation.js.map +1 -1
  569. package/package.json +22 -23
  570. package/source/app/prompts/main-prompt.md +21 -3
  571. package/source/config/themes.json +787 -0
  572. package/dist/ai-sdk-client/chat/tool-processor.d.ts +0 -10
  573. package/dist/ai-sdk-client/chat/tool-processor.d.ts.map +0 -1
  574. package/dist/ai-sdk-client/chat/tool-processor.js +0 -53
  575. package/dist/ai-sdk-client/chat/tool-processor.js.map +0 -1
  576. package/dist/hooks/chat-handler/utils/context-checker.d.ts +0 -15
  577. package/dist/hooks/chat-handler/utils/context-checker.d.ts.map +0 -1
  578. package/dist/hooks/chat-handler/utils/context-checker.js +0 -68
  579. package/dist/hooks/chat-handler/utils/context-checker.js.map +0 -1
  580. package/dist/tool-calling/json-parser.d.ts +0 -24
  581. package/dist/tool-calling/json-parser.d.ts.map +0 -1
  582. package/dist/tool-calling/json-parser.js +0 -202
  583. package/dist/tool-calling/json-parser.js.map +0 -1
  584. package/dist/tools/string-replace.d.ts +0 -3
  585. package/dist/tools/string-replace.d.ts.map +0 -1
  586. package/dist/tools/string-replace.js +0 -461
  587. package/dist/tools/string-replace.js.map +0 -1
  588. package/dist/tools/write-file.d.ts +0 -3
  589. package/dist/tools/write-file.d.ts.map +0 -1
  590. package/dist/tools/write-file.js.map +0 -1
@@ -0,0 +1,361 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { getAppConfig } from '../config/index.js';
5
+ import { getAppDataPath } from '../config/paths.js';
6
+ /** UUID v4 pattern for session ID validation (prevents path traversal) */
7
+ const SESSION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
8
+ function isValidSessionId(id) {
9
+ return SESSION_ID_PATTERN.test(id);
10
+ }
11
+ function isRecord(obj) {
12
+ return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
13
+ }
14
+ function isValidSessionMetadata(obj) {
15
+ if (!isRecord(obj))
16
+ return false;
17
+ return (typeof obj.id === 'string' &&
18
+ typeof obj.title === 'string' &&
19
+ typeof obj.createdAt === 'string' &&
20
+ typeof obj.lastAccessedAt === 'string' &&
21
+ typeof obj.messageCount === 'number' &&
22
+ typeof obj.provider === 'string' &&
23
+ typeof obj.model === 'string' &&
24
+ typeof obj.workingDirectory === 'string');
25
+ }
26
+ function isValidSession(obj) {
27
+ if (!isRecord(obj))
28
+ return false;
29
+ return isValidSessionMetadata(obj) && Array.isArray(obj.messages);
30
+ }
31
+ /** Write data to a temp file then atomically rename into place. */
32
+ async function atomicWriteFile(filePath, data, mode) {
33
+ const tmpPath = `${filePath}.${crypto.randomUUID()}.tmp`;
34
+ try {
35
+ await fs.writeFile(tmpPath, data, { mode });
36
+ await fs.rename(tmpPath, filePath);
37
+ }
38
+ catch (error) {
39
+ // Clean up temp file on failure
40
+ try {
41
+ await fs.unlink(tmpPath);
42
+ }
43
+ catch (_cleanupError) {
44
+ // Ignore cleanup errors
45
+ }
46
+ throw error;
47
+ }
48
+ }
49
+ function isEnoent(error) {
50
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
51
+ }
52
+ export class SessionManager {
53
+ sessionsDir;
54
+ sessionsIndexPath;
55
+ initialized = false;
56
+ /** Serializes read-modify-write of sessions.json to prevent lost updates from concurrent autosave/resume. */
57
+ indexWriteLock = Promise.resolve();
58
+ /** Optional explicit directory override (used by tests). */
59
+ overrideDir;
60
+ constructor(sessionsDir) {
61
+ this.overrideDir = sessionsDir;
62
+ }
63
+ resolveSessionsDir() {
64
+ if (this.overrideDir) {
65
+ this.sessionsDir = this.overrideDir;
66
+ this.sessionsIndexPath = path.join(this.sessionsDir, 'sessions.json');
67
+ return;
68
+ }
69
+ const config = getAppConfig();
70
+ const sessionConfig = config.sessions;
71
+ const configuredDir = sessionConfig?.directory;
72
+ if (configuredDir) {
73
+ // User explicitly configured a directory — expand tilde
74
+ let sessionDirPath = configuredDir;
75
+ if (sessionDirPath === '~') {
76
+ sessionDirPath = path.resolve(process.env.HOME || process.env.USERPROFILE || '.');
77
+ }
78
+ else if (sessionDirPath.startsWith('~/')) {
79
+ sessionDirPath = path.join(process.env.HOME || process.env.USERPROFILE || '.', sessionDirPath.slice(2));
80
+ }
81
+ this.sessionsDir = sessionDirPath;
82
+ }
83
+ else {
84
+ // Default: use platform-aware app data path
85
+ this.sessionsDir = path.join(getAppDataPath(), 'sessions');
86
+ }
87
+ this.sessionsIndexPath = path.join(this.sessionsDir, 'sessions.json');
88
+ }
89
+ async initialize() {
90
+ if (this.initialized)
91
+ return;
92
+ this.resolveSessionsDir();
93
+ try {
94
+ await fs.mkdir(this.sessionsDir, { recursive: true, mode: 0o700 });
95
+ await fs.chmod(this.sessionsDir, 0o700);
96
+ try {
97
+ await fs.access(this.sessionsIndexPath);
98
+ }
99
+ catch (_error) {
100
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify([]), 0o600);
101
+ }
102
+ this.initialized = true;
103
+ // Perform cleanup of old sessions if configured
104
+ await this.cleanupOldSessions();
105
+ }
106
+ catch (error) {
107
+ console.error('Failed to initialize session directory:', error);
108
+ throw error;
109
+ }
110
+ }
111
+ async createSession(sessionData) {
112
+ const sessionId = crypto.randomUUID();
113
+ const timestamp = new Date().toISOString();
114
+ const session = {
115
+ id: sessionId,
116
+ title: sessionData.title,
117
+ createdAt: timestamp,
118
+ lastAccessedAt: timestamp,
119
+ messageCount: sessionData.messageCount,
120
+ provider: sessionData.provider,
121
+ model: sessionData.model,
122
+ workingDirectory: sessionData.workingDirectory,
123
+ messages: sessionData.messages,
124
+ };
125
+ await this.saveSession(session);
126
+ await this.enforceSessionLimits();
127
+ return session;
128
+ }
129
+ async saveSession(session) {
130
+ if (!isValidSessionId(session.id)) {
131
+ throw new Error(`Invalid session ID: ${session.id}`);
132
+ }
133
+ // File write and index update happen together under the lock
134
+ // to prevent orphaned files if the process dies between them.
135
+ await this.withIndexLock(async () => {
136
+ const sessionFilePath = path.join(this.sessionsDir, `${session.id}.json`);
137
+ // Write session file atomically
138
+ await atomicWriteFile(sessionFilePath, JSON.stringify(session, null, 2), 0o600);
139
+ // Update index
140
+ const sessions = await this.readIndex();
141
+ const existingSessionIndex = sessions.findIndex(s => s.id === session.id);
142
+ const sessionMetadata = {
143
+ id: session.id,
144
+ title: session.title,
145
+ createdAt: session.createdAt,
146
+ lastAccessedAt: session.lastAccessedAt,
147
+ messageCount: session.messageCount,
148
+ provider: session.provider,
149
+ model: session.model,
150
+ workingDirectory: session.workingDirectory,
151
+ };
152
+ if (existingSessionIndex >= 0) {
153
+ sessions[existingSessionIndex] = sessionMetadata;
154
+ }
155
+ else {
156
+ sessions.push(sessionMetadata);
157
+ }
158
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(sessions, null, 2), 0o600);
159
+ });
160
+ }
161
+ /** Read the index file (internal helper — not locked). */
162
+ async readIndex() {
163
+ try {
164
+ const data = await fs.readFile(this.sessionsIndexPath, 'utf-8');
165
+ const parsed = JSON.parse(data);
166
+ if (!Array.isArray(parsed))
167
+ return this.rebuildIndex();
168
+ const valid = parsed.filter(isValidSessionMetadata);
169
+ if (valid.length === 0 && parsed.length > 0) {
170
+ // Index had entries but none were valid — try recovery
171
+ return this.rebuildIndex();
172
+ }
173
+ return valid;
174
+ }
175
+ catch (_error) {
176
+ return this.rebuildIndex();
177
+ }
178
+ }
179
+ /**
180
+ * Rebuild the index by scanning session files on disk.
181
+ * Called when the index is missing, corrupt, or empty despite files existing.
182
+ */
183
+ async rebuildIndex() {
184
+ try {
185
+ const entries = await fs.readdir(this.sessionsDir);
186
+ const sessionFiles = entries.filter(e => e.endsWith('.json') && e !== 'sessions.json');
187
+ if (sessionFiles.length === 0)
188
+ return [];
189
+ const metadata = [];
190
+ for (const file of sessionFiles) {
191
+ try {
192
+ const filePath = path.join(this.sessionsDir, file);
193
+ const data = await fs.readFile(filePath, 'utf-8');
194
+ const parsed = JSON.parse(data);
195
+ if (isValidSession(parsed)) {
196
+ metadata.push({
197
+ id: parsed.id,
198
+ title: parsed.title,
199
+ createdAt: parsed.createdAt,
200
+ lastAccessedAt: parsed.lastAccessedAt,
201
+ messageCount: parsed.messageCount,
202
+ provider: parsed.provider,
203
+ model: parsed.model,
204
+ workingDirectory: parsed.workingDirectory,
205
+ });
206
+ }
207
+ }
208
+ catch (_fileError) {
209
+ // Skip unreadable files
210
+ }
211
+ }
212
+ // Persist rebuilt index
213
+ if (metadata.length > 0) {
214
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(metadata, null, 2), 0o600);
215
+ }
216
+ return metadata;
217
+ }
218
+ catch (_error) {
219
+ return [];
220
+ }
221
+ }
222
+ async listSessions(options) {
223
+ const sessions = await this.readIndex();
224
+ if (options?.workingDirectory) {
225
+ const normalized = path.normalize(options.workingDirectory);
226
+ return sessions.filter(s => path.normalize(s.workingDirectory) === normalized);
227
+ }
228
+ return sessions;
229
+ }
230
+ /** Read a session from disk without updating lastAccessedAt (no write). */
231
+ async readSession(sessionId) {
232
+ if (!isValidSessionId(sessionId))
233
+ return null;
234
+ try {
235
+ const sessionFilePath = path.join(this.sessionsDir, `${sessionId}.json`);
236
+ const data = await fs.readFile(sessionFilePath, 'utf-8');
237
+ const parsed = JSON.parse(data);
238
+ if (!isValidSession(parsed))
239
+ return null;
240
+ return parsed;
241
+ }
242
+ catch (_error) {
243
+ return null;
244
+ }
245
+ }
246
+ async loadSession(sessionId) {
247
+ const session = await this.readSession(sessionId);
248
+ if (!session)
249
+ return null;
250
+ // Update last accessed time
251
+ const updatedSession = {
252
+ ...session,
253
+ lastAccessedAt: new Date().toISOString(),
254
+ };
255
+ await this.saveSession(updatedSession);
256
+ return updatedSession;
257
+ }
258
+ async deleteSession(sessionId) {
259
+ if (!isValidSessionId(sessionId)) {
260
+ throw new Error(`Invalid session ID: ${sessionId}`);
261
+ }
262
+ const sessionFilePath = path.join(this.sessionsDir, `${sessionId}.json`);
263
+ // Delete file — only ignore ENOENT
264
+ try {
265
+ await fs.unlink(sessionFilePath);
266
+ }
267
+ catch (error) {
268
+ if (!isEnoent(error)) {
269
+ throw error;
270
+ }
271
+ }
272
+ // Update index — let errors propagate
273
+ await this.withIndexLock(async () => {
274
+ const sessions = await this.readIndex();
275
+ const filteredSessions = sessions.filter(s => s.id !== sessionId);
276
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(filteredSessions, null, 2), 0o600);
277
+ });
278
+ }
279
+ getSessionDirectory() {
280
+ return this.sessionsDir;
281
+ }
282
+ /** Run a read-modify-write on the index one at a time to avoid lost updates. */
283
+ async withIndexLock(fn) {
284
+ const prev = this.indexWriteLock;
285
+ let release;
286
+ this.indexWriteLock = new Promise(r => {
287
+ release = r;
288
+ });
289
+ await prev;
290
+ try {
291
+ return await fn();
292
+ }
293
+ finally {
294
+ release();
295
+ }
296
+ }
297
+ async enforceSessionLimits() {
298
+ const config = getAppConfig();
299
+ const sessionConfig = config.sessions;
300
+ const maxSessions = sessionConfig?.maxSessions || 100;
301
+ await this.withIndexLock(async () => {
302
+ const sessions = await this.readIndex();
303
+ if (sessions.length <= maxSessions)
304
+ return;
305
+ // Sort by lastAccessedAt ascending (oldest first)
306
+ const sortedSessions = sessions.sort((a, b) => new Date(a.lastAccessedAt).getTime() -
307
+ new Date(b.lastAccessedAt).getTime());
308
+ const sessionsToDelete = sortedSessions.slice(0, sessions.length - maxSessions);
309
+ const idsToDelete = new Set(sessionsToDelete.map(s => s.id));
310
+ // Rewrite index first so sessions are deregistered even if
311
+ // file deletion partially fails.
312
+ const remaining = sortedSessions.filter(s => !idsToDelete.has(s.id));
313
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(remaining, null, 2), 0o600);
314
+ // Then delete files — only ignore ENOENT
315
+ for (const session of sessionsToDelete) {
316
+ const filePath = path.join(this.sessionsDir, `${session.id}.json`);
317
+ try {
318
+ await fs.unlink(filePath);
319
+ }
320
+ catch (error) {
321
+ if (!isEnoent(error)) {
322
+ throw error;
323
+ }
324
+ }
325
+ }
326
+ });
327
+ }
328
+ async cleanupOldSessions() {
329
+ const config = getAppConfig();
330
+ const sessionConfig = config.sessions;
331
+ const retentionDays = sessionConfig?.retentionDays || 30;
332
+ const cutoffDate = new Date();
333
+ cutoffDate.setDate(cutoffDate.getDate() - retentionDays);
334
+ await this.withIndexLock(async () => {
335
+ const sessions = await this.readIndex();
336
+ const oldSessions = sessions.filter(session => new Date(session.lastAccessedAt) < cutoffDate);
337
+ if (oldSessions.length === 0)
338
+ return;
339
+ const idsToDelete = new Set(oldSessions.map(s => s.id));
340
+ // Rewrite index first so sessions are deregistered even if
341
+ // file deletion partially fails.
342
+ const remaining = sessions.filter(s => !idsToDelete.has(s.id));
343
+ await atomicWriteFile(this.sessionsIndexPath, JSON.stringify(remaining, null, 2), 0o600);
344
+ // Then delete files — only ignore ENOENT
345
+ for (const session of oldSessions) {
346
+ const filePath = path.join(this.sessionsDir, `${session.id}.json`);
347
+ try {
348
+ await fs.unlink(filePath);
349
+ }
350
+ catch (error) {
351
+ if (!isEnoent(error)) {
352
+ throw error;
353
+ }
354
+ }
355
+ }
356
+ });
357
+ }
358
+ }
359
+ // Export singleton instance — config is deferred to initialize()
360
+ export const sessionManager = new SessionManager();
361
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../source/session/session-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-with-theme.d.ts","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAgD1B;;GAEG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,KAAK,CAAC,YAAY,GACzB,UAAU,CAAC,OAAO,MAAM,CAAC,CAE3B"}
1
+ {"version":3,"file":"render-with-theme.d.ts","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAiD1B;;GAEG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,KAAK,CAAC,YAAY,GACzB,UAAU,CAAC,OAAO,MAAM,CAAC,CAE3B"}
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { render } from 'ink-testing-library';
3
3
  import { ThemeContext } from '../hooks/useTheme.js';
4
4
  import { TitleShapeContext } from '../hooks/useTitleShape.js';
5
+ import { UIStateProvider } from '../hooks/useUIState.js';
5
6
  // Default test colors that match the structure used in the app
6
7
  const testColors = {
7
8
  primary: 'blue',
@@ -33,7 +34,7 @@ const testTitleShapeContext = {
33
34
  * Wrapper component that provides ThemeContext and TitleShapeContext for tests
34
35
  */
35
36
  function TestThemeProvider({ children }) {
36
- return (_jsx(TitleShapeContext.Provider, { value: testTitleShapeContext, children: _jsx(ThemeContext.Provider, { value: testThemeContext, children: children }) }));
37
+ return (_jsx(TitleShapeContext.Provider, { value: testTitleShapeContext, children: _jsx(ThemeContext.Provider, { value: testThemeContext, children: _jsx(UIStateProvider, { children: children }) }) }));
37
38
  }
38
39
  /**
39
40
  * Render a component wrapped with ThemeContext and TitleShapeContext for testing
@@ -1 +1 @@
1
- {"version":3,"file":"render-with-theme.js","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAGxD,+DAA+D;AAC/D,MAAM,UAAU,GAAW;IAC1B,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;CACvB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACxB,YAAY,EAAE,aAA4B;IAC1C,MAAM,EAAE,UAAU;IAClB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;CACzB,CAAC;AAEF,iCAAiC;AACjC,MAAM,qBAAqB,GAAG;IAC7B,iBAAiB,EAAE,MAAe;IAClC,oBAAoB,EAAE,GAAG,EAAE,GAAE,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAC,QAAQ,EAA8B;IACjE,OAAO,CACN,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,qBAAqB,YACvD,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,YAC5C,QAAQ,GACc,GACI,CAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,OAA2B;IAE3B,OAAO,MAAM,CAAC,KAAC,iBAAiB,cAAE,OAAO,GAAqB,CAAC,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"render-with-theme.js","sourceRoot":"","sources":["../../source/test-utils/render-with-theme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAC;AAGnD,+DAA+D;AAC/D,MAAM,UAAU,GAAW;IAC1B,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,MAAM;IACjB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,MAAM;IACrB,eAAe,EAAE,MAAM;CACvB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACxB,YAAY,EAAE,aAA4B;IAC1C,MAAM,EAAE,UAAU;IAClB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;CACzB,CAAC;AAEF,iCAAiC;AACjC,MAAM,qBAAqB,GAAG;IAC7B,iBAAiB,EAAE,MAAe;IAClC,oBAAoB,EAAE,GAAG,EAAE,GAAE,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,SAAS,iBAAiB,CAAC,EAAC,QAAQ,EAA8B;IACjE,OAAO,CACN,KAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,qBAAqB,YACvD,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,YAC7C,KAAC,eAAe,cAAE,QAAQ,GAAmB,GACtB,GACI,CAC7B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC9B,OAA2B;IAE3B,OAAO,MAAM,CAAC,KAAC,iBAAiB,cAAE,OAAO,GAAqB,CAAC,CAAC;AACjE,CAAC"}
@@ -12,9 +12,10 @@ type ParseResult = {
12
12
  examples: string;
13
13
  };
14
14
  /**
15
- * Unified tool call parser that tries XML first, then falls back to JSON
16
- * Returns errors for malformed tool calls instead of silently failing
15
+ * Parses XML tool calls from content (used for non-tool-calling models).
16
+ * Only runs on the XML fallback path when native tool calling is disabled.
17
+ * Type-preserving: Accepts unknown type, converts to string for processing.
17
18
  */
18
- export declare function parseToolCalls(content: string): ParseResult;
19
+ export declare function parseToolCalls(content: unknown): ParseResult;
19
20
  export {};
20
21
  //# sourceMappingURL=tool-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAkC5C;;GAEG;AACH,KAAK,WAAW,GACb;IACA,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACtB,GACD;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA4D3D"}
1
+ {"version":3,"file":"tool-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAmC5C;;GAEG;AACH,KAAK,WAAW,GACb;IACA,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACtB,GACD;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CAyC5D"}
@@ -1,11 +1,11 @@
1
- import { cleanJSONToolCalls, detectMalformedJSONToolCall, parseJSONToolCalls, } from '../tool-calling/json-parser.js';
2
1
  import { XMLToolCallParser } from '../tool-calling/xml-parser.js';
2
+ import { ensureString } from '../utils/type-helpers.js';
3
3
  /**
4
- * Strip <think>...</think> tags from content (some models output thinking that shouldn't be shown)
4
+ * Strip tags from content (some models output thinking that shouldn't be shown)
5
5
  */
6
6
  function stripThinkTags(content) {
7
7
  return (content
8
- // Strip complete <think>...</think> blocks
8
+ // Strip complete blocks
9
9
  .replace(/<think>[\s\S]*?<\/think>/gi, '')
10
10
  // Strip orphaned/incomplete think tags
11
11
  .replace(/<think>[\s\S]*$/gi, '')
@@ -27,22 +27,16 @@ function normalizeWhitespace(content) {
27
27
  .trim());
28
28
  }
29
29
  /**
30
- * Unified tool call parser that tries XML first, then falls back to JSON
31
- * Returns errors for malformed tool calls instead of silently failing
30
+ * Parses XML tool calls from content (used for non-tool-calling models).
31
+ * Only runs on the XML fallback path when native tool calling is disabled.
32
+ * Type-preserving: Accepts unknown type, converts to string for processing.
32
33
  */
33
34
  export function parseToolCalls(content) {
34
- // Strip <think> tags first - some models (like GLM-4) emit these for chain-of-thought
35
- const strippedContent = stripThinkTags(content);
36
- // 1. Check for malformed XML patterns first (before validating with hasToolCalls)
37
- const xmlMalformed = XMLToolCallParser.detectMalformedToolCall(strippedContent);
38
- if (xmlMalformed) {
39
- return {
40
- success: false,
41
- error: xmlMalformed.error,
42
- examples: xmlMalformed.examples,
43
- };
44
- }
45
- // 2. Try XML parser for valid tool calls
35
+ // 1. Safety Coercion
36
+ const contentStr = ensureString(content);
37
+ // Strip tags first - some models (like GLM-4) emit these for chain-of-thought
38
+ const strippedContent = stripThinkTags(contentStr);
39
+ // 2. Try XML parser for valid tool calls (OPTIMISTIC: Success first!)
46
40
  if (XMLToolCallParser.hasToolCalls(strippedContent)) {
47
41
  // Parse valid XML tool calls
48
42
  const parsedCalls = XMLToolCallParser.parseToolCalls(strippedContent);
@@ -56,27 +50,16 @@ export function parseToolCalls(content) {
56
50
  };
57
51
  }
58
52
  }
59
- // 3. Fall back to JSON parser
60
- // Check for malformed JSON tool calls
61
- const jsonMalformed = detectMalformedJSONToolCall(strippedContent);
62
- if (jsonMalformed) {
53
+ // 3. Check for malformed XML patterns (DEFENSIVE: Error second!)
54
+ const xmlMalformed = XMLToolCallParser.detectMalformedToolCall(strippedContent);
55
+ if (xmlMalformed) {
63
56
  return {
64
57
  success: false,
65
- error: jsonMalformed.error,
66
- examples: jsonMalformed.examples,
67
- };
68
- }
69
- // Parse valid JSON tool calls
70
- const jsonCalls = parseJSONToolCalls(strippedContent);
71
- if (jsonCalls.length > 0) {
72
- const cleanedContent = cleanJSONToolCalls(strippedContent, jsonCalls);
73
- return {
74
- success: true,
75
- toolCalls: jsonCalls,
76
- cleanedContent,
58
+ error: xmlMalformed.error,
59
+ examples: xmlMalformed.examples,
77
60
  };
78
61
  }
79
- // 4. No tool calls found - still normalize whitespace in content
62
+ // 4. No tool calls found - normalize whitespace in content
80
63
  return {
81
64
  success: true,
82
65
  toolCalls: [],
@@ -1 +1 @@
1
- {"version":3,"file":"tool-parser.js","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAG5D;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IACtC,OAAO,CACN,OAAO;QACN,2CAA2C;SAC1C,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;QAC1C,uCAAuC;SACtC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC3C,OAAO,CACN,OAAO;QACN,4CAA4C;SAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,sEAAsE;SACrE,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC;QACnC,wCAAwC;SACvC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QAC1B,iEAAiE;SAChE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CACR,CAAC;AACH,CAAC;AAiBD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,sFAAsF;IACtF,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEhD,kFAAkF;IAClF,MAAM,YAAY,GACjB,iBAAiB,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,QAAQ,EAAE,YAAY,CAAC,QAAQ;SAC/B,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,iBAAiB,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,6BAA6B;QAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEzE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GACnB,iBAAiB,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YAC/D,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,cAAc;gBACzB,cAAc;aACd,CAAC;QACH,CAAC;IACF,CAAC;IAED,8BAA8B;IAC9B,sCAAsC;IACtC,MAAM,aAAa,GAAG,2BAA2B,CAAC,eAAe,CAAC,CAAC;IACnE,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,aAAa,CAAC,KAAK;YAC1B,QAAQ,EAAE,aAAa,CAAC,QAAQ;SAChC,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,SAAS,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACtD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACtE,OAAO;YACN,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,SAAS;YACpB,cAAc;SACd,CAAC;IACH,CAAC;IAED,iEAAiE;IACjE,OAAO;QACN,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,mBAAmB,CAAC,eAAe,CAAC;KACpD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"tool-parser.js","sourceRoot":"","sources":["../../source/tool-calling/tool-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAElD;;GAEG;AACH,SAAS,cAAc,CAAC,OAAe;IACtC,OAAO,CACN,OAAO;QACN,yBAAyB;SACxB,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;QAC1C,uCAAuC;SACtC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC3C,OAAO,CACN,OAAO;QACN,4CAA4C;SAC3C,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,sEAAsE;SACrE,OAAO,CAAC,kBAAkB,EAAE,KAAK,CAAC;QACnC,wCAAwC;SACvC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;QAC1B,iEAAiE;SAChE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CACR,CAAC;AACH,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC9C,qBAAqB;IACrB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzC,8EAA8E;IAC9E,MAAM,eAAe,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEnD,sEAAsE;IACtE,IAAI,iBAAiB,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,6BAA6B;QAC7B,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEzE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,GACnB,iBAAiB,CAAC,0BAA0B,CAAC,eAAe,CAAC,CAAC;YAC/D,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,cAAc;gBACzB,cAAc;aACd,CAAC;QACH,CAAC;IACF,CAAC;IAED,iEAAiE;IACjE,MAAM,YAAY,GACjB,iBAAiB,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO;YACN,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,QAAQ,EAAE,YAAY,CAAC,QAAQ;SAC/B,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACN,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,mBAAmB,CAAC,eAAe,CAAC;KACpD,CAAC;AACH,CAAC"}
@@ -12,8 +12,9 @@ export declare class XMLToolCallParser {
12
12
  private static readonly PARAMETER_REGEX;
13
13
  /**
14
14
  * Extracts tool calls from text content containing XML-formatted tool calls
15
+ * Type-preserving: Accepts unknown type, converts to string for processing
15
16
  */
16
- static parseToolCalls(content: string): ParsedToolCall[];
17
+ static parseToolCalls(content: unknown): ParsedToolCall[];
17
18
  /**
18
19
  * Validates that a matched string is a proper tool call
19
20
  * Rejects partial matches, malformed syntax, and invalid structures
@@ -29,17 +30,20 @@ export declare class XMLToolCallParser {
29
30
  static convertToToolCalls(parsedCalls: ParsedToolCall[]): ToolCall[];
30
31
  /**
31
32
  * Removes XML tool call blocks from content, leaving only the text
33
+ * Type-preserving: Accepts unknown type, converts to string for processing
32
34
  */
33
- static removeToolCallsFromContent(content: string): string;
35
+ static removeToolCallsFromContent(content: unknown): string;
34
36
  /**
35
37
  * Checks if content contains XML-formatted tool calls
38
+ * Type-preserving: Accepts unknown type, converts to string for processing
36
39
  */
37
- static hasToolCalls(content: string): boolean;
40
+ static hasToolCalls(content: unknown): boolean;
38
41
  /**
39
42
  * Detects malformed XML tool call attempts and returns error details
40
43
  * Returns null if no malformed tool calls detected
44
+ * Type-preserving: Accepts unknown type, converts to string for processing
41
45
  */
42
- static detectMalformedToolCall(content: string): {
46
+ static detectMalformedToolCall(content: unknown): {
43
47
  error: string;
44
48
  examples: string;
45
49
  } | null;
@@ -1 +1 @@
1
- {"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/xml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAE5C,UAAU,cAAc;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAEjE;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE;IAwCxD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyE9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyB9B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE;IAUpE;;OAEG;IACH,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IA0C1D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAM7C;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAC7B,OAAO,EAAE,MAAM,GACb;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IA8C3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAGvC"}
1
+ {"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../source/tool-calling/xml-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAG5C,UAAU,cAAc;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAEjE;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,EAAE;IA0CzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyE9B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyB9B;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE;IAUpE;;;OAGG;IACH,MAAM,CAAC,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM;IA4C3D;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAM9C;;;;OAIG;IACH,MAAM,CAAC,uBAAuB,CAC7B,OAAO,EAAE,OAAO,GACd;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAiD3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAGvC"}
@@ -1,3 +1,4 @@
1
+ import { ensureString } from '../utils/type-helpers.js';
1
2
  /**
2
3
  * Parses XML-formatted tool calls from non-function-calling models
3
4
  * Expected format: <tool_name><param1>value1</param1><param2>value2</param2></tool_name>
@@ -7,13 +8,14 @@ export class XMLToolCallParser {
7
8
  static PARAMETER_REGEX = /<(\w+)>(.*?)<\/\1>/gs;
8
9
  /**
9
10
  * Extracts tool calls from text content containing XML-formatted tool calls
11
+ * Type-preserving: Accepts unknown type, converts to string for processing
10
12
  */
11
13
  static parseToolCalls(content) {
12
14
  const toolCalls = [];
13
15
  let match;
14
16
  // Handle content that might be wrapped in markdown code blocks
15
- let processedContent = content;
16
- const codeBlockMatch = content.match(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/);
17
+ let processedContent = ensureString(content);
18
+ const codeBlockMatch = processedContent.match(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/);
17
19
  if (codeBlockMatch && codeBlockMatch[1]) {
18
20
  processedContent = codeBlockMatch[1].trim();
19
21
  }
@@ -142,15 +144,18 @@ export class XMLToolCallParser {
142
144
  }
143
145
  /**
144
146
  * Removes XML tool call blocks from content, leaving only the text
147
+ * Type-preserving: Accepts unknown type, converts to string for processing
145
148
  */
146
149
  static removeToolCallsFromContent(content) {
147
- let cleanedContent = content;
150
+ let cleanedContent = ensureString(content);
148
151
  // Remove all markdown code blocks that contain XML tool calls (using global flag)
149
152
  cleanedContent = cleanedContent.replace(/```(?:\w+)?\s*\n?([\s\S]*?)\n?```/g, (match, blockContent) => {
150
153
  if (blockContent) {
151
154
  // Reset regex and check if this block contains XML tool calls
152
155
  this.TOOL_CALL_REGEX.lastIndex = 0;
153
- if (this.TOOL_CALL_REGEX.test(blockContent)) {
156
+ const testResult = this.TOOL_CALL_REGEX.test(blockContent);
157
+ this.TOOL_CALL_REGEX.lastIndex = 0; // Reset again after test
158
+ if (testResult) {
154
159
  // This code block contains XML tool calls, remove it entirely
155
160
  return '';
156
161
  }
@@ -178,6 +183,7 @@ export class XMLToolCallParser {
178
183
  }
179
184
  /**
180
185
  * Checks if content contains XML-formatted tool calls
186
+ * Type-preserving: Accepts unknown type, converts to string for processing
181
187
  */
182
188
  static hasToolCalls(content) {
183
189
  // Use parseToolCalls with validation to ensure we only detect valid tool calls
@@ -187,8 +193,12 @@ export class XMLToolCallParser {
187
193
  /**
188
194
  * Detects malformed XML tool call attempts and returns error details
189
195
  * Returns null if no malformed tool calls detected
196
+ * Type-preserving: Accepts unknown type, converts to string for processing
190
197
  */
191
198
  static detectMalformedToolCall(content) {
199
+ // Type guard: ensure content is string for processing operations
200
+ // BUT original type is preserved in memory via the ToolCall structure
201
+ const contentStr = ensureString(content);
192
202
  // Common malformed patterns
193
203
  const patterns = [
194
204
  {
@@ -218,7 +228,7 @@ export class XMLToolCallParser {
218
228
  },
219
229
  ];
220
230
  for (const pattern of patterns) {
221
- const match = content.match(pattern.regex);
231
+ const match = contentStr.match(pattern.regex);
222
232
  if (match) {
223
233
  return {
224
234
  error: pattern.error,