@blackbox_ai/blackbox-cli-core 0.0.4

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 (897) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +420 -0
  3. package/dist/.last_build +0 -0
  4. package/dist/index.d.ts +13 -0
  5. package/dist/index.js +14 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/__mocks__/fs/promises.d.ts +11 -0
  8. package/dist/src/__mocks__/fs/promises.js +17 -0
  9. package/dist/src/__mocks__/fs/promises.js.map +1 -0
  10. package/dist/src/blackbox/blackboxContentGenerator.d.ts +70 -0
  11. package/dist/src/blackbox/blackboxContentGenerator.js +180 -0
  12. package/dist/src/blackbox/blackboxContentGenerator.js.map +1 -0
  13. package/dist/src/blackbox/blackboxContentGenerator.test.d.ts +6 -0
  14. package/dist/src/blackbox/blackboxContentGenerator.test.js +1178 -0
  15. package/dist/src/blackbox/blackboxContentGenerator.test.js.map +1 -0
  16. package/dist/src/blackbox/blackboxOAuth2.d.ts +191 -0
  17. package/dist/src/blackbox/blackboxOAuth2.js +566 -0
  18. package/dist/src/blackbox/blackboxOAuth2.js.map +1 -0
  19. package/dist/src/blackbox/blackboxOAuth2.test.d.ts +6 -0
  20. package/dist/src/blackbox/blackboxOAuth2.test.js +1718 -0
  21. package/dist/src/blackbox/blackboxOAuth2.test.js.map +1 -0
  22. package/dist/src/blackbox/sharedTokenManager.d.ts +196 -0
  23. package/dist/src/blackbox/sharedTokenManager.js +647 -0
  24. package/dist/src/blackbox/sharedTokenManager.js.map +1 -0
  25. package/dist/src/blackbox/sharedTokenManager.test.d.ts +7 -0
  26. package/dist/src/blackbox/sharedTokenManager.test.js +662 -0
  27. package/dist/src/blackbox/sharedTokenManager.test.js.map +1 -0
  28. package/dist/src/code_assist/codeAssist.d.ts +10 -0
  29. package/dist/src/code_assist/codeAssist.js +19 -0
  30. package/dist/src/code_assist/codeAssist.js.map +1 -0
  31. package/dist/src/code_assist/converter.d.ts +72 -0
  32. package/dist/src/code_assist/converter.js +159 -0
  33. package/dist/src/code_assist/converter.js.map +1 -0
  34. package/dist/src/code_assist/converter.test.d.ts +6 -0
  35. package/dist/src/code_assist/converter.test.js +362 -0
  36. package/dist/src/code_assist/converter.test.js.map +1 -0
  37. package/dist/src/code_assist/oauth2.d.ts +22 -0
  38. package/dist/src/code_assist/oauth2.js +368 -0
  39. package/dist/src/code_assist/oauth2.js.map +1 -0
  40. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  41. package/dist/src/code_assist/oauth2.test.js +436 -0
  42. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  43. package/dist/src/code_assist/server.d.ts +37 -0
  44. package/dist/src/code_assist/server.js +125 -0
  45. package/dist/src/code_assist/server.js.map +1 -0
  46. package/dist/src/code_assist/server.test.d.ts +6 -0
  47. package/dist/src/code_assist/server.test.js +134 -0
  48. package/dist/src/code_assist/server.test.js.map +1 -0
  49. package/dist/src/code_assist/setup.d.ts +20 -0
  50. package/dist/src/code_assist/setup.js +101 -0
  51. package/dist/src/code_assist/setup.js.map +1 -0
  52. package/dist/src/code_assist/setup.test.d.ts +6 -0
  53. package/dist/src/code_assist/setup.test.js +171 -0
  54. package/dist/src/code_assist/setup.test.js.map +1 -0
  55. package/dist/src/code_assist/types.d.ts +148 -0
  56. package/dist/src/code_assist/types.js +46 -0
  57. package/dist/src/code_assist/types.js.map +1 -0
  58. package/dist/src/config/blackboxModels.d.ts +28 -0
  59. package/dist/src/config/blackboxModels.js +148 -0
  60. package/dist/src/config/blackboxModels.js.map +1 -0
  61. package/dist/src/config/config.d.ts +381 -0
  62. package/dist/src/config/config.js +753 -0
  63. package/dist/src/config/config.js.map +1 -0
  64. package/dist/src/config/config.test.d.ts +6 -0
  65. package/dist/src/config/config.test.js +674 -0
  66. package/dist/src/config/config.test.js.map +1 -0
  67. package/dist/src/config/flashFallback.test.d.ts +6 -0
  68. package/dist/src/config/flashFallback.test.js +87 -0
  69. package/dist/src/config/flashFallback.test.js.map +1 -0
  70. package/dist/src/config/models.d.ts +12 -0
  71. package/dist/src/config/models.js +13 -0
  72. package/dist/src/config/models.js.map +1 -0
  73. package/dist/src/config/storage.d.ts +32 -0
  74. package/dist/src/config/storage.js +90 -0
  75. package/dist/src/config/storage.js.map +1 -0
  76. package/dist/src/config/storage.test.d.ts +6 -0
  77. package/dist/src/config/storage.test.js +43 -0
  78. package/dist/src/config/storage.test.js.map +1 -0
  79. package/dist/src/core/__tests__/openaiTimeoutHandling.test.d.ts +6 -0
  80. package/dist/src/core/__tests__/openaiTimeoutHandling.test.js +292 -0
  81. package/dist/src/core/__tests__/openaiTimeoutHandling.test.js.map +1 -0
  82. package/dist/src/core/__tests__/orphanedToolCallsTest.d.ts +64 -0
  83. package/dist/src/core/__tests__/orphanedToolCallsTest.js +122 -0
  84. package/dist/src/core/__tests__/orphanedToolCallsTest.js.map +1 -0
  85. package/dist/src/core/client.d.ts +75 -0
  86. package/dist/src/core/client.js +826 -0
  87. package/dist/src/core/client.js.map +1 -0
  88. package/dist/src/core/client.test.d.ts +6 -0
  89. package/dist/src/core/client.test.js +2059 -0
  90. package/dist/src/core/client.test.js.map +1 -0
  91. package/dist/src/core/contentGenerator.d.ts +51 -0
  92. package/dist/src/core/contentGenerator.js +149 -0
  93. package/dist/src/core/contentGenerator.js.map +1 -0
  94. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  95. package/dist/src/core/contentGenerator.test.js +133 -0
  96. package/dist/src/core/contentGenerator.test.js.map +1 -0
  97. package/dist/src/core/coreToolScheduler.d.ts +126 -0
  98. package/dist/src/core/coreToolScheduler.js +630 -0
  99. package/dist/src/core/coreToolScheduler.js.map +1 -0
  100. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  101. package/dist/src/core/coreToolScheduler.test.js +1228 -0
  102. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  103. package/dist/src/core/geminiChat.d.ts +139 -0
  104. package/dist/src/core/geminiChat.js +636 -0
  105. package/dist/src/core/geminiChat.js.map +1 -0
  106. package/dist/src/core/geminiChat.test.d.ts +6 -0
  107. package/dist/src/core/geminiChat.test.js +1178 -0
  108. package/dist/src/core/geminiChat.test.js.map +1 -0
  109. package/dist/src/core/geminiRequest.d.ts +13 -0
  110. package/dist/src/core/geminiRequest.js +11 -0
  111. package/dist/src/core/geminiRequest.js.map +1 -0
  112. package/dist/src/core/geminiRequest.test.d.ts +6 -0
  113. package/dist/src/core/geminiRequest.test.js +73 -0
  114. package/dist/src/core/geminiRequest.test.js.map +1 -0
  115. package/dist/src/core/logger.d.ts +68 -0
  116. package/dist/src/core/logger.js +370 -0
  117. package/dist/src/core/logger.js.map +1 -0
  118. package/dist/src/core/logger.test.d.ts +6 -0
  119. package/dist/src/core/logger.test.js +591 -0
  120. package/dist/src/core/logger.test.js.map +1 -0
  121. package/dist/src/core/loggingContentGenerator.d.ts +25 -0
  122. package/dist/src/core/loggingContentGenerator.js +97 -0
  123. package/dist/src/core/loggingContentGenerator.js.map +1 -0
  124. package/dist/src/core/nonInteractiveToolExecutor.d.ts +10 -0
  125. package/dist/src/core/nonInteractiveToolExecutor.js +24 -0
  126. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  127. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  128. package/dist/src/core/nonInteractiveToolExecutor.test.js +236 -0
  129. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  130. package/dist/src/core/openaiContentGenerator/constants.d.ts +2 -0
  131. package/dist/src/core/openaiContentGenerator/constants.js +3 -0
  132. package/dist/src/core/openaiContentGenerator/constants.js.map +1 -0
  133. package/dist/src/core/openaiContentGenerator/converter.d.ts +107 -0
  134. package/dist/src/core/openaiContentGenerator/converter.js +802 -0
  135. package/dist/src/core/openaiContentGenerator/converter.js.map +1 -0
  136. package/dist/src/core/openaiContentGenerator/converter.test.d.ts +6 -0
  137. package/dist/src/core/openaiContentGenerator/converter.test.js +47 -0
  138. package/dist/src/core/openaiContentGenerator/converter.test.js.map +1 -0
  139. package/dist/src/core/openaiContentGenerator/errorHandler.d.ts +20 -0
  140. package/dist/src/core/openaiContentGenerator/errorHandler.js +82 -0
  141. package/dist/src/core/openaiContentGenerator/errorHandler.js.map +1 -0
  142. package/dist/src/core/openaiContentGenerator/errorHandler.test.d.ts +6 -0
  143. package/dist/src/core/openaiContentGenerator/errorHandler.test.js +287 -0
  144. package/dist/src/core/openaiContentGenerator/errorHandler.test.js.map +1 -0
  145. package/dist/src/core/openaiContentGenerator/index.d.ts +22 -0
  146. package/dist/src/core/openaiContentGenerator/index.js +41 -0
  147. package/dist/src/core/openaiContentGenerator/index.js.map +1 -0
  148. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.d.ts +21 -0
  149. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.js +105 -0
  150. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.js.map +1 -0
  151. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.d.ts +6 -0
  152. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js +230 -0
  153. package/dist/src/core/openaiContentGenerator/openaiContentGenerator.test.js.map +1 -0
  154. package/dist/src/core/openaiContentGenerator/pipeline.d.ts +66 -0
  155. package/dist/src/core/openaiContentGenerator/pipeline.js +256 -0
  156. package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -0
  157. package/dist/src/core/openaiContentGenerator/pipeline.test.d.ts +6 -0
  158. package/dist/src/core/openaiContentGenerator/pipeline.test.js +977 -0
  159. package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -0
  160. package/dist/src/core/openaiContentGenerator/provider/README.md +61 -0
  161. package/dist/src/core/openaiContentGenerator/provider/dashscope.d.ts +63 -0
  162. package/dist/src/core/openaiContentGenerator/provider/dashscope.js +241 -0
  163. package/dist/src/core/openaiContentGenerator/provider/dashscope.js.map +1 -0
  164. package/dist/src/core/openaiContentGenerator/provider/dashscope.test.d.ts +6 -0
  165. package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js +707 -0
  166. package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js.map +1 -0
  167. package/dist/src/core/openaiContentGenerator/provider/deepseek.d.ts +14 -0
  168. package/dist/src/core/openaiContentGenerator/provider/deepseek.js +52 -0
  169. package/dist/src/core/openaiContentGenerator/provider/deepseek.js.map +1 -0
  170. package/dist/src/core/openaiContentGenerator/provider/deepseek.test.d.ts +6 -0
  171. package/dist/src/core/openaiContentGenerator/provider/deepseek.test.js +103 -0
  172. package/dist/src/core/openaiContentGenerator/provider/deepseek.test.js.map +1 -0
  173. package/dist/src/core/openaiContentGenerator/provider/default.d.ts +15 -0
  174. package/dist/src/core/openaiContentGenerator/provider/default.js +38 -0
  175. package/dist/src/core/openaiContentGenerator/provider/default.js.map +1 -0
  176. package/dist/src/core/openaiContentGenerator/provider/default.test.d.ts +6 -0
  177. package/dist/src/core/openaiContentGenerator/provider/default.test.js +176 -0
  178. package/dist/src/core/openaiContentGenerator/provider/default.test.js.map +1 -0
  179. package/dist/src/core/openaiContentGenerator/provider/index.d.ts +5 -0
  180. package/dist/src/core/openaiContentGenerator/provider/index.js +5 -0
  181. package/dist/src/core/openaiContentGenerator/provider/index.js.map +1 -0
  182. package/dist/src/core/openaiContentGenerator/provider/openrouter.d.ts +8 -0
  183. package/dist/src/core/openaiContentGenerator/provider/openrouter.js +21 -0
  184. package/dist/src/core/openaiContentGenerator/provider/openrouter.js.map +1 -0
  185. package/dist/src/core/openaiContentGenerator/provider/openrouter.test.d.ts +6 -0
  186. package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js +152 -0
  187. package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js.map +1 -0
  188. package/dist/src/core/openaiContentGenerator/provider/types.d.ts +23 -0
  189. package/dist/src/core/openaiContentGenerator/provider/types.js +2 -0
  190. package/dist/src/core/openaiContentGenerator/provider/types.js.map +1 -0
  191. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.d.ts +142 -0
  192. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js +363 -0
  193. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js.map +1 -0
  194. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.d.ts +6 -0
  195. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js +537 -0
  196. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.test.js.map +1 -0
  197. package/dist/src/core/openaiContentGenerator/telemetryService.d.ts +35 -0
  198. package/dist/src/core/openaiContentGenerator/telemetryService.js +146 -0
  199. package/dist/src/core/openaiContentGenerator/telemetryService.js.map +1 -0
  200. package/dist/src/core/openaiContentGenerator/telemetryService.test.d.ts +6 -0
  201. package/dist/src/core/openaiContentGenerator/telemetryService.test.js +978 -0
  202. package/dist/src/core/openaiContentGenerator/telemetryService.test.js.map +1 -0
  203. package/dist/src/core/prompts.d.ts +76 -0
  204. package/dist/src/core/prompts.js +860 -0
  205. package/dist/src/core/prompts.js.map +1 -0
  206. package/dist/src/core/prompts.test.d.ts +6 -0
  207. package/dist/src/core/prompts.test.js +436 -0
  208. package/dist/src/core/prompts.test.js.map +1 -0
  209. package/dist/src/core/tokenLimits.d.ts +25 -0
  210. package/dist/src/core/tokenLimits.js +175 -0
  211. package/dist/src/core/tokenLimits.js.map +1 -0
  212. package/dist/src/core/tokenLimits.test.d.ts +1 -0
  213. package/dist/src/core/tokenLimits.test.js +261 -0
  214. package/dist/src/core/tokenLimits.test.js.map +1 -0
  215. package/dist/src/core/turn.d.ts +140 -0
  216. package/dist/src/core/turn.js +168 -0
  217. package/dist/src/core/turn.js.map +1 -0
  218. package/dist/src/core/turn.test.d.ts +6 -0
  219. package/dist/src/core/turn.test.js +450 -0
  220. package/dist/src/core/turn.test.js.map +1 -0
  221. package/dist/src/generated/git-commit.d.ts +7 -0
  222. package/dist/src/generated/git-commit.js +10 -0
  223. package/dist/src/generated/git-commit.js.map +1 -0
  224. package/dist/src/ide/constants.d.ts +6 -0
  225. package/dist/src/ide/constants.js +7 -0
  226. package/dist/src/ide/constants.js.map +1 -0
  227. package/dist/src/ide/detect-ide.d.ts +25 -0
  228. package/dist/src/ide/detect-ide.js +104 -0
  229. package/dist/src/ide/detect-ide.js.map +1 -0
  230. package/dist/src/ide/detect-ide.test.d.ts +6 -0
  231. package/dist/src/ide/detect-ide.test.js +120 -0
  232. package/dist/src/ide/detect-ide.test.js.map +1 -0
  233. package/dist/src/ide/ide-client.d.ts +67 -0
  234. package/dist/src/ide/ide-client.js +424 -0
  235. package/dist/src/ide/ide-client.js.map +1 -0
  236. package/dist/src/ide/ide-client.test.d.ts +6 -0
  237. package/dist/src/ide/ide-client.test.js +165 -0
  238. package/dist/src/ide/ide-client.test.js.map +1 -0
  239. package/dist/src/ide/ide-installer.d.ts +14 -0
  240. package/dist/src/ide/ide-installer.js +107 -0
  241. package/dist/src/ide/ide-installer.js.map +1 -0
  242. package/dist/src/ide/ide-installer.test.d.ts +6 -0
  243. package/dist/src/ide/ide-installer.test.js +113 -0
  244. package/dist/src/ide/ide-installer.test.js.map +1 -0
  245. package/dist/src/ide/ideContext.d.ts +374 -0
  246. package/dist/src/ide/ideContext.js +147 -0
  247. package/dist/src/ide/ideContext.js.map +1 -0
  248. package/dist/src/ide/ideContext.test.d.ts +6 -0
  249. package/dist/src/ide/ideContext.test.js +265 -0
  250. package/dist/src/ide/ideContext.test.js.map +1 -0
  251. package/dist/src/ide/process-utils.d.ts +21 -0
  252. package/dist/src/ide/process-utils.js +164 -0
  253. package/dist/src/ide/process-utils.js.map +1 -0
  254. package/dist/src/ide/process-utils.test.d.ts +6 -0
  255. package/dist/src/ide/process-utils.test.js +158 -0
  256. package/dist/src/ide/process-utils.test.js.map +1 -0
  257. package/dist/src/index.d.ts +86 -0
  258. package/dist/src/index.js +97 -0
  259. package/dist/src/index.js.map +1 -0
  260. package/dist/src/index.test.d.ts +6 -0
  261. package/dist/src/index.test.js +12 -0
  262. package/dist/src/index.test.js.map +1 -0
  263. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  264. package/dist/src/mcp/google-auth-provider.js +72 -0
  265. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  266. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  267. package/dist/src/mcp/google-auth-provider.test.js +89 -0
  268. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  269. package/dist/src/mcp/oauth-provider.d.ts +146 -0
  270. package/dist/src/mcp/oauth-provider.js +601 -0
  271. package/dist/src/mcp/oauth-provider.js.map +1 -0
  272. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  273. package/dist/src/mcp/oauth-provider.test.js +672 -0
  274. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  275. package/dist/src/mcp/oauth-token-storage.d.ts +61 -0
  276. package/dist/src/mcp/oauth-token-storage.js +148 -0
  277. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  278. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  279. package/dist/src/mcp/oauth-token-storage.test.js +208 -0
  280. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  281. package/dist/src/mcp/oauth-utils.d.ts +119 -0
  282. package/dist/src/mcp/oauth-utils.js +235 -0
  283. package/dist/src/mcp/oauth-utils.js.map +1 -0
  284. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  285. package/dist/src/mcp/oauth-utils.test.js +199 -0
  286. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  287. package/dist/src/mcp/token-storage/base-token-storage.d.ts +19 -0
  288. package/dist/src/mcp/token-storage/base-token-storage.js +36 -0
  289. package/dist/src/mcp/token-storage/base-token-storage.js.map +1 -0
  290. package/dist/src/mcp/token-storage/base-token-storage.test.d.ts +6 -0
  291. package/dist/src/mcp/token-storage/base-token-storage.test.js +160 -0
  292. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -0
  293. package/dist/src/mcp/token-storage/types.d.ts +34 -0
  294. package/dist/src/mcp/token-storage/types.js +7 -0
  295. package/dist/src/mcp/token-storage/types.js.map +1 -0
  296. package/dist/src/mocks/msw.d.ts +6 -0
  297. package/dist/src/mocks/msw.js +8 -0
  298. package/dist/src/mocks/msw.js.map +1 -0
  299. package/dist/src/prompts/mcp-prompts.d.ts +8 -0
  300. package/dist/src/prompts/mcp-prompts.js +13 -0
  301. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  302. package/dist/src/prompts/prompt-registry.d.ts +34 -0
  303. package/dist/src/prompts/prompt-registry.js +63 -0
  304. package/dist/src/prompts/prompt-registry.js.map +1 -0
  305. package/dist/src/services/chatRecordingService.d.ts +150 -0
  306. package/dist/src/services/chatRecordingService.js +321 -0
  307. package/dist/src/services/chatRecordingService.js.map +1 -0
  308. package/dist/src/services/chatRecordingService.test.d.ts +6 -0
  309. package/dist/src/services/chatRecordingService.test.js +290 -0
  310. package/dist/src/services/chatRecordingService.test.js.map +1 -0
  311. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  312. package/dist/src/services/fileDiscoveryService.js +91 -0
  313. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  314. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  315. package/dist/src/services/fileDiscoveryService.test.js +143 -0
  316. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  317. package/dist/src/services/fileSystemService.d.ts +31 -0
  318. package/dist/src/services/fileSystemService.js +18 -0
  319. package/dist/src/services/fileSystemService.js.map +1 -0
  320. package/dist/src/services/fileSystemService.test.d.ts +6 -0
  321. package/dist/src/services/fileSystemService.test.js +41 -0
  322. package/dist/src/services/fileSystemService.test.js.map +1 -0
  323. package/dist/src/services/gitService.d.ts +23 -0
  324. package/dist/src/services/gitService.js +110 -0
  325. package/dist/src/services/gitService.js.map +1 -0
  326. package/dist/src/services/gitService.test.d.ts +6 -0
  327. package/dist/src/services/gitService.test.js +212 -0
  328. package/dist/src/services/gitService.test.js.map +1 -0
  329. package/dist/src/services/loopDetectionService.d.ts +98 -0
  330. package/dist/src/services/loopDetectionService.js +363 -0
  331. package/dist/src/services/loopDetectionService.js.map +1 -0
  332. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  333. package/dist/src/services/loopDetectionService.test.js +560 -0
  334. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  335. package/dist/src/services/shellExecutionService.d.ts +68 -0
  336. package/dist/src/services/shellExecutionService.js +332 -0
  337. package/dist/src/services/shellExecutionService.js.map +1 -0
  338. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  339. package/dist/src/services/shellExecutionService.test.js +517 -0
  340. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  341. package/dist/src/subagents/builtin-agents.d.ts +35 -0
  342. package/dist/src/subagents/builtin-agents.js +85 -0
  343. package/dist/src/subagents/builtin-agents.js.map +1 -0
  344. package/dist/src/subagents/builtin-agents.test.d.ts +6 -0
  345. package/dist/src/subagents/builtin-agents.test.js +78 -0
  346. package/dist/src/subagents/builtin-agents.test.js.map +1 -0
  347. package/dist/src/subagents/index.d.ts +29 -0
  348. package/dist/src/subagents/index.js +15 -0
  349. package/dist/src/subagents/index.js.map +1 -0
  350. package/dist/src/subagents/subagent-events.d.ts +93 -0
  351. package/dist/src/subagents/subagent-events.js +31 -0
  352. package/dist/src/subagents/subagent-events.js.map +1 -0
  353. package/dist/src/subagents/subagent-hooks.d.ts +29 -0
  354. package/dist/src/subagents/subagent-hooks.js +7 -0
  355. package/dist/src/subagents/subagent-hooks.js.map +1 -0
  356. package/dist/src/subagents/subagent-manager.d.ts +170 -0
  357. package/dist/src/subagents/subagent-manager.js +593 -0
  358. package/dist/src/subagents/subagent-manager.js.map +1 -0
  359. package/dist/src/subagents/subagent-manager.test.d.ts +6 -0
  360. package/dist/src/subagents/subagent-manager.test.js +822 -0
  361. package/dist/src/subagents/subagent-manager.test.js.map +1 -0
  362. package/dist/src/subagents/subagent-statistics.d.ts +46 -0
  363. package/dist/src/subagents/subagent-statistics.js +193 -0
  364. package/dist/src/subagents/subagent-statistics.js.map +1 -0
  365. package/dist/src/subagents/subagent-statistics.test.d.ts +6 -0
  366. package/dist/src/subagents/subagent-statistics.test.js +231 -0
  367. package/dist/src/subagents/subagent-statistics.test.js.map +1 -0
  368. package/dist/src/subagents/subagent.d.ts +161 -0
  369. package/dist/src/subagents/subagent.js +667 -0
  370. package/dist/src/subagents/subagent.js.map +1 -0
  371. package/dist/src/subagents/subagent.test.d.ts +6 -0
  372. package/dist/src/subagents/subagent.test.js +487 -0
  373. package/dist/src/subagents/subagent.test.js.map +1 -0
  374. package/dist/src/subagents/types.d.ts +218 -0
  375. package/dist/src/subagents/types.js +58 -0
  376. package/dist/src/subagents/types.js.map +1 -0
  377. package/dist/src/subagents/types.test.d.ts +6 -0
  378. package/dist/src/subagents/types.test.js +31 -0
  379. package/dist/src/subagents/types.test.js.map +1 -0
  380. package/dist/src/subagents/validation.d.ts +63 -0
  381. package/dist/src/subagents/validation.js +293 -0
  382. package/dist/src/subagents/validation.js.map +1 -0
  383. package/dist/src/subagents/validation.test.d.ts +6 -0
  384. package/dist/src/subagents/validation.test.js +330 -0
  385. package/dist/src/subagents/validation.test.js.map +1 -0
  386. package/dist/src/telemetry/blackbox-logger/blackbox-logger.d.ts +80 -0
  387. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js +583 -0
  388. package/dist/src/telemetry/blackbox-logger/blackbox-logger.js.map +1 -0
  389. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.d.ts +6 -0
  390. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js +301 -0
  391. package/dist/src/telemetry/blackbox-logger/blackbox-logger.test.js.map +1 -0
  392. package/dist/src/telemetry/blackbox-logger/event-types.d.ts +73 -0
  393. package/dist/src/telemetry/blackbox-logger/event-types.js +2 -0
  394. package/dist/src/telemetry/blackbox-logger/event-types.js.map +1 -0
  395. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +121 -0
  396. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +773 -0
  397. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  398. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.d.ts +17 -0
  399. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +420 -0
  400. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -0
  401. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +90 -0
  402. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +229 -0
  403. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  404. package/dist/src/telemetry/constants.d.ts +34 -0
  405. package/dist/src/telemetry/constants.js +35 -0
  406. package/dist/src/telemetry/constants.js.map +1 -0
  407. package/dist/src/telemetry/file-exporters.d.ts +29 -0
  408. package/dist/src/telemetry/file-exporters.js +62 -0
  409. package/dist/src/telemetry/file-exporters.js.map +1 -0
  410. package/dist/src/telemetry/index.d.ts +20 -0
  411. package/dist/src/telemetry/index.js +21 -0
  412. package/dist/src/telemetry/index.js.map +1 -0
  413. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  414. package/dist/src/telemetry/integration.test.circular.js +95 -0
  415. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  416. package/dist/src/telemetry/loggers.d.ts +26 -0
  417. package/dist/src/telemetry/loggers.js +406 -0
  418. package/dist/src/telemetry/loggers.js.map +1 -0
  419. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  420. package/dist/src/telemetry/loggers.test.circular.js +107 -0
  421. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  422. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  423. package/dist/src/telemetry/loggers.test.js +638 -0
  424. package/dist/src/telemetry/loggers.test.js.map +1 -0
  425. package/dist/src/telemetry/metrics.d.ts +40 -0
  426. package/dist/src/telemetry/metrics.js +229 -0
  427. package/dist/src/telemetry/metrics.js.map +1 -0
  428. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  429. package/dist/src/telemetry/metrics.test.js +242 -0
  430. package/dist/src/telemetry/metrics.test.js.map +1 -0
  431. package/dist/src/telemetry/sdk.d.ts +9 -0
  432. package/dist/src/telemetry/sdk.js +161 -0
  433. package/dist/src/telemetry/sdk.js.map +1 -0
  434. package/dist/src/telemetry/sdk.test.d.ts +6 -0
  435. package/dist/src/telemetry/sdk.test.js +82 -0
  436. package/dist/src/telemetry/sdk.test.js.map +1 -0
  437. package/dist/src/telemetry/telemetry-utils.d.ts +6 -0
  438. package/dist/src/telemetry/telemetry-utils.js +14 -0
  439. package/dist/src/telemetry/telemetry-utils.js.map +1 -0
  440. package/dist/src/telemetry/telemetry-utils.test.d.ts +6 -0
  441. package/dist/src/telemetry/telemetry-utils.test.js +40 -0
  442. package/dist/src/telemetry/telemetry-utils.test.js.map +1 -0
  443. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  444. package/dist/src/telemetry/telemetry.test.js +50 -0
  445. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  446. package/dist/src/telemetry/tool-call-decision.d.ts +13 -0
  447. package/dist/src/telemetry/tool-call-decision.js +29 -0
  448. package/dist/src/telemetry/tool-call-decision.js.map +1 -0
  449. package/dist/src/telemetry/types.d.ts +236 -0
  450. package/dist/src/telemetry/types.js +405 -0
  451. package/dist/src/telemetry/types.js.map +1 -0
  452. package/dist/src/telemetry/uiTelemetry.d.ts +75 -0
  453. package/dist/src/telemetry/uiTelemetry.js +153 -0
  454. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  455. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  456. package/dist/src/telemetry/uiTelemetry.test.js +558 -0
  457. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  458. package/dist/src/test-utils/config.d.ts +17 -0
  459. package/dist/src/test-utils/config.js +32 -0
  460. package/dist/src/test-utils/config.js.map +1 -0
  461. package/dist/src/test-utils/mockWorkspaceContext.d.ts +13 -0
  462. package/dist/src/test-utils/mockWorkspaceContext.js +24 -0
  463. package/dist/src/test-utils/mockWorkspaceContext.js.map +1 -0
  464. package/dist/src/test-utils/tools.d.ts +45 -0
  465. package/dist/src/test-utils/tools.js +105 -0
  466. package/dist/src/test-utils/tools.js.map +1 -0
  467. package/dist/src/tools/diffOptions.d.ts +9 -0
  468. package/dist/src/tools/diffOptions.js +38 -0
  469. package/dist/src/tools/diffOptions.js.map +1 -0
  470. package/dist/src/tools/diffOptions.test.d.ts +6 -0
  471. package/dist/src/tools/diffOptions.test.js +119 -0
  472. package/dist/src/tools/diffOptions.test.js.map +1 -0
  473. package/dist/src/tools/edit.d.ts +56 -0
  474. package/dist/src/tools/edit.js +434 -0
  475. package/dist/src/tools/edit.js.map +1 -0
  476. package/dist/src/tools/edit.test.d.ts +6 -0
  477. package/dist/src/tools/edit.test.js +569 -0
  478. package/dist/src/tools/edit.test.js.map +1 -0
  479. package/dist/src/tools/exitPlanMode.d.ts +28 -0
  480. package/dist/src/tools/exitPlanMode.js +137 -0
  481. package/dist/src/tools/exitPlanMode.js.map +1 -0
  482. package/dist/src/tools/exitPlanMode.test.d.ts +6 -0
  483. package/dist/src/tools/exitPlanMode.test.js +219 -0
  484. package/dist/src/tools/exitPlanMode.test.js.map +1 -0
  485. package/dist/src/tools/glob.d.ts +52 -0
  486. package/dist/src/tools/glob.js +237 -0
  487. package/dist/src/tools/glob.js.map +1 -0
  488. package/dist/src/tools/glob.test.d.ts +6 -0
  489. package/dist/src/tools/glob.test.js +375 -0
  490. package/dist/src/tools/glob.test.js.map +1 -0
  491. package/dist/src/tools/grep.d.ts +51 -0
  492. package/dist/src/tools/grep.js +566 -0
  493. package/dist/src/tools/grep.js.map +1 -0
  494. package/dist/src/tools/grep.test.d.ts +6 -0
  495. package/dist/src/tools/grep.test.js +356 -0
  496. package/dist/src/tools/grep.test.js.map +1 -0
  497. package/dist/src/tools/ls.d.ts +68 -0
  498. package/dist/src/tools/ls.js +227 -0
  499. package/dist/src/tools/ls.js.map +1 -0
  500. package/dist/src/tools/ls.test.d.ts +6 -0
  501. package/dist/src/tools/ls.test.js +389 -0
  502. package/dist/src/tools/ls.test.js.map +1 -0
  503. package/dist/src/tools/mcp-client-manager.d.ts +38 -0
  504. package/dist/src/tools/mcp-client-manager.js +74 -0
  505. package/dist/src/tools/mcp-client-manager.js.map +1 -0
  506. package/dist/src/tools/mcp-client-manager.test.d.ts +6 -0
  507. package/dist/src/tools/mcp-client-manager.test.js +39 -0
  508. package/dist/src/tools/mcp-client-manager.test.js.map +1 -0
  509. package/dist/src/tools/mcp-client.d.ts +199 -0
  510. package/dist/src/tools/mcp-client.js +995 -0
  511. package/dist/src/tools/mcp-client.js.map +1 -0
  512. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  513. package/dist/src/tools/mcp-client.test.js +454 -0
  514. package/dist/src/tools/mcp-client.test.js.map +1 -0
  515. package/dist/src/tools/mcp-tool.d.ts +23 -0
  516. package/dist/src/tools/mcp-tool.js +240 -0
  517. package/dist/src/tools/mcp-tool.js.map +1 -0
  518. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  519. package/dist/src/tools/mcp-tool.test.js +576 -0
  520. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  521. package/dist/src/tools/memoryTool.d.ts +41 -0
  522. package/dist/src/tools/memoryTool.js +435 -0
  523. package/dist/src/tools/memoryTool.js.map +1 -0
  524. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  525. package/dist/src/tools/memoryTool.test.js +420 -0
  526. package/dist/src/tools/memoryTool.test.js.map +1 -0
  527. package/dist/src/tools/modifiable-tool.d.ts +32 -0
  528. package/dist/src/tools/modifiable-tool.js +88 -0
  529. package/dist/src/tools/modifiable-tool.js.map +1 -0
  530. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  531. package/dist/src/tools/modifiable-tool.test.js +193 -0
  532. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  533. package/dist/src/tools/read-file.d.ts +35 -0
  534. package/dist/src/tools/read-file.js +128 -0
  535. package/dist/src/tools/read-file.js.map +1 -0
  536. package/dist/src/tools/read-file.test.d.ts +6 -0
  537. package/dist/src/tools/read-file.test.js +311 -0
  538. package/dist/src/tools/read-file.test.js.map +1 -0
  539. package/dist/src/tools/read-many-files.d.ts +60 -0
  540. package/dist/src/tools/read-many-files.js +416 -0
  541. package/dist/src/tools/read-many-files.js.map +1 -0
  542. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  543. package/dist/src/tools/read-many-files.test.js +565 -0
  544. package/dist/src/tools/read-many-files.test.js.map +1 -0
  545. package/dist/src/tools/ripGrep.d.ts +47 -0
  546. package/dist/src/tools/ripGrep.js +375 -0
  547. package/dist/src/tools/ripGrep.js.map +1 -0
  548. package/dist/src/tools/ripGrep.test.d.ts +6 -0
  549. package/dist/src/tools/ripGrep.test.js +874 -0
  550. package/dist/src/tools/ripGrep.test.js.map +1 -0
  551. package/dist/src/tools/shell.d.ts +23 -0
  552. package/dist/src/tools/shell.js +387 -0
  553. package/dist/src/tools/shell.js.map +1 -0
  554. package/dist/src/tools/shell.test.d.ts +6 -0
  555. package/dist/src/tools/shell.test.js +632 -0
  556. package/dist/src/tools/shell.test.js.map +1 -0
  557. package/dist/src/tools/task.d.ts +59 -0
  558. package/dist/src/tools/task.js +412 -0
  559. package/dist/src/tools/task.js.map +1 -0
  560. package/dist/src/tools/task.test.d.ts +6 -0
  561. package/dist/src/tools/task.test.js +369 -0
  562. package/dist/src/tools/task.test.js.map +1 -0
  563. package/dist/src/tools/todoWrite.d.ts +42 -0
  564. package/dist/src/tools/todoWrite.js +385 -0
  565. package/dist/src/tools/todoWrite.js.map +1 -0
  566. package/dist/src/tools/todoWrite.test.d.ts +6 -0
  567. package/dist/src/tools/todoWrite.test.js +222 -0
  568. package/dist/src/tools/todoWrite.test.js.map +1 -0
  569. package/dist/src/tools/tool-error.d.ts +43 -0
  570. package/dist/src/tools/tool-error.js +58 -0
  571. package/dist/src/tools/tool-error.js.map +1 -0
  572. package/dist/src/tools/tool-names.d.ts +23 -0
  573. package/dist/src/tools/tool-names.js +24 -0
  574. package/dist/src/tools/tool-names.js.map +1 -0
  575. package/dist/src/tools/tool-registry.d.ts +86 -0
  576. package/dist/src/tools/tool-registry.js +369 -0
  577. package/dist/src/tools/tool-registry.js.map +1 -0
  578. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  579. package/dist/src/tools/tool-registry.test.js +332 -0
  580. package/dist/src/tools/tool-registry.test.js.map +1 -0
  581. package/dist/src/tools/tools.d.ts +316 -0
  582. package/dist/src/tools/tools.js +251 -0
  583. package/dist/src/tools/tools.js.map +1 -0
  584. package/dist/src/tools/tools.test.d.ts +6 -0
  585. package/dist/src/tools/tools.test.js +205 -0
  586. package/dist/src/tools/tools.test.js.map +1 -0
  587. package/dist/src/tools/web-fetch.d.ts +31 -0
  588. package/dist/src/tools/web-fetch.js +161 -0
  589. package/dist/src/tools/web-fetch.js.map +1 -0
  590. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  591. package/dist/src/tools/web-fetch.test.js +133 -0
  592. package/dist/src/tools/web-fetch.test.js.map +1 -0
  593. package/dist/src/tools/web-search.d.ts +40 -0
  594. package/dist/src/tools/web-search.js +134 -0
  595. package/dist/src/tools/web-search.js.map +1 -0
  596. package/dist/src/tools/web-search.test.d.ts +6 -0
  597. package/dist/src/tools/web-search.test.js +125 -0
  598. package/dist/src/tools/web-search.test.js.map +1 -0
  599. package/dist/src/tools/write-file.d.ts +52 -0
  600. package/dist/src/tools/write-file.js +298 -0
  601. package/dist/src/tools/write-file.js.map +1 -0
  602. package/dist/src/tools/write-file.test.d.ts +6 -0
  603. package/dist/src/tools/write-file.test.js +436 -0
  604. package/dist/src/tools/write-file.test.js.map +1 -0
  605. package/dist/src/utils/LruCache.d.ts +13 -0
  606. package/dist/src/utils/LruCache.js +38 -0
  607. package/dist/src/utils/LruCache.js.map +1 -0
  608. package/dist/src/utils/bfsFileSearch.d.ts +24 -0
  609. package/dist/src/utils/bfsFileSearch.js +89 -0
  610. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  611. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  612. package/dist/src/utils/bfsFileSearch.test.js +163 -0
  613. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  614. package/dist/src/utils/browser.d.ts +13 -0
  615. package/dist/src/utils/browser.js +50 -0
  616. package/dist/src/utils/browser.js.map +1 -0
  617. package/dist/src/utils/editor.d.ts +28 -0
  618. package/dist/src/utils/editor.js +186 -0
  619. package/dist/src/utils/editor.js.map +1 -0
  620. package/dist/src/utils/editor.test.d.ts +6 -0
  621. package/dist/src/utils/editor.test.js +445 -0
  622. package/dist/src/utils/editor.test.js.map +1 -0
  623. package/dist/src/utils/environmentContext.d.ts +21 -0
  624. package/dist/src/utils/environmentContext.js +90 -0
  625. package/dist/src/utils/environmentContext.js.map +1 -0
  626. package/dist/src/utils/environmentContext.test.d.ts +6 -0
  627. package/dist/src/utils/environmentContext.test.js +148 -0
  628. package/dist/src/utils/environmentContext.test.js.map +1 -0
  629. package/dist/src/utils/errorParsing.d.ts +8 -0
  630. package/dist/src/utils/errorParsing.js +93 -0
  631. package/dist/src/utils/errorParsing.js.map +1 -0
  632. package/dist/src/utils/errorParsing.test.d.ts +6 -0
  633. package/dist/src/utils/errorParsing.test.js +172 -0
  634. package/dist/src/utils/errorParsing.test.js.map +1 -0
  635. package/dist/src/utils/errorReporting.d.ts +14 -0
  636. package/dist/src/utils/errorReporting.js +88 -0
  637. package/dist/src/utils/errorReporting.js.map +1 -0
  638. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  639. package/dist/src/utils/errorReporting.test.js +130 -0
  640. package/dist/src/utils/errorReporting.test.js.map +1 -0
  641. package/dist/src/utils/errors.d.ts +33 -0
  642. package/dist/src/utils/errors.js +86 -0
  643. package/dist/src/utils/errors.js.map +1 -0
  644. package/dist/src/utils/fetch.d.ts +11 -0
  645. package/dist/src/utils/fetch.js +51 -0
  646. package/dist/src/utils/fetch.js.map +1 -0
  647. package/dist/src/utils/fileUtils.d.ts +53 -0
  648. package/dist/src/utils/fileUtils.js +283 -0
  649. package/dist/src/utils/fileUtils.js.map +1 -0
  650. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  651. package/dist/src/utils/fileUtils.test.js +364 -0
  652. package/dist/src/utils/fileUtils.test.js.map +1 -0
  653. package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
  654. package/dist/src/utils/filesearch/crawlCache.js +57 -0
  655. package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
  656. package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
  657. package/dist/src/utils/filesearch/crawlCache.test.js +103 -0
  658. package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
  659. package/dist/src/utils/filesearch/crawler.d.ts +15 -0
  660. package/dist/src/utils/filesearch/crawler.js +50 -0
  661. package/dist/src/utils/filesearch/crawler.js.map +1 -0
  662. package/dist/src/utils/filesearch/crawler.test.d.ts +6 -0
  663. package/dist/src/utils/filesearch/crawler.test.js +468 -0
  664. package/dist/src/utils/filesearch/crawler.test.js.map +1 -0
  665. package/dist/src/utils/filesearch/fileSearch.d.ts +38 -0
  666. package/dist/src/utils/filesearch/fileSearch.js +191 -0
  667. package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
  668. package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
  669. package/dist/src/utils/filesearch/fileSearch.test.js +642 -0
  670. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
  671. package/dist/src/utils/filesearch/ignore.d.ts +42 -0
  672. package/dist/src/utils/filesearch/ignore.js +106 -0
  673. package/dist/src/utils/filesearch/ignore.js.map +1 -0
  674. package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
  675. package/dist/src/utils/filesearch/ignore.test.js +144 -0
  676. package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
  677. package/dist/src/utils/filesearch/result-cache.d.ts +33 -0
  678. package/dist/src/utils/filesearch/result-cache.js +59 -0
  679. package/dist/src/utils/filesearch/result-cache.js.map +1 -0
  680. package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
  681. package/dist/src/utils/filesearch/result-cache.test.js +46 -0
  682. package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
  683. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  684. package/dist/src/utils/flashFallback.integration.test.js +119 -0
  685. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  686. package/dist/src/utils/formatters.d.ts +6 -0
  687. package/dist/src/utils/formatters.js +16 -0
  688. package/dist/src/utils/formatters.js.map +1 -0
  689. package/dist/src/utils/generateContentResponseUtilities.d.ts +13 -0
  690. package/dist/src/utils/generateContentResponseUtilities.js +80 -0
  691. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  692. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  693. package/dist/src/utils/generateContentResponseUtilities.test.js +235 -0
  694. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  695. package/dist/src/utils/getFolderStructure.d.ts +31 -0
  696. package/dist/src/utils/getFolderStructure.js +246 -0
  697. package/dist/src/utils/getFolderStructure.js.map +1 -0
  698. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  699. package/dist/src/utils/getFolderStructure.test.js +282 -0
  700. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  701. package/dist/src/utils/getPty.d.ts +19 -0
  702. package/dist/src/utils/getPty.js +23 -0
  703. package/dist/src/utils/getPty.js.map +1 -0
  704. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  705. package/dist/src/utils/gitIgnoreParser.js +61 -0
  706. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  707. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  708. package/dist/src/utils/gitIgnoreParser.test.js +154 -0
  709. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  710. package/dist/src/utils/gitUtils.d.ts +17 -0
  711. package/dist/src/utils/gitUtils.js +61 -0
  712. package/dist/src/utils/gitUtils.js.map +1 -0
  713. package/dist/src/utils/ignorePatterns.d.ts +103 -0
  714. package/dist/src/utils/ignorePatterns.js +220 -0
  715. package/dist/src/utils/ignorePatterns.js.map +1 -0
  716. package/dist/src/utils/ignorePatterns.test.d.ts +6 -0
  717. package/dist/src/utils/ignorePatterns.test.js +250 -0
  718. package/dist/src/utils/ignorePatterns.test.js.map +1 -0
  719. package/dist/src/utils/installationManager.d.ts +16 -0
  720. package/dist/src/utils/installationManager.js +50 -0
  721. package/dist/src/utils/installationManager.js.map +1 -0
  722. package/dist/src/utils/installationManager.test.d.ts +6 -0
  723. package/dist/src/utils/installationManager.test.js +83 -0
  724. package/dist/src/utils/installationManager.test.js.map +1 -0
  725. package/dist/src/utils/language-detection.d.ts +6 -0
  726. package/dist/src/utils/language-detection.js +101 -0
  727. package/dist/src/utils/language-detection.js.map +1 -0
  728. package/dist/src/utils/memoryDiscovery.d.ts +15 -0
  729. package/dist/src/utils/memoryDiscovery.js +271 -0
  730. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  731. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  732. package/dist/src/utils/memoryDiscovery.test.js +219 -0
  733. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  734. package/dist/src/utils/memoryImportProcessor.d.ts +42 -0
  735. package/dist/src/utils/memoryImportProcessor.js +296 -0
  736. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  737. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  738. package/dist/src/utils/memoryImportProcessor.test.js +573 -0
  739. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  740. package/dist/src/utils/messageInspectors.d.ts +8 -0
  741. package/dist/src/utils/messageInspectors.js +16 -0
  742. package/dist/src/utils/messageInspectors.js.map +1 -0
  743. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  744. package/dist/src/utils/nextSpeakerChecker.js +91 -0
  745. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  746. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  747. package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
  748. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  749. package/dist/src/utils/openaiLogger.d.ts +42 -0
  750. package/dist/src/utils/openaiLogger.js +123 -0
  751. package/dist/src/utils/openaiLogger.js.map +1 -0
  752. package/dist/src/utils/partUtils.d.ts +35 -0
  753. package/dist/src/utils/partUtils.js +133 -0
  754. package/dist/src/utils/partUtils.js.map +1 -0
  755. package/dist/src/utils/partUtils.test.d.ts +6 -0
  756. package/dist/src/utils/partUtils.test.js +241 -0
  757. package/dist/src/utils/partUtils.test.js.map +1 -0
  758. package/dist/src/utils/pathReader.d.ts +17 -0
  759. package/dist/src/utils/pathReader.js +92 -0
  760. package/dist/src/utils/pathReader.js.map +1 -0
  761. package/dist/src/utils/pathReader.test.d.ts +6 -0
  762. package/dist/src/utils/pathReader.test.js +363 -0
  763. package/dist/src/utils/pathReader.test.js.map +1 -0
  764. package/dist/src/utils/paths.d.ts +58 -0
  765. package/dist/src/utils/paths.js +159 -0
  766. package/dist/src/utils/paths.js.map +1 -0
  767. package/dist/src/utils/paths.test.d.ts +6 -0
  768. package/dist/src/utils/paths.test.js +225 -0
  769. package/dist/src/utils/paths.test.js.map +1 -0
  770. package/dist/src/utils/projectSummary.d.ts +22 -0
  771. package/dist/src/utils/projectSummary.js +86 -0
  772. package/dist/src/utils/projectSummary.js.map +1 -0
  773. package/dist/src/utils/quotaErrorDetection.d.ts +20 -0
  774. package/dist/src/utils/quotaErrorDetection.js +114 -0
  775. package/dist/src/utils/quotaErrorDetection.js.map +1 -0
  776. package/dist/src/utils/quotaErrorDetection.test.d.ts +6 -0
  777. package/dist/src/utils/quotaErrorDetection.test.js +153 -0
  778. package/dist/src/utils/quotaErrorDetection.test.js.map +1 -0
  779. package/dist/src/utils/request-tokenizer/imageTokenizer.d.ts +112 -0
  780. package/dist/src/utils/request-tokenizer/imageTokenizer.js +401 -0
  781. package/dist/src/utils/request-tokenizer/imageTokenizer.js.map +1 -0
  782. package/dist/src/utils/request-tokenizer/imageTokenizer.test.d.ts +6 -0
  783. package/dist/src/utils/request-tokenizer/imageTokenizer.test.js +114 -0
  784. package/dist/src/utils/request-tokenizer/imageTokenizer.test.js.map +1 -0
  785. package/dist/src/utils/request-tokenizer/index.d.ts +18 -0
  786. package/dist/src/utils/request-tokenizer/index.js +30 -0
  787. package/dist/src/utils/request-tokenizer/index.js.map +1 -0
  788. package/dist/src/utils/request-tokenizer/requestTokenizer.d.ts +56 -0
  789. package/dist/src/utils/request-tokenizer/requestTokenizer.js +263 -0
  790. package/dist/src/utils/request-tokenizer/requestTokenizer.js.map +1 -0
  791. package/dist/src/utils/request-tokenizer/requestTokenizer.test.d.ts +6 -0
  792. package/dist/src/utils/request-tokenizer/requestTokenizer.test.js +245 -0
  793. package/dist/src/utils/request-tokenizer/requestTokenizer.test.js.map +1 -0
  794. package/dist/src/utils/request-tokenizer/supportedImageFormats.d.ts +30 -0
  795. package/dist/src/utils/request-tokenizer/supportedImageFormats.js +41 -0
  796. package/dist/src/utils/request-tokenizer/supportedImageFormats.js.map +1 -0
  797. package/dist/src/utils/request-tokenizer/textTokenizer.d.ts +29 -0
  798. package/dist/src/utils/request-tokenizer/textTokenizer.js +88 -0
  799. package/dist/src/utils/request-tokenizer/textTokenizer.js.map +1 -0
  800. package/dist/src/utils/request-tokenizer/textTokenizer.test.d.ts +6 -0
  801. package/dist/src/utils/request-tokenizer/textTokenizer.test.js +253 -0
  802. package/dist/src/utils/request-tokenizer/textTokenizer.test.js.map +1 -0
  803. package/dist/src/utils/request-tokenizer/types.d.ts +55 -0
  804. package/dist/src/utils/request-tokenizer/types.js +7 -0
  805. package/dist/src/utils/request-tokenizer/types.js.map +1 -0
  806. package/dist/src/utils/retry.d.ts +30 -0
  807. package/dist/src/utils/retry.js +288 -0
  808. package/dist/src/utils/retry.js.map +1 -0
  809. package/dist/src/utils/retry.test.d.ts +6 -0
  810. package/dist/src/utils/retry.test.js +452 -0
  811. package/dist/src/utils/retry.test.js.map +1 -0
  812. package/dist/src/utils/safeJsonParse.d.ts +15 -0
  813. package/dist/src/utils/safeJsonParse.js +41 -0
  814. package/dist/src/utils/safeJsonParse.js.map +1 -0
  815. package/dist/src/utils/safeJsonParse.test.d.ts +6 -0
  816. package/dist/src/utils/safeJsonParse.test.js +112 -0
  817. package/dist/src/utils/safeJsonParse.test.js.map +1 -0
  818. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  819. package/dist/src/utils/safeJsonStringify.js +25 -0
  820. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  821. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  822. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  823. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  824. package/dist/src/utils/schemaValidator.d.ts +15 -0
  825. package/dist/src/utils/schemaValidator.js +57 -0
  826. package/dist/src/utils/schemaValidator.js.map +1 -0
  827. package/dist/src/utils/secure-browser-launcher.d.ts +23 -0
  828. package/dist/src/utils/secure-browser-launcher.js +165 -0
  829. package/dist/src/utils/secure-browser-launcher.js.map +1 -0
  830. package/dist/src/utils/secure-browser-launcher.test.d.ts +6 -0
  831. package/dist/src/utils/secure-browser-launcher.test.js +149 -0
  832. package/dist/src/utils/secure-browser-launcher.test.js.map +1 -0
  833. package/dist/src/utils/session.d.ts +6 -0
  834. package/dist/src/utils/session.js +8 -0
  835. package/dist/src/utils/session.js.map +1 -0
  836. package/dist/src/utils/shell-utils.d.ts +121 -0
  837. package/dist/src/utils/shell-utils.js +381 -0
  838. package/dist/src/utils/shell-utils.js.map +1 -0
  839. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  840. package/dist/src/utils/shell-utils.test.js +346 -0
  841. package/dist/src/utils/shell-utils.test.js.map +1 -0
  842. package/dist/src/utils/shellReadOnlyChecker.d.ts +6 -0
  843. package/dist/src/utils/shellReadOnlyChecker.js +247 -0
  844. package/dist/src/utils/shellReadOnlyChecker.js.map +1 -0
  845. package/dist/src/utils/shellReadOnlyChecker.test.d.ts +6 -0
  846. package/dist/src/utils/shellReadOnlyChecker.test.js +47 -0
  847. package/dist/src/utils/shellReadOnlyChecker.test.js.map +1 -0
  848. package/dist/src/utils/subagentGenerator.d.ts +20 -0
  849. package/dist/src/utils/subagentGenerator.js +116 -0
  850. package/dist/src/utils/subagentGenerator.js.map +1 -0
  851. package/dist/src/utils/subagentGenerator.test.d.ts +6 -0
  852. package/dist/src/utils/subagentGenerator.test.js +158 -0
  853. package/dist/src/utils/subagentGenerator.test.js.map +1 -0
  854. package/dist/src/utils/summarizer.d.ts +25 -0
  855. package/dist/src/utils/summarizer.js +51 -0
  856. package/dist/src/utils/summarizer.js.map +1 -0
  857. package/dist/src/utils/summarizer.test.d.ts +6 -0
  858. package/dist/src/utils/summarizer.test.js +131 -0
  859. package/dist/src/utils/summarizer.test.js.map +1 -0
  860. package/dist/src/utils/systemEncoding.d.ts +40 -0
  861. package/dist/src/utils/systemEncoding.js +149 -0
  862. package/dist/src/utils/systemEncoding.js.map +1 -0
  863. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  864. package/dist/src/utils/systemEncoding.test.js +368 -0
  865. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  866. package/dist/src/utils/testUtils.d.ts +29 -0
  867. package/dist/src/utils/testUtils.js +70 -0
  868. package/dist/src/utils/testUtils.js.map +1 -0
  869. package/dist/src/utils/textUtils.d.ts +13 -0
  870. package/dist/src/utils/textUtils.js +28 -0
  871. package/dist/src/utils/textUtils.js.map +1 -0
  872. package/dist/src/utils/tool-utils.d.ts +19 -0
  873. package/dist/src/utils/tool-utils.js +58 -0
  874. package/dist/src/utils/tool-utils.js.map +1 -0
  875. package/dist/src/utils/tool-utils.test.d.ts +6 -0
  876. package/dist/src/utils/tool-utils.test.js +61 -0
  877. package/dist/src/utils/tool-utils.test.js.map +1 -0
  878. package/dist/src/utils/userAccountManager.d.ts +20 -0
  879. package/dist/src/utils/userAccountManager.js +114 -0
  880. package/dist/src/utils/userAccountManager.js.map +1 -0
  881. package/dist/src/utils/userAccountManager.test.d.ts +6 -0
  882. package/dist/src/utils/userAccountManager.test.js +223 -0
  883. package/dist/src/utils/userAccountManager.test.js.map +1 -0
  884. package/dist/src/utils/workspaceContext.d.ts +66 -0
  885. package/dist/src/utils/workspaceContext.js +171 -0
  886. package/dist/src/utils/workspaceContext.js.map +1 -0
  887. package/dist/src/utils/workspaceContext.test.d.ts +6 -0
  888. package/dist/src/utils/workspaceContext.test.js +318 -0
  889. package/dist/src/utils/workspaceContext.test.js.map +1 -0
  890. package/dist/src/utils/yaml-parser.d.ts +29 -0
  891. package/dist/src/utils/yaml-parser.js +172 -0
  892. package/dist/src/utils/yaml-parser.js.map +1 -0
  893. package/dist/src/utils/yaml-parser.test.d.ts +6 -0
  894. package/dist/src/utils/yaml-parser.test.js +170 -0
  895. package/dist/src/utils/yaml-parser.test.js.map +1 -0
  896. package/dist/tsconfig.tsbuildinfo +1 -0
  897. package/package.json +89 -0
@@ -0,0 +1,822 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Blackbox
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { SubagentManager } from './subagent-manager.js';
11
+ import { SubagentError } from './types.js';
12
+ import { makeFakeConfig } from '../test-utils/config.js';
13
+ // Mock file system operations
14
+ vi.mock('fs/promises');
15
+ vi.mock('os');
16
+ // Mock yaml parser - use vi.hoisted for proper hoisting
17
+ const mockParseYaml = vi.hoisted(() => vi.fn());
18
+ const mockStringifyYaml = vi.hoisted(() => vi.fn());
19
+ vi.mock('../utils/yaml-parser.js', () => ({
20
+ parse: mockParseYaml,
21
+ stringify: mockStringifyYaml,
22
+ }));
23
+ // Mock dependencies - create mock functions at the top level
24
+ const mockValidateConfig = vi.hoisted(() => vi.fn());
25
+ const mockValidateOrThrow = vi.hoisted(() => vi.fn());
26
+ vi.mock('./validation.js', () => ({
27
+ SubagentValidator: class MockSubagentValidator {
28
+ validateConfig = mockValidateConfig;
29
+ validateOrThrow = mockValidateOrThrow;
30
+ },
31
+ }));
32
+ vi.mock('./subagent.js');
33
+ describe('SubagentManager', () => {
34
+ let manager;
35
+ let mockToolRegistry;
36
+ let mockConfig;
37
+ beforeEach(() => {
38
+ mockToolRegistry = {
39
+ getAllTools: vi.fn().mockReturnValue([
40
+ { name: 'read_file', displayName: 'Read File' },
41
+ { name: 'write_file', displayName: 'Write File' },
42
+ { name: 'grep', displayName: 'Search Files' },
43
+ ]),
44
+ };
45
+ // Create mock Config object using test utility
46
+ mockConfig = makeFakeConfig({
47
+ sessionId: 'test-session-id',
48
+ });
49
+ // Mock the tool registry and project root methods
50
+ vi.spyOn(mockConfig, 'getToolRegistry').mockReturnValue(mockToolRegistry);
51
+ vi.spyOn(mockConfig, 'getProjectRoot').mockReturnValue('/test/project');
52
+ // Mock os.homedir
53
+ vi.mocked(os.homedir).mockReturnValue('/home/user');
54
+ // Reset and setup mocks
55
+ vi.clearAllMocks();
56
+ mockValidateConfig.mockReturnValue({
57
+ isValid: true,
58
+ errors: [],
59
+ warnings: [],
60
+ });
61
+ mockValidateOrThrow.mockImplementation(() => { });
62
+ // Setup yaml parser mocks with sophisticated behavior
63
+ mockParseYaml.mockImplementation((yamlString) => {
64
+ // Handle different test cases based on YAML content
65
+ if (yamlString.includes('tools:')) {
66
+ return {
67
+ name: 'test-agent',
68
+ description: 'A test subagent',
69
+ tools: ['read_file', 'write_file'],
70
+ };
71
+ }
72
+ if (yamlString.includes('modelConfig:')) {
73
+ return {
74
+ name: 'test-agent',
75
+ description: 'A test subagent',
76
+ modelConfig: { model: 'custom-model', temp: 0.5 },
77
+ };
78
+ }
79
+ if (yamlString.includes('runConfig:')) {
80
+ return {
81
+ name: 'test-agent',
82
+ description: 'A test subagent',
83
+ runConfig: { max_time_minutes: 5, max_turns: 10 },
84
+ };
85
+ }
86
+ if (yamlString.includes('name: agent1')) {
87
+ return { name: 'agent1', description: 'First agent' };
88
+ }
89
+ if (yamlString.includes('name: agent2')) {
90
+ return { name: 'agent2', description: 'Second agent' };
91
+ }
92
+ if (yamlString.includes('name: agent3')) {
93
+ return { name: 'agent3', description: 'Third agent' };
94
+ }
95
+ if (yamlString.includes('name: 11')) {
96
+ return { name: 11, description: 333 }; // Numeric values test case
97
+ }
98
+ if (yamlString.includes('name: true')) {
99
+ return { name: true, description: false }; // Boolean values test case
100
+ }
101
+ if (!yamlString.includes('name:')) {
102
+ return { description: 'A test subagent' }; // Missing name case
103
+ }
104
+ if (!yamlString.includes('description:')) {
105
+ return { name: 'test-agent' }; // Missing description case
106
+ }
107
+ // Default case
108
+ return {
109
+ name: 'test-agent',
110
+ description: 'A test subagent',
111
+ };
112
+ });
113
+ mockStringifyYaml.mockImplementation((obj) => {
114
+ let yaml = '';
115
+ for (const [key, value] of Object.entries(obj)) {
116
+ if (key === 'tools' && Array.isArray(value)) {
117
+ yaml += `tools:\n${value.map((tool) => ` - ${tool}`).join('\n')}\n`;
118
+ }
119
+ else if (key === 'modelConfig' &&
120
+ typeof value === 'object' &&
121
+ value) {
122
+ yaml += `modelConfig:\n`;
123
+ for (const [k, v] of Object.entries(value)) {
124
+ yaml += ` ${k}: ${v}\n`;
125
+ }
126
+ }
127
+ else if (key === 'runConfig' && typeof value === 'object' && value) {
128
+ yaml += `runConfig:\n`;
129
+ for (const [k, v] of Object.entries(value)) {
130
+ yaml += ` ${k}: ${v}\n`;
131
+ }
132
+ }
133
+ else {
134
+ yaml += `${key}: ${value}\n`;
135
+ }
136
+ }
137
+ return yaml.trim();
138
+ });
139
+ manager = new SubagentManager(mockConfig);
140
+ });
141
+ afterEach(() => {
142
+ vi.restoreAllMocks();
143
+ });
144
+ const validConfig = {
145
+ name: 'test-agent',
146
+ description: 'A test subagent',
147
+ systemPrompt: 'You are a helpful assistant.',
148
+ level: 'project',
149
+ filePath: '/test/project/.blackboxcli/agents/test-agent.md',
150
+ };
151
+ const validMarkdown = `---
152
+ name: test-agent
153
+ description: A test subagent
154
+ ---
155
+
156
+ You are a helpful assistant.
157
+ `;
158
+ describe('parseSubagentContent', () => {
159
+ it('should parse valid markdown content', () => {
160
+ const config = manager.parseSubagentContent(validMarkdown, validConfig.filePath, 'project');
161
+ expect(config.name).toBe('test-agent');
162
+ expect(config.description).toBe('A test subagent');
163
+ expect(config.systemPrompt).toBe('You are a helpful assistant.');
164
+ expect(config.level).toBe('project');
165
+ expect(config.filePath).toBe(validConfig.filePath);
166
+ });
167
+ it('should parse content with tools', () => {
168
+ const markdownWithTools = `---
169
+ name: test-agent
170
+ description: A test subagent
171
+ tools:
172
+ - read_file
173
+ - write_file
174
+ ---
175
+
176
+ You are a helpful assistant.
177
+ `;
178
+ const config = manager.parseSubagentContent(markdownWithTools, validConfig.filePath, 'project');
179
+ expect(config.tools).toEqual(['read_file', 'write_file']);
180
+ });
181
+ it('should parse content with model config', () => {
182
+ const markdownWithModel = `---
183
+ name: test-agent
184
+ description: A test subagent
185
+ modelConfig:
186
+ model: custom-model
187
+ temp: 0.5
188
+ ---
189
+
190
+ You are a helpful assistant.
191
+ `;
192
+ const config = manager.parseSubagentContent(markdownWithModel, validConfig.filePath, 'project');
193
+ expect(config.modelConfig).toEqual({ model: 'custom-model', temp: 0.5 });
194
+ });
195
+ it('should parse content with run config', () => {
196
+ const markdownWithRun = `---
197
+ name: test-agent
198
+ description: A test subagent
199
+ runConfig:
200
+ max_time_minutes: 5
201
+ max_turns: 10
202
+ ---
203
+
204
+ You are a helpful assistant.
205
+ `;
206
+ const config = manager.parseSubagentContent(markdownWithRun, validConfig.filePath, 'project');
207
+ expect(config.runConfig).toEqual({ max_time_minutes: 5, max_turns: 10 });
208
+ });
209
+ it('should handle numeric name and description values', () => {
210
+ const markdownWithNumeric = `---
211
+ name: 11
212
+ description: 333
213
+ ---
214
+
215
+ You are a helpful assistant.
216
+ `;
217
+ const config = manager.parseSubagentContent(markdownWithNumeric, validConfig.filePath, 'project');
218
+ expect(config.name).toBe('11');
219
+ expect(config.description).toBe('333');
220
+ expect(typeof config.name).toBe('string');
221
+ expect(typeof config.description).toBe('string');
222
+ });
223
+ it('should handle boolean name and description values', () => {
224
+ const markdownWithBoolean = `---
225
+ name: true
226
+ description: false
227
+ ---
228
+
229
+ You are a helpful assistant.
230
+ `;
231
+ const config = manager.parseSubagentContent(markdownWithBoolean, validConfig.filePath, 'project');
232
+ expect(config.name).toBe('true');
233
+ expect(config.description).toBe('false');
234
+ expect(typeof config.name).toBe('string');
235
+ expect(typeof config.description).toBe('string');
236
+ });
237
+ it('should determine level from file path', () => {
238
+ const projectPath = '/test/project/.blackboxcli/agents/test-agent.md';
239
+ const userPath = '/home/user/.blackboxcli/agents/test-agent.md';
240
+ const projectConfig = manager.parseSubagentContent(validMarkdown, projectPath, 'project');
241
+ const userConfig = manager.parseSubagentContent(validMarkdown, userPath, 'user');
242
+ expect(projectConfig.level).toBe('project');
243
+ expect(userConfig.level).toBe('user');
244
+ });
245
+ it('should throw error for invalid frontmatter format', () => {
246
+ const invalidMarkdown = `No frontmatter here
247
+ Just content`;
248
+ expect(() => manager.parseSubagentContent(invalidMarkdown, validConfig.filePath, 'project')).toThrow(SubagentError);
249
+ });
250
+ it('should throw error for missing name', () => {
251
+ const markdownWithoutName = `---
252
+ description: A test subagent
253
+ ---
254
+
255
+ You are a helpful assistant.
256
+ `;
257
+ expect(() => manager.parseSubagentContent(markdownWithoutName, validConfig.filePath, 'project')).toThrow(SubagentError);
258
+ });
259
+ it('should throw error for missing description', () => {
260
+ const markdownWithoutDescription = `---
261
+ name: test-agent
262
+ ---
263
+
264
+ You are a helpful assistant.
265
+ `;
266
+ expect(() => manager.parseSubagentContent(markdownWithoutDescription, validConfig.filePath, 'project')).toThrow(SubagentError);
267
+ });
268
+ it('should not warn when filename matches subagent name', () => {
269
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
270
+ const matchingPath = '/test/project/.blackboxcli/agents/test-agent.md';
271
+ const config = manager.parseSubagentContent(validMarkdown, matchingPath, 'project');
272
+ expect(config.name).toBe('test-agent');
273
+ expect(consoleSpy).not.toHaveBeenCalled();
274
+ consoleSpy.mockRestore();
275
+ });
276
+ });
277
+ describe('serializeSubagent', () => {
278
+ it('should serialize basic configuration', () => {
279
+ const serialized = manager.serializeSubagent(validConfig);
280
+ expect(serialized).toContain('name: test-agent');
281
+ expect(serialized).toContain('description: A test subagent');
282
+ expect(serialized).toContain('You are a helpful assistant.');
283
+ expect(serialized).toMatch(/^---\n[\s\S]*\n---\n\n[\s\S]*\n$/);
284
+ });
285
+ it('should serialize configuration with tools', () => {
286
+ const configWithTools = {
287
+ ...validConfig,
288
+ tools: ['read_file', 'write_file'],
289
+ };
290
+ const serialized = manager.serializeSubagent(configWithTools);
291
+ expect(serialized).toContain('tools:');
292
+ expect(serialized).toContain('- read_file');
293
+ expect(serialized).toContain('- write_file');
294
+ });
295
+ it('should serialize configuration with model config', () => {
296
+ const configWithModel = {
297
+ ...validConfig,
298
+ modelConfig: { model: 'custom-model', temp: 0.5 },
299
+ };
300
+ const serialized = manager.serializeSubagent(configWithModel);
301
+ expect(serialized).toContain('modelConfig:');
302
+ expect(serialized).toContain('model: custom-model');
303
+ expect(serialized).toContain('temp: 0.5');
304
+ });
305
+ it('should not include empty optional fields', () => {
306
+ const serialized = manager.serializeSubagent(validConfig);
307
+ expect(serialized).not.toContain('tools:');
308
+ expect(serialized).not.toContain('modelConfig:');
309
+ expect(serialized).not.toContain('runConfig:');
310
+ });
311
+ });
312
+ describe('createSubagent', () => {
313
+ beforeEach(() => {
314
+ // Mock successful file operations
315
+ vi.mocked(fs.access).mockRejectedValue(new Error('File not found'));
316
+ vi.mocked(fs.mkdir).mockResolvedValue(undefined);
317
+ vi.mocked(fs.writeFile).mockResolvedValue(undefined);
318
+ });
319
+ it('should create subagent successfully', async () => {
320
+ await manager.createSubagent(validConfig, { level: 'project' });
321
+ expect(fs.mkdir).toHaveBeenCalledWith(path.normalize(path.dirname(validConfig.filePath)), { recursive: true });
322
+ expect(fs.writeFile).toHaveBeenCalledWith(expect.stringContaining('test-agent.md'), expect.stringContaining('name: test-agent'), 'utf8');
323
+ });
324
+ it('should throw error if file already exists and overwrite is false', async () => {
325
+ vi.mocked(fs.access).mockResolvedValue(undefined); // File exists
326
+ await expect(manager.createSubagent(validConfig, { level: 'project' })).rejects.toThrow(SubagentError);
327
+ await expect(manager.createSubagent(validConfig, { level: 'project' })).rejects.toThrow(/already exists/);
328
+ });
329
+ it('should overwrite file when overwrite is true', async () => {
330
+ vi.mocked(fs.access).mockResolvedValue(undefined); // File exists
331
+ await manager.createSubagent(validConfig, {
332
+ level: 'project',
333
+ overwrite: true,
334
+ });
335
+ expect(fs.writeFile).toHaveBeenCalled();
336
+ });
337
+ it('should use custom path when provided', async () => {
338
+ const customPath = '/custom/path/agent.md';
339
+ await manager.createSubagent(validConfig, {
340
+ level: 'project',
341
+ customPath,
342
+ });
343
+ expect(fs.writeFile).toHaveBeenCalledWith(customPath, expect.any(String), 'utf8');
344
+ });
345
+ it('should throw error on file write failure', async () => {
346
+ vi.mocked(fs.writeFile).mockRejectedValue(new Error('Write failed'));
347
+ await expect(manager.createSubagent(validConfig, { level: 'project' })).rejects.toThrow(SubagentError);
348
+ await expect(manager.createSubagent(validConfig, { level: 'project' })).rejects.toThrow(/Failed to write subagent file/);
349
+ });
350
+ });
351
+ describe('loadSubagent', () => {
352
+ it('should load subagent from project level first', async () => {
353
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']);
355
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
356
+ const config = await manager.loadSubagent('test-agent');
357
+ expect(config).toBeDefined();
358
+ expect(config.name).toBe('test-agent');
359
+ expect(fs.readdir).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents'));
360
+ expect(fs.readFile).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents/test-agent.md'), 'utf8');
361
+ });
362
+ it('should fall back to user level if project level fails', async () => {
363
+ vi.mocked(fs.readdir)
364
+ .mockRejectedValueOnce(new Error('Project dir not found')) // project level fails
365
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
366
+ .mockResolvedValueOnce(['test-agent.md']); // user level succeeds
367
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
368
+ const config = await manager.loadSubagent('test-agent');
369
+ expect(config).toBeDefined();
370
+ expect(config.name).toBe('test-agent');
371
+ expect(fs.readdir).toHaveBeenCalledWith(path.normalize('/home/user/.blackboxcli/agents'));
372
+ expect(fs.readFile).toHaveBeenCalledWith(path.normalize('/home/user/.blackboxcli/agents/test-agent.md'), 'utf8');
373
+ });
374
+ it('should return null if not found at either level', async () => {
375
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
376
+ const config = await manager.loadSubagent('nonexistent');
377
+ expect(config).toBeNull();
378
+ });
379
+ it('should load subagent even when filename does not match name', async () => {
380
+ // Mock readdir to return files with different names
381
+ vi.mocked(fs.readdir).mockResolvedValue([
382
+ 'wrong-filename.md',
383
+ 'another-file.md',
384
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
385
+ ]);
386
+ // Mock readFile to return content with different name
387
+ const mismatchedMarkdown = `---
388
+ name: correct-agent-name
389
+ description: A test subagent with mismatched filename
390
+ ---
391
+
392
+ You are a helpful assistant.`;
393
+ const anotherFileMarkdown = `---
394
+ name: other-agent
395
+ description: Some other agent
396
+ ---
397
+
398
+ You are another assistant.`;
399
+ vi.mocked(fs.readFile)
400
+ .mockResolvedValueOnce(mismatchedMarkdown) // first file (wrong-filename.md) - matches!
401
+ .mockResolvedValueOnce(anotherFileMarkdown); // second file (another-file.md) - doesn't match
402
+ // Mock parseYaml for different scenarios
403
+ mockParseYaml
404
+ .mockReturnValueOnce({
405
+ name: 'correct-agent-name',
406
+ description: 'A test subagent with mismatched filename',
407
+ })
408
+ .mockReturnValueOnce({
409
+ name: 'other-agent',
410
+ description: 'Some other agent',
411
+ });
412
+ const config = await manager.loadSubagent('correct-agent-name');
413
+ expect(config).toBeDefined();
414
+ expect(config.name).toBe('correct-agent-name');
415
+ expect(config.filePath).toBe(path.normalize('/test/project/.blackboxcli/agents/wrong-filename.md'));
416
+ // Verify it scanned the directory instead of using direct path
417
+ expect(fs.readdir).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents'));
418
+ });
419
+ it('should search user level when filename mismatch at project level', async () => {
420
+ // Mock project level to have no matching files
421
+ vi.mocked(fs.readdir)
422
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
423
+ .mockResolvedValueOnce(['other-file.md']) // project level
424
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
425
+ .mockResolvedValueOnce(['user-agent.md']); // user level
426
+ const projectMarkdown = `---
427
+ name: wrong-agent
428
+ description: Wrong agent
429
+ ---
430
+
431
+ You are a wrong assistant.`;
432
+ const userMarkdown = `---
433
+ name: target-agent
434
+ description: A test subagent at user level
435
+ ---
436
+
437
+ You are a helpful assistant.`;
438
+ vi.mocked(fs.readFile)
439
+ .mockResolvedValueOnce(projectMarkdown) // project level file (other-file.md)
440
+ .mockResolvedValueOnce(userMarkdown); // user level file (user-agent.md)
441
+ // Mock parseYaml for different scenarios
442
+ mockParseYaml
443
+ .mockReturnValueOnce({
444
+ name: 'wrong-agent',
445
+ description: 'Wrong agent',
446
+ })
447
+ .mockReturnValueOnce({
448
+ name: 'target-agent',
449
+ description: 'A test subagent at user level',
450
+ });
451
+ const config = await manager.loadSubagent('target-agent');
452
+ expect(config).toBeDefined();
453
+ expect(config.name).toBe('target-agent');
454
+ expect(config.filePath).toBe(path.normalize('/home/user/.blackboxcli/agents/user-agent.md'));
455
+ expect(config.level).toBe('user');
456
+ });
457
+ it('should handle specific level search with filename mismatch', async () => {
458
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
459
+ vi.mocked(fs.readdir).mockResolvedValue(['misnamed-file.md']);
460
+ const levelMarkdown = `---
461
+ name: specific-agent
462
+ description: A test subagent for specific level
463
+ ---
464
+
465
+ You are a helpful assistant.`;
466
+ vi.mocked(fs.readFile).mockResolvedValue(levelMarkdown);
467
+ mockParseYaml.mockReturnValue({
468
+ name: 'specific-agent',
469
+ description: 'A test subagent for specific level',
470
+ });
471
+ const config = await manager.loadSubagent('specific-agent', 'project');
472
+ expect(config).toBeDefined();
473
+ expect(config.name).toBe('specific-agent');
474
+ expect(config.filePath).toBe(path.normalize('/test/project/.blackboxcli/agents/misnamed-file.md'));
475
+ });
476
+ });
477
+ describe('updateSubagent', () => {
478
+ beforeEach(() => {
479
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
480
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']);
481
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
482
+ vi.mocked(fs.writeFile).mockResolvedValue(undefined);
483
+ });
484
+ it('should update existing subagent', async () => {
485
+ const updates = { description: 'Updated description' };
486
+ await manager.updateSubagent('test-agent', updates);
487
+ expect(fs.writeFile).toHaveBeenCalledWith(expect.stringContaining('test-agent.md'), expect.stringContaining('Updated description'), 'utf8');
488
+ });
489
+ it('should throw error if subagent not found', async () => {
490
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
491
+ await expect(manager.updateSubagent('nonexistent', {})).rejects.toThrow(SubagentError);
492
+ await expect(manager.updateSubagent('nonexistent', {})).rejects.toThrow(/not found/);
493
+ });
494
+ it('should throw error on write failure', async () => {
495
+ vi.mocked(fs.writeFile).mockRejectedValue(new Error('Write failed'));
496
+ await expect(manager.updateSubagent('test-agent', {})).rejects.toThrow(SubagentError);
497
+ await expect(manager.updateSubagent('test-agent', {})).rejects.toThrow(/Failed to update subagent file/);
498
+ });
499
+ });
500
+ describe('deleteSubagent', () => {
501
+ it('should delete subagent from specified level', async () => {
502
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
503
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']);
504
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
505
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
506
+ await manager.deleteSubagent('test-agent', 'project');
507
+ expect(fs.unlink).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents/test-agent.md'));
508
+ });
509
+ it('should delete from both levels if no level specified', async () => {
510
+ vi.mocked(fs.readdir)
511
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
512
+ .mockResolvedValueOnce(['test-agent.md']) // project level
513
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
514
+ .mockResolvedValueOnce(['test-agent.md']); // user level
515
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
516
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
517
+ await manager.deleteSubagent('test-agent');
518
+ expect(fs.unlink).toHaveBeenCalledTimes(2);
519
+ expect(fs.unlink).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents/test-agent.md'));
520
+ expect(fs.unlink).toHaveBeenCalledWith(path.normalize('/home/user/.blackboxcli/agents/test-agent.md'));
521
+ });
522
+ it('should throw error if subagent not found', async () => {
523
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
524
+ await expect(manager.deleteSubagent('nonexistent')).rejects.toThrow(SubagentError);
525
+ await expect(manager.deleteSubagent('nonexistent')).rejects.toThrow(/not found/);
526
+ });
527
+ it('should succeed if deleted from at least one level', async () => {
528
+ vi.mocked(fs.readdir)
529
+ .mockRejectedValueOnce(new Error('Project dir not found')) // project level fails
530
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
531
+ .mockResolvedValueOnce(['test-agent.md']); // user level succeeds
532
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
533
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
534
+ await expect(manager.deleteSubagent('test-agent')).resolves.not.toThrow();
535
+ });
536
+ it('should delete subagent with mismatched filename', async () => {
537
+ // Mock directory listing to return files with different names
538
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
539
+ vi.mocked(fs.readdir).mockResolvedValue(['wrong-name.md']);
540
+ const mismatchedMarkdown = `---
541
+ name: correct-name
542
+ description: A test subagent with mismatched filename
543
+ ---
544
+
545
+ You are a helpful assistant.`;
546
+ vi.mocked(fs.readFile).mockResolvedValue(mismatchedMarkdown);
547
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
548
+ mockParseYaml.mockReturnValue({
549
+ name: 'correct-name',
550
+ description: 'A test subagent with mismatched filename',
551
+ });
552
+ await manager.deleteSubagent('correct-name', 'project');
553
+ // Should delete the actual file, not the expected filename
554
+ expect(fs.unlink).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents/wrong-name.md'));
555
+ });
556
+ it('should handle deletion when multiple files exist but only one matches', async () => {
557
+ // Mock directory listing with multiple files
558
+ vi.mocked(fs.readdir).mockResolvedValue([
559
+ 'file1.md',
560
+ 'file2.md',
561
+ 'target-file.md',
562
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
563
+ ]);
564
+ const markdowns = [
565
+ `---
566
+ name: other-agent-1
567
+ description: First other agent
568
+ ---
569
+ Content 1`,
570
+ `---
571
+ name: other-agent-2
572
+ description: Second other agent
573
+ ---
574
+ Content 2`,
575
+ `---
576
+ name: target-agent
577
+ description: The target agent
578
+ ---
579
+ Target content`,
580
+ ];
581
+ vi.mocked(fs.readFile)
582
+ .mockResolvedValueOnce(markdowns[0])
583
+ .mockResolvedValueOnce(markdowns[1])
584
+ .mockResolvedValueOnce(markdowns[2]);
585
+ vi.mocked(fs.unlink).mockResolvedValue(undefined);
586
+ mockParseYaml
587
+ .mockReturnValueOnce({
588
+ name: 'other-agent-1',
589
+ description: 'First other agent',
590
+ })
591
+ .mockReturnValueOnce({
592
+ name: 'other-agent-2',
593
+ description: 'Second other agent',
594
+ })
595
+ .mockReturnValueOnce({
596
+ name: 'target-agent',
597
+ description: 'The target agent',
598
+ });
599
+ await manager.deleteSubagent('target-agent', 'project');
600
+ // Should only delete the matching file
601
+ expect(fs.unlink).toHaveBeenCalledTimes(1);
602
+ expect(fs.unlink).toHaveBeenCalledWith(path.normalize('/test/project/.blackboxcli/agents/target-file.md'));
603
+ });
604
+ });
605
+ describe('listSubagents', () => {
606
+ beforeEach(() => {
607
+ // Mock directory listing
608
+ vi.mocked(fs.readdir)
609
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
610
+ .mockResolvedValueOnce(['agent1.md', 'agent2.md', 'not-md.txt'])
611
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
612
+ .mockResolvedValueOnce(['agent3.md', 'agent1.md']); // user level
613
+ // Mock file reading for valid agents
614
+ vi.mocked(fs.readFile).mockImplementation((filePath) => {
615
+ const pathStr = String(filePath);
616
+ if (pathStr.includes('agent1.md')) {
617
+ return Promise.resolve(`---
618
+ name: agent1
619
+ description: First agent
620
+ ---
621
+ System prompt 1`);
622
+ }
623
+ else if (pathStr.includes('agent2.md')) {
624
+ return Promise.resolve(`---
625
+ name: agent2
626
+ description: Second agent
627
+ ---
628
+ System prompt 2`);
629
+ }
630
+ else if (pathStr.includes('agent3.md')) {
631
+ return Promise.resolve(`---
632
+ name: agent3
633
+ description: Third agent
634
+ ---
635
+ System prompt 3`);
636
+ }
637
+ return Promise.reject(new Error('File not found'));
638
+ });
639
+ });
640
+ it('should list subagents from both levels', async () => {
641
+ const subagents = await manager.listSubagents();
642
+ expect(subagents).toHaveLength(4); // agent1 (project takes precedence), agent2, agent3, general-purpose (built-in)
643
+ expect(subagents.map((s) => s.name)).toEqual([
644
+ 'agent1',
645
+ 'agent2',
646
+ 'agent3',
647
+ 'general-purpose',
648
+ ]);
649
+ });
650
+ it('should prioritize project level over user level', async () => {
651
+ const subagents = await manager.listSubagents();
652
+ const agent1 = subagents.find((s) => s.name === 'agent1');
653
+ expect(agent1.level).toBe('project');
654
+ });
655
+ it('should filter by level', async () => {
656
+ const projectSubagents = await manager.listSubagents({
657
+ level: 'project',
658
+ });
659
+ expect(projectSubagents).toHaveLength(2); // agent1, agent2
660
+ expect(projectSubagents.every((s) => s.level === 'project')).toBe(true);
661
+ });
662
+ it('should sort by name', async () => {
663
+ const subagents = await manager.listSubagents({
664
+ sortBy: 'name',
665
+ sortOrder: 'asc',
666
+ });
667
+ const names = subagents.map((s) => s.name);
668
+ expect(names).toEqual(['agent1', 'agent2', 'agent3', 'general-purpose']);
669
+ });
670
+ it('should handle empty directories', async () => {
671
+ // Reset all mocks for this specific test
672
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
673
+ vi.mocked(fs.readdir).mockResolvedValue([]);
674
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No files'));
675
+ const subagents = await manager.listSubagents();
676
+ expect(subagents).toHaveLength(1); // Only built-in agents remain
677
+ expect(subagents[0].name).toBe('general-purpose');
678
+ expect(subagents[0].level).toBe('builtin');
679
+ });
680
+ it('should handle directory read errors', async () => {
681
+ // Reset all mocks for this specific test
682
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
683
+ vi.mocked(fs.readFile).mockRejectedValue(new Error('No files'));
684
+ const subagents = await manager.listSubagents();
685
+ expect(subagents).toHaveLength(1); // Only built-in agents remain
686
+ expect(subagents[0].name).toBe('general-purpose');
687
+ expect(subagents[0].level).toBe('builtin');
688
+ });
689
+ });
690
+ describe('findSubagentByName', () => {
691
+ it('should find existing subagent', async () => {
692
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
693
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']);
694
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
695
+ const metadata = await manager.findSubagentByName('test-agent');
696
+ expect(metadata).toBeDefined();
697
+ expect(metadata.name).toBe('test-agent');
698
+ expect(metadata.description).toBe('A test subagent');
699
+ });
700
+ it('should return null for non-existent subagent', async () => {
701
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
702
+ const metadata = await manager.findSubagentByName('nonexistent');
703
+ expect(metadata).toBeNull();
704
+ });
705
+ });
706
+ describe('isNameAvailable', () => {
707
+ it('should return true for available names', async () => {
708
+ vi.mocked(fs.readdir).mockRejectedValue(new Error('Directory not found'));
709
+ const available = await manager.isNameAvailable('new-agent');
710
+ expect(available).toBe(true);
711
+ });
712
+ it('should return false for existing names', async () => {
713
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
714
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']);
715
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
716
+ const available = await manager.isNameAvailable('test-agent');
717
+ expect(available).toBe(false);
718
+ });
719
+ it('should check specific level when provided', async () => {
720
+ // The isNameAvailable method loads from both levels and checks if found subagent is at different level
721
+ // First call: loads subagent (found at user level), checks if it's at project level (different) -> available
722
+ vi.mocked(fs.readdir)
723
+ .mockRejectedValueOnce(new Error('Project dir not found')) // project level
724
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
725
+ .mockResolvedValueOnce(['test-agent.md']); // user level - found here
726
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
727
+ const availableAtProject = await manager.isNameAvailable('test-agent', 'project');
728
+ expect(availableAtProject).toBe(true); // Available at project because found at user level
729
+ // Second call: loads subagent (found at user level), checks if it's at user level (same) -> not available
730
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
731
+ vi.mocked(fs.readdir).mockResolvedValue(['test-agent.md']); // user level - found here
732
+ vi.mocked(fs.readFile).mockResolvedValue(validMarkdown);
733
+ const availableAtUser = await manager.isNameAvailable('test-agent', 'user');
734
+ expect(availableAtUser).toBe(false); // Not available at user because found at user level
735
+ });
736
+ });
737
+ describe('Runtime Configuration Methods', () => {
738
+ describe('convertToRuntimeConfig', () => {
739
+ it('should convert basic configuration', () => {
740
+ const runtimeConfig = manager.convertToRuntimeConfig(validConfig);
741
+ expect(runtimeConfig.promptConfig.systemPrompt).toBe(validConfig.systemPrompt);
742
+ expect(runtimeConfig.modelConfig).toEqual({});
743
+ expect(runtimeConfig.runConfig).toEqual({});
744
+ expect(runtimeConfig.toolConfig).toBeUndefined();
745
+ });
746
+ it('should include tool configuration when tools are specified', () => {
747
+ const configWithTools = {
748
+ ...validConfig,
749
+ tools: ['read_file', 'write_file'],
750
+ };
751
+ const runtimeConfig = manager.convertToRuntimeConfig(configWithTools);
752
+ expect(runtimeConfig.toolConfig).toBeDefined();
753
+ expect(runtimeConfig.toolConfig.tools).toEqual([
754
+ 'read_file',
755
+ 'write_file',
756
+ ]);
757
+ });
758
+ it('should transform display names to tool names in tool configuration', () => {
759
+ const configWithDisplayNames = {
760
+ ...validConfig,
761
+ tools: ['Read File', 'write_file', 'Search Files', 'unknown_tool'],
762
+ };
763
+ const runtimeConfig = manager.convertToRuntimeConfig(configWithDisplayNames);
764
+ expect(runtimeConfig.toolConfig).toBeDefined();
765
+ expect(runtimeConfig.toolConfig.tools).toEqual([
766
+ 'read_file', // 'Read File' -> 'read_file' (display name match)
767
+ 'write_file', // 'write_file' -> 'write_file' (exact name match)
768
+ 'grep', // 'Search Files' -> 'grep' (display name match)
769
+ 'unknown_tool', // 'unknown_tool' -> 'unknown_tool' (preserved as-is)
770
+ ]);
771
+ });
772
+ it('should merge custom model and run configurations', () => {
773
+ const configWithCustom = {
774
+ ...validConfig,
775
+ modelConfig: { model: 'custom-model', temp: 0.5 },
776
+ runConfig: { max_time_minutes: 5 },
777
+ };
778
+ const runtimeConfig = manager.convertToRuntimeConfig(configWithCustom);
779
+ expect(runtimeConfig.modelConfig.model).toBe('custom-model');
780
+ expect(runtimeConfig.modelConfig.temp).toBe(0.5);
781
+ expect(runtimeConfig.runConfig.max_time_minutes).toBe(5);
782
+ // No default values are provided anymore
783
+ expect(Object.keys(runtimeConfig.modelConfig)).toEqual([
784
+ 'model',
785
+ 'temp',
786
+ ]);
787
+ expect(Object.keys(runtimeConfig.runConfig)).toEqual([
788
+ 'max_time_minutes',
789
+ ]);
790
+ });
791
+ });
792
+ describe('mergeConfigurations', () => {
793
+ it('should merge basic properties', () => {
794
+ const updates = {
795
+ description: 'Updated description',
796
+ systemPrompt: 'Updated prompt',
797
+ };
798
+ const merged = manager.mergeConfigurations(validConfig, updates);
799
+ expect(merged.description).toBe('Updated description');
800
+ expect(merged.systemPrompt).toBe('Updated prompt');
801
+ expect(merged.name).toBe(validConfig.name); // Should keep original
802
+ });
803
+ it('should merge nested configurations', () => {
804
+ const configWithNested = {
805
+ ...validConfig,
806
+ modelConfig: { model: 'original-model', temp: 0.7 },
807
+ runConfig: { max_time_minutes: 10, max_turns: 20 },
808
+ };
809
+ const updates = {
810
+ modelConfig: { temp: 0.5 },
811
+ runConfig: { max_time_minutes: 5 },
812
+ };
813
+ const merged = manager.mergeConfigurations(configWithNested, updates);
814
+ expect(merged.modelConfig.model).toBe('original-model'); // Should keep original
815
+ expect(merged.modelConfig.temp).toBe(0.5); // Should update
816
+ expect(merged.runConfig.max_time_minutes).toBe(5); // Should update
817
+ expect(merged.runConfig.max_turns).toBe(20); // Should keep original
818
+ });
819
+ });
820
+ });
821
+ });
822
+ //# sourceMappingURL=subagent-manager.test.js.map