veryfront 0.1.64 → 0.1.65
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/esm/deno.js +1 -1
- package/esm/src/agent/runtime/index.d.ts +1 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +10 -2
- package/esm/src/channels/control-plane.d.ts +259 -0
- package/esm/src/channels/control-plane.d.ts.map +1 -0
- package/esm/src/channels/control-plane.js +212 -0
- package/esm/src/channels/invoke.d.ts +3 -40
- package/esm/src/channels/invoke.d.ts.map +1 -1
- package/esm/src/channels/invoke.js +9 -106
- package/esm/src/internal-agents/ag-ui-sse.d.ts +35 -0
- package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -0
- package/esm/src/internal-agents/ag-ui-sse.js +263 -0
- package/esm/src/internal-agents/control-plane-auth.d.ts +20 -0
- package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -0
- package/esm/src/internal-agents/control-plane-auth.js +56 -0
- package/esm/src/internal-agents/request-body.d.ts +9 -0
- package/esm/src/internal-agents/request-body.d.ts.map +1 -0
- package/esm/src/internal-agents/request-body.js +28 -0
- package/esm/src/internal-agents/run-stream.d.ts +14 -0
- package/esm/src/internal-agents/run-stream.d.ts.map +1 -0
- package/esm/src/internal-agents/run-stream.js +259 -0
- package/esm/src/internal-agents/schema.d.ts +268 -0
- package/esm/src/internal-agents/schema.d.ts.map +1 -0
- package/esm/src/internal-agents/schema.js +71 -0
- package/esm/src/internal-agents/session-manager.d.ts +63 -0
- package/esm/src/internal-agents/session-manager.d.ts.map +1 -0
- package/esm/src/internal-agents/session-manager.js +258 -0
- package/esm/src/platform/adapters/runtime/deno/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/runtime/deno/adapter.js +4 -13
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +42 -5
- package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-run-cancel.handler.js +62 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.js +77 -0
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts +14 -0
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-stream.handler.js +86 -0
- package/esm/src/server/handlers/request/{channel-assistants.handler.d.ts → internal-agents-list.handler.d.ts} +4 -4
- package/esm/src/server/handlers/request/internal-agents-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/internal-agents-list.handler.js +73 -0
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +8 -2
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/runtime/index.ts +12 -2
- package/src/src/channels/control-plane.ts +332 -0
- package/src/src/channels/invoke.ts +12 -157
- package/src/src/internal-agents/ag-ui-sse.ts +327 -0
- package/src/src/internal-agents/control-plane-auth.ts +82 -0
- package/src/src/internal-agents/request-body.ts +42 -0
- package/src/src/internal-agents/run-stream.ts +354 -0
- package/src/src/internal-agents/schema.ts +102 -0
- package/src/src/internal-agents/session-manager.ts +358 -0
- package/src/src/platform/adapters/runtime/deno/adapter.ts +9 -11
- package/src/src/platform/compat/process.ts +56 -3
- package/src/src/server/handlers/request/agent-run-cancel.handler.ts +86 -0
- package/src/src/server/handlers/request/agent-run-resume.handler.ts +108 -0
- package/src/src/server/handlers/request/agent-stream.handler.ts +125 -0
- package/src/src/server/handlers/request/internal-agents-list.handler.ts +100 -0
- package/src/src/server/runtime-handler/index.ts +8 -2
- package/esm/src/server/handlers/request/channel-assistants.handler.d.ts.map +0 -1
- package/esm/src/server/handlers/request/channel-assistants.handler.js +0 -71
- package/src/src/server/handlers/request/channel-assistants.handler.ts +0 -94
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import * as dntShim from "../../_dnt.shims.js";
|
|
2
|
+
function stableJsonStringify(value, depth = 0) {
|
|
3
|
+
if (depth > 64) {
|
|
4
|
+
return JSON.stringify(value);
|
|
5
|
+
}
|
|
6
|
+
if (value === null || typeof value !== "object") {
|
|
7
|
+
return JSON.stringify(value);
|
|
8
|
+
}
|
|
9
|
+
if (Array.isArray(value)) {
|
|
10
|
+
return `[${value.map((item) => stableJsonStringify(item, depth + 1)).join(",")}]`;
|
|
11
|
+
}
|
|
12
|
+
const entries = Object.entries(value)
|
|
13
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
14
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${stableJsonStringify(item, depth + 1)}`);
|
|
15
|
+
return `{${entries.join(",")}}`;
|
|
16
|
+
}
|
|
17
|
+
function createToolResultKey(result, isError) {
|
|
18
|
+
return `${isError ? "1" : "0"}:${stableJsonStringify(result)}`;
|
|
19
|
+
}
|
|
20
|
+
export class AgentRunCancelledError extends Error {
|
|
21
|
+
constructor(message = "Run cancelled") {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "AgentRunCancelledError";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class AgentRunAlreadyExistsError extends Error {
|
|
27
|
+
constructor(runId) {
|
|
28
|
+
super(`Run "${runId}" is already active`);
|
|
29
|
+
this.name = "AgentRunAlreadyExistsError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class RunNotActiveError extends Error {
|
|
33
|
+
constructor(runId) {
|
|
34
|
+
super(`Run "${runId}" is not active`);
|
|
35
|
+
this.name = "RunNotActiveError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class ToolResultNotWaitingError extends Error {
|
|
39
|
+
constructor(runId, toolCallId) {
|
|
40
|
+
super(`Run "${runId}" is not waiting for tool call "${toolCallId}"`);
|
|
41
|
+
this.name = "ToolResultNotWaitingError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class ToolResultConflictError extends Error {
|
|
45
|
+
constructor(runId, toolCallId) {
|
|
46
|
+
super(`Conflicting tool result for run "${runId}" and tool call "${toolCallId}"`);
|
|
47
|
+
this.name = "ToolResultConflictError";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const DEFAULT_WAITING_FOR_TOOL_TTL_MS = 5 * 60 * 1000;
|
|
51
|
+
const DEFAULT_SESSION_TTL_MS = 15 * 60 * 1000;
|
|
52
|
+
const DEFAULT_MAX_CONCURRENT_SESSIONS = 100;
|
|
53
|
+
export class AgentRunSessionManager {
|
|
54
|
+
options;
|
|
55
|
+
sessions = new Map();
|
|
56
|
+
constructor(options = {}) {
|
|
57
|
+
this.options = options;
|
|
58
|
+
}
|
|
59
|
+
get waitingForToolTtlMs() {
|
|
60
|
+
return this.options.waitingForToolTtlMs ?? DEFAULT_WAITING_FOR_TOOL_TTL_MS;
|
|
61
|
+
}
|
|
62
|
+
get sessionTtlMs() {
|
|
63
|
+
return this.options.sessionTtlMs ?? null;
|
|
64
|
+
}
|
|
65
|
+
get setTimeoutFn() {
|
|
66
|
+
return this.options.setTimeoutFn ?? dntShim.dntGlobalThis.setTimeout.bind(dntShim.dntGlobalThis);
|
|
67
|
+
}
|
|
68
|
+
get clearTimeoutFn() {
|
|
69
|
+
return this.options.clearTimeoutFn ?? globalThis.clearTimeout.bind(dntShim.dntGlobalThis);
|
|
70
|
+
}
|
|
71
|
+
clearWaitingTimeout(session) {
|
|
72
|
+
if (session.waitingTimeoutId === null) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.clearTimeoutFn(session.waitingTimeoutId);
|
|
76
|
+
session.waitingTimeoutId = null;
|
|
77
|
+
}
|
|
78
|
+
clearSessionTimeout(session) {
|
|
79
|
+
if (session.sessionTimeoutId === null) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
this.clearTimeoutFn(session.sessionTimeoutId);
|
|
83
|
+
session.sessionTimeoutId = null;
|
|
84
|
+
}
|
|
85
|
+
scheduleSessionTimeout(session) {
|
|
86
|
+
if (this.sessionTtlMs === null) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.clearSessionTimeout(session);
|
|
90
|
+
session.sessionTimeoutId = this.setTimeoutFn(() => {
|
|
91
|
+
this.cancelRun(session.runId);
|
|
92
|
+
}, this.sessionTtlMs);
|
|
93
|
+
}
|
|
94
|
+
scheduleWaitingTimeout(session) {
|
|
95
|
+
this.clearWaitingTimeout(session);
|
|
96
|
+
session.waitingTimeoutId = this.setTimeoutFn(() => {
|
|
97
|
+
this.cancelRun(session.runId);
|
|
98
|
+
}, this.waitingForToolTtlMs);
|
|
99
|
+
}
|
|
100
|
+
touchSession(session) {
|
|
101
|
+
if (session.status === "running" || session.status === "waiting") {
|
|
102
|
+
this.scheduleSessionTimeout(session);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
get maxConcurrentSessions() {
|
|
106
|
+
return this.options.maxConcurrentSessions ?? DEFAULT_MAX_CONCURRENT_SESSIONS;
|
|
107
|
+
}
|
|
108
|
+
startRun(input) {
|
|
109
|
+
const existing = this.sessions.get(input.runId);
|
|
110
|
+
if (existing && (existing.status === "running" || existing.status === "waiting")) {
|
|
111
|
+
throw new AgentRunAlreadyExistsError(input.runId);
|
|
112
|
+
}
|
|
113
|
+
if (this.sessions.size >= this.maxConcurrentSessions) {
|
|
114
|
+
throw new Error(`Maximum concurrent sessions (${this.maxConcurrentSessions}) reached`);
|
|
115
|
+
}
|
|
116
|
+
const session = {
|
|
117
|
+
runId: input.runId,
|
|
118
|
+
threadId: input.threadId,
|
|
119
|
+
status: "running",
|
|
120
|
+
abortController: new AbortController(),
|
|
121
|
+
waitingTool: null,
|
|
122
|
+
submittedResults: new Map(),
|
|
123
|
+
waitingTimeoutId: null,
|
|
124
|
+
sessionTimeoutId: null,
|
|
125
|
+
};
|
|
126
|
+
this.sessions.set(input.runId, session);
|
|
127
|
+
this.touchSession(session);
|
|
128
|
+
return session.abortController.signal;
|
|
129
|
+
}
|
|
130
|
+
async waitForToolResult(runId, toolCallId) {
|
|
131
|
+
const session = this.sessions.get(runId);
|
|
132
|
+
if (!session || session.status === "completed" || session.status === "failed") {
|
|
133
|
+
throw new RunNotActiveError(runId);
|
|
134
|
+
}
|
|
135
|
+
if (session.abortController.signal.aborted || session.status === "cancelled") {
|
|
136
|
+
throw new AgentRunCancelledError();
|
|
137
|
+
}
|
|
138
|
+
const existingResult = session.submittedResults.get(toolCallId);
|
|
139
|
+
if (existingResult) {
|
|
140
|
+
session.status = "running";
|
|
141
|
+
this.touchSession(session);
|
|
142
|
+
return { result: existingResult.result, isError: existingResult.isError };
|
|
143
|
+
}
|
|
144
|
+
if (session.waitingTool && session.waitingTool.toolCallId !== toolCallId) {
|
|
145
|
+
throw new ToolResultNotWaitingError(runId, toolCallId);
|
|
146
|
+
}
|
|
147
|
+
session.status = "waiting";
|
|
148
|
+
this.scheduleWaitingTimeout(session);
|
|
149
|
+
this.touchSession(session);
|
|
150
|
+
return await new Promise((resolve, reject) => {
|
|
151
|
+
const abortHandler = () => {
|
|
152
|
+
this.clearWaitingTimeout(session);
|
|
153
|
+
session.waitingTool = null;
|
|
154
|
+
session.status = "cancelled";
|
|
155
|
+
reject(new AgentRunCancelledError());
|
|
156
|
+
};
|
|
157
|
+
session.abortController.signal.addEventListener("abort", abortHandler, { once: true });
|
|
158
|
+
session.waitingTool = {
|
|
159
|
+
toolCallId,
|
|
160
|
+
resolve: (value) => {
|
|
161
|
+
session.abortController.signal.removeEventListener("abort", abortHandler);
|
|
162
|
+
this.clearWaitingTimeout(session);
|
|
163
|
+
session.waitingTool = null;
|
|
164
|
+
session.status = "running";
|
|
165
|
+
this.touchSession(session);
|
|
166
|
+
resolve({ result: value.result, isError: value.isError });
|
|
167
|
+
},
|
|
168
|
+
reject: (reason) => {
|
|
169
|
+
session.abortController.signal.removeEventListener("abort", abortHandler);
|
|
170
|
+
this.clearWaitingTimeout(session);
|
|
171
|
+
session.waitingTool = null;
|
|
172
|
+
reject(reason);
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
submitToolResult(runId, input) {
|
|
178
|
+
const session = this.sessions.get(runId);
|
|
179
|
+
if (!session) {
|
|
180
|
+
throw new RunNotActiveError(runId);
|
|
181
|
+
}
|
|
182
|
+
const normalized = {
|
|
183
|
+
toolCallId: input.toolCallId,
|
|
184
|
+
result: input.result,
|
|
185
|
+
isError: Boolean(input.isError),
|
|
186
|
+
key: createToolResultKey(input.result, Boolean(input.isError)),
|
|
187
|
+
};
|
|
188
|
+
const existingResult = session.submittedResults.get(input.toolCallId);
|
|
189
|
+
if (existingResult) {
|
|
190
|
+
if (existingResult.key === normalized.key) {
|
|
191
|
+
return { accepted: true, duplicate: true };
|
|
192
|
+
}
|
|
193
|
+
throw new ToolResultConflictError(runId, input.toolCallId);
|
|
194
|
+
}
|
|
195
|
+
if (session.status === "completed" || session.status === "failed" ||
|
|
196
|
+
session.status === "cancelled") {
|
|
197
|
+
throw new RunNotActiveError(runId);
|
|
198
|
+
}
|
|
199
|
+
if (!session.waitingTool || session.waitingTool.toolCallId !== input.toolCallId) {
|
|
200
|
+
throw new ToolResultNotWaitingError(runId, input.toolCallId);
|
|
201
|
+
}
|
|
202
|
+
session.submittedResults.set(input.toolCallId, normalized);
|
|
203
|
+
this.touchSession(session);
|
|
204
|
+
session.waitingTool.resolve(normalized);
|
|
205
|
+
return { accepted: true };
|
|
206
|
+
}
|
|
207
|
+
cancelRun(runId) {
|
|
208
|
+
const session = this.sessions.get(runId);
|
|
209
|
+
if (!session) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
if (session.status === "completed" || session.status === "failed" ||
|
|
213
|
+
session.status === "cancelled") {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
session.status = "cancelled";
|
|
217
|
+
this.clearWaitingTimeout(session);
|
|
218
|
+
this.clearSessionTimeout(session);
|
|
219
|
+
session.abortController.abort(new AgentRunCancelledError());
|
|
220
|
+
session.waitingTool?.reject(new AgentRunCancelledError());
|
|
221
|
+
session.waitingTool = null;
|
|
222
|
+
this.sessions.delete(runId);
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
completeRun(runId) {
|
|
226
|
+
const session = this.sessions.get(runId);
|
|
227
|
+
if (!session)
|
|
228
|
+
return;
|
|
229
|
+
session.status = "completed";
|
|
230
|
+
this.clearWaitingTimeout(session);
|
|
231
|
+
this.clearSessionTimeout(session);
|
|
232
|
+
session.waitingTool = null;
|
|
233
|
+
this.sessions.delete(runId);
|
|
234
|
+
}
|
|
235
|
+
failRun(runId) {
|
|
236
|
+
const session = this.sessions.get(runId);
|
|
237
|
+
if (!session)
|
|
238
|
+
return;
|
|
239
|
+
session.status = "failed";
|
|
240
|
+
this.clearWaitingTimeout(session);
|
|
241
|
+
this.clearSessionTimeout(session);
|
|
242
|
+
session.waitingTool = null;
|
|
243
|
+
this.sessions.delete(runId);
|
|
244
|
+
}
|
|
245
|
+
getRunStatus(runId) {
|
|
246
|
+
return this.sessions.get(runId)?.status ?? null;
|
|
247
|
+
}
|
|
248
|
+
reset() {
|
|
249
|
+
for (const session of this.sessions.values()) {
|
|
250
|
+
this.clearWaitingTimeout(session);
|
|
251
|
+
this.clearSessionTimeout(session);
|
|
252
|
+
}
|
|
253
|
+
this.sessions.clear();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export const agentRunSessionManager = new AgentRunSessionManager({
|
|
257
|
+
sessionTtlMs: DEFAULT_SESSION_TTL_MS,
|
|
258
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/runtime/deno/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAGxD,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAElB,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAyHvB,cAAM,qBAAsB,YAAW,iBAAiB;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAKhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAY/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAYrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,WAAW;CAuErE;AAED,cAAM,sBAAuB,YAAW,kBAAkB;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGnC;AAED,cAAM,iBAAkB,YAAW,aAAa;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,gBAAgB;CAS7D;AAED,cAAM,gBAAiB,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IAejE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAanC;AAwBD,qBAAa,WAAY,YAAW,cAAc;IAChD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,EAAE,wBAA+B;IAC1C,QAAQ,CAAC,GAAG,yBAAgC;IAC5C,QAAQ,CAAC,MAAM,oBAA2B;IAC1C,QAAQ,CAAC,KAAK,mBAA0B;IAExC,QAAQ,CAAC,YAAY;;;;;;;;;;MAUnB;IAEF,OAAO,CAAC,YAAY,CAA2B;IAE/C,KAAK,CACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,EACnF,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC;IAuEZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGhC;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -2,7 +2,7 @@ import * as dntShim from "../../../../../_dnt.shims.js";
|
|
|
2
2
|
import { createError, NOT_SUPPORTED, toError } from "../../../../errors/index.js";
|
|
3
3
|
import { join } from "../../../compat/path/index.js";
|
|
4
4
|
import { serverLogger } from "../../../../utils/index.js";
|
|
5
|
-
import { getEnvOverlayStorage } from "../../../compat/process.js";
|
|
5
|
+
import { env as getEnvObject, getEnv, getEnvOverlayStorage, setEnv, } from "../../../compat/process.js";
|
|
6
6
|
import { createFileWatcher, createWatcherIterator, enqueueWatchEvent, } from "../shared/watcher-queue.js";
|
|
7
7
|
import { stopManagedServer } from "../shared/server-lifecycle.js";
|
|
8
8
|
const logger = serverLogger.component("deno");
|
|
@@ -201,22 +201,13 @@ class DenoFileSystemAdapter {
|
|
|
201
201
|
}
|
|
202
202
|
class DenoEnvironmentAdapter {
|
|
203
203
|
get(key) {
|
|
204
|
-
|
|
205
|
-
return undefined;
|
|
206
|
-
return dntShim.Deno.env.get(key);
|
|
204
|
+
return getEnv(key);
|
|
207
205
|
}
|
|
208
206
|
set(key, value) {
|
|
209
|
-
|
|
210
|
-
throw NOT_SUPPORTED.create({
|
|
211
|
-
detail: "DenoEnvironmentAdapter.set() can only be used in Deno runtime",
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
dntShim.Deno.env.set(key, value);
|
|
207
|
+
setEnv(key, value);
|
|
215
208
|
}
|
|
216
209
|
toObject() {
|
|
217
|
-
|
|
218
|
-
return {};
|
|
219
|
-
return dntShim.Deno.env.toObject();
|
|
210
|
+
return getEnvObject();
|
|
220
211
|
}
|
|
221
212
|
}
|
|
222
213
|
class DenoServerAdapter {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAKlD,KAAK,cAAc,GAAG,cAAc,cAAc,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,OAAO,GAAG,WAAW,IAAI,cAAc,CAIzF;AAWD,6EAA6E;AAC7E,wBAAgB,OAAO,IAAI,MAAM,EAAE,CAIlC;AAED,yFAAyF;AACzF,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAIzC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAI5B;AAED,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAU7C;
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../../src/src/platform/compat/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,18 +55,45 @@ export function chdir(directory) {
|
|
|
55
55
|
}
|
|
56
56
|
throw new Error("chdir() is not supported in this runtime");
|
|
57
57
|
}
|
|
58
|
+
function getEnvOverlayStore() {
|
|
59
|
+
const storage = getEnvOverlayStorage();
|
|
60
|
+
const store = storage?.getStore();
|
|
61
|
+
return store instanceof Map ? store : null;
|
|
62
|
+
}
|
|
63
|
+
function getOverlayEnvValue(store, key) {
|
|
64
|
+
if (!store?.has(key)) {
|
|
65
|
+
return { hasValue: false, value: undefined };
|
|
66
|
+
}
|
|
67
|
+
const value = store.get(key);
|
|
68
|
+
return { hasValue: true, value: value ?? undefined };
|
|
69
|
+
}
|
|
58
70
|
export function env() {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
71
|
+
const base = IS_DENO
|
|
72
|
+
? dntShim.Deno.env.toObject()
|
|
73
|
+
: runtimeProcess
|
|
74
|
+
? { ...runtimeProcess.env }
|
|
75
|
+
: {};
|
|
76
|
+
const overlay = getEnvOverlayStore();
|
|
77
|
+
if (!overlay)
|
|
78
|
+
return base;
|
|
79
|
+
for (const [key, value] of overlay.entries()) {
|
|
80
|
+
if (value === null) {
|
|
81
|
+
delete base[key];
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
base[key] = value;
|
|
85
|
+
}
|
|
86
|
+
return base;
|
|
64
87
|
}
|
|
65
88
|
/**
|
|
66
89
|
* Read a host-level environment variable without consulting any project env overlay.
|
|
67
90
|
* Use this for framework-owned runtime configuration that should not be shadowed by tenant env.
|
|
68
91
|
*/
|
|
69
92
|
export function getHostEnv(key) {
|
|
93
|
+
const overlayResult = getOverlayEnvValue(getEnvOverlayStore(), key);
|
|
94
|
+
if (overlayResult.hasValue) {
|
|
95
|
+
return overlayResult.value;
|
|
96
|
+
}
|
|
70
97
|
if (IS_DENO)
|
|
71
98
|
return dntShim.Deno.env.get(key);
|
|
72
99
|
if (runtimeProcess)
|
|
@@ -156,6 +183,11 @@ export function getEnvBoolean(key, fallback = false, options = {}) {
|
|
|
156
183
|
return fallback;
|
|
157
184
|
}
|
|
158
185
|
export function setEnv(key, value) {
|
|
186
|
+
const overlay = getEnvOverlayStore();
|
|
187
|
+
if (overlay) {
|
|
188
|
+
overlay.set(key, value);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
159
191
|
if (IS_DENO) {
|
|
160
192
|
dntShim.Deno.env.set(key, value);
|
|
161
193
|
return;
|
|
@@ -167,6 +199,11 @@ export function setEnv(key, value) {
|
|
|
167
199
|
throw new Error("setEnv() is not supported in this runtime");
|
|
168
200
|
}
|
|
169
201
|
export function deleteEnv(key) {
|
|
202
|
+
const overlay = getEnvOverlayStore();
|
|
203
|
+
if (overlay) {
|
|
204
|
+
overlay.set(key, null);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
170
207
|
if (IS_DENO) {
|
|
171
208
|
dntShim.Deno.env.delete(key);
|
|
172
209
|
return;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { type AgentRunSessionManager } from "../../../internal-agents/session-manager.js";
|
|
3
|
+
import { BaseHandler } from "../response/base.js";
|
|
4
|
+
import type { HandlerContext, HandlerMetadata, HandlerResult } from "../types.js";
|
|
5
|
+
export declare class AgentRunCancelHandler extends BaseHandler {
|
|
6
|
+
private readonly sessionManager;
|
|
7
|
+
metadata: HandlerMetadata;
|
|
8
|
+
constructor(sessionManager?: AgentRunSessionManager);
|
|
9
|
+
handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=agent-run-cancel.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-cancel.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-run-cancel.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAKrD,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,6CAA6C,CAAC;AAMrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AASnG,qBAAa,qBAAsB,SAAQ,WAAW;IAOxC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAN3C,QAAQ,EAAE,eAAe,CAIvB;gBAE2B,cAAc,GAAE,sBAA+C;IAItF,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAkDhF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { ControlPlaneRequestError, verifyControlPlaneRequest, } from "../../../internal-agents/control-plane-auth.js";
|
|
2
|
+
import { agentRunSessionManager, } from "../../../internal-agents/session-manager.js";
|
|
3
|
+
import { INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES, InternalAgentRequestBodyTooLargeError, readInternalAgentRequestBody, } from "../../../internal-agents/request-body.js";
|
|
4
|
+
import { BaseHandler } from "../response/base.js";
|
|
5
|
+
import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
|
|
6
|
+
const CANCEL_PATH_REGEX = /^\/internal\/agents\/runs\/([^/]+)$/;
|
|
7
|
+
function getRunId(pathname) {
|
|
8
|
+
return CANCEL_PATH_REGEX.exec(pathname)?.[1] ?? null;
|
|
9
|
+
}
|
|
10
|
+
export class AgentRunCancelHandler extends BaseHandler {
|
|
11
|
+
sessionManager;
|
|
12
|
+
metadata = {
|
|
13
|
+
name: "AgentRunCancelHandler",
|
|
14
|
+
priority: PRIORITY_MEDIUM_API,
|
|
15
|
+
patterns: [{ pattern: "/internal/agents/runs/", prefix: true, method: "DELETE" }],
|
|
16
|
+
};
|
|
17
|
+
constructor(sessionManager = agentRunSessionManager) {
|
|
18
|
+
super();
|
|
19
|
+
this.sessionManager = sessionManager;
|
|
20
|
+
}
|
|
21
|
+
async handle(req, ctx) {
|
|
22
|
+
if (!this.shouldHandle(req, ctx)) {
|
|
23
|
+
return this.continue();
|
|
24
|
+
}
|
|
25
|
+
const runId = getRunId(new URL(req.url).pathname);
|
|
26
|
+
if (!runId) {
|
|
27
|
+
return this.continue();
|
|
28
|
+
}
|
|
29
|
+
return this.withProxyContext(ctx, async () => {
|
|
30
|
+
const builder = this.createResponseBuilder(ctx)
|
|
31
|
+
.withCORS(req, ctx.securityConfig?.cors)
|
|
32
|
+
.withSecurity(ctx.securityConfig ?? undefined, req);
|
|
33
|
+
try {
|
|
34
|
+
const rawBody = await readInternalAgentRequestBody(req, INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES);
|
|
35
|
+
await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
36
|
+
expectedSubject: runId,
|
|
37
|
+
expectedSurface: "studio",
|
|
38
|
+
});
|
|
39
|
+
const accepted = this.sessionManager.cancelRun(runId);
|
|
40
|
+
if (accepted) {
|
|
41
|
+
return this.respond(builder.json({ accepted: true }, 202));
|
|
42
|
+
}
|
|
43
|
+
return this.respond(builder.build(null, 204));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
47
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
48
|
+
}
|
|
49
|
+
if (error instanceof ControlPlaneRequestError) {
|
|
50
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
51
|
+
}
|
|
52
|
+
this.logWarn("Internal agent run cancel failed", {
|
|
53
|
+
error: error instanceof Error ? error.message : String(error),
|
|
54
|
+
runId,
|
|
55
|
+
projectId: ctx.projectId,
|
|
56
|
+
projectSlug: ctx.projectSlug,
|
|
57
|
+
});
|
|
58
|
+
return this.respond(builder.json({ error: "Internal cancel failed" }, 500));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { type AgentRunSessionManager } from "../../../internal-agents/session-manager.js";
|
|
3
|
+
import { BaseHandler } from "../response/base.js";
|
|
4
|
+
import type { HandlerContext, HandlerMetadata, HandlerResult } from "../types.js";
|
|
5
|
+
export declare class AgentRunResumeHandler extends BaseHandler {
|
|
6
|
+
private readonly sessionManager;
|
|
7
|
+
metadata: HandlerMetadata;
|
|
8
|
+
constructor(sessionManager?: AgentRunSessionManager);
|
|
9
|
+
handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=agent-run-resume.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-resume.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-run-resume.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAKrD,OAAO,EACL,KAAK,sBAAsB,EAK5B,MAAM,6CAA6C,CAAC;AAOrD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AASnG,qBAAa,qBAAsB,SAAQ,WAAW;IAOxC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAN3C,QAAQ,EAAE,eAAe,CAIvB;gBAE2B,cAAc,GAAE,sBAA+C;IAItF,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAoEhF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ControlPlaneRequestError, verifyControlPlaneRequest, } from "../../../internal-agents/control-plane-auth.js";
|
|
2
|
+
import { agentRunSessionManager, RunNotActiveError, ToolResultConflictError, ToolResultNotWaitingError, } from "../../../internal-agents/session-manager.js";
|
|
3
|
+
import { INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES, InternalAgentRequestBodyTooLargeError, readInternalAgentRequestBody, } from "../../../internal-agents/request-body.js";
|
|
4
|
+
import { ResumeSignalSchema } from "../../../internal-agents/schema.js";
|
|
5
|
+
import { BaseHandler } from "../response/base.js";
|
|
6
|
+
import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
|
|
7
|
+
const RESUME_PATH_REGEX = /^\/internal\/agents\/runs\/([^/]+)\/resume$/;
|
|
8
|
+
function getRunId(pathname) {
|
|
9
|
+
return RESUME_PATH_REGEX.exec(pathname)?.[1] ?? null;
|
|
10
|
+
}
|
|
11
|
+
export class AgentRunResumeHandler extends BaseHandler {
|
|
12
|
+
sessionManager;
|
|
13
|
+
metadata = {
|
|
14
|
+
name: "AgentRunResumeHandler",
|
|
15
|
+
priority: PRIORITY_MEDIUM_API,
|
|
16
|
+
patterns: [{ pattern: "/internal/agents/runs/", prefix: true, method: "POST" }],
|
|
17
|
+
};
|
|
18
|
+
constructor(sessionManager = agentRunSessionManager) {
|
|
19
|
+
super();
|
|
20
|
+
this.sessionManager = sessionManager;
|
|
21
|
+
}
|
|
22
|
+
async handle(req, ctx) {
|
|
23
|
+
if (!this.shouldHandle(req, ctx)) {
|
|
24
|
+
return this.continue();
|
|
25
|
+
}
|
|
26
|
+
const runId = getRunId(new URL(req.url).pathname);
|
|
27
|
+
if (!runId) {
|
|
28
|
+
return this.continue();
|
|
29
|
+
}
|
|
30
|
+
return this.withProxyContext(ctx, async () => {
|
|
31
|
+
const builder = this.createResponseBuilder(ctx)
|
|
32
|
+
.withCORS(req, ctx.securityConfig?.cors)
|
|
33
|
+
.withSecurity(ctx.securityConfig ?? undefined, req);
|
|
34
|
+
try {
|
|
35
|
+
const rawBody = await readInternalAgentRequestBody(req, INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES);
|
|
36
|
+
await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
37
|
+
expectedSubject: runId,
|
|
38
|
+
expectedSurface: "studio",
|
|
39
|
+
});
|
|
40
|
+
const signal = ResumeSignalSchema.parse(JSON.parse(rawBody));
|
|
41
|
+
const outcome = this.sessionManager.submitToolResult(runId, {
|
|
42
|
+
toolCallId: signal.toolCallId,
|
|
43
|
+
result: signal.result,
|
|
44
|
+
isError: signal.isError,
|
|
45
|
+
});
|
|
46
|
+
return this.respond(builder.json(outcome, 200));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
50
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
51
|
+
}
|
|
52
|
+
if (error instanceof ControlPlaneRequestError) {
|
|
53
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
54
|
+
}
|
|
55
|
+
if (error instanceof SyntaxError || (error instanceof Error && error.name === "ZodError")) {
|
|
56
|
+
return this.respond(builder.json({ error: "Invalid resume request" }, 400));
|
|
57
|
+
}
|
|
58
|
+
if (error instanceof ToolResultConflictError) {
|
|
59
|
+
return this.respond(builder.json({ error: "TOOL_RESULT_CONFLICT" }, 409));
|
|
60
|
+
}
|
|
61
|
+
if (error instanceof ToolResultNotWaitingError) {
|
|
62
|
+
return this.respond(builder.json({ error: "TOOL_RESULT_NOT_WAITING" }, 409));
|
|
63
|
+
}
|
|
64
|
+
if (error instanceof RunNotActiveError) {
|
|
65
|
+
return this.respond(builder.json({ error: "RUN_NOT_ACTIVE" }, 410));
|
|
66
|
+
}
|
|
67
|
+
this.logWarn("Internal agent run resume failed", {
|
|
68
|
+
error: error instanceof Error ? error.message : String(error),
|
|
69
|
+
runId,
|
|
70
|
+
projectId: ctx.projectId,
|
|
71
|
+
projectSlug: ctx.projectSlug,
|
|
72
|
+
});
|
|
73
|
+
return this.respond(builder.json({ error: "Internal resume failed" }, 500));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { type RuntimeAgentDiscoveryDeps } from "../../../channels/control-plane.js";
|
|
3
|
+
import { type RuntimeAgentStreamExecutionDeps } from "../../../internal-agents/run-stream.js";
|
|
4
|
+
import { BaseHandler } from "../response/base.js";
|
|
5
|
+
import type { HandlerContext, HandlerMetadata, HandlerResult } from "../types.js";
|
|
6
|
+
export interface AgentStreamHandlerDeps extends RuntimeAgentDiscoveryDeps, RuntimeAgentStreamExecutionDeps {
|
|
7
|
+
}
|
|
8
|
+
export declare class AgentStreamHandler extends BaseHandler {
|
|
9
|
+
private readonly deps;
|
|
10
|
+
metadata: HandlerMetadata;
|
|
11
|
+
constructor(deps?: AgentStreamHandlerDeps);
|
|
12
|
+
handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=agent-stream.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-stream.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/agent-stream.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAehD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAGnG,MAAM,WAAW,sBACf,SAAQ,yBAAyB,EAAE,+BAA+B;CAAG;AAsBvE,qBAAa,kBAAmB,SAAQ,WAAW;IAOrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,QAAQ,EAAE,eAAe,CAIvB;gBAE2B,IAAI,GAAE,sBAAoC;IAIjE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAgEhF"}
|