@agentuity/runtime 0.0.68 → 0.0.70
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/AGENTS.md +130 -10
- package/README.md +6 -8
- package/dist/_config.d.ts +16 -0
- package/dist/_config.d.ts.map +1 -1
- package/dist/_config.js +16 -0
- package/dist/_config.js.map +1 -1
- package/dist/_context.d.ts +17 -15
- package/dist/_context.d.ts.map +1 -1
- package/dist/_context.js +17 -8
- package/dist/_context.js.map +1 -1
- package/dist/_server.d.ts.map +1 -1
- package/dist/_server.js +27 -14
- package/dist/_server.js.map +1 -1
- package/dist/_services.d.ts.map +1 -1
- package/dist/_services.js +2 -29
- package/dist/_services.js.map +1 -1
- package/dist/_validation.d.ts +89 -0
- package/dist/_validation.d.ts.map +1 -0
- package/dist/_validation.js +29 -0
- package/dist/_validation.js.map +1 -0
- package/dist/agent.d.ts +476 -104
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +293 -97
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts +6 -18
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/eval.d.ts +4 -4
- package/dist/eval.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/otel/config.d.ts.map +1 -1
- package/dist/otel/config.js +5 -2
- package/dist/otel/config.js.map +1 -1
- package/dist/otel/console.d.ts +10 -6
- package/dist/otel/console.d.ts.map +1 -1
- package/dist/otel/console.js +31 -13
- package/dist/otel/console.js.map +1 -1
- package/dist/otel/logger.d.ts.map +1 -1
- package/dist/otel/logger.js +0 -19
- package/dist/otel/logger.js.map +1 -1
- package/dist/otel/otel.d.ts +2 -1
- package/dist/otel/otel.d.ts.map +1 -1
- package/dist/otel/otel.js +28 -15
- package/dist/otel/otel.js.map +1 -1
- package/dist/services/local/_db.d.ts.map +1 -1
- package/dist/services/local/_db.js +1 -22
- package/dist/services/local/_db.js.map +1 -1
- package/dist/services/local/_router.d.ts.map +1 -1
- package/dist/services/local/_router.js +0 -32
- package/dist/services/local/_router.js.map +1 -1
- package/dist/services/local/index.d.ts +0 -1
- package/dist/services/local/index.d.ts.map +1 -1
- package/dist/services/local/index.js +0 -1
- package/dist/services/local/index.js.map +1 -1
- package/dist/session.d.ts +18 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +6 -0
- package/dist/session.js.map +1 -1
- package/dist/validator.d.ts +140 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +146 -0
- package/dist/validator.js.map +1 -0
- package/dist/workbench.d.ts.map +1 -1
- package/dist/workbench.js +38 -29
- package/dist/workbench.js.map +1 -1
- package/package.json +6 -6
- package/src/_config.ts +19 -0
- package/src/_context.ts +25 -31
- package/src/_server.ts +30 -14
- package/src/_services.ts +0 -28
- package/src/_validation.ts +119 -0
- package/src/agent.ts +872 -272
- package/src/app.ts +5 -18
- package/src/eval.ts +6 -6
- package/src/index.ts +3 -1
- package/src/otel/config.ts +5 -2
- package/src/otel/console.ts +34 -20
- package/src/otel/logger.ts +0 -18
- package/src/otel/otel.ts +43 -29
- package/src/services/local/_db.ts +1 -27
- package/src/services/local/_router.ts +0 -46
- package/src/services/local/index.ts +0 -1
- package/src/session.ts +22 -2
- package/src/validator.ts +277 -0
- package/src/workbench.ts +38 -32
- package/dist/services/local/objectstore.d.ts +0 -19
- package/dist/services/local/objectstore.d.ts.map +0 -1
- package/dist/services/local/objectstore.js +0 -117
- package/dist/services/local/objectstore.js.map +0 -1
- package/src/services/local/objectstore.ts +0 -177
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { StructuredError } from '@agentuity/core';
|
|
3
|
+
import { validator as honoValidator } from 'hono/validator';
|
|
4
|
+
import { validateSchema, formatValidationIssues } from './_validation';
|
|
5
|
+
/**
|
|
6
|
+
* Create a route validator middleware with input and/or output validation.
|
|
7
|
+
*
|
|
8
|
+
* Automatically handles different validation targets based on HTTP method:
|
|
9
|
+
* - GET requests: validates query parameters (if input schema provided)
|
|
10
|
+
* - POST/PUT/PATCH/DELETE: validates JSON body (if input schema provided)
|
|
11
|
+
* - All methods: validates JSON response (if output schema provided)
|
|
12
|
+
*
|
|
13
|
+
* @param options - Validation configuration
|
|
14
|
+
* @param options.input - Input schema (query params for GET, body for POST/PUT/PATCH/DELETE)
|
|
15
|
+
* @param options.output - Output schema for response validation
|
|
16
|
+
* @returns Hono middleware handler
|
|
17
|
+
*
|
|
18
|
+
* @example GET with query validation
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { validator } from '@agentuity/runtime';
|
|
21
|
+
*
|
|
22
|
+
* router.get('/search',
|
|
23
|
+
* validator({
|
|
24
|
+
* input: z.object({ q: z.string(), limit: z.number().optional() }),
|
|
25
|
+
* output: z.array(SearchResultSchema)
|
|
26
|
+
* }),
|
|
27
|
+
* async (c) => {
|
|
28
|
+
* const { q, limit } = c.req.valid('query'); // Typed!
|
|
29
|
+
* const results = await search(q, limit);
|
|
30
|
+
* return c.json(results);
|
|
31
|
+
* }
|
|
32
|
+
* );
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @example POST with body validation
|
|
36
|
+
* ```typescript
|
|
37
|
+
* router.post('/users',
|
|
38
|
+
* validator({
|
|
39
|
+
* input: z.object({ name: z.string() }),
|
|
40
|
+
* output: UserSchema
|
|
41
|
+
* }),
|
|
42
|
+
* async (c) => {
|
|
43
|
+
* const data = c.req.valid('json'); // Typed!
|
|
44
|
+
* const user = await createUser(data);
|
|
45
|
+
* return c.json(user);
|
|
46
|
+
* }
|
|
47
|
+
* );
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export const validator = ((options) => {
|
|
51
|
+
const { input: inputSchema, output: outputSchema } = options;
|
|
52
|
+
// Helper to build input validator that detects HTTP method
|
|
53
|
+
const buildInputValidator = (schema) => {
|
|
54
|
+
return async (c, next) => {
|
|
55
|
+
const method = c.req.method.toUpperCase();
|
|
56
|
+
// GET requests validate query parameters
|
|
57
|
+
if (method === 'GET') {
|
|
58
|
+
const queryValidator = honoValidator('query', async (value, c) => {
|
|
59
|
+
const result = await validateSchema(schema, value);
|
|
60
|
+
if (!result.success) {
|
|
61
|
+
return c.json({
|
|
62
|
+
error: 'Validation failed',
|
|
63
|
+
message: formatValidationIssues(result.issues),
|
|
64
|
+
issues: result.issues,
|
|
65
|
+
}, 400);
|
|
66
|
+
}
|
|
67
|
+
return result.data;
|
|
68
|
+
});
|
|
69
|
+
return await queryValidator(c, next);
|
|
70
|
+
}
|
|
71
|
+
// POST/PUT/PATCH/DELETE validate JSON body
|
|
72
|
+
const jsonValidator = honoValidator('json', async (value, c) => {
|
|
73
|
+
const result = await validateSchema(schema, value);
|
|
74
|
+
if (!result.success) {
|
|
75
|
+
return c.json({
|
|
76
|
+
error: 'Validation failed',
|
|
77
|
+
message: formatValidationIssues(result.issues),
|
|
78
|
+
issues: result.issues,
|
|
79
|
+
}, 400);
|
|
80
|
+
}
|
|
81
|
+
return result.data;
|
|
82
|
+
});
|
|
83
|
+
return await jsonValidator(c, next);
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
// Output validation middleware (runs after handler)
|
|
87
|
+
const outputValidator = async (c, next) => {
|
|
88
|
+
await next();
|
|
89
|
+
if (!outputSchema)
|
|
90
|
+
return;
|
|
91
|
+
const res = c.res;
|
|
92
|
+
if (!res)
|
|
93
|
+
return;
|
|
94
|
+
// Only validate JSON responses
|
|
95
|
+
const contentType = res.headers.get('Content-Type') ?? '';
|
|
96
|
+
if (!contentType.toLowerCase().includes('application/json')) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Clone so we don't consume the body that will be sent
|
|
100
|
+
let responseBody;
|
|
101
|
+
try {
|
|
102
|
+
const cloned = res.clone();
|
|
103
|
+
responseBody = await cloned.json();
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
const OutputValidationError = StructuredError('OutputValidationError')();
|
|
107
|
+
throw new OutputValidationError({
|
|
108
|
+
message: 'Output validation failed: response is not valid JSON',
|
|
109
|
+
issues: [],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const result = await validateSchema(outputSchema, responseBody);
|
|
113
|
+
if (!result.success) {
|
|
114
|
+
const OutputValidationError = StructuredError('OutputValidationError')();
|
|
115
|
+
throw new OutputValidationError({
|
|
116
|
+
message: `Output validation failed: ${formatValidationIssues(result.issues)}`,
|
|
117
|
+
issues: result.issues,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Replace response with validated/sanitized JSON
|
|
121
|
+
c.res = new Response(JSON.stringify(result.data), {
|
|
122
|
+
status: res.status,
|
|
123
|
+
headers: res.headers,
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
// If no input schema, only do output validation
|
|
127
|
+
if (!inputSchema) {
|
|
128
|
+
return outputValidator;
|
|
129
|
+
}
|
|
130
|
+
// If no output schema, only do input validation
|
|
131
|
+
if (!outputSchema) {
|
|
132
|
+
return buildInputValidator(inputSchema);
|
|
133
|
+
}
|
|
134
|
+
// Compose: input validator → output validator
|
|
135
|
+
const inputMiddleware = buildInputValidator(inputSchema);
|
|
136
|
+
const composed = async (c, next) => {
|
|
137
|
+
// Run input validator first, then output validator, then handler
|
|
138
|
+
const result = await inputMiddleware(c, async () => {
|
|
139
|
+
await outputValidator(c, next);
|
|
140
|
+
});
|
|
141
|
+
// If inputMiddleware returned early (validation failed), return that response
|
|
142
|
+
return result;
|
|
143
|
+
};
|
|
144
|
+
return composed;
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/workbench.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workbench.d.ts","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"workbench.d.ts","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAK7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGpD,eAAO,MAAM,6BAA6B,QAAO,OAsFhD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,mGAmCjC,CAAC;AAqBF,eAAO,MAAM,4BAA4B,QAAO,OA2C/C,CAAC;AAKF,eAAO,MAAM,6BAA6B,SACjC,MAAM,OAAO,MACZ,IAAI,mBAAmB,SA6BhC,CAAC"}
|
package/dist/workbench.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { s } from '@agentuity/schema';
|
|
2
3
|
import { timingSafeEqual } from 'node:crypto';
|
|
3
4
|
import { getAgents, createAgentMiddleware } from './agent';
|
|
4
5
|
import { createRouter } from './router';
|
|
6
|
+
import { privateContext } from './_server';
|
|
5
7
|
export const createWorkbenchExecutionRoute = () => {
|
|
6
8
|
const authHeader = process.env.AGENTUITY_WORKBENCH_APIKEY
|
|
7
9
|
? `Bearer ${process.env.AGENTUITY_WORKBENCH_APIKEY}`
|
|
@@ -34,10 +36,10 @@ export const createWorkbenchExecutionRoute = () => {
|
|
|
34
36
|
return ctx.json({ error: 'Invalid JSON in request body' }, { status: 400 });
|
|
35
37
|
}
|
|
36
38
|
// Get agents registry and find the agent
|
|
37
|
-
const
|
|
39
|
+
const allAgents = getAgents();
|
|
38
40
|
let agentObj;
|
|
39
41
|
let agentName;
|
|
40
|
-
for (const [name, agent] of
|
|
42
|
+
for (const [name, agent] of allAgents) {
|
|
41
43
|
if (agent.metadata.id === agentId) {
|
|
42
44
|
agentObj = agent;
|
|
43
45
|
agentName = name;
|
|
@@ -47,34 +49,23 @@ export const createWorkbenchExecutionRoute = () => {
|
|
|
47
49
|
if (!agentObj || !agentName) {
|
|
48
50
|
return ctx.text('Agent not found', { status: 404 });
|
|
49
51
|
}
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
if (agentObj.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return ctx.json({
|
|
56
|
-
error: 'Validation failed',
|
|
57
|
-
issues: inputResult.issues,
|
|
58
|
-
}, { status: 400 });
|
|
59
|
-
}
|
|
60
|
-
validatedInput = inputResult.value;
|
|
61
|
-
console.log('✅ [Workbench] Input validation passed');
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
console.log('ℹ️ [Workbench] No input schema, skipping validation');
|
|
65
|
-
}
|
|
66
|
-
// Get agent runner from context.var.agent (should be available via middleware)
|
|
67
|
-
const agentRunner = ctx.var.agent[agentName];
|
|
68
|
-
if (!agentRunner) {
|
|
69
|
-
return ctx.text('Agent runner not found', { status: 404 });
|
|
52
|
+
// Track agent ID for telemetry (otelMiddleware sets up agentIds)
|
|
53
|
+
const _ctx = privateContext(ctx);
|
|
54
|
+
if (agentObj.metadata?.id) {
|
|
55
|
+
_ctx.var.agentIds.add(agentObj.metadata.id);
|
|
56
|
+
_ctx.var.agentIds.add(agentObj.metadata.agentId);
|
|
70
57
|
}
|
|
71
|
-
// Execute the agent
|
|
58
|
+
// Execute the agent handler directly
|
|
59
|
+
// The agentMiddleware has already set up the AsyncLocalStorage context
|
|
60
|
+
// so the handler can access it via getAgentContext()
|
|
72
61
|
let result;
|
|
73
62
|
if (agentObj.inputSchema) {
|
|
74
|
-
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
result = await agentObj.handler(input);
|
|
75
65
|
}
|
|
76
66
|
else {
|
|
77
|
-
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
result = await agentObj.handler();
|
|
78
69
|
}
|
|
79
70
|
// Handle cases where result might be undefined/null
|
|
80
71
|
if (result === undefined || result === null) {
|
|
@@ -125,6 +116,25 @@ export const createWorkbenchRouter = () => {
|
|
|
125
116
|
router.post('/_agentuity/workbench/execute', createWorkbenchExecutionRoute());
|
|
126
117
|
return router;
|
|
127
118
|
};
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
120
|
+
const toJSONSchema = (schema) => {
|
|
121
|
+
// Check if it's an Agentuity schema via StandardSchemaV1 vendor
|
|
122
|
+
if (schema?.['~standard']?.vendor === 'agentuity') {
|
|
123
|
+
return s.toJSONSchema(schema);
|
|
124
|
+
}
|
|
125
|
+
// Check if it's a Zod schema
|
|
126
|
+
if (schema?._def?.typeName) {
|
|
127
|
+
try {
|
|
128
|
+
return z.toJSONSchema(schema);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return {};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// TODO: this is going to only work for zod schema for now. need a way to handle others
|
|
135
|
+
// Unknown schema type
|
|
136
|
+
return {};
|
|
137
|
+
};
|
|
128
138
|
export const createWorkbenchMetadataRoute = () => {
|
|
129
139
|
const authHeader = process.env.AGENTUITY_WORKBENCH_APIKEY
|
|
130
140
|
? `Bearer ${process.env.AGENTUITY_WORKBENCH_APIKEY}`
|
|
@@ -146,20 +156,19 @@ export const createWorkbenchMetadataRoute = () => {
|
|
|
146
156
|
}
|
|
147
157
|
}
|
|
148
158
|
const schemas = { agents: {} };
|
|
149
|
-
// TODO: this is going to only work for zod schema for now. need a way to handle others
|
|
150
159
|
for (const [, agent] of agents) {
|
|
151
|
-
schemas.agents[agent.metadata.
|
|
160
|
+
schemas.agents[agent.metadata.id] = {
|
|
152
161
|
schema: {
|
|
153
162
|
input: agent.inputSchema
|
|
154
163
|
? {
|
|
155
164
|
code: agent.metadata.inputSchemaCode || undefined,
|
|
156
|
-
json:
|
|
165
|
+
json: toJSONSchema(agent.inputSchema),
|
|
157
166
|
}
|
|
158
167
|
: undefined,
|
|
159
168
|
output: agent.outputSchema
|
|
160
169
|
? {
|
|
161
170
|
code: agent.metadata.outputSchemaCode || undefined,
|
|
162
|
-
json:
|
|
171
|
+
json: toJSONSchema(agent.outputSchema),
|
|
163
172
|
}
|
|
164
173
|
: undefined,
|
|
165
174
|
},
|
package/dist/workbench.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workbench.js","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"workbench.js","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/runtime",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.70",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"type": "module",
|
|
@@ -22,11 +22,12 @@
|
|
|
22
22
|
"clean": "rm -rf dist",
|
|
23
23
|
"build": "bunx tsc --build --force",
|
|
24
24
|
"typecheck": "bunx tsc --noEmit",
|
|
25
|
+
"typecheck:tests": "bunx tsc --noEmit --project tsconfig.test.json",
|
|
25
26
|
"prepublishOnly": "bun run clean && bun run build"
|
|
26
27
|
},
|
|
27
28
|
"dependencies": {
|
|
28
|
-
"@agentuity/core": "0.0.
|
|
29
|
-
"@agentuity/server": "0.0.
|
|
29
|
+
"@agentuity/core": "0.0.70",
|
|
30
|
+
"@agentuity/server": "0.0.70",
|
|
30
31
|
"@opentelemetry/api": "^1.9.0",
|
|
31
32
|
"@opentelemetry/api-logs": "^0.207.0",
|
|
32
33
|
"@opentelemetry/auto-instrumentations-node": "^0.66.0",
|
|
@@ -44,16 +45,15 @@
|
|
|
44
45
|
"@opentelemetry/semantic-conventions": "^1.37.0",
|
|
45
46
|
"@traceloop/ai-semantic-conventions": "0.21.0",
|
|
46
47
|
"@traceloop/node-server-sdk": "0.21.1",
|
|
48
|
+
"hono": "^4.7.13",
|
|
47
49
|
"zod": "^4.1.12",
|
|
48
50
|
"mailparser": "^3.7.1",
|
|
49
51
|
"@types/mailparser": "^3.4.6",
|
|
50
52
|
"ws": "^8.18.0",
|
|
51
53
|
"@types/ws": "^8.5.13"
|
|
52
54
|
},
|
|
53
|
-
"peerDependencies": {
|
|
54
|
-
"hono": "^4.10.3"
|
|
55
|
-
},
|
|
56
55
|
"devDependencies": {
|
|
56
|
+
"@agentuity/test-utils": "0.0.70",
|
|
57
57
|
"@types/bun": "latest",
|
|
58
58
|
"@types/react": "^19.2.2",
|
|
59
59
|
"@types/react-dom": "^19.2.2",
|
package/src/_config.ts
CHANGED
|
@@ -115,3 +115,22 @@ export function getEnvironment(): string {
|
|
|
115
115
|
export function isAuthenticated(): boolean {
|
|
116
116
|
return !!process.env.AGENTUITY_SDK_KEY;
|
|
117
117
|
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Symbol for accessing internal runtime state.
|
|
121
|
+
* Defined here to avoid circular dependency.
|
|
122
|
+
*/
|
|
123
|
+
export const AGENT_RUNTIME = Symbol('AGENT_RUNTIME');
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Symbol for accessing internal agent from AgentRunner.
|
|
127
|
+
* @internal
|
|
128
|
+
*/
|
|
129
|
+
export const INTERNAL_AGENT = Symbol('INTERNAL_AGENT');
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Symbol for tracking the current executing agent (for telemetry).
|
|
133
|
+
* Not exposed on public AgentContext interface.
|
|
134
|
+
* @internal
|
|
135
|
+
*/
|
|
136
|
+
export const CURRENT_AGENT = Symbol('CURRENT_AGENT');
|
package/src/_context.ts
CHANGED
|
@@ -4,11 +4,11 @@ import type { Tracer } from '@opentelemetry/api';
|
|
|
4
4
|
import {
|
|
5
5
|
StructuredError,
|
|
6
6
|
type KeyValueStorage,
|
|
7
|
-
type ObjectStorage,
|
|
8
7
|
type StreamStorage,
|
|
9
8
|
type VectorStorage,
|
|
10
9
|
} from '@agentuity/core';
|
|
11
|
-
import type { AgentContext,
|
|
10
|
+
import type { AgentContext, AgentRegistry, AgentRunner, AgentRuntimeState } from './agent';
|
|
11
|
+
import { AGENT_RUNTIME, CURRENT_AGENT } from './_config';
|
|
12
12
|
import type { Logger } from './logger';
|
|
13
13
|
import type WaitUntilHandler from './_waituntil';
|
|
14
14
|
import { registerServices } from './_services';
|
|
@@ -16,18 +16,11 @@ import type { Thread, Session } from './session';
|
|
|
16
16
|
|
|
17
17
|
export interface RequestAgentContextArgs<
|
|
18
18
|
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
19
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
21
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
-
TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
23
19
|
TConfig = unknown,
|
|
24
20
|
TAppState = Record<string, never>,
|
|
25
21
|
> {
|
|
26
22
|
sessionId: string;
|
|
27
23
|
agent: TAgentMap;
|
|
28
|
-
current: TCurrent;
|
|
29
|
-
parent: TParent;
|
|
30
|
-
agentName: AgentName;
|
|
31
24
|
logger: Logger;
|
|
32
25
|
tracer: Tracer;
|
|
33
26
|
session: Session;
|
|
@@ -35,27 +28,20 @@ export interface RequestAgentContextArgs<
|
|
|
35
28
|
handler: WaitUntilHandler;
|
|
36
29
|
config: TConfig;
|
|
37
30
|
app: TAppState;
|
|
31
|
+
runtime: AgentRuntimeState;
|
|
38
32
|
}
|
|
39
33
|
|
|
40
34
|
export class RequestAgentContext<
|
|
41
35
|
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
42
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
-
TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
44
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
-
TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
46
36
|
TConfig = unknown,
|
|
47
37
|
TAppState = Record<string, never>,
|
|
48
|
-
> implements AgentContext<TAgentMap,
|
|
38
|
+
> implements AgentContext<TAgentMap, TConfig, TAppState>
|
|
49
39
|
{
|
|
50
40
|
agent: TAgentMap;
|
|
51
|
-
current: TCurrent;
|
|
52
|
-
parent: TParent;
|
|
53
|
-
agentName: AgentName;
|
|
54
41
|
logger: Logger;
|
|
55
42
|
sessionId: string;
|
|
56
43
|
tracer: Tracer;
|
|
57
44
|
kv!: KeyValueStorage;
|
|
58
|
-
objectstore!: ObjectStorage;
|
|
59
45
|
stream!: StreamStorage;
|
|
60
46
|
vector!: VectorStorage;
|
|
61
47
|
state: Map<string, unknown>;
|
|
@@ -63,13 +49,11 @@ export class RequestAgentContext<
|
|
|
63
49
|
thread: Thread;
|
|
64
50
|
config: TConfig;
|
|
65
51
|
app: TAppState;
|
|
52
|
+
[AGENT_RUNTIME]: AgentRuntimeState;
|
|
66
53
|
private handler: WaitUntilHandler;
|
|
67
54
|
|
|
68
|
-
constructor(args: RequestAgentContextArgs<TAgentMap,
|
|
55
|
+
constructor(args: RequestAgentContextArgs<TAgentMap, TConfig, TAppState>) {
|
|
69
56
|
this.agent = args.agent;
|
|
70
|
-
this.current = args.current;
|
|
71
|
-
this.parent = args.parent;
|
|
72
|
-
this.agentName = args.agentName;
|
|
73
57
|
this.logger = args.logger;
|
|
74
58
|
this.sessionId = args.sessionId;
|
|
75
59
|
this.tracer = args.tracer;
|
|
@@ -77,6 +61,7 @@ export class RequestAgentContext<
|
|
|
77
61
|
this.session = args.session;
|
|
78
62
|
this.config = args.config;
|
|
79
63
|
this.app = args.app;
|
|
64
|
+
this[AGENT_RUNTIME] = args.runtime;
|
|
80
65
|
this.state = new Map<string, unknown>();
|
|
81
66
|
this.handler = args.handler;
|
|
82
67
|
registerServices(this, false); // agents already populated via args.agent
|
|
@@ -88,7 +73,7 @@ export class RequestAgentContext<
|
|
|
88
73
|
}
|
|
89
74
|
|
|
90
75
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
-
const agentAsyncLocalStorage = new AsyncLocalStorage<AgentContext<any, any, any
|
|
76
|
+
const agentAsyncLocalStorage = new AsyncLocalStorage<AgentContext<any, any, any>>();
|
|
92
77
|
const httpAsyncLocalStorage = new AsyncLocalStorage<HonoContext>();
|
|
93
78
|
|
|
94
79
|
export const inAgentContext = (): boolean => {
|
|
@@ -107,7 +92,7 @@ const AgentContextNotAvailableError = StructuredError(
|
|
|
107
92
|
);
|
|
108
93
|
|
|
109
94
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
110
|
-
export const getAgentContext = (): AgentContext<any, any, any
|
|
95
|
+
export const getAgentContext = (): AgentContext<any, any, any> => {
|
|
111
96
|
const context = agentAsyncLocalStorage.getStore();
|
|
112
97
|
if (!context) {
|
|
113
98
|
throw new AgentContextNotAvailableError();
|
|
@@ -131,20 +116,29 @@ export const getHTTPContext = (): HonoContext => {
|
|
|
131
116
|
export const getAgentAsyncLocalStorage = () => agentAsyncLocalStorage;
|
|
132
117
|
export const getHTTPAsyncLocalStorage = () => httpAsyncLocalStorage;
|
|
133
118
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Get the current executing agent's metadata (for internal telemetry use only).
|
|
121
|
+
* Returns undefined if not in an agent context or no agent is executing.
|
|
122
|
+
* @internal
|
|
123
|
+
*/
|
|
124
|
+
export const getCurrentAgentMetadata = (): AgentRunner['metadata'] | undefined => {
|
|
125
|
+
const context = agentAsyncLocalStorage.getStore();
|
|
126
|
+
if (!context) return undefined;
|
|
127
|
+
// Access internal symbol property
|
|
138
128
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
-
|
|
129
|
+
return (context as any)[CURRENT_AGENT]?.metadata;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const setupRequestAgentContext = <
|
|
133
|
+
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
140
134
|
TConfig = unknown,
|
|
141
135
|
TAppState = Record<string, never>,
|
|
142
136
|
>(
|
|
143
137
|
ctxObject: Record<string, unknown>,
|
|
144
|
-
args: RequestAgentContextArgs<TAgentMap,
|
|
138
|
+
args: RequestAgentContextArgs<TAgentMap, TConfig, TAppState>,
|
|
145
139
|
next: () => Promise<void>
|
|
146
140
|
) => {
|
|
147
|
-
const ctx = new RequestAgentContext<TAgentMap,
|
|
141
|
+
const ctx = new RequestAgentContext<TAgentMap, TConfig, TAppState>(args);
|
|
148
142
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
149
143
|
const _ctx = ctx as any;
|
|
150
144
|
Object.getOwnPropertyNames(ctx).forEach((k) => {
|
package/src/_server.ts
CHANGED
|
@@ -26,7 +26,8 @@ import { register } from './otel/config';
|
|
|
26
26
|
import type { Logger } from './logger';
|
|
27
27
|
import { isIdle } from './_idle';
|
|
28
28
|
import * as runtimeConfig from './_config';
|
|
29
|
-
import { inAgentContext,
|
|
29
|
+
import { inAgentContext, runInHTTPContext } from './_context';
|
|
30
|
+
import { runAgentShutdowns, createAgentMiddleware } from './agent';
|
|
30
31
|
import {
|
|
31
32
|
createServices,
|
|
32
33
|
getThreadProvider,
|
|
@@ -107,12 +108,14 @@ function registerAgentuitySpanProcessor() {
|
|
|
107
108
|
'@agentuity/environment': environment,
|
|
108
109
|
};
|
|
109
110
|
if (inAgentContext()) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
attrs['@agentuity/
|
|
115
|
-
attrs['@agentuity/
|
|
111
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
112
|
+
const { getCurrentAgentMetadata } = require('./_context');
|
|
113
|
+
const current = getCurrentAgentMetadata();
|
|
114
|
+
if (current) {
|
|
115
|
+
attrs['@agentuity/agentId'] = current.id;
|
|
116
|
+
attrs['@agentuity/agentInstanceId'] = current.agentId;
|
|
117
|
+
attrs['@agentuity/agentDescription'] = current.description;
|
|
118
|
+
attrs['@agentuity/agentName'] = current.name;
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
span.setAttributes(attrs);
|
|
@@ -294,9 +297,14 @@ export const createServer = async <TAppState>(
|
|
|
294
297
|
}
|
|
295
298
|
const file = Bun.file(routeMappingPath);
|
|
296
299
|
if (!(await file.exists())) {
|
|
297
|
-
c.var.logger.
|
|
300
|
+
c.var.logger.warn(
|
|
301
|
+
'Route mapping file not found at %s. Route tracking will be disabled.',
|
|
302
|
+
routeMappingPath
|
|
303
|
+
);
|
|
304
|
+
routeMapping = {}; // Empty mapping, no route tracking
|
|
305
|
+
} else {
|
|
306
|
+
routeMapping = (await file.json()) as Record<string, string>;
|
|
298
307
|
}
|
|
299
|
-
routeMapping = (await file.json()) as Record<string, string>;
|
|
300
308
|
}
|
|
301
309
|
const matches = matchedRoutes(c).filter(
|
|
302
310
|
(m) => m.method !== 'ALL' && (m.path.startsWith('/api') || m.path.startsWith('/agent/'))
|
|
@@ -316,12 +324,10 @@ export const createServer = async <TAppState>(
|
|
|
316
324
|
return next();
|
|
317
325
|
});
|
|
318
326
|
|
|
319
|
-
router.use('/agent/*', routePathMapper);
|
|
320
327
|
router.use('/api/*', routePathMapper);
|
|
321
328
|
|
|
322
329
|
// Attach services and agent registry to context for API routes
|
|
323
330
|
router.use('/api/*', async (c, next) => {
|
|
324
|
-
const { createAgentMiddleware } = await import('./agent');
|
|
325
331
|
// Use a null agent name to just populate the agent registry without setting current agent
|
|
326
332
|
return createAgentMiddleware('')(c, next);
|
|
327
333
|
});
|
|
@@ -334,11 +340,18 @@ export const createServer = async <TAppState>(
|
|
|
334
340
|
await next();
|
|
335
341
|
});
|
|
336
342
|
router.use(`/api/${trigger}/*`, middleware);
|
|
337
|
-
router.use(`/agent/${trigger}/*`, middleware);
|
|
338
343
|
}
|
|
339
344
|
|
|
340
345
|
router.use('/api/*', otelMiddleware);
|
|
341
|
-
|
|
346
|
+
|
|
347
|
+
// Apply otelMiddleware to workbench routes for full telemetry and session tracking
|
|
348
|
+
if (config?.services?.workbench) {
|
|
349
|
+
router.use('/_agentuity/workbench/*', async (c, next) => {
|
|
350
|
+
// Use a null agent name to just populate the agent registry without setting current agent
|
|
351
|
+
return createAgentMiddleware('')(c, next);
|
|
352
|
+
});
|
|
353
|
+
router.use('/_agentuity/workbench/*', otelMiddleware);
|
|
354
|
+
}
|
|
342
355
|
|
|
343
356
|
const shutdown = async () => {
|
|
344
357
|
if (isShutdown) {
|
|
@@ -370,7 +383,6 @@ export const createServer = async <TAppState>(
|
|
|
370
383
|
otel.logger.debug('no more pending connections');
|
|
371
384
|
|
|
372
385
|
// Run agent shutdowns first
|
|
373
|
-
const { runAgentShutdowns } = await import('./agent');
|
|
374
386
|
await runAgentShutdowns(globalAppState);
|
|
375
387
|
|
|
376
388
|
// Run app shutdown if provided
|
|
@@ -541,6 +553,7 @@ const otelMiddleware = createMiddleware<Env>(async (c, next) => {
|
|
|
541
553
|
sessionEventProvider
|
|
542
554
|
.complete({
|
|
543
555
|
id: sessionId,
|
|
556
|
+
threadId: thread.empty() ? null : thread.id,
|
|
544
557
|
statusCode: c.res.status,
|
|
545
558
|
agentIds: Array.from(agentIds),
|
|
546
559
|
userData,
|
|
@@ -565,6 +578,7 @@ const otelMiddleware = createMiddleware<Env>(async (c, next) => {
|
|
|
565
578
|
sessionEventProvider
|
|
566
579
|
.complete({
|
|
567
580
|
id: sessionId,
|
|
581
|
+
threadId: thread.empty() ? null : thread.id,
|
|
568
582
|
statusCode: c.res.status,
|
|
569
583
|
error: message,
|
|
570
584
|
agentIds: Array.from(agentIds),
|
|
@@ -584,6 +598,7 @@ const otelMiddleware = createMiddleware<Env>(async (c, next) => {
|
|
|
584
598
|
sessionEventProvider
|
|
585
599
|
.complete({
|
|
586
600
|
id: sessionId,
|
|
601
|
+
threadId: thread.empty() ? null : thread.id,
|
|
587
602
|
statusCode: c.res.status,
|
|
588
603
|
agentIds: Array.from(agentIds),
|
|
589
604
|
userData,
|
|
@@ -607,6 +622,7 @@ const otelMiddleware = createMiddleware<Env>(async (c, next) => {
|
|
|
607
622
|
sessionEventProvider
|
|
608
623
|
.complete({
|
|
609
624
|
id: sessionId,
|
|
625
|
+
threadId: thread.empty() ? null : thread.id,
|
|
610
626
|
statusCode: c.res.status,
|
|
611
627
|
error: message,
|
|
612
628
|
agentIds: Array.from(agentIds),
|