@agentuity/runtime 0.0.69 → 0.0.71

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 (100) hide show
  1. package/AGENTS.md +88 -10
  2. package/README.md +0 -2
  3. package/dist/_config.d.ts +16 -0
  4. package/dist/_config.d.ts.map +1 -1
  5. package/dist/_config.js +16 -0
  6. package/dist/_config.js.map +1 -1
  7. package/dist/_context.d.ts +17 -15
  8. package/dist/_context.d.ts.map +1 -1
  9. package/dist/_context.js +17 -8
  10. package/dist/_context.js.map +1 -1
  11. package/dist/_server.d.ts.map +1 -1
  12. package/dist/_server.js +44 -21
  13. package/dist/_server.js.map +1 -1
  14. package/dist/_services.d.ts.map +1 -1
  15. package/dist/_services.js +4 -32
  16. package/dist/_services.js.map +1 -1
  17. package/dist/_tokens.d.ts +1 -0
  18. package/dist/_tokens.d.ts.map +1 -1
  19. package/dist/_tokens.js +1 -0
  20. package/dist/_tokens.js.map +1 -1
  21. package/dist/_validation.d.ts +3 -3
  22. package/dist/_validation.d.ts.map +1 -1
  23. package/dist/_validation.js.map +1 -1
  24. package/dist/agent.d.ts +289 -107
  25. package/dist/agent.d.ts.map +1 -1
  26. package/dist/agent.js +206 -149
  27. package/dist/agent.js.map +1 -1
  28. package/dist/app.d.ts +6 -18
  29. package/dist/app.d.ts.map +1 -1
  30. package/dist/app.js +1 -1
  31. package/dist/app.js.map +1 -1
  32. package/dist/eval.d.ts +4 -4
  33. package/dist/eval.d.ts.map +1 -1
  34. package/dist/index.d.ts +2 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/otel/config.d.ts.map +1 -1
  39. package/dist/otel/config.js +5 -2
  40. package/dist/otel/config.js.map +1 -1
  41. package/dist/otel/console.d.ts +10 -6
  42. package/dist/otel/console.d.ts.map +1 -1
  43. package/dist/otel/console.js +31 -13
  44. package/dist/otel/console.js.map +1 -1
  45. package/dist/otel/logger.d.ts.map +1 -1
  46. package/dist/otel/logger.js +0 -19
  47. package/dist/otel/logger.js.map +1 -1
  48. package/dist/otel/otel.d.ts +2 -1
  49. package/dist/otel/otel.d.ts.map +1 -1
  50. package/dist/otel/otel.js +28 -15
  51. package/dist/otel/otel.js.map +1 -1
  52. package/dist/services/local/_db.d.ts.map +1 -1
  53. package/dist/services/local/_db.js +1 -22
  54. package/dist/services/local/_db.js.map +1 -1
  55. package/dist/services/local/_router.d.ts.map +1 -1
  56. package/dist/services/local/_router.js +0 -32
  57. package/dist/services/local/_router.js.map +1 -1
  58. package/dist/services/local/index.d.ts +0 -1
  59. package/dist/services/local/index.d.ts.map +1 -1
  60. package/dist/services/local/index.js +0 -1
  61. package/dist/services/local/index.js.map +1 -1
  62. package/dist/session.d.ts +2 -2
  63. package/dist/validator.d.ts +140 -0
  64. package/dist/validator.d.ts.map +1 -0
  65. package/dist/validator.js +146 -0
  66. package/dist/validator.js.map +1 -0
  67. package/dist/workbench.d.ts.map +1 -1
  68. package/dist/workbench.js +38 -29
  69. package/dist/workbench.js.map +1 -1
  70. package/package.json +7 -6
  71. package/src/_config.ts +19 -0
  72. package/src/_context.ts +25 -31
  73. package/src/_server.ts +49 -22
  74. package/src/_services.ts +2 -31
  75. package/src/_tokens.ts +1 -0
  76. package/src/_validation.ts +3 -7
  77. package/src/agent.ts +555 -348
  78. package/src/app.ts +5 -18
  79. package/src/eval.ts +6 -6
  80. package/src/index.ts +2 -1
  81. package/src/otel/config.ts +5 -2
  82. package/src/otel/console.ts +34 -20
  83. package/src/otel/logger.ts +0 -18
  84. package/src/otel/otel.ts +43 -29
  85. package/src/services/local/_db.ts +1 -27
  86. package/src/services/local/_router.ts +0 -46
  87. package/src/services/local/index.ts +0 -1
  88. package/src/session.ts +2 -2
  89. package/src/validator.ts +277 -0
  90. package/src/workbench.ts +38 -32
  91. package/dist/agent.validator.test.d.ts +0 -2
  92. package/dist/agent.validator.test.d.ts.map +0 -1
  93. package/dist/agent.validator.test.js +0 -508
  94. package/dist/agent.validator.test.js.map +0 -1
  95. package/dist/services/local/objectstore.d.ts +0 -19
  96. package/dist/services/local/objectstore.d.ts.map +0 -1
  97. package/dist/services/local/objectstore.js +0 -117
  98. package/dist/services/local/objectstore.js.map +0 -1
  99. package/src/agent.validator.test.ts +0 -587
  100. package/src/services/local/objectstore.ts +0 -177
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 agents = getAgents();
39
+ const allAgents = getAgents();
38
40
  let agentObj;
39
41
  let agentName;
40
- for (const [name, agent] of agents) {
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
- // Validate input if schema exists
51
- let validatedInput = input;
52
- if (agentObj.inputSchema) {
53
- const inputResult = await agentObj.inputSchema['~standard'].validate(input);
54
- if (inputResult.issues) {
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
- result = await agentRunner.run(validatedInput);
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ result = await agentObj.handler(input);
75
65
  }
76
66
  else {
77
- result = await agentRunner.run();
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.identifier] = {
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: z.toJSONSchema(agent.inputSchema),
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: z.toJSONSchema(agent.outputSchema),
171
+ json: toJSONSchema(agent.outputSchema),
163
172
  }
164
173
  : undefined,
165
174
  },
@@ -1 +1 @@
1
- {"version":3,"file":"workbench.js","sourceRoot":"","sources":["../src/workbench.ts"],"names":[],"mappings":"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"}
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.69",
3
+ "version": "0.0.71",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -22,11 +22,13 @@
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.69",
29
- "@agentuity/server": "0.0.69",
29
+ "@agentuity/core": "0.0.71",
30
+ "@agentuity/schema": "0.0.71",
31
+ "@agentuity/server": "0.0.71",
30
32
  "@opentelemetry/api": "^1.9.0",
31
33
  "@opentelemetry/api-logs": "^0.207.0",
32
34
  "@opentelemetry/auto-instrumentations-node": "^0.66.0",
@@ -44,16 +46,15 @@
44
46
  "@opentelemetry/semantic-conventions": "^1.37.0",
45
47
  "@traceloop/ai-semantic-conventions": "0.21.0",
46
48
  "@traceloop/node-server-sdk": "0.21.1",
49
+ "hono": "^4.7.13",
47
50
  "zod": "^4.1.12",
48
51
  "mailparser": "^3.7.1",
49
52
  "@types/mailparser": "^3.4.6",
50
53
  "ws": "^8.18.0",
51
54
  "@types/ws": "^8.5.13"
52
55
  },
53
- "peerDependencies": {
54
- "hono": "^4.10.3"
55
- },
56
56
  "devDependencies": {
57
+ "@agentuity/test-utils": "0.0.71",
57
58
  "@types/bun": "latest",
58
59
  "@types/react": "^19.2.2",
59
60
  "@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, AgentName, AgentRegistry, AgentRunner } from './agent';
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, TCurrent, TParent, TConfig, TAppState>
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, TCurrent, TParent, TConfig, TAppState>) {
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, 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, 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
- export const runInAgentContext = <
135
- TAgentMap extends AgentRegistry = AgentRegistry,
136
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
- TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
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
- TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
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, TCurrent, TParent, TConfig, TAppState>,
138
+ args: RequestAgentContextArgs<TAgentMap, TConfig, TAppState>,
145
139
  next: () => Promise<void>
146
140
  ) => {
147
- const ctx = new RequestAgentContext<TAgentMap, TCurrent, TParent, TConfig, TAppState>(args);
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, getAgentContext, runInHTTPContext } from './_context';
29
+ import { inAgentContext, runInHTTPContext } from './_context';
30
+ import { runAgentShutdowns, createAgentMiddleware } from './agent';
30
31
  import {
31
32
  createServices,
32
33
  getThreadProvider,
@@ -35,7 +36,7 @@ import {
35
36
  } from './_services';
36
37
  import { generateId } from './session';
37
38
  import WaitUntilHandler from './_waituntil';
38
- import registerTokenProcessor, { TOKENS_HEADER } from './_tokens';
39
+ import registerTokenProcessor, { TOKENS_HEADER, DURATION_HEADER } from './_tokens';
39
40
 
40
41
  const SESSION_HEADER = 'x-session-id';
41
42
 
@@ -107,12 +108,14 @@ function registerAgentuitySpanProcessor() {
107
108
  '@agentuity/environment': environment,
108
109
  };
109
110
  if (inAgentContext()) {
110
- const agentCtx = getAgentContext();
111
- if (agentCtx.current?.metadata) {
112
- attrs['@agentuity/agentId'] = agentCtx.current.metadata.id;
113
- attrs['@agentuity/agentInstanceId'] = agentCtx.current.metadata.agentId;
114
- attrs['@agentuity/agentDescription'] = agentCtx.current.metadata.description;
115
- attrs['@agentuity/agentName'] = agentCtx.current.metadata.name;
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);
@@ -239,6 +242,13 @@ export const createServer = async <TAppState>(
239
242
 
240
243
  await runInHTTPContext(c, next);
241
244
 
245
+ // Calculate and add duration header for all HTTP requests (not WebSocket)
246
+ if (!isWebSocket) {
247
+ const endTime = performance.now();
248
+ const duration = ((endTime - started) / 1000).toFixed(1); // Duration in seconds
249
+ c.header(DURATION_HEADER, `${duration}s`);
250
+ }
251
+
242
252
  // Don't log completion for websocket upgrades - they stay open
243
253
  if (!skipLogging && !isWebSocket) {
244
254
  otel.logger.debug(
@@ -264,7 +274,13 @@ export const createServer = async <TAppState>(
264
274
  'X-Requested-With',
265
275
  ],
266
276
  allowMethods: ['POST', 'GET', 'OPTIONS', 'HEAD', 'PUT', 'DELETE', 'PATCH'],
267
- exposeHeaders: ['Content-Length', TOKENS_HEADER, SESSION_HEADER, 'x-deployment'],
277
+ exposeHeaders: [
278
+ 'Content-Length',
279
+ TOKENS_HEADER,
280
+ DURATION_HEADER,
281
+ SESSION_HEADER,
282
+ 'x-deployment',
283
+ ],
268
284
  maxAge: 600,
269
285
  credentials: true,
270
286
  ...(config?.cors ?? {}), // allow the app config to override
@@ -294,9 +310,14 @@ export const createServer = async <TAppState>(
294
310
  }
295
311
  const file = Bun.file(routeMappingPath);
296
312
  if (!(await file.exists())) {
297
- c.var.logger.fatal('error loading %s. this is a build issue!', routeMappingPath);
313
+ c.var.logger.warn(
314
+ 'Route mapping file not found at %s. Route tracking will be disabled.',
315
+ routeMappingPath
316
+ );
317
+ routeMapping = {}; // Empty mapping, no route tracking
318
+ } else {
319
+ routeMapping = (await file.json()) as Record<string, string>;
298
320
  }
299
- routeMapping = (await file.json()) as Record<string, string>;
300
321
  }
301
322
  const matches = matchedRoutes(c).filter(
302
323
  (m) => m.method !== 'ALL' && (m.path.startsWith('/api') || m.path.startsWith('/agent/'))
@@ -316,16 +337,8 @@ export const createServer = async <TAppState>(
316
337
  return next();
317
338
  });
318
339
 
319
- router.use('/agent/*', routePathMapper);
320
340
  router.use('/api/*', routePathMapper);
321
341
 
322
- // Attach services and agent registry to context for API routes
323
- router.use('/api/*', async (c, next) => {
324
- const { createAgentMiddleware } = await import('./agent');
325
- // Use a null agent name to just populate the agent registry without setting current agent
326
- return createAgentMiddleware('')(c, next);
327
- });
328
-
329
342
  // set the trigger for specific types
330
343
  for (const trigger of ['sms', 'email', 'cron'] as const) {
331
344
  const middleware = createMiddleware(async (c, next) => {
@@ -334,11 +347,26 @@ export const createServer = async <TAppState>(
334
347
  await next();
335
348
  });
336
349
  router.use(`/api/${trigger}/*`, middleware);
337
- router.use(`/agent/${trigger}/*`, middleware);
338
350
  }
339
351
 
352
+ // otelMiddleware must run before createAgentMiddleware to set session/thread
340
353
  router.use('/api/*', otelMiddleware);
341
- router.use('/agent/*', otelMiddleware);
354
+
355
+ // Attach services and agent registry to context for API routes
356
+ router.use('/api/*', async (c, next) => {
357
+ // Use a null agent name to just populate the agent registry without setting current agent
358
+ return createAgentMiddleware('')(c, next);
359
+ });
360
+
361
+ // Apply otelMiddleware to workbench routes for full telemetry and session tracking
362
+ if (config?.services?.workbench) {
363
+ // otelMiddleware must run before createAgentMiddleware to set session/thread
364
+ router.use('/_agentuity/workbench/*', otelMiddleware);
365
+ router.use('/_agentuity/workbench/*', async (c, next) => {
366
+ // Use a null agent name to just populate the agent registry without setting current agent
367
+ return createAgentMiddleware('')(c, next);
368
+ });
369
+ }
342
370
 
343
371
  const shutdown = async () => {
344
372
  if (isShutdown) {
@@ -370,7 +398,6 @@ export const createServer = async <TAppState>(
370
398
  otel.logger.debug('no more pending connections');
371
399
 
372
400
  // Run agent shutdowns first
373
- const { runAgentShutdowns } = await import('./agent');
374
401
  await runAgentShutdowns(globalAppState);
375
402
 
376
403
  // Run app shutdown if provided
package/src/_services.ts CHANGED
@@ -1,12 +1,10 @@
1
1
  import { context, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';
2
2
  import {
3
3
  KeyValueStorageService,
4
- ObjectStorageService,
5
4
  StreamStorageService,
6
5
  VectorStorageService,
7
6
  type FetchAdapter,
8
7
  type KeyValueStorage,
9
- type ObjectStorage,
10
8
  type StreamStorage,
11
9
  type VectorStorage,
12
10
  type ListStreamsResponse,
@@ -32,6 +30,7 @@ import {
32
30
  } from './services/evalrun';
33
31
  import { injectTraceContextToHeaders } from './otel/http';
34
32
  import { getTracer } from './_server';
33
+ import { populateAgentsRegistry } from './agent.js';
35
34
  import { getSDKVersion, isAuthenticated, isProduction } from './_config';
36
35
  import type { AppConfig } from './app';
37
36
  import {
@@ -42,7 +41,6 @@ import {
42
41
  } from './session';
43
42
  import {
44
43
  LocalKeyValueStorage,
45
- LocalObjectStorage,
46
44
  LocalStreamStorage,
47
45
  LocalVectorStorage,
48
46
  getLocalDB,
@@ -58,7 +56,6 @@ const serviceUrls = getServiceUrls(process.env.AGENTUITY_REGION ?? 'usc');
58
56
  const kvBaseUrl = serviceUrls.keyvalue;
59
57
  const streamBaseUrl = serviceUrls.stream;
60
58
  const vectorBaseUrl = serviceUrls.vector;
61
- const objectBaseUrl = serviceUrls.objectstore;
62
59
  const catalystBaseUrl = serviceUrls.catalyst;
63
60
 
64
61
  let adapter: FetchAdapter;
@@ -157,22 +154,6 @@ const createFetchAdapter = (logger: Logger) =>
157
154
  }
158
155
  break;
159
156
  }
160
- case 'agentuity.objectstore.get': {
161
- if (result.response.status === 404) {
162
- span?.addEvent('miss');
163
- } else if (result.response.ok) {
164
- span?.addEvent('hit');
165
- }
166
- break;
167
- }
168
- case 'agentuity.objectstore.delete': {
169
- if (result.response.status === 404) {
170
- span?.addEvent('not_found', { deleted: false });
171
- } else if (result.response.ok) {
172
- span?.addEvent('deleted', { deleted: true });
173
- }
174
- break;
175
- }
176
157
  }
177
158
  },
178
159
  },
@@ -180,7 +161,6 @@ const createFetchAdapter = (logger: Logger) =>
180
161
  );
181
162
 
182
163
  let kv: KeyValueStorage;
183
- let objectStore: ObjectStorage;
184
164
  let stream: StreamStorage;
185
165
  let vector: VectorStorage;
186
166
  let session: SessionProvider;
@@ -217,7 +197,6 @@ export function createServices(logger: Logger, config?: AppConfig<any>, serverUr
217
197
  logger.info('Using local services (development only)');
218
198
 
219
199
  kv = config?.services?.keyvalue || new LocalKeyValueStorage(db, projectPath);
220
- objectStore = config?.services?.object || new LocalObjectStorage(db, projectPath, serverUrl);
221
200
  stream = config?.services?.stream || new LocalStreamStorage(db, projectPath, serverUrl);
222
201
  vector = config?.services?.vector || new LocalVectorStorage(db, projectPath);
223
202
  session = config?.services?.session || new DefaultSessionProvider();
@@ -245,7 +224,6 @@ export function createServices(logger: Logger, config?: AppConfig<any>, serverUr
245
224
 
246
225
  // At this point we must be authenticated (since !authenticated would trigger local services above)
247
226
  kv = config?.services?.keyvalue || new KeyValueStorageService(kvBaseUrl, adapter);
248
- objectStore = config?.services?.object || new ObjectStorageService(objectBaseUrl, adapter);
249
227
  stream = config?.services?.stream || new StreamStorageService(streamBaseUrl, adapter);
250
228
  vector = config?.services?.vector || new VectorStorageService(vectorBaseUrl, adapter);
251
229
  session = config?.services?.session || new DefaultSessionProvider();
@@ -304,11 +282,6 @@ export function registerServices(o: any, includeAgents = false) {
304
282
  enumerable: false,
305
283
  configurable: false,
306
284
  });
307
- Object.defineProperty(o, 'objectstore', {
308
- get: () => objectStore,
309
- enumerable: false,
310
- configurable: false,
311
- });
312
285
  Object.defineProperty(o, 'stream', {
313
286
  get: () => stream,
314
287
  enumerable: false,
@@ -328,9 +301,7 @@ export function registerServices(o: any, includeAgents = false) {
328
301
  Object.defineProperty(o, 'agent', {
329
302
  get: () => {
330
303
  if (!cachedRegistry) {
331
- // Lazy-load to avoid circular dependency
332
- // eslint-disable-next-line @typescript-eslint/no-require-imports
333
- const { populateAgentsRegistry } = require('./agent');
304
+ // ESM-friendly: populateAgentsRegistry is imported statically
334
305
  cachedRegistry = populateAgentsRegistry(o);
335
306
  }
336
307
  return cachedRegistry;
package/src/_tokens.ts CHANGED
@@ -6,6 +6,7 @@ import { SpanAttributes } from '@traceloop/ai-semantic-conventions';
6
6
  import { addSpanProcessor } from './_server';
7
7
 
8
8
  export const TOKENS_HEADER = 'x-agentuity-tokens';
9
+ export const DURATION_HEADER = 'x-agentuity-duration';
9
10
 
10
11
  const AI_SDK_SPAN_NAME = 'ai.generateText';
11
12
  const AI_SDK_MODEL_NAME = 'ai.model.id';
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import type { StandardSchemaV1 } from '@agentuity/core';
2
+ import type { StandardSchemaV1, InferInput, InferOutput } from '@agentuity/core';
3
3
 
4
4
  /**
5
5
  * Schema definition for routes that can have input (POST, PUT, PATCH, DELETE).
@@ -50,9 +50,7 @@ export type GetRouteSchema<
50
50
  *
51
51
  * @template T - Schema type
52
52
  */
53
- export type InferSchemaInput<T> = T extends StandardSchemaV1
54
- ? StandardSchemaV1.InferInput<T>
55
- : undefined;
53
+ export type InferSchemaInput<T> = T extends StandardSchemaV1 ? InferInput<T> : undefined;
56
54
 
57
55
  /**
58
56
  * Infer the output type from a StandardSchema.
@@ -60,9 +58,7 @@ export type InferSchemaInput<T> = T extends StandardSchemaV1
60
58
  *
61
59
  * @template T - Schema type
62
60
  */
63
- export type InferSchemaOutput<T> = T extends StandardSchemaV1
64
- ? StandardSchemaV1.InferOutput<T>
65
- : undefined;
61
+ export type InferSchemaOutput<T> = T extends StandardSchemaV1 ? InferOutput<T> : undefined;
66
62
 
67
63
  /**
68
64
  * Extract input schema from RouteSchema or GetRouteSchema.