@qodo/sdk 0.13.4 → 2.0.0-next.1

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 (764) hide show
  1. package/LICENSE +31 -118
  2. package/README.md +133 -121
  3. package/bin/qodo-skills.mjs +13 -0
  4. package/bundled-skills/code-review/SKILL.md +41 -0
  5. package/bundled-skills/pr-summary/SKILL.md +59 -0
  6. package/bundled-skills/test-gen/SKILL.md +47 -0
  7. package/dist/auth/index.browser.d.ts +38 -0
  8. package/dist/auth/index.browser.d.ts.map +1 -0
  9. package/dist/auth/index.browser.js +62 -0
  10. package/dist/auth/index.browser.js.map +1 -0
  11. package/dist/auth/index.d.ts +44 -30
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +57 -110
  14. package/dist/auth/index.js.map +1 -1
  15. package/dist/client/AgentsClient.d.ts +33 -0
  16. package/dist/client/AgentsClient.d.ts.map +1 -0
  17. package/dist/client/AgentsClient.js +40 -0
  18. package/dist/client/AgentsClient.js.map +1 -0
  19. package/dist/client/ArtifactsClient.d.ts +43 -0
  20. package/dist/client/ArtifactsClient.d.ts.map +1 -0
  21. package/dist/client/ArtifactsClient.js +54 -0
  22. package/dist/client/ArtifactsClient.js.map +1 -0
  23. package/dist/client/BulletinClient.d.ts +45 -0
  24. package/dist/client/BulletinClient.d.ts.map +1 -0
  25. package/dist/client/BulletinClient.js +51 -0
  26. package/dist/client/BulletinClient.js.map +1 -0
  27. package/dist/client/InfoClient.d.ts +58 -0
  28. package/dist/client/InfoClient.d.ts.map +1 -0
  29. package/dist/client/InfoClient.js +135 -0
  30. package/dist/client/InfoClient.js.map +1 -0
  31. package/dist/client/PipelineClient.d.ts +162 -0
  32. package/dist/client/PipelineClient.d.ts.map +1 -0
  33. package/dist/client/PipelineClient.js +340 -0
  34. package/dist/client/PipelineClient.js.map +1 -0
  35. package/dist/client/QarRegistryClient.d.ts +396 -0
  36. package/dist/client/QarRegistryClient.d.ts.map +1 -0
  37. package/dist/client/QarRegistryClient.js +536 -0
  38. package/dist/client/QarRegistryClient.js.map +1 -0
  39. package/dist/client/QodoClient.d.ts +296 -0
  40. package/dist/client/QodoClient.d.ts.map +1 -0
  41. package/dist/client/QodoClient.js +803 -0
  42. package/dist/client/QodoClient.js.map +1 -0
  43. package/dist/client/SpecsClient.d.ts +121 -0
  44. package/dist/client/SpecsClient.d.ts.map +1 -0
  45. package/dist/client/SpecsClient.js +252 -0
  46. package/dist/client/SpecsClient.js.map +1 -0
  47. package/dist/client/StateClient.d.ts +35 -0
  48. package/dist/client/StateClient.d.ts.map +1 -0
  49. package/dist/client/StateClient.js +36 -0
  50. package/dist/client/StateClient.js.map +1 -0
  51. package/dist/client/TaskClient.d.ts +706 -0
  52. package/dist/client/TaskClient.d.ts.map +1 -0
  53. package/dist/client/TaskClient.js +2522 -0
  54. package/dist/client/TaskClient.js.map +1 -0
  55. package/dist/client/ToolClient.d.ts +278 -0
  56. package/dist/client/ToolClient.d.ts.map +1 -0
  57. package/dist/client/ToolClient.js +1139 -0
  58. package/dist/client/ToolClient.js.map +1 -0
  59. package/dist/client/a2a/index.d.ts +10 -0
  60. package/dist/client/a2a/index.d.ts.map +1 -0
  61. package/dist/client/a2a/index.js +9 -0
  62. package/dist/client/a2a/index.js.map +1 -0
  63. package/dist/client/a2a/registerA2A.d.ts +170 -0
  64. package/dist/client/a2a/registerA2A.d.ts.map +1 -0
  65. package/dist/client/a2a/registerA2A.js +85 -0
  66. package/dist/client/a2a/registerA2A.js.map +1 -0
  67. package/dist/client/connection.d.ts +893 -0
  68. package/dist/client/connection.d.ts.map +1 -0
  69. package/dist/client/connection.js +2189 -0
  70. package/dist/client/connection.js.map +1 -0
  71. package/dist/client/errors.d.ts +735 -0
  72. package/dist/client/errors.d.ts.map +1 -0
  73. package/dist/client/errors.js +921 -0
  74. package/dist/client/errors.js.map +1 -0
  75. package/dist/client/index.d.ts +26 -0
  76. package/dist/client/index.d.ts.map +1 -0
  77. package/dist/client/index.js +20 -0
  78. package/dist/client/index.js.map +1 -0
  79. package/dist/client/inlineGraph.d.ts +66 -0
  80. package/dist/client/inlineGraph.d.ts.map +1 -0
  81. package/dist/client/inlineGraph.js +500 -0
  82. package/dist/client/inlineGraph.js.map +1 -0
  83. package/dist/client/internal/thenable.d.ts +27 -0
  84. package/dist/client/internal/thenable.d.ts.map +1 -0
  85. package/dist/client/internal/thenable.js +31 -0
  86. package/dist/client/internal/thenable.js.map +1 -0
  87. package/dist/client/iterator.d.ts +32 -0
  88. package/dist/client/iterator.d.ts.map +1 -0
  89. package/dist/client/iterator.js +73 -0
  90. package/dist/client/iterator.js.map +1 -0
  91. package/dist/client/mcp/McpClientPool.browser.d.ts +76 -0
  92. package/dist/client/mcp/McpClientPool.browser.d.ts.map +1 -0
  93. package/dist/client/mcp/McpClientPool.browser.js +78 -0
  94. package/dist/client/mcp/McpClientPool.browser.js.map +1 -0
  95. package/dist/client/mcp/McpClientPool.d.ts +236 -0
  96. package/dist/client/mcp/McpClientPool.d.ts.map +1 -0
  97. package/dist/client/mcp/McpClientPool.js +585 -0
  98. package/dist/client/mcp/McpClientPool.js.map +1 -0
  99. package/dist/client/mcp/projection.d.ts +109 -0
  100. package/dist/client/mcp/projection.d.ts.map +1 -0
  101. package/dist/client/mcp/projection.js +446 -0
  102. package/dist/client/mcp/projection.js.map +1 -0
  103. package/dist/client/mcp/substituteEnv.browser.d.ts +18 -0
  104. package/dist/client/mcp/substituteEnv.browser.d.ts.map +1 -0
  105. package/dist/client/mcp/substituteEnv.browser.js +20 -0
  106. package/dist/client/mcp/substituteEnv.browser.js.map +1 -0
  107. package/dist/client/mcp/substituteEnv.d.ts +45 -0
  108. package/dist/client/mcp/substituteEnv.d.ts.map +1 -0
  109. package/dist/client/mcp/substituteEnv.js +63 -0
  110. package/dist/client/mcp/substituteEnv.js.map +1 -0
  111. package/dist/client/observers.d.ts +57 -0
  112. package/dist/client/observers.d.ts.map +1 -0
  113. package/dist/client/observers.js +203 -0
  114. package/dist/client/observers.js.map +1 -0
  115. package/dist/client/options.d.ts +269 -0
  116. package/dist/client/options.d.ts.map +1 -0
  117. package/dist/client/options.js +9 -0
  118. package/dist/client/options.js.map +1 -0
  119. package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts +17 -0
  120. package/dist/client/tools/_readlineApprovalPrompt.browser.d.ts.map +1 -0
  121. package/dist/client/tools/_readlineApprovalPrompt.browser.js +24 -0
  122. package/dist/client/tools/_readlineApprovalPrompt.browser.js.map +1 -0
  123. package/dist/client/tools/_readlineApprovalPrompt.d.ts +33 -0
  124. package/dist/client/tools/_readlineApprovalPrompt.d.ts.map +1 -0
  125. package/dist/client/tools/_readlineApprovalPrompt.js +90 -0
  126. package/dist/client/tools/_readlineApprovalPrompt.js.map +1 -0
  127. package/dist/client/tools/approval.d.ts +280 -0
  128. package/dist/client/tools/approval.d.ts.map +1 -0
  129. package/dist/client/tools/approval.js +229 -0
  130. package/dist/client/tools/approval.js.map +1 -0
  131. package/dist/client/tools/bindFunctionToolDefs.d.ts +156 -0
  132. package/dist/client/tools/bindFunctionToolDefs.d.ts.map +1 -0
  133. package/dist/client/tools/bindFunctionToolDefs.js +360 -0
  134. package/dist/client/tools/bindFunctionToolDefs.js.map +1 -0
  135. package/dist/client/tools/defineFunctionTool.d.ts +277 -0
  136. package/dist/client/tools/defineFunctionTool.d.ts.map +1 -0
  137. package/dist/client/tools/defineFunctionTool.js +190 -0
  138. package/dist/client/tools/defineFunctionTool.js.map +1 -0
  139. package/dist/client/transport.browser.d.ts +20 -0
  140. package/dist/client/transport.browser.d.ts.map +1 -0
  141. package/dist/client/transport.browser.js +29 -0
  142. package/dist/client/transport.browser.js.map +1 -0
  143. package/dist/client/transport.d.ts +47 -0
  144. package/dist/client/transport.d.ts.map +1 -0
  145. package/dist/client/transport.js +102 -0
  146. package/dist/client/transport.js.map +1 -0
  147. package/dist/client/transport.shared.d.ts +30 -0
  148. package/dist/client/transport.shared.d.ts.map +1 -0
  149. package/dist/client/transport.shared.js +40 -0
  150. package/dist/client/transport.shared.js.map +1 -0
  151. package/dist/client/uuid.d.ts +32 -0
  152. package/dist/client/uuid.d.ts.map +1 -0
  153. package/dist/client/uuid.js +65 -0
  154. package/dist/client/uuid.js.map +1 -0
  155. package/dist/index.d.ts +88 -39
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +166 -43
  158. package/dist/index.js.map +1 -1
  159. package/dist/observability/attributes.d.ts +136 -0
  160. package/dist/observability/attributes.d.ts.map +1 -0
  161. package/dist/observability/attributes.js +184 -0
  162. package/dist/observability/attributes.js.map +1 -0
  163. package/dist/observability/index.d.ts +14 -0
  164. package/dist/observability/index.d.ts.map +1 -0
  165. package/dist/observability/index.js +11 -0
  166. package/dist/observability/index.js.map +1 -0
  167. package/dist/observability/resolveOTel.browser.d.ts +13 -0
  168. package/dist/observability/resolveOTel.browser.d.ts.map +1 -0
  169. package/dist/observability/resolveOTel.browser.js +14 -0
  170. package/dist/observability/resolveOTel.browser.js.map +1 -0
  171. package/dist/observability/resolveOTel.d.ts +28 -0
  172. package/dist/observability/resolveOTel.d.ts.map +1 -0
  173. package/dist/observability/resolveOTel.js +74 -0
  174. package/dist/observability/resolveOTel.js.map +1 -0
  175. package/dist/observability/spans.d.ts +198 -0
  176. package/dist/observability/spans.d.ts.map +1 -0
  177. package/dist/observability/spans.js +300 -0
  178. package/dist/observability/spans.js.map +1 -0
  179. package/dist/observability/traceContext.d.ts +51 -0
  180. package/dist/observability/traceContext.d.ts.map +1 -0
  181. package/dist/observability/traceContext.js +151 -0
  182. package/dist/observability/traceContext.js.map +1 -0
  183. package/dist/observability/transportMetrics.d.ts +58 -0
  184. package/dist/observability/transportMetrics.d.ts.map +1 -0
  185. package/dist/observability/transportMetrics.js +55 -0
  186. package/dist/observability/transportMetrics.js.map +1 -0
  187. package/dist/qar/agentSpec.d.ts +93 -0
  188. package/dist/qar/agentSpec.d.ts.map +1 -0
  189. package/dist/qar/agentSpec.js +184 -0
  190. package/dist/qar/agentSpec.js.map +1 -0
  191. package/dist/qar/clientEvents.d.ts +86 -0
  192. package/dist/qar/clientEvents.d.ts.map +1 -0
  193. package/dist/qar/clientEvents.js +36 -0
  194. package/dist/qar/clientEvents.js.map +1 -0
  195. package/dist/qar/envelopes.d.ts +227 -0
  196. package/dist/qar/envelopes.d.ts.map +1 -0
  197. package/dist/qar/envelopes.js +67 -0
  198. package/dist/qar/envelopes.js.map +1 -0
  199. package/dist/qar/generated/envelope.d.ts +332 -0
  200. package/dist/qar/generated/envelope.d.ts.map +1 -0
  201. package/dist/qar/generated/envelope.js +15 -0
  202. package/dist/qar/generated/envelope.js.map +1 -0
  203. package/dist/qar/generated/qar-info.d.ts +76 -0
  204. package/dist/qar/generated/qar-info.d.ts.map +1 -0
  205. package/dist/qar/generated/qar-info.js +15 -0
  206. package/dist/qar/generated/qar-info.js.map +1 -0
  207. package/dist/qar/generated/qodo-task-start-payload.d.ts +54 -0
  208. package/dist/qar/generated/qodo-task-start-payload.d.ts.map +1 -0
  209. package/dist/qar/generated/qodo-task-start-payload.js +15 -0
  210. package/dist/qar/generated/qodo-task-start-payload.js.map +1 -0
  211. package/dist/qar/ids.d.ts +19 -0
  212. package/dist/qar/ids.d.ts.map +1 -0
  213. package/dist/qar/ids.js +11 -0
  214. package/dist/qar/ids.js.map +1 -0
  215. package/dist/qar/index.d.ts +24 -0
  216. package/dist/qar/index.d.ts.map +1 -0
  217. package/dist/qar/index.js +16 -0
  218. package/dist/qar/index.js.map +1 -0
  219. package/dist/qar/info.d.ts +37 -0
  220. package/dist/qar/info.d.ts.map +1 -0
  221. package/dist/qar/info.js +17 -0
  222. package/dist/qar/info.js.map +1 -0
  223. package/dist/qar/json.d.ts +14 -0
  224. package/dist/qar/json.d.ts.map +1 -0
  225. package/dist/qar/json.js +9 -0
  226. package/dist/qar/json.js.map +1 -0
  227. package/dist/qar/payloads.d.ts +480 -0
  228. package/dist/qar/payloads.d.ts.map +1 -0
  229. package/dist/qar/payloads.js +37 -0
  230. package/dist/qar/payloads.js.map +1 -0
  231. package/dist/qar/specs.d.ts +604 -0
  232. package/dist/qar/specs.d.ts.map +1 -0
  233. package/dist/qar/specs.js +29 -0
  234. package/dist/qar/specs.js.map +1 -0
  235. package/dist/qar/taskEvents.d.ts +25 -0
  236. package/dist/qar/taskEvents.d.ts.map +1 -0
  237. package/dist/qar/taskEvents.js +22 -0
  238. package/dist/qar/taskEvents.js.map +1 -0
  239. package/dist/qar/trace.d.ts +12 -0
  240. package/dist/qar/trace.d.ts.map +1 -0
  241. package/dist/qar/trace.js +12 -0
  242. package/dist/qar/trace.js.map +1 -0
  243. package/dist/skills/activation.d.ts +177 -0
  244. package/dist/skills/activation.d.ts.map +1 -0
  245. package/dist/skills/activation.js +428 -0
  246. package/dist/skills/activation.js.map +1 -0
  247. package/dist/skills/cli/index.browser.d.ts +18 -0
  248. package/dist/skills/cli/index.browser.d.ts.map +1 -0
  249. package/dist/skills/cli/index.browser.js +27 -0
  250. package/dist/skills/cli/index.browser.js.map +1 -0
  251. package/dist/skills/cli/index.d.ts +37 -0
  252. package/dist/skills/cli/index.d.ts.map +1 -0
  253. package/dist/skills/cli/index.js +494 -0
  254. package/dist/skills/cli/index.js.map +1 -0
  255. package/dist/skills/events.d.ts +255 -0
  256. package/dist/skills/events.d.ts.map +1 -0
  257. package/dist/skills/events.js +224 -0
  258. package/dist/skills/events.js.map +1 -0
  259. package/dist/skills/index.d.ts +45 -0
  260. package/dist/skills/index.d.ts.map +1 -0
  261. package/dist/skills/index.js +34 -0
  262. package/dist/skills/index.js.map +1 -0
  263. package/dist/skills/inject.d.ts +57 -0
  264. package/dist/skills/inject.d.ts.map +1 -0
  265. package/dist/skills/inject.js +162 -0
  266. package/dist/skills/inject.js.map +1 -0
  267. package/dist/skills/lockfile.browser.d.ts +56 -0
  268. package/dist/skills/lockfile.browser.d.ts.map +1 -0
  269. package/dist/skills/lockfile.browser.js +55 -0
  270. package/dist/skills/lockfile.browser.js.map +1 -0
  271. package/dist/skills/lockfile.d.ts +137 -0
  272. package/dist/skills/lockfile.d.ts.map +1 -0
  273. package/dist/skills/lockfile.js +423 -0
  274. package/dist/skills/lockfile.js.map +1 -0
  275. package/dist/skills/manager.browser.d.ts +94 -0
  276. package/dist/skills/manager.browser.d.ts.map +1 -0
  277. package/dist/skills/manager.browser.js +159 -0
  278. package/dist/skills/manager.browser.js.map +1 -0
  279. package/dist/skills/manager.d.ts +362 -0
  280. package/dist/skills/manager.d.ts.map +1 -0
  281. package/dist/skills/manager.js +1386 -0
  282. package/dist/skills/manager.js.map +1 -0
  283. package/dist/skills/mcp/index.d.ts +15 -0
  284. package/dist/skills/mcp/index.d.ts.map +1 -0
  285. package/dist/skills/mcp/index.js +12 -0
  286. package/dist/skills/mcp/index.js.map +1 -0
  287. package/dist/skills/mcp/path.browser.d.ts +27 -0
  288. package/dist/skills/mcp/path.browser.d.ts.map +1 -0
  289. package/dist/skills/mcp/path.browser.js +33 -0
  290. package/dist/skills/mcp/path.browser.js.map +1 -0
  291. package/dist/skills/mcp/path.d.ts +57 -0
  292. package/dist/skills/mcp/path.d.ts.map +1 -0
  293. package/dist/skills/mcp/path.js +150 -0
  294. package/dist/skills/mcp/path.js.map +1 -0
  295. package/dist/skills/mcp/server.browser.d.ts +32 -0
  296. package/dist/skills/mcp/server.browser.d.ts.map +1 -0
  297. package/dist/skills/mcp/server.browser.js +53 -0
  298. package/dist/skills/mcp/server.browser.js.map +1 -0
  299. package/dist/skills/mcp/server.d.ts +144 -0
  300. package/dist/skills/mcp/server.d.ts.map +1 -0
  301. package/dist/skills/mcp/server.js +841 -0
  302. package/dist/skills/mcp/server.js.map +1 -0
  303. package/dist/skills/mcp/types.d.ts +72 -0
  304. package/dist/skills/mcp/types.d.ts.map +1 -0
  305. package/dist/skills/mcp/types.js +20 -0
  306. package/dist/skills/mcp/types.js.map +1 -0
  307. package/dist/skills/mcp/wireDefs.d.ts +58 -0
  308. package/dist/skills/mcp/wireDefs.d.ts.map +1 -0
  309. package/dist/skills/mcp/wireDefs.js +141 -0
  310. package/dist/skills/mcp/wireDefs.js.map +1 -0
  311. package/dist/skills/parser.d.ts +63 -0
  312. package/dist/skills/parser.d.ts.map +1 -0
  313. package/dist/skills/parser.js +755 -0
  314. package/dist/skills/parser.js.map +1 -0
  315. package/dist/skills/prefilter.d.ts +104 -0
  316. package/dist/skills/prefilter.d.ts.map +1 -0
  317. package/dist/skills/prefilter.js +398 -0
  318. package/dist/skills/prefilter.js.map +1 -0
  319. package/dist/skills/preprocess.d.ts +169 -0
  320. package/dist/skills/preprocess.d.ts.map +1 -0
  321. package/dist/skills/preprocess.js +535 -0
  322. package/dist/skills/preprocess.js.map +1 -0
  323. package/dist/skills/render.d.ts +83 -0
  324. package/dist/skills/render.d.ts.map +1 -0
  325. package/dist/skills/render.js +397 -0
  326. package/dist/skills/render.js.map +1 -0
  327. package/dist/skills/sources/index.browser.d.ts +29 -0
  328. package/dist/skills/sources/index.browser.d.ts.map +1 -0
  329. package/dist/skills/sources/index.browser.js +16 -0
  330. package/dist/skills/sources/index.browser.js.map +1 -0
  331. package/dist/skills/sources/index.d.ts +59 -0
  332. package/dist/skills/sources/index.d.ts.map +1 -0
  333. package/dist/skills/sources/index.js +471 -0
  334. package/dist/skills/sources/index.js.map +1 -0
  335. package/dist/skills/sources/walk.browser.d.ts +17 -0
  336. package/dist/skills/sources/walk.browser.d.ts.map +1 -0
  337. package/dist/skills/sources/walk.browser.js +19 -0
  338. package/dist/skills/sources/walk.browser.js.map +1 -0
  339. package/dist/skills/sources/walk.d.ts +68 -0
  340. package/dist/skills/sources/walk.d.ts.map +1 -0
  341. package/dist/skills/sources/walk.js +264 -0
  342. package/dist/skills/sources/walk.js.map +1 -0
  343. package/dist/skills/substitute.d.ts +87 -0
  344. package/dist/skills/substitute.d.ts.map +1 -0
  345. package/dist/skills/substitute.js +322 -0
  346. package/dist/skills/substitute.js.map +1 -0
  347. package/dist/skills/testing/SkillKit.browser.d.ts +62 -0
  348. package/dist/skills/testing/SkillKit.browser.d.ts.map +1 -0
  349. package/dist/skills/testing/SkillKit.browser.js +41 -0
  350. package/dist/skills/testing/SkillKit.browser.js.map +1 -0
  351. package/dist/skills/testing/SkillKit.d.ts +130 -0
  352. package/dist/skills/testing/SkillKit.d.ts.map +1 -0
  353. package/dist/skills/testing/SkillKit.js +316 -0
  354. package/dist/skills/testing/SkillKit.js.map +1 -0
  355. package/dist/skills/testing/index.d.ts +9 -0
  356. package/dist/skills/testing/index.d.ts.map +1 -0
  357. package/dist/skills/testing/index.js +8 -0
  358. package/dist/skills/testing/index.js.map +1 -0
  359. package/dist/skills/trust.d.ts +72 -0
  360. package/dist/skills/trust.d.ts.map +1 -0
  361. package/dist/skills/trust.js +183 -0
  362. package/dist/skills/trust.js.map +1 -0
  363. package/dist/skills/types.d.ts +627 -0
  364. package/dist/skills/types.d.ts.map +1 -0
  365. package/dist/skills/types.js +85 -0
  366. package/dist/skills/types.js.map +1 -0
  367. package/dist/skills/validator.d.ts +95 -0
  368. package/dist/skills/validator.d.ts.map +1 -0
  369. package/dist/skills/validator.js +486 -0
  370. package/dist/skills/validator.js.map +1 -0
  371. package/dist/tracing/PipelineTracer.d.ts +35 -22
  372. package/dist/tracing/PipelineTracer.d.ts.map +1 -1
  373. package/dist/tracing/PipelineTracer.js +106 -61
  374. package/dist/tracing/PipelineTracer.js.map +1 -1
  375. package/dist/tracing/SdkTracer.d.ts +63 -61
  376. package/dist/tracing/SdkTracer.d.ts.map +1 -1
  377. package/dist/tracing/SdkTracer.js +185 -177
  378. package/dist/tracing/SdkTracer.js.map +1 -1
  379. package/dist/tracing/index.d.ts +10 -1
  380. package/dist/tracing/index.d.ts.map +1 -1
  381. package/dist/tracing/index.js +9 -0
  382. package/dist/tracing/index.js.map +1 -1
  383. package/dist/tracing/types.d.ts +89 -16
  384. package/dist/tracing/types.d.ts.map +1 -1
  385. package/dist/tracing/types.js +17 -4
  386. package/dist/tracing/types.js.map +1 -1
  387. package/dist/types.d.ts +6 -1
  388. package/dist/types.d.ts.map +1 -1
  389. package/dist/types.js +4 -0
  390. package/dist/types.js.map +1 -1
  391. package/dist/version.d.ts.map +1 -1
  392. package/dist/version.js +10 -20
  393. package/dist/version.js.map +1 -1
  394. package/package.json +53 -39
  395. package/.claude/skills/qodo-agent/SKILL.md +0 -974
  396. package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +0 -407
  397. package/.claude/skills/qodo-agent/references/builtin-tools.md +0 -342
  398. package/.claude/skills/qodo-agent/references/common-issues.md +0 -537
  399. package/bin/rg +0 -0
  400. package/dist/api/agent.d.ts +0 -105
  401. package/dist/api/agent.d.ts.map +0 -1
  402. package/dist/api/agent.js +0 -963
  403. package/dist/api/agent.js.map +0 -1
  404. package/dist/api/analytics.d.ts +0 -43
  405. package/dist/api/analytics.d.ts.map +0 -1
  406. package/dist/api/analytics.js +0 -163
  407. package/dist/api/analytics.js.map +0 -1
  408. package/dist/api/http.d.ts +0 -5
  409. package/dist/api/http.d.ts.map +0 -1
  410. package/dist/api/http.js +0 -62
  411. package/dist/api/http.js.map +0 -1
  412. package/dist/api/index.d.ts +0 -12
  413. package/dist/api/index.d.ts.map +0 -1
  414. package/dist/api/index.js +0 -17
  415. package/dist/api/index.js.map +0 -1
  416. package/dist/api/taskTracking.d.ts +0 -54
  417. package/dist/api/taskTracking.d.ts.map +0 -1
  418. package/dist/api/taskTracking.js +0 -208
  419. package/dist/api/taskTracking.js.map +0 -1
  420. package/dist/api/types.d.ts +0 -93
  421. package/dist/api/types.d.ts.map +0 -1
  422. package/dist/api/types.js +0 -2
  423. package/dist/api/types.js.map +0 -1
  424. package/dist/api/utils.d.ts +0 -8
  425. package/dist/api/utils.d.ts.map +0 -1
  426. package/dist/api/utils.js +0 -63
  427. package/dist/api/utils.js.map +0 -1
  428. package/dist/api/websocket.d.ts +0 -203
  429. package/dist/api/websocket.d.ts.map +0 -1
  430. package/dist/api/websocket.js +0 -1166
  431. package/dist/api/websocket.js.map +0 -1
  432. package/dist/bin/install-skill.d.ts +0 -14
  433. package/dist/bin/install-skill.d.ts.map +0 -1
  434. package/dist/bin/install-skill.js +0 -125
  435. package/dist/bin/install-skill.js.map +0 -1
  436. package/dist/bin/run-helpers.d.ts +0 -34
  437. package/dist/bin/run-helpers.d.ts.map +0 -1
  438. package/dist/bin/run-helpers.js +0 -186
  439. package/dist/bin/run-helpers.js.map +0 -1
  440. package/dist/bin/run.d.ts +0 -13
  441. package/dist/bin/run.d.ts.map +0 -1
  442. package/dist/bin/run.js +0 -57
  443. package/dist/bin/run.js.map +0 -1
  444. package/dist/clients/index.d.ts +0 -10
  445. package/dist/clients/index.d.ts.map +0 -1
  446. package/dist/clients/index.js +0 -8
  447. package/dist/clients/index.js.map +0 -1
  448. package/dist/clients/info/InfoClient.d.ts +0 -37
  449. package/dist/clients/info/InfoClient.d.ts.map +0 -1
  450. package/dist/clients/info/InfoClient.js +0 -69
  451. package/dist/clients/info/InfoClient.js.map +0 -1
  452. package/dist/clients/info/index.d.ts +0 -4
  453. package/dist/clients/info/index.d.ts.map +0 -1
  454. package/dist/clients/info/index.js +0 -2
  455. package/dist/clients/info/index.js.map +0 -1
  456. package/dist/clients/info/types.d.ts +0 -21
  457. package/dist/clients/info/types.d.ts.map +0 -1
  458. package/dist/clients/info/types.js +0 -2
  459. package/dist/clients/info/types.js.map +0 -1
  460. package/dist/clients/sessions/SessionsClient.d.ts +0 -34
  461. package/dist/clients/sessions/SessionsClient.d.ts.map +0 -1
  462. package/dist/clients/sessions/SessionsClient.js +0 -71
  463. package/dist/clients/sessions/SessionsClient.js.map +0 -1
  464. package/dist/clients/sessions/index.d.ts +0 -4
  465. package/dist/clients/sessions/index.d.ts.map +0 -1
  466. package/dist/clients/sessions/index.js +0 -2
  467. package/dist/clients/sessions/index.js.map +0 -1
  468. package/dist/clients/sessions/types.d.ts +0 -20
  469. package/dist/clients/sessions/types.d.ts.map +0 -1
  470. package/dist/clients/sessions/types.js +0 -2
  471. package/dist/clients/sessions/types.js.map +0 -1
  472. package/dist/clients/tools/ToolsClient.d.ts +0 -39
  473. package/dist/clients/tools/ToolsClient.d.ts.map +0 -1
  474. package/dist/clients/tools/ToolsClient.js +0 -95
  475. package/dist/clients/tools/ToolsClient.js.map +0 -1
  476. package/dist/clients/tools/index.d.ts +0 -4
  477. package/dist/clients/tools/index.d.ts.map +0 -1
  478. package/dist/clients/tools/index.js +0 -2
  479. package/dist/clients/tools/index.js.map +0 -1
  480. package/dist/clients/tools/types.d.ts +0 -14
  481. package/dist/clients/tools/types.d.ts.map +0 -1
  482. package/dist/clients/tools/types.js +0 -2
  483. package/dist/clients/tools/types.js.map +0 -1
  484. package/dist/config/ConfigManager.d.ts +0 -43
  485. package/dist/config/ConfigManager.d.ts.map +0 -1
  486. package/dist/config/ConfigManager.js +0 -472
  487. package/dist/config/ConfigManager.js.map +0 -1
  488. package/dist/config/index.d.ts +0 -6
  489. package/dist/config/index.d.ts.map +0 -1
  490. package/dist/config/index.js +0 -7
  491. package/dist/config/index.js.map +0 -1
  492. package/dist/config/urlConfig.d.ts +0 -15
  493. package/dist/config/urlConfig.d.ts.map +0 -1
  494. package/dist/config/urlConfig.js +0 -75
  495. package/dist/config/urlConfig.js.map +0 -1
  496. package/dist/constants/errors.d.ts +0 -2
  497. package/dist/constants/errors.d.ts.map +0 -1
  498. package/dist/constants/errors.js +0 -2
  499. package/dist/constants/errors.js.map +0 -1
  500. package/dist/constants/index.d.ts +0 -7
  501. package/dist/constants/index.d.ts.map +0 -1
  502. package/dist/constants/index.js +0 -11
  503. package/dist/constants/index.js.map +0 -1
  504. package/dist/constants/tools.d.ts +0 -4
  505. package/dist/constants/tools.d.ts.map +0 -1
  506. package/dist/constants/tools.js +0 -4
  507. package/dist/constants/tools.js.map +0 -1
  508. package/dist/constants/versions.d.ts +0 -2
  509. package/dist/constants/versions.d.ts.map +0 -1
  510. package/dist/constants/versions.js +0 -2
  511. package/dist/constants/versions.js.map +0 -1
  512. package/dist/context/buildUserContext.d.ts +0 -18
  513. package/dist/context/buildUserContext.d.ts.map +0 -1
  514. package/dist/context/buildUserContext.js +0 -34
  515. package/dist/context/buildUserContext.js.map +0 -1
  516. package/dist/context/index.d.ts +0 -9
  517. package/dist/context/index.d.ts.map +0 -1
  518. package/dist/context/index.js +0 -9
  519. package/dist/context/index.js.map +0 -1
  520. package/dist/context/messageManager.d.ts +0 -42
  521. package/dist/context/messageManager.d.ts.map +0 -1
  522. package/dist/context/messageManager.js +0 -322
  523. package/dist/context/messageManager.js.map +0 -1
  524. package/dist/context/taskFocus.d.ts +0 -2
  525. package/dist/context/taskFocus.d.ts.map +0 -1
  526. package/dist/context/taskFocus.js +0 -26
  527. package/dist/context/taskFocus.js.map +0 -1
  528. package/dist/context/userInput.d.ts +0 -3
  529. package/dist/context/userInput.d.ts.map +0 -1
  530. package/dist/context/userInput.js +0 -20
  531. package/dist/context/userInput.js.map +0 -1
  532. package/dist/mcp/MCPManager.d.ts +0 -109
  533. package/dist/mcp/MCPManager.d.ts.map +0 -1
  534. package/dist/mcp/MCPManager.js +0 -592
  535. package/dist/mcp/MCPManager.js.map +0 -1
  536. package/dist/mcp/approvedTools.d.ts +0 -4
  537. package/dist/mcp/approvedTools.d.ts.map +0 -1
  538. package/dist/mcp/approvedTools.js +0 -19
  539. package/dist/mcp/approvedTools.js.map +0 -1
  540. package/dist/mcp/baseServer.d.ts +0 -75
  541. package/dist/mcp/baseServer.d.ts.map +0 -1
  542. package/dist/mcp/baseServer.js +0 -107
  543. package/dist/mcp/baseServer.js.map +0 -1
  544. package/dist/mcp/builtinServers.d.ts +0 -15
  545. package/dist/mcp/builtinServers.d.ts.map +0 -1
  546. package/dist/mcp/builtinServers.js +0 -141
  547. package/dist/mcp/builtinServers.js.map +0 -1
  548. package/dist/mcp/dynamicBEServer.d.ts +0 -20
  549. package/dist/mcp/dynamicBEServer.d.ts.map +0 -1
  550. package/dist/mcp/dynamicBEServer.js +0 -52
  551. package/dist/mcp/dynamicBEServer.js.map +0 -1
  552. package/dist/mcp/index.d.ts +0 -18
  553. package/dist/mcp/index.d.ts.map +0 -1
  554. package/dist/mcp/index.js +0 -23
  555. package/dist/mcp/index.js.map +0 -1
  556. package/dist/mcp/mcpInitialization.d.ts +0 -2
  557. package/dist/mcp/mcpInitialization.d.ts.map +0 -1
  558. package/dist/mcp/mcpInitialization.js +0 -56
  559. package/dist/mcp/mcpInitialization.js.map +0 -1
  560. package/dist/mcp/servers/filesystem.d.ts +0 -44
  561. package/dist/mcp/servers/filesystem.d.ts.map +0 -1
  562. package/dist/mcp/servers/filesystem.js +0 -776
  563. package/dist/mcp/servers/filesystem.js.map +0 -1
  564. package/dist/mcp/servers/git.d.ts +0 -18
  565. package/dist/mcp/servers/git.d.ts.map +0 -1
  566. package/dist/mcp/servers/git.js +0 -441
  567. package/dist/mcp/servers/git.js.map +0 -1
  568. package/dist/mcp/servers/ripgrep.d.ts +0 -39
  569. package/dist/mcp/servers/ripgrep.d.ts.map +0 -1
  570. package/dist/mcp/servers/ripgrep.js +0 -550
  571. package/dist/mcp/servers/ripgrep.js.map +0 -1
  572. package/dist/mcp/servers/shell.d.ts +0 -20
  573. package/dist/mcp/servers/shell.d.ts.map +0 -1
  574. package/dist/mcp/servers/shell.js +0 -519
  575. package/dist/mcp/servers/shell.js.map +0 -1
  576. package/dist/mcp/serversRegistry.d.ts +0 -55
  577. package/dist/mcp/serversRegistry.d.ts.map +0 -1
  578. package/dist/mcp/serversRegistry.js +0 -416
  579. package/dist/mcp/serversRegistry.js.map +0 -1
  580. package/dist/mcp/toolProcessor.d.ts +0 -82
  581. package/dist/mcp/toolProcessor.d.ts.map +0 -1
  582. package/dist/mcp/toolProcessor.js +0 -392
  583. package/dist/mcp/toolProcessor.js.map +0 -1
  584. package/dist/mcp/types.d.ts +0 -29
  585. package/dist/mcp/types.d.ts.map +0 -1
  586. package/dist/mcp/types.js +0 -2
  587. package/dist/mcp/types.js.map +0 -1
  588. package/dist/messages/index.d.ts +0 -8
  589. package/dist/messages/index.d.ts.map +0 -1
  590. package/dist/messages/index.js +0 -7
  591. package/dist/messages/index.js.map +0 -1
  592. package/dist/messages/openai.d.ts +0 -26
  593. package/dist/messages/openai.d.ts.map +0 -1
  594. package/dist/messages/openai.js +0 -55
  595. package/dist/messages/openai.js.map +0 -1
  596. package/dist/messages/types.d.ts +0 -73
  597. package/dist/messages/types.d.ts.map +0 -1
  598. package/dist/messages/types.js +0 -78
  599. package/dist/messages/types.js.map +0 -1
  600. package/dist/parser/index.d.ts +0 -72
  601. package/dist/parser/index.d.ts.map +0 -1
  602. package/dist/parser/index.js +0 -967
  603. package/dist/parser/index.js.map +0 -1
  604. package/dist/parser/types.d.ts +0 -153
  605. package/dist/parser/types.d.ts.map +0 -1
  606. package/dist/parser/types.js +0 -6
  607. package/dist/parser/types.js.map +0 -1
  608. package/dist/parser/utils.d.ts +0 -18
  609. package/dist/parser/utils.d.ts.map +0 -1
  610. package/dist/parser/utils.js +0 -64
  611. package/dist/parser/utils.js.map +0 -1
  612. package/dist/sdk/QodoSDK.d.ts +0 -218
  613. package/dist/sdk/QodoSDK.d.ts.map +0 -1
  614. package/dist/sdk/QodoSDK.js +0 -1115
  615. package/dist/sdk/QodoSDK.js.map +0 -1
  616. package/dist/sdk/artifacts.d.ts +0 -156
  617. package/dist/sdk/artifacts.d.ts.map +0 -1
  618. package/dist/sdk/artifacts.js +0 -166
  619. package/dist/sdk/artifacts.js.map +0 -1
  620. package/dist/sdk/bootstrap.d.ts +0 -16
  621. package/dist/sdk/bootstrap.d.ts.map +0 -1
  622. package/dist/sdk/bootstrap.js +0 -28
  623. package/dist/sdk/bootstrap.js.map +0 -1
  624. package/dist/sdk/builders.d.ts +0 -54
  625. package/dist/sdk/builders.d.ts.map +0 -1
  626. package/dist/sdk/builders.js +0 -117
  627. package/dist/sdk/builders.js.map +0 -1
  628. package/dist/sdk/defaults.d.ts +0 -11
  629. package/dist/sdk/defaults.d.ts.map +0 -1
  630. package/dist/sdk/defaults.js +0 -39
  631. package/dist/sdk/defaults.js.map +0 -1
  632. package/dist/sdk/discovery.d.ts +0 -2
  633. package/dist/sdk/discovery.d.ts.map +0 -1
  634. package/dist/sdk/discovery.js +0 -25
  635. package/dist/sdk/discovery.js.map +0 -1
  636. package/dist/sdk/events.d.ts +0 -269
  637. package/dist/sdk/events.d.ts.map +0 -1
  638. package/dist/sdk/events.js +0 -69
  639. package/dist/sdk/events.js.map +0 -1
  640. package/dist/sdk/exit-expression.d.ts +0 -13
  641. package/dist/sdk/exit-expression.d.ts.map +0 -1
  642. package/dist/sdk/exit-expression.js +0 -35
  643. package/dist/sdk/exit-expression.js.map +0 -1
  644. package/dist/sdk/index.d.ts +0 -17
  645. package/dist/sdk/index.d.ts.map +0 -1
  646. package/dist/sdk/index.js +0 -17
  647. package/dist/sdk/index.js.map +0 -1
  648. package/dist/sdk/middleware.d.ts +0 -59
  649. package/dist/sdk/middleware.d.ts.map +0 -1
  650. package/dist/sdk/middleware.js +0 -69
  651. package/dist/sdk/middleware.js.map +0 -1
  652. package/dist/sdk/pipeline/PipelineBuilder.d.ts +0 -79
  653. package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +0 -1
  654. package/dist/sdk/pipeline/PipelineBuilder.js +0 -129
  655. package/dist/sdk/pipeline/PipelineBuilder.js.map +0 -1
  656. package/dist/sdk/pipeline/PipelineRunner.d.ts +0 -28
  657. package/dist/sdk/pipeline/PipelineRunner.d.ts.map +0 -1
  658. package/dist/sdk/pipeline/PipelineRunner.js +0 -326
  659. package/dist/sdk/pipeline/PipelineRunner.js.map +0 -1
  660. package/dist/sdk/pipeline/compiler.d.ts +0 -24
  661. package/dist/sdk/pipeline/compiler.d.ts.map +0 -1
  662. package/dist/sdk/pipeline/compiler.js +0 -199
  663. package/dist/sdk/pipeline/compiler.js.map +0 -1
  664. package/dist/sdk/pipeline/declarative.d.ts +0 -34
  665. package/dist/sdk/pipeline/declarative.d.ts.map +0 -1
  666. package/dist/sdk/pipeline/declarative.js +0 -9
  667. package/dist/sdk/pipeline/declarative.js.map +0 -1
  668. package/dist/sdk/pipeline/index.d.ts +0 -20
  669. package/dist/sdk/pipeline/index.d.ts.map +0 -1
  670. package/dist/sdk/pipeline/index.js +0 -19
  671. package/dist/sdk/pipeline/index.js.map +0 -1
  672. package/dist/sdk/pipeline/types.d.ts +0 -93
  673. package/dist/sdk/pipeline/types.d.ts.map +0 -1
  674. package/dist/sdk/pipeline/types.js +0 -10
  675. package/dist/sdk/pipeline/types.js.map +0 -1
  676. package/dist/sdk/policies.d.ts +0 -163
  677. package/dist/sdk/policies.d.ts.map +0 -1
  678. package/dist/sdk/policies.js +0 -243
  679. package/dist/sdk/policies.js.map +0 -1
  680. package/dist/sdk/runner/AgentRunner.d.ts +0 -22
  681. package/dist/sdk/runner/AgentRunner.d.ts.map +0 -1
  682. package/dist/sdk/runner/AgentRunner.js +0 -222
  683. package/dist/sdk/runner/AgentRunner.js.map +0 -1
  684. package/dist/sdk/runner/finalize.d.ts +0 -56
  685. package/dist/sdk/runner/finalize.d.ts.map +0 -1
  686. package/dist/sdk/runner/finalize.js +0 -155
  687. package/dist/sdk/runner/finalize.js.map +0 -1
  688. package/dist/sdk/runner/formats.d.ts +0 -7
  689. package/dist/sdk/runner/formats.d.ts.map +0 -1
  690. package/dist/sdk/runner/formats.js +0 -76
  691. package/dist/sdk/runner/formats.js.map +0 -1
  692. package/dist/sdk/runner/index.d.ts +0 -9
  693. package/dist/sdk/runner/index.d.ts.map +0 -1
  694. package/dist/sdk/runner/index.js +0 -9
  695. package/dist/sdk/runner/index.js.map +0 -1
  696. package/dist/sdk/runner/progress.d.ts +0 -3
  697. package/dist/sdk/runner/progress.d.ts.map +0 -1
  698. package/dist/sdk/runner/progress.js +0 -16
  699. package/dist/sdk/runner/progress.js.map +0 -1
  700. package/dist/sdk/schemas.d.ts +0 -72
  701. package/dist/sdk/schemas.d.ts.map +0 -1
  702. package/dist/sdk/schemas.js +0 -282
  703. package/dist/sdk/schemas.js.map +0 -1
  704. package/dist/sdk/trigger-context.d.ts +0 -24
  705. package/dist/sdk/trigger-context.d.ts.map +0 -1
  706. package/dist/sdk/trigger-context.js +0 -136
  707. package/dist/sdk/trigger-context.js.map +0 -1
  708. package/dist/session/SessionContext.d.ts +0 -89
  709. package/dist/session/SessionContext.d.ts.map +0 -1
  710. package/dist/session/SessionContext.js +0 -410
  711. package/dist/session/SessionContext.js.map +0 -1
  712. package/dist/session/environment.d.ts +0 -52
  713. package/dist/session/environment.d.ts.map +0 -1
  714. package/dist/session/environment.js +0 -27
  715. package/dist/session/environment.js.map +0 -1
  716. package/dist/session/history.d.ts +0 -18
  717. package/dist/session/history.d.ts.map +0 -1
  718. package/dist/session/history.js +0 -68
  719. package/dist/session/history.js.map +0 -1
  720. package/dist/session/index.d.ts +0 -10
  721. package/dist/session/index.d.ts.map +0 -1
  722. package/dist/session/index.js +0 -9
  723. package/dist/session/index.js.map +0 -1
  724. package/dist/session/serverData.d.ts +0 -38
  725. package/dist/session/serverData.d.ts.map +0 -1
  726. package/dist/session/serverData.js +0 -261
  727. package/dist/session/serverData.js.map +0 -1
  728. package/dist/tracing/pipelineHelpers.d.ts +0 -29
  729. package/dist/tracing/pipelineHelpers.d.ts.map +0 -1
  730. package/dist/tracing/pipelineHelpers.js +0 -224
  731. package/dist/tracing/pipelineHelpers.js.map +0 -1
  732. package/dist/tracking/Tracker.d.ts +0 -55
  733. package/dist/tracking/Tracker.d.ts.map +0 -1
  734. package/dist/tracking/Tracker.js +0 -217
  735. package/dist/tracking/Tracker.js.map +0 -1
  736. package/dist/tracking/index.d.ts +0 -8
  737. package/dist/tracking/index.d.ts.map +0 -1
  738. package/dist/tracking/index.js +0 -8
  739. package/dist/tracking/index.js.map +0 -1
  740. package/dist/tracking/schemas.d.ts +0 -292
  741. package/dist/tracking/schemas.d.ts.map +0 -1
  742. package/dist/tracking/schemas.js +0 -91
  743. package/dist/tracking/schemas.js.map +0 -1
  744. package/dist/utils/extractSetFlags.d.ts +0 -6
  745. package/dist/utils/extractSetFlags.d.ts.map +0 -1
  746. package/dist/utils/extractSetFlags.js +0 -16
  747. package/dist/utils/extractSetFlags.js.map +0 -1
  748. package/dist/utils/formatTimeAgo.d.ts +0 -2
  749. package/dist/utils/formatTimeAgo.d.ts.map +0 -1
  750. package/dist/utils/formatTimeAgo.js +0 -20
  751. package/dist/utils/formatTimeAgo.js.map +0 -1
  752. package/dist/utils/index.d.ts +0 -12
  753. package/dist/utils/index.d.ts.map +0 -1
  754. package/dist/utils/index.js +0 -12
  755. package/dist/utils/index.js.map +0 -1
  756. package/dist/utils/machineId.d.ts +0 -14
  757. package/dist/utils/machineId.d.ts.map +0 -1
  758. package/dist/utils/machineId.js +0 -66
  759. package/dist/utils/machineId.js.map +0 -1
  760. package/dist/utils/pathUtils.d.ts +0 -22
  761. package/dist/utils/pathUtils.d.ts.map +0 -1
  762. package/dist/utils/pathUtils.js +0 -54
  763. package/dist/utils/pathUtils.js.map +0 -1
  764. package/scripts/download-ripgrep.js +0 -269
@@ -1,1115 +0,0 @@
1
- import { ConfigManager } from '../config/index.js';
2
- import { v4 as uuid } from 'uuid';
3
- import { findNearestAgentConfig } from './discovery.js';
4
- import { buildDefaultSdkAgentConfig } from './defaults.js';
5
- import { mcpInitialization, ServerRegistry, ToolProcessorManager } from '../mcp/index.js';
6
- import { runWithEnvironment, ServerData, SessionContext } from '../session/index.js';
7
- import { MessageManager } from '../context/index.js';
8
- import { AgentAPI } from '../api/agent.js';
9
- import { AgentRunnerCore } from './runner/index.js';
10
- import { BackendBootstrap } from './bootstrap.js';
11
- import { AuthProvider } from '../auth/index.js';
12
- import { QodoInfoClient, QodoSessionsClient, QodoToolsClient } from '../clients/index.js';
13
- import { canonicalizePathSync, extractSetFlags } from '../utils/index.js';
14
- import { extractProgress } from './runner/progress.js';
15
- import { toLangChainDict, toOpenAIChat } from './runner/formats.js';
16
- import { buildFinalResult, isZodSchema, validateStructuredOutput, QodoOutputValidationError } from './runner/finalize.js';
17
- import { createSdkEvent, getSdkVersion, SdkEventType, } from './events.js';
18
- export class QodoSDK {
19
- options;
20
- /** Backend info (get-things) facade */
21
- info;
22
- /** Session history facade */
23
- sessions;
24
- /** Tool discovery facade */
25
- tools;
26
- initialized = false;
27
- // Environment for AsyncLocalStorage-scoped singletons.
28
- // Mark as sdkMode to avoid process.exit in SDK code paths.
29
- env = {
30
- sdkMode: true,
31
- sdkDebug: false,
32
- };
33
- // SDK is headless by default. We avoid writing to stdout/stderr unless
34
- // explicitly enabled via options.debug or a provided logger.
35
- logger;
36
- // Per-run envelope metadata
37
- runId = '';
38
- seq = 0;
39
- runStartMs = 0;
40
- sessionContext;
41
- lastInitMeta = null;
42
- messageManager;
43
- agent;
44
- core;
45
- eventQueue = [];
46
- pendingResolvers = [];
47
- done = false;
48
- activeRuns = 0;
49
- // When true, this instance shares MCP with a parent and
50
- // dispose() will not tear down MCP servers.
51
- isFork = false;
52
- _forkParent;
53
- _activeForkCount = 0;
54
- _listenerCleanups = [];
55
- // For `sdk.message.delta`
56
- lastAiText = '';
57
- lastAiMessageId = '';
58
- // Deduplication for tool lifecycle
59
- toolRequestedEmitted = new Set();
60
- toolApprovalEmitted = new Set();
61
- toolApprovalInFlight = new Set();
62
- toolExecutedEmitted = new Set();
63
- // Track tool names by call id so sdk.tool.executed can include tool_name
64
- toolRegistry = new Map();
65
- // Per-run Zod schema for runtime validation of structured_output
66
- runOutputZodSchema = undefined;
67
- constructor(options = {}) {
68
- this.options = options;
69
- this.info = QodoInfoClient.fromSdkOptions(options);
70
- this.sessions = QodoSessionsClient.fromSdkOptions(options);
71
- this.tools = QodoToolsClient.fromSdkOptions(options);
72
- // If debug is enabled, allow verbose logs in this SDK environment.
73
- if (this.options.debug === true) {
74
- this.env.sdkDebug = true;
75
- }
76
- const noop = () => { };
77
- const fallback = this.options.debug
78
- ? {
79
- debug: console.debug.bind(console),
80
- info: console.info.bind(console),
81
- warn: console.warn.bind(console),
82
- error: console.error.bind(console),
83
- }
84
- : { debug: noop, info: noop, warn: noop, error: noop };
85
- this.logger = {
86
- debug: this.options.logger?.debug ?? fallback.debug,
87
- info: this.options.logger?.info ?? fallback.info,
88
- warn: this.options.logger?.warn ?? fallback.warn,
89
- error: this.options.logger?.error ?? fallback.error,
90
- };
91
- }
92
- static fromAgent(agentObject, options = {}) {
93
- return new QodoSDK({ ...options, agentObject });
94
- }
95
- /**
96
- * Create a new SDK instance that will run using a specific backend session id.
97
- *
98
- * This is useful for:
99
- * - resuming or continuing a known session
100
- * - binding a run to a session id created via `sdk.sessions.createSessionId()`
101
- *
102
- * Note: this returns a NEW SDK instance (does not mutate the current one).
103
- */
104
- withSession(sessionId) {
105
- const nextFlags = { ...(this.options.flags || {}), sid: sessionId };
106
- return new QodoSDK({ ...this.options, flags: nextFlags });
107
- }
108
- /**
109
- * Replace the backend session ID on this initialized instance without
110
- * reinitializing MCP servers or other resources.
111
- *
112
- * Intended for long-lived SDK instances (e.g., Slack bots, multi-tenant
113
- * servers) that need per-request session isolation while keeping MCP
114
- * connections warm.
115
- *
116
- * If no sessionId is provided, a fresh one is fetched from the backend.
117
- * Returns the effective session ID.
118
- */
119
- async replaceSession(sessionId) {
120
- if (!this.initialized) {
121
- throw new Error('Cannot replaceSession before SDK is initialized. Call stream/prompt first, or use withSession().');
122
- }
123
- if (this.isFork) {
124
- throw new Error('Cannot replaceSession on a fork. Create a new fork instead.');
125
- }
126
- if (this.activeRuns > 0) {
127
- throw new Error('Cannot replaceSession while a run is in progress. Wait for the current run to complete.');
128
- }
129
- const newId = sessionId ?? await this.sessions.createSessionId();
130
- this.sessionContext.replaceSessionId(newId);
131
- return newId;
132
- }
133
- /**
134
- * Create a lightweight SDK clone that shares this instance's MCP servers
135
- * but gets its own session, WebSocket, and message state.
136
- *
137
- * Use this for concurrent request handling (e.g., Slack bots, multi-tenant
138
- * servers) where each request needs session isolation but MCP connections
139
- * should stay warm.
140
- *
141
- * The returned fork MUST be disposed after use via `fork.dispose()`.
142
- * Disposing a fork tears down its session and WebSocket but leaves the
143
- * parent's MCP servers running.
144
- *
145
- * @param sessionId Optional backend session ID. If omitted, a fresh one is created.
146
- */
147
- async fork(sessionId) {
148
- if (!this.initialized) {
149
- throw new Error('Cannot fork before SDK is initialized. Call stream/prompt first.');
150
- }
151
- if (this.isFork) {
152
- throw new Error('Cannot fork a forked instance. Call fork() on the parent SDK instead.');
153
- }
154
- const child = new QodoSDK({ ...this.options });
155
- child.isFork = true;
156
- child._forkParent = this;
157
- this._activeForkCount++;
158
- try {
159
- await runWithEnvironment(child.env, async () => {
160
- // Share parent's expensive resources (read-only after init)
161
- child.env.authProvider = this.env.authProvider;
162
- child.env.serverRegistry = this.env.serverRegistry;
163
- child.env.mcpManager = this.env.mcpManager;
164
- child.env.serverData = this.env.serverData;
165
- // Fresh per-request middleware
166
- const tpm = new ToolProcessorManager();
167
- for (const mw of this.options.toolMiddleware ?? []) {
168
- tpm.addMiddleware(mw);
169
- }
170
- child.env.toolProcessorManager = tpm;
171
- // Fresh session context with a new session ID
172
- const newId = sessionId ?? await child.sessions.createSessionId();
173
- child.sessionContext = await SessionContext.newSessionContext({ ...this.sessionContext.getFlags() }, { ...this.sessionContext.getCommand() }, this.sessionContext.getGeneralInstructions(), this.sessionContext.getSystemPrompt(), undefined, // forks always start fresh
174
- newId);
175
- // Replicate parent's path configuration
176
- const paths = this.sessionContext.getAccessiblePaths();
177
- if (paths.length > 0) {
178
- await child.sessionContext.setAccessiblePaths(paths);
179
- }
180
- const execCwd = this.sessionContext.getExecutionCwd();
181
- if (execCwd) {
182
- child.sessionContext.setExecutionCwd(execCwd);
183
- }
184
- // Fresh message manager, agent, and core
185
- child.messageManager = new MessageManager();
186
- child.agent = new AgentAPI(child.sessionContext);
187
- child.setupEventListeners();
188
- child.core = new AgentRunnerCore(child.sessionContext, child.messageManager, child.agent, () => { }, child.options.autoApproveTools !== false);
189
- });
190
- child.initialized = true;
191
- child.lastInitMeta = this.lastInitMeta;
192
- return child;
193
- }
194
- catch (error) {
195
- // Clean up partially constructed fork to avoid resource leaks.
196
- // child.dispose() may return early (child not yet initialized),
197
- // so always decrement the parent's fork count explicitly.
198
- // Clear _forkParent first to prevent double-decrement in dispose().
199
- child._forkParent = undefined;
200
- this._activeForkCount--;
201
- try {
202
- await child.dispose();
203
- }
204
- catch { /* cleanup must not throw */ }
205
- throw error;
206
- }
207
- }
208
- /**
209
- * Register message, loading, and error listeners on the message manager.
210
- * Called during both full initialization and fork setup.
211
- */
212
- setupEventListeners() {
213
- // Clear any previous listener cleanups before registering new ones
214
- this._listenerCleanups = [];
215
- // Observe message list changes to emit:
216
- // - sdk.message.full
217
- // - sdk.message.delta (best effort from last AI message)
218
- this._listenerCleanups.push(this.messageManager.addMessageListener((messages) => {
219
- const lc = toLangChainDict(messages);
220
- const openai = toOpenAIChat(messages);
221
- const sid = this.sessionContext.getSessionId();
222
- this.pushEvent(SdkEventType.MessageFull, sid, {
223
- messages: { langchain: lc, openai },
224
- });
225
- // progress extraction
226
- try {
227
- const progress = extractProgress(messages);
228
- if (progress) {
229
- this.pushEvent(SdkEventType.Progress, sid, { ...progress });
230
- }
231
- }
232
- catch { /* non-fatal: progress extraction is best-effort */ }
233
- // tool lifecycle extraction from LangChain dict (AIMessage tool_calls + ToolMessage results)
234
- try {
235
- this.extractToolLifecycleFromLangChain(lc, sid);
236
- }
237
- catch { /* non-fatal: tool lifecycle extraction is best-effort */ }
238
- // delta: compare last AI message string
239
- try {
240
- const lastAi = messages
241
- .slice()
242
- .reverse()
243
- .find((m) => m?.constructor?.name === 'AIMessage');
244
- const content = lastAi?.content;
245
- const text = typeof content === 'string' ? content : '';
246
- const messageId = lastAi?.additional_kwargs?.id || lastAi?.id || 'ai';
247
- if (messageId !== this.lastAiMessageId) {
248
- this.lastAiMessageId = messageId;
249
- this.lastAiText = '';
250
- }
251
- if (text.length > this.lastAiText.length && text.startsWith(this.lastAiText)) {
252
- const delta = text.slice(this.lastAiText.length);
253
- if (delta && delta.length > 0) {
254
- this.pushEvent(SdkEventType.MessageDelta, sid, {
255
- message_id: String(messageId),
256
- role: 'assistant',
257
- delta,
258
- });
259
- }
260
- }
261
- this.lastAiText = text;
262
- }
263
- catch { /* non-fatal: delta extraction is best-effort */ }
264
- }));
265
- // Finalization
266
- this._listenerCleanups.push(this.messageManager.addLoadingListener(async (isLoading) => {
267
- const sid = this.sessionContext.getSessionId();
268
- if (!isLoading) {
269
- try {
270
- await this.agent.finishCurrentTask(false);
271
- }
272
- catch { /* best-effort: must not block finalization */ }
273
- // AgentRunnerCore already emits final for old SDK, but we produce our own terminal sdk.final here
274
- // by reading the message manager state.
275
- try {
276
- const finalized = buildFinalResult(this.messageManager);
277
- // Check if there's an error - if so, mark as failure
278
- const currentError = this.messageManager.getError();
279
- const success = !currentError;
280
- // Runtime Zod validation of structured_output when a schema is available
281
- let validatedOutput = finalized.structured_output;
282
- let validationError;
283
- if (validatedOutput !== undefined && isZodSchema(this.runOutputZodSchema)) {
284
- try {
285
- validatedOutput = validateStructuredOutput(this.runOutputZodSchema, validatedOutput);
286
- }
287
- catch (ve) {
288
- if (ve instanceof QodoOutputValidationError) {
289
- validationError = ve.message;
290
- }
291
- else {
292
- validationError = ve instanceof Error ? ve.message : String(ve);
293
- }
294
- }
295
- }
296
- this.pushEvent(SdkEventType.Final, sid, {
297
- success: success && !validationError,
298
- ...(currentError ? { error: currentError } : {}),
299
- ...(validationError ? { error: validationError } : {}),
300
- model: this.sessionContext.getModel(),
301
- result: {
302
- ...(validatedOutput !== undefined ? { structured_output: validatedOutput } : {}),
303
- ...(finalized.final_output ? { final_output: finalized.final_output } : {}),
304
- },
305
- messages: { langchain: finalized.messagesLC, openai: finalized.messagesOpenAI },
306
- meta: {
307
- tools_auto_approved: this.options.autoApproveTools !== false,
308
- subagents_used: finalized.subagentsUsed,
309
- ...(this.sessionContext.isDryRun() ? { dry_run: true } : {}),
310
- ...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })(),
311
- },
312
- });
313
- this.done = true;
314
- }
315
- catch (e) {
316
- this.pushEvent(SdkEventType.Error, sid, { message: e?.message || 'Failed to finalize' });
317
- this.pushEvent(SdkEventType.Final, sid, {
318
- success: false,
319
- error: e?.message || 'Failed to finalize',
320
- model: this.sessionContext.getModel(),
321
- result: {},
322
- messages: { langchain: [], openai: [] },
323
- meta: { tools_auto_approved: this.options.autoApproveTools !== false, subagents_used: false, ...(this.sessionContext.isDryRun() ? { dry_run: true } : {}), ...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
324
- });
325
- this.done = true;
326
- }
327
- }
328
- }));
329
- this._listenerCleanups.push(this.messageManager.addErrorListener(async (error) => {
330
- if (!error)
331
- return;
332
- const sid = this.sessionContext.getSessionId();
333
- this.pushEvent(SdkEventType.Error, sid, { message: error });
334
- try {
335
- await this.agent.finishCurrentTask(true);
336
- }
337
- catch { /* best-effort: must not block error handling */ }
338
- }));
339
- // Protocol-v2 transport lifecycle: surface reconnect, reconcile, and stall
340
- // events through the SDK envelope stream. Consumers that only read these
341
- // envelopes (no direct WebSocketClient access) can still distinguish a
342
- // transient reconnect from a hard stall and respond appropriately.
343
- const unsubscribeTransport = this.agent.onTransportEvent({
344
- reconnecting: ({ attempt }) => {
345
- const sid = this.sessionContext.getSessionId();
346
- this.pushEvent(SdkEventType.Reconnecting, sid, { attempt });
347
- },
348
- reconnected: ({ downtime_ms }) => {
349
- const sid = this.sessionContext.getSessionId();
350
- this.pushEvent(SdkEventType.Reconnected, sid, { ...(typeof downtime_ms === 'number' ? { downtime_ms } : {}) });
351
- },
352
- resumeAck: ({ current_checkpoint, last_consumed_turn_id, awaiting, outbox_size }) => {
353
- const sid = this.sessionContext.getSessionId();
354
- this.pushEvent(SdkEventType.ResumeReconciled, sid, {
355
- ...(current_checkpoint ? { current_checkpoint } : {}),
356
- ...(last_consumed_turn_id ? { last_consumed_turn_id } : {}),
357
- awaiting,
358
- outbox_size,
359
- });
360
- },
361
- reconcileFailed: ({ reason, awaiting }) => {
362
- const sid = this.sessionContext.getSessionId();
363
- this.pushEvent(SdkEventType.ReconcileFailed, sid, {
364
- reason,
365
- ...(awaiting ? { awaiting } : {}),
366
- });
367
- },
368
- stallDetected: ({ stage, outboxSize }) => {
369
- const sid = this.sessionContext.getSessionId();
370
- this.pushEvent(SdkEventType.StallDetected, sid, {
371
- stage,
372
- outbox_size: outboxSize,
373
- });
374
- },
375
- });
376
- this._listenerCleanups.push(unsubscribeTransport);
377
- }
378
- pushEvent(type, sessionId, data, opts) {
379
- const evt = createSdkEvent({
380
- type,
381
- run_id: this.runId,
382
- seq: ++this.seq,
383
- session_id: sessionId,
384
- data,
385
- ...(opts?.request_id ? { request_id: opts.request_id } : {}),
386
- elapsed_ms: this.runStartMs ? Date.now() - this.runStartMs : undefined,
387
- });
388
- if (this.pendingResolvers.length > 0) {
389
- const resolve = this.pendingResolvers.shift();
390
- resolve({ value: evt, done: false });
391
- }
392
- else {
393
- this.eventQueue.push(evt);
394
- }
395
- }
396
- async ensureInitialized(desiredCommandName) {
397
- if (this.initialized) {
398
- // Return previously computed summary; best-effort fallback.
399
- if (this.lastInitMeta)
400
- return this.lastInitMeta;
401
- return { commandName: '', promptMode: false, projectPath: this.options.projectPath ? canonicalizePathSync(this.options.projectPath) : canonicalizePathSync(process.cwd()), agentSource: { source: 'default' } };
402
- }
403
- // Create environment-scoped auth provider
404
- const authProvider = new AuthProvider(this.options.apiKey);
405
- this.env.authProvider = authProvider;
406
- // Create environment-scoped ToolProcessorManager and register user middleware
407
- const tpm = new ToolProcessorManager();
408
- if (this.options.toolMiddleware) {
409
- for (const mw of this.options.toolMiddleware) {
410
- tpm.addMiddleware(mw);
411
- }
412
- }
413
- this.env.toolProcessorManager = tpm;
414
- // Init backend get-things (supports baseUrl override)
415
- const bootstrap = new BackendBootstrap({ baseUrlOverride: this.options?.backend?.baseUrl });
416
- await bootstrap.init();
417
- const flags = {
418
- ...(this.options.flags || {}),
419
- sdk: true,
420
- ...(this.options.debug ? { debug: true } : {}),
421
- ...(this.options.interactiveMode !== undefined ? { interactiveMode: this.options.interactiveMode } : {}),
422
- };
423
- if (this.options.model)
424
- flags.model = this.options.model;
425
- // Resolve effective cwd first (used for agent discovery and tool defaults)
426
- const explicitProjectPath = this.options.projectPath ? canonicalizePathSync(this.options.projectPath) : undefined;
427
- // Only fallback to process.cwd() here - the single source of truth
428
- const effectiveCwd = explicitProjectPath || canonicalizePathSync(process.cwd());
429
- // SDK-first agent resolution:
430
- // 1) agentObject / agentContent / explicit agentFile
431
- // 2) auto-discover agent.toml|yaml|yml from cwd
432
- // 3) fallback to built-in minimal config
433
- let configInput = this.options.agentObject ?? this.options.agentContent ?? this.options.agentFile;
434
- let isFileContent = !!this.options.agentContent || !!this.options.agentObject;
435
- let agentSource = { source: 'file' };
436
- if (this.options.agentObject)
437
- agentSource = { source: 'object' };
438
- else if (this.options.agentContent)
439
- agentSource = { source: 'content' };
440
- else if (this.options.agentFile)
441
- agentSource = { source: 'file', path: String(this.options.agentFile) };
442
- if (!configInput) {
443
- const discovered = await findNearestAgentConfig(effectiveCwd);
444
- if (discovered) {
445
- configInput = discovered;
446
- isFileContent = false;
447
- agentSource = { source: 'discovered', path: discovered };
448
- }
449
- else {
450
- configInput = buildDefaultSdkAgentConfig();
451
- isFileContent = true;
452
- agentSource = { source: 'default' };
453
- }
454
- }
455
- const configManager = await ConfigManager.init(configInput, isFileContent);
456
- // Resolve command or mode
457
- let modeCommand;
458
- if (flags.mode) {
459
- modeCommand = configManager.resolveModeAsCommand(flags.mode);
460
- }
461
- // Determine whether the caller passed a command name or a free-form prompt.
462
- // SDK should be "prompt-first": if the provided string is not a known command,
463
- // we still build a command config via getCommandConfig(prompt) (which returns
464
- // a default config inheriting top-level model/tools) and treat the string as
465
- // user prompt.
466
- const allCommands = configManager.listCommands();
467
- const desiredIsCommand = !!(desiredCommandName && allCommands.includes(desiredCommandName));
468
- // If the user provided a command name but there are no commands configured,
469
- // we treat it as a prompt (prompt-first behavior). We also synthesize an
470
- // internal default command config so execution can proceed.
471
- const hasAnyCommands = allCommands.length > 0;
472
- // Choose command:
473
- // 1) mode (explicit)
474
- // 2) if desired name is a known command -> use that command
475
- // 3) else if a non-empty prompt was provided -> treat as prompt and build a default command config
476
- // 4) else if commands exist -> fallback to flags.command or a single command
477
- // 5) else (no commands) -> synthesize default command
478
- let command;
479
- let cmdName = typeof flags.command === 'string' ? flags.command : configManager.getSingleCommand() || '';
480
- let promptMode = false;
481
- if (flags.mode) {
482
- command = modeCommand;
483
- cmdName = flags.mode;
484
- }
485
- else if (desiredIsCommand) {
486
- cmdName = desiredCommandName;
487
- command = configManager.getCommandConfig(cmdName);
488
- }
489
- else if (desiredCommandName && String(desiredCommandName).trim().length > 0) {
490
- cmdName = ''; // prompt flow
491
- promptMode = true;
492
- command = configManager.getCommandConfig(desiredCommandName);
493
- }
494
- else if (hasAnyCommands) {
495
- command = configManager.getCommandConfig(cmdName);
496
- }
497
- else {
498
- // No commands exist: synthesize a default command that inherits top-level
499
- // model/tools/mcpServers/etc. Prompt() uses this path.
500
- cmdName = '';
501
- promptMode = true;
502
- command = configManager.getCommandConfig('');
503
- }
504
- // Tool allow/deny flags
505
- if (flags.tools) {
506
- command.available_tools = Array.isArray(flags.tools) ? flags.tools : String(flags.tools).split(',').map((s) => s.trim());
507
- }
508
- if (flags.noTools) {
509
- command.ignore_tools = Array.isArray(flags.noTools) ? flags.noTools : String(flags.noTools).split(',').map((s) => s.trim());
510
- }
511
- // MCP servers
512
- const serverRegistry = ServerRegistry.init(this.options.mcpFile);
513
- const mcpServers = {
514
- ...configManager.getMCPServers(),
515
- ...(command?.mcpServers || {}),
516
- ...(this.options.mcpServers || {}),
517
- };
518
- const disableMcp = command.disable_mcp === true || configManager.getRawConfig()?.disable_mcp === true;
519
- if (!disableMcp) {
520
- serverRegistry.setTomlMCPConfigs(mcpServers);
521
- }
522
- const generalInstructions = configManager.getGeneralInstructions();
523
- const systemPrompt = configManager.getSystemPrompt();
524
- this.sessionContext = await SessionContext.newSessionContext(flags, command, generalInstructions, systemPrompt, undefined, flags.sid);
525
- // Determine effective working directory
526
- // Prefer the earlier effectiveCwd we already computed for agent discovery.
527
- const effectiveCwd2 = effectiveCwd;
528
- try {
529
- this.sessionContext.setExecutionCwd?.(effectiveCwd2);
530
- }
531
- catch { /* best-effort: method may not exist */ }
532
- const roots = [effectiveCwd2, ...((this.options.additionalPaths || []).map((r) => canonicalizePathSync(r)))];
533
- try {
534
- await this.sessionContext.setAccessiblePaths(roots);
535
- }
536
- catch { /* best-effort: accessible paths are non-critical */ }
537
- if (!disableMcp) {
538
- await mcpInitialization();
539
- }
540
- // Prefetch context summaries from other sessions (equivalent to CLI --with)
541
- if (this.options.contextSessionIds && this.options.contextSessionIds.length > 0) {
542
- try {
543
- const agentTmp = new AgentAPI(this.sessionContext);
544
- const { computeNextTaskFocus } = await import('../context/taskFocus.js');
545
- const taskFocus = computeNextTaskFocus(command.instructions, '', extractSetFlags(flags));
546
- const summaries = await agentTmp.tryPrefetchSummarization(this.options.contextSessionIds, taskFocus);
547
- for (const [sid, summary] of Object.entries(summaries)) {
548
- this.sessionContext.addPreviousSessionSummarization(sid, summary);
549
- }
550
- }
551
- catch { /* best-effort: context prefetch failure should not block run */ }
552
- }
553
- // Per-client message manager and agent
554
- this.messageManager = new MessageManager();
555
- this.agent = new AgentAPI(this.sessionContext);
556
- const backend = ServerData.getInstance();
557
- this.pushEvent(SdkEventType.Init, this.sessionContext.getSessionId(), {
558
- sdk_version: getSdkVersion(),
559
- protocol: 'qodo.sdk.v2',
560
- pid: process.pid,
561
- backend: {
562
- base_url: backend.getBaseUrl(),
563
- source: backend.getBaseUrlSource(),
564
- },
565
- model: this.sessionContext.getModel(),
566
- });
567
- this.setupEventListeners();
568
- this.core = new AgentRunnerCore(this.sessionContext, this.messageManager, this.agent,
569
- // No-op emit: we emit via message manager listeners
570
- () => { }, this.options.autoApproveTools !== false);
571
- this.initialized = true;
572
- this.lastInitMeta = {
573
- commandName: cmdName,
574
- promptMode,
575
- projectPath: effectiveCwd2,
576
- agentSource,
577
- };
578
- return this.lastInitMeta;
579
- }
580
- async maybeApproveTool(req) {
581
- const { sid, tool_call_id } = req;
582
- if (this.toolApprovalEmitted.has(tool_call_id) || this.toolApprovalInFlight.has(tool_call_id)) {
583
- return;
584
- }
585
- this.toolApprovalInFlight.add(tool_call_id);
586
- let approved = this.options.autoApproveTools !== false;
587
- let reason = undefined;
588
- if (this.options.autoApproveTools === false) {
589
- if (this.options.toolApproval) {
590
- try {
591
- const res = await this.options.toolApproval({
592
- tool_call_id: req.tool_call_id,
593
- server_name: req.server_name,
594
- tool_name: req.tool_name,
595
- tool_args: req.tool_args,
596
- reasoning: req.reasoning,
597
- });
598
- approved = !!res;
599
- if (!approved)
600
- reason = 'Declined by toolApproval callback';
601
- }
602
- catch (e) {
603
- approved = false;
604
- reason = e?.message || 'toolApproval callback threw';
605
- }
606
- }
607
- else {
608
- approved = false;
609
- reason = 'Auto-approval disabled and no toolApproval callback provided';
610
- }
611
- }
612
- // Emit decision
613
- this.pushEvent(SdkEventType.ToolApproved, sid, {
614
- tool_call_id,
615
- approved,
616
- ...(approved ? {} : { reason }),
617
- });
618
- this.toolApprovalEmitted.add(tool_call_id);
619
- // IMPORTANT: respond to backend so the run can continue.
620
- try {
621
- await this.agent.toolApproval(tool_call_id, approved);
622
- }
623
- catch (e) {
624
- // Surface approval send failures as sdk.error but do not crash the stream.
625
- this.pushEvent(SdkEventType.Error, sid, {
626
- message: `Failed to submit tool approval for ${tool_call_id}`,
627
- cause: e?.message || e,
628
- });
629
- }
630
- finally {
631
- this.toolApprovalInFlight.delete(tool_call_id);
632
- }
633
- }
634
- extractToolLifecycleFromLangChain(lcMessages, sid) {
635
- for (const msg of lcMessages) {
636
- const type = msg?.type;
637
- const data = msg?.data;
638
- if (!type || !data)
639
- continue;
640
- // Tool request is represented as AI message with tool_calls
641
- if (type === 'ai' && Array.isArray(data.tool_calls) && data.tool_calls.length > 0) {
642
- // Determine pending approval from additional_kwargs
643
- const pendingApproval = !!data.additional_kwargs?.pending_approval;
644
- const serverName = data.additional_kwargs?.server_name || 'unknown';
645
- for (const call of data.tool_calls) {
646
- const toolCallId = String(call?.id || data.id || 'unknown');
647
- const toolName = String(call?.name || 'unknown');
648
- const serverStr = String(serverName);
649
- // Record mapping for later sdk.tool.executed
650
- if (toolCallId && toolCallId !== 'unknown') {
651
- this.toolRegistry.set(toolCallId, { server_name: serverStr, tool_name: toolName });
652
- }
653
- // Emit tool.requested once per tool_call_id
654
- if (!this.toolRequestedEmitted.has(toolCallId)) {
655
- this.pushEvent(SdkEventType.ToolRequested, sid, {
656
- tool_call_id: toolCallId,
657
- server_name: serverStr,
658
- tool_name: toolName,
659
- tool_args: call?.args,
660
- reasoning: typeof data.content === 'string' ? data.content : undefined,
661
- pending_approval: pendingApproval,
662
- });
663
- this.toolRequestedEmitted.add(toolCallId);
664
- }
665
- // Approval handling
666
- if (!this.toolApprovalEmitted.has(toolCallId)) {
667
- if (pendingApproval) {
668
- // Approval required: decide and respond via AgentAPI.toolApproval
669
- void this.maybeApproveTool({
670
- sid,
671
- tool_call_id: toolCallId,
672
- server_name: serverStr,
673
- tool_name: toolName,
674
- tool_args: call?.args,
675
- reasoning: typeof data.content === 'string' ? data.content : undefined,
676
- });
677
- }
678
- else {
679
- // No approval required (auto-approved / read-only)
680
- this.pushEvent(SdkEventType.ToolApproved, sid, {
681
- tool_call_id: toolCallId,
682
- approved: true,
683
- });
684
- this.toolApprovalEmitted.add(toolCallId);
685
- }
686
- }
687
- }
688
- }
689
- // Tool execution result is represented as ToolMessage
690
- if (type === 'tool') {
691
- const toolCallId = String(data.tool_call_id || data.id || 'unknown');
692
- if (!this.toolExecutedEmitted.has(toolCallId)) {
693
- const serverName = String(data.additional_kwargs?.server_name || this.toolRegistry.get(toolCallId)?.server_name || 'unknown');
694
- const toolName = String(this.toolRegistry.get(toolCallId)?.tool_name || 'unknown');
695
- const status = data.status;
696
- const dryRun = !!(this.sessionContext?.isDryRun?.());
697
- this.pushEvent(SdkEventType.ToolExecuted, sid, {
698
- tool_call_id: toolCallId,
699
- server_name: serverName,
700
- tool_name: toolName,
701
- result: {
702
- isError: status === 'error',
703
- content: data.content,
704
- raw: data,
705
- },
706
- ...(dryRun ? { dry_run: true } : {}),
707
- });
708
- this.toolExecutedEmitted.add(toolCallId);
709
- }
710
- }
711
- }
712
- }
713
- async *stream(commandOrPrompt, options) {
714
- if (this.activeRuns > 0) {
715
- // Initialized parents fork() to share warm MCP connections
716
- const delegated = this.initialized ? await this.fork() : new QodoSDK(this.options);
717
- try {
718
- yield* delegated.stream(commandOrPrompt, options);
719
- }
720
- finally {
721
- try {
722
- await delegated.dispose();
723
- }
724
- catch { /* cleanup: dispose must not throw in finally */ }
725
- }
726
- return;
727
- }
728
- this.activeRuns++;
729
- try {
730
- this.done = false;
731
- this.eventQueue = [];
732
- this.pendingResolvers = [];
733
- this.lastAiText = '';
734
- this.lastAiMessageId = '';
735
- this.toolRequestedEmitted.clear();
736
- this.toolApprovalEmitted.clear();
737
- this.toolApprovalInFlight.clear();
738
- this.toolExecutedEmitted.clear();
739
- this.toolRegistry.clear();
740
- this.runOutputZodSchema = undefined;
741
- // Initialize per-run metadata
742
- this.runId = uuid();
743
- this.seq = 0;
744
- this.runStartMs = Date.now();
745
- const env = this.env;
746
- const self = this;
747
- async function* inner() {
748
- // If already initialized and user passed a different command name, reinit (same behavior as old QodoClient)
749
- if (self.initialized) {
750
- try {
751
- const cm = ConfigManager.getInstance();
752
- const cmds = cm.listCommands();
753
- const isCommand = commandOrPrompt && cmds.includes(commandOrPrompt);
754
- if (isCommand) {
755
- const currentName = (self.sessionContext?.getCommand()?.name) || '';
756
- if (commandOrPrompt !== currentName) {
757
- await self.dispose();
758
- }
759
- }
760
- }
761
- catch { /* best-effort: reinit check should not block new run */ }
762
- }
763
- let initMeta = null;
764
- let initFailed = false;
765
- try {
766
- initMeta = await self.ensureInitialized(commandOrPrompt);
767
- }
768
- catch (e) {
769
- initFailed = true;
770
- // Event-first: initialization errors should produce sdk.error + sdk.final
771
- const sid = '';
772
- self.pushEvent(SdkEventType.Error, sid, {
773
- message: e?.message || String(e),
774
- cause: e?.cause || e,
775
- });
776
- self.pushEvent(SdkEventType.Final, sid, {
777
- success: false,
778
- error: e?.message || String(e),
779
- model: self.options.model || '',
780
- result: {},
781
- messages: { langchain: [], openai: [] },
782
- meta: { tools_auto_approved: self.options.autoApproveTools !== false, subagents_used: false, ...(options?.dryRun ? { dry_run: true } : {}), ...(() => { const _ee = self.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
783
- });
784
- // Do NOT return here – we still want to drain the queued events below.
785
- }
786
- if (!initFailed) {
787
- // Thread per-run dryRun flag into session context
788
- const isDryRun = !!(options?.dryRun);
789
- try {
790
- self.sessionContext.getFlags().dryRun = isDryRun;
791
- }
792
- catch { /* best-effort: dryRun flag threading is non-critical */ }
793
- // Emit run.started
794
- try {
795
- const sid = self.sessionContext.getSessionId();
796
- self.pushEvent(SdkEventType.RunStarted, sid, {
797
- session_id: sid,
798
- command: initMeta.commandName,
799
- prompt_mode: initMeta.promptMode,
800
- cwd: initMeta.projectPath,
801
- agent: initMeta.agentSource,
802
- tools_auto_approved: self.options.autoApproveTools !== false,
803
- dry_run: isDryRun,
804
- });
805
- }
806
- catch { /* non-fatal: run.started event emission is best-effort */ }
807
- }
808
- const extra = options?.extraInstructions || '';
809
- const args = options?.args || {};
810
- // Prompt-first behavior:
811
- // - If commandOrPrompt matches a configured command name -> run that command.
812
- // - Otherwise treat it as a free-form prompt and pass it as extraInstructions.
813
- let prompt;
814
- let promptExtra;
815
- try {
816
- const cm = ConfigManager.getInstance();
817
- const cmds = cm.listCommands();
818
- if (commandOrPrompt && cmds.includes(commandOrPrompt)) {
819
- prompt = commandOrPrompt;
820
- promptExtra = extra;
821
- }
822
- else {
823
- prompt = '';
824
- promptExtra = commandOrPrompt ? `${commandOrPrompt}${extra ? ` ${extra}` : ''}` : extra;
825
- }
826
- }
827
- catch {
828
- prompt = '';
829
- promptExtra = commandOrPrompt ? `${commandOrPrompt}${extra ? ` ${extra}` : ''}` : extra;
830
- }
831
- // Inject dry-run playbook into the prompt so the agent understands
832
- // that tool results are simulated and adapts its behaviour.
833
- if (options?.dryRun) {
834
- const dryRunPlaybook = [
835
- '',
836
- '--- DRY RUN MODE ---',
837
- 'This run is executing in dry-run mode. Important rules:',
838
- '1. Every tool call you make will be intercepted. You will receive simulated (mock) responses marked with "[DRY RUN]".',
839
- '2. Treat simulated results as plausible placeholders — reason about them as if they were real data.',
840
- '3. Continue your analysis normally. Describe what actions you would take and what results you would expect.',
841
- '4. Do NOT tell the user that tools are unavailable or that you cannot access the filesystem. Tools are working — their results are simply simulated.',
842
- '5. In your final answer, clearly summarize the plan of actions you would execute in a real run, including which tools you called and why.',
843
- '--- END DRY RUN MODE ---',
844
- '',
845
- ].join('\n');
846
- promptExtra = promptExtra ? `${promptExtra}\n${dryRunPlaybook}` : dryRunPlaybook;
847
- }
848
- if (!initFailed) {
849
- try {
850
- // If the command was built with sdkCommand({ args: <zod schema> }), validate args here.
851
- // This keeps v2 behavior strict and provides actionable errors.
852
- try {
853
- const cmdAny = self.sessionContext?.getCommand?.();
854
- const schema = cmdAny?.__sdk?.argsSchema;
855
- if (schema) {
856
- const { parseArgsWithSchema } = await import('./schemas.js');
857
- parseArgsWithSchema(schema, args);
858
- }
859
- }
860
- catch (e) {
861
- throw e;
862
- }
863
- // Resolve Zod schema for runtime validation of structured_output.
864
- // Priority: options.outputSchema (if Zod) > command.__sdk.outputSchema
865
- if (options?.outputSchema && isZodSchema(options.outputSchema)) {
866
- self.runOutputZodSchema = options.outputSchema;
867
- }
868
- else {
869
- const cmdSdk = self.sessionContext?.getCommand?.();
870
- const cmdZod = cmdSdk?.__sdk?.outputSchema;
871
- if (cmdZod && isZodSchema(cmdZod)) {
872
- self.runOutputZodSchema = cmdZod;
873
- }
874
- }
875
- await self.core.start(prompt, promptExtra, args, options?.outputSchema);
876
- }
877
- catch (e) {
878
- const sid = self.sessionContext?.getSessionId() || '';
879
- self.pushEvent(SdkEventType.Error, sid, { message: e?.message || String(e) });
880
- self.pushEvent(SdkEventType.Final, sid, {
881
- success: false,
882
- error: e?.message || String(e),
883
- model: self.sessionContext?.getModel() || '',
884
- result: {},
885
- messages: { langchain: [], openai: [] },
886
- meta: { tools_auto_approved: self.options.autoApproveTools !== false, subagents_used: false, ...(options?.dryRun ? { dry_run: true } : {}), ...(() => { const _ee = self.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })() },
887
- });
888
- // Do not set done=true here; allow the event drain loop to see sdk.final and terminate.
889
- }
890
- }
891
- while (true) {
892
- if (self.eventQueue.length > 0) {
893
- const ev = self.eventQueue.shift();
894
- // SDK default: keep internal logs muted for the entire stream.
895
- // (Consumers can still write to stdout directly if they need streaming output.)
896
- yield ev;
897
- if (ev.type === SdkEventType.Final) {
898
- self.done = true;
899
- // drain
900
- while (self.eventQueue.length > 0) {
901
- const drained = self.eventQueue.shift();
902
- yield drained;
903
- }
904
- break;
905
- }
906
- }
907
- else {
908
- const next = await new Promise((resolve) => {
909
- self.pendingResolvers.push((res) => {
910
- if (res.done)
911
- resolve(null);
912
- else
913
- resolve(res.value);
914
- });
915
- if (self.eventQueue.length > 0) {
916
- const ev = self.eventQueue.shift();
917
- const r = self.pendingResolvers.shift();
918
- if (r)
919
- r({ value: ev, done: false });
920
- }
921
- });
922
- if (next) {
923
- yield next;
924
- if (next.type === SdkEventType.Final) {
925
- self.done = true;
926
- while (self.eventQueue.length > 0) {
927
- const drained = self.eventQueue.shift();
928
- yield drained;
929
- }
930
- break;
931
- }
932
- }
933
- }
934
- // Only terminate once we've yielded sdk.final and there are no queued events left.
935
- // (self.done may flip to true from internal listeners before sdk.final is drained.)
936
- if (self.done && self.eventQueue.length === 0)
937
- break;
938
- }
939
- }
940
- // Set up execution timeout if specified
941
- let timeoutTimer;
942
- if (options?.timeout && options.timeout > 0) {
943
- const timeoutMs = options.timeout;
944
- timeoutTimer = setTimeout(() => {
945
- const sid = this.sessionContext?.getSessionId?.() || '';
946
- try {
947
- this.cancel();
948
- }
949
- catch { /* best-effort: cancel must not prevent timeout event emission */ }
950
- this.pushEvent(SdkEventType.Error, sid, {
951
- message: `Execution timed out after ${timeoutMs}ms`,
952
- });
953
- this.pushEvent(SdkEventType.Final, sid, {
954
- success: false,
955
- error: `Execution timed out after ${timeoutMs}ms`,
956
- model: this.sessionContext?.getModel?.() || '',
957
- result: {},
958
- messages: { langchain: [], openai: [] },
959
- meta: {
960
- tools_auto_approved: this.options.autoApproveTools !== false,
961
- subagents_used: false,
962
- timed_out: true,
963
- ...(options?.dryRun ? { dry_run: true } : {}),
964
- ...(() => { const _ee = this.sessionContext?.getCommand?.()?.exit_expression; return _ee ? { exit_expression: _ee } : {}; })(),
965
- },
966
- });
967
- }, timeoutMs);
968
- // Prevent the timer from keeping the process alive
969
- if (typeof timeoutTimer === 'object' && 'unref' in timeoutTimer) {
970
- timeoutTimer.unref();
971
- }
972
- }
973
- try {
974
- const innerGen = inner();
975
- while (true) {
976
- const { value, done } = await runWithEnvironment(env, () => innerGen.next());
977
- if (done)
978
- return;
979
- yield value;
980
- }
981
- }
982
- finally {
983
- if (timeoutTimer !== undefined)
984
- clearTimeout(timeoutTimer);
985
- }
986
- }
987
- finally {
988
- this.activeRuns = Math.max(0, this.activeRuns - 1);
989
- }
990
- }
991
- async run(commandOrPrompt, options) {
992
- const maxRetries = options?.maxRetries ?? 0;
993
- let lastFinal = null;
994
- for (let attempt = 0; attempt <= maxRetries; attempt++) {
995
- lastFinal = null;
996
- // On retry attempts, create a fresh SDK instance to get a clean session
997
- if (attempt > 0) {
998
- try {
999
- await this.dispose();
1000
- }
1001
- catch { /* cleanup: dispose must not throw between retries */ }
1002
- }
1003
- // Strip maxRetries from inner options to prevent recursive retry
1004
- const innerOpts = maxRetries > 0
1005
- ? { ...options, maxRetries: 0 }
1006
- : options;
1007
- for await (const ev of this.stream(commandOrPrompt, innerOpts)) {
1008
- if (ev.type === SdkEventType.Final)
1009
- lastFinal = ev.data;
1010
- }
1011
- await new Promise((r) => setTimeout(r, 10));
1012
- // If successful, return immediately
1013
- if (lastFinal?.success) {
1014
- return lastFinal;
1015
- }
1016
- // If retries remain, loop; otherwise return the last failure
1017
- if (attempt < maxRetries) {
1018
- this.logger.info(`[retry] Attempt ${attempt + 1} failed, retrying (${maxRetries - attempt - 1} retries remaining)...`);
1019
- }
1020
- }
1021
- return lastFinal;
1022
- }
1023
- /**
1024
- * SDK-first friendly API: treat input as a free-form prompt (never a command name).
1025
- */
1026
- prompt(text, options) {
1027
- const extraInstructions = text;
1028
- return this.run('', { ...options, extraInstructions });
1029
- }
1030
- /**
1031
- * SDK-first friendly API: stream events for a free-form prompt.
1032
- */
1033
- streamPrompt(text, options) {
1034
- const extraInstructions = text;
1035
- return this.stream('', { ...options, extraInstructions });
1036
- }
1037
- cancel() {
1038
- if (!this.initialized)
1039
- return;
1040
- this.core.cancel();
1041
- // AgentRunnerCore.cancel() aborts the agent's AbortController and drops
1042
- // the WebSocket, but nothing in that path guarantees the stream iterator
1043
- // ever produces another event. When we cancel during a mid-turn wait
1044
- // (e.g. the Slack bot's inactivity timer fires because a ToolRequested
1045
- // was lost in a reconnect), the iterator is blocked on a
1046
- // ``pendingResolvers`` promise that would otherwise never resolve —
1047
- // ``for await`` hangs, no final update is written back to the caller,
1048
- // and the user-visible status message freezes at the last delta.
1049
- //
1050
- // Emit a synthetic Error + Final pair so the iterator drains cleanly.
1051
- // Guarded by ``!this.done`` so a real Final arriving just before cancel
1052
- // doesn't get clobbered.
1053
- if (!this.done) {
1054
- const sid = this.sessionContext?.getSessionId?.() || '';
1055
- this.pushEvent(SdkEventType.Error, sid, { message: 'Cancelled' });
1056
- this.pushEvent(SdkEventType.Final, sid, {
1057
- success: false,
1058
- error: 'Cancelled',
1059
- model: this.options.model || '',
1060
- result: {},
1061
- messages: { langchain: [], openai: [] },
1062
- meta: {
1063
- tools_auto_approved: this.options.autoApproveTools !== false,
1064
- subagents_used: false,
1065
- timed_out: true,
1066
- },
1067
- });
1068
- }
1069
- }
1070
- async dispose() {
1071
- if (!this.initialized) {
1072
- return;
1073
- }
1074
- const env = this.env;
1075
- await runWithEnvironment(env, async () => {
1076
- try {
1077
- // Remove event listeners FIRST to prevent stale callbacks during core teardown
1078
- for (const cleanup of this._listenerCleanups) {
1079
- try {
1080
- cleanup();
1081
- }
1082
- catch { /* cleanup must not throw */ }
1083
- }
1084
- this._listenerCleanups = [];
1085
- await this.core.dispose();
1086
- try {
1087
- this.agent.cleanup?.();
1088
- }
1089
- catch { /* cleanup: agent teardown must not throw */ }
1090
- // Forks share the parent's MCP — only the parent should tear it down.
1091
- if (!this.isFork) {
1092
- if (this._activeForkCount > 0) {
1093
- this.logger.warn(`[sdk] dispose() called while ${this._activeForkCount} fork(s) are still active. Fork operations may fail.`);
1094
- }
1095
- try {
1096
- const { MCPManager } = await import('../mcp/MCPManager.js');
1097
- try {
1098
- await MCPManager.getInstance().dispose();
1099
- }
1100
- catch { /* cleanup: MCP dispose must not throw */ }
1101
- }
1102
- catch { /* cleanup: MCP import may fail if never initialized */ }
1103
- }
1104
- else if (this._forkParent) {
1105
- this._forkParent._activeForkCount = Math.max(0, this._forkParent._activeForkCount - 1);
1106
- this._forkParent = undefined; // break reference to allow GC and prevent double-decrement
1107
- }
1108
- }
1109
- finally {
1110
- this.initialized = false;
1111
- }
1112
- });
1113
- }
1114
- }
1115
- //# sourceMappingURL=QodoSDK.js.map