agent-relay 2.0.37 → 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 +36 -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: {
@@ -685,7 +691,6 @@ program
685
691
  .command('down')
686
692
  .description('Stop daemon')
687
693
  .action(async () => {
688
- const { getProjectPaths } = await import('@agent-relay/config');
689
694
  const paths = getProjectPaths();
690
695
  const pidPath = pidFilePathForSocket(paths.socketPath);
691
696
  if (!fs.existsSync(pidPath)) {
@@ -710,8 +715,6 @@ const MEGA_SYSTEM_PROMPT = [
710
715
  ].join(' ');
711
716
  // Helper function for starting Dashboard coordinator with a specific provider
712
717
  async function startDashboardCoordinator(operator) {
713
- const { spawn } = await import('node:child_process');
714
- const { getProjectPaths } = await import('@agent-relay/config');
715
718
  const paths = getProjectPaths();
716
719
  console.log(`Starting Dashboard with ${operator}...`);
717
720
  console.log(`Project: ${paths.projectRoot}`);
@@ -757,7 +760,7 @@ async function startDashboardCoordinator(operator) {
757
760
  }
758
761
  else {
759
762
  console.log('Starting daemon...');
760
- const daemonProc = spawn(process.execPath, [process.argv[1], 'up', '--dashboard'], {
763
+ const daemonProc = spawnProcess(process.execPath, [process.argv[1], 'up', '--dashboard'], {
761
764
  stdio: 'ignore',
762
765
  detached: true,
763
766
  });
@@ -790,7 +793,7 @@ async function startDashboardCoordinator(operator) {
790
793
  : ['prpm', 'install', '@agent-relay/agent-relay-snippet'];
791
794
  try {
792
795
  await new Promise((resolve, reject) => {
793
- const prpmProc = spawn('npx', prpmArgs, {
796
+ const prpmProc = spawnProcess('npx', prpmArgs, {
794
797
  stdio: 'inherit',
795
798
  });
796
799
  prpmProc.on('close', (code) => {
@@ -823,7 +826,7 @@ async function startDashboardCoordinator(operator) {
823
826
  }
824
827
  // Use '--' to separate agent-relay options from the command + its args
825
828
  // Format: agent-relay create-agent -n Dashboard --skip-instructions --dashboard-port <port> -- claude --append-system-prompt "..."
826
- 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' });
827
830
  // Forward signals to agent process
828
831
  process.on('SIGINT', () => {
829
832
  agentProc.kill('SIGINT');
@@ -854,7 +857,6 @@ program
854
857
  .command('status')
855
858
  .description('Check daemon status')
856
859
  .action(async () => {
857
- const { getProjectPaths } = await import('@agent-relay/config');
858
860
  const paths = getProjectPaths();
859
861
  const relaySessions = await discoverRelaySessions();
860
862
  if (!fs.existsSync(paths.socketPath)) {
@@ -908,7 +910,6 @@ program
908
910
  .option('--remote', 'Include agents from other linked machines (requires cloud link)')
909
911
  .option('--json', 'Output as JSON')
910
912
  .action(async (options) => {
911
- const { getProjectPaths } = await import('@agent-relay/config');
912
913
  const os = await import('node:os');
913
914
  const paths = getProjectPaths();
914
915
  const agentsPath = path.join(paths.teamDir, 'agents.json');
@@ -1067,7 +1068,6 @@ program
1067
1068
  .option('--all', 'Include internal/CLI agents')
1068
1069
  .option('--json', 'Output as JSON')
1069
1070
  .action(async (options) => {
1070
- const { getProjectPaths } = await import('@agent-relay/config');
1071
1071
  const paths = getProjectPaths();
1072
1072
  const agentsPath = path.join(paths.teamDir, 'agents.json');
1073
1073
  const allAgents = loadAgents(agentsPath);
@@ -1099,11 +1099,13 @@ program
1099
1099
  .command('read')
1100
1100
  .description('Read full message by ID (for truncated messages)')
1101
1101
  .argument('<id>', 'Message ID')
1102
- .action(async (messageId) => {
1103
- const { getProjectPaths } = await import('@agent-relay/config');
1104
- const { createStorageAdapter } = await import('@agent-relay/storage/adapter');
1102
+ .option('--storage <type>', 'Storage type override (jsonl, sqlite, memory)')
1103
+ .action(async (messageId, options) => {
1105
1104
  const paths = getProjectPaths();
1106
- 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);
1107
1109
  if (!adapter.getMessageById) {
1108
1110
  console.error('Storage does not support message lookup');
1109
1111
  process.exit(1);
@@ -1132,11 +1134,13 @@ program
1132
1134
  .option('-t, --to <agent>', 'Filter by recipient')
1133
1135
  .option('--since <time>', 'Since time (e.g., "1h", "2024-01-01")')
1134
1136
  .option('--json', 'Output as JSON')
1137
+ .option('--storage <type>', 'Storage type override (jsonl, sqlite, memory)')
1135
1138
  .action(async (options) => {
1136
- const { getProjectPaths } = await import('@agent-relay/config');
1137
- const { createStorageAdapter } = await import('@agent-relay/storage/adapter');
1138
1139
  const paths = getProjectPaths();
1139
- 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);
1140
1144
  const limit = Number.parseInt(options.limit ?? '50', 10) || 50;
1141
1145
  const sinceTs = parseSince(options.since);
1142
1146
  try {
@@ -1254,9 +1258,6 @@ program
1254
1258
  .action(async (projectPaths, options) => {
1255
1259
  const { resolveProjects, validateDaemons, getAgentOutboxTemplate } = await import('@agent-relay/config');
1256
1260
  const { MultiProjectClient } = await import('@agent-relay/bridge');
1257
- const { getProjectPaths } = await import('@agent-relay/config');
1258
- const fs = await import('node:fs');
1259
- const pathModule = await import('node:path');
1260
1261
  // Resolve projects from args or config
1261
1262
  const projects = resolveProjects(projectPaths, options.cli);
1262
1263
  if (projects.length === 0) {
@@ -1294,12 +1295,12 @@ program
1294
1295
  if (!fs.existsSync(projectPaths.dataDir)) {
1295
1296
  fs.mkdirSync(projectPaths.dataDir, { recursive: true });
1296
1297
  }
1297
- return pathModule.join(projectPaths.dataDir, 'bridge-state.json');
1298
+ return path.join(projectPaths.dataDir, 'bridge-state.json');
1298
1299
  });
1299
1300
  const bridgeState = {
1300
1301
  projects: valid.map(p => ({
1301
1302
  id: p.id,
1302
- name: pathModule.basename(p.path),
1303
+ name: path.basename(p.path),
1303
1304
  path: p.path,
1304
1305
  connected: false,
1305
1306
  lead: { name: p.leadName, connected: false },
@@ -1508,7 +1509,6 @@ Start by greeting the project leads and asking for status updates.`;
1508
1509
  process.exit(0);
1509
1510
  });
1510
1511
  // Start a simple REPL for sending messages
1511
- const readline = await import('node:readline');
1512
1512
  const rl = readline.createInterface({
1513
1513
  input: process.stdin,
1514
1514
  output: process.stdout,
@@ -1557,7 +1557,6 @@ program
1557
1557
  .option('--dry-run', 'Show what would be cleaned without actually doing it')
1558
1558
  .option('--force', 'Kill all relay sessions regardless of connection status')
1559
1559
  .action(async (options) => {
1560
- const { getProjectPaths } = await import('@agent-relay/config');
1561
1560
  const paths = getProjectPaths();
1562
1561
  const agentsPath = path.join(paths.teamDir, 'agents.json');
1563
1562
  // Get all relay tmux sessions
@@ -1772,7 +1771,6 @@ program
1772
1771
  .option('-n, --lines <n>', 'Number of lines to show', '50')
1773
1772
  .option('-f, --follow', 'Follow output (like tail -f)')
1774
1773
  .action(async (name, options) => {
1775
- const { getProjectPaths } = await import('@agent-relay/config');
1776
1774
  const paths = getProjectPaths();
1777
1775
  const logsDir = getWorkerLogsDir(paths.projectRoot);
1778
1776
  const logFile = path.join(logsDir, `${name}.log`);
@@ -1786,8 +1784,7 @@ program
1786
1784
  console.log(`Following logs for ${name} (Ctrl+C to stop)...`);
1787
1785
  console.log('─'.repeat(50));
1788
1786
  // Use tail -f approach
1789
- const { spawn } = await import('child_process');
1790
- const child = spawn('tail', ['-f', logFile], {
1787
+ const child = spawnProcess('tail', ['-f', logFile], {
1791
1788
  stdio: ['ignore', 'inherit', 'inherit'],
1792
1789
  });
1793
1790
  process.on('SIGINT', () => {
@@ -1881,7 +1878,6 @@ program
1881
1878
  };
1882
1879
  // Try daemon socket first (preferred path)
1883
1880
  try {
1884
- const { getProjectPaths } = await import('@agent-relay/config');
1885
1881
  const paths = getProjectPaths();
1886
1882
  // TODO: Re-enable daemon-based spawning when client.spawn() is implemented
1887
1883
  // See: docs/SDK-MIGRATION-PLAN.md for planned implementation
@@ -1936,7 +1932,6 @@ program
1936
1932
  const port = options.port || DEFAULT_DASHBOARD_PORT;
1937
1933
  // Try daemon socket first (preferred path)
1938
1934
  try {
1939
- const { getProjectPaths } = await import('@agent-relay/config');
1940
1935
  const paths = getProjectPaths();
1941
1936
  const client = new RelayClient({
1942
1937
  socketPath: paths.socketPath,
@@ -1990,7 +1985,6 @@ program
1990
1985
  .argument('<name>', 'Agent name')
1991
1986
  .option('--force', 'Skip graceful shutdown, kill immediately')
1992
1987
  .action(async (name, options) => {
1993
- const { getProjectPaths } = await import('@agent-relay/config');
1994
1988
  const paths = getProjectPaths();
1995
1989
  const workers = readWorkersMetadata(paths.projectRoot);
1996
1990
  const worker = workers.find(w => w.name === name);
@@ -2051,7 +2045,6 @@ cloudCommand
2051
2045
  .action(async (options) => {
2052
2046
  const os = await import('node:os');
2053
2047
  const crypto = await import('node:crypto');
2054
- const readline = await import('node:readline');
2055
2048
  const cloudUrl = options.cloudUrl;
2056
2049
  const machineName = options.name || os.hostname();
2057
2050
  // Generate machine ID
@@ -2212,7 +2205,6 @@ cloudCommand
2212
2205
  console.log(` Linked: ${new Date(config.linkedAt).toLocaleString()}`);
2213
2206
  console.log('');
2214
2207
  // Check if daemon is running and connected
2215
- const { getProjectPaths } = await import('@agent-relay/config');
2216
2208
  const paths = getProjectPaths();
2217
2209
  if (fs.existsSync(paths.socketPath)) {
2218
2210
  console.log(' Daemon: Running');
@@ -2297,12 +2289,10 @@ program
2297
2289
  .argument('[args...]', 'Arguments to pass to trail CLI')
2298
2290
  .allowUnknownOption()
2299
2291
  .action(async (args) => {
2300
- const { spawn } = await import('node:child_process');
2301
- const { getProjectPaths } = await import('@agent-relay/config');
2302
2292
  const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('@agent-relay/config/trajectory-config');
2303
2293
  const paths = getProjectPaths();
2304
2294
  // Check if trail is available
2305
- const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
2295
+ const trailCheck = spawnProcess('which', ['trail'], { stdio: 'pipe' });
2306
2296
  const trailExists = await new Promise((resolve) => {
2307
2297
  trailCheck.on('close', (code) => resolve(code === 0));
2308
2298
  trailCheck.on('error', () => resolve(false));
@@ -2326,7 +2316,7 @@ program
2326
2316
  const trajectoriesDir = getPrimaryTrajectoriesDir(paths.projectRoot);
2327
2317
  ensureTrajectoriesDir(paths.projectRoot);
2328
2318
  // Spawn trail with the provided arguments
2329
- const trailProc = spawn('trail', args, {
2319
+ const trailProc = spawnProcess('trail', args, {
2330
2320
  cwd: paths.projectRoot,
2331
2321
  stdio: 'inherit',
2332
2322
  env: {
@@ -2760,7 +2750,6 @@ program
2760
2750
  .option('--output-dir <dir>', 'Directory for profile output', './profiles')
2761
2751
  .option('--expose-gc', 'Expose garbage collector for manual GC')
2762
2752
  .action(async (commandParts, options) => {
2763
- const { getProjectPaths } = await import('@agent-relay/config');
2764
2753
  if (!commandParts || commandParts.length === 0) {
2765
2754
  console.error('No command specified');
2766
2755
  process.exit(1);
@@ -3099,9 +3088,6 @@ program
3099
3088
  });
3100
3089
  // init - First-time setup wizard for Agent Relay
3101
3090
  async function runInit(options) {
3102
- const readline = await import('node:readline');
3103
- const { existsSync } = await import('node:fs');
3104
- const { spawn } = await import('node:child_process');
3105
3091
  // Helper to prompt user
3106
3092
  const prompt = async (question, defaultYes = true) => {
3107
3093
  if (options.yes)
@@ -3140,26 +3126,25 @@ async function runInit(options) {
3140
3126
  // Step 2: Check daemon status
3141
3127
  let daemonRunning = false;
3142
3128
  const socketPath = process.env.RELAY_SOCKET;
3143
- if (socketPath && existsSync(socketPath)) {
3129
+ if (socketPath && fs.existsSync(socketPath)) {
3144
3130
  daemonRunning = true;
3145
3131
  }
3146
3132
  else {
3147
3133
  // Check default locations
3148
3134
  const { homedir } = await import('node:os');
3149
- const { join } = await import('node:path');
3150
3135
  const platform = process.platform;
3151
3136
  let dataDir;
3152
3137
  if (platform === 'darwin') {
3153
- dataDir = join(homedir(), 'Library', 'Application Support', 'agent-relay');
3138
+ dataDir = path.join(homedir(), 'Library', 'Application Support', 'agent-relay');
3154
3139
  }
3155
3140
  else if (platform === 'win32') {
3156
- dataDir = join(process.env.APPDATA || homedir(), 'agent-relay');
3141
+ dataDir = path.join(process.env.APPDATA || homedir(), 'agent-relay');
3157
3142
  }
3158
3143
  else {
3159
- 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');
3160
3145
  }
3161
- const defaultSocket = join(dataDir, 'projects', 'default', 'daemon.sock');
3162
- if (existsSync(defaultSocket)) {
3146
+ const defaultSocket = path.join(dataDir, 'projects', 'default', 'daemon.sock');
3147
+ if (fs.existsSync(defaultSocket)) {
3163
3148
  daemonRunning = true;
3164
3149
  }
3165
3150
  }
@@ -3222,7 +3207,7 @@ async function runInit(options) {
3222
3207
  console.log('');
3223
3208
  console.log(' Starting daemon...');
3224
3209
  // Start daemon in background
3225
- const daemonProcess = spawn(process.execPath, [process.argv[1], 'up', '--background'], {
3210
+ const daemonProcess = spawnProcess(process.execPath, [process.argv[1], 'up', '--background'], {
3226
3211
  detached: true,
3227
3212
  stdio: 'ignore',
3228
3213
  });