@dexto/server 1.6.26 → 1.7.0
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/approval/approval-coordinator.cjs +11 -5
- package/dist/approval/approval-coordinator.d.ts +2 -1
- package/dist/approval/approval-coordinator.d.ts.map +1 -1
- package/dist/approval/approval-coordinator.js +11 -5
- package/dist/approval/manual-approval-handler.cjs +3 -0
- package/dist/approval/manual-approval-handler.d.ts.map +1 -1
- package/dist/approval/manual-approval-handler.js +3 -0
- package/dist/events/session-sse-subscriber.cjs +44 -42
- package/dist/events/session-sse-subscriber.d.ts.map +1 -1
- package/dist/events/session-sse-subscriber.js +44 -42
- package/dist/hono/routes/a2a-tasks.cjs +1 -1
- package/dist/hono/routes/a2a-tasks.js +1 -1
- package/dist/hono/routes/agents.cjs +2 -2
- package/dist/hono/routes/agents.d.ts +3179 -11826
- package/dist/hono/routes/agents.d.ts.map +1 -1
- package/dist/hono/routes/agents.js +2 -2
- package/dist/hono/routes/approvals.cjs +2 -0
- package/dist/hono/routes/approvals.d.ts +335 -1581
- package/dist/hono/routes/approvals.d.ts.map +1 -1
- package/dist/hono/routes/approvals.js +2 -0
- package/dist/hono/routes/dexto-auth.d.ts +27 -237
- package/dist/hono/routes/dexto-auth.d.ts.map +1 -1
- package/dist/hono/routes/discovery.d.ts +67 -409
- package/dist/hono/routes/discovery.d.ts.map +1 -1
- package/dist/hono/routes/greeting.d.ts +56 -472
- package/dist/hono/routes/greeting.d.ts.map +1 -1
- package/dist/hono/routes/key.d.ts +401 -1139
- package/dist/hono/routes/key.d.ts.map +1 -1
- package/dist/hono/routes/llm.cjs +1 -1
- package/dist/hono/routes/llm.d.ts +2537 -8617
- package/dist/hono/routes/llm.d.ts.map +1 -1
- package/dist/hono/routes/llm.js +1 -1
- package/dist/hono/routes/mcp.d.ts +1075 -5442
- package/dist/hono/routes/mcp.d.ts.map +1 -1
- package/dist/hono/routes/memory.d.ts +1077 -3966
- package/dist/hono/routes/memory.d.ts.map +1 -1
- package/dist/hono/routes/messages.cjs +6 -2
- package/dist/hono/routes/messages.d.ts +756 -2841
- package/dist/hono/routes/messages.d.ts.map +1 -1
- package/dist/hono/routes/messages.js +7 -3
- package/dist/hono/routes/models.d.ts +499 -2024
- package/dist/hono/routes/models.d.ts.map +1 -1
- package/dist/hono/routes/openrouter.d.ts +66 -506
- package/dist/hono/routes/openrouter.d.ts.map +1 -1
- package/dist/hono/routes/prompts.d.ts +280 -1867
- package/dist/hono/routes/prompts.d.ts.map +1 -1
- package/dist/hono/routes/queue.d.ts +849 -3782
- package/dist/hono/routes/queue.d.ts.map +1 -1
- package/dist/hono/routes/resources.d.ts +202 -1313
- package/dist/hono/routes/resources.d.ts.map +1 -1
- package/dist/hono/routes/schedules.d.ts +560 -3296
- package/dist/hono/routes/schedules.d.ts.map +1 -1
- package/dist/hono/routes/search.d.ts +360 -2422
- package/dist/hono/routes/search.d.ts.map +1 -1
- package/dist/hono/routes/sessions.d.ts +3337 -13842
- package/dist/hono/routes/sessions.d.ts.map +1 -1
- package/dist/hono/routes/system-prompt.d.ts +89 -747
- package/dist/hono/routes/system-prompt.d.ts.map +1 -1
- package/dist/hono/routes/tools.d.ts +79 -1513
- package/dist/hono/routes/tools.d.ts.map +1 -1
- package/dist/hono/routes/webhooks.d.ts +410 -1754
- package/dist/hono/routes/webhooks.d.ts.map +1 -1
- package/dist/hono/routes/workspaces.d.ts +260 -1394
- package/dist/hono/routes/workspaces.d.ts.map +1 -1
- package/dist/hono/schemas/responses.d.ts +765 -4976
- package/dist/hono/schemas/responses.d.ts.map +1 -1
- package/package.json +10 -10
|
@@ -23,14 +23,17 @@ __export(approval_coordinator_exports, {
|
|
|
23
23
|
module.exports = __toCommonJS(approval_coordinator_exports);
|
|
24
24
|
var import_node_events = require("node:events");
|
|
25
25
|
class ApprovalCoordinator extends import_node_events.EventEmitter {
|
|
26
|
-
// Track approvalId ->
|
|
27
|
-
|
|
26
|
+
// Track approvalId -> request context mapping for multi-client routing and correlation.
|
|
27
|
+
approvalContexts = /* @__PURE__ */ new Map();
|
|
28
28
|
/**
|
|
29
29
|
* Emit an approval request.
|
|
30
30
|
* Called by ManualApprovalHandler when tool/command needs approval.
|
|
31
31
|
*/
|
|
32
32
|
emitRequest(request) {
|
|
33
|
-
this.
|
|
33
|
+
this.approvalContexts.set(request.approvalId, {
|
|
34
|
+
sessionId: request.sessionId,
|
|
35
|
+
hostRuntime: request.hostRuntime
|
|
36
|
+
});
|
|
34
37
|
this.emit("approval:request", request);
|
|
35
38
|
}
|
|
36
39
|
/**
|
|
@@ -39,14 +42,17 @@ class ApprovalCoordinator extends import_node_events.EventEmitter {
|
|
|
39
42
|
*/
|
|
40
43
|
emitResponse(response) {
|
|
41
44
|
this.emit("approval:response", response);
|
|
42
|
-
this.
|
|
45
|
+
this.approvalContexts.delete(response.approvalId);
|
|
43
46
|
}
|
|
44
47
|
/**
|
|
45
48
|
* Get the sessionId associated with an approval request.
|
|
46
49
|
* Used by API routes to attach sessionId to responses for SSE routing.
|
|
47
50
|
*/
|
|
48
51
|
getSessionId(approvalId) {
|
|
49
|
-
return this.
|
|
52
|
+
return this.approvalContexts.get(approvalId)?.sessionId;
|
|
53
|
+
}
|
|
54
|
+
getHostRuntime(approvalId) {
|
|
55
|
+
return this.approvalContexts.get(approvalId)?.hostRuntime;
|
|
50
56
|
}
|
|
51
57
|
/**
|
|
52
58
|
* Subscribe to approval requests.
|
|
@@ -12,7 +12,7 @@ import type { ApprovalRequest, ApprovalResponse } from '@dexto/core';
|
|
|
12
12
|
* - Approval routes: Emits responses from client submissions
|
|
13
13
|
*/
|
|
14
14
|
export declare class ApprovalCoordinator extends EventEmitter {
|
|
15
|
-
private
|
|
15
|
+
private approvalContexts;
|
|
16
16
|
/**
|
|
17
17
|
* Emit an approval request.
|
|
18
18
|
* Called by ManualApprovalHandler when tool/command needs approval.
|
|
@@ -28,6 +28,7 @@ export declare class ApprovalCoordinator extends EventEmitter {
|
|
|
28
28
|
* Used by API routes to attach sessionId to responses for SSE routing.
|
|
29
29
|
*/
|
|
30
30
|
getSessionId(approvalId: string): string | undefined;
|
|
31
|
+
getHostRuntime(approvalId: string): ApprovalRequest['hostRuntime'] | undefined;
|
|
31
32
|
/**
|
|
32
33
|
* Subscribe to approval requests.
|
|
33
34
|
* Used by streaming endpoints to forward requests to SSE clients.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-coordinator.d.ts","sourceRoot":"","sources":["../../src/approval/approval-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;GAUG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IAEjD,OAAO,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"approval-coordinator.d.ts","sourceRoot":"","sources":["../../src/approval/approval-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;GAUG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IAEjD,OAAO,CAAC,gBAAgB,CAGpB;IAEJ;;;OAGG;IACI,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IASlD;;;OAGG;IACI,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAMrD;;;OAGG;IACI,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAAC,aAAa,CAAC,GAAG,SAAS;IAIrF;;;;;;OAMG;IACI,SAAS,CACZ,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,EAC3C,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,IAAI;IAYP;;;;;;OAMG;IACI,UAAU,CACb,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,EAC7C,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACnC,IAAI;CAWV"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
class ApprovalCoordinator extends EventEmitter {
|
|
3
|
-
// Track approvalId ->
|
|
4
|
-
|
|
3
|
+
// Track approvalId -> request context mapping for multi-client routing and correlation.
|
|
4
|
+
approvalContexts = /* @__PURE__ */ new Map();
|
|
5
5
|
/**
|
|
6
6
|
* Emit an approval request.
|
|
7
7
|
* Called by ManualApprovalHandler when tool/command needs approval.
|
|
8
8
|
*/
|
|
9
9
|
emitRequest(request) {
|
|
10
|
-
this.
|
|
10
|
+
this.approvalContexts.set(request.approvalId, {
|
|
11
|
+
sessionId: request.sessionId,
|
|
12
|
+
hostRuntime: request.hostRuntime
|
|
13
|
+
});
|
|
11
14
|
this.emit("approval:request", request);
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
@@ -16,14 +19,17 @@ class ApprovalCoordinator extends EventEmitter {
|
|
|
16
19
|
*/
|
|
17
20
|
emitResponse(response) {
|
|
18
21
|
this.emit("approval:response", response);
|
|
19
|
-
this.
|
|
22
|
+
this.approvalContexts.delete(response.approvalId);
|
|
20
23
|
}
|
|
21
24
|
/**
|
|
22
25
|
* Get the sessionId associated with an approval request.
|
|
23
26
|
* Used by API routes to attach sessionId to responses for SSE routing.
|
|
24
27
|
*/
|
|
25
28
|
getSessionId(approvalId) {
|
|
26
|
-
return this.
|
|
29
|
+
return this.approvalContexts.get(approvalId)?.sessionId;
|
|
30
|
+
}
|
|
31
|
+
getHostRuntime(approvalId) {
|
|
32
|
+
return this.approvalContexts.get(approvalId)?.hostRuntime;
|
|
27
33
|
}
|
|
28
34
|
/**
|
|
29
35
|
* Subscribe to approval requests.
|
|
@@ -36,6 +36,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
36
36
|
approvalId: request.approvalId,
|
|
37
37
|
status: import_core.ApprovalStatus.CANCELLED,
|
|
38
38
|
sessionId: request.sessionId,
|
|
39
|
+
hostRuntime: request.hostRuntime,
|
|
39
40
|
reason: import_core.DenialReason.TIMEOUT,
|
|
40
41
|
message: `Approval request timed out after ${effectiveTimeout}ms`,
|
|
41
42
|
timeoutMs: effectiveTimeout
|
|
@@ -81,6 +82,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
81
82
|
approvalId,
|
|
82
83
|
status: import_core.ApprovalStatus.CANCELLED,
|
|
83
84
|
sessionId: pending.request.sessionId,
|
|
85
|
+
hostRuntime: pending.request.hostRuntime,
|
|
84
86
|
reason: import_core.DenialReason.SYSTEM_CANCELLED,
|
|
85
87
|
message: "Approval request was cancelled"
|
|
86
88
|
};
|
|
@@ -114,6 +116,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
114
116
|
approvalId,
|
|
115
117
|
status: import_core.ApprovalStatus.APPROVED,
|
|
116
118
|
sessionId: pending.request.sessionId,
|
|
119
|
+
hostRuntime: pending.request.hostRuntime,
|
|
117
120
|
message: "Auto-approved due to matching remembered pattern",
|
|
118
121
|
data: responseData
|
|
119
122
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual-approval-handler.d.ts","sourceRoot":"","sources":["../../src/approval/manual-approval-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,aAAa,CAAC;AAEtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"manual-approval-handler.d.ts","sourceRoot":"","sources":["../../src/approval/manual-approval-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,aAAa,CAAC;AAEtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,mBAAmB,GAAG,eAAe,CAqK7F"}
|
|
@@ -13,6 +13,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
13
13
|
approvalId: request.approvalId,
|
|
14
14
|
status: ApprovalStatus.CANCELLED,
|
|
15
15
|
sessionId: request.sessionId,
|
|
16
|
+
hostRuntime: request.hostRuntime,
|
|
16
17
|
reason: DenialReason.TIMEOUT,
|
|
17
18
|
message: `Approval request timed out after ${effectiveTimeout}ms`,
|
|
18
19
|
timeoutMs: effectiveTimeout
|
|
@@ -58,6 +59,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
58
59
|
approvalId,
|
|
59
60
|
status: ApprovalStatus.CANCELLED,
|
|
60
61
|
sessionId: pending.request.sessionId,
|
|
62
|
+
hostRuntime: pending.request.hostRuntime,
|
|
61
63
|
reason: DenialReason.SYSTEM_CANCELLED,
|
|
62
64
|
message: "Approval request was cancelled"
|
|
63
65
|
};
|
|
@@ -91,6 +93,7 @@ function createManualApprovalHandler(coordinator) {
|
|
|
91
93
|
approvalId,
|
|
92
94
|
status: ApprovalStatus.APPROVED,
|
|
93
95
|
sessionId: pending.request.sessionId,
|
|
96
|
+
hostRuntime: pending.request.hostRuntime,
|
|
94
97
|
message: "Auto-approved due to matching remembered pattern",
|
|
95
98
|
data: responseData
|
|
96
99
|
};
|
|
@@ -25,19 +25,39 @@ var import_events = require("events");
|
|
|
25
25
|
var import_node_util = require("node:util");
|
|
26
26
|
var import_web = require("node:stream/web");
|
|
27
27
|
var import_core = require("@dexto/core");
|
|
28
|
+
const SESSION_EVENT_NAMES = [
|
|
29
|
+
"llm:thinking",
|
|
30
|
+
"llm:chunk",
|
|
31
|
+
"llm:response",
|
|
32
|
+
"llm:tool-call",
|
|
33
|
+
"llm:tool-call-partial",
|
|
34
|
+
"llm:tool-result",
|
|
35
|
+
"llm:error",
|
|
36
|
+
"llm:unsupported-input",
|
|
37
|
+
"tool:running",
|
|
38
|
+
"context:compacting",
|
|
39
|
+
"context:compacted",
|
|
40
|
+
"context:pruned",
|
|
41
|
+
"message:queued",
|
|
42
|
+
"message:dequeued",
|
|
43
|
+
"session:title-updated",
|
|
44
|
+
"approval:request",
|
|
45
|
+
"approval:response",
|
|
46
|
+
"service:event",
|
|
47
|
+
"run:complete"
|
|
48
|
+
];
|
|
28
49
|
function serializeEventPayload(eventName, payload) {
|
|
29
|
-
if (eventName === "llm:error") {
|
|
30
|
-
const errorPayload = payload;
|
|
50
|
+
if (eventName === "llm:error" && "error" in payload) {
|
|
31
51
|
return {
|
|
32
|
-
...
|
|
33
|
-
error:
|
|
34
|
-
message:
|
|
35
|
-
name:
|
|
36
|
-
stack:
|
|
37
|
-
} :
|
|
52
|
+
...payload,
|
|
53
|
+
error: payload.error instanceof Error ? {
|
|
54
|
+
message: payload.error.message,
|
|
55
|
+
name: payload.error.name,
|
|
56
|
+
stack: payload.error.stack
|
|
57
|
+
} : payload.error
|
|
38
58
|
};
|
|
39
59
|
}
|
|
40
|
-
return payload;
|
|
60
|
+
return { ...payload };
|
|
41
61
|
}
|
|
42
62
|
class SessionSseEventSubscriber {
|
|
43
63
|
connections = /* @__PURE__ */ new Map();
|
|
@@ -48,40 +68,22 @@ class SessionSseEventSubscriber {
|
|
|
48
68
|
const { signal } = this.globalAbortController;
|
|
49
69
|
(0, import_events.setMaxListeners)(32, signal);
|
|
50
70
|
const subscribeSessionEvent = (eventName) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
((payload)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
{ signal }
|
|
64
|
-
);
|
|
71
|
+
const listener = (...args) => {
|
|
72
|
+
const [payload] = args;
|
|
73
|
+
if (!payload || typeof payload !== "object" || !("sessionId" in payload) || typeof payload.sessionId !== "string") {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.broadcastToSession(
|
|
77
|
+
payload.sessionId,
|
|
78
|
+
String(eventName),
|
|
79
|
+
serializeEventPayload(eventName, payload)
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
eventBus.on(eventName, listener, { signal });
|
|
65
83
|
};
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
subscribeSessionEvent("llm:tool-call");
|
|
70
|
-
subscribeSessionEvent("llm:tool-call-partial");
|
|
71
|
-
subscribeSessionEvent("llm:tool-result");
|
|
72
|
-
subscribeSessionEvent("llm:error");
|
|
73
|
-
subscribeSessionEvent("llm:unsupported-input");
|
|
74
|
-
subscribeSessionEvent("tool:running");
|
|
75
|
-
subscribeSessionEvent("context:compacting");
|
|
76
|
-
subscribeSessionEvent("context:compacted");
|
|
77
|
-
subscribeSessionEvent("context:pruned");
|
|
78
|
-
subscribeSessionEvent("message:queued");
|
|
79
|
-
subscribeSessionEvent("message:dequeued");
|
|
80
|
-
subscribeSessionEvent("session:title-updated");
|
|
81
|
-
subscribeSessionEvent("approval:request");
|
|
82
|
-
subscribeSessionEvent("approval:response");
|
|
83
|
-
subscribeSessionEvent("service:event");
|
|
84
|
-
subscribeSessionEvent("run:complete");
|
|
84
|
+
for (const eventName of SESSION_EVENT_NAMES) {
|
|
85
|
+
subscribeSessionEvent(eventName);
|
|
86
|
+
}
|
|
85
87
|
import_core.logger.debug("SessionSseEventSubscriber subscribed to agent events");
|
|
86
88
|
}
|
|
87
89
|
createStream(sessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sse-subscriber.d.ts","sourceRoot":"","sources":["../../src/events/session-sse-subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAwC,MAAM,iBAAiB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"session-sse-subscriber.d.ts","sourceRoot":"","sources":["../../src/events/session-sse-subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAwC,MAAM,iBAAiB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAA2C,MAAM,aAAa,CAAC;AAwD1F,qBAAa,yBAAyB;IAClC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAsCxC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC;IAsC3D,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,cAAc;IAKtB,OAAO,IAAI,IAAI;CASlB"}
|
|
@@ -2,19 +2,39 @@ import { setMaxListeners } from "events";
|
|
|
2
2
|
import { TextEncoder } from "node:util";
|
|
3
3
|
import { ReadableStream } from "node:stream/web";
|
|
4
4
|
import { logger } from "@dexto/core";
|
|
5
|
+
const SESSION_EVENT_NAMES = [
|
|
6
|
+
"llm:thinking",
|
|
7
|
+
"llm:chunk",
|
|
8
|
+
"llm:response",
|
|
9
|
+
"llm:tool-call",
|
|
10
|
+
"llm:tool-call-partial",
|
|
11
|
+
"llm:tool-result",
|
|
12
|
+
"llm:error",
|
|
13
|
+
"llm:unsupported-input",
|
|
14
|
+
"tool:running",
|
|
15
|
+
"context:compacting",
|
|
16
|
+
"context:compacted",
|
|
17
|
+
"context:pruned",
|
|
18
|
+
"message:queued",
|
|
19
|
+
"message:dequeued",
|
|
20
|
+
"session:title-updated",
|
|
21
|
+
"approval:request",
|
|
22
|
+
"approval:response",
|
|
23
|
+
"service:event",
|
|
24
|
+
"run:complete"
|
|
25
|
+
];
|
|
5
26
|
function serializeEventPayload(eventName, payload) {
|
|
6
|
-
if (eventName === "llm:error") {
|
|
7
|
-
const errorPayload = payload;
|
|
27
|
+
if (eventName === "llm:error" && "error" in payload) {
|
|
8
28
|
return {
|
|
9
|
-
...
|
|
10
|
-
error:
|
|
11
|
-
message:
|
|
12
|
-
name:
|
|
13
|
-
stack:
|
|
14
|
-
} :
|
|
29
|
+
...payload,
|
|
30
|
+
error: payload.error instanceof Error ? {
|
|
31
|
+
message: payload.error.message,
|
|
32
|
+
name: payload.error.name,
|
|
33
|
+
stack: payload.error.stack
|
|
34
|
+
} : payload.error
|
|
15
35
|
};
|
|
16
36
|
}
|
|
17
|
-
return payload;
|
|
37
|
+
return { ...payload };
|
|
18
38
|
}
|
|
19
39
|
class SessionSseEventSubscriber {
|
|
20
40
|
connections = /* @__PURE__ */ new Map();
|
|
@@ -25,40 +45,22 @@ class SessionSseEventSubscriber {
|
|
|
25
45
|
const { signal } = this.globalAbortController;
|
|
26
46
|
setMaxListeners(32, signal);
|
|
27
47
|
const subscribeSessionEvent = (eventName) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
((payload)
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{ signal }
|
|
41
|
-
);
|
|
48
|
+
const listener = (...args) => {
|
|
49
|
+
const [payload] = args;
|
|
50
|
+
if (!payload || typeof payload !== "object" || !("sessionId" in payload) || typeof payload.sessionId !== "string") {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.broadcastToSession(
|
|
54
|
+
payload.sessionId,
|
|
55
|
+
String(eventName),
|
|
56
|
+
serializeEventPayload(eventName, payload)
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
eventBus.on(eventName, listener, { signal });
|
|
42
60
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
subscribeSessionEvent("llm:tool-call");
|
|
47
|
-
subscribeSessionEvent("llm:tool-call-partial");
|
|
48
|
-
subscribeSessionEvent("llm:tool-result");
|
|
49
|
-
subscribeSessionEvent("llm:error");
|
|
50
|
-
subscribeSessionEvent("llm:unsupported-input");
|
|
51
|
-
subscribeSessionEvent("tool:running");
|
|
52
|
-
subscribeSessionEvent("context:compacting");
|
|
53
|
-
subscribeSessionEvent("context:compacted");
|
|
54
|
-
subscribeSessionEvent("context:pruned");
|
|
55
|
-
subscribeSessionEvent("message:queued");
|
|
56
|
-
subscribeSessionEvent("message:dequeued");
|
|
57
|
-
subscribeSessionEvent("session:title-updated");
|
|
58
|
-
subscribeSessionEvent("approval:request");
|
|
59
|
-
subscribeSessionEvent("approval:response");
|
|
60
|
-
subscribeSessionEvent("service:event");
|
|
61
|
-
subscribeSessionEvent("run:complete");
|
|
61
|
+
for (const eventName of SESSION_EVENT_NAMES) {
|
|
62
|
+
subscribeSessionEvent(eventName);
|
|
63
|
+
}
|
|
62
64
|
logger.debug("SessionSseEventSubscriber subscribed to agent events");
|
|
63
65
|
}
|
|
64
66
|
createStream(sessionId) {
|
|
@@ -198,7 +198,7 @@ const MessageSendRequestSchema = import_zod_openapi.z.object({
|
|
|
198
198
|
historyLength: import_zod_openapi.z.number().optional().describe("Limit conversation history length"),
|
|
199
199
|
pushNotificationConfig: import_zod_openapi.z.object({
|
|
200
200
|
url: import_zod_openapi.z.string().describe("Push notification webhook URL"),
|
|
201
|
-
headers: import_zod_openapi.z.record(import_zod_openapi.z.string()).optional().describe("HTTP headers for webhook")
|
|
201
|
+
headers: import_zod_openapi.z.record(import_zod_openapi.z.string(), import_zod_openapi.z.string()).optional().describe("HTTP headers for webhook")
|
|
202
202
|
}).optional().describe("Push notification configuration"),
|
|
203
203
|
blocking: import_zod_openapi.z.boolean().optional().describe("Wait for task completion")
|
|
204
204
|
}).optional().describe("Optional configuration"),
|
|
@@ -179,7 +179,7 @@ const MessageSendRequestSchema = z.object({
|
|
|
179
179
|
historyLength: z.number().optional().describe("Limit conversation history length"),
|
|
180
180
|
pushNotificationConfig: z.object({
|
|
181
181
|
url: z.string().describe("Push notification webhook URL"),
|
|
182
|
-
headers: z.record(z.string()).optional().describe("HTTP headers for webhook")
|
|
182
|
+
headers: z.record(z.string(), z.string()).optional().describe("HTTP headers for webhook")
|
|
183
183
|
}).optional().describe("Push notification configuration"),
|
|
184
184
|
blocking: z.boolean().optional().describe("Wait for task completion")
|
|
185
185
|
}).optional().describe("Optional configuration"),
|
|
@@ -734,9 +734,9 @@ function createAgentsRouter(getAgent, context, getAgentConfigPath) {
|
|
|
734
734
|
const validationResult = import_agent_config.AgentConfigSchema.safeParse(enriched);
|
|
735
735
|
if (!validationResult.success) {
|
|
736
736
|
throw new import_core2.DextoValidationError(
|
|
737
|
-
validationResult.error.
|
|
737
|
+
(0, import_core.zodToIssues)(validationResult.error).map((err) => ({
|
|
738
738
|
code: import_core2.AgentErrorCode.INVALID_CONFIG,
|
|
739
|
-
message: `${err.path
|
|
739
|
+
message: `${err.path?.join(".") || "root"}: ${err.message}`,
|
|
740
740
|
scope: import_core2.ErrorScope.AGENT,
|
|
741
741
|
type: import_core2.ErrorType.USER,
|
|
742
742
|
severity: "error"
|