@x12i/graphenix-trace-format 1.0.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/README.md +242 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/trace-v2-utils.d.ts +10 -0
- package/dist/internal/trace-v2-utils.d.ts.map +1 -0
- package/dist/internal/trace-v2-utils.js +65 -0
- package/dist/internal/trace-v2-utils.js.map +1 -0
- package/dist/trace/append-execution-event.d.ts +5 -0
- package/dist/trace/append-execution-event.d.ts.map +1 -0
- package/dist/trace/append-execution-event.js +6 -0
- package/dist/trace/append-execution-event.js.map +1 -0
- package/dist/trace/append-trace-event.d.ts +5 -0
- package/dist/trace/append-trace-event.d.ts.map +1 -0
- package/dist/trace/append-trace-event.js +6 -0
- package/dist/trace/append-trace-event.js.map +1 -0
- package/dist/trace/create-empty-execution-trace.d.ts +10 -0
- package/dist/trace/create-empty-execution-trace.d.ts.map +1 -0
- package/dist/trace/create-empty-execution-trace.js +133 -0
- package/dist/trace/create-empty-execution-trace.js.map +1 -0
- package/dist/trace/create-execution-trace.d.ts +5 -0
- package/dist/trace/create-execution-trace.d.ts.map +1 -0
- package/dist/trace/create-execution-trace.js +53 -0
- package/dist/trace/create-execution-trace.js.map +1 -0
- package/dist/trace/derive-graph-status.d.ts +4 -0
- package/dist/trace/derive-graph-status.d.ts.map +1 -0
- package/dist/trace/derive-graph-status.js +59 -0
- package/dist/trace/derive-graph-status.js.map +1 -0
- package/dist/trace/summarize-execution-trace.d.ts +3 -0
- package/dist/trace/summarize-execution-trace.d.ts.map +1 -0
- package/dist/trace/summarize-execution-trace.js +60 -0
- package/dist/trace/summarize-execution-trace.js.map +1 -0
- package/dist/validators/validate-execution-trace-v1.d.ts +4 -0
- package/dist/validators/validate-execution-trace-v1.d.ts.map +1 -0
- package/dist/validators/validate-execution-trace-v1.js +155 -0
- package/dist/validators/validate-execution-trace-v1.js.map +1 -0
- package/dist/validators/validate-execution-trace-v2-structural.d.ts +3 -0
- package/dist/validators/validate-execution-trace-v2-structural.d.ts.map +1 -0
- package/dist/validators/validate-execution-trace-v2-structural.js +215 -0
- package/dist/validators/validate-execution-trace-v2-structural.js.map +1 -0
- package/dist/validators/validate-execution-trace-v2.d.ts +6 -0
- package/dist/validators/validate-execution-trace-v2.d.ts.map +1 -0
- package/dist/validators/validate-execution-trace-v2.js +40 -0
- package/dist/validators/validate-execution-trace-v2.js.map +1 -0
- package/dist/validators/validate-execution-trace.d.ts +7 -0
- package/dist/validators/validate-execution-trace.d.ts.map +1 -0
- package/dist/validators/validate-execution-trace.js +31 -0
- package/dist/validators/validate-execution-trace.js.map +1 -0
- package/dist/validators/validate-trace-against-plan.d.ts +4 -0
- package/dist/validators/validate-trace-against-plan.d.ts.map +1 -0
- package/dist/validators/validate-trace-against-plan.js +200 -0
- package/dist/validators/validate-trace-against-plan.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { isTerminalNodeStatus, isTerminalUnitStatus } from "../internal/trace-v2-utils.js";
|
|
2
|
+
export function deriveGraphStatus(trace) {
|
|
3
|
+
const summary = trace.graphExecution;
|
|
4
|
+
const nodeStatuses = Object.values(trace.nodeExecutions).map((n) => n.status);
|
|
5
|
+
if (nodeStatuses.every((s) => s === "skipped")) {
|
|
6
|
+
return "skipped";
|
|
7
|
+
}
|
|
8
|
+
if (summary.failedNodeIds.length > 0) {
|
|
9
|
+
if (summary.completedNodeIds.length > 0) {
|
|
10
|
+
return "partial";
|
|
11
|
+
}
|
|
12
|
+
return "failed";
|
|
13
|
+
}
|
|
14
|
+
const allTerminal = nodeStatuses.every((s) => isTerminalNodeStatus(s));
|
|
15
|
+
if (allTerminal && summary.completedNodeIds.length === nodeStatuses.length) {
|
|
16
|
+
return "completed";
|
|
17
|
+
}
|
|
18
|
+
if (allTerminal && summary.completedNodeIds.length > 0) {
|
|
19
|
+
return "partial";
|
|
20
|
+
}
|
|
21
|
+
const unitStatuses = Object.values(trace.unitExecutions).map((u) => u.status);
|
|
22
|
+
if (unitStatuses.some((s) => s === "running")) {
|
|
23
|
+
return "running";
|
|
24
|
+
}
|
|
25
|
+
if (trace.status === "cancelled") {
|
|
26
|
+
return "cancelled";
|
|
27
|
+
}
|
|
28
|
+
if (trace.status === "queued" || trace.status === "created") {
|
|
29
|
+
return trace.status;
|
|
30
|
+
}
|
|
31
|
+
return trace.status;
|
|
32
|
+
}
|
|
33
|
+
export function deriveNodeStatusFromUnits(trace, nodeId) {
|
|
34
|
+
const nodeTrace = trace.nodeExecutions[nodeId];
|
|
35
|
+
if (!nodeTrace)
|
|
36
|
+
return "pending";
|
|
37
|
+
if (nodeTrace.status === "skipped")
|
|
38
|
+
return "skipped";
|
|
39
|
+
const units = nodeTrace.unitIds
|
|
40
|
+
.map((id) => trace.unitExecutions[id])
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
if (units.length === 0) {
|
|
43
|
+
return nodeTrace.status;
|
|
44
|
+
}
|
|
45
|
+
if (units.some((u) => u.status === "failed")) {
|
|
46
|
+
return "failed";
|
|
47
|
+
}
|
|
48
|
+
if (units.every((u) => u.status === "skipped")) {
|
|
49
|
+
return "skipped";
|
|
50
|
+
}
|
|
51
|
+
if (units.every((u) => isTerminalUnitStatus(u.status))) {
|
|
52
|
+
return "completed";
|
|
53
|
+
}
|
|
54
|
+
if (units.some((u) => u.status === "running")) {
|
|
55
|
+
return "running";
|
|
56
|
+
}
|
|
57
|
+
return nodeTrace.status;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=derive-graph-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-graph-status.js","sourceRoot":"","sources":["../../src/trace/derive-graph-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize-execution-trace.d.ts","sourceRoot":"","sources":["../../src/trace/summarize-execution-trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,sCAAsC,CAAC;AAE9C,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,qBAAqB,GAC3B,eAAe,CAgEjB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function summarizeExecutionTrace(trace) {
|
|
2
|
+
const nodeExecutions = Object.values(trace.nodeExecutions);
|
|
3
|
+
const unitExecutions = Object.values(trace.unitExecutions);
|
|
4
|
+
const invocations = Object.values(trace.modelInvocations);
|
|
5
|
+
let inputTokens = 0;
|
|
6
|
+
let outputTokens = 0;
|
|
7
|
+
let reasoningTokens = 0;
|
|
8
|
+
let costUsd = 0;
|
|
9
|
+
let hasCost = false;
|
|
10
|
+
let hasUsage = false;
|
|
11
|
+
for (const unit of unitExecutions) {
|
|
12
|
+
if (unit.usage) {
|
|
13
|
+
hasUsage = true;
|
|
14
|
+
inputTokens += unit.usage.inputTokens ?? 0;
|
|
15
|
+
outputTokens += unit.usage.outputTokens ?? 0;
|
|
16
|
+
reasoningTokens += unit.usage.reasoningTokens ?? 0;
|
|
17
|
+
}
|
|
18
|
+
if (unit.cost && typeof unit.cost.costUsd === "number") {
|
|
19
|
+
hasCost = true;
|
|
20
|
+
costUsd += unit.cost.costUsd;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const invocation of invocations) {
|
|
24
|
+
if (invocation.usage) {
|
|
25
|
+
hasUsage = true;
|
|
26
|
+
inputTokens += invocation.usage.inputTokens ?? 0;
|
|
27
|
+
outputTokens += invocation.usage.outputTokens ?? 0;
|
|
28
|
+
reasoningTokens += invocation.usage.reasoningTokens ?? 0;
|
|
29
|
+
}
|
|
30
|
+
if (invocation.cost && typeof invocation.cost.costUsd === "number") {
|
|
31
|
+
hasCost = true;
|
|
32
|
+
costUsd += invocation.cost.costUsd;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const warnings = nodeExecutions.reduce((sum, n) => sum + (n.warnings?.length ?? 0), 0) +
|
|
36
|
+
unitExecutions.reduce((sum, u) => sum + (u.warnings?.length ?? 0), 0);
|
|
37
|
+
return {
|
|
38
|
+
durationMs: trace.graphExecution.graphDurationMs,
|
|
39
|
+
nodeCount: nodeExecutions.length,
|
|
40
|
+
completedNodeCount: trace.graphExecution.completedNodeIds.length,
|
|
41
|
+
failedNodeCount: trace.graphExecution.failedNodeIds.length,
|
|
42
|
+
skippedNodeCount: trace.graphExecution.skippedNodeIds.length,
|
|
43
|
+
unitCount: unitExecutions.length,
|
|
44
|
+
completedUnitCount: trace.graphExecution.completedUnitIds.length,
|
|
45
|
+
failedUnitCount: trace.graphExecution.failedUnitIds.length,
|
|
46
|
+
skippedUnitCount: trace.graphExecution.skippedUnitIds.length,
|
|
47
|
+
modelInvocationCount: invocations.length,
|
|
48
|
+
inputTokens: hasUsage ? inputTokens : undefined,
|
|
49
|
+
outputTokens: hasUsage ? outputTokens : undefined,
|
|
50
|
+
reasoningTokens: hasUsage ? reasoningTokens : undefined,
|
|
51
|
+
totalTokens: hasUsage
|
|
52
|
+
? inputTokens + outputTokens + reasoningTokens
|
|
53
|
+
: undefined,
|
|
54
|
+
costUsd: hasCost ? costUsd : undefined,
|
|
55
|
+
costStatus: hasCost ? "known" : "unknown",
|
|
56
|
+
warnings,
|
|
57
|
+
errors: trace.events.filter((e) => e.level === "error").length
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=summarize-execution-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize-execution-trace.js","sourceRoot":"","sources":["../../src/trace/summarize-execution-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExecutableGraphValidationResult } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import type { ResolvedNodeExecutionPlan } from "@x12i/graphenix-executable-contracts";
|
|
3
|
+
export declare function validateExecutionTraceV1(trace: unknown, planNodePlans?: Record<string, ResolvedNodeExecutionPlan>): ExecutableGraphValidationResult;
|
|
4
|
+
//# sourceMappingURL=validate-execution-trace-v1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v1.d.ts","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAK5F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AA2EtF,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,GACxD,+BAA+B,CAiOjC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { EXECUTION_TRACE_FORMAT } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import { execError, isRecord } from "@x12i/graphenix-executable-contracts";
|
|
3
|
+
function isOrderedByTimestamp(events) {
|
|
4
|
+
for (let index = 1; index < events.length; index += 1) {
|
|
5
|
+
const previous = Date.parse(events[index - 1].ts);
|
|
6
|
+
const current = Date.parse(events[index].ts);
|
|
7
|
+
if (Number.isNaN(previous) || Number.isNaN(current) || current < previous) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
function unitFallbackAllowed(unitTrace, allowedTriggers) {
|
|
14
|
+
if (!unitTrace.fallback?.applied) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
const trigger = unitTrace.fallback.trigger;
|
|
18
|
+
if (!trigger) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return allowedTriggers.includes(trigger);
|
|
22
|
+
}
|
|
23
|
+
function collectUnitUsage(nodeExecutions) {
|
|
24
|
+
let inputTokens = 0;
|
|
25
|
+
let outputTokens = 0;
|
|
26
|
+
let costUsd = 0;
|
|
27
|
+
let hasUsage = false;
|
|
28
|
+
let hasCost = false;
|
|
29
|
+
for (const nodeTrace of Object.values(nodeExecutions)) {
|
|
30
|
+
if (!isRecord(nodeTrace)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const units = nodeTrace.units;
|
|
34
|
+
if (isRecord(units)) {
|
|
35
|
+
for (const unitTrace of Object.values(units)) {
|
|
36
|
+
if (!isRecord(unitTrace)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const usage = unitTrace.usage;
|
|
40
|
+
if (isRecord(usage)) {
|
|
41
|
+
hasUsage = true;
|
|
42
|
+
inputTokens +=
|
|
43
|
+
typeof usage.inputTokens === "number" ? usage.inputTokens : 0;
|
|
44
|
+
outputTokens +=
|
|
45
|
+
typeof usage.outputTokens === "number" ? usage.outputTokens : 0;
|
|
46
|
+
}
|
|
47
|
+
const cost = unitTrace.cost;
|
|
48
|
+
if (isRecord(cost) && typeof cost.costUsd === "number") {
|
|
49
|
+
hasCost = true;
|
|
50
|
+
costUsd += cost.costUsd;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return { inputTokens, outputTokens, costUsd, hasUsage, hasCost };
|
|
56
|
+
}
|
|
57
|
+
export function validateExecutionTraceV1(trace, planNodePlans) {
|
|
58
|
+
const errors = [];
|
|
59
|
+
if (!isRecord(trace)) {
|
|
60
|
+
return {
|
|
61
|
+
valid: false,
|
|
62
|
+
errors: [
|
|
63
|
+
execError("EXECUTION_TRACE_INVALID", "Execution trace must be an object.", "")
|
|
64
|
+
]
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (trace.format !== EXECUTION_TRACE_FORMAT) {
|
|
68
|
+
errors.push(execError("EXECUTION_TRACE_FORMAT_INVALID", `format must be ${EXECUTION_TRACE_FORMAT}.`, "/format"));
|
|
69
|
+
}
|
|
70
|
+
if (typeof trace.traceId !== "string") {
|
|
71
|
+
errors.push(execError("EXECUTION_TRACE_ID_MISSING", "traceId is required.", "/traceId"));
|
|
72
|
+
}
|
|
73
|
+
if (typeof trace.jobId !== "string") {
|
|
74
|
+
errors.push(execError("EXECUTION_TRACE_JOB_ID_MISSING", "jobId is required.", "/jobId"));
|
|
75
|
+
}
|
|
76
|
+
const validStatuses = [
|
|
77
|
+
"queued",
|
|
78
|
+
"running",
|
|
79
|
+
"completed",
|
|
80
|
+
"failed",
|
|
81
|
+
"cancelled",
|
|
82
|
+
"partial"
|
|
83
|
+
];
|
|
84
|
+
if (typeof trace.status !== "string" || !validStatuses.includes(trace.status)) {
|
|
85
|
+
errors.push(execError("EXECUTION_TRACE_STATUS_INVALID", "status must be a valid execution status.", "/status"));
|
|
86
|
+
}
|
|
87
|
+
const source = trace.source;
|
|
88
|
+
if (!isRecord(source) || typeof source.graphId !== "string") {
|
|
89
|
+
errors.push(execError("EXECUTION_TRACE_SOURCE_MISSING", "source.graphId is required.", "/source"));
|
|
90
|
+
}
|
|
91
|
+
const plan = trace.plan;
|
|
92
|
+
if (!isRecord(plan) || typeof plan.planId !== "string") {
|
|
93
|
+
errors.push(execError("EXECUTION_TRACE_PLAN_REFERENCE_MISSING", "plan.planId is required.", "/plan"));
|
|
94
|
+
}
|
|
95
|
+
const events = trace.events;
|
|
96
|
+
if (!Array.isArray(events)) {
|
|
97
|
+
errors.push(execError("EXECUTION_TRACE_EVENTS_MISSING", "events must be an array.", "/events"));
|
|
98
|
+
}
|
|
99
|
+
else if (!isOrderedByTimestamp(events)) {
|
|
100
|
+
errors.push(execError("EXECUTION_TRACE_EVENTS_NOT_ORDERED", "events must be append-only and ordered by timestamp.", "/events"));
|
|
101
|
+
}
|
|
102
|
+
const nodeExecutions = trace.nodeExecutions;
|
|
103
|
+
if (!isRecord(nodeExecutions)) {
|
|
104
|
+
errors.push(execError("EXECUTION_TRACE_NODE_EXECUTIONS_MISSING", "nodeExecutions is required.", "/nodeExecutions"));
|
|
105
|
+
}
|
|
106
|
+
else if (planNodePlans) {
|
|
107
|
+
for (const [nodeId, nodeTrace] of Object.entries(nodeExecutions)) {
|
|
108
|
+
if (!isRecord(nodeTrace)) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const plannedNode = planNodePlans[nodeId];
|
|
112
|
+
if (!plannedNode) {
|
|
113
|
+
errors.push(execError("EXECUTION_TRACE_UNKNOWN_NODE", `nodeExecutions.${nodeId} is not present in executable plan.`, `/nodeExecutions/${nodeId}`));
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const units = nodeTrace.units;
|
|
117
|
+
if (!isRecord(units)) {
|
|
118
|
+
errors.push(execError("EXECUTION_TRACE_UNITS_MISSING", `nodeExecutions.${nodeId}.units is required.`, `/nodeExecutions/${nodeId}/units`));
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
for (const plannedUnit of plannedNode.executionUnits) {
|
|
122
|
+
const unitTrace = units[plannedUnit.unitId];
|
|
123
|
+
if (!isRecord(unitTrace)) {
|
|
124
|
+
errors.push(execError("EXECUTION_TRACE_UNKNOWN_UNIT", `nodeExecutions.${nodeId}.units must contain trace for planned unit ${plannedUnit.unitId}.`, `/nodeExecutions/${nodeId}/units/${plannedUnit.unitId}`));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (plannedNode.fallbackPolicy &&
|
|
128
|
+
!unitFallbackAllowed(unitTrace, plannedNode.fallbackPolicy.allowedTriggers)) {
|
|
129
|
+
errors.push(execError("EXECUTION_TRACE_UNIT_FALLBACK_NOT_ALLOWED", `Fallback on unit ${plannedUnit.unitId} is not allowed by executable plan policy.`, `/nodeExecutions/${nodeId}/units/${plannedUnit.unitId}/fallback`));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (isRecord(trace.totals) && isRecord(nodeExecutions)) {
|
|
135
|
+
const { inputTokens, outputTokens, costUsd, hasUsage, hasCost } = collectUnitUsage(nodeExecutions);
|
|
136
|
+
const totals = trace.totals;
|
|
137
|
+
if (hasUsage &&
|
|
138
|
+
typeof totals.inputTokens === "number" &&
|
|
139
|
+
totals.inputTokens !== inputTokens) {
|
|
140
|
+
errors.push(execError("EXECUTION_TRACE_TOTALS_MISMATCH", "totals.inputTokens does not match unit usage totals.", "/totals/inputTokens"));
|
|
141
|
+
}
|
|
142
|
+
if (hasUsage &&
|
|
143
|
+
typeof totals.outputTokens === "number" &&
|
|
144
|
+
totals.outputTokens !== outputTokens) {
|
|
145
|
+
errors.push(execError("EXECUTION_TRACE_TOTALS_MISMATCH", "totals.outputTokens does not match unit usage totals.", "/totals/outputTokens"));
|
|
146
|
+
}
|
|
147
|
+
if (hasCost &&
|
|
148
|
+
typeof totals.costUsd === "number" &&
|
|
149
|
+
Math.abs(totals.costUsd - costUsd) > 0.000001) {
|
|
150
|
+
errors.push(execError("EXECUTION_TRACE_TOTALS_MISMATCH", "totals.costUsd does not match unit cost totals.", "/totals/costUsd"));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return { valid: errors.length === 0, errors };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=validate-execution-trace-v1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v1.js","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v2-structural.d.ts","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v2-structural.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AA0PlF,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,OAAO,GACb,qBAAqB,CAuKvB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { EXECUTION_TRACE_FORMAT_V2 } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import { execError, isRecord } from "@x12i/graphenix-executable-contracts";
|
|
3
|
+
const FORBIDDEN_TRACE_FIELDS = [
|
|
4
|
+
"credentials",
|
|
5
|
+
"openrouterApiKey",
|
|
6
|
+
"providerResponse"
|
|
7
|
+
];
|
|
8
|
+
const TERMINAL_GRAPH_EVENTS = new Set([
|
|
9
|
+
"graph.completed",
|
|
10
|
+
"graph.failed",
|
|
11
|
+
"graph.cancelled"
|
|
12
|
+
]);
|
|
13
|
+
const EXECUTION_EVENT_TYPES = new Set([
|
|
14
|
+
"graph.started",
|
|
15
|
+
"gate.evaluated",
|
|
16
|
+
"node.started",
|
|
17
|
+
"node.completed",
|
|
18
|
+
"node.failed",
|
|
19
|
+
"node.skipped",
|
|
20
|
+
"unit.started",
|
|
21
|
+
"unit.completed",
|
|
22
|
+
"unit.failed",
|
|
23
|
+
"unit.skipped",
|
|
24
|
+
"model.resolved",
|
|
25
|
+
"model.invocation.started",
|
|
26
|
+
"model.invocation.completed",
|
|
27
|
+
"model.invocation.failed",
|
|
28
|
+
"fallback.applied",
|
|
29
|
+
"retry.attempted",
|
|
30
|
+
"memory.read",
|
|
31
|
+
"memory.write",
|
|
32
|
+
"finalOutput.produced",
|
|
33
|
+
"contract.validation.completed"
|
|
34
|
+
]);
|
|
35
|
+
function containsForbiddenFields(value, path, errors) {
|
|
36
|
+
if (!isRecord(value))
|
|
37
|
+
return;
|
|
38
|
+
for (const field of FORBIDDEN_TRACE_FIELDS) {
|
|
39
|
+
if (field in value) {
|
|
40
|
+
errors.push(execError("EXECUTION_TRACE_V2_FORBIDDEN_FIELD", `Execution trace must not contain ${field}.`, `${path}/${field}`));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (const [key, child] of Object.entries(value)) {
|
|
44
|
+
if (isRecord(child) || Array.isArray(child)) {
|
|
45
|
+
containsForbiddenFields(child, `${path}/${key}`, errors);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function validateEvents(trace, errors) {
|
|
50
|
+
const events = trace.events;
|
|
51
|
+
if (!Array.isArray(events))
|
|
52
|
+
return;
|
|
53
|
+
const seenSequences = new Set();
|
|
54
|
+
let lastSequence = -1;
|
|
55
|
+
let terminalIndex = -1;
|
|
56
|
+
const nodeIds = isRecord(trace.nodeExecutions)
|
|
57
|
+
? new Set(Object.keys(trace.nodeExecutions))
|
|
58
|
+
: new Set();
|
|
59
|
+
const unitIds = isRecord(trace.unitExecutions)
|
|
60
|
+
? new Set(Object.keys(trace.unitExecutions))
|
|
61
|
+
: new Set();
|
|
62
|
+
const gateIds = isRecord(trace.gateEvaluations)
|
|
63
|
+
? new Set(Object.keys(trace.gateEvaluations))
|
|
64
|
+
: new Set();
|
|
65
|
+
const invocationIds = isRecord(trace.modelInvocations)
|
|
66
|
+
? new Set(Object.keys(trace.modelInvocations))
|
|
67
|
+
: new Set();
|
|
68
|
+
for (const [index, event] of events.entries()) {
|
|
69
|
+
const path = `/events/${index}`;
|
|
70
|
+
if (!isRecord(event))
|
|
71
|
+
continue;
|
|
72
|
+
if (typeof event.sequence !== "number" || !Number.isInteger(event.sequence)) {
|
|
73
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_SEQUENCE_OUT_OF_ORDER", `Event ${index} must define integer sequence.`, `${path}/sequence`));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
if (seenSequences.has(event.sequence)) {
|
|
77
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_SEQUENCE_DUPLICATE", `Duplicate event sequence ${event.sequence}.`, `${path}/sequence`));
|
|
78
|
+
}
|
|
79
|
+
seenSequences.add(event.sequence);
|
|
80
|
+
if (event.sequence < lastSequence) {
|
|
81
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_SEQUENCE_OUT_OF_ORDER", `Event sequence ${event.sequence} is out of order.`, `${path}/sequence`));
|
|
82
|
+
}
|
|
83
|
+
lastSequence = event.sequence;
|
|
84
|
+
}
|
|
85
|
+
if (typeof event.nodeId === "string" && !nodeIds.has(event.nodeId)) {
|
|
86
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_UNKNOWN_NODE", `Event references unknown nodeId ${event.nodeId}.`, `${path}/nodeId`));
|
|
87
|
+
}
|
|
88
|
+
if (typeof event.unitId === "string" && !unitIds.has(event.unitId)) {
|
|
89
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_UNKNOWN_UNIT", `Event references unknown unitId ${event.unitId}.`, `${path}/unitId`));
|
|
90
|
+
}
|
|
91
|
+
if (typeof event.gateId === "string" && !gateIds.has(event.gateId)) {
|
|
92
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_UNKNOWN_GATE", `Event references unknown gateId ${event.gateId}.`, `${path}/gateId`));
|
|
93
|
+
}
|
|
94
|
+
if (typeof event.invocationId === "string" &&
|
|
95
|
+
!invocationIds.has(event.invocationId)) {
|
|
96
|
+
errors.push(execError("EXECUTION_TRACE_V2_UNKNOWN_INVOCATION", `Event references unknown invocationId ${event.invocationId}.`, `${path}/invocationId`));
|
|
97
|
+
}
|
|
98
|
+
if (typeof event.type === "string" && TERMINAL_GRAPH_EVENTS.has(event.type)) {
|
|
99
|
+
terminalIndex = index;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (terminalIndex >= 0) {
|
|
103
|
+
for (let index = terminalIndex + 1; index < events.length; index += 1) {
|
|
104
|
+
const event = events[index];
|
|
105
|
+
if (!isRecord(event))
|
|
106
|
+
continue;
|
|
107
|
+
const eventType = String(event.type ?? "");
|
|
108
|
+
if (EXECUTION_EVENT_TYPES.has(eventType) &&
|
|
109
|
+
eventType !== "diagnostic" &&
|
|
110
|
+
eventType !== "warning") {
|
|
111
|
+
errors.push(execError("EXECUTION_TRACE_V2_EVENT_AFTER_TERMINAL", `Event after terminal graph event must be diagnostic or warning.`, `/events/${index}`));
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function validateDataPolicy(trace, errors) {
|
|
118
|
+
const diagnostics = trace.diagnostics;
|
|
119
|
+
const policy = isRecord(diagnostics) ? diagnostics.dataPolicy : undefined;
|
|
120
|
+
if (!isRecord(policy))
|
|
121
|
+
return;
|
|
122
|
+
const maxPreview = typeof policy.maxPreviewChars === "number" ? policy.maxPreviewChars : 512;
|
|
123
|
+
if (policy.storePrompts === false || policy.storeProviderResponses === false) {
|
|
124
|
+
const invocations = isRecord(trace.modelInvocations)
|
|
125
|
+
? trace.modelInvocations
|
|
126
|
+
: {};
|
|
127
|
+
for (const [id, invocation] of Object.entries(invocations)) {
|
|
128
|
+
if (!isRecord(invocation))
|
|
129
|
+
continue;
|
|
130
|
+
const request = invocation.request;
|
|
131
|
+
const response = invocation.response;
|
|
132
|
+
if (policy.storePrompts === false &&
|
|
133
|
+
isRecord(request) &&
|
|
134
|
+
typeof request.preview === "string" &&
|
|
135
|
+
request.preview.length > maxPreview &&
|
|
136
|
+
!request.valueRef &&
|
|
137
|
+
!request.hash) {
|
|
138
|
+
errors.push(execError("EXECUTION_TRACE_V2_DATA_POLICY_VIOLATION", `Model invocation ${id} stores full prompt against data policy.`, `/modelInvocations/${id}/request/preview`));
|
|
139
|
+
}
|
|
140
|
+
if (policy.storeProviderResponses === false &&
|
|
141
|
+
isRecord(response) &&
|
|
142
|
+
typeof response.preview === "string" &&
|
|
143
|
+
response.preview.length > maxPreview &&
|
|
144
|
+
!response.valueRef &&
|
|
145
|
+
!response.hash) {
|
|
146
|
+
errors.push(execError("EXECUTION_TRACE_V2_DATA_POLICY_VIOLATION", `Model invocation ${id} stores full provider response against data policy.`, `/modelInvocations/${id}/response/preview`));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function validateExecutionTraceV2Structural(trace) {
|
|
152
|
+
const errors = [];
|
|
153
|
+
if (!isRecord(trace)) {
|
|
154
|
+
return {
|
|
155
|
+
valid: false,
|
|
156
|
+
errors: [
|
|
157
|
+
execError("EXECUTION_TRACE_V2_INVALID", "Execution trace must be an object.", "")
|
|
158
|
+
]
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
if (trace.format !== EXECUTION_TRACE_FORMAT_V2) {
|
|
162
|
+
errors.push(execError("EXECUTION_TRACE_V2_FORMAT_INVALID", `format must be ${EXECUTION_TRACE_FORMAT_V2}.`, "/format"));
|
|
163
|
+
}
|
|
164
|
+
if (typeof trace.traceId !== "string") {
|
|
165
|
+
errors.push(execError("EXECUTION_TRACE_ID_MISSING", "traceId is required.", "/traceId"));
|
|
166
|
+
}
|
|
167
|
+
if (typeof trace.jobId !== "string") {
|
|
168
|
+
errors.push(execError("EXECUTION_TRACE_JOB_ID_MISSING", "jobId is required.", "/jobId"));
|
|
169
|
+
}
|
|
170
|
+
const source = trace.source;
|
|
171
|
+
if (!isRecord(source) || typeof source.graphId !== "string") {
|
|
172
|
+
errors.push(execError("EXECUTION_TRACE_SOURCE_MISSING", "source.graphId is required.", "/source/graphId"));
|
|
173
|
+
}
|
|
174
|
+
else if (typeof source.graphHash !== "string") {
|
|
175
|
+
errors.push(execError("EXECUTION_TRACE_V2_SOURCE_MISMATCH", "source.graphHash is required.", "/source/graphHash"));
|
|
176
|
+
}
|
|
177
|
+
const plan = trace.plan;
|
|
178
|
+
if (!isRecord(plan) || typeof plan.planId !== "string") {
|
|
179
|
+
errors.push(execError("EXECUTION_TRACE_PLAN_REFERENCE_MISSING", "plan.planId is required.", "/plan/planId"));
|
|
180
|
+
}
|
|
181
|
+
else if (typeof plan.planHash !== "string") {
|
|
182
|
+
errors.push(execError("EXECUTION_TRACE_V2_PLAN_HASH_MISSING", "plan.planHash is required.", "/plan/planHash"));
|
|
183
|
+
}
|
|
184
|
+
const runtime = trace.runtime;
|
|
185
|
+
if (!isRecord(runtime) || typeof runtime.jobId !== "string") {
|
|
186
|
+
errors.push(execError("EXECUTION_TRACE_V2_RUNTIME_MISMATCH", "runtime.jobId is required.", "/runtime/jobId"));
|
|
187
|
+
}
|
|
188
|
+
else if (typeof trace.jobId === "string" &&
|
|
189
|
+
runtime.jobId !== trace.jobId) {
|
|
190
|
+
errors.push(execError("EXECUTION_TRACE_V2_RUNTIME_MISMATCH", "trace.jobId must match runtime.jobId.", "/jobId"));
|
|
191
|
+
}
|
|
192
|
+
if (!isRecord(trace.graphExecution)) {
|
|
193
|
+
errors.push(execError("EXECUTION_TRACE_V2_INVALID", "graphExecution is required.", "/graphExecution"));
|
|
194
|
+
}
|
|
195
|
+
if (!isRecord(trace.nodeExecutions)) {
|
|
196
|
+
errors.push(execError("EXECUTION_TRACE_NODE_EXECUTIONS_MISSING", "nodeExecutions is required.", "/nodeExecutions"));
|
|
197
|
+
}
|
|
198
|
+
if (!isRecord(trace.unitExecutions)) {
|
|
199
|
+
errors.push(execError("EXECUTION_TRACE_V2_INVALID", "unitExecutions is required.", "/unitExecutions"));
|
|
200
|
+
}
|
|
201
|
+
if (!isRecord(trace.gateEvaluations)) {
|
|
202
|
+
errors.push(execError("EXECUTION_TRACE_V2_INVALID", "gateEvaluations is required.", "/gateEvaluations"));
|
|
203
|
+
}
|
|
204
|
+
if (!isRecord(trace.modelInvocations)) {
|
|
205
|
+
errors.push(execError("EXECUTION_TRACE_V2_INVALID", "modelInvocations is required.", "/modelInvocations"));
|
|
206
|
+
}
|
|
207
|
+
if (!isRecord(trace.memory)) {
|
|
208
|
+
errors.push(execError("EXECUTION_TRACE_V2_INVALID", "memory is required.", "/memory"));
|
|
209
|
+
}
|
|
210
|
+
validateEvents(trace, errors);
|
|
211
|
+
validateDataPolicy(trace, errors);
|
|
212
|
+
containsForbiddenFields(trace, "", errors);
|
|
213
|
+
return { valid: errors.length === 0, errors };
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=validate-execution-trace-v2-structural.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v2-structural.js","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v2-structural.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ExecutableGraphPlanV2 } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import type { TraceValidationResult } from "@x12i/graphenix-executable-contracts";
|
|
3
|
+
export declare function validateTraceAgainstPlanOnly(trace: unknown, plan: ExecutableGraphPlanV2): TraceValidationResult;
|
|
4
|
+
export declare function validateExecutionTraceV2(trace: unknown, plan?: ExecutableGraphPlanV2): TraceValidationResult;
|
|
5
|
+
export declare function computeExpectedPlanHash(plan: ExecutableGraphPlanV2): string;
|
|
6
|
+
//# sourceMappingURL=validate-execution-trace-v2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v2.d.ts","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAMlF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,qBAAqB,GAC1B,qBAAqB,CAMvB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,qBAAqB,GAC3B,qBAAqB,CA+BvB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAE3E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { defaultHashFunction } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import { buildTracePlanRef } from "../internal/trace-v2-utils.js";
|
|
3
|
+
import { validateExecutionTraceV2Structural } from "./validate-execution-trace-v2-structural.js";
|
|
4
|
+
import { validateTraceAgainstPlan } from "./validate-trace-against-plan.js";
|
|
5
|
+
export function validateTraceAgainstPlanOnly(trace, plan) {
|
|
6
|
+
const structural = validateExecutionTraceV2Structural(trace);
|
|
7
|
+
if (!structural.valid) {
|
|
8
|
+
return structural;
|
|
9
|
+
}
|
|
10
|
+
return validateTraceAgainstPlan(trace, plan);
|
|
11
|
+
}
|
|
12
|
+
export function validateExecutionTraceV2(trace, plan) {
|
|
13
|
+
const structural = validateExecutionTraceV2Structural(trace);
|
|
14
|
+
if (!structural.valid) {
|
|
15
|
+
return structural;
|
|
16
|
+
}
|
|
17
|
+
if (plan) {
|
|
18
|
+
const expectedPlanRef = buildTracePlanRef(plan);
|
|
19
|
+
const errors = [...structural.errors];
|
|
20
|
+
if (typeof trace.plan?.planHash ===
|
|
21
|
+
"string" &&
|
|
22
|
+
trace.plan.planHash !==
|
|
23
|
+
expectedPlanRef.planHash) {
|
|
24
|
+
errors.push({
|
|
25
|
+
source: "graphenix.executable",
|
|
26
|
+
code: "EXECUTION_TRACE_V2_PLAN_MISMATCH",
|
|
27
|
+
message: "trace.plan.planHash does not match executable plan hash.",
|
|
28
|
+
path: "/plan/planHash"
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
const planResult = validateTraceAgainstPlan(trace, plan);
|
|
32
|
+
errors.push(...planResult.errors);
|
|
33
|
+
return { valid: errors.length === 0, errors };
|
|
34
|
+
}
|
|
35
|
+
return structural;
|
|
36
|
+
}
|
|
37
|
+
export function computeExpectedPlanHash(plan) {
|
|
38
|
+
return defaultHashFunction(plan);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=validate-execution-trace-v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace-v2.js","sourceRoot":"","sources":["../../src/validators/validate-execution-trace-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kCAAkC,EAAE,MAAM,6CAA6C,CAAC;AACjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,4BAA4B,CAC1C,KAAc,EACd,IAA2B;IAE3B,MAAM,UAAU,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAc,EACd,IAA4B;IAE5B,MAAM,UAAU,GAAG,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEtC,IACE,OAAQ,KAA0C,CAAC,IAAI,EAAE,QAAQ;YAC/D,QAAQ;YACT,KAAwC,CAAC,IAAI,CAAC,QAAQ;gBACrD,eAAe,CAAC,QAAQ,EAC1B,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,sBAAsB;gBAC9B,IAAI,EAAE,kCAAkC;gBACxC,OAAO,EAAE,0DAA0D;gBACnE,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAElC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAA2B;IACjE,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ExecutableGraphValidationResult } from "@x12i/graphenix-executable-contracts";
|
|
2
|
+
import type { ExecutableGraphPlanV2 } from "@x12i/graphenix-executable-contracts";
|
|
3
|
+
import type { GraphExecutionTraceV2 } from "@x12i/graphenix-executable-contracts";
|
|
4
|
+
import type { ResolvedNodeExecutionPlan } from "@x12i/graphenix-executable-contracts";
|
|
5
|
+
export declare function validateExecutionTrace(trace: unknown, planOrNodePlans?: ExecutableGraphPlanV2 | Record<string, ResolvedNodeExecutionPlan>): ExecutableGraphValidationResult;
|
|
6
|
+
export declare function assertExecutionTrace(trace: unknown, plan: ExecutableGraphPlanV2): asserts trace is GraphExecutionTraceV2;
|
|
7
|
+
//# sourceMappingURL=validate-execution-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-execution-trace.d.ts","sourceRoot":"","sources":["../../src/validators/validate-execution-trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAOtF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,eAAe,CAAC,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,GAClF,+BAA+B,CAgBjC;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAMxC"}
|