orchajs 0.22.0 → 0.23.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.
@@ -270,6 +270,7 @@ function projectRunFact(manifest, sessionId, run, projection) {
270
270
  const failedActions = runEvents.filter((event) => event.type === "action.failed");
271
271
  const evaluations = runEvents.filter((event) => event.type === "evaluation.completed" ||
272
272
  event.type === "evaluation.failed");
273
+ const evaluationMetrics = evaluations.flatMap((event) => Array.isArray(event.data.metrics) ? event.data.metrics : []);
273
274
  const error = asRecord(terminal?.data.error);
274
275
  const lastAssistant = assistants.at(-1);
275
276
  const status = terminal?.type === "run.completed"
@@ -324,6 +325,12 @@ function projectRunFact(manifest, sessionId, run, projection) {
324
325
  evaluation_count: evaluations.length,
325
326
  evaluation_pass_count: evaluations.filter((event) => event.type === "evaluation.completed" &&
326
327
  event.data.status === "passed").length,
328
+ evaluation_failure_count: evaluations.filter((event) => event.type === "evaluation.completed" &&
329
+ event.data.status === "failed").length,
330
+ evaluation_error_count: evaluations.filter((event) => event.type === "evaluation.failed").length,
331
+ evaluation_metric_count: evaluationMetrics.length,
332
+ evaluation_metric_pass_count: evaluationMetrics.filter((metric) => asRecord(metric)?.passed === true).length,
333
+ evaluations: projectEvaluationLogs(evaluations),
327
334
  ...(typeof error?.code === "string" ? { error_code: error.code } : {}),
328
335
  ...(typeof error?.message === "string"
329
336
  ? { error_message: sanitizeErrorMessage(error.message) }
@@ -405,6 +412,59 @@ function projectActionLogs(events) {
405
412
  };
406
413
  });
407
414
  }
415
+ function projectEvaluationLogs(events) {
416
+ return events.slice(0, 50).map((event) => {
417
+ const usage = asRecord(event.data.usage);
418
+ const error = asRecord(event.data.error);
419
+ const metrics = Array.isArray(event.data.metrics)
420
+ ? event.data.metrics
421
+ .map(asRecord)
422
+ .filter((metric) => metric !== undefined)
423
+ .slice(0, 50)
424
+ .map((metric) => ({
425
+ name: typeof metric.name === "string" ? metric.name : "unknown_metric",
426
+ score: numberValue(metric.score),
427
+ threshold: numberValue(metric.threshold),
428
+ passed: metric.passed === true,
429
+ reasoning: typeof metric.reasoning === "string"
430
+ ? sanitizeErrorMessage(metric.reasoning)
431
+ : "",
432
+ evidence: Array.isArray(metric.evidence)
433
+ ? metric.evidence
434
+ .filter((item) => typeof item === "string")
435
+ .slice(0, 20)
436
+ .map(sanitizeErrorMessage)
437
+ : [],
438
+ }))
439
+ : [];
440
+ return {
441
+ name: typeof event.data.name === "string"
442
+ ? event.data.name
443
+ : "unknown_evaluation",
444
+ status: event.type === "evaluation.failed"
445
+ ? "error"
446
+ : event.data.status === "passed"
447
+ ? "passed"
448
+ : "failed",
449
+ ...(typeof event.data.provider === "string"
450
+ ? { provider: event.data.provider }
451
+ : {}),
452
+ ...(typeof event.data.model === "string"
453
+ ? { model: event.data.model }
454
+ : {}),
455
+ duration_ms: numberValue(event.data.durationMs),
456
+ input_tokens: numberValue(usage?.inputTokens),
457
+ output_tokens: numberValue(usage?.outputTokens),
458
+ reasoning_tokens: numberValue(usage?.reasoningTokens),
459
+ cache_read_tokens: numberValue(usage?.cacheReadTokens),
460
+ cache_write_tokens: numberValue(usage?.cacheWriteTokens),
461
+ metrics,
462
+ ...(typeof error?.message === "string"
463
+ ? { error_message: sanitizeErrorMessage(error.message) }
464
+ : {}),
465
+ };
466
+ });
467
+ }
408
468
  function takeBatch(queue) {
409
469
  const batch = [];
410
470
  let bytes = utf8ByteLength('{"schema_version":1,"runs":[]}');
package/dist/types.d.ts CHANGED
@@ -97,6 +97,11 @@ export interface AmarsiaTelemetryRunV1 {
97
97
  actions: AmarsiaTelemetryActionV1[];
98
98
  evaluation_count: number;
99
99
  evaluation_pass_count: number;
100
+ evaluation_failure_count: number;
101
+ evaluation_error_count: number;
102
+ evaluation_metric_count: number;
103
+ evaluation_metric_pass_count: number;
104
+ evaluations: AmarsiaTelemetryEvaluationV1[];
100
105
  error_code?: string;
101
106
  error_message?: string;
102
107
  error_retryable?: boolean;
@@ -111,6 +116,28 @@ export interface AmarsiaTelemetryActionV1 {
111
116
  error_code?: string;
112
117
  error_message?: string;
113
118
  }
119
+ export interface AmarsiaTelemetryEvaluationMetricV1 {
120
+ name: string;
121
+ score: number;
122
+ threshold: number;
123
+ passed: boolean;
124
+ reasoning: string;
125
+ evidence: string[];
126
+ }
127
+ export interface AmarsiaTelemetryEvaluationV1 {
128
+ name: string;
129
+ status: "passed" | "failed" | "error";
130
+ provider?: string;
131
+ model?: string;
132
+ duration_ms: number;
133
+ input_tokens: number;
134
+ output_tokens: number;
135
+ reasoning_tokens: number;
136
+ cache_read_tokens: number;
137
+ cache_write_tokens: number;
138
+ metrics: AmarsiaTelemetryEvaluationMetricV1[];
139
+ error_message?: string;
140
+ }
114
141
  export interface AmarsiaTelemetryBatchV1 {
115
142
  schema_version: 1;
116
143
  runs: AmarsiaTelemetryRunV1[];
@@ -289,6 +289,9 @@ function projectRunFact(manifest, sessionId, run, projection) {
289
289
  const evaluations = runEvents.filter(
290
290
  (event) => event.type === "evaluation.completed" || event.type === "evaluation.failed"
291
291
  );
292
+ const evaluationMetrics = evaluations.flatMap(
293
+ (event) => Array.isArray(event.data.metrics) ? event.data.metrics : []
294
+ );
292
295
  const error = asRecord(terminal?.data.error);
293
296
  const lastAssistant = assistants.at(-1);
294
297
  const status = terminal?.type === "run.completed" ? "completed" : terminal?.type === "run.failed" ? "failed" : terminal?.type === "run.paused" ? "paused" : "running";
@@ -331,6 +334,17 @@ function projectRunFact(manifest, sessionId, run, projection) {
331
334
  evaluation_pass_count: evaluations.filter(
332
335
  (event) => event.type === "evaluation.completed" && event.data.status === "passed"
333
336
  ).length,
337
+ evaluation_failure_count: evaluations.filter(
338
+ (event) => event.type === "evaluation.completed" && event.data.status === "failed"
339
+ ).length,
340
+ evaluation_error_count: evaluations.filter(
341
+ (event) => event.type === "evaluation.failed"
342
+ ).length,
343
+ evaluation_metric_count: evaluationMetrics.length,
344
+ evaluation_metric_pass_count: evaluationMetrics.filter(
345
+ (metric) => asRecord(metric)?.passed === true
346
+ ).length,
347
+ evaluations: projectEvaluationLogs(evaluations),
334
348
  ...typeof error?.code === "string" ? { error_code: error.code } : {},
335
349
  ...typeof error?.message === "string" ? { error_message: sanitizeErrorMessage(error.message) } : {},
336
350
  ...typeof error?.retryable === "boolean" ? { error_retryable: error.retryable } : {}
@@ -396,6 +410,38 @@ function projectActionLogs(events) {
396
410
  };
397
411
  });
398
412
  }
413
+ function projectEvaluationLogs(events) {
414
+ return events.slice(0, 50).map((event) => {
415
+ const usage = asRecord(event.data.usage);
416
+ const error = asRecord(event.data.error);
417
+ const metrics = Array.isArray(event.data.metrics) ? event.data.metrics.map(asRecord).filter(
418
+ (metric) => metric !== void 0
419
+ ).slice(0, 50).map((metric) => ({
420
+ name: typeof metric.name === "string" ? metric.name : "unknown_metric",
421
+ score: numberValue(metric.score),
422
+ threshold: numberValue(metric.threshold),
423
+ passed: metric.passed === true,
424
+ reasoning: typeof metric.reasoning === "string" ? sanitizeErrorMessage(metric.reasoning) : "",
425
+ evidence: Array.isArray(metric.evidence) ? metric.evidence.filter(
426
+ (item) => typeof item === "string"
427
+ ).slice(0, 20).map(sanitizeErrorMessage) : []
428
+ })) : [];
429
+ return {
430
+ name: typeof event.data.name === "string" ? event.data.name : "unknown_evaluation",
431
+ status: event.type === "evaluation.failed" ? "error" : event.data.status === "passed" ? "passed" : "failed",
432
+ ...typeof event.data.provider === "string" ? { provider: event.data.provider } : {},
433
+ ...typeof event.data.model === "string" ? { model: event.data.model } : {},
434
+ duration_ms: numberValue(event.data.durationMs),
435
+ input_tokens: numberValue(usage?.inputTokens),
436
+ output_tokens: numberValue(usage?.outputTokens),
437
+ reasoning_tokens: numberValue(usage?.reasoningTokens),
438
+ cache_read_tokens: numberValue(usage?.cacheReadTokens),
439
+ cache_write_tokens: numberValue(usage?.cacheWriteTokens),
440
+ metrics,
441
+ ...typeof error?.message === "string" ? { error_message: sanitizeErrorMessage(error.message) } : {}
442
+ };
443
+ });
444
+ }
399
445
  function takeBatch(queue) {
400
446
  const batch = [];
401
447
  let bytes = utf8ByteLength('{"schema_version":1,"runs":[]}');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchajs",
3
- "version": "0.22.0",
3
+ "version": "0.23.0",
4
4
  "description": "A filesystem-convention, stateful agent framework for JavaScript.",
5
5
  "license": "MIT",
6
6
  "repository": {