@botbotgo/agent-harness 0.0.136 → 0.0.137

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 CHANGED
@@ -688,10 +688,8 @@ spec:
688
688
  subagents: []
689
689
  mcpServers: []
690
690
  config:
691
- checkpointer:
692
- ref: checkpointer/default
693
- store:
694
- ref: store/default
691
+ checkpointer: default
692
+ store: default
695
693
  interruptOn: {}
696
694
  filesystem:
697
695
  rootDir: .
@@ -722,12 +720,9 @@ spec:
722
720
  subagents: []
723
721
  mcpServers: []
724
722
  config:
725
- store:
726
- ref: store/default
727
- checkpointer:
728
- ref: checkpointer/default
729
- backend:
730
- ref: backend/default
723
+ store: default
724
+ checkpointer: default
725
+ backend: default
731
726
  interruptOn: {}
732
727
  middleware: []
733
728
  ```
package/README.zh.md CHANGED
@@ -677,10 +677,8 @@ spec:
677
677
  subagents: []
678
678
  mcpServers: []
679
679
  config:
680
- checkpointer:
681
- ref: checkpointer/default
682
- store:
683
- ref: store/default
680
+ checkpointer: default
681
+ store: default
684
682
  interruptOn: {}
685
683
  filesystem:
686
684
  rootDir: .
@@ -711,12 +709,9 @@ spec:
711
709
  subagents: []
712
710
  mcpServers: []
713
711
  config:
714
- store:
715
- ref: store/default
716
- checkpointer:
717
- ref: checkpointer/default
718
- backend:
719
- ref: backend/default
712
+ store: default
713
+ checkpointer: default
714
+ backend: default
720
715
  interruptOn: {}
721
716
  middleware: []
722
717
  ```
@@ -14,8 +14,7 @@ spec:
14
14
  # This matches the workspace default and keeps the default config shape explicit.
15
15
  runRoot: ./.agent
16
16
  # agent-harness feature: workspace-level durable long-term memory defaults for this host profile.
17
- runtimeMemory:
18
- ref: runtime-memory/default
17
+ runtimeMemory: default
19
18
  # =====================
20
19
  # Runtime Agent Features
21
20
  # =====================
@@ -39,12 +38,10 @@ spec:
39
38
  # Even the lightweight direct path can benefit from resumable state during interactive use.
40
39
  # Available `kind` options in this harness: `FileCheckpointer`, `MemorySaver`, `SqliteSaver`.
41
40
  # `path` is only used by `FileCheckpointer` and `SqliteSaver`; omit it for `MemorySaver`.
42
- checkpointer:
43
- ref: checkpointer/sqlite
41
+ checkpointer: sqlite
44
42
  # Upstream execution feature: LangGraph store available to middleware and runtime context hooks.
45
43
  # The default direct host keeps this enabled so middleware can use the same durable store surface as other hosts.
46
- store:
47
- ref: store/default
44
+ store: default
48
45
  # Upstream execution feature: no declarative HITL tool routing by default.
49
46
  interruptOn: {}
50
47
  # Upstream execution feature: filesystem middleware settings for LangChain v1 agents.
@@ -14,8 +14,7 @@ spec:
14
14
  # This matches the workspace default and keeps the default config shape explicit.
15
15
  runRoot: ./.agent
16
16
  # agent-harness feature: workspace-level durable long-term memory defaults for this host profile.
17
- runtimeMemory:
18
- ref: runtime-memory/default
17
+ runtimeMemory: default
19
18
  # =====================
20
19
  # Runtime Agent Features
21
20
  # =====================
@@ -46,14 +45,12 @@ spec:
46
45
  # This persists resumable graph state for this agent.
47
46
  # Available `kind` options in this harness: `FileCheckpointer`, `MemorySaver`, `SqliteSaver`.
48
47
  # `path` is only used by `FileCheckpointer` and `SqliteSaver`; omit it for `MemorySaver`.
49
- checkpointer:
50
- ref: checkpointer/sqlite
48
+ checkpointer: sqlite
51
49
  # Upstream execution feature: store config passed into the selected backend adapter.
52
50
  # In the default deepagent adapter this is the LangGraph store used by `StoreBackend` routes.
53
51
  # Built-in kinds in this harness today: `FileStore`, `InMemoryStore`.
54
52
  # Other store kinds should flow through a custom runtime resolver instead of being claimed as built in.
55
- store:
56
- ref: store/default
53
+ store: default
57
54
  # Upstream execution feature: backend config passed into the selected backend adapter.
58
55
  # Prefer a reusable backend preset via `ref` so backend topology stays declarative and reusable in YAML.
59
56
  # The default preset keeps DeepAgent execution semantics upstream-owned:
@@ -78,8 +75,7 @@ spec:
78
75
  config:
79
76
  # Upstream execution feature: backend config passed into the selected backend adapter.
80
77
  # Keep this nested under `config` because `backend` already selects the adapter mode.
81
- backend:
82
- ref: backend/default
78
+ backend: default
83
79
  # Upstream execution feature: system prompt for the orchestration host.
84
80
  # This becomes the top-level instruction block for the selected execution backend and should hold the
85
81
  # agent's durable role, priorities, and behavioral guardrails rather than bulky project facts.
@@ -1,5 +1,5 @@
1
1
  # agent-harness feature: schema version for reusable tool objects.
2
2
  apiVersion: agent-harness/v1alpha1
3
3
  # agent-harness feature: object type for named reusable tool presets.
4
- kind: Tools
4
+ kind: ToolSets
5
5
  spec: []
@@ -171,15 +171,14 @@ spec:
171
171
  function renderToolsYaml(options) {
172
172
  if (!options.withWebSearch) {
173
173
  return `apiVersion: agent-harness/v1alpha1
174
- kind: Tools
174
+ kind: ToolSets
175
175
  spec: []
176
176
  `;
177
177
  }
178
178
  return `apiVersion: agent-harness/v1alpha1
179
- kind: Tools
179
+ kind: ToolSets
180
180
  spec:
181
- - kind: Tool
182
- name: web-search
181
+ - name: web-search
183
182
  type: provider
184
183
  description: ${options.provider} web search tool for current research.
185
184
  providerTool:
@@ -191,7 +190,7 @@ spec:
191
190
  }
192
191
  function renderResearchAgentYaml(options) {
193
192
  const toolsBlock = options.withWebSearch ? " tools:\n - web-search\n" : " tools: []\n";
194
- const subagentsBlock = options.template === "deep-research" ? " subagents:\n - ref: agent/research-analyst\n" : " subagents: []\n";
193
+ const subagentsBlock = options.template === "deep-research" ? " subagents:\n - research-analyst\n" : " subagents: []\n";
195
194
  const prompt = options.withWebSearch
196
195
  ? "Break complex research requests into a clear plan, use web search when current information matters, and return a concise synthesis with sources and explicit uncertainty."
197
196
  : "Break complex research requests into a clear plan and return a concise synthesis with explicit assumptions and uncertainty.";
@@ -205,15 +204,13 @@ metadata:
205
204
  description: Host-facing research agent for investigating and synthesizing answers.
206
205
  spec:
207
206
  runtime:
208
- runtimeMemory:
209
- ref: runtime-memory/default
207
+ runtimeMemory: default
210
208
  backend: deepagent
211
209
  modelRef: model/default
212
210
  ${toolsBlock} skills:
213
211
  - deep-research
214
212
  ${subagentsBlock} config:
215
- backend:
216
- ref: backend/default
213
+ backend: default
217
214
  systemPrompt: ${prompt}${delegationLine}
218
215
  `;
219
216
  }
@@ -229,15 +226,13 @@ metadata:
229
226
  description: Analyst subagent for source gathering, comparison, and evidence extraction.
230
227
  spec:
231
228
  runtime:
232
- runtimeMemory:
233
- ref: runtime-memory/default
229
+ runtimeMemory: default
234
230
  backend: deepagent
235
231
  modelRef: model/default
236
232
  ${toolsBlock} skills:
237
233
  - deep-research
238
234
  config:
239
- backend:
240
- ref: backend/default
235
+ backend: default
241
236
  systemPrompt: ${prompt}
242
237
  `;
243
238
  }
@@ -1 +1 @@
1
- export declare const AGENT_HARNESS_VERSION = "0.0.135";
1
+ export declare const AGENT_HARNESS_VERSION = "0.0.136";
@@ -1 +1 @@
1
- export const AGENT_HARNESS_VERSION = "0.0.135";
1
+ export const AGENT_HARNESS_VERSION = "0.0.136";
@@ -131,7 +131,15 @@ function applyToolBindingOverrides(tool, binding) {
131
131
  ...(typeof overrides.description === "string" ? { description: overrides.description } : {}),
132
132
  ...(typeof overrides.implementationName === "string" ? { implementationName: overrides.implementationName } : {}),
133
133
  ...(typeof overrides.inputSchemaRef === "string" ? { inputSchemaRef: overrides.inputSchemaRef } : {}),
134
- ...(typeof overrides.embeddingModelRef === "string" ? { embeddingModelRef: overrides.embeddingModelRef } : {}),
134
+ ...(typeof overrides.embeddingModelRef === "string"
135
+ ? { embeddingModelRef: overrides.embeddingModelRef }
136
+ : typeof overrides.embeddingModel === "string"
137
+ ? {
138
+ embeddingModelRef: overrides.embeddingModel.startsWith("embedding-model/")
139
+ ? overrides.embeddingModel
140
+ : `embedding-model/${overrides.embeddingModel}`,
141
+ }
142
+ : {}),
135
143
  ...(typeof overrides.backendOperation === "string" ? { backendOperation: overrides.backendOperation } : {}),
136
144
  ...(typeof overrides.mcpRef === "string" ? { mcpRef: overrides.mcpRef } : {}),
137
145
  ...(typeof overrides.subprocess === "boolean" ? { subprocess: overrides.subprocess } : {}),
@@ -184,20 +184,21 @@ function validateToolNameConflicts(tools) {
184
184
  function resolveAgentSkillNames(agents, skillRegistry, skillCollectionRoots) {
185
185
  for (const agent of agents) {
186
186
  agent.skillPathRefs = agent.skillPathRefs.map((entry) => {
187
- const registered = skillRegistry.get(entry);
187
+ const normalizedEntry = entry.startsWith("skill/") ? entry.slice("skill/".length) : entry;
188
+ const registered = skillRegistry.get(normalizedEntry);
188
189
  if (registered) {
189
190
  return registered;
190
191
  }
191
- if (path.isAbsolute(entry) || entry.includes("/") || entry.startsWith("builtin://")) {
192
+ if (path.isAbsolute(entry) || entry.startsWith("builtin://") || entry.startsWith("resource://")) {
192
193
  return entry;
193
194
  }
194
195
  for (const skillsRoot of skillCollectionRoots) {
195
- const candidate = path.join(skillsRoot, entry);
196
+ const candidate = path.join(skillsRoot, normalizedEntry);
196
197
  if (existsSync(path.join(candidate, "SKILL.md"))) {
197
198
  return candidate;
198
199
  }
199
200
  }
200
- return entry;
201
+ return normalizedEntry;
201
202
  });
202
203
  }
203
204
  }
@@ -93,12 +93,30 @@ function readRefArray(items) {
93
93
  : undefined)
94
94
  .filter((item) => Boolean(item));
95
95
  }
96
+ function readPrefixedRefArray(items, prefix) {
97
+ return toArray(items)
98
+ .map((item) => {
99
+ if (typeof item === "string") {
100
+ const value = item.trim();
101
+ if (!value) {
102
+ return undefined;
103
+ }
104
+ return value.startsWith(`${prefix}/`) ? value : `${prefix}/${value}`;
105
+ }
106
+ if (typeof item === "object" && item && "ref" in item && typeof item.ref === "string") {
107
+ const value = String(item.ref).trim();
108
+ return value || undefined;
109
+ }
110
+ return undefined;
111
+ })
112
+ .filter((item) => Boolean(item));
113
+ }
96
114
  function normalizeToolUsageOverrides(value) {
97
115
  const record = asMutableObject(value);
98
116
  if (!record) {
99
117
  return undefined;
100
118
  }
101
- const directKeys = new Set(["config", "hitl", "retryable", "subprocess", "embeddingModelRef"]);
119
+ const directKeys = new Set(["config", "hitl", "retryable", "subprocess", "embeddingModel", "embeddingModelRef"]);
102
120
  const directOverrides = {};
103
121
  const configOverrides = {};
104
122
  for (const [key, entry] of Object.entries(record)) {
@@ -177,6 +195,20 @@ function readObjectArray(items) {
177
195
  .map((item) => ({ ...item }));
178
196
  return records.length > 0 ? records : undefined;
179
197
  }
198
+ function readMcpServerArray(items) {
199
+ const records = toArray(items)
200
+ .map((item) => {
201
+ if (typeof item === "string" && item.trim()) {
202
+ return { ref: item.startsWith("mcp/") ? item : `mcp/${item.trim()}` };
203
+ }
204
+ if (typeof item === "object" && item !== null && !Array.isArray(item)) {
205
+ return { ...item };
206
+ }
207
+ return undefined;
208
+ })
209
+ .filter((item) => Boolean(item));
210
+ return records.length > 0 ? records : undefined;
211
+ }
180
212
  function readCapabilities(value) {
181
213
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
182
214
  return undefined;
@@ -285,10 +317,24 @@ function readRuntimeConfig(item) {
285
317
  return asMutableObject(item.runtime);
286
318
  }
287
319
  function readRuntimeMemoryConfig(item, runtime) {
320
+ if (typeof runtime?.runtimeMemory === "string" && runtime.runtimeMemory.trim()) {
321
+ return {
322
+ ref: runtime.runtimeMemory.startsWith("runtime-memory/")
323
+ ? runtime.runtimeMemory
324
+ : `runtime-memory/${runtime.runtimeMemory.trim()}`,
325
+ };
326
+ }
288
327
  if (typeof runtime?.runtimeMemory === "object" && runtime.runtimeMemory && !Array.isArray(runtime.runtimeMemory)) {
289
328
  return cloneConfigValue(runtime.runtimeMemory);
290
329
  }
291
330
  const legacyExecutionConfig = readExecutionAgentConfig(item);
331
+ if (typeof legacyExecutionConfig.runtimeMemory === "string" && legacyExecutionConfig.runtimeMemory.trim()) {
332
+ return {
333
+ ref: legacyExecutionConfig.runtimeMemory.startsWith("runtime-memory/")
334
+ ? legacyExecutionConfig.runtimeMemory
335
+ : `runtime-memory/${legacyExecutionConfig.runtimeMemory.trim()}`,
336
+ };
337
+ }
292
338
  if (typeof legacyExecutionConfig.runtimeMemory === "object" &&
293
339
  legacyExecutionConfig.runtimeMemory &&
294
340
  !Array.isArray(legacyExecutionConfig.runtimeMemory)) {
@@ -382,14 +428,27 @@ function readSharedAgentConfigFields(config, options = {}) {
382
428
  }
383
429
  function readSharedAgentConfig(config) {
384
430
  const middleware = readMiddlewareArray(config.middleware);
431
+ const backend = typeof config.backend === "string" && config.backend.trim()
432
+ ? { ref: config.backend.startsWith("backend/") ? config.backend : `backend/${config.backend.trim()}` }
433
+ : typeof config.backend === "object" && config.backend
434
+ ? config.backend
435
+ : undefined;
436
+ const checkpointer = typeof config.checkpointer === "string" && config.checkpointer.trim()
437
+ ? { ref: config.checkpointer.startsWith("checkpointer/") ? config.checkpointer : `checkpointer/${config.checkpointer.trim()}` }
438
+ : (typeof config.checkpointer === "object" && config.checkpointer) || typeof config.checkpointer === "boolean"
439
+ ? config.checkpointer
440
+ : undefined;
441
+ const store = typeof config.store === "string" && config.store.trim()
442
+ ? { ref: config.store.startsWith("store/") ? config.store : `store/${config.store.trim()}` }
443
+ : typeof config.store === "object" && config.store
444
+ ? config.store
445
+ : undefined;
385
446
  return {
386
447
  ...((typeof config.systemPrompt === "string" && config.systemPrompt)
387
448
  || (typeof config.systemPrompt === "object" && config.systemPrompt && !Array.isArray(config.systemPrompt))
388
449
  ? { systemPrompt: cloneConfigValue(config.systemPrompt) }
389
450
  : {}),
390
- ...((typeof config.checkpointer === "object" && config.checkpointer) || typeof config.checkpointer === "boolean"
391
- ? { checkpointer: config.checkpointer }
392
- : {}),
451
+ ...(checkpointer !== undefined ? { checkpointer } : {}),
393
452
  ...(typeof config.interruptOn === "object" && config.interruptOn ? { interruptOn: config.interruptOn } : {}),
394
453
  ...(config.stateSchema !== undefined ? { stateSchema: config.stateSchema } : {}),
395
454
  ...(config.responseFormat !== undefined ? { responseFormat: config.responseFormat } : {}),
@@ -397,6 +456,8 @@ function readSharedAgentConfig(config) {
397
456
  ...(config.includeAgentName === "inline" ? { includeAgentName: "inline" } : {}),
398
457
  ...(config.version === "v1" || config.version === "v2" ? { version: config.version } : {}),
399
458
  ...(typeof config.filesystem === "object" && config.filesystem ? { filesystem: config.filesystem } : {}),
459
+ ...(backend ? { backend } : {}),
460
+ ...(store ? { store } : {}),
400
461
  ...(middleware ? { middleware } : {}),
401
462
  };
402
463
  }
@@ -406,7 +467,6 @@ function readAgentConfig(item, options = {}) {
406
467
  return {
407
468
  ...readSharedAgentConfig(config),
408
469
  ...readSharedAgentConfigFields(config, { includeDelegationControls: options.includeDelegationControls }),
409
- ...(options.includeObjectBackend && typeof config.backend === "object" && config.backend ? { backend: config.backend } : {}),
410
470
  ...(passthrough ? { passthrough } : {}),
411
471
  };
412
472
  }
@@ -415,7 +475,9 @@ export function parseAgentItem(item, sourcePath) {
415
475
  const moduleRoot = moduleRootForSourcePath(sourcePath, "agents");
416
476
  const subagentRefs = readExecutionValue(normalizedItem, "subagents", readRefArray);
417
477
  const toolBindings = readExecutionValue(normalizedItem, "tools", readToolBindingArray);
418
- const subagentPathRefs = readExecutionValue(normalizedItem, "subagents", readPathArray).map((entry) => resolveModuleRelativePath(entry, moduleRoot));
478
+ const subagentPathRefs = readExecutionValue(normalizedItem, "subagents", readPathArray)
479
+ .filter((entry) => path.isAbsolute(entry) || entry.startsWith("./") || entry.startsWith("../"))
480
+ .map((entry) => resolveModuleRelativePath(entry, moduleRoot));
419
481
  const executionMode = String(resolveExecutionBackend(normalizedItem) ?? "deepagent");
420
482
  const runtime = readRuntimeConfig(normalizedItem);
421
483
  return {
@@ -431,8 +493,8 @@ export function parseAgentItem(item, sourcePath) {
431
493
  toolRefs: toolBindings.map((binding) => binding.ref),
432
494
  toolBindings,
433
495
  inlineTools: undefined,
434
- mcpServers: readExecutionValue(normalizedItem, "mcpServers", readObjectArray),
435
- skillPathRefs: readExecutionValue(normalizedItem, "skills", readStringArray),
496
+ mcpServers: readExecutionValue(normalizedItem, "mcpServers", readMcpServerArray),
497
+ skillPathRefs: readExecutionValue(normalizedItem, "skills", (value) => readPrefixedRefArray(value, "skill")),
436
498
  memorySources: readExecutionValue(normalizedItem, "memory", readPathArray).map((entry) => resolveModuleRelativePath(entry, moduleRoot)),
437
499
  subagentRefs,
438
500
  subagentPathRefs,
@@ -220,7 +220,7 @@ export function parseToolObject(object) {
220
220
  const mcpServerConfig = mcp
221
221
  ? Object.fromEntries(Object.entries(mcp).filter(([key]) => key !== "ref" && key !== "serverRef" && key !== "tool"))
222
222
  : undefined;
223
- const bundleRefs = asRefArray(value.refs ?? value.bundle);
223
+ const bundleRefs = asRefArray(value.tools ?? value.refs ?? value.bundle);
224
224
  const inferredType = typeof value.type === "string"
225
225
  ? value.type
226
226
  : bundleRefs.length > 0
@@ -252,9 +252,11 @@ export function parseToolObject(object) {
252
252
  inputSchemaRef: typeof asObject(value.inputSchema)?.ref === "string" ? String(asObject(value.inputSchema)?.ref) : undefined,
253
253
  embeddingModelRef: typeof value.embeddingModelRef === "string"
254
254
  ? value.embeddingModelRef
255
- : typeof asObject(value.embeddingModel)?.ref === "string"
256
- ? String(asObject(value.embeddingModel)?.ref)
257
- : undefined,
255
+ : typeof value.embeddingModel === "string"
256
+ ? `embedding-model/${String(value.embeddingModel).trim()}`
257
+ : typeof asObject(value.embeddingModel)?.ref === "string"
258
+ ? String(asObject(value.embeddingModel)?.ref)
259
+ : undefined,
258
260
  backendOperation: typeof backend?.operation === "string"
259
261
  ? backend.operation
260
262
  : typeof value.operation === "string"
@@ -144,7 +144,7 @@ async function objectItemsFromDocument(document, sourcePath) {
144
144
  ? normalizeCatalogSpec(document)
145
145
  : catalogKind === "Backends"
146
146
  ? normalizeCatalogSpec(document, { defaultKind: "Backend" })
147
- : catalogKind === "Tools"
147
+ : catalogKind === "Tools" || catalogKind === "ToolSets"
148
148
  ? normalizeCatalogSpec(document, { defaultKind: "Tool" })
149
149
  : catalogKind === "McpServers"
150
150
  ? normalizeCatalogSpec(document, { defaultKind: "McpServer" })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbotgo/agent-harness",
3
- "version": "0.0.136",
3
+ "version": "0.0.137",
4
4
  "description": "Workspace runtime for multi-agent applications",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.2",