@wix/evalforge-evaluator 0.6.0 → 0.8.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,45 @@ 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;
37
+ const authToken = process.env.EVAL_AUTH_TOKEN;
35
38
  return {
36
39
  serverUrl,
37
40
  apiPrefix,
38
41
  aiGatewayUrl,
39
42
  aiGatewayHeaders,
40
- evaluationsDir
43
+ evaluationsDir,
44
+ tracePushUrl,
45
+ routeHeader,
46
+ authToken
41
47
  };
42
48
  }
43
49
 
44
50
  // src/api-client.ts
45
- function createApiClient(serverUrl, apiPrefix = "") {
51
+ function createApiClient(serverUrl, options = "") {
52
+ const opts = typeof options === "string" ? { apiPrefix: options } : options;
53
+ const apiPrefix = opts.apiPrefix ?? "";
54
+ const routeHeader = opts.routeHeader;
55
+ const authToken = opts.authToken;
56
+ const pathPrefix = authToken ? "/public" : "";
57
+ function buildHeaders(additionalHeaders) {
58
+ const headers = { ...additionalHeaders };
59
+ if (authToken) {
60
+ headers["Authorization"] = `Bearer ${authToken}`;
61
+ }
62
+ if (routeHeader) {
63
+ headers["x-wix-route"] = routeHeader;
64
+ }
65
+ return headers;
66
+ }
46
67
  async function fetchJson(path9) {
47
- const url = `${serverUrl}${apiPrefix}${path9}`;
68
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
48
69
  console.error(`[API] GET ${url}`);
49
- const response = await fetch(url);
70
+ const headers = buildHeaders();
71
+ const response = await fetch(url, {
72
+ headers: Object.keys(headers).length > 0 ? headers : void 0
73
+ });
50
74
  if (!response.ok) {
51
75
  const errorText = await response.text();
52
76
  throw new Error(
@@ -56,11 +80,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
56
80
  return response.json();
57
81
  }
58
82
  async function postJson(path9, body) {
59
- const url = `${serverUrl}${apiPrefix}${path9}`;
83
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
60
84
  console.error(`[API] POST ${url}`);
61
85
  const response = await fetch(url, {
62
86
  method: "POST",
63
- headers: { "Content-Type": "application/json" },
87
+ headers: buildHeaders({ "Content-Type": "application/json" }),
64
88
  body: JSON.stringify(body)
65
89
  });
66
90
  if (!response.ok) {
@@ -71,9 +95,13 @@ function createApiClient(serverUrl, apiPrefix = "") {
71
95
  }
72
96
  }
73
97
  async function deleteRequest(path9) {
74
- const url = `${serverUrl}${apiPrefix}${path9}`;
98
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
75
99
  console.error(`[API] DELETE ${url}`);
76
- const response = await fetch(url, { method: "DELETE" });
100
+ const headers = buildHeaders();
101
+ const response = await fetch(url, {
102
+ method: "DELETE",
103
+ headers: Object.keys(headers).length > 0 ? headers : void 0
104
+ });
77
105
  if (!response.ok) {
78
106
  const errorText = await response.text();
79
107
  throw new Error(
@@ -82,11 +110,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
82
110
  }
83
111
  }
84
112
  async function putJson(path9, body) {
85
- const url = `${serverUrl}${apiPrefix}${path9}`;
113
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
86
114
  console.error(`[API] PUT ${url}`);
87
115
  const response = await fetch(url, {
88
116
  method: "PUT",
89
- headers: { "Content-Type": "application/json" },
117
+ headers: buildHeaders({ "Content-Type": "application/json" }),
90
118
  body: JSON.stringify(body)
91
119
  });
92
120
  if (!response.ok) {
@@ -6059,8 +6087,39 @@ import { randomUUID } from "crypto";
6059
6087
  import { mkdir as mkdir2, writeFile } from "fs/promises";
6060
6088
  import { join as join2 } from "path";
6061
6089
  var DEFAULT_MODEL = "claude-sonnet-4-20250514";
6062
- function emitTraceEvent(event) {
6090
+ function emitTraceEvent(event, tracePushUrl, routeHeader, authToken) {
6063
6091
  console.log(`${TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
6092
+ if (tracePushUrl) {
6093
+ pushTraceEvent(tracePushUrl, event, routeHeader, authToken).catch((err) => {
6094
+ console.error("[Trace Push] Failed to push trace event:", err);
6095
+ });
6096
+ }
6097
+ }
6098
+ async function pushTraceEvent(url, event, routeHeader, authToken) {
6099
+ try {
6100
+ const headers = {
6101
+ "Content-Type": "application/json"
6102
+ };
6103
+ if (authToken) {
6104
+ headers["Authorization"] = `Bearer ${authToken}`;
6105
+ }
6106
+ if (routeHeader) {
6107
+ headers["x-wix-route"] = routeHeader;
6108
+ }
6109
+ const response = await fetch(url, {
6110
+ method: "POST",
6111
+ headers,
6112
+ body: JSON.stringify(event)
6113
+ });
6114
+ if (!response.ok) {
6115
+ const errorText = await response.text();
6116
+ console.error(
6117
+ `[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
6118
+ );
6119
+ }
6120
+ } catch (err) {
6121
+ console.error("[Trace Push] Network error:", err);
6122
+ }
6064
6123
  }
6065
6124
  function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
6066
6125
  let type = LiveTraceEventType.COMPLETION;
@@ -6218,7 +6277,12 @@ async function executeWithClaudeCode(skill, scenario, options) {
6218
6277
  false
6219
6278
  // Not complete yet
6220
6279
  );
6221
- emitTraceEvent(traceEvent);
6280
+ emitTraceEvent(
6281
+ traceEvent,
6282
+ traceContext.tracePushUrl,
6283
+ traceContext.routeHeader,
6284
+ traceContext.authToken
6285
+ );
6222
6286
  }
6223
6287
  }
6224
6288
  console.log(
@@ -6227,18 +6291,23 @@ async function executeWithClaudeCode(skill, scenario, options) {
6227
6291
  "messages"
6228
6292
  );
6229
6293
  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
- });
6294
+ emitTraceEvent(
6295
+ {
6296
+ evalRunId: traceContext.evalRunId,
6297
+ scenarioId: traceContext.scenarioId,
6298
+ scenarioName: traceContext.scenarioName,
6299
+ targetId: traceContext.targetId,
6300
+ targetName: traceContext.targetName,
6301
+ stepNumber: traceStepNumber + 1,
6302
+ type: LiveTraceEventType.COMPLETION,
6303
+ outputPreview: "Scenario execution completed",
6304
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6305
+ isComplete: true
6306
+ },
6307
+ traceContext.tracePushUrl,
6308
+ traceContext.routeHeader,
6309
+ traceContext.authToken
6310
+ );
6242
6311
  }
6243
6312
  const endTime = /* @__PURE__ */ new Date();
6244
6313
  const totalDurationMs = endTime.getTime() - startTime.getTime();
@@ -6456,7 +6525,10 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
6456
6525
  scenarioId: scenario.id,
6457
6526
  scenarioName: scenario.name,
6458
6527
  targetId: skill.id,
6459
- targetName: skill.name
6528
+ targetName: skill.name,
6529
+ tracePushUrl: config.tracePushUrl,
6530
+ routeHeader: config.routeHeader,
6531
+ authToken: config.authToken
6460
6532
  }
6461
6533
  });
6462
6534
  const completedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -6569,9 +6641,14 @@ async function runEvaluation(projectId2, evalRunId2) {
6569
6641
  serverUrl: config.serverUrl,
6570
6642
  aiGatewayUrl: config.aiGatewayUrl,
6571
6643
  evaluationsDir: config.evaluationsDir,
6572
- hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
6644
+ hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
6645
+ hasRouteHeader: !!config.routeHeader
6646
+ });
6647
+ const api = createApiClient(config.serverUrl, {
6648
+ apiPrefix: config.apiPrefix,
6649
+ routeHeader: config.routeHeader,
6650
+ authToken: config.authToken
6573
6651
  });
6574
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6575
6652
  console.error(
6576
6653
  "[DEBUG-H2] fetchEvaluationData START",
6577
6654
  JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
@@ -6655,7 +6732,10 @@ runEvaluation(projectId, evalRunId).then(() => {
6655
6732
  console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
6656
6733
  try {
6657
6734
  const config = loadConfig();
6658
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6735
+ const api = createApiClient(config.serverUrl, {
6736
+ apiPrefix: config.apiPrefix,
6737
+ routeHeader: config.routeHeader
6738
+ });
6659
6739
  await api.updateEvalRun(projectId, evalRunId, {
6660
6740
  status: EvalStatus.FAILED,
6661
6741
  completedAt: (/* @__PURE__ */ new Date()).toISOString()