@borgee/agents-host 0.2.73 → 0.2.74

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
@@ -140,7 +140,7 @@ and resumable in that case.
140
140
 
141
141
  Each managed runtime root keeps:
142
142
 
143
- - `agents-host.yaml` and `agents/` as the stable generated local-config entrypoints
143
+ - `.generations/<uuid>/` as validated immutable config generations; Unix and macOS publish `current`, `agents-host.yaml`, and `agents/` symlinks, while Windows publishes the active generation through the atomically replaced ordinary `current.json` pointer and resolves the generation internally without requiring Developer Mode or elevation
144
144
  - `managed-runtime-settings.json` as the persisted managed runtime surface snapshot
145
145
  - `daemon.log` as the detached managed daemon stdout/stderr log file
146
146
  - `.state/` as the per-agent runtime state base
@@ -302,8 +302,7 @@ printf '%s' '{"host":{"borgeeBaseUrl":"https://borgee.example.com"},"agents":[{"
302
302
  - if that post-publication pruning fails, the apply remains successful and its
303
303
  JSON summary includes a `warnings` entry with code
304
304
  `PRUNE_SUPERSEDED_GENERATIONS_FAILED`
305
- - it uses a dedicated managed root: `<root>/agents-host.yaml` and
306
- `<root>/agents` are stable links to the active private generation
305
+ - it uses a dedicated managed root: Unix and macOS expose `<root>/agents-host.yaml` and `<root>/agents` as stable links to the active private generation, while Windows uses `<root>/current.json` as the stable publication point and resolves the active generation internally
307
306
  - it replaces stale supported agent config files as part of that atomic
308
307
  full-set publication, never by pruning the active set first
309
308
  - it creates and normalizes the managed root and generation directories to
@@ -349,12 +348,13 @@ The spec shape is:
349
348
  always targets `<root>/agents`, and validation is re-run after generation using
350
349
  the same local-config loader as `start --config` / `validate --config`. Start
351
350
  the generated layout with `agents-host start --config <root>/agents-host.yaml`;
352
- that stable path follows the active atomically published generation.
351
+ the managed loader treats that path as the stable logical entrypoint even when
352
+ Windows does not materialize a filesystem alias there.
353
353
  The loader preserves that stable path for validation output and publication
354
354
  watches, while pinning resolved host and agents-directory paths before reading.
355
355
  Managed snapshots hold a short-lived reader lease until the read finishes, so
356
- each snapshot uses one generation even if publication changes `current`
357
- concurrently.
356
+ each snapshot uses one generation even if publication changes `current` or
357
+ `current.json` concurrently.
358
358
 
359
359
  The supervisor loads:
360
360
 
@@ -17,6 +17,7 @@ export interface AgentsHostSupervisorDeps {
17
17
  watchPath?: (path: string, onEvent: (event?: WatchEventInfo) => void) => WatchHandle;
18
18
  logger?: LoggerLike;
19
19
  debug?: boolean;
20
+ platform?: NodeJS.Platform;
20
21
  }
21
22
  export declare class AgentsHostSupervisor {
22
23
  private readonly hostConfigPath;
@@ -26,7 +26,9 @@ export class AgentsHostSupervisor {
26
26
  constructor(hostConfigPath, deps = {}) {
27
27
  this.hostConfigPath = resolve(hostConfigPath);
28
28
  this.createHost = deps.createHost ?? ((config, runtimeOptions) => new AgentsHost(config, { runtimeOptions }));
29
- this.loadSnapshot = deps.loadSnapshot ?? ((configPath) => loadLocalConfigSnapshot(configPath));
29
+ this.loadSnapshot =
30
+ deps.loadSnapshot ??
31
+ ((configPath) => loadLocalConfigSnapshot(configPath, { platform: deps.platform }));
30
32
  this.watchPath =
31
33
  deps.watchPath ??
32
34
  ((path, onEvent) => watch(path, (eventType, filename) => {
@@ -41,14 +41,21 @@ export declare function loadLocalConfigSnapshot(hostConfigPath: string, deps?: {
41
41
  fileSystem?: LocalConfigFileSystem;
42
42
  acquireManagedGenerationLease?: boolean;
43
43
  env?: NodeJS.ProcessEnv;
44
+ platform?: NodeJS.Platform;
44
45
  }): Promise<LocalConfigSnapshot>;
45
46
  export declare function loadLocalConfigGenerateSpec(hostConfigPath: string, deps?: {
46
47
  fileSystem?: LocalConfigFileSystem;
47
48
  acquireManagedGenerationLease?: boolean;
48
49
  env?: NodeJS.ProcessEnv;
50
+ platform?: NodeJS.Platform;
49
51
  }): Promise<LocalConfigGenerateSpec>;
52
+ export declare function hasManagedLocalConfig(rootPath: string, deps?: {
53
+ fileSystem?: ManagedLocalConfigFileSystem;
54
+ platform?: NodeJS.Platform;
55
+ }): Promise<boolean>;
50
56
  export declare function materializeLocalConfig(rootPath: string, spec: LocalConfigGenerateSpec, deps?: {
51
57
  fileSystem?: ManagedLocalConfigFileSystem;
52
58
  env?: NodeJS.ProcessEnv;
59
+ platform?: NodeJS.Platform;
53
60
  }): Promise<LocalConfigGenerateResult>;
54
61
  export {};
@@ -10,6 +10,8 @@ export const DEFAULT_LOCAL_AGENTS_DIRNAME = 'agents';
10
10
  const DEFAULT_AGENTS_DIR = './agents';
11
11
  const MANAGED_GENERATIONS_DIRNAME = '.generations';
12
12
  const MANAGED_CURRENT_LINK_NAME = 'current';
13
+ const MANAGED_CURRENT_POINTER_FILENAME = 'current.json';
14
+ const MANAGED_CURRENT_POINTER_SCHEMA_VERSION = 1;
13
15
  export const MANAGED_WRITE_LOCK_DIRNAME = '.generate-config.lock';
14
16
  const MANAGED_READERS_DIRNAME = '.readers';
15
17
  const MANAGED_HOLDER_METADATA_FILENAME = '.holder.json';
@@ -391,10 +393,106 @@ function isDirectManagedGeneration(root, target) {
391
393
  const resolvedTarget = resolve(root, target);
392
394
  return (dirname(resolvedTarget) === generationsDir && relative(generationsDir, resolvedTarget) !== '');
393
395
  }
394
- async function prepareManagedRoot(fileSystem, root) {
396
+ function parseManagedCurrentPointer(raw, pointerPath) {
397
+ let parsed;
398
+ try {
399
+ parsed = JSON.parse(raw);
400
+ }
401
+ catch (error) {
402
+ throw new Error(`Invalid managed config pointer ${pointerPath}: ${error instanceof Error ? error.message : String(error)}`);
403
+ }
404
+ if (!isRecord(parsed) ||
405
+ Object.keys(parsed).sort().join(',') !== 'generation,schemaVersion' ||
406
+ parsed.schemaVersion !== MANAGED_CURRENT_POINTER_SCHEMA_VERSION ||
407
+ typeof parsed.generation !== 'string' ||
408
+ !MANAGED_GENERATION_NAME_PATTERN.test(parsed.generation) ||
409
+ isAbsolute(parsed.generation) ||
410
+ parsed.generation.includes('/') ||
411
+ parsed.generation.includes('\\')) {
412
+ throw new Error(`Invalid managed config pointer ${pointerPath}: expected schemaVersion ${MANAGED_CURRENT_POINTER_SCHEMA_VERSION} and one direct generation identifier`);
413
+ }
414
+ return {
415
+ schemaVersion: MANAGED_CURRENT_POINTER_SCHEMA_VERSION,
416
+ generation: parsed.generation,
417
+ };
418
+ }
419
+ async function resolvePointerGeneration(fileSystem, root) {
420
+ const pointerPath = join(root, MANAGED_CURRENT_POINTER_FILENAME);
421
+ const pointerStatus = await pathStatus(fileSystem, pointerPath);
422
+ if (!pointerStatus) {
423
+ return undefined;
424
+ }
425
+ if (pointerStatus.isDirectory || pointerStatus.isSymbolicLink) {
426
+ throw new Error(`Managed config pointer must be an ordinary file: ${pointerPath}`);
427
+ }
428
+ const pointer = parseManagedCurrentPointer(await fileSystem.readFile(pointerPath), pointerPath);
429
+ const generationsDir = join(root, MANAGED_GENERATIONS_DIRNAME);
430
+ const generationPath = resolve(generationsDir, pointer.generation);
431
+ if (dirname(generationPath) !== generationsDir ||
432
+ relative(generationsDir, generationPath) !== pointer.generation) {
433
+ throw new Error(`Managed config pointer generation must be a direct child of ${generationsDir}`);
434
+ }
435
+ const generationStatus = await pathStatus(fileSystem, generationPath);
436
+ if (!generationStatus?.isDirectory || generationStatus.isSymbolicLink) {
437
+ throw new Error(`Managed config pointer target is not a directory: ${generationPath}`);
438
+ }
439
+ return generationPath;
440
+ }
441
+ async function resolveLegacyCurrentGeneration(fileSystem, root) {
442
+ const generationsDir = join(root, MANAGED_GENERATIONS_DIRNAME);
443
+ const currentPath = join(root, MANAGED_CURRENT_LINK_NAME);
444
+ const currentStatus = await pathStatus(fileSystem, currentPath);
445
+ if (!currentStatus) {
446
+ return undefined;
447
+ }
448
+ if (!currentStatus.isSymbolicLink) {
449
+ throw new Error(`Managed config path must be a symbolic link: ${currentPath}`);
450
+ }
451
+ const currentTarget = await fileSystem.readLink(currentPath);
452
+ if (!isDirectManagedGeneration(root, currentTarget)) {
453
+ throw new Error(`Managed config current generation must be inside ${generationsDir}`);
454
+ }
455
+ const currentGenerationPath = resolve(root, currentTarget);
456
+ const generationStatus = await pathStatus(fileSystem, currentGenerationPath);
457
+ if (!generationStatus?.isDirectory || generationStatus.isSymbolicLink) {
458
+ throw new Error(`Managed config current generation is not a directory: ${currentGenerationPath}`);
459
+ }
460
+ return currentGenerationPath;
461
+ }
462
+ async function validateOptionalLegacyAliases(fileSystem, root) {
463
+ const aliases = [
464
+ [
465
+ join(root, DEFAULT_LOCAL_HOST_CONFIG_FILENAME),
466
+ `${MANAGED_CURRENT_LINK_NAME}/${DEFAULT_LOCAL_HOST_CONFIG_FILENAME}`,
467
+ ],
468
+ [
469
+ join(root, DEFAULT_LOCAL_AGENTS_DIRNAME),
470
+ `${MANAGED_CURRENT_LINK_NAME}/${DEFAULT_LOCAL_AGENTS_DIRNAME}`,
471
+ ],
472
+ ];
473
+ for (const [path, target] of aliases) {
474
+ const status = await pathStatus(fileSystem, path);
475
+ if (status && (!status.isSymbolicLink || (await fileSystem.readLink(path)) !== target)) {
476
+ throw new Error(`Managed config path has an unexpected value: ${path}`);
477
+ }
478
+ }
479
+ }
480
+ async function prepareManagedRoot(fileSystem, root, platform) {
395
481
  await ensureDirectory(fileSystem, root, MANAGED_ROOT_MODE);
396
482
  const generationsDir = join(root, MANAGED_GENERATIONS_DIRNAME);
397
483
  await ensureDirectory(fileSystem, generationsDir, MANAGED_ROOT_MODE);
484
+ if (platform === 'win32') {
485
+ await validateOptionalLegacyAliases(fileSystem, root);
486
+ const pointerGeneration = await resolvePointerGeneration(fileSystem, root);
487
+ const legacyGeneration = pointerGeneration
488
+ ? undefined
489
+ : await resolveLegacyCurrentGeneration(fileSystem, root);
490
+ const currentGenerationPath = pointerGeneration ?? legacyGeneration;
491
+ if (currentGenerationPath) {
492
+ await fileSystem.chmod(currentGenerationPath, MANAGED_ROOT_MODE);
493
+ }
494
+ return { currentGenerationPath };
495
+ }
398
496
  const currentPath = join(root, MANAGED_CURRENT_LINK_NAME);
399
497
  const currentStatus = await pathStatus(fileSystem, currentPath);
400
498
  const hostAliasPath = join(root, DEFAULT_LOCAL_HOST_CONFIG_FILENAME);
@@ -483,7 +581,7 @@ function supportsManagedGenerationLeases(fileSystem) {
483
581
  'chmod' in fileSystem &&
484
582
  'readLink' in fileSystem);
485
583
  }
486
- async function managedRootForHostConfigPath(fileSystem, hostConfigPath) {
584
+ async function managedRootForHostConfigPath(fileSystem, hostConfigPath, platform) {
487
585
  if (hostConfigPath === join(dirname(hostConfigPath), DEFAULT_LOCAL_HOST_CONFIG_FILENAME)) {
488
586
  const generationPath = dirname(hostConfigPath);
489
587
  const generationsDir = dirname(generationPath);
@@ -497,6 +595,11 @@ async function managedRootForHostConfigPath(fileSystem, hostConfigPath) {
497
595
  return undefined;
498
596
  }
499
597
  const root = dirname(hostConfigPath);
598
+ if (platform === 'win32') {
599
+ const pointerStatus = await pathStatus(fileSystem, join(root, MANAGED_CURRENT_POINTER_FILENAME));
600
+ const currentStatus = await pathStatus(fileSystem, join(root, MANAGED_CURRENT_LINK_NAME));
601
+ return pointerStatus || currentStatus ? root : undefined;
602
+ }
500
603
  const currentPath = join(root, MANAGED_CURRENT_LINK_NAME);
501
604
  const currentStatus = await pathStatus(fileSystem, currentPath);
502
605
  if (!currentStatus?.isSymbolicLink) {
@@ -504,7 +607,7 @@ async function managedRootForHostConfigPath(fileSystem, hostConfigPath) {
504
607
  }
505
608
  return isDirectManagedGeneration(root, await fileSystem.readLink(currentPath)) ? root : undefined;
506
609
  }
507
- async function resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath) {
610
+ async function resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath, platform) {
508
611
  const resolveHostConfigPath = async () => resolve(fileSystem.realPath
509
612
  ? await fileSystem.realPath(absoluteHostConfigPath)
510
613
  : absoluteHostConfigPath);
@@ -512,14 +615,20 @@ async function resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConf
512
615
  if (!supportsManagedGenerationLeases(fileSystem)) {
513
616
  return { resolvedHostConfigPath: await resolveHostConfigPath(), release: noLease };
514
617
  }
515
- const root = await managedRootForHostConfigPath(fileSystem, absoluteHostConfigPath);
618
+ const root = await managedRootForHostConfigPath(fileSystem, absoluteHostConfigPath, platform);
516
619
  if (!root) {
517
620
  return { resolvedHostConfigPath: await resolveHostConfigPath(), release: noLease };
518
621
  }
519
622
  const releaseWriteLock = await acquireManagedWriteLock(fileSystem, root);
520
623
  let leasePath;
521
624
  try {
522
- const resolvedHostConfigPath = await resolveHostConfigPath();
625
+ const activeGenerationPath = platform === 'win32'
626
+ ? ((await resolvePointerGeneration(fileSystem, root)) ??
627
+ (await resolveLegacyCurrentGeneration(fileSystem, root)))
628
+ : undefined;
629
+ const resolvedHostConfigPath = activeGenerationPath
630
+ ? join(activeGenerationPath, DEFAULT_LOCAL_HOST_CONFIG_FILENAME)
631
+ : await resolveHostConfigPath();
523
632
  const generationPath = dirname(resolvedHostConfigPath);
524
633
  const generationsDir = join(root, MANAGED_GENERATIONS_DIRNAME);
525
634
  if (dirname(generationPath) !== generationsDir ||
@@ -660,7 +769,7 @@ export async function loadLocalConfigSnapshot(hostConfigPath, deps = {}) {
660
769
  : absoluteHostConfigPath),
661
770
  release: async () => undefined,
662
771
  }
663
- : await resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath);
772
+ : await resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath, deps.platform ?? process.platform);
664
773
  try {
665
774
  const { resolvedHostConfigPath } = managedGeneration;
666
775
  const hostConfigDir = dirname(absoluteHostConfigPath);
@@ -718,7 +827,7 @@ export async function loadLocalConfigGenerateSpec(hostConfigPath, deps = {}) {
718
827
  : absoluteHostConfigPath),
719
828
  release: async () => undefined,
720
829
  }
721
- : await resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath);
830
+ : await resolveHostConfigWithGenerationLease(fileSystem, absoluteHostConfigPath, deps.platform ?? process.platform);
722
831
  try {
723
832
  const { resolvedHostConfigPath } = managedGeneration;
724
833
  const hostConfigRecord = await loadParsedDocument(fileSystem, resolvedHostConfigPath, 'host config');
@@ -755,9 +864,20 @@ export async function loadLocalConfigGenerateSpec(hostConfigPath, deps = {}) {
755
864
  await managedGeneration.release();
756
865
  }
757
866
  }
867
+ export async function hasManagedLocalConfig(rootPath, deps = {}) {
868
+ const fileSystem = deps.fileSystem ?? nodeFileSystem;
869
+ const root = resolve(rootPath);
870
+ const platform = deps.platform ?? process.platform;
871
+ if (platform === 'win32') {
872
+ return ((await resolvePointerGeneration(fileSystem, root)) !== undefined ||
873
+ (await resolveLegacyCurrentGeneration(fileSystem, root)) !== undefined);
874
+ }
875
+ return (await pathStatus(fileSystem, join(root, DEFAULT_LOCAL_HOST_CONFIG_FILENAME))) !== undefined;
876
+ }
758
877
  export async function materializeLocalConfig(rootPath, spec, deps = {}) {
759
878
  const fileSystem = deps.fileSystem ?? nodeFileSystem;
760
879
  const layout = resolveLocalConfigLayout(rootPath);
880
+ const platform = deps.platform ?? process.platform;
761
881
  const desiredAgentFiles = new Map();
762
882
  for (const agent of spec.agents) {
763
883
  desiredAgentFiles.set(toGeneratedAgentConfigPath(layout.agentsDir, agent.key), agent);
@@ -768,8 +888,10 @@ export async function materializeLocalConfig(rootPath, spec, deps = {}) {
768
888
  await ensureDirectory(fileSystem, layout.root, MANAGED_ROOT_MODE);
769
889
  const releaseWriteLock = await acquireManagedWriteLock(fileSystem, layout.root);
770
890
  try {
771
- const { currentGenerationPath } = await prepareManagedRoot(fileSystem, layout.root);
772
- const priorAgentConfigPaths = await listSupportedConfigPaths(fileSystem, layout.agentsDir);
891
+ const { currentGenerationPath } = await prepareManagedRoot(fileSystem, layout.root, platform);
892
+ const priorAgentConfigPaths = (await listSupportedConfigPaths(fileSystem, currentGenerationPath
893
+ ? join(currentGenerationPath, DEFAULT_LOCAL_AGENTS_DIRNAME)
894
+ : layout.agentsDir)).map((path) => join(layout.agentsDir, path.slice(dirname(path).length + 1)));
773
895
  const generationName = randomUUID();
774
896
  const generationsDir = join(layout.root, MANAGED_GENERATIONS_DIRNAME);
775
897
  const generationPath = join(generationsDir, generationName);
@@ -792,9 +914,33 @@ export async function materializeLocalConfig(rootPath, spec, deps = {}) {
792
914
  acquireManagedGenerationLease: false,
793
915
  env: deps.env,
794
916
  });
795
- const nextCurrentPath = join(layout.root, `.${MANAGED_CURRENT_LINK_NAME}-${generationName}`);
796
- await fileSystem.symlink(join(MANAGED_GENERATIONS_DIRNAME, generationName), nextCurrentPath);
797
- await fileSystem.rename(nextCurrentPath, join(layout.root, MANAGED_CURRENT_LINK_NAME));
917
+ if (platform === 'win32') {
918
+ const nextCurrentPath = join(layout.root, `.${MANAGED_CURRENT_POINTER_FILENAME}-${generationName}`);
919
+ await fileSystem.writeFile(nextCurrentPath, `${JSON.stringify({
920
+ schemaVersion: MANAGED_CURRENT_POINTER_SCHEMA_VERSION,
921
+ generation: generationName,
922
+ })}\n`);
923
+ await fileSystem.chmod(nextCurrentPath, MANAGED_CONFIG_MODE);
924
+ try {
925
+ await fileSystem.rename(nextCurrentPath, join(layout.root, MANAGED_CURRENT_POINTER_FILENAME));
926
+ }
927
+ catch (error) {
928
+ try {
929
+ await fileSystem.removeFile(nextCurrentPath);
930
+ }
931
+ catch (cleanupError) {
932
+ if (!isNotFoundError(cleanupError)) {
933
+ throw new AggregateError([error, cleanupError], 'Managed config pointer publication and cleanup both failed');
934
+ }
935
+ }
936
+ throw error;
937
+ }
938
+ }
939
+ else {
940
+ const nextCurrentPath = join(layout.root, `.${MANAGED_CURRENT_LINK_NAME}-${generationName}`);
941
+ await fileSystem.symlink(join(MANAGED_GENERATIONS_DIRNAME, generationName), nextCurrentPath);
942
+ await fileSystem.rename(nextCurrentPath, join(layout.root, MANAGED_CURRENT_LINK_NAME));
943
+ }
798
944
  published = true;
799
945
  try {
800
946
  await pruneSupersededGenerations(fileSystem, generationsDir, new Set([generationPath, currentGenerationPath].filter((path) => path !== undefined)));
@@ -9,7 +9,7 @@ import { DEFAULT_PROJECTION_STRATEGY, normalizeProjectionStrategy, } from './pro
9
9
  import { resolveChannelWorkspaceDirectory, resolveChannelWorkspaceRootDirectory, resolveManagedWorkspaceCollectionRoot, resolveTaskThreadScratchWorkspaceDirectory, } from './context/injection.js';
10
10
  import { CLAUDE_PROVIDER_V2_COMPATIBILITY_GATE, COMPATIBILITY_GATES_ENV, CURRENT_AGENTS_HOST_PACKAGE_VERSION, createManagedRuntimeSettingsFingerprint, INTERNAL_CLAUDE_PROMPT_STRATEGY_ENV, INTERNAL_DISABLED_COMPATIBILITY_GATES_ENV, INTERNAL_POLICY_MODE_ENV, INTERNAL_PROVIDER_IMPLEMENTATIONS_ENV, MANAGED_RUNTIME_CONVERGENCE_COMPATIBILITY_GATE, MANAGED_RUNTIME_SETTINGS_SCHEMA_VERSION, resolveDisabledDefaultCompatibilityGates, resolveManagedRuntimeSettingsSnapshot, serializeManagedRuntimeSettingsSnapshot, normalizeInternalProviderImplementationOverrides, } from './compatibility-gates.js';
11
11
  import { DEFAULT_PROVIDER_COMMAND_CONFIG, hasLegacyClaudeOneShotArgs, loadConfigFromEnv, } from './config.js';
12
- import { loadLocalConfigGenerateSpec, materializeLocalConfig, parseGenerateConfigSpec, resolveLocalConfigLayout, } from './local-config.js';
12
+ import { hasManagedLocalConfig, loadLocalConfigGenerateSpec, materializeLocalConfig, parseGenerateConfigSpec, resolveLocalConfigLayout, } from './local-config.js';
13
13
  import { normalizeManagedRuntimeKey, resolveManagedBootstrapLockPath, resolveManagedDaemonEndpoint, resolveManagedDaemonLogPath, resolveManagedRuntimeRoot, resolveManagedStateRoot, resolveManagedRuntimeSettingsPath, } from './state-paths.js';
14
14
  const MANAGED_ROOT_MODE = 0o700;
15
15
  const MANAGED_CONFIG_MODE = 0o600;
@@ -1130,7 +1130,7 @@ export async function bootstrapManagedDaemonStart(options, deps = {}) {
1130
1130
  });
1131
1131
  if (options.apiKey !== undefined
1132
1132
  && currentRuntimeSettings.persistedSettingsSnapshot == null
1133
- && await fs.access(resolved.hostConfigPath).then(() => true).catch(() => false)) {
1133
+ && await hasManagedLocalConfig(resolved.rootPath)) {
1134
1134
  throw new Error(`Managed runtime root ${resolved.rootPath} predates managed-runtime-settings.json; run \`agents-host start-managed ${options.serverUrl}\` once to migrate it before updating an individual agent`);
1135
1135
  }
1136
1136
  const explicitManagedAgentOverrides = collectExplicitManagedAgentEnvOverrides(options.processEnv ?? process.env, options.env);
@@ -1628,9 +1628,16 @@ export class ManagedAgentsHostDaemon {
1628
1628
  this.endpoint = resolveManagedDaemonEndpoint(this.rootPath, deps.platform);
1629
1629
  this.createSupervisor =
1630
1630
  deps.createSupervisor ??
1631
- ((configPath, daemonDebug) => new AgentsHostSupervisor(configPath, { debug: daemonDebug }));
1632
- this.loadSpec = deps.loadSpec ?? loadLocalConfigGenerateSpec;
1633
- this.materialize = deps.materialize ?? materializeLocalConfig;
1631
+ ((configPath, daemonDebug) => new AgentsHostSupervisor(configPath, {
1632
+ debug: daemonDebug,
1633
+ platform: deps.platform,
1634
+ }));
1635
+ this.loadSpec =
1636
+ deps.loadSpec ??
1637
+ ((configPath) => loadLocalConfigGenerateSpec(configPath, { platform: deps.platform }));
1638
+ this.materialize =
1639
+ deps.materialize ??
1640
+ ((managedRootPath, spec) => materializeLocalConfig(managedRootPath, spec, { platform: deps.platform }));
1634
1641
  const managedRuntimeSettings = resolveDesiredManagedRuntimeSettings(process.env);
1635
1642
  this.managedRuntimeFingerprint = managedRuntimeSettings.fingerprint;
1636
1643
  this.logger = deps.logger ?? console;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@borgee/agents-host",
3
- "version": "0.2.73",
3
+ "version": "0.2.74",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"