@agentuity/runtime 0.0.51 → 0.0.53
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.d.ts +11 -11
- package/dist/_context.d.ts.map +1 -1
- package/dist/_context.js +84 -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.d.ts +24 -15
- package/dist/agent.d.ts.map +1 -1
- 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.d.ts +1 -1
- package/dist/eval.d.ts.map +1 -1
- 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 +5 -5
- package/src/_context.ts +34 -13
- package/src/agent.ts +76 -40
- package/src/app.ts +6 -1
- package/src/eval.ts +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* An implementation of the SessionEventProvider which uses JSON logs for delivery
|
|
5
|
+
*/
|
|
6
|
+
export class JSONSessionEventProvider {
|
|
7
|
+
directory;
|
|
8
|
+
constructor(directory) {
|
|
9
|
+
this.directory = directory;
|
|
10
|
+
}
|
|
11
|
+
makeFilename(type) {
|
|
12
|
+
return join(this.directory, `session-${type}.${Date.now()}${randomUUID()}.json`);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* called when the session starts
|
|
16
|
+
*
|
|
17
|
+
* @param event SessionStartEvent
|
|
18
|
+
*/
|
|
19
|
+
async start(event) {
|
|
20
|
+
const filename = this.makeFilename('start');
|
|
21
|
+
const payload = JSON.stringify({ ...event, timestamp: new Date() }) + '\n';
|
|
22
|
+
await Bun.file(filename).write(payload);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* called when the session completes
|
|
26
|
+
*
|
|
27
|
+
* @param event SessionCompleteEvent
|
|
28
|
+
*/
|
|
29
|
+
async complete(event) {
|
|
30
|
+
const filename = this.makeFilename('complete');
|
|
31
|
+
const payload = JSON.stringify({ ...event, timestamp: new Date() }) + '\n';
|
|
32
|
+
await Bun.file(filename).write(payload);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/services/session/json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC5B,SAAS,CAAS;IAE1B,YAAY,SAAiB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IACO,YAAY,CAAC,IAA0B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An implementation of the SessionEventProvider which is no-op
|
|
3
|
+
*/
|
|
4
|
+
export class LocalSessionEventProvider {
|
|
5
|
+
/**
|
|
6
|
+
* called when the session starts
|
|
7
|
+
*
|
|
8
|
+
* @param event SessionStartEvent
|
|
9
|
+
*/
|
|
10
|
+
async start(_event) {
|
|
11
|
+
// no op
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* called when the session completes
|
|
15
|
+
*
|
|
16
|
+
* @param event SessionCompleteEvent
|
|
17
|
+
*/
|
|
18
|
+
async complete(_event) {
|
|
19
|
+
// no op
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/services/session/local.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACrC;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,MAAyB;QACpC,QAAQ;IACT,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAA4B;QAC1C,QAAQ;IACT,CAAC;CACD"}
|
package/dist/session.js
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { getCookie, setCookie } from 'hono/cookie';
|
|
2
|
+
import { fireEvent } from './app';
|
|
3
|
+
// WeakMap to store event listeners for Thread and Session instances
|
|
4
|
+
const threadEventListeners = new WeakMap();
|
|
5
|
+
const sessionEventListeners = new WeakMap();
|
|
6
|
+
// Helper to fire thread event listeners
|
|
7
|
+
async function fireThreadEvent(thread, eventName) {
|
|
8
|
+
const listeners = threadEventListeners.get(thread);
|
|
9
|
+
if (!listeners)
|
|
10
|
+
return;
|
|
11
|
+
const callbacks = listeners.get(eventName);
|
|
12
|
+
if (!callbacks || callbacks.size === 0)
|
|
13
|
+
return;
|
|
14
|
+
for (const callback of callbacks) {
|
|
15
|
+
await callback(eventName, thread);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// Helper to fire session event listeners
|
|
19
|
+
async function fireSessionEvent(session, eventName) {
|
|
20
|
+
const listeners = sessionEventListeners.get(session);
|
|
21
|
+
if (!listeners)
|
|
22
|
+
return;
|
|
23
|
+
const callbacks = listeners.get(eventName);
|
|
24
|
+
if (!callbacks || callbacks.size === 0)
|
|
25
|
+
return;
|
|
26
|
+
for (const callback of callbacks) {
|
|
27
|
+
await callback(eventName, session);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Generate thread or session ID
|
|
31
|
+
export function generateId(prefix) {
|
|
32
|
+
const arr = new Uint8Array(16);
|
|
33
|
+
crypto.getRandomValues(arr);
|
|
34
|
+
return `${prefix}${prefix ? '_' : ''}${arr.toHex()}`;
|
|
35
|
+
}
|
|
36
|
+
export class DefaultThread {
|
|
37
|
+
#lastUsed;
|
|
38
|
+
id;
|
|
39
|
+
state;
|
|
40
|
+
provider;
|
|
41
|
+
constructor(provider, id) {
|
|
42
|
+
this.provider = provider;
|
|
43
|
+
this.id = id;
|
|
44
|
+
this.state = new Map();
|
|
45
|
+
this.#lastUsed = Date.now();
|
|
46
|
+
}
|
|
47
|
+
addEventListener(eventName, callback) {
|
|
48
|
+
let listeners = threadEventListeners.get(this);
|
|
49
|
+
if (!listeners) {
|
|
50
|
+
listeners = new Map();
|
|
51
|
+
threadEventListeners.set(this, listeners);
|
|
52
|
+
}
|
|
53
|
+
let callbacks = listeners.get(eventName);
|
|
54
|
+
if (!callbacks) {
|
|
55
|
+
callbacks = new Set();
|
|
56
|
+
listeners.set(eventName, callbacks);
|
|
57
|
+
}
|
|
58
|
+
callbacks.add(callback);
|
|
59
|
+
}
|
|
60
|
+
removeEventListener(eventName, callback) {
|
|
61
|
+
const listeners = threadEventListeners.get(this);
|
|
62
|
+
if (!listeners)
|
|
63
|
+
return;
|
|
64
|
+
const callbacks = listeners.get(eventName);
|
|
65
|
+
if (!callbacks)
|
|
66
|
+
return;
|
|
67
|
+
callbacks.delete(callback);
|
|
68
|
+
}
|
|
69
|
+
async fireEvent(eventName) {
|
|
70
|
+
await fireThreadEvent(this, eventName);
|
|
71
|
+
}
|
|
72
|
+
async destroy() {
|
|
73
|
+
this.provider.destroy(this);
|
|
74
|
+
}
|
|
75
|
+
touch() {
|
|
76
|
+
this.#lastUsed = Date.now();
|
|
77
|
+
}
|
|
78
|
+
expired() {
|
|
79
|
+
return Date.now() - this.#lastUsed >= 3.6e6; // 1 hour
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class DefaultSession {
|
|
83
|
+
id;
|
|
84
|
+
thread;
|
|
85
|
+
state;
|
|
86
|
+
constructor(thread, id) {
|
|
87
|
+
this.id = id;
|
|
88
|
+
this.thread = thread;
|
|
89
|
+
this.state = new Map();
|
|
90
|
+
}
|
|
91
|
+
addEventListener(eventName, callback) {
|
|
92
|
+
let listeners = sessionEventListeners.get(this);
|
|
93
|
+
if (!listeners) {
|
|
94
|
+
listeners = new Map();
|
|
95
|
+
sessionEventListeners.set(this, listeners);
|
|
96
|
+
}
|
|
97
|
+
let callbacks = listeners.get(eventName);
|
|
98
|
+
if (!callbacks) {
|
|
99
|
+
callbacks = new Set();
|
|
100
|
+
listeners.set(eventName, callbacks);
|
|
101
|
+
}
|
|
102
|
+
callbacks.add(callback);
|
|
103
|
+
}
|
|
104
|
+
removeEventListener(eventName, callback) {
|
|
105
|
+
const listeners = sessionEventListeners.get(this);
|
|
106
|
+
if (!listeners)
|
|
107
|
+
return;
|
|
108
|
+
const callbacks = listeners.get(eventName);
|
|
109
|
+
if (!callbacks)
|
|
110
|
+
return;
|
|
111
|
+
callbacks.delete(callback);
|
|
112
|
+
}
|
|
113
|
+
async fireEvent(eventName) {
|
|
114
|
+
await fireSessionEvent(this, eventName);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export class DefaultThreadProvider {
|
|
118
|
+
threads = new Map();
|
|
119
|
+
async initialize() {
|
|
120
|
+
setInterval(() => {
|
|
121
|
+
for (const [, thread] of this.threads) {
|
|
122
|
+
if (thread.expired()) {
|
|
123
|
+
void (async () => {
|
|
124
|
+
try {
|
|
125
|
+
await this.destroy(thread);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
console.error('Failed to destroy expired thread', err);
|
|
129
|
+
}
|
|
130
|
+
})();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}, 60_000).unref();
|
|
134
|
+
}
|
|
135
|
+
async restore(ctx) {
|
|
136
|
+
const cookie = getCookie(ctx);
|
|
137
|
+
let threadId;
|
|
138
|
+
if (cookie.atid?.startsWith('thrd_')) {
|
|
139
|
+
threadId = cookie.atid;
|
|
140
|
+
}
|
|
141
|
+
threadId = threadId || generateId('thrd');
|
|
142
|
+
if (threadId) {
|
|
143
|
+
setCookie(ctx, 'atid', threadId);
|
|
144
|
+
const existing = this.threads.get(threadId);
|
|
145
|
+
if (existing) {
|
|
146
|
+
return existing;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const thread = new DefaultThread(this, threadId);
|
|
150
|
+
this.threads.set(thread.id, thread);
|
|
151
|
+
await fireEvent('thread.created', thread);
|
|
152
|
+
return thread;
|
|
153
|
+
}
|
|
154
|
+
async save(thread) {
|
|
155
|
+
if (thread instanceof DefaultThread) {
|
|
156
|
+
thread.touch();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async destroy(thread) {
|
|
160
|
+
if (thread instanceof DefaultThread) {
|
|
161
|
+
try {
|
|
162
|
+
await thread.fireEvent('destroyed');
|
|
163
|
+
await fireEvent('thread.destroyed', thread);
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
this.threads.delete(thread.id);
|
|
167
|
+
threadEventListeners.delete(thread);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export class DefaultSessionProvider {
|
|
173
|
+
sessions = new Map();
|
|
174
|
+
async initialize() {
|
|
175
|
+
// No initialization needed for in-memory provider
|
|
176
|
+
}
|
|
177
|
+
async restore(thread, sessionId) {
|
|
178
|
+
let session = this.sessions.get(sessionId);
|
|
179
|
+
if (!session) {
|
|
180
|
+
session = new DefaultSession(thread, sessionId);
|
|
181
|
+
this.sessions.set(sessionId, session);
|
|
182
|
+
await fireEvent('session.started', session);
|
|
183
|
+
}
|
|
184
|
+
return session;
|
|
185
|
+
}
|
|
186
|
+
async save(session) {
|
|
187
|
+
if (session instanceof DefaultSession) {
|
|
188
|
+
try {
|
|
189
|
+
await session.fireEvent('completed');
|
|
190
|
+
await fireEvent('session.completed', session);
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
this.sessions.delete(session.id);
|
|
194
|
+
sessionEventListeners.delete(session);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
3
|
+
import { getAgents } from './agent';
|
|
4
|
+
export const createWorkbenchMetadataRoute = () => {
|
|
5
|
+
const authHeader = process.env.AGENTUITY_WORKBENCH_APIKEY
|
|
6
|
+
? `Bearer ${process.env.AGENTUITY_WORKBENCH_APIKEY}`
|
|
7
|
+
: undefined;
|
|
8
|
+
const agents = getAgents();
|
|
9
|
+
return async (ctx) => {
|
|
10
|
+
if (authHeader) {
|
|
11
|
+
try {
|
|
12
|
+
const authValue = ctx.req.header('Authorization');
|
|
13
|
+
if (!authValue ||
|
|
14
|
+
!timingSafeEqual(Buffer.from(authValue, 'utf-8'), Buffer.from(authHeader, 'utf-8'))) {
|
|
15
|
+
return ctx.text('Unauthorized', { status: 401 });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// timing safe equals will throw if the input/output lengths are mismatched
|
|
20
|
+
// so we treat all exceptions as invalid
|
|
21
|
+
return ctx.text('Unauthorized', { status: 401 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const schemas = { agents: {} };
|
|
25
|
+
// TODO: this is going to only work for zod schema for now. need a way to handle others
|
|
26
|
+
for (const [, agent] of agents) {
|
|
27
|
+
schemas.agents[agent.metadata.name] = {
|
|
28
|
+
schema: {
|
|
29
|
+
input: agent.inputSchema ? z.toJSONSchema(agent.inputSchema) : undefined,
|
|
30
|
+
output: agent.outputSchema ? z.toJSONSchema(agent.outputSchema) : undefined,
|
|
31
|
+
},
|
|
32
|
+
metadata: agent.metadata,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return ctx.json(schemas);
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=workbench.js.map
|
|
@@ -0,0 +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,MAAM,SAAS,CAAC;AAEpC,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAY,EAAE;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACxD,CAAC,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE;QACpD,CAAC,CAAC,SAAS,CAAC;IACb,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,OAAO,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,IAAI,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAClD,IACC,CAAC,SAAS;oBACV,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAClF,CAAC;oBACF,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClD,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,2EAA2E;gBAC3E,wCAAwC;gBACxC,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;QACD,MAAM,OAAO,GAAwC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACpE,uFAAuF;QACvF,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG;gBACrC,MAAM,EAAE;oBACP,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;oBACxE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;iBAC3E;gBACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentuity/runtime",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.53",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Agentuity employees and contributors",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"main": "./
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"import": "./
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
12
|
"types": "./dist/index.d.ts"
|
|
13
13
|
}
|
|
14
14
|
},
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"prepublishOnly": "bun run clean && bun run build"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@agentuity/core": "0.0.
|
|
29
|
-
"@agentuity/server": "0.0.
|
|
28
|
+
"@agentuity/core": "0.0.53",
|
|
29
|
+
"@agentuity/server": "0.0.53",
|
|
30
30
|
"@opentelemetry/api": "^1.9.0",
|
|
31
31
|
"@opentelemetry/api-logs": "^0.207.0",
|
|
32
32
|
"@opentelemetry/auto-instrumentations-node": "^0.66.0",
|
package/src/_context.ts
CHANGED
|
@@ -2,17 +2,23 @@ import { AsyncLocalStorage } from 'node:async_hooks';
|
|
|
2
2
|
import type { Context as HonoContext } from 'hono';
|
|
3
3
|
import type { Tracer } from '@opentelemetry/api';
|
|
4
4
|
import type { KeyValueStorage, ObjectStorage, StreamStorage, VectorStorage } from '@agentuity/core';
|
|
5
|
-
import type { AgentContext, AgentName } from './agent';
|
|
5
|
+
import type { AgentContext, AgentName, AgentRegistry, AgentRunner } from './agent';
|
|
6
6
|
import type { Logger } from './logger';
|
|
7
7
|
import type WaitUntilHandler from './_waituntil';
|
|
8
8
|
import { registerServices } from './_services';
|
|
9
9
|
import type { Thread, Session } from './session';
|
|
10
10
|
|
|
11
|
-
export interface RequestAgentContextArgs<
|
|
11
|
+
export interface RequestAgentContextArgs<
|
|
12
|
+
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
17
|
+
> {
|
|
12
18
|
sessionId: string;
|
|
13
19
|
agent: TAgentMap;
|
|
14
|
-
current:
|
|
15
|
-
parent
|
|
20
|
+
current: TCurrent;
|
|
21
|
+
parent: TParent;
|
|
16
22
|
agentName: AgentName;
|
|
17
23
|
logger: Logger;
|
|
18
24
|
tracer: Tracer;
|
|
@@ -21,10 +27,17 @@ export interface RequestAgentContextArgs<TAgentMap, TAgent> {
|
|
|
21
27
|
handler: WaitUntilHandler;
|
|
22
28
|
}
|
|
23
29
|
|
|
24
|
-
export class RequestAgentContext<
|
|
30
|
+
export class RequestAgentContext<
|
|
31
|
+
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
36
|
+
> implements AgentContext<TAgentMap, TCurrent, TParent>
|
|
37
|
+
{
|
|
25
38
|
agent: TAgentMap;
|
|
26
|
-
current:
|
|
27
|
-
parent
|
|
39
|
+
current: TCurrent;
|
|
40
|
+
parent: TParent;
|
|
28
41
|
agentName: AgentName;
|
|
29
42
|
logger: Logger;
|
|
30
43
|
sessionId: string;
|
|
@@ -38,7 +51,7 @@ export class RequestAgentContext<TAgentMap, TAgent> implements AgentContext {
|
|
|
38
51
|
thread: Thread;
|
|
39
52
|
private handler: WaitUntilHandler;
|
|
40
53
|
|
|
41
|
-
constructor(args: RequestAgentContextArgs<TAgentMap,
|
|
54
|
+
constructor(args: RequestAgentContextArgs<TAgentMap, TCurrent, TParent>) {
|
|
42
55
|
this.agent = args.agent;
|
|
43
56
|
this.current = args.current;
|
|
44
57
|
this.parent = args.parent;
|
|
@@ -58,7 +71,8 @@ export class RequestAgentContext<TAgentMap, TAgent> implements AgentContext {
|
|
|
58
71
|
}
|
|
59
72
|
}
|
|
60
73
|
|
|
61
|
-
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
const agentAsyncLocalStorage = new AsyncLocalStorage<AgentContext<any, any, any>>();
|
|
62
76
|
const httpAsyncLocalStorage = new AsyncLocalStorage<HonoContext>();
|
|
63
77
|
|
|
64
78
|
export const inAgentContext = (): boolean => {
|
|
@@ -71,7 +85,8 @@ export const inHTTPContext = (): boolean => {
|
|
|
71
85
|
return !!context;
|
|
72
86
|
};
|
|
73
87
|
|
|
74
|
-
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
export const getAgentContext = (): AgentContext<any, any, any> => {
|
|
75
90
|
const context = agentAsyncLocalStorage.getStore();
|
|
76
91
|
if (!context) {
|
|
77
92
|
throw new Error('AgentContext is not available');
|
|
@@ -90,12 +105,18 @@ export const getHTTPContext = (): HonoContext => {
|
|
|
90
105
|
export const getAgentAsyncLocalStorage = () => agentAsyncLocalStorage;
|
|
91
106
|
export const getHTTPAsyncLocalStorage = () => httpAsyncLocalStorage;
|
|
92
107
|
|
|
93
|
-
export const runInAgentContext = <
|
|
108
|
+
export const runInAgentContext = <
|
|
109
|
+
TAgentMap extends AgentRegistry = AgentRegistry,
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
111
|
+
TCurrent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
|
+
TParent extends AgentRunner<any, any, any> | undefined = AgentRunner<any, any, any> | undefined,
|
|
114
|
+
>(
|
|
94
115
|
ctxObject: Record<string, unknown>,
|
|
95
|
-
args: RequestAgentContextArgs<TAgentMap,
|
|
116
|
+
args: RequestAgentContextArgs<TAgentMap, TCurrent, TParent>,
|
|
96
117
|
next: () => Promise<void>
|
|
97
118
|
) => {
|
|
98
|
-
const ctx = new RequestAgentContext(args);
|
|
119
|
+
const ctx = new RequestAgentContext<TAgentMap, TCurrent, TParent>(args);
|
|
99
120
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
121
|
const _ctx = ctx as any;
|
|
101
122
|
Object.getOwnPropertyNames(ctx).forEach((k) => {
|