@botbotgo/agent-harness 0.0.111 → 0.0.112

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 (45) hide show
  1. package/README.md +0 -2
  2. package/README.zh.md +0 -2
  3. package/dist/config/agents/direct.yaml +58 -59
  4. package/dist/config/agents/orchestra.yaml +68 -70
  5. package/dist/contracts/core.d.ts +0 -2
  6. package/dist/contracts/runtime.d.ts +0 -17
  7. package/dist/contracts/workspace.d.ts +2 -7
  8. package/dist/init-project.js +10 -8
  9. package/dist/package-version.d.ts +1 -1
  10. package/dist/package-version.js +1 -1
  11. package/dist/persistence/file-store.d.ts +1 -5
  12. package/dist/persistence/file-store.js +1 -34
  13. package/dist/runtime/adapter/compat/deepagent-compat.d.ts +6 -0
  14. package/dist/runtime/adapter/compat/deepagent-compat.js +3 -0
  15. package/dist/runtime/adapter/{execution-context.d.ts → flow/execution-context.d.ts} +17 -3
  16. package/dist/runtime/adapter/{execution-context.js → flow/execution-context.js} +20 -2
  17. package/dist/runtime/adapter/flow/invocation-flow.d.ts +24 -0
  18. package/dist/runtime/adapter/flow/invocation-flow.js +42 -0
  19. package/dist/runtime/adapter/{invoke-runtime.d.ts → flow/invoke-runtime.d.ts} +3 -3
  20. package/dist/runtime/adapter/{invoke-runtime.js → flow/invoke-runtime.js} +1 -1
  21. package/dist/runtime/adapter/flow/runnable-assembly.d.ts +51 -0
  22. package/dist/runtime/adapter/flow/runnable-assembly.js +52 -0
  23. package/dist/runtime/adapter/{stream-runtime.d.ts → flow/stream-runtime.d.ts} +3 -3
  24. package/dist/runtime/adapter/{stream-runtime.js → flow/stream-runtime.js} +6 -6
  25. package/dist/runtime/adapter/middleware-assembly.d.ts +1 -1
  26. package/dist/runtime/adapter/middleware-assembly.js +5 -8
  27. package/dist/runtime/adapter/runnable-config.d.ts +0 -2
  28. package/dist/runtime/adapter/runnable-config.js +0 -2
  29. package/dist/runtime/adapter/runtime-adapter-support.d.ts +0 -7
  30. package/dist/runtime/adapter/runtime-adapter-support.js +1 -20
  31. package/dist/runtime/adapter/runtime-shell.js +1 -1
  32. package/dist/runtime/adapter/tool/builtin-middleware-tools.js +10 -9
  33. package/dist/runtime/adapter/tool-resolution.d.ts +1 -1
  34. package/dist/runtime/agent-runtime-adapter.d.ts +1 -1
  35. package/dist/runtime/agent-runtime-adapter.js +52 -81
  36. package/dist/runtime/harness/system/inventory.d.ts +2 -2
  37. package/dist/runtime/harness/system/inventory.js +5 -6
  38. package/dist/runtime/parsing/stream-event-parsing.js +2 -2
  39. package/dist/runtime/support/compiled-binding.d.ts +1 -2
  40. package/dist/runtime/support/compiled-binding.js +0 -3
  41. package/dist/workspace/agent-binding-compiler.js +2 -22
  42. package/dist/workspace/object-loader.js +94 -23
  43. package/dist/workspace/support/workspace-ref-utils.d.ts +1 -2
  44. package/dist/workspace/support/workspace-ref-utils.js +0 -12
  45. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
- import { buildExecutableToolMap } from "./tool-resolution.js";
2
- import { getBindingLangChainParams, getBindingPrimaryModel, getBindingPrimaryTools, isLangChainBinding } from "../support/compiled-binding.js";
1
+ import { buildExecutableToolMap } from "../tool-resolution.js";
2
+ import { getBindingLangChainParams, getBindingPrimaryModel, getBindingPrimaryTools, isLangChainBinding } from "../../support/compiled-binding.js";
3
3
  export function buildBindingToolCatalog(input) {
4
4
  const primaryTools = getBindingPrimaryTools(input.binding);
5
5
  const toolNameMapping = input.getToolNameMapping(input.binding);
@@ -50,3 +50,21 @@ export async function resolveLangChainStreamContext(input) {
50
50
  langChainStreamModel,
51
51
  };
52
52
  }
53
+ export async function resolveRuntimeStreamExecutionContext(input) {
54
+ const { primaryTools, toolNameMapping } = buildBindingToolCatalog({
55
+ binding: input.binding,
56
+ getToolNameMapping: input.getToolNameMapping,
57
+ });
58
+ const { forceInvokeFallback, canUseDirectModelStream, langChainStreamModel, } = await resolveLangChainStreamContext({
59
+ binding: input.binding,
60
+ resolveModel: input.resolveModel,
61
+ resolveTools: input.resolveTools,
62
+ });
63
+ return {
64
+ primaryTools,
65
+ toolNameMapping,
66
+ forceInvokeFallback,
67
+ canUseDirectModelStream,
68
+ langChainStreamModel,
69
+ };
70
+ }
@@ -0,0 +1,24 @@
1
+ import type { CompiledAgentBinding, CompiledTool, MessageContent, RunResult, TranscriptMessage } from "../../../contracts/types.js";
2
+ import { type ExecutableTool } from "./invoke-runtime.js";
3
+ import type { ToolNameMapping } from "../tool/tool-name-mapping.js";
4
+ export declare function executeRuntimeInvocation(options: {
5
+ binding: CompiledAgentBinding;
6
+ input: MessageContent;
7
+ threadId: string;
8
+ runId: string;
9
+ resumePayload?: unknown;
10
+ history?: TranscriptMessage[];
11
+ invokeOptions?: {
12
+ context?: Record<string, unknown>;
13
+ state?: Record<string, unknown>;
14
+ files?: Record<string, unknown>;
15
+ };
16
+ resolveTools: (tools: CompiledTool[], binding?: CompiledAgentBinding) => unknown[];
17
+ getToolNameMapping: (binding: CompiledAgentBinding) => ToolNameMapping;
18
+ resolveBuiltinMiddlewareTools: (binding: CompiledAgentBinding, options?: {
19
+ context?: Record<string, unknown>;
20
+ state?: Record<string, unknown>;
21
+ files?: Record<string, unknown>;
22
+ }) => Promise<Map<string, ExecutableTool>>;
23
+ callRuntimeWithToolParseRecovery: (request: unknown) => Promise<Record<string, unknown>>;
24
+ }): Promise<RunResult>;
@@ -0,0 +1,42 @@
1
+ import { Command } from "@langchain/langgraph";
2
+ import { buildBindingToolExecutionContext } from "./execution-context.js";
3
+ import { finalizeInvocationResult } from "../invocation-result.js";
4
+ import { invokeRuntimeWithLocalTools } from "./invoke-runtime.js";
5
+ import { buildInvocationRequest } from "../model/invocation-request.js";
6
+ export async function executeRuntimeInvocation(options) {
7
+ const history = options.history ?? [];
8
+ const invokeOptions = options.invokeOptions ?? {};
9
+ const request = options.resumePayload === undefined
10
+ ? buildInvocationRequest(options.binding, history, options.input, invokeOptions)
11
+ : new Command({ resume: options.resumePayload });
12
+ const { primaryTools, toolNameMapping, executableTools, defersToUpstreamHitlExecution, } = buildBindingToolExecutionContext({
13
+ binding: options.binding,
14
+ resolveTools: options.resolveTools,
15
+ getToolNameMapping: options.getToolNameMapping,
16
+ context: invokeOptions.context,
17
+ });
18
+ const builtinExecutableTools = await options.resolveBuiltinMiddlewareTools(options.binding, invokeOptions);
19
+ const localOrUpstreamInvocation = await invokeRuntimeWithLocalTools({
20
+ binding: options.binding,
21
+ request,
22
+ resumePayload: options.resumePayload,
23
+ primaryTools,
24
+ defersToUpstreamHitlExecution,
25
+ toolNameMapping,
26
+ executableTools,
27
+ builtinExecutableTools: builtinExecutableTools,
28
+ callRuntimeWithToolParseRecovery: options.callRuntimeWithToolParseRecovery,
29
+ });
30
+ const result = localOrUpstreamInvocation.result;
31
+ const executedToolResults = [...localOrUpstreamInvocation.executedToolResults];
32
+ if (!result) {
33
+ throw new Error("Agent invocation returned no result");
34
+ }
35
+ return finalizeInvocationResult({
36
+ bindingAgentId: options.binding.agent.id,
37
+ threadId: options.threadId,
38
+ runId: options.runId,
39
+ result,
40
+ executedToolResults,
41
+ });
42
+ }
@@ -1,6 +1,6 @@
1
- import type { CompiledAgentBinding, CompiledTool } from "../../contracts/types.js";
2
- import type { ExecutedToolResult } from "./invocation-result.js";
3
- import type { ToolNameMapping } from "./tool/tool-name-mapping.js";
1
+ import type { CompiledAgentBinding, CompiledTool } from "../../../contracts/types.js";
2
+ import type { ExecutedToolResult } from "../invocation-result.js";
3
+ import type { ToolNameMapping } from "../tool/tool-name-mapping.js";
4
4
  export type ExecutableTool = {
5
5
  name: string;
6
6
  schema: unknown;
@@ -1,4 +1,4 @@
1
- import { runLocalToolInvocationLoop } from "./local-tool-invocation.js";
1
+ import { runLocalToolInvocationLoop } from "../local-tool-invocation.js";
2
2
  export async function invokeRuntimeWithLocalTools(options) {
3
3
  if (options.resumePayload !== undefined || options.defersToUpstreamHitlExecution) {
4
4
  return {
@@ -0,0 +1,51 @@
1
+ import type { CompiledAgentBinding, CompiledModel, CompiledSubAgent, CompiledTool, DeepAgentParams, LangChainAgentParams, RuntimeAdapterOptions } from "../../../contracts/types.js";
2
+ export declare function resolveRunnableCheckpointer(options: RuntimeAdapterOptions, binding: CompiledAgentBinding): unknown;
3
+ export declare function resolveRunnableInterruptOn(binding: CompiledAgentBinding): Record<string, {
4
+ allowedDecisions: import("../tool/interrupt-policy.js").InterruptDecision[];
5
+ }> | undefined;
6
+ export declare function assembleLangChainRunnable(input: {
7
+ binding: CompiledAgentBinding;
8
+ runtimeAdapterOptions: RuntimeAdapterOptions;
9
+ passthroughOverride?: Record<string, unknown>;
10
+ systemPromptOverride?: string;
11
+ resolveModel: (model: CompiledModel) => Promise<unknown>;
12
+ resolveTools: (tools: CompiledTool[], binding?: CompiledAgentBinding) => unknown[];
13
+ resolveMiddleware: (binding: CompiledAgentBinding, interruptOn?: Record<string, {
14
+ allowedDecisions: Array<"approve" | "edit" | "reject">;
15
+ }>) => Promise<unknown[]>;
16
+ }): Promise<{
17
+ langchainParams: LangChainAgentParams;
18
+ interruptOn?: Record<string, {
19
+ allowedDecisions: Array<"approve" | "edit" | "reject">;
20
+ }>;
21
+ resolvedModel: unknown;
22
+ resolvedTools: unknown[];
23
+ resolvedMiddleware: unknown[];
24
+ resolvedCheckpointer: unknown;
25
+ resolvedStore: unknown;
26
+ passthroughOverride?: Record<string, unknown>;
27
+ systemPromptOverride?: string;
28
+ }>;
29
+ export declare function assembleDeepAgentRunnable(input: {
30
+ binding: CompiledAgentBinding;
31
+ runtimeAdapterOptions: RuntimeAdapterOptions;
32
+ resolveModel: (model: CompiledModel) => Promise<unknown>;
33
+ resolveTools: (tools: CompiledTool[], binding?: CompiledAgentBinding) => unknown[];
34
+ resolveMiddleware: (binding: CompiledAgentBinding, interruptOn?: Record<string, {
35
+ allowedDecisions: Array<"approve" | "edit" | "reject">;
36
+ }>) => Promise<unknown[]>;
37
+ resolveSubagents: (subagents: CompiledSubAgent[], binding?: CompiledAgentBinding) => Promise<CompiledSubAgent[]>;
38
+ }): Promise<{
39
+ compatibleParams: DeepAgentParams;
40
+ resolvedModel: unknown;
41
+ resolvedTools: unknown[];
42
+ resolvedMiddleware: unknown[];
43
+ resolvedSubagents: CompiledSubAgent[];
44
+ resolvedCheckpointer: unknown;
45
+ resolvedStore: unknown;
46
+ resolvedBackend: unknown;
47
+ resolvedInterruptOn?: Record<string, {
48
+ allowedDecisions: Array<"approve" | "edit" | "reject">;
49
+ }>;
50
+ resolvedSkills: string[];
51
+ }>;
@@ -0,0 +1,52 @@
1
+ import { MemorySaver } from "@langchain/langgraph";
2
+ import { applyDeepAgentDelegationPromptCompatibility, resolveDeepAgentSkillSourcePaths, } from "../compat/deepagent-compat.js";
3
+ import { compileInterruptOn } from "../tool/interrupt-policy.js";
4
+ import { getBindingDeepAgentParams, getBindingInterruptCompatibilityRules, getBindingLangChainParams, getBindingPrimaryTools, } from "../../support/compiled-binding.js";
5
+ export function resolveRunnableCheckpointer(options, binding) {
6
+ return options.checkpointerResolver ? options.checkpointerResolver(binding) : new MemorySaver();
7
+ }
8
+ export function resolveRunnableInterruptOn(binding) {
9
+ return compileInterruptOn(getBindingPrimaryTools(binding), getBindingInterruptCompatibilityRules(binding));
10
+ }
11
+ export async function assembleLangChainRunnable(input) {
12
+ const langchainParams = getBindingLangChainParams(input.binding);
13
+ if (!langchainParams) {
14
+ throw new Error(`Agent ${input.binding.agent.id} has no langchain params`);
15
+ }
16
+ const interruptOn = resolveRunnableInterruptOn(input.binding);
17
+ return {
18
+ langchainParams,
19
+ interruptOn,
20
+ resolvedModel: await input.resolveModel(langchainParams.model),
21
+ resolvedTools: input.resolveTools(langchainParams.tools, input.binding),
22
+ resolvedMiddleware: await input.resolveMiddleware(input.binding, interruptOn),
23
+ resolvedCheckpointer: resolveRunnableCheckpointer(input.runtimeAdapterOptions, input.binding),
24
+ resolvedStore: input.runtimeAdapterOptions.storeResolver?.(input.binding),
25
+ passthroughOverride: input.passthroughOverride,
26
+ systemPromptOverride: input.systemPromptOverride,
27
+ };
28
+ }
29
+ export async function assembleDeepAgentRunnable(input) {
30
+ const deepAgentParams = getBindingDeepAgentParams(input.binding);
31
+ if (!deepAgentParams) {
32
+ throw new Error(`Agent ${input.binding.agent.id} has no runnable params`);
33
+ }
34
+ const compatibleParams = applyDeepAgentDelegationPromptCompatibility(deepAgentParams.model, deepAgentParams);
35
+ return {
36
+ compatibleParams,
37
+ resolvedModel: await input.resolveModel(compatibleParams.model),
38
+ resolvedTools: input.resolveTools(compatibleParams.tools, input.binding),
39
+ resolvedMiddleware: await input.resolveMiddleware(input.binding),
40
+ resolvedSubagents: await input.resolveSubagents(compatibleParams.subagents, input.binding),
41
+ resolvedCheckpointer: resolveRunnableCheckpointer(input.runtimeAdapterOptions, input.binding),
42
+ resolvedStore: input.runtimeAdapterOptions.storeResolver?.(input.binding),
43
+ resolvedBackend: input.runtimeAdapterOptions.backendResolver?.(input.binding),
44
+ resolvedInterruptOn: resolveRunnableInterruptOn(input.binding),
45
+ resolvedSkills: resolveDeepAgentSkillSourcePaths({
46
+ workspaceRoot: input.binding.harnessRuntime.workspaceRoot,
47
+ runRoot: input.binding.harnessRuntime.runRoot,
48
+ ownerId: input.binding.agent.id,
49
+ skillPaths: compatibleParams.skills,
50
+ }) ?? [],
51
+ };
52
+ }
@@ -1,6 +1,6 @@
1
- import type { CompiledAgentBinding, CompiledTool, MessageContent, TranscriptMessage } from "../../contracts/types.js";
2
- import type { RuntimeStreamChunk } from "../parsing/stream-event-parsing.js";
3
- import type { ToolNameMapping } from "./tool/tool-name-mapping.js";
1
+ import type { CompiledAgentBinding, CompiledTool, MessageContent, TranscriptMessage } from "../../../contracts/types.js";
2
+ import type { RuntimeStreamChunk } from "../../parsing/stream-event-parsing.js";
3
+ import type { ToolNameMapping } from "../tool/tool-name-mapping.js";
4
4
  type RunnableLike = {
5
5
  stream?: (input: unknown, config?: Record<string, unknown>) => Promise<AsyncIterable<unknown>>;
6
6
  streamEvents?: (input: unknown, config?: Record<string, unknown>) => Promise<AsyncIterable<unknown>>;
@@ -1,9 +1,9 @@
1
- import { isToolCallParseFailure, sanitizeVisibleText, } from "../parsing/output-parsing.js";
2
- import { buildInvocationRequest } from "./model/invocation-request.js";
3
- import { buildRawModelMessages } from "./model/message-assembly.js";
4
- import { projectRuntimeStreamEvent, createStreamEventProjectionState } from "./stream-event-projection.js";
5
- import { projectTextStreamChunks } from "./stream-text-consumption.js";
6
- import { computeRemainingTimeoutMs } from "./resilience.js";
1
+ import { isToolCallParseFailure, sanitizeVisibleText, } from "../../parsing/output-parsing.js";
2
+ import { buildInvocationRequest } from "../model/invocation-request.js";
3
+ import { buildRawModelMessages } from "../model/message-assembly.js";
4
+ import { projectRuntimeStreamEvent, createStreamEventProjectionState } from "../stream-event-projection.js";
5
+ import { projectTextStreamChunks } from "../stream-text-consumption.js";
6
+ import { computeRemainingTimeoutMs } from "../resilience.js";
7
7
  export async function* streamRuntimeExecution(options) {
8
8
  const request = buildInvocationRequest(options.binding, options.history, options.input, options.runtimeOptions);
9
9
  try {
@@ -1,6 +1,6 @@
1
1
  import { FilesystemBackend } from "deepagents";
2
2
  import type { CompiledAgentBinding, CompiledModel, CompiledSubAgent, DeepAgentParams, RuntimeAdapterOptions } from "../../contracts/types.js";
3
- import type { ExecutableTool } from "./invoke-runtime.js";
3
+ import type { ExecutableTool } from "./flow/invoke-runtime.js";
4
4
  export declare function resolveBuiltinMiddlewareBackend(input: {
5
5
  binding: CompiledAgentBinding;
6
6
  runtimeAdapterOptions: RuntimeAdapterOptions;
@@ -4,9 +4,9 @@ import { createAgent, humanInTheLoopMiddleware } from "langchain";
4
4
  import { createBuiltinMiddlewareTools } from "./tool/builtin-middleware-tools.js";
5
5
  import { compileInterruptOn } from "./tool/interrupt-policy.js";
6
6
  import { extractToolFallbackContext, extractVisibleOutput } from "../parsing/output-parsing.js";
7
- import { hasConfiguredMiddlewareKind, hasConfiguredSubagentSupport, isRecord } from "./runtime-adapter-support.js";
7
+ import { isRecord } from "../../utils/object.js";
8
8
  import { resolveDeclaredMiddleware } from "./tool/declared-middleware.js";
9
- import { getBindingDeepAgentParams, getBindingInterruptCompatibilityRules, getBindingLangChainParams, getBindingMiddlewareConfigs, getBindingPrimaryModel, isDeepAgentBinding, isLangChainBinding, } from "../support/compiled-binding.js";
9
+ import { bindingHasLangChainSubagentSupport, bindingHasMiddlewareKind, getBindingDeepAgentParams, getBindingInterruptCompatibilityRules, getBindingLangChainParams, getBindingMiddlewareConfigs, getBindingPrimaryModel, isDeepAgentBinding, isLangChainBinding, } from "../support/compiled-binding.js";
10
10
  import { applyDeepAgentDelegationPromptCompatibility, materializeDeepAgentSkillSourcePaths } from "./compat/deepagent-compat.js";
11
11
  function buildLangChainContextMiddleware(params) {
12
12
  const middleware = [];
@@ -83,10 +83,7 @@ export async function invokeBuiltinTaskTool(input) {
83
83
  const resolvedSubagents = await input.resolveSubagents(params.subagents, input.binding);
84
84
  const selectedSubagent = resolvedSubagents.find((subagent) => subagent.name === subagentType);
85
85
  if (!selectedSubagent) {
86
- const allowed = [
87
- ...resolvedSubagents.map((subagent) => subagent.name),
88
- ...(params.generalPurposeAgent ? ["general-purpose"] : []),
89
- ];
86
+ const allowed = resolvedSubagents.map((subagent) => subagent.name);
90
87
  throw new Error(`Error: invoked agent of type ${subagentType}, the only allowed types are ${allowed.map((name) => `\`${name}\``).join(", ")}`);
91
88
  }
92
89
  const summarizationModel = selectedSubagent.model
@@ -138,7 +135,7 @@ export async function resolveBuiltinMiddlewareTools(input) {
138
135
  });
139
136
  }
140
137
  export async function resolveAutomaticSummarizationMiddleware(input) {
141
- if (hasConfiguredMiddlewareKind(input.binding, "summarization")) {
138
+ if (bindingHasMiddlewareKind(input.binding, "summarization")) {
142
139
  return [];
143
140
  }
144
141
  const primaryModel = getBindingPrimaryModel(input.binding);
@@ -161,7 +158,7 @@ export async function resolveLangChainAutomaticMiddleware(input) {
161
158
  compatibleParams,
162
159
  resolveFilesystemBackend: input.resolveFilesystemBackend,
163
160
  }));
164
- if (hasConfiguredSubagentSupport(input.binding)) {
161
+ if (bindingHasLangChainSubagentSupport(input.binding)) {
165
162
  automaticMiddleware.push(createSubAgentMiddleware({
166
163
  defaultModel: (await input.resolveModel(compatibleParams.model)),
167
164
  defaultTools: input.resolveTools(compatibleParams.tools, input.binding),
@@ -33,8 +33,6 @@ type DeepAgentRunnableConfigParams = {
33
33
  contextSchema?: unknown;
34
34
  name?: unknown;
35
35
  memory?: unknown;
36
- generalPurposeAgent?: unknown;
37
- taskDescription?: unknown;
38
36
  };
39
37
  resolvedModel: unknown;
40
38
  resolvedTools: unknown[];
@@ -45,8 +45,6 @@ export function buildDeepAgentRunnableConfig(params) {
45
45
  name: compatibleParams.name,
46
46
  memory: compatibleParams.memory,
47
47
  skills: resolvedSkills,
48
- generalPurposeAgent: compatibleParams.generalPurposeAgent,
49
- taskDescription: compatibleParams.taskDescription,
50
48
  },
51
49
  resolved: {
52
50
  resolvedModel,
@@ -1,10 +1,3 @@
1
- import type { CompiledAgentBinding } from "../../contracts/types.js";
2
- export declare function countConfiguredTools(binding: CompiledAgentBinding): number;
3
- export declare function sleep(ms: number): Promise<void>;
4
- export declare function hasConfiguredSubagentSupport(binding: CompiledAgentBinding): boolean;
5
- export declare function hasConfiguredMiddlewareKind(binding: CompiledAgentBinding, kind: string): boolean;
6
- export declare function isRecord(value: unknown): value is Record<string, unknown>;
7
- export declare function isObject(value: unknown): value is Record<string, unknown>;
8
1
  export declare function truncateLines(lines: string[], maxChars?: number): string;
9
2
  export declare function summarizeBuiltinWriteTodosArgs(args: Record<string, unknown>): {
10
3
  total: number;
@@ -1,23 +1,4 @@
1
- import { bindingHasLangChainSubagentSupport, bindingHasMiddlewareKind, getBindingToolCount, } from "../support/compiled-binding.js";
2
- import { isRecord as isRecordValue } from "../../utils/object.js";
3
- export function countConfiguredTools(binding) {
4
- return getBindingToolCount(binding);
5
- }
6
- export function sleep(ms) {
7
- return new Promise((resolve) => setTimeout(resolve, ms));
8
- }
9
- export function hasConfiguredSubagentSupport(binding) {
10
- return bindingHasLangChainSubagentSupport(binding);
11
- }
12
- export function hasConfiguredMiddlewareKind(binding, kind) {
13
- return bindingHasMiddlewareKind(binding, kind);
14
- }
15
- export function isRecord(value) {
16
- return isRecordValue(value);
17
- }
18
- export function isObject(value) {
19
- return isRecord(value);
20
- }
1
+ import { isRecord } from "../../utils/object.js";
21
2
  export function truncateLines(lines, maxChars = 12_000) {
22
3
  const joined = lines.join("\n");
23
4
  if (joined.length <= maxChars) {
@@ -1,7 +1,7 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
1
2
  import { extractVisibleOutput, isToolCallParseFailure, STRICT_TOOL_JSON_INSTRUCTION } from "../parsing/output-parsing.js";
2
3
  import { readStreamDelta } from "../parsing/stream-event-parsing.js";
3
4
  import { computeRemainingTimeoutMs, isRetryableProviderError, resolveProviderRetryPolicy } from "./resilience.js";
4
- import { sleep } from "./runtime-adapter-support.js";
5
5
  import { getBindingDeepAgentParams, getBindingLangChainParams, isDeepAgentBinding, isLangChainBinding, } from "../support/compiled-binding.js";
6
6
  export class RuntimeOperationTimeoutError extends Error {
7
7
  operation;
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { isSandboxBackend } from "deepagents";
3
- import { summarizeBuiltinWriteTodosArgs, truncateLines, isObject } from "../runtime-adapter-support.js";
3
+ import { isRecord } from "../../../utils/object.js";
4
+ import { summarizeBuiltinWriteTodosArgs, truncateLines } from "../runtime-adapter-support.js";
4
5
  export async function createBuiltinMiddlewareTools(backend, options) {
5
6
  const tools = new Map();
6
7
  tools.set("write_todos", {
@@ -9,7 +10,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
9
10
  todos: z.array(z.object({}).passthrough()).optional(),
10
11
  }).passthrough(),
11
12
  invoke: async (input) => {
12
- const args = isObject(input) ? input : {};
13
+ const args = isRecord(input) ? input : {};
13
14
  const summary = summarizeBuiltinWriteTodosArgs(args);
14
15
  return {
15
16
  ok: true,
@@ -23,7 +24,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
23
24
  name: "ls",
24
25
  schema: z.object({ path: z.string().optional().default("/") }).passthrough(),
25
26
  invoke: async (input) => {
26
- const targetPath = isObject(input) && typeof input.path === "string" ? input.path : "/";
27
+ const targetPath = isRecord(input) && typeof input.path === "string" ? input.path : "/";
27
28
  const infos = (await Promise.resolve(backend.lsInfo?.(targetPath))) ?? [];
28
29
  if (infos.length === 0) {
29
30
  return `No files found in ${targetPath}`;
@@ -39,7 +40,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
39
40
  limit: z.number().optional(),
40
41
  }).passthrough(),
41
42
  invoke: async (input) => {
42
- const typed = isObject(input) ? input : {};
43
+ const typed = isRecord(input) ? input : {};
43
44
  const filePath = typeof typed.file_path === "string" ? typed.file_path : "";
44
45
  const offset = typeof typed.offset === "number" ? typed.offset : 0;
45
46
  const limit = typeof typed.limit === "number" ? typed.limit : 500;
@@ -50,7 +51,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
50
51
  name: "write_file",
51
52
  schema: z.object({ file_path: z.string(), content: z.string().optional() }).passthrough(),
52
53
  invoke: async (input) => {
53
- const typed = isObject(input) ? input : {};
54
+ const typed = isRecord(input) ? input : {};
54
55
  const result = await Promise.resolve(backend.write?.(typeof typed.file_path === "string" ? typed.file_path : "", typeof typed.content === "string" ? typed.content : ""));
55
56
  return result?.error ?? `Successfully wrote to '${result?.path ?? (typed.file_path ?? "")}'`;
56
57
  },
@@ -64,7 +65,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
64
65
  replace_all: z.boolean().optional(),
65
66
  }).passthrough(),
66
67
  invoke: async (input) => {
67
- const typed = isObject(input) ? input : {};
68
+ const typed = isRecord(input) ? input : {};
68
69
  const result = await Promise.resolve(backend.edit?.(typeof typed.file_path === "string" ? typed.file_path : "", typeof typed.old_string === "string" ? typed.old_string : "", typeof typed.new_string === "string" ? typed.new_string : "", typed.replace_all === true));
69
70
  return result?.error ?? `Successfully replaced ${result?.occurrences ?? 0} occurrence(s) in '${result?.path ?? (typed.file_path ?? "")}'`;
70
71
  },
@@ -73,7 +74,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
73
74
  name: "glob",
74
75
  schema: z.object({ pattern: z.string(), path: z.string().optional().default("/") }).passthrough(),
75
76
  invoke: async (input) => {
76
- const typed = isObject(input) ? input : {};
77
+ const typed = isRecord(input) ? input : {};
77
78
  const pattern = typeof typed.pattern === "string" ? typed.pattern : "";
78
79
  const targetPath = typeof typed.path === "string" ? typed.path : "/";
79
80
  const infos = (await Promise.resolve(backend.globInfo?.(pattern, targetPath))) ?? [];
@@ -91,7 +92,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
91
92
  glob: z.string().nullable().optional(),
92
93
  }).passthrough(),
93
94
  invoke: async (input) => {
94
- const typed = isObject(input) ? input : {};
95
+ const typed = isRecord(input) ? input : {};
95
96
  const result = await Promise.resolve(backend.grepRaw?.(typeof typed.pattern === "string" ? typed.pattern : "", typeof typed.path === "string" ? typed.path : "/", typeof typed.glob === "string" ? typed.glob : null));
96
97
  if (typeof result === "string") {
97
98
  return result;
@@ -118,7 +119,7 @@ export async function createBuiltinMiddlewareTools(backend, options) {
118
119
  if (!isSandboxBackend(backend) || typeof backend.execute !== "function") {
119
120
  return "Error: Execution not available. This agent's backend does not support command execution (SandboxBackendProtocol).";
120
121
  }
121
- const typed = isObject(input) ? input : {};
122
+ const typed = isRecord(input) ? input : {};
122
123
  const result = await Promise.resolve(backend.execute(typeof typed.command === "string" ? typed.command : ""));
123
124
  const parts = [result.output];
124
125
  if (result.exitCode !== null) {
@@ -1,6 +1,6 @@
1
1
  import type { CompiledAgentBinding, CompiledTool } from "../../contracts/types.js";
2
2
  import { type ToolNameMapping } from "./tool/tool-name-mapping.js";
3
- import type { ExecutableTool } from "./invoke-runtime.js";
3
+ import type { ExecutableTool } from "./flow/invoke-runtime.js";
4
4
  export declare function resolveAdapterTools(input: {
5
5
  tools: Array<CompiledTool>;
6
6
  binding?: CompiledAgentBinding;
@@ -1,7 +1,7 @@
1
1
  import type { CompiledAgentBinding, MessageContent, RunResult, RuntimeAdapterOptions, TranscriptMessage } from "../contracts/types.js";
2
2
  import { type RuntimeStreamChunk } from "./parsing/stream-event-parsing.js";
3
3
  import { RuntimeOperationTimeoutError } from "./adapter/runtime-shell.js";
4
- export { applyDeepAgentDelegationPromptCompatibility, materializeDeepAgentSkillSourcePaths, relativizeDeepAgentSkillSourcePaths, shouldRelaxDeepAgentDelegationPrompt, } from "./adapter/compat/deepagent-compat.js";
4
+ export { applyDeepAgentDelegationPromptCompatibility, materializeDeepAgentSkillSourcePaths, resolveDeepAgentSkillSourcePaths, relativizeDeepAgentSkillSourcePaths, shouldRelaxDeepAgentDelegationPrompt, } from "./adapter/compat/deepagent-compat.js";
5
5
  export { buildAuthOmittingFetch, normalizeOpenAICompatibleInit } from "./adapter/compat/openai-compatible.js";
6
6
  export { buildToolNameMapping, createModelFacingToolNameCandidates, createModelFacingToolNameLookupCandidates, resolveModelFacingToolName, sanitizeToolNameForModel, } from "./adapter/tool/tool-name-mapping.js";
7
7
  export { computeRemainingTimeoutMs, isRetryableProviderError, resolveBindingTimeout, resolveProviderRetryPolicy, resolveStreamIdleTimeout, resolveTimeoutMs, } from "./adapter/resilience.js";