@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
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Bind step — walks `agent.tools[]` (or every agent's `tools[]` in a
3
+ * graph) at `tasks.startWithAgent` / `tasks.startWithGraph` time,
4
+ * extracts any `defineFunctionTool` handler bags, and installs a single
5
+ * primary `onRequest` handler on the supplied `ToolClient` that
6
+ * dispatches inbound `tool.request` calls by `name` to the right
7
+ * handler.
8
+ *
9
+ * Idempotency: calling the bind step repeatedly with the same tools is
10
+ * cheap — the underlying handler-table is a Map keyed by tool name, so
11
+ * re-binding overrides in-place. The single `onRequest` subscription
12
+ * is attached lazily the first time any handler is registered and
13
+ * stays attached for the lifetime of the client; subsequent task
14
+ * starts only mutate the table.
15
+ *
16
+ * Attachment mode — **fallback, not primary**. The router installs via
17
+ * `ToolClient._attachFallbackHandler(...)`, not the public
18
+ * `onRequest(...)`. Two reasons:
19
+ *
20
+ * 1. **Deterministic-deny preservation.** The dispatcher's
21
+ * "zero-primary-handlers → emit denied" path keys off
22
+ * `this.handlers.length === 0`. Installing the router as a
23
+ * primary handler would defeat that fallback whenever the
24
+ * consumer hadn't also registered a manual `onRequest` —
25
+ * a batch with an unregistered tool name would return
26
+ * `undefined` from our router and then nobody would claim it,
27
+ * leaving QAR's agent loop stalled until the per-task tool-response
28
+ * timeout. As a fallback handler, our router runs AFTER the
29
+ * primary stack but does NOT count toward the
30
+ * no-primaries check, so unrecognized batches still get the
31
+ * deterministic deny.
32
+ * 2. **Consumer-explicit beats SDK-helper.** When a consumer
33
+ * registers a manual `onRequest` for tool name "X" AND defines
34
+ * `defineFunctionTool({ name: 'X' })`, the consumer's explicit
35
+ * handler wins — the primary stack always runs first.
36
+ *
37
+ * Dispatch policy:
38
+ *
39
+ * - If every call name in the inbound batch matches a registered
40
+ * function-tool handler, the router claims the batch and returns
41
+ * the positional result array. Each handler runs in isolation;
42
+ * per-call exceptions are mapped to per-call
43
+ * `outcome: 'error'` / `outcome: 'denied'` (the latter when the
44
+ * handler throws `ToolDeniedError`).
45
+ * - If ANY call in the batch has a name NOT in the table, the
46
+ * router returns `undefined`. With no other fallback claiming
47
+ * AND no primary handler, the dispatcher's deny path fires for
48
+ * the whole batch. With a primary handler present, the dispatcher
49
+ * defers (per the documented "consumer will respond later"
50
+ * semantics — primary handlers already ran first).
51
+ *
52
+ * Argument parsing: the router invokes `bag.parameters.safeParse(...)`
53
+ * on `call.arguments` before invoking the handler. Successful parse
54
+ * yields the typed output (defaults applied, transforms run);
55
+ * failures map to a per-call `outcome: 'error'` with the formatted
56
+ * Zod issue list. This matches the type contract — `handler: (args:
57
+ * z.infer<TSchema>) => ...` promises the OUTPUT type, not the wire
58
+ * INPUT type — and gives consumers the DX they expect from a Zod-
59
+ * derived helper.
60
+ */
61
+ import { getFunctionToolHandler, } from './defineFunctionTool.js';
62
+ import { resolveApproval, } from './approval.js';
63
+ import { ToolDeniedError } from '../errors.js';
64
+ /**
65
+ * Per-client registry of `defineFunctionTool` handlers. One instance
66
+ * per `QodoClient`; shared across every `tasks.startWith*` call so the
67
+ * same handler stays installed even as the consumer dispatches multiple
68
+ * tasks.
69
+ *
70
+ * Exposed as a class (not a module-level Map) so each client gets an
71
+ * isolated table — multi-client test harnesses don't see cross-talk.
72
+ */
73
+ export class FunctionToolRouter {
74
+ bags = new Map();
75
+ subscription = null;
76
+ /**
77
+ * Resolver invoked when a `requireApproval`-gated tool is about to
78
+ * dispatch. Owned by the parent `ToolClient` (consumer registers via
79
+ * `client.tools.setApprovalHandler(...)`); the router holds a
80
+ * getter so an override registered AFTER `attach()` still applies
81
+ * to subsequent inbound batches.
82
+ */
83
+ getApprovalHandler = () => {
84
+ // Lazy module import to keep the default handler off the
85
+ // bundle's eager graph (it pulls `process.stdin` references).
86
+ // Default-injected at `attach` time below.
87
+ throw new Error('FunctionToolRouter: approval handler getter not initialized — call attach() first');
88
+ };
89
+ /**
90
+ * Predicate read by {@link runOne} AFTER an approval resolves
91
+ * `approve` and BEFORE the function-tool handler is invoked. When
92
+ * the wire has died during the approval round-trip (auto-reconnect
93
+ * exhausted, `failHardAndCleanup` ran, or an explicit
94
+ * `client.disconnect()` raced the resolver), this returns `false`
95
+ * and the router synthesizes a per-call
96
+ * `outcome: 'error'` — the handler does NOT execute, so no
97
+ * real-world side effect occurs that we wouldn't be able to
98
+ * acknowledge on the wire.
99
+ *
100
+ * Defaulted to a permissive `true` so the router stays
101
+ * functionally identical before `attach()` (unit tests construct
102
+ * the router directly + drive `dispatch` without ever calling
103
+ * `attach`).
104
+ */
105
+ isConnectionLive = () => true;
106
+ /**
107
+ * Register every `defineFunctionTool`-produced entry in `tools` with
108
+ * the router. Hand-authored `FunctionToolDef` literals (no symbol
109
+ * handler attached) are skipped. Returns the number of newly
110
+ * registered names — useful for tests + breadcrumb logging.
111
+ *
112
+ * If `tools` is empty / `null` / `undefined`, the router is left
113
+ * alone — no auto-attach, no error.
114
+ */
115
+ register(tools) {
116
+ if (tools === undefined || tools === null || tools.length === 0) {
117
+ return 0;
118
+ }
119
+ let count = 0;
120
+ for (const tool of tools) {
121
+ const bag = getFunctionToolHandler(tool);
122
+ if (bag !== undefined) {
123
+ this.bags.set(bag.name, bag);
124
+ count += 1;
125
+ }
126
+ }
127
+ return count;
128
+ }
129
+ /**
130
+ * Lazy attach. The single fallback handler is registered the first
131
+ * time the router is asked to attach against a `ToolClient`; later
132
+ * calls are no-ops as long as the subscription remains live. The
133
+ * router does NOT auto-detach on `client.disconnect()` — re-binding
134
+ * after reconnect is the consumer's responsibility (the existing
135
+ * subscription becomes stale; the dispatcher's own `attachDispatcher`
136
+ * handles re-attachment).
137
+ *
138
+ * Attaches via `_attachFallbackHandler` so the dispatcher's
139
+ * deterministic-deny path stays intact for unregistered tool names
140
+ * (see the module header for rationale).
141
+ */
142
+ attach(client) {
143
+ // Always (re)bind the approval-handler getter — the consumer may
144
+ // have called `client.tools.setApprovalHandler(...)` between
145
+ // construction and the first `attach`. Capturing the function
146
+ // rather than the value lets a LATER `setApprovalHandler` still
147
+ // take effect for in-flight batches.
148
+ this.getApprovalHandler = () => client._getApprovalHandler();
149
+ // Re-bind the wire-live predicate alongside the approval handler.
150
+ // Captured as a closure so `runOne`'s post-approval gate observes
151
+ // the CURRENT connection state, not a snapshot at attach time (a
152
+ // `Connection` re-bind via `_bindConnection` re-points
153
+ // `_isConnectionLive` to the new instance transparently).
154
+ this.isConnectionLive = () => client._isConnectionLive();
155
+ if (this.subscription !== null)
156
+ return;
157
+ this.subscription = client._attachFallbackHandler((req) => this.dispatch(req));
158
+ }
159
+ /**
160
+ * Detach the underlying `onRequest` subscription. Used in tests + by
161
+ * `QodoClient.disconnect()` so a client teardown cleanly drops the
162
+ * router-installed handler.
163
+ */
164
+ detach() {
165
+ if (this.subscription !== null) {
166
+ try {
167
+ this.subscription.unsubscribe();
168
+ }
169
+ catch {
170
+ // best-effort — `onRequest`'s unsubscribe is documented as
171
+ // never throwing; the swallow exists purely so a future
172
+ // subscription-impl regression doesn't take the disconnect
173
+ // path with it.
174
+ }
175
+ this.subscription = null;
176
+ }
177
+ }
178
+ /**
179
+ * @internal — exposed for unit tests. Returns a snapshot of the
180
+ * registered tool names. Consumer code should not depend on this; it
181
+ * lives behind an underscore-prefixed name.
182
+ */
183
+ _registeredNames() {
184
+ return [...this.bags.keys()];
185
+ }
186
+ /**
187
+ * The actual dispatch handler — wired as the body of the single
188
+ * `onRequest` subscription.
189
+ *
190
+ * Returns `undefined` (fall-through) when:
191
+ *
192
+ * - The router has no handlers registered (rare — only if `attach`
193
+ * was called before any `register`).
194
+ * - Any call in the inbound batch has a name not in the table —
195
+ * defers to the next handler so mixed surfaces still work.
196
+ *
197
+ * Otherwise, invokes every handler in parallel
198
+ * (`Promise.all([...])`) and returns the positional result array.
199
+ * Exceptions per-handler are mapped to per-call response shapes.
200
+ */
201
+ dispatch = async (req) => {
202
+ if (this.bags.size === 0)
203
+ return undefined;
204
+ const { calls, node_name: nodeName } = req.payload;
205
+ // Pre-flight: every call name must be in the table, else
206
+ // return undefined and let the next handler in the stack
207
+ // claim the batch.
208
+ for (const call of calls) {
209
+ if (!this.bags.has(call.name))
210
+ return undefined;
211
+ }
212
+ const results = await Promise.all(calls.map((call) => this.runOne(this.bags.get(call.name), call, nodeName)));
213
+ return results;
214
+ };
215
+ /**
216
+ * Invoke a single handler. Catches throws and maps them to a
217
+ * per-call `ToolResponseResult`. `ToolDeniedError` becomes `outcome:
218
+ * 'denied'`; everything else becomes `outcome: 'error'`. Mirrors the
219
+ * mapping logic in `ToolClient.dispatchInner` so consumers see the
220
+ * same semantics whether they use `defineFunctionTool` or the manual
221
+ * `onRequest` surface.
222
+ */
223
+ async runOne(bag, call, nodeName) {
224
+ // Zod-parse the inbound arguments BEFORE invoking the handler so
225
+ // the handler's typed `args: z.infer<TSchema>` parameter matches
226
+ // runtime reality — defaults applied, transforms run, refinements
227
+ // validated. Parse failures (e.g., the model emitted a number
228
+ // where the schema demands a string) surface as a per-call
229
+ // `outcome: 'error'` with the formatted Zod issue list; the
230
+ // handler never runs.
231
+ //
232
+ // `safeParse` is preferred over `parse` so we don't widen the
233
+ // try/catch's failure mode. The handler's own throws still
234
+ // route through the catch below.
235
+ const parsed = bag.parameters.safeParse(call.arguments);
236
+ if (!parsed.success) {
237
+ const issues = parsed.error.issues
238
+ .map((i) => {
239
+ const path = i.path.length > 0 ? i.path.join('.') : '(root)';
240
+ return `${path}: ${i.message}`;
241
+ })
242
+ .join('; ');
243
+ return {
244
+ outcome: 'error',
245
+ error: `defineFunctionTool(${bag.name}): argument validation failed — ${issues}`,
246
+ };
247
+ }
248
+ // S4 — `requireApproval` gate. When the consumer marked the tool
249
+ // with `requireApproval`, run the consumer-registered approval
250
+ // handler BEFORE invoking the function-tool handler. A denied
251
+ // approval returns `outcome: 'denied'` without invoking the
252
+ // function-tool handler at all — the LLM sees the denial as a
253
+ // normal tool response (denial is a recoverable error, not a
254
+ // pipeline-fatal one).
255
+ //
256
+ // Approval runs AFTER Zod-parse so the approval surface sees the
257
+ // canonical args bag (defaults applied, transforms run) — keeps
258
+ // the prompt UX consistent with what the handler would actually
259
+ // receive on approve. We pass `parsed.data` as `parsedArguments`
260
+ // so `buildPrompt` renders the canonical bag.
261
+ let approvalDecision;
262
+ if (bag.approval !== undefined) {
263
+ let resolved;
264
+ try {
265
+ resolved = await resolveApproval(this.getApprovalHandler(), bag.name, bag.approval, call, nodeName, parsed.data);
266
+ }
267
+ catch (err) {
268
+ // resolveApproval itself maps handler throws to `_denial`; an
269
+ // escape here means the approval-handler getter blew up
270
+ // (e.g., the consumer's getter throws). Map to per-call
271
+ // error so one bad approval-handler can't poison the whole
272
+ // batch (the router would otherwise propagate the rejection
273
+ // up and tank dispatch).
274
+ const message = err instanceof Error ? err.message : String(err);
275
+ return { outcome: 'error', error: message };
276
+ }
277
+ if ('_denial' in resolved) {
278
+ return resolved._denial;
279
+ }
280
+ approvalDecision = resolved;
281
+ // Post-approval pre-flight: if the wire died while the resolver
282
+ // was parked (auto-reconnect exhausted, explicit `disconnect()`,
283
+ // or the owning task already `task.done`-swept
284
+ // `toolCallSessions`), the function-tool handler MUST NOT run.
285
+ // The previous behavior was to invoke the handler — its
286
+ // real-world side effect would occur (DB write, API call,
287
+ // refund, …) and the subsequent `sendResponse` would throw
288
+ // `QodoColdAddressError`, swallowed by
289
+ // `ToolClient.attachDispatcher`'s send-fallback at
290
+ // `ToolClient.ts:524-544`. The consumer had no signal that the
291
+ // side effect ran; QAR's agent loop saw a tool-response timeout
292
+ // and surfaced a generic failure. By gating here we keep
293
+ // approve→side-effect coupled to approve→response-deliverable.
294
+ //
295
+ // The synthesized `outcome: 'error'` still routes through the
296
+ // dispatcher's send path and will (correctly) be swallowed if
297
+ // the wire stays dead — but the load-bearing invariant is that
298
+ // the function-tool handler never executes. See
299
+ // `docs/sdk2/concepts/03-hitl.md` for the post-fix contract +
300
+ // consumer guidance (observe `qar.client.reconnect_failed` and
301
+ // treat any in-flight approval as "handler will not run").
302
+ if (!this.isConnectionLive()) {
303
+ return {
304
+ outcome: 'error',
305
+ error: `defineFunctionTool(${bag.name}): connection lost before approval ` +
306
+ 'resolved; function handler skipped to avoid an un-acknowledgeable side effect.',
307
+ };
308
+ }
309
+ }
310
+ // Build the per-call context AFTER approval so the `approval`
311
+ // field can be set without breaking the `readonly` contract on
312
+ // FunctionToolHandlerContext. The conditional spread keeps
313
+ // `approval` off the ctx entirely when the tool has no gate —
314
+ // consumers reading `ctx.approval` see `undefined` either way,
315
+ // but `JSON.stringify(ctx)` stays clean for the no-gate case.
316
+ const ctx = {
317
+ toolCallId: call.tool_call_id,
318
+ nodeName,
319
+ call,
320
+ ...(approvalDecision !== undefined ? { approval: approvalDecision } : {}),
321
+ };
322
+ try {
323
+ const handler = bag.handler;
324
+ // `parsed.data` is the OUTPUT type of the Zod schema — the
325
+ // same shape `z.infer<TSchema>` declares at the type level.
326
+ const raw = await handler(parsed.data, ctx);
327
+ return coerceHandlerReturn(raw);
328
+ }
329
+ catch (err) {
330
+ if (err instanceof ToolDeniedError) {
331
+ return { outcome: 'denied', error: err.message };
332
+ }
333
+ const message = err instanceof Error ? err.message : String(err);
334
+ return { outcome: 'error', error: message };
335
+ }
336
+ }
337
+ }
338
+ /**
339
+ * Normalize a handler return into the SDK's `ToolResponseResult`
340
+ * discriminated-union shape. Plain `JsonObject` returns are wrapped in
341
+ * `{ outcome: 'success', result }`; `ToolResponseResult` literals pass
342
+ * through. Anything else throws — the wire validator rejects malformed
343
+ * responses and we'd rather fail at the handler than ship garbage.
344
+ */
345
+ function coerceHandlerReturn(raw) {
346
+ if (raw === null || typeof raw !== 'object') {
347
+ throw new TypeError('defineFunctionTool: handler must return a JsonObject or ToolResponseResult.');
348
+ }
349
+ const maybeResult = raw;
350
+ if (typeof maybeResult.outcome === 'string') {
351
+ // Looks like a ToolResponseResult literal — pass through. The
352
+ // dispatcher's `isValidToolResponseResult` runtime guard re-checks
353
+ // the shape on the wire boundary, so we don't duplicate the
354
+ // validation here.
355
+ return raw;
356
+ }
357
+ // Plain JsonObject — wrap.
358
+ return { outcome: 'success', result: raw };
359
+ }
360
+ //# sourceMappingURL=bindFunctionToolDefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindFunctionToolDefs.js","sourceRoot":"","sources":["../../../src/client/tools/bindFunctionToolDefs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * `defineFunctionTool(opts)` — Zod-schema → OpenAI function-tool helper.
3
+ *
4
+ * Closes the parity gap identified by the 2026-05-21 ADK comparison
5
+ * (see `docs/sdk2/research/2026-05-21-google-adk-vs-qodo-ts-sdk.md`,
6
+ * Opportunity 4 — auto-derive JSON Schema from a Zod schema instead of
7
+ * hand-authoring it on every `FunctionToolDef`). Google ADK's
8
+ * `FunctionTool(func)` derives the schema from Python type hints
9
+ * (`tools/function_tool.py:42-150`); qodo-ts-sdk's pre-S3 surface
10
+ * required the consumer to ship the full `parameters: { type: 'object',
11
+ * properties: {…} }` blob inline.
12
+ *
13
+ * The helper does three things in one call:
14
+ *
15
+ * 1. Converts the supplied Zod schema to JSON Schema via Zod 4's
16
+ * built-in `z.toJSONSchema()`. (`zod-to-json-schema` was the
17
+ * pre-2025 path but the package was deprecated in November 2025;
18
+ * Zod 4 ships the same capability natively, so we use the built-in
19
+ * and avoid a redundant dependency.) Targets `draft-07` — the
20
+ * OpenAI-compatible JSON Schema dialect; the produced body drops
21
+ * directly into the function-tool wire shape with no further
22
+ * shimming.
23
+ * 2. Returns a fully-formed `FunctionToolDef` that drops into
24
+ * `InlineAgentSpec.tools[]` with zero further wiring.
25
+ * 3. Attaches the runtime `handler` on a symbol-keyed property so
26
+ * `JSON.stringify` / structural cloning / spread ignore it (wire
27
+ * serialization stays clean — the handler is SDK-local) and the
28
+ * SDK can route inbound `tool.request` envelopes for this tool's
29
+ * `name` to the right callback automatically at
30
+ * `tasks.startWithAgent` / `tasks.startWithGraph` time.
31
+ *
32
+ * The handler's `args` parameter is statically typed against
33
+ * `z.infer<typeof parameters>`, so the consumer gets compile-time
34
+ * checking against the schema shape — mismatched destructures fail at
35
+ * the call site rather than at runtime when QAR sends the call. The
36
+ * router also Zod-parses inbound args before invoking the handler, so
37
+ * `.default()` values are applied and `.transform()` / `.refine()`
38
+ * chains run as written; argument-validation failures map to per-call
39
+ * `outcome: 'error'` without the handler running.
40
+ *
41
+ * Backward compatibility: pre-S3 hand-authored `FunctionToolDef`
42
+ * literals continue to work unchanged. The helper is purely additive —
43
+ * `InlineAgentSpec.tools[]` accepts both shapes, and the SDK's
44
+ * auto-bind step (see `ToolClient.bindFunctionToolDefs`) is a no-op for
45
+ * tools that don't carry the handler symbol.
46
+ */
47
+ import { z } from 'zod';
48
+ import { type ApprovalConfig } from './approval.js';
49
+ import type { JsonObject } from '../../qar/json.js';
50
+ import type { FunctionToolDef, McpToolAnnotations } from '../../qar/specs.js';
51
+ import type { ToolCall, ToolResponseResult } from '../../qar/payloads.js';
52
+ /**
53
+ * Symbol used to attach the SDK-local handler bag to a
54
+ * `FunctionToolDef` produced by {@link defineFunctionTool}. Symbol-keyed
55
+ * so:
56
+ *
57
+ * - `JSON.stringify` ignores the property (the wire-serialized spec
58
+ * stays clean without an explicit strip step at every wire
59
+ * boundary).
60
+ * - Object spread / `structuredClone` don't carry the handler across
61
+ * unless the runtime is opted into symbols (clones drop the handler
62
+ * — defensive; consumers building wire payloads via `{ ...tool }`
63
+ * don't accidentally try to ship a function).
64
+ * - Property-name lookups via dot/bracket access don't collide with a
65
+ * consumer-authored field.
66
+ *
67
+ * Exported (named) so the SDK's own bind step and unit tests can read
68
+ * it; consumer code rarely needs to touch it directly —
69
+ * {@link getFunctionToolHandler} is the safer accessor.
70
+ */
71
+ export declare const FUNCTION_TOOL_HANDLER_KEY: unique symbol;
72
+ /**
73
+ * Context passed alongside the parsed `args` to a function-tool handler.
74
+ * Carries the per-call metadata the runtime delivered on the inbound
75
+ * envelope — useful for logging, tracing, or routing per-call HITL
76
+ * decisions.
77
+ */
78
+ export interface FunctionToolHandlerContext {
79
+ /** The `tool_call_id` of the inbound call this handler is responding to. */
80
+ readonly toolCallId: string;
81
+ /** The originating node name (`payload.node_name`). */
82
+ readonly nodeName: string;
83
+ /** The full `ToolCall` from the inbound envelope (HITL block, raw args, etc.). */
84
+ readonly call: ToolCall;
85
+ /**
86
+ * Approval decision payload from the S4 `requireApproval` flow.
87
+ * Present only when the tool carried `requireApproval` AND the
88
+ * resolver returned `decision: 'approve'`. Carries the optional
89
+ * `input` (`'input'`-kind approvals) and `selection`
90
+ * (`'choice'`-kind approvals) the resolver attached — handlers
91
+ * can read these to thread the approver's free-text justification
92
+ * or choice down into the tool's effect.
93
+ *
94
+ * Always `undefined` for tools without `requireApproval` — the
95
+ * field exists so consumers can read it without an unsafe cast
96
+ * when the gate IS engaged.
97
+ */
98
+ readonly approval?: import('./approval.js').ApprovalDecision;
99
+ }
100
+ /**
101
+ * Allowed return shape from a function-tool handler:
102
+ *
103
+ * - Plain `JsonObject` — wrapped into `{ outcome: 'success', result }`.
104
+ * - Full `ToolResponseResult` — passed through (lets the consumer
105
+ * reply `denied` / `error` without throwing).
106
+ *
107
+ * `void` / `undefined` is intentionally NOT supported — the SDK auto-
108
+ * dispatcher needs every matched call to produce a concrete response
109
+ * item. If the consumer wants "I'll respond later" semantics, they
110
+ * should NOT use `defineFunctionTool`; the manual
111
+ * `client.tools.onRequest` surface still applies.
112
+ */
113
+ export type FunctionToolHandlerReturn = JsonObject | ToolResponseResult | Promise<JsonObject | ToolResponseResult>;
114
+ /**
115
+ * The function-tool handler signature. `args` is the parsed-and-typed
116
+ * payload derived from the consumer's Zod schema; `ctx` carries the
117
+ * per-call envelope metadata.
118
+ *
119
+ * Throws are caught by the SDK dispatcher and mapped to a per-call
120
+ * `outcome: 'error'` response (mirrors the
121
+ * `ToolClient.onRequest` behaviour); `ToolDeniedError` maps to
122
+ * `outcome: 'denied'`.
123
+ */
124
+ export type FunctionToolHandler<TArgs> = (args: TArgs, ctx: FunctionToolHandlerContext) => FunctionToolHandlerReturn;
125
+ /**
126
+ * Internal handler-bag attached to a `FunctionToolDef` via the
127
+ * {@link FUNCTION_TOOL_HANDLER_KEY} symbol. The `parameters` reference
128
+ * is kept so unit tests + observability can re-validate / re-print the
129
+ * schema without round-tripping through JSON.
130
+ */
131
+ export interface FunctionToolHandlerBag {
132
+ readonly name: string;
133
+ readonly handler: FunctionToolHandler<unknown>;
134
+ readonly parameters: z.ZodType;
135
+ /**
136
+ * Normalized approval configuration when the consumer set
137
+ * `requireApproval` on the tool. Undefined when the tool has no
138
+ * approval gate — the common case. The router reads this at
139
+ * dispatch time; presence (not value) drives the gate.
140
+ */
141
+ readonly approval?: ApprovalConfig;
142
+ }
143
+ /** Options accepted by {@link defineFunctionTool}. */
144
+ export interface DefineFunctionToolOptions<TSchema extends z.ZodType> {
145
+ /**
146
+ * Tool name as the model will call it. Matches the `function.name` on
147
+ * the produced `FunctionToolDef`. Subject to the same constraints
148
+ * QAR's tool registry enforces — keep it `[a-zA-Z0-9_-]` and ≤ 64
149
+ * chars; the SDK doesn't lint here, the wire validator does on
150
+ * dispatch.
151
+ */
152
+ readonly name: string;
153
+ /**
154
+ * Human-readable description shown to the model. Surfaced verbatim on
155
+ * the produced `function.description`. Skip — or pass an empty
156
+ * string — to omit.
157
+ */
158
+ readonly description?: string;
159
+ /**
160
+ * Zod schema describing the tool's argument bag. The handler's `args`
161
+ * parameter is inferred from this schema via `z.infer<TSchema>` so
162
+ * a destructure typo fails at compile time, not at runtime.
163
+ *
164
+ * Use `z.object({...})` at the top level — Zod 4's `toJSONSchema()`
165
+ * produces the `{ type: 'object', properties: {...}, required: [...] }`
166
+ * shape OpenAI function tools expect. Non-object top-level schemas
167
+ * (e.g. `z.string()`) work but produce a schema the LLM may struggle
168
+ * to invoke correctly; the helper doesn't enforce object-ness so
169
+ * consumers building thin shim tools (e.g. `z.union(...)`) can still
170
+ * opt in.
171
+ */
172
+ readonly parameters: TSchema;
173
+ /**
174
+ * OpenAI strict-mode flag forwarded onto the produced
175
+ * `function.strict`. Defaults to `undefined` (lets the server pick its
176
+ * default — currently `true`). Pass `false` to opt out of strict
177
+ * argument validation; rarely useful, mostly here for parity with the
178
+ * pre-S3 hand-authored shape.
179
+ */
180
+ readonly strict?: boolean;
181
+ /**
182
+ * Advisory MCP `Tool.annotations` forwarded onto the produced
183
+ * `function.annotations`. Useful for non-MCP-backed tools that want
184
+ * to carry the same advisory hints (e.g. `readOnlyHint: true`) the
185
+ * SDK propagates through the MCP projection layer.
186
+ */
187
+ readonly annotations?: McpToolAnnotations;
188
+ /**
189
+ * Runtime callback invoked when QAR sends a `tool.request` envelope
190
+ * naming this tool. The first arg is the parsed-and-typed payload
191
+ * derived from `parameters`; the second is the per-call envelope
192
+ * metadata.
193
+ */
194
+ readonly handler: FunctionToolHandler<z.infer<TSchema>>;
195
+ /**
196
+ * Ergonomic HITL shorthand (S4 — closes the ADK `require_confirmation`
197
+ * gap; see `docs/sdk2/research/2026-05-21-google-adk-vs-qodo-ts-sdk.md`
198
+ * § Opp 5). When set, the SDK gates dispatch on a consumer-side
199
+ * approval flow before invoking `handler`:
200
+ *
201
+ * - **`true`** — shortcut for `{ kind: 'approval', sensitivity: 'low' }`.
202
+ * Synthesizes a yes/no approval prompt at dispatch time. On
203
+ * approve, the handler runs with the original parsed args; on
204
+ * deny, the SDK returns `{ outcome: 'denied' }` to QAR without
205
+ * invoking the handler.
206
+ * - **`ApprovalConfig`** — richer config: `kind` picks the resolver
207
+ * UX shape (`'approval'` yes/no, `'choice'` closed-set,
208
+ * `'input'` free-form); `sensitivity` drives an advisory
209
+ * annotation overlay on the produced `FunctionToolDef`; `prompt`
210
+ * overrides the default human-facing prompt; `deadlineMs` is
211
+ * passed through to the handler.
212
+ * - **`false` / `undefined`** — no approval gate. Default — the
213
+ * handler runs immediately on every inbound call (the pre-S4
214
+ * behavior).
215
+ *
216
+ * Override the resolver via `client.tools.setApprovalHandler(fn)`.
217
+ * The default handler prompts on stdin when `process.stdin.isTTY`
218
+ * is true; in non-interactive contexts it auto-denies with a typed
219
+ * error message pointing at the missing registration. See
220
+ * `src/client/tools/approval.ts` for the full handler contract.
221
+ *
222
+ * Composes with the existing manual `client.tools.onRequest`
223
+ * surface: the manual primary stack runs first, so a consumer who
224
+ * wants per-batch policy on top of per-tool `requireApproval` still
225
+ * has the explicit shape available. See
226
+ * `docs/sdk2/concepts/03-hitl.md` for the three-layer HITL model
227
+ * `requireApproval` composes onto.
228
+ */
229
+ readonly requireApproval?: boolean | ApprovalConfig;
230
+ }
231
+ /**
232
+ * `FunctionToolDef` with the SDK-local handler bag attached. Assignable
233
+ * to `FunctionToolDef[]` (e.g. `InlineAgentSpec.tools`) without
234
+ * narrowing — the symbol-keyed property is opaque to structural typing
235
+ * at the call site.
236
+ */
237
+ export type DefinedFunctionToolDef = FunctionToolDef & {
238
+ readonly [FUNCTION_TOOL_HANDLER_KEY]: FunctionToolHandlerBag;
239
+ };
240
+ /**
241
+ * Read the SDK-local handler bag off a `FunctionToolDef`. Returns
242
+ * `undefined` for hand-authored literals that don't carry the symbol —
243
+ * the SDK's bind step uses this to skip tools that don't auto-route.
244
+ */
245
+ export declare function getFunctionToolHandler(def: FunctionToolDef): FunctionToolHandlerBag | undefined;
246
+ /**
247
+ * Derive a `FunctionToolDef` from a Zod schema + handler.
248
+ *
249
+ * @example
250
+ * import { defineFunctionTool } from '@qodo/sdk';
251
+ * import { z } from 'zod';
252
+ *
253
+ * const getCurrentTime = defineFunctionTool({
254
+ * name: 'get_current_time',
255
+ * description: 'Returns the current time in ISO 8601 format.',
256
+ * parameters: z.object({
257
+ * timezone: z
258
+ * .string()
259
+ * .describe('IANA timezone, defaults to UTC.')
260
+ * .default('UTC'),
261
+ * }),
262
+ * handler: async ({ timezone }) => ({
263
+ * time: new Date().toLocaleString('en-US', { timeZone: timezone }),
264
+ * }),
265
+ * });
266
+ *
267
+ * const stream = client.tasks.startWithAgent({
268
+ * agent: {
269
+ * apiVersion: 'qar/v1',
270
+ * instructions: 'Answer with the current time on request.',
271
+ * model: 'gpt-4o',
272
+ * tools: [getCurrentTime],
273
+ * },
274
+ * });
275
+ */
276
+ export declare function defineFunctionTool<TSchema extends z.ZodType>(opts: DefineFunctionToolOptions<TSchema>): DefinedFunctionToolDef;
277
+ //# sourceMappingURL=defineFunctionTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineFunctionTool.d.ts","sourceRoot":"","sources":["../../../src/client/tools/defineFunctionTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,EAAE,OAAO,MAE9C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,eAAe,EAAE,gBAAgB,CAAC;CAC9D;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,yBAAyB,GACjC,UAAU,GACV,kBAAkB,GAClB,OAAO,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC;AAE7C;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,CAAC,KAAK,IAAI,CACvC,IAAI,EAAE,KAAK,EACX,GAAG,EAAE,0BAA0B,KAC5B,yBAAyB,CAAC;AAE/B;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;CACpC;AAED,sDAAsD;AACtD,MAAM,WAAW,yBAAyB,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO;IAClE;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CACrD;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,QAAQ,CAAC,CAAC,yBAAyB,CAAC,EAAE,sBAAsB,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,eAAe,GACnB,sBAAsB,GAAG,SAAS,CAEpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,EAC1D,IAAI,EAAE,yBAAyB,CAAC,OAAO,CAAC,GACvC,sBAAsB,CAuDxB"}