@botbotgo/agent-harness 0.0.111 → 0.0.113
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/README.md +0 -2
- package/README.zh.md +0 -2
- package/dist/config/agents/direct.yaml +58 -59
- package/dist/config/agents/orchestra.yaml +68 -70
- package/dist/contracts/core.d.ts +0 -2
- package/dist/contracts/runtime.d.ts +0 -17
- package/dist/contracts/workspace.d.ts +2 -11
- package/dist/init-project.js +10 -8
- package/dist/package-version.d.ts +1 -1
- package/dist/package-version.js +1 -1
- package/dist/persistence/file-store.d.ts +1 -5
- package/dist/persistence/file-store.js +1 -34
- package/dist/runtime/adapter/compat/deepagent-compat.d.ts +6 -0
- package/dist/runtime/adapter/compat/deepagent-compat.js +3 -0
- package/dist/runtime/adapter/{execution-context.d.ts → flow/execution-context.d.ts} +17 -3
- package/dist/runtime/adapter/{execution-context.js → flow/execution-context.js} +20 -2
- package/dist/runtime/adapter/flow/invocation-flow.d.ts +24 -0
- package/dist/runtime/adapter/flow/invocation-flow.js +42 -0
- package/dist/runtime/adapter/{invoke-runtime.d.ts → flow/invoke-runtime.d.ts} +3 -3
- package/dist/runtime/adapter/{invoke-runtime.js → flow/invoke-runtime.js} +1 -1
- package/dist/runtime/adapter/flow/runnable-assembly.d.ts +51 -0
- package/dist/runtime/adapter/flow/runnable-assembly.js +52 -0
- package/dist/runtime/adapter/{stream-runtime.d.ts → flow/stream-runtime.d.ts} +3 -3
- package/dist/runtime/adapter/{stream-runtime.js → flow/stream-runtime.js} +6 -6
- package/dist/runtime/adapter/middleware-assembly.d.ts +12 -1
- package/dist/runtime/adapter/middleware-assembly.js +72 -54
- package/dist/runtime/adapter/runnable-config.d.ts +0 -3
- package/dist/runtime/adapter/runnable-config.js +0 -3
- package/dist/runtime/adapter/runtime-adapter-support.d.ts +0 -7
- package/dist/runtime/adapter/runtime-adapter-support.js +1 -20
- package/dist/runtime/adapter/runtime-shell.js +1 -1
- package/dist/runtime/adapter/tool/builtin-middleware-tools.js +10 -9
- package/dist/runtime/adapter/tool-resolution.d.ts +1 -1
- package/dist/runtime/agent-runtime-adapter.d.ts +1 -1
- package/dist/runtime/agent-runtime-adapter.js +52 -81
- package/dist/runtime/harness/system/inventory.d.ts +2 -2
- package/dist/runtime/harness/system/inventory.js +5 -6
- package/dist/runtime/parsing/stream-event-parsing.js +2 -2
- package/dist/runtime/support/compiled-binding.d.ts +1 -2
- package/dist/runtime/support/compiled-binding.js +0 -3
- package/dist/workspace/agent-binding-compiler.js +7 -32
- package/dist/workspace/object-loader.js +94 -23
- package/dist/workspace/support/workspace-ref-utils.d.ts +1 -2
- package/dist/workspace/support/workspace-ref-utils.js +0 -12
- package/package.json +1 -1
|
@@ -1,28 +1,23 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { Command, MemorySaver } from "@langchain/langgraph";
|
|
3
2
|
import { createDeepAgent, FilesystemBackend, } from "deepagents";
|
|
4
3
|
import { createAgent } from "langchain";
|
|
5
4
|
import { wrapResolvedModel, } from "./parsing/output-parsing.js";
|
|
6
|
-
import {
|
|
5
|
+
import { assembleDeepAgentRunnable, assembleLangChainRunnable, } from "./adapter/flow/runnable-assembly.js";
|
|
7
6
|
import { buildToolNameMapping, } from "./adapter/tool/tool-name-mapping.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { streamRuntimeExecution } from "./adapter/stream-runtime.js";
|
|
7
|
+
import { executeRuntimeInvocation } from "./adapter/flow/invocation-flow.js";
|
|
8
|
+
import { streamRuntimeExecution } from "./adapter/flow/stream-runtime.js";
|
|
11
9
|
import { buildDeepAgentRunnableConfig, buildLangChainRunnableConfig } from "./adapter/runnable-config.js";
|
|
12
10
|
import { applyStrictToolJsonInstruction as applyStrictToolJsonInstructionHelper, callRuntimeWithToolParseRecovery as callRuntimeWithToolParseRecoveryHelper, createModelFallbackRunnable as createModelFallbackRunnableHelper, invokeWithProviderRetry as invokeWithProviderRetryHelper, iterateWithTimeout as iterateWithTimeoutHelper, materializeModelStream as materializeModelStreamHelper, RuntimeOperationTimeoutError, withRuntimeTimeout, } from "./adapter/runtime-shell.js";
|
|
13
11
|
import { invokeBuiltinTaskTool as invokeBuiltinTaskToolHelper, resolveAutomaticSummarizationMiddleware as resolveAutomaticSummarizationMiddlewareHelper, resolveBuiltinMiddlewareBackend as resolveBuiltinMiddlewareBackendHelper, resolveBuiltinMiddlewareTools as resolveBuiltinMiddlewareToolsHelper, resolveLangChainAutomaticMiddleware as resolveLangChainAutomaticMiddlewareHelper, resolveMiddleware as resolveMiddlewareHelper, resolveSubagents as resolveSubagentsHelper, } from "./adapter/middleware-assembly.js";
|
|
14
12
|
import { computeRemainingTimeoutMs, resolveBindingTimeout, resolveStreamIdleTimeout, } from "./adapter/resilience.js";
|
|
15
13
|
import { createResolvedModel } from "./adapter/model/model-providers.js";
|
|
16
|
-
import { buildInvocationRequest, } from "./adapter/model/invocation-request.js";
|
|
17
|
-
import { compileInterruptOn } from "./adapter/tool/interrupt-policy.js";
|
|
18
|
-
import { countConfiguredTools, } from "./adapter/runtime-adapter-support.js";
|
|
19
14
|
import { resolveAdapterTools } from "./adapter/tool-resolution.js";
|
|
20
|
-
import {
|
|
21
|
-
export { applyDeepAgentDelegationPromptCompatibility, materializeDeepAgentSkillSourcePaths, relativizeDeepAgentSkillSourcePaths, shouldRelaxDeepAgentDelegationPrompt, } from "./adapter/compat/deepagent-compat.js";
|
|
15
|
+
import { resolveRuntimeStreamExecutionContext, } from "./adapter/flow/execution-context.js";
|
|
16
|
+
export { applyDeepAgentDelegationPromptCompatibility, materializeDeepAgentSkillSourcePaths, resolveDeepAgentSkillSourcePaths, relativizeDeepAgentSkillSourcePaths, shouldRelaxDeepAgentDelegationPrompt, } from "./adapter/compat/deepagent-compat.js";
|
|
22
17
|
export { buildAuthOmittingFetch, normalizeOpenAICompatibleInit } from "./adapter/compat/openai-compatible.js";
|
|
23
18
|
export { buildToolNameMapping, createModelFacingToolNameCandidates, createModelFacingToolNameLookupCandidates, resolveModelFacingToolName, sanitizeToolNameForModel, } from "./adapter/tool/tool-name-mapping.js";
|
|
24
19
|
export { computeRemainingTimeoutMs, isRetryableProviderError, resolveBindingTimeout, resolveProviderRetryPolicy, resolveStreamIdleTimeout, resolveTimeoutMs, } from "./adapter/resilience.js";
|
|
25
|
-
import { getBindingAdapterKind,
|
|
20
|
+
import { getBindingAdapterKind, getBindingLangChainParams, getBindingToolCount, getBindingPrimaryTools, getBindingSystemPrompt, isDeepAgentBinding, isLangChainBinding, } from "./support/compiled-binding.js";
|
|
26
21
|
const AGENT_INTERRUPT_SENTINEL_PREFIX = "__agent_harness_interrupt__:";
|
|
27
22
|
const UPSTREAM_BUILTIN_MIDDLEWARE_TOOL_NAMES = Object.freeze([
|
|
28
23
|
"write_todos",
|
|
@@ -35,12 +30,6 @@ const UPSTREAM_BUILTIN_MIDDLEWARE_TOOL_NAMES = Object.freeze([
|
|
|
35
30
|
"execute",
|
|
36
31
|
"task",
|
|
37
32
|
]);
|
|
38
|
-
function resolveBindingCheckpointer(options, binding) {
|
|
39
|
-
return options.checkpointerResolver ? options.checkpointerResolver(binding) : new MemorySaver();
|
|
40
|
-
}
|
|
41
|
-
function resolveBindingInterruptOn(binding) {
|
|
42
|
-
return compileInterruptOn(getBindingPrimaryTools(binding), getBindingInterruptCompatibilityRules(binding));
|
|
43
|
-
}
|
|
44
33
|
export class AgentRuntimeAdapter {
|
|
45
34
|
options;
|
|
46
35
|
modelCache = new Map();
|
|
@@ -222,22 +211,29 @@ export class AgentRuntimeAdapter {
|
|
|
222
211
|
});
|
|
223
212
|
}
|
|
224
213
|
async createLangChainRunnable(binding, options = {}) {
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
214
|
+
const assembly = await assembleLangChainRunnable({
|
|
215
|
+
binding,
|
|
216
|
+
runtimeAdapterOptions: this.options,
|
|
217
|
+
resolveModel: (model) => this.resolveModel(model),
|
|
218
|
+
resolveTools: (tools, currentBinding) => this.resolveTools(tools, currentBinding),
|
|
219
|
+
resolveMiddleware: (currentBinding, interruptOn) => this.resolveMiddleware(currentBinding, interruptOn),
|
|
220
|
+
passthroughOverride: options.passthroughOverride,
|
|
221
|
+
systemPromptOverride: options.systemPromptOverride,
|
|
222
|
+
});
|
|
223
|
+
const model = assembly.resolvedModel;
|
|
224
|
+
const tools = assembly.resolvedTools;
|
|
229
225
|
if (tools.length > 0 && typeof model.bindTools !== "function") {
|
|
230
|
-
throw new Error(`Agent ${binding.agent.id} configures ${tools.length} tool(s), but resolved model ${
|
|
226
|
+
throw new Error(`Agent ${binding.agent.id} configures ${tools.length} tool(s), but resolved model ${assembly.langchainParams.model.id} does not support tool binding.`);
|
|
231
227
|
}
|
|
232
228
|
return createAgent(buildLangChainRunnableConfig({
|
|
233
|
-
langchainParams:
|
|
229
|
+
langchainParams: assembly.langchainParams,
|
|
234
230
|
resolvedModel: model,
|
|
235
231
|
resolvedTools: tools,
|
|
236
|
-
resolvedMiddleware:
|
|
237
|
-
resolvedCheckpointer:
|
|
238
|
-
resolvedStore:
|
|
239
|
-
passthroughOverride:
|
|
240
|
-
systemPromptOverride:
|
|
232
|
+
resolvedMiddleware: assembly.resolvedMiddleware,
|
|
233
|
+
resolvedCheckpointer: assembly.resolvedCheckpointer,
|
|
234
|
+
resolvedStore: assembly.resolvedStore,
|
|
235
|
+
passthroughOverride: assembly.passthroughOverride,
|
|
236
|
+
systemPromptOverride: assembly.systemPromptOverride,
|
|
241
237
|
}));
|
|
242
238
|
}
|
|
243
239
|
async createRunnable(binding) {
|
|
@@ -250,27 +246,25 @@ export class AgentRuntimeAdapter {
|
|
|
250
246
|
return this.createDeepAgentRunnable(binding);
|
|
251
247
|
}
|
|
252
248
|
async createDeepAgentRunnable(binding) {
|
|
253
|
-
const
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
249
|
+
const assembly = await assembleDeepAgentRunnable({
|
|
250
|
+
binding,
|
|
251
|
+
runtimeAdapterOptions: this.options,
|
|
252
|
+
resolveModel: (model) => this.resolveModel(model),
|
|
253
|
+
resolveTools: (tools, currentBinding) => this.resolveTools(tools, currentBinding),
|
|
254
|
+
resolveMiddleware: (currentBinding, interruptOn) => this.resolveMiddleware(currentBinding, interruptOn),
|
|
255
|
+
resolveSubagents: (subagents, currentBinding) => this.resolveSubagents(subagents, currentBinding),
|
|
256
|
+
});
|
|
258
257
|
const deepAgentConfig = buildDeepAgentRunnableConfig({
|
|
259
|
-
compatibleParams,
|
|
260
|
-
resolvedModel:
|
|
261
|
-
resolvedTools:
|
|
262
|
-
resolvedMiddleware:
|
|
263
|
-
resolvedSubagents:
|
|
264
|
-
resolvedCheckpointer:
|
|
265
|
-
resolvedStore:
|
|
266
|
-
resolvedBackend:
|
|
267
|
-
resolvedInterruptOn:
|
|
268
|
-
resolvedSkills:
|
|
269
|
-
workspaceRoot: binding.harnessRuntime.workspaceRoot,
|
|
270
|
-
runRoot: binding.harnessRuntime.runRoot,
|
|
271
|
-
ownerId: binding.agent.id,
|
|
272
|
-
skillPaths: compatibleParams.skills,
|
|
273
|
-
})) ?? [],
|
|
258
|
+
compatibleParams: assembly.compatibleParams,
|
|
259
|
+
resolvedModel: assembly.resolvedModel,
|
|
260
|
+
resolvedTools: assembly.resolvedTools,
|
|
261
|
+
resolvedMiddleware: assembly.resolvedMiddleware,
|
|
262
|
+
resolvedSubagents: assembly.resolvedSubagents,
|
|
263
|
+
resolvedCheckpointer: assembly.resolvedCheckpointer,
|
|
264
|
+
resolvedStore: assembly.resolvedStore,
|
|
265
|
+
resolvedBackend: assembly.resolvedBackend,
|
|
266
|
+
resolvedInterruptOn: assembly.resolvedInterruptOn,
|
|
267
|
+
resolvedSkills: assembly.resolvedSkills,
|
|
274
268
|
});
|
|
275
269
|
return createDeepAgent(deepAgentConfig);
|
|
276
270
|
}
|
|
@@ -290,9 +284,6 @@ export class AgentRuntimeAdapter {
|
|
|
290
284
|
}
|
|
291
285
|
}
|
|
292
286
|
async invoke(binding, input, threadId, runId, resumePayload, history = [], options = {}) {
|
|
293
|
-
const request = resumePayload === undefined
|
|
294
|
-
? buildInvocationRequest(binding, history, input, options)
|
|
295
|
-
: new Command({ resume: resumePayload });
|
|
296
287
|
const callRuntime = async (activeBinding, activeRequest) => {
|
|
297
288
|
return this.invokeWithProviderRetry(activeBinding, async () => {
|
|
298
289
|
const runnable = await this.create(activeBinding);
|
|
@@ -307,47 +298,27 @@ export class AgentRuntimeAdapter {
|
|
|
307
298
|
callRuntime,
|
|
308
299
|
});
|
|
309
300
|
};
|
|
310
|
-
|
|
301
|
+
return executeRuntimeInvocation({
|
|
311
302
|
binding,
|
|
303
|
+
input,
|
|
304
|
+
threadId,
|
|
305
|
+
runId,
|
|
306
|
+
resumePayload,
|
|
307
|
+
history,
|
|
308
|
+
invokeOptions: options,
|
|
312
309
|
resolveTools: (tools, currentBinding) => this.resolveTools(tools, currentBinding),
|
|
313
310
|
getToolNameMapping: (currentBinding) => this.getToolNameMapping(currentBinding),
|
|
314
|
-
|
|
315
|
-
});
|
|
316
|
-
const builtinExecutableTools = await this.resolveBuiltinMiddlewareTools(binding, options);
|
|
317
|
-
const localOrUpstreamInvocation = await invokeRuntimeWithLocalTools({
|
|
318
|
-
binding,
|
|
319
|
-
request,
|
|
320
|
-
resumePayload,
|
|
321
|
-
primaryTools,
|
|
322
|
-
defersToUpstreamHitlExecution,
|
|
323
|
-
toolNameMapping,
|
|
324
|
-
executableTools,
|
|
325
|
-
builtinExecutableTools: builtinExecutableTools,
|
|
311
|
+
resolveBuiltinMiddlewareTools: (currentBinding, currentOptions) => this.resolveBuiltinMiddlewareTools(currentBinding, currentOptions),
|
|
326
312
|
callRuntimeWithToolParseRecovery,
|
|
327
313
|
});
|
|
328
|
-
const result = localOrUpstreamInvocation.result;
|
|
329
|
-
const executedToolResults = [...localOrUpstreamInvocation.executedToolResults];
|
|
330
|
-
if (!result) {
|
|
331
|
-
throw new Error("Agent invocation returned no result");
|
|
332
|
-
}
|
|
333
|
-
return finalizeInvocationResult({
|
|
334
|
-
bindingAgentId: binding.agent.id,
|
|
335
|
-
threadId,
|
|
336
|
-
runId,
|
|
337
|
-
result,
|
|
338
|
-
executedToolResults,
|
|
339
|
-
});
|
|
340
314
|
}
|
|
341
315
|
async *stream(binding, input, threadId, history = [], options = {}) {
|
|
342
316
|
const invokeTimeoutMs = resolveBindingTimeout(binding);
|
|
343
317
|
const streamIdleTimeoutMs = resolveStreamIdleTimeout(binding);
|
|
344
318
|
const streamDeadlineAt = invokeTimeoutMs ? Date.now() + invokeTimeoutMs : undefined;
|
|
345
|
-
const { primaryTools, toolNameMapping } =
|
|
319
|
+
const { primaryTools, toolNameMapping, forceInvokeFallback, canUseDirectModelStream, langChainStreamModel, } = await resolveRuntimeStreamExecutionContext({
|
|
346
320
|
binding,
|
|
347
321
|
getToolNameMapping: (currentBinding) => this.getToolNameMapping(currentBinding),
|
|
348
|
-
});
|
|
349
|
-
const { forceInvokeFallback, canUseDirectModelStream, langChainStreamModel, } = await resolveLangChainStreamContext({
|
|
350
|
-
binding,
|
|
351
322
|
resolveModel: (model) => this.resolveModel(model),
|
|
352
323
|
resolveTools: (tools, currentBinding) => this.resolveTools(tools, currentBinding),
|
|
353
324
|
});
|
|
@@ -373,7 +344,7 @@ export class AgentRuntimeAdapter {
|
|
|
373
344
|
getSystemPrompt: (activeBinding) => getBindingSystemPrompt(activeBinding),
|
|
374
345
|
isLangChainBinding,
|
|
375
346
|
isDeepAgentBinding,
|
|
376
|
-
countConfiguredTools,
|
|
347
|
+
countConfiguredTools: getBindingToolCount,
|
|
377
348
|
});
|
|
378
349
|
}
|
|
379
350
|
}
|
|
@@ -20,14 +20,14 @@ export type InventorySkillRecord = {
|
|
|
20
20
|
export type InventoryAgentRecord = {
|
|
21
21
|
id: string;
|
|
22
22
|
description: string;
|
|
23
|
-
|
|
23
|
+
parentAgentId?: string;
|
|
24
24
|
tools: InventoryToolRecord[];
|
|
25
25
|
skills: InventorySkillRecord[];
|
|
26
26
|
};
|
|
27
27
|
export declare function findAgentBinding(workspace: WorkspaceBundle, agentId: string): CompiledAgentBinding | undefined;
|
|
28
28
|
export declare function listAgentTools(workspace: WorkspaceBundle, agentId: string): InventoryToolRecord[];
|
|
29
29
|
export declare function listAgentSkills(workspace: WorkspaceBundle, agentId: string, options?: RequirementAssessmentOptions): InventorySkillRecord[];
|
|
30
|
-
export declare function
|
|
30
|
+
export declare function listSubagents(workspace: WorkspaceBundle, options?: RequirementAssessmentOptions): InventoryAgentRecord[];
|
|
31
31
|
export declare function listAvailableAgents(workspace: WorkspaceBundle, options?: RequirementAssessmentOptions): InventoryAgentRecord[];
|
|
32
32
|
export declare function describeWorkspaceInventory(workspace: WorkspaceBundle, options?: RequirementAssessmentOptions): {
|
|
33
33
|
workspaceRoot: string;
|
|
@@ -77,30 +77,29 @@ export function listAgentSkills(workspace, agentId, options = {}) {
|
|
|
77
77
|
const resolvedOptions = mergeRequirementOptions(binding, options);
|
|
78
78
|
return toSkillRecords(binding.deepAgentParams?.skills ?? binding.langchainAgentParams?.skills ?? [], resolvedOptions);
|
|
79
79
|
}
|
|
80
|
-
function describeSubagent(subagent, options = {}) {
|
|
80
|
+
function describeSubagent(subagent, parentAgentId, options = {}) {
|
|
81
81
|
return {
|
|
82
82
|
id: subagent.name,
|
|
83
83
|
description: subagent.description,
|
|
84
|
-
|
|
84
|
+
parentAgentId,
|
|
85
85
|
tools: dedupeTools(subagent.tools ?? []),
|
|
86
86
|
skills: toSkillRecords(subagent.skills ?? [], options),
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
|
-
export function
|
|
89
|
+
export function listSubagents(workspace, options = {}) {
|
|
90
90
|
return listHostBindings(workspace).flatMap((binding) => {
|
|
91
91
|
const resolvedOptions = mergeRequirementOptions(binding, options);
|
|
92
|
-
return (binding.deepAgentParams?.subagents ?? []).map((subagent) => describeSubagent(subagent, resolvedOptions));
|
|
92
|
+
return (binding.deepAgentParams?.subagents ?? []).map((subagent) => describeSubagent(subagent, binding.agent.id, resolvedOptions));
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
export function listAvailableAgents(workspace, options = {}) {
|
|
96
96
|
const topLevel = listHostBindings(workspace).map((binding) => ({
|
|
97
97
|
id: binding.agent.id,
|
|
98
98
|
description: binding.agent.description,
|
|
99
|
-
role: "agent",
|
|
100
99
|
tools: listAgentTools(workspace, binding.agent.id),
|
|
101
100
|
skills: listAgentSkills(workspace, binding.agent.id, options),
|
|
102
101
|
}));
|
|
103
|
-
return [...topLevel, ...
|
|
102
|
+
return [...topLevel, ...listSubagents(workspace, options)];
|
|
104
103
|
}
|
|
105
104
|
export function describeWorkspaceInventory(workspace, options = {}) {
|
|
106
105
|
return {
|
|
@@ -390,13 +390,13 @@ export function extractAgentStep(event) {
|
|
|
390
390
|
return "preparing model request…";
|
|
391
391
|
if (/RunnableLambda/i.test(name) || /^__start__$/.test(name))
|
|
392
392
|
return null;
|
|
393
|
-
if (/specialist/i.test(name))
|
|
393
|
+
if (/(subagent|specialist)/i.test(name))
|
|
394
394
|
return `starting ${humanizeEventName(name)}…`;
|
|
395
395
|
if (/agent$/i.test(name))
|
|
396
396
|
return `running ${humanizeEventName(name)}…`;
|
|
397
397
|
}
|
|
398
398
|
if (typed.event === "on_chain_end") {
|
|
399
|
-
if (/specialist/i.test(name))
|
|
399
|
+
if (/(subagent|specialist)/i.test(name))
|
|
400
400
|
return `${humanizeEventName(name)} done`;
|
|
401
401
|
if (/agent$/i.test(name) && !/^__start__$/.test(name))
|
|
402
402
|
return `${humanizeEventName(name)} done`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CompiledAgentBinding, CompiledModel, CompiledTool, DeepAgentParams, LangChainAgentParams
|
|
1
|
+
import type { CompiledAgentBinding, CompiledModel, CompiledTool, DeepAgentParams, LangChainAgentParams } from "../../contracts/types.js";
|
|
2
2
|
export type BindingExecutionView = {
|
|
3
3
|
adapterKind: string;
|
|
4
4
|
adapterConfig: Record<string, unknown>;
|
|
@@ -25,7 +25,6 @@ export declare function isLangChainBinding(binding: CompiledAgentBinding): boole
|
|
|
25
25
|
export declare function isDeepAgentBinding(binding: CompiledAgentBinding): boolean;
|
|
26
26
|
export declare function getBindingPrimaryTools(binding: CompiledAgentBinding): CompiledTool[];
|
|
27
27
|
export declare function getBindingPrimaryModel(binding: CompiledAgentBinding): CompiledModel | undefined;
|
|
28
|
-
export declare function getBindingRuntimeModel(binding: CompiledAgentBinding, slot: RuntimeModelSlot): CompiledModel | undefined;
|
|
29
28
|
export declare function getBindingSystemPrompt(binding: CompiledAgentBinding): string | undefined;
|
|
30
29
|
export declare function getBindingMiddlewareConfigs(binding: CompiledAgentBinding): Array<Record<string, unknown>> | undefined;
|
|
31
30
|
export declare function getBindingToolCount(binding: CompiledAgentBinding): number;
|
|
@@ -69,9 +69,6 @@ export function getBindingPrimaryTools(binding) {
|
|
|
69
69
|
export function getBindingPrimaryModel(binding) {
|
|
70
70
|
return getBindingExecutionView(binding).primaryModel;
|
|
71
71
|
}
|
|
72
|
-
export function getBindingRuntimeModel(binding, slot) {
|
|
73
|
-
return binding.harnessRuntime.models?.[slot];
|
|
74
|
-
}
|
|
75
72
|
export function getBindingSystemPrompt(binding) {
|
|
76
73
|
return getBindingExecutionView(binding).systemPrompt;
|
|
77
74
|
}
|
|
@@ -4,7 +4,7 @@ import { compileModel, compileTool } from "./resource-compilers.js";
|
|
|
4
4
|
import { inferAgentCapabilities } from "./support/agent-capabilities.js";
|
|
5
5
|
import { getAgentExecutionConfigValue, getAgentExecutionObject, getAgentExecutionString } from "./support/agent-execution-config.js";
|
|
6
6
|
import { discoverSkillPaths } from "./support/discovery.js";
|
|
7
|
-
import { compileAgentMemories, getResilienceConfig, getRuntimeDefaults, getRuntimeMemoryDefaults,
|
|
7
|
+
import { compileAgentMemories, getResilienceConfig, getRuntimeDefaults, getRuntimeMemoryDefaults, getWorkspaceObject, resolvePromptValue, resolveRefId } from "./support/workspace-ref-utils.js";
|
|
8
8
|
const WORKSPACE_BOUNDARY_GUIDANCE = "Keep repository and file exploration bounded to the current workspace root unless the user explicitly asks for broader host or filesystem access. " +
|
|
9
9
|
"Do not inspect absolute paths outside the workspace, system directories, or unrelated repos by default. " +
|
|
10
10
|
"Prefer workspace-local tools, relative paths, and the current repository checkout when analyzing code.";
|
|
@@ -87,8 +87,7 @@ export function requireTools(tools, refs, ownerId) {
|
|
|
87
87
|
}
|
|
88
88
|
return Array.from(deduped.values());
|
|
89
89
|
}
|
|
90
|
-
function buildSubagent(agent, workspaceRoot, models, tools, parentSkills, parentModel
|
|
91
|
-
const ownMemory = compileAgentMemories(workspaceRoot, agent.memorySources);
|
|
90
|
+
function buildSubagent(agent, workspaceRoot, models, tools, parentSkills, parentModel) {
|
|
92
91
|
const execution = compileExecutionCore(agent, models, tools);
|
|
93
92
|
return {
|
|
94
93
|
name: resolveAgentRuntimeName(agent),
|
|
@@ -98,11 +97,8 @@ function buildSubagent(agent, workspaceRoot, models, tools, parentSkills, parent
|
|
|
98
97
|
model: agent.modelRef ? execution.model : parentModel,
|
|
99
98
|
interruptOn: resolveInterruptOn(agent),
|
|
100
99
|
skills: compileAgentSkills(workspaceRoot, agent, parentSkills),
|
|
101
|
-
memory: ownMemory.length > 0 ? ownMemory : parentMemory,
|
|
102
100
|
responseFormat: execution.responseFormat,
|
|
103
|
-
contextSchema: execution.contextSchema,
|
|
104
101
|
middleware: execution.middleware,
|
|
105
|
-
passthrough: execution.passthrough,
|
|
106
102
|
};
|
|
107
103
|
}
|
|
108
104
|
function resolveSystemPrompt(agent) {
|
|
@@ -129,13 +125,13 @@ function resolvePassthrough(agent) {
|
|
|
129
125
|
const passthrough = getAgentExecutionObject(agent, "passthrough");
|
|
130
126
|
return passthrough ? { ...passthrough } : undefined;
|
|
131
127
|
}
|
|
132
|
-
function compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel
|
|
128
|
+
function compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel) {
|
|
133
129
|
return agent.subagentRefs.map((ref) => {
|
|
134
130
|
const subagent = agents.get(resolveRefId(ref));
|
|
135
131
|
if (!subagent) {
|
|
136
132
|
throw new Error(`Missing subagent ${ref} for agent ${agent.id}`);
|
|
137
133
|
}
|
|
138
|
-
return buildSubagent(subagent, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel
|
|
134
|
+
return buildSubagent(subagent, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel);
|
|
139
135
|
});
|
|
140
136
|
}
|
|
141
137
|
function compileExecutionCore(agent, models, tools) {
|
|
@@ -233,7 +229,7 @@ function resolveCheckpointerConfig(agent, refs) {
|
|
|
233
229
|
return { config: inlineAgentCheckpointer };
|
|
234
230
|
}
|
|
235
231
|
function resolveRuntimeMemoryConfig(agent, refs) {
|
|
236
|
-
const inlineRuntimeMemory = getAgentExecutionObject(agent, "runtimeMemory");
|
|
232
|
+
const inlineRuntimeMemory = agent.runtimeMemory ?? getAgentExecutionObject(agent, "runtimeMemory");
|
|
237
233
|
if (inlineRuntimeMemory) {
|
|
238
234
|
if (isRefConfig(inlineRuntimeMemory)) {
|
|
239
235
|
return {
|
|
@@ -245,20 +241,6 @@ function resolveRuntimeMemoryConfig(agent, refs) {
|
|
|
245
241
|
const runtimeMemoryDefaults = getRuntimeMemoryDefaults(refs);
|
|
246
242
|
return runtimeMemoryDefaults ? { config: runtimeMemoryDefaults } : undefined;
|
|
247
243
|
}
|
|
248
|
-
function resolveRuntimeModelRefs(agent, refs) {
|
|
249
|
-
const merged = {
|
|
250
|
-
...(getRuntimeModelDefaults(refs) ?? {}),
|
|
251
|
-
...(agent.runtimeModelRefs ?? {}),
|
|
252
|
-
};
|
|
253
|
-
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
254
|
-
}
|
|
255
|
-
function compileRuntimeModels(modelRefs, models, ownerId) {
|
|
256
|
-
if (!modelRefs) {
|
|
257
|
-
return undefined;
|
|
258
|
-
}
|
|
259
|
-
const compiled = Object.fromEntries(Object.entries(modelRefs).map(([slot, modelRef]) => [slot, requireModel(models, modelRef, ownerId)]));
|
|
260
|
-
return Object.keys(compiled).length > 0 ? compiled : undefined;
|
|
261
|
-
}
|
|
262
244
|
export function compileBinding(workspaceRoot, agent, agents, referencedSubagentIds, refs, models, tools) {
|
|
263
245
|
const internalSubagent = referencedSubagentIds.has(agent.id);
|
|
264
246
|
const runtimeDefaults = getRuntimeDefaults(refs);
|
|
@@ -274,8 +256,6 @@ export function compileBinding(workspaceRoot, agent, agents, referencedSubagentI
|
|
|
274
256
|
const store = resolveStoreConfig(agent, refs);
|
|
275
257
|
const checkpointer = resolveCheckpointerConfig(agent, refs);
|
|
276
258
|
const runtimeMemory = resolveRuntimeMemoryConfig(agent, refs);
|
|
277
|
-
const runtimeModelRefs = resolveRuntimeModelRefs(agent, refs);
|
|
278
|
-
const runtimeModels = compileRuntimeModels(runtimeModelRefs, models, agent.id);
|
|
279
259
|
const runRoot = typeof agent.runRoot === "string" && agent.runRoot.trim().length > 0
|
|
280
260
|
? path.resolve(workspaceRoot, agent.runRoot)
|
|
281
261
|
: typeof runtimeDefaults?.runRoot === "string" && runtimeDefaults.runRoot.trim().length > 0
|
|
@@ -296,8 +276,6 @@ export function compileBinding(workspaceRoot, agent, agents, referencedSubagentI
|
|
|
296
276
|
harnessRuntime: {
|
|
297
277
|
runRoot,
|
|
298
278
|
workspaceRoot,
|
|
299
|
-
...(runtimeModelRefs ? { modelRefs: runtimeModelRefs } : {}),
|
|
300
|
-
...(runtimeModels ? { models: runtimeModels } : {}),
|
|
301
279
|
capabilities: inferAgentCapabilities(agent),
|
|
302
280
|
resilience,
|
|
303
281
|
...(checkpointer ? { checkpointer: checkpointer.config } : {}),
|
|
@@ -317,7 +295,7 @@ export function compileBinding(workspaceRoot, agent, agents, referencedSubagentI
|
|
|
317
295
|
filesystem: getAgentExecutionObject(agent, "filesystem", { executionMode: "langchain-v1" }),
|
|
318
296
|
middleware: execution.middleware,
|
|
319
297
|
passthrough: execution.passthrough,
|
|
320
|
-
subagents: compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel
|
|
298
|
+
subagents: compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel),
|
|
321
299
|
memory: compiledAgentMemory,
|
|
322
300
|
skills: compiledAgentSkills,
|
|
323
301
|
generalPurposeAgent: getAgentExecutionConfigValue(agent, "generalPurposeAgent", { executionMode: "langchain-v1" }),
|
|
@@ -347,17 +325,14 @@ export function compileBinding(workspaceRoot, agent, agents, referencedSubagentI
|
|
|
347
325
|
responseFormat: execution.responseFormat,
|
|
348
326
|
contextSchema: execution.contextSchema,
|
|
349
327
|
middleware: execution.middleware,
|
|
350
|
-
passthrough: execution.passthrough,
|
|
351
328
|
description: agent.description,
|
|
352
|
-
subagents: compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel
|
|
329
|
+
subagents: compileSubagents(agent, agents, workspaceRoot, models, tools, compiledAgentSkills, compiledAgentModel),
|
|
353
330
|
interruptOn: resolveInterruptOn(agent),
|
|
354
331
|
...(backend ? { backend: backend.config } : {}),
|
|
355
332
|
...(store ? { store: store.config } : {}),
|
|
356
333
|
name: resolveAgentRuntimeName(agent),
|
|
357
334
|
memory: compiledAgentMemory,
|
|
358
335
|
skills: compiledAgentSkills,
|
|
359
|
-
generalPurposeAgent: getAgentExecutionConfigValue(agent, "generalPurposeAgent", { executionMode: "deepagent" }),
|
|
360
|
-
taskDescription: getAgentExecutionString(agent, "taskDescription", { executionMode: "deepagent" }),
|
|
361
336
|
};
|
|
362
337
|
return {
|
|
363
338
|
...base,
|
|
@@ -151,9 +151,75 @@ const CONSUMED_AGENT_CONFIG_KEYS = [
|
|
|
151
151
|
"generalPurposeAgent",
|
|
152
152
|
"filesystem",
|
|
153
153
|
];
|
|
154
|
+
const RESERVED_EXECUTION_KEYS = [
|
|
155
|
+
"backend",
|
|
156
|
+
"modelRef",
|
|
157
|
+
"tools",
|
|
158
|
+
"skills",
|
|
159
|
+
"memory",
|
|
160
|
+
"subagents",
|
|
161
|
+
"mcpServers",
|
|
162
|
+
"config",
|
|
163
|
+
];
|
|
164
|
+
const MIGRATED_EXECUTION_CONFIG_KEYS = [
|
|
165
|
+
"systemPrompt",
|
|
166
|
+
"checkpointer",
|
|
167
|
+
"interruptOn",
|
|
168
|
+
"stateSchema",
|
|
169
|
+
"responseFormat",
|
|
170
|
+
"contextSchema",
|
|
171
|
+
"includeAgentName",
|
|
172
|
+
"version",
|
|
173
|
+
"middleware",
|
|
174
|
+
"store",
|
|
175
|
+
"taskDescription",
|
|
176
|
+
"generalPurposeAgent",
|
|
177
|
+
"filesystem",
|
|
178
|
+
];
|
|
154
179
|
function readExecutionConfig(value) {
|
|
155
180
|
return asMutableObject(value);
|
|
156
181
|
}
|
|
182
|
+
function normalizeAgentItemForMerge(item) {
|
|
183
|
+
const normalized = { ...item };
|
|
184
|
+
const execution = readExecutionConfig(normalized.execution);
|
|
185
|
+
if (!execution) {
|
|
186
|
+
return normalized;
|
|
187
|
+
}
|
|
188
|
+
const config = asMutableObject(execution.config);
|
|
189
|
+
const runtime = readRuntimeConfig(normalized);
|
|
190
|
+
if (config) {
|
|
191
|
+
for (const key of MIGRATED_EXECUTION_CONFIG_KEYS) {
|
|
192
|
+
if (!(key in config) || execution[key] !== undefined) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
execution[key] = cloneConfigValue(config[key]);
|
|
196
|
+
delete config[key];
|
|
197
|
+
}
|
|
198
|
+
if (config.runtimeMemory !== undefined && runtime?.runtimeMemory === undefined) {
|
|
199
|
+
const nextRuntime = runtime ?? {};
|
|
200
|
+
nextRuntime.runtimeMemory = cloneConfigValue(config.runtimeMemory);
|
|
201
|
+
normalized.runtime = nextRuntime;
|
|
202
|
+
delete config.runtimeMemory;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (config && Object.keys(config).length > 0) {
|
|
206
|
+
execution.config = config;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
delete execution.config;
|
|
210
|
+
}
|
|
211
|
+
normalized.execution = execution;
|
|
212
|
+
return normalized;
|
|
213
|
+
}
|
|
214
|
+
function readExecutionAgentConfig(item) {
|
|
215
|
+
const execution = readExecutionConfig(item.execution) ?? {};
|
|
216
|
+
const config = asMutableObject(execution.config) ?? {};
|
|
217
|
+
const directExecutionConfig = Object.fromEntries(Object.entries(execution).filter(([key]) => !RESERVED_EXECUTION_KEYS.includes(key)));
|
|
218
|
+
return {
|
|
219
|
+
...config,
|
|
220
|
+
...directExecutionConfig,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
157
223
|
function readExecutionValue(item, key, reader) {
|
|
158
224
|
const execution = readExecutionConfig(item.execution);
|
|
159
225
|
return reader(execution?.[key]);
|
|
@@ -161,19 +227,17 @@ function readExecutionValue(item, key, reader) {
|
|
|
161
227
|
function readRuntimeConfig(item) {
|
|
162
228
|
return asMutableObject(item.runtime);
|
|
163
229
|
}
|
|
164
|
-
function
|
|
165
|
-
if (!runtime) {
|
|
166
|
-
return
|
|
230
|
+
function readRuntimeMemoryConfig(item, runtime) {
|
|
231
|
+
if (typeof runtime?.runtimeMemory === "object" && runtime.runtimeMemory && !Array.isArray(runtime.runtimeMemory)) {
|
|
232
|
+
return cloneConfigValue(runtime.runtimeMemory);
|
|
167
233
|
}
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
};
|
|
176
|
-
return Object.keys(modelRefs).length > 0 ? modelRefs : undefined;
|
|
234
|
+
const legacyExecutionConfig = readExecutionAgentConfig(item);
|
|
235
|
+
if (typeof legacyExecutionConfig.runtimeMemory === "object" &&
|
|
236
|
+
legacyExecutionConfig.runtimeMemory &&
|
|
237
|
+
!Array.isArray(legacyExecutionConfig.runtimeMemory)) {
|
|
238
|
+
return cloneConfigValue(legacyExecutionConfig.runtimeMemory);
|
|
239
|
+
}
|
|
240
|
+
return undefined;
|
|
177
241
|
}
|
|
178
242
|
function cloneConfigValue(value) {
|
|
179
243
|
if (Array.isArray(value)) {
|
|
@@ -239,12 +303,15 @@ function resolveExecutionBackend(item, current) {
|
|
|
239
303
|
}
|
|
240
304
|
return undefined;
|
|
241
305
|
}
|
|
242
|
-
function readSharedAgentConfigFields(config) {
|
|
306
|
+
function readSharedAgentConfigFields(config, options = {}) {
|
|
243
307
|
return {
|
|
244
308
|
...(typeof config.store === "object" && config.store ? { store: config.store } : {}),
|
|
245
|
-
...(typeof config.
|
|
246
|
-
|
|
247
|
-
|
|
309
|
+
...(options.includeDelegationControls && typeof config.taskDescription === "string" && config.taskDescription.trim()
|
|
310
|
+
? { taskDescription: config.taskDescription }
|
|
311
|
+
: {}),
|
|
312
|
+
...(options.includeDelegationControls && typeof config.generalPurposeAgent === "boolean"
|
|
313
|
+
? { generalPurposeAgent: config.generalPurposeAgent }
|
|
314
|
+
: {}),
|
|
248
315
|
};
|
|
249
316
|
}
|
|
250
317
|
function readSharedAgentConfig(config) {
|
|
@@ -268,11 +335,11 @@ function readSharedAgentConfig(config) {
|
|
|
268
335
|
};
|
|
269
336
|
}
|
|
270
337
|
function readAgentConfig(item, options = {}) {
|
|
271
|
-
const config =
|
|
338
|
+
const config = readExecutionAgentConfig(item);
|
|
272
339
|
const passthrough = readPassthroughConfig(config, [...CONSUMED_AGENT_CONFIG_KEYS]);
|
|
273
340
|
return {
|
|
274
341
|
...readSharedAgentConfig(config),
|
|
275
|
-
...readSharedAgentConfigFields(config),
|
|
342
|
+
...readSharedAgentConfigFields(config, { includeDelegationControls: options.includeDelegationControls }),
|
|
276
343
|
...(options.includeObjectBackend && typeof config.backend === "object" && config.backend ? { backend: config.backend } : {}),
|
|
277
344
|
...(passthrough ? { passthrough } : {}),
|
|
278
345
|
};
|
|
@@ -286,7 +353,7 @@ export function parseAgentItem(item, sourcePath) {
|
|
|
286
353
|
return {
|
|
287
354
|
id: String(item.id),
|
|
288
355
|
executionMode: executionMode,
|
|
289
|
-
|
|
356
|
+
runtimeMemory: readRuntimeMemoryConfig(item, runtime),
|
|
290
357
|
capabilities: readCapabilities(item.capabilities) ?? (executionMode === "deepagent"
|
|
291
358
|
? { delegation: true, memory: true }
|
|
292
359
|
: { delegation: true, memory: true }),
|
|
@@ -299,8 +366,11 @@ export function parseAgentItem(item, sourcePath) {
|
|
|
299
366
|
memorySources: readExecutionValue(item, "memory", readPathArray).map((entry) => resolveModuleRelativePath(entry, moduleRoot)),
|
|
300
367
|
subagentRefs,
|
|
301
368
|
subagentPathRefs,
|
|
302
|
-
langchainAgentConfig: normalizeModuleAgentConfig(readAgentConfig(item), moduleRoot),
|
|
303
|
-
deepAgentConfig: normalizeModuleAgentConfig(readAgentConfig(item, {
|
|
369
|
+
langchainAgentConfig: normalizeModuleAgentConfig(readAgentConfig(item, { includeDelegationControls: true }), moduleRoot),
|
|
370
|
+
deepAgentConfig: normalizeModuleAgentConfig(readAgentConfig(item, {
|
|
371
|
+
includeObjectBackend: true,
|
|
372
|
+
includeDelegationControls: false,
|
|
373
|
+
}), moduleRoot),
|
|
304
374
|
sourcePath,
|
|
305
375
|
};
|
|
306
376
|
}
|
|
@@ -347,11 +417,12 @@ function mergeRawItemRecord(records, key, item, sourcePath) {
|
|
|
347
417
|
return mergedRecord;
|
|
348
418
|
}
|
|
349
419
|
function mergeAgentRecord(records, item, sourcePath) {
|
|
350
|
-
const
|
|
420
|
+
const normalizedItem = normalizeAgentItemForMerge(item);
|
|
421
|
+
const id = typeof normalizedItem.id === "string" ? normalizedItem.id : undefined;
|
|
351
422
|
if (!id) {
|
|
352
423
|
return null;
|
|
353
424
|
}
|
|
354
|
-
return mergeRawItemRecord(records, id,
|
|
425
|
+
return mergeRawItemRecord(records, id, normalizedItem, sourcePath);
|
|
355
426
|
}
|
|
356
427
|
function mergeWorkspaceObjectRecord(records, workspaceObject, item, sourcePath) {
|
|
357
428
|
mergeRawItemRecord(records, `${workspaceObject.kind}/${workspaceObject.id}`, item, sourcePath);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ParsedAgentObject,
|
|
1
|
+
import type { ParsedAgentObject, WorkspaceObject } from "../../contracts/types.js";
|
|
2
2
|
export type RoutingRule = {
|
|
3
3
|
agentId: string;
|
|
4
4
|
equals?: string[];
|
|
@@ -34,7 +34,6 @@ export type ResilienceConfig = {
|
|
|
34
34
|
export declare function getWorkspaceObject(refs: Map<string, WorkspaceObject | ParsedAgentObject>, ref: string | undefined): WorkspaceObject | undefined;
|
|
35
35
|
export declare function getRuntimeDefaults(refs: Map<string, WorkspaceObject | ParsedAgentObject>): Record<string, unknown> | undefined;
|
|
36
36
|
export declare function getRuntimeMemoryDefaults(refs: Map<string, WorkspaceObject | ParsedAgentObject>): Record<string, unknown> | undefined;
|
|
37
|
-
export declare function getRuntimeModelDefaults(refs: Map<string, WorkspaceObject | ParsedAgentObject>): RuntimeModelRefMap | undefined;
|
|
38
37
|
export declare function getRecoveryConfig(refs: Map<string, WorkspaceObject | ParsedAgentObject>): RecoveryConfig;
|
|
39
38
|
export declare function getConcurrencyConfig(refs: Map<string, WorkspaceObject | ParsedAgentObject>): ConcurrencyConfig;
|
|
40
39
|
export declare function getResilienceConfig(refs: Map<string, WorkspaceObject | ParsedAgentObject>): ResilienceConfig;
|
|
@@ -36,18 +36,6 @@ export function getRuntimeMemoryDefaults(refs) {
|
|
|
36
36
|
}
|
|
37
37
|
return runtimeMemories[0].value;
|
|
38
38
|
}
|
|
39
|
-
export function getRuntimeModelDefaults(refs) {
|
|
40
|
-
const runtimeDefaults = getRuntimeDefaults(refs);
|
|
41
|
-
const modelRefs = {
|
|
42
|
-
...(typeof runtimeDefaults?.planningModelRef === "string" && runtimeDefaults.planningModelRef.trim()
|
|
43
|
-
? { planning: runtimeDefaults.planningModelRef.trim() }
|
|
44
|
-
: {}),
|
|
45
|
-
...(typeof runtimeDefaults?.executionModelRef === "string" && runtimeDefaults.executionModelRef.trim()
|
|
46
|
-
? { execution: runtimeDefaults.executionModelRef.trim() }
|
|
47
|
-
: {}),
|
|
48
|
-
};
|
|
49
|
-
return Object.keys(modelRefs).length > 0 ? modelRefs : undefined;
|
|
50
|
-
}
|
|
51
39
|
export function getRecoveryConfig(refs) {
|
|
52
40
|
const runtimeDefaults = getRuntimeDefaults(refs);
|
|
53
41
|
const recovery = typeof runtimeDefaults?.recovery === "object" && runtimeDefaults.recovery
|