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.
- package/dist/index.cjs +31903 -33913
- package/dist/src/cli/index.js +38 -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: {
|
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
.
|
|
1101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3210
|
+
const daemonProcess = spawnProcess(process.execPath, [process.argv[1], 'up', '--background'], {
|
|
3224
3211
|
detached: true,
|
|
3225
3212
|
stdio: 'ignore',
|
|
3226
3213
|
});
|