@agentuity/runtime 0.0.50 → 0.0.52
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/dist/_config.js +99 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.js +82 -0
- package/dist/_context.js.map +1 -0
- package/dist/_idle.js +24 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_server.js +489 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.js +258 -0
- package/dist/_services.js.map +1 -0
- package/dist/_tokens.js +98 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_waituntil.js +87 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.js +507 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/eval.js +2 -0
- package/dist/eval.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io/email.js +154 -0
- package/dist/io/email.js.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/otel/config.js +23 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.js +52 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.js +81 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.js +278 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.js +233 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.js +74 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.js +144 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.js +60 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.js +42 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.js +8 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.js +114 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/objectstore.js +117 -0
- package/dist/services/local/objectstore.js.map +1 -0
- package/dist/services/local/stream.js +218 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.js +183 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.js +42 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.js +22 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/session.js +199 -0
- package/dist/session.js.map +1 -0
- package/dist/workbench.js +38 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +7 -7
- package/src/app.ts +6 -1
package/dist/_server.js
ADDED
|
@@ -0,0 +1,489 @@
|
|
|
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 { isIdle } from './_idle';
|
|
14
|
+
import * as runtimeConfig from './_config';
|
|
15
|
+
import { inAgentContext, getAgentContext, runInHTTPContext } from './_context';
|
|
16
|
+
import { createServices, getThreadProvider, getSessionProvider, getSessionEventProvider, } from './_services';
|
|
17
|
+
import { generateId } from './session';
|
|
18
|
+
import WaitUntilHandler from './_waituntil';
|
|
19
|
+
import registerTokenProcessor, { TOKENS_HEADER } from './_tokens';
|
|
20
|
+
const SESSION_HEADER = 'x-session-id';
|
|
21
|
+
let globalServerInstance = null;
|
|
22
|
+
let globalRouterInstance = null;
|
|
23
|
+
let globalLogger = null;
|
|
24
|
+
let globalTracer = null;
|
|
25
|
+
export function getServer() {
|
|
26
|
+
return globalServerInstance;
|
|
27
|
+
}
|
|
28
|
+
export function getRouter() {
|
|
29
|
+
return globalRouterInstance;
|
|
30
|
+
}
|
|
31
|
+
export function getLogger() {
|
|
32
|
+
return globalLogger;
|
|
33
|
+
}
|
|
34
|
+
export function getTracer() {
|
|
35
|
+
return globalTracer;
|
|
36
|
+
}
|
|
37
|
+
function isDevelopment() {
|
|
38
|
+
const devmode = runtimeConfig.isDevMode();
|
|
39
|
+
const environment = runtimeConfig.getEnvironment();
|
|
40
|
+
return devmode || environment === 'development';
|
|
41
|
+
}
|
|
42
|
+
function getPort() {
|
|
43
|
+
return Number.parseInt(process.env.AGENTUITY_PORT ?? process.env.PORT ?? '3500', 10) || 3500;
|
|
44
|
+
}
|
|
45
|
+
const spanProcessors = [];
|
|
46
|
+
/**
|
|
47
|
+
* add a custom span processor that will be added to the otel configuration. this method must be
|
|
48
|
+
* called before the createApp is called for it to be added.
|
|
49
|
+
*/
|
|
50
|
+
export function addSpanProcessor(processor) {
|
|
51
|
+
spanProcessors.push(processor);
|
|
52
|
+
}
|
|
53
|
+
function registerAgentuitySpanProcessor() {
|
|
54
|
+
const orgId = runtimeConfig.getOrganizationId();
|
|
55
|
+
const projectId = runtimeConfig.getProjectId();
|
|
56
|
+
const deploymentId = runtimeConfig.getDeploymentId();
|
|
57
|
+
const devmode = runtimeConfig.isDevMode();
|
|
58
|
+
const environment = runtimeConfig.getEnvironment();
|
|
59
|
+
class RegisterAgentSpanProcessor {
|
|
60
|
+
onStart(span, _context) {
|
|
61
|
+
const attrs = {
|
|
62
|
+
'@agentuity/orgId': orgId,
|
|
63
|
+
'@agentuity/projectId': projectId,
|
|
64
|
+
'@agentuity/deploymentId': deploymentId,
|
|
65
|
+
'@agentuity/devmode': devmode,
|
|
66
|
+
'@agentuity/environment': environment,
|
|
67
|
+
};
|
|
68
|
+
if (inAgentContext()) {
|
|
69
|
+
const agentCtx = getAgentContext();
|
|
70
|
+
if (agentCtx.current?.metadata) {
|
|
71
|
+
attrs['@agentuity/agentId'] = agentCtx.current.metadata.id;
|
|
72
|
+
attrs['@agentuity/agentIdentifier'] = agentCtx.current.metadata.agentId;
|
|
73
|
+
attrs['@agentuity/agentDescription'] = agentCtx.current.metadata.description;
|
|
74
|
+
attrs['@agentuity/agentName'] = agentCtx.current.metadata.name;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
span.setAttributes(attrs);
|
|
78
|
+
}
|
|
79
|
+
onEnd(_span) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
forceFlush() {
|
|
83
|
+
return Promise.resolve();
|
|
84
|
+
}
|
|
85
|
+
shutdown() {
|
|
86
|
+
return Promise.resolve();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
addSpanProcessor(new RegisterAgentSpanProcessor());
|
|
90
|
+
}
|
|
91
|
+
export function privateContext(c) {
|
|
92
|
+
return c;
|
|
93
|
+
}
|
|
94
|
+
export const createServer = (router, config) => {
|
|
95
|
+
if (globalServerInstance) {
|
|
96
|
+
return globalServerInstance;
|
|
97
|
+
}
|
|
98
|
+
const logLevel = process.env.AGENTUITY_LOG_LEVEL || 'info';
|
|
99
|
+
const port = getPort();
|
|
100
|
+
const hostname = '127.0.0.1';
|
|
101
|
+
const serverUrl = `http://${hostname}:${port}`;
|
|
102
|
+
// this must come before registering any otel stuff
|
|
103
|
+
registerAgentuitySpanProcessor();
|
|
104
|
+
registerTokenProcessor();
|
|
105
|
+
// Create the telemetry and logger
|
|
106
|
+
const otel = register({ processors: spanProcessors, logLevel: logLevel });
|
|
107
|
+
// Create services (may return local router)
|
|
108
|
+
const servicesResult = createServices(otel.logger, config, serverUrl);
|
|
109
|
+
const server = Bun.serve({
|
|
110
|
+
hostname,
|
|
111
|
+
development: isDevelopment(),
|
|
112
|
+
fetch: router.fetch,
|
|
113
|
+
idleTimeout: 0,
|
|
114
|
+
port,
|
|
115
|
+
websocket,
|
|
116
|
+
});
|
|
117
|
+
globalRouterInstance = router;
|
|
118
|
+
globalServerInstance = server;
|
|
119
|
+
globalLogger = otel.logger;
|
|
120
|
+
globalTracer = otel.tracer;
|
|
121
|
+
let isShutdown = false;
|
|
122
|
+
router.onError((error, _c) => {
|
|
123
|
+
if (error instanceof HTTPException) {
|
|
124
|
+
otel.logger.error('HTTP Error: %s (%d)', error.cause, error.status);
|
|
125
|
+
return error.getResponse();
|
|
126
|
+
}
|
|
127
|
+
if (error.name === 'UnauthenticatedError') {
|
|
128
|
+
otel.logger.error('Unauthenticated Error: %s', error.message);
|
|
129
|
+
return new Response(error.message, { status: 501 });
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof ServiceException ||
|
|
132
|
+
('statusCode' in error && typeof error.statusCode === 'number')) {
|
|
133
|
+
const serviceError = error;
|
|
134
|
+
otel.logger.error('Service Exception: %s (%s returned HTTP status code: %d)', error.message, serviceError.url, serviceError.statusCode);
|
|
135
|
+
return new Response(error.message, {
|
|
136
|
+
status: serviceError.statusCode ?? 500,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
otel.logger.error('Unhandled Server Error: %s', JSON.stringify(error));
|
|
140
|
+
return new Response('Internal Server Error', { status: 500 });
|
|
141
|
+
});
|
|
142
|
+
const threadProvider = getThreadProvider();
|
|
143
|
+
const sessionProvider = getSessionProvider();
|
|
144
|
+
let initPromise = new Promise((resolve, reject) => {
|
|
145
|
+
Promise.all([threadProvider.initialize(), sessionProvider.initialize()])
|
|
146
|
+
.then(() => resolve())
|
|
147
|
+
.catch(reject);
|
|
148
|
+
});
|
|
149
|
+
router.use(async (c, next) => {
|
|
150
|
+
if (initPromise) {
|
|
151
|
+
await initPromise;
|
|
152
|
+
initPromise = undefined;
|
|
153
|
+
}
|
|
154
|
+
c.set('logger', otel.logger);
|
|
155
|
+
c.set('tracer', otel.tracer);
|
|
156
|
+
c.set('meter', otel.meter);
|
|
157
|
+
const isWebSocket = c.req.header('upgrade')?.toLowerCase() === 'websocket';
|
|
158
|
+
const skipLogging = c.req.path.startsWith('/_agentuity/');
|
|
159
|
+
const started = performance.now();
|
|
160
|
+
if (!skipLogging) {
|
|
161
|
+
otel.logger.debug('%s %s started', c.req.method, c.req.path);
|
|
162
|
+
}
|
|
163
|
+
await runInHTTPContext(c, next);
|
|
164
|
+
// Don't log completion for websocket upgrades - they stay open
|
|
165
|
+
if (!skipLogging && !isWebSocket) {
|
|
166
|
+
otel.logger.debug('%s %s completed (%d) in %sms', c.req.method, c.req.path, c.res.status, Number(performance.now() - started).toFixed(2));
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// setup the cors middleware
|
|
170
|
+
router.use('*', cors({
|
|
171
|
+
origin: config?.cors?.origin ?? ((origin) => origin),
|
|
172
|
+
allowHeaders: config?.cors?.allowHeaders ?? [
|
|
173
|
+
'Content-Type',
|
|
174
|
+
'Authorization',
|
|
175
|
+
'Accept',
|
|
176
|
+
'Origin',
|
|
177
|
+
'X-Requested-With',
|
|
178
|
+
],
|
|
179
|
+
allowMethods: ['POST', 'GET', 'OPTIONS', 'HEAD', 'PUT', 'DELETE', 'PATCH'],
|
|
180
|
+
exposeHeaders: ['Content-Length', TOKENS_HEADER, SESSION_HEADER, 'x-deployment'],
|
|
181
|
+
maxAge: 600,
|
|
182
|
+
credentials: true,
|
|
183
|
+
...(config?.cors ?? {}), // allow the app config to override
|
|
184
|
+
}));
|
|
185
|
+
router.get('/_health', (c) => c.text('OK'));
|
|
186
|
+
router.route('/_agentuity', createAgentuityAPIs());
|
|
187
|
+
// Mount local storage router if using local services
|
|
188
|
+
if (servicesResult?.localRouter) {
|
|
189
|
+
router.route('/', servicesResult.localRouter);
|
|
190
|
+
}
|
|
191
|
+
// we create a middleware that attempts to match our routeid to the incoming route
|
|
192
|
+
let routeMapping;
|
|
193
|
+
const routePathMapper = createMiddleware(async (c, next) => {
|
|
194
|
+
if (!routeMapping) {
|
|
195
|
+
// Look for .routemapping.json in the project's .agentuity directory
|
|
196
|
+
// This is where the build plugin writes it (build.config.outdir)
|
|
197
|
+
const projectRoot = process.cwd();
|
|
198
|
+
let routeMappingPath;
|
|
199
|
+
if (projectRoot === '/home/agentuity/app') {
|
|
200
|
+
// in production there is no .agentuity folder
|
|
201
|
+
routeMappingPath = join(projectRoot, '.routemapping.json');
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
routeMappingPath = join(projectRoot, '.agentuity', '.routemapping.json');
|
|
205
|
+
}
|
|
206
|
+
const file = Bun.file(routeMappingPath);
|
|
207
|
+
if (!(await file.exists())) {
|
|
208
|
+
c.var.logger.fatal('error loading %s. this is a build issue!', routeMappingPath);
|
|
209
|
+
}
|
|
210
|
+
routeMapping = (await file.json());
|
|
211
|
+
}
|
|
212
|
+
const matches = matchedRoutes(c).filter((m) => m.method !== 'ALL' && (m.path.startsWith('/api') || m.path.startsWith('/agent/')));
|
|
213
|
+
const _c = privateContext(c);
|
|
214
|
+
if (matches.length > 0) {
|
|
215
|
+
const method = c.req.method.toLowerCase();
|
|
216
|
+
for (const m of matches) {
|
|
217
|
+
const found = routeMapping[`${method} ${m.path}`];
|
|
218
|
+
if (found) {
|
|
219
|
+
_c.set('routeId', found);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
_c.set('trigger', 'api'); // will get overwritten below if another trigger
|
|
225
|
+
return next();
|
|
226
|
+
});
|
|
227
|
+
router.use('/agent/*', routePathMapper);
|
|
228
|
+
router.use('/api/*', routePathMapper);
|
|
229
|
+
// Attach services and agent registry to context for API routes
|
|
230
|
+
router.use('/api/*', async (c, next) => {
|
|
231
|
+
const { createAgentMiddleware } = await import('./agent');
|
|
232
|
+
// Use a null agent name to just populate the agent registry without setting current agent
|
|
233
|
+
return createAgentMiddleware('')(c, next);
|
|
234
|
+
});
|
|
235
|
+
// set the trigger for specific types
|
|
236
|
+
for (const trigger of ['sms', 'email', 'cron']) {
|
|
237
|
+
const middleware = createMiddleware(async (c, next) => {
|
|
238
|
+
const _c = privateContext(c);
|
|
239
|
+
_c.set('trigger', trigger);
|
|
240
|
+
await next();
|
|
241
|
+
});
|
|
242
|
+
router.use(`/api/${trigger}/*`, middleware);
|
|
243
|
+
router.use(`/agent/${trigger}/*`, middleware);
|
|
244
|
+
}
|
|
245
|
+
router.use('/api/*', otelMiddleware);
|
|
246
|
+
router.use('/agent/*', otelMiddleware);
|
|
247
|
+
const shutdown = async () => {
|
|
248
|
+
if (isShutdown) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
otel.logger.debug('shutdown started');
|
|
252
|
+
isShutdown = true;
|
|
253
|
+
// Force exit after timeout if cleanup hangs
|
|
254
|
+
const forceExitTimer = setTimeout(() => {
|
|
255
|
+
otel.logger.warn('shutdown timed out after 5s, forcing exit');
|
|
256
|
+
process.exit(1);
|
|
257
|
+
}, 5_000);
|
|
258
|
+
try {
|
|
259
|
+
await server.stop();
|
|
260
|
+
await otel.shutdown();
|
|
261
|
+
otel.logger.debug('shutdown completed');
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
clearTimeout(forceExitTimer);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
process.on('beforeExit', async () => await shutdown());
|
|
268
|
+
// Handle synchronous exit event - can't do async work here
|
|
269
|
+
process.on('exit', (code) => {
|
|
270
|
+
if (!isShutdown) {
|
|
271
|
+
otel.logger.debug('process exiting with code %d before shutdown completed', code);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
process.once('SIGINT', async () => {
|
|
275
|
+
await shutdown();
|
|
276
|
+
process.exit(0);
|
|
277
|
+
});
|
|
278
|
+
process.once('SIGTERM', async () => {
|
|
279
|
+
await shutdown();
|
|
280
|
+
process.exit(0);
|
|
281
|
+
});
|
|
282
|
+
process.once('uncaughtException', async (err) => {
|
|
283
|
+
otel.logger.error('An uncaught exception was received: %s', err);
|
|
284
|
+
await shutdown();
|
|
285
|
+
process.exit(1);
|
|
286
|
+
});
|
|
287
|
+
process.once('unhandledRejection', async (reason) => {
|
|
288
|
+
otel.logger.error('An unhandled promise rejection was received: %s', reason);
|
|
289
|
+
await shutdown();
|
|
290
|
+
process.exit(1);
|
|
291
|
+
});
|
|
292
|
+
return server;
|
|
293
|
+
};
|
|
294
|
+
const createAgentuityAPIs = () => {
|
|
295
|
+
const router = new Hono();
|
|
296
|
+
router.get('idle', (c) => {
|
|
297
|
+
if (isIdle()) {
|
|
298
|
+
return c.text('OK', { status: 200 });
|
|
299
|
+
}
|
|
300
|
+
return c.text('NO', { status: 200 });
|
|
301
|
+
});
|
|
302
|
+
router.get('health', (c) => c.text('OK'));
|
|
303
|
+
return router;
|
|
304
|
+
};
|
|
305
|
+
const otelMiddleware = createMiddleware(async (c, next) => {
|
|
306
|
+
// Extract trace context from headers
|
|
307
|
+
const extractedContext = extractTraceContextFromRequest(c.req.raw);
|
|
308
|
+
const method = c.req.method;
|
|
309
|
+
const url = new URL(c.req.url);
|
|
310
|
+
const threadProvider = getThreadProvider();
|
|
311
|
+
const sessionProvider = getSessionProvider();
|
|
312
|
+
const sessionEventProvider = getSessionEventProvider();
|
|
313
|
+
// Execute the request handler within the extracted context
|
|
314
|
+
await context.with(extractedContext, async () => {
|
|
315
|
+
// Create a span for this incoming request
|
|
316
|
+
const tracer = trace.getTracer('http-server');
|
|
317
|
+
await tracer.startActiveSpan(`HTTP ${method}`, {
|
|
318
|
+
kind: SpanKind.SERVER,
|
|
319
|
+
attributes: {
|
|
320
|
+
'http.method': method,
|
|
321
|
+
'http.host': url.host,
|
|
322
|
+
'http.user_agent': c.req.header('user-agent') || '',
|
|
323
|
+
'http.path': url.pathname,
|
|
324
|
+
},
|
|
325
|
+
}, async (span) => {
|
|
326
|
+
const sctx = span.spanContext();
|
|
327
|
+
const sessionId = sctx?.traceId ? `sess_${sctx.traceId}` : generateId('sess');
|
|
328
|
+
// Add to tracestate
|
|
329
|
+
let traceState = sctx.traceState ?? new TraceState();
|
|
330
|
+
const projectId = runtimeConfig.getProjectId();
|
|
331
|
+
const orgId = runtimeConfig.getOrganizationId();
|
|
332
|
+
const deploymentId = runtimeConfig.getDeploymentId();
|
|
333
|
+
const isDevMode = runtimeConfig.isDevMode();
|
|
334
|
+
if (projectId) {
|
|
335
|
+
traceState = traceState.set('pid', projectId);
|
|
336
|
+
}
|
|
337
|
+
if (orgId) {
|
|
338
|
+
traceState = traceState.set('oid', orgId);
|
|
339
|
+
}
|
|
340
|
+
if (isDevMode) {
|
|
341
|
+
traceState = traceState.set('d', '1');
|
|
342
|
+
}
|
|
343
|
+
sctx.traceState = traceState;
|
|
344
|
+
const thread = await threadProvider.restore(c);
|
|
345
|
+
const session = await sessionProvider.restore(thread, sessionId);
|
|
346
|
+
const handler = new WaitUntilHandler(tracer);
|
|
347
|
+
const _c = privateContext(c);
|
|
348
|
+
const agentIds = new Set();
|
|
349
|
+
_c.set('agentIds', agentIds);
|
|
350
|
+
const shouldSendSession = orgId && projectId && _c.var.routeId;
|
|
351
|
+
let canSendSessionEvents = true;
|
|
352
|
+
if (shouldSendSession) {
|
|
353
|
+
await sessionEventProvider
|
|
354
|
+
.start({
|
|
355
|
+
id: sessionId,
|
|
356
|
+
orgId,
|
|
357
|
+
projectId,
|
|
358
|
+
threadId: thread.id,
|
|
359
|
+
routeId: _c.var.routeId,
|
|
360
|
+
deploymentId,
|
|
361
|
+
devmode: isDevMode,
|
|
362
|
+
environment: runtimeConfig.getEnvironment(),
|
|
363
|
+
method: c.req.method,
|
|
364
|
+
url: c.req.url,
|
|
365
|
+
trigger: _c.var.trigger,
|
|
366
|
+
})
|
|
367
|
+
.catch((ex) => {
|
|
368
|
+
canSendSessionEvents = false;
|
|
369
|
+
c.var.logger.error('error sending session start event: %s', ex);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
c.set('sessionId', sessionId);
|
|
373
|
+
c.set('thread', thread);
|
|
374
|
+
c.set('session', session);
|
|
375
|
+
_c.set('waitUntilHandler', handler);
|
|
376
|
+
let hasPendingWaits = false;
|
|
377
|
+
try {
|
|
378
|
+
await next();
|
|
379
|
+
if (handler?.hasPending()) {
|
|
380
|
+
hasPendingWaits = true;
|
|
381
|
+
handler
|
|
382
|
+
.waitUntilAll(c.var.logger, sessionId)
|
|
383
|
+
.then(async () => {
|
|
384
|
+
c.var.logger.debug('wait until finished for session %s', sessionId);
|
|
385
|
+
await sessionProvider.save(session);
|
|
386
|
+
await threadProvider.save(thread);
|
|
387
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
388
|
+
if (shouldSendSession && canSendSessionEvents) {
|
|
389
|
+
sessionEventProvider
|
|
390
|
+
.complete({
|
|
391
|
+
id: sessionId,
|
|
392
|
+
statusCode: c.res.status,
|
|
393
|
+
agentIds: Array.from(agentIds),
|
|
394
|
+
})
|
|
395
|
+
.then(() => { })
|
|
396
|
+
.catch((ex) => c.var.logger.error(ex));
|
|
397
|
+
}
|
|
398
|
+
})
|
|
399
|
+
.catch((ex) => {
|
|
400
|
+
c.var.logger.error('wait until errored for session %s. %s', sessionId, ex);
|
|
401
|
+
if (ex instanceof Error) {
|
|
402
|
+
span.recordException(ex);
|
|
403
|
+
}
|
|
404
|
+
const message = ex.message ?? String(ex);
|
|
405
|
+
span.setStatus({
|
|
406
|
+
code: SpanStatusCode.ERROR,
|
|
407
|
+
message,
|
|
408
|
+
});
|
|
409
|
+
c.var.logger.error(message);
|
|
410
|
+
if (shouldSendSession && canSendSessionEvents) {
|
|
411
|
+
sessionEventProvider
|
|
412
|
+
.complete({
|
|
413
|
+
id: sessionId,
|
|
414
|
+
statusCode: c.res.status,
|
|
415
|
+
error: message,
|
|
416
|
+
agentIds: Array.from(agentIds),
|
|
417
|
+
})
|
|
418
|
+
.then(() => { })
|
|
419
|
+
.catch((ex) => c.var.logger.error(ex));
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
.finally(() => {
|
|
423
|
+
span.end();
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
428
|
+
if (shouldSendSession && canSendSessionEvents) {
|
|
429
|
+
sessionEventProvider
|
|
430
|
+
.complete({
|
|
431
|
+
id: sessionId,
|
|
432
|
+
statusCode: c.res.status,
|
|
433
|
+
agentIds: Array.from(agentIds),
|
|
434
|
+
})
|
|
435
|
+
.then(() => { })
|
|
436
|
+
.catch((ex) => c.var.logger.error(ex));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
catch (ex) {
|
|
441
|
+
if (ex instanceof Error) {
|
|
442
|
+
span.recordException(ex);
|
|
443
|
+
}
|
|
444
|
+
const message = ex.message ?? String(ex);
|
|
445
|
+
span.setStatus({
|
|
446
|
+
code: SpanStatusCode.ERROR,
|
|
447
|
+
message,
|
|
448
|
+
});
|
|
449
|
+
c.var.logger.error(message);
|
|
450
|
+
if (shouldSendSession && canSendSessionEvents) {
|
|
451
|
+
sessionEventProvider
|
|
452
|
+
.complete({
|
|
453
|
+
id: sessionId,
|
|
454
|
+
statusCode: c.res.status,
|
|
455
|
+
error: message,
|
|
456
|
+
agentIds: Array.from(agentIds),
|
|
457
|
+
})
|
|
458
|
+
.then(() => { })
|
|
459
|
+
.catch((ex) => c.var.logger.error(ex));
|
|
460
|
+
}
|
|
461
|
+
throw ex;
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
// add otel headers into HTTP response
|
|
465
|
+
const headers = {};
|
|
466
|
+
propagation.inject(context.active(), headers);
|
|
467
|
+
for (const key of Object.keys(headers)) {
|
|
468
|
+
c.header(key, headers[key]);
|
|
469
|
+
}
|
|
470
|
+
// add session and deployment headers
|
|
471
|
+
const traceId = sctx?.traceId || sessionId.replace(/^sess_/, '');
|
|
472
|
+
c.header(SESSION_HEADER, `sess_${traceId}`);
|
|
473
|
+
if (deploymentId) {
|
|
474
|
+
c.header('x-deployment', deploymentId);
|
|
475
|
+
}
|
|
476
|
+
if (!hasPendingWaits) {
|
|
477
|
+
try {
|
|
478
|
+
await sessionProvider.save(session);
|
|
479
|
+
await threadProvider.save(thread);
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
span.end();
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
//# sourceMappingURL=_server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_server.js","sourceRoot":"","sources":["../src/_server.ts"],"names":[],"mappings":"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"}
|