@botbotgo/agent-harness 0.0.110 → 0.0.111

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.
@@ -1 +1 @@
1
- export declare const AGENT_HARNESS_VERSION = "0.0.109";
1
+ export declare const AGENT_HARNESS_VERSION = "0.0.110";
@@ -1 +1 @@
1
- export const AGENT_HARNESS_VERSION = "0.0.109";
1
+ export const AGENT_HARNESS_VERSION = "0.0.110";
@@ -16,6 +16,8 @@ export function finalizeInvocationResult(params) {
16
16
  const outputContent = extractOutputContent(result);
17
17
  const contentBlocks = extractContentBlocks(result);
18
18
  const structuredResponse = result.structuredResponse;
19
+ const files = asRecord(result.files);
20
+ const stateSnapshot = buildStateSnapshot(result);
19
21
  return {
20
22
  threadId,
21
23
  runId,
@@ -32,8 +34,8 @@ export function finalizeInvocationResult(params) {
32
34
  ...(structuredResponse !== undefined ? { structuredResponse } : {}),
33
35
  ...(outputContent !== undefined ? { outputContent } : {}),
34
36
  ...(contentBlocks.length > 0 ? { contentBlocks } : {}),
35
- ...(asRecord(result.files) ? { files: asRecord(result.files) } : {}),
36
- ...(buildStateSnapshot(result) ? { stateSnapshot: buildStateSnapshot(result) } : {}),
37
+ ...(files ? { files } : {}),
38
+ ...(stateSnapshot ? { stateSnapshot } : {}),
37
39
  upstreamResult: result,
38
40
  },
39
41
  };
@@ -1,22 +1,19 @@
1
- import { getBindingExecutionView } from "../support/compiled-binding.js";
1
+ import { bindingHasLangChainSubagentSupport, bindingHasMiddlewareKind, getBindingToolCount, } from "../support/compiled-binding.js";
2
+ import { isRecord as isRecordValue } from "../../utils/object.js";
2
3
  export function countConfiguredTools(binding) {
3
- return getBindingExecutionView(binding).primaryTools.length;
4
+ return getBindingToolCount(binding);
4
5
  }
5
6
  export function sleep(ms) {
6
7
  return new Promise((resolve) => setTimeout(resolve, ms));
7
8
  }
8
9
  export function hasConfiguredSubagentSupport(binding) {
9
- const params = getBindingExecutionView(binding).langchainParams;
10
- if (!params) {
11
- return false;
12
- }
13
- return (params.subagents?.length ?? 0) > 0 || params.generalPurposeAgent === true || Boolean(params.taskDescription?.trim());
10
+ return bindingHasLangChainSubagentSupport(binding);
14
11
  }
15
12
  export function hasConfiguredMiddlewareKind(binding, kind) {
16
- return getBindingExecutionView(binding).middlewareConfigs?.some((entry) => entry.kind === kind) ?? false;
13
+ return bindingHasMiddlewareKind(binding, kind);
17
14
  }
18
15
  export function isRecord(value) {
19
- return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ return isRecordValue(value);
20
17
  }
21
18
  export function isObject(value) {
22
19
  return isRecord(value);
@@ -1,7 +1,5 @@
1
1
  import { salvageToolArgs } from "../../parsing/output-parsing.js";
2
- function isRecord(value) {
3
- return typeof value === "object" && value !== null && !Array.isArray(value);
4
- }
2
+ import { isRecord } from "../../../utils/object.js";
5
3
  function isObject(value) {
6
4
  return isRecord(value);
7
5
  }
@@ -9,8 +9,12 @@ export type BindingExecutionView = {
9
9
  primaryModel?: CompiledModel;
10
10
  systemPrompt?: string;
11
11
  middlewareConfigs?: Array<Record<string, unknown>>;
12
+ middlewareKinds: Set<string>;
12
13
  interruptCompatibilityRules?: Record<string, boolean | object>;
13
14
  storeConfig?: Record<string, unknown>;
15
+ toolCount: number;
16
+ langChainSubagentSupport: boolean;
17
+ deepAgentSubagentCount: number;
14
18
  };
15
19
  export declare function getBindingExecutionView(binding: CompiledAgentBinding): BindingExecutionView;
16
20
  export declare function getBindingAdapterKind(binding: CompiledAgentBinding): string;
@@ -24,6 +28,9 @@ export declare function getBindingPrimaryModel(binding: CompiledAgentBinding): C
24
28
  export declare function getBindingRuntimeModel(binding: CompiledAgentBinding, slot: RuntimeModelSlot): CompiledModel | undefined;
25
29
  export declare function getBindingSystemPrompt(binding: CompiledAgentBinding): string | undefined;
26
30
  export declare function getBindingMiddlewareConfigs(binding: CompiledAgentBinding): Array<Record<string, unknown>> | undefined;
31
+ export declare function getBindingToolCount(binding: CompiledAgentBinding): number;
32
+ export declare function bindingHasMiddlewareKind(binding: CompiledAgentBinding, kind: string): boolean;
33
+ export declare function bindingHasLangChainSubagentSupport(binding: CompiledAgentBinding): boolean;
27
34
  export declare function getBindingInterruptCompatibilityRules(binding: CompiledAgentBinding): Record<string, boolean | object> | undefined;
28
35
  export declare function getBindingModelInit(binding: CompiledAgentBinding): Record<string, unknown> | undefined;
29
36
  export declare function getBindingStoreConfig(binding: CompiledAgentBinding): Record<string, unknown> | undefined;
@@ -1,8 +1,4 @@
1
- function asRecord(value) {
2
- return typeof value === "object" && value !== null && !Array.isArray(value)
3
- ? value
4
- : undefined;
5
- }
1
+ import { asRecord } from "../../utils/object.js";
6
2
  const bindingExecutionViewCache = new WeakMap();
7
3
  function deriveBindingExecutionView(binding) {
8
4
  const cached = bindingExecutionViewCache.get(binding);
@@ -19,6 +15,10 @@ function deriveBindingExecutionView(binding) {
19
15
  ? adapterParams
20
16
  : binding.deepAgentParams;
21
17
  const primaryTools = langchainParams?.tools ?? deepAgentParams?.tools ?? [];
18
+ const middlewareConfigs = langchainParams?.middleware ?? deepAgentParams?.middleware;
19
+ const middlewareKinds = new Set((middlewareConfigs ?? [])
20
+ .map((entry) => typeof entry.kind === "string" ? entry.kind : "")
21
+ .filter(Boolean));
22
22
  const view = {
23
23
  adapterKind,
24
24
  adapterConfig,
@@ -26,12 +26,18 @@ function deriveBindingExecutionView(binding) {
26
26
  deepAgentParams,
27
27
  executionParams: langchainParams ?? deepAgentParams,
28
28
  primaryTools,
29
+ toolCount: primaryTools.length,
29
30
  primaryModel: langchainParams?.model ?? deepAgentParams?.model,
30
31
  systemPrompt: langchainParams?.systemPrompt ?? deepAgentParams?.systemPrompt,
31
- middlewareConfigs: langchainParams?.middleware ?? deepAgentParams?.middleware,
32
+ middlewareConfigs,
33
+ middlewareKinds,
32
34
  interruptCompatibilityRules: deepAgentParams?.interruptOn ??
33
35
  binding.agent.langchainAgentConfig?.interruptOn,
34
36
  storeConfig: deepAgentParams?.store ?? binding.harnessRuntime?.store,
37
+ langChainSubagentSupport: (langchainParams?.subagents?.length ?? 0) > 0 ||
38
+ langchainParams?.generalPurposeAgent === true ||
39
+ Boolean(langchainParams?.taskDescription?.trim()),
40
+ deepAgentSubagentCount: deepAgentParams?.subagents?.length ?? 0,
35
41
  };
36
42
  bindingExecutionViewCache.set(binding, view);
37
43
  return view;
@@ -72,6 +78,15 @@ export function getBindingSystemPrompt(binding) {
72
78
  export function getBindingMiddlewareConfigs(binding) {
73
79
  return getBindingExecutionView(binding).middlewareConfigs;
74
80
  }
81
+ export function getBindingToolCount(binding) {
82
+ return getBindingExecutionView(binding).toolCount;
83
+ }
84
+ export function bindingHasMiddlewareKind(binding, kind) {
85
+ return getBindingExecutionView(binding).middlewareKinds.has(kind);
86
+ }
87
+ export function bindingHasLangChainSubagentSupport(binding) {
88
+ return getBindingExecutionView(binding).langChainSubagentSupport;
89
+ }
75
90
  export function getBindingInterruptCompatibilityRules(binding) {
76
91
  return getBindingExecutionView(binding).interruptCompatibilityRules;
77
92
  }
@@ -82,5 +97,5 @@ export function getBindingStoreConfig(binding) {
82
97
  return getBindingExecutionView(binding).storeConfig;
83
98
  }
84
99
  export function bindingHasSubagents(binding) {
85
- return (getBindingDeepAgentParams(binding)?.subagents.length ?? 0) > 0;
100
+ return getBindingExecutionView(binding).deepAgentSubagentCount > 0;
86
101
  }
@@ -1,6 +1,7 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { parse } from "yaml";
4
+ import { isRecord } from "../../utils/object.js";
4
5
  const skillMetadataCache = new Map();
5
6
  const skillValidationCache = new Map();
6
7
  const SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
@@ -8,9 +9,6 @@ function parseFrontmatterSource(document) {
8
9
  const match = document.match(/^---\s*\n([\s\S]*?)\n---\s*(?:\n|$)/);
9
10
  return match?.[1];
10
11
  }
11
- function isRecord(value) {
12
- return typeof value === "object" && value !== null && !Array.isArray(value);
13
- }
14
12
  function isJsonLikeValue(value) {
15
13
  if (value === null ||
16
14
  typeof value === "string" ||
@@ -0,0 +1,3 @@
1
+ export type UnknownRecord = Record<string, unknown>;
2
+ export declare function isRecord(value: unknown): value is UnknownRecord;
3
+ export declare function asRecord(value: unknown): UnknownRecord | undefined;
@@ -0,0 +1,6 @@
1
+ export function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export function asRecord(value) {
5
+ return isRecord(value) ? value : undefined;
6
+ }
@@ -1,12 +1,21 @@
1
- function asRecord(value) {
2
- return typeof value === "object" && value !== null && !Array.isArray(value)
3
- ? value
4
- : undefined;
1
+ import { asRecord } from "../../utils/object.js";
2
+ const agentExecutionViewsCache = new WeakMap();
3
+ function deriveAgentExecutionViews(agent) {
4
+ const cached = agentExecutionViewsCache.get(agent);
5
+ if (cached) {
6
+ return cached;
7
+ }
8
+ const langchainConfig = asRecord(agent.langchainAgentConfig);
9
+ const deepAgentConfig = asRecord(agent.deepAgentConfig);
10
+ const views = {
11
+ "langchain-v1": [langchainConfig, deepAgentConfig].filter((config) => config !== undefined),
12
+ deepagent: [deepAgentConfig, langchainConfig].filter((config) => config !== undefined),
13
+ };
14
+ agentExecutionViewsCache.set(agent, views);
15
+ return views;
5
16
  }
6
17
  function getConfigsForMode(agent, executionMode = agent.executionMode) {
7
- const primary = executionMode === "deepagent" ? asRecord(agent.deepAgentConfig) : asRecord(agent.langchainAgentConfig);
8
- const fallback = executionMode === "deepagent" ? asRecord(agent.langchainAgentConfig) : asRecord(agent.deepAgentConfig);
9
- return [primary, fallback].filter((config) => config !== undefined);
18
+ return deriveAgentExecutionViews(agent)[executionMode];
10
19
  }
11
20
  export function getAgentExecutionConfigs(agent, executionMode = agent.executionMode) {
12
21
  return getConfigsForMode(agent, executionMode);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbotgo/agent-harness",
3
- "version": "0.0.110",
3
+ "version": "0.0.111",
4
4
  "description": "Workspace runtime for multi-agent applications",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.2",