@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,545 @@
1
+ /**
2
+ * Cloud-environment detection for egress pricing.
3
+ *
4
+ * Mirrors `python/src/dexcost/cloud_detect.py` exactly — env-var names,
5
+ * DMI strings, and IMDS endpoints have all been verified against May-2026
6
+ * docs and MUST NOT be changed in this port.
7
+ *
8
+ * Phase 1a — env-var detection (sub-millisecond, synchronous).
9
+ * Phase 1b — DMI vendor check (~1 ms, Linux-only — silent no-op elsewhere).
10
+ * Phase 2 — background metadata probe (fire-and-forget Promise, ~250 ms
11
+ * budget, never blocks `dexcost.init()`).
12
+ *
13
+ * Notes — research May 2026:
14
+ * - AWS Lambda / Fargate / App Runner set `AWS_REGION` automatically; ECS
15
+ * (Fargate and on-EC2) also sets `ECS_CONTAINER_METADATA_URI_V4`.
16
+ * - Azure Container Apps embeds the region in `CONTAINER_APP_HOSTNAME` and
17
+ * `CONTAINER_APP_ENV_DNS_SUFFIX` as `<host>.<REGION>.azurecontainerapps.io`.
18
+ * - GCP Cloud Run / Cloud Functions Gen2 / App Engine do NOT expose a region
19
+ * env var; region must come from the metadata server (Phase 2).
20
+ * - AWS IMDSv2 has a default HTTP hop-limit of 1, which prevents Docker/Pod
21
+ * containers from reaching the metadata service; the probe fails silent.
22
+ */
23
+ import { readFileSync } from "node:fs";
24
+ // ---------------------------------------------------------------------------
25
+ // Constants
26
+ // ---------------------------------------------------------------------------
27
+ const PROBE_TIMEOUT_MS = 250;
28
+ /** DMI fields read from /sys/class/dmi/id/<field> (Linux only). */
29
+ const DMI_FIELDS = [
30
+ "sys_vendor",
31
+ "board_vendor",
32
+ "product_name",
33
+ "chassis_asset_tag",
34
+ "bios_vendor",
35
+ "product_serial",
36
+ ];
37
+ /**
38
+ * DMI rules — ordered from most-specific to most-generic; the first match
39
+ * wins. Transcribed from cloud-init's ds-identify (canonical) plus provider
40
+ * documentation, verified May 2026.
41
+ *
42
+ * Canonical signals (chassis_asset_tag / product_name) appear first so
43
+ * they win over loose sys_vendor backups when both are present.
44
+ */
45
+ const DMI_RULES = [
46
+ // Canonical signals first
47
+ { field: "chassis_asset_tag", needle: "oraclecloud.com", mode: "eq", provider: "oci" },
48
+ { field: "chassis_asset_tag", needle: "7783-7084-3265-9085-8269-3286-77", mode: "eq", provider: "azure" },
49
+ { field: "product_name", needle: "google compute engine", mode: "eq", provider: "gcp" },
50
+ { field: "product_name", needle: "alibaba cloud ecs", mode: "eq", provider: "alibaba" },
51
+ // sys_vendor exact matches
52
+ { field: "sys_vendor", needle: "amazon ec2", mode: "eq", provider: "aws" },
53
+ { field: "sys_vendor", needle: "digitalocean", mode: "eq", provider: "digitalocean" },
54
+ { field: "sys_vendor", needle: "hetzner", mode: "eq", provider: "hetzner" },
55
+ { field: "sys_vendor", needle: "vultr", mode: "eq", provider: "vultr" },
56
+ { field: "sys_vendor", needle: "scaleway", mode: "eq", provider: "scaleway" },
57
+ { field: "sys_vendor", needle: "microsoft corporation", mode: "eq", provider: "azure" },
58
+ // Looser substring backups
59
+ { field: "sys_vendor", needle: "amazon", mode: "contains", provider: "aws" },
60
+ { field: "sys_vendor", needle: "google", mode: "contains", provider: "gcp" },
61
+ { field: "sys_vendor", needle: "alibaba cloud", mode: "contains", provider: "alibaba" },
62
+ { field: "sys_vendor", needle: "ovh", mode: "contains", provider: "ovh" },
63
+ ];
64
+ // ---------------------------------------------------------------------------
65
+ // Module-level result (single-threaded JS — no lock needed)
66
+ // ---------------------------------------------------------------------------
67
+ let _result = { provider: null, region: null, source: "none" };
68
+ let _backgroundPromise = null;
69
+ export function getCloudEnv() {
70
+ return _result;
71
+ }
72
+ function _setResult(env) {
73
+ _result = env;
74
+ }
75
+ /**
76
+ * Test-only — force the resolved CloudEnv to a known value. Used by
77
+ * downstream finalize tests (Phase D Task 10) that need a deterministic
78
+ * egress rate without actually probing IMDS or reading DMI. The
79
+ * `_for_tests` suffix marks this as not-public-API.
80
+ */
81
+ export function _setResultForTests(env) {
82
+ _setResult(env);
83
+ }
84
+ // Test-only — reset module state.
85
+ export function _resetCloudDetectForTests() {
86
+ _result = { provider: null, region: null, source: "none" };
87
+ _backgroundPromise = null;
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Phase 1a — environment variable detection
91
+ // ---------------------------------------------------------------------------
92
+ const _AZ_CA_REGION_RE = /\.([a-z0-9-]+)\.azurecontainerapps\.io$/i;
93
+ function _azureContainerAppsRegion() {
94
+ for (const name of ["CONTAINER_APP_HOSTNAME", "CONTAINER_APP_ENV_DNS_SUFFIX"]) {
95
+ const value = process.env[name];
96
+ if (!value)
97
+ continue;
98
+ const match = _AZ_CA_REGION_RE.exec(value);
99
+ if (match && match[1])
100
+ return match[1].toLowerCase();
101
+ }
102
+ return null;
103
+ }
104
+ function _detectEnv() {
105
+ const env = process.env;
106
+ // ── GPU / ML clouds (zero egress) ───────────────────────────────────────
107
+ // Detection prevents the universal $0.09/GB default from over-attributing
108
+ // on platforms whose marketing point is $0 egress.
109
+ // Modal (modal.com/docs).
110
+ if (env.MODAL_TASK_ID || env.MODAL_IMAGE_ID) {
111
+ return { provider: "modal", region: env.MODAL_REGION || null, source: "env" };
112
+ }
113
+ // RunPod (docs.runpod.io).
114
+ if (env.RUNPOD_POD_ID || env.RUNPOD_POD_HOSTNAME) {
115
+ return { provider: "runpod", region: env.RUNPOD_DC_ID || null, source: "env" };
116
+ }
117
+ // ── PaaS app platforms ──────────────────────────────────────────────────
118
+ // Render — RENDER=true, RENDER_SERVICE_ID. No region env var.
119
+ if (env.RENDER || env.RENDER_SERVICE_ID) {
120
+ return { provider: "render", region: null, source: "env" };
121
+ }
122
+ // Railway — RAILWAY_PROJECT_ID + RAILWAY_REPLICA_REGION (NOT RAILWAY_REGION).
123
+ if (env.RAILWAY_PROJECT_ID || env.RAILWAY_ENVIRONMENT_ID) {
124
+ return {
125
+ provider: "railway",
126
+ region: env.RAILWAY_REPLICA_REGION || null,
127
+ source: "env",
128
+ };
129
+ }
130
+ // Heroku — DYNO ("web.1" / "worker.1" / "scheduler.x").
131
+ if (env.DYNO) {
132
+ return { provider: "heroku", region: null, source: "env" };
133
+ }
134
+ // Koyeb — KOYEB_APP_NAME / KOYEB_SERVICE_NAME plus KOYEB_REGION (runtime).
135
+ if (env.KOYEB_SERVICE_NAME || env.KOYEB_APP_NAME) {
136
+ return { provider: "koyeb", region: env.KOYEB_REGION || null, source: "env" };
137
+ }
138
+ // ── Fly.io ──────────────────────────────────────────────────────────────
139
+ if (env.FLY_REGION || env.FLY_APP_NAME) {
140
+ return { provider: "fly", region: env.FLY_REGION || null, source: "env" };
141
+ }
142
+ // ── Vercel ──────────────────────────────────────────────────────────────
143
+ // Vercel also exports AWS_REGION; detecting Vercel first surfaces the
144
+ // platform's $0-egress attribution rather than the underlying AWS rate.
145
+ if (env.VERCEL || env.VERCEL_REGION) {
146
+ return { provider: "vercel", region: env.VERCEL_REGION || null, source: "env" };
147
+ }
148
+ // ── AWS ─────────────────────────────────────────────────────────────────
149
+ if (env.AWS_LAMBDA_FUNCTION_NAME ||
150
+ env.AWS_EXECUTION_ENV ||
151
+ env.ECS_CONTAINER_METADATA_URI_V4 ||
152
+ env.ECS_CONTAINER_METADATA_URI ||
153
+ env.AWS_REGION ||
154
+ env.AWS_DEFAULT_REGION) {
155
+ const region = env.AWS_REGION || env.AWS_DEFAULT_REGION || null;
156
+ return { provider: "aws", region, source: "env" };
157
+ }
158
+ // ── Azure ───────────────────────────────────────────────────────────────
159
+ if (env.WEBSITE_SITE_NAME || env.FUNCTIONS_WORKER_RUNTIME || env.CONTAINER_APP_NAME) {
160
+ const region = env.REGION_NAME || _azureContainerAppsRegion() || null;
161
+ return { provider: "azure", region, source: "env" };
162
+ }
163
+ // ── GCP ─────────────────────────────────────────────────────────────────
164
+ // K_SERVICE / K_CONFIGURATION are reserved by Cloud Run + Cloud Functions
165
+ // Gen2; FUNCTION_TARGET / FUNCTION_NAME by Cloud Functions Gen1.
166
+ if (env.K_SERVICE ||
167
+ env.K_CONFIGURATION ||
168
+ env.GAE_ENV ||
169
+ env.FUNCTION_TARGET ||
170
+ env.FUNCTION_NAME) {
171
+ return { provider: "gcp", region: null, source: "env" };
172
+ }
173
+ return null;
174
+ }
175
+ // ---------------------------------------------------------------------------
176
+ // Phase 1b — DMI check (Linux only; silent no-op elsewhere)
177
+ // ---------------------------------------------------------------------------
178
+ /**
179
+ * Read all DMI fields we care about. Missing files / non-Linux platforms
180
+ * silently yield an empty record.
181
+ */
182
+ function _readDmi() {
183
+ if (process.platform !== "linux")
184
+ return {};
185
+ const result = {};
186
+ for (const field of DMI_FIELDS) {
187
+ try {
188
+ const raw = readFileSync(`/sys/class/dmi/id/${field}`, "utf-8");
189
+ result[field] = raw.trim().toLowerCase();
190
+ }
191
+ catch {
192
+ // Missing file or read error → skip this field.
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ // Test seam — allow tests to override `_readDmi` behaviour.
198
+ let _readDmiOverride = null;
199
+ export function _setReadDmiForTests(fn) {
200
+ _readDmiOverride = fn;
201
+ }
202
+ function _readDmiSafe() {
203
+ if (_readDmiOverride !== null)
204
+ return _readDmiOverride();
205
+ return _readDmi();
206
+ }
207
+ function _detectDmi() {
208
+ const dmi = _readDmiSafe();
209
+ for (const rule of DMI_RULES) {
210
+ const value = dmi[rule.field];
211
+ if (!value)
212
+ continue;
213
+ if (rule.mode === "eq" && value === rule.needle) {
214
+ return { provider: rule.provider, region: null, source: "dmi" };
215
+ }
216
+ if (rule.mode === "contains" && value.includes(rule.needle)) {
217
+ return { provider: rule.provider, region: null, source: "dmi" };
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Phase 2 — metadata probes
224
+ // ---------------------------------------------------------------------------
225
+ /**
226
+ * Strip a GCP metadata-server `projects/.../<X>/<name>` response to a region.
227
+ *
228
+ * Zone form (`projects/123/zones/us-central1-a`) → `us-central1` when
229
+ * `dropZoneLetter=true`.
230
+ * Region form (`projects/123/regions/us-central1`) → `us-central1` when
231
+ * `dropZoneLetter=false`.
232
+ */
233
+ export function _gcpPathToRegion(value, dropZoneLetter) {
234
+ if (!value)
235
+ return null;
236
+ const parts = value.split("/");
237
+ const last = parts[parts.length - 1] || "";
238
+ if (!last)
239
+ return null;
240
+ if (dropZoneLetter) {
241
+ if (!last.includes("-"))
242
+ return null;
243
+ return last.substring(0, last.lastIndexOf("-"));
244
+ }
245
+ return last;
246
+ }
247
+ /** Hookable fetch — tests replace this to avoid real network calls. */
248
+ let _fetchImpl = (...args) => fetch(...args);
249
+ export function _setFetchForTests(impl) {
250
+ _fetchImpl = impl ?? ((...args) => fetch(...args));
251
+ }
252
+ async function _probeAws() {
253
+ try {
254
+ const tokenResp = await _fetchImpl("http://169.254.169.254/latest/api/token", {
255
+ method: "PUT",
256
+ headers: { "X-aws-ec2-metadata-token-ttl-seconds": "21600" },
257
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
258
+ });
259
+ if (!tokenResp.ok)
260
+ return null;
261
+ const token = (await tokenResp.text()).trim();
262
+ if (!token)
263
+ return null;
264
+ const regResp = await _fetchImpl("http://169.254.169.254/latest/meta-data/placement/region", {
265
+ headers: { "X-aws-ec2-metadata-token": token },
266
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
267
+ });
268
+ if (!regResp.ok)
269
+ return null;
270
+ const region = (await regResp.text()).trim();
271
+ // Decision #3: extract instance-type in the same probe. Wrap separately
272
+ // so a failure here doesn't lose the region we already resolved.
273
+ let instanceType = null;
274
+ try {
275
+ const itResp = await _fetchImpl("http://169.254.169.254/latest/meta-data/instance-type", {
276
+ headers: { "X-aws-ec2-metadata-token": token },
277
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
278
+ });
279
+ if (itResp.ok) {
280
+ const body = (await itResp.text()).trim();
281
+ instanceType = body || null;
282
+ }
283
+ }
284
+ catch {
285
+ // Fail-silent — keep region even if instance-type errors.
286
+ }
287
+ return {
288
+ provider: "aws",
289
+ region: region || null,
290
+ source: "imds",
291
+ instanceType,
292
+ };
293
+ }
294
+ catch {
295
+ return null;
296
+ }
297
+ }
298
+ async function _probeGcp() {
299
+ const headers = { "Metadata-Flavor": "Google" };
300
+ let region = null;
301
+ // Try /region first (works on Cloud Run / Cloud Functions Gen2 and GCE).
302
+ try {
303
+ const resp = await _fetchImpl("http://metadata.google.internal/computeMetadata/v1/instance/region", { headers, signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
304
+ if (resp.ok) {
305
+ const body = (await resp.text()).trim();
306
+ region = _gcpPathToRegion(body, false);
307
+ }
308
+ }
309
+ catch {
310
+ region = null;
311
+ }
312
+ if (region === null) {
313
+ try {
314
+ const resp = await _fetchImpl("http://metadata.google.internal/computeMetadata/v1/instance/zone", { headers, signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
315
+ if (!resp.ok)
316
+ return null;
317
+ const body = (await resp.text()).trim();
318
+ region = _gcpPathToRegion(body, true);
319
+ }
320
+ catch {
321
+ return null;
322
+ }
323
+ }
324
+ // Decision #3: machine-type lives under /instance/machine-type and shares
325
+ // the projects/.../machineTypes/<name> path shape — strip the prefix to
326
+ // get e.g. "n2-standard-2". Fail-silent so a missing endpoint does not
327
+ // discard the region we already resolved.
328
+ let instanceType = null;
329
+ try {
330
+ const resp = await _fetchImpl("http://metadata.google.internal/computeMetadata/v1/instance/machine-type", { headers, signal: AbortSignal.timeout(PROBE_TIMEOUT_MS) });
331
+ if (resp.ok) {
332
+ const body = (await resp.text()).trim();
333
+ if (body) {
334
+ const parts = body.split("/");
335
+ const last = parts[parts.length - 1] || "";
336
+ instanceType = last || null;
337
+ }
338
+ }
339
+ }
340
+ catch {
341
+ // fail-silent
342
+ }
343
+ return { provider: "gcp", region, source: "imds", instanceType };
344
+ }
345
+ async function _probeAzure() {
346
+ try {
347
+ const resp = await _fetchImpl("http://169.254.169.254/metadata/instance?api-version=2021-02-01", {
348
+ headers: { Metadata: "true" },
349
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
350
+ });
351
+ if (!resp.ok)
352
+ return null;
353
+ const payload = (await resp.json());
354
+ const region = payload.compute?.location || null;
355
+ // Decision #3: vmSize is already in the same IMDS payload — zero extra
356
+ // HTTP cost. Returns null when absent (some non-VM Azure runtimes).
357
+ const instanceType = payload.compute?.vmSize || null;
358
+ return { provider: "azure", region, source: "imds", instanceType };
359
+ }
360
+ catch {
361
+ return null;
362
+ }
363
+ }
364
+ async function _probeOci() {
365
+ try {
366
+ const resp = await _fetchImpl("http://169.254.169.254/opc/v2/instance/canonicalRegionName", {
367
+ headers: { Authorization: "Bearer Oracle" },
368
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
369
+ });
370
+ if (!resp.ok)
371
+ return null;
372
+ const region = (await resp.text()).trim().toLowerCase();
373
+ return { provider: "oci", region: region || null, source: "imds" };
374
+ }
375
+ catch {
376
+ return null;
377
+ }
378
+ }
379
+ async function _probeDigitalOcean() {
380
+ try {
381
+ const resp = await _fetchImpl("http://169.254.169.254/metadata/v1/region", {
382
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
383
+ });
384
+ if (!resp.ok)
385
+ return null;
386
+ const region = (await resp.text()).trim().toLowerCase();
387
+ return { provider: "digitalocean", region: region || null, source: "imds" };
388
+ }
389
+ catch {
390
+ return null;
391
+ }
392
+ }
393
+ async function _probeAlibaba() {
394
+ try {
395
+ const resp = await _fetchImpl("http://100.100.100.200/latest/meta-data/region-id", {
396
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
397
+ });
398
+ if (!resp.ok)
399
+ return null;
400
+ const region = (await resp.text()).trim().toLowerCase();
401
+ return { provider: "alibaba", region: region || null, source: "imds" };
402
+ }
403
+ catch {
404
+ return null;
405
+ }
406
+ }
407
+ /**
408
+ * Provider hint → metadata probe. Mutable so tests can stub individual
409
+ * probes via `monkeypatch.setitem` (Python idiom) → `_PROBES["aws"] = …`.
410
+ */
411
+ export const _PROBES = {
412
+ aws: _probeAws,
413
+ gcp: _probeGcp,
414
+ azure: _probeAzure,
415
+ oci: _probeOci,
416
+ digitalocean: _probeDigitalOcean,
417
+ alibaba: _probeAlibaba,
418
+ };
419
+ /**
420
+ * Phase 2 fanout providers. When DMI doesn't pre-classify, we race AWS/GCP/
421
+ * Azure in parallel — adding OCI/DO/Alibaba would lengthen worst-case wait
422
+ * and hit the wrong metadata server (DO uses the same 169.254.169.254 IP).
423
+ */
424
+ export const _FANOUT_PROBES = ["aws", "gcp", "azure"];
425
+ async function _runProbe(providerHint) {
426
+ if (providerHint && providerHint in _PROBES) {
427
+ const probe = _PROBES[providerHint];
428
+ if (probe) {
429
+ const env = await probe();
430
+ return env ?? { provider: providerHint, region: null, source: "imds" };
431
+ }
432
+ }
433
+ // Race the fanout — first non-null wins.
434
+ const promises = _FANOUT_PROBES.map((name) => _PROBES[name]().then((env) => (env ? env : null)));
435
+ // Promise.race resolves on first settle; we want first NON-null. Use a
436
+ // promise pattern where each non-null result resolves the outer promise.
437
+ const result = await new Promise((resolve) => {
438
+ let pending = promises.length;
439
+ let settled = false;
440
+ for (const p of promises) {
441
+ p.then((env) => {
442
+ if (settled)
443
+ return;
444
+ if (env !== null) {
445
+ settled = true;
446
+ resolve(env);
447
+ return;
448
+ }
449
+ pending -= 1;
450
+ if (pending === 0 && !settled) {
451
+ settled = true;
452
+ resolve(null);
453
+ }
454
+ }, () => {
455
+ if (settled)
456
+ return;
457
+ pending -= 1;
458
+ if (pending === 0 && !settled) {
459
+ settled = true;
460
+ resolve(null);
461
+ }
462
+ });
463
+ }
464
+ });
465
+ if (result)
466
+ return result;
467
+ return { provider: null, region: null, source: "none" };
468
+ }
469
+ // ---------------------------------------------------------------------------
470
+ // Orchestration
471
+ // ---------------------------------------------------------------------------
472
+ /** Run Phase 1a + 1b synchronously. Used by tests; never calls IMDS. */
473
+ export function detectNow() {
474
+ const envResult = _detectEnv();
475
+ if (envResult && envResult.provider !== null && envResult.region !== null) {
476
+ return envResult;
477
+ }
478
+ const dmi = _detectDmi();
479
+ const merged = envResult ?? dmi;
480
+ return merged ?? { provider: null, region: null, source: "none" };
481
+ }
482
+ /**
483
+ * Resolve provider/region without blocking. Idempotent.
484
+ *
485
+ * When `trackNetwork` is false, no probe is launched.
486
+ *
487
+ * Phase 1a + 1b run synchronously; Phase 2 is fire-and-forget so init()
488
+ * returns immediately. Tests can await `_backgroundPromise` via the
489
+ * `_awaitBackgroundForTests` helper.
490
+ */
491
+ export function startBackgroundDetection(trackNetwork = true) {
492
+ if (!trackNetwork) {
493
+ _setResult({ provider: null, region: null, source: "none" });
494
+ return;
495
+ }
496
+ const initial = detectNow();
497
+ _setResult(initial);
498
+ if (initial.provider !== null && initial.region !== null) {
499
+ return;
500
+ }
501
+ // Don't launch a second background probe if one is already in flight.
502
+ if (_backgroundPromise !== null)
503
+ return;
504
+ _backgroundPromise = (async () => {
505
+ try {
506
+ const env = await _runProbe(initial.provider);
507
+ if (env.provider !== null) {
508
+ // Preserve region from env when IMDS only got the provider, and
509
+ // preserve instanceType from whichever source has it.
510
+ const region = env.region ? env.region : initial.region;
511
+ const instanceType = env.instanceType != null ? env.instanceType : initial.instanceType ?? null;
512
+ _setResult({
513
+ provider: env.provider,
514
+ region,
515
+ source: env.source,
516
+ instanceType,
517
+ });
518
+ }
519
+ }
520
+ catch {
521
+ // Fail silent — Phase 2 is best-effort.
522
+ }
523
+ finally {
524
+ _backgroundPromise = null;
525
+ }
526
+ })();
527
+ }
528
+ /** Test-only helper to await the background Phase 2 probe. */
529
+ export async function _awaitBackgroundForTests() {
530
+ if (_backgroundPromise) {
531
+ await _backgroundPromise;
532
+ }
533
+ }
534
+ // Exposed for tests that need to call probes directly (parity with the
535
+ // Python `cd._probe_gcp()` test pattern).
536
+ export const _probes = {
537
+ aws: _probeAws,
538
+ gcp: _probeGcp,
539
+ azure: _probeAzure,
540
+ oci: _probeOci,
541
+ digitalocean: _probeDigitalOcean,
542
+ alibaba: _probeAlibaba,
543
+ };
544
+ export { _runProbe };
545
+ //# sourceMappingURL=cloud-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-detect.js","sourceRoot":"","sources":["../src/cloud-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Auto-task creation for auto-instrumented calls without an explicit task.
3
+ *
4
+ * Mirrors the Python SDK's `auto_task.py`. When an LLM/HTTP call happens
5
+ * outside an explicit `track()` task, an auto-task is created so the cost
6
+ * is never silently lost. Attribution (customerId/projectId/metadata) is
7
+ * pulled from the ambient `DexcostContext` when available.
8
+ */
9
+ import type { Task } from "./models.js";
10
+ /** Return true if there is no active explicit task. */
11
+ export declare function needsAutoTask(): boolean;
12
+ /**
13
+ * Create an auto-task with attribution from the current DexcostContext.
14
+ *
15
+ * Reads `customerId`, `projectId`, `metadata`, and `agent` from the
16
+ * ambient context (set via `setContext`). When `agent` is set in the
17
+ * context it overrides the provided `taskType`.
18
+ */
19
+ export declare function createAutoTask(taskType: string): Task;
20
+ //# sourceMappingURL=auto-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-task.d.ts","sourceRoot":"","sources":["../../src/core/auto-task.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,uDAAuD;AACvD,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAUrD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Auto-task creation for auto-instrumented calls without an explicit task.
3
+ *
4
+ * Mirrors the Python SDK's `auto_task.py`. When an LLM/HTTP call happens
5
+ * outside an explicit `track()` task, an auto-task is created so the cost
6
+ * is never silently lost. Attribution (customerId/projectId/metadata) is
7
+ * pulled from the ambient `DexcostContext` when available.
8
+ */
9
+ import { randomUUID } from "node:crypto";
10
+ import { createTask } from "./models.js";
11
+ import { getCurrentTask, getContext } from "./context.js";
12
+ /** Return true if there is no active explicit task. */
13
+ export function needsAutoTask() {
14
+ return getCurrentTask() === undefined;
15
+ }
16
+ /**
17
+ * Create an auto-task with attribution from the current DexcostContext.
18
+ *
19
+ * Reads `customerId`, `projectId`, `metadata`, and `agent` from the
20
+ * ambient context (set via `setContext`). When `agent` is set in the
21
+ * context it overrides the provided `taskType`.
22
+ */
23
+ export function createAutoTask(taskType) {
24
+ const ctx = getContext();
25
+ const effectiveTaskType = ctx?.agent ? ctx.agent : taskType;
26
+ return createTask({
27
+ taskId: randomUUID(),
28
+ taskType: effectiveTaskType,
29
+ customerId: ctx?.customerId,
30
+ projectId: ctx?.projectId,
31
+ metadata: ctx?.metadata ? { ...ctx.metadata } : {},
32
+ });
33
+ }
34
+ //# sourceMappingURL=auto-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-task.js","sourceRoot":"","sources":["../../src/core/auto-task.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1D,uDAAuD;AACvD,MAAM,UAAU,aAAa;IAC3B,OAAO,cAAc,EAAE,KAAK,SAAS,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,iBAAiB,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC5D,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,UAAU,EAAE;QACpB,QAAQ,EAAE,iBAAiB;QAC3B,UAAU,EAAE,GAAG,EAAE,UAAU;QAC3B,SAAS,EAAE,GAAG,EAAE,SAAS;QACzB,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;KACnD,CAAC,CAAC;AACL,CAAC"}