@plumloom/cli 0.1.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 +202 -0
- package/NOTICE +2 -0
- package/README.md +71 -0
- package/dist/actions/configured-runs.d.ts +25 -0
- package/dist/actions/configured-runs.d.ts.map +1 -0
- package/dist/actions/configured-runs.js +35 -0
- package/dist/actions/configured-runs.js.map +1 -0
- package/dist/actions/context.d.ts +5 -0
- package/dist/actions/context.d.ts.map +1 -0
- package/dist/actions/context.js +2 -0
- package/dist/actions/context.js.map +1 -0
- package/dist/actions/doctor.d.ts +46 -0
- package/dist/actions/doctor.d.ts.map +1 -0
- package/dist/actions/doctor.js +130 -0
- package/dist/actions/doctor.js.map +1 -0
- package/dist/actions/evaluations.d.ts +87 -0
- package/dist/actions/evaluations.d.ts.map +1 -0
- package/dist/actions/evaluations.js +307 -0
- package/dist/actions/evaluations.js.map +1 -0
- package/dist/actions/gate.d.ts +63 -0
- package/dist/actions/gate.d.ts.map +1 -0
- package/dist/actions/gate.js +272 -0
- package/dist/actions/gate.js.map +1 -0
- package/dist/actions/identity.d.ts +4 -0
- package/dist/actions/identity.d.ts.map +1 -0
- package/dist/actions/identity.js +4 -0
- package/dist/actions/identity.js.map +1 -0
- package/dist/actions/models.d.ts +4 -0
- package/dist/actions/models.d.ts.map +1 -0
- package/dist/actions/models.js +4 -0
- package/dist/actions/models.js.map +1 -0
- package/dist/actions/quality-standards.d.ts +30 -0
- package/dist/actions/quality-standards.d.ts.map +1 -0
- package/dist/actions/quality-standards.js +86 -0
- package/dist/actions/quality-standards.js.map +1 -0
- package/dist/actions/results.d.ts +12 -0
- package/dist/actions/results.d.ts.map +1 -0
- package/dist/actions/results.js +65 -0
- package/dist/actions/results.js.map +1 -0
- package/dist/actions/runs.d.ts +22 -0
- package/dist/actions/runs.d.ts.map +1 -0
- package/dist/actions/runs.js +59 -0
- package/dist/actions/runs.js.map +1 -0
- package/dist/actions/suite-gate.d.ts +24 -0
- package/dist/actions/suite-gate.d.ts.map +1 -0
- package/dist/actions/suite-gate.js +40 -0
- package/dist/actions/suite-gate.js.map +1 -0
- package/dist/actions/suite.d.ts +49 -0
- package/dist/actions/suite.d.ts.map +1 -0
- package/dist/actions/suite.js +68 -0
- package/dist/actions/suite.js.map +1 -0
- package/dist/actions/validation.d.ts +3 -0
- package/dist/actions/validation.d.ts.map +1 -0
- package/dist/actions/validation.js +26 -0
- package/dist/actions/validation.js.map +1 -0
- package/dist/actions/workspaces.d.ts +13 -0
- package/dist/actions/workspaces.d.ts.map +1 -0
- package/dist/actions/workspaces.js +18 -0
- package/dist/actions/workspaces.js.map +1 -0
- package/dist/api/api.d.ts +237 -0
- package/dist/api/api.d.ts.map +1 -0
- package/dist/api/api.js +396 -0
- package/dist/api/api.js.map +1 -0
- package/dist/api/client.d.ts +38 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +295 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/endpoints.d.ts +31 -0
- package/dist/api/endpoints.d.ts.map +1 -0
- package/dist/api/endpoints.js +32 -0
- package/dist/api/endpoints.js.map +1 -0
- package/dist/api/errors.d.ts +22 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +84 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/schemas.d.ts +169 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +194 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/auth/credential-store.d.ts +9 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +2 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/auth/credentials.d.ts +27 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +81 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/keyring-store.d.ts +9 -0
- package/dist/auth/keyring-store.d.ts.map +1 -0
- package/dist/auth/keyring-store.js +57 -0
- package/dist/auth/keyring-store.js.map +1 -0
- package/dist/auth/login.d.ts +28 -0
- package/dist/auth/login.d.ts.map +1 -0
- package/dist/auth/login.js +27 -0
- package/dist/auth/login.js.map +1 -0
- package/dist/auth/password-prompt.d.ts +5 -0
- package/dist/auth/password-prompt.d.ts.map +1 -0
- package/dist/auth/password-prompt.js +10 -0
- package/dist/auth/password-prompt.js.map +1 -0
- package/dist/auth/redact.d.ts +3 -0
- package/dist/auth/redact.d.ts.map +1 -0
- package/dist/auth/redact.js +69 -0
- package/dist/auth/redact.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/executor.d.ts +36 -0
- package/dist/commands/executor.d.ts.map +1 -0
- package/dist/commands/executor.js +1218 -0
- package/dist/commands/executor.js.map +1 -0
- package/dist/commands/program.d.ts +21 -0
- package/dist/commands/program.d.ts.map +1 -0
- package/dist/commands/program.js +588 -0
- package/dist/commands/program.js.map +1 -0
- package/dist/commands/types.d.ts +139 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/configured-run/file-inputs.d.ts +8 -0
- package/dist/configured-run/file-inputs.d.ts.map +1 -0
- package/dist/configured-run/file-inputs.js +160 -0
- package/dist/configured-run/file-inputs.js.map +1 -0
- package/dist/configured-run/validation.d.ts +103 -0
- package/dist/configured-run/validation.d.ts.map +1 -0
- package/dist/configured-run/validation.js +327 -0
- package/dist/configured-run/validation.js.map +1 -0
- package/dist/domain/common.d.ts +6 -0
- package/dist/domain/common.d.ts.map +1 -0
- package/dist/domain/common.js +10 -0
- package/dist/domain/common.js.map +1 -0
- package/dist/domain/types.d.ts +117 -0
- package/dist/domain/types.d.ts.map +1 -0
- package/dist/domain/types.js +2 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/errors/autoeval-error.d.ts +13 -0
- package/dist/errors/autoeval-error.d.ts.map +1 -0
- package/dist/errors/autoeval-error.js +36 -0
- package/dist/errors/autoeval-error.js.map +1 -0
- package/dist/errors/hints.d.ts +3 -0
- package/dist/errors/hints.d.ts.map +1 -0
- package/dist/errors/hints.js +43 -0
- package/dist/errors/hints.js.map +1 -0
- package/dist/gate/decision.d.ts +97 -0
- package/dist/gate/decision.d.ts.map +1 -0
- package/dist/gate/decision.js +436 -0
- package/dist/gate/decision.js.map +1 -0
- package/dist/gate/policy.d.ts +31 -0
- package/dist/gate/policy.d.ts.map +1 -0
- package/dist/gate/policy.js +26 -0
- package/dist/gate/policy.js.map +1 -0
- package/dist/guide/eval-creation-backend.d.ts +20 -0
- package/dist/guide/eval-creation-backend.d.ts.map +1 -0
- package/dist/guide/eval-creation-backend.js +16 -0
- package/dist/guide/eval-creation-backend.js.map +1 -0
- package/dist/guide/eval-guide.d.ts +24 -0
- package/dist/guide/eval-guide.d.ts.map +1 -0
- package/dist/guide/eval-guide.js +219 -0
- package/dist/guide/eval-guide.js.map +1 -0
- package/dist/mcp/context.d.ts +21 -0
- package/dist/mcp/context.d.ts.map +1 -0
- package/dist/mcp/context.js +19 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/schemas.d.ts +206 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +80 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/server.d.ts +5 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +10 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +42 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +287 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +32 -0
- package/dist/mcp.js.map +1 -0
- package/dist/output/big-digits.d.ts +7 -0
- package/dist/output/big-digits.d.ts.map +1 -0
- package/dist/output/big-digits.js +43 -0
- package/dist/output/big-digits.js.map +1 -0
- package/dist/output/clipboard.d.ts +29 -0
- package/dist/output/clipboard.d.ts.map +1 -0
- package/dist/output/clipboard.js +82 -0
- package/dist/output/clipboard.js.map +1 -0
- package/dist/output/colors.d.ts +21 -0
- package/dist/output/colors.d.ts.map +1 -0
- package/dist/output/colors.js +21 -0
- package/dist/output/colors.js.map +1 -0
- package/dist/output/digest.d.ts +165 -0
- package/dist/output/digest.d.ts.map +1 -0
- package/dist/output/digest.js +771 -0
- package/dist/output/digest.js.map +1 -0
- package/dist/output/human.d.ts +95 -0
- package/dist/output/human.d.ts.map +1 -0
- package/dist/output/human.js +643 -0
- package/dist/output/human.js.map +1 -0
- package/dist/output/json.d.ts +2 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +5 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/layout.d.ts +18 -0
- package/dist/output/layout.d.ts.map +1 -0
- package/dist/output/layout.js +64 -0
- package/dist/output/layout.js.map +1 -0
- package/dist/output/markdown.d.ts +16 -0
- package/dist/output/markdown.d.ts.map +1 -0
- package/dist/output/markdown.js +38 -0
- package/dist/output/markdown.js.map +1 -0
- package/dist/output/progress.d.ts +29 -0
- package/dist/output/progress.d.ts.map +1 -0
- package/dist/output/progress.js +136 -0
- package/dist/output/progress.js.map +1 -0
- package/dist/output/safe-text.d.ts +11 -0
- package/dist/output/safe-text.d.ts.map +1 -0
- package/dist/output/safe-text.js +44 -0
- package/dist/output/safe-text.js.map +1 -0
- package/dist/output/scorecard.d.ts +23 -0
- package/dist/output/scorecard.d.ts.map +1 -0
- package/dist/output/scorecard.js +506 -0
- package/dist/output/scorecard.js.map +1 -0
- package/dist/output/section.d.ts +15 -0
- package/dist/output/section.d.ts.map +1 -0
- package/dist/output/section.js +44 -0
- package/dist/output/section.js.map +1 -0
- package/dist/output/spinner.d.ts +24 -0
- package/dist/output/spinner.d.ts.map +1 -0
- package/dist/output/spinner.js +34 -0
- package/dist/output/spinner.js.map +1 -0
- package/dist/output/splash.d.ts +37 -0
- package/dist/output/splash.d.ts.map +1 -0
- package/dist/output/splash.js +169 -0
- package/dist/output/splash.js.map +1 -0
- package/dist/output/table.d.ts +33 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +105 -0
- package/dist/output/table.js.map +1 -0
- package/dist/output/trend.d.ts +19 -0
- package/dist/output/trend.d.ts.map +1 -0
- package/dist/output/trend.js +38 -0
- package/dist/output/trend.js.map +1 -0
- package/dist/output/writer.d.ts +14 -0
- package/dist/output/writer.d.ts.map +1 -0
- package/dist/output/writer.js +33 -0
- package/dist/output/writer.js.map +1 -0
- package/dist/polling/clock.d.ts +9 -0
- package/dist/polling/clock.d.ts.map +1 -0
- package/dist/polling/clock.js +23 -0
- package/dist/polling/clock.js.map +1 -0
- package/dist/polling/wait-for-result.d.ts +16 -0
- package/dist/polling/wait-for-result.d.ts.map +1 -0
- package/dist/polling/wait-for-result.js +29 -0
- package/dist/polling/wait-for-result.js.map +1 -0
- package/dist/polling/wait-for-run.d.ts +14 -0
- package/dist/polling/wait-for-run.d.ts.map +1 -0
- package/dist/polling/wait-for-run.js +36 -0
- package/dist/polling/wait-for-run.js.map +1 -0
- package/dist/quickstart/prompt.d.ts +18 -0
- package/dist/quickstart/prompt.d.ts.map +1 -0
- package/dist/quickstart/prompt.js +37 -0
- package/dist/quickstart/prompt.js.map +1 -0
- package/dist/quickstart/sample.d.ts +28 -0
- package/dist/quickstart/sample.d.ts.map +1 -0
- package/dist/quickstart/sample.js +235 -0
- package/dist/quickstart/sample.js.map +1 -0
- package/dist/quickstart/selection.d.ts +53 -0
- package/dist/quickstart/selection.d.ts.map +1 -0
- package/dist/quickstart/selection.js +97 -0
- package/dist/quickstart/selection.js.map +1 -0
- package/dist/run.d.ts +28 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +134 -0
- package/dist/run.js.map +1 -0
- package/dist/runtime/action-context.d.ts +19 -0
- package/dist/runtime/action-context.d.ts.map +1 -0
- package/dist/runtime/action-context.js +40 -0
- package/dist/runtime/action-context.js.map +1 -0
- package/dist/suite/execution.d.ts +46 -0
- package/dist/suite/execution.d.ts.map +1 -0
- package/dist/suite/execution.js +97 -0
- package/dist/suite/execution.js.map +1 -0
- package/dist/suite/manifest.d.ts +16 -0
- package/dist/suite/manifest.d.ts.map +1 -0
- package/dist/suite/manifest.js +92 -0
- package/dist/suite/manifest.js.map +1 -0
- package/dist/suite/reporting.d.ts +35 -0
- package/dist/suite/reporting.d.ts.map +1 -0
- package/dist/suite/reporting.js +131 -0
- package/dist/suite/reporting.js.map +1 -0
- package/dist/trace/deepseek-harness.d.ts +31 -0
- package/dist/trace/deepseek-harness.d.ts.map +1 -0
- package/dist/trace/deepseek-harness.js +412 -0
- package/dist/trace/deepseek-harness.js.map +1 -0
- package/dist/trace/import.d.ts +9 -0
- package/dist/trace/import.d.ts.map +1 -0
- package/dist/trace/import.js +45 -0
- package/dist/trace/import.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { redactText } from '../auth/redact.js';
|
|
2
|
+
const UUID_PATTERN = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/giu;
|
|
3
|
+
const NUMBER_PATTERN = /\b\d+(?:\.\d+)?\b/gu;
|
|
4
|
+
const MAX_LABEL_CHARS = 80;
|
|
5
|
+
/**
|
|
6
|
+
* Known operational causes are matched first so that wording differences
|
|
7
|
+
* between backend messages do not split one outage into several clusters.
|
|
8
|
+
*/
|
|
9
|
+
const SIGNATURES = [
|
|
10
|
+
{ id: 'timeout', label: 'Run or result polling timed out', pattern: /timed?\s*out|timeout/iu },
|
|
11
|
+
{ id: 'http-5xx', label: 'Upstream 5xx error', pattern: /\b5\d\d\b/u },
|
|
12
|
+
{ id: 'rate-limited', label: 'Rate limited (429)', pattern: /\b429\b|rate limit/iu },
|
|
13
|
+
{
|
|
14
|
+
id: 'unauthorized',
|
|
15
|
+
label: 'Authentication or authorization rejected',
|
|
16
|
+
pattern: /\b40[13]\b|unauthori[sz]ed|forbidden/iu,
|
|
17
|
+
},
|
|
18
|
+
{ id: 'not-found', label: 'Resource not found (404)', pattern: /\b404\b|not found/iu },
|
|
19
|
+
{
|
|
20
|
+
id: 'schema-parsing',
|
|
21
|
+
label: 'Schema or JSON parsing failure',
|
|
22
|
+
pattern: /json|schema|parse|parsing|invalid input/iu,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'model-not-enabled',
|
|
26
|
+
label: 'Model not enabled for this account',
|
|
27
|
+
pattern: /model .*not enabled|is not enabled/iu,
|
|
28
|
+
},
|
|
29
|
+
{ id: 'aborted', label: 'Run was aborted', pattern: /abort/iu },
|
|
30
|
+
];
|
|
31
|
+
function truncate(value) {
|
|
32
|
+
const collapsed = value.replace(/\s+/gu, ' ').trim();
|
|
33
|
+
return collapsed.length <= MAX_LABEL_CHARS
|
|
34
|
+
? collapsed
|
|
35
|
+
: `${collapsed.slice(0, MAX_LABEL_CHARS - 1)}…`;
|
|
36
|
+
}
|
|
37
|
+
/** Strips identifiers and magnitudes so two reports of one cause collapse together. */
|
|
38
|
+
function normalize(message) {
|
|
39
|
+
return truncate(message.replace(UUID_PATTERN, '<id>').replace(NUMBER_PATTERN, '<n>'));
|
|
40
|
+
}
|
|
41
|
+
function classify(message) {
|
|
42
|
+
for (const signature of SIGNATURES) {
|
|
43
|
+
if (signature.pattern.test(message))
|
|
44
|
+
return { id: signature.id, label: signature.label };
|
|
45
|
+
}
|
|
46
|
+
const normalized = normalize(message);
|
|
47
|
+
return { id: `other:${normalized}`, label: normalized };
|
|
48
|
+
}
|
|
49
|
+
function collect(seeds) {
|
|
50
|
+
const clusters = new Map();
|
|
51
|
+
for (const seed of seeds) {
|
|
52
|
+
const existing = clusters.get(seed.id);
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.count += 1;
|
|
55
|
+
if (!existing.evals.includes(seed.evalLabel))
|
|
56
|
+
existing.evals.push(seed.evalLabel);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
clusters.set(seed.id, {
|
|
60
|
+
id: seed.id,
|
|
61
|
+
category: seed.category,
|
|
62
|
+
label: seed.label,
|
|
63
|
+
count: 1,
|
|
64
|
+
evals: [seed.evalLabel],
|
|
65
|
+
exemplar: truncate(redactText(seed.exemplar)),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return [...clusters.values()].sort((left, right) => right.count - left.count || left.label.localeCompare(right.label));
|
|
69
|
+
}
|
|
70
|
+
function decisionLabel(decision) {
|
|
71
|
+
return decision.evaluationName ?? decision.inputFile;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Clusters everything that blocked a release: execution and result errors, and
|
|
75
|
+
* every failing or inconclusive gate check.
|
|
76
|
+
*/
|
|
77
|
+
export function clusterSuiteFailures(report) {
|
|
78
|
+
const seeds = [];
|
|
79
|
+
for (const decision of report.perEvalDecisions) {
|
|
80
|
+
if (decision.decision === 'PASS')
|
|
81
|
+
continue;
|
|
82
|
+
const evalLabel = decisionLabel(decision);
|
|
83
|
+
const failingChecks = decision.checks.filter((check) => check.decision !== 'PASS');
|
|
84
|
+
if (failingChecks.length === 0) {
|
|
85
|
+
const classified = classify(decision.reason);
|
|
86
|
+
seeds.push({
|
|
87
|
+
id: `${decision.decision === 'ERROR' ? 'execution' : 'inconclusive'}:${classified.id}`,
|
|
88
|
+
category: decision.decision === 'ERROR' ? 'execution' : 'inconclusive',
|
|
89
|
+
label: classified.label,
|
|
90
|
+
evalLabel,
|
|
91
|
+
exemplar: decision.reason,
|
|
92
|
+
});
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
for (const check of failingChecks) {
|
|
96
|
+
const category = check.decision === 'FAIL' ? 'threshold' : 'inconclusive';
|
|
97
|
+
seeds.push({
|
|
98
|
+
id: `${category}:${check.metric}:${check.decision}`,
|
|
99
|
+
category,
|
|
100
|
+
label: check.decision === 'FAIL'
|
|
101
|
+
? `${check.label} below threshold (${check.threshold})`
|
|
102
|
+
: `${check.label} ${check.reason}`,
|
|
103
|
+
evalLabel,
|
|
104
|
+
exemplar: `${check.label}: ${check.actual} required ${check.threshold} — ${check.reason}`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return collect(seeds);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clusters execution and result-plane errors from a suite run, for the ungated
|
|
112
|
+
* `suite run` command where no thresholds are configured.
|
|
113
|
+
*/
|
|
114
|
+
export function clusterExecutionFailures(summary) {
|
|
115
|
+
const seeds = [];
|
|
116
|
+
for (const entry of [...summary.evals].sort((left, right) => left.index - right.index)) {
|
|
117
|
+
if (entry.status === 'completed')
|
|
118
|
+
continue;
|
|
119
|
+
const message = entry.error ?? `Eval ended in status ${entry.status}`;
|
|
120
|
+
const classified = classify(message);
|
|
121
|
+
seeds.push({
|
|
122
|
+
id: `execution:${classified.id}`,
|
|
123
|
+
category: 'execution',
|
|
124
|
+
label: classified.label,
|
|
125
|
+
evalLabel: entry.execution?.evaluationName ?? entry.inputFile,
|
|
126
|
+
exemplar: message,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return collect(seeds);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=reporting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporting.js","sourceRoot":"","sources":["../../src/suite/reporting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type HarnessSpanKind = 'AGENT' | 'LLM' | 'TOOL';
|
|
2
|
+
export type HarnessImportStats = {
|
|
3
|
+
schema: string;
|
|
4
|
+
events: number;
|
|
5
|
+
spans: number;
|
|
6
|
+
llmSpans: number;
|
|
7
|
+
toolSpans: number;
|
|
8
|
+
unpairedToolCalls: number;
|
|
9
|
+
skippedSubagentSessions: number;
|
|
10
|
+
syntheticTimestamps: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type HarnessTraceConversion = {
|
|
13
|
+
/** Exactly the shape `configuration.artifact` expects for `agent_trace`. */
|
|
14
|
+
artifact: {
|
|
15
|
+
trace: {
|
|
16
|
+
resourceSpans: unknown[];
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
serviceName: string;
|
|
20
|
+
input: string | undefined;
|
|
21
|
+
output: string | undefined;
|
|
22
|
+
stats: HarnessImportStats;
|
|
23
|
+
};
|
|
24
|
+
export type HarnessConversionInput = {
|
|
25
|
+
/** Raw JSONL session log content. */
|
|
26
|
+
content: string;
|
|
27
|
+
/** Overrides the `service.name` resource attribute. */
|
|
28
|
+
serviceName?: string;
|
|
29
|
+
};
|
|
30
|
+
export declare function convertHarnessSession(input: HarnessConversionInput): HarnessTraceConversion;
|
|
31
|
+
//# sourceMappingURL=deepseek-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek-harness.d.ts","sourceRoot":"","sources":["../../src/trace/deepseek-harness.ts"],"names":[],"mappings":"AA6BA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,4EAA4E;IAC5E,QAAQ,EAAE;QAAE,KAAK,EAAE;YAAE,aAAa,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;CAC3B,CAAC;AAyNF,MAAM,MAAM,sBAAsB,GAAG;IACnC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,sBAAsB,CA2N3F"}
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeepSeek Harness session -> Autoeval agent_trace artifact.
|
|
3
|
+
*
|
|
4
|
+
* The Harness records an agent session as an append-only log of typed
|
|
5
|
+
* `SessionEvent`s, one JSONL line per event. Autoeval's `agent_trace` context
|
|
6
|
+
* evaluates an OTLP export annotated with OpenInference span kinds. Those are
|
|
7
|
+
* different shapes, so the conversion lives here — in the OSS CLI, where it is
|
|
8
|
+
* unit-testable and usable without the Harness installed.
|
|
9
|
+
*
|
|
10
|
+
* Mapping (pinned to Harness dsh-v0.1.x event names):
|
|
11
|
+
* session -> root AGENT span
|
|
12
|
+
* assistant/message -> child LLM span
|
|
13
|
+
* tool/call + tool/result (joined on callId) -> child TOOL span
|
|
14
|
+
*
|
|
15
|
+
* Only the root session is imported. Subagents run in their own child sessions
|
|
16
|
+
* with their own logs; those are counted and reported, not merged.
|
|
17
|
+
*/
|
|
18
|
+
import { AutoevalError } from '../errors/autoeval-error.js';
|
|
19
|
+
/** Harness event names this converter understands. */
|
|
20
|
+
const SUPPORTED_SCHEMA = 'dsh-v0.1.x';
|
|
21
|
+
const ZSTANDARD_MAGIC = Buffer.from([0x28, 0xb5, 0x2f, 0xfd]);
|
|
22
|
+
const NANOS_PER_MILLISECOND = 1000000n;
|
|
23
|
+
/** Synthetic span duration when the log carries no usable timestamps. */
|
|
24
|
+
const FALLBACK_SPAN_STEP_MS = 1;
|
|
25
|
+
const MAX_HARNESS_EVENTS = 100_000;
|
|
26
|
+
function usageError(message, code, cause) {
|
|
27
|
+
return new AutoevalError(message, { kind: 'usage', code, ...(cause ? { cause } : {}) });
|
|
28
|
+
}
|
|
29
|
+
function asRecord(value) {
|
|
30
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
31
|
+
? value
|
|
32
|
+
: undefined;
|
|
33
|
+
}
|
|
34
|
+
function firstString(record, keys) {
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
const value = record[key];
|
|
37
|
+
if (typeof value === 'string' && value.trim() !== '')
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
function firstRecord(record, keys) {
|
|
43
|
+
for (const key of keys) {
|
|
44
|
+
const value = asRecord(record[key]);
|
|
45
|
+
if (value)
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
function toEpochMs(value) {
|
|
51
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
52
|
+
return value;
|
|
53
|
+
if (typeof value === 'string') {
|
|
54
|
+
const parsed = Date.parse(value);
|
|
55
|
+
if (!Number.isNaN(parsed))
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The Harness persists a session as concatenated Zstandard frames by default.
|
|
62
|
+
* Decompression is not bundled, so a compressed log is rejected with the
|
|
63
|
+
* setting that produces raw lines instead of a JSON parse error.
|
|
64
|
+
*/
|
|
65
|
+
function rejectCompressedLog(content) {
|
|
66
|
+
const head = Buffer.from(content.slice(0, 4), 'utf8');
|
|
67
|
+
if (head.subarray(0, 4).equals(ZSTANDARD_MAGIC) || content.includes('\u0000')) {
|
|
68
|
+
throw usageError('The session log looks Zstandard-compressed. Configure the JSONL session persistence plugin to write raw lines, or decompress the log before importing it.', 'HARNESS_SESSION_COMPRESSED');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Event envelopes carry the type under `type`/`event`/`kind` and the body
|
|
73
|
+
* either inline or nested under `data`/`payload`, depending on the writer.
|
|
74
|
+
* Both shapes are accepted so an import does not hinge on that detail.
|
|
75
|
+
*/
|
|
76
|
+
function readEvent(line, lineNumber) {
|
|
77
|
+
let parsed;
|
|
78
|
+
try {
|
|
79
|
+
parsed = JSON.parse(line);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
throw usageError(`Session log line ${lineNumber} is not valid JSON. Expected one JSON event per line.`, 'HARNESS_SESSION_INVALID_JSON', error);
|
|
83
|
+
}
|
|
84
|
+
const record = asRecord(parsed);
|
|
85
|
+
if (!record)
|
|
86
|
+
return undefined;
|
|
87
|
+
const type = firstString(record, ['type', 'event', 'kind']);
|
|
88
|
+
if (!type)
|
|
89
|
+
return undefined;
|
|
90
|
+
const payload = firstRecord(record, ['data', 'payload', 'body']) ?? record;
|
|
91
|
+
return {
|
|
92
|
+
type,
|
|
93
|
+
timestampMs: toEpochMs(record.timestamp ?? record.time ?? record.ts ?? record.at),
|
|
94
|
+
payload,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Renders a Harness message body as text.
|
|
99
|
+
*
|
|
100
|
+
* Content parts nest: a `tool-result` part carries its own `content` array of
|
|
101
|
+
* text parts, so blocks are flattened recursively. `tool-call` parts hold no
|
|
102
|
+
* text at all — they are rendered as a readable call line, otherwise an
|
|
103
|
+
* assistant turn that only invoked a tool would convert to an empty span and
|
|
104
|
+
* the trajectory would lose that step.
|
|
105
|
+
*/
|
|
106
|
+
function messageText(message) {
|
|
107
|
+
const record = asRecord(message);
|
|
108
|
+
if (!record)
|
|
109
|
+
return typeof message === 'string' ? message : '';
|
|
110
|
+
const content = record.content;
|
|
111
|
+
if (typeof content === 'string')
|
|
112
|
+
return content;
|
|
113
|
+
if (Array.isArray(content)) {
|
|
114
|
+
return content
|
|
115
|
+
.map((block) => blockText(block))
|
|
116
|
+
.filter((text) => text !== '')
|
|
117
|
+
.join('\n');
|
|
118
|
+
}
|
|
119
|
+
return firstString(record, ['text', 'value']) ?? '';
|
|
120
|
+
}
|
|
121
|
+
function blockText(block) {
|
|
122
|
+
const record = asRecord(block);
|
|
123
|
+
if (!record)
|
|
124
|
+
return typeof block === 'string' ? block : '';
|
|
125
|
+
if (record.type === 'tool-call') {
|
|
126
|
+
const name = firstString(record, ['name', 'toolName']) ?? 'tool';
|
|
127
|
+
const args = typeof record.arguments === 'string'
|
|
128
|
+
? record.arguments
|
|
129
|
+
: JSON.stringify(record.arguments ?? {});
|
|
130
|
+
return `→ ${name}(${args})`;
|
|
131
|
+
}
|
|
132
|
+
const direct = firstString(record, ['text', 'reasoning', 'value']);
|
|
133
|
+
if (direct !== undefined)
|
|
134
|
+
return direct;
|
|
135
|
+
const nested = record.content;
|
|
136
|
+
if (typeof nested === 'string')
|
|
137
|
+
return nested;
|
|
138
|
+
if (Array.isArray(nested)) {
|
|
139
|
+
return nested
|
|
140
|
+
.map((child) => blockText(child))
|
|
141
|
+
.filter((text) => text !== '')
|
|
142
|
+
.join('\n');
|
|
143
|
+
}
|
|
144
|
+
return '';
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Resolves the tool call this event belongs to. The Harness records the id in
|
|
148
|
+
* three different places depending on the event: top-level on `tool/call`, and
|
|
149
|
+
* on `tool/result` under the message source and on each `tool-result` part.
|
|
150
|
+
*/
|
|
151
|
+
function toolCallId(payload) {
|
|
152
|
+
const direct = firstString(payload, ['callId', 'call_id', 'toolCallId']);
|
|
153
|
+
if (direct !== undefined)
|
|
154
|
+
return direct;
|
|
155
|
+
const message = asRecord(payload.message);
|
|
156
|
+
if (!message)
|
|
157
|
+
return undefined;
|
|
158
|
+
const fromSource = firstString(asRecord(message.source) ?? {}, ['callId', 'call_id']);
|
|
159
|
+
if (fromSource !== undefined)
|
|
160
|
+
return fromSource;
|
|
161
|
+
const content = message.content;
|
|
162
|
+
if (Array.isArray(content)) {
|
|
163
|
+
for (const block of content) {
|
|
164
|
+
const id = firstString(asRecord(block) ?? {}, ['toolCallId', 'callId', 'call_id']);
|
|
165
|
+
if (id !== undefined)
|
|
166
|
+
return id;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
/** A tool result is a failure via the event-level error or a part-level flag. */
|
|
172
|
+
function toolResultFailed(payload) {
|
|
173
|
+
if (asRecord(payload.error) !== undefined)
|
|
174
|
+
return true;
|
|
175
|
+
const content = asRecord(payload.message)?.content;
|
|
176
|
+
return Array.isArray(content) && content.some((block) => asRecord(block)?.isError === true);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* True for messages the Harness injects on the model's behalf (runtime-context
|
|
180
|
+
* snapshots from system-prompt plugins). They are recorded with `role: "user"`
|
|
181
|
+
* but are not what the developer asked for, so they must not become the
|
|
182
|
+
* trajectory's input.
|
|
183
|
+
*/
|
|
184
|
+
function isRealUserMessage(payload) {
|
|
185
|
+
const kind = firstString(asRecord(payload.source) ?? {}, ['kind']);
|
|
186
|
+
return kind === undefined || kind === 'user';
|
|
187
|
+
}
|
|
188
|
+
function attribute(key, value) {
|
|
189
|
+
return { key, value: { stringValue: value } };
|
|
190
|
+
}
|
|
191
|
+
function hex(value, width) {
|
|
192
|
+
return value.toString(16).padStart(width, '0');
|
|
193
|
+
}
|
|
194
|
+
function toOtlpSpan(draft, traceId) {
|
|
195
|
+
const attributes = [
|
|
196
|
+
attribute('openinference.span.kind', draft.openInferenceKind),
|
|
197
|
+
...(draft.toolName ? [attribute('tool.name', draft.toolName)] : []),
|
|
198
|
+
attribute('input.value', draft.input),
|
|
199
|
+
attribute('output.value', draft.output),
|
|
200
|
+
];
|
|
201
|
+
return {
|
|
202
|
+
traceId,
|
|
203
|
+
spanId: draft.spanId,
|
|
204
|
+
...(draft.parentSpanId ? { parentSpanId: draft.parentSpanId } : {}),
|
|
205
|
+
name: draft.name,
|
|
206
|
+
kind: draft.kind,
|
|
207
|
+
startTimeUnixNano: (BigInt(Math.round(draft.startMs)) * NANOS_PER_MILLISECOND).toString(),
|
|
208
|
+
endTimeUnixNano: (BigInt(Math.round(draft.endMs)) * NANOS_PER_MILLISECOND).toString(),
|
|
209
|
+
attributes,
|
|
210
|
+
status: { code: draft.failed ? 2 : 1 },
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
export function convertHarnessSession(input) {
|
|
214
|
+
rejectCompressedLog(input.content);
|
|
215
|
+
const events = [];
|
|
216
|
+
let header;
|
|
217
|
+
const lines = input.content.split('\n');
|
|
218
|
+
for (const [index, rawLine] of lines.entries()) {
|
|
219
|
+
const line = rawLine.trim();
|
|
220
|
+
if (line === '')
|
|
221
|
+
continue;
|
|
222
|
+
const event = readEvent(line, index + 1);
|
|
223
|
+
if (event) {
|
|
224
|
+
// The Harness writes its SessionHeader as a typed `session` event on the
|
|
225
|
+
// first line rather than as a bare object, so it carries the session id
|
|
226
|
+
// and wall-clock start that the rest of the log omits.
|
|
227
|
+
if (event.type === 'session' && !header)
|
|
228
|
+
header = event.payload;
|
|
229
|
+
events.push(event);
|
|
230
|
+
if (events.length > MAX_HARNESS_EVENTS) {
|
|
231
|
+
throw usageError(`The session log exceeds the ${MAX_HARNESS_EVENTS} event limit.`, 'HARNESS_SESSION_TOO_MANY_EVENTS');
|
|
232
|
+
}
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
// Tolerate a writer that emits the header as a leading untyped object.
|
|
236
|
+
const record = asRecord(JSON.parse(line));
|
|
237
|
+
if (record && !header)
|
|
238
|
+
header = record;
|
|
239
|
+
}
|
|
240
|
+
if (events.length === 0) {
|
|
241
|
+
throw usageError('The session log contains no recognizable Harness session events.', 'HARNESS_SESSION_EMPTY');
|
|
242
|
+
}
|
|
243
|
+
const timestamps = events
|
|
244
|
+
.map((event) => event.timestampMs)
|
|
245
|
+
.filter((value) => value !== undefined);
|
|
246
|
+
// Harness events carry no per-event timestamp; only the header records when
|
|
247
|
+
// the session began. Anchor synthetic times there so spans land at the real
|
|
248
|
+
// wall-clock moment even though their ordering is all that is meaningful.
|
|
249
|
+
const syntheticTimestamps = timestamps.length === 0;
|
|
250
|
+
const headerStartMs = toEpochMs(header?.createdAt ?? header?.startedAt);
|
|
251
|
+
const sessionStartMs = syntheticTimestamps
|
|
252
|
+
? (headerStartMs ?? 0)
|
|
253
|
+
: Math.min(...timestamps, headerStartMs ?? Number.POSITIVE_INFINITY);
|
|
254
|
+
let syntheticCursor = 0;
|
|
255
|
+
const timeOf = (event) => {
|
|
256
|
+
if (event.timestampMs !== undefined)
|
|
257
|
+
return event.timestampMs;
|
|
258
|
+
syntheticCursor += FALLBACK_SPAN_STEP_MS;
|
|
259
|
+
return sessionStartMs + syntheticCursor;
|
|
260
|
+
};
|
|
261
|
+
const sessionId = firstString(header ?? {}, ['id', 'sessionId']) ?? 'harness-session';
|
|
262
|
+
const traceId = Buffer.from(sessionId).toString('hex').padEnd(32, '0').slice(0, 32);
|
|
263
|
+
const rootSpanId = hex(1, 16);
|
|
264
|
+
const children = [];
|
|
265
|
+
const pendingToolCalls = new Map();
|
|
266
|
+
let firstUserMessage;
|
|
267
|
+
let lastAssistantMessage;
|
|
268
|
+
let unpairedToolCalls = 0;
|
|
269
|
+
let sequence = 1;
|
|
270
|
+
let lastEventMs = sessionStartMs;
|
|
271
|
+
const nextSpanId = () => {
|
|
272
|
+
sequence += 1;
|
|
273
|
+
return hex(sequence, 16);
|
|
274
|
+
};
|
|
275
|
+
for (const event of events) {
|
|
276
|
+
const at = timeOf(event);
|
|
277
|
+
lastEventMs = Math.max(lastEventMs, at);
|
|
278
|
+
if (event.type === 'user/message') {
|
|
279
|
+
if (!isRealUserMessage(event.payload))
|
|
280
|
+
continue;
|
|
281
|
+
const text = messageText(event.payload.message ?? event.payload);
|
|
282
|
+
if (firstUserMessage === undefined && text !== '')
|
|
283
|
+
firstUserMessage = text;
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
if (event.type === 'assistant/message') {
|
|
287
|
+
const text = messageText(event.payload.message ?? event.payload);
|
|
288
|
+
if (text !== '')
|
|
289
|
+
lastAssistantMessage = text;
|
|
290
|
+
children.push({
|
|
291
|
+
spanId: nextSpanId(),
|
|
292
|
+
parentSpanId: rootSpanId,
|
|
293
|
+
name: 'llm.respond',
|
|
294
|
+
kind: 1,
|
|
295
|
+
openInferenceKind: 'LLM',
|
|
296
|
+
startMs: at,
|
|
297
|
+
endMs: at + FALLBACK_SPAN_STEP_MS,
|
|
298
|
+
input: firstUserMessage ?? '',
|
|
299
|
+
output: text,
|
|
300
|
+
failed: event.payload.interrupted === true,
|
|
301
|
+
});
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
if (event.type === 'tool/call') {
|
|
305
|
+
const callId = toolCallId(event.payload) ?? firstString(event.payload, ['id']);
|
|
306
|
+
const name = firstString(event.payload, ['name', 'toolName']) ?? 'tool';
|
|
307
|
+
const args = typeof event.payload.arguments === 'string'
|
|
308
|
+
? event.payload.arguments
|
|
309
|
+
: JSON.stringify(event.payload.arguments ?? {});
|
|
310
|
+
if (callId === undefined) {
|
|
311
|
+
unpairedToolCalls += 1;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
pendingToolCalls.set(callId, { name, args, startMs: at });
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (event.type === 'tool/result') {
|
|
318
|
+
const callId = toolCallId(event.payload);
|
|
319
|
+
const pending = callId === undefined ? undefined : pendingToolCalls.get(callId);
|
|
320
|
+
if (callId !== undefined)
|
|
321
|
+
pendingToolCalls.delete(callId);
|
|
322
|
+
if (!pending) {
|
|
323
|
+
unpairedToolCalls += 1;
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
children.push({
|
|
327
|
+
spanId: nextSpanId(),
|
|
328
|
+
parentSpanId: rootSpanId,
|
|
329
|
+
name: `tool.${pending.name}`,
|
|
330
|
+
kind: 3,
|
|
331
|
+
openInferenceKind: 'TOOL',
|
|
332
|
+
startMs: pending.startMs,
|
|
333
|
+
endMs: at,
|
|
334
|
+
input: pending.args,
|
|
335
|
+
output: messageText(event.payload.message ?? event.payload),
|
|
336
|
+
toolName: pending.name,
|
|
337
|
+
failed: toolResultFailed(event.payload),
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// A call that never produced a result is still evidence about the trajectory.
|
|
342
|
+
for (const [, pending] of pendingToolCalls) {
|
|
343
|
+
unpairedToolCalls += 1;
|
|
344
|
+
children.push({
|
|
345
|
+
spanId: nextSpanId(),
|
|
346
|
+
parentSpanId: rootSpanId,
|
|
347
|
+
name: `tool.${pending.name}`,
|
|
348
|
+
kind: 3,
|
|
349
|
+
openInferenceKind: 'TOOL',
|
|
350
|
+
startMs: pending.startMs,
|
|
351
|
+
endMs: pending.startMs + FALLBACK_SPAN_STEP_MS,
|
|
352
|
+
input: pending.args,
|
|
353
|
+
output: '',
|
|
354
|
+
toolName: pending.name,
|
|
355
|
+
failed: true,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
children.sort((left, right) => left.startMs - right.startMs);
|
|
359
|
+
const root = {
|
|
360
|
+
spanId: rootSpanId,
|
|
361
|
+
name: 'agent.run',
|
|
362
|
+
kind: 1,
|
|
363
|
+
openInferenceKind: 'AGENT',
|
|
364
|
+
startMs: sessionStartMs,
|
|
365
|
+
endMs: Math.max(lastEventMs, sessionStartMs + FALLBACK_SPAN_STEP_MS),
|
|
366
|
+
input: firstUserMessage ?? '',
|
|
367
|
+
output: lastAssistantMessage ?? '',
|
|
368
|
+
failed: false,
|
|
369
|
+
};
|
|
370
|
+
const serviceName = input.serviceName ??
|
|
371
|
+
firstString(header ?? {}, ['serviceName', 'agentPreset']) ??
|
|
372
|
+
'deepseek-harness';
|
|
373
|
+
const skippedSubagentSessions = events.filter((event) => event.type === 'subagent/start' || event.type === 'subagent/end').length;
|
|
374
|
+
const artifact = {
|
|
375
|
+
trace: {
|
|
376
|
+
resourceSpans: [
|
|
377
|
+
{
|
|
378
|
+
resource: {
|
|
379
|
+
attributes: [
|
|
380
|
+
attribute('service.name', serviceName),
|
|
381
|
+
attribute('deepseek.harness.session.id', sessionId),
|
|
382
|
+
attribute('deepseek.harness.schema', SUPPORTED_SCHEMA),
|
|
383
|
+
],
|
|
384
|
+
},
|
|
385
|
+
scopeSpans: [
|
|
386
|
+
{
|
|
387
|
+
scope: { name: 'deepseek.harness.session', version: SUPPORTED_SCHEMA },
|
|
388
|
+
spans: [root, ...children].map((draft) => toOtlpSpan(draft, traceId)),
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
return {
|
|
396
|
+
artifact,
|
|
397
|
+
serviceName,
|
|
398
|
+
input: firstUserMessage,
|
|
399
|
+
output: lastAssistantMessage,
|
|
400
|
+
stats: {
|
|
401
|
+
schema: SUPPORTED_SCHEMA,
|
|
402
|
+
events: events.length,
|
|
403
|
+
spans: children.length + 1,
|
|
404
|
+
llmSpans: children.filter((child) => child.openInferenceKind === 'LLM').length,
|
|
405
|
+
toolSpans: children.filter((child) => child.openInferenceKind === 'TOOL').length,
|
|
406
|
+
unpairedToolCalls,
|
|
407
|
+
skippedSubagentSessions,
|
|
408
|
+
syntheticTimestamps,
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=deepseek-harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek-harness.js","sourceRoot":"","sources":["../../src/trace/deepseek-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAEtC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE9D,MAAM,qBAAqB,GAAG,QAAU,CAAC;AACzC,yEAAyE;AACzE,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAChC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAgCnC,SAAS,UAAU,CAAC,OAAe,EAAE,IAAY,EAAE,KAAe;IAChE,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAoB;QACvB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB,EAAE,IAAuB;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;IACrE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB,EAAE,IAAuB;IAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,MAAM,UAAU,CACd,2JAA2J,EAC3J,4BAA4B,CAC7B,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,UAAkB;IACjD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,UAAU,CACd,oBAAoB,UAAU,uDAAuD,EACrF,8BAA8B,EAC9B,KAAK,CACN,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC;IAC3E,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC;QACjF,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;aAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC;QACjE,MAAM,IAAI,GACR,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YAClC,CAAC,CAAC,MAAM,CAAC,SAAS;YAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;aAChC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;aAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,OAAmB;IACrC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACtF,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;YACnF,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AACjF,SAAS,gBAAgB,CAAC,OAAmB;IAC3C,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,OAAmB;IAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,CAAC;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,KAAa;IAC3C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa;IACvC,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAgBD,SAAS,UAAU,CAAC,KAAgB,EAAE,OAAe;IACnD,MAAM,UAAU,GAAiB;QAC/B,SAAS,CAAC,yBAAyB,EAAE,KAAK,CAAC,iBAAiB,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC;QACrC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;KACxC,CAAC;IACF,OAAO;QACL,OAAO;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,QAAQ,EAAE;QACzF,eAAe,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,QAAQ,EAAE;QACrF,UAAU;QACV,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KACvC,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,qBAAqB,CAAC,KAA6B;IACjE,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,MAA8B,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,yEAAyE;YACzE,wEAAwE;YACxE,uDAAuD;YACvD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM;gBAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,MAAM,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;gBACvC,MAAM,UAAU,CACd,+BAA+B,kBAAkB,eAAe,EAChE,iCAAiC,CAClC,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QACD,uEAAuE;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;QACrD,IAAI,MAAM,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,MAAM,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,UAAU,CACd,kEAAkE,EAClE,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,MAAM;SACtB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;SACjC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC3D,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,IAAI,MAAM,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,mBAAmB;QACxC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEvE,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAU,EAAE;QAC7C,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,WAAW,CAAC;QAC9D,eAAe,IAAI,qBAAqB,CAAC;QACzC,OAAO,cAAc,GAAG,eAAe,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,iBAAiB,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2D,CAAC;IAC5F,IAAI,gBAAoC,CAAC;IACzC,IAAI,oBAAwC,CAAC;IAC7C,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,WAAW,GAAG,cAAc,CAAC;IAEjC,MAAM,UAAU,GAAG,GAAW,EAAE;QAC9B,QAAQ,IAAI,CAAC,CAAC;QACd,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAExC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,gBAAgB,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;gBAAE,gBAAgB,GAAG,IAAI,CAAC;YAC3E,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,IAAI,KAAK,EAAE;gBAAE,oBAAoB,GAAG,IAAI,CAAC;YAC7C,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,UAAU,EAAE;gBACpB,YAAY,EAAE,UAAU;gBACxB,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,CAAC;gBACP,iBAAiB,EAAE,KAAK;gBACxB,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,EAAE,GAAG,qBAAqB;gBACjC,KAAK,EAAE,gBAAgB,IAAI,EAAE;gBAC7B,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI;aAC3C,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC;YACxE,MAAM,IAAI,GACR,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ;gBACzC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS;gBACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACpD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,iBAAiB,IAAI,CAAC,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChF,IAAI,MAAM,KAAK,SAAS;gBAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,iBAAiB,IAAI,CAAC,CAAC;gBACvB,SAAS;YACX,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,UAAU,EAAE;gBACpB,YAAY,EAAE,UAAU;gBACxB,IAAI,EAAE,QAAQ,OAAO,CAAC,IAAI,EAAE;gBAC5B,IAAI,EAAE,CAAC;gBACP,iBAAiB,EAAE,MAAM;gBACzB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,OAAO,CAAC,IAAI;gBACnB,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;gBAC3D,QAAQ,EAAE,OAAO,CAAC,IAAI;gBACtB,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,gBAAgB,EAAE,CAAC;QAC3C,iBAAiB,IAAI,CAAC,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,MAAM,EAAE,UAAU,EAAE;YACpB,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,QAAQ,OAAO,CAAC,IAAI,EAAE;YAC5B,IAAI,EAAE,CAAC;YACP,iBAAiB,EAAE,MAAM;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,OAAO,GAAG,qBAAqB;YAC9C,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,IAAI,GAAc;QACtB,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,CAAC;QACP,iBAAiB,EAAE,OAAO;QAC1B,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,GAAG,qBAAqB,CAAC;QACpE,KAAK,EAAE,gBAAgB,IAAI,EAAE;QAC7B,MAAM,EAAE,oBAAoB,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK;KACd,CAAC;IAEF,MAAM,WAAW,GACf,KAAK,CAAC,WAAW;QACjB,WAAW,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACzD,kBAAkB,CAAC;IAErB,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAC5E,CAAC,MAAM,CAAC;IAET,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE;YACL,aAAa,EAAE;gBACb;oBACE,QAAQ,EAAE;wBACR,UAAU,EAAE;4BACV,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC;4BACtC,SAAS,CAAC,6BAA6B,EAAE,SAAS,CAAC;4BACnD,SAAS,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;yBACvD;qBACF;oBACD,UAAU,EAAE;wBACV;4BACE,KAAK,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,gBAAgB,EAAE;4BACtE,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;yBACtE;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,WAAW;QACX,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE;YACL,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC1B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,CAAC,MAAM;YAC9E,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,KAAK,MAAM,CAAC,CAAC,MAAM;YAChF,iBAAiB;YACjB,uBAAuB;YACvB,mBAAmB;SACpB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HarnessTraceConversion } from './deepseek-harness.js';
|
|
2
|
+
export type AgentTraceImportInput = {
|
|
3
|
+
template: unknown;
|
|
4
|
+
conversion: HarnessTraceConversion;
|
|
5
|
+
/** Overrides the template's `configuration.evaluationName`. */
|
|
6
|
+
evaluationName?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function buildAgentTraceInput(input: AgentTraceImportInput): Record<string, unknown>;
|
|
9
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/trace/import.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AASpE,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,sBAAsB,CAAC;IACnC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgC1F"}
|