@dexto/core 1.6.26 → 1.6.27

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 (103) hide show
  1. package/dist/agent/DextoAgent.cjs +75 -90
  2. package/dist/agent/DextoAgent.d.ts +4 -4
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +76 -91
  5. package/dist/agent/error-codes.cjs +1 -0
  6. package/dist/agent/error-codes.d.ts +1 -0
  7. package/dist/agent/error-codes.d.ts.map +1 -1
  8. package/dist/agent/error-codes.js +1 -0
  9. package/dist/agent/errors.cjs +13 -0
  10. package/dist/agent/errors.d.ts +6 -0
  11. package/dist/agent/errors.d.ts.map +1 -1
  12. package/dist/agent/errors.js +13 -0
  13. package/dist/agent/index.d.ts +1 -0
  14. package/dist/agent/index.d.ts.map +1 -1
  15. package/dist/agent/schemas.d.ts +2 -2
  16. package/dist/agent/types.d.ts +11 -0
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/approval/factory.cjs +1 -0
  19. package/dist/approval/factory.d.ts.map +1 -1
  20. package/dist/approval/factory.js +1 -0
  21. package/dist/approval/manager.cjs +19 -6
  22. package/dist/approval/manager.d.ts +6 -0
  23. package/dist/approval/manager.d.ts.map +1 -1
  24. package/dist/approval/manager.js +19 -6
  25. package/dist/approval/schemas.cjs +10 -0
  26. package/dist/approval/schemas.d.ts +305 -0
  27. package/dist/approval/schemas.d.ts.map +1 -1
  28. package/dist/approval/schemas.js +10 -0
  29. package/dist/events/index.cjs +210 -75
  30. package/dist/events/index.d.ts +44 -181
  31. package/dist/events/index.d.ts.map +1 -1
  32. package/dist/events/index.js +206 -74
  33. package/dist/hooks/manager.cjs +5 -2
  34. package/dist/hooks/manager.d.ts +2 -0
  35. package/dist/hooks/manager.d.ts.map +1 -1
  36. package/dist/hooks/manager.js +5 -2
  37. package/dist/hooks/types.d.ts +3 -0
  38. package/dist/hooks/types.d.ts.map +1 -1
  39. package/dist/index.browser.d.ts +1 -0
  40. package/dist/index.browser.d.ts.map +1 -1
  41. package/dist/index.cjs +3 -1
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -0
  45. package/dist/llm/executor/turn-executor.cjs +8 -4
  46. package/dist/llm/executor/turn-executor.d.ts +3 -1
  47. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  48. package/dist/llm/executor/turn-executor.js +8 -4
  49. package/dist/llm/services/vercel.cjs +29 -6
  50. package/dist/llm/services/vercel.d.ts +3 -0
  51. package/dist/llm/services/vercel.d.ts.map +1 -1
  52. package/dist/llm/services/vercel.js +27 -5
  53. package/dist/mcp/manager.cjs +7 -2
  54. package/dist/mcp/manager.d.ts +3 -1
  55. package/dist/mcp/manager.d.ts.map +1 -1
  56. package/dist/mcp/manager.js +7 -2
  57. package/dist/mcp/mcp-client.cjs +71 -62
  58. package/dist/mcp/mcp-client.d.ts +3 -2
  59. package/dist/mcp/mcp-client.d.ts.map +1 -1
  60. package/dist/mcp/mcp-client.js +71 -62
  61. package/dist/mcp/schemas.d.ts +10 -10
  62. package/dist/resources/handlers/filesystem-handler.cjs +22 -3
  63. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  64. package/dist/resources/handlers/filesystem-handler.js +22 -3
  65. package/dist/runtime/host-runtime.cjs +163 -0
  66. package/dist/runtime/host-runtime.d.ts +23 -0
  67. package/dist/runtime/host-runtime.d.ts.map +1 -0
  68. package/dist/runtime/host-runtime.js +133 -0
  69. package/dist/runtime/index.cjs +42 -0
  70. package/dist/runtime/index.d.ts +2 -0
  71. package/dist/runtime/index.d.ts.map +1 -0
  72. package/dist/runtime/index.js +21 -0
  73. package/dist/runtime/run-context.cjs +53 -0
  74. package/dist/runtime/run-context.d.ts +13 -0
  75. package/dist/runtime/run-context.d.ts.map +1 -0
  76. package/dist/runtime/run-context.js +34 -0
  77. package/dist/session/chat-session.cjs +30 -32
  78. package/dist/session/chat-session.d.ts +5 -15
  79. package/dist/session/chat-session.d.ts.map +1 -1
  80. package/dist/session/chat-session.js +31 -33
  81. package/dist/session/error-codes.cjs +1 -0
  82. package/dist/session/error-codes.d.ts +2 -1
  83. package/dist/session/error-codes.d.ts.map +1 -1
  84. package/dist/session/error-codes.js +1 -0
  85. package/dist/session/errors.cjs +13 -0
  86. package/dist/session/errors.d.ts +6 -0
  87. package/dist/session/errors.d.ts.map +1 -1
  88. package/dist/session/errors.js +13 -0
  89. package/dist/telemetry/decorators.cjs +75 -57
  90. package/dist/telemetry/decorators.d.ts +2 -0
  91. package/dist/telemetry/decorators.d.ts.map +1 -1
  92. package/dist/telemetry/decorators.js +75 -57
  93. package/dist/telemetry/utils.cjs +9 -6
  94. package/dist/telemetry/utils.d.ts +3 -0
  95. package/dist/telemetry/utils.d.ts.map +1 -1
  96. package/dist/telemetry/utils.js +9 -6
  97. package/dist/tools/tool-manager.cjs +92 -36
  98. package/dist/tools/tool-manager.d.ts +12 -3
  99. package/dist/tools/tool-manager.d.ts.map +1 -1
  100. package/dist/tools/tool-manager.js +92 -36
  101. package/dist/tools/types.d.ts +7 -1
  102. package/dist/tools/types.d.ts.map +1 -1
  103. package/package.json +1 -1
@@ -6,6 +6,7 @@ import {
6
6
  var _DextoAgent_decorators, _init;
7
7
  import { randomUUID } from "crypto";
8
8
  import { setMaxListeners } from "events";
9
+ import { ZodError } from "zod";
9
10
  import { SkillsContributor } from "../systemPrompt/contributors.js";
10
11
  import { expandMessageReferences } from "../resources/index.js";
11
12
  import { expandBlobReferences, fileTypesToMimePatterns } from "../context/utils.js";
@@ -13,7 +14,7 @@ import { StorageManager } from "../storage/index.js";
13
14
  import { PromptManager } from "../prompts/index.js";
14
15
  import { SessionError } from "../session/index.js";
15
16
  import { InstrumentClass } from "../telemetry/decorators.js";
16
- import { trace, context, propagation } from "@opentelemetry/api";
17
+ import { trace, context } from "@opentelemetry/api";
17
18
  import { resolveAndValidateLLMConfig } from "../llm/resolver.js";
18
19
  import { validateInputForLLM } from "../llm/validation.js";
19
20
  import { LLMError } from "../llm/errors.js";
@@ -51,6 +52,7 @@ import {
51
52
  } from "../events/index.js";
52
53
  import { safeStringify } from "../utils/safe-stringify.js";
53
54
  import { deriveHeuristicTitle, generateSessionTitle } from "../session/title-generator.js";
55
+ import { createAgentRunContext } from "../runtime/run-context.js";
54
56
  const requiredServices = [
55
57
  "mcpManager",
56
58
  "toolManager",
@@ -286,6 +288,9 @@ Either:
286
288
  };
287
289
  services.toolManager.setToolExecutionContextFactory((baseContext) => ({
288
290
  ...baseContext,
291
+ ...baseContext.runContext?.hostRuntime !== void 0 && {
292
+ hostRuntime: baseContext.runContext.hostRuntime
293
+ },
289
294
  agent: this,
290
295
  storage: toolExecutionStorage,
291
296
  services: toolExecutionServices
@@ -610,7 +615,8 @@ Either:
610
615
  ...responseEvent.estimatedCost !== void 0 && {
611
616
  estimatedCost: responseEvent.estimatedCost
612
617
  },
613
- ...responseEvent.pricingStatus && { pricingStatus: responseEvent.pricingStatus }
618
+ ...responseEvent.pricingStatus && { pricingStatus: responseEvent.pricingStatus },
619
+ ...responseEvent.hostRuntime && { hostRuntime: responseEvent.hostRuntime }
614
620
  };
615
621
  }
616
622
  /**
@@ -648,8 +654,28 @@ Either:
648
654
  if (!sessionId) {
649
655
  throw AgentError.apiValidationError("sessionId is required");
650
656
  }
657
+ if (this.activeStreamControllers.has(sessionId)) {
658
+ throw AgentError.sessionBusy(sessionId);
659
+ }
651
660
  const signal = options?.signal;
652
661
  const disconnectSignal = options?.disconnectSignal ?? signal;
662
+ let runContext;
663
+ try {
664
+ runContext = createAgentRunContext({
665
+ sessionId,
666
+ hostRuntime: options?.executionContext,
667
+ parentContext: context.active()
668
+ });
669
+ } catch (error) {
670
+ if (error instanceof ZodError) {
671
+ throw AgentError.apiValidationError(
672
+ "executionContext is invalid",
673
+ zodToIssues(error)
674
+ );
675
+ }
676
+ throw error;
677
+ }
678
+ const executionContext = runContext.hostRuntime;
653
679
  let contentParts = typeof content === "string" ? [{ type: "text", text: content }] : [...content];
654
680
  const eventQueue = [];
655
681
  let completed = false;
@@ -659,23 +685,36 @@ Either:
659
685
  const cleanupSignal = controller.signal;
660
686
  this.activeStreamControllers.set(sessionId, controller);
661
687
  setMaxListeners(30, cleanupSignal);
662
- const listeners = [];
688
+ const listenerCleanups = [];
663
689
  let detachDisconnectAbortListener;
690
+ const addStreamingListener = (event, listener) => {
691
+ this.agentEventBus.on(event, listener, { signal: cleanupSignal });
692
+ listenerCleanups.push(() => {
693
+ this.agentEventBus.off(event, listener);
694
+ });
695
+ };
664
696
  const cleanupListeners = () => {
665
697
  detachDisconnectAbortListener?.();
666
698
  detachDisconnectAbortListener = void 0;
667
- if (listeners.length === 0) {
699
+ this.activeStreamControllers.delete(sessionId);
700
+ if (listenerCleanups.length === 0) {
668
701
  return;
669
702
  }
670
- for (const { event, listener } of listeners) {
671
- this.agentEventBus.off(
672
- event,
673
- listener
674
- );
703
+ for (const removeListener of listenerCleanups) {
704
+ removeListener();
675
705
  }
676
- listeners.length = 0;
677
- this.activeStreamControllers.delete(sessionId);
706
+ listenerCleanups.length = 0;
678
707
  };
708
+ try {
709
+ const existingSession = await this.sessionManager.getSession(sessionId, false);
710
+ if (existingSession?.isBusy?.()) {
711
+ throw AgentError.sessionBusy(sessionId);
712
+ }
713
+ } catch (error) {
714
+ cleanupListeners();
715
+ controller.abort();
716
+ throw error;
717
+ }
679
718
  if (disconnectSignal) {
680
719
  const abortHandler = () => {
681
720
  cleanupListeners();
@@ -688,40 +727,32 @@ Either:
688
727
  if (data.sessionId !== sessionId) return;
689
728
  eventQueue.push({ name: "llm:thinking", ...data });
690
729
  };
691
- this.agentEventBus.on("llm:thinking", thinkingListener, { signal: cleanupSignal });
692
- listeners.push({ event: "llm:thinking", listener: thinkingListener });
730
+ addStreamingListener("llm:thinking", thinkingListener);
693
731
  const chunkListener = (data) => {
694
732
  if (data.sessionId !== sessionId) return;
695
733
  eventQueue.push({ name: "llm:chunk", ...data });
696
734
  };
697
- this.agentEventBus.on("llm:chunk", chunkListener, { signal: cleanupSignal });
698
- listeners.push({ event: "llm:chunk", listener: chunkListener });
735
+ addStreamingListener("llm:chunk", chunkListener);
699
736
  const responseListener = (data) => {
700
737
  if (data.sessionId !== sessionId) return;
701
738
  eventQueue.push({ name: "llm:response", ...data });
702
739
  };
703
- this.agentEventBus.on("llm:response", responseListener, { signal: cleanupSignal });
704
- listeners.push({ event: "llm:response", listener: responseListener });
740
+ addStreamingListener("llm:response", responseListener);
705
741
  const toolCallListener = (data) => {
706
742
  if (data.sessionId !== sessionId) return;
707
743
  eventQueue.push({ name: "llm:tool-call", ...data });
708
744
  };
709
- this.agentEventBus.on("llm:tool-call", toolCallListener, { signal: cleanupSignal });
710
- listeners.push({ event: "llm:tool-call", listener: toolCallListener });
745
+ addStreamingListener("llm:tool-call", toolCallListener);
711
746
  const toolCallPartialListener = (data) => {
712
747
  if (data.sessionId !== sessionId) return;
713
748
  eventQueue.push({ name: "llm:tool-call-partial", ...data });
714
749
  };
715
- this.agentEventBus.on("llm:tool-call-partial", toolCallPartialListener, {
716
- signal: cleanupSignal
717
- });
718
- listeners.push({ event: "llm:tool-call-partial", listener: toolCallPartialListener });
750
+ addStreamingListener("llm:tool-call-partial", toolCallPartialListener);
719
751
  const toolResultListener = (data) => {
720
752
  if (data.sessionId !== sessionId) return;
721
753
  eventQueue.push({ name: "llm:tool-result", ...data });
722
754
  };
723
- this.agentEventBus.on("llm:tool-result", toolResultListener, { signal: cleanupSignal });
724
- listeners.push({ event: "llm:tool-result", listener: toolResultListener });
755
+ addStreamingListener("llm:tool-result", toolResultListener);
725
756
  const errorListener = (data) => {
726
757
  if (data.sessionId !== sessionId) return;
727
758
  if (data.recoverable !== true) {
@@ -729,117 +760,70 @@ Either:
729
760
  }
730
761
  eventQueue.push({ name: "llm:error", ...data });
731
762
  };
732
- this.agentEventBus.on("llm:error", errorListener, { signal: cleanupSignal });
733
- listeners.push({ event: "llm:error", listener: errorListener });
763
+ addStreamingListener("llm:error", errorListener);
734
764
  const unsupportedInputListener = (data) => {
735
765
  if (data.sessionId !== sessionId) return;
736
766
  eventQueue.push({ name: "llm:unsupported-input", ...data });
737
767
  };
738
- this.agentEventBus.on("llm:unsupported-input", unsupportedInputListener, {
739
- signal: cleanupSignal
740
- });
741
- listeners.push({ event: "llm:unsupported-input", listener: unsupportedInputListener });
768
+ addStreamingListener("llm:unsupported-input", unsupportedInputListener);
742
769
  const titleUpdatedListener = (data) => {
743
770
  if (data.sessionId !== sessionId) return;
744
771
  eventQueue.push({ name: "session:title-updated", ...data });
745
772
  };
746
- this.agentEventBus.on("session:title-updated", titleUpdatedListener, {
747
- signal: cleanupSignal
748
- });
749
- listeners.push({ event: "session:title-updated", listener: titleUpdatedListener });
773
+ addStreamingListener("session:title-updated", titleUpdatedListener);
750
774
  const approvalRequestListener = (data) => {
751
775
  if (data.sessionId !== sessionId) return;
752
776
  eventQueue.push({ name: "approval:request", ...data });
753
777
  };
754
- this.agentEventBus.on("approval:request", approvalRequestListener, {
755
- signal: cleanupSignal
756
- });
757
- listeners.push({ event: "approval:request", listener: approvalRequestListener });
778
+ addStreamingListener("approval:request", approvalRequestListener);
758
779
  const approvalResponseListener = (data) => {
759
780
  if (data.sessionId !== sessionId) return;
760
781
  eventQueue.push({ name: "approval:response", ...data });
761
782
  };
762
- this.agentEventBus.on("approval:response", approvalResponseListener, {
763
- signal: cleanupSignal
764
- });
765
- listeners.push({ event: "approval:response", listener: approvalResponseListener });
783
+ addStreamingListener("approval:response", approvalResponseListener);
766
784
  const toolRunningListener = (data) => {
767
785
  if (data.sessionId !== sessionId) return;
768
786
  eventQueue.push({ name: "tool:running", ...data });
769
787
  };
770
- this.agentEventBus.on("tool:running", toolRunningListener, {
771
- signal: cleanupSignal
772
- });
773
- listeners.push({ event: "tool:running", listener: toolRunningListener });
788
+ addStreamingListener("tool:running", toolRunningListener);
774
789
  const contextCompactingListener = (data) => {
775
790
  if (data.sessionId !== sessionId) return;
776
791
  eventQueue.push({ name: "context:compacting", ...data });
777
792
  };
778
- this.agentEventBus.on("context:compacting", contextCompactingListener, {
779
- signal: cleanupSignal
780
- });
781
- listeners.push({ event: "context:compacting", listener: contextCompactingListener });
793
+ addStreamingListener("context:compacting", contextCompactingListener);
782
794
  const contextCompactedListener = (data) => {
783
795
  if (data.sessionId !== sessionId) return;
784
796
  eventQueue.push({ name: "context:compacted", ...data });
785
797
  };
786
- this.agentEventBus.on("context:compacted", contextCompactedListener, {
787
- signal: cleanupSignal
788
- });
789
- listeners.push({ event: "context:compacted", listener: contextCompactedListener });
798
+ addStreamingListener("context:compacted", contextCompactedListener);
790
799
  const messageQueuedListener = (data) => {
791
800
  if (data.sessionId !== sessionId) return;
792
801
  eventQueue.push({ name: "message:queued", ...data });
793
802
  };
794
- this.agentEventBus.on("message:queued", messageQueuedListener, {
795
- signal: cleanupSignal
796
- });
797
- listeners.push({ event: "message:queued", listener: messageQueuedListener });
803
+ addStreamingListener("message:queued", messageQueuedListener);
798
804
  const messageDequeuedListener = (data) => {
799
805
  if (data.sessionId !== sessionId) return;
800
806
  eventQueue.push({ name: "message:dequeued", ...data });
801
807
  };
802
- this.agentEventBus.on("message:dequeued", messageDequeuedListener, {
803
- signal: cleanupSignal
804
- });
805
- listeners.push({ event: "message:dequeued", listener: messageDequeuedListener });
808
+ addStreamingListener("message:dequeued", messageDequeuedListener);
806
809
  const serviceEventListener = (data) => {
807
810
  if (data.sessionId !== sessionId) return;
808
811
  eventQueue.push({ name: "service:event", ...data });
809
812
  };
810
- this.agentEventBus.on("service:event", serviceEventListener, {
811
- signal: cleanupSignal
812
- });
813
- listeners.push({ event: "service:event", listener: serviceEventListener });
813
+ addStreamingListener("service:event", serviceEventListener);
814
814
  const runCompleteListener = (data) => {
815
815
  if (data.sessionId !== sessionId) return;
816
816
  sawRunCompleteEvent = true;
817
817
  eventQueue.push({ name: "run:complete", ...data });
818
818
  completed = true;
819
819
  };
820
- this.agentEventBus.on("run:complete", runCompleteListener, {
821
- signal: cleanupSignal
822
- });
823
- listeners.push({ event: "run:complete", listener: runCompleteListener });
820
+ addStreamingListener("run:complete", runCompleteListener);
824
821
  (async () => {
825
- const activeContext = context.active();
826
822
  const activeSpan = trace.getActiveSpan();
827
823
  if (activeSpan) {
828
824
  activeSpan.setAttribute("sessionId", sessionId);
829
825
  }
830
- const existingBaggage = propagation.getBaggage(activeContext);
831
- const baggageEntries = {};
832
- if (existingBaggage) {
833
- existingBaggage.getAllEntries().forEach(([key, entry]) => {
834
- baggageEntries[key] = { ...entry };
835
- });
836
- }
837
- baggageEntries.sessionId = { ...baggageEntries.sessionId, value: sessionId };
838
- const updatedContext = propagation.setBaggage(
839
- activeContext,
840
- propagation.createBaggage(baggageEntries)
841
- );
842
- await context.with(updatedContext, async () => {
826
+ await context.with(runContext.telemetryContext, async () => {
843
827
  try {
844
828
  const llmConfig = this.stateManager.getLLMConfig(sessionId);
845
829
  const textParts = contentParts.filter(
@@ -985,10 +969,10 @@ Either:
985
969
  }
986
970
  validatePromptContentParts(contentParts);
987
971
  const session = await this.sessionManager.getSession(sessionId) || await this.sessionManager.createSession(sessionId);
988
- const _streamResult = await session.stream(
989
- contentParts,
990
- signal ? { signal } : void 0
991
- );
972
+ await session.stream(contentParts, {
973
+ ...signal ? { signal } : {},
974
+ runContext
975
+ });
992
976
  this.sessionManager.incrementMessageCount(session.id).catch(
993
977
  (error) => this.logger.warn(
994
978
  `Failed to increment message count: ${error instanceof Error ? error.message : String(error)}`
@@ -1012,7 +996,8 @@ Either:
1012
996
  error,
1013
997
  recoverable: false,
1014
998
  context: "run_failed",
1015
- sessionId
999
+ sessionId,
1000
+ ...executionContext !== void 0 && { hostRuntime: executionContext }
1016
1001
  };
1017
1002
  eventQueue.push(errorEvent);
1018
1003
  }
@@ -1058,7 +1043,7 @@ Either:
1058
1043
  async isSessionBusy(sessionId) {
1059
1044
  this.ensureStarted();
1060
1045
  const session = await this.sessionManager.getSession(sessionId, false);
1061
- return session?.isBusy() ?? false;
1046
+ return session?.isBusy?.() ?? false;
1062
1047
  }
1063
1048
  /**
1064
1049
  * Queue a message for processing when a session is busy.
@@ -27,6 +27,7 @@ var AgentErrorCode = /* @__PURE__ */ ((AgentErrorCode2) => {
27
27
  AgentErrorCode2["STOPPED"] = "agent_stopped";
28
28
  AgentErrorCode2["INITIALIZATION_FAILED"] = "agent_initialization_failed";
29
29
  AgentErrorCode2["SWITCH_IN_PROGRESS"] = "agent_switch_in_progress";
30
+ AgentErrorCode2["SESSION_BUSY"] = "agent_session_busy";
30
31
  AgentErrorCode2["NO_CONFIG_PATH"] = "agent_no_config_path";
31
32
  AgentErrorCode2["INVALID_CONFIG"] = "agent_invalid_config";
32
33
  AgentErrorCode2["API_VALIDATION_ERROR"] = "agent_api_validation_error";
@@ -9,6 +9,7 @@ export declare enum AgentErrorCode {
9
9
  STOPPED = "agent_stopped",
10
10
  INITIALIZATION_FAILED = "agent_initialization_failed",
11
11
  SWITCH_IN_PROGRESS = "agent_switch_in_progress",
12
+ SESSION_BUSY = "agent_session_busy",
12
13
  NO_CONFIG_PATH = "agent_no_config_path",
13
14
  INVALID_CONFIG = "agent_invalid_config",
14
15
  API_VALIDATION_ERROR = "agent_api_validation_error",
@@ -1 +1 @@
1
- {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/agent/error-codes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,cAAc;IAEtB,WAAW,sBAAsB;IACjC,eAAe,0BAA0B;IACzC,OAAO,kBAAkB;IACzB,qBAAqB,gCAAgC;IACrD,kBAAkB,6BAA6B;IAG/C,cAAc,yBAAyB;IACvC,cAAc,yBAAyB;IAGvC,oBAAoB,+BAA+B;IAGnD,aAAa,wBAAwB;CACxC"}
1
+ {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/agent/error-codes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,cAAc;IAEtB,WAAW,sBAAsB;IACjC,eAAe,0BAA0B;IACzC,OAAO,kBAAkB;IACzB,qBAAqB,gCAAgC;IACrD,kBAAkB,6BAA6B;IAC/C,YAAY,uBAAuB;IAGnC,cAAc,yBAAyB;IACvC,cAAc,yBAAyB;IAGvC,oBAAoB,+BAA+B;IAGnD,aAAa,wBAAwB;CACxC"}
@@ -5,6 +5,7 @@ var AgentErrorCode = /* @__PURE__ */ ((AgentErrorCode2) => {
5
5
  AgentErrorCode2["STOPPED"] = "agent_stopped";
6
6
  AgentErrorCode2["INITIALIZATION_FAILED"] = "agent_initialization_failed";
7
7
  AgentErrorCode2["SWITCH_IN_PROGRESS"] = "agent_switch_in_progress";
8
+ AgentErrorCode2["SESSION_BUSY"] = "agent_session_busy";
8
9
  AgentErrorCode2["NO_CONFIG_PATH"] = "agent_no_config_path";
9
10
  AgentErrorCode2["INVALID_CONFIG"] = "agent_invalid_config";
10
11
  AgentErrorCode2["API_VALIDATION_ERROR"] = "agent_api_validation_error";
@@ -77,6 +77,19 @@ class AgentError {
77
77
  "Wait for the current switch operation to complete before starting a new one"
78
78
  );
79
79
  }
80
+ /**
81
+ * Session already processing a run
82
+ */
83
+ static sessionBusy(sessionId) {
84
+ return new import_DextoRuntimeError.DextoRuntimeError(
85
+ import_error_codes.AgentErrorCode.SESSION_BUSY,
86
+ import_types.ErrorScope.AGENT,
87
+ import_types.ErrorType.CONFLICT,
88
+ `Session '${sessionId}' is already processing a message`,
89
+ { sessionId },
90
+ "Wait for the current run to finish or queue the next message"
91
+ );
92
+ }
80
93
  /**
81
94
  * Agent initialization failed
82
95
  */
@@ -21,6 +21,12 @@ export declare class AgentError {
21
21
  * Agent switch in progress
22
22
  */
23
23
  static switchInProgress(): DextoRuntimeError<undefined>;
24
+ /**
25
+ * Session already processing a run
26
+ */
27
+ static sessionBusy(sessionId: string): DextoRuntimeError<{
28
+ sessionId: string;
29
+ }>;
24
30
  /**
25
31
  * Agent initialization failed
26
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/agent/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE;;;;GAIG;AACH,qBAAa,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,UAAU;IAWjB;;OAEG;IACH,MAAM,CAAC,cAAc;IAWrB;;OAEG;IACH,MAAM,CAAC,OAAO;IAWd;;OAEG;IACH,MAAM,CAAC,gBAAgB;IAWvB;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAW7D;;OAEG;IACH,MAAM,CAAC,YAAY;IAWnB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAW5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAUzD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/agent/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE;;;;GAIG;AACH,qBAAa,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,UAAU;IAWjB;;OAEG;IACH,MAAM,CAAC,cAAc;IAWrB;;OAEG;IACH,MAAM,CAAC,OAAO;IAWd;;OAEG;IACH,MAAM,CAAC,gBAAgB;IAWvB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM;;;IAWpC;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAW7D;;OAEG;IACH,MAAM,CAAC,YAAY;IAWnB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAW5D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;CAUzD"}
@@ -55,6 +55,19 @@ class AgentError {
55
55
  "Wait for the current switch operation to complete before starting a new one"
56
56
  );
57
57
  }
58
+ /**
59
+ * Session already processing a run
60
+ */
61
+ static sessionBusy(sessionId) {
62
+ return new DextoRuntimeError(
63
+ AgentErrorCode.SESSION_BUSY,
64
+ ErrorScope.AGENT,
65
+ ErrorType.CONFLICT,
66
+ `Session '${sessionId}' is already processing a message`,
67
+ { sessionId },
68
+ "Wait for the current run to finish or queue the next message"
69
+ );
70
+ }
58
71
  /**
59
72
  * Agent initialization failed
60
73
  */
@@ -5,6 +5,7 @@ export * from './errors.js';
5
5
  export * from './error-codes.js';
6
6
  export type { DextoAgentOptions } from './agent-options.js';
7
7
  export type { AgentRuntimeSettings, DextoAgentConfigInput } from './runtime-config.js';
8
+ export type { HostRuntimeContext, HostRuntimeIds } from '../runtime/index.js';
8
9
  export type { ContentInput, GenerateOptions, GenerateResponse, StreamOptions, AgentToolCall, } from './types.js';
9
10
  export type { StreamingEvent, StreamingEventName, STREAMING_EVENTS } from '../events/index.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACH,eAAe,EACf,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,kBAAkB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGvF,YAAY,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,GAChB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACH,eAAe,EACf,oBAAoB,EACpB,KAAK,SAAS,EACd,KAAK,kBAAkB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG9E,YAAY,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,GAChB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -773,8 +773,8 @@ export declare const AgentCardSchema: z.ZodObject<{
773
773
  }, z.ZodTypeAny, "passthrough">>>;
774
774
  }, "strict", z.ZodTypeAny, {
775
775
  description: string;
776
- name: string;
777
776
  url: string;
777
+ name: string;
778
778
  version: string;
779
779
  capabilities: {
780
780
  streaming: boolean;
@@ -934,8 +934,8 @@ export declare const AgentCardSchema: z.ZodObject<{
934
934
  }[] | undefined;
935
935
  }, {
936
936
  description: string;
937
- name: string;
938
937
  url: string;
938
+ name: string;
939
939
  version: string;
940
940
  metadata?: z.objectInputType<{
941
941
  dexto: z.ZodOptional<z.ZodObject<{
@@ -6,6 +6,7 @@
6
6
  import type { ContentPart } from '../context/types.js';
7
7
  import type { LLMTokenUsage } from '../llm/services/types.js';
8
8
  import type { LLMProvider, LLMPricingStatus } from '../llm/types.js';
9
+ import type { HostRuntimeContext } from '../runtime/index.js';
9
10
  /**
10
11
  * Re-export content part types for API consumers
11
12
  */
@@ -41,6 +42,13 @@ export interface AgentToolCall {
41
42
  * ```
42
43
  */
43
44
  export type ContentInput = string | ContentPart[];
45
+ /**
46
+ * Host-owned execution-scoped correlation IDs for a single generate/stream invocation.
47
+ *
48
+ * These values should be supplied by the host per run/attempt and are intentionally
49
+ * separate from agent/session configuration.
50
+ */
51
+ export type AgentExecutionContext = HostRuntimeContext;
44
52
  /**
45
53
  * Options for generate() and stream() methods
46
54
  */
@@ -49,6 +57,8 @@ export interface GenerateOptions {
49
57
  signal?: AbortSignal;
50
58
  /** Optional signal to stop streaming to the caller without cancelling the run itself */
51
59
  disconnectSignal?: AbortSignal;
60
+ /** Optional host-owned execution context for this single invocation */
61
+ executionContext?: AgentExecutionContext;
52
62
  }
53
63
  /**
54
64
  * Complete response from generate() method
@@ -65,6 +75,7 @@ export interface GenerateResponse {
65
75
  model?: string;
66
76
  estimatedCost?: number;
67
77
  pricingStatus?: LLMPricingStatus;
78
+ hostRuntime?: HostRuntimeContext;
68
79
  }
69
80
  /**
70
81
  * Options for stream() method (same as generate)
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAErE;;GAEG;AACH,YAAY,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,GACX,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EACD;QACI,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC;KACb,GACD,SAAS,CAAC;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,WAAW,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;GAEG;AACH,YAAY,EACR,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,QAAQ,GACX,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EACD;QACI,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC;KACb,GACD,SAAS,CAAC;CACnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC;AAElD;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,mCAAmC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC"}
@@ -27,6 +27,7 @@ function createApprovalRequest(details) {
27
27
  approvalId: (0, import_crypto.randomUUID)(),
28
28
  type: details.type,
29
29
  sessionId: details.sessionId,
30
+ hostRuntime: details.hostRuntime,
30
31
  timeout: details.timeout,
31
32
  timestamp: /* @__PURE__ */ new Date(),
32
33
  metadata: details.metadata
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/approval/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAStF"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/approval/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAUtF"}
@@ -5,6 +5,7 @@ function createApprovalRequest(details) {
5
5
  approvalId: randomUUID(),
6
6
  type: details.type,
7
7
  sessionId: details.sessionId,
8
+ hostRuntime: details.hostRuntime,
8
9
  timeout: details.timeout,
9
10
  timestamp: /* @__PURE__ */ new Date(),
10
11
  metadata: details.metadata
@@ -454,7 +454,7 @@ class ApprovalManager {
454
454
  }
455
455
  });
456
456
  }
457
- createApprovalDetails(type, metadata, sessionId, timeout) {
457
+ createApprovalDetails(type, metadata, sessionId, hostRuntime, timeout) {
458
458
  const details = {
459
459
  type,
460
460
  timeout: this.getApprovalTimeout(type, timeout),
@@ -463,12 +463,16 @@ class ApprovalManager {
463
463
  if (sessionId !== void 0) {
464
464
  details.sessionId = sessionId;
465
465
  }
466
+ if (hostRuntime !== void 0) {
467
+ details.hostRuntime = hostRuntime;
468
+ }
466
469
  return details;
467
470
  }
468
471
  createResponse(request, response) {
469
472
  return {
470
473
  approvalId: request.approvalId,
471
474
  ...request.sessionId !== void 0 ? { sessionId: request.sessionId } : {},
475
+ ...request.hostRuntime !== void 0 ? { hostRuntime: request.hostRuntime } : {},
472
476
  ...response
473
477
  };
474
478
  }
@@ -501,12 +505,13 @@ class ApprovalManager {
501
505
  * ```
502
506
  */
503
507
  async requestDirectoryAccess(metadata) {
504
- const { sessionId, timeout, ...directoryMetadata } = metadata;
508
+ const { sessionId, hostRuntime, timeout, ...directoryMetadata } = metadata;
505
509
  return this.requestApproval(
506
510
  this.createApprovalDetails(
507
511
  import_types.ApprovalType.DIRECTORY_ACCESS,
508
512
  directoryMetadata,
509
513
  sessionId,
514
+ hostRuntime,
510
515
  timeout
511
516
  )
512
517
  );
@@ -568,9 +573,15 @@ class ApprovalManager {
568
573
  * Tool confirmations always happen in session context during LLM execution
569
574
  */
570
575
  async requestToolApproval(metadata) {
571
- const { sessionId, timeout, ...toolMetadata } = metadata;
576
+ const { sessionId, hostRuntime, timeout, ...toolMetadata } = metadata;
572
577
  return this.requestApproval(
573
- this.createApprovalDetails(import_types.ApprovalType.TOOL_APPROVAL, toolMetadata, sessionId, timeout)
578
+ this.createApprovalDetails(
579
+ import_types.ApprovalType.TOOL_APPROVAL,
580
+ toolMetadata,
581
+ sessionId,
582
+ hostRuntime,
583
+ timeout
584
+ )
574
585
  );
575
586
  }
576
587
  /**
@@ -595,12 +606,13 @@ class ApprovalManager {
595
606
  * ```
596
607
  */
597
608
  async requestCommandConfirmation(metadata) {
598
- const { sessionId, timeout, ...commandMetadata } = metadata;
609
+ const { sessionId, hostRuntime, timeout, ...commandMetadata } = metadata;
599
610
  return this.requestApproval(
600
611
  this.createApprovalDetails(
601
612
  import_types.ApprovalType.COMMAND_CONFIRMATION,
602
613
  commandMetadata,
603
614
  sessionId,
615
+ hostRuntime,
604
616
  timeout
605
617
  )
606
618
  );
@@ -613,12 +625,13 @@ class ApprovalManager {
613
625
  * and the MCP protocol doesn't include session context in elicitation requests.
614
626
  */
615
627
  async requestElicitation(metadata) {
616
- const { sessionId, timeout, ...elicitationMetadata } = metadata;
628
+ const { sessionId, hostRuntime, timeout, ...elicitationMetadata } = metadata;
617
629
  return this.requestApproval(
618
630
  this.createApprovalDetails(
619
631
  import_types.ApprovalType.ELICITATION,
620
632
  elicitationMetadata,
621
633
  sessionId,
634
+ hostRuntime,
622
635
  timeout
623
636
  )
624
637
  );