@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.
- package/dist/approval/manager.cjs +37 -325
- package/dist/approval/manager.d.ts +10 -109
- package/dist/approval/manager.d.ts.map +1 -1
- package/dist/approval/manager.js +37 -316
- package/dist/approval/schemas.cjs +8 -51
- package/dist/approval/schemas.d.ts +5 -179
- package/dist/approval/schemas.d.ts.map +1 -1
- package/dist/approval/schemas.js +8 -47
- package/dist/approval/types.cjs +0 -6
- package/dist/approval/types.d.ts +2 -27
- package/dist/approval/types.d.ts.map +1 -1
- package/dist/approval/types.js +0 -6
- package/dist/context/compaction/strategies/reactive-overflow-compaction.cjs +2 -0
- package/dist/context/compaction/strategies/reactive-overflow-compaction.d.ts.map +1 -1
- package/dist/context/compaction/strategies/reactive-overflow-compaction.js +2 -0
- package/dist/context/content-clone.cjs +55 -10
- package/dist/context/content-clone.d.ts +1 -0
- package/dist/context/content-clone.d.ts.map +1 -1
- package/dist/context/content-clone.js +53 -9
- package/dist/context/manager.cjs +25 -4
- package/dist/context/manager.d.ts +4 -2
- package/dist/context/manager.d.ts.map +1 -1
- package/dist/context/manager.js +25 -4
- package/dist/context/schemas.cjs +15 -1
- package/dist/context/schemas.d.ts.map +1 -1
- package/dist/context/schemas.js +15 -1
- package/dist/context/types.d.ts +11 -0
- package/dist/context/types.d.ts.map +1 -1
- package/dist/errors/DextoRuntimeError.cjs +3 -1
- package/dist/errors/DextoRuntimeError.d.ts +5 -3
- package/dist/errors/DextoRuntimeError.d.ts.map +1 -1
- package/dist/errors/DextoRuntimeError.js +3 -1
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/types.d.ts +1 -0
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/llm/executor/provider-error.cjs +25 -4
- package/dist/llm/executor/provider-error.d.ts.map +1 -1
- package/dist/llm/executor/provider-error.js +25 -4
- package/dist/llm/executor/stream-processor.cjs +98 -7
- package/dist/llm/executor/stream-processor.d.ts.map +1 -1
- package/dist/llm/executor/stream-processor.js +98 -7
- package/dist/llm/executor/turn-executor.cjs +96 -28
- package/dist/llm/executor/turn-executor.d.ts +2 -0
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +96 -28
- package/dist/llm/providers/local/schemas.d.ts +2 -2
- package/dist/llm/services/factory.cjs +3 -2
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +3 -2
- package/dist/llm/services/types.d.ts +8 -0
- package/dist/llm/services/types.d.ts.map +1 -1
- package/dist/llm/services/vercel.cjs +6 -1
- package/dist/llm/services/vercel.d.ts +3 -2
- package/dist/llm/services/vercel.d.ts.map +1 -1
- package/dist/llm/services/vercel.js +6 -1
- package/dist/session/chat-session.cjs +4 -0
- package/dist/session/chat-session.d.ts +2 -1
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/chat-session.js +4 -0
- package/dist/session/message-queue.cjs +48 -75
- package/dist/session/message-queue.d.ts +1 -2
- package/dist/session/message-queue.d.ts.map +1 -1
- package/dist/session/message-queue.js +48 -75
- package/dist/session/session-manager.cjs +14 -32
- package/dist/session/session-manager.d.ts +5 -2
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +14 -32
- package/dist/storage/approvals/types.cjs +2 -9
- package/dist/storage/approvals/types.d.ts +4 -16
- package/dist/storage/approvals/types.d.ts.map +1 -1
- package/dist/storage/approvals/types.js +2 -8
- package/dist/storage/database/types.d.ts +5 -0
- package/dist/storage/database/types.d.ts.map +1 -1
- package/dist/storage/index.cjs +0 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -2
- package/dist/storage/message-queue/types.d.ts +14 -6
- package/dist/storage/message-queue/types.d.ts.map +1 -1
- package/dist/storage/stores/backend.cjs +68 -32
- package/dist/storage/stores/backend.d.ts +17 -8
- package/dist/storage/stores/backend.d.ts.map +1 -1
- package/dist/storage/stores/backend.js +69 -33
- package/dist/storage/stores/in-memory.cjs +26 -11
- package/dist/storage/stores/in-memory.d.ts.map +1 -1
- package/dist/storage/stores/in-memory.js +27 -12
- package/dist/test-utils/in-memory-storage.cjs +11 -0
- package/dist/test-utils/in-memory-storage.js +11 -0
- package/dist/test-utils/session-state-stores.cjs +25 -9
- package/dist/test-utils/session-state-stores.js +26 -10
- package/dist/tools/approval/tool-approval-policy.cjs +87 -0
- package/dist/tools/approval/tool-approval-policy.d.ts +34 -0
- package/dist/tools/approval/tool-approval-policy.d.ts.map +1 -0
- package/dist/tools/approval/tool-approval-policy.js +64 -0
- package/dist/tools/error-codes.cjs +0 -1
- package/dist/tools/error-codes.d.ts +0 -1
- package/dist/tools/error-codes.d.ts.map +1 -1
- package/dist/tools/error-codes.js +0 -1
- package/dist/tools/errors.cjs +0 -15
- package/dist/tools/errors.d.ts +0 -9
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +0 -15
- package/dist/tools/index.cjs +2 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -1
- package/dist/tools/tool-manager.cjs +94 -312
- package/dist/tools/tool-manager.d.ts +4 -19
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +95 -316
- package/dist/tools/types.d.ts +10 -9
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/utils/service-initializer.cjs +3 -0
- package/dist/utils/service-initializer.d.ts +2 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +3 -0
- package/package.json +2 -2
- package/dist/tools/pattern-utils.cjs +0 -33
- package/dist/tools/pattern-utils.d.ts +0 -20
- package/dist/tools/pattern-utils.d.ts.map +0 -1
- 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:
|
|
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
|
|
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
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
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
|
|
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
|
|
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
|
|
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(),
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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":"AAAA,OAAO,EACH,aAAa,EAMb,KAAK,YAAY,EAEpB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAa,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAS1D,OAAO,EACH,WAAW,EAId,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAiB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,KAAK,EACR,UAAU,EACV,kBAAkB,EAClB,UAAU,EAGb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAIxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"turn-executor.d.ts","sourceRoot":"","sources":["../../../src/llm/executor/turn-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EAMb,KAAK,YAAY,EAEpB,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAa,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAS1D,OAAO,EACH,WAAW,EAId,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAiB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,KAAK,EACR,UAAU,EACV,kBAAkB,EAClB,UAAU,EAGb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAIxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAQ1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAIpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAwEhE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAO1B,CAAC;AAgDd,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAgDhC,CAAC;AAEH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAEpE;AA6GD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC/E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAErE,MAAM,MAAM,iBAAiB,GAAG;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC1B;IACI,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB,GACD;IACI,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,CAAC;CACjC,CAAC;AAER,MAAM,MAAM,UAAU,GAAG;IACrB,oBAAoB,IAAI,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC7D,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjD,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAChD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,QAAQ,IAAI,eAAe,CAAC;IAC5B,UAAU,IAAI,eAAe,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACnB,CAAC;AA0CF;;;;;;;;;;;;;GAaG;AACH,qBAAa,YAAY;IAUjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,UAAU;IAElB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,cAAc,CAAC;IAEvB,OAAO,CAAC,UAAU,CAAC;IAhCvB,OAAO,CAAC,MAAM,CAAS;IACvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,CAAC,YAAY,CAAC,EAC5C,QAAQ,EAAE,eAAe,EACzB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACjC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAClC,gBAAgB,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;QAEnD,SAAS,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;KAC9C,EACO,UAAU,EAAE,UAAU,EAC9B,MAAM,EAAE,MAAM,EACN,UAAU,EAAE,mBAAmB,EAC/B,aAAa,EAAE,mBAAmB,EAClC,WAAW,CAAC,EAAE,WAAW,YAAA,EACzB,cAAc,CAAC,EAAE,WAAW,YAAA,EACpC,kBAAkB,GAAE,kBAAkB,GAAG,IAAW,EAC5C,UAAU,CAAC,EAAE,eAAe,YAAA;IAcxC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;;;;;OAMG;IACG,OAAO,CACT,kBAAkB,EAAE,yBAAyB,EAC7C,SAAS,GAAE,OAAc,GAC1B,OAAO,CAAC,cAAc,CAAC;IA0BpB,YAAY,CACd,kBAAkB,EAAE,yBAAyB,EAC7C,OAAO,GAAE,iBAAuC,GACjD,OAAO,CAAC,UAAU,CAAC;IA2WtB;;;OAGG;IACH,KAAK,IAAI,IAAI;YAIC,0BAA0B;YAS1B,SAAS;IAwCvB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,4BAA4B;YAQtB,UAAU;YAmBV,QAAQ;IA4BtB,OAAO,CAAC,WAAW;YAeL,uBAAuB;YA6CvB,cAAc;IAoD5B;;;OAGG;YACW,oBAAoB;IAqBlC;;;;;;;;OAQG;YACW,mBAAmB;YA4HnB,uBAAuB;YA6OvB,2BAA2B;YA2B3B,YAAY;YAuDZ,qBAAqB;IAoCnC,OAAO,CAAC,oBAAoB;YAOd,oBAAoB;YAqDpB,qBAAqB;YA+DrB,oBAAoB;YA+CpB,4BAA4B;IA6C1C,OAAO,CAAC,oBAAoB;YAad,gCAAgC;YA+BhC,gCAAgC;IA6C9C,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,2BAA2B;YAkBrB,sBAAsB;IAgDpC,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,2BAA2B;IAanC,OAAO,CAAC,iCAAiC;IAUzC,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,wBAAwB;IA6BhC,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,wBAAwB;IAMhC,OAAO,CAAC,6BAA6B;IAYrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAE/C;;;;;;;;;;;OAWG;YACW,mBAAmB;IAkDjC;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;OAGG;IACH,OAAO,CAAC,OAAO;IASf;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;;;;;;;;OAWG;YACW,cAAc;IAwF5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAQ3B"}
|
|
@@ -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:
|
|
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
|
|
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
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
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
|
|
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
|
|
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
|
|
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(),
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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://
|
|
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,
|
|
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://
|
|
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>;
|