@dexcost/sdk 0.2.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/adapters/_netbytes.d.ts +31 -0
  4. package/dist/adapters/_netbytes.d.ts.map +1 -0
  5. package/dist/adapters/_netbytes.js +154 -0
  6. package/dist/adapters/_netbytes.js.map +1 -0
  7. package/dist/adapters/aws-lambda.d.ts +41 -0
  8. package/dist/adapters/aws-lambda.d.ts.map +1 -0
  9. package/dist/adapters/aws-lambda.js +65 -0
  10. package/dist/adapters/aws-lambda.js.map +1 -0
  11. package/dist/adapters/browser.d.ts +52 -0
  12. package/dist/adapters/browser.d.ts.map +1 -0
  13. package/dist/adapters/browser.js +127 -0
  14. package/dist/adapters/browser.js.map +1 -0
  15. package/dist/adapters/compute-wrap.d.ts +33 -0
  16. package/dist/adapters/compute-wrap.d.ts.map +1 -0
  17. package/dist/adapters/compute-wrap.js +188 -0
  18. package/dist/adapters/compute-wrap.js.map +1 -0
  19. package/dist/adapters/data/aws_lambda_pricing.json +61 -0
  20. package/dist/adapters/gpu-wrap.d.ts +31 -0
  21. package/dist/adapters/gpu-wrap.d.ts.map +1 -0
  22. package/dist/adapters/gpu-wrap.js +147 -0
  23. package/dist/adapters/gpu-wrap.js.map +1 -0
  24. package/dist/adapters/http.d.ts +58 -0
  25. package/dist/adapters/http.d.ts.map +1 -0
  26. package/dist/adapters/http.js +769 -0
  27. package/dist/adapters/http.js.map +1 -0
  28. package/dist/adapters/index.d.ts +11 -0
  29. package/dist/adapters/index.d.ts.map +1 -0
  30. package/dist/adapters/index.js +12 -0
  31. package/dist/adapters/index.js.map +1 -0
  32. package/dist/adapters/network-accountant.d.ts +63 -0
  33. package/dist/adapters/network-accountant.d.ts.map +1 -0
  34. package/dist/adapters/network-accountant.js +153 -0
  35. package/dist/adapters/network-accountant.js.map +1 -0
  36. package/dist/cli/index.d.ts +13 -0
  37. package/dist/cli/index.d.ts.map +1 -0
  38. package/dist/cli/index.js +225 -0
  39. package/dist/cli/index.js.map +1 -0
  40. package/dist/cli/scanner.d.ts +39 -0
  41. package/dist/cli/scanner.d.ts.map +1 -0
  42. package/dist/cli/scanner.js +480 -0
  43. package/dist/cli/scanner.js.map +1 -0
  44. package/dist/clients.d.ts +54 -0
  45. package/dist/clients.d.ts.map +1 -0
  46. package/dist/clients.js +240 -0
  47. package/dist/clients.js.map +1 -0
  48. package/dist/cloud-detect.d.ts +96 -0
  49. package/dist/cloud-detect.d.ts.map +1 -0
  50. package/dist/cloud-detect.js +545 -0
  51. package/dist/cloud-detect.js.map +1 -0
  52. package/dist/core/auto-task.d.ts +20 -0
  53. package/dist/core/auto-task.d.ts.map +1 -0
  54. package/dist/core/auto-task.js +34 -0
  55. package/dist/core/auto-task.js.map +1 -0
  56. package/dist/core/cgroup-reader.d.ts +45 -0
  57. package/dist/core/cgroup-reader.d.ts.map +1 -0
  58. package/dist/core/cgroup-reader.js +124 -0
  59. package/dist/core/cgroup-reader.js.map +1 -0
  60. package/dist/core/cgroup-walker.d.ts +60 -0
  61. package/dist/core/cgroup-walker.d.ts.map +1 -0
  62. package/dist/core/cgroup-walker.js +166 -0
  63. package/dist/core/cgroup-walker.js.map +1 -0
  64. package/dist/core/compute-accountant.d.ts +51 -0
  65. package/dist/core/compute-accountant.d.ts.map +1 -0
  66. package/dist/core/compute-accountant.js +179 -0
  67. package/dist/core/compute-accountant.js.map +1 -0
  68. package/dist/core/compute-runtime.d.ts +42 -0
  69. package/dist/core/compute-runtime.d.ts.map +1 -0
  70. package/dist/core/compute-runtime.js +80 -0
  71. package/dist/core/compute-runtime.js.map +1 -0
  72. package/dist/core/config.d.ts +44 -0
  73. package/dist/core/config.d.ts.map +1 -0
  74. package/dist/core/config.js +66 -0
  75. package/dist/core/config.js.map +1 -0
  76. package/dist/core/context.d.ts +76 -0
  77. package/dist/core/context.d.ts.map +1 -0
  78. package/dist/core/context.js +91 -0
  79. package/dist/core/context.js.map +1 -0
  80. package/dist/core/fargate-metadata.d.ts +27 -0
  81. package/dist/core/fargate-metadata.d.ts.map +1 -0
  82. package/dist/core/fargate-metadata.js +102 -0
  83. package/dist/core/fargate-metadata.js.map +1 -0
  84. package/dist/core/gpu-accountant.d.ts +104 -0
  85. package/dist/core/gpu-accountant.d.ts.map +1 -0
  86. package/dist/core/gpu-accountant.js +383 -0
  87. package/dist/core/gpu-accountant.js.map +1 -0
  88. package/dist/core/gpu-runtime.d.ts +58 -0
  89. package/dist/core/gpu-runtime.d.ts.map +1 -0
  90. package/dist/core/gpu-runtime.js +131 -0
  91. package/dist/core/gpu-runtime.js.map +1 -0
  92. package/dist/core/heuristics.d.ts +74 -0
  93. package/dist/core/heuristics.d.ts.map +1 -0
  94. package/dist/core/heuristics.js +182 -0
  95. package/dist/core/heuristics.js.map +1 -0
  96. package/dist/core/models.d.ts +149 -0
  97. package/dist/core/models.d.ts.map +1 -0
  98. package/dist/core/models.js +226 -0
  99. package/dist/core/models.js.map +1 -0
  100. package/dist/core/nvml-reader.d.ts +114 -0
  101. package/dist/core/nvml-reader.d.ts.map +1 -0
  102. package/dist/core/nvml-reader.js +323 -0
  103. package/dist/core/nvml-reader.js.map +1 -0
  104. package/dist/core/session.d.ts +48 -0
  105. package/dist/core/session.d.ts.map +1 -0
  106. package/dist/core/session.js +123 -0
  107. package/dist/core/session.js.map +1 -0
  108. package/dist/core/tracker.d.ts +364 -0
  109. package/dist/core/tracker.d.ts.map +1 -0
  110. package/dist/core/tracker.js +1073 -0
  111. package/dist/core/tracker.js.map +1 -0
  112. package/dist/data/compute_prices.json +180 -0
  113. package/dist/data/egress_prices.json +418 -0
  114. package/dist/data/gpu_prices.json +412 -0
  115. package/dist/data/service_prices.json +2595 -0
  116. package/dist/dev-console.d.ts +12 -0
  117. package/dist/dev-console.d.ts.map +1 -0
  118. package/dist/dev-console.js +60 -0
  119. package/dist/dev-console.js.map +1 -0
  120. package/dist/index.d.ts +52 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +61 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/instruments/anthropic.d.ts +26 -0
  125. package/dist/instruments/anthropic.d.ts.map +1 -0
  126. package/dist/instruments/anthropic.js +242 -0
  127. package/dist/instruments/anthropic.js.map +1 -0
  128. package/dist/instruments/bedrock.d.ts +29 -0
  129. package/dist/instruments/bedrock.d.ts.map +1 -0
  130. package/dist/instruments/bedrock.js +215 -0
  131. package/dist/instruments/bedrock.js.map +1 -0
  132. package/dist/instruments/cohere.d.ts +29 -0
  133. package/dist/instruments/cohere.d.ts.map +1 -0
  134. package/dist/instruments/cohere.js +237 -0
  135. package/dist/instruments/cohere.js.map +1 -0
  136. package/dist/instruments/gemini.d.ts +30 -0
  137. package/dist/instruments/gemini.d.ts.map +1 -0
  138. package/dist/instruments/gemini.js +247 -0
  139. package/dist/instruments/gemini.js.map +1 -0
  140. package/dist/instruments/index.d.ts +35 -0
  141. package/dist/instruments/index.d.ts.map +1 -0
  142. package/dist/instruments/index.js +54 -0
  143. package/dist/instruments/index.js.map +1 -0
  144. package/dist/instruments/mcp.d.ts +24 -0
  145. package/dist/instruments/mcp.d.ts.map +1 -0
  146. package/dist/instruments/mcp.js +459 -0
  147. package/dist/instruments/mcp.js.map +1 -0
  148. package/dist/instruments/openai.d.ts +26 -0
  149. package/dist/instruments/openai.d.ts.map +1 -0
  150. package/dist/instruments/openai.js +221 -0
  151. package/dist/instruments/openai.js.map +1 -0
  152. package/dist/instruments/vercel-ai.d.ts +28 -0
  153. package/dist/instruments/vercel-ai.d.ts.map +1 -0
  154. package/dist/instruments/vercel-ai.js +192 -0
  155. package/dist/instruments/vercel-ai.js.map +1 -0
  156. package/dist/integrations/langchain.d.ts +65 -0
  157. package/dist/integrations/langchain.d.ts.map +1 -0
  158. package/dist/integrations/langchain.js +165 -0
  159. package/dist/integrations/langchain.js.map +1 -0
  160. package/dist/middleware/express.d.ts +55 -0
  161. package/dist/middleware/express.d.ts.map +1 -0
  162. package/dist/middleware/express.js +101 -0
  163. package/dist/middleware/express.js.map +1 -0
  164. package/dist/middleware/index.d.ts +6 -0
  165. package/dist/middleware/index.d.ts.map +1 -0
  166. package/dist/middleware/index.js +5 -0
  167. package/dist/middleware/index.js.map +1 -0
  168. package/dist/pricing/compute-pricing.d.ts +57 -0
  169. package/dist/pricing/compute-pricing.d.ts.map +1 -0
  170. package/dist/pricing/compute-pricing.js +627 -0
  171. package/dist/pricing/compute-pricing.js.map +1 -0
  172. package/dist/pricing/cost_map.json +37665 -0
  173. package/dist/pricing/egress-pricing.d.ts +55 -0
  174. package/dist/pricing/egress-pricing.d.ts.map +1 -0
  175. package/dist/pricing/egress-pricing.js +226 -0
  176. package/dist/pricing/egress-pricing.js.map +1 -0
  177. package/dist/pricing/engine.d.ts +24 -0
  178. package/dist/pricing/engine.d.ts.map +1 -0
  179. package/dist/pricing/engine.js +148 -0
  180. package/dist/pricing/engine.js.map +1 -0
  181. package/dist/pricing/gpu-pricing.d.ts +63 -0
  182. package/dist/pricing/gpu-pricing.d.ts.map +1 -0
  183. package/dist/pricing/gpu-pricing.js +484 -0
  184. package/dist/pricing/gpu-pricing.js.map +1 -0
  185. package/dist/pricing/rates.d.ts +17 -0
  186. package/dist/pricing/rates.d.ts.map +1 -0
  187. package/dist/pricing/rates.js +102 -0
  188. package/dist/pricing/rates.js.map +1 -0
  189. package/dist/pricing/service-catalog.d.ts +87 -0
  190. package/dist/pricing/service-catalog.d.ts.map +1 -0
  191. package/dist/pricing/service-catalog.js +406 -0
  192. package/dist/pricing/service-catalog.js.map +1 -0
  193. package/dist/schema/dexcost-event.v1.json +111 -0
  194. package/dist/schema/dexcost-task.v1.json +160 -0
  195. package/dist/schema/validate.d.ts +15 -0
  196. package/dist/schema/validate.d.ts.map +1 -0
  197. package/dist/schema/validate.js +87 -0
  198. package/dist/schema/validate.js.map +1 -0
  199. package/dist/security/redaction.d.ts +55 -0
  200. package/dist/security/redaction.d.ts.map +1 -0
  201. package/dist/security/redaction.js +144 -0
  202. package/dist/security/redaction.js.map +1 -0
  203. package/dist/transport/buffer.d.ts +117 -0
  204. package/dist/transport/buffer.d.ts.map +1 -0
  205. package/dist/transport/buffer.js +759 -0
  206. package/dist/transport/buffer.js.map +1 -0
  207. package/dist/transport/pusher.d.ts +89 -0
  208. package/dist/transport/pusher.d.ts.map +1 -0
  209. package/dist/transport/pusher.js +323 -0
  210. package/dist/transport/pusher.js.map +1 -0
  211. package/package.json +93 -0
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Code scanner for cost point detection (US-031).
3
+ *
4
+ * Regex-based static analysis — no API key needed, runs offline.
5
+ *
6
+ * Detection layers:
7
+ * 1. LLM SDK calls (auto-instrumentable by dexcost or manual)
8
+ * 2. Agent framework invocations (LangChain, Mastra, CrewAI, etc.)
9
+ * 3. Direct HTTP calls to known AI API endpoints
10
+ * 4. SDK imports for paid services (AWS, Stripe, Firebase, etc.)
11
+ * 5. Service-specific method calls (MongoDB, Elasticsearch, etc.)
12
+ */
13
+ const PATTERNS = [
14
+ // ── LLM SDK calls (auto-instrumented by dexcost) ────────────────────
15
+ {
16
+ regex: /\.chat\s*\.\s*completions\s*\.\s*create\b/g,
17
+ provider: "openai",
18
+ type: "llm_call",
19
+ autoInstrumentable: true,
20
+ },
21
+ {
22
+ regex: /\.messages\s*\.\s*create\b/g,
23
+ provider: "anthropic",
24
+ type: "llm_call",
25
+ autoInstrumentable: true,
26
+ },
27
+ {
28
+ regex: /\b(generateText|streamText)\s*\(/g,
29
+ provider: "vercel-ai",
30
+ type: "llm_call",
31
+ autoInstrumentable: true,
32
+ },
33
+ // ── Additional LLM providers (need recordCost) ──────────────────────
34
+ // Groq — uses OpenAI-compatible SDK: groq-sdk
35
+ {
36
+ regex: /from\s+["']groq-sdk["']|require\s*\(\s*["']groq-sdk["']\s*\)/g,
37
+ provider: "groq",
38
+ type: "sdk_import",
39
+ autoInstrumentable: false,
40
+ },
41
+ // Mistral — @mistralai/mistralai, uses client.chat.complete()
42
+ {
43
+ regex: /\.chat\s*\.\s*complete\b/g,
44
+ provider: "mistral",
45
+ type: "llm_call",
46
+ autoInstrumentable: false,
47
+ },
48
+ {
49
+ regex: /from\s+["']@mistralai\/mistralai["']/g,
50
+ provider: "mistral",
51
+ type: "sdk_import",
52
+ autoInstrumentable: false,
53
+ },
54
+ // Together AI — together-ai
55
+ {
56
+ regex: /from\s+["']together-ai["']|require\s*\(\s*["']together-ai["']\s*\)/g,
57
+ provider: "together",
58
+ type: "sdk_import",
59
+ autoInstrumentable: false,
60
+ },
61
+ // Replicate — replicate.run()
62
+ {
63
+ regex: /replicate\s*\.\s*run\s*\(/g,
64
+ provider: "replicate",
65
+ type: "llm_call",
66
+ autoInstrumentable: false,
67
+ },
68
+ {
69
+ regex: /from\s+["']replicate["']|require\s*\(\s*["']replicate["']\s*\)/g,
70
+ provider: "replicate",
71
+ type: "sdk_import",
72
+ autoInstrumentable: false,
73
+ },
74
+ // Fireworks AI
75
+ {
76
+ regex: /from\s+["']@fireworks-ai\/client["']/g,
77
+ provider: "fireworks",
78
+ type: "sdk_import",
79
+ autoInstrumentable: false,
80
+ },
81
+ // Cohere — cohere.chat() / cohere.generate()
82
+ {
83
+ regex: /\bcohere\s*\.\s*(chat|generate|embed)\s*\(/g,
84
+ provider: "cohere",
85
+ type: "llm_call",
86
+ autoInstrumentable: true,
87
+ },
88
+ {
89
+ regex: /from\s+["']cohere-ai["']|require\s*\(\s*["']cohere-ai["']\s*\)/g,
90
+ provider: "cohere",
91
+ type: "sdk_import",
92
+ autoInstrumentable: true,
93
+ },
94
+ // Google Gemini — @google/genai, generateContent
95
+ {
96
+ regex: /\.generateContent\s*\(/g,
97
+ provider: "google-ai",
98
+ type: "llm_call",
99
+ autoInstrumentable: true,
100
+ },
101
+ // Ollama
102
+ {
103
+ regex: /from\s+["']ollama["']|require\s*\(\s*["']ollama["']\s*\)/g,
104
+ provider: "ollama",
105
+ type: "sdk_import",
106
+ autoInstrumentable: false,
107
+ },
108
+ // ── Embeddings ──────────────────────────────────────────────────────
109
+ {
110
+ regex: /\.embeddings\s*\.\s*create\s*\(/g,
111
+ provider: "openai",
112
+ type: "embedding",
113
+ autoInstrumentable: false,
114
+ },
115
+ // ── Speech / Audio ──────────────────────────────────────────────────
116
+ {
117
+ regex: /\.audio\s*\.\s*transcriptions\s*\.\s*create\s*\(/g,
118
+ provider: "openai-whisper",
119
+ type: "speech",
120
+ autoInstrumentable: false,
121
+ },
122
+ {
123
+ regex: /\.audio\s*\.\s*speech\s*\.\s*create\s*\(/g,
124
+ provider: "openai-tts",
125
+ type: "speech",
126
+ autoInstrumentable: false,
127
+ },
128
+ {
129
+ regex: /from\s+["']@deepgram\/sdk["']/g,
130
+ provider: "deepgram",
131
+ type: "sdk_import",
132
+ autoInstrumentable: false,
133
+ },
134
+ {
135
+ regex: /from\s+["']assemblyai["']/g,
136
+ provider: "assemblyai",
137
+ type: "sdk_import",
138
+ autoInstrumentable: false,
139
+ },
140
+ // ── Image generation ────────────────────────────────────────────────
141
+ {
142
+ regex: /\.images\s*\.\s*generate\s*\(/g,
143
+ provider: "openai-dalle",
144
+ type: "image",
145
+ autoInstrumentable: false,
146
+ },
147
+ // ── Agent framework calls ───────────────────────────────────────────
148
+ // LangChain.js — .invoke(), .stream(), .batch()
149
+ {
150
+ regex: /from\s+["'](@langchain\/openai|@langchain\/anthropic|@langchain\/core|langchain)["']/g,
151
+ provider: "langchain",
152
+ type: "sdk_import",
153
+ autoInstrumentable: false,
154
+ },
155
+ {
156
+ regex: /\.(invoke|ainvoke|stream|batch)\s*\(/g,
157
+ provider: "langchain",
158
+ type: "framework_call",
159
+ autoInstrumentable: false,
160
+ },
161
+ // LangGraph
162
+ {
163
+ regex: /from\s+["']@langchain\/langgraph["']/g,
164
+ provider: "langgraph",
165
+ type: "sdk_import",
166
+ autoInstrumentable: false,
167
+ },
168
+ // Mastra
169
+ {
170
+ regex: /from\s+["']@mastra\/core["']/g,
171
+ provider: "mastra",
172
+ type: "sdk_import",
173
+ autoInstrumentable: false,
174
+ },
175
+ // CrewAI (JS)
176
+ {
177
+ regex: /from\s+["']crewai["']/g,
178
+ provider: "crewai",
179
+ type: "sdk_import",
180
+ autoInstrumentable: false,
181
+ },
182
+ // ── Direct HTTP calls to known AI API endpoints ─────────────────────
183
+ {
184
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.openai\.com/g,
185
+ provider: "openai",
186
+ type: "http_call",
187
+ autoInstrumentable: false,
188
+ },
189
+ {
190
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.anthropic\.com/g,
191
+ provider: "anthropic",
192
+ type: "http_call",
193
+ autoInstrumentable: false,
194
+ },
195
+ {
196
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.cohere\.(ai|com)/g,
197
+ provider: "cohere",
198
+ type: "http_call",
199
+ autoInstrumentable: false,
200
+ },
201
+ {
202
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.groq\.com/g,
203
+ provider: "groq",
204
+ type: "http_call",
205
+ autoInstrumentable: false,
206
+ },
207
+ {
208
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.mistral\.ai/g,
209
+ provider: "mistral",
210
+ type: "http_call",
211
+ autoInstrumentable: false,
212
+ },
213
+ {
214
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.together\.xyz/g,
215
+ provider: "together",
216
+ type: "http_call",
217
+ autoInstrumentable: false,
218
+ },
219
+ {
220
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.replicate\.com/g,
221
+ provider: "replicate",
222
+ type: "http_call",
223
+ autoInstrumentable: false,
224
+ },
225
+ {
226
+ regex: /fetch\s*\(\s*["'`]https?:\/\/api\.deepseek\.com/g,
227
+ provider: "deepseek",
228
+ type: "http_call",
229
+ autoInstrumentable: false,
230
+ },
231
+ // ── Cloud / Infrastructure SDK imports ──────────────────────────────
232
+ {
233
+ regex: /@aws-sdk\/client-bedrock-runtime/g,
234
+ provider: "aws-bedrock",
235
+ type: "sdk_import",
236
+ autoInstrumentable: true,
237
+ },
238
+ {
239
+ regex: /@aws-sdk\/client-/g,
240
+ provider: "aws",
241
+ type: "sdk_import",
242
+ autoInstrumentable: false,
243
+ },
244
+ {
245
+ regex: /@google-ai\/generativelanguage|@google\/generative-ai|@google\/genai/g,
246
+ provider: "google-ai",
247
+ type: "sdk_import",
248
+ autoInstrumentable: true,
249
+ },
250
+ {
251
+ regex: /from\s+["']@google-cloud\//g,
252
+ provider: "gcp",
253
+ type: "sdk_import",
254
+ autoInstrumentable: false,
255
+ },
256
+ // ── Payments ────────────────────────────────────────────────────────
257
+ {
258
+ regex: /from\s+["']stripe["']|require\s*\(\s*["']stripe["']\s*\)/g,
259
+ provider: "stripe",
260
+ type: "sdk_import",
261
+ autoInstrumentable: false,
262
+ },
263
+ {
264
+ regex: /stripe\s*\.\s*(paymentIntents|charges|customers|subscriptions|invoices)\s*\.\s*(create|retrieve|update|list)\s*\(/g,
265
+ provider: "stripe",
266
+ type: "service_call",
267
+ autoInstrumentable: false,
268
+ },
269
+ // ── Databases ───────────────────────────────────────────────────────
270
+ // MongoDB
271
+ {
272
+ regex: /from\s+["']mongodb["']|require\s*\(\s*["']mongodb["']\s*\)/g,
273
+ provider: "mongodb",
274
+ type: "sdk_import",
275
+ autoInstrumentable: false,
276
+ },
277
+ {
278
+ regex: /\.\s*(find|findOne|insertOne|insertMany|updateOne|updateMany|deleteOne|deleteMany|aggregate)\s*\(/g,
279
+ provider: "mongodb",
280
+ type: "service_call",
281
+ autoInstrumentable: false,
282
+ },
283
+ // Supabase
284
+ {
285
+ regex: /from\s+["']@supabase\/supabase-js["']/g,
286
+ provider: "supabase",
287
+ type: "sdk_import",
288
+ autoInstrumentable: false,
289
+ },
290
+ // Firebase
291
+ {
292
+ regex: /from\s+["']firebase-admin["']|from\s+["']firebase\/firestore["']/g,
293
+ provider: "firebase",
294
+ type: "sdk_import",
295
+ autoInstrumentable: false,
296
+ },
297
+ // ── Search ──────────────────────────────────────────────────────────
298
+ {
299
+ regex: /from\s+["']@elastic\/elasticsearch["']/g,
300
+ provider: "elasticsearch",
301
+ type: "sdk_import",
302
+ autoInstrumentable: false,
303
+ },
304
+ // ── Cache ───────────────────────────────────────────────────────────
305
+ {
306
+ regex: /from\s+["'](ioredis|redis)["']|require\s*\(\s*["'](ioredis|redis)["']\s*\)/g,
307
+ provider: "redis",
308
+ type: "sdk_import",
309
+ autoInstrumentable: false,
310
+ },
311
+ // ── Vector databases ────────────────────────────────────────────────
312
+ {
313
+ regex: /from\s+["']@pinecone-database\/pinecone["']/g,
314
+ provider: "pinecone",
315
+ type: "sdk_import",
316
+ autoInstrumentable: false,
317
+ },
318
+ {
319
+ regex: /\.\s*(query|upsert)\s*\(/g,
320
+ provider: "vector-db",
321
+ type: "service_call",
322
+ autoInstrumentable: false,
323
+ },
324
+ {
325
+ regex: /from\s+["']weaviate-ts-client["']|from\s+["']weaviate-client["']/g,
326
+ provider: "weaviate",
327
+ type: "sdk_import",
328
+ autoInstrumentable: false,
329
+ },
330
+ {
331
+ regex: /from\s+["']chromadb["']/g,
332
+ provider: "chromadb",
333
+ type: "sdk_import",
334
+ autoInstrumentable: false,
335
+ },
336
+ {
337
+ regex: /from\s+["']@qdrant\/js-client-rest["']/g,
338
+ provider: "qdrant",
339
+ type: "sdk_import",
340
+ autoInstrumentable: false,
341
+ },
342
+ // ── Messaging / Communications ──────────────────────────────────────
343
+ {
344
+ regex: /from\s+["']twilio["']|require\s*\(\s*["']twilio["']\s*\)/g,
345
+ provider: "twilio",
346
+ type: "sdk_import",
347
+ autoInstrumentable: false,
348
+ },
349
+ {
350
+ regex: /from\s+["']@sendgrid\/mail["']/g,
351
+ provider: "sendgrid",
352
+ type: "sdk_import",
353
+ autoInstrumentable: false,
354
+ },
355
+ {
356
+ regex: /from\s+["']resend["']/g,
357
+ provider: "resend",
358
+ type: "sdk_import",
359
+ autoInstrumentable: false,
360
+ },
361
+ {
362
+ regex: /from\s+["']@slack\/web-api["']/g,
363
+ provider: "slack",
364
+ type: "sdk_import",
365
+ autoInstrumentable: false,
366
+ },
367
+ // ── Geo / Maps ──────────────────────────────────────────────────────
368
+ {
369
+ regex: /from\s+["']@googlemaps\/google-maps-services-js["']/g,
370
+ provider: "google-maps",
371
+ type: "sdk_import",
372
+ autoInstrumentable: false,
373
+ },
374
+ // ── Web scraping / data ─────────────────────────────────────────────
375
+ {
376
+ regex: /from\s+["']@mendable\/firecrawl-js["']/g,
377
+ provider: "firecrawl",
378
+ type: "sdk_import",
379
+ autoInstrumentable: false,
380
+ },
381
+ {
382
+ regex: /from\s+["']@tavily\/core["']/g,
383
+ provider: "tavily",
384
+ type: "sdk_import",
385
+ autoInstrumentable: false,
386
+ },
387
+ ];
388
+ /**
389
+ * Scan a source string for cost-generating patterns.
390
+ *
391
+ * @param source - File contents to scan.
392
+ * @param fileName - Path to include in results.
393
+ * @returns Array of detected cost points.
394
+ */
395
+ export function scanSource(source, fileName) {
396
+ const results = [];
397
+ const seenLines = new Set(); // "provider:line" dedup key
398
+ for (const pattern of PATTERNS) {
399
+ // Reset regex state for each file
400
+ pattern.regex.lastIndex = 0;
401
+ let match;
402
+ while ((match = pattern.regex.exec(source)) !== null) {
403
+ const beforeMatch = source.slice(0, match.index);
404
+ const lineNumber = beforeMatch.split("\n").length;
405
+ // Deduplicate: same provider on same line
406
+ const key = `${pattern.provider}:${lineNumber}`;
407
+ if (seenLines.has(key))
408
+ continue;
409
+ seenLines.add(key);
410
+ results.push({
411
+ file: fileName,
412
+ line: lineNumber,
413
+ provider: pattern.provider,
414
+ type: pattern.type,
415
+ pattern: match[0].trim(),
416
+ autoInstrumentable: pattern.autoInstrumentable,
417
+ });
418
+ }
419
+ }
420
+ return results;
421
+ }
422
+ /**
423
+ * Generate integration stub code from detected cost points.
424
+ *
425
+ * Produces a self-contained template showing:
426
+ * 1. SDK initialisation
427
+ * 2. Customer/project context
428
+ * 3. Task wrapper with manual `recordCost` calls
429
+ * 4. Summary of auto-instrumented providers
430
+ */
431
+ export function generateStubs(points, _scanDir) {
432
+ const auto = points.filter((p) => p.autoInstrumentable);
433
+ const manual = points.filter((p) => !p.autoInstrumentable);
434
+ const lines = [
435
+ "// ============================================================",
436
+ "// dexcost integration stubs",
437
+ "// Generated by: dexcost scan --generate-stubs",
438
+ "// ============================================================",
439
+ "",
440
+ "// --- Step 1: Initialize dexcost ---",
441
+ 'import { init, track } from "@dexcost/sdk";',
442
+ "",
443
+ 'init({ apiKey: "dx_live_..." }); // or set DEXCOST_API_KEY env var',
444
+ "",
445
+ "// --- Step 2: Set customer context (in your request handler) ---",
446
+ 'import { setContext } from "@dexcost/sdk";',
447
+ "",
448
+ "setContext({",
449
+ ' customerId: "your_customer_id",',
450
+ ' projectId: "your_project_id",',
451
+ "});",
452
+ "",
453
+ "// --- Step 3: Track tasks ---",
454
+ 'await track({ taskType: "your_task_type" }, async (task) => {',
455
+ " // Your agent code here...",
456
+ "",
457
+ ];
458
+ if (manual.length > 0) {
459
+ lines.push(" // --- Manual cost tracking (for services not auto-instrumented) ---");
460
+ for (const p of manual) {
461
+ lines.push(` // ${p.file}:${p.line} \u2014 ${p.pattern}`);
462
+ lines.push(` task.recordCost("${p.provider}", 0.00); // TODO: set actual cost`);
463
+ lines.push("");
464
+ }
465
+ }
466
+ lines.push("});");
467
+ lines.push("");
468
+ if (auto.length > 0) {
469
+ lines.push("// --- Auto-instrumented (no code changes needed) ---");
470
+ const providers = new Map();
471
+ for (const p of auto) {
472
+ providers.set(p.provider, (providers.get(p.provider) ?? 0) + 1);
473
+ }
474
+ for (const [provider, count] of providers) {
475
+ lines.push(`// \u2713 ${provider} (${count} call${count > 1 ? "s" : ""} detected)`);
476
+ }
477
+ }
478
+ return lines.join("\n") + "\n";
479
+ }
480
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/cli/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Thin wrapper classes around the OpenAI and Anthropic clients that
3
+ * auto-record LLM cost events.
4
+ *
5
+ * Alternative to auto-instrumentation (no monkey-patching). Matching
6
+ * the Python SDK's clients.py.
7
+ *
8
+ * Usage:
9
+ *
10
+ * import { TrackedOpenAI } from "dexcost/clients";
11
+ *
12
+ * const client = new TrackedOpenAI({ tracker });
13
+ * // Inside a tracked task, events are auto-recorded:
14
+ * const response = await client.chat.completions.create({ model: "gpt-4o", messages: [] });
15
+ */
16
+ import { PricingEngine } from "./pricing/engine.js";
17
+ import type { CostTracker } from "./core/tracker.js";
18
+ /**
19
+ * Wraps `openai.OpenAI` and auto-records llm_call events on every
20
+ * `chat.completions.create` call when running inside a tracked task context.
21
+ */
22
+ export declare class TrackedOpenAI {
23
+ private _client;
24
+ private _pricing;
25
+ private _buffer;
26
+ constructor(opts?: {
27
+ client?: unknown;
28
+ tracker?: CostTracker;
29
+ pricing?: PricingEngine;
30
+ });
31
+ get chat(): {
32
+ completions: {
33
+ create: (...args: unknown[]) => Promise<unknown>;
34
+ };
35
+ };
36
+ }
37
+ /**
38
+ * Wraps `@anthropic-ai/sdk Anthropic` and auto-records llm_call events on
39
+ * every `messages.create` call when running inside a tracked task context.
40
+ */
41
+ export declare class TrackedAnthropic {
42
+ private _client;
43
+ private _pricing;
44
+ private _buffer;
45
+ constructor(opts?: {
46
+ client?: unknown;
47
+ tracker?: CostTracker;
48
+ pricing?: PricingEngine;
49
+ });
50
+ get messages(): {
51
+ create: (...args: unknown[]) => Promise<unknown>;
52
+ };
53
+ }
54
+ //# sourceMappingURL=clients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAqB;gBAExB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAA;KAAE;IA8BvF,IAAI,IAAI,IAAI;QAAE,WAAW,EAAE;YAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;SAAE,CAAA;KAAE,CAgBhF;CACF;AA6DD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,OAAO,CAAqB;gBAExB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAA;KAAE;IAiCvF,IAAI,QAAQ,IAAI;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAcnE;CACF"}