@wix/evalforge-evaluator 0.6.0 → 0.7.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/build/index.mjs CHANGED
@@ -32,21 +32,38 @@ function loadConfig() {
32
32
  aiGatewayHeaders[key] = value;
33
33
  }
34
34
  }
35
+ const tracePushUrl = process.env.TRACE_PUSH_URL;
36
+ const routeHeader = process.env.EVAL_ROUTE_HEADER;
35
37
  return {
36
38
  serverUrl,
37
39
  apiPrefix,
38
40
  aiGatewayUrl,
39
41
  aiGatewayHeaders,
40
- evaluationsDir
42
+ evaluationsDir,
43
+ tracePushUrl,
44
+ routeHeader
41
45
  };
42
46
  }
43
47
 
44
48
  // src/api-client.ts
45
- function createApiClient(serverUrl, apiPrefix = "") {
49
+ function createApiClient(serverUrl, options = "") {
50
+ const opts = typeof options === "string" ? { apiPrefix: options } : options;
51
+ const apiPrefix = opts.apiPrefix ?? "";
52
+ const routeHeader = opts.routeHeader;
53
+ function buildHeaders(additionalHeaders) {
54
+ const headers = { ...additionalHeaders };
55
+ if (routeHeader) {
56
+ headers["x-wix-route"] = routeHeader;
57
+ }
58
+ return headers;
59
+ }
46
60
  async function fetchJson(path9) {
47
61
  const url = `${serverUrl}${apiPrefix}${path9}`;
48
62
  console.error(`[API] GET ${url}`);
49
- const response = await fetch(url);
63
+ const headers = buildHeaders();
64
+ const response = await fetch(url, {
65
+ headers: Object.keys(headers).length > 0 ? headers : void 0
66
+ });
50
67
  if (!response.ok) {
51
68
  const errorText = await response.text();
52
69
  throw new Error(
@@ -60,7 +77,7 @@ function createApiClient(serverUrl, apiPrefix = "") {
60
77
  console.error(`[API] POST ${url}`);
61
78
  const response = await fetch(url, {
62
79
  method: "POST",
63
- headers: { "Content-Type": "application/json" },
80
+ headers: buildHeaders({ "Content-Type": "application/json" }),
64
81
  body: JSON.stringify(body)
65
82
  });
66
83
  if (!response.ok) {
@@ -73,7 +90,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
73
90
  async function deleteRequest(path9) {
74
91
  const url = `${serverUrl}${apiPrefix}${path9}`;
75
92
  console.error(`[API] DELETE ${url}`);
76
- const response = await fetch(url, { method: "DELETE" });
93
+ const headers = buildHeaders();
94
+ const response = await fetch(url, {
95
+ method: "DELETE",
96
+ headers: Object.keys(headers).length > 0 ? headers : void 0
97
+ });
77
98
  if (!response.ok) {
78
99
  const errorText = await response.text();
79
100
  throw new Error(
@@ -86,7 +107,7 @@ function createApiClient(serverUrl, apiPrefix = "") {
86
107
  console.error(`[API] PUT ${url}`);
87
108
  const response = await fetch(url, {
88
109
  method: "PUT",
89
- headers: { "Content-Type": "application/json" },
110
+ headers: buildHeaders({ "Content-Type": "application/json" }),
90
111
  body: JSON.stringify(body)
91
112
  });
92
113
  if (!response.ok) {
@@ -6059,8 +6080,36 @@ import { randomUUID } from "crypto";
6059
6080
  import { mkdir as mkdir2, writeFile } from "fs/promises";
6060
6081
  import { join as join2 } from "path";
6061
6082
  var DEFAULT_MODEL = "claude-sonnet-4-20250514";
6062
- function emitTraceEvent(event) {
6083
+ function emitTraceEvent(event, tracePushUrl, routeHeader) {
6063
6084
  console.log(`${TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
6085
+ if (tracePushUrl) {
6086
+ pushTraceEvent(tracePushUrl, event, routeHeader).catch((err) => {
6087
+ console.error("[Trace Push] Failed to push trace event:", err);
6088
+ });
6089
+ }
6090
+ }
6091
+ async function pushTraceEvent(url, event, routeHeader) {
6092
+ try {
6093
+ const headers = {
6094
+ "Content-Type": "application/json"
6095
+ };
6096
+ if (routeHeader) {
6097
+ headers["x-wix-route"] = routeHeader;
6098
+ }
6099
+ const response = await fetch(url, {
6100
+ method: "POST",
6101
+ headers,
6102
+ body: JSON.stringify(event)
6103
+ });
6104
+ if (!response.ok) {
6105
+ const errorText = await response.text();
6106
+ console.error(
6107
+ `[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
6108
+ );
6109
+ }
6110
+ } catch (err) {
6111
+ console.error("[Trace Push] Network error:", err);
6112
+ }
6064
6113
  }
6065
6114
  function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
6066
6115
  let type = LiveTraceEventType.COMPLETION;
@@ -6218,7 +6267,11 @@ async function executeWithClaudeCode(skill, scenario, options) {
6218
6267
  false
6219
6268
  // Not complete yet
6220
6269
  );
6221
- emitTraceEvent(traceEvent);
6270
+ emitTraceEvent(
6271
+ traceEvent,
6272
+ traceContext.tracePushUrl,
6273
+ traceContext.routeHeader
6274
+ );
6222
6275
  }
6223
6276
  }
6224
6277
  console.log(
@@ -6227,18 +6280,22 @@ async function executeWithClaudeCode(skill, scenario, options) {
6227
6280
  "messages"
6228
6281
  );
6229
6282
  if (traceContext) {
6230
- emitTraceEvent({
6231
- evalRunId: traceContext.evalRunId,
6232
- scenarioId: traceContext.scenarioId,
6233
- scenarioName: traceContext.scenarioName,
6234
- targetId: traceContext.targetId,
6235
- targetName: traceContext.targetName,
6236
- stepNumber: traceStepNumber + 1,
6237
- type: LiveTraceEventType.COMPLETION,
6238
- outputPreview: "Scenario execution completed",
6239
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6240
- isComplete: true
6241
- });
6283
+ emitTraceEvent(
6284
+ {
6285
+ evalRunId: traceContext.evalRunId,
6286
+ scenarioId: traceContext.scenarioId,
6287
+ scenarioName: traceContext.scenarioName,
6288
+ targetId: traceContext.targetId,
6289
+ targetName: traceContext.targetName,
6290
+ stepNumber: traceStepNumber + 1,
6291
+ type: LiveTraceEventType.COMPLETION,
6292
+ outputPreview: "Scenario execution completed",
6293
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6294
+ isComplete: true
6295
+ },
6296
+ traceContext.tracePushUrl,
6297
+ traceContext.routeHeader
6298
+ );
6242
6299
  }
6243
6300
  const endTime = /* @__PURE__ */ new Date();
6244
6301
  const totalDurationMs = endTime.getTime() - startTime.getTime();
@@ -6456,7 +6513,9 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
6456
6513
  scenarioId: scenario.id,
6457
6514
  scenarioName: scenario.name,
6458
6515
  targetId: skill.id,
6459
- targetName: skill.name
6516
+ targetName: skill.name,
6517
+ tracePushUrl: config.tracePushUrl,
6518
+ routeHeader: config.routeHeader
6460
6519
  }
6461
6520
  });
6462
6521
  const completedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -6569,9 +6628,13 @@ async function runEvaluation(projectId2, evalRunId2) {
6569
6628
  serverUrl: config.serverUrl,
6570
6629
  aiGatewayUrl: config.aiGatewayUrl,
6571
6630
  evaluationsDir: config.evaluationsDir,
6572
- hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
6631
+ hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
6632
+ hasRouteHeader: !!config.routeHeader
6633
+ });
6634
+ const api = createApiClient(config.serverUrl, {
6635
+ apiPrefix: config.apiPrefix,
6636
+ routeHeader: config.routeHeader
6573
6637
  });
6574
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6575
6638
  console.error(
6576
6639
  "[DEBUG-H2] fetchEvaluationData START",
6577
6640
  JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
@@ -6655,7 +6718,10 @@ runEvaluation(projectId, evalRunId).then(() => {
6655
6718
  console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
6656
6719
  try {
6657
6720
  const config = loadConfig();
6658
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6721
+ const api = createApiClient(config.serverUrl, {
6722
+ apiPrefix: config.apiPrefix,
6723
+ routeHeader: config.routeHeader
6724
+ });
6659
6725
  await api.updateEvalRun(projectId, evalRunId, {
6660
6726
  status: EvalStatus.FAILED,
6661
6727
  completedAt: (/* @__PURE__ */ new Date()).toISOString()