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.
- package/LICENSE +21 -0
- package/README.md +775 -0
- package/dist/browser-ui.d.ts +43 -0
- package/dist/browser-ui.d.ts.map +1 -0
- package/dist/browser-ui.js +246 -0
- package/dist/browser-ui.js.map +1 -0
- package/dist/capture/event.d.ts +33 -0
- package/dist/capture/event.d.ts.map +1 -0
- package/dist/capture/event.js +2 -0
- package/dist/capture/event.js.map +1 -0
- package/dist/capture/index.d.ts +4 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +4 -0
- package/dist/capture/index.js.map +1 -0
- package/dist/capture/recorder.d.ts +24 -0
- package/dist/capture/recorder.d.ts.map +1 -0
- package/dist/capture/recorder.js +46 -0
- package/dist/capture/recorder.js.map +1 -0
- package/dist/capture/replay.d.ts +20 -0
- package/dist/capture/replay.d.ts.map +1 -0
- package/dist/capture/replay.js +47 -0
- package/dist/capture/replay.js.map +1 -0
- package/dist/ci/api-client.d.ts +38 -0
- package/dist/ci/api-client.d.ts.map +1 -0
- package/dist/ci/api-client.js +96 -0
- package/dist/ci/api-client.js.map +1 -0
- package/dist/ci/benchmark.d.ts +33 -0
- package/dist/ci/benchmark.d.ts.map +1 -0
- package/dist/ci/benchmark.js +213 -0
- package/dist/ci/benchmark.js.map +1 -0
- package/dist/ci/ed-runner.d.ts +48 -0
- package/dist/ci/ed-runner.d.ts.map +1 -0
- package/dist/ci/ed-runner.js +260 -0
- package/dist/ci/ed-runner.js.map +1 -0
- package/dist/ci/executor.d.ts +13 -0
- package/dist/ci/executor.d.ts.map +1 -0
- package/dist/ci/executor.js +542 -0
- package/dist/ci/executor.js.map +1 -0
- package/dist/ci/git-info.d.ts +17 -0
- package/dist/ci/git-info.d.ts.map +1 -0
- package/dist/ci/git-info.js +102 -0
- package/dist/ci/git-info.js.map +1 -0
- package/dist/ci/index.d.ts +6 -0
- package/dist/ci/index.d.ts.map +1 -0
- package/dist/ci/index.js +4 -0
- package/dist/ci/index.js.map +1 -0
- package/dist/ci/measurement.d.ts +9 -0
- package/dist/ci/measurement.d.ts.map +1 -0
- package/dist/ci/measurement.js +15 -0
- package/dist/ci/measurement.js.map +1 -0
- package/dist/ci/replay.d.ts +31 -0
- package/dist/ci/replay.d.ts.map +1 -0
- package/dist/ci/replay.js +96 -0
- package/dist/ci/replay.js.map +1 -0
- package/dist/ci/reporters/default.d.ts +8 -0
- package/dist/ci/reporters/default.d.ts.map +1 -0
- package/dist/ci/reporters/default.js +46 -0
- package/dist/ci/reporters/default.js.map +1 -0
- package/dist/ci/reporters/index.d.ts +8 -0
- package/dist/ci/reporters/index.d.ts.map +1 -0
- package/dist/ci/reporters/index.js +14 -0
- package/dist/ci/reporters/index.js.map +1 -0
- package/dist/ci/reporters/json.d.ts +8 -0
- package/dist/ci/reporters/json.d.ts.map +1 -0
- package/dist/ci/reporters/json.js +14 -0
- package/dist/ci/reporters/json.js.map +1 -0
- package/dist/ci/reporters/junit.d.ts +8 -0
- package/dist/ci/reporters/junit.d.ts.map +1 -0
- package/dist/ci/reporters/junit.js +48 -0
- package/dist/ci/reporters/junit.js.map +1 -0
- package/dist/ci/runner.d.ts +3 -0
- package/dist/ci/runner.d.ts.map +1 -0
- package/dist/ci/runner.js +187 -0
- package/dist/ci/runner.js.map +1 -0
- package/dist/ci/test-discovery.d.ts +5 -0
- package/dist/ci/test-discovery.d.ts.map +1 -0
- package/dist/ci/test-discovery.js +11 -0
- package/dist/ci/test-discovery.js.map +1 -0
- package/dist/ci/test-loader.d.ts +19 -0
- package/dist/ci/test-loader.d.ts.map +1 -0
- package/dist/ci/test-loader.js +149 -0
- package/dist/ci/test-loader.js.map +1 -0
- package/dist/ci/test-registry.d.ts +42 -0
- package/dist/ci/test-registry.d.ts.map +1 -0
- package/dist/ci/test-registry.js +18 -0
- package/dist/ci/test-registry.js.map +1 -0
- package/dist/ci/trace-schema.d.ts +30 -0
- package/dist/ci/trace-schema.d.ts.map +1 -0
- package/dist/ci/trace-schema.js +66 -0
- package/dist/ci/trace-schema.js.map +1 -0
- package/dist/ci/trace-writer.d.ts +16 -0
- package/dist/ci/trace-writer.d.ts.map +1 -0
- package/dist/ci/trace-writer.js +108 -0
- package/dist/ci/trace-writer.js.map +1 -0
- package/dist/ci/types.d.ts +108 -0
- package/dist/ci/types.d.ts.map +1 -0
- package/dist/ci/types.js +3 -0
- package/dist/ci/types.js.map +1 -0
- package/dist/ci/upload-client.d.ts +74 -0
- package/dist/ci/upload-client.d.ts.map +1 -0
- package/dist/ci/upload-client.js +195 -0
- package/dist/ci/upload-client.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +716 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agent-state.d.ts +47 -0
- package/dist/core/agent-state.d.ts.map +1 -0
- package/dist/core/agent-state.js +137 -0
- package/dist/core/agent-state.js.map +1 -0
- package/dist/core/judge-utils.d.ts +22 -0
- package/dist/core/judge-utils.d.ts.map +1 -0
- package/dist/core/judge-utils.js +211 -0
- package/dist/core/judge-utils.js.map +1 -0
- package/dist/core/registry.d.ts +28 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +52 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/dashboard-server.d.ts +65 -0
- package/dist/dashboard-server.d.ts.map +1 -0
- package/dist/dashboard-server.js +3940 -0
- package/dist/dashboard-server.js.map +1 -0
- package/dist/execution/tool-runner.d.ts +26 -0
- package/dist/execution/tool-runner.d.ts.map +1 -0
- package/dist/execution/tool-runner.js +316 -0
- package/dist/execution/tool-runner.js.map +1 -0
- package/dist/html/dashboard.html +2218 -0
- package/dist/http.d.ts +14 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +13 -0
- package/dist/http.js.map +1 -0
- package/dist/index.cjs +8102 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/ai-interceptor.d.ts +26 -0
- package/dist/interceptors/ai-interceptor.d.ts.map +1 -0
- package/dist/interceptors/ai-interceptor.js +756 -0
- package/dist/interceptors/ai-interceptor.js.map +1 -0
- package/dist/interceptors/db-auto.d.ts +8 -0
- package/dist/interceptors/db-auto.d.ts.map +1 -0
- package/dist/interceptors/db-auto.js +217 -0
- package/dist/interceptors/db-auto.js.map +1 -0
- package/dist/interceptors/db.d.ts +23 -0
- package/dist/interceptors/db.d.ts.map +1 -0
- package/dist/interceptors/db.js +137 -0
- package/dist/interceptors/db.js.map +1 -0
- package/dist/interceptors/http.d.ts +28 -0
- package/dist/interceptors/http.d.ts.map +1 -0
- package/dist/interceptors/http.js +356 -0
- package/dist/interceptors/http.js.map +1 -0
- package/dist/interceptors/side-effects.d.ts +7 -0
- package/dist/interceptors/side-effects.d.ts.map +1 -0
- package/dist/interceptors/side-effects.js +72 -0
- package/dist/interceptors/side-effects.js.map +1 -0
- package/dist/interceptors/telemetry-push.d.ts +142 -0
- package/dist/interceptors/telemetry-push.d.ts.map +1 -0
- package/dist/interceptors/telemetry-push.js +463 -0
- package/dist/interceptors/telemetry-push.js.map +1 -0
- package/dist/interceptors/tool.d.ts +2 -0
- package/dist/interceptors/tool.d.ts.map +1 -0
- package/dist/interceptors/tool.js +274 -0
- package/dist/interceptors/tool.js.map +1 -0
- package/dist/interceptors/workflow-ai.d.ts +5 -0
- package/dist/interceptors/workflow-ai.d.ts.map +1 -0
- package/dist/interceptors/workflow-ai.js +382 -0
- package/dist/interceptors/workflow-ai.js.map +1 -0
- package/dist/internals/conditional-recorder.d.ts +21 -0
- package/dist/internals/conditional-recorder.d.ts.map +1 -0
- package/dist/internals/conditional-recorder.js +54 -0
- package/dist/internals/conditional-recorder.js.map +1 -0
- package/dist/internals/mock-resolver.d.ts +146 -0
- package/dist/internals/mock-resolver.d.ts.map +1 -0
- package/dist/internals/mock-resolver.js +427 -0
- package/dist/internals/mock-resolver.js.map +1 -0
- package/dist/matchers/index.d.ts +96 -0
- package/dist/matchers/index.d.ts.map +1 -0
- package/dist/matchers/index.js +668 -0
- package/dist/matchers/index.js.map +1 -0
- package/dist/observability.d.ts +82 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +471 -0
- package/dist/observability.js.map +1 -0
- package/dist/portal-executor.d.ts +30 -0
- package/dist/portal-executor.d.ts.map +1 -0
- package/dist/portal-executor.js +324 -0
- package/dist/portal-executor.js.map +1 -0
- package/dist/portal-server.d.ts +3 -0
- package/dist/portal-server.d.ts.map +1 -0
- package/dist/portal-server.js +279 -0
- package/dist/portal-server.js.map +1 -0
- package/dist/proxy/llm-capture.d.ts +14 -0
- package/dist/proxy/llm-capture.d.ts.map +1 -0
- package/dist/proxy/llm-capture.js +264 -0
- package/dist/proxy/llm-capture.js.map +1 -0
- package/dist/reporter.d.ts +3 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +72 -0
- package/dist/reporter.js.map +1 -0
- package/dist/runWorkflowSubprocess.d.ts +14 -0
- package/dist/runWorkflowSubprocess.d.ts.map +1 -0
- package/dist/runWorkflowSubprocess.js +66 -0
- package/dist/runWorkflowSubprocess.js.map +1 -0
- package/dist/runner.d.ts +16 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +138 -0
- package/dist/runner.js.map +1 -0
- package/dist/socket-connector.d.ts +22 -0
- package/dist/socket-connector.d.ts.map +1 -0
- package/dist/socket-connector.js +104 -0
- package/dist/socket-connector.js.map +1 -0
- package/dist/telemetry-batcher.d.ts +56 -0
- package/dist/telemetry-batcher.d.ts.map +1 -0
- package/dist/telemetry-batcher.js +143 -0
- package/dist/telemetry-batcher.js.map +1 -0
- package/dist/test-setup.d.ts +12 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +13 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/tool-registry.d.ts +31 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +73 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tool-runner-worker.d.ts +2 -0
- package/dist/tool-runner-worker.d.ts.map +1 -0
- package/dist/tool-runner-worker.js +215 -0
- package/dist/tool-runner-worker.js.map +1 -0
- package/dist/trace-adapter/context.d.ts +72 -0
- package/dist/trace-adapter/context.d.ts.map +1 -0
- package/dist/trace-adapter/context.js +80 -0
- package/dist/trace-adapter/context.js.map +1 -0
- package/dist/tracing.d.ts +2 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +59 -0
- package/dist/tracing.js.map +1 -0
- package/dist/trigger-executor.d.ts +12 -0
- package/dist/trigger-executor.d.ts.map +1 -0
- package/dist/trigger-executor.js +130 -0
- package/dist/trigger-executor.js.map +1 -0
- package/dist/types/portal.d.ts +76 -0
- package/dist/types/portal.d.ts.map +1 -0
- package/dist/types/portal.js +2 -0
- package/dist/types/portal.js.map +1 -0
- package/dist/utils/debug.d.ts +3 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +8 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/license-error.d.ts +23 -0
- package/dist/utils/license-error.d.ts.map +1 -0
- package/dist/utils/license-error.js +42 -0
- package/dist/utils/license-error.js.map +1 -0
- package/dist/utils/redact.d.ts +7 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +26 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/workflow-runner-worker.d.ts +2 -0
- package/dist/workflow-runner-worker.d.ts.map +1 -0
- package/dist/workflow-runner-worker.js +329 -0
- package/dist/workflow-runner-worker.js.map +1 -0
- package/dist/workflow-runner.d.ts +14 -0
- package/dist/workflow-runner.d.ts.map +1 -0
- package/dist/workflow-runner.js +34 -0
- package/dist/workflow-runner.js.map +1 -0
- package/docs/agent-coding-instructions.md +138 -0
- package/docs/agent-integration-guide.md +564 -0
- package/docs/agents.md +140 -0
- package/docs/dashboard.md +394 -0
- package/docs/deno.md +69 -0
- package/docs/instrumentation.md +424 -0
- package/docs/langfuse-trace-structure.md +145 -0
- package/docs/matchers.md +173 -0
- package/docs/observability_contract.md +192 -0
- package/docs/observability_mode.md +195 -0
- package/docs/quickstart.md +621 -0
- package/docs/security-compliance.md +566 -0
- package/docs/test-writing-guidelines.md +444 -0
- package/docs/tools.md +165 -0
- package/docs/workflow-modes.md +253 -0
- package/package.json +76 -0
- package/src/browser-ui.ts +281 -0
- package/src/capture/event.ts +30 -0
- package/src/capture/index.ts +3 -0
- package/src/capture/recorder.ts +62 -0
- package/src/capture/replay.ts +55 -0
- package/src/ci/api-client.ts +136 -0
- package/src/ci/benchmark.ts +257 -0
- package/src/ci/ed-runner.ts +351 -0
- package/src/ci/executor.ts +671 -0
- package/src/ci/git-info.ts +127 -0
- package/src/ci/index.ts +5 -0
- package/src/ci/measurement.ts +25 -0
- package/src/ci/replay.ts +127 -0
- package/src/ci/reporters/default.ts +50 -0
- package/src/ci/reporters/index.ts +21 -0
- package/src/ci/reporters/json.ts +18 -0
- package/src/ci/reporters/junit.ts +61 -0
- package/src/ci/runner.ts +208 -0
- package/src/ci/test-discovery.ts +16 -0
- package/src/ci/test-loader.ts +187 -0
- package/src/ci/test-registry.ts +62 -0
- package/src/ci/trace-schema.ts +96 -0
- package/src/ci/trace-writer.ts +107 -0
- package/src/ci/types.ts +115 -0
- package/src/ci/upload-client.ts +300 -0
- package/src/cli.ts +811 -0
- package/src/core/agent-state.ts +162 -0
- package/src/core/judge-utils.ts +232 -0
- package/src/core/registry.ts +92 -0
- package/src/dashboard-server.ts +2047 -0
- package/src/execution/tool-runner.ts +352 -0
- package/src/html/dashboard.html +2218 -0
- package/src/http.ts +13 -0
- package/src/index.ts +138 -0
- package/src/interceptors/ai-interceptor.ts +798 -0
- package/src/interceptors/db-auto.ts +243 -0
- package/src/interceptors/db.ts +156 -0
- package/src/interceptors/http.ts +393 -0
- package/src/interceptors/side-effects.ts +83 -0
- package/src/interceptors/telemetry-push.ts +537 -0
- package/src/interceptors/tool.ts +287 -0
- package/src/interceptors/workflow-ai.ts +419 -0
- package/src/internals/conditional-recorder.ts +63 -0
- package/src/internals/mock-resolver.ts +492 -0
- package/src/matchers/index.ts +824 -0
- package/src/observability.ts +501 -0
- package/src/portal-executor.ts +355 -0
- package/src/portal-server.ts +304 -0
- package/src/proxy/llm-capture.ts +301 -0
- package/src/reporter.ts +81 -0
- package/src/runWorkflowSubprocess.ts +74 -0
- package/src/runner.ts +178 -0
- package/src/socket-connector.ts +117 -0
- package/src/telemetry-batcher.ts +191 -0
- package/src/test-setup.ts +16 -0
- package/src/tool-registry.ts +94 -0
- package/src/tool-runner-worker.ts +244 -0
- package/src/trace-adapter/context.ts +156 -0
- package/src/tracing.ts +62 -0
- package/src/trigger-executor.ts +171 -0
- package/src/types/agent.d.ts +63 -0
- package/src/types/expect.d.ts +81 -0
- package/src/types/modules.d.ts +2 -0
- package/src/types/portal.ts +69 -0
- package/src/utils/debug.ts +8 -0
- package/src/utils/license-error.ts +43 -0
- package/src/utils/redact.ts +25 -0
- package/src/workflow-runner-worker.ts +386 -0
- package/src/workflow-runner.ts +58 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { getCaptureContext } from '../capture/recorder.js';
|
|
2
|
+
import { getCurrentTrace } from '../trace-adapter/context.js';
|
|
3
|
+
import { getHttpRunContext, getHttpFrozenEvent, pushTelemetryEvent, tryAutoInitHttpContext, getObservabilityContext } from './telemetry-push.js';
|
|
4
|
+
import { rawDateNow } from './side-effects.js';
|
|
5
|
+
// AI provider URLs are already captured by ai-interceptor.ts as "llm" steps.
|
|
6
|
+
// Skip them here to avoid duplicate observations.
|
|
7
|
+
const AI_URL_PATTERNS = [
|
|
8
|
+
/https?:\/\/api\.openai\.com\/v1\/((chat\/)?completions|embeddings)/,
|
|
9
|
+
/https?:\/\/api\.anthropic\.com\/v1\/messages/,
|
|
10
|
+
/https?:\/\/generativelanguage\.googleapis\.com\/.*\/models\/[^/:]+:(generateContent|streamGenerateContent)/,
|
|
11
|
+
/https?:\/\/api\.x\.ai\/v1\/(chat\/)?completions/,
|
|
12
|
+
/https?:\/\/api\.moonshot\.ai\/v1\/(chat\/)?completions/,
|
|
13
|
+
];
|
|
14
|
+
function isAIProviderUrl(url) {
|
|
15
|
+
return AI_URL_PATTERNS.some(p => p.test(url));
|
|
16
|
+
}
|
|
17
|
+
function parseQuery(url) {
|
|
18
|
+
try {
|
|
19
|
+
const { searchParams } = new URL(url);
|
|
20
|
+
if (searchParams.size === 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
return Object.fromEntries(searchParams.entries());
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Relative URL — extract manually
|
|
26
|
+
const qIdx = url.indexOf('?');
|
|
27
|
+
if (qIdx === -1)
|
|
28
|
+
return undefined;
|
|
29
|
+
try {
|
|
30
|
+
const params = new URLSearchParams(url.slice(qIdx + 1));
|
|
31
|
+
if (![...params].length)
|
|
32
|
+
return undefined;
|
|
33
|
+
return Object.fromEntries(params.entries());
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function parseBody(body) {
|
|
41
|
+
if (body == null)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (typeof body === 'string') {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(body);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return body;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (body instanceof URLSearchParams) {
|
|
52
|
+
return Object.fromEntries(body.entries());
|
|
53
|
+
}
|
|
54
|
+
return '[binary]';
|
|
55
|
+
}
|
|
56
|
+
function normalizeHeaders(headers) {
|
|
57
|
+
if (!headers)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (headers instanceof Headers) {
|
|
60
|
+
const obj = {};
|
|
61
|
+
headers.forEach((v, k) => { obj[k] = v; });
|
|
62
|
+
return obj;
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(headers))
|
|
65
|
+
return Object.fromEntries(headers);
|
|
66
|
+
return headers;
|
|
67
|
+
}
|
|
68
|
+
function pickReplayResponseHeaders(headers) {
|
|
69
|
+
if (!headers)
|
|
70
|
+
return { 'Content-Type': 'application/json' };
|
|
71
|
+
const out = {};
|
|
72
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
73
|
+
if (typeof value === 'string')
|
|
74
|
+
out[key] = value;
|
|
75
|
+
}
|
|
76
|
+
if (!out['Content-Type'])
|
|
77
|
+
out['Content-Type'] = 'application/json';
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
function isStreamingContentType(headers) {
|
|
81
|
+
const ct = headers.get('content-type') ?? '';
|
|
82
|
+
return (ct.includes('text/event-stream') ||
|
|
83
|
+
ct.includes('application/x-ndjson') ||
|
|
84
|
+
ct.includes('application/stream+json') ||
|
|
85
|
+
ct.includes('application/jsonl') ||
|
|
86
|
+
headers.get('x-vercel-ai-data-stream') === 'v1');
|
|
87
|
+
}
|
|
88
|
+
function isVercelAIDataStream(headers) {
|
|
89
|
+
return headers.get('x-vercel-ai-data-stream') === 'v1';
|
|
90
|
+
}
|
|
91
|
+
function parseVercelAIDataStream(raw) {
|
|
92
|
+
let accumulatedText = '';
|
|
93
|
+
let resultData = {};
|
|
94
|
+
let errorMessage = '';
|
|
95
|
+
let hasError = false;
|
|
96
|
+
for (const line of raw.split('\n')) {
|
|
97
|
+
if (!line)
|
|
98
|
+
continue;
|
|
99
|
+
const colonIdx = line.indexOf(':');
|
|
100
|
+
if (colonIdx === -1)
|
|
101
|
+
continue;
|
|
102
|
+
const prefix = line.slice(0, colonIdx);
|
|
103
|
+
const payload = line.slice(colonIdx + 1);
|
|
104
|
+
try {
|
|
105
|
+
if (prefix === '0') {
|
|
106
|
+
accumulatedText += JSON.parse(payload);
|
|
107
|
+
}
|
|
108
|
+
else if (prefix === '2') {
|
|
109
|
+
const events = JSON.parse(payload);
|
|
110
|
+
for (const event of events) {
|
|
111
|
+
if (event.type === 'result' || event.type === 'plan') {
|
|
112
|
+
resultData = { ...resultData, ...event };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (prefix === '3') {
|
|
117
|
+
hasError = true;
|
|
118
|
+
errorMessage = JSON.parse(payload);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// ignore malformed frames
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (hasError) {
|
|
126
|
+
return { message: errorMessage, type: 'error', error: errorMessage };
|
|
127
|
+
}
|
|
128
|
+
if (accumulatedText) {
|
|
129
|
+
return { message: accumulatedText, type: 'text', refinedQuery: resultData.refinedQuery };
|
|
130
|
+
}
|
|
131
|
+
if (resultData.type === 'plan') {
|
|
132
|
+
return {
|
|
133
|
+
message: resultData.message ?? '',
|
|
134
|
+
type: 'plan',
|
|
135
|
+
sessionId: resultData.sessionId,
|
|
136
|
+
awaitingApproval: true,
|
|
137
|
+
executionPlan: resultData.executionPlan,
|
|
138
|
+
refinedQuery: resultData.refinedQuery,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
message: resultData.message ?? '',
|
|
143
|
+
type: 'result',
|
|
144
|
+
refinedQuery: resultData.refinedQuery,
|
|
145
|
+
error: resultData.error,
|
|
146
|
+
planRejected: resultData.planRejected,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Reads a Vercel AI SDK data-stream response to completion and returns a
|
|
151
|
+
* structured result. Use this inside workflow functions that call the streaming
|
|
152
|
+
* endpoint via fetch so the framework can intercept and replay the call.
|
|
153
|
+
*
|
|
154
|
+
* @param response - The fetch Response whose body carries the
|
|
155
|
+
* `x-vercel-ai-data-stream: v1` wire protocol.
|
|
156
|
+
*/
|
|
157
|
+
export async function readVercelAIStream(response) {
|
|
158
|
+
if (!response.body) {
|
|
159
|
+
return { message: 'No response body', type: 'error', error: 'No response body' };
|
|
160
|
+
}
|
|
161
|
+
const reader = response.body.getReader();
|
|
162
|
+
const decoder = new TextDecoder();
|
|
163
|
+
let raw = '';
|
|
164
|
+
try {
|
|
165
|
+
for (;;) {
|
|
166
|
+
const { done, value } = await reader.read();
|
|
167
|
+
if (done)
|
|
168
|
+
break;
|
|
169
|
+
raw += decoder.decode(value, { stream: true });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
reader.releaseLock();
|
|
174
|
+
}
|
|
175
|
+
return parseVercelAIDataStream(raw);
|
|
176
|
+
}
|
|
177
|
+
function reconstructStream(raw) {
|
|
178
|
+
const encoder = new TextEncoder();
|
|
179
|
+
return new ReadableStream({
|
|
180
|
+
start(ctrl) {
|
|
181
|
+
ctrl.enqueue(encoder.encode(raw));
|
|
182
|
+
ctrl.close();
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
let originalFetch;
|
|
187
|
+
/**
|
|
188
|
+
* Returns the original unpatched fetch. SDK-internal calls (telemetry,
|
|
189
|
+
* catalog, triggers) must use this to avoid being recorded as trace events.
|
|
190
|
+
*/
|
|
191
|
+
export function getOriginalFetch() {
|
|
192
|
+
return originalFetch ?? globalThis.fetch;
|
|
193
|
+
}
|
|
194
|
+
/** Synthesize a Response from a frozen HTTP event */
|
|
195
|
+
function synthesizeFrozenResponse(frozen) {
|
|
196
|
+
const frozenInput = frozen.input;
|
|
197
|
+
const responseMeta = (frozenInput?.__elasticdashResponse ?? {});
|
|
198
|
+
const status = typeof responseMeta.status === 'number' ? responseMeta.status : 200;
|
|
199
|
+
const statusText = typeof responseMeta.statusText === 'string' ? responseMeta.statusText : '';
|
|
200
|
+
const headers = pickReplayResponseHeaders(responseMeta.headers && typeof responseMeta.headers === 'object'
|
|
201
|
+
? responseMeta.headers
|
|
202
|
+
: undefined);
|
|
203
|
+
if (frozen.streamed === true) {
|
|
204
|
+
const raw = typeof frozen.streamRaw === 'string' ? frozen.streamRaw : '';
|
|
205
|
+
return new Response(reconstructStream(raw), { status, statusText, headers });
|
|
206
|
+
}
|
|
207
|
+
const body = frozen.output != null ? JSON.stringify(frozen.output) : null;
|
|
208
|
+
return new Response(body, { status, statusText, headers });
|
|
209
|
+
}
|
|
210
|
+
/** Execute a live fetch and record the event, returning both the Response and the recorded event */
|
|
211
|
+
async function executeLiveAndRecord(originalFetchFn, input, init, id, url, method, rawHeaders, rawBody) {
|
|
212
|
+
const query = parseQuery(url);
|
|
213
|
+
const body = parseBody(rawBody);
|
|
214
|
+
const headers = normalizeHeaders(rawHeaders);
|
|
215
|
+
const start = rawDateNow();
|
|
216
|
+
const res = await originalFetchFn(input, init);
|
|
217
|
+
const responseHeadersObj = {};
|
|
218
|
+
res.headers.forEach((v, k) => { responseHeadersObj[k] = v; });
|
|
219
|
+
const elasticdashResponse = { status: res.status, statusText: res.statusText, headers: responseHeadersObj, url: res.url };
|
|
220
|
+
const baseInput = {
|
|
221
|
+
url, method,
|
|
222
|
+
...(query ? { query } : {}),
|
|
223
|
+
...(body !== undefined ? { body } : {}),
|
|
224
|
+
...(headers && Object.keys(headers).length > 0 ? { headers } : {}),
|
|
225
|
+
__elasticdashResponse: elasticdashResponse,
|
|
226
|
+
};
|
|
227
|
+
if (isStreamingContentType(res.headers) && res.body) {
|
|
228
|
+
// Streaming responses are not captured — the individual tool/AI calls
|
|
229
|
+
// inside the handler are already recorded separately. Pass through
|
|
230
|
+
// without buffering to avoid holding large streams in memory.
|
|
231
|
+
const event = {
|
|
232
|
+
id, type: 'http', name: 'fetch', input: baseInput,
|
|
233
|
+
output: null, streamed: true, timestamp: start, durationMs: rawDateNow() - start,
|
|
234
|
+
};
|
|
235
|
+
return { response: res, event };
|
|
236
|
+
}
|
|
237
|
+
let output = null;
|
|
238
|
+
try {
|
|
239
|
+
output = await res.clone().json();
|
|
240
|
+
}
|
|
241
|
+
catch { /* not JSON */ }
|
|
242
|
+
const event = {
|
|
243
|
+
id, type: 'http', name: 'fetch', input: baseInput, output, timestamp: start, durationMs: rawDateNow() - start,
|
|
244
|
+
};
|
|
245
|
+
return { response: res, event };
|
|
246
|
+
}
|
|
247
|
+
export function interceptFetch() {
|
|
248
|
+
if (originalFetch)
|
|
249
|
+
return; // already installed
|
|
250
|
+
originalFetch = globalThis.fetch;
|
|
251
|
+
globalThis.fetch = async (input, init) => {
|
|
252
|
+
await tryAutoInitHttpContext();
|
|
253
|
+
const ctx = getCaptureContext();
|
|
254
|
+
const httpCtx = getHttpRunContext();
|
|
255
|
+
const obsCtx = getObservabilityContext();
|
|
256
|
+
if (!ctx && !httpCtx && !obsCtx)
|
|
257
|
+
return originalFetch(input, init);
|
|
258
|
+
const url = typeof input === 'string'
|
|
259
|
+
? input
|
|
260
|
+
: input instanceof URL
|
|
261
|
+
? input.href
|
|
262
|
+
: input.url;
|
|
263
|
+
const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();
|
|
264
|
+
const rawHeaders = init?.headers ?? (input instanceof Request ? input.headers : undefined);
|
|
265
|
+
const rawBody = init?.body ?? (input instanceof Request ? input.body : undefined);
|
|
266
|
+
// Let ai-interceptor handle AI provider URLs — it assigns its own event IDs
|
|
267
|
+
if (isAIProviderUrl(url)) {
|
|
268
|
+
return originalFetch(input, init);
|
|
269
|
+
}
|
|
270
|
+
// --- Observability-only mode: record and push, no mocks/replay ---
|
|
271
|
+
if (!ctx && !httpCtx && obsCtx) {
|
|
272
|
+
const id = obsCtx.nextId();
|
|
273
|
+
const { response, event } = await executeLiveAndRecord(originalFetch, input, init, id, url, method, rawHeaders, rawBody);
|
|
274
|
+
const eventPromise = response.__eventPromise;
|
|
275
|
+
if (eventPromise) {
|
|
276
|
+
eventPromise.then((ev) => pushTelemetryEvent(ev)).catch(() => { });
|
|
277
|
+
}
|
|
278
|
+
else if (event) {
|
|
279
|
+
pushTelemetryEvent(event);
|
|
280
|
+
}
|
|
281
|
+
return response;
|
|
282
|
+
}
|
|
283
|
+
// --- HTTP mode (no capture context) — replay frozen events or execute live ---
|
|
284
|
+
if (!ctx && httpCtx) {
|
|
285
|
+
const id = httpCtx.nextId();
|
|
286
|
+
// Replay frozen step
|
|
287
|
+
const frozen = getHttpFrozenEvent(id);
|
|
288
|
+
if (frozen && frozen.type === 'http') {
|
|
289
|
+
pushTelemetryEvent(frozen);
|
|
290
|
+
return synthesizeFrozenResponse(frozen);
|
|
291
|
+
}
|
|
292
|
+
// Not frozen → execute live, push telemetry
|
|
293
|
+
const { response, event } = await executeLiveAndRecord(originalFetch, input, init, id, url, method, rawHeaders, rawBody);
|
|
294
|
+
const eventPromise = response.__eventPromise;
|
|
295
|
+
if (eventPromise) {
|
|
296
|
+
eventPromise.then((ev) => pushTelemetryEvent(ev)).catch(() => { });
|
|
297
|
+
}
|
|
298
|
+
else if (event) {
|
|
299
|
+
pushTelemetryEvent(event);
|
|
300
|
+
}
|
|
301
|
+
return response;
|
|
302
|
+
}
|
|
303
|
+
// --- Capture mode (existing behaviour, enhanced with telemetry + TraceHandle) ---
|
|
304
|
+
const trace = getCurrentTrace();
|
|
305
|
+
const { recorder, replay } = ctx;
|
|
306
|
+
const id = recorder.nextId();
|
|
307
|
+
if (replay.shouldReplay(id)) {
|
|
308
|
+
const historicalEvent = replay.getRecordedEvent(id);
|
|
309
|
+
const historicalInput = historicalEvent?.input;
|
|
310
|
+
const historicalMethod = typeof historicalInput?.method === 'string' ? historicalInput.method.toUpperCase() : 'GET';
|
|
311
|
+
const historicalUrl = typeof historicalInput?.url === 'string' ? historicalInput.url : undefined;
|
|
312
|
+
const isReplayMatch = !!historicalEvent
|
|
313
|
+
&& historicalEvent.type === 'http'
|
|
314
|
+
&& historicalEvent.name === 'fetch'
|
|
315
|
+
&& historicalMethod === method
|
|
316
|
+
&& historicalUrl === url;
|
|
317
|
+
if (isReplayMatch && historicalEvent) {
|
|
318
|
+
recorder.record(historicalEvent);
|
|
319
|
+
if (httpCtx)
|
|
320
|
+
pushTelemetryEvent(historicalEvent);
|
|
321
|
+
if (trace && typeof trace.recordToolCall === 'function') {
|
|
322
|
+
trace.recordToolCall({ name: 'fetch', args: { url, method }, result: historicalEvent.output, workflowEventId: id });
|
|
323
|
+
}
|
|
324
|
+
return synthesizeFrozenResponse(historicalEvent);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const { response, event } = await executeLiveAndRecord(originalFetch, input, init, id, url, method, rawHeaders, rawBody);
|
|
328
|
+
const eventPromise = response.__eventPromise;
|
|
329
|
+
if (eventPromise) {
|
|
330
|
+
recorder.trackAsync(eventPromise.then((ev) => {
|
|
331
|
+
recorder.record(ev);
|
|
332
|
+
if (httpCtx)
|
|
333
|
+
pushTelemetryEvent(ev);
|
|
334
|
+
if (trace && typeof trace.recordToolCall === 'function') {
|
|
335
|
+
trace.recordToolCall({ name: 'fetch', args: { url, method }, result: ev.output, workflowEventId: id });
|
|
336
|
+
}
|
|
337
|
+
}).catch(() => { }));
|
|
338
|
+
}
|
|
339
|
+
else if (event) {
|
|
340
|
+
recorder.record(event);
|
|
341
|
+
if (httpCtx)
|
|
342
|
+
pushTelemetryEvent(event);
|
|
343
|
+
if (trace && typeof trace.recordToolCall === 'function') {
|
|
344
|
+
trace.recordToolCall({ name: 'fetch', args: { url, method }, result: event.output, workflowEventId: id });
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return response;
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
export function restoreFetch() {
|
|
351
|
+
if (originalFetch) {
|
|
352
|
+
globalThis.fetch = originalFetch;
|
|
353
|
+
originalFetch = undefined;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/interceptors/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Call the real Date.now(), bypassing any interception. Safe to call from inside interceptors. */
|
|
2
|
+
export declare function rawDateNow(): number;
|
|
3
|
+
export declare function interceptRandom(): void;
|
|
4
|
+
export declare function restoreRandom(): void;
|
|
5
|
+
export declare function interceptDateNow(): void;
|
|
6
|
+
export declare function restoreDateNow(): void;
|
|
7
|
+
//# sourceMappingURL=side-effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side-effects.d.ts","sourceRoot":"","sources":["../../src/interceptors/side-effects.ts"],"names":[],"mappings":"AAKA,mGAAmG;AACnG,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,eAAe,IAAI,IAAI,CA4BtC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CA4BvC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getCaptureContext } from '../capture/recorder.js';
|
|
2
|
+
let originalRandom;
|
|
3
|
+
let originalDateNow;
|
|
4
|
+
/** Call the real Date.now(), bypassing any interception. Safe to call from inside interceptors. */
|
|
5
|
+
export function rawDateNow() {
|
|
6
|
+
return originalDateNow ? originalDateNow() : Date.now();
|
|
7
|
+
}
|
|
8
|
+
export function interceptRandom() {
|
|
9
|
+
if (originalRandom)
|
|
10
|
+
return; // already installed
|
|
11
|
+
originalRandom = Math.random;
|
|
12
|
+
Math.random = () => {
|
|
13
|
+
const ctx = getCaptureContext();
|
|
14
|
+
if (!ctx)
|
|
15
|
+
return originalRandom();
|
|
16
|
+
const { recorder, replay } = ctx;
|
|
17
|
+
const n = recorder.nextSideEffectId();
|
|
18
|
+
if (replay.shouldReplaySideEffectOfType(n, 'Math.random')) {
|
|
19
|
+
return replay.getSideEffectResultOfType(n, 'Math.random');
|
|
20
|
+
}
|
|
21
|
+
const value = originalRandom();
|
|
22
|
+
recorder.record({
|
|
23
|
+
id: n,
|
|
24
|
+
type: 'side_effect',
|
|
25
|
+
name: 'Math.random',
|
|
26
|
+
input: null,
|
|
27
|
+
output: value,
|
|
28
|
+
timestamp: rawDateNow(),
|
|
29
|
+
durationMs: 0,
|
|
30
|
+
});
|
|
31
|
+
return value;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function restoreRandom() {
|
|
35
|
+
if (originalRandom) {
|
|
36
|
+
Math.random = originalRandom;
|
|
37
|
+
originalRandom = undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function interceptDateNow() {
|
|
41
|
+
if (originalDateNow)
|
|
42
|
+
return; // already installed
|
|
43
|
+
originalDateNow = Date.now;
|
|
44
|
+
Date.now = () => {
|
|
45
|
+
const ctx = getCaptureContext();
|
|
46
|
+
if (!ctx)
|
|
47
|
+
return originalDateNow();
|
|
48
|
+
const { recorder, replay } = ctx;
|
|
49
|
+
const n = recorder.nextSideEffectId();
|
|
50
|
+
if (replay.shouldReplaySideEffectOfType(n, 'Date.now')) {
|
|
51
|
+
return replay.getSideEffectResultOfType(n, 'Date.now');
|
|
52
|
+
}
|
|
53
|
+
const value = originalDateNow();
|
|
54
|
+
recorder.record({
|
|
55
|
+
id: n,
|
|
56
|
+
type: 'side_effect',
|
|
57
|
+
name: 'Date.now',
|
|
58
|
+
input: null,
|
|
59
|
+
output: value,
|
|
60
|
+
timestamp: value,
|
|
61
|
+
durationMs: 0,
|
|
62
|
+
});
|
|
63
|
+
return value;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function restoreDateNow() {
|
|
67
|
+
if (originalDateNow) {
|
|
68
|
+
Date.now = originalDateNow;
|
|
69
|
+
originalDateNow = undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=side-effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"side-effects.js","sourceRoot":"","sources":["../../src/interceptors/side-effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,IAAI,cAA0C,CAAA;AAC9C,IAAI,eAA2C,CAAA;AAE/C,mGAAmG;AACnG,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,cAAc;QAAE,OAAM,CAAC,oBAAoB;IAC/C,cAAc,GAAG,IAAI,CAAC,MAAM,CAAA;IAE5B,IAAI,CAAC,MAAM,GAAG,GAAW,EAAE;QACzB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAA;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,cAAe,EAAE,CAAA;QAElC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAA;QAErC,IAAI,MAAM,CAAC,4BAA4B,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC;YAC1D,OAAO,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAAE,aAAa,CAAW,CAAA;QACrE,CAAC;QAED,MAAM,KAAK,GAAG,cAAe,EAAE,CAAA;QAC/B,QAAQ,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,UAAU,EAAE;YACvB,UAAU,EAAE,CAAC;SACd,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,cAAc,CAAA;QAC5B,cAAc,GAAG,SAAS,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,eAAe;QAAE,OAAM,CAAC,oBAAoB;IAChD,eAAe,GAAG,IAAI,CAAC,GAAG,CAAA;IAE1B,IAAI,CAAC,GAAG,GAAG,GAAW,EAAE;QACtB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAA;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,eAAgB,EAAE,CAAA;QAEnC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAA;QAErC,IAAI,MAAM,CAAC,4BAA4B,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,MAAM,CAAC,yBAAyB,CAAC,CAAC,EAAE,UAAU,CAAW,CAAA;QAClE,CAAC;QAED,MAAM,KAAK,GAAG,eAAgB,EAAE,CAAA;QAChC,QAAQ,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,CAAC;YACL,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,CAAC;SACd,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,eAAe,CAAA;QAC1B,eAAe,GAAG,SAAS,CAAA;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { WorkflowEvent } from '../capture/event.js';
|
|
2
|
+
import type { AIMockEntry, UserPromptMockEntry } from '../internals/mock-resolver.js';
|
|
3
|
+
import type { TelemetryBatcher } from '../telemetry-batcher.js';
|
|
4
|
+
interface ToolMockEntry {
|
|
5
|
+
mode: 'live' | 'mock-all' | 'mock-specific';
|
|
6
|
+
callIndices?: number[];
|
|
7
|
+
mockData?: Record<number, unknown>;
|
|
8
|
+
}
|
|
9
|
+
type MockResult = {
|
|
10
|
+
mocked: true;
|
|
11
|
+
result: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
mocked: false;
|
|
14
|
+
};
|
|
15
|
+
export interface HttpRunContext {
|
|
16
|
+
runId: string;
|
|
17
|
+
dashboardUrl: string;
|
|
18
|
+
nextId: () => number;
|
|
19
|
+
frozenEvents: Map<number, WorkflowEvent>;
|
|
20
|
+
/** System-prompt-keyed overrides: original system prompt → replacement system prompt */
|
|
21
|
+
promptMocks: Map<string, string>;
|
|
22
|
+
/** User prompt mock configuration (keyed by original user message text) */
|
|
23
|
+
userPromptMocks?: Record<string, UserPromptMockEntry>;
|
|
24
|
+
/** Tool output mock configuration (keyed by tool name) */
|
|
25
|
+
toolMockConfig?: Record<string, ToolMockEntry>;
|
|
26
|
+
/** AI output mock configuration (keyed by model name) */
|
|
27
|
+
aiMockConfig?: Record<string, AIMockEntry>;
|
|
28
|
+
/** Per-tool call counters for mock resolution (scoped to this request) */
|
|
29
|
+
toolCallCounters: Record<string, number>;
|
|
30
|
+
/** Per-model call counters for AI mock resolution (scoped to this request) */
|
|
31
|
+
aiCallCounters: Record<string, number>;
|
|
32
|
+
/** Per-user-prompt-text call counters for user prompt mock resolution */
|
|
33
|
+
userPromptCallCounters: Record<string, number>;
|
|
34
|
+
}
|
|
35
|
+
export interface ObservabilityContext {
|
|
36
|
+
sessionId: string;
|
|
37
|
+
serverUrl: string;
|
|
38
|
+
apiKey?: string;
|
|
39
|
+
batcher: TelemetryBatcher;
|
|
40
|
+
nextId: () => number;
|
|
41
|
+
sampleRate: number;
|
|
42
|
+
redactKeys: string[];
|
|
43
|
+
traceId: string;
|
|
44
|
+
/** The default workflow name discovered from ed_workflows.ts, used as traceId prefix */
|
|
45
|
+
defaultWorkflowName: string;
|
|
46
|
+
/** When true, events captured during trigger rerun execution are marked as isRerun */
|
|
47
|
+
isRerun?: boolean;
|
|
48
|
+
/** When set, pushTelemetryEvent also collects events here (used by trace capture) */
|
|
49
|
+
eventCollector?: WorkflowEvent[];
|
|
50
|
+
}
|
|
51
|
+
export declare function setObservabilityContext(ctx: ObservabilityContext): void;
|
|
52
|
+
export declare function getObservabilityContext(): ObservabilityContext | undefined;
|
|
53
|
+
export declare function clearObservabilityContext(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Sets a global (non-ALS) fallback context that `getHttpRunContext` checks when
|
|
56
|
+
* ALS returns `undefined`. Use this in streaming frameworks where ALS context is
|
|
57
|
+
* lost after the handler returns a ReadableStream.
|
|
58
|
+
*/
|
|
59
|
+
export declare function setGlobalHttpContext(ctx: HttpRunContext): void;
|
|
60
|
+
/**
|
|
61
|
+
* Clears the global fallback context. Call this at the start of non-ElasticDash
|
|
62
|
+
* requests (or when a stream closes) to prevent stale context from leaking.
|
|
63
|
+
*/
|
|
64
|
+
export declare function clearGlobalHttpContext(): void;
|
|
65
|
+
/** Synchronous setup — use when there are no frozen events (live run with no replay). */
|
|
66
|
+
export declare function setHttpRunContext(runId: string, dashboardUrl: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Async setup — fetches frozen events from the dashboard then sets the ALS context.
|
|
69
|
+
* Use this in request handlers instead of setHttpRunContext when step freezing is needed.
|
|
70
|
+
* Falls back to a live (no-replay) context if the fetch fails or returns nothing.
|
|
71
|
+
*/
|
|
72
|
+
export declare function initHttpRunContext(runId: string, dashboardUrl: string): Promise<void>;
|
|
73
|
+
export declare function getHttpRunContext(): HttpRunContext | undefined;
|
|
74
|
+
/** Returns the frozen WorkflowEvent for the given event id, or undefined if not frozen. */
|
|
75
|
+
export declare function getHttpFrozenEvent(id: number): WorkflowEvent | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* If a prompt mock is configured for the system prompt found in `input`, returns
|
|
78
|
+
* a copy of `input` with the system prompt replaced. Otherwise returns `undefined`.
|
|
79
|
+
*/
|
|
80
|
+
export declare function getHttpPromptMock(input: unknown): unknown | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* If user prompt mocks are configured, applies all matching replacements to `input`.
|
|
83
|
+
* Returns modified input or `undefined` if no replacements applied.
|
|
84
|
+
* Uses fuzzy matching (strip/add JSON quotes) to handle serialization mismatches.
|
|
85
|
+
*/
|
|
86
|
+
export declare function getHttpUserPromptMock(input: unknown): unknown | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Resolves whether the current HTTP-mode call to `toolName` should be mocked.
|
|
89
|
+
* Mirrors `resolveMock()` but reads from the per-request HttpRunContext.
|
|
90
|
+
*/
|
|
91
|
+
export declare function getHttpToolMock(toolName: string): MockResult;
|
|
92
|
+
/**
|
|
93
|
+
* Resolves whether the current HTTP-mode call to `modelName` should be mocked.
|
|
94
|
+
* Mirrors `resolveAIMock()` but reads from the per-request HttpRunContext.
|
|
95
|
+
*/
|
|
96
|
+
export declare function getHttpAIMock(modelName: string): MockResult;
|
|
97
|
+
export declare function pushTelemetryEvent(event: WorkflowEvent, explicitCtx?: {
|
|
98
|
+
runId: string;
|
|
99
|
+
dashboardUrl: string;
|
|
100
|
+
}): void;
|
|
101
|
+
/**
|
|
102
|
+
* Lazily initialises an HTTP run context from environment variables when none
|
|
103
|
+
* has been set up explicitly. Only activates when `ELASTICDASH_SERVER` is set.
|
|
104
|
+
*
|
|
105
|
+
* - If `ELASTICDASH_RUN_ID` is also set, calls `initHttpRunContext` so that
|
|
106
|
+
* frozen steps are fetched from the dashboard (enables step freezing).
|
|
107
|
+
* - Otherwise calls `setHttpRunContext` with a fresh UUID (live/telemetry mode).
|
|
108
|
+
*
|
|
109
|
+
* The initialisation runs at most once per process — subsequent calls are
|
|
110
|
+
* no-ops once the context is established. Errors (e.g. dashboard unreachable)
|
|
111
|
+
* are swallowed so that live execution always continues unaffected.
|
|
112
|
+
*
|
|
113
|
+
* Typical usage: set `ELASTICDASH_SERVER=http://localhost:4573` and optionally
|
|
114
|
+
* `ELASTICDASH_RUN_ID=<id>` before starting your server or script. Every
|
|
115
|
+
* `wrapTool` / `wrapAI` call will then auto-connect to the dashboard without
|
|
116
|
+
* any explicit `initHttpRunContext` call in your code.
|
|
117
|
+
*/
|
|
118
|
+
/**
|
|
119
|
+
* Runs `callback` inside a fresh HTTP run context scoped to `runId` / `dashboardUrl`.
|
|
120
|
+
* Uses `als.run()` which guarantees the store is inherited by all async descendants of
|
|
121
|
+
* `callback`, even when intermediate code (e.g. Langfuse / OTel) spawns its own async
|
|
122
|
+
* contexts via `als.run()`. Prefer this over `setHttpRunContext` when wrapping a long-lived
|
|
123
|
+
* async pipeline such as a streaming route handler.
|
|
124
|
+
*/
|
|
125
|
+
export declare function runInHttpContext<T>(runId: string, dashboardUrl: string, callback: () => Promise<T>): Promise<T>;
|
|
126
|
+
/**
|
|
127
|
+
* Fetches frozen events and prompt mocks from the dashboard, then runs `callback`
|
|
128
|
+
* inside an HTTP run context using `als.run()`. This is the preferred function for
|
|
129
|
+
* streaming route handlers that sit behind Langfuse / OTel instrumentation:
|
|
130
|
+
*
|
|
131
|
+
* - `als.run()` guarantees the elasticdash store is inherited through any nested
|
|
132
|
+
* `als.run()` calls made by third-party libraries (e.g. `startActiveObservation`).
|
|
133
|
+
* - Frozen events and prompt mocks are fetched before the callback so step replay
|
|
134
|
+
* and prompt mocking work correctly on reruns.
|
|
135
|
+
*
|
|
136
|
+
* Falls back to an empty context (live execution, no replay) if the dashboard is
|
|
137
|
+
* unreachable or the run config is not found.
|
|
138
|
+
*/
|
|
139
|
+
export declare function runWithInitializedHttpContext<T>(runId: string, dashboardUrl: string, callback: () => Promise<T>): Promise<T>;
|
|
140
|
+
export declare function tryAutoInitHttpContext(): Promise<void>;
|
|
141
|
+
export {};
|
|
142
|
+
//# sourceMappingURL=telemetry-push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry-push.d.ts","sourceRoot":"","sources":["../../src/interceptors/telemetry-push.ts"],"names":[],"mappings":"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"}
|