@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.
Files changed (67) hide show
  1. package/dist/approval/approval-coordinator.cjs +11 -5
  2. package/dist/approval/approval-coordinator.d.ts +2 -1
  3. package/dist/approval/approval-coordinator.d.ts.map +1 -1
  4. package/dist/approval/approval-coordinator.js +11 -5
  5. package/dist/approval/manual-approval-handler.cjs +3 -0
  6. package/dist/approval/manual-approval-handler.d.ts.map +1 -1
  7. package/dist/approval/manual-approval-handler.js +3 -0
  8. package/dist/events/session-sse-subscriber.cjs +44 -42
  9. package/dist/events/session-sse-subscriber.d.ts.map +1 -1
  10. package/dist/events/session-sse-subscriber.js +44 -42
  11. package/dist/hono/routes/a2a-tasks.cjs +1 -1
  12. package/dist/hono/routes/a2a-tasks.js +1 -1
  13. package/dist/hono/routes/agents.cjs +2 -2
  14. package/dist/hono/routes/agents.d.ts +3179 -11826
  15. package/dist/hono/routes/agents.d.ts.map +1 -1
  16. package/dist/hono/routes/agents.js +2 -2
  17. package/dist/hono/routes/approvals.cjs +2 -0
  18. package/dist/hono/routes/approvals.d.ts +335 -1581
  19. package/dist/hono/routes/approvals.d.ts.map +1 -1
  20. package/dist/hono/routes/approvals.js +2 -0
  21. package/dist/hono/routes/dexto-auth.d.ts +27 -237
  22. package/dist/hono/routes/dexto-auth.d.ts.map +1 -1
  23. package/dist/hono/routes/discovery.d.ts +67 -409
  24. package/dist/hono/routes/discovery.d.ts.map +1 -1
  25. package/dist/hono/routes/greeting.d.ts +56 -472
  26. package/dist/hono/routes/greeting.d.ts.map +1 -1
  27. package/dist/hono/routes/key.d.ts +401 -1139
  28. package/dist/hono/routes/key.d.ts.map +1 -1
  29. package/dist/hono/routes/llm.cjs +1 -1
  30. package/dist/hono/routes/llm.d.ts +2537 -8617
  31. package/dist/hono/routes/llm.d.ts.map +1 -1
  32. package/dist/hono/routes/llm.js +1 -1
  33. package/dist/hono/routes/mcp.d.ts +1075 -5442
  34. package/dist/hono/routes/mcp.d.ts.map +1 -1
  35. package/dist/hono/routes/memory.d.ts +1077 -3966
  36. package/dist/hono/routes/memory.d.ts.map +1 -1
  37. package/dist/hono/routes/messages.cjs +6 -2
  38. package/dist/hono/routes/messages.d.ts +756 -2841
  39. package/dist/hono/routes/messages.d.ts.map +1 -1
  40. package/dist/hono/routes/messages.js +7 -3
  41. package/dist/hono/routes/models.d.ts +499 -2024
  42. package/dist/hono/routes/models.d.ts.map +1 -1
  43. package/dist/hono/routes/openrouter.d.ts +66 -506
  44. package/dist/hono/routes/openrouter.d.ts.map +1 -1
  45. package/dist/hono/routes/prompts.d.ts +280 -1867
  46. package/dist/hono/routes/prompts.d.ts.map +1 -1
  47. package/dist/hono/routes/queue.d.ts +849 -3782
  48. package/dist/hono/routes/queue.d.ts.map +1 -1
  49. package/dist/hono/routes/resources.d.ts +202 -1313
  50. package/dist/hono/routes/resources.d.ts.map +1 -1
  51. package/dist/hono/routes/schedules.d.ts +560 -3296
  52. package/dist/hono/routes/schedules.d.ts.map +1 -1
  53. package/dist/hono/routes/search.d.ts +360 -2422
  54. package/dist/hono/routes/search.d.ts.map +1 -1
  55. package/dist/hono/routes/sessions.d.ts +3337 -13842
  56. package/dist/hono/routes/sessions.d.ts.map +1 -1
  57. package/dist/hono/routes/system-prompt.d.ts +89 -747
  58. package/dist/hono/routes/system-prompt.d.ts.map +1 -1
  59. package/dist/hono/routes/tools.d.ts +79 -1513
  60. package/dist/hono/routes/tools.d.ts.map +1 -1
  61. package/dist/hono/routes/webhooks.d.ts +410 -1754
  62. package/dist/hono/routes/webhooks.d.ts.map +1 -1
  63. package/dist/hono/routes/workspaces.d.ts +260 -1394
  64. package/dist/hono/routes/workspaces.d.ts.map +1 -1
  65. package/dist/hono/schemas/responses.d.ts +765 -4976
  66. package/dist/hono/schemas/responses.d.ts.map +1 -1
  67. 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 -> sessionId mapping for multi-client SSE routing
27
- approvalSessions = /* @__PURE__ */ new Map();
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.approvalSessions.set(request.approvalId, request.sessionId);
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.approvalSessions.delete(response.approvalId);
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.approvalSessions.get(approvalId);
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 approvalSessions;
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,CAAyC;IAEjE;;;OAGG;IACI,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAMlD;;;OAGG;IACI,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAMrD;;;OAGG;IACI,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3D;;;;;;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
+ {"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 -> sessionId mapping for multi-client SSE routing
4
- approvalSessions = /* @__PURE__ */ new Map();
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.approvalSessions.set(request.approvalId, request.sessionId);
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.approvalSessions.delete(response.approvalId);
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.approvalSessions.get(approvalId);
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,CAkK7F"}
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
- ...errorPayload,
33
- error: errorPayload.error instanceof Error ? {
34
- message: errorPayload.error.message,
35
- name: errorPayload.error.name,
36
- stack: errorPayload.error.stack
37
- } : errorPayload.error
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
- eventBus.on(
52
- eventName,
53
- ((payload) => {
54
- if (!payload || typeof payload !== "object" || !("sessionId" in payload) || typeof payload.sessionId !== "string") {
55
- return;
56
- }
57
- this.broadcastToSession(
58
- payload.sessionId,
59
- String(eventName),
60
- serializeEventPayload(eventName, payload)
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
- subscribeSessionEvent("llm:thinking");
67
- subscribeSessionEvent("llm:chunk");
68
- subscribeSessionEvent("llm:response");
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,EAAiB,MAAM,aAAa,CAAC;AAgChE,qBAAa,yBAAyB;IAClC,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAuDxC,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"}
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
- ...errorPayload,
10
- error: errorPayload.error instanceof Error ? {
11
- message: errorPayload.error.message,
12
- name: errorPayload.error.name,
13
- stack: errorPayload.error.stack
14
- } : errorPayload.error
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
- eventBus.on(
29
- eventName,
30
- ((payload) => {
31
- if (!payload || typeof payload !== "object" || !("sessionId" in payload) || typeof payload.sessionId !== "string") {
32
- return;
33
- }
34
- this.broadcastToSession(
35
- payload.sessionId,
36
- String(eventName),
37
- serializeEventPayload(eventName, payload)
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
- subscribeSessionEvent("llm:thinking");
44
- subscribeSessionEvent("llm:chunk");
45
- subscribeSessionEvent("llm:response");
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.errors.map((err) => ({
737
+ (0, import_core.zodToIssues)(validationResult.error).map((err) => ({
738
738
  code: import_core2.AgentErrorCode.INVALID_CONFIG,
739
- message: `${err.path.join(".")}: ${err.message}`,
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"