@qodo/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/LICENSE +118 -0
  2. package/README.md +121 -0
  3. package/dist/api/agent.d.ts +69 -0
  4. package/dist/api/agent.d.ts.map +1 -0
  5. package/dist/api/agent.js +1034 -0
  6. package/dist/api/agent.js.map +1 -0
  7. package/dist/api/analytics.d.ts +43 -0
  8. package/dist/api/analytics.d.ts.map +1 -0
  9. package/dist/api/analytics.js +163 -0
  10. package/dist/api/analytics.js.map +1 -0
  11. package/dist/api/http.d.ts +5 -0
  12. package/dist/api/http.d.ts.map +1 -0
  13. package/dist/api/http.js +59 -0
  14. package/dist/api/http.js.map +1 -0
  15. package/dist/api/index.d.ts +12 -0
  16. package/dist/api/index.d.ts.map +1 -0
  17. package/dist/api/index.js +17 -0
  18. package/dist/api/index.js.map +1 -0
  19. package/dist/api/taskTracking.d.ts +54 -0
  20. package/dist/api/taskTracking.d.ts.map +1 -0
  21. package/dist/api/taskTracking.js +208 -0
  22. package/dist/api/taskTracking.js.map +1 -0
  23. package/dist/api/types.d.ts +92 -0
  24. package/dist/api/types.d.ts.map +1 -0
  25. package/dist/api/types.js +2 -0
  26. package/dist/api/types.js.map +1 -0
  27. package/dist/api/utils.d.ts +8 -0
  28. package/dist/api/utils.d.ts.map +1 -0
  29. package/dist/api/utils.js +54 -0
  30. package/dist/api/utils.js.map +1 -0
  31. package/dist/api/websocket.d.ts +74 -0
  32. package/dist/api/websocket.d.ts.map +1 -0
  33. package/dist/api/websocket.js +685 -0
  34. package/dist/api/websocket.js.map +1 -0
  35. package/dist/auth/index.d.ts +25 -0
  36. package/dist/auth/index.d.ts.map +1 -0
  37. package/dist/auth/index.js +85 -0
  38. package/dist/auth/index.js.map +1 -0
  39. package/dist/clients/index.d.ts +8 -0
  40. package/dist/clients/index.d.ts.map +1 -0
  41. package/dist/clients/index.js +7 -0
  42. package/dist/clients/index.js.map +1 -0
  43. package/dist/clients/info/InfoClient.d.ts +37 -0
  44. package/dist/clients/info/InfoClient.d.ts.map +1 -0
  45. package/dist/clients/info/InfoClient.js +69 -0
  46. package/dist/clients/info/InfoClient.js.map +1 -0
  47. package/dist/clients/info/index.d.ts +4 -0
  48. package/dist/clients/info/index.d.ts.map +1 -0
  49. package/dist/clients/info/index.js +2 -0
  50. package/dist/clients/info/index.js.map +1 -0
  51. package/dist/clients/info/types.d.ts +21 -0
  52. package/dist/clients/info/types.d.ts.map +1 -0
  53. package/dist/clients/info/types.js +2 -0
  54. package/dist/clients/info/types.js.map +1 -0
  55. package/dist/clients/sessions/SessionsClient.d.ts +34 -0
  56. package/dist/clients/sessions/SessionsClient.d.ts.map +1 -0
  57. package/dist/clients/sessions/SessionsClient.js +71 -0
  58. package/dist/clients/sessions/SessionsClient.js.map +1 -0
  59. package/dist/clients/sessions/index.d.ts +4 -0
  60. package/dist/clients/sessions/index.d.ts.map +1 -0
  61. package/dist/clients/sessions/index.js +2 -0
  62. package/dist/clients/sessions/index.js.map +1 -0
  63. package/dist/clients/sessions/types.d.ts +20 -0
  64. package/dist/clients/sessions/types.d.ts.map +1 -0
  65. package/dist/clients/sessions/types.js +2 -0
  66. package/dist/clients/sessions/types.js.map +1 -0
  67. package/dist/config/ConfigManager.d.ts +43 -0
  68. package/dist/config/ConfigManager.d.ts.map +1 -0
  69. package/dist/config/ConfigManager.js +472 -0
  70. package/dist/config/ConfigManager.js.map +1 -0
  71. package/dist/config/index.d.ts +6 -0
  72. package/dist/config/index.d.ts.map +1 -0
  73. package/dist/config/index.js +7 -0
  74. package/dist/config/index.js.map +1 -0
  75. package/dist/config/urlConfig.d.ts +15 -0
  76. package/dist/config/urlConfig.d.ts.map +1 -0
  77. package/dist/config/urlConfig.js +75 -0
  78. package/dist/config/urlConfig.js.map +1 -0
  79. package/dist/constants/errors.d.ts +2 -0
  80. package/dist/constants/errors.d.ts.map +1 -0
  81. package/dist/constants/errors.js +2 -0
  82. package/dist/constants/errors.js.map +1 -0
  83. package/dist/constants/index.d.ts +7 -0
  84. package/dist/constants/index.d.ts.map +1 -0
  85. package/dist/constants/index.js +11 -0
  86. package/dist/constants/index.js.map +1 -0
  87. package/dist/constants/tools.d.ts +4 -0
  88. package/dist/constants/tools.d.ts.map +1 -0
  89. package/dist/constants/tools.js +4 -0
  90. package/dist/constants/tools.js.map +1 -0
  91. package/dist/constants/versions.d.ts +2 -0
  92. package/dist/constants/versions.d.ts.map +1 -0
  93. package/dist/constants/versions.js +2 -0
  94. package/dist/constants/versions.js.map +1 -0
  95. package/dist/context/buildUserContext.d.ts +18 -0
  96. package/dist/context/buildUserContext.d.ts.map +1 -0
  97. package/dist/context/buildUserContext.js +34 -0
  98. package/dist/context/buildUserContext.js.map +1 -0
  99. package/dist/context/index.d.ts +9 -0
  100. package/dist/context/index.d.ts.map +1 -0
  101. package/dist/context/index.js +9 -0
  102. package/dist/context/index.js.map +1 -0
  103. package/dist/context/messageManager.d.ts +42 -0
  104. package/dist/context/messageManager.d.ts.map +1 -0
  105. package/dist/context/messageManager.js +322 -0
  106. package/dist/context/messageManager.js.map +1 -0
  107. package/dist/context/taskFocus.d.ts +2 -0
  108. package/dist/context/taskFocus.d.ts.map +1 -0
  109. package/dist/context/taskFocus.js +26 -0
  110. package/dist/context/taskFocus.js.map +1 -0
  111. package/dist/context/userInput.d.ts +3 -0
  112. package/dist/context/userInput.d.ts.map +1 -0
  113. package/dist/context/userInput.js +20 -0
  114. package/dist/context/userInput.js.map +1 -0
  115. package/dist/index.d.ts +18 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +21 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/mcp/MCPManager.d.ts +125 -0
  120. package/dist/mcp/MCPManager.d.ts.map +1 -0
  121. package/dist/mcp/MCPManager.js +616 -0
  122. package/dist/mcp/MCPManager.js.map +1 -0
  123. package/dist/mcp/approvedTools.d.ts +4 -0
  124. package/dist/mcp/approvedTools.d.ts.map +1 -0
  125. package/dist/mcp/approvedTools.js +19 -0
  126. package/dist/mcp/approvedTools.js.map +1 -0
  127. package/dist/mcp/baseServer.d.ts +75 -0
  128. package/dist/mcp/baseServer.d.ts.map +1 -0
  129. package/dist/mcp/baseServer.js +107 -0
  130. package/dist/mcp/baseServer.js.map +1 -0
  131. package/dist/mcp/builtinServers.d.ts +15 -0
  132. package/dist/mcp/builtinServers.d.ts.map +1 -0
  133. package/dist/mcp/builtinServers.js +155 -0
  134. package/dist/mcp/builtinServers.js.map +1 -0
  135. package/dist/mcp/dynamicBEServer.d.ts +20 -0
  136. package/dist/mcp/dynamicBEServer.d.ts.map +1 -0
  137. package/dist/mcp/dynamicBEServer.js +52 -0
  138. package/dist/mcp/dynamicBEServer.js.map +1 -0
  139. package/dist/mcp/index.d.ts +19 -0
  140. package/dist/mcp/index.d.ts.map +1 -0
  141. package/dist/mcp/index.js +24 -0
  142. package/dist/mcp/index.js.map +1 -0
  143. package/dist/mcp/mcpInitialization.d.ts +2 -0
  144. package/dist/mcp/mcpInitialization.d.ts.map +1 -0
  145. package/dist/mcp/mcpInitialization.js +56 -0
  146. package/dist/mcp/mcpInitialization.js.map +1 -0
  147. package/dist/mcp/servers/filesystem.d.ts +75 -0
  148. package/dist/mcp/servers/filesystem.d.ts.map +1 -0
  149. package/dist/mcp/servers/filesystem.js +992 -0
  150. package/dist/mcp/servers/filesystem.js.map +1 -0
  151. package/dist/mcp/servers/gerrit.d.ts +19 -0
  152. package/dist/mcp/servers/gerrit.d.ts.map +1 -0
  153. package/dist/mcp/servers/gerrit.js +515 -0
  154. package/dist/mcp/servers/gerrit.js.map +1 -0
  155. package/dist/mcp/servers/git.d.ts +18 -0
  156. package/dist/mcp/servers/git.d.ts.map +1 -0
  157. package/dist/mcp/servers/git.js +441 -0
  158. package/dist/mcp/servers/git.js.map +1 -0
  159. package/dist/mcp/servers/ripgrep.d.ts +34 -0
  160. package/dist/mcp/servers/ripgrep.d.ts.map +1 -0
  161. package/dist/mcp/servers/ripgrep.js +517 -0
  162. package/dist/mcp/servers/ripgrep.js.map +1 -0
  163. package/dist/mcp/servers/shell.d.ts +20 -0
  164. package/dist/mcp/servers/shell.d.ts.map +1 -0
  165. package/dist/mcp/servers/shell.js +603 -0
  166. package/dist/mcp/servers/shell.js.map +1 -0
  167. package/dist/mcp/serversRegistry.d.ts +55 -0
  168. package/dist/mcp/serversRegistry.d.ts.map +1 -0
  169. package/dist/mcp/serversRegistry.js +410 -0
  170. package/dist/mcp/serversRegistry.js.map +1 -0
  171. package/dist/mcp/toolProcessor.d.ts +42 -0
  172. package/dist/mcp/toolProcessor.d.ts.map +1 -0
  173. package/dist/mcp/toolProcessor.js +200 -0
  174. package/dist/mcp/toolProcessor.js.map +1 -0
  175. package/dist/mcp/types.d.ts +29 -0
  176. package/dist/mcp/types.d.ts.map +1 -0
  177. package/dist/mcp/types.js +2 -0
  178. package/dist/mcp/types.js.map +1 -0
  179. package/dist/parser/index.d.ts +72 -0
  180. package/dist/parser/index.d.ts.map +1 -0
  181. package/dist/parser/index.js +967 -0
  182. package/dist/parser/index.js.map +1 -0
  183. package/dist/parser/types.d.ts +153 -0
  184. package/dist/parser/types.d.ts.map +1 -0
  185. package/dist/parser/types.js +6 -0
  186. package/dist/parser/types.js.map +1 -0
  187. package/dist/parser/utils.d.ts +18 -0
  188. package/dist/parser/utils.d.ts.map +1 -0
  189. package/dist/parser/utils.js +64 -0
  190. package/dist/parser/utils.js.map +1 -0
  191. package/dist/sdk/QodoSDK.d.ts +152 -0
  192. package/dist/sdk/QodoSDK.d.ts.map +1 -0
  193. package/dist/sdk/QodoSDK.js +786 -0
  194. package/dist/sdk/QodoSDK.js.map +1 -0
  195. package/dist/sdk/bootstrap.d.ts +16 -0
  196. package/dist/sdk/bootstrap.d.ts.map +1 -0
  197. package/dist/sdk/bootstrap.js +21 -0
  198. package/dist/sdk/bootstrap.js.map +1 -0
  199. package/dist/sdk/builders.d.ts +54 -0
  200. package/dist/sdk/builders.d.ts.map +1 -0
  201. package/dist/sdk/builders.js +117 -0
  202. package/dist/sdk/builders.js.map +1 -0
  203. package/dist/sdk/defaults.d.ts +11 -0
  204. package/dist/sdk/defaults.d.ts.map +1 -0
  205. package/dist/sdk/defaults.js +39 -0
  206. package/dist/sdk/defaults.js.map +1 -0
  207. package/dist/sdk/discovery.d.ts +2 -0
  208. package/dist/sdk/discovery.d.ts.map +1 -0
  209. package/dist/sdk/discovery.js +25 -0
  210. package/dist/sdk/discovery.js.map +1 -0
  211. package/dist/sdk/events.d.ts +168 -0
  212. package/dist/sdk/events.d.ts.map +1 -0
  213. package/dist/sdk/events.js +52 -0
  214. package/dist/sdk/events.js.map +1 -0
  215. package/dist/sdk/index.d.ts +17 -0
  216. package/dist/sdk/index.d.ts.map +1 -0
  217. package/dist/sdk/index.js +17 -0
  218. package/dist/sdk/index.js.map +1 -0
  219. package/dist/sdk/runner/AgentRunner.d.ts +22 -0
  220. package/dist/sdk/runner/AgentRunner.d.ts.map +1 -0
  221. package/dist/sdk/runner/AgentRunner.js +222 -0
  222. package/dist/sdk/runner/AgentRunner.js.map +1 -0
  223. package/dist/sdk/runner/finalize.d.ts +9 -0
  224. package/dist/sdk/runner/finalize.d.ts.map +1 -0
  225. package/dist/sdk/runner/finalize.js +115 -0
  226. package/dist/sdk/runner/finalize.js.map +1 -0
  227. package/dist/sdk/runner/formats.d.ts +7 -0
  228. package/dist/sdk/runner/formats.d.ts.map +1 -0
  229. package/dist/sdk/runner/formats.js +91 -0
  230. package/dist/sdk/runner/formats.js.map +1 -0
  231. package/dist/sdk/runner/index.d.ts +9 -0
  232. package/dist/sdk/runner/index.d.ts.map +1 -0
  233. package/dist/sdk/runner/index.js +9 -0
  234. package/dist/sdk/runner/index.js.map +1 -0
  235. package/dist/sdk/runner/progress.d.ts +3 -0
  236. package/dist/sdk/runner/progress.d.ts.map +1 -0
  237. package/dist/sdk/runner/progress.js +16 -0
  238. package/dist/sdk/runner/progress.js.map +1 -0
  239. package/dist/sdk/schemas.d.ts +50 -0
  240. package/dist/sdk/schemas.d.ts.map +1 -0
  241. package/dist/sdk/schemas.js +145 -0
  242. package/dist/sdk/schemas.js.map +1 -0
  243. package/dist/session/SessionContext.d.ts +86 -0
  244. package/dist/session/SessionContext.d.ts.map +1 -0
  245. package/dist/session/SessionContext.js +395 -0
  246. package/dist/session/SessionContext.js.map +1 -0
  247. package/dist/session/environment.d.ts +42 -0
  248. package/dist/session/environment.d.ts.map +1 -0
  249. package/dist/session/environment.js +27 -0
  250. package/dist/session/environment.js.map +1 -0
  251. package/dist/session/history.d.ts +3 -0
  252. package/dist/session/history.d.ts.map +1 -0
  253. package/dist/session/history.js +67 -0
  254. package/dist/session/history.js.map +1 -0
  255. package/dist/session/index.d.ts +10 -0
  256. package/dist/session/index.d.ts.map +1 -0
  257. package/dist/session/index.js +9 -0
  258. package/dist/session/index.js.map +1 -0
  259. package/dist/session/serverData.d.ts +38 -0
  260. package/dist/session/serverData.d.ts.map +1 -0
  261. package/dist/session/serverData.js +241 -0
  262. package/dist/session/serverData.js.map +1 -0
  263. package/dist/tracking/Tracker.d.ts +55 -0
  264. package/dist/tracking/Tracker.d.ts.map +1 -0
  265. package/dist/tracking/Tracker.js +217 -0
  266. package/dist/tracking/Tracker.js.map +1 -0
  267. package/dist/tracking/index.d.ts +8 -0
  268. package/dist/tracking/index.d.ts.map +1 -0
  269. package/dist/tracking/index.js +8 -0
  270. package/dist/tracking/index.js.map +1 -0
  271. package/dist/tracking/schemas.d.ts +292 -0
  272. package/dist/tracking/schemas.d.ts.map +1 -0
  273. package/dist/tracking/schemas.js +91 -0
  274. package/dist/tracking/schemas.js.map +1 -0
  275. package/dist/types.d.ts +4 -0
  276. package/dist/types.d.ts.map +1 -0
  277. package/dist/types.js +2 -0
  278. package/dist/types.js.map +1 -0
  279. package/dist/utils/extractSetFlags.d.ts +6 -0
  280. package/dist/utils/extractSetFlags.d.ts.map +1 -0
  281. package/dist/utils/extractSetFlags.js +16 -0
  282. package/dist/utils/extractSetFlags.js.map +1 -0
  283. package/dist/utils/formatTimeAgo.d.ts +2 -0
  284. package/dist/utils/formatTimeAgo.d.ts.map +1 -0
  285. package/dist/utils/formatTimeAgo.js +20 -0
  286. package/dist/utils/formatTimeAgo.js.map +1 -0
  287. package/dist/utils/index.d.ts +12 -0
  288. package/dist/utils/index.d.ts.map +1 -0
  289. package/dist/utils/index.js +12 -0
  290. package/dist/utils/index.js.map +1 -0
  291. package/dist/utils/machineId.d.ts +14 -0
  292. package/dist/utils/machineId.d.ts.map +1 -0
  293. package/dist/utils/machineId.js +66 -0
  294. package/dist/utils/machineId.js.map +1 -0
  295. package/dist/utils/pathUtils.d.ts +22 -0
  296. package/dist/utils/pathUtils.d.ts.map +1 -0
  297. package/dist/utils/pathUtils.js +54 -0
  298. package/dist/utils/pathUtils.js.map +1 -0
  299. package/dist/version.d.ts +2 -0
  300. package/dist/version.d.ts.map +1 -0
  301. package/dist/version.js +23 -0
  302. package/dist/version.js.map +1 -0
  303. package/package.json +93 -0
@@ -0,0 +1,241 @@
1
+ import { httpRequest } from "../api/http.js";
2
+ import { handle401Error, getApiEndpoint } from "../auth/index.js";
3
+ import process from "node:process";
4
+ import { getCurrentEnvironment, getGlobalEnvironment } from "./environment.js";
5
+ export class QodoBackendBootstrapError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'QodoBackendBootstrapError';
9
+ }
10
+ }
11
+ export class ServerData {
12
+ // NOTE: the static singleton is kept for backward compatibility (CLI/apps).
13
+ // For in-process SDK use we also support an environment-scoped instance via AsyncLocalStorage.
14
+ static instance;
15
+ data = {};
16
+ baseUrl;
17
+ baseUrlSource = 'default';
18
+ rateLimitInfo = {};
19
+ constructor(baseUrlOverride) {
20
+ if (baseUrlOverride) {
21
+ this.baseUrl = baseUrlOverride;
22
+ this.baseUrlSource = 'user';
23
+ }
24
+ else if (process.env.QODO_BASE_URL) {
25
+ this.baseUrl = process.env.QODO_BASE_URL;
26
+ this.baseUrlSource = 'user';
27
+ }
28
+ else {
29
+ this.baseUrl = getApiEndpoint();
30
+ this.baseUrlSource = 'default';
31
+ }
32
+ }
33
+ /**
34
+ * Initialize ServerData for the current environment.
35
+ * - CLI/apps use the legacy process-global singleton.
36
+ * - In-process SDK usage can create an environment-scoped instance.
37
+ */
38
+ static async init(baseUrlOverride) {
39
+ const env = getCurrentEnvironment();
40
+ const globalEnv = getGlobalEnvironment();
41
+ if (env !== globalEnv) {
42
+ let instance = env.serverData;
43
+ if (!instance) {
44
+ instance = new ServerData(baseUrlOverride);
45
+ env.serverData = instance;
46
+ }
47
+ await instance.getThings();
48
+ return instance;
49
+ }
50
+ if (!ServerData.instance) {
51
+ ServerData.instance = new ServerData(baseUrlOverride);
52
+ }
53
+ await ServerData.instance.getThings();
54
+ return ServerData.instance;
55
+ }
56
+ static getInstance() {
57
+ const env = getCurrentEnvironment();
58
+ const globalEnv = getGlobalEnvironment();
59
+ if (env !== globalEnv) {
60
+ let instance = env.serverData;
61
+ if (!instance) {
62
+ // Best-effort fallback: create without get-things. Preferred path is calling init().
63
+ instance = new ServerData();
64
+ env.serverData = instance;
65
+ }
66
+ return instance;
67
+ }
68
+ if (!ServerData.instance) {
69
+ ServerData.instance = new ServerData();
70
+ }
71
+ return ServerData.instance;
72
+ }
73
+ getBaseUrl() {
74
+ return this.baseUrl;
75
+ }
76
+ getBaseUrlSource() {
77
+ return this.baseUrlSource;
78
+ }
79
+ processBaseUrl(baseUrl) {
80
+ try {
81
+ const url = new URL(baseUrl);
82
+ return url.toString();
83
+ }
84
+ catch (error) {
85
+ // If URL parsing fails, return the original baseUrl
86
+ console.warn(`Failed to process base_url: ${baseUrl}`, error);
87
+ return baseUrl;
88
+ }
89
+ }
90
+ async getThings(section) {
91
+ try {
92
+ const url = section ? `/v2/info/get-things?section=${section}` : "/v2/info/get-things";
93
+ const response = await httpRequest({ method: "GET", url, includeHeaders: true });
94
+ const things = response.data || response;
95
+ const headers = response.headers || {};
96
+ // Store rate limit information if present and valid
97
+ if (headers['x-ratelimit-remaining'] !== undefined) {
98
+ const remaining = parseInt(headers['x-ratelimit-remaining'], 10);
99
+ if (!isNaN(remaining)) {
100
+ this.rateLimitInfo.remaining = remaining;
101
+ }
102
+ }
103
+ if (headers['x-ratelimit-reset'] !== undefined) {
104
+ const reset = parseInt(headers['x-ratelimit-reset'], 10);
105
+ if (!isNaN(reset)) {
106
+ this.rateLimitInfo.reset = reset;
107
+ }
108
+ }
109
+ if (headers['x-ratelimit-limit'] !== undefined) {
110
+ const limit = parseInt(headers['x-ratelimit-limit'], 10);
111
+ if (!isNaN(limit)) {
112
+ this.rateLimitInfo.limit = limit;
113
+ }
114
+ }
115
+ if (things) {
116
+ this.data = things;
117
+ // Check if response contains base_url
118
+ if (things.base_url) {
119
+ const newBaseUrl = this.processBaseUrl(things.base_url);
120
+ if (newBaseUrl !== this.baseUrl) {
121
+ this.baseUrl = newBaseUrl;
122
+ this.baseUrlSource = 'server';
123
+ // Recursively call getThings with the new base URL
124
+ await this.getThings(section);
125
+ return;
126
+ }
127
+ }
128
+ }
129
+ if (Object.keys(things).length === 0) {
130
+ throw new Error("No data found from the server.");
131
+ }
132
+ }
133
+ catch (error) {
134
+ if (error?.response?.status === 401) {
135
+ handle401Error();
136
+ }
137
+ const message = error instanceof Error
138
+ ? error.message
139
+ : (typeof error === 'string' ? error : 'Unable to connect to Qodo Command servers.');
140
+ throw new QodoBackendBootstrapError(message);
141
+ }
142
+ }
143
+ getDefaultModel() {
144
+ try {
145
+ return this.data?.default_model;
146
+ }
147
+ catch (error) {
148
+ return undefined;
149
+ }
150
+ }
151
+ getAvailableModels() {
152
+ try {
153
+ const availableModels = this.data?.models ?? [];
154
+ return availableModels.map((model) => model.model_name);
155
+ }
156
+ catch (error) {
157
+ if (error?.response?.status === 401) {
158
+ handle401Error();
159
+ return [];
160
+ }
161
+ if (error instanceof Error) {
162
+ console.error(`Failed to fetch available models: ${error.message || "Connection error"}`);
163
+ }
164
+ else {
165
+ console.error("An unknown error occurred while fetching available models.");
166
+ }
167
+ return [];
168
+ }
169
+ }
170
+ checkModelInput(model) {
171
+ const availableModels = this.getAvailableModels() ?? [];
172
+ if (availableModels.length === 0) {
173
+ throw new QodoBackendBootstrapError("No available models found.");
174
+ }
175
+ if (!availableModels.includes(model)) {
176
+ throw new QodoBackendBootstrapError(`Model "${model}" is not available. Available models: ${availableModels.join(', ')}`);
177
+ }
178
+ }
179
+ getVersion() {
180
+ try {
181
+ return this.data?.version;
182
+ }
183
+ catch (error) {
184
+ return undefined;
185
+ }
186
+ }
187
+ getSessionId() {
188
+ try {
189
+ return this.data?.["session-id"];
190
+ }
191
+ catch (error) {
192
+ return undefined;
193
+ }
194
+ }
195
+ async fetchNewSessionId() {
196
+ try {
197
+ const response = await httpRequest({ method: "GET", url: "/v2/info/get-things?section=session-id" });
198
+ if (response?.["session-id"]) {
199
+ return response["session-id"];
200
+ }
201
+ throw new Error("No session-id in server response");
202
+ }
203
+ catch (error) {
204
+ if (error?.response?.status === 401) {
205
+ handle401Error();
206
+ }
207
+ if (error instanceof Error) {
208
+ throw new Error(`Failed to fetch session-id from server: ${error.message}`);
209
+ }
210
+ else {
211
+ throw new Error("Failed to fetch session-id from server");
212
+ }
213
+ }
214
+ }
215
+ getRecentSessions() {
216
+ try {
217
+ return this.data?.["recent-sessions"] || [];
218
+ }
219
+ catch (error) {
220
+ return [];
221
+ }
222
+ }
223
+ getRateLimitRemaining() {
224
+ return this.rateLimitInfo.remaining;
225
+ }
226
+ getRateLimitReset() {
227
+ return this.rateLimitInfo.reset;
228
+ }
229
+ getRateLimitLimit() {
230
+ return this.rateLimitInfo.limit;
231
+ }
232
+ getMCPTools() {
233
+ try {
234
+ return this.data?.["mcp-tools"] || {};
235
+ }
236
+ catch (error) {
237
+ return {};
238
+ }
239
+ }
240
+ }
241
+ //# sourceMappingURL=serverData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverData.js","sourceRoot":"","sources":["../../src/session/serverData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type QodoTrackerOptions = {
2
+ /**
3
+ * Optional API key.
4
+ * If omitted, defaults to process.env.QODO_API_KEY.
5
+ */
6
+ apiKey?: string;
7
+ /**
8
+ * Optional override for the bootstrap API endpoint used to resolve tenant base_url.
9
+ * If omitted, uses the same logic as the CLI (getApiEndpoint()).
10
+ */
11
+ bootstrapBaseUrl?: string;
12
+ /**
13
+ * Optional request timeout for bootstrap + analytics.
14
+ */
15
+ timeoutMs?: number;
16
+ };
17
+ /**
18
+ * A lean SDK client for analytics tracking.
19
+ *
20
+ * Key requirement: tenant-specific base_url MUST be taken from GET /v2/info/get-things.
21
+ *
22
+ * SDK safety: never calls process.exit(). Failures are treated as a no-op.
23
+ */
24
+ export declare class QodoTracker {
25
+ private readonly apiKey?;
26
+ private readonly bootstrapBaseUrl;
27
+ private readonly timeoutMs;
28
+ private tenantBaseUrl?;
29
+ private tenantBaseUrlInFlight?;
30
+ constructor(options?: QodoTrackerOptions);
31
+ /**
32
+ * Optional pre-warm step.
33
+ *
34
+ * Why it's not automatic in the constructor:
35
+ * - constructors can't be async, and we don't want to start network requests as a side-effect
36
+ * of `new QodoTracker()` unless the user explicitly opts-in.
37
+ */
38
+ init(): Promise<void>;
39
+ /**
40
+ * Track a custom analytics event.
41
+ *
42
+ * Behavior:
43
+ * - If apiKey is missing, this is a no-op.
44
+ * - If tenant base_url cannot be resolved from get-things, this is a no-op.
45
+ * - Network/auth errors never throw.
46
+ */
47
+ track(operation: string, properties?: Record<string, any>): Promise<void>;
48
+ private getTenantBaseUrl;
49
+ private fetchBaseUrlFromGetThings;
50
+ private buildActionEvent;
51
+ private postAnalytics;
52
+ private normalizeUrl;
53
+ private static tryReadAuthKeyFile;
54
+ }
55
+ //# sourceMappingURL=Tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tracker.d.ts","sourceRoot":"","sources":["../../src/tracking/Tracker.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAC,CAA8B;gBAEhD,OAAO,GAAE,kBAAuB;IAQ5C;;;;;;OAMG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC;;;;;;;OAOG;IACU,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAcxE,gBAAgB;YAuChB,yBAAyB;IA2BvC,OAAO,CAAC,gBAAgB;YAuDV,aAAa;IA4B3B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAWlC"}
@@ -0,0 +1,217 @@
1
+ import axios from 'axios';
2
+ import os from 'os';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { v4 as uuid } from 'uuid';
6
+ import { ActionEventHelper } from './schemas.js';
7
+ import { getUserData } from '../api/utils.js';
8
+ import { getApiEndpoint } from '../auth/index.js';
9
+ /**
10
+ * A lean SDK client for analytics tracking.
11
+ *
12
+ * Key requirement: tenant-specific base_url MUST be taken from GET /v2/info/get-things.
13
+ *
14
+ * SDK safety: never calls process.exit(). Failures are treated as a no-op.
15
+ */
16
+ export class QodoTracker {
17
+ apiKey;
18
+ bootstrapBaseUrl;
19
+ timeoutMs;
20
+ tenantBaseUrl;
21
+ tenantBaseUrlInFlight;
22
+ constructor(options = {}) {
23
+ // apiKey is optional; default is process.env.QODO_API_KEY (as requested).
24
+ // Additionally, we try ~/.qodo/auth.key as a convenience for users who ran `qodo login`.
25
+ this.apiKey = options.apiKey ?? process.env.QODO_API_KEY ?? QodoTracker.tryReadAuthKeyFile();
26
+ this.bootstrapBaseUrl = options.bootstrapBaseUrl ?? getApiEndpoint();
27
+ this.timeoutMs = options.timeoutMs ?? 10000;
28
+ }
29
+ /**
30
+ * Optional pre-warm step.
31
+ *
32
+ * Why it's not automatic in the constructor:
33
+ * - constructors can't be async, and we don't want to start network requests as a side-effect
34
+ * of `new QodoTracker()` unless the user explicitly opts-in.
35
+ */
36
+ async init() {
37
+ await this.getTenantBaseUrl();
38
+ }
39
+ /**
40
+ * Track a custom analytics event.
41
+ *
42
+ * Behavior:
43
+ * - If apiKey is missing, this is a no-op.
44
+ * - If tenant base_url cannot be resolved from get-things, this is a no-op.
45
+ * - Network/auth errors never throw.
46
+ */
47
+ async track(operation, properties) {
48
+ if (!operation || typeof operation !== 'string') {
49
+ throw new Error('QodoTracker.track requires an operation name (string).');
50
+ }
51
+ if (!this.apiKey)
52
+ return;
53
+ const tenantBaseUrl = await this.getTenantBaseUrl();
54
+ if (!tenantBaseUrl)
55
+ return;
56
+ const event = this.buildActionEvent(operation, tenantBaseUrl, properties);
57
+ await this.postAnalytics(tenantBaseUrl, event);
58
+ }
59
+ async getTenantBaseUrl() {
60
+ if (this.tenantBaseUrl)
61
+ return this.tenantBaseUrl;
62
+ if (this.tenantBaseUrlInFlight)
63
+ return this.tenantBaseUrlInFlight;
64
+ this.tenantBaseUrlInFlight = (async () => {
65
+ try {
66
+ // Always resolve base_url from get-things.
67
+ // Similar to ServerData.getThings(), but SDK-safe (no process.exit).
68
+ let current = this.normalizeUrl(this.bootstrapBaseUrl);
69
+ if (!current)
70
+ return undefined;
71
+ for (let i = 0; i < 3; i++) {
72
+ const next = await this.fetchBaseUrlFromGetThings(current);
73
+ const nextNormalized = next ? this.normalizeUrl(next) : undefined;
74
+ if (!nextNormalized)
75
+ return undefined;
76
+ if (nextNormalized === current) {
77
+ this.tenantBaseUrl = current;
78
+ return current;
79
+ }
80
+ // follow redirect/base_url change and try again
81
+ current = nextNormalized;
82
+ }
83
+ // If it keeps changing, still use the last one.
84
+ this.tenantBaseUrl = current;
85
+ return current;
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ finally {
91
+ // allow retries later if resolution failed
92
+ this.tenantBaseUrlInFlight = undefined;
93
+ }
94
+ })();
95
+ return this.tenantBaseUrlInFlight;
96
+ }
97
+ async fetchBaseUrlFromGetThings(baseURL) {
98
+ try {
99
+ const cfg = {
100
+ baseURL,
101
+ url: '/v2/info/get-things',
102
+ method: 'GET',
103
+ timeout: this.timeoutMs,
104
+ headers: {
105
+ Accept: 'application/json',
106
+ Authorization: `Bearer ${this.apiKey}`,
107
+ 'Request-id': uuid(),
108
+ // serverData sometimes uses Session-id too; doesn't hurt
109
+ 'Session-id': uuid(),
110
+ },
111
+ };
112
+ const res = await axios(cfg);
113
+ const candidate = res?.data?.base_url;
114
+ if (typeof candidate === 'string' && candidate.trim().length > 0) {
115
+ return candidate.trim();
116
+ }
117
+ return baseURL;
118
+ }
119
+ catch {
120
+ return undefined;
121
+ }
122
+ }
123
+ buildActionEvent(operation, tenantBaseUrl, properties) {
124
+ const userData = getUserData();
125
+ const requestId = uuid();
126
+ const sessionId = uuid();
127
+ // Keep shape consistent with trackCustomActionEvent() but without ServerData dependency
128
+ const props = {
129
+ product: 'qodo_command',
130
+ operation,
131
+ request_id: requestId,
132
+ time: Math.floor(Date.now() / 1000),
133
+ chat_message: {
134
+ chat_id: sessionId,
135
+ execution_mode: 'cmdline',
136
+ interface: 'sdk',
137
+ },
138
+ qodo_gen: {
139
+ cli_version: userData.extension_version,
140
+ os_platform: process.platform,
141
+ os_version: os.release(),
142
+ source: 'cli',
143
+ },
144
+ service: {
145
+ base_url: tenantBaseUrl,
146
+ },
147
+ };
148
+ if (properties && typeof properties === 'object') {
149
+ const raw = properties;
150
+ const { internal_event, user_data, email, custom_model, ...rest } = raw;
151
+ if (typeof internal_event !== 'undefined') {
152
+ props.internal_event = !!internal_event;
153
+ }
154
+ if (user_data && typeof user_data === 'object') {
155
+ props.user_data = user_data;
156
+ }
157
+ if (typeof email === 'string' && email.trim().length > 0) {
158
+ props.email = email.trim();
159
+ }
160
+ if (typeof custom_model === 'string' && custom_model.trim().length > 0) {
161
+ props.custom_model = custom_model.trim();
162
+ }
163
+ if (Object.keys(rest).length > 0) {
164
+ props.sdk_custom = rest;
165
+ }
166
+ }
167
+ return ActionEventHelper.create(props);
168
+ }
169
+ async postAnalytics(tenantBaseUrl, event) {
170
+ try {
171
+ const payload = {
172
+ user_data: getUserData(),
173
+ ...event,
174
+ };
175
+ const cfg = {
176
+ baseURL: tenantBaseUrl,
177
+ url: '/v1/analytics/track',
178
+ method: 'POST',
179
+ timeout: this.timeoutMs,
180
+ headers: {
181
+ Accept: 'text/plain',
182
+ 'Content-Type': 'application/json',
183
+ 'Request-id': uuid(),
184
+ 'Session-id': payload?.properties?.chat_message?.chat_id ?? uuid(),
185
+ Authorization: `Bearer ${this.apiKey}`,
186
+ },
187
+ data: payload,
188
+ };
189
+ await axios(cfg);
190
+ }
191
+ catch {
192
+ // Never throw from analytics
193
+ }
194
+ }
195
+ normalizeUrl(url) {
196
+ try {
197
+ return new URL(url).toString();
198
+ }
199
+ catch {
200
+ return undefined;
201
+ }
202
+ }
203
+ static tryReadAuthKeyFile() {
204
+ try {
205
+ // Keep this non-fatal: do not throw and do not exit.
206
+ const authFile = join(os.homedir(), '.qodo', 'auth.key');
207
+ if (!existsSync(authFile))
208
+ return undefined;
209
+ const v = readFileSync(authFile, 'utf8').trim();
210
+ return v.length > 0 ? v : undefined;
211
+ }
212
+ catch {
213
+ return undefined;
214
+ }
215
+ }
216
+ }
217
+ //# sourceMappingURL=Tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tracker.js","sourceRoot":"","sources":["../../src/tracking/Tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Analytics and tracking utilities
3
+ * @internal
4
+ */
5
+ export type { QodoTrackerOptions } from './Tracker.js';
6
+ export { ActionEventHelper, ResponseEventHelper, AnalyticsUtils, } from './schemas.js';
7
+ export type { ActionEvent, ResponseEvent, AnalyticsEvent, } from './schemas.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracking/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Analytics and tracking utilities
3
+ * @internal
4
+ */
5
+ export { QodoTracker } from './Tracker.js';
6
+ // Re-export schemas for analytics
7
+ export { ActionEventHelper, ResponseEventHelper, AnalyticsUtils, } from './schemas.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracking/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,kCAAkC;AAClC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC"}