@agentuity/runtime 0.0.43 → 0.0.45

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 (130) hide show
  1. package/AGENTS.md +11 -9
  2. package/README.md +4 -4
  3. package/dist/_context.d.ts +12 -4
  4. package/dist/_context.d.ts.map +1 -1
  5. package/dist/_server.d.ts +7 -4
  6. package/dist/_server.d.ts.map +1 -1
  7. package/dist/_services.d.ts +13 -2
  8. package/dist/_services.d.ts.map +1 -1
  9. package/dist/_util.d.ts +1 -1
  10. package/dist/_util.d.ts.map +1 -1
  11. package/dist/_waituntil.d.ts +1 -3
  12. package/dist/_waituntil.d.ts.map +1 -1
  13. package/dist/agent.d.ts +41 -14
  14. package/dist/agent.d.ts.map +1 -1
  15. package/dist/app.d.ts +90 -8
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/eval.d.ts +79 -0
  18. package/dist/eval.d.ts.map +1 -0
  19. package/dist/index.d.ts +6 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/io/email.d.ts +77 -0
  22. package/dist/io/email.d.ts.map +1 -0
  23. package/dist/logger/console.d.ts +7 -1
  24. package/dist/logger/console.d.ts.map +1 -1
  25. package/dist/logger/user.d.ts.map +1 -1
  26. package/dist/otel/config.d.ts +3 -1
  27. package/dist/otel/config.d.ts.map +1 -1
  28. package/dist/otel/console.d.ts +2 -1
  29. package/dist/otel/console.d.ts.map +1 -1
  30. package/dist/otel/exporters/index.d.ts +4 -0
  31. package/dist/otel/exporters/index.d.ts.map +1 -0
  32. package/dist/otel/exporters/jsonl-log-exporter.d.ts +36 -0
  33. package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +1 -0
  34. package/dist/otel/exporters/jsonl-metric-exporter.d.ts +40 -0
  35. package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +1 -0
  36. package/dist/otel/exporters/jsonl-trace-exporter.d.ts +36 -0
  37. package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +1 -0
  38. package/dist/otel/http.d.ts.map +1 -1
  39. package/dist/otel/logger.d.ts +8 -6
  40. package/dist/otel/logger.d.ts.map +1 -1
  41. package/dist/otel/otel.d.ts +8 -2
  42. package/dist/otel/otel.d.ts.map +1 -1
  43. package/dist/router.d.ts +4 -1
  44. package/dist/router.d.ts.map +1 -1
  45. package/dist/services/evalrun/composite.d.ts +21 -0
  46. package/dist/services/evalrun/composite.d.ts.map +1 -0
  47. package/dist/services/evalrun/http.d.ts +24 -0
  48. package/dist/services/evalrun/http.d.ts.map +1 -0
  49. package/dist/services/evalrun/index.d.ts +5 -0
  50. package/dist/services/evalrun/index.d.ts.map +1 -0
  51. package/dist/services/evalrun/json.d.ts +21 -0
  52. package/dist/services/evalrun/json.d.ts.map +1 -0
  53. package/dist/services/evalrun/local.d.ts +19 -0
  54. package/dist/services/evalrun/local.d.ts.map +1 -0
  55. package/dist/services/local/_db.d.ts +4 -0
  56. package/dist/services/local/_db.d.ts.map +1 -0
  57. package/dist/services/local/_router.d.ts +3 -0
  58. package/dist/services/local/_router.d.ts.map +1 -0
  59. package/dist/services/local/_util.d.ts +18 -0
  60. package/dist/services/local/_util.d.ts.map +1 -0
  61. package/dist/services/local/index.d.ts +8 -0
  62. package/dist/services/local/index.d.ts.map +1 -0
  63. package/dist/services/local/keyvalue.d.ts +10 -0
  64. package/dist/services/local/keyvalue.d.ts.map +1 -0
  65. package/dist/services/local/objectstore.d.ts +11 -0
  66. package/dist/services/local/objectstore.d.ts.map +1 -0
  67. package/dist/services/local/stream.d.ts +10 -0
  68. package/dist/services/local/stream.d.ts.map +1 -0
  69. package/dist/services/local/vector.d.ts +13 -0
  70. package/dist/services/local/vector.d.ts.map +1 -0
  71. package/dist/services/session/composite.d.ts +21 -0
  72. package/dist/services/session/composite.d.ts.map +1 -0
  73. package/dist/services/session/http.d.ts +23 -0
  74. package/dist/services/session/http.d.ts.map +1 -0
  75. package/dist/services/session/index.d.ts +5 -0
  76. package/dist/services/session/index.d.ts.map +1 -0
  77. package/dist/services/session/json.d.ts +22 -0
  78. package/dist/services/session/json.d.ts.map +1 -0
  79. package/dist/services/session/local.d.ts +19 -0
  80. package/dist/services/session/local.d.ts.map +1 -0
  81. package/dist/session.d.ts +70 -0
  82. package/dist/session.d.ts.map +1 -0
  83. package/package.json +10 -6
  84. package/src/_config.ts +1 -1
  85. package/src/_context.ts +19 -16
  86. package/src/_server.ts +284 -42
  87. package/src/_services.ts +147 -34
  88. package/src/_util.ts +2 -3
  89. package/src/_waituntil.ts +5 -153
  90. package/src/agent.ts +667 -65
  91. package/src/app.ts +159 -13
  92. package/src/eval.ts +95 -0
  93. package/src/index.ts +6 -1
  94. package/src/io/email.ts +173 -0
  95. package/src/logger/console.ts +196 -17
  96. package/src/logger/user.ts +7 -3
  97. package/src/otel/config.ts +7 -44
  98. package/src/otel/console.ts +8 -4
  99. package/src/otel/exporters/README.md +217 -0
  100. package/src/otel/exporters/index.ts +3 -0
  101. package/src/otel/exporters/jsonl-log-exporter.ts +113 -0
  102. package/src/otel/exporters/jsonl-metric-exporter.ts +120 -0
  103. package/src/otel/exporters/jsonl-trace-exporter.ts +121 -0
  104. package/src/otel/http.ts +3 -1
  105. package/src/otel/logger.ts +87 -37
  106. package/src/otel/otel.ts +43 -22
  107. package/src/router.ts +44 -4
  108. package/src/services/evalrun/composite.ts +34 -0
  109. package/src/services/evalrun/http.ts +112 -0
  110. package/src/services/evalrun/index.ts +4 -0
  111. package/src/services/evalrun/json.ts +46 -0
  112. package/src/services/evalrun/local.ts +28 -0
  113. package/src/services/local/README.md +1576 -0
  114. package/src/services/local/_db.ts +182 -0
  115. package/src/services/local/_router.ts +86 -0
  116. package/src/services/local/_util.ts +49 -0
  117. package/src/services/local/index.ts +7 -0
  118. package/src/services/local/keyvalue.ts +118 -0
  119. package/src/services/local/objectstore.ts +152 -0
  120. package/src/services/local/stream.ts +296 -0
  121. package/src/services/local/vector.ts +264 -0
  122. package/src/services/session/composite.ts +33 -0
  123. package/src/services/session/http.ts +64 -0
  124. package/src/services/session/index.ts +4 -0
  125. package/src/services/session/json.ts +42 -0
  126. package/src/services/session/local.ts +28 -0
  127. package/src/session.ts +284 -0
  128. package/dist/_unauthenticated.d.ts +0 -26
  129. package/dist/_unauthenticated.d.ts.map +0 -1
  130. package/src/_unauthenticated.ts +0 -126
package/src/otel/otel.ts CHANGED
@@ -28,7 +28,9 @@ import type { Logger } from '../logger';
28
28
  import { ConsoleLogRecordExporter } from './console';
29
29
  import { instrumentFetch } from './fetch';
30
30
  import { createLogger, patchConsole } from './logger';
31
- import { getSDKVersion } from '../_config';
31
+ import { getSDKVersion, isAuthenticated } from '../_config';
32
+ import type { LogLevel } from '@agentuity/core';
33
+ import { JSONLLogExporter, JSONLTraceExporter, JSONLMetricExporter } from './exporters';
32
34
 
33
35
  /**
34
36
  * Configuration for OpenTelemetry initialization
@@ -45,6 +47,8 @@ export interface OtelConfig {
45
47
  cliVersion?: string;
46
48
  devmode?: boolean;
47
49
  spanProcessors?: Array<SpanProcessor>;
50
+ logLevel?: LogLevel;
51
+ jsonlBasePath?: string;
48
52
  }
49
53
 
50
54
  /**
@@ -83,24 +87,33 @@ export const createAgentuityLoggerProvider = ({
83
87
  url,
84
88
  headers,
85
89
  resource,
90
+ logLevel,
91
+ jsonlBasePath,
86
92
  }: {
87
93
  url?: string;
88
94
  headers?: Record<string, string>;
89
95
  resource: Resource;
96
+ logLevel: LogLevel;
97
+ jsonlBasePath?: string;
90
98
  }) => {
91
99
  let processor: LogRecordProcessor;
92
- let exporter: OTLPLogExporter | undefined;
100
+ let exporter: OTLPLogExporter | JSONLLogExporter | undefined;
93
101
 
94
- if (url) {
95
- exporter = new OTLPLogExporter({
102
+ if (jsonlBasePath) {
103
+ exporter = new JSONLLogExporter(jsonlBasePath);
104
+ processor = new BatchLogRecordProcessor(exporter);
105
+ } else if (url) {
106
+ // Original OTLP export behavior
107
+ const otlpExporter = new OTLPLogExporter({
96
108
  url: `${url}/v1/logs`,
97
109
  headers,
98
110
  compression: CompressionAlgorithm.GZIP,
99
111
  timeoutMillis: 10_000,
100
112
  });
101
- processor = new BatchLogRecordProcessor(exporter);
113
+ exporter = otlpExporter;
114
+ processor = new BatchLogRecordProcessor(otlpExporter);
102
115
  } else {
103
- processor = new SimpleLogRecordProcessor(new ConsoleLogRecordExporter());
116
+ processor = new SimpleLogRecordProcessor(new ConsoleLogRecordExporter(logLevel));
104
117
  }
105
118
  const provider = new LoggerProvider({
106
119
  resource,
@@ -159,6 +172,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
159
172
  projectId,
160
173
  deploymentId,
161
174
  devmode = false,
175
+ logLevel = 'warn',
176
+ jsonlBasePath = undefined,
162
177
  } = config;
163
178
 
164
179
  let headers: Record<string, string> | undefined;
@@ -173,6 +188,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
173
188
  url,
174
189
  headers,
175
190
  resource,
191
+ logLevel,
192
+ jsonlBasePath,
176
193
  });
177
194
  const attrs = {
178
195
  '@agentuity/orgId': orgId ?? 'unknown',
@@ -182,25 +199,29 @@ export function registerOtel(config: OtelConfig): OtelResponse {
182
199
  '@agentuity/devmode': devmode,
183
200
  '@agentuity/language': 'javascript',
184
201
  };
185
- const logger = createLogger(!!url, attrs);
202
+ const logger = createLogger(!!url, attrs, logLevel);
186
203
 
187
204
  // must do this after we have created the logger
188
- patchConsole(!!url, attrs);
205
+ patchConsole(!!url, attrs, logLevel);
189
206
 
190
207
  const traceExporter = url
191
- ? new OTLPTraceExporter({
192
- url: `${url}/v1/traces`,
193
- headers,
194
- keepAlive: true,
195
- })
208
+ ? jsonlBasePath
209
+ ? new JSONLTraceExporter(jsonlBasePath)
210
+ : new OTLPTraceExporter({
211
+ url: `${url}/v1/traces`,
212
+ headers,
213
+ keepAlive: true,
214
+ })
196
215
  : undefined;
197
216
 
198
217
  const metricExporter = url
199
- ? new OTLPMetricExporter({
200
- url: `${url}/v1/metrics`,
201
- headers,
202
- keepAlive: true,
203
- })
218
+ ? jsonlBasePath
219
+ ? new JSONLMetricExporter(jsonlBasePath)
220
+ : new OTLPMetricExporter({
221
+ url: `${url}/v1/metrics`,
222
+ headers,
223
+ keepAlive: true,
224
+ })
204
225
  : undefined;
205
226
 
206
227
  // Create a separate metric reader for the NodeSDK
@@ -260,8 +281,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
260
281
 
261
282
  try {
262
283
  const projectName = config.projectId || '';
263
- const orgName = config.orgId || '';
264
- const appName = `${orgName}:${projectName}`;
284
+ const orgId = config.orgId || '';
285
+ const appName = `${orgId}:${projectName}`;
265
286
 
266
287
  const traceloopHeaders: Record<string, string> = {};
267
288
  if (bearerToken) {
@@ -278,7 +299,7 @@ export function registerOtel(config: OtelConfig): OtelResponse {
278
299
  // Note: JavaScript SDK doesn't support resourceAttributes like Python
279
300
  });
280
301
  logger.debug(`Telemetry initialized with app_name: ${appName}`);
281
- logger.info('Telemetry configured successfully');
302
+ logger.debug('Telemetry configured successfully');
282
303
  } catch (error) {
283
304
  logger.warn('Telemetry not available, skipping automatic instrumentation', {
284
305
  error: error instanceof Error ? error.message : String(error),
@@ -309,7 +330,7 @@ export function registerOtel(config: OtelConfig): OtelResponse {
309
330
  }
310
331
  };
311
332
 
312
- if (url) {
333
+ if (url && isAuthenticated()) {
313
334
  logger.debug('connected to Agentuity Agent Cloud');
314
335
  }
315
336
 
package/src/router.ts CHANGED
@@ -6,11 +6,17 @@ import { upgradeWebSocket as honoUpgradeWebSocket } from 'hono/bun';
6
6
  import { hash, returnResponse } from './_util';
7
7
  import type { Env } from './app';
8
8
  import { getAsyncLocalStorage } from './_context';
9
+ import { parseEmail, type Email } from './io/email';
9
10
 
10
11
  type AgentHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
11
12
  c: Context<E, P, I>
12
13
  ) => any | Promise<any>;
13
14
 
15
+ type EmailHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
16
+ email: Email,
17
+ c: Context<E, P, I>
18
+ ) => any | Promise<any>;
19
+
14
20
  type StreamHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
15
21
  c: Context<E, P, I>
16
22
  ) => ReadableStream<any> | Promise<ReadableStream<any>>;
@@ -48,7 +54,12 @@ type ExtendedHono<E extends Env = Env, S extends Schema = {}> = {
48
54
  ): Hono<E, S>;
49
55
  };
50
56
  } & {
51
- email(address: string, handler: AgentHandler): Hono<E, S>;
57
+ email(address: string, handler: EmailHandler): Hono<E, S>;
58
+ email<I extends Input = {}>(
59
+ address: string,
60
+ middleware: MiddlewareHandler<E, string, I>,
61
+ handler: EmailHandler<E, string, I>
62
+ ): Hono<E, S>;
52
63
  sms(params: { number: string }, handler: AgentHandler): Hono<E, S>;
53
64
  cron(schedule: string, handler: AgentHandler): Hono<E, S>;
54
65
  stream<P extends string = string>(path: P, handler: StreamHandler<E, P>): Hono<E, S>;
@@ -119,16 +130,45 @@ export const createRouter = <E extends Env = Env, S extends Schema = Schema>():
119
130
  }
120
131
 
121
132
  // shim in special routes
122
- _router.email = (address: string, handler: AgentHandler) => {
133
+ _router.email = (address: string, ...args: any[]) => {
134
+ let middleware: MiddlewareHandler | undefined;
135
+ let handler: EmailHandler;
136
+
137
+ if (args.length === 1) {
138
+ handler = args[0];
139
+ } else {
140
+ middleware = args[0];
141
+ handler = args[1];
142
+ }
143
+
123
144
  const id = hash(address);
124
145
  const path = `/${id}`;
125
146
  // registerEmailHandler(address)
126
147
  const wrapper = async (c: Context): Promise<Response> => {
127
- let result = handler(c);
148
+ const contentType = (c.req.header('content-type') || '').trim().toLowerCase();
149
+ if (!contentType.includes('message/rfc822')) {
150
+ return c.text('Bad Request: Content-Type must be message/rfc822', 400);
151
+ }
152
+
153
+ const arrayBuffer = await c.req.arrayBuffer();
154
+ const buffer = Buffer.from(arrayBuffer);
155
+
156
+ const email = await parseEmail(buffer);
157
+
158
+ let result = handler(email, c);
128
159
  if (result instanceof Promise) result = await result;
160
+
161
+ if (result === undefined) {
162
+ return c.text('OK', 200);
163
+ }
129
164
  return returnResponse(c, result);
130
165
  };
131
- return router.post(path, wrapper);
166
+
167
+ if (middleware) {
168
+ return router.post(path, middleware, wrapper);
169
+ } else {
170
+ return router.post(path, wrapper);
171
+ }
132
172
  };
133
173
 
134
174
  _router.sms = ({ number }: { number: string }, handler: AgentHandler) => {
@@ -0,0 +1,34 @@
1
+ import {
2
+ type EvalRunEventProvider,
3
+ type EvalRunStartEvent,
4
+ type EvalRunCompleteEvent,
5
+ } from '@agentuity/core';
6
+
7
+ /**
8
+ * An implementation of the EvalRunEventProvider which wraps multiple providers
9
+ */
10
+ export class CompositeEvalRunEventProvider implements EvalRunEventProvider {
11
+ private providers: EvalRunEventProvider[];
12
+
13
+ constructor(...providers: EvalRunEventProvider[]) {
14
+ this.providers = providers;
15
+ }
16
+
17
+ /**
18
+ * called when the eval run starts
19
+ *
20
+ * @param event EvalRunStartEvent
21
+ */
22
+ async start(event: EvalRunStartEvent): Promise<void> {
23
+ await Promise.allSettled(this.providers.map((provider) => provider.start(event)));
24
+ }
25
+
26
+ /**
27
+ * called when the eval run completes
28
+ *
29
+ * @param event EvalRunCompleteEvent
30
+ */
31
+ async complete(event: EvalRunCompleteEvent): Promise<void> {
32
+ await Promise.allSettled(this.providers.map((provider) => provider.complete(event)));
33
+ }
34
+ }
@@ -0,0 +1,112 @@
1
+ import { APIClient, APIResponseSchemaNoData, ValidationError } from '@agentuity/server';
2
+ import {
3
+ type EvalRunEventProvider,
4
+ type EvalRunStartEvent,
5
+ EvalRunStartEventDelayedSchema,
6
+ EvalRunCompleteEventDelayedSchema,
7
+ type EvalRunCompleteEvent,
8
+ type Logger,
9
+ } from '@agentuity/core';
10
+
11
+ /**
12
+ * An implementation of the EvalRunEventProvider which uses HTTP for delivery
13
+ */
14
+ export class HTTPEvalRunEventProvider implements EvalRunEventProvider {
15
+ private apiClient: APIClient;
16
+ private logger: Logger;
17
+ private baseUrl: string;
18
+
19
+ constructor(client: APIClient, logger: Logger, baseUrl: string) {
20
+ this.apiClient = client;
21
+ this.logger = logger;
22
+ this.baseUrl = baseUrl;
23
+ }
24
+
25
+ /**
26
+ * called when the eval run starts
27
+ *
28
+ * @param event EvalRunStartEvent
29
+ */
30
+ async start(event: EvalRunStartEvent): Promise<void> {
31
+ const endpoint = '/evalrun/2025-03-17';
32
+ const fullUrl = `${this.baseUrl}${endpoint}`;
33
+ this.logger.debug('[EVALRUN HTTP] Sending eval run start event: %s', event.id);
34
+ this.logger.debug('[EVALRUN HTTP] URL: %s %s', 'POST', fullUrl);
35
+ this.logger.debug('[EVALRUN HTTP] Base URL: %s', this.baseUrl);
36
+
37
+ const payload = { ...event, timestamp: Date.now() };
38
+ this.logger.debug('[EVALRUN HTTP] Start event payload: %s', JSON.stringify(payload, null, 2));
39
+
40
+ try {
41
+ const resp = await this.apiClient.request(
42
+ 'POST',
43
+ endpoint,
44
+ APIResponseSchemaNoData(),
45
+ payload,
46
+ EvalRunStartEventDelayedSchema
47
+ );
48
+ if (resp.success) {
49
+ this.logger.debug('[EVALRUN HTTP] Start event sent successfully: %s', event.id);
50
+ return;
51
+ }
52
+ const errorMsg = resp.message || 'Unknown error';
53
+ this.logger.error('[EVALRUN HTTP] Start event failed: %s, error: %s', event.id, errorMsg);
54
+ throw new Error(errorMsg);
55
+ } catch (error) {
56
+ this.logger.error(
57
+ '[EVALRUN HTTP] Start event exception: %s, error: %s',
58
+ event.id,
59
+ error instanceof Error ? error.message : String(error)
60
+ );
61
+ // Log validation errors if available
62
+ if (error instanceof ValidationError) {
63
+ this.logger.error(
64
+ '[EVALRUN HTTP] Validation issues: %s',
65
+ JSON.stringify(error.issues, null, 2)
66
+ );
67
+ }
68
+ throw error;
69
+ }
70
+ }
71
+
72
+ /**
73
+ * called when the eval run completes
74
+ *
75
+ * @param event EvalRunCompleteEvent
76
+ */
77
+ async complete(event: EvalRunCompleteEvent): Promise<void> {
78
+ const endpoint = '/evalrun/2025-03-17';
79
+ const fullUrl = `${this.baseUrl}${endpoint}`;
80
+ this.logger.debug('[EVALRUN HTTP] Sending eval run complete event: %s', event.id);
81
+ this.logger.debug('[EVALRUN HTTP] URL: %s %s', 'PUT', fullUrl);
82
+ this.logger.debug('[EVALRUN HTTP] Base URL: %s', this.baseUrl);
83
+
84
+ try {
85
+ const resp = await this.apiClient.request(
86
+ 'PUT',
87
+ endpoint,
88
+ APIResponseSchemaNoData(),
89
+ { ...event, timestamp: Date.now() },
90
+ EvalRunCompleteEventDelayedSchema
91
+ );
92
+ if (resp.success) {
93
+ this.logger.debug('[EVALRUN HTTP] Complete event sent successfully: %s', event.id);
94
+ return;
95
+ }
96
+ const errorMsg = resp.message || 'Unknown error';
97
+ this.logger.error(
98
+ '[EVALRUN HTTP] Complete event failed: %s, error: %s',
99
+ event.id,
100
+ errorMsg
101
+ );
102
+ throw new Error(errorMsg);
103
+ } catch (error) {
104
+ this.logger.error(
105
+ '[EVALRUN HTTP] Complete event exception: %s, error: %s',
106
+ event.id,
107
+ error instanceof Error ? error.message : String(error)
108
+ );
109
+ throw error;
110
+ }
111
+ }
112
+ }
@@ -0,0 +1,4 @@
1
+ export { HTTPEvalRunEventProvider } from './http';
2
+ export { LocalEvalRunEventProvider } from './local';
3
+ export { JSONEvalRunEventProvider } from './json';
4
+ export { CompositeEvalRunEventProvider } from './composite';
@@ -0,0 +1,46 @@
1
+ import {
2
+ type EvalRunEventProvider,
3
+ type EvalRunStartEvent,
4
+ type EvalRunCompleteEvent,
5
+ } from '@agentuity/core';
6
+
7
+ /**
8
+ * An implementation of the EvalRunEventProvider which writes to JSON files
9
+ */
10
+ export class JSONEvalRunEventProvider implements EvalRunEventProvider {
11
+ private exportDir: string;
12
+
13
+ constructor(exportDir: string) {
14
+ this.exportDir = exportDir;
15
+ }
16
+
17
+ /**
18
+ * called when the eval run starts
19
+ *
20
+ * @param event EvalRunStartEvent
21
+ */
22
+ async start(event: EvalRunStartEvent): Promise<void> {
23
+ const data = {
24
+ type: 'evalrun_start',
25
+ timestamp: Date.now(),
26
+ ...event,
27
+ };
28
+ const filename = `${this.exportDir}/evalrun-${event.id}-start.json`;
29
+ await Bun.write(filename, JSON.stringify(data, null, 2));
30
+ }
31
+
32
+ /**
33
+ * called when the eval run completes
34
+ *
35
+ * @param event EvalRunCompleteEvent
36
+ */
37
+ async complete(event: EvalRunCompleteEvent): Promise<void> {
38
+ const data = {
39
+ type: 'evalrun_complete',
40
+ timestamp: Date.now(),
41
+ ...event,
42
+ };
43
+ const filename = `${this.exportDir}/evalrun-${event.id}-complete.json`;
44
+ await Bun.write(filename, JSON.stringify(data, null, 2));
45
+ }
46
+ }
@@ -0,0 +1,28 @@
1
+ import {
2
+ type EvalRunEventProvider,
3
+ type EvalRunStartEvent,
4
+ type EvalRunCompleteEvent,
5
+ } from '@agentuity/core';
6
+
7
+ /**
8
+ * An implementation of the EvalRunEventProvider which just logs locally
9
+ */
10
+ export class LocalEvalRunEventProvider implements EvalRunEventProvider {
11
+ /**
12
+ * called when the eval run starts
13
+ *
14
+ * @param event EvalRunStartEvent
15
+ */
16
+ async start(event: EvalRunStartEvent): Promise<void> {
17
+ console.log('EvalRun started:', event);
18
+ }
19
+
20
+ /**
21
+ * called when the eval run completes
22
+ *
23
+ * @param event EvalRunCompleteEvent
24
+ */
25
+ async complete(event: EvalRunCompleteEvent): Promise<void> {
26
+ console.log('EvalRun completed:', event);
27
+ }
28
+ }