@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.
Files changed (54) hide show
  1. package/README.md +242 -0
  2. package/dist/index.d.ts +11 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +11 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/internal/trace-v2-utils.d.ts +10 -0
  7. package/dist/internal/trace-v2-utils.d.ts.map +1 -0
  8. package/dist/internal/trace-v2-utils.js +65 -0
  9. package/dist/internal/trace-v2-utils.js.map +1 -0
  10. package/dist/trace/append-execution-event.d.ts +5 -0
  11. package/dist/trace/append-execution-event.d.ts.map +1 -0
  12. package/dist/trace/append-execution-event.js +6 -0
  13. package/dist/trace/append-execution-event.js.map +1 -0
  14. package/dist/trace/append-trace-event.d.ts +5 -0
  15. package/dist/trace/append-trace-event.d.ts.map +1 -0
  16. package/dist/trace/append-trace-event.js +6 -0
  17. package/dist/trace/append-trace-event.js.map +1 -0
  18. package/dist/trace/create-empty-execution-trace.d.ts +10 -0
  19. package/dist/trace/create-empty-execution-trace.d.ts.map +1 -0
  20. package/dist/trace/create-empty-execution-trace.js +133 -0
  21. package/dist/trace/create-empty-execution-trace.js.map +1 -0
  22. package/dist/trace/create-execution-trace.d.ts +5 -0
  23. package/dist/trace/create-execution-trace.d.ts.map +1 -0
  24. package/dist/trace/create-execution-trace.js +53 -0
  25. package/dist/trace/create-execution-trace.js.map +1 -0
  26. package/dist/trace/derive-graph-status.d.ts +4 -0
  27. package/dist/trace/derive-graph-status.d.ts.map +1 -0
  28. package/dist/trace/derive-graph-status.js +59 -0
  29. package/dist/trace/derive-graph-status.js.map +1 -0
  30. package/dist/trace/summarize-execution-trace.d.ts +3 -0
  31. package/dist/trace/summarize-execution-trace.d.ts.map +1 -0
  32. package/dist/trace/summarize-execution-trace.js +60 -0
  33. package/dist/trace/summarize-execution-trace.js.map +1 -0
  34. package/dist/validators/validate-execution-trace-v1.d.ts +4 -0
  35. package/dist/validators/validate-execution-trace-v1.d.ts.map +1 -0
  36. package/dist/validators/validate-execution-trace-v1.js +155 -0
  37. package/dist/validators/validate-execution-trace-v1.js.map +1 -0
  38. package/dist/validators/validate-execution-trace-v2-structural.d.ts +3 -0
  39. package/dist/validators/validate-execution-trace-v2-structural.d.ts.map +1 -0
  40. package/dist/validators/validate-execution-trace-v2-structural.js +215 -0
  41. package/dist/validators/validate-execution-trace-v2-structural.js.map +1 -0
  42. package/dist/validators/validate-execution-trace-v2.d.ts +6 -0
  43. package/dist/validators/validate-execution-trace-v2.d.ts.map +1 -0
  44. package/dist/validators/validate-execution-trace-v2.js +40 -0
  45. package/dist/validators/validate-execution-trace-v2.js.map +1 -0
  46. package/dist/validators/validate-execution-trace.d.ts +7 -0
  47. package/dist/validators/validate-execution-trace.d.ts.map +1 -0
  48. package/dist/validators/validate-execution-trace.js +31 -0
  49. package/dist/validators/validate-execution-trace.js.map +1 -0
  50. package/dist/validators/validate-trace-against-plan.d.ts +4 -0
  51. package/dist/validators/validate-trace-against-plan.d.ts.map +1 -0
  52. package/dist/validators/validate-trace-against-plan.js +200 -0
  53. package/dist/validators/validate-trace-against-plan.js.map +1 -0
  54. 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":"AAIA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,UAAU,iBAAiB,CAAC,KAA4B;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE9E,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAA4B,EAC5B,MAAc;IAEd,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAErD,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO;SAC5B,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;SACrC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ExecutionTotals, GraphExecutionTraceV2 } from "@x12i/graphenix-executable-contracts";
2
+ export declare function summarizeExecutionTrace(trace: GraphExecutionTraceV2): ExecutionTotals;
3
+ //# sourceMappingURL=summarize-execution-trace.d.ts.map
@@ -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,3 @@
1
+ import type { TraceValidationResult } from "@x12i/graphenix-executable-contracts";
2
+ export declare function validateExecutionTraceV2Structural(trace: unknown): TraceValidationResult;
3
+ //# sourceMappingURL=validate-execution-trace-v2-structural.d.ts.map
@@ -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"}