@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,459 @@
1
+ /**
2
+ * MCP (Model Context Protocol) auto-instrumentation for dexcost TypeScript SDK.
3
+ *
4
+ * Monkey-patches `Client.prototype.callTool` to automatically record cost
5
+ * events for every MCP tool invocation within an active task context.
6
+ */
7
+ import { randomUUID } from "node:crypto";
8
+ import { createCostEvent } from "../core/models.js";
9
+ import { getCurrentTask } from "../core/context.js";
10
+ import { createAutoTask } from "../core/auto-task.js";
11
+ import { registerInstrument } from "./index.js";
12
+ /* eslint-disable @typescript-eslint/no-explicit-any */
13
+ let _patched = false;
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
15
+ let _original = null;
16
+ let _clientClass = null;
17
+ let _buffer = null;
18
+ /** Test helper: inject a mock Client class so tests avoid importing @modelcontextprotocol/sdk. */
19
+ export function _setClientClass(cls) {
20
+ _clientClass = cls;
21
+ }
22
+ /** Test helper: reset to real module resolution. */
23
+ export function _resetClientClass() {
24
+ _clientClass = null;
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // MCP tool name → service catalog key mapping
28
+ //
29
+ // Comprehensive mapping covering all 163 services in service_prices.json.
30
+ // ---------------------------------------------------------------------------
31
+ const MCP_TOOL_MAP = {
32
+ // Search
33
+ tavily_search: "tavily_search",
34
+ tavily_extract: "tavily_search",
35
+ tavily_crawl: "tavily_search",
36
+ tavily_map: "tavily_search",
37
+ tavily_research: "tavily_search",
38
+ serper_search: "serper_search",
39
+ serper_google_search: "serper_search",
40
+ exa_search: "exa_search",
41
+ exa_find_similar: "exa_search",
42
+ exa_get_contents: "exa_search",
43
+ perplexity_search: "perplexity_search",
44
+ sonar_search: "perplexity_search",
45
+ brave_web_search: "brave_search",
46
+ brave_local_search: "brave_search",
47
+ brave_search: "brave_search",
48
+ bing_search: "bing_search",
49
+ bing_web_search: "bing_search",
50
+ serpapi_search: "serpapi",
51
+ serpapi_google_search: "serpapi",
52
+ // Scraping
53
+ firecrawl_scrape: "firecrawl_scrape",
54
+ firecrawl_crawl: "firecrawl_scrape",
55
+ firecrawl_map: "firecrawl_scrape",
56
+ firecrawl_search: "firecrawl_scrape",
57
+ firecrawl_extract: "firecrawl_scrape",
58
+ browserbase_create_session: "browserbase",
59
+ browserbase_navigate: "browserbase",
60
+ browserbase_screenshot: "browserbase",
61
+ browserbase_get_content: "browserbase",
62
+ scrapingbee_scrape: "scrapingbee",
63
+ apify_run_actor: "apify",
64
+ apify_get_dataset: "apify",
65
+ scrapingdog_scrape: "scrapingdog",
66
+ diffbot_analyze: "diffbot",
67
+ diffbot_extract: "diffbot",
68
+ jina_read: "jina_reader",
69
+ jina_reader: "jina_reader",
70
+ jina_search: "jina_reader",
71
+ // Vector DBs
72
+ pinecone_query: "pinecone_query",
73
+ pinecone_upsert: "pinecone_query",
74
+ pinecone_delete: "pinecone_query",
75
+ pinecone_fetch: "pinecone_query",
76
+ weaviate_query: "weaviate_cloud",
77
+ weaviate_search: "weaviate_cloud",
78
+ qdrant_search: "qdrant_cloud",
79
+ qdrant_query: "qdrant_cloud",
80
+ qdrant_upsert: "qdrant_cloud",
81
+ milvus_search: "milvus_zilliz",
82
+ milvus_query: "milvus_zilliz",
83
+ astra_query: "astra_db",
84
+ astra_search: "astra_db",
85
+ // Compute / Sandbox
86
+ e2b_run_code: "e2b_sandbox",
87
+ e2b_execute: "e2b_sandbox",
88
+ e2b_create_sandbox: "e2b_sandbox",
89
+ code_execute: "e2b_sandbox",
90
+ modal_run: "modal_compute",
91
+ modal_deploy: "modal_compute",
92
+ lambda_invoke: "aws_lambda",
93
+ // Communication
94
+ twilio_send_sms: "twilio_sms",
95
+ twilio_send_message: "twilio_sms",
96
+ sendgrid_send_email: "sendgrid_email",
97
+ send_email: "sendgrid_email",
98
+ resend_send_email: "resend_email",
99
+ mailgun_send: "mailgun",
100
+ postmark_send: "postmark",
101
+ // Maps
102
+ google_maps_geocode: "google_maps_geocode",
103
+ google_maps_search: "google_maps_places",
104
+ google_maps_directions: "google_maps_directions",
105
+ google_maps_places: "google_maps_places",
106
+ mapbox_geocode: "mapbox_geocoding",
107
+ mapbox_directions: "mapbox_geocoding",
108
+ // Data Enrichment
109
+ people_search: "people_data_labs",
110
+ pdl_search: "people_data_labs",
111
+ pdl_enrich: "people_data_labs",
112
+ clearbit_enrich: "clearbit_enrichment",
113
+ clearbit_lookup: "clearbit_enrichment",
114
+ hunter_search: "hunter_io",
115
+ hunter_email_finder: "hunter_io",
116
+ crunchbase_search: "crunchbase",
117
+ crunchbase_lookup: "crunchbase",
118
+ // Payments
119
+ stripe_create_charge: "stripe_payment",
120
+ stripe_create_payment: "stripe_payment",
121
+ stripe_create_payment_link: "stripe_payment",
122
+ stripe_list_charges: "stripe_payment",
123
+ // Speech / Audio
124
+ elevenlabs_tts: "eleven_labs",
125
+ elevenlabs_text_to_speech: "eleven_labs",
126
+ deepgram_transcribe: "deepgram_transcription",
127
+ assemblyai_transcribe: "assemblyai",
128
+ whisper_transcribe: "openai_whisper",
129
+ // Image Generation
130
+ dalle_generate: "openai_dalle",
131
+ openai_generate_image: "openai_dalle",
132
+ stability_generate: "stability_ai",
133
+ replicate_run: "replicate",
134
+ replicate_predict: "replicate",
135
+ // Document Processing
136
+ textract_analyze: "amazon_textract",
137
+ textract_detect: "amazon_textract",
138
+ document_ai_process: "google_document_ai",
139
+ unstructured_parse: "unstructured_io",
140
+ llamaparse_parse: "llamaparse",
141
+ llamaparse_upload: "llamaparse",
142
+ // Financial Data
143
+ twelve_data_quote: "twelve_data",
144
+ twelve_data_time_series: "twelve_data",
145
+ alpha_vantage_quote: "alpha_vantage",
146
+ polygon_quote: "polygon_io",
147
+ polygon_aggs: "polygon_io",
148
+ coinapi_exchange_rate: "coinapi",
149
+ // Cloud Storage
150
+ s3_get_object: "aws_s3",
151
+ s3_put_object: "aws_s3",
152
+ supabase_query: "supabase",
153
+ supabase_insert: "supabase",
154
+ supabase_select: "supabase",
155
+ // Agent Tools
156
+ composio_execute: "composio",
157
+ composio_action: "composio",
158
+ wolfram_query: "wolfram_alpha",
159
+ wolfram_alpha_query: "wolfram_alpha",
160
+ // Embeddings
161
+ openai_embed: "openai_embeddings",
162
+ cohere_embed: "cohere_embed",
163
+ voyage_embed: "voyage_ai",
164
+ jina_embed: "jina_embeddings",
165
+ mixedbread_embed: "mixedbread_embed",
166
+ nomic_embed: "nomic_embed",
167
+ // Translation
168
+ deepl_translate: "deepl_translate",
169
+ translate_text: "deepl_translate",
170
+ google_translate: "google_translate",
171
+ aws_translate: "aws_translate",
172
+ azure_translate: "azure_translator",
173
+ // Vision / OCR
174
+ google_vision_annotate: "google_vision",
175
+ google_vision_ocr: "google_vision",
176
+ azure_vision_analyze: "azure_computer_vision",
177
+ azure_ocr: "azure_computer_vision",
178
+ aws_rekognition_detect: "aws_rekognition",
179
+ aws_rekognition_labels: "aws_rekognition",
180
+ mathpix_process: "mathpix_ocr",
181
+ // Video AI
182
+ runway_generate: "runway_video",
183
+ heygen_create_video: "heygen_video",
184
+ luma_generate: "luma_video",
185
+ mux_upload: "mux_video",
186
+ mux_create_asset: "mux_video",
187
+ // Messaging / Notification
188
+ slack_post_message: "slack_api",
189
+ slack_send_message: "slack_api",
190
+ slack_chat_post: "slack_api",
191
+ discord_send_message: "discord_api",
192
+ discord_create_message: "discord_api",
193
+ telegram_send_message: "telegram_api",
194
+ telegram_send: "telegram_api",
195
+ twilio_call: "twilio_voice",
196
+ twilio_make_call: "twilio_voice",
197
+ onesignal_send: "onesignal",
198
+ pusher_trigger: "pusher",
199
+ novu_trigger: "novu",
200
+ // Database
201
+ neon_query: "neon_postgres",
202
+ neon_sql: "neon_postgres",
203
+ planetscale_query: "planetscale",
204
+ turso_query: "turso_db",
205
+ turso_execute: "turso_db",
206
+ mongodb_find: "mongodb_atlas",
207
+ mongodb_query: "mongodb_atlas",
208
+ mongodb_insert: "mongodb_atlas",
209
+ upstash_redis_get: "upstash_redis",
210
+ upstash_redis_set: "upstash_redis",
211
+ upstash_redis_command: "upstash_redis",
212
+ fauna_query: "fauna_db",
213
+ cockroach_query: "cockroachdb",
214
+ // Project Management
215
+ jira_create_issue: "jira_api",
216
+ jira_search: "jira_api",
217
+ jira_update_issue: "jira_api",
218
+ jira_get_issue: "jira_api",
219
+ linear_create_issue: "linear_api",
220
+ linear_search: "linear_api",
221
+ linear_update_issue: "linear_api",
222
+ asana_create_task: "asana_api",
223
+ asana_search: "asana_api",
224
+ clickup_create_task: "clickup_api",
225
+ clickup_search: "clickup_api",
226
+ notion_query: "notion_api",
227
+ notion_create_page: "notion_api",
228
+ notion_search: "notion_api",
229
+ notion_update_page: "notion_api",
230
+ // CRM
231
+ salesforce_query: "salesforce_api",
232
+ salesforce_create: "salesforce_api",
233
+ salesforce_soql: "salesforce_api",
234
+ hubspot_create_contact: "hubspot_api",
235
+ hubspot_search: "hubspot_api",
236
+ hubspot_get_contacts: "hubspot_api",
237
+ // DevOps / Code
238
+ github_create_issue: "github_api",
239
+ github_search: "github_api",
240
+ github_create_pr: "github_api",
241
+ github_get_file: "github_api",
242
+ github_list_repos: "github_api",
243
+ gitlab_create_issue: "gitlab_api",
244
+ gitlab_search: "gitlab_api",
245
+ vercel_deploy: "vercel_api",
246
+ vercel_list_deployments: "vercel_api",
247
+ // Social Media
248
+ twitter_post: "twitter_api",
249
+ twitter_search: "twitter_api",
250
+ x_post_tweet: "twitter_api",
251
+ linkedin_post: "linkedin_api",
252
+ linkedin_share: "linkedin_api",
253
+ reddit_submit: "reddit_api",
254
+ reddit_search: "reddit_api",
255
+ youtube_search: "youtube_data_api",
256
+ youtube_list_videos: "youtube_data_api",
257
+ // Weather / News / Geo
258
+ openweathermap_current: "openweathermap",
259
+ openweathermap_forecast: "openweathermap",
260
+ get_weather: "openweathermap",
261
+ weather_forecast: "weatherapi",
262
+ get_news: "newsapi",
263
+ news_search: "newsapi",
264
+ ip_lookup: "ipinfo",
265
+ geolocate: "maxmind_geoip",
266
+ // Workflow Automation
267
+ zapier_nla: "zapier",
268
+ zapier_action: "zapier",
269
+ make_webhook: "make_integromat",
270
+ pipedream_trigger: "pipedream",
271
+ // Payment / E-commerce
272
+ paypal_create_payment: "paypal",
273
+ paypal_capture: "paypal",
274
+ razorpay_create_order: "razorpay",
275
+ razorpay_capture_payment: "razorpay",
276
+ shopify_create_product: "shopify_api",
277
+ shopify_get_orders: "shopify_api",
278
+ // Scraping (new)
279
+ scraperapi_scrape: "scraperapi",
280
+ zenrows_scrape: "zenrows",
281
+ oxylabs_scrape: "oxylabs_scraper",
282
+ // AI/ML Platforms
283
+ huggingface_inference: "huggingface_inference",
284
+ hf_generate: "huggingface_inference",
285
+ roboflow_detect: "roboflow",
286
+ scale_create_task: "scale_ai",
287
+ together_generate: "together_ai",
288
+ groq_chat: "groq_inference",
289
+ fireworks_generate: "fireworks_ai",
290
+ cohere_rerank: "cohere_rerank",
291
+ jina_rerank: "jina_reranker",
292
+ rerank: "cohere_rerank",
293
+ // Cloud Storage (new)
294
+ gcs_upload: "gcs",
295
+ gcs_download: "gcs",
296
+ r2_put_object: "r2_cloudflare",
297
+ r2_get_object: "r2_cloudflare",
298
+ azure_blob_upload: "azure_blob",
299
+ // Document (new)
300
+ adobe_pdf_extract: "adobe_pdf_services",
301
+ docraptor_convert: "docraptor",
302
+ // Speech (new)
303
+ openai_tts: "openai_tts",
304
+ openai_text_to_speech: "openai_tts",
305
+ resemble_generate: "resemble_ai",
306
+ playht_generate: "playht",
307
+ // Image (new)
308
+ midjourney_generate: "midjourney_api",
309
+ fal_generate: "flux_fal",
310
+ flux_generate: "flux_fal",
311
+ leonardo_generate: "leonardo_ai",
312
+ // Data Enrichment (new)
313
+ apollo_search: "apollo_io",
314
+ apollo_enrich: "apollo_io",
315
+ zoominfo_search: "zoominfo_api",
316
+ // E-signature / Calendar
317
+ docusign_send: "docusign",
318
+ docusign_create_envelope: "docusign",
319
+ calendly_create_event: "calendly_api",
320
+ // Monitoring
321
+ sentry_capture: "sentry",
322
+ datadog_submit: "datadog",
323
+ posthog_capture: "posthog",
324
+ mixpanel_track: "mixpanel",
325
+ segment_track: "segment",
326
+ // CDN / Media
327
+ cloudinary_upload: "cloudinary",
328
+ cloudinary_transform: "cloudinary",
329
+ // Compute (new)
330
+ fly_machine_run: "fly_machines",
331
+ cloudflare_worker_run: "cloudflare_workers",
332
+ // Vector DB (new)
333
+ chroma_query: "chroma_cloud",
334
+ chroma_add: "chroma_cloud",
335
+ turbopuffer_query: "turbopuffer",
336
+ turbopuffer_upsert: "turbopuffer",
337
+ // Agent Tools (new)
338
+ browserless_navigate: "browserless",
339
+ browserless_screenshot: "browserless",
340
+ browserless_scrape: "browserless",
341
+ };
342
+ // ---------------------------------------------------------------------------
343
+ // Instrument functions
344
+ // ---------------------------------------------------------------------------
345
+ /**
346
+ * Patch `Client.prototype.callTool` to record cost events.
347
+ *
348
+ * If `@modelcontextprotocol/sdk` is not installed and no mock class is
349
+ * injected, the dynamic import will throw and the function will reject.
350
+ */
351
+ export async function instrumentMcp(_pricing, buffer) {
352
+ if (_patched)
353
+ return;
354
+ let ClientProto;
355
+ if (_clientClass) {
356
+ ClientProto = _clientClass.prototype;
357
+ }
358
+ else {
359
+ // @ts-expect-error -- @modelcontextprotocol/sdk types are not bundled
360
+ const mcpSdk = await import("@modelcontextprotocol/sdk/client/index.js");
361
+ const Client = mcpSdk.Client;
362
+ ClientProto = Client.prototype;
363
+ }
364
+ _original = ClientProto.callTool;
365
+ _buffer = buffer;
366
+ ClientProto.callTool = async function (params, ...rest) {
367
+ let task = getCurrentTask();
368
+ if (!task) {
369
+ task = createAutoTask("mcp.tool_call");
370
+ _buffer?.upsertTask(task);
371
+ }
372
+ const toolName = params?.name ?? "unknown";
373
+ const startTime = performance.now();
374
+ let isError = false;
375
+ try {
376
+ const result = await _original.call(this, params, ...rest);
377
+ const latencyMs = Math.round(performance.now() - startTime);
378
+ // Check if MCP result itself signals an error
379
+ if (result?.isError) {
380
+ isError = true;
381
+ }
382
+ try {
383
+ recordMcpEvent(toolName, task, latencyMs, isError, this);
384
+ }
385
+ catch {
386
+ // dexcost errors must never crash user code
387
+ }
388
+ return result;
389
+ }
390
+ catch (err) {
391
+ isError = true;
392
+ const latencyMs = Math.round(performance.now() - startTime);
393
+ try {
394
+ recordMcpEvent(toolName, task, latencyMs, isError, this);
395
+ }
396
+ catch {
397
+ // dexcost errors must never crash user code
398
+ }
399
+ throw err;
400
+ }
401
+ };
402
+ _patched = true;
403
+ }
404
+ /**
405
+ * Remove the monkey-patch and restore the original `callTool` method.
406
+ */
407
+ export function uninstrumentMcp() {
408
+ if (!_patched || !_original)
409
+ return;
410
+ if (_clientClass) {
411
+ _clientClass.prototype.callTool = _original;
412
+ }
413
+ _original = null;
414
+ _buffer = null;
415
+ _patched = false;
416
+ }
417
+ // ---------------------------------------------------------------------------
418
+ // Internal helpers
419
+ // ---------------------------------------------------------------------------
420
+ function recordMcpEvent(toolName, task, latencyMs, isError, instance) {
421
+ if (!_buffer)
422
+ return;
423
+ const { costUsd, costConfidence, pricingSource } = resolveCost(toolName);
424
+ const mcpServer = instance?._serverName ?? "unknown";
425
+ const event = createCostEvent({
426
+ eventId: randomUUID(),
427
+ taskId: task.taskId,
428
+ eventType: "external_cost",
429
+ costUsd,
430
+ costConfidence,
431
+ pricingSource,
432
+ serviceName: `mcp:${toolName}`,
433
+ latencyMs,
434
+ isRetry: false,
435
+ details: {
436
+ mcp_tool: toolName,
437
+ mcp_server: mcpServer,
438
+ latency_ms: latencyMs,
439
+ is_error: isError,
440
+ },
441
+ });
442
+ _buffer.addEvent(event);
443
+ task.externalCostUsd += costUsd;
444
+ task.totalCostUsd += costUsd;
445
+ _buffer.upsertTask(task);
446
+ }
447
+ function resolveCost(toolName) {
448
+ // Service catalog mapping — recognised tools get "estimated" confidence
449
+ // since we know the service but not exact usage-based cost from this call.
450
+ const catalogKey = MCP_TOOL_MAP[toolName];
451
+ if (catalogKey) {
452
+ return { costUsd: 0, costConfidence: "estimated", pricingSource: "service_catalog" };
453
+ }
454
+ // Unknown tool
455
+ return { costUsd: 0, costConfidence: "unknown", pricingSource: "unknown" };
456
+ }
457
+ // Self-register so the instrument registry can discover us.
458
+ registerInstrument("mcp", instrumentMcp, uninstrumentMcp);
459
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/instruments/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * OpenAI auto-instrumentation for dexcost TypeScript SDK.
3
+ *
4
+ * Monkey-patches `OpenAI.Chat.Completions.prototype.create` to automatically
5
+ * record cost events and aggregate token usage on the active task context.
6
+ *
7
+ * Supports both non-streaming and streaming responses.
8
+ */
9
+ import type { EventBuffer } from "../transport/buffer.js";
10
+ import type { PricingEngine } from "../pricing/engine.js";
11
+ /** Test helper: inject a mock Completions class so tests avoid importing openai. */
12
+ export declare function _setCompletionsClass(cls: any): void;
13
+ /** Test helper: reset to real module resolution. */
14
+ export declare function _resetCompletionsClass(): void;
15
+ /**
16
+ * Patch `OpenAI.Chat.Completions.prototype.create` to record cost events.
17
+ *
18
+ * If `openai` is not installed and no mock class is injected, the dynamic
19
+ * import will throw and the function will reject.
20
+ */
21
+ export declare function instrumentOpenai(pricing: PricingEngine, buffer: EventBuffer): Promise<void>;
22
+ /**
23
+ * Remove the monkey-patch and restore the original `create` method.
24
+ */
25
+ export declare function uninstrumentOpenai(): void;
26
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/instruments/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,sBAAsB,CAAC;AAYtE,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAEnD;AAED,oDAAoD;AACpD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CAmDf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAWzC"}