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.
- package/dist/index.cjs +31903 -33913
- package/dist/src/cli/index.js +36 -51
- package/dist/src/cli/index.js.map +1 -1
- package/package.json +18 -19
- package/packages/api-types/package.json +1 -1
- package/packages/benchmark/package.json +4 -4
- package/packages/bridge/package.json +8 -8
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/dist/project-namespace.d.ts +28 -0
- package/packages/config/dist/project-namespace.d.ts.map +1 -1
- package/packages/config/dist/project-namespace.js +42 -0
- package/packages/config/dist/project-namespace.js.map +1 -1
- package/packages/config/package.json +2 -2
- package/packages/config/src/project-namespace.ts +65 -0
- package/packages/continuity/dist/formatter.d.ts +8 -2
- package/packages/continuity/dist/formatter.d.ts.map +1 -1
- package/packages/continuity/dist/formatter.js +142 -7
- package/packages/continuity/dist/formatter.js.map +1 -1
- package/packages/continuity/dist/index.d.ts +1 -0
- package/packages/continuity/dist/index.d.ts.map +1 -1
- package/packages/continuity/dist/index.js +2 -0
- package/packages/continuity/dist/index.js.map +1 -1
- package/packages/continuity/package.json +4 -1
- package/packages/continuity/src/formatter.ts +175 -10
- package/packages/continuity/src/index.ts +3 -0
- package/packages/daemon/dist/enhanced-features.d.ts +2 -3
- package/packages/daemon/dist/enhanced-features.d.ts.map +1 -1
- package/packages/daemon/dist/enhanced-features.js +1 -0
- package/packages/daemon/dist/enhanced-features.js.map +1 -1
- package/packages/daemon/dist/index.d.ts +0 -2
- package/packages/daemon/dist/index.d.ts.map +1 -1
- package/packages/daemon/dist/index.js +0 -3
- package/packages/daemon/dist/index.js.map +1 -1
- package/packages/daemon/dist/server.d.ts +0 -6
- package/packages/daemon/dist/server.d.ts.map +1 -1
- package/packages/daemon/dist/server.js +20 -119
- package/packages/daemon/dist/server.js.map +1 -1
- package/packages/daemon/package.json +12 -14
- package/packages/daemon/src/enhanced-features.ts +4 -4
- package/packages/daemon/src/index.ts +0 -4
- package/packages/daemon/src/server.ts +19 -127
- package/packages/daemon/vitest.config.ts +9 -0
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/package.json +3 -3
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/dist/adapter.d.ts +5 -5
- package/packages/storage/dist/adapter.js +9 -9
- package/packages/storage/dist/adapter.js.map +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/storage/src/adapter.ts +9 -9
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
- package/packages/wrapper/package.json +6 -6
- package/scripts/build-cjs.mjs +2 -0
- package/packages/daemon/dist/migrations/index.d.ts +0 -73
- package/packages/daemon/dist/migrations/index.d.ts.map +0 -1
- package/packages/daemon/dist/migrations/index.js +0 -241
- package/packages/daemon/dist/migrations/index.js.map +0 -1
- package/packages/daemon/dist/relay-ledger.d.ts +0 -263
- package/packages/daemon/dist/relay-ledger.d.ts.map +0 -1
- package/packages/daemon/dist/relay-ledger.js +0 -538
- package/packages/daemon/dist/relay-ledger.js.map +0 -1
- package/packages/daemon/dist/relay-watchdog.d.ts +0 -125
- package/packages/daemon/dist/relay-watchdog.d.ts.map +0 -1
- package/packages/daemon/dist/relay-watchdog.js +0 -611
- package/packages/daemon/dist/relay-watchdog.js.map +0 -1
- package/packages/daemon/src/migrations/0001_initial.sql +0 -72
- package/packages/daemon/src/migrations/index.test.ts +0 -195
- package/packages/daemon/src/migrations/index.ts +0 -286
- package/packages/daemon/src/relay-ledger.test.ts +0 -358
- package/packages/daemon/src/relay-ledger.ts +0 -713
- package/packages/daemon/src/relay-watchdog.test.ts +0 -881
- package/packages/daemon/src/relay-watchdog.ts +0 -785
package/dist/src/cli/index.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
.
|
|
1103
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3210
|
+
const daemonProcess = spawnProcess(process.execPath, [process.argv[1], 'up', '--background'], {
|
|
3226
3211
|
detached: true,
|
|
3227
3212
|
stdio: 'ignore',
|
|
3228
3213
|
});
|