@dexto/core 1.8.12 → 1.9.1

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 (124) hide show
  1. package/dist/approval/manager.cjs +37 -325
  2. package/dist/approval/manager.d.ts +10 -109
  3. package/dist/approval/manager.d.ts.map +1 -1
  4. package/dist/approval/manager.js +37 -316
  5. package/dist/approval/schemas.cjs +8 -51
  6. package/dist/approval/schemas.d.ts +5 -179
  7. package/dist/approval/schemas.d.ts.map +1 -1
  8. package/dist/approval/schemas.js +8 -47
  9. package/dist/approval/types.cjs +0 -6
  10. package/dist/approval/types.d.ts +2 -27
  11. package/dist/approval/types.d.ts.map +1 -1
  12. package/dist/approval/types.js +0 -6
  13. package/dist/context/compaction/strategies/reactive-overflow-compaction.cjs +2 -0
  14. package/dist/context/compaction/strategies/reactive-overflow-compaction.d.ts.map +1 -1
  15. package/dist/context/compaction/strategies/reactive-overflow-compaction.js +2 -0
  16. package/dist/context/content-clone.cjs +55 -10
  17. package/dist/context/content-clone.d.ts +1 -0
  18. package/dist/context/content-clone.d.ts.map +1 -1
  19. package/dist/context/content-clone.js +53 -9
  20. package/dist/context/manager.cjs +25 -4
  21. package/dist/context/manager.d.ts +4 -2
  22. package/dist/context/manager.d.ts.map +1 -1
  23. package/dist/context/manager.js +25 -4
  24. package/dist/context/schemas.cjs +15 -1
  25. package/dist/context/schemas.d.ts.map +1 -1
  26. package/dist/context/schemas.js +15 -1
  27. package/dist/context/types.d.ts +11 -0
  28. package/dist/context/types.d.ts.map +1 -1
  29. package/dist/errors/DextoRuntimeError.cjs +3 -1
  30. package/dist/errors/DextoRuntimeError.d.ts +5 -3
  31. package/dist/errors/DextoRuntimeError.d.ts.map +1 -1
  32. package/dist/errors/DextoRuntimeError.js +3 -1
  33. package/dist/errors/index.d.ts +1 -1
  34. package/dist/errors/index.d.ts.map +1 -1
  35. package/dist/errors/types.d.ts +1 -0
  36. package/dist/errors/types.d.ts.map +1 -1
  37. package/dist/events/index.d.ts +2 -2
  38. package/dist/events/index.d.ts.map +1 -1
  39. package/dist/llm/executor/provider-error.cjs +25 -4
  40. package/dist/llm/executor/provider-error.d.ts.map +1 -1
  41. package/dist/llm/executor/provider-error.js +25 -4
  42. package/dist/llm/executor/stream-processor.cjs +98 -7
  43. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  44. package/dist/llm/executor/stream-processor.js +98 -7
  45. package/dist/llm/executor/turn-executor.cjs +96 -28
  46. package/dist/llm/executor/turn-executor.d.ts +2 -0
  47. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  48. package/dist/llm/executor/turn-executor.js +96 -28
  49. package/dist/llm/providers/local/schemas.d.ts +2 -2
  50. package/dist/llm/services/factory.cjs +3 -2
  51. package/dist/llm/services/factory.d.ts.map +1 -1
  52. package/dist/llm/services/factory.js +3 -2
  53. package/dist/llm/services/types.d.ts +8 -0
  54. package/dist/llm/services/types.d.ts.map +1 -1
  55. package/dist/llm/services/vercel.cjs +6 -1
  56. package/dist/llm/services/vercel.d.ts +3 -2
  57. package/dist/llm/services/vercel.d.ts.map +1 -1
  58. package/dist/llm/services/vercel.js +6 -1
  59. package/dist/session/chat-session.cjs +4 -0
  60. package/dist/session/chat-session.d.ts +2 -1
  61. package/dist/session/chat-session.d.ts.map +1 -1
  62. package/dist/session/chat-session.js +4 -0
  63. package/dist/session/message-queue.cjs +48 -75
  64. package/dist/session/message-queue.d.ts +1 -2
  65. package/dist/session/message-queue.d.ts.map +1 -1
  66. package/dist/session/message-queue.js +48 -75
  67. package/dist/session/session-manager.cjs +14 -32
  68. package/dist/session/session-manager.d.ts +5 -2
  69. package/dist/session/session-manager.d.ts.map +1 -1
  70. package/dist/session/session-manager.js +14 -32
  71. package/dist/storage/approvals/types.cjs +2 -9
  72. package/dist/storage/approvals/types.d.ts +4 -16
  73. package/dist/storage/approvals/types.d.ts.map +1 -1
  74. package/dist/storage/approvals/types.js +2 -8
  75. package/dist/storage/database/types.d.ts +5 -0
  76. package/dist/storage/database/types.d.ts.map +1 -1
  77. package/dist/storage/index.cjs +0 -2
  78. package/dist/storage/index.d.ts +2 -2
  79. package/dist/storage/index.d.ts.map +1 -1
  80. package/dist/storage/index.js +1 -2
  81. package/dist/storage/message-queue/types.d.ts +14 -6
  82. package/dist/storage/message-queue/types.d.ts.map +1 -1
  83. package/dist/storage/stores/backend.cjs +68 -32
  84. package/dist/storage/stores/backend.d.ts +17 -8
  85. package/dist/storage/stores/backend.d.ts.map +1 -1
  86. package/dist/storage/stores/backend.js +69 -33
  87. package/dist/storage/stores/in-memory.cjs +26 -11
  88. package/dist/storage/stores/in-memory.d.ts.map +1 -1
  89. package/dist/storage/stores/in-memory.js +27 -12
  90. package/dist/test-utils/in-memory-storage.cjs +11 -0
  91. package/dist/test-utils/in-memory-storage.js +11 -0
  92. package/dist/test-utils/session-state-stores.cjs +25 -9
  93. package/dist/test-utils/session-state-stores.js +26 -10
  94. package/dist/tools/approval/tool-approval-policy.cjs +87 -0
  95. package/dist/tools/approval/tool-approval-policy.d.ts +34 -0
  96. package/dist/tools/approval/tool-approval-policy.d.ts.map +1 -0
  97. package/dist/tools/approval/tool-approval-policy.js +64 -0
  98. package/dist/tools/error-codes.cjs +0 -1
  99. package/dist/tools/error-codes.d.ts +0 -1
  100. package/dist/tools/error-codes.d.ts.map +1 -1
  101. package/dist/tools/error-codes.js +0 -1
  102. package/dist/tools/errors.cjs +0 -15
  103. package/dist/tools/errors.d.ts +0 -9
  104. package/dist/tools/errors.d.ts.map +1 -1
  105. package/dist/tools/errors.js +0 -15
  106. package/dist/tools/index.cjs +2 -0
  107. package/dist/tools/index.d.ts +1 -1
  108. package/dist/tools/index.d.ts.map +1 -1
  109. package/dist/tools/index.js +5 -1
  110. package/dist/tools/tool-manager.cjs +94 -312
  111. package/dist/tools/tool-manager.d.ts +4 -19
  112. package/dist/tools/tool-manager.d.ts.map +1 -1
  113. package/dist/tools/tool-manager.js +95 -316
  114. package/dist/tools/types.d.ts +10 -9
  115. package/dist/tools/types.d.ts.map +1 -1
  116. package/dist/utils/service-initializer.cjs +3 -0
  117. package/dist/utils/service-initializer.d.ts +2 -1
  118. package/dist/utils/service-initializer.d.ts.map +1 -1
  119. package/dist/utils/service-initializer.js +3 -0
  120. package/package.json +2 -2
  121. package/dist/tools/pattern-utils.cjs +0 -33
  122. package/dist/tools/pattern-utils.d.ts +0 -20
  123. package/dist/tools/pattern-utils.d.ts.map +0 -1
  124. package/dist/tools/pattern-utils.js +0 -10
@@ -49,8 +49,10 @@ var import_codex_base_url = require("../providers/codex-base-url.js");
49
49
  var import_tool_definitions = require("./tool-definitions.js");
50
50
  var import_types3 = require("../../approval/types.js");
51
51
  var import_content_audit = require("../../context/content-audit.js");
52
+ var import_content_clone = require("../../context/content-clone.js");
52
53
  const MCP_TOOL_PREFIX = "mcp--";
53
54
  const MODEL_REQUEST_MAX_RETRIES = 2;
55
+ const TOOL_SUPPORT_PROBE_TIMEOUT_MS = 5e3;
54
56
  const LLMFinishReasonStateSchema = import_zod.z.enum([
55
57
  "stop",
56
58
  "tool-calls",
@@ -172,7 +174,7 @@ function parseTurnDriverState(input) {
172
174
  }
173
175
  function toModelStepRequestState(request) {
174
176
  return {
175
- messages: structuredClone(request.messages),
177
+ messages: (0, import_content_clone.cloneStructuredValuePreservingUrls)(request.messages),
176
178
  estimatedInputTokens: request.estimatedInputTokens,
177
179
  toolDefinitions: structuredClone(request.toolDefinitions),
178
180
  ...request.reasoning === void 0 ? {} : { reasoning: structuredClone(request.reasoning) },
@@ -182,6 +184,24 @@ function toModelStepRequestState(request) {
182
184
  }
183
185
  const toolSupportCache = /* @__PURE__ */ new Map();
184
186
  const LOCAL_PROVIDERS = ["ollama", "local"];
187
+ function isManagedGatewayProvider(provider) {
188
+ return provider === "dexto-nova";
189
+ }
190
+ function toolSupportValidationAttributes(result) {
191
+ const attributes = {
192
+ "llm.tool_support.cache_hit": result.cacheHit,
193
+ "llm.tool_support.validation_mode": result.validationMode,
194
+ "llm.tools_supported": result.supported
195
+ };
196
+ if (result.validationMode !== "probe") {
197
+ return attributes;
198
+ }
199
+ return {
200
+ ...attributes,
201
+ "llm.tool_support.probe_outcome": result.probeOutcome,
202
+ "llm.tool_support.probe_timeout_ms": result.probeTimeoutMs
203
+ };
204
+ }
185
205
  class TurnExecutor {
186
206
  constructor(model, toolManager, contextManager, eventBus, resourceManager, sessionId, config, llmContext, logger, steerQueue, followUpQueue, modelLimits, externalSignal, compactionStrategy = null, runContext) {
187
207
  this.model = model;
@@ -607,7 +627,21 @@ class TurnExecutor {
607
627
  }
608
628
  async startTurn() {
609
629
  this.eventBus.emit("llm:thinking", {});
610
- const supportsTools = await this.validateToolSupport();
630
+ const toolSupportValidation = await (0, import_operation_span.recordOperationSpan)(
631
+ {
632
+ name: "llm.tool_support_validation",
633
+ componentName: "TurnExecutor",
634
+ attributes: {
635
+ "llm.model": this.llmContext.model,
636
+ "llm.provider": this.llmContext.provider,
637
+ "llm.base_url_present": this.config.baseURL !== void 0
638
+ },
639
+ resultAttributes: toolSupportValidationAttributes
640
+ },
641
+ () => this.validateToolSupport(),
642
+ this.logger
643
+ );
644
+ const supportsTools = toolSupportValidation.supported;
611
645
  if (!supportsTools) {
612
646
  const modelKey = `${this.llmContext.provider}:${this.llmContext.model}`;
613
647
  this.eventBus.emit("llm:unsupported-input", {
@@ -758,14 +792,16 @@ class TurnExecutor {
758
792
  result.finishReason
759
793
  );
760
794
  }
761
- await this.followUpQueue.refresh();
762
- if (this.followUpQueue.hasPending()) {
763
- return this.continueWithQueuedInput(
764
- "follow-up",
765
- this.followUpQueue,
766
- stepCount,
767
- result.finishReason
768
- );
795
+ if (this.config.executionControl?.followUpQueueMode !== "host-run") {
796
+ await this.followUpQueue.refresh();
797
+ if (this.followUpQueue.hasPending()) {
798
+ return this.continueWithQueuedInput(
799
+ "follow-up",
800
+ this.followUpQueue,
801
+ stepCount,
802
+ result.finishReason
803
+ );
804
+ }
769
805
  }
770
806
  this.logger.debug(`Terminating: finishReason is "${result.finishReason}"`);
771
807
  return {
@@ -808,14 +844,33 @@ class TurnExecutor {
808
844
  async validateToolSupport() {
809
845
  const modelKey = `${this.llmContext.provider}:${this.llmContext.model}:${this.config.baseURL ?? ""}`;
810
846
  if (toolSupportCache.has(modelKey)) {
811
- return toolSupportCache.get(modelKey);
847
+ return {
848
+ supported: toolSupportCache.get(modelKey),
849
+ cacheHit: true,
850
+ validationMode: "cache"
851
+ };
812
852
  }
813
853
  if ((0, import_codex_base_url.isCodexBaseURL)(this.config.baseURL)) {
814
854
  this.logger.debug(
815
855
  `Skipping tool validation for ${modelKey} - Codex app-server integration manages tool support internally`
816
856
  );
817
857
  toolSupportCache.set(modelKey, true);
818
- return true;
858
+ return {
859
+ supported: true,
860
+ cacheHit: false,
861
+ validationMode: "codex_base_url_skip"
862
+ };
863
+ }
864
+ if (isManagedGatewayProvider(this.llmContext.provider)) {
865
+ this.logger.debug(
866
+ `Skipping tool validation for ${modelKey} - managed gateway provider controls tool support`
867
+ );
868
+ toolSupportCache.set(modelKey, true);
869
+ return {
870
+ supported: true,
871
+ cacheHit: false,
872
+ validationMode: "managed_gateway_assumed"
873
+ };
819
874
  }
820
875
  const isLocalProvider = LOCAL_PROVIDERS.includes(this.llmContext.provider);
821
876
  if (!this.config.baseURL && !isLocalProvider) {
@@ -823,7 +878,11 @@ class TurnExecutor {
823
878
  `Skipping tool validation for ${modelKey} - known cloud provider without custom baseURL`
824
879
  );
825
880
  toolSupportCache.set(modelKey, true);
826
- return true;
881
+ return {
882
+ supported: true,
883
+ cacheHit: false,
884
+ validationMode: "cloud_provider_assumed"
885
+ };
827
886
  }
828
887
  this.logger.debug(
829
888
  `Testing tool support for ${isLocalProvider ? "local provider" : "custom endpoint"} model: ${modelKey}`
@@ -839,7 +898,7 @@ class TurnExecutor {
839
898
  }
840
899
  };
841
900
  const testAbort = new AbortController();
842
- const testTimeout = setTimeout(() => testAbort.abort(), 5e3);
901
+ const testTimeout = setTimeout(() => testAbort.abort(), TOOL_SUPPORT_PROBE_TIMEOUT_MS);
843
902
  try {
844
903
  await (0, import_ai.generateText)({
845
904
  model: this.model,
@@ -851,7 +910,13 @@ class TurnExecutor {
851
910
  clearTimeout(testTimeout);
852
911
  toolSupportCache.set(modelKey, true);
853
912
  this.logger.debug(`Model ${modelKey} supports tools`);
854
- return true;
913
+ return {
914
+ supported: true,
915
+ cacheHit: false,
916
+ validationMode: "probe",
917
+ probeOutcome: "supported",
918
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
919
+ };
855
920
  } catch (error) {
856
921
  clearTimeout(testTimeout);
857
922
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -860,13 +925,25 @@ class TurnExecutor {
860
925
  this.logger.debug(
861
926
  `Detected that model ${modelKey} does not support tool calling - tool functionality will be disabled`
862
927
  );
863
- return false;
928
+ return {
929
+ supported: false,
930
+ cacheHit: false,
931
+ validationMode: "probe",
932
+ probeOutcome: "unsupported",
933
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
934
+ };
864
935
  }
865
936
  this.logger.debug(
866
937
  `Tool validation error for ${modelKey}, assuming supported: ${errorMessage}`
867
938
  );
868
939
  toolSupportCache.set(modelKey, true);
869
- return true;
940
+ return {
941
+ supported: true,
942
+ cacheHit: false,
943
+ validationMode: "probe",
944
+ probeOutcome: "error_assumed_supported",
945
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
946
+ };
870
947
  }
871
948
  }
872
949
  async prepareNextModelRequest(input) {
@@ -1075,7 +1152,7 @@ class TurnExecutor {
1075
1152
  async restorePreparedModelRequest(state, supportsTools) {
1076
1153
  const toolDefinitions = supportsTools ? structuredClone(state.toolDefinitions) : {};
1077
1154
  return {
1078
- messages: structuredClone(state.messages),
1155
+ messages: (0, import_content_clone.cloneStructuredValuePreservingUrls)(state.messages),
1079
1156
  tools: supportsTools ? (0, import_tool_definitions.createModelToolDefinitions)(toolDefinitions) : {},
1080
1157
  toolDefinitions,
1081
1158
  estimatedInputTokens: state.estimatedInputTokens,
@@ -1331,11 +1408,7 @@ class TurnExecutor {
1331
1408
  return approval.modelVisibleResult;
1332
1409
  }
1333
1410
  const decision = this.toApprovalDecisionInput(approval.response);
1334
- const applied = await this.toolManager.applyApprovalDecision(
1335
- recorded,
1336
- decision,
1337
- this.runContext
1338
- );
1411
+ const applied = await this.toolManager.applyApprovalDecision(recorded, decision);
1339
1412
  if (applied.kind === "terminal") {
1340
1413
  return applied.modelVisibleResult;
1341
1414
  }
@@ -1657,11 +1730,6 @@ class TurnExecutor {
1657
1730
  if (!this.stepAbortController.signal.aborted) {
1658
1731
  this.stepAbortController.abort();
1659
1732
  }
1660
- void this.steerQueue.clear().catch((error) => {
1661
- this.logger.warn(
1662
- `Failed to clear queued steer messages during cleanup: ${error instanceof Error ? error.message : String(error)}`
1663
- );
1664
- });
1665
1733
  }
1666
1734
  /**
1667
1735
  * Check if context should be compacted based on estimated token count.
@@ -14,6 +14,7 @@ import type { MessageQueueService } from '../../session/message-queue.js';
14
14
  import type { CompactionStrategy } from '../../context/compaction/types.js';
15
15
  import type { ModelLimits } from '../../context/compaction/overflow.js';
16
16
  import type { AgentRunContext } from '../../runtime/run-context.js';
17
+ import type { LLMExecutionControl } from '../services/types.js';
17
18
  export declare const ModelStepResultStateSchema: z.ZodObject<{
18
19
  text: z.ZodString;
19
20
  finishReason: z.ZodEnum<{
@@ -274,6 +275,7 @@ export declare class TurnExecutor {
274
275
  temperature?: number | undefined;
275
276
  baseURL?: string | undefined;
276
277
  usageScopeId?: string | undefined;
278
+ executionControl?: LLMExecutionControl | undefined;
277
279
  reasoning?: LLMReasoningConfig | undefined;
278
280
  }, llmContext: LLMContext, logger: Logger, steerQueue: MessageQueueService, followUpQueue: MessageQueueService, modelLimits?: ModelLimits | undefined, externalSignal?: AbortSignal | undefined, compactionStrategy?: CompactionStrategy | null, runContext?: AgentRunContext | undefined);
279
281
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,10 @@ import {
26
26
  describeContentPartsForAudit,
27
27
  describeInternalMessageTailForAudit
28
28
  } from "../../context/content-audit.js";
29
+ import { cloneStructuredValuePreservingUrls } from "../../context/content-clone.js";
29
30
  const MCP_TOOL_PREFIX = "mcp--";
30
31
  const MODEL_REQUEST_MAX_RETRIES = 2;
32
+ const TOOL_SUPPORT_PROBE_TIMEOUT_MS = 5e3;
31
33
  const LLMFinishReasonStateSchema = z.enum([
32
34
  "stop",
33
35
  "tool-calls",
@@ -149,7 +151,7 @@ function parseTurnDriverState(input) {
149
151
  }
150
152
  function toModelStepRequestState(request) {
151
153
  return {
152
- messages: structuredClone(request.messages),
154
+ messages: cloneStructuredValuePreservingUrls(request.messages),
153
155
  estimatedInputTokens: request.estimatedInputTokens,
154
156
  toolDefinitions: structuredClone(request.toolDefinitions),
155
157
  ...request.reasoning === void 0 ? {} : { reasoning: structuredClone(request.reasoning) },
@@ -159,6 +161,24 @@ function toModelStepRequestState(request) {
159
161
  }
160
162
  const toolSupportCache = /* @__PURE__ */ new Map();
161
163
  const LOCAL_PROVIDERS = ["ollama", "local"];
164
+ function isManagedGatewayProvider(provider) {
165
+ return provider === "dexto-nova";
166
+ }
167
+ function toolSupportValidationAttributes(result) {
168
+ const attributes = {
169
+ "llm.tool_support.cache_hit": result.cacheHit,
170
+ "llm.tool_support.validation_mode": result.validationMode,
171
+ "llm.tools_supported": result.supported
172
+ };
173
+ if (result.validationMode !== "probe") {
174
+ return attributes;
175
+ }
176
+ return {
177
+ ...attributes,
178
+ "llm.tool_support.probe_outcome": result.probeOutcome,
179
+ "llm.tool_support.probe_timeout_ms": result.probeTimeoutMs
180
+ };
181
+ }
162
182
  class TurnExecutor {
163
183
  constructor(model, toolManager, contextManager, eventBus, resourceManager, sessionId, config, llmContext, logger, steerQueue, followUpQueue, modelLimits, externalSignal, compactionStrategy = null, runContext) {
164
184
  this.model = model;
@@ -584,7 +604,21 @@ class TurnExecutor {
584
604
  }
585
605
  async startTurn() {
586
606
  this.eventBus.emit("llm:thinking", {});
587
- const supportsTools = await this.validateToolSupport();
607
+ const toolSupportValidation = await recordOperationSpan(
608
+ {
609
+ name: "llm.tool_support_validation",
610
+ componentName: "TurnExecutor",
611
+ attributes: {
612
+ "llm.model": this.llmContext.model,
613
+ "llm.provider": this.llmContext.provider,
614
+ "llm.base_url_present": this.config.baseURL !== void 0
615
+ },
616
+ resultAttributes: toolSupportValidationAttributes
617
+ },
618
+ () => this.validateToolSupport(),
619
+ this.logger
620
+ );
621
+ const supportsTools = toolSupportValidation.supported;
588
622
  if (!supportsTools) {
589
623
  const modelKey = `${this.llmContext.provider}:${this.llmContext.model}`;
590
624
  this.eventBus.emit("llm:unsupported-input", {
@@ -735,14 +769,16 @@ class TurnExecutor {
735
769
  result.finishReason
736
770
  );
737
771
  }
738
- await this.followUpQueue.refresh();
739
- if (this.followUpQueue.hasPending()) {
740
- return this.continueWithQueuedInput(
741
- "follow-up",
742
- this.followUpQueue,
743
- stepCount,
744
- result.finishReason
745
- );
772
+ if (this.config.executionControl?.followUpQueueMode !== "host-run") {
773
+ await this.followUpQueue.refresh();
774
+ if (this.followUpQueue.hasPending()) {
775
+ return this.continueWithQueuedInput(
776
+ "follow-up",
777
+ this.followUpQueue,
778
+ stepCount,
779
+ result.finishReason
780
+ );
781
+ }
746
782
  }
747
783
  this.logger.debug(`Terminating: finishReason is "${result.finishReason}"`);
748
784
  return {
@@ -785,14 +821,33 @@ class TurnExecutor {
785
821
  async validateToolSupport() {
786
822
  const modelKey = `${this.llmContext.provider}:${this.llmContext.model}:${this.config.baseURL ?? ""}`;
787
823
  if (toolSupportCache.has(modelKey)) {
788
- return toolSupportCache.get(modelKey);
824
+ return {
825
+ supported: toolSupportCache.get(modelKey),
826
+ cacheHit: true,
827
+ validationMode: "cache"
828
+ };
789
829
  }
790
830
  if (isCodexBaseURL(this.config.baseURL)) {
791
831
  this.logger.debug(
792
832
  `Skipping tool validation for ${modelKey} - Codex app-server integration manages tool support internally`
793
833
  );
794
834
  toolSupportCache.set(modelKey, true);
795
- return true;
835
+ return {
836
+ supported: true,
837
+ cacheHit: false,
838
+ validationMode: "codex_base_url_skip"
839
+ };
840
+ }
841
+ if (isManagedGatewayProvider(this.llmContext.provider)) {
842
+ this.logger.debug(
843
+ `Skipping tool validation for ${modelKey} - managed gateway provider controls tool support`
844
+ );
845
+ toolSupportCache.set(modelKey, true);
846
+ return {
847
+ supported: true,
848
+ cacheHit: false,
849
+ validationMode: "managed_gateway_assumed"
850
+ };
796
851
  }
797
852
  const isLocalProvider = LOCAL_PROVIDERS.includes(this.llmContext.provider);
798
853
  if (!this.config.baseURL && !isLocalProvider) {
@@ -800,7 +855,11 @@ class TurnExecutor {
800
855
  `Skipping tool validation for ${modelKey} - known cloud provider without custom baseURL`
801
856
  );
802
857
  toolSupportCache.set(modelKey, true);
803
- return true;
858
+ return {
859
+ supported: true,
860
+ cacheHit: false,
861
+ validationMode: "cloud_provider_assumed"
862
+ };
804
863
  }
805
864
  this.logger.debug(
806
865
  `Testing tool support for ${isLocalProvider ? "local provider" : "custom endpoint"} model: ${modelKey}`
@@ -816,7 +875,7 @@ class TurnExecutor {
816
875
  }
817
876
  };
818
877
  const testAbort = new AbortController();
819
- const testTimeout = setTimeout(() => testAbort.abort(), 5e3);
878
+ const testTimeout = setTimeout(() => testAbort.abort(), TOOL_SUPPORT_PROBE_TIMEOUT_MS);
820
879
  try {
821
880
  await generateText({
822
881
  model: this.model,
@@ -828,7 +887,13 @@ class TurnExecutor {
828
887
  clearTimeout(testTimeout);
829
888
  toolSupportCache.set(modelKey, true);
830
889
  this.logger.debug(`Model ${modelKey} supports tools`);
831
- return true;
890
+ return {
891
+ supported: true,
892
+ cacheHit: false,
893
+ validationMode: "probe",
894
+ probeOutcome: "supported",
895
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
896
+ };
832
897
  } catch (error) {
833
898
  clearTimeout(testTimeout);
834
899
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -837,13 +902,25 @@ class TurnExecutor {
837
902
  this.logger.debug(
838
903
  `Detected that model ${modelKey} does not support tool calling - tool functionality will be disabled`
839
904
  );
840
- return false;
905
+ return {
906
+ supported: false,
907
+ cacheHit: false,
908
+ validationMode: "probe",
909
+ probeOutcome: "unsupported",
910
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
911
+ };
841
912
  }
842
913
  this.logger.debug(
843
914
  `Tool validation error for ${modelKey}, assuming supported: ${errorMessage}`
844
915
  );
845
916
  toolSupportCache.set(modelKey, true);
846
- return true;
917
+ return {
918
+ supported: true,
919
+ cacheHit: false,
920
+ validationMode: "probe",
921
+ probeOutcome: "error_assumed_supported",
922
+ probeTimeoutMs: TOOL_SUPPORT_PROBE_TIMEOUT_MS
923
+ };
847
924
  }
848
925
  }
849
926
  async prepareNextModelRequest(input) {
@@ -1052,7 +1129,7 @@ class TurnExecutor {
1052
1129
  async restorePreparedModelRequest(state, supportsTools) {
1053
1130
  const toolDefinitions = supportsTools ? structuredClone(state.toolDefinitions) : {};
1054
1131
  return {
1055
- messages: structuredClone(state.messages),
1132
+ messages: cloneStructuredValuePreservingUrls(state.messages),
1056
1133
  tools: supportsTools ? createModelToolDefinitions(toolDefinitions) : {},
1057
1134
  toolDefinitions,
1058
1135
  estimatedInputTokens: state.estimatedInputTokens,
@@ -1308,11 +1385,7 @@ class TurnExecutor {
1308
1385
  return approval.modelVisibleResult;
1309
1386
  }
1310
1387
  const decision = this.toApprovalDecisionInput(approval.response);
1311
- const applied = await this.toolManager.applyApprovalDecision(
1312
- recorded,
1313
- decision,
1314
- this.runContext
1315
- );
1388
+ const applied = await this.toolManager.applyApprovalDecision(recorded, decision);
1316
1389
  if (applied.kind === "terminal") {
1317
1390
  return applied.modelVisibleResult;
1318
1391
  }
@@ -1634,11 +1707,6 @@ class TurnExecutor {
1634
1707
  if (!this.stepAbortController.signal.aborted) {
1635
1708
  this.stepAbortController.abort();
1636
1709
  }
1637
- void this.steerQueue.clear().catch((error) => {
1638
- this.logger.warn(
1639
- `Failed to clear queued steer messages during cleanup: ${error instanceof Error ? error.message : String(error)}`
1640
- );
1641
- });
1642
1710
  }
1643
1711
  /**
1644
1712
  * Check if context should be compacted based on estimated token count.
@@ -53,9 +53,9 @@ export declare const ModelSourceSchema: z.ZodEnum<{
53
53
  export declare const ModelDownloadStatusSchema: z.ZodEnum<{
54
54
  error: "error";
55
55
  pending: "pending";
56
+ complete: "complete";
56
57
  downloading: "downloading";
57
58
  verifying: "verifying";
58
- complete: "complete";
59
59
  }>;
60
60
  /**
61
61
  * Schema for local model info (registry entry).
@@ -107,9 +107,9 @@ export declare const ModelDownloadProgressSchema: z.ZodObject<{
107
107
  status: z.ZodEnum<{
108
108
  error: "error";
109
109
  pending: "pending";
110
+ complete: "complete";
110
111
  downloading: "downloading";
111
112
  verifying: "verifying";
112
- complete: "complete";
113
113
  }>;
114
114
  bytesDownloaded: z.ZodNumber;
115
115
  totalBytes: z.ZodNumber;
@@ -46,7 +46,7 @@ function isLanguageModel(value) {
46
46
  const candidate = value;
47
47
  return typeof candidate["modelId"] === "string" && (typeof candidate["doGenerate"] === "function" || typeof candidate["doStream"] === "function");
48
48
  }
49
- const DEFAULT_DEXTO_GATEWAY_BASE_URL = "https://api.dexto.ai/v1";
49
+ const DEFAULT_DEXTO_GATEWAY_BASE_URL = "https://app.dexto.ai/v1";
50
50
  function trimTrailingSlash(value) {
51
51
  return value.trim().replace(/\/$/, "");
52
52
  }
@@ -327,7 +327,7 @@ function createVercelModel(llmConfig, context) {
327
327
  }
328
328
  }
329
329
  function createLLMService(config, toolManager, systemPromptManager, conversationStore, sessionEventBus, sessionId, resourceManager, logger, options, languageModelFactory) {
330
- const { usageScopeId, compactionStrategy, steerQueue, followUpQueue } = options;
330
+ const { usageScopeId, compactionStrategy, executionControl, steerQueue, followUpQueue } = options;
331
331
  const providerContext = {
332
332
  sessionId,
333
333
  ...options.cwd !== void 0 ? { cwd: options.cwd } : {},
@@ -359,6 +359,7 @@ function createLLMService(config, toolManager, systemPromptManager, conversation
359
359
  steerQueue,
360
360
  followUpQueue,
361
361
  usageScopeId,
362
+ executionControl,
362
363
  compactionStrategy
363
364
  );
364
365
  }
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/llm/services/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAYnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EACR,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAqHpB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC/B,aAAa,CAsSf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,OAAO,0BAA0B,EAAE,eAAe,EACnE,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,oBAAoB,CAAC,EAAE,oBAAoB,GAC5C,gBAAgB,CAuClB"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/llm/services/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAYnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EACR,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAqHpB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC/B,aAAa,CAsSf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,mBAAmB,EACxC,iBAAiB,EAAE,iBAAiB,EACpC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,OAAO,0BAA0B,EAAE,eAAe,EACnE,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,oBAAoB,CAAC,EAAE,oBAAoB,GAC5C,gBAAgB,CAyClB"}
@@ -28,7 +28,7 @@ function isLanguageModel(value) {
28
28
  const candidate = value;
29
29
  return typeof candidate["modelId"] === "string" && (typeof candidate["doGenerate"] === "function" || typeof candidate["doStream"] === "function");
30
30
  }
31
- const DEFAULT_DEXTO_GATEWAY_BASE_URL = "https://api.dexto.ai/v1";
31
+ const DEFAULT_DEXTO_GATEWAY_BASE_URL = "https://app.dexto.ai/v1";
32
32
  function trimTrailingSlash(value) {
33
33
  return value.trim().replace(/\/$/, "");
34
34
  }
@@ -309,7 +309,7 @@ function createVercelModel(llmConfig, context) {
309
309
  }
310
310
  }
311
311
  function createLLMService(config, toolManager, systemPromptManager, conversationStore, sessionEventBus, sessionId, resourceManager, logger, options, languageModelFactory) {
312
- const { usageScopeId, compactionStrategy, steerQueue, followUpQueue } = options;
312
+ const { usageScopeId, compactionStrategy, executionControl, steerQueue, followUpQueue } = options;
313
313
  const providerContext = {
314
314
  sessionId,
315
315
  ...options.cwd !== void 0 ? { cwd: options.cwd } : {},
@@ -341,6 +341,7 @@ function createLLMService(config, toolManager, systemPromptManager, conversation
341
341
  steerQueue,
342
342
  followUpQueue,
343
343
  usageScopeId,
344
+ executionControl,
344
345
  compactionStrategy
345
346
  );
346
347
  }
@@ -20,11 +20,19 @@ export type LLMServiceConfig = {
20
20
  export interface CreateLLMServiceOptions {
21
21
  usageScopeId?: string | undefined;
22
22
  compactionStrategy?: CompactionStrategy | null | undefined;
23
+ executionControl?: LLMExecutionControl | undefined;
23
24
  cwd?: string | undefined;
24
25
  authResolver?: LlmAuthResolver | null | undefined;
25
26
  steerQueue: MessageQueueService;
26
27
  followUpQueue: MessageQueueService;
27
28
  }
29
+ export type LLMExecutionControl = {
30
+ /**
31
+ * Local/CLI sessions can let core continue the same executor turn with queued follow-ups.
32
+ * Hosted runtimes should keep follow-ups durable and promote them as separate runs.
33
+ */
34
+ followUpQueueMode?: 'core-continuation' | 'host-run' | undefined;
35
+ };
28
36
  export type CreateTurnDriverOptions = {
29
37
  streaming?: boolean;
30
38
  signal?: AbortSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/services/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3D,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAC;IAClD,UAAU,EAAE,mBAAmB,CAAC;IAChC,aAAa,EAAE,mBAAmB,CAAC;CACtC;AAED,MAAM,MAAM,uBAAuB,GAAG;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACrC,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,YAAY,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACtC,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,gFAAgF;IAChF,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACvE;AAED,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,2BAA4B,SAAQ,yBAAyB;IAC1E,0BAA0B,EAAE,MAAM,aAAa,CAAC;CACnD;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,2BAA2B,KAAK,aAAa,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/llm/services/types.ts"],"names":[],"mappings":"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"}
@@ -112,13 +112,14 @@ class VercelLLMService {
112
112
  compactionStrategy;
113
113
  modelLimits;
114
114
  usageScopeId;
115
+ executionControl;
115
116
  /**
116
117
  * Helper to extract model ID from LanguageModel union type (string | LanguageModelV2)
117
118
  */
118
119
  getModelId() {
119
120
  return typeof this.model === "string" ? this.model : this.model.modelId;
120
121
  }
121
- constructor(toolManager, model, systemPromptManager, conversationStore, sessionEventBus, config, sessionId, resourceManager, logger, steerQueue, followUpQueue, usageScopeId, compactionStrategy) {
122
+ constructor(toolManager, model, systemPromptManager, conversationStore, sessionEventBus, config, sessionId, resourceManager, logger, steerQueue, followUpQueue, usageScopeId, executionControl, compactionStrategy) {
122
123
  this.logger = logger.createChild(import_types.DextoLogComponent.LLM);
123
124
  this.model = model;
124
125
  this.config = config;
@@ -127,6 +128,7 @@ class VercelLLMService {
127
128
  this.sessionId = sessionId;
128
129
  this.resourceManager = resourceManager;
129
130
  this.usageScopeId = usageScopeId;
131
+ this.executionControl = executionControl;
130
132
  this.compactionStrategy = compactionStrategy ?? null;
131
133
  this.steerQueue = steerQueue;
132
134
  this.followUpQueue = followUpQueue;
@@ -207,6 +209,9 @@ class VercelLLMService {
207
209
  temperature: this.config.temperature,
208
210
  baseURL: this.config.baseURL,
209
211
  usageScopeId: this.usageScopeId,
212
+ ...this.executionControl !== void 0 && {
213
+ executionControl: this.executionControl
214
+ },
210
215
  // Provider-specific options
211
216
  reasoning: this.config.reasoning
212
217
  },
@@ -1,6 +1,6 @@
1
1
  import { LanguageModel } from 'ai';
2
2
  import { ToolManager } from '../../tools/tool-manager.js';
3
- import type { CreateTurnDriverOptions, LLMServiceConfig } from './types.js';
3
+ import type { CreateTurnDriverOptions, LLMExecutionControl, LLMServiceConfig } from './types.js';
4
4
  import type { Logger } from '../../logger/v2/types.js';
5
5
  import { ToolSet } from '../../tools/types.js';
6
6
  import { ContextManager } from '../../context/manager.js';
@@ -42,11 +42,12 @@ export declare class VercelLLMService {
42
42
  private compactionStrategy;
43
43
  private modelLimits?;
44
44
  private readonly usageScopeId;
45
+ private readonly executionControl;
45
46
  /**
46
47
  * Helper to extract model ID from LanguageModel union type (string | LanguageModelV2)
47
48
  */
48
49
  private getModelId;
49
- constructor(toolManager: ToolManager, model: LanguageModel, systemPromptManager: SystemPromptManager, conversationStore: ConversationStore, sessionEventBus: SessionEventBus, config: ValidatedLLMConfig, sessionId: string, resourceManager: ResourceManager, logger: Logger, steerQueue: MessageQueueService, followUpQueue: MessageQueueService, usageScopeId?: string, compactionStrategy?: import('../../context/compaction/types.js').CompactionStrategy | null);
50
+ constructor(toolManager: ToolManager, model: LanguageModel, systemPromptManager: SystemPromptManager, conversationStore: ConversationStore, sessionEventBus: SessionEventBus, config: ValidatedLLMConfig, sessionId: string, resourceManager: ResourceManager, logger: Logger, steerQueue: MessageQueueService, followUpQueue: MessageQueueService, usageScopeId?: string, executionControl?: LLMExecutionControl, compactionStrategy?: import('../../context/compaction/types.js').CompactionStrategy | null);
50
51
  getAllTools(): Promise<ToolSet>;
51
52
  getEnabledTools(): Promise<ToolSet>;
52
53
  createTurnDriver(options?: CreateTurnDriverOptions): Promise<TurnDriver>;