@qodo/sdk 0.13.4 → 2.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +1115 -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 +800 -0
  68. package/dist/client/connection.d.ts.map +1 -0
  69. package/dist/client/connection.js +2020 -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,300 @@
1
+ /**
2
+ * SDK 2.0 span emission helpers.
3
+ *
4
+ * Public-API methods on the client open and close spans through `SpanRecorder`.
5
+ * The recorder is the single place that knows about the OTel API: when no OTel
6
+ * is configured, every method returns a no-op `SpanLifecycle` so the call
7
+ * sites don't branch.
8
+ *
9
+ * Span boundaries:
10
+ *
11
+ * - `qar.client.connect` — wraps `client.connect()` until the WS upgrade resolves.
12
+ * - `qar.client.disconnect` — short-lived; ends when teardown returns.
13
+ * - `qar.client.task.start` — wraps `tasks.start`; ends when the iterator closes.
14
+ * - `qar.client.task.continue` — same shape, distinct name.
15
+ * - `qar.client.task.cancel` — short-lived; ends when `task.done(canceled)` arrives.
16
+ * - `qar.client.task.resubscribe` — wraps `tasks.resubscribe` invocation.
17
+ * - `qar.client.tool.respond` — short-lived; ends when the WS write resolves.
18
+ * - `qar.client.tool.handler` — wraps the inbound `tool.request` → handler invocation.
19
+ *
20
+ * Spans inherit from the consumer's currently-active OTel context. Errors
21
+ * record an exception and set `ERROR` status. Cleanly-terminated spans set
22
+ * `OK`. Iterator early-termination still records `OK` (cancellation isn't an
23
+ * error), with an attribute distinguishing terminal vs cancel paths.
24
+ */
25
+ import { GEN_AI_CONVERSATION_ID, GEN_AI_OPERATION_NAME, GEN_AI_OP_EXECUTE_TOOL, QAR_AGENT_ID, QAR_AGENT_KIND, QAR_GRAPH_DEPTH, QAR_GRAPH_ENTRY, QAR_MESSAGE_ID, QAR_NODE_NAME, QAR_PARENT_MESSAGE_ID, QAR_SESSION_ID, QAR_SKILL_NAME, QAR_TASK_ID, QAR_TOOL_CALL_ID, QAR_TOOL_NAME, QAR_TOOL_ORIGIN, QAR_TOOL_OUTCOME, SERVICE_NAME, SERVICE_NAMESPACE, SERVICE_NAMESPACE_VALUE, SERVICE_NAME_VALUE, SERVICE_VERSION, SPAN_CONNECT, SPAN_DISCONNECT, SPAN_TASK_CANCEL, SPAN_TASK_CONTINUE, SPAN_TASK_RESUBSCRIBE, SPAN_TASK_START, SPAN_TOOL_HANDLER, SPAN_TOOL_RESPOND, TOOL_ORIGIN_SDK_SIDE, TOOL_OUTCOME_DENIED, TOOL_OUTCOME_ERROR, TOOL_OUTCOME_SUCCESS, } from './attributes.js';
26
+ /** Default tracer name. Same as `service.name` so Phoenix groups spans naturally. */
27
+ const TRACER_NAME = SERVICE_NAME_VALUE;
28
+ /**
29
+ * Span emission entry-point. One instance per `QodoClient`. Methods return a
30
+ * `SpanLifecycle` the call site closes when the operation completes (or fails).
31
+ *
32
+ * A `SpanRecorder` constructed with `otel === undefined` returns a single
33
+ * shared no-op lifecycle for every method. No allocations, no overhead beyond
34
+ * a method-call dispatch.
35
+ */
36
+ export class SpanRecorder {
37
+ otel;
38
+ tracer;
39
+ statusOk;
40
+ statusError;
41
+ /** Cached resource attrs stamped on every span so Phoenix groups by service. */
42
+ resourceAttrs;
43
+ constructor(otel, sdkVersion) {
44
+ this.otel = otel;
45
+ if (otel !== undefined) {
46
+ this.tracer = otel.trace.getTracer(TRACER_NAME, sdkVersion);
47
+ }
48
+ this.statusOk = otel?.SpanStatusCode.OK ?? 1;
49
+ this.statusError = otel?.SpanStatusCode.ERROR ?? 2;
50
+ this.resourceAttrs = {
51
+ [SERVICE_NAME]: SERVICE_NAME_VALUE,
52
+ [SERVICE_NAMESPACE]: SERVICE_NAMESPACE_VALUE,
53
+ [SERVICE_VERSION]: sdkVersion,
54
+ };
55
+ }
56
+ /** Whether OTel emission is wired (vs no-op). */
57
+ get isEnabled() {
58
+ return this.tracer !== undefined;
59
+ }
60
+ /**
61
+ * Open a `qar.client.task.start` span. The caller is responsible for closing
62
+ * it — typically via the `TaskSubscription` lifecycle wired in `TaskClient`.
63
+ */
64
+ startTaskStartSpan(attrs) {
65
+ return this.openTaskSpan(SPAN_TASK_START, {
66
+ ...(attrs.sessionId !== undefined
67
+ ? {
68
+ [QAR_SESSION_ID]: attrs.sessionId,
69
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
70
+ }
71
+ : {}),
72
+ [QAR_MESSAGE_ID]: attrs.messageId,
73
+ ...(attrs.agentId !== undefined ? { [QAR_AGENT_ID]: attrs.agentId } : {}),
74
+ ...(attrs.skillName !== undefined ? { [QAR_SKILL_NAME]: attrs.skillName } : {}),
75
+ ...(attrs.operationName !== undefined ? { [GEN_AI_OPERATION_NAME]: attrs.operationName } : {}),
76
+ ...(attrs.graphEntry !== undefined ? { [QAR_GRAPH_ENTRY]: attrs.graphEntry } : {}),
77
+ ...(attrs.graphDepth !== undefined ? { [QAR_GRAPH_DEPTH]: attrs.graphDepth } : {}),
78
+ ...(attrs.agentKind !== undefined ? { [QAR_AGENT_KIND]: attrs.agentKind } : {}),
79
+ });
80
+ }
81
+ /** Open a `qar.client.task.continue` span. */
82
+ startTaskContinueSpan(attrs) {
83
+ return this.openTaskSpan(SPAN_TASK_CONTINUE, {
84
+ ...(attrs.sessionId !== undefined
85
+ ? {
86
+ [QAR_SESSION_ID]: attrs.sessionId,
87
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
88
+ }
89
+ : {}),
90
+ [QAR_MESSAGE_ID]: attrs.messageId,
91
+ [QAR_TASK_ID]: attrs.taskId,
92
+ });
93
+ }
94
+ /** Open a `qar.client.task.cancel` span. */
95
+ startTaskCancelSpan(attrs) {
96
+ return this.openSpan(SPAN_TASK_CANCEL, {
97
+ ...(attrs.sessionId !== undefined
98
+ ? {
99
+ [QAR_SESSION_ID]: attrs.sessionId,
100
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
101
+ }
102
+ : {}),
103
+ [QAR_MESSAGE_ID]: attrs.messageId,
104
+ [QAR_TASK_ID]: attrs.taskId,
105
+ });
106
+ }
107
+ /** Open a `qar.client.task.resubscribe` span. */
108
+ startTaskResubscribeSpan(attrs) {
109
+ return this.openTaskSpan(SPAN_TASK_RESUBSCRIBE, {
110
+ ...(attrs.sessionId !== undefined
111
+ ? {
112
+ [QAR_SESSION_ID]: attrs.sessionId,
113
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
114
+ }
115
+ : {}),
116
+ [QAR_MESSAGE_ID]: attrs.messageId,
117
+ [QAR_TASK_ID]: attrs.taskId,
118
+ ...(attrs.sinceMessageId !== undefined
119
+ ? { [QAR_PARENT_MESSAGE_ID]: attrs.sinceMessageId }
120
+ : {}),
121
+ });
122
+ }
123
+ /**
124
+ * Open a `qar.client.tool.respond` span — short-lived, ends on WS write.
125
+ *
126
+ * Every outbound `tool.response` envelope carries a `node_name` so the
127
+ * span records it for parallel-graph telemetry routing.
128
+ */
129
+ startToolRespondSpan(attrs) {
130
+ return this.openSpan(SPAN_TOOL_RESPOND, {
131
+ ...(attrs.sessionId !== undefined
132
+ ? {
133
+ [QAR_SESSION_ID]: attrs.sessionId,
134
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
135
+ }
136
+ : {}),
137
+ [QAR_TOOL_CALL_ID]: attrs.toolCallId,
138
+ [QAR_TOOL_ORIGIN]: TOOL_ORIGIN_SDK_SIDE,
139
+ [QAR_TOOL_OUTCOME]: attrs.outcome,
140
+ [QAR_NODE_NAME]: attrs.nodeName,
141
+ [GEN_AI_OPERATION_NAME]: GEN_AI_OP_EXECUTE_TOOL,
142
+ });
143
+ }
144
+ /**
145
+ * Open a `qar.client.tool.handler` span around the invocation of a registered
146
+ * handler for one `ToolCall` from an inbound `tool.request`. Caller updates
147
+ * `qar.tool_outcome` and closes via `succeed()` / `fail()` based on the
148
+ * handler's per-call result.
149
+ *
150
+ * A parallel-batched `tool.request` carrying N calls opens N sibling
151
+ * spans (one per call), each tagged with its own
152
+ * `qar.tool_call_id` and the request's `qar.node_name`. The shared parent
153
+ * is whatever OTel context was active when the inbound envelope arrived —
154
+ * typically the task span.
155
+ */
156
+ startToolHandlerSpan(attrs) {
157
+ return this.openSpan(SPAN_TOOL_HANDLER, {
158
+ ...(attrs.sessionId !== undefined
159
+ ? {
160
+ [QAR_SESSION_ID]: attrs.sessionId,
161
+ [GEN_AI_CONVERSATION_ID]: attrs.sessionId,
162
+ }
163
+ : {}),
164
+ [QAR_TOOL_CALL_ID]: attrs.toolCallId,
165
+ [QAR_TOOL_NAME]: attrs.toolName,
166
+ [QAR_TOOL_ORIGIN]: TOOL_ORIGIN_SDK_SIDE,
167
+ [QAR_NODE_NAME]: attrs.nodeName,
168
+ [GEN_AI_OPERATION_NAME]: GEN_AI_OP_EXECUTE_TOOL,
169
+ });
170
+ }
171
+ /** Open a `qar.client.connect` span. Ends when the WS upgrade resolves. */
172
+ startConnectSpan() {
173
+ return this.openSpan(SPAN_CONNECT, {});
174
+ }
175
+ /** Open a `qar.client.disconnect` span. */
176
+ startDisconnectSpan(attrs) {
177
+ return this.openSpan(SPAN_DISCONNECT, {
178
+ ...(attrs.sessionId !== undefined ? { [QAR_SESSION_ID]: attrs.sessionId } : {}),
179
+ });
180
+ }
181
+ /**
182
+ * Internal: open a span as a child of the consumer's currently-active
183
+ * context, attaching attributes + the resource attrs. Returns a
184
+ * `SpanLifecycle` the caller closes.
185
+ */
186
+ openSpan(name, attrs) {
187
+ if (this.tracer === undefined)
188
+ return NOOP_LIFECYCLE;
189
+ const otel = this.otel;
190
+ const parentContext = otel.context.active();
191
+ const span = this.tracer.startSpan(name, { attributes: { ...this.resourceAttrs, ...attrs } }, parentContext);
192
+ const spanContext = otel.trace.setSpan(parentContext, span);
193
+ return new RealSpanLifecycle(otel, span, spanContext, this.statusOk, this.statusError);
194
+ }
195
+ /**
196
+ * Internal: open a span and return both the lifecycle and the OTel context
197
+ * pinning that span — so a caller (e.g. `TaskSubscription`) can re-attach
198
+ * the context every time it yields an event to the consumer's iterator.
199
+ */
200
+ openTaskSpan(name, attrs) {
201
+ const lifecycle = this.openSpan(name, attrs);
202
+ return { lifecycle, otelContext: lifecycle.context() };
203
+ }
204
+ }
205
+ /** Outcome-attribute helper used by `TaskClient`/`ToolClient` call sites. */
206
+ export function toolOutcomeFor(outcome) {
207
+ switch (outcome) {
208
+ case 'success':
209
+ return TOOL_OUTCOME_SUCCESS;
210
+ case 'error':
211
+ return TOOL_OUTCOME_ERROR;
212
+ case 'denied':
213
+ return TOOL_OUTCOME_DENIED;
214
+ }
215
+ }
216
+ // ---------------------------------------------------------------------------
217
+ // Lifecycle implementations
218
+ // ---------------------------------------------------------------------------
219
+ /**
220
+ * Real span — backed by the consumer's OTel TracerProvider. `succeed()` /
221
+ * `fail()` are idempotent: a second call after close is a no-op so callers
222
+ * don't need to track close state themselves.
223
+ */
224
+ class RealSpanLifecycle {
225
+ otel;
226
+ span;
227
+ otelContext;
228
+ okCode;
229
+ errorCode;
230
+ closed = false;
231
+ constructor(otel, span, otelContext, okCode, errorCode) {
232
+ this.otel = otel;
233
+ this.span = span;
234
+ this.otelContext = otelContext;
235
+ this.okCode = okCode;
236
+ this.errorCode = errorCode;
237
+ }
238
+ setAttribute(key, value) {
239
+ if (this.closed)
240
+ return;
241
+ try {
242
+ this.span.setAttribute(key, value);
243
+ }
244
+ catch {
245
+ // Defensive — consumer may have wired an unstable TracerProvider impl.
246
+ // Telemetry should never crash the SDK's hot path.
247
+ }
248
+ }
249
+ succeed() {
250
+ if (this.closed)
251
+ return;
252
+ this.closed = true;
253
+ try {
254
+ this.span.setStatus({ code: this.okCode });
255
+ this.span.end();
256
+ }
257
+ catch {
258
+ // see setAttribute()
259
+ }
260
+ }
261
+ fail(err) {
262
+ if (this.closed)
263
+ return;
264
+ this.closed = true;
265
+ try {
266
+ const message = err instanceof Error ? err.message : String(err);
267
+ this.span.recordException(err instanceof Error ? err : message);
268
+ this.span.setStatus({ code: this.errorCode, message });
269
+ this.span.end();
270
+ }
271
+ catch {
272
+ // see setAttribute()
273
+ }
274
+ }
275
+ withContext(fn) {
276
+ return this.otel.context.with(this.otelContext, fn);
277
+ }
278
+ context() {
279
+ return this.otelContext;
280
+ }
281
+ }
282
+ /** Shared no-op lifecycle — one instance, no allocations on the hot path. */
283
+ const NOOP_LIFECYCLE = {
284
+ setAttribute() {
285
+ /* no-op */
286
+ },
287
+ succeed() {
288
+ /* no-op */
289
+ },
290
+ fail() {
291
+ /* no-op */
292
+ },
293
+ withContext(fn) {
294
+ return fn();
295
+ },
296
+ context() {
297
+ return undefined;
298
+ },
299
+ };
300
+ //# sourceMappingURL=spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.js","sourceRoot":"","sources":["../../src/observability/spans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * W3C Trace Context provider.
3
+ *
4
+ * Reads the consumer's currently-active OTel `Context` and serializes the
5
+ * active span's `SpanContext` into a W3C `traceparent` header value
6
+ * (`00-<trace_id>-<span_id>-<trace_flags>`). The `tracestate` arm carries any
7
+ * vendor-specific propagation data attached upstream.
8
+ *
9
+ * Without an `OTelAPI` (or with an OTel API but no active recording span), the
10
+ * provider falls back to the per-envelope filler — a fresh, valid 55-char
11
+ * `traceparent` per call. The QAR server tolerates the synthetic value; what it
12
+ * doesn't tolerate is an empty string (the schema enforces the regex).
13
+ */
14
+ import type { OTelAPI } from '../tracing/types.js';
15
+ /** Concrete `trace_context` value the SDK writes onto every outbound envelope. */
16
+ export interface TraceContextValue {
17
+ /** Always present, always 55 chars (`00-<32hex>-<16hex>-<2hex>`). */
18
+ readonly traceparent: string;
19
+ /** Optional, only when the active context has a non-empty tracestate. */
20
+ readonly tracestate?: string;
21
+ }
22
+ /** Build a W3C `traceparent` from the components of a SpanContext. */
23
+ export declare function formatTraceparent(traceId: string, spanId: string, traceFlags: number): string;
24
+ /**
25
+ * Provider for the per-envelope `trace_context`. Stateless — every call reads
26
+ * the live OTel context anew. Cheap; no caching needed (a hot envelope path
27
+ * does ~1 read per send).
28
+ */
29
+ export declare class TraceContextProvider {
30
+ private readonly otel;
31
+ /**
32
+ * @param otel Optional OTel API. When `undefined`, every `current()` call
33
+ * returns a fresh random traceparent.
34
+ */
35
+ constructor(otel: OTelAPI | undefined);
36
+ /**
37
+ * Resolve the active SpanContext (if any) and return the wire `trace_context`.
38
+ *
39
+ * Order of preference:
40
+ * 1. The currently-active OTel span — its trace-id/span-id are written into
41
+ * `traceparent`, its `traceState.serialize()` (when non-empty) into
42
+ * `tracestate`. This is what stitches the SDK's outbound envelope into
43
+ * the consumer's trace.
44
+ * 2. Filler — a fresh random 55-char `traceparent` per call. The server
45
+ * doesn't reject it; the trace just doesn't continue past the SDK.
46
+ */
47
+ current(): TraceContextValue;
48
+ /** The currently-active recording span, or `undefined` if no OTel / no span. */
49
+ private activeSpan;
50
+ }
51
+ //# sourceMappingURL=traceContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceContext.d.ts","sourceRoot":"","sources":["../../src/observability/traceContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,qBAAqB,CAAC;AAE9E,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD,sEAAsE;AACtE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC;;;OAGG;gBAC0B,IAAI,EAAE,OAAO,GAAG,SAAS;IAEtD;;;;;;;;;;OAUG;IACI,OAAO,IAAI,iBAAiB;IA8BnC,gFAAgF;IAChF,OAAO,CAAC,UAAU;CAiBnB"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * W3C Trace Context provider.
3
+ *
4
+ * Reads the consumer's currently-active OTel `Context` and serializes the
5
+ * active span's `SpanContext` into a W3C `traceparent` header value
6
+ * (`00-<trace_id>-<span_id>-<trace_flags>`). The `tracestate` arm carries any
7
+ * vendor-specific propagation data attached upstream.
8
+ *
9
+ * Without an `OTelAPI` (or with an OTel API but no active recording span), the
10
+ * provider falls back to the per-envelope filler — a fresh, valid 55-char
11
+ * `traceparent` per call. The QAR server tolerates the synthetic value; what it
12
+ * doesn't tolerate is an empty string (the schema enforces the regex).
13
+ */
14
+ /** Hex characters per W3C trace_id field. */
15
+ const TRACE_ID_HEX_LEN = 32;
16
+ /** Hex characters per W3C span_id field. */
17
+ const SPAN_ID_HEX_LEN = 16;
18
+ /**
19
+ * The "invalid" trace-id and span-id values defined by the W3C spec — used to
20
+ * detect a noop / non-recording SpanContext. Treated as if no active span.
21
+ */
22
+ const INVALID_TRACE_ID = '0'.repeat(TRACE_ID_HEX_LEN);
23
+ const INVALID_SPAN_ID = '0'.repeat(SPAN_ID_HEX_LEN);
24
+ /** Build a W3C `traceparent` from the components of a SpanContext. */
25
+ export function formatTraceparent(traceId, spanId, traceFlags) {
26
+ // W3C: trace_flags is 1 byte = 2 lowercase hex chars. Mask to the low byte
27
+ // so an SDK that hands us a wider int doesn't break the header shape.
28
+ const flagsHex = (traceFlags & 0xff).toString(16).padStart(2, '0');
29
+ return `00-${traceId}-${spanId}-${flagsHex}`;
30
+ }
31
+ /**
32
+ * Provider for the per-envelope `trace_context`. Stateless — every call reads
33
+ * the live OTel context anew. Cheap; no caching needed (a hot envelope path
34
+ * does ~1 read per send).
35
+ */
36
+ export class TraceContextProvider {
37
+ otel;
38
+ /**
39
+ * @param otel Optional OTel API. When `undefined`, every `current()` call
40
+ * returns a fresh random traceparent.
41
+ */
42
+ constructor(otel) {
43
+ this.otel = otel;
44
+ }
45
+ /**
46
+ * Resolve the active SpanContext (if any) and return the wire `trace_context`.
47
+ *
48
+ * Order of preference:
49
+ * 1. The currently-active OTel span — its trace-id/span-id are written into
50
+ * `traceparent`, its `traceState.serialize()` (when non-empty) into
51
+ * `tracestate`. This is what stitches the SDK's outbound envelope into
52
+ * the consumer's trace.
53
+ * 2. Filler — a fresh random 55-char `traceparent` per call. The server
54
+ * doesn't reject it; the trace just doesn't continue past the SDK.
55
+ */
56
+ current() {
57
+ const span = this.activeSpan();
58
+ if (span === undefined)
59
+ return fillerTraceContext();
60
+ let ctx;
61
+ try {
62
+ ctx = span.spanContext();
63
+ }
64
+ catch {
65
+ // Defensive — shouldn't happen with a real OTel implementation, but a
66
+ // user-supplied fake might mis-shape spanContext(). Falling back to the
67
+ // filler keeps outbound envelopes valid rather than throwing on the
68
+ // emit path.
69
+ return fillerTraceContext();
70
+ }
71
+ if (typeof ctx.traceId !== 'string' ||
72
+ typeof ctx.spanId !== 'string' ||
73
+ ctx.traceId.length !== TRACE_ID_HEX_LEN ||
74
+ ctx.spanId.length !== SPAN_ID_HEX_LEN ||
75
+ ctx.traceId === INVALID_TRACE_ID ||
76
+ ctx.spanId === INVALID_SPAN_ID) {
77
+ // Non-recording / noop span — its SpanContext carries the all-zero ids
78
+ // and isn't meaningful to propagate. Filler.
79
+ return fillerTraceContext();
80
+ }
81
+ const traceparent = formatTraceparent(ctx.traceId, ctx.spanId, ctx.traceFlags);
82
+ const tracestate = serializeTraceState(ctx.traceState);
83
+ return tracestate !== undefined ? { traceparent, tracestate } : { traceparent };
84
+ }
85
+ /** The currently-active recording span, or `undefined` if no OTel / no span. */
86
+ activeSpan() {
87
+ const otel = this.otel;
88
+ if (otel === undefined)
89
+ return undefined;
90
+ const span = otel.trace.getActiveSpan();
91
+ if (span === undefined)
92
+ return undefined;
93
+ // A non-recording span carries the noop SpanContext (all zeros). Skip it
94
+ // here so we fall into the filler arm and emit a valid traceparent.
95
+ try {
96
+ if (typeof span.isRecording === 'function' && !span.isRecording()) {
97
+ return undefined;
98
+ }
99
+ }
100
+ catch {
101
+ // Defensive — see `current()`.
102
+ return undefined;
103
+ }
104
+ return span;
105
+ }
106
+ }
107
+ /** Serialize a TraceState object to its header form. Returns `undefined` for missing/empty. */
108
+ function serializeTraceState(ts) {
109
+ if (ts === undefined)
110
+ return undefined;
111
+ let serialized;
112
+ try {
113
+ serialized = ts.serialize();
114
+ }
115
+ catch {
116
+ return undefined;
117
+ }
118
+ if (typeof serialized !== 'string' || serialized.length === 0)
119
+ return undefined;
120
+ return serialized;
121
+ }
122
+ /**
123
+ * Build a fresh, valid 55-char `traceparent`. Used when no OTel API or no
124
+ * active span — keeps QAR's schema validator happy and ensures every envelope
125
+ * carries a syntactically well-formed header.
126
+ *
127
+ * The flags byte is `00` (not sampled): the trace doesn't continue past the
128
+ * SDK in the absence of a TracerProvider, so opting in to sampling would be
129
+ * misleading.
130
+ */
131
+ function fillerTraceContext() {
132
+ const traceId = randomHex(16);
133
+ const spanId = randomHex(8);
134
+ return { traceparent: formatTraceparent(traceId, spanId, 0) };
135
+ }
136
+ /**
137
+ * Random lowercase-hex of `byteCount` bytes, isomorphic between Node and
138
+ * browser. Reads from `globalThis.crypto.getRandomValues` — present on Node
139
+ * 19+ and every modern browser. Output shape (length, alphabet) matches the
140
+ * pre-2.0 `randomBytes(N).toString('hex')` exactly so wire emission is
141
+ * byte-identical.
142
+ */
143
+ function randomHex(byteCount) {
144
+ const bytes = new Uint8Array(byteCount);
145
+ globalThis.crypto.getRandomValues(bytes);
146
+ let hex = '';
147
+ for (const b of bytes)
148
+ hex += b.toString(16).padStart(2, '0');
149
+ return hex;
150
+ }
151
+ //# sourceMappingURL=traceContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceContext.js","sourceRoot":"","sources":["../../src/observability/traceContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Wire-level transport counters for the SDK's reconnect + replay path.
3
+ *
4
+ * Three counters expose the contract `task.resubscribe` flow has with
5
+ * QAR's per-session replay buffer: how many resubscribes the SDK has
6
+ * sent, how many replayed envelopes have come back, and how often the
7
+ * anchor `since_message_id` rotated out before the SDK could
8
+ * re-anchor.
9
+ *
10
+ * The counters are wire-agnostic — they live next to the spans the SDK
11
+ * already emits (`src/observability/spans.ts`) rather than inside the
12
+ * connection itself so consumers can read them off `client.transportMetrics`
13
+ * without holding a reference to the WS layer.
14
+ *
15
+ * Backing storage is in-memory. The SDK does NOT shovel these into an OTel
16
+ * meter — consumers wanting Prometheus/StatsD scrape paths read the values
17
+ * via {@link TransportMetrics.snapshot} and forward them through their own
18
+ * exporter. (OTel's metrics API is a heavier surface than the SDK's tracing
19
+ * peer-dependency posture wants to pull in for three counters.)
20
+ */
21
+ /**
22
+ * Snapshot of every counter at a point in time. Counter names are
23
+ * wire-aligned with QAR's runtime documentation: `*_total` suffix per the
24
+ * OpenMetrics convention, even though the SDK doesn't ship them through an
25
+ * OTel meter — the suffix is part of the published name so consumers
26
+ * forwarding to Prometheus get the canonical metric name without renames.
27
+ */
28
+ export interface TransportMetricsSnapshot {
29
+ /** Envelopes received via `task.resubscribe` replay (descendants of an anchor). */
30
+ readonly replay_envelopes_received_total: number;
31
+ /** `task.resubscribe` envelopes emitted by the SDK (auto-replay + manual). */
32
+ readonly resubscribes_sent_total: number;
33
+ /** Inbound `error { code: "replay_anchor_missing" }` envelopes from QAR. */
34
+ readonly replay_anchor_missing_total: number;
35
+ }
36
+ /**
37
+ * In-memory counter store. One instance per `QodoClient` — survives
38
+ * reconnects so the counters accumulate across the client's lifetime.
39
+ *
40
+ * The store is intentionally minimal: three monotonic counters + a
41
+ * `snapshot()` reader. No reset, no labels, no histograms. Consumers
42
+ * wanting label dimensionality (per-session, per-task) read the per-event
43
+ * span attributes instead — the counters are the aggregate roll-up.
44
+ */
45
+ export declare class TransportMetrics {
46
+ private replayEnvelopesReceived;
47
+ private resubscribesSent;
48
+ private replayAnchorMissing;
49
+ /** Increment per inbound envelope that arrived via a `task.resubscribe` replay window. */
50
+ recordReplayEnvelopeReceived(): void;
51
+ /** Increment per outbound `task.resubscribe` envelope written to the wire. */
52
+ recordResubscribeSent(): void;
53
+ /** Increment per inbound `error { code: 'replay_anchor_missing' }` envelope. */
54
+ recordReplayAnchorMissing(): void;
55
+ /** Read every counter atomically — single-threaded JS, so this is a copy. */
56
+ snapshot(): TransportMetricsSnapshot;
57
+ }
58
+ //# sourceMappingURL=transportMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportMetrics.d.ts","sourceRoot":"","sources":["../../src/observability/transportMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,mFAAmF;IACnF,QAAQ,CAAC,+BAA+B,EAAE,MAAM,CAAC;IACjD,8EAA8E;IAC9E,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,4EAA4E;IAC5E,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,mBAAmB,CAAK;IAEhC,0FAA0F;IACnF,4BAA4B,IAAI,IAAI;IAI3C,8EAA8E;IACvE,qBAAqB,IAAI,IAAI;IAIpC,gFAAgF;IACzE,yBAAyB,IAAI,IAAI;IAIxC,6EAA6E;IACtE,QAAQ,IAAI,wBAAwB;CAO5C"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Wire-level transport counters for the SDK's reconnect + replay path.
3
+ *
4
+ * Three counters expose the contract `task.resubscribe` flow has with
5
+ * QAR's per-session replay buffer: how many resubscribes the SDK has
6
+ * sent, how many replayed envelopes have come back, and how often the
7
+ * anchor `since_message_id` rotated out before the SDK could
8
+ * re-anchor.
9
+ *
10
+ * The counters are wire-agnostic — they live next to the spans the SDK
11
+ * already emits (`src/observability/spans.ts`) rather than inside the
12
+ * connection itself so consumers can read them off `client.transportMetrics`
13
+ * without holding a reference to the WS layer.
14
+ *
15
+ * Backing storage is in-memory. The SDK does NOT shovel these into an OTel
16
+ * meter — consumers wanting Prometheus/StatsD scrape paths read the values
17
+ * via {@link TransportMetrics.snapshot} and forward them through their own
18
+ * exporter. (OTel's metrics API is a heavier surface than the SDK's tracing
19
+ * peer-dependency posture wants to pull in for three counters.)
20
+ */
21
+ /**
22
+ * In-memory counter store. One instance per `QodoClient` — survives
23
+ * reconnects so the counters accumulate across the client's lifetime.
24
+ *
25
+ * The store is intentionally minimal: three monotonic counters + a
26
+ * `snapshot()` reader. No reset, no labels, no histograms. Consumers
27
+ * wanting label dimensionality (per-session, per-task) read the per-event
28
+ * span attributes instead — the counters are the aggregate roll-up.
29
+ */
30
+ export class TransportMetrics {
31
+ replayEnvelopesReceived = 0;
32
+ resubscribesSent = 0;
33
+ replayAnchorMissing = 0;
34
+ /** Increment per inbound envelope that arrived via a `task.resubscribe` replay window. */
35
+ recordReplayEnvelopeReceived() {
36
+ this.replayEnvelopesReceived += 1;
37
+ }
38
+ /** Increment per outbound `task.resubscribe` envelope written to the wire. */
39
+ recordResubscribeSent() {
40
+ this.resubscribesSent += 1;
41
+ }
42
+ /** Increment per inbound `error { code: 'replay_anchor_missing' }` envelope. */
43
+ recordReplayAnchorMissing() {
44
+ this.replayAnchorMissing += 1;
45
+ }
46
+ /** Read every counter atomically — single-threaded JS, so this is a copy. */
47
+ snapshot() {
48
+ return {
49
+ replay_envelopes_received_total: this.replayEnvelopesReceived,
50
+ resubscribes_sent_total: this.resubscribesSent,
51
+ replay_anchor_missing_total: this.replayAnchorMissing,
52
+ };
53
+ }
54
+ }
55
+ //# sourceMappingURL=transportMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transportMetrics.js","sourceRoot":"","sources":["../../src/observability/transportMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAkBH;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IACnB,uBAAuB,GAAG,CAAC,CAAC;IAC5B,gBAAgB,GAAG,CAAC,CAAC;IACrB,mBAAmB,GAAG,CAAC,CAAC;IAEhC,0FAA0F;IACnF,4BAA4B;QACjC,IAAI,CAAC,uBAAuB,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,8EAA8E;IACvE,qBAAqB;QAC1B,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,gFAAgF;IACzE,yBAAyB;QAC9B,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,6EAA6E;IACtE,QAAQ;QACb,OAAO;YACL,+BAA+B,EAAE,IAAI,CAAC,uBAAuB;YAC7D,uBAAuB,EAAE,IAAI,CAAC,gBAAgB;YAC9C,2BAA2B,EAAE,IAAI,CAAC,mBAAmB;SACtD,CAAC;IACJ,CAAC;CACF"}