task-o-matic-core 0.1.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 (447) hide show
  1. package/README.md +646 -0
  2. package/dist/index.d.ts +27 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +46 -0
  5. package/dist/lib/ai-service/ai-operations.d.ts +45 -0
  6. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -0
  7. package/dist/lib/ai-service/ai-operations.js +60 -0
  8. package/dist/lib/ai-service/base-operations.d.ts +43 -0
  9. package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
  10. package/dist/lib/ai-service/base-operations.js +119 -0
  11. package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
  12. package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
  13. package/dist/lib/ai-service/documentation-operations.js +308 -0
  14. package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
  15. package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
  16. package/dist/lib/ai-service/filesystem-tools.js +70 -0
  17. package/dist/lib/ai-service/json-parser.d.ts +34 -0
  18. package/dist/lib/ai-service/json-parser.d.ts.map +1 -0
  19. package/dist/lib/ai-service/json-parser.js +177 -0
  20. package/dist/lib/ai-service/mcp-client.d.ts +9 -0
  21. package/dist/lib/ai-service/mcp-client.d.ts.map +1 -0
  22. package/dist/lib/ai-service/mcp-client.js +48 -0
  23. package/dist/lib/ai-service/model-provider.d.ts +12 -0
  24. package/dist/lib/ai-service/model-provider.d.ts.map +1 -0
  25. package/dist/lib/ai-service/model-provider.js +146 -0
  26. package/dist/lib/ai-service/prd-operations.d.ts +25 -0
  27. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
  28. package/dist/lib/ai-service/prd-operations.js +592 -0
  29. package/dist/lib/ai-service/research-tools.d.ts +4 -0
  30. package/dist/lib/ai-service/research-tools.d.ts.map +1 -0
  31. package/dist/lib/ai-service/research-tools.js +8 -0
  32. package/dist/lib/ai-service/retry-handler.d.ts +8 -0
  33. package/dist/lib/ai-service/retry-handler.d.ts.map +1 -0
  34. package/dist/lib/ai-service/retry-handler.js +63 -0
  35. package/dist/lib/ai-service/task-operations.d.ts +13 -0
  36. package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
  37. package/dist/lib/ai-service/task-operations.js +220 -0
  38. package/dist/lib/benchmark/registry.d.ts +11 -0
  39. package/dist/lib/benchmark/registry.d.ts.map +1 -0
  40. package/dist/lib/benchmark/registry.js +212 -0
  41. package/dist/lib/benchmark/runner.d.ts +6 -0
  42. package/dist/lib/benchmark/runner.d.ts.map +1 -0
  43. package/dist/lib/benchmark/runner.js +150 -0
  44. package/dist/lib/benchmark/storage.d.ts +13 -0
  45. package/dist/lib/benchmark/storage.d.ts.map +1 -0
  46. package/dist/lib/benchmark/storage.js +100 -0
  47. package/dist/lib/benchmark/types.d.ts +104 -0
  48. package/dist/lib/benchmark/types.d.ts.map +1 -0
  49. package/dist/lib/benchmark/types.js +2 -0
  50. package/dist/lib/better-t-stack-cli.d.ts +50 -0
  51. package/dist/lib/better-t-stack-cli.d.ts.map +1 -0
  52. package/dist/lib/better-t-stack-cli.js +428 -0
  53. package/dist/lib/bootstrap/cli-bootstrap.d.ts +14 -0
  54. package/dist/lib/bootstrap/cli-bootstrap.d.ts.map +1 -0
  55. package/dist/lib/bootstrap/cli-bootstrap.js +322 -0
  56. package/dist/lib/bootstrap/index.d.ts +3 -0
  57. package/dist/lib/bootstrap/index.d.ts.map +1 -0
  58. package/dist/lib/bootstrap/index.js +18 -0
  59. package/dist/lib/bootstrap/medusa-bootstrap.d.ts +14 -0
  60. package/dist/lib/bootstrap/medusa-bootstrap.d.ts.map +1 -0
  61. package/dist/lib/bootstrap/medusa-bootstrap.js +215 -0
  62. package/dist/lib/config-validation.d.ts +215 -0
  63. package/dist/lib/config-validation.d.ts.map +1 -0
  64. package/dist/lib/config-validation.js +254 -0
  65. package/dist/lib/config.d.ts +55 -0
  66. package/dist/lib/config.d.ts.map +1 -0
  67. package/dist/lib/config.js +351 -0
  68. package/dist/lib/context-builder.d.ts +66 -0
  69. package/dist/lib/context-builder.d.ts.map +1 -0
  70. package/dist/lib/context-builder.js +322 -0
  71. package/dist/lib/executors/claude-code-executor.d.ts +9 -0
  72. package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
  73. package/dist/lib/executors/claude-code-executor.js +69 -0
  74. package/dist/lib/executors/codex-executor.d.ts +9 -0
  75. package/dist/lib/executors/codex-executor.d.ts.map +1 -0
  76. package/dist/lib/executors/codex-executor.js +73 -0
  77. package/dist/lib/executors/executor-factory.d.ts +5 -0
  78. package/dist/lib/executors/executor-factory.d.ts.map +1 -0
  79. package/dist/lib/executors/executor-factory.js +27 -0
  80. package/dist/lib/executors/gemini-executor.d.ts +9 -0
  81. package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
  82. package/dist/lib/executors/gemini-executor.js +67 -0
  83. package/dist/lib/executors/kilo-executor.d.ts +9 -0
  84. package/dist/lib/executors/kilo-executor.d.ts.map +1 -0
  85. package/dist/lib/executors/kilo-executor.js +69 -0
  86. package/dist/lib/executors/opencode-executor.d.ts +9 -0
  87. package/dist/lib/executors/opencode-executor.d.ts.map +1 -0
  88. package/dist/lib/executors/opencode-executor.js +67 -0
  89. package/dist/lib/git-utils.d.ts +88 -0
  90. package/dist/lib/git-utils.d.ts.map +1 -0
  91. package/dist/lib/git-utils.js +242 -0
  92. package/dist/lib/hooks.d.ts +73 -0
  93. package/dist/lib/hooks.d.ts.map +1 -0
  94. package/dist/lib/hooks.js +62 -0
  95. package/dist/lib/index.d.ts +100 -0
  96. package/dist/lib/index.d.ts.map +1 -0
  97. package/dist/lib/index.js +143 -0
  98. package/dist/lib/logger.d.ts +20 -0
  99. package/dist/lib/logger.d.ts.map +1 -0
  100. package/dist/lib/logger.js +32 -0
  101. package/dist/lib/notifications.d.ts +7 -0
  102. package/dist/lib/notifications.d.ts.map +1 -0
  103. package/dist/lib/notifications.js +81 -0
  104. package/dist/lib/prompt-builder.d.ts +70 -0
  105. package/dist/lib/prompt-builder.d.ts.map +1 -0
  106. package/dist/lib/prompt-builder.js +344 -0
  107. package/dist/lib/prompt-registry.d.ts +22 -0
  108. package/dist/lib/prompt-registry.d.ts.map +1 -0
  109. package/dist/lib/prompt-registry.js +409 -0
  110. package/dist/lib/provider-defaults.json +32 -0
  111. package/dist/lib/storage/file-system.d.ts +57 -0
  112. package/dist/lib/storage/file-system.d.ts.map +1 -0
  113. package/dist/lib/storage/file-system.js +638 -0
  114. package/dist/lib/storage/storage-callbacks.d.ts +17 -0
  115. package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
  116. package/dist/lib/storage/storage-callbacks.js +94 -0
  117. package/dist/lib/storage/types.d.ts +43 -0
  118. package/dist/lib/storage/types.d.ts.map +1 -0
  119. package/dist/lib/storage/types.js +2 -0
  120. package/dist/lib/task-execution-core.d.ts +7 -0
  121. package/dist/lib/task-execution-core.d.ts.map +1 -0
  122. package/dist/lib/task-execution-core.js +381 -0
  123. package/dist/lib/task-execution.d.ts +7 -0
  124. package/dist/lib/task-execution.d.ts.map +1 -0
  125. package/dist/lib/task-execution.js +40 -0
  126. package/dist/lib/task-loop-execution.d.ts +7 -0
  127. package/dist/lib/task-loop-execution.d.ts.map +1 -0
  128. package/dist/lib/task-loop-execution.js +156 -0
  129. package/dist/lib/task-planning.d.ts +29 -0
  130. package/dist/lib/task-planning.d.ts.map +1 -0
  131. package/dist/lib/task-planning.js +103 -0
  132. package/dist/lib/task-review.d.ts +27 -0
  133. package/dist/lib/task-review.d.ts.map +1 -0
  134. package/dist/lib/task-review.js +103 -0
  135. package/dist/lib/validation.d.ts +26 -0
  136. package/dist/lib/validation.d.ts.map +1 -0
  137. package/dist/lib/validation.js +98 -0
  138. package/dist/prompts/documentation-detection.d.ts +2 -0
  139. package/dist/prompts/documentation-detection.d.ts.map +1 -0
  140. package/dist/prompts/documentation-detection.js +24 -0
  141. package/dist/prompts/documentation-recap.d.ts +3 -0
  142. package/dist/prompts/documentation-recap.d.ts.map +1 -0
  143. package/dist/prompts/documentation-recap.js +13 -0
  144. package/dist/prompts/index.d.ts +15 -0
  145. package/dist/prompts/index.d.ts.map +1 -0
  146. package/dist/prompts/index.js +30 -0
  147. package/dist/prompts/prd-combination.d.ts +2 -0
  148. package/dist/prompts/prd-combination.d.ts.map +1 -0
  149. package/dist/prompts/prd-combination.js +35 -0
  150. package/dist/prompts/prd-generation.d.ts +2 -0
  151. package/dist/prompts/prd-generation.d.ts.map +1 -0
  152. package/dist/prompts/prd-generation.js +49 -0
  153. package/dist/prompts/prd-parsing.d.ts +3 -0
  154. package/dist/prompts/prd-parsing.d.ts.map +1 -0
  155. package/dist/prompts/prd-parsing.js +172 -0
  156. package/dist/prompts/prd-question-answer.d.ts +3 -0
  157. package/dist/prompts/prd-question-answer.d.ts.map +1 -0
  158. package/dist/prompts/prd-question-answer.js +27 -0
  159. package/dist/prompts/prd-question.d.ts +3 -0
  160. package/dist/prompts/prd-question.d.ts.map +1 -0
  161. package/dist/prompts/prd-question.js +40 -0
  162. package/dist/prompts/prd-rework.d.ts +3 -0
  163. package/dist/prompts/prd-rework.d.ts.map +1 -0
  164. package/dist/prompts/prd-rework.js +81 -0
  165. package/dist/prompts/prd-suggest-stack.d.ts +3 -0
  166. package/dist/prompts/prd-suggest-stack.d.ts.map +1 -0
  167. package/dist/prompts/prd-suggest-stack.js +99 -0
  168. package/dist/prompts/task-breakdown.d.ts +3 -0
  169. package/dist/prompts/task-breakdown.d.ts.map +1 -0
  170. package/dist/prompts/task-breakdown.js +151 -0
  171. package/dist/prompts/task-enhancement.d.ts +3 -0
  172. package/dist/prompts/task-enhancement.d.ts.map +1 -0
  173. package/dist/prompts/task-enhancement.js +140 -0
  174. package/dist/prompts/task-execution.d.ts +3 -0
  175. package/dist/prompts/task-execution.d.ts.map +1 -0
  176. package/dist/prompts/task-execution.js +24 -0
  177. package/dist/prompts/task-planning.d.ts +3 -0
  178. package/dist/prompts/task-planning.d.ts.map +1 -0
  179. package/dist/prompts/task-planning.js +66 -0
  180. package/dist/prompts/workflow-assistance.d.ts +32 -0
  181. package/dist/prompts/workflow-assistance.d.ts.map +1 -0
  182. package/dist/prompts/workflow-assistance.js +130 -0
  183. package/dist/prompts/workflow-prompts.d.ts +9 -0
  184. package/dist/prompts/workflow-prompts.d.ts.map +1 -0
  185. package/dist/prompts/workflow-prompts.js +93 -0
  186. package/dist/services/benchmark.d.ts +26 -0
  187. package/dist/services/benchmark.d.ts.map +1 -0
  188. package/dist/services/benchmark.js +343 -0
  189. package/dist/services/prd.d.ts +136 -0
  190. package/dist/services/prd.d.ts.map +1 -0
  191. package/dist/services/prd.js +550 -0
  192. package/dist/services/tasks.d.ts +388 -0
  193. package/dist/services/tasks.d.ts.map +1 -0
  194. package/dist/services/tasks.js +1150 -0
  195. package/dist/services/workflow-ai-assistant.d.ts +74 -0
  196. package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
  197. package/dist/services/workflow-ai-assistant.js +175 -0
  198. package/dist/services/workflow-benchmark.d.ts +34 -0
  199. package/dist/services/workflow-benchmark.d.ts.map +1 -0
  200. package/dist/services/workflow-benchmark.js +318 -0
  201. package/dist/services/workflow.d.ts +107 -0
  202. package/dist/services/workflow.d.ts.map +1 -0
  203. package/dist/services/workflow.js +580 -0
  204. package/dist/test/hooks.test.d.ts +2 -0
  205. package/dist/test/hooks.test.d.ts.map +1 -0
  206. package/dist/test/hooks.test.js +67 -0
  207. package/dist/test/integration/callbacks.test.d.ts +2 -0
  208. package/dist/test/integration/callbacks.test.d.ts.map +1 -0
  209. package/dist/test/integration/callbacks.test.js +64 -0
  210. package/dist/test/lib/ai-service/task-operations.test.d.ts +2 -0
  211. package/dist/test/lib/ai-service/task-operations.test.d.ts.map +1 -0
  212. package/dist/test/lib/ai-service/task-operations.test.js +362 -0
  213. package/dist/test/lib/config.test.d.ts +2 -0
  214. package/dist/test/lib/config.test.d.ts.map +1 -0
  215. package/dist/test/lib/config.test.js +128 -0
  216. package/dist/test/lib/git-utils.test.d.ts +2 -0
  217. package/dist/test/lib/git-utils.test.d.ts.map +1 -0
  218. package/dist/test/lib/git-utils.test.js +168 -0
  219. package/dist/test/mocks/mock-ai-operations.d.ts +15 -0
  220. package/dist/test/mocks/mock-ai-operations.d.ts.map +1 -0
  221. package/dist/test/mocks/mock-ai-operations.js +107 -0
  222. package/dist/test/mocks/mock-context-builder.d.ts +10 -0
  223. package/dist/test/mocks/mock-context-builder.d.ts.map +1 -0
  224. package/dist/test/mocks/mock-context-builder.js +81 -0
  225. package/dist/test/mocks/mock-model-provider.d.ts +7 -0
  226. package/dist/test/mocks/mock-model-provider.d.ts.map +1 -0
  227. package/dist/test/mocks/mock-model-provider.js +21 -0
  228. package/dist/test/mocks/mock-service-factory.d.ts +11 -0
  229. package/dist/test/mocks/mock-service-factory.d.ts.map +1 -0
  230. package/dist/test/mocks/mock-service-factory.js +61 -0
  231. package/dist/test/mocks/mock-storage.d.ts +50 -0
  232. package/dist/test/mocks/mock-storage.d.ts.map +1 -0
  233. package/dist/test/mocks/mock-storage.js +145 -0
  234. package/dist/test/model-parsing.test.d.ts +2 -0
  235. package/dist/test/model-parsing.test.d.ts.map +1 -0
  236. package/dist/test/model-parsing.test.js +73 -0
  237. package/dist/test/services/task-service.test.d.ts +2 -0
  238. package/dist/test/services/task-service.test.d.ts.map +1 -0
  239. package/dist/test/services/task-service.test.js +459 -0
  240. package/dist/test/storage.test.d.ts +2 -0
  241. package/dist/test/storage.test.d.ts.map +1 -0
  242. package/dist/test/storage.test.js +207 -0
  243. package/dist/test/task-loop-git.test.d.ts +2 -0
  244. package/dist/test/task-loop-git.test.d.ts.map +1 -0
  245. package/dist/test/task-loop-git.test.js +95 -0
  246. package/dist/test/test-mock-setup.d.ts +26 -0
  247. package/dist/test/test-mock-setup.d.ts.map +1 -0
  248. package/dist/test/test-mock-setup.js +41 -0
  249. package/dist/test/test-setup.d.ts +9 -0
  250. package/dist/test/test-setup.d.ts.map +1 -0
  251. package/dist/test/test-setup.js +44 -0
  252. package/dist/test/test-utils.d.ts +22 -0
  253. package/dist/test/test-utils.d.ts.map +1 -0
  254. package/dist/test/test-utils.js +37 -0
  255. package/dist/test/utils/ai-operation-utility.test.d.ts +2 -0
  256. package/dist/test/utils/ai-operation-utility.test.d.ts.map +1 -0
  257. package/dist/test/utils/ai-operation-utility.test.js +290 -0
  258. package/dist/test/utils/error-handling.test.d.ts +2 -0
  259. package/dist/test/utils/error-handling.test.d.ts.map +1 -0
  260. package/dist/test/utils/error-handling.test.js +231 -0
  261. package/dist/test/utils/file-utils.test.d.ts +2 -0
  262. package/dist/test/utils/file-utils.test.d.ts.map +1 -0
  263. package/dist/test/utils/file-utils.test.js +76 -0
  264. package/dist/test/utils/id-generator.test.d.ts +2 -0
  265. package/dist/test/utils/id-generator.test.d.ts.map +1 -0
  266. package/dist/test/utils/id-generator.test.js +41 -0
  267. package/dist/test/utils/model-parser.test.d.ts +2 -0
  268. package/dist/test/utils/model-parser.test.d.ts.map +1 -0
  269. package/dist/test/utils/model-parser.test.js +65 -0
  270. package/dist/test/validation.test.d.ts +2 -0
  271. package/dist/test/validation.test.d.ts.map +1 -0
  272. package/dist/test/validation.test.js +22 -0
  273. package/dist/types/callbacks.d.ts +30 -0
  274. package/dist/types/callbacks.d.ts.map +1 -0
  275. package/dist/types/callbacks.js +2 -0
  276. package/dist/types/index.d.ts +435 -0
  277. package/dist/types/index.d.ts.map +1 -0
  278. package/dist/types/index.js +30 -0
  279. package/dist/types/mcp.d.ts +3 -0
  280. package/dist/types/mcp.d.ts.map +1 -0
  281. package/dist/types/mcp.js +3 -0
  282. package/dist/types/options.d.ts +112 -0
  283. package/dist/types/options.d.ts.map +1 -0
  284. package/dist/types/options.js +2 -0
  285. package/dist/types/results.d.ts +200 -0
  286. package/dist/types/results.d.ts.map +1 -0
  287. package/dist/types/results.js +2 -0
  288. package/dist/types/workflow-options.d.ts +82 -0
  289. package/dist/types/workflow-options.d.ts.map +1 -0
  290. package/dist/types/workflow-options.js +2 -0
  291. package/dist/types/workflow-results.d.ts +82 -0
  292. package/dist/types/workflow-results.d.ts.map +1 -0
  293. package/dist/types/workflow-results.js +2 -0
  294. package/dist/utils/ai-config-builder.d.ts +14 -0
  295. package/dist/utils/ai-config-builder.d.ts.map +1 -0
  296. package/dist/utils/ai-config-builder.js +22 -0
  297. package/dist/utils/ai-operation-utility.d.ts +142 -0
  298. package/dist/utils/ai-operation-utility.d.ts.map +1 -0
  299. package/dist/utils/ai-operation-utility.js +303 -0
  300. package/dist/utils/ai-service-factory.d.ts +34 -0
  301. package/dist/utils/ai-service-factory.d.ts.map +1 -0
  302. package/dist/utils/ai-service-factory.js +99 -0
  303. package/dist/utils/error-utils.d.ts +70 -0
  304. package/dist/utils/error-utils.d.ts.map +1 -0
  305. package/dist/utils/error-utils.js +104 -0
  306. package/dist/utils/file-utils.d.ts +107 -0
  307. package/dist/utils/file-utils.d.ts.map +1 -0
  308. package/dist/utils/file-utils.js +171 -0
  309. package/dist/utils/id-generator.d.ts +92 -0
  310. package/dist/utils/id-generator.d.ts.map +1 -0
  311. package/dist/utils/id-generator.js +146 -0
  312. package/dist/utils/metadata-utils.d.ts +40 -0
  313. package/dist/utils/metadata-utils.d.ts.map +1 -0
  314. package/dist/utils/metadata-utils.js +43 -0
  315. package/dist/utils/model-executor-parser.d.ts +38 -0
  316. package/dist/utils/model-executor-parser.d.ts.map +1 -0
  317. package/dist/utils/model-executor-parser.js +69 -0
  318. package/dist/utils/model-parser.d.ts +6 -0
  319. package/dist/utils/model-parser.d.ts.map +1 -0
  320. package/dist/utils/model-parser.js +49 -0
  321. package/dist/utils/stack-formatter.d.ts +12 -0
  322. package/dist/utils/stack-formatter.d.ts.map +1 -0
  323. package/dist/utils/stack-formatter.js +36 -0
  324. package/dist/utils/storage-utils.d.ts +49 -0
  325. package/dist/utils/storage-utils.d.ts.map +1 -0
  326. package/dist/utils/storage-utils.js +80 -0
  327. package/dist/utils/streaming-utils.d.ts +38 -0
  328. package/dist/utils/streaming-utils.d.ts.map +1 -0
  329. package/dist/utils/streaming-utils.js +64 -0
  330. package/dist/utils/task-o-matic-error.d.ts +206 -0
  331. package/dist/utils/task-o-matic-error.d.ts.map +1 -0
  332. package/dist/utils/task-o-matic-error.js +304 -0
  333. package/package.json +40 -0
  334. package/src/index.ts +36 -0
  335. package/src/lib/ai-service/ai-operations.ts +310 -0
  336. package/src/lib/ai-service/base-operations.ts +139 -0
  337. package/src/lib/ai-service/documentation-operations.ts +438 -0
  338. package/src/lib/ai-service/filesystem-tools.ts +73 -0
  339. package/src/lib/ai-service/gemini-proxy.ts.bak +52 -0
  340. package/src/lib/ai-service/json-parser.ts +203 -0
  341. package/src/lib/ai-service/mcp-client.ts +54 -0
  342. package/src/lib/ai-service/model-provider.ts +192 -0
  343. package/src/lib/ai-service/prd-operations.ts +854 -0
  344. package/src/lib/ai-service/research-tools.ts +207 -0
  345. package/src/lib/ai-service/retry-handler.ts +89 -0
  346. package/src/lib/ai-service/task-operations.ts +342 -0
  347. package/src/lib/benchmark/registry.ts +307 -0
  348. package/src/lib/benchmark/runner.ts +190 -0
  349. package/src/lib/benchmark/storage.ts +140 -0
  350. package/src/lib/benchmark/types.ts +121 -0
  351. package/src/lib/better-t-stack-cli.ts +524 -0
  352. package/src/lib/bootstrap/cli-bootstrap.ts +397 -0
  353. package/src/lib/bootstrap/index.ts +2 -0
  354. package/src/lib/bootstrap/medusa-bootstrap.ts +261 -0
  355. package/src/lib/config-validation.ts +278 -0
  356. package/src/lib/config.ts +435 -0
  357. package/src/lib/context-builder.ts +383 -0
  358. package/src/lib/executors/claude-code-executor.ts +83 -0
  359. package/src/lib/executors/codex-executor.ts +85 -0
  360. package/src/lib/executors/executor-factory.ts +28 -0
  361. package/src/lib/executors/gemini-executor.ts +80 -0
  362. package/src/lib/executors/kilo-executor.ts +83 -0
  363. package/src/lib/executors/opencode-executor.ts +81 -0
  364. package/src/lib/git-utils.ts +334 -0
  365. package/src/lib/hooks.ts +121 -0
  366. package/src/lib/index.ts +166 -0
  367. package/src/lib/logger.ts +43 -0
  368. package/src/lib/notifications.ts +103 -0
  369. package/src/lib/prompt-builder.ts +471 -0
  370. package/src/lib/prompt-registry.ts +491 -0
  371. package/src/lib/provider-defaults.json +32 -0
  372. package/src/lib/storage/file-system.ts +864 -0
  373. package/src/lib/storage/storage-callbacks.ts +120 -0
  374. package/src/lib/storage/types.ts +58 -0
  375. package/src/lib/task-execution-core.ts +591 -0
  376. package/src/lib/task-execution.ts +59 -0
  377. package/src/lib/task-loop-execution.ts +214 -0
  378. package/src/lib/task-planning.ts +157 -0
  379. package/src/lib/task-review.ts +138 -0
  380. package/src/lib/validation.ts +140 -0
  381. package/src/prompts/documentation-detection.ts +21 -0
  382. package/src/prompts/documentation-recap.ts +11 -0
  383. package/src/prompts/index.ts +14 -0
  384. package/src/prompts/prd-combination.ts +32 -0
  385. package/src/prompts/prd-generation.ts +46 -0
  386. package/src/prompts/prd-parsing.ts +170 -0
  387. package/src/prompts/prd-question-answer.ts +25 -0
  388. package/src/prompts/prd-question.ts +38 -0
  389. package/src/prompts/prd-rework.ts +79 -0
  390. package/src/prompts/prd-suggest-stack.ts +97 -0
  391. package/src/prompts/task-breakdown.ts +149 -0
  392. package/src/prompts/task-enhancement.ts +138 -0
  393. package/src/prompts/task-execution.ts +22 -0
  394. package/src/prompts/task-planning.ts +64 -0
  395. package/src/prompts/workflow-assistance.ts +151 -0
  396. package/src/prompts/workflow-prompts.ts +97 -0
  397. package/src/services/benchmark.ts +433 -0
  398. package/src/services/prd.ts +845 -0
  399. package/src/services/tasks.ts +1515 -0
  400. package/src/services/workflow-ai-assistant.ts +298 -0
  401. package/src/services/workflow-benchmark.ts +339 -0
  402. package/src/services/workflow.ts +779 -0
  403. package/src/test/hooks.test.ts +77 -0
  404. package/src/test/integration/callbacks.test.ts +39 -0
  405. package/src/test/lib/ai-service/task-operations.test.ts +430 -0
  406. package/src/test/lib/config.test.ts +150 -0
  407. package/src/test/lib/git-utils.test.ts +198 -0
  408. package/src/test/mocks/mock-ai-operations.ts +205 -0
  409. package/src/test/mocks/mock-context-builder.ts +84 -0
  410. package/src/test/mocks/mock-model-provider.ts +21 -0
  411. package/src/test/mocks/mock-service-factory.ts +64 -0
  412. package/src/test/mocks/mock-storage.ts +204 -0
  413. package/src/test/model-parsing.test.ts +78 -0
  414. package/src/test/services/task-service.test.ts +551 -0
  415. package/src/test/storage.test.ts +206 -0
  416. package/src/test/task-loop-git.test.ts +142 -0
  417. package/src/test/test-mock-setup.ts +46 -0
  418. package/src/test/test-setup.ts +48 -0
  419. package/src/test/test-utils.ts +45 -0
  420. package/src/test/utils/ai-operation-utility.test.ts +306 -0
  421. package/src/test/utils/error-handling.test.ts +241 -0
  422. package/src/test/utils/file-utils.test.ts +80 -0
  423. package/src/test/utils/id-generator.test.ts +44 -0
  424. package/src/test/utils/model-parser.test.ts +67 -0
  425. package/src/test/validation.test.ts +19 -0
  426. package/src/types/callbacks.ts +14 -0
  427. package/src/types/index.ts +628 -0
  428. package/src/types/mcp.ts +5 -0
  429. package/src/types/options.ts +165 -0
  430. package/src/types/results.ts +216 -0
  431. package/src/types/workflow-options.ts +113 -0
  432. package/src/types/workflow-results.ts +87 -0
  433. package/src/utils/ai-config-builder.ts +33 -0
  434. package/src/utils/ai-operation-utility.ts +380 -0
  435. package/src/utils/ai-service-factory.ts +125 -0
  436. package/src/utils/error-utils.ts +124 -0
  437. package/src/utils/file-utils.ts +197 -0
  438. package/src/utils/id-generator.ts +168 -0
  439. package/src/utils/metadata-utils.ts +48 -0
  440. package/src/utils/model-executor-parser.ts +80 -0
  441. package/src/utils/model-parser.ts +58 -0
  442. package/src/utils/stack-formatter.ts +53 -0
  443. package/src/utils/storage-utils.ts +94 -0
  444. package/src/utils/streaming-utils.ts +91 -0
  445. package/src/utils/task-o-matic-error.ts +393 -0
  446. package/tsconfig.json +20 -0
  447. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DocumentationOperations = void 0;
4
+ const ai_1 = require("ai");
5
+ const prompt_builder_1 = require("../prompt-builder");
6
+ const prompts_1 = require("../../prompts");
7
+ const ai_service_factory_1 = require("../../utils/ai-service-factory");
8
+ const filesystem_tools_1 = require("./filesystem-tools");
9
+ const base_operations_1 = require("./base-operations");
10
+ const logger_1 = require("../logger");
11
+ class DocumentationOperations extends base_operations_1.BaseOperations {
12
+ async enhanceTaskWithDocumentation(taskId, taskTitle, taskDescription, stackInfo, streamingOptions, retryConfig, config, existingResearch, enableFilesystemTools) {
13
+ return this.retryHandler
14
+ .executeWithRetry(async () => {
15
+ const mcpTools = await this.context7Client.getMCPTools();
16
+ const defaultAIConfig = this.modelProvider.getAIConfig();
17
+ const aiConfig = config
18
+ ? { ...defaultAIConfig, ...config }
19
+ : defaultAIConfig;
20
+ const model = this.modelProvider.getModel(aiConfig);
21
+ const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
22
+ const builtContext = await contextBuilder.buildContext("1.1");
23
+ const existingResearchContext = existingResearch
24
+ ? Object.entries(existingResearch)
25
+ .map(([lib, entries]) => `### ${lib}\n${entries
26
+ .map((e) => `- Query: "${e.query}"`)
27
+ .join("\n")}`)
28
+ .join("\n\n")
29
+ : "No existing research available.";
30
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
31
+ name: "task-enhancement",
32
+ type: "user",
33
+ variables: {
34
+ TASK_TITLE: taskTitle,
35
+ TASK_DESCRIPTION: taskDescription,
36
+ CONTEXT_INFO: `Technology stack: ${stackInfo || "Not specified"}`,
37
+ EXISTING_RESEARCH: existingResearchContext,
38
+ PRD_CONTENT: builtContext.prdContent || "No PRD content available",
39
+ },
40
+ });
41
+ if (!promptResult.success) {
42
+ throw new Error(`Failed to build task enhancement prompt: ${promptResult.error}`);
43
+ }
44
+ const prompt = promptResult.prompt;
45
+ const allTools = {
46
+ ...mcpTools,
47
+ ...(enableFilesystemTools ? filesystem_tools_1.filesystemTools : {}),
48
+ };
49
+ const result = await (0, ai_1.streamText)({
50
+ model,
51
+ tools: allTools,
52
+ system: prompts_1.TASK_ENHANCEMENT_SYSTEM_PROMPT +
53
+ `
54
+
55
+ You have access to Context7 documentation tools${enableFilesystemTools ? " and filesystem tools" : ""}.
56
+
57
+ ## Available Tools:
58
+ - Context7 MCP tools (context7_resolve_library_id, context7_get_library_docs) for library documentation
59
+ ${enableFilesystemTools
60
+ ? `- readFile: Read the contents of any file in the project
61
+ - listDirectory: List contents of directories`
62
+ : ""}
63
+
64
+ ## Research Strategy:
65
+ 1. Use Context7 MCP tools for library documentation research
66
+ ${enableFilesystemTools
67
+ ? `2. Use filesystem tools to understand project structure, existing code, and dependencies`
68
+ : ""}
69
+ ${enableFilesystemTools ? "3" : "2"}. Synthesize information from all sources to enhance the task
70
+
71
+ Technology stack context: ${stackInfo || "Not specified"}
72
+
73
+ ## Available Cached Research:
74
+ ${existingResearchContext}`,
75
+ messages: [
76
+ {
77
+ role: "user",
78
+ content: prompt,
79
+ },
80
+ ],
81
+ maxRetries: 0,
82
+ stopWhen: (0, ai_1.stepCountIs)(8),
83
+ onError: ({ error }) => {
84
+ streamingOptions?.onError?.(error);
85
+ throw error;
86
+ },
87
+ onChunk: streamingOptions?.onChunk
88
+ ? ({ chunk }) => {
89
+ if (chunk.type === "text-delta") {
90
+ streamingOptions.onChunk(chunk.text);
91
+ }
92
+ else if (chunk.type === "reasoning-delta") {
93
+ streamingOptions.onReasoning?.(chunk.text);
94
+ }
95
+ }
96
+ : undefined,
97
+ onFinish: streamingOptions?.onFinish
98
+ ? ({ text, finishReason, usage }) => {
99
+ streamingOptions.onFinish({
100
+ text,
101
+ finishReason,
102
+ usage,
103
+ isAborted: false,
104
+ });
105
+ }
106
+ : undefined,
107
+ });
108
+ const toolCalls = await result.toolCalls;
109
+ const toolResults = await result.toolResults;
110
+ if (toolCalls.length > 0) {
111
+ logger_1.logger.info(`AI made tool calls: ${JSON.stringify(toolCalls.map((tc) => ({ tool: tc?.toolName, input: tc?.input })))}`);
112
+ }
113
+ if (toolResults.length > 0) {
114
+ logger_1.logger.info(`Tool results received: ${JSON.stringify(toolResults.map((tr) => ({
115
+ tool: tr?.toolName,
116
+ output: tr?.output,
117
+ })))}`);
118
+ }
119
+ let fullText = "";
120
+ for await (const textPart of result.textStream) {
121
+ fullText += textPart;
122
+ if (streamingOptions?.onChunk) {
123
+ streamingOptions.onChunk(textPart);
124
+ }
125
+ }
126
+ return fullText;
127
+ }, retryConfig, "Task enhancement with documentation")
128
+ .finally(async () => {
129
+ await this.context7Client.closeMCPConnection();
130
+ });
131
+ }
132
+ async analyzeDocumentationNeeds(taskId, taskTitle, taskDescription, stackInfo, streamingOptions, retryConfig, config, existingResearch, enableFilesystemTools) {
133
+ // @ts-expect-error tool result type discrepency i cant be bothered with (that will probably bite me later...)
134
+ return this.retryHandler
135
+ .executeWithRetry(async () => {
136
+ const mcpTools = await this.context7Client.getMCPTools();
137
+ const defaultAIConfig = this.modelProvider.getAIConfig();
138
+ const aiConfig = config
139
+ ? { ...defaultAIConfig, ...config }
140
+ : defaultAIConfig;
141
+ const model = this.modelProvider.getModel(aiConfig);
142
+ const existingResearchContext = existingResearch
143
+ ? "## Existing research\n" +
144
+ existingResearch
145
+ .map((rs) => rs &&
146
+ `${rs.recap}\n#### librairies\n${rs.libraries.join(`- \n`)}\n\n#### files:\n${rs.libraries.join(`- \n`)}`)
147
+ .join("\n\n")
148
+ : "No existing research available.";
149
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
150
+ name: "documentation-detection",
151
+ type: "user",
152
+ variables: {
153
+ TASK_TITLE: taskTitle,
154
+ TASK_DESCRIPTION: taskDescription,
155
+ STACK_INFO: stackInfo || "Not specified",
156
+ EXISTING_RESEARCH: existingResearchContext,
157
+ },
158
+ });
159
+ if (!promptResult.success) {
160
+ throw new Error(`Failed to build documentation detection prompt: ${promptResult.error}`);
161
+ }
162
+ const prompt = promptResult.prompt;
163
+ const libraries = [];
164
+ const files = [];
165
+ const allTools = {
166
+ ...mcpTools,
167
+ ...(enableFilesystemTools ? filesystem_tools_1.filesystemTools : {}),
168
+ };
169
+ const result = await (0, ai_1.streamText)({
170
+ model,
171
+ tools: allTools,
172
+ system: `You are an expert developer.\nYou have access to Context7 MCP tools for documentation research.\nFetch documentation relevant to the task in the project context and create a document giving that knowledge to the AI assistant that will implement the task.`,
173
+ messages: [{ role: "user", content: prompt }],
174
+ maxRetries: 0,
175
+ stopWhen: (0, ai_1.stepCountIs)(8),
176
+ onError: ({ error }) => {
177
+ streamingOptions?.onError?.(error);
178
+ throw error;
179
+ },
180
+ onChunk: streamingOptions?.onChunk
181
+ ? ({ chunk }) => {
182
+ if (chunk.type === "text-delta") {
183
+ streamingOptions.onChunk(chunk.text);
184
+ }
185
+ else if (chunk.type === "reasoning-delta") {
186
+ streamingOptions.onReasoning?.(chunk.text);
187
+ }
188
+ else if (chunk.type === "tool-result") {
189
+ if (chunk.toolName === "get-library-docs" && chunk.output) {
190
+ (async () => {
191
+ try {
192
+ const input = chunk.input;
193
+ const libraryId = input.context7CompatibleLibraryID;
194
+ const libraryName = libraryId.split("/").pop() || "unknown";
195
+ const timestamp = Date.now();
196
+ const filename = input.topic ?? `${libraryName}-${timestamp}`;
197
+ let content = "";
198
+ if (chunk.output &&
199
+ typeof chunk.output === "object") {
200
+ if ("content" in chunk.output) {
201
+ const contentArray = chunk.output
202
+ .content;
203
+ if (Array.isArray(contentArray)) {
204
+ content = contentArray
205
+ .map((item) => item.text || "")
206
+ .join("\n");
207
+ }
208
+ else {
209
+ content = String(contentArray);
210
+ }
211
+ }
212
+ else if ("text" in chunk.output) {
213
+ content = chunk.output.text;
214
+ }
215
+ }
216
+ else if (typeof chunk.output === "string") {
217
+ content = chunk.output;
218
+ }
219
+ if (content) {
220
+ const docFile = await this.context7Client.saveContext7Documentation(libraryName, filename, content);
221
+ libraries.push({
222
+ name: libraryName,
223
+ context7Id: libraryId,
224
+ reason: "Documentation fetched for task implementation",
225
+ searchQuery: filename,
226
+ });
227
+ files.push(docFile);
228
+ }
229
+ }
230
+ catch (error) {
231
+ logger_1.logger.error(`Failed to save Context7 documentation: ${error}`);
232
+ }
233
+ })();
234
+ }
235
+ }
236
+ }
237
+ : undefined,
238
+ onFinish: streamingOptions?.onFinish
239
+ ? ({ text, finishReason, usage }) => {
240
+ streamingOptions.onFinish({
241
+ text,
242
+ finishReason,
243
+ usage,
244
+ isAborted: false,
245
+ });
246
+ }
247
+ : undefined,
248
+ });
249
+ let fullText = "";
250
+ for await (const textPart of result.textStream) {
251
+ fullText += textPart;
252
+ }
253
+ const toolResults = await result.toolResults;
254
+ const toolCalls = await result.toolCalls;
255
+ if (fullText.trim()) {
256
+ try {
257
+ const storage = (0, ai_service_factory_1.getStorage)();
258
+ const taskDocFile = await storage.saveTaskDocumentation(taskId, fullText);
259
+ files.push(taskDocFile);
260
+ }
261
+ catch (error) {
262
+ logger_1.logger.error(`Failed to save task documentation: ${error}`);
263
+ }
264
+ }
265
+ return {
266
+ libraries,
267
+ confidence: libraries.length > 0 ? 0.8 : 0.3,
268
+ toolResults: toolResults.map((tr) => ({
269
+ toolName: tr?.toolName,
270
+ output: tr?.output,
271
+ })),
272
+ files,
273
+ };
274
+ }, retryConfig, "Documentation needs analysis")
275
+ .finally(async () => {
276
+ await this.context7Client.closeMCPConnection();
277
+ });
278
+ }
279
+ async generateDocumentationRecap(libraries, documentContents, streamingOptions, retryConfig) {
280
+ // Build variables for PromptBuilder
281
+ const librariesList = libraries
282
+ .map((lib) => `- ${lib.name} (${lib.context7Id}): ${lib.reason}`)
283
+ .join("\n");
284
+ const documentationContents = documentContents
285
+ .map((doc) => `## ${doc.library}\n${doc.content.substring(0, 500)}...`)
286
+ .join("\n\n");
287
+ const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
288
+ name: "documentation-recap",
289
+ type: "user",
290
+ variables: {
291
+ LIBRARIES_LIST: librariesList,
292
+ DOCUMENTATION_CONTENTS: documentationContents,
293
+ },
294
+ });
295
+ if (!promptResult.success) {
296
+ throw new Error(`Failed to build documentation recap prompt: ${promptResult.error}`);
297
+ }
298
+ const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
299
+ name: "documentation-recap",
300
+ type: "system",
301
+ variables: {},
302
+ });
303
+ return this.retryHandler.executeWithRetry(async () => {
304
+ return this.streamText(promptResult.prompt, undefined, systemPromptResult.prompt, undefined, streamingOptions, { maxAttempts: 1 });
305
+ }, retryConfig, "Documentation recap generation");
306
+ }
307
+ }
308
+ exports.DocumentationOperations = DocumentationOperations;
@@ -0,0 +1,69 @@
1
+ export declare const readFileTool: import("ai").Tool<{
2
+ filePath: string;
3
+ }, {
4
+ success: boolean;
5
+ content: string;
6
+ path: string;
7
+ size: number;
8
+ error?: undefined;
9
+ } | {
10
+ success: boolean;
11
+ error: string;
12
+ content?: undefined;
13
+ path?: undefined;
14
+ size?: undefined;
15
+ }>;
16
+ export declare const listDirectoryTool: import("ai").Tool<{
17
+ dirPath: string;
18
+ }, {
19
+ success: boolean;
20
+ contents: {
21
+ name: string;
22
+ type: string;
23
+ path: string;
24
+ size: number | undefined;
25
+ }[];
26
+ directory: string;
27
+ error?: undefined;
28
+ } | {
29
+ success: boolean;
30
+ error: string;
31
+ contents: never[];
32
+ directory?: undefined;
33
+ }>;
34
+ export declare const filesystemTools: {
35
+ readFile: import("ai").Tool<{
36
+ filePath: string;
37
+ }, {
38
+ success: boolean;
39
+ content: string;
40
+ path: string;
41
+ size: number;
42
+ error?: undefined;
43
+ } | {
44
+ success: boolean;
45
+ error: string;
46
+ content?: undefined;
47
+ path?: undefined;
48
+ size?: undefined;
49
+ }>;
50
+ listDirectory: import("ai").Tool<{
51
+ dirPath: string;
52
+ }, {
53
+ success: boolean;
54
+ contents: {
55
+ name: string;
56
+ type: string;
57
+ path: string;
58
+ size: number | undefined;
59
+ }[];
60
+ directory: string;
61
+ error?: undefined;
62
+ } | {
63
+ success: boolean;
64
+ error: string;
65
+ contents: never[];
66
+ directory?: undefined;
67
+ }>;
68
+ };
69
+ //# sourceMappingURL=filesystem-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/filesystem-tools.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;EAwBvB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;EAoC5B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filesystemTools = exports.listDirectoryTool = exports.readFileTool = void 0;
4
+ const ai_1 = require("ai");
5
+ const v3_1 = require("zod/v3");
6
+ const promises_1 = require("fs/promises");
7
+ const path_1 = require("path");
8
+ exports.readFileTool = (0, ai_1.tool)({
9
+ description: "Read the contents of a file",
10
+ inputSchema: v3_1.z.object({
11
+ filePath: v3_1.z.string().describe("Path to the file to read"),
12
+ }),
13
+ execute: async ({ filePath }) => {
14
+ try {
15
+ const resolvedPath = (0, path_1.resolve)(filePath);
16
+ const content = await (0, promises_1.readFile)(resolvedPath, "utf-8");
17
+ const stats = await (0, promises_1.stat)(resolvedPath);
18
+ return {
19
+ success: true,
20
+ content,
21
+ path: (0, path_1.relative)(process.cwd(), resolvedPath),
22
+ size: stats.size,
23
+ };
24
+ }
25
+ catch (error) {
26
+ return {
27
+ success: false,
28
+ error: error instanceof Error ? error.message : "Unknown error",
29
+ };
30
+ }
31
+ },
32
+ });
33
+ exports.listDirectoryTool = (0, ai_1.tool)({
34
+ description: "List contents of a directory",
35
+ inputSchema: v3_1.z.object({
36
+ dirPath: v3_1.z.string().describe("Directory path to list"),
37
+ }),
38
+ execute: async ({ dirPath }) => {
39
+ try {
40
+ const resolvedPath = (0, path_1.resolve)(dirPath);
41
+ const entries = await (0, promises_1.readdir)(resolvedPath, { withFileTypes: true });
42
+ const contents = await Promise.all(entries.map(async (entry) => {
43
+ const fullPath = (0, path_1.join)(resolvedPath, entry.name);
44
+ const stats = await (0, promises_1.stat)(fullPath);
45
+ return {
46
+ name: entry.name,
47
+ type: entry.isDirectory() ? "directory" : "file",
48
+ path: (0, path_1.relative)(process.cwd(), fullPath),
49
+ size: entry.isFile() ? stats.size : undefined,
50
+ };
51
+ }));
52
+ return {
53
+ success: true,
54
+ contents,
55
+ directory: (0, path_1.relative)(process.cwd(), resolvedPath),
56
+ };
57
+ }
58
+ catch (error) {
59
+ return {
60
+ success: false,
61
+ error: error instanceof Error ? error.message : "Unknown error",
62
+ contents: [],
63
+ };
64
+ }
65
+ },
66
+ });
67
+ exports.filesystemTools = {
68
+ readFile: exports.readFileTool,
69
+ listDirectory: exports.listDirectoryTool,
70
+ };
@@ -0,0 +1,34 @@
1
+ import { JSONParseResult } from "../../types";
2
+ export declare class JSONParser {
3
+ /**
4
+ * Extracts JSON from text that may contain markdown codeblocks or other formatting
5
+ */
6
+ /**
7
+ * Extracts the first valid JSON object or array from text using a stack-based approach
8
+ * This is much more robust than regex for nested structures or text with multiple brace pairs
9
+ */
10
+ private extractJSONString;
11
+ /**
12
+ * Extracts a balanced string starting from a specific index
13
+ */
14
+ private extractBalancedString;
15
+ /**
16
+ * Cleans JSON string by removing comments and trailing commas
17
+ * This handles "valid JS object" format that LLMs often output
18
+ */
19
+ private cleanJSON;
20
+ /**
21
+ * Normalizes object keys to handle case variations (e.g., "Tasks" -> "tasks")
22
+ */
23
+ private normalizeKeys;
24
+ /**
25
+ * Parses JSON from AI text response with improved error handling
26
+ * Now supports:
27
+ * - Extracting from markdown codeblocks (```json, ```JSON, or ```)
28
+ * - Stack-based extraction for robustness against surrounding text
29
+ * - Comment and trailing comma removal
30
+ * - Case-insensitive property names
31
+ */
32
+ parseJSONFromResponse<T>(text: string): JSONParseResult<T>;
33
+ }
34
+ //# sourceMappingURL=json-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-parser.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/json-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,UAAU;IACrB;;OAEG;IACH;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA8DzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2C7B;;;OAGG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;;;;;;OAOG;IACH,qBAAqB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;CAwC3D"}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JSONParser = void 0;
4
+ class JSONParser {
5
+ /**
6
+ * Extracts JSON from text that may contain markdown codeblocks or other formatting
7
+ */
8
+ /**
9
+ * Extracts the first valid JSON object or array from text using a stack-based approach
10
+ * This is much more robust than regex for nested structures or text with multiple brace pairs
11
+ */
12
+ extractJSONString(text) {
13
+ // 1. Try to extract from markdown codeblock first (most reliable)
14
+ const codeblockPatterns = [
15
+ /```json\s*([\s\S]*?)```/i,
16
+ /```JSON\s*([\s\S]*?)```/i,
17
+ /```\s*([\s\S]*?)```/,
18
+ ];
19
+ for (const pattern of codeblockPatterns) {
20
+ const match = text.match(pattern);
21
+ if (match && match[1]) {
22
+ return match[1].trim();
23
+ }
24
+ }
25
+ // 2. Stack-based extraction for raw text
26
+ // Find all potential start indices ({ or [)
27
+ const candidates = [];
28
+ for (let i = 0; i < text.length; i++) {
29
+ if (text[i] === "{" || text[i] === "[") {
30
+ candidates.push({ start: i, char: text[i] });
31
+ }
32
+ }
33
+ // console.log(
34
+ // `[DEBUG] Found ${candidates.length} candidates for JSON extraction`
35
+ // );
36
+ // Try to extract a valid JSON from each candidate start
37
+ for (const candidate of candidates) {
38
+ const extracted = this.extractBalancedString(text, candidate.start, candidate.char);
39
+ if (extracted) {
40
+ // 1. Try raw parse first (safest if valid JSON)
41
+ try {
42
+ JSON.parse(extracted);
43
+ return extracted;
44
+ }
45
+ catch (e) {
46
+ // Ignore, fall through to cleaning
47
+ }
48
+ // 2. Try cleaning (comments, trailing commas)
49
+ try {
50
+ const cleaned = this.cleanJSON(extracted);
51
+ JSON.parse(cleaned);
52
+ return cleaned;
53
+ }
54
+ catch (e) {
55
+ // console.error(
56
+ // `[DEBUG] JSON Parse failed for candidate at index ${candidate.start}:`,
57
+ // e
58
+ // );
59
+ // If parse fails, continue to next candidate
60
+ continue;
61
+ }
62
+ }
63
+ }
64
+ return null;
65
+ }
66
+ /**
67
+ * Extracts a balanced string starting from a specific index
68
+ */
69
+ extractBalancedString(text, startIndex, startChar) {
70
+ const endChar = startChar === "{" ? "}" : "]";
71
+ let balance = 0;
72
+ let inString = false;
73
+ let escaped = false;
74
+ for (let i = startIndex; i < text.length; i++) {
75
+ const char = text[i];
76
+ if (escaped) {
77
+ escaped = false;
78
+ continue;
79
+ }
80
+ if (char === "\\") {
81
+ escaped = true;
82
+ continue;
83
+ }
84
+ if (char === '"') {
85
+ inString = !inString;
86
+ continue;
87
+ }
88
+ if (!inString) {
89
+ if (char === startChar) {
90
+ balance++;
91
+ }
92
+ else if (char === endChar) {
93
+ balance--;
94
+ if (balance === 0) {
95
+ return text.substring(startIndex, i + 1);
96
+ }
97
+ }
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * Cleans JSON string by removing comments and trailing commas
104
+ * This handles "valid JS object" format that LLMs often output
105
+ */
106
+ cleanJSON(text) {
107
+ return text
108
+ .replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, "") // Remove comments
109
+ .replace(/,(\s*[}\]])/g, "$1") // Remove trailing commas
110
+ .trim();
111
+ }
112
+ /**
113
+ * Normalizes object keys to handle case variations (e.g., "Tasks" -> "tasks")
114
+ */
115
+ normalizeKeys(obj) {
116
+ if (obj === null || obj === undefined) {
117
+ return obj;
118
+ }
119
+ if (Array.isArray(obj)) {
120
+ return obj.map((item) => this.normalizeKeys(item));
121
+ }
122
+ if (typeof obj === "object") {
123
+ const normalized = {};
124
+ for (const key in obj) {
125
+ // Convert first letter to lowercase
126
+ const normalizedKey = key.charAt(0).toLowerCase() + key.slice(1);
127
+ normalized[normalizedKey] = this.normalizeKeys(obj[key]);
128
+ }
129
+ return normalized;
130
+ }
131
+ return obj;
132
+ }
133
+ /**
134
+ * Parses JSON from AI text response with improved error handling
135
+ * Now supports:
136
+ * - Extracting from markdown codeblocks (```json, ```JSON, or ```)
137
+ * - Stack-based extraction for robustness against surrounding text
138
+ * - Comment and trailing comma removal
139
+ * - Case-insensitive property names
140
+ */
141
+ parseJSONFromResponse(text) {
142
+ // console.log(`[DEBUG] JSONParser received text (${text.length} chars)`);
143
+ // console.log(
144
+ // `[DEBUG] First 100 chars: ${JSON.stringify(text.substring(0, 100))}`
145
+ // );
146
+ // console.log(`[DEBUG] Last 100 chars: ${JSON.stringify(text.slice(-100))}`);
147
+ try {
148
+ // Try to extract JSON from the response
149
+ const jsonStr = this.extractJSONString(text);
150
+ if (!jsonStr) {
151
+ // console.error("[DEBUG] extractJSONString returned null");
152
+ return {
153
+ success: false,
154
+ error: "Could not extract JSON from AI response. No JSON object or codeblock found.",
155
+ rawText: text,
156
+ };
157
+ }
158
+ // Parse the JSON (it should be clean now)
159
+ let parsed = JSON.parse(jsonStr);
160
+ // Normalize keys to handle case variations (Tasks -> tasks, etc.)
161
+ parsed = this.normalizeKeys(parsed);
162
+ return {
163
+ success: true,
164
+ data: parsed,
165
+ rawText: text,
166
+ };
167
+ }
168
+ catch (error) {
169
+ return {
170
+ success: false,
171
+ error: error instanceof Error ? error.message : String(error),
172
+ rawText: text,
173
+ };
174
+ }
175
+ }
176
+ }
177
+ exports.JSONParser = JSONParser;
@@ -0,0 +1,9 @@
1
+ import { ToolSet } from "ai";
2
+ export declare class Context7Client {
3
+ private mcpClient;
4
+ initializeMCPClient(): Promise<any>;
5
+ getMCPTools(): Promise<ToolSet>;
6
+ closeMCPConnection(): Promise<void>;
7
+ saveContext7Documentation(library: string, query: string, content: string): Promise<string>;
8
+ }
9
+ //# sourceMappingURL=mcp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/mcp-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAQ,MAAM,IAAI,CAAC;AAEnC,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAa;IAExB,mBAAmB;IAoBnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAW/B,kBAAkB;IAOlB,yBAAyB,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;CAInB"}