agent-relay 2.0.36 → 2.1.0

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 (81) hide show
  1. package/dist/index.cjs +31903 -33913
  2. package/dist/src/cli/index.js +38 -51
  3. package/dist/src/cli/index.js.map +1 -1
  4. package/package.json +18 -19
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/benchmark/package.json +4 -4
  7. package/packages/bridge/package.json +8 -8
  8. package/packages/cli-tester/package.json +1 -1
  9. package/packages/config/dist/project-namespace.d.ts +28 -0
  10. package/packages/config/dist/project-namespace.d.ts.map +1 -1
  11. package/packages/config/dist/project-namespace.js +42 -0
  12. package/packages/config/dist/project-namespace.js.map +1 -1
  13. package/packages/config/package.json +2 -2
  14. package/packages/config/src/project-namespace.ts +65 -0
  15. package/packages/continuity/dist/formatter.d.ts +8 -2
  16. package/packages/continuity/dist/formatter.d.ts.map +1 -1
  17. package/packages/continuity/dist/formatter.js +142 -7
  18. package/packages/continuity/dist/formatter.js.map +1 -1
  19. package/packages/continuity/dist/index.d.ts +1 -0
  20. package/packages/continuity/dist/index.d.ts.map +1 -1
  21. package/packages/continuity/dist/index.js +2 -0
  22. package/packages/continuity/dist/index.js.map +1 -1
  23. package/packages/continuity/package.json +4 -1
  24. package/packages/continuity/src/formatter.ts +175 -10
  25. package/packages/continuity/src/index.ts +3 -0
  26. package/packages/daemon/dist/enhanced-features.d.ts +2 -3
  27. package/packages/daemon/dist/enhanced-features.d.ts.map +1 -1
  28. package/packages/daemon/dist/enhanced-features.js +1 -0
  29. package/packages/daemon/dist/enhanced-features.js.map +1 -1
  30. package/packages/daemon/dist/index.d.ts +0 -2
  31. package/packages/daemon/dist/index.d.ts.map +1 -1
  32. package/packages/daemon/dist/index.js +0 -3
  33. package/packages/daemon/dist/index.js.map +1 -1
  34. package/packages/daemon/dist/server.d.ts +0 -6
  35. package/packages/daemon/dist/server.d.ts.map +1 -1
  36. package/packages/daemon/dist/server.js +20 -119
  37. package/packages/daemon/dist/server.js.map +1 -1
  38. package/packages/daemon/package.json +12 -14
  39. package/packages/daemon/src/enhanced-features.ts +4 -4
  40. package/packages/daemon/src/index.ts +0 -4
  41. package/packages/daemon/src/server.ts +19 -127
  42. package/packages/daemon/vitest.config.ts +9 -0
  43. package/packages/hooks/package.json +4 -4
  44. package/packages/mcp/package.json +3 -3
  45. package/packages/memory/package.json +2 -2
  46. package/packages/policy/package.json +2 -2
  47. package/packages/protocol/package.json +1 -1
  48. package/packages/resiliency/package.json +1 -1
  49. package/packages/sdk/package.json +2 -2
  50. package/packages/spawner/package.json +1 -1
  51. package/packages/state/package.json +1 -1
  52. package/packages/storage/dist/adapter.d.ts +5 -5
  53. package/packages/storage/dist/adapter.js +9 -9
  54. package/packages/storage/dist/adapter.js.map +1 -1
  55. package/packages/storage/package.json +2 -2
  56. package/packages/storage/src/adapter.ts +9 -9
  57. package/packages/telemetry/package.json +1 -1
  58. package/packages/trajectory/package.json +2 -2
  59. package/packages/user-directory/package.json +2 -2
  60. package/packages/utils/package.json +2 -2
  61. package/packages/wrapper/package.json +6 -6
  62. package/scripts/build-cjs.mjs +2 -0
  63. package/packages/daemon/dist/migrations/index.d.ts +0 -73
  64. package/packages/daemon/dist/migrations/index.d.ts.map +0 -1
  65. package/packages/daemon/dist/migrations/index.js +0 -241
  66. package/packages/daemon/dist/migrations/index.js.map +0 -1
  67. package/packages/daemon/dist/relay-ledger.d.ts +0 -263
  68. package/packages/daemon/dist/relay-ledger.d.ts.map +0 -1
  69. package/packages/daemon/dist/relay-ledger.js +0 -538
  70. package/packages/daemon/dist/relay-ledger.js.map +0 -1
  71. package/packages/daemon/dist/relay-watchdog.d.ts +0 -125
  72. package/packages/daemon/dist/relay-watchdog.d.ts.map +0 -1
  73. package/packages/daemon/dist/relay-watchdog.js +0 -611
  74. package/packages/daemon/dist/relay-watchdog.js.map +0 -1
  75. package/packages/daemon/src/migrations/0001_initial.sql +0 -72
  76. package/packages/daemon/src/migrations/index.test.ts +0 -195
  77. package/packages/daemon/src/migrations/index.ts +0 -286
  78. package/packages/daemon/src/relay-ledger.test.ts +0 -358
  79. package/packages/daemon/src/relay-ledger.ts +0 -713
  80. package/packages/daemon/src/relay-watchdog.test.ts +0 -881
  81. package/packages/daemon/src/relay-watchdog.ts +0 -785
@@ -19,7 +19,8 @@ import { RelayClient } from '@agent-relay/sdk';
19
19
  import { RelayPtyOrchestrator, getTmuxPath } from '@agent-relay/wrapper';
20
20
  import { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, selectShadowCli, ensureMcpPermissions } from '@agent-relay/bridge';
21
21
  import { generateAgentName, checkForUpdatesInBackground, checkForUpdates } from '@agent-relay/utils';
22
- import { getShadowForAgent } from '@agent-relay/config';
22
+ import { getShadowForAgent, getProjectPaths, loadRuntimeConfig } from '@agent-relay/config';
23
+ import { createStorageAdapter } from '@agent-relay/storage/adapter';
23
24
  import { initTelemetry, track, enableTelemetry, disableTelemetry, getStatus, isDisabledByEnv, } from '@agent-relay/telemetry';
24
25
  import { installMcpConfig } from '@agent-relay/mcp';
25
26
  import fs from 'node:fs';
@@ -392,6 +393,7 @@ program
392
393
  .description('Start daemon (use --dashboard to enable web dashboard)')
393
394
  .option('--dashboard', 'Enable web dashboard (disabled by default)')
394
395
  .option('--port <port>', 'Dashboard port (requires --dashboard)', DEFAULT_DASHBOARD_PORT)
396
+ .option('--storage <type>', 'Storage type: jsonl (default), sqlite, sqlite-batched, memory', 'jsonl')
395
397
  .option('--spawn', 'Force spawn all agents from teams.json')
396
398
  .option('--no-spawn', 'Do not auto-spawn agents (just start daemon)')
397
399
  .option('--watch', 'Auto-restart daemon on crash (supervisor mode)')
@@ -399,7 +401,6 @@ program
399
401
  .action(async (options) => {
400
402
  // If --watch is specified, run in supervisor mode
401
403
  if (options.watch) {
402
- const { spawn } = await import('node:child_process');
403
404
  const maxRestarts = parseInt(options.maxRestarts, 10) || 5;
404
405
  const restartWindow = 60_000; // 60 seconds
405
406
  const restartTimes = [];
@@ -413,12 +414,14 @@ program
413
414
  if (options.port)
414
415
  args.push('--port', options.port);
415
416
  }
417
+ if (options.storage)
418
+ args.push('--storage', options.storage);
416
419
  if (options.spawn === true)
417
420
  args.push('--spawn');
418
421
  if (options.spawn === false)
419
422
  args.push('--no-spawn');
420
423
  console.log(`[supervisor] Starting daemon...`);
421
- child = spawn(process.execPath, [process.argv[1], ...args], {
424
+ child = spawnProcess(process.execPath, [process.argv[1], ...args], {
422
425
  stdio: 'inherit',
423
426
  env: { ...process.env, AGENT_RELAY_SUPERVISED: '1' },
424
427
  });
@@ -458,7 +461,6 @@ program
458
461
  }
459
462
  const { ensureProjectDir } = await import('@agent-relay/config');
460
463
  const { loadTeamsConfig } = await import('@agent-relay/config');
461
- const { AgentSpawner } = await import('@agent-relay/bridge');
462
464
  const paths = ensureProjectDir();
463
465
  const socketPath = paths.socketPath;
464
466
  const dbPath = paths.dbPath;
@@ -476,10 +478,14 @@ program
476
478
  if (teamsConfig) {
477
479
  console.log(`Team: ${teamsConfig.team} (${teamsConfig.agents.length} agents defined)`);
478
480
  }
481
+ // Determine storage type from CLI option (defaults to 'jsonl')
482
+ const storageType = options.storage || 'jsonl';
483
+ console.log(`Storage: ${storageType}`);
479
484
  const daemon = new Daemon({
480
485
  socketPath,
481
486
  pidFilePath,
482
487
  storagePath: dbPath,
488
+ storageConfig: { type: storageType },
483
489
  teamDir: paths.teamDir,
484
490
  // Enable protocol-based spawning via SPAWN/RELEASE messages
485
491
  spawnManager: {
@@ -553,6 +559,8 @@ program
553
559
  dataDir: paths.dataDir,
554
560
  teamDir: paths.teamDir,
555
561
  projectRoot: paths.projectRoot,
562
+ // Use the same database as the daemon for message persistence
563
+ dbPath: paths.dbPath,
556
564
  enableSpawner: true,
557
565
  onMarkSpawning: (name) => daemon.markSpawning(name),
558
566
  onClearSpawning: (name) => daemon.clearSpawning(name),
@@ -683,7 +691,6 @@ program
683
691
  .command('down')
684
692
  .description('Stop daemon')
685
693
  .action(async () => {
686
- const { getProjectPaths } = await import('@agent-relay/config');
687
694
  const paths = getProjectPaths();
688
695
  const pidPath = pidFilePathForSocket(paths.socketPath);
689
696
  if (!fs.existsSync(pidPath)) {
@@ -708,8 +715,6 @@ const MEGA_SYSTEM_PROMPT = [
708
715
  ].join(' ');
709
716
  // Helper function for starting Dashboard coordinator with a specific provider
710
717
  async function startDashboardCoordinator(operator) {
711
- const { spawn } = await import('node:child_process');
712
- const { getProjectPaths } = await import('@agent-relay/config');
713
718
  const paths = getProjectPaths();
714
719
  console.log(`Starting Dashboard with ${operator}...`);
715
720
  console.log(`Project: ${paths.projectRoot}`);
@@ -755,7 +760,7 @@ async function startDashboardCoordinator(operator) {
755
760
  }
756
761
  else {
757
762
  console.log('Starting daemon...');
758
- const daemonProc = spawn(process.execPath, [process.argv[1], 'up', '--dashboard'], {
763
+ const daemonProc = spawnProcess(process.execPath, [process.argv[1], 'up', '--dashboard'], {
759
764
  stdio: 'ignore',
760
765
  detached: true,
761
766
  });
@@ -788,7 +793,7 @@ async function startDashboardCoordinator(operator) {
788
793
  : ['prpm', 'install', '@agent-relay/agent-relay-snippet'];
789
794
  try {
790
795
  await new Promise((resolve, reject) => {
791
- const prpmProc = spawn('npx', prpmArgs, {
796
+ const prpmProc = spawnProcess('npx', prpmArgs, {
792
797
  stdio: 'inherit',
793
798
  });
794
799
  prpmProc.on('close', (code) => {
@@ -821,7 +826,7 @@ async function startDashboardCoordinator(operator) {
821
826
  }
822
827
  // Use '--' to separate agent-relay options from the command + its args
823
828
  // Format: agent-relay create-agent -n Dashboard --skip-instructions --dashboard-port <port> -- claude --append-system-prompt "..."
824
- const agentProc = spawn(process.execPath, [process.argv[1], 'create-agent', '-n', 'Dashboard', '--skip-instructions', '--dashboard-port', String(dashboardPort), '--', operator, ...cliArgs], { stdio: 'inherit' });
829
+ const agentProc = spawnProcess(process.execPath, [process.argv[1], 'create-agent', '-n', 'Dashboard', '--skip-instructions', '--dashboard-port', String(dashboardPort), '--', operator, ...cliArgs], { stdio: 'inherit' });
825
830
  // Forward signals to agent process
826
831
  process.on('SIGINT', () => {
827
832
  agentProc.kill('SIGINT');
@@ -852,7 +857,6 @@ program
852
857
  .command('status')
853
858
  .description('Check daemon status')
854
859
  .action(async () => {
855
- const { getProjectPaths } = await import('@agent-relay/config');
856
860
  const paths = getProjectPaths();
857
861
  const relaySessions = await discoverRelaySessions();
858
862
  if (!fs.existsSync(paths.socketPath)) {
@@ -906,7 +910,6 @@ program
906
910
  .option('--remote', 'Include agents from other linked machines (requires cloud link)')
907
911
  .option('--json', 'Output as JSON')
908
912
  .action(async (options) => {
909
- const { getProjectPaths } = await import('@agent-relay/config');
910
913
  const os = await import('node:os');
911
914
  const paths = getProjectPaths();
912
915
  const agentsPath = path.join(paths.teamDir, 'agents.json');
@@ -1065,7 +1068,6 @@ program
1065
1068
  .option('--all', 'Include internal/CLI agents')
1066
1069
  .option('--json', 'Output as JSON')
1067
1070
  .action(async (options) => {
1068
- const { getProjectPaths } = await import('@agent-relay/config');
1069
1071
  const paths = getProjectPaths();
1070
1072
  const agentsPath = path.join(paths.teamDir, 'agents.json');
1071
1073
  const allAgents = loadAgents(agentsPath);
@@ -1097,11 +1099,13 @@ program
1097
1099
  .command('read')
1098
1100
  .description('Read full message by ID (for truncated messages)')
1099
1101
  .argument('<id>', 'Message ID')
1100
- .action(async (messageId) => {
1101
- const { getProjectPaths } = await import('@agent-relay/config');
1102
- const { createStorageAdapter } = await import('@agent-relay/storage/adapter');
1102
+ .option('--storage <type>', 'Storage type override (jsonl, sqlite, memory)')
1103
+ .action(async (messageId, options) => {
1103
1104
  const paths = getProjectPaths();
1104
- const adapter = await createStorageAdapter(paths.dbPath);
1105
+ // Use runtime config to match daemon's storage type, CLI option overrides
1106
+ const runtimeConfig = loadRuntimeConfig();
1107
+ const storageType = options.storage ?? runtimeConfig?.storageType;
1108
+ const adapter = await createStorageAdapter(paths.dbPath, storageType ? { type: storageType } : undefined);
1105
1109
  if (!adapter.getMessageById) {
1106
1110
  console.error('Storage does not support message lookup');
1107
1111
  process.exit(1);
@@ -1130,11 +1134,13 @@ program
1130
1134
  .option('-t, --to <agent>', 'Filter by recipient')
1131
1135
  .option('--since <time>', 'Since time (e.g., "1h", "2024-01-01")')
1132
1136
  .option('--json', 'Output as JSON')
1137
+ .option('--storage <type>', 'Storage type override (jsonl, sqlite, memory)')
1133
1138
  .action(async (options) => {
1134
- const { getProjectPaths } = await import('@agent-relay/config');
1135
- const { createStorageAdapter } = await import('@agent-relay/storage/adapter');
1136
1139
  const paths = getProjectPaths();
1137
- const adapter = await createStorageAdapter(paths.dbPath);
1140
+ // Use runtime config to match daemon's storage type, CLI option overrides
1141
+ const runtimeConfig = loadRuntimeConfig();
1142
+ const storageType = options.storage ?? runtimeConfig?.storageType;
1143
+ const adapter = await createStorageAdapter(paths.dbPath, storageType ? { type: storageType } : undefined);
1138
1144
  const limit = Number.parseInt(options.limit ?? '50', 10) || 50;
1139
1145
  const sinceTs = parseSince(options.since);
1140
1146
  try {
@@ -1252,9 +1258,6 @@ program
1252
1258
  .action(async (projectPaths, options) => {
1253
1259
  const { resolveProjects, validateDaemons, getAgentOutboxTemplate } = await import('@agent-relay/config');
1254
1260
  const { MultiProjectClient } = await import('@agent-relay/bridge');
1255
- const { getProjectPaths } = await import('@agent-relay/config');
1256
- const fs = await import('node:fs');
1257
- const pathModule = await import('node:path');
1258
1261
  // Resolve projects from args or config
1259
1262
  const projects = resolveProjects(projectPaths, options.cli);
1260
1263
  if (projects.length === 0) {
@@ -1292,12 +1295,12 @@ program
1292
1295
  if (!fs.existsSync(projectPaths.dataDir)) {
1293
1296
  fs.mkdirSync(projectPaths.dataDir, { recursive: true });
1294
1297
  }
1295
- return pathModule.join(projectPaths.dataDir, 'bridge-state.json');
1298
+ return path.join(projectPaths.dataDir, 'bridge-state.json');
1296
1299
  });
1297
1300
  const bridgeState = {
1298
1301
  projects: valid.map(p => ({
1299
1302
  id: p.id,
1300
- name: pathModule.basename(p.path),
1303
+ name: path.basename(p.path),
1301
1304
  path: p.path,
1302
1305
  connected: false,
1303
1306
  lead: { name: p.leadName, connected: false },
@@ -1506,7 +1509,6 @@ Start by greeting the project leads and asking for status updates.`;
1506
1509
  process.exit(0);
1507
1510
  });
1508
1511
  // Start a simple REPL for sending messages
1509
- const readline = await import('node:readline');
1510
1512
  const rl = readline.createInterface({
1511
1513
  input: process.stdin,
1512
1514
  output: process.stdout,
@@ -1555,7 +1557,6 @@ program
1555
1557
  .option('--dry-run', 'Show what would be cleaned without actually doing it')
1556
1558
  .option('--force', 'Kill all relay sessions regardless of connection status')
1557
1559
  .action(async (options) => {
1558
- const { getProjectPaths } = await import('@agent-relay/config');
1559
1560
  const paths = getProjectPaths();
1560
1561
  const agentsPath = path.join(paths.teamDir, 'agents.json');
1561
1562
  // Get all relay tmux sessions
@@ -1770,7 +1771,6 @@ program
1770
1771
  .option('-n, --lines <n>', 'Number of lines to show', '50')
1771
1772
  .option('-f, --follow', 'Follow output (like tail -f)')
1772
1773
  .action(async (name, options) => {
1773
- const { getProjectPaths } = await import('@agent-relay/config');
1774
1774
  const paths = getProjectPaths();
1775
1775
  const logsDir = getWorkerLogsDir(paths.projectRoot);
1776
1776
  const logFile = path.join(logsDir, `${name}.log`);
@@ -1784,8 +1784,7 @@ program
1784
1784
  console.log(`Following logs for ${name} (Ctrl+C to stop)...`);
1785
1785
  console.log('─'.repeat(50));
1786
1786
  // Use tail -f approach
1787
- const { spawn } = await import('child_process');
1788
- const child = spawn('tail', ['-f', logFile], {
1787
+ const child = spawnProcess('tail', ['-f', logFile], {
1789
1788
  stdio: ['ignore', 'inherit', 'inherit'],
1790
1789
  });
1791
1790
  process.on('SIGINT', () => {
@@ -1879,7 +1878,6 @@ program
1879
1878
  };
1880
1879
  // Try daemon socket first (preferred path)
1881
1880
  try {
1882
- const { getProjectPaths } = await import('@agent-relay/config');
1883
1881
  const paths = getProjectPaths();
1884
1882
  // TODO: Re-enable daemon-based spawning when client.spawn() is implemented
1885
1883
  // See: docs/SDK-MIGRATION-PLAN.md for planned implementation
@@ -1934,7 +1932,6 @@ program
1934
1932
  const port = options.port || DEFAULT_DASHBOARD_PORT;
1935
1933
  // Try daemon socket first (preferred path)
1936
1934
  try {
1937
- const { getProjectPaths } = await import('@agent-relay/config');
1938
1935
  const paths = getProjectPaths();
1939
1936
  const client = new RelayClient({
1940
1937
  socketPath: paths.socketPath,
@@ -1988,7 +1985,6 @@ program
1988
1985
  .argument('<name>', 'Agent name')
1989
1986
  .option('--force', 'Skip graceful shutdown, kill immediately')
1990
1987
  .action(async (name, options) => {
1991
- const { getProjectPaths } = await import('@agent-relay/config');
1992
1988
  const paths = getProjectPaths();
1993
1989
  const workers = readWorkersMetadata(paths.projectRoot);
1994
1990
  const worker = workers.find(w => w.name === name);
@@ -2049,7 +2045,6 @@ cloudCommand
2049
2045
  .action(async (options) => {
2050
2046
  const os = await import('node:os');
2051
2047
  const crypto = await import('node:crypto');
2052
- const readline = await import('node:readline');
2053
2048
  const cloudUrl = options.cloudUrl;
2054
2049
  const machineName = options.name || os.hostname();
2055
2050
  // Generate machine ID
@@ -2210,7 +2205,6 @@ cloudCommand
2210
2205
  console.log(` Linked: ${new Date(config.linkedAt).toLocaleString()}`);
2211
2206
  console.log('');
2212
2207
  // Check if daemon is running and connected
2213
- const { getProjectPaths } = await import('@agent-relay/config');
2214
2208
  const paths = getProjectPaths();
2215
2209
  if (fs.existsSync(paths.socketPath)) {
2216
2210
  console.log(' Daemon: Running');
@@ -2295,12 +2289,10 @@ program
2295
2289
  .argument('[args...]', 'Arguments to pass to trail CLI')
2296
2290
  .allowUnknownOption()
2297
2291
  .action(async (args) => {
2298
- const { spawn } = await import('node:child_process');
2299
- const { getProjectPaths } = await import('@agent-relay/config');
2300
2292
  const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('@agent-relay/config/trajectory-config');
2301
2293
  const paths = getProjectPaths();
2302
2294
  // Check if trail is available
2303
- const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
2295
+ const trailCheck = spawnProcess('which', ['trail'], { stdio: 'pipe' });
2304
2296
  const trailExists = await new Promise((resolve) => {
2305
2297
  trailCheck.on('close', (code) => resolve(code === 0));
2306
2298
  trailCheck.on('error', () => resolve(false));
@@ -2324,7 +2316,7 @@ program
2324
2316
  const trajectoriesDir = getPrimaryTrajectoriesDir(paths.projectRoot);
2325
2317
  ensureTrajectoriesDir(paths.projectRoot);
2326
2318
  // Spawn trail with the provided arguments
2327
- const trailProc = spawn('trail', args, {
2319
+ const trailProc = spawnProcess('trail', args, {
2328
2320
  cwd: paths.projectRoot,
2329
2321
  stdio: 'inherit',
2330
2322
  env: {
@@ -2758,7 +2750,6 @@ program
2758
2750
  .option('--output-dir <dir>', 'Directory for profile output', './profiles')
2759
2751
  .option('--expose-gc', 'Expose garbage collector for manual GC')
2760
2752
  .action(async (commandParts, options) => {
2761
- const { getProjectPaths } = await import('@agent-relay/config');
2762
2753
  if (!commandParts || commandParts.length === 0) {
2763
2754
  console.error('No command specified');
2764
2755
  process.exit(1);
@@ -3097,9 +3088,6 @@ program
3097
3088
  });
3098
3089
  // init - First-time setup wizard for Agent Relay
3099
3090
  async function runInit(options) {
3100
- const readline = await import('node:readline');
3101
- const { existsSync } = await import('node:fs');
3102
- const { spawn } = await import('node:child_process');
3103
3091
  // Helper to prompt user
3104
3092
  const prompt = async (question, defaultYes = true) => {
3105
3093
  if (options.yes)
@@ -3138,26 +3126,25 @@ async function runInit(options) {
3138
3126
  // Step 2: Check daemon status
3139
3127
  let daemonRunning = false;
3140
3128
  const socketPath = process.env.RELAY_SOCKET;
3141
- if (socketPath && existsSync(socketPath)) {
3129
+ if (socketPath && fs.existsSync(socketPath)) {
3142
3130
  daemonRunning = true;
3143
3131
  }
3144
3132
  else {
3145
3133
  // Check default locations
3146
3134
  const { homedir } = await import('node:os');
3147
- const { join } = await import('node:path');
3148
3135
  const platform = process.platform;
3149
3136
  let dataDir;
3150
3137
  if (platform === 'darwin') {
3151
- dataDir = join(homedir(), 'Library', 'Application Support', 'agent-relay');
3138
+ dataDir = path.join(homedir(), 'Library', 'Application Support', 'agent-relay');
3152
3139
  }
3153
3140
  else if (platform === 'win32') {
3154
- dataDir = join(process.env.APPDATA || homedir(), 'agent-relay');
3141
+ dataDir = path.join(process.env.APPDATA || homedir(), 'agent-relay');
3155
3142
  }
3156
3143
  else {
3157
- dataDir = join(process.env.XDG_DATA_HOME || join(homedir(), '.local', 'share'), 'agent-relay');
3144
+ dataDir = path.join(process.env.XDG_DATA_HOME || path.join(homedir(), '.local', 'share'), 'agent-relay');
3158
3145
  }
3159
- const defaultSocket = join(dataDir, 'projects', 'default', 'daemon.sock');
3160
- if (existsSync(defaultSocket)) {
3146
+ const defaultSocket = path.join(dataDir, 'projects', 'default', 'daemon.sock');
3147
+ if (fs.existsSync(defaultSocket)) {
3161
3148
  daemonRunning = true;
3162
3149
  }
3163
3150
  }
@@ -3220,7 +3207,7 @@ async function runInit(options) {
3220
3207
  console.log('');
3221
3208
  console.log(' Starting daemon...');
3222
3209
  // Start daemon in background
3223
- const daemonProcess = spawn(process.execPath, [process.argv[1], 'up', '--background'], {
3210
+ const daemonProcess = spawnProcess(process.execPath, [process.argv[1], 'up', '--background'], {
3224
3211
  detached: true,
3225
3212
  stdio: 'ignore',
3226
3213
  });