@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,108 @@
1
+ /**
2
+ * TYPE PRESERVATION STRATEGY EXPLAINED
3
+ * =====================================
4
+ *
5
+ * "Preserving types" does NOT mean keeping everything as objects/arrays in memory.
6
+ * It means:
7
+ *
8
+ * 1. When receiving LLM responses (which can be ANY type):
9
+ * - We accept unknown types (string, object, array, null, undefined)
10
+ * - We convert to string ONLY for PARSING OPERATIONS
11
+ * - We preserve the original type in the tool call structure
12
+ *
13
+ * 2. When storing ToolCall.arguments:
14
+ * - MUST preserve as Record<string, unknown> (object type)
15
+ * - NOT convert to string
16
+ * - Enables direct property access without JSON.parse
17
+ *
18
+ * 3. When displaying/writing to disk:
19
+ * - Convert to string for display/storage operations
20
+ * - Use JSON.stringify for objects/arrays
21
+ * - Use String() for primitives
22
+ *
23
+ * The confusion comes from mixing up:
24
+ * - "Preserve types in memory" (CRITICAL: ToolCall.arguments stays as object)
25
+ * - "Convert to string for processing" (NECESSARY: Parser expects strings)
26
+ *
27
+ * This formatter handles the INCOMING data, then the parser handles the
28
+ * conversion to ToolCall format with type preservation.
29
+ */
30
+ import type { ToolCall } from '../types/index.js';
31
+ /**
32
+ * Result of normalizing an LLM response
33
+ * Contains the raw response, processed content, extracted tool calls, and metadata
34
+ */
35
+ export interface NormalizedResponse {
36
+ /** The original response from the LLM (unknown type for maximum flexibility) */
37
+ raw: unknown;
38
+ /** The content after normalization (always a string for parsing) */
39
+ content: string;
40
+ /** Any tool calls extracted during normalization */
41
+ toolCalls: ToolCall[];
42
+ /** Metadata about the response for debugging and strategy selection */
43
+ metadata: ResponseMetadata;
44
+ }
45
+ /**
46
+ * Metadata about the normalized response
47
+ * Used for:
48
+ * - Debugging and logging
49
+ * - Selecting the best parsing strategy
50
+ * - Error handling and recovery
51
+ */
52
+ export interface ResponseMetadata {
53
+ /** Whether response contained markdown code blocks */
54
+ hasCodeBlocks: boolean;
55
+ /** Whether response contained XML tags */
56
+ hasXMLTags: boolean;
57
+ /** Whether response contained JSON tool call structures */
58
+ hasJSONBlocks: boolean;
59
+ /** Confidence level in the response type classification */
60
+ confidence: 'high' | 'medium' | 'low';
61
+ /** Detected response format */
62
+ detectedFormat: 'plain' | 'json' | 'xml' | 'mixed' | 'unknown';
63
+ /** Whether response appears to be malformed */
64
+ isMalformed: boolean;
65
+ /** Detected error if malformed */
66
+ malformedError?: string;
67
+ }
68
+ /**
69
+ * Main entry point for normalizing LLM responses
70
+ *
71
+ * This function handles all possible LLM response types:
72
+ * - Plain strings (most common)
73
+ * - JSON objects (with/without tool_calls field)
74
+ * - Arrays (line-based content)
75
+ * - Null/undefined (error responses)
76
+ * - Mixed content (text + tool calls embedded)
77
+ *
78
+ * @param response - The raw response from the LLM (can be any type)
79
+ * @param options - Configuration options
80
+ * @returns A normalized response with content and extracted tool calls
81
+ */
82
+ export declare function normalizeLLMResponse(response: unknown, options?: NormalizeOptions): Promise<NormalizedResponse>;
83
+ /**
84
+ * Formats a normalized response for debugging
85
+ *
86
+ * @param response - Normalized response to format
87
+ * @returns Formatted string for debugging
88
+ */
89
+ export declare function formatNormalizedResponse(response: NormalizedResponse): string;
90
+ /**
91
+ * Checks if a response is complete and ready for processing
92
+ *
93
+ * A response is complete if:
94
+ * 1. It has content
95
+ * 2. It has low confidence (means no tool calls were found, so no further processing needed)
96
+ * 3. It's not malformed
97
+ *
98
+ * @param response - Normalized response to check
99
+ * @returns True if response is complete
100
+ */
101
+ export declare function isResponseComplete(response: NormalizedResponse): boolean;
102
+ export interface NormalizeOptions {
103
+ /** If true, keeps the raw object structure instead of JSON.stringify */
104
+ preserveRawTypes?: boolean;
105
+ /** If true, extracts tool calls from mixed content (text + tool calls) */
106
+ allowMixedContent?: boolean;
107
+ }
108
+ //# sourceMappingURL=response-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-formatter.d.ts","sourceRoot":"","sources":["../../source/utils/response-formatter.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AAM5C;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,gFAAgF;IAChF,GAAG,EAAE,OAAO,CAAC;IAEb,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;IAEhB,oDAAoD;IACpD,SAAS,EAAE,QAAQ,EAAE,CAAC;IAEtB,uEAAuE;IACvE,QAAQ,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAChC,sDAAsD;IACtD,aAAa,EAAE,OAAO,CAAC;IAEvB,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAC;IAEpB,2DAA2D;IAC3D,aAAa,EAAE,OAAO,CAAC;IAEvB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAEtC,+BAA+B;IAC/B,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;IAE/D,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAC;IAErB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACzC,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,gBAAqB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA4C7B;AAuUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CA0B7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAOxE;AAMD,MAAM,WAAW,gBAAgB;IAChC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B"}
@@ -0,0 +1,372 @@
1
+ // source/utils/response-formatter.ts
2
+ // ============================================================================
3
+ // NORMALIZATION FUNCTIONS
4
+ // ============================================================================
5
+ /**
6
+ * Main entry point for normalizing LLM responses
7
+ *
8
+ * This function handles all possible LLM response types:
9
+ * - Plain strings (most common)
10
+ * - JSON objects (with/without tool_calls field)
11
+ * - Arrays (line-based content)
12
+ * - Null/undefined (error responses)
13
+ * - Mixed content (text + tool calls embedded)
14
+ *
15
+ * @param response - The raw response from the LLM (can be any type)
16
+ * @param options - Configuration options
17
+ * @returns A normalized response with content and extracted tool calls
18
+ */
19
+ export async function normalizeLLMResponse(response, options = {}) {
20
+ const { preserveRawTypes = false, // If true, keeps object structure instead of JSON.stringify
21
+ allowMixedContent = true, // If true, extracts tool calls from mixed content
22
+ } = options;
23
+ // Step 1: Detect response type and convert to string for parsing
24
+ const { content, detectedFormat } = convertToProcessableString(response);
25
+ // Step 2: Extract tool calls from the content
26
+ const { toolCalls, malformedError } = await extractToolCalls(content, {
27
+ allowMixedContent,
28
+ detectedFormat,
29
+ });
30
+ // Step 3: Detect if response is malformed
31
+ const isMalformed = !toolCalls.length && hasMalformedPatterns(content);
32
+ // Step 4: Build metadata for debugging and strategy selection
33
+ // Check for JSON blocks in content - only match tool call patterns, not plain JSON objects
34
+ const hasCodeBlocks = /```/.test(content);
35
+ const hasJSONBlocks = /"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*\{/.test(content);
36
+ const metadata = buildMetadata(content, {
37
+ hasCodeBlocks,
38
+ hasXMLTags: /<[^>]+>/.test(content),
39
+ hasJSONBlocks,
40
+ detectedFormat,
41
+ malformedError,
42
+ isMalformed,
43
+ }, toolCalls.length > 0);
44
+ return {
45
+ raw: preserveRawTypes ? response : undefined, // Only preserve if requested
46
+ content,
47
+ toolCalls,
48
+ metadata,
49
+ };
50
+ }
51
+ /**
52
+ * Converts any LLM response type to a string suitable for parsing
53
+ *
54
+ * Handles the following cases:
55
+ * 1. string → string (identity, already processable)
56
+ * 2. object → JSON.stringify (structured data)
57
+ * 3. array → JSON.stringify (array data)
58
+ * 4. null/undefined → empty string (error handling)
59
+ * 5. number/boolean → String() (primitive types)
60
+ *
61
+ * This conversion is NECESSARY because our parsers expect strings.
62
+ * The type preservation happens later in the ToolCall structure.
63
+ *
64
+ * @param response - Raw response from LLM (any type)
65
+ * @returns Object with processable string content and detected format
66
+ */
67
+ function convertToProcessableString(response) {
68
+ let content;
69
+ let detectedFormat = 'plain';
70
+ // CASE 1: Plain string response (most common)
71
+ if (typeof response === 'string') {
72
+ content = response.trim();
73
+ // Check if it looks like a JSON structure
74
+ if (content.startsWith('{') && content.endsWith('}')) {
75
+ detectedFormat = 'json';
76
+ // Don't JSON.stringify a string that's already JSON - just use it as-is
77
+ // The parser will parse it correctly
78
+ }
79
+ // Check if it looks like XML
80
+ else if (content.startsWith('<') && content.endsWith('>')) {
81
+ detectedFormat = 'xml';
82
+ // Don't JSON.stringify a string that's already XML - just use it as-is
83
+ // The parser will parse it correctly
84
+ }
85
+ // Check for mixed content (text + tool calls)
86
+ else if (hasEmbeddedToolCallPatterns(content)) {
87
+ detectedFormat = 'mixed';
88
+ // Don't JSON.stringify - keep as plain string for parser to handle
89
+ }
90
+ }
91
+ // CASE 2: JSON object response (structured data)
92
+ else if (response !== null && typeof response === 'object') {
93
+ // Check if it has a tool_calls field (AI SDK format)
94
+ if ('tool_calls' in response || 'function' in response) {
95
+ detectedFormat = 'json';
96
+ // If it's already structured, we might not need JSON.stringify
97
+ // But for consistency with parsers, we still convert to string
98
+ content = JSON.stringify(response);
99
+ }
100
+ // Regular object (not a tool_calls response)
101
+ else {
102
+ detectedFormat = 'json';
103
+ content = JSON.stringify(response);
104
+ }
105
+ }
106
+ // CASE 3: Array response (line-based content)
107
+ else if (Array.isArray(response)) {
108
+ detectedFormat = 'mixed';
109
+ content = response.join('\n').trim();
110
+ }
111
+ // CASE 4: Primitives (number, boolean, null, undefined)
112
+ else {
113
+ // Convert primitives to strings
114
+ content = String(response);
115
+ // Empty string if null or undefined
116
+ if (response === null || response === undefined) {
117
+ content = '';
118
+ }
119
+ }
120
+ return { content, detectedFormat };
121
+ }
122
+ /**
123
+ * Extracts tool calls from normalized content
124
+ *
125
+ * This function uses the unified parser to extract tool calls from:
126
+ * - Plain text with embedded JSON/XML tool calls
127
+ * - JSON objects with tool_calls field
128
+ * - Mixed content (text + tool calls)
129
+ *
130
+ * @param content - Normalized content string
131
+ * @param options - Extraction options
132
+ * @returns Object with extracted tool calls and any malformed error
133
+ */
134
+ async function extractToolCalls(content, options) {
135
+ const { allowMixedContent } = options;
136
+ // If no content, no tool calls
137
+ if (!content) {
138
+ return { toolCalls: [] };
139
+ }
140
+ // Try XML parser
141
+ try {
142
+ const { XMLToolCallParser } = await import('../tool-calling/xml-parser.js');
143
+ // Check for malformed XML first
144
+ const malformedError = XMLToolCallParser.detectMalformedToolCall(content);
145
+ if (malformedError) {
146
+ return { toolCalls: [], malformedError: malformedError.error };
147
+ }
148
+ // Check if has XML tool calls
149
+ if (XMLToolCallParser.hasToolCalls(content)) {
150
+ const parsedCalls = XMLToolCallParser.parseToolCalls(content);
151
+ const toolCalls = XMLToolCallParser.convertToToolCalls(parsedCalls);
152
+ if (toolCalls.length > 0) {
153
+ return { toolCalls };
154
+ }
155
+ }
156
+ }
157
+ catch (error) {
158
+ // XML parsing failed, continue
159
+ console.warn('XML parsing failed:', error);
160
+ }
161
+ // CASE 3: Mixed content - use unified parser
162
+ if (allowMixedContent) {
163
+ try {
164
+ const { parseToolCalls } = await import('../tool-calling/tool-parser.js');
165
+ const result = parseToolCalls(content);
166
+ if (result.success && result.toolCalls.length > 0) {
167
+ return { toolCalls: result.toolCalls };
168
+ }
169
+ if (!result.success) {
170
+ return { toolCalls: [], malformedError: result.error };
171
+ }
172
+ }
173
+ catch (error) {
174
+ // Parsing failed, return empty tool calls
175
+ console.warn('Mixed content parsing failed:', error);
176
+ }
177
+ }
178
+ // No tool calls found
179
+ return { toolCalls: [] };
180
+ }
181
+ /**
182
+ * Detects if content contains malformed patterns
183
+ *
184
+ * Logic:
185
+ * 1. If it parses as valid JSON via try/catch, it is NOT malformed.
186
+ * 2. If parsing fails, check for known "broken tool call" signatures.
187
+ *
188
+ * @param content - Content to check
189
+ * @returns True if malformed patterns detected
190
+ */
191
+ function hasMalformedPatterns(content) {
192
+ const trimmed = content.trim();
193
+ // 1. Sanity Check: Empty content is not "malformed", just empty.
194
+ if (!trimmed) {
195
+ return false;
196
+ }
197
+ // 2. THE SAFETY CHECK: Trust the Runtime (JSON.parse)
198
+ // We check if it starts and ends with braces to identify it as a candidate for an Object.
199
+ if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
200
+ try {
201
+ // CRASH PROTECTION: If this succeeds, the JSON is valid.
202
+ // Therefore, it cannot be "malformed".
203
+ JSON.parse(trimmed);
204
+ return false;
205
+ }
206
+ catch (_e) {
207
+ // It crashed. It might be malformed.
208
+ // Fall through to regex checks below.
209
+ }
210
+ }
211
+ // 3. Check for specific broken tool call patterns.
212
+ const malformedJSONPatterns = [
213
+ /^\s*\{\s*"name"\s*:\s*"[^"]+"\s*\}\s*$/, // name only, no arguments
214
+ /^\s*\{\s*"arguments"\s*:\s*\}\s*$/, // arguments only, no name
215
+ /"arguments"\s*:\s*null\s*([,}\s]*$)/s, // arguments as JSON null (followed by comma, brace, or end)
216
+ /^\s*\{\s*"arguments"\s*:\s*\[\s*\]\s*\}$/, // arguments as empty array
217
+ /^\s*\{\s*"arguments"\s*:\s*""\s*\}$/, // arguments as empty string
218
+ ];
219
+ for (const pattern of malformedJSONPatterns) {
220
+ if (pattern.test(trimmed)) {
221
+ return true;
222
+ }
223
+ }
224
+ // 4. Check for malformed XML patterns
225
+ const malformedXMLPatterns = [
226
+ /\[(?:tool_use|Tool):\s*(\w+)\]/i, // [tool_use: name] syntax
227
+ /<function=(\w+)>/, // <function=name> syntax
228
+ /<parameter=(\w+)>/, // <parameter=name> syntax
229
+ ];
230
+ for (const pattern of malformedXMLPatterns) {
231
+ if (pattern.test(content)) {
232
+ return true;
233
+ }
234
+ }
235
+ return false;
236
+ }
237
+ /**
238
+ * Builds metadata object for debugging and strategy selection
239
+ *
240
+ * @param content - Normalized content
241
+ * @param partialMetadata - Partial metadata from earlier detection
242
+ * @param hasToolCalls - Whether tool calls were actually extracted
243
+ * @returns Complete metadata object
244
+ */
245
+ function buildMetadata(content, partialMetadata, hasToolCalls) {
246
+ // Check if content looks like JSON (has { and })
247
+ // Check if content looks like XML (has < and >)
248
+ // Check if content has code blocks
249
+ const hasCodeBlocks = /```/.test(content);
250
+ // Check if content has XML tags
251
+ const hasXMLTags = /<[^>]+>/.test(content);
252
+ // Check if content has JSON blocks (tool call patterns only, not plain JSON objects)
253
+ const hasJSONBlocks = /"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*\{/.test(content);
254
+ return {
255
+ hasCodeBlocks: partialMetadata.hasCodeBlocks ?? hasCodeBlocks,
256
+ hasXMLTags: partialMetadata.hasXMLTags ?? hasXMLTags,
257
+ hasJSONBlocks: partialMetadata.hasJSONBlocks ?? hasJSONBlocks,
258
+ confidence: determineConfidence({
259
+ ...partialMetadata,
260
+ hasCodeBlocks,
261
+ hasXMLTags,
262
+ hasJSONBlocks,
263
+ }, hasToolCalls),
264
+ detectedFormat: partialMetadata.detectedFormat ?? 'unknown',
265
+ isMalformed: partialMetadata.isMalformed ?? hasMalformedPatterns(content),
266
+ malformedError: partialMetadata.malformedError,
267
+ };
268
+ }
269
+ /**
270
+ * Determines confidence level in the response type classification
271
+ *
272
+ * Confidence levels:
273
+ * - HIGH: Clear format detected (JSON with tool_calls, XML with tool calls)
274
+ * - MEDIUM: Unclear format (plain text with possible tool calls)
275
+ * - LOW: No format detected (plain text with no tool calls)
276
+ *
277
+ * @param metadata - Metadata from response
278
+ * @param hasToolCalls - Whether tool calls were actually extracted
279
+ * @returns Confidence level
280
+ */
281
+ function determineConfidence(metadata, hasToolCalls) {
282
+ // High confidence if we actually extracted tool calls
283
+ if (hasToolCalls) {
284
+ return 'high';
285
+ }
286
+ // If it is explicitly malformed, confidence is LOW
287
+ if (metadata.isMalformed) {
288
+ return 'low';
289
+ }
290
+ // Medium confidence if it looks like code/data, but contained no valid tools
291
+ if (metadata.detectedFormat === 'json' ||
292
+ metadata.detectedFormat === 'xml' ||
293
+ metadata.hasCodeBlocks ||
294
+ metadata.hasJSONBlocks ||
295
+ metadata.hasXMLTags) {
296
+ return 'medium';
297
+ }
298
+ // LOW: Plain text with no format indicators
299
+ return 'low';
300
+ }
301
+ /**
302
+ * Checks if content contains embedded tool call patterns
303
+ *
304
+ * @param content - Content to check
305
+ * @returns True if embedded patterns detected
306
+ */
307
+ function hasEmbeddedToolCallPatterns(content) {
308
+ // JSON tool call patterns (allow text before the pattern)
309
+ const jsonPatterns = [
310
+ /\s*\{\s*"name"\s*:\s*"[^"]+"\s*,\s*"arguments"\s*:\s*\{/s,
311
+ /\s*\{"name":\s*"([^"]+)",\s*"arguments":\s*\{/s,
312
+ ];
313
+ // XML tool call patterns
314
+ const xmlPatterns = [/<(\w+)>(.*?)<\/\1>/s];
315
+ for (const pattern of [...jsonPatterns, ...xmlPatterns]) {
316
+ if (pattern.test(content)) {
317
+ return true;
318
+ }
319
+ }
320
+ return false;
321
+ }
322
+ // ============================================================================
323
+ // UTILITY FUNCTIONS
324
+ // ============================================================================
325
+ /**
326
+ * Formats a normalized response for debugging
327
+ *
328
+ * @param response - Normalized response to format
329
+ * @returns Formatted string for debugging
330
+ */
331
+ export function formatNormalizedResponse(response) {
332
+ return [
333
+ `=== Normalized Response ===`,
334
+ `Raw Type: ${response.raw !== undefined ? typeof response.raw : 'undefined'}`,
335
+ `Content Type: ${typeof response.content}`,
336
+ `Content Length: ${response.content.length} chars`,
337
+ `Detected Format: ${response.metadata.detectedFormat}`,
338
+ `Confidence: ${response.metadata.confidence}`,
339
+ `Has Code Blocks: ${response.metadata.hasCodeBlocks}`,
340
+ `Has XML Tags: ${response.metadata.hasXMLTags}`,
341
+ `Has JSON Blocks: ${response.metadata.hasJSONBlocks}`,
342
+ `Is Malformed: ${response.metadata.isMalformed}`,
343
+ `Tool Calls: ${response.toolCalls.length}`,
344
+ ``,
345
+ `Content Preview:`,
346
+ response.content.slice(0, 500) +
347
+ (response.content.length > 500 ? '...' : ''),
348
+ ``,
349
+ `Tool Calls:`,
350
+ response.toolCalls
351
+ .map(tc => ` - ${tc.function.name}: ${JSON.stringify(tc.function.arguments)}`)
352
+ .join('\n'),
353
+ ].join('\n');
354
+ }
355
+ /**
356
+ * Checks if a response is complete and ready for processing
357
+ *
358
+ * A response is complete if:
359
+ * 1. It has content
360
+ * 2. It has low confidence (means no tool calls were found, so no further processing needed)
361
+ * 3. It's not malformed
362
+ *
363
+ * @param response - Normalized response to check
364
+ * @returns True if response is complete
365
+ */
366
+ export function isResponseComplete(response) {
367
+ // Response is complete if it has content and is not malformed
368
+ return (response.content.length > 0 &&
369
+ !response.metadata.isMalformed &&
370
+ response.metadata.confidence !== 'low');
371
+ }
372
+ //# sourceMappingURL=response-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../source/utils/response-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { getShutdownManager,
2
+ /** @internal */
3
+ resetShutdownManager,
4
+ /** @internal */
5
+ ShutdownManager, } from './shutdown-manager.js';
6
+ export type { ShutdownHandler, ShutdownManagerOptions } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/utils/shutdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB;AAClB,gBAAgB;AAChB,oBAAoB;AACpB,gBAAgB;AAChB,eAAe,GACf,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAC,eAAe,EAAE,sBAAsB,EAAC,MAAM,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { getShutdownManager,
2
+ /** @internal */
3
+ resetShutdownManager,
4
+ /** @internal */
5
+ ShutdownManager, } from './shutdown-manager.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../source/utils/shutdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,kBAAkB;AAClB,gBAAgB;AAChB,oBAAoB;AACpB,gBAAgB;AAChB,eAAe,GACf,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ShutdownHandler, ShutdownManagerOptions } from './types.js';
2
+ export declare class ShutdownManager {
3
+ private handlers;
4
+ private isShuttingDown;
5
+ private timeoutMs;
6
+ private boundSigterm;
7
+ private boundSigint;
8
+ private boundUncaughtException;
9
+ private boundUnhandledRejection;
10
+ constructor(options?: ShutdownManagerOptions);
11
+ register(handler: ShutdownHandler): void;
12
+ unregister(name: string): void;
13
+ gracefulShutdown(exitCode?: number): Promise<void>;
14
+ private setupSignalHandlers;
15
+ reset(): void;
16
+ }
17
+ export declare function getShutdownManager(options?: ShutdownManagerOptions): ShutdownManager;
18
+ export declare function resetShutdownManager(): void;
19
+ //# sourceMappingURL=shutdown-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-manager.d.ts","sourceRoot":"","sources":["../../../source/utils/shutdown/shutdown-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAE,sBAAsB,EAAC,MAAM,SAAS,CAAC;AAKrE,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,uBAAuB,CAGrB;gBAEE,OAAO,CAAC,EAAE,sBAAsB;IAgC5C,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIxC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxB,gBAAgB,CAAC,QAAQ,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCnD,OAAO,CAAC,mBAAmB;IAO3B,KAAK,IAAI,IAAI;CAQb;AAID,wBAAgB,kBAAkB,CACjC,OAAO,CAAC,EAAE,sBAAsB,GAC9B,eAAe,CAKjB;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -0,0 +1,100 @@
1
+ import { loggerProvider } from '../../utils/logging/logger-provider.js';
2
+ const DEFAULT_TIMEOUT_MS = 5000;
3
+ const ENV_SHUTDOWN_TIMEOUT = 'NANOCODER_DEFAULT_SHUTDOWN_TIMEOUT';
4
+ export class ShutdownManager {
5
+ handlers = new Map();
6
+ isShuttingDown = false;
7
+ timeoutMs;
8
+ boundSigterm;
9
+ boundSigint;
10
+ boundUncaughtException;
11
+ boundUnhandledRejection;
12
+ constructor(options) {
13
+ const envTimeout = process.env[ENV_SHUTDOWN_TIMEOUT];
14
+ const parsedEnvTimeout = envTimeout ? parseInt(envTimeout, 10) : undefined;
15
+ const isValidTimeout = Number.isFinite(parsedEnvTimeout);
16
+ this.timeoutMs =
17
+ options?.timeoutMs ??
18
+ (isValidTimeout ? parsedEnvTimeout : undefined) ??
19
+ DEFAULT_TIMEOUT_MS;
20
+ this.boundSigterm = () => {
21
+ void this.gracefulShutdown(0);
22
+ };
23
+ this.boundSigint = () => {
24
+ void this.gracefulShutdown(0);
25
+ };
26
+ this.boundUncaughtException = (err) => {
27
+ const logger = loggerProvider.getLogger();
28
+ logger.fatal({ err }, 'Uncaught exception');
29
+ void this.gracefulShutdown(1);
30
+ };
31
+ this.boundUnhandledRejection = (reason, promise) => {
32
+ const logger = loggerProvider.getLogger();
33
+ logger.fatal({ reason, promise }, 'Unhandled promise rejection');
34
+ void this.gracefulShutdown(1);
35
+ };
36
+ this.setupSignalHandlers();
37
+ }
38
+ register(handler) {
39
+ this.handlers.set(handler.name, handler);
40
+ }
41
+ unregister(name) {
42
+ this.handlers.delete(name);
43
+ }
44
+ async gracefulShutdown(exitCode = 0) {
45
+ if (this.isShuttingDown) {
46
+ return;
47
+ }
48
+ this.isShuttingDown = true;
49
+ const logger = loggerProvider.getLogger();
50
+ logger.info('Graceful shutdown initiated', { exitCode });
51
+ const sorted = Array.from(this.handlers.values()).sort((a, b) => a.priority - b.priority);
52
+ const shutdownPromise = (async () => {
53
+ for (const entry of sorted) {
54
+ try {
55
+ logger.info(`Shutting down: ${entry.name}`);
56
+ await entry.handler();
57
+ }
58
+ catch (err) {
59
+ logger.error({ err }, `Shutdown handler failed: ${entry.name}`);
60
+ }
61
+ }
62
+ })();
63
+ const timeoutPromise = new Promise(resolve => {
64
+ setTimeout(() => {
65
+ logger.warn('Shutdown timeout reached, forcing exit');
66
+ resolve();
67
+ }, this.timeoutMs);
68
+ });
69
+ await Promise.race([shutdownPromise, timeoutPromise]);
70
+ process.exit(exitCode);
71
+ }
72
+ setupSignalHandlers() {
73
+ process.once('SIGTERM', this.boundSigterm);
74
+ process.once('SIGINT', this.boundSigint);
75
+ process.on('uncaughtException', this.boundUncaughtException);
76
+ process.on('unhandledRejection', this.boundUnhandledRejection);
77
+ }
78
+ reset() {
79
+ this.handlers.clear();
80
+ this.isShuttingDown = false;
81
+ process.removeListener('SIGTERM', this.boundSigterm);
82
+ process.removeListener('SIGINT', this.boundSigint);
83
+ process.removeListener('uncaughtException', this.boundUncaughtException);
84
+ process.removeListener('unhandledRejection', this.boundUnhandledRejection);
85
+ }
86
+ }
87
+ let instance = null;
88
+ export function getShutdownManager(options) {
89
+ if (!instance) {
90
+ instance = new ShutdownManager(options);
91
+ }
92
+ return instance;
93
+ }
94
+ export function resetShutdownManager() {
95
+ if (instance) {
96
+ instance.reset();
97
+ instance = null;
98
+ }
99
+ }
100
+ //# sourceMappingURL=shutdown-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-manager.js","sourceRoot":"","sources":["../../../source/utils/shutdown/shutdown-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,iCAAiC,CAAC;AAG/D,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,oBAAoB,GAAG,oCAAoC,CAAC;AAElE,MAAM,OAAO,eAAe;IACnB,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IACnD,cAAc,GAAG,KAAK,CAAC;IACvB,SAAS,CAAS;IAElB,YAAY,CAAa;IACzB,WAAW,CAAa;IACxB,sBAAsB,CAAuB;IAC7C,uBAAuB,CAGrB;IAEV,YAAY,OAAgC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACrD,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzD,IAAI,CAAC,SAAS;YACb,OAAO,EAAE,SAAS;gBAClB,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/C,kBAAkB,CAAC;QAEpB,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE;YACxB,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE;YACvB,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAU,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,EAAC,GAAG,EAAC,EAAE,oBAAoB,CAAC,CAAC;YAC1C,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,IAAI,CAAC,uBAAuB,GAAG,CAC9B,MAAe,EACf,OAAyB,EACxB,EAAE;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,6BAA6B,CAAC,CAAC;YAC/D,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC5B,CAAC;IAED,QAAQ,CAAC,OAAwB;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,IAAY;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAQ,GAAG,CAAC;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACrD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CACjC,CAAC;QAEF,MAAM,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,CAAC,EAAC,GAAG,EAAC,EAAE,4BAA4B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAClD,UAAU,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBACtD,OAAO,EAAE,CAAC;YACX,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC;QAEtD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAEO,mBAAmB;QAC1B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7D,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChE,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACrD,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzE,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC5E,CAAC;CACD;AAED,IAAI,QAAQ,GAA2B,IAAI,CAAC;AAE5C,MAAM,UAAU,kBAAkB,CACjC,OAAgC;IAEhC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,QAAQ,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,IAAI,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ShutdownHandler {
2
+ name: string;
3
+ priority: number;
4
+ handler: () => Promise<void>;
5
+ }
6
+ export interface ShutdownManagerOptions {
7
+ timeoutMs?: number;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map