@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.js CHANGED
@@ -55,21 +55,45 @@ function loadConfig() {
55
55
  aiGatewayHeaders[key] = value;
56
56
  }
57
57
  }
58
+ const tracePushUrl = process.env.TRACE_PUSH_URL;
59
+ const routeHeader = process.env.EVAL_ROUTE_HEADER;
60
+ const authToken = process.env.EVAL_AUTH_TOKEN;
58
61
  return {
59
62
  serverUrl,
60
63
  apiPrefix,
61
64
  aiGatewayUrl,
62
65
  aiGatewayHeaders,
63
- evaluationsDir
66
+ evaluationsDir,
67
+ tracePushUrl,
68
+ routeHeader,
69
+ authToken
64
70
  };
65
71
  }
66
72
 
67
73
  // src/api-client.ts
68
- function createApiClient(serverUrl, apiPrefix = "") {
74
+ function createApiClient(serverUrl, options = "") {
75
+ const opts = typeof options === "string" ? { apiPrefix: options } : options;
76
+ const apiPrefix = opts.apiPrefix ?? "";
77
+ const routeHeader = opts.routeHeader;
78
+ const authToken = opts.authToken;
79
+ const pathPrefix = authToken ? "/public" : "";
80
+ function buildHeaders(additionalHeaders) {
81
+ const headers = { ...additionalHeaders };
82
+ if (authToken) {
83
+ headers["Authorization"] = `Bearer ${authToken}`;
84
+ }
85
+ if (routeHeader) {
86
+ headers["x-wix-route"] = routeHeader;
87
+ }
88
+ return headers;
89
+ }
69
90
  async function fetchJson(path9) {
70
- const url = `${serverUrl}${apiPrefix}${path9}`;
91
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
71
92
  console.error(`[API] GET ${url}`);
72
- const response = await fetch(url);
93
+ const headers = buildHeaders();
94
+ const response = await fetch(url, {
95
+ headers: Object.keys(headers).length > 0 ? headers : void 0
96
+ });
73
97
  if (!response.ok) {
74
98
  const errorText = await response.text();
75
99
  throw new Error(
@@ -79,11 +103,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
79
103
  return response.json();
80
104
  }
81
105
  async function postJson(path9, body) {
82
- const url = `${serverUrl}${apiPrefix}${path9}`;
106
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
83
107
  console.error(`[API] POST ${url}`);
84
108
  const response = await fetch(url, {
85
109
  method: "POST",
86
- headers: { "Content-Type": "application/json" },
110
+ headers: buildHeaders({ "Content-Type": "application/json" }),
87
111
  body: JSON.stringify(body)
88
112
  });
89
113
  if (!response.ok) {
@@ -94,9 +118,13 @@ function createApiClient(serverUrl, apiPrefix = "") {
94
118
  }
95
119
  }
96
120
  async function deleteRequest(path9) {
97
- const url = `${serverUrl}${apiPrefix}${path9}`;
121
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
98
122
  console.error(`[API] DELETE ${url}`);
99
- const response = await fetch(url, { method: "DELETE" });
123
+ const headers = buildHeaders();
124
+ const response = await fetch(url, {
125
+ method: "DELETE",
126
+ headers: Object.keys(headers).length > 0 ? headers : void 0
127
+ });
100
128
  if (!response.ok) {
101
129
  const errorText = await response.text();
102
130
  throw new Error(
@@ -105,11 +133,11 @@ function createApiClient(serverUrl, apiPrefix = "") {
105
133
  }
106
134
  }
107
135
  async function putJson(path9, body) {
108
- const url = `${serverUrl}${apiPrefix}${path9}`;
136
+ const url = `${serverUrl}${apiPrefix}${pathPrefix}${path9}`;
109
137
  console.error(`[API] PUT ${url}`);
110
138
  const response = await fetch(url, {
111
139
  method: "PUT",
112
- headers: { "Content-Type": "application/json" },
140
+ headers: buildHeaders({ "Content-Type": "application/json" }),
113
141
  body: JSON.stringify(body)
114
142
  });
115
143
  if (!response.ok) {
@@ -6076,8 +6104,39 @@ var import_crypto = require("crypto");
6076
6104
  var import_promises3 = require("fs/promises");
6077
6105
  var import_path5 = require("path");
6078
6106
  var DEFAULT_MODEL = "claude-sonnet-4-20250514";
6079
- function emitTraceEvent(event) {
6107
+ function emitTraceEvent(event, tracePushUrl, routeHeader, authToken) {
6080
6108
  console.log(`${import_evalforge_types.TRACE_EVENT_PREFIX}${JSON.stringify(event)}`);
6109
+ if (tracePushUrl) {
6110
+ pushTraceEvent(tracePushUrl, event, routeHeader, authToken).catch((err) => {
6111
+ console.error("[Trace Push] Failed to push trace event:", err);
6112
+ });
6113
+ }
6114
+ }
6115
+ async function pushTraceEvent(url, event, routeHeader, authToken) {
6116
+ try {
6117
+ const headers = {
6118
+ "Content-Type": "application/json"
6119
+ };
6120
+ if (authToken) {
6121
+ headers["Authorization"] = `Bearer ${authToken}`;
6122
+ }
6123
+ if (routeHeader) {
6124
+ headers["x-wix-route"] = routeHeader;
6125
+ }
6126
+ const response = await fetch(url, {
6127
+ method: "POST",
6128
+ headers,
6129
+ body: JSON.stringify(event)
6130
+ });
6131
+ if (!response.ok) {
6132
+ const errorText = await response.text();
6133
+ console.error(
6134
+ `[Trace Push] HTTP ${response.status}: ${errorText.slice(0, 200)}`
6135
+ );
6136
+ }
6137
+ } catch (err) {
6138
+ console.error("[Trace Push] Network error:", err);
6139
+ }
6081
6140
  }
6082
6141
  function createTraceEventFromMessage(message, context, stepNumber, isComplete) {
6083
6142
  let type = import_evalforge_types.LiveTraceEventType.COMPLETION;
@@ -6235,7 +6294,12 @@ async function executeWithClaudeCode(skill, scenario, options) {
6235
6294
  false
6236
6295
  // Not complete yet
6237
6296
  );
6238
- emitTraceEvent(traceEvent);
6297
+ emitTraceEvent(
6298
+ traceEvent,
6299
+ traceContext.tracePushUrl,
6300
+ traceContext.routeHeader,
6301
+ traceContext.authToken
6302
+ );
6239
6303
  }
6240
6304
  }
6241
6305
  console.log(
@@ -6244,18 +6308,23 @@ async function executeWithClaudeCode(skill, scenario, options) {
6244
6308
  "messages"
6245
6309
  );
6246
6310
  if (traceContext) {
6247
- emitTraceEvent({
6248
- evalRunId: traceContext.evalRunId,
6249
- scenarioId: traceContext.scenarioId,
6250
- scenarioName: traceContext.scenarioName,
6251
- targetId: traceContext.targetId,
6252
- targetName: traceContext.targetName,
6253
- stepNumber: traceStepNumber + 1,
6254
- type: import_evalforge_types.LiveTraceEventType.COMPLETION,
6255
- outputPreview: "Scenario execution completed",
6256
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6257
- isComplete: true
6258
- });
6311
+ emitTraceEvent(
6312
+ {
6313
+ evalRunId: traceContext.evalRunId,
6314
+ scenarioId: traceContext.scenarioId,
6315
+ scenarioName: traceContext.scenarioName,
6316
+ targetId: traceContext.targetId,
6317
+ targetName: traceContext.targetName,
6318
+ stepNumber: traceStepNumber + 1,
6319
+ type: import_evalforge_types.LiveTraceEventType.COMPLETION,
6320
+ outputPreview: "Scenario execution completed",
6321
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6322
+ isComplete: true
6323
+ },
6324
+ traceContext.tracePushUrl,
6325
+ traceContext.routeHeader,
6326
+ traceContext.authToken
6327
+ );
6259
6328
  }
6260
6329
  const endTime = /* @__PURE__ */ new Date();
6261
6330
  const totalDurationMs = endTime.getTime() - startTime.getTime();
@@ -6473,7 +6542,10 @@ async function callSkill(config, evalRunId2, scenario, skill, agent, workDir) {
6473
6542
  scenarioId: scenario.id,
6474
6543
  scenarioName: scenario.name,
6475
6544
  targetId: skill.id,
6476
- targetName: skill.name
6545
+ targetName: skill.name,
6546
+ tracePushUrl: config.tracePushUrl,
6547
+ routeHeader: config.routeHeader,
6548
+ authToken: config.authToken
6477
6549
  }
6478
6550
  });
6479
6551
  const completedAt = (/* @__PURE__ */ new Date()).toISOString();
@@ -6586,9 +6658,14 @@ async function runEvaluation(projectId2, evalRunId2) {
6586
6658
  serverUrl: config.serverUrl,
6587
6659
  aiGatewayUrl: config.aiGatewayUrl,
6588
6660
  evaluationsDir: config.evaluationsDir,
6589
- hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0
6661
+ hasAiGatewayHeaders: Object.keys(config.aiGatewayHeaders).length > 0,
6662
+ hasRouteHeader: !!config.routeHeader
6663
+ });
6664
+ const api = createApiClient(config.serverUrl, {
6665
+ apiPrefix: config.apiPrefix,
6666
+ routeHeader: config.routeHeader,
6667
+ authToken: config.authToken
6590
6668
  });
6591
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6592
6669
  console.error(
6593
6670
  "[DEBUG-H2] fetchEvaluationData START",
6594
6671
  JSON.stringify({ serverUrl: config.serverUrl, timestamp: Date.now() })
@@ -6672,7 +6749,10 @@ runEvaluation(projectId, evalRunId).then(() => {
6672
6749
  console.error("[EVALUATOR-BOOT] runEvaluation FAILED:", err);
6673
6750
  try {
6674
6751
  const config = loadConfig();
6675
- const api = createApiClient(config.serverUrl, config.apiPrefix);
6752
+ const api = createApiClient(config.serverUrl, {
6753
+ apiPrefix: config.apiPrefix,
6754
+ routeHeader: config.routeHeader
6755
+ });
6676
6756
  await api.updateEvalRun(projectId, evalRunId, {
6677
6757
  status: import_evalforge_types3.EvalStatus.FAILED,
6678
6758
  completedAt: (/* @__PURE__ */ new Date()).toISOString()