elasticdash-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 (349) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +775 -0
  3. package/dist/browser-ui.d.ts +43 -0
  4. package/dist/browser-ui.d.ts.map +1 -0
  5. package/dist/browser-ui.js +246 -0
  6. package/dist/browser-ui.js.map +1 -0
  7. package/dist/capture/event.d.ts +33 -0
  8. package/dist/capture/event.d.ts.map +1 -0
  9. package/dist/capture/event.js +2 -0
  10. package/dist/capture/event.js.map +1 -0
  11. package/dist/capture/index.d.ts +4 -0
  12. package/dist/capture/index.d.ts.map +1 -0
  13. package/dist/capture/index.js +4 -0
  14. package/dist/capture/index.js.map +1 -0
  15. package/dist/capture/recorder.d.ts +24 -0
  16. package/dist/capture/recorder.d.ts.map +1 -0
  17. package/dist/capture/recorder.js +46 -0
  18. package/dist/capture/recorder.js.map +1 -0
  19. package/dist/capture/replay.d.ts +20 -0
  20. package/dist/capture/replay.d.ts.map +1 -0
  21. package/dist/capture/replay.js +47 -0
  22. package/dist/capture/replay.js.map +1 -0
  23. package/dist/ci/api-client.d.ts +38 -0
  24. package/dist/ci/api-client.d.ts.map +1 -0
  25. package/dist/ci/api-client.js +96 -0
  26. package/dist/ci/api-client.js.map +1 -0
  27. package/dist/ci/benchmark.d.ts +33 -0
  28. package/dist/ci/benchmark.d.ts.map +1 -0
  29. package/dist/ci/benchmark.js +213 -0
  30. package/dist/ci/benchmark.js.map +1 -0
  31. package/dist/ci/ed-runner.d.ts +48 -0
  32. package/dist/ci/ed-runner.d.ts.map +1 -0
  33. package/dist/ci/ed-runner.js +260 -0
  34. package/dist/ci/ed-runner.js.map +1 -0
  35. package/dist/ci/executor.d.ts +13 -0
  36. package/dist/ci/executor.d.ts.map +1 -0
  37. package/dist/ci/executor.js +542 -0
  38. package/dist/ci/executor.js.map +1 -0
  39. package/dist/ci/git-info.d.ts +17 -0
  40. package/dist/ci/git-info.d.ts.map +1 -0
  41. package/dist/ci/git-info.js +102 -0
  42. package/dist/ci/git-info.js.map +1 -0
  43. package/dist/ci/index.d.ts +6 -0
  44. package/dist/ci/index.d.ts.map +1 -0
  45. package/dist/ci/index.js +4 -0
  46. package/dist/ci/index.js.map +1 -0
  47. package/dist/ci/measurement.d.ts +9 -0
  48. package/dist/ci/measurement.d.ts.map +1 -0
  49. package/dist/ci/measurement.js +15 -0
  50. package/dist/ci/measurement.js.map +1 -0
  51. package/dist/ci/replay.d.ts +31 -0
  52. package/dist/ci/replay.d.ts.map +1 -0
  53. package/dist/ci/replay.js +96 -0
  54. package/dist/ci/replay.js.map +1 -0
  55. package/dist/ci/reporters/default.d.ts +8 -0
  56. package/dist/ci/reporters/default.d.ts.map +1 -0
  57. package/dist/ci/reporters/default.js +46 -0
  58. package/dist/ci/reporters/default.js.map +1 -0
  59. package/dist/ci/reporters/index.d.ts +8 -0
  60. package/dist/ci/reporters/index.d.ts.map +1 -0
  61. package/dist/ci/reporters/index.js +14 -0
  62. package/dist/ci/reporters/index.js.map +1 -0
  63. package/dist/ci/reporters/json.d.ts +8 -0
  64. package/dist/ci/reporters/json.d.ts.map +1 -0
  65. package/dist/ci/reporters/json.js +14 -0
  66. package/dist/ci/reporters/json.js.map +1 -0
  67. package/dist/ci/reporters/junit.d.ts +8 -0
  68. package/dist/ci/reporters/junit.d.ts.map +1 -0
  69. package/dist/ci/reporters/junit.js +48 -0
  70. package/dist/ci/reporters/junit.js.map +1 -0
  71. package/dist/ci/runner.d.ts +3 -0
  72. package/dist/ci/runner.d.ts.map +1 -0
  73. package/dist/ci/runner.js +187 -0
  74. package/dist/ci/runner.js.map +1 -0
  75. package/dist/ci/test-discovery.d.ts +5 -0
  76. package/dist/ci/test-discovery.d.ts.map +1 -0
  77. package/dist/ci/test-discovery.js +11 -0
  78. package/dist/ci/test-discovery.js.map +1 -0
  79. package/dist/ci/test-loader.d.ts +19 -0
  80. package/dist/ci/test-loader.d.ts.map +1 -0
  81. package/dist/ci/test-loader.js +149 -0
  82. package/dist/ci/test-loader.js.map +1 -0
  83. package/dist/ci/test-registry.d.ts +42 -0
  84. package/dist/ci/test-registry.d.ts.map +1 -0
  85. package/dist/ci/test-registry.js +18 -0
  86. package/dist/ci/test-registry.js.map +1 -0
  87. package/dist/ci/trace-schema.d.ts +30 -0
  88. package/dist/ci/trace-schema.d.ts.map +1 -0
  89. package/dist/ci/trace-schema.js +66 -0
  90. package/dist/ci/trace-schema.js.map +1 -0
  91. package/dist/ci/trace-writer.d.ts +16 -0
  92. package/dist/ci/trace-writer.d.ts.map +1 -0
  93. package/dist/ci/trace-writer.js +108 -0
  94. package/dist/ci/trace-writer.js.map +1 -0
  95. package/dist/ci/types.d.ts +108 -0
  96. package/dist/ci/types.d.ts.map +1 -0
  97. package/dist/ci/types.js +3 -0
  98. package/dist/ci/types.js.map +1 -0
  99. package/dist/ci/upload-client.d.ts +74 -0
  100. package/dist/ci/upload-client.d.ts.map +1 -0
  101. package/dist/ci/upload-client.js +195 -0
  102. package/dist/ci/upload-client.js.map +1 -0
  103. package/dist/cli.d.ts +3 -0
  104. package/dist/cli.d.ts.map +1 -0
  105. package/dist/cli.js +716 -0
  106. package/dist/cli.js.map +1 -0
  107. package/dist/core/agent-state.d.ts +47 -0
  108. package/dist/core/agent-state.d.ts.map +1 -0
  109. package/dist/core/agent-state.js +137 -0
  110. package/dist/core/agent-state.js.map +1 -0
  111. package/dist/core/judge-utils.d.ts +22 -0
  112. package/dist/core/judge-utils.d.ts.map +1 -0
  113. package/dist/core/judge-utils.js +211 -0
  114. package/dist/core/judge-utils.js.map +1 -0
  115. package/dist/core/registry.d.ts +28 -0
  116. package/dist/core/registry.d.ts.map +1 -0
  117. package/dist/core/registry.js +52 -0
  118. package/dist/core/registry.js.map +1 -0
  119. package/dist/dashboard-server.d.ts +65 -0
  120. package/dist/dashboard-server.d.ts.map +1 -0
  121. package/dist/dashboard-server.js +3940 -0
  122. package/dist/dashboard-server.js.map +1 -0
  123. package/dist/execution/tool-runner.d.ts +26 -0
  124. package/dist/execution/tool-runner.d.ts.map +1 -0
  125. package/dist/execution/tool-runner.js +316 -0
  126. package/dist/execution/tool-runner.js.map +1 -0
  127. package/dist/html/dashboard.html +2218 -0
  128. package/dist/http.d.ts +14 -0
  129. package/dist/http.d.ts.map +1 -0
  130. package/dist/http.js +13 -0
  131. package/dist/http.js.map +1 -0
  132. package/dist/index.cjs +8102 -0
  133. package/dist/index.d.ts +61 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +67 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/interceptors/ai-interceptor.d.ts +26 -0
  138. package/dist/interceptors/ai-interceptor.d.ts.map +1 -0
  139. package/dist/interceptors/ai-interceptor.js +756 -0
  140. package/dist/interceptors/ai-interceptor.js.map +1 -0
  141. package/dist/interceptors/db-auto.d.ts +8 -0
  142. package/dist/interceptors/db-auto.d.ts.map +1 -0
  143. package/dist/interceptors/db-auto.js +217 -0
  144. package/dist/interceptors/db-auto.js.map +1 -0
  145. package/dist/interceptors/db.d.ts +23 -0
  146. package/dist/interceptors/db.d.ts.map +1 -0
  147. package/dist/interceptors/db.js +137 -0
  148. package/dist/interceptors/db.js.map +1 -0
  149. package/dist/interceptors/http.d.ts +28 -0
  150. package/dist/interceptors/http.d.ts.map +1 -0
  151. package/dist/interceptors/http.js +356 -0
  152. package/dist/interceptors/http.js.map +1 -0
  153. package/dist/interceptors/side-effects.d.ts +7 -0
  154. package/dist/interceptors/side-effects.d.ts.map +1 -0
  155. package/dist/interceptors/side-effects.js +72 -0
  156. package/dist/interceptors/side-effects.js.map +1 -0
  157. package/dist/interceptors/telemetry-push.d.ts +142 -0
  158. package/dist/interceptors/telemetry-push.d.ts.map +1 -0
  159. package/dist/interceptors/telemetry-push.js +463 -0
  160. package/dist/interceptors/telemetry-push.js.map +1 -0
  161. package/dist/interceptors/tool.d.ts +2 -0
  162. package/dist/interceptors/tool.d.ts.map +1 -0
  163. package/dist/interceptors/tool.js +274 -0
  164. package/dist/interceptors/tool.js.map +1 -0
  165. package/dist/interceptors/workflow-ai.d.ts +5 -0
  166. package/dist/interceptors/workflow-ai.d.ts.map +1 -0
  167. package/dist/interceptors/workflow-ai.js +382 -0
  168. package/dist/interceptors/workflow-ai.js.map +1 -0
  169. package/dist/internals/conditional-recorder.d.ts +21 -0
  170. package/dist/internals/conditional-recorder.d.ts.map +1 -0
  171. package/dist/internals/conditional-recorder.js +54 -0
  172. package/dist/internals/conditional-recorder.js.map +1 -0
  173. package/dist/internals/mock-resolver.d.ts +146 -0
  174. package/dist/internals/mock-resolver.d.ts.map +1 -0
  175. package/dist/internals/mock-resolver.js +427 -0
  176. package/dist/internals/mock-resolver.js.map +1 -0
  177. package/dist/matchers/index.d.ts +96 -0
  178. package/dist/matchers/index.d.ts.map +1 -0
  179. package/dist/matchers/index.js +668 -0
  180. package/dist/matchers/index.js.map +1 -0
  181. package/dist/observability.d.ts +82 -0
  182. package/dist/observability.d.ts.map +1 -0
  183. package/dist/observability.js +471 -0
  184. package/dist/observability.js.map +1 -0
  185. package/dist/portal-executor.d.ts +30 -0
  186. package/dist/portal-executor.d.ts.map +1 -0
  187. package/dist/portal-executor.js +324 -0
  188. package/dist/portal-executor.js.map +1 -0
  189. package/dist/portal-server.d.ts +3 -0
  190. package/dist/portal-server.d.ts.map +1 -0
  191. package/dist/portal-server.js +279 -0
  192. package/dist/portal-server.js.map +1 -0
  193. package/dist/proxy/llm-capture.d.ts +14 -0
  194. package/dist/proxy/llm-capture.d.ts.map +1 -0
  195. package/dist/proxy/llm-capture.js +264 -0
  196. package/dist/proxy/llm-capture.js.map +1 -0
  197. package/dist/reporter.d.ts +3 -0
  198. package/dist/reporter.d.ts.map +1 -0
  199. package/dist/reporter.js +72 -0
  200. package/dist/reporter.js.map +1 -0
  201. package/dist/runWorkflowSubprocess.d.ts +14 -0
  202. package/dist/runWorkflowSubprocess.d.ts.map +1 -0
  203. package/dist/runWorkflowSubprocess.js +66 -0
  204. package/dist/runWorkflowSubprocess.js.map +1 -0
  205. package/dist/runner.d.ts +16 -0
  206. package/dist/runner.d.ts.map +1 -0
  207. package/dist/runner.js +138 -0
  208. package/dist/runner.js.map +1 -0
  209. package/dist/socket-connector.d.ts +22 -0
  210. package/dist/socket-connector.d.ts.map +1 -0
  211. package/dist/socket-connector.js +104 -0
  212. package/dist/socket-connector.js.map +1 -0
  213. package/dist/telemetry-batcher.d.ts +56 -0
  214. package/dist/telemetry-batcher.d.ts.map +1 -0
  215. package/dist/telemetry-batcher.js +143 -0
  216. package/dist/telemetry-batcher.js.map +1 -0
  217. package/dist/test-setup.d.ts +12 -0
  218. package/dist/test-setup.d.ts.map +1 -0
  219. package/dist/test-setup.js +13 -0
  220. package/dist/test-setup.js.map +1 -0
  221. package/dist/tool-registry.d.ts +31 -0
  222. package/dist/tool-registry.d.ts.map +1 -0
  223. package/dist/tool-registry.js +73 -0
  224. package/dist/tool-registry.js.map +1 -0
  225. package/dist/tool-runner-worker.d.ts +2 -0
  226. package/dist/tool-runner-worker.d.ts.map +1 -0
  227. package/dist/tool-runner-worker.js +215 -0
  228. package/dist/tool-runner-worker.js.map +1 -0
  229. package/dist/trace-adapter/context.d.ts +72 -0
  230. package/dist/trace-adapter/context.d.ts.map +1 -0
  231. package/dist/trace-adapter/context.js +80 -0
  232. package/dist/trace-adapter/context.js.map +1 -0
  233. package/dist/tracing.d.ts +2 -0
  234. package/dist/tracing.d.ts.map +1 -0
  235. package/dist/tracing.js +59 -0
  236. package/dist/tracing.js.map +1 -0
  237. package/dist/trigger-executor.d.ts +12 -0
  238. package/dist/trigger-executor.d.ts.map +1 -0
  239. package/dist/trigger-executor.js +130 -0
  240. package/dist/trigger-executor.js.map +1 -0
  241. package/dist/types/portal.d.ts +76 -0
  242. package/dist/types/portal.d.ts.map +1 -0
  243. package/dist/types/portal.js +2 -0
  244. package/dist/types/portal.js.map +1 -0
  245. package/dist/utils/debug.d.ts +3 -0
  246. package/dist/utils/debug.d.ts.map +1 -0
  247. package/dist/utils/debug.js +8 -0
  248. package/dist/utils/debug.js.map +1 -0
  249. package/dist/utils/license-error.d.ts +23 -0
  250. package/dist/utils/license-error.d.ts.map +1 -0
  251. package/dist/utils/license-error.js +42 -0
  252. package/dist/utils/license-error.js.map +1 -0
  253. package/dist/utils/redact.d.ts +7 -0
  254. package/dist/utils/redact.d.ts.map +1 -0
  255. package/dist/utils/redact.js +26 -0
  256. package/dist/utils/redact.js.map +1 -0
  257. package/dist/workflow-runner-worker.d.ts +2 -0
  258. package/dist/workflow-runner-worker.d.ts.map +1 -0
  259. package/dist/workflow-runner-worker.js +329 -0
  260. package/dist/workflow-runner-worker.js.map +1 -0
  261. package/dist/workflow-runner.d.ts +14 -0
  262. package/dist/workflow-runner.d.ts.map +1 -0
  263. package/dist/workflow-runner.js +34 -0
  264. package/dist/workflow-runner.js.map +1 -0
  265. package/docs/agent-coding-instructions.md +138 -0
  266. package/docs/agent-integration-guide.md +564 -0
  267. package/docs/agents.md +140 -0
  268. package/docs/dashboard.md +394 -0
  269. package/docs/deno.md +69 -0
  270. package/docs/instrumentation.md +424 -0
  271. package/docs/langfuse-trace-structure.md +145 -0
  272. package/docs/matchers.md +173 -0
  273. package/docs/observability_contract.md +192 -0
  274. package/docs/observability_mode.md +195 -0
  275. package/docs/quickstart.md +621 -0
  276. package/docs/security-compliance.md +566 -0
  277. package/docs/test-writing-guidelines.md +444 -0
  278. package/docs/tools.md +165 -0
  279. package/docs/workflow-modes.md +253 -0
  280. package/package.json +76 -0
  281. package/src/browser-ui.ts +281 -0
  282. package/src/capture/event.ts +30 -0
  283. package/src/capture/index.ts +3 -0
  284. package/src/capture/recorder.ts +62 -0
  285. package/src/capture/replay.ts +55 -0
  286. package/src/ci/api-client.ts +136 -0
  287. package/src/ci/benchmark.ts +257 -0
  288. package/src/ci/ed-runner.ts +351 -0
  289. package/src/ci/executor.ts +671 -0
  290. package/src/ci/git-info.ts +127 -0
  291. package/src/ci/index.ts +5 -0
  292. package/src/ci/measurement.ts +25 -0
  293. package/src/ci/replay.ts +127 -0
  294. package/src/ci/reporters/default.ts +50 -0
  295. package/src/ci/reporters/index.ts +21 -0
  296. package/src/ci/reporters/json.ts +18 -0
  297. package/src/ci/reporters/junit.ts +61 -0
  298. package/src/ci/runner.ts +208 -0
  299. package/src/ci/test-discovery.ts +16 -0
  300. package/src/ci/test-loader.ts +187 -0
  301. package/src/ci/test-registry.ts +62 -0
  302. package/src/ci/trace-schema.ts +96 -0
  303. package/src/ci/trace-writer.ts +107 -0
  304. package/src/ci/types.ts +115 -0
  305. package/src/ci/upload-client.ts +300 -0
  306. package/src/cli.ts +811 -0
  307. package/src/core/agent-state.ts +162 -0
  308. package/src/core/judge-utils.ts +232 -0
  309. package/src/core/registry.ts +92 -0
  310. package/src/dashboard-server.ts +2047 -0
  311. package/src/execution/tool-runner.ts +352 -0
  312. package/src/html/dashboard.html +2218 -0
  313. package/src/http.ts +13 -0
  314. package/src/index.ts +138 -0
  315. package/src/interceptors/ai-interceptor.ts +798 -0
  316. package/src/interceptors/db-auto.ts +243 -0
  317. package/src/interceptors/db.ts +156 -0
  318. package/src/interceptors/http.ts +393 -0
  319. package/src/interceptors/side-effects.ts +83 -0
  320. package/src/interceptors/telemetry-push.ts +537 -0
  321. package/src/interceptors/tool.ts +287 -0
  322. package/src/interceptors/workflow-ai.ts +419 -0
  323. package/src/internals/conditional-recorder.ts +63 -0
  324. package/src/internals/mock-resolver.ts +492 -0
  325. package/src/matchers/index.ts +824 -0
  326. package/src/observability.ts +501 -0
  327. package/src/portal-executor.ts +355 -0
  328. package/src/portal-server.ts +304 -0
  329. package/src/proxy/llm-capture.ts +301 -0
  330. package/src/reporter.ts +81 -0
  331. package/src/runWorkflowSubprocess.ts +74 -0
  332. package/src/runner.ts +178 -0
  333. package/src/socket-connector.ts +117 -0
  334. package/src/telemetry-batcher.ts +191 -0
  335. package/src/test-setup.ts +16 -0
  336. package/src/tool-registry.ts +94 -0
  337. package/src/tool-runner-worker.ts +244 -0
  338. package/src/trace-adapter/context.ts +156 -0
  339. package/src/tracing.ts +62 -0
  340. package/src/trigger-executor.ts +171 -0
  341. package/src/types/agent.d.ts +63 -0
  342. package/src/types/expect.d.ts +81 -0
  343. package/src/types/modules.d.ts +2 -0
  344. package/src/types/portal.ts +69 -0
  345. package/src/utils/debug.ts +8 -0
  346. package/src/utils/license-error.ts +43 -0
  347. package/src/utils/redact.ts +25 -0
  348. package/src/workflow-runner-worker.ts +386 -0
  349. package/src/workflow-runner.ts +58 -0
@@ -0,0 +1,382 @@
1
+ import { getCaptureContext } from '../capture/recorder.js';
2
+ import { rawDateNow } from './side-effects.js';
3
+ import { getHttpRunContext, getHttpFrozenEvent, getHttpPromptMock, getHttpUserPromptMock, getHttpAIMock, pushTelemetryEvent, tryAutoInitHttpContext, getObservabilityContext } from './telemetry-push.js';
4
+ import { resolveAIMock, resolvePromptMock, resolveUserPromptMock } from '../internals/mock-resolver.js';
5
+ import { consumeCapturedLLMRequest } from './ai-interceptor.js';
6
+ import { getEdReplayContext, replayCall } from '../ci/replay.js';
7
+ /**
8
+ * Tracks whether we are currently inside a `wrapAI` execution.
9
+ * When active, `ai-interceptor` should skip recording to avoid duplicates.
10
+ * Uses a counter (not boolean) to handle nested wrapAI calls correctly.
11
+ */
12
+ const AI_WRAPPER_KEY = '__elasticdash_ai_wrapper_depth__';
13
+ const g = globalThis;
14
+ if (g[AI_WRAPPER_KEY] == null)
15
+ g[AI_WRAPPER_KEY] = 0;
16
+ function enterAIWrapper() {
17
+ g[AI_WRAPPER_KEY] = (g[AI_WRAPPER_KEY] ?? 0) + 1;
18
+ }
19
+ function leaveAIWrapper() {
20
+ g[AI_WRAPPER_KEY] = Math.max(0, (g[AI_WRAPPER_KEY] ?? 0) - 1);
21
+ }
22
+ function extractUsage(output) {
23
+ if (!output || typeof output !== 'object')
24
+ return undefined;
25
+ const o = output;
26
+ if (o.usage && typeof o.usage === 'object') {
27
+ const u = o.usage;
28
+ // Anthropic SDK: input_tokens / output_tokens
29
+ if (u.input_tokens != null || u.output_tokens != null) {
30
+ return {
31
+ inputTokens: u.input_tokens,
32
+ outputTokens: u.output_tokens,
33
+ totalTokens: (u.input_tokens ?? 0) + (u.output_tokens ?? 0),
34
+ };
35
+ }
36
+ // OpenAI SDK: prompt_tokens / completion_tokens
37
+ if (u.prompt_tokens != null || u.completion_tokens != null) {
38
+ return {
39
+ inputTokens: u.prompt_tokens,
40
+ outputTokens: u.completion_tokens,
41
+ totalTokens: u.total_tokens,
42
+ };
43
+ }
44
+ // Vercel AI SDK: { inputTokens, outputTokens }
45
+ if (u.inputTokens != null || u.outputTokens != null) {
46
+ return {
47
+ inputTokens: u.inputTokens,
48
+ outputTokens: u.outputTokens,
49
+ totalTokens: (u.inputTokens ?? 0) + (u.outputTokens ?? 0),
50
+ };
51
+ }
52
+ }
53
+ // Gemini SDK: usageMetadata
54
+ if (o.usageMetadata && typeof o.usageMetadata === 'object') {
55
+ const u = o.usageMetadata;
56
+ return {
57
+ inputTokens: u.promptTokenCount,
58
+ outputTokens: u.candidatesTokenCount,
59
+ totalTokens: u.totalTokenCount,
60
+ };
61
+ }
62
+ // Flat token fields (e.g. { tokens: N } or { outputTokens: N, inputTokens: N })
63
+ if (typeof o.tokens === 'number' || typeof o.outputTokens === 'number') {
64
+ return {
65
+ inputTokens: typeof o.inputTokens === 'number' ? o.inputTokens : undefined,
66
+ outputTokens: typeof o.outputTokens === 'number' ? o.outputTokens : (typeof o.tokens === 'number' ? o.tokens : undefined),
67
+ totalTokens: (typeof o.inputTokens === 'number' ? o.inputTokens : 0) + (typeof o.outputTokens === 'number' ? o.outputTokens : (typeof o.tokens === 'number' ? o.tokens : 0)),
68
+ };
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * After callFn returns, consume any captured LLM request from ai-interceptor
74
+ * and merge it into the event input so the recorded event contains the actual
75
+ * HTTP payload sent to the LLM (messages, model, parameters).
76
+ * Also returns captured usage when the app's output doesn't include it.
77
+ */
78
+ function enrichFromLLMCapture(input, appUsage, fallbackModel, fallbackProvider) {
79
+ const captured = consumeCapturedLLMRequest();
80
+ if (captured) {
81
+ const enrichedInput = (input && typeof input === 'object')
82
+ ? { ...input, llmRequest: captured.body, promptSnippet: captured.promptSnippet }
83
+ : { originalInput: input, llmRequest: captured.body, promptSnippet: captured.promptSnippet };
84
+ const usage = appUsage ?? captured.usage;
85
+ return { input: enrichedInput, usage };
86
+ }
87
+ // Interceptor capture failed (e.g. OpenAI SDK uses native fetch not globalThis.fetch).
88
+ // Fall back to model/provider from wrapAI options or function arguments.
89
+ const resolvedModel = fallbackModel
90
+ || (input && typeof input === 'object' ? input.model : undefined);
91
+ const resolvedProvider = fallbackProvider
92
+ || (input && typeof input === 'object' ? input.provider : undefined);
93
+ if (resolvedModel || resolvedProvider) {
94
+ const enrichedInput = (input && typeof input === 'object')
95
+ ? { ...input, llmRequest: { model: resolvedModel, provider: resolvedProvider } }
96
+ : { originalInput: input, llmRequest: { model: resolvedModel, provider: resolvedProvider } };
97
+ return { input: enrichedInput, usage: appUsage };
98
+ }
99
+ return { input, usage: appUsage };
100
+ }
101
+ function isReadableStream(v) {
102
+ return (typeof v === 'object' &&
103
+ v !== null &&
104
+ typeof v.getReader === 'function' &&
105
+ typeof v.tee === 'function');
106
+ }
107
+ function isAsyncIterable(v) {
108
+ return typeof v === 'object' && v !== null && Symbol.asyncIterator in v;
109
+ }
110
+ async function bufferReadableStream(stream) {
111
+ const decoder = new TextDecoder();
112
+ const reader = stream.getReader();
113
+ let raw = '';
114
+ try {
115
+ for (;;) {
116
+ const { done, value } = await reader.read();
117
+ if (done)
118
+ break;
119
+ raw += decoder.decode(value, { stream: true });
120
+ }
121
+ }
122
+ finally {
123
+ reader.releaseLock();
124
+ }
125
+ return raw;
126
+ }
127
+ function reconstructStream(raw) {
128
+ const encoder = new TextEncoder();
129
+ return new ReadableStream({
130
+ start(ctrl) {
131
+ ctrl.enqueue(encoder.encode(raw));
132
+ ctrl.close();
133
+ },
134
+ });
135
+ }
136
+ /** Wraps an AsyncIterable so chunks are collected while the caller iterates */
137
+ function wrapAsyncIterable(source, onComplete) {
138
+ return {
139
+ [Symbol.asyncIterator]() {
140
+ const iter = source[Symbol.asyncIterator]();
141
+ const collected = [];
142
+ return {
143
+ async next() {
144
+ const result = await iter.next();
145
+ if (!result.done) {
146
+ collected.push(result.value);
147
+ }
148
+ else {
149
+ onComplete(collected);
150
+ }
151
+ return result;
152
+ },
153
+ async return(value) {
154
+ onComplete(collected);
155
+ return iter.return ? iter.return(value) : { done: true, value: undefined };
156
+ },
157
+ };
158
+ },
159
+ };
160
+ }
161
+ export function wrapAI(modelName, callFn, _options) {
162
+ return async (...args) => {
163
+ // Phase 3 fixture replay: short-circuit if ed-runner replay is active
164
+ const edReplay = getEdReplayContext();
165
+ if (edReplay) {
166
+ const input = args.length === 1 ? args[0] : args;
167
+ const { output } = replayCall(edReplay, 'ai_call', modelName, input);
168
+ return output;
169
+ }
170
+ await tryAutoInitHttpContext();
171
+ const ctx = getCaptureContext();
172
+ const httpCtx = getHttpRunContext();
173
+ const obsCtx = getObservabilityContext();
174
+ if (!ctx && !httpCtx && !obsCtx)
175
+ return callFn(...args);
176
+ enterAIWrapper();
177
+ try {
178
+ const start = rawDateNow();
179
+ // Observability-only mode: record and push, no mocks/replay
180
+ if (!ctx && !httpCtx && obsCtx) {
181
+ const id = obsCtx.nextId();
182
+ const input = args.length === 1 ? args[0] : args;
183
+ try {
184
+ const output = await callFn(...args);
185
+ const enriched = enrichFromLLMCapture(input, extractUsage(output), _options?.model, _options?.provider);
186
+ if (isReadableStream(output)) {
187
+ const [streamForCaller, streamForRecorder] = output.tee();
188
+ bufferReadableStream(streamForRecorder).then((rawText) => {
189
+ const durationMs = rawDateNow() - start;
190
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
191
+ }).catch(() => {
192
+ const durationMs = rawDateNow() - start;
193
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: '', timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
194
+ });
195
+ return streamForCaller;
196
+ }
197
+ if (isAsyncIterable(output)) {
198
+ return wrapAsyncIterable(output, (chunks) => {
199
+ const durationMs = rawDateNow() - start;
200
+ const rawText = chunks.map((c) => (typeof c === 'string' ? c : JSON.stringify(c))).join('');
201
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
202
+ });
203
+ }
204
+ const durationMs = rawDateNow() - start;
205
+ const event = {
206
+ id, type: 'ai', name: modelName, input: enriched.input, output,
207
+ timestamp: start, durationMs,
208
+ ...(enriched.usage ? { usage: enriched.usage } : {}),
209
+ };
210
+ pushTelemetryEvent(event);
211
+ return output;
212
+ }
213
+ catch (e) {
214
+ const enriched = enrichFromLLMCapture(input, undefined, _options?.model, _options?.provider);
215
+ const durationMs = rawDateNow() - start;
216
+ pushTelemetryEvent({
217
+ id, type: 'ai', name: modelName, input: enriched.input,
218
+ output: { error: String(e) }, timestamp: start, durationMs,
219
+ });
220
+ throw e;
221
+ }
222
+ }
223
+ if (ctx) {
224
+ const { recorder, replay } = ctx;
225
+ const id = recorder.nextId();
226
+ if (replay.shouldReplay(id)) {
227
+ const historical = replay.getRecordedEvent(id);
228
+ if (historical?.streamed === true) {
229
+ const raw = typeof historical.streamRaw === 'string' ? historical.streamRaw : '';
230
+ return reconstructStream(raw);
231
+ }
232
+ return replay.getRecordedResult(id);
233
+ }
234
+ // Check AI mock (output mock — skip real call, return recorded result)
235
+ const aiMock = resolveAIMock(modelName);
236
+ if (aiMock.mocked) {
237
+ const input = args.length === 1 ? args[0] : args;
238
+ const event = {
239
+ id, type: 'ai', name: modelName, input,
240
+ output: aiMock.result, timestamp: start, durationMs: 0,
241
+ };
242
+ recorder.record(event);
243
+ if (httpCtx)
244
+ pushTelemetryEvent(event);
245
+ return aiMock.result;
246
+ }
247
+ // Check prompt mocks (system + user prompt replacement — call real LLM with modified prompts)
248
+ const rawInput = args.length === 1 ? args[0] : args;
249
+ const promptModifiedInput = resolvePromptMock(rawInput);
250
+ const userPromptModifiedInput = resolveUserPromptMock(promptModifiedInput !== undefined ? promptModifiedInput : rawInput);
251
+ const modifiedInput = userPromptModifiedInput !== undefined ? userPromptModifiedInput : promptModifiedInput;
252
+ const effectiveArgs = modifiedInput !== undefined ? [modifiedInput] : args;
253
+ const input = modifiedInput !== undefined ? modifiedInput : rawInput;
254
+ try {
255
+ const output = await callFn(...effectiveArgs);
256
+ if (isReadableStream(output)) {
257
+ const [streamForCaller, streamForRecorder] = output.tee();
258
+ bufferReadableStream(streamForRecorder).then((rawText) => {
259
+ const durationMs = rawDateNow() - start;
260
+ const event = { id, type: 'ai', name: modelName, input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs };
261
+ recorder.record(event);
262
+ if (httpCtx)
263
+ pushTelemetryEvent(event);
264
+ }).catch(() => {
265
+ const durationMs = rawDateNow() - start;
266
+ const event = { id, type: 'ai', name: modelName, input, output: null, streamed: true, streamRaw: '', timestamp: start, durationMs };
267
+ recorder.record(event);
268
+ if (httpCtx)
269
+ pushTelemetryEvent(event);
270
+ });
271
+ return streamForCaller;
272
+ }
273
+ if (isAsyncIterable(output)) {
274
+ return wrapAsyncIterable(output, (chunks) => {
275
+ const durationMs = rawDateNow() - start;
276
+ const rawText = chunks.map((c) => (typeof c === 'string' ? c : JSON.stringify(c))).join('');
277
+ const event = { id, type: 'ai', name: modelName, input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs };
278
+ recorder.record(event);
279
+ if (httpCtx)
280
+ pushTelemetryEvent(event);
281
+ });
282
+ }
283
+ const durationMs = rawDateNow() - start;
284
+ const usage = extractUsage(output);
285
+ const event = {
286
+ id, type: 'ai', name: modelName, input, output,
287
+ timestamp: start, durationMs,
288
+ ...(usage ? { usage } : {}),
289
+ };
290
+ recorder.record(event);
291
+ if (httpCtx)
292
+ pushTelemetryEvent(event);
293
+ return output;
294
+ }
295
+ catch (e) {
296
+ const durationMs = rawDateNow() - start;
297
+ const event = {
298
+ id, type: 'ai', name: modelName, input,
299
+ output: { error: String(e) }, timestamp: start, durationMs,
300
+ };
301
+ recorder.record(event);
302
+ if (httpCtx)
303
+ pushTelemetryEvent(event);
304
+ throw e;
305
+ }
306
+ }
307
+ // HTTP mode only (no capture context)
308
+ const id = httpCtx.nextId();
309
+ // Replay frozen step: push historical event so dashboard trace stays complete
310
+ const frozen = getHttpFrozenEvent(id);
311
+ if (frozen) {
312
+ pushTelemetryEvent(frozen);
313
+ if (frozen.streamed === true) {
314
+ const raw = typeof frozen.streamRaw === 'string' ? frozen.streamRaw : '';
315
+ return reconstructStream(raw);
316
+ }
317
+ return frozen.output;
318
+ }
319
+ // Check AI output mock (skip real call, return mocked result)
320
+ const aiMock = getHttpAIMock(modelName);
321
+ if (aiMock.mocked) {
322
+ const input = args.length === 1 ? args[0] : args;
323
+ const event = {
324
+ id, type: 'ai', name: modelName, input,
325
+ output: aiMock.result, timestamp: start, durationMs: 0,
326
+ };
327
+ pushTelemetryEvent(event);
328
+ return aiMock.result;
329
+ }
330
+ // Check prompt mocks (system + user prompt replacement in HTTP mode)
331
+ const rawHttpInput = args.length === 1 ? args[0] : args;
332
+ const httpSystemModified = getHttpPromptMock(rawHttpInput);
333
+ const httpUserModified = getHttpUserPromptMock(httpSystemModified !== undefined ? httpSystemModified : rawHttpInput);
334
+ const httpModifiedInput = httpUserModified !== undefined ? httpUserModified : httpSystemModified;
335
+ const httpEffectiveArgs = httpModifiedInput !== undefined ? [httpModifiedInput] : args;
336
+ const input = httpModifiedInput !== undefined ? httpModifiedInput : rawHttpInput;
337
+ try {
338
+ const output = await callFn(...httpEffectiveArgs);
339
+ const enriched = enrichFromLLMCapture(input, extractUsage(output), _options?.model, _options?.provider);
340
+ if (isReadableStream(output)) {
341
+ const [streamForCaller, streamForRecorder] = output.tee();
342
+ bufferReadableStream(streamForRecorder).then((rawText) => {
343
+ const durationMs = rawDateNow() - start;
344
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
345
+ }).catch(() => {
346
+ const durationMs = rawDateNow() - start;
347
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: '', timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
348
+ });
349
+ return streamForCaller;
350
+ }
351
+ if (isAsyncIterable(output)) {
352
+ return wrapAsyncIterable(output, (chunks) => {
353
+ const durationMs = rawDateNow() - start;
354
+ const rawText = chunks.map((c) => (typeof c === 'string' ? c : JSON.stringify(c))).join('');
355
+ pushTelemetryEvent({ id, type: 'ai', name: modelName, input: enriched.input, output: null, streamed: true, streamRaw: rawText, timestamp: start, durationMs, ...(enriched.usage ? { usage: enriched.usage } : {}) });
356
+ });
357
+ }
358
+ const durationMs = rawDateNow() - start;
359
+ const event = {
360
+ id, type: 'ai', name: modelName, input: enriched.input, output,
361
+ timestamp: start, durationMs,
362
+ ...(enriched.usage ? { usage: enriched.usage } : {}),
363
+ };
364
+ pushTelemetryEvent(event);
365
+ return output;
366
+ }
367
+ catch (e) {
368
+ const enriched = enrichFromLLMCapture(input, undefined, _options?.model, _options?.provider);
369
+ const durationMs = rawDateNow() - start;
370
+ pushTelemetryEvent({
371
+ id, type: 'ai', name: modelName, input: enriched.input,
372
+ output: { error: String(e) }, timestamp: start, durationMs,
373
+ });
374
+ throw e;
375
+ }
376
+ }
377
+ finally {
378
+ leaveAIWrapper();
379
+ }
380
+ };
381
+ }
382
+ //# sourceMappingURL=workflow-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-ai.js","sourceRoot":"","sources":["../../src/interceptors/workflow-ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Conditional recorder utility for worker contexts
3
+ *
4
+ * This module provides a safe wrapper around recordToolCall that only executes
5
+ * in worker environments. In non-worker contexts, it's a no-op to avoid unnecessary
6
+ * imports and function calls.
7
+ */
8
+ /**
9
+ * Safely record a tool call only if in worker context
10
+ *
11
+ * @param name - Name of the tool/function
12
+ * @param input - Input parameters to the tool
13
+ * @param output - Output/result from the tool
14
+ */
15
+ export declare const safeRecordToolCall: (name: string, input: any, output: any) => Promise<void>;
16
+ /**
17
+ * Synchronous version - checks if we're in worker context without importing
18
+ * Use this if you want to avoid async/await in your tool functions
19
+ */
20
+ export declare const isWorker: () => boolean;
21
+ //# sourceMappingURL=conditional-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional-recorder.d.ts","sourceRoot":"","sources":["../../src/internals/conditional-recorder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,OAAO,GAAG,EACV,QAAQ,GAAG,KACV,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,QAAO,OAE3B,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Conditional recorder utility for worker contexts
3
+ *
4
+ * This module provides a safe wrapper around recordToolCall that only executes
5
+ * in worker environments. In non-worker contexts, it's a no-op to avoid unnecessary
6
+ * imports and function calls.
7
+ */
8
+ // Check if running in an Elasticdash worker context
9
+ const isWorkerContext = () => {
10
+ if (typeof globalThis === 'undefined') {
11
+ return false;
12
+ }
13
+ return globalThis.__ELASTICDASH_WORKER__ === true;
14
+ };
15
+ let recordToolCallFn = null;
16
+ // Lazy load recordToolCall only if in worker context
17
+ const getRecordToolCall = async () => {
18
+ if (!isWorkerContext()) {
19
+ return null;
20
+ }
21
+ if (recordToolCallFn !== null) {
22
+ return recordToolCallFn;
23
+ }
24
+ try {
25
+ const { recordToolCall } = await import('../tracing.js');
26
+ recordToolCallFn = recordToolCall;
27
+ return recordToolCallFn;
28
+ }
29
+ catch (err) {
30
+ console.warn('Failed to load recordToolCall from tracing module:', err);
31
+ return null;
32
+ }
33
+ };
34
+ /**
35
+ * Safely record a tool call only if in worker context
36
+ *
37
+ * @param name - Name of the tool/function
38
+ * @param input - Input parameters to the tool
39
+ * @param output - Output/result from the tool
40
+ */
41
+ export const safeRecordToolCall = async (name, input, output) => {
42
+ const recorder = await getRecordToolCall();
43
+ if (recorder) {
44
+ recorder(name, input, output);
45
+ }
46
+ };
47
+ /**
48
+ * Synchronous version - checks if we're in worker context without importing
49
+ * Use this if you want to avoid async/await in your tool functions
50
+ */
51
+ export const isWorker = () => {
52
+ return isWorkerContext();
53
+ };
54
+ //# sourceMappingURL=conditional-recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditional-recorder.js","sourceRoot":"","sources":["../../src/internals/conditional-recorder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oDAAoD;AACpD,MAAM,eAAe,GAAG,GAAY,EAAE;IACpC,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAQ,UAAkB,CAAC,sBAAsB,KAAK,IAAI,CAAC;AAC7D,CAAC,CAAC;AAEF,IAAI,gBAAgB,GAA6D,IAAI,CAAC;AAEtF,qDAAqD;AACrD,MAAM,iBAAiB,GAAG,KAAK,IAAuE,EAAE;IACtG,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACzD,gBAAgB,GAAG,cAAc,CAAC;QAClC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,GAAG,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,IAAY,EACZ,KAAU,EACV,MAAW,EACI,EAAE;IACjB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAY,EAAE;IACpC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Runtime mock resolution for module-imported tools and AI calls.
3
+ *
4
+ * Tools/AI calls that are statically imported (not accessed via globalThis)
5
+ * cannot be intercepted by the worker's proxy-based mocking. Instead, each
6
+ * wrapped function calls `resolveMock` / `resolveAIMock` at its entry point.
7
+ * The worker writes the mock config to `__ELASTICDASH_TOOL_MOCKS__` /
8
+ * `__ELASTICDASH_AI_MOCKS__` before the workflow runs and clears it after.
9
+ */
10
+ /** Per-model AI mock configuration (mirrors ToolMockConfig) */
11
+ export interface AIMockEntry {
12
+ mode: 'live' | 'mock-all' | 'mock-specific';
13
+ callIndices?: number[];
14
+ mockData?: Record<number, unknown>;
15
+ }
16
+ export interface AIMockConfig {
17
+ [modelName: string]: AIMockEntry;
18
+ }
19
+ type MockResult = {
20
+ mocked: true;
21
+ result: unknown;
22
+ } | {
23
+ mocked: false;
24
+ };
25
+ /**
26
+ * Recursively normalises a mock result fetched from the trace.
27
+ *
28
+ * The trace recorder stores tool outputs as-is. When a tool returns a JSON
29
+ * string (rather than a parsed object), the stored value is that string, and
30
+ * inner string values may themselves be JSON-quoted. This function unwraps
31
+ * every layer so the calling code receives the same shape as the real output.
32
+ *
33
+ * - string → try JSON.parse, then recurse on the result
34
+ * - array → recurse on every element
35
+ * - object → recurse on every value
36
+ * - other → return unchanged
37
+ */
38
+ export declare function normaliseMockResult(value: unknown): unknown;
39
+ /**
40
+ * Resolves whether the current call to `toolName` should be mocked.
41
+ *
42
+ * - Returns `{ mocked: false }` when no mock config is active or mode is `'live'`.
43
+ * - Increments the per-tool call counter on every non-live invocation so that
44
+ * `mock-specific` indices remain accurate even when some calls run live.
45
+ * - Safe to call in production: no-op when the mock globals are absent.
46
+ */
47
+ export declare function resolveMock(toolName: string): MockResult;
48
+ /**
49
+ * Extracts the system prompt string from an LLM call input.
50
+ * Handles:
51
+ * - Anthropic style: `{ system: "...", messages: [...] }`
52
+ * - OpenAI style: `{ messages: [{ role: "system", content: "..." }, ...] }`
53
+ * - Plain message array: `[{ role: "system", content: "..." }, ...]`
54
+ * - Separate field: `{ systemPrompt: "...", messages: [...] }` (custom wrapAI callers)
55
+ */
56
+ export declare function extractSystemPrompt(input: unknown): string | undefined;
57
+ /**
58
+ * Returns a shallow copy of `input` with the system prompt replaced by `newSystemPrompt`.
59
+ */
60
+ export declare function replaceSystemPrompt(input: unknown, newSystemPrompt: string): unknown;
61
+ /**
62
+ * System prompt mock entry — mirrors user prompt mock entry.
63
+ */
64
+ export interface SystemPromptMockEntry {
65
+ mode: 'live' | 'replace-all' | 'replace-specific';
66
+ replacement: string;
67
+ callIndices?: number[];
68
+ }
69
+ export interface SystemPromptMockConfig {
70
+ [originalText: string]: SystemPromptMockEntry;
71
+ }
72
+ /**
73
+ * If a prompt mock is configured for the system prompt found in `input`, returns
74
+ * a copy of `input` with the system prompt replaced. Otherwise returns `undefined`.
75
+ *
76
+ * `__ELASTICDASH_PROMPT_MOCKS__` is `Record<string, SystemPromptMockEntry>` keyed by
77
+ * the original system prompt text. Supports replace-all and replace-specific modes
78
+ * with per-text call counting.
79
+ *
80
+ * For backward compatibility, also accepts the legacy `Record<string, string>` format
81
+ * (treated as replace-all).
82
+ */
83
+ export declare function resolvePromptMock(input: unknown): unknown | undefined;
84
+ /**
85
+ * Look up a mock entry by key, falling back to stripped-quotes variants
86
+ * to handle mismatches between trace-recorded text and runtime text.
87
+ */
88
+ export declare function lookupMockEntry<T>(mocks: Record<string, T>, text: string): {
89
+ key: string;
90
+ entry: T;
91
+ } | undefined;
92
+ /**
93
+ * Extracts all user-role message content strings from an LLM call input.
94
+ * Handles OpenAI-style `{ messages: [...] }` and plain message arrays.
95
+ */
96
+ export declare function extractUserPrompts(input: unknown): string[];
97
+ /**
98
+ * Returns a shallow copy of `input` with all user-role messages whose content
99
+ * matches `originalText` replaced with `newText`.
100
+ */
101
+ export declare function replaceUserPrompt(input: unknown, originalText: string, newText: string): unknown;
102
+ /**
103
+ * User prompt mock entry — mirrors tool mock but for user-role messages.
104
+ */
105
+ export interface UserPromptMockEntry {
106
+ mode: 'live' | 'replace-all' | 'replace-specific';
107
+ replacement: string;
108
+ callIndices?: number[];
109
+ }
110
+ export interface UserPromptMockConfig {
111
+ [originalText: string]: UserPromptMockEntry;
112
+ }
113
+ /**
114
+ * If user prompt mocks are configured, applies all matching replacements to `input`.
115
+ * Returns modified input or `undefined` if no replacements applied.
116
+ *
117
+ * `__ELASTICDASH_USER_PROMPT_MOCKS__` is `Record<string, UserPromptMockEntry>` keyed
118
+ * by original user message text.
119
+ *
120
+ * Call counting is per unique text — "the x-th LLM call where this text appears".
121
+ */
122
+ export declare function resolveUserPromptMock(input: unknown): unknown | undefined;
123
+ /**
124
+ * Resolves whether the current call to `modelName` should be mocked.
125
+ * Mirrors `resolveMock` but reads `__ELASTICDASH_AI_MOCKS__` and
126
+ * `__ELASTICDASH_AI_CALL_COUNTERS__`.
127
+ */
128
+ /**
129
+ * Standalone utility: applies all matching user prompt mock replacements to
130
+ * a messages array (or LLM input object). Works without ALS — takes the mock
131
+ * config and call counters as explicit parameters.
132
+ *
133
+ * Returns the modified input, or the original input unchanged if no mocks matched.
134
+ */
135
+ export declare function applyUserPromptMocks(input: unknown, userPromptMocks: Record<string, UserPromptMockEntry>, callCounters?: Record<string, number>): unknown;
136
+ /**
137
+ * Standalone utility: applies system prompt mock replacement to an LLM input
138
+ * object. Works without ALS — takes the mock config and call counters as
139
+ * explicit parameters.
140
+ *
141
+ * Returns the modified input, or the original input unchanged if no mock matched.
142
+ */
143
+ export declare function applySystemPromptMocks(input: unknown, promptMocks: Record<string, string | SystemPromptMockEntry>, callCounters?: Record<string, number>): unknown;
144
+ export declare function resolveAIMock(modelName: string): MockResult;
145
+ export {};
146
+ //# sourceMappingURL=mock-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-resolver.d.ts","sourceRoot":"","sources":["../../src/internals/mock-resolver.ts"],"names":[],"mappings":"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"}