@botbotgo/agent-harness 0.0.283 → 0.0.284

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.
@@ -10,9 +10,6 @@ metadata:
10
10
  description: Manual low-latency host for direct answers and lightweight inventory lookup. Do not use it as the default executor for tool-heavy or delegation-heavy tasks.
11
11
  spec:
12
12
  runtime:
13
- # agent-harness feature: host-level run data placement override.
14
- # This matches the workspace default and keeps the default config shape explicit.
15
- runRoot: ./.agent
16
13
  # agent-harness feature: workspace-level durable long-term memory defaults for this host profile.
17
14
  runtimeMemory: default
18
15
  # =====================
@@ -10,9 +10,6 @@ metadata:
10
10
  description: Default execution host. Answer directly when possible, use local tools and skills first, and delegate only when a subagent is a better fit. Not a reflex delegation-only orchestrator.
11
11
  spec:
12
12
  runtime:
13
- # agent-harness feature: host-level run data placement override.
14
- # This matches the workspace default and keeps the default config shape explicit.
15
- runRoot: ./.agent
16
13
  # agent-harness feature: workspace-level durable long-term memory defaults for this host profile.
17
14
  runtimeMemory: default
18
15
  # =====================
@@ -15,4 +15,4 @@ spec:
15
15
  name: default
16
16
  description: Default file-backed checkpointer preset for durable local graph state without native sqlite bindings.
17
17
  checkpointerKind: FileCheckpointer
18
- path: checkpoints.json
18
+ path: runtime/checkpoints.json
@@ -13,7 +13,7 @@ spec:
13
13
  storeKind: LibSQLVectorStore
14
14
  # LangChain aligned feature: libSQL connection URL.
15
15
  # Local SQLite files use the `file:` prefix.
16
- url: file:.agent/knowledge/vectors.sqlite
16
+ url: file:knowledge/vectors.sqlite
17
17
  # LangChain aligned feature: target table and embedding column.
18
18
  table: rag_chunks
19
19
  column: embedding
@@ -12,15 +12,22 @@ spec:
12
12
  # ======================
13
13
  # agent-harness Features
14
14
  # ======================
15
- # agent-harness feature: filesystem root where the harness stores local run artifacts by default.
16
- # This affects file-backed persistence such as:
17
- # - session / thread / run indexes
18
- # - approval and delegation records
19
- # - default file-backed store paths
20
- # - default file-backed checkpointer paths
21
- # Agents inherit this value unless they override `spec.runRoot` locally.
22
- # Value options: relative workspace path like `./.agent`, or an absolute filesystem path.
23
- runRoot: ./.agent
15
+ # agent-harness feature: read-only application folder that contains the shared workspace assembly.
16
+ # This is where the runtime loads config catalogs and packaged resources such as:
17
+ # - config/
18
+ # - resources/
19
+ # Downstream applications can point multiple runtime profiles at the same application folder.
20
+ applicationRoot: .
21
+
22
+ # agent-harness feature: writable data folder for one runtime profile.
23
+ # Runtime-owned persistence stays under this root, split by function:
24
+ # - runtime/ for requests, approvals, checkpoints, and artifacts
25
+ # - knowledge/ for durable knowledge and vector indexes
26
+ # Different runtime profiles can use different data folders while sharing the same application folder.
27
+ dataRoot: ./.agent
28
+
29
+ # agent-harness feature: stable runtime profile identifier for this data folder.
30
+ profile: default
24
31
 
25
32
  # agent-harness feature: runtime-level task queue and maximum number of concurrent runs.
26
33
  # Additional runs wait in the harness queue until a slot becomes available.
@@ -7,6 +7,9 @@ export type ParsedAgentObject = {
7
7
  description: string;
8
8
  modelRef: string;
9
9
  runRoot?: string;
10
+ applicationRoot?: string;
11
+ dataRoot?: string;
12
+ runtimeProfile?: string;
10
13
  toolRefs: string[];
11
14
  toolBindings?: ParsedAgentToolBinding[];
12
15
  inlineTools?: ParsedToolObject[];
@@ -260,6 +263,9 @@ export type CompiledAgentBinding = {
260
263
  */
261
264
  deepAgentParams?: LegacyDeepAgentParams;
262
265
  harnessRuntime: {
266
+ applicationRoot?: string;
267
+ dataRoot?: string;
268
+ runtimeProfile?: string;
263
269
  runRoot: string;
264
270
  workspaceRoot?: string;
265
271
  capabilities?: RuntimeCapabilities;
@@ -93,7 +93,9 @@ kind: Runtime
93
93
  metadata:
94
94
  name: default
95
95
  spec:
96
- runRoot: ./.agent
96
+ applicationRoot: .
97
+ dataRoot: ./.agent
98
+ profile: default
97
99
  `;
98
100
  }
99
101
  function renderAgentContext(options) {
@@ -1 +1 @@
1
- export declare const AGENT_HARNESS_VERSION = "0.0.282";
1
+ export declare const AGENT_HARNESS_VERSION = "0.0.283";
@@ -1 +1 @@
1
- export const AGENT_HARNESS_VERSION = "0.0.282";
1
+ export const AGENT_HARNESS_VERSION = "0.0.283";
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { mkdir, rm } from "node:fs/promises";
3
3
  import { createClient } from "@libsql/client";
4
4
  import { fileExists, readJson, writeJson } from "../utils/fs.js";
5
+ import { resolveRuntimeRoot, resolveRuntimeSqlitePath } from "../runtime/support/runtime-layout.js";
5
6
  import { SqliteRunContextStore } from "./sqlite-run-context-store.js";
6
7
  import { SqliteRunQueueStore } from "./sqlite-run-queue-store.js";
7
8
  const RUNTIME_SQLITE_SCHEMA_VERSION = 6;
@@ -97,7 +98,9 @@ export class SqlitePersistence {
97
98
  initialization = null;
98
99
  constructor(runRoot, dbFile = "runtime.sqlite") {
99
100
  this.runRoot = runRoot;
100
- this.dbPath = path.join(runRoot, dbFile);
101
+ this.dbPath = dbFile === "runtime.sqlite"
102
+ ? resolveRuntimeSqlitePath(runRoot)
103
+ : path.join(resolveRuntimeRoot(runRoot), dbFile);
101
104
  this.runContextStore = new SqliteRunContextStore({
102
105
  execute: (sql, args) => this.execute(sql, args),
103
106
  selectOne: (sql, args) => this.selectOne(sql, args),
@@ -148,7 +151,7 @@ export class SqlitePersistence {
148
151
  return;
149
152
  }
150
153
  this.initialization = (async () => {
151
- await mkdir(this.runRoot, { recursive: true });
154
+ await mkdir(resolveRuntimeRoot(this.runRoot), { recursive: true });
152
155
  await this.getClient();
153
156
  await this.rawExecute("PRAGMA journal_mode=WAL");
154
157
  await this.rawExecute("PRAGMA foreign_keys=ON");
@@ -62,7 +62,7 @@ export function readMem0RuntimeConfig(runtimeMemory, workspaceRoot) {
62
62
  projectId: asNonEmptyString(mem0.projectId),
63
63
  appId: asNonEmptyString(mem0.appId) ?? workspaceBaseName,
64
64
  userIdPrefix: asNonEmptyString(mem0.userIdPrefix),
65
- stateStorePath: asNonEmptyString(mem0.stateStorePath) ?? "mem0-sync-state.json",
65
+ stateStorePath: asNonEmptyString(mem0.stateStorePath) ?? "knowledge/mem0-sync-state.json",
66
66
  maxMessagesPerRun: asPositiveInteger(mem0.maxMessagesPerRun) ?? 200,
67
67
  writeOnApprovalResolution: asBoolean(mem0.writeOnApprovalResolution) ?? asBoolean(ingestion?.writeOnApprovalResolution) ?? true,
68
68
  writeOnRunCompletion: asBoolean(mem0.writeOnRunCompletion) ?? asBoolean(ingestion?.writeOnRunCompletion) ?? true,
@@ -57,7 +57,7 @@ export function readRuntimeMemoryFormationConfig(runtimeMemory, workspaceRoot) {
57
57
  enabled: asBoolean(background?.enabled) ?? true,
58
58
  maxMessagesPerRun: asPositiveInteger(background?.maxMessagesPerRun) ?? asPositiveInteger(ingestion?.maxMessagesPerRun) ?? 40,
59
59
  scopes: normalizeScopeList(asMemoryScopes(background?.scopes) ?? ["thread"]),
60
- stateStorePath: asNonEmptyString(background?.stateStorePath) ?? `${workspaceBaseName}-memory-formation-state.json`,
60
+ stateStorePath: asNonEmptyString(background?.stateStorePath) ?? `knowledge/${workspaceBaseName}-memory-formation-state.json`,
61
61
  writeOnApprovalResolution: asBoolean(background?.writeOnApprovalResolution) ?? asBoolean(ingestion?.writeOnApprovalResolution) ?? true,
62
62
  writeOnRunCompletion: asBoolean(background?.writeOnRunCompletion) ?? asBoolean(ingestion?.writeOnRunCompletion) ?? true,
63
63
  },
@@ -21,4 +21,4 @@ export type VectorStoreRuntimeLike = {
21
21
  }) => Promise<void>;
22
22
  };
23
23
  export declare function createLlamaIndexEmbeddingModel(embeddingModel: CompiledEmbeddingModel): EmbeddingRuntimeLike;
24
- export declare function createLlamaIndexVectorStore(workspaceRoot: string, vectorStore: CompiledVectorStore, embeddings: EmbeddingRuntimeLike): Promise<VectorStoreRuntimeLike>;
24
+ export declare function createLlamaIndexVectorStore(dataRoot: string, vectorStore: CompiledVectorStore, embeddings: EmbeddingRuntimeLike): Promise<VectorStoreRuntimeLike>;
@@ -41,8 +41,8 @@ export function createLlamaIndexEmbeddingModel(embeddingModel) {
41
41
  },
42
42
  };
43
43
  }
44
- export async function createLlamaIndexVectorStore(workspaceRoot, vectorStore, embeddings) {
45
- const persistPath = resolveFilePath(vectorStore.url ?? ".agent/knowledge/vectors.json", workspaceRoot);
44
+ export async function createLlamaIndexVectorStore(dataRoot, vectorStore, embeddings) {
45
+ const persistPath = resolveFilePath(vectorStore.url ?? "knowledge/vectors.json", dataRoot);
46
46
  await mkdir(path.dirname(persistPath), { recursive: true });
47
47
  const emptyStore = () => SimpleVectorStore.fromDict({
48
48
  embeddingDict: {},
@@ -1,6 +1,7 @@
1
- export declare function resolveRuntimeArtifactsRoot(runRoot: string): string;
2
- export declare function resolveRuntimeSqlitePath(runRoot: string): string;
3
- export declare function resolveRuntimeCheckpointerPath(runRoot: string, fileName?: string): string;
4
- export declare function resolveKnowledgeRoot(runRoot: string): string;
5
- export declare function resolveKnowledgeStorePath(runRoot: string, fileName?: string): string;
6
- export declare function resolveKnowledgeFileStorePath(runRoot: string, fileName?: string): string;
1
+ export declare function resolveRuntimeRoot(dataRoot: string): string;
2
+ export declare function resolveRuntimeArtifactsRoot(dataRoot: string): string;
3
+ export declare function resolveRuntimeSqlitePath(dataRoot: string): string;
4
+ export declare function resolveRuntimeCheckpointerPath(dataRoot: string, fileName?: string): string;
5
+ export declare function resolveKnowledgeRoot(dataRoot: string): string;
6
+ export declare function resolveKnowledgeStorePath(dataRoot: string, fileName?: string): string;
7
+ export declare function resolveKnowledgeFileStorePath(dataRoot: string, fileName?: string): string;
@@ -1,19 +1,22 @@
1
1
  import path from "node:path";
2
- export function resolveRuntimeArtifactsRoot(runRoot) {
3
- return path.join(runRoot, "artifacts");
2
+ export function resolveRuntimeRoot(dataRoot) {
3
+ return path.join(dataRoot, "runtime");
4
4
  }
5
- export function resolveRuntimeSqlitePath(runRoot) {
6
- return path.join(runRoot, "runtime.sqlite");
5
+ export function resolveRuntimeArtifactsRoot(dataRoot) {
6
+ return path.join(resolveRuntimeRoot(dataRoot), "artifacts");
7
7
  }
8
- export function resolveRuntimeCheckpointerPath(runRoot, fileName = "checkpoints.json") {
9
- return path.join(runRoot, fileName);
8
+ export function resolveRuntimeSqlitePath(dataRoot) {
9
+ return path.join(resolveRuntimeRoot(dataRoot), "runtime.sqlite");
10
10
  }
11
- export function resolveKnowledgeRoot(runRoot) {
12
- return path.join(runRoot, "knowledge");
11
+ export function resolveRuntimeCheckpointerPath(dataRoot, fileName = "checkpoints.json") {
12
+ return path.join(resolveRuntimeRoot(dataRoot), fileName);
13
13
  }
14
- export function resolveKnowledgeStorePath(runRoot, fileName = "records.sqlite") {
15
- return path.join(resolveKnowledgeRoot(runRoot), fileName);
14
+ export function resolveKnowledgeRoot(dataRoot) {
15
+ return path.join(dataRoot, "knowledge");
16
16
  }
17
- export function resolveKnowledgeFileStorePath(runRoot, fileName = "records.json") {
18
- return path.join(resolveKnowledgeRoot(runRoot), fileName);
17
+ export function resolveKnowledgeStorePath(dataRoot, fileName = "records.sqlite") {
18
+ return path.join(resolveKnowledgeRoot(dataRoot), fileName);
19
+ }
20
+ export function resolveKnowledgeFileStorePath(dataRoot, fileName = "records.json") {
21
+ return path.join(resolveKnowledgeRoot(dataRoot), fileName);
19
22
  }
@@ -5,7 +5,7 @@ import { createClient } from "@libsql/client";
5
5
  import { LibSQLVectorStore } from "@langchain/community/vectorstores/libsql";
6
6
  import { QdrantClient } from "@qdrant/js-client-rest";
7
7
  import { compileVectorStore } from "../../workspace/resource-compilers.js";
8
- import { resolveRefId } from "../../workspace/support/workspace-ref-utils.js";
8
+ import { getRuntimeStorageRoots, resolveRefId } from "../../workspace/support/workspace-ref-utils.js";
9
9
  import { resolveCompiledEmbeddingModel, resolveCompiledEmbeddingModelRef } from "./embedding-models.js";
10
10
  import { createLlamaIndexVectorStore } from "./llamaindex.js";
11
11
  function resolveFileUrl(rawUrl, workspaceRoot) {
@@ -92,10 +92,11 @@ export async function resolveCompiledVectorStore(workspace, vectorStore, options
92
92
  if (options.vectorStoreResolver) {
93
93
  return options.vectorStoreResolver(vectorStore.id);
94
94
  }
95
+ const { dataRoot } = getRuntimeStorageRoots(workspace.refs, workspace.workspaceRoot);
95
96
  if (vectorStore.kind === "LlamaIndexSimpleVectorStore") {
96
97
  const embeddingModel = resolveCompiledEmbeddingModelRef(workspace, vectorStore.embeddingModelRef);
97
98
  const embeddings = await resolveCompiledEmbeddingModel(embeddingModel, options.embeddingModelResolver);
98
- return createLlamaIndexVectorStore(workspace.workspaceRoot, vectorStore, embeddings);
99
+ return createLlamaIndexVectorStore(dataRoot, vectorStore, embeddings);
99
100
  }
100
101
  if (vectorStore.kind === "QdrantVectorStore") {
101
102
  const embeddingModel = resolveCompiledEmbeddingModelRef(workspace, vectorStore.embeddingModelRef);
@@ -178,7 +179,7 @@ export async function resolveCompiledVectorStore(workspace, vectorStore, options
178
179
  const embeddingModel = resolveCompiledEmbeddingModelRef(workspace, vectorStore.embeddingModelRef);
179
180
  const embeddings = await resolveCompiledEmbeddingModel(embeddingModel, options.embeddingModelResolver);
180
181
  const db = createClient({
181
- url: await ensureFileUrlDirectory(vectorStore.url ?? "", workspace.workspaceRoot),
182
+ url: await ensureFileUrlDirectory(vectorStore.url ?? "", dataRoot),
182
183
  ...(vectorStore.authToken ? { authToken: vectorStore.authToken } : {}),
183
184
  });
184
185
  const table = vectorStore.table ?? "vectors";
@@ -5,7 +5,7 @@ import { compileModel, compileTool } from "./resource-compilers.js";
5
5
  import { inferAgentCapabilities } from "./support/agent-capabilities.js";
6
6
  import { getAgentExecutionConfigValue, getAgentExecutionObject, getAgentExecutionString } from "./support/agent-execution-config.js";
7
7
  import { discoverSkillPaths } from "./support/discovery.js";
8
- import { compileAgentMemories, getResilienceConfig, getRuntimeDefaults, getRuntimeMemoryDefaults, getWorkspaceObject, resolvePromptValue, resolveRefId } from "./support/workspace-ref-utils.js";
8
+ import { compileAgentMemories, getResilienceConfig, getRuntimeDefaults, getRuntimeMemoryDefaults, getRuntimeStorageRoots, getWorkspaceObject, resolvePromptValue, resolveRefId, } from "./support/workspace-ref-utils.js";
9
9
  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. " +
10
10
  "Do not inspect absolute paths outside the workspace, system directories, or unrelated repos by default. " +
11
11
  "Prefer workspace-local tools, relative paths, and the current repository checkout when analyzing code.";
@@ -339,6 +339,7 @@ function resolveRuntimeMemoryConfig(agent, refs) {
339
339
  export function compileBinding(workspaceRoot, agent, agents, referencedSubagentIds, refs, models, tools) {
340
340
  const internalSubagent = referencedSubagentIds.has(agent.id);
341
341
  const runtimeDefaults = getRuntimeDefaults(refs);
342
+ const runtimeStorage = getRuntimeStorageRoots(refs, workspaceRoot);
342
343
  const resilience = getResilienceConfig(refs);
343
344
  const compiledAgentSkills = compileAgentSkills(workspaceRoot, agent);
344
345
  const compiledAgentMemory = compileAgentMemories(workspaceRoot, agent.memorySources);
@@ -361,15 +362,16 @@ export function compileBinding(workspaceRoot, agent, agents, referencedSubagentI
361
362
  ? mergeConfigObjects(runtimeFilesystemDefaults, getAgentExecutionObject(agent, "filesystem", { executionMode: "langchain-v1" }))
362
363
  : undefined;
363
364
  const runRoot = typeof agent.runRoot === "string" && agent.runRoot.trim().length > 0
364
- ? path.resolve(workspaceRoot, agent.runRoot)
365
- : typeof runtimeDefaults?.runRoot === "string" && runtimeDefaults.runRoot.trim().length > 0
366
- ? path.resolve(workspaceRoot, runtimeDefaults.runRoot)
367
- : path.join(workspaceRoot, "run-data");
365
+ ? (path.isAbsolute(agent.runRoot) ? agent.runRoot : path.resolve(runtimeStorage.dataRoot, agent.runRoot))
366
+ : runtimeStorage.dataRoot;
368
367
  const base = {
369
368
  agent,
370
369
  harnessRuntime: {
370
+ applicationRoot: runtimeStorage.applicationRoot,
371
+ dataRoot: runtimeStorage.dataRoot,
372
+ runtimeProfile: runtimeStorage.runtimeProfile,
371
373
  runRoot,
372
- workspaceRoot,
374
+ workspaceRoot: runtimeStorage.applicationRoot,
373
375
  capabilities: inferAgentCapabilities(agent),
374
376
  resilience,
375
377
  ...(runtimeGovernanceDefaults ? { governance: runtimeGovernanceDefaults } : {}),
@@ -10,7 +10,7 @@ import { validateAgent, validateTopology } from "./validate.js";
10
10
  import { compileBinding } from "./agent-binding-compiler.js";
11
11
  import { discoverSubagents, ensureDiscoverySources } from "./support/discovery.js";
12
12
  import { collectAgentDiscoverySourceRefs, collectToolSourceRefs } from "./support/source-collectors.js";
13
- import { getRoutingDefaultAgentId, getRuntimeResources, getToolModuleDiscoveryConfig, getRoutingRules, resolveRefId, } from "./support/workspace-ref-utils.js";
13
+ import { getRoutingDefaultAgentId, getRuntimeResources, getRuntimeStorageRoots, getToolModuleDiscoveryConfig, getRoutingRules, resolveRefId, } from "./support/workspace-ref-utils.js";
14
14
  import { hydrateAgentMcpTools, hydrateResourceAndExternalTools } from "./tool-hydration.js";
15
15
  import { traceStartupStage } from "../runtime/startup-tracing.js";
16
16
  import { shouldSkipScanDirectory } from "../utils/fs.js";
@@ -209,6 +209,11 @@ export async function loadWorkspace(workspaceRoot, options = {}) {
209
209
  const loaded = await traceStartupStage("workspace.load.objects", () => loadWorkspaceObjects(workspaceRoot, options), {
210
210
  workspaceRoot,
211
211
  });
212
+ const runtimeStorage = getRuntimeStorageRoots(loaded.refs, workspaceRoot);
213
+ if (path.resolve(runtimeStorage.applicationRoot) !== path.resolve(workspaceRoot)) {
214
+ throw new Error(`Runtime applicationRoot ${runtimeStorage.applicationRoot} must resolve to the loaded workspace root ${workspaceRoot}. ` +
215
+ "Load the shared application folder as the workspace root and use Runtime.dataRoot for writable profile data.");
216
+ }
212
217
  loaded.agents = await traceStartupStage("workspace.discover.subagents", () => discoverSubagents(loaded.agents, workspaceRoot), {
213
218
  workspaceRoot,
214
219
  });
@@ -516,6 +516,9 @@ export function parseAgentItem(item, sourcePath) {
516
516
  description: String(normalizedItem.description ?? ""),
517
517
  modelRef: readExecutionValue(normalizedItem, "modelRef", readSingleRef) ?? "",
518
518
  runRoot: typeof runtime?.runRoot === "string" ? runtime.runRoot : undefined,
519
+ applicationRoot: typeof runtime?.applicationRoot === "string" ? runtime.applicationRoot : undefined,
520
+ dataRoot: typeof runtime?.dataRoot === "string" ? runtime.dataRoot : undefined,
521
+ runtimeProfile: typeof runtime?.profile === "string" ? runtime.profile : undefined,
519
522
  toolRefs: toolBindings.map((binding) => binding.ref),
520
523
  toolBindings,
521
524
  inlineTools: undefined,
@@ -37,6 +37,12 @@ export type ToolModuleDiscoveryConfig = {
37
37
  };
38
38
  export declare function getWorkspaceObject(refs: Map<string, WorkspaceObject | ParsedAgentObject>, ref: string | undefined): WorkspaceObject | undefined;
39
39
  export declare function getRuntimeDefaults(refs: Map<string, WorkspaceObject | ParsedAgentObject>): Record<string, unknown> | undefined;
40
+ export type RuntimeStorageRoots = {
41
+ applicationRoot: string;
42
+ dataRoot: string;
43
+ runtimeProfile: string;
44
+ };
45
+ export declare function getRuntimeStorageRoots(refs: Map<string, WorkspaceObject | ParsedAgentObject>, workspaceRoot: string): RuntimeStorageRoots;
40
46
  export declare function getRuntimeResources(refs: Map<string, WorkspaceObject | ParsedAgentObject>): string[];
41
47
  export declare function getToolModuleDiscoveryConfig(refs: Map<string, WorkspaceObject | ParsedAgentObject>): ToolModuleDiscoveryConfig;
42
48
  export declare function getRuntimeMemoryDefaults(refs: Map<string, WorkspaceObject | ParsedAgentObject>): Record<string, unknown> | undefined;
@@ -26,6 +26,31 @@ export function getRuntimeDefaults(refs) {
26
26
  }
27
27
  return runtimes[0].value;
28
28
  }
29
+ function asNonEmptyString(value) {
30
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
31
+ }
32
+ export function getRuntimeStorageRoots(refs, workspaceRoot) {
33
+ const runtimeDefaults = getRuntimeDefaults(refs);
34
+ const configuredApplicationRoot = asNonEmptyString(runtimeDefaults?.applicationRoot);
35
+ const configuredDataRoot = asNonEmptyString(runtimeDefaults?.dataRoot);
36
+ const configuredProfile = asNonEmptyString(runtimeDefaults?.profile);
37
+ const applicationRoot = configuredApplicationRoot
38
+ ? (path.isAbsolute(configuredApplicationRoot)
39
+ ? configuredApplicationRoot
40
+ : path.resolve(workspaceRoot, configuredApplicationRoot))
41
+ : workspaceRoot;
42
+ const dataRoot = configuredDataRoot
43
+ ? (path.isAbsolute(configuredDataRoot)
44
+ ? configuredDataRoot
45
+ : path.resolve(applicationRoot, configuredDataRoot))
46
+ : path.join(applicationRoot, ".agent");
47
+ const runtimeProfile = configuredProfile ?? "default";
48
+ return {
49
+ applicationRoot,
50
+ dataRoot,
51
+ runtimeProfile,
52
+ };
53
+ }
29
54
  export function getRuntimeResources(refs) {
30
55
  const runtimeDefaults = getRuntimeDefaults(refs);
31
56
  if (!Array.isArray(runtimeDefaults?.resources)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbotgo/agent-harness",
3
- "version": "0.0.283",
3
+ "version": "0.0.284",
4
4
  "description": "Workspace runtime for multi-agent applications",
5
5
  "license": "MIT",
6
6
  "type": "module",