@agentuity/runtime 0.0.95 → 0.0.97

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 (72) hide show
  1. package/AGENTS.md +3 -1
  2. package/dist/_events.d.ts +64 -0
  3. package/dist/_events.d.ts.map +1 -0
  4. package/dist/_events.js +92 -0
  5. package/dist/_events.js.map +1 -0
  6. package/dist/_idle.d.ts +1 -1
  7. package/dist/_idle.d.ts.map +1 -1
  8. package/dist/_idle.js +2 -16
  9. package/dist/_idle.js.map +1 -1
  10. package/dist/_server.d.ts +30 -13
  11. package/dist/_server.d.ts.map +1 -1
  12. package/dist/_server.js +39 -572
  13. package/dist/_server.js.map +1 -1
  14. package/dist/_services.d.ts.map +1 -1
  15. package/dist/_services.js +4 -2
  16. package/dist/_services.js.map +1 -1
  17. package/dist/_standalone.d.ts.map +1 -1
  18. package/dist/_standalone.js +2 -1
  19. package/dist/_standalone.js.map +1 -1
  20. package/dist/agent.d.ts.map +1 -1
  21. package/dist/agent.js +13 -17
  22. package/dist/agent.js.map +1 -1
  23. package/dist/app.d.ts +58 -171
  24. package/dist/app.d.ts.map +1 -1
  25. package/dist/app.js +119 -218
  26. package/dist/app.js.map +1 -1
  27. package/dist/index.d.ts +11 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +18 -3
  30. package/dist/index.js.map +1 -1
  31. package/dist/middleware.d.ts +29 -0
  32. package/dist/middleware.d.ts.map +1 -0
  33. package/dist/middleware.js +200 -0
  34. package/dist/middleware.js.map +1 -0
  35. package/dist/router.d.ts.map +1 -1
  36. package/dist/router.js +5 -2
  37. package/dist/router.js.map +1 -1
  38. package/dist/services/local/vector.d.ts.map +1 -1
  39. package/dist/services/local/vector.js +3 -2
  40. package/dist/services/local/vector.js.map +1 -1
  41. package/dist/services/thread/local.d.ts +20 -0
  42. package/dist/services/thread/local.d.ts.map +1 -0
  43. package/dist/services/thread/local.js +76 -0
  44. package/dist/services/thread/local.js.map +1 -0
  45. package/dist/session.d.ts +60 -8
  46. package/dist/session.d.ts.map +1 -1
  47. package/dist/session.js +186 -54
  48. package/dist/session.js.map +1 -1
  49. package/dist/web.d.ts +8 -0
  50. package/dist/web.d.ts.map +1 -0
  51. package/dist/web.js +66 -0
  52. package/dist/web.js.map +1 -0
  53. package/dist/workbench.d.ts +2 -0
  54. package/dist/workbench.d.ts.map +1 -1
  55. package/dist/workbench.js +192 -39
  56. package/dist/workbench.js.map +1 -1
  57. package/package.json +10 -10
  58. package/src/_events.ts +142 -0
  59. package/src/_idle.ts +2 -18
  60. package/src/_server.ts +48 -681
  61. package/src/_services.ts +4 -2
  62. package/src/_standalone.ts +2 -1
  63. package/src/agent.ts +11 -14
  64. package/src/app.ts +164 -246
  65. package/src/index.ts +42 -4
  66. package/src/middleware.ts +252 -0
  67. package/src/router.ts +6 -2
  68. package/src/services/local/vector.ts +3 -2
  69. package/src/services/thread/local.ts +106 -0
  70. package/src/session.ts +238 -59
  71. package/src/web.ts +75 -0
  72. package/src/workbench.ts +226 -38
package/dist/_server.js CHANGED
@@ -1,34 +1,15 @@
1
- import { context, SpanKind, SpanStatusCode, trace, propagation, } from '@opentelemetry/api';
2
- import { TraceState } from '@opentelemetry/core';
3
- import { ServiceException } from '@agentuity/core';
4
- import { cors } from 'hono/cors';
5
- import { createMiddleware } from 'hono/factory';
6
- import { Hono } from 'hono';
7
- import { HTTPException } from 'hono/http-exception';
8
- import { matchedRoutes } from 'hono/route';
9
- import { websocket } from 'hono/bun';
10
- import { join } from 'node:path';
11
- import { extractTraceContextFromRequest } from './otel/http';
12
- import { register } from './otel/config';
13
- import { internal } from './logger/internal';
14
- import { isIdle } from './_idle';
15
- import * as runtimeConfig from './_config';
16
- import { runInHTTPContext } from './_context';
17
- import { runAgentShutdowns, createAgentMiddleware } from './agent';
18
- import { enableProcessExitProtection, internalExit } from './_process-protection';
19
- import { createServices, getThreadProvider, getSessionProvider, getSessionEventProvider, getServices, } from './_services';
20
- import { generateId } from './session';
21
- import WaitUntilHandler from './_waituntil';
22
- import registerTokenProcessor, { TOKENS_HEADER, DURATION_HEADER } from './_tokens';
23
- const SESSION_HEADER = 'x-session-id';
24
- let globalServerInstance = null;
1
+ /**
2
+ * Minimal server globals for Vite-native architecture
3
+ * The server is managed by Vite (dev) or Bun.serve in the generated entry file (prod)
4
+ */
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
6
  let globalRouterInstance = null;
26
7
  let globalLogger = null;
8
+ let globalTracer = null;
9
+ const spanProcessors = [];
27
10
  /**
28
11
  * List of AgentContext properties that should trigger helpful error messages
29
12
  * when accessed directly on HonoContext in route handlers.
30
- *
31
- * Users should access these via c.var.propertyName instead of c.propertyName.
32
13
  */
33
14
  export const AGENT_CONTEXT_PROPERTIES = [
34
15
  'logger',
@@ -44,572 +25,58 @@ export const AGENT_CONTEXT_PROPERTIES = [
44
25
  'app',
45
26
  'waitUntil',
46
27
  ];
47
- /**
48
- * Install helpful error messages on HonoContext for AgentContext properties.
49
- * When users try to access c.logger instead of c.var.logger in route handlers,
50
- * they'll get a clear error message explaining the correct usage.
51
- */
52
- function installContextPropertyHelpers(c) {
53
- for (const property of AGENT_CONTEXT_PROPERTIES) {
54
- // Skip if property already exists (e.g., native Hono properties)
55
- if (Object.prototype.hasOwnProperty.call(c, property)) {
56
- continue;
57
- }
58
- Object.defineProperty(c, property, {
59
- get() {
60
- throw new Error(`In route handlers, use c.var.${property} instead of c.${property}. ` +
61
- `The property '${property}' is available on AgentContext (for agent handlers) ` +
62
- `but must be accessed via c.var in HonoContext (route handlers).`);
63
- },
64
- set() {
65
- throw new Error(`In route handlers, use c.var.${property} instead of c.${property}. ` +
66
- `The property '${property}' is available on AgentContext (for agent handlers) ` +
67
- `but must be accessed via c.var in HonoContext (route handlers).`);
68
- },
69
- configurable: true,
70
- enumerable: false,
71
- });
72
- }
28
+ export function getRouter() {
29
+ return globalRouterInstance;
73
30
  }
74
- let globalTracer = null;
75
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
- let globalAppState = null;
77
- export function getServer() {
78
- return globalServerInstance;
32
+ export function setGlobalRouter(router) {
33
+ globalRouterInstance = router;
79
34
  }
80
- export function getRouter() {
81
- return globalRouterInstance;
35
+ /**
36
+ * Returns the global logger instance.
37
+ * This is a singleton created during application initialization.
38
+ */
39
+ export function createLogger() {
40
+ return globalLogger;
82
41
  }
83
- // Workbench routing is now handled by the bundle plugin
84
42
  export function getLogger() {
85
43
  return globalLogger;
86
44
  }
45
+ export function setGlobalLogger(logger) {
46
+ globalLogger = logger;
47
+ }
87
48
  export function getTracer() {
88
49
  return globalTracer;
89
50
  }
90
- export function getAppState() {
91
- return globalAppState;
92
- }
93
- function isDevelopment() {
94
- const devmode = runtimeConfig.isDevMode();
95
- const environment = runtimeConfig.getEnvironment();
96
- return devmode || environment === 'development';
97
- }
98
- function getPort() {
99
- return Number.parseInt(process.env.AGENTUITY_PORT ?? process.env.PORT ?? '3500', 10) || 3500;
51
+ export function setGlobalTracer(tracer) {
52
+ globalTracer = tracer;
100
53
  }
101
- const spanProcessors = [];
102
54
  /**
103
- * add a custom span processor that will be added to the otel configuration. this method must be
104
- * called before the createApp is called for it to be added.
55
+ * Add a custom span processor that will be added to the otel configuration.
56
+ * This method must be called before the server is initialized.
105
57
  */
106
58
  export function addSpanProcessor(processor) {
107
59
  spanProcessors.push(processor);
108
60
  }
109
- function registerAgentuitySpanProcessor() {
110
- const orgId = runtimeConfig.getOrganizationId();
111
- const projectId = runtimeConfig.getProjectId();
112
- const deploymentId = runtimeConfig.getDeploymentId();
113
- const devmode = runtimeConfig.isDevMode();
114
- const environment = runtimeConfig.getEnvironment();
115
- class RegisterAgentSpanProcessor {
116
- onStart(span, _context) {
117
- const attrs = {
118
- '@agentuity/orgId': orgId,
119
- '@agentuity/projectId': projectId,
120
- '@agentuity/deploymentId': deploymentId,
121
- '@agentuity/devmode': devmode,
122
- '@agentuity/environment': environment,
123
- };
124
- span.setAttributes(attrs);
125
- }
126
- onEnd(_span) {
127
- return;
128
- }
129
- forceFlush() {
130
- return Promise.resolve();
131
- }
132
- shutdown() {
133
- return Promise.resolve();
134
- }
135
- }
136
- addSpanProcessor(new RegisterAgentSpanProcessor());
61
+ export function getSpanProcessors() {
62
+ return spanProcessors;
137
63
  }
64
+ /**
65
+ * Helper to cast HonoContext to include private variables
66
+ */
138
67
  export function privateContext(c) {
139
68
  return c;
140
69
  }
141
- let startupPromise;
142
- let startupPromiseResolver;
143
- let isShutdown = false;
70
+ /**
71
+ * No-op for Vite-native architecture (Vite manages server lifecycle)
72
+ */
144
73
  export const notifyReady = () => {
145
- startupPromiseResolver?.();
146
- };
147
- export const createServer = async (router, appStateInitializer, config) => {
148
- if (globalServerInstance) {
149
- return [globalServerInstance, globalAppState];
150
- }
151
- const { promise, resolve } = Promise.withResolvers();
152
- startupPromise = promise;
153
- startupPromiseResolver = resolve;
154
- runtimeConfig.init();
155
- const logLevel = process.env.AGENTUITY_LOG_LEVEL || 'info';
156
- const port = getPort();
157
- const hostname = '127.0.0.1';
158
- const serverUrl = `http://${hostname}:${port}`;
159
- // Enable process.exit protection before any user code can run
160
- enableProcessExitProtection();
161
- // this must come before registering any otel stuff
162
- registerAgentuitySpanProcessor();
163
- registerTokenProcessor();
164
- // Create the telemetry and logger
165
- const otel = register({ processors: spanProcessors, logLevel: logLevel });
166
- // Create services (may return local router)
167
- const servicesResult = createServices(otel.logger, config, serverUrl);
168
- // Create the App State
169
- globalAppState = await appStateInitializer();
170
- globalRouterInstance = router;
171
- globalLogger = otel.logger;
172
- globalTracer = otel.tracer;
173
- router.onError((error, _c) => {
174
- if (error instanceof HTTPException) {
175
- otel.logger.error('HTTP Error: %s (%d)', error.cause, error.status);
176
- return error.getResponse();
177
- }
178
- if (error.name === 'UnauthenticatedError') {
179
- otel.logger.error('Unauthenticated Error: %s', error.message);
180
- return new Response(error.message, { status: 501 });
181
- }
182
- if (error instanceof ServiceException) {
183
- const serviceError = error;
184
- otel.logger.error('Service Exception: %s (%s returned HTTP status code: %d%s)', error.message, serviceError.url, serviceError.statusCode, serviceError.sessionId ? `, session: ${serviceError.sessionId}` : '');
185
- return new Response(error.message, {
186
- status: serviceError.statusCode ?? 500,
187
- });
188
- }
189
- otel.logger.error('Unhandled Server Error: %s', error);
190
- return new Response('Internal Server Error', { status: 500 });
191
- });
192
- const blockOnStartup = async () => {
193
- // block until completing the setup if still running
194
- if (startupPromise) {
195
- await startupPromise;
196
- startupPromise = undefined;
197
- startupPromiseResolver = undefined;
198
- }
199
- };
200
- router.get('/_health', async (c) => {
201
- await blockOnStartup();
202
- return c.text('OK');
203
- });
204
- router.use(async (c, next) => {
205
- await blockOnStartup();
206
- c.set('logger', otel.logger);
207
- c.set('tracer', otel.tracer);
208
- c.set('meter', otel.meter);
209
- c.set('app', globalAppState);
210
- // Set storage services so they're available in c.var
211
- const services = getServices();
212
- c.set('kv', services.kv);
213
- c.set('stream', services.stream);
214
- c.set('vector', services.vector);
215
- // Add helpful error messages for common mistakes
216
- // Users should use c.var.XYZ in route handlers, not c.XYZ
217
- installContextPropertyHelpers(c);
218
- const isWebSocket = c.req.header('upgrade')?.toLowerCase() === 'websocket';
219
- const skipLogging = c.req.path.startsWith('/_agentuity/');
220
- const started = performance.now();
221
- if (!skipLogging) {
222
- otel.logger.debug('%s %s started', c.req.method, c.req.path);
223
- }
224
- await runInHTTPContext(c, next);
225
- // Calculate and add duration header for all HTTP requests (not WebSocket)
226
- if (!isWebSocket) {
227
- const endTime = performance.now();
228
- const duration = ((endTime - started) / 1000).toFixed(1); // Duration in seconds
229
- c.header(DURATION_HEADER, `${duration}s`);
230
- }
231
- // Don't log completion for websocket upgrades - they stay open
232
- if (!skipLogging && !isWebSocket) {
233
- otel.logger.debug('%s %s completed (%d) in %sms', c.req.method, c.req.path, c.res.status, Number(performance.now() - started).toFixed(2));
234
- }
235
- });
236
- // setup the cors middleware
237
- router.use('*', cors({
238
- origin: config?.cors?.origin ?? ((origin) => origin),
239
- allowHeaders: config?.cors?.allowHeaders ?? [
240
- 'Content-Type',
241
- 'Authorization',
242
- 'Accept',
243
- 'Origin',
244
- 'X-Requested-With',
245
- ],
246
- allowMethods: ['POST', 'GET', 'OPTIONS', 'HEAD', 'PUT', 'DELETE', 'PATCH'],
247
- exposeHeaders: [
248
- 'Content-Length',
249
- TOKENS_HEADER,
250
- DURATION_HEADER,
251
- SESSION_HEADER,
252
- 'x-deployment',
253
- ],
254
- maxAge: 600,
255
- credentials: true,
256
- ...(config?.cors ?? {}), // allow the app config to override
257
- }));
258
- router.route('/_agentuity', createAgentuityAPIs());
259
- // Mount local storage router if using local services
260
- if (servicesResult?.localRouter) {
261
- router.route('/', servicesResult.localRouter);
262
- }
263
- // we create a middleware that attempts to match our routeid to the incoming route
264
- let routeMapping;
265
- const routePathMapper = createMiddleware(async (c, next) => {
266
- if (!routeMapping) {
267
- // Look for .routemapping.json in the project's directory
268
- // This is where the build plugin writes it (build.config.outdir)
269
- const projectRoot = process.cwd();
270
- let routeMappingPath;
271
- if (projectRoot === '/home/agentuity/app') {
272
- // in production there is no .agentuity folder
273
- routeMappingPath = join(projectRoot, '.routemapping.json');
274
- }
275
- else {
276
- // in dev mode, look in .agentuity folder (where build writes it)
277
- routeMappingPath = join(projectRoot, '.agentuity', '.routemapping.json');
278
- }
279
- const file = Bun.file(routeMappingPath);
280
- if (!(await file.exists())) {
281
- internal.warn('Route mapping file not found at %s. Route tracking will be disabled.', routeMappingPath);
282
- routeMapping = {}; // Empty mapping, no route tracking
283
- }
284
- else {
285
- routeMapping = (await file.json());
286
- }
287
- }
288
- const matches = matchedRoutes(c).filter((m) => m.method !== 'ALL' && (m.path.startsWith('/api') || m.path.startsWith('/agent/')));
289
- const _c = privateContext(c);
290
- if (matches.length > 0) {
291
- const method = c.req.method.toLowerCase();
292
- for (const m of matches) {
293
- const found = routeMapping[`${method} ${m.path}`];
294
- if (found) {
295
- _c.set('routeId', found);
296
- break;
297
- }
298
- }
299
- }
300
- _c.set('trigger', 'api'); // will get overwritten below if another trigger
301
- return next();
302
- });
303
- router.use('/api/*', routePathMapper);
304
- // set the trigger for specific types
305
- for (const trigger of ['sms', 'email', 'cron']) {
306
- const middleware = createMiddleware(async (c, next) => {
307
- const _c = privateContext(c);
308
- _c.set('trigger', trigger);
309
- await next();
310
- });
311
- router.use(`/api/${trigger}/*`, middleware);
312
- }
313
- // otelMiddleware must run before createAgentMiddleware to set session/thread
314
- router.use('/api/*', otelMiddleware);
315
- // Attach services and agent registry to context for API routes
316
- router.use('/api/*', async (c, next) => {
317
- // Use a null agent name to just populate the agent registry without setting current agent
318
- return createAgentMiddleware('')(c, next);
319
- });
320
- // Apply otelMiddleware to workbench routes for full telemetry and session tracking
321
- if (config?.services?.workbench) {
322
- // otelMiddleware must run before createAgentMiddleware to set session/thread
323
- router.use('/_agentuity/workbench/*', otelMiddleware);
324
- router.use('/_agentuity/workbench/*', async (c, next) => {
325
- // Use a null agent name to just populate the agent registry without setting current agent
326
- return createAgentMiddleware('')(c, next);
327
- });
328
- }
329
- const shutdown = async () => {
330
- if (isShutdown) {
331
- return;
332
- }
333
- otel.logger.debug('shutdown started');
334
- isShutdown = true;
335
- // Force exit after timeout if cleanup hangs
336
- const forceExitTimer = setTimeout(() => {
337
- otel.logger.warn('shutdown timed out after 5s, forcing exit');
338
- internalExit(1);
339
- }, 5_000);
340
- try {
341
- // stop accepting new connections
342
- if (globalServerInstance) {
343
- await globalServerInstance.stop();
344
- }
345
- // wait for idle
346
- const shutdownStarted = Date.now();
347
- otel.logger.debug('waiting for pending connections to complete');
348
- while (Date.now() - shutdownStarted < 60_000 * 2) {
349
- if ((globalServerInstance?.pendingRequests ?? 0) > 0) {
350
- await Bun.sleep(1_000);
351
- }
352
- else {
353
- break;
354
- }
355
- }
356
- otel.logger.debug('no more pending connections');
357
- // Run agent shutdowns first
358
- await runAgentShutdowns(globalAppState);
359
- // Run app shutdown if provided
360
- if (config?.shutdown && globalAppState) {
361
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
362
- await config.shutdown(globalAppState);
363
- }
364
- await otel.shutdown();
365
- otel.logger.debug('shutdown completed');
366
- }
367
- finally {
368
- clearTimeout(forceExitTimer);
369
- }
370
- };
371
- process.on('beforeExit', async () => await shutdown());
372
- // Handle synchronous exit event - can't do async work here
373
- process.on('exit', (code) => {
374
- if (!isShutdown) {
375
- otel.logger.debug('process exiting with code %d before shutdown completed', code);
376
- }
377
- });
378
- process.once('SIGINT', async () => {
379
- await shutdown();
380
- internalExit(0);
381
- });
382
- process.once('SIGTERM', async () => {
383
- await shutdown();
384
- internalExit(0);
385
- });
386
- process.once('uncaughtException', async (err) => {
387
- otel.logger.error('An uncaught exception was received: %s', err);
388
- await shutdown();
389
- internalExit(1);
390
- });
391
- process.once('unhandledRejection', async (reason) => {
392
- otel.logger.error('An unhandled promise rejection was received: %s', reason);
393
- await shutdown();
394
- internalExit(1);
395
- });
396
- const server = Bun.serve({
397
- hostname,
398
- development: isDevelopment(),
399
- fetch: router.fetch,
400
- idleTimeout: 0,
401
- port,
402
- websocket,
403
- id: null,
404
- });
405
- globalServerInstance = server;
406
- return [server, globalAppState];
407
- };
408
- const createAgentuityAPIs = () => {
409
- const router = new Hono();
410
- router.get('idle', (c) => {
411
- if (isIdle() && !isShutdown) {
412
- return c.text('OK', { status: 200 });
413
- }
414
- return c.text('NO', { status: 200 });
415
- });
416
- router.get('health', (c) => c.text('OK'));
417
- return router;
74
+ // No-op: Vite handles server readiness
418
75
  };
419
- const otelMiddleware = createMiddleware(async (c, next) => {
420
- // Extract trace context from headers
421
- const extractedContext = extractTraceContextFromRequest(c.req.raw);
422
- const method = c.req.method;
423
- const url = new URL(c.req.url);
424
- const threadProvider = getThreadProvider();
425
- const sessionProvider = getSessionProvider();
426
- const sessionEventProvider = getSessionEventProvider();
427
- // Execute the request handler within the extracted context
428
- await context.with(extractedContext, async () => {
429
- // Create a span for this incoming request
430
- const tracer = trace.getTracer('http-server');
431
- await tracer.startActiveSpan(`HTTP ${method}`, {
432
- kind: SpanKind.SERVER,
433
- attributes: {
434
- 'http.method': method,
435
- 'http.host': url.host,
436
- 'http.user_agent': c.req.header('user-agent') || '',
437
- 'http.path': url.pathname,
438
- },
439
- }, async (span) => {
440
- const sctx = span.spanContext();
441
- const sessionId = sctx?.traceId ? `sess_${sctx.traceId}` : generateId('sess');
442
- // Add to tracestate
443
- let traceState = sctx.traceState ?? new TraceState();
444
- const projectId = runtimeConfig.getProjectId();
445
- const orgId = runtimeConfig.getOrganizationId();
446
- const deploymentId = runtimeConfig.getDeploymentId();
447
- const isDevMode = runtimeConfig.isDevMode();
448
- if (projectId) {
449
- traceState = traceState.set('pid', projectId);
450
- }
451
- if (orgId) {
452
- traceState = traceState.set('oid', orgId);
453
- }
454
- if (isDevMode) {
455
- traceState = traceState.set('d', '1');
456
- }
457
- sctx.traceState = traceState;
458
- const thread = await threadProvider.restore(c);
459
- const session = await sessionProvider.restore(thread, sessionId);
460
- const handler = new WaitUntilHandler(tracer);
461
- const _c = privateContext(c);
462
- const agentIds = new Set();
463
- _c.set('agentIds', agentIds);
464
- const shouldSendSession = !!(orgId && projectId && _c.var.routeId);
465
- let canSendSessionEvents = true;
466
- if (shouldSendSession) {
467
- await sessionEventProvider
468
- .start({
469
- id: sessionId,
470
- orgId,
471
- projectId,
472
- threadId: thread.id,
473
- routeId: _c.var.routeId,
474
- deploymentId,
475
- devmode: isDevMode,
476
- environment: runtimeConfig.getEnvironment(),
477
- method: c.req.method,
478
- url: c.req.url,
479
- trigger: _c.var.trigger,
480
- })
481
- .catch((ex) => {
482
- canSendSessionEvents = false;
483
- c.var.logger.error('error sending session start event: %s', ex);
484
- });
485
- }
486
- c.set('sessionId', sessionId);
487
- c.set('thread', thread);
488
- c.set('session', session);
489
- _c.set('waitUntilHandler', handler);
490
- let hasPendingWaits = false;
491
- try {
492
- await next();
493
- if (handler?.hasPending()) {
494
- hasPendingWaits = true;
495
- handler
496
- .waitUntilAll(c.var.logger, sessionId)
497
- .then(async () => {
498
- c.var.logger.debug('wait until finished for session %s', sessionId);
499
- await sessionProvider.save(session);
500
- await threadProvider.save(thread);
501
- span.setStatus({ code: SpanStatusCode.OK });
502
- if (shouldSendSession && canSendSessionEvents) {
503
- const userData = session.serializeUserData();
504
- sessionEventProvider
505
- .complete({
506
- id: sessionId,
507
- threadId: thread.empty() ? null : thread.id,
508
- statusCode: c.res.status,
509
- agentIds: Array.from(agentIds),
510
- userData,
511
- })
512
- .then(() => { })
513
- .catch((ex) => c.var.logger.error(ex));
514
- }
515
- })
516
- .catch((ex) => {
517
- c.var.logger.error('wait until errored for session %s. %s', sessionId, ex);
518
- if (ex instanceof Error) {
519
- span.recordException(ex);
520
- }
521
- const message = ex.message ?? String(ex);
522
- span.setStatus({
523
- code: SpanStatusCode.ERROR,
524
- message,
525
- });
526
- c.var.logger.error(message);
527
- if (shouldSendSession && canSendSessionEvents) {
528
- const userData = session.serializeUserData();
529
- sessionEventProvider
530
- .complete({
531
- id: sessionId,
532
- threadId: thread.empty() ? null : thread.id,
533
- statusCode: c.res.status,
534
- error: message,
535
- agentIds: Array.from(agentIds),
536
- userData,
537
- })
538
- .then(() => { })
539
- .catch((ex) => c.var.logger.error(ex));
540
- }
541
- })
542
- .finally(() => {
543
- span.end();
544
- });
545
- }
546
- else {
547
- span.setStatus({ code: SpanStatusCode.OK });
548
- if (shouldSendSession && canSendSessionEvents) {
549
- const userData = session.serializeUserData();
550
- sessionEventProvider
551
- .complete({
552
- id: sessionId,
553
- threadId: thread.empty() ? null : thread.id,
554
- statusCode: c.res.status,
555
- agentIds: Array.from(agentIds),
556
- userData,
557
- })
558
- .then(() => { })
559
- .catch((ex) => c.var.logger.error(ex));
560
- }
561
- }
562
- }
563
- catch (ex) {
564
- if (ex instanceof Error) {
565
- span.recordException(ex);
566
- }
567
- const message = ex.message ?? String(ex);
568
- span.setStatus({
569
- code: SpanStatusCode.ERROR,
570
- message,
571
- });
572
- c.var.logger.error(message);
573
- if (shouldSendSession && canSendSessionEvents) {
574
- const userData = session.serializeUserData();
575
- sessionEventProvider
576
- .complete({
577
- id: sessionId,
578
- threadId: thread.empty() ? null : thread.id,
579
- statusCode: c.res.status,
580
- error: message,
581
- agentIds: Array.from(agentIds),
582
- userData,
583
- })
584
- .then(() => { })
585
- .catch((ex) => c.var.logger.error(ex));
586
- }
587
- throw ex;
588
- }
589
- finally {
590
- // add otel headers into HTTP response
591
- const headers = {};
592
- propagation.inject(context.active(), headers);
593
- for (const key of Object.keys(headers)) {
594
- c.header(key, headers[key]);
595
- }
596
- // add session and deployment headers
597
- const traceId = sctx?.traceId || sessionId.replace(/^sess_/, '');
598
- c.header(SESSION_HEADER, `sess_${traceId}`);
599
- if (deploymentId) {
600
- c.header('x-deployment', deploymentId);
601
- }
602
- if (!hasPendingWaits) {
603
- try {
604
- await sessionProvider.save(session);
605
- await threadProvider.save(thread);
606
- }
607
- finally {
608
- span.end();
609
- }
610
- }
611
- }
612
- });
613
- });
614
- });
76
+ /**
77
+ * No-op for Vite-native architecture (returns null)
78
+ */
79
+ export function getServer() {
80
+ return null;
81
+ }
615
82
  //# sourceMappingURL=_server.js.map