loopsy 1.0.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/LICENSE +190 -0
- package/README.md +425 -0
- package/dist/cli/commands/connect.d.ts +2 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +120 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/context.d.ts +2 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +39 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +4 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +55 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +2 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +24 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +130 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/exec.d.ts +2 -0
- package/dist/cli/commands/exec.d.ts.map +1 -0
- package/dist/cli/commands/exec.js +34 -0
- package/dist/cli/commands/exec.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +71 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/key.d.ts +2 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +39 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +2 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +26 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +4 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +70 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/pair.d.ts +6 -0
- package/dist/cli/commands/pair.d.ts.map +1 -0
- package/dist/cli/commands/pair.js +208 -0
- package/dist/cli/commands/pair.js.map +1 -0
- package/dist/cli/commands/peers.d.ts +2 -0
- package/dist/cli/commands/peers.d.ts.map +1 -0
- package/dist/cli/commands/peers.js +29 -0
- package/dist/cli/commands/peers.js.map +1 -0
- package/dist/cli/commands/service/linux.d.ts +7 -0
- package/dist/cli/commands/service/linux.d.ts.map +1 -0
- package/dist/cli/commands/service/linux.js +86 -0
- package/dist/cli/commands/service/linux.js.map +1 -0
- package/dist/cli/commands/service/macos.d.ts +7 -0
- package/dist/cli/commands/service/macos.d.ts.map +1 -0
- package/dist/cli/commands/service/macos.js +83 -0
- package/dist/cli/commands/service/macos.js.map +1 -0
- package/dist/cli/commands/service/windows.d.ts +7 -0
- package/dist/cli/commands/service/windows.d.ts.map +1 -0
- package/dist/cli/commands/service/windows.js +52 -0
- package/dist/cli/commands/service/windows.js.map +1 -0
- package/dist/cli/commands/service.d.ts +4 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +68 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/session.d.ts +8 -0
- package/dist/cli/commands/session.d.ts.map +1 -0
- package/dist/cli/commands/session.js +270 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/transfer.d.ts +3 -0
- package/dist/cli/commands/transfer.d.ts.map +1 -0
- package/dist/cli/commands/transfer.js +57 -0
- package/dist/cli/commands/transfer.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/package-root.d.ts +27 -0
- package/dist/cli/package-root.d.ts.map +1 -0
- package/dist/cli/package-root.js +54 -0
- package/dist/cli/package-root.js.map +1 -0
- package/dist/cli/utils.d.ts +11 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +48 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/daemon/config.d.ts +4 -0
- package/dist/daemon/config.d.ts.map +1 -0
- package/dist/daemon/config.js +58 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/hooks/permission-hook.mjs +108 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +3 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/main.d.ts +3 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +28 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/middleware/auth.d.ts +3 -0
- package/dist/daemon/middleware/auth.d.ts.map +1 -0
- package/dist/daemon/middleware/auth.js +22 -0
- package/dist/daemon/middleware/auth.js.map +1 -0
- package/dist/daemon/routes/ai-tasks.d.ts +4 -0
- package/dist/daemon/routes/ai-tasks.d.ts.map +1 -0
- package/dist/daemon/routes/ai-tasks.js +146 -0
- package/dist/daemon/routes/ai-tasks.js.map +1 -0
- package/dist/daemon/routes/context.d.ts +4 -0
- package/dist/daemon/routes/context.d.ts.map +1 -0
- package/dist/daemon/routes/context.js +49 -0
- package/dist/daemon/routes/context.js.map +1 -0
- package/dist/daemon/routes/execute.d.ts +4 -0
- package/dist/daemon/routes/execute.d.ts.map +1 -0
- package/dist/daemon/routes/execute.js +74 -0
- package/dist/daemon/routes/execute.js.map +1 -0
- package/dist/daemon/routes/health.d.ts +15 -0
- package/dist/daemon/routes/health.d.ts.map +1 -0
- package/dist/daemon/routes/health.js +38 -0
- package/dist/daemon/routes/health.js.map +1 -0
- package/dist/daemon/routes/pair.d.ts +11 -0
- package/dist/daemon/routes/pair.d.ts.map +1 -0
- package/dist/daemon/routes/pair.js +149 -0
- package/dist/daemon/routes/pair.js.map +1 -0
- package/dist/daemon/routes/peers.d.ts +5 -0
- package/dist/daemon/routes/peers.d.ts.map +1 -0
- package/dist/daemon/routes/peers.js +69 -0
- package/dist/daemon/routes/peers.js.map +1 -0
- package/dist/daemon/routes/transfer.d.ts +4 -0
- package/dist/daemon/routes/transfer.d.ts.map +1 -0
- package/dist/daemon/routes/transfer.js +135 -0
- package/dist/daemon/routes/transfer.js.map +1 -0
- package/dist/daemon/server.d.ts +8 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +170 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/services/ai-task-manager.d.ts +56 -0
- package/dist/daemon/services/ai-task-manager.d.ts.map +1 -0
- package/dist/daemon/services/ai-task-manager.js +491 -0
- package/dist/daemon/services/ai-task-manager.js.map +1 -0
- package/dist/daemon/services/audit-logger.d.ts +16 -0
- package/dist/daemon/services/audit-logger.d.ts.map +1 -0
- package/dist/daemon/services/audit-logger.js +23 -0
- package/dist/daemon/services/audit-logger.js.map +1 -0
- package/dist/daemon/services/context-store.d.ts +17 -0
- package/dist/daemon/services/context-store.d.ts.map +1 -0
- package/dist/daemon/services/context-store.js +97 -0
- package/dist/daemon/services/context-store.js.map +1 -0
- package/dist/daemon/services/job-manager.d.ts +19 -0
- package/dist/daemon/services/job-manager.d.ts.map +1 -0
- package/dist/daemon/services/job-manager.js +92 -0
- package/dist/daemon/services/job-manager.js.map +1 -0
- package/dist/daemon/services/tls-manager.d.ts +33 -0
- package/dist/daemon/services/tls-manager.d.ts.map +1 -0
- package/dist/daemon/services/tls-manager.js +114 -0
- package/dist/daemon/services/tls-manager.js.map +1 -0
- package/dist/daemon/utils/which.d.ts +2 -0
- package/dist/daemon/utils/which.d.ts.map +1 -0
- package/dist/daemon/utils/which.js +18 -0
- package/dist/daemon/utils/which.js.map +1 -0
- package/dist/dashboard/config.d.ts +8 -0
- package/dist/dashboard/config.d.ts.map +1 -0
- package/dist/dashboard/config.js +22 -0
- package/dist/dashboard/config.js.map +1 -0
- package/dist/dashboard/public/app.js +120 -0
- package/dist/dashboard/public/icon-192.png +0 -0
- package/dist/dashboard/public/icon-512.png +0 -0
- package/dist/dashboard/public/index.html +85 -0
- package/dist/dashboard/public/manifest.json +12 -0
- package/dist/dashboard/public/style.css +784 -0
- package/dist/dashboard/public/sw.js +31 -0
- package/dist/dashboard/public/views/ai-tasks.js +679 -0
- package/dist/dashboard/public/views/context.js +167 -0
- package/dist/dashboard/public/views/messages.js +263 -0
- package/dist/dashboard/public/views/overview.js +228 -0
- package/dist/dashboard/public/views/peers.js +136 -0
- package/dist/dashboard/public/views/terminal.js +153 -0
- package/dist/dashboard/routes/ai-tasks.d.ts +3 -0
- package/dist/dashboard/routes/ai-tasks.d.ts.map +1 -0
- package/dist/dashboard/routes/ai-tasks.js +193 -0
- package/dist/dashboard/routes/ai-tasks.js.map +1 -0
- package/dist/dashboard/routes/messages.d.ts +3 -0
- package/dist/dashboard/routes/messages.d.ts.map +1 -0
- package/dist/dashboard/routes/messages.js +137 -0
- package/dist/dashboard/routes/messages.js.map +1 -0
- package/dist/dashboard/routes/peer-utils.d.ts +17 -0
- package/dist/dashboard/routes/peer-utils.d.ts.map +1 -0
- package/dist/dashboard/routes/peer-utils.js +193 -0
- package/dist/dashboard/routes/peer-utils.js.map +1 -0
- package/dist/dashboard/routes/peers-all.d.ts +3 -0
- package/dist/dashboard/routes/peers-all.d.ts.map +1 -0
- package/dist/dashboard/routes/peers-all.js +8 -0
- package/dist/dashboard/routes/peers-all.js.map +1 -0
- package/dist/dashboard/routes/proxy.d.ts +3 -0
- package/dist/dashboard/routes/proxy.d.ts.map +1 -0
- package/dist/dashboard/routes/proxy.js +59 -0
- package/dist/dashboard/routes/proxy.js.map +1 -0
- package/dist/dashboard/routes/sessions.d.ts +3 -0
- package/dist/dashboard/routes/sessions.d.ts.map +1 -0
- package/dist/dashboard/routes/sessions.js +64 -0
- package/dist/dashboard/routes/sessions.js.map +1 -0
- package/dist/dashboard/routes/sse.d.ts +3 -0
- package/dist/dashboard/routes/sse.d.ts.map +1 -0
- package/dist/dashboard/routes/sse.js +49 -0
- package/dist/dashboard/routes/sse.js.map +1 -0
- package/dist/dashboard/routes/status.d.ts +3 -0
- package/dist/dashboard/routes/status.d.ts.map +1 -0
- package/dist/dashboard/routes/status.js +38 -0
- package/dist/dashboard/routes/status.js.map +1 -0
- package/dist/dashboard/server.d.ts +3 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +77 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/session-manager.d.ts +17 -0
- package/dist/dashboard/session-manager.d.ts.map +1 -0
- package/dist/dashboard/session-manager.js +225 -0
- package/dist/dashboard/session-manager.js.map +1 -0
- package/dist/discovery/health-checker.d.ts +15 -0
- package/dist/discovery/health-checker.d.ts.map +1 -0
- package/dist/discovery/health-checker.js +47 -0
- package/dist/discovery/health-checker.js.map +1 -0
- package/dist/discovery/index.d.ts +4 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +4 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/mdns.d.ts +21 -0
- package/dist/discovery/mdns.d.ts.map +1 -0
- package/dist/discovery/mdns.js +83 -0
- package/dist/discovery/mdns.js.map +1 -0
- package/dist/discovery/peer-registry.d.ts +18 -0
- package/dist/discovery/peer-registry.d.ts.map +1 -0
- package/dist/discovery/peer-registry.js +81 -0
- package/dist/discovery/peer-registry.js.map +1 -0
- package/dist/mcp-server/daemon-client.d.ts +69 -0
- package/dist/mcp-server/daemon-client.d.ts.map +1 -0
- package/dist/mcp-server/daemon-client.js +281 -0
- package/dist/mcp-server/daemon-client.js.map +1 -0
- package/dist/mcp-server/index.d.ts +3 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +406 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/protocol/constants.d.ts +66 -0
- package/dist/protocol/constants.d.ts.map +1 -0
- package/dist/protocol/constants.js +66 -0
- package/dist/protocol/constants.js.map +1 -0
- package/dist/protocol/errors.d.ts +47 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +62 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +5 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +5 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/schemas.d.ts +209 -0
- package/dist/protocol/schemas.d.ts.map +1 -0
- package/dist/protocol/schemas.js +115 -0
- package/dist/protocol/schemas.js.map +1 -0
- package/dist/protocol/types.d.ts +302 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +2 -0
- package/dist/protocol/types.js.map +1 -0
- package/package.json +50 -0
- package/scripts/postinstall.mjs +42 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { daemonMainPath } from '../../package-root.js';
|
|
3
|
+
const TASK_NAME = 'LoopsyDaemon';
|
|
4
|
+
export async function enableWindows() {
|
|
5
|
+
const nodePath = process.execPath;
|
|
6
|
+
const daemonPath = daemonMainPath();
|
|
7
|
+
// Delete existing task if present (ignore errors)
|
|
8
|
+
try {
|
|
9
|
+
execSync(`schtasks /delete /tn "${TASK_NAME}" /f`, { stdio: 'ignore' });
|
|
10
|
+
}
|
|
11
|
+
catch { }
|
|
12
|
+
// Create a task that runs at logon
|
|
13
|
+
// /sc onlogon: trigger on user logon
|
|
14
|
+
// /rl LIMITED: run with user privileges (no elevation)
|
|
15
|
+
const cmd = `schtasks /create /tn "${TASK_NAME}" /tr "\\"${nodePath}\\" \\"${daemonPath}\\"" /sc onlogon /rl LIMITED /f`;
|
|
16
|
+
execSync(cmd);
|
|
17
|
+
// Also start it now
|
|
18
|
+
try {
|
|
19
|
+
execSync(`schtasks /run /tn "${TASK_NAME}"`, { stdio: 'ignore' });
|
|
20
|
+
}
|
|
21
|
+
catch { }
|
|
22
|
+
console.log('Loopsy daemon registered with Task Scheduler');
|
|
23
|
+
console.log('The daemon will start automatically on logon');
|
|
24
|
+
}
|
|
25
|
+
export async function disableWindows() {
|
|
26
|
+
// Stop the running task
|
|
27
|
+
try {
|
|
28
|
+
execSync(`schtasks /end /tn "${TASK_NAME}"`, { stdio: 'ignore' });
|
|
29
|
+
}
|
|
30
|
+
catch { }
|
|
31
|
+
// Delete the scheduled task
|
|
32
|
+
try {
|
|
33
|
+
execSync(`schtasks /delete /tn "${TASK_NAME}" /f`);
|
|
34
|
+
}
|
|
35
|
+
catch { }
|
|
36
|
+
console.log('Loopsy daemon unregistered from Task Scheduler');
|
|
37
|
+
}
|
|
38
|
+
export async function statusWindows() {
|
|
39
|
+
let enabled = false;
|
|
40
|
+
let running = false;
|
|
41
|
+
try {
|
|
42
|
+
const output = execSync(`schtasks /query /tn "${TASK_NAME}" /fo csv /nh`, {
|
|
43
|
+
encoding: 'utf-8',
|
|
44
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
45
|
+
});
|
|
46
|
+
enabled = output.includes(TASK_NAME);
|
|
47
|
+
running = output.includes('Running');
|
|
48
|
+
}
|
|
49
|
+
catch { }
|
|
50
|
+
return { enabled, running };
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../../src/commands/service/windows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,SAAS,GAAG,cAAc,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,kDAAkD;IAClD,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,mCAAmC;IACnC,qCAAqC;IACrC,uDAAuD;IACvD,MAAM,GAAG,GAAG,yBAAyB,SAAS,aAAa,QAAQ,UAAU,UAAU,iCAAiC,CAAC;IACzH,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEd,oBAAoB;IACpB,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,wBAAwB;IACxB,IAAI,CAAC;QACH,QAAQ,CAAC,sBAAsB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,4BAA4B;IAC5B,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,SAAS,MAAM,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,SAAS,eAAe,EAAE;YACxE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAuBA,wBAAsB,aAAa,kBAclC;AAED,wBAAsB,cAAc,kBAWnC;AAED,wBAAsB,oBAAoB,kBAsBzC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { platform } from 'node:os';
|
|
2
|
+
async function getPlatformModule() {
|
|
3
|
+
const os = platform();
|
|
4
|
+
switch (os) {
|
|
5
|
+
case 'darwin':
|
|
6
|
+
return import('./service/macos.js');
|
|
7
|
+
case 'linux':
|
|
8
|
+
return import('./service/linux.js');
|
|
9
|
+
case 'win32':
|
|
10
|
+
return import('./service/windows.js');
|
|
11
|
+
default:
|
|
12
|
+
console.error(`Unsupported platform: ${os}`);
|
|
13
|
+
console.error('Supported platforms: macOS (launchd), Linux (systemd), Windows (Task Scheduler)');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function enableCommand() {
|
|
18
|
+
const os = platform();
|
|
19
|
+
const mod = await getPlatformModule();
|
|
20
|
+
console.log(`Platform: ${os}`);
|
|
21
|
+
console.log('');
|
|
22
|
+
if (os === 'darwin') {
|
|
23
|
+
await mod.enableMacos();
|
|
24
|
+
}
|
|
25
|
+
else if (os === 'linux') {
|
|
26
|
+
await mod.enableLinux();
|
|
27
|
+
}
|
|
28
|
+
else if (os === 'win32') {
|
|
29
|
+
await mod.enableWindows();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function disableCommand() {
|
|
33
|
+
const os = platform();
|
|
34
|
+
const mod = await getPlatformModule();
|
|
35
|
+
if (os === 'darwin') {
|
|
36
|
+
await mod.disableMacos();
|
|
37
|
+
}
|
|
38
|
+
else if (os === 'linux') {
|
|
39
|
+
await mod.disableLinux();
|
|
40
|
+
}
|
|
41
|
+
else if (os === 'win32') {
|
|
42
|
+
await mod.disableWindows();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function serviceStatusCommand() {
|
|
46
|
+
const os = platform();
|
|
47
|
+
const mod = await getPlatformModule();
|
|
48
|
+
let status;
|
|
49
|
+
if (os === 'darwin') {
|
|
50
|
+
status = await mod.statusMacos();
|
|
51
|
+
}
|
|
52
|
+
else if (os === 'linux') {
|
|
53
|
+
status = await mod.statusLinux();
|
|
54
|
+
}
|
|
55
|
+
else if (os === 'win32') {
|
|
56
|
+
status = await mod.statusWindows();
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
console.log(`System service: ${status.enabled ? 'enabled' : 'disabled'}`);
|
|
62
|
+
console.log(`Daemon process: ${status.running ? 'running' : 'stopped'}`);
|
|
63
|
+
if (!status.enabled) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log('Run "loopsy enable" to register the daemon as a system service');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function sessionStartCommand(argv: any): Promise<void>;
|
|
2
|
+
export declare function sessionStartFleetCommand(argv: any): Promise<void>;
|
|
3
|
+
export declare function sessionStopCommand(argv: any): Promise<void>;
|
|
4
|
+
export declare function sessionStopAllCommand(): Promise<void>;
|
|
5
|
+
export declare function sessionListCommand(): Promise<void>;
|
|
6
|
+
export declare function sessionStatusCommand(argv: any): Promise<void>;
|
|
7
|
+
export declare function sessionCommand(argv: any): void;
|
|
8
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAwDA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,iBA+GlD;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,GAAG,iBAQvD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,GAAG,iBAWjD;AAED,wBAAsB,qBAAqB,kBAoB1C;AAED,wBAAsB,kBAAkB,kBAwCvC;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,GAAG,iBAuBnD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,QAEvC"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFile, writeFile, mkdir, readdir, unlink } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { homedir, hostname as osHostname } from 'node:os';
|
|
5
|
+
import { parse as parseYaml, stringify as toYaml } from 'yaml';
|
|
6
|
+
import { createServer } from 'node:net';
|
|
7
|
+
import { CONFIG_DIR, CONFIG_FILE, SESSIONS_DIR, DEFAULT_PORT } from '@loopsy/protocol';
|
|
8
|
+
import { daemonMainPath } from '../package-root.js';
|
|
9
|
+
const LOOPSY_DIR = join(homedir(), CONFIG_DIR);
|
|
10
|
+
const SESSIONS_PATH = join(LOOPSY_DIR, SESSIONS_DIR);
|
|
11
|
+
async function loadParentConfig() {
|
|
12
|
+
const raw = await readFile(join(LOOPSY_DIR, CONFIG_FILE), 'utf-8');
|
|
13
|
+
return parseYaml(raw);
|
|
14
|
+
}
|
|
15
|
+
async function isPortFree(port) {
|
|
16
|
+
return new Promise((resolve) => {
|
|
17
|
+
const server = createServer();
|
|
18
|
+
server.once('error', () => resolve(false));
|
|
19
|
+
server.once('listening', () => {
|
|
20
|
+
server.close(() => resolve(true));
|
|
21
|
+
});
|
|
22
|
+
server.listen(port, '0.0.0.0');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async function findFreePort(startPort) {
|
|
26
|
+
for (let port = startPort; port < startPort + 100; port++) {
|
|
27
|
+
if (await isPortFree(port))
|
|
28
|
+
return port;
|
|
29
|
+
}
|
|
30
|
+
throw new Error('No free port found in range');
|
|
31
|
+
}
|
|
32
|
+
async function getRunningSessionPorts() {
|
|
33
|
+
const sessions = [];
|
|
34
|
+
try {
|
|
35
|
+
const dirs = await readdir(SESSIONS_PATH);
|
|
36
|
+
for (const name of dirs) {
|
|
37
|
+
try {
|
|
38
|
+
const configRaw = await readFile(join(SESSIONS_PATH, name, CONFIG_FILE), 'utf-8');
|
|
39
|
+
const config = parseYaml(configRaw);
|
|
40
|
+
const pidRaw = await readFile(join(SESSIONS_PATH, name, 'daemon.pid'), 'utf-8');
|
|
41
|
+
const pid = parseInt(pidRaw, 10);
|
|
42
|
+
process.kill(pid, 0); // Check if running
|
|
43
|
+
sessions.push({ name, port: config.server.port, hostname: config.server?.hostname || name });
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Not running or no config
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// No sessions dir yet
|
|
52
|
+
}
|
|
53
|
+
return sessions;
|
|
54
|
+
}
|
|
55
|
+
export async function sessionStartCommand(argv) {
|
|
56
|
+
const name = argv.name;
|
|
57
|
+
const sessionDir = join(SESSIONS_PATH, name);
|
|
58
|
+
const pidFile = join(sessionDir, 'daemon.pid');
|
|
59
|
+
// Check if already running
|
|
60
|
+
try {
|
|
61
|
+
const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
|
|
62
|
+
process.kill(pid, 0);
|
|
63
|
+
console.log(`Session "${name}" already running (PID ${pid})`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Not running
|
|
68
|
+
}
|
|
69
|
+
// Load parent config
|
|
70
|
+
const parentConfig = await loadParentConfig();
|
|
71
|
+
const machineHostname = parentConfig.server?.hostname || osHostname();
|
|
72
|
+
// Find a free port
|
|
73
|
+
const runningSessions = await getRunningSessionPorts();
|
|
74
|
+
const usedPorts = new Set(runningSessions.map((s) => s.port));
|
|
75
|
+
let port = DEFAULT_PORT + 1;
|
|
76
|
+
while (usedPorts.has(port) || !(await isPortFree(port))) {
|
|
77
|
+
port++;
|
|
78
|
+
if (port > DEFAULT_PORT + 100)
|
|
79
|
+
throw new Error('No free port found');
|
|
80
|
+
}
|
|
81
|
+
// Build sibling manual peers (main daemon + other sessions) with hostnames
|
|
82
|
+
const manualPeers = [
|
|
83
|
+
// Main daemon
|
|
84
|
+
{ address: '127.0.0.1', port: parentConfig.server?.port ?? DEFAULT_PORT, hostname: machineHostname },
|
|
85
|
+
// Existing sibling sessions
|
|
86
|
+
...runningSessions.map((s) => ({ address: '127.0.0.1', port: s.port, hostname: s.hostname })),
|
|
87
|
+
// Remote peers from parent config
|
|
88
|
+
...(parentConfig.discovery?.manualPeers ?? []),
|
|
89
|
+
];
|
|
90
|
+
// Build session config
|
|
91
|
+
const sessionConfig = {
|
|
92
|
+
server: {
|
|
93
|
+
port,
|
|
94
|
+
host: '0.0.0.0',
|
|
95
|
+
hostname: `${machineHostname}-${name}`,
|
|
96
|
+
},
|
|
97
|
+
auth: {
|
|
98
|
+
apiKey: parentConfig.auth.apiKey,
|
|
99
|
+
allowedKeys: { ...parentConfig.auth.allowedKeys },
|
|
100
|
+
},
|
|
101
|
+
execution: parentConfig.execution,
|
|
102
|
+
transfer: parentConfig.transfer,
|
|
103
|
+
rateLimits: parentConfig.rateLimits,
|
|
104
|
+
discovery: {
|
|
105
|
+
enabled: false, // Use manual peers for sessions to avoid mDNS conflicts
|
|
106
|
+
manualPeers: manualPeers,
|
|
107
|
+
},
|
|
108
|
+
logging: { level: 'info' },
|
|
109
|
+
};
|
|
110
|
+
// Write session config
|
|
111
|
+
await mkdir(join(sessionDir, 'logs'), { recursive: true });
|
|
112
|
+
await writeFile(join(sessionDir, CONFIG_FILE), toYaml(sessionConfig));
|
|
113
|
+
// Spawn daemon with --data-dir
|
|
114
|
+
const daemonPath = daemonMainPath();
|
|
115
|
+
const child = spawn('node', [daemonPath, '--data-dir', sessionDir], {
|
|
116
|
+
detached: true,
|
|
117
|
+
stdio: 'ignore',
|
|
118
|
+
});
|
|
119
|
+
if (child.pid) {
|
|
120
|
+
await writeFile(pidFile, String(child.pid));
|
|
121
|
+
child.unref();
|
|
122
|
+
console.log(`Session "${name}" started`);
|
|
123
|
+
console.log(` PID: ${child.pid}`);
|
|
124
|
+
console.log(` Port: ${port}`);
|
|
125
|
+
console.log(` Hostname: ${sessionConfig.server.hostname}`);
|
|
126
|
+
console.log(` Data dir: ${sessionDir}`);
|
|
127
|
+
// Notify existing sibling sessions about the new peer
|
|
128
|
+
for (const sibling of runningSessions) {
|
|
129
|
+
try {
|
|
130
|
+
await fetch(`http://127.0.0.1:${sibling.port}/api/v1/peers`, {
|
|
131
|
+
method: 'POST',
|
|
132
|
+
headers: {
|
|
133
|
+
'Content-Type': 'application/json',
|
|
134
|
+
Authorization: `Bearer ${parentConfig.auth.apiKey}`,
|
|
135
|
+
},
|
|
136
|
+
body: JSON.stringify({ address: '127.0.0.1', port, hostname: sessionConfig.server.hostname }),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Sibling might not be responding yet
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Notify main daemon about the new session
|
|
144
|
+
try {
|
|
145
|
+
await fetch(`http://127.0.0.1:${parentConfig.server?.port ?? DEFAULT_PORT}/api/v1/peers`, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: {
|
|
148
|
+
'Content-Type': 'application/json',
|
|
149
|
+
Authorization: `Bearer ${parentConfig.auth.apiKey}`,
|
|
150
|
+
},
|
|
151
|
+
body: JSON.stringify({ address: '127.0.0.1', port }),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// Main daemon might not be running
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.error(`Failed to start session "${name}"`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function sessionStartFleetCommand(argv) {
|
|
163
|
+
const count = argv.count;
|
|
164
|
+
for (let i = 1; i <= count; i++) {
|
|
165
|
+
const name = `worker-${i}`;
|
|
166
|
+
console.log(`\nStarting session ${i}/${count}...`);
|
|
167
|
+
await sessionStartCommand({ name });
|
|
168
|
+
}
|
|
169
|
+
console.log(`\nFleet of ${count} sessions started.`);
|
|
170
|
+
}
|
|
171
|
+
export async function sessionStopCommand(argv) {
|
|
172
|
+
const name = argv.name;
|
|
173
|
+
const pidFile = join(SESSIONS_PATH, name, 'daemon.pid');
|
|
174
|
+
try {
|
|
175
|
+
const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
|
|
176
|
+
process.kill(pid, 'SIGTERM');
|
|
177
|
+
await unlink(pidFile);
|
|
178
|
+
console.log(`Session "${name}" stopped (PID ${pid})`);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
console.log(`Session "${name}" is not running`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export async function sessionStopAllCommand() {
|
|
185
|
+
try {
|
|
186
|
+
const dirs = await readdir(SESSIONS_PATH);
|
|
187
|
+
let stopped = 0;
|
|
188
|
+
for (const name of dirs) {
|
|
189
|
+
const pidFile = join(SESSIONS_PATH, name, 'daemon.pid');
|
|
190
|
+
try {
|
|
191
|
+
const pid = parseInt(await readFile(pidFile, 'utf-8'), 10);
|
|
192
|
+
process.kill(pid, 'SIGTERM');
|
|
193
|
+
await unlink(pidFile);
|
|
194
|
+
console.log(`Stopped session "${name}" (PID ${pid})`);
|
|
195
|
+
stopped++;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// Not running
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
console.log(`\nStopped ${stopped} session(s)`);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
console.log('No sessions found');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
export async function sessionListCommand() {
|
|
208
|
+
try {
|
|
209
|
+
const dirs = await readdir(SESSIONS_PATH);
|
|
210
|
+
if (dirs.length === 0) {
|
|
211
|
+
console.log('No sessions found');
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
console.log('Sessions:');
|
|
215
|
+
console.log(' NAME PORT HOSTNAME PID STATUS');
|
|
216
|
+
console.log(' ' + '-'.repeat(70));
|
|
217
|
+
for (const name of dirs.sort()) {
|
|
218
|
+
let port = '?';
|
|
219
|
+
let hostname = '?';
|
|
220
|
+
let pid = '?';
|
|
221
|
+
let status = 'stopped';
|
|
222
|
+
try {
|
|
223
|
+
const configRaw = await readFile(join(SESSIONS_PATH, name, CONFIG_FILE), 'utf-8');
|
|
224
|
+
const config = parseYaml(configRaw);
|
|
225
|
+
port = String(config.server?.port ?? '?');
|
|
226
|
+
hostname = config.server?.hostname ?? '?';
|
|
227
|
+
}
|
|
228
|
+
catch { }
|
|
229
|
+
try {
|
|
230
|
+
const pidRaw = await readFile(join(SESSIONS_PATH, name, 'daemon.pid'), 'utf-8');
|
|
231
|
+
const pidNum = parseInt(pidRaw, 10);
|
|
232
|
+
process.kill(pidNum, 0); // Check if running
|
|
233
|
+
pid = String(pidNum);
|
|
234
|
+
status = 'running';
|
|
235
|
+
}
|
|
236
|
+
catch { }
|
|
237
|
+
console.log(` ${name.padEnd(16)}${port.padEnd(8)}${hostname.padEnd(28)}${pid.padEnd(8)}${status}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
console.log('No sessions found');
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
export async function sessionStatusCommand(argv) {
|
|
245
|
+
const name = argv.name;
|
|
246
|
+
const sessionDir = join(SESSIONS_PATH, name);
|
|
247
|
+
try {
|
|
248
|
+
const configRaw = await readFile(join(sessionDir, CONFIG_FILE), 'utf-8');
|
|
249
|
+
const config = parseYaml(configRaw);
|
|
250
|
+
const port = config.server?.port;
|
|
251
|
+
const res = await fetch(`http://127.0.0.1:${port}/api/v1/status`, {
|
|
252
|
+
headers: { Authorization: `Bearer ${config.auth?.apiKey}` },
|
|
253
|
+
});
|
|
254
|
+
if (res.ok) {
|
|
255
|
+
const status = await res.json();
|
|
256
|
+
console.log(JSON.stringify(status, null, 2));
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
console.log(`Session "${name}" is not responding (HTTP ${res.status})`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
console.log(`Session "${name}" is not running or unreachable`);
|
|
264
|
+
console.log(`Error: ${err.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
export function sessionCommand(argv) {
|
|
268
|
+
// Handled by subcommands
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AAIA,wBAAsB,WAAW,CAAC,IAAI,EAAE,GAAG,iBA4B1C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,GAAG,iBA4B1C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { loadApiKey, parsePeerAddress } from '../utils.js';
|
|
4
|
+
export async function sendCommand(argv) {
|
|
5
|
+
const { address, port } = parsePeerAddress(argv.peer);
|
|
6
|
+
const apiKey = argv.key || await loadApiKey();
|
|
7
|
+
try {
|
|
8
|
+
const fileData = await readFile(argv.src);
|
|
9
|
+
const formData = new FormData();
|
|
10
|
+
formData.append('destPath', argv.dest);
|
|
11
|
+
formData.append('file', new Blob([fileData]), argv.src.split('/').pop() ?? 'file');
|
|
12
|
+
const res = await fetch(`http://${address}:${port}/api/v1/transfer/push`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
15
|
+
body: formData,
|
|
16
|
+
});
|
|
17
|
+
if (!res.ok) {
|
|
18
|
+
const body = await res.json().catch(() => ({}));
|
|
19
|
+
console.error(`Error: ${body.error?.message ?? res.statusText}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const result = await res.json();
|
|
23
|
+
console.log(`File sent: ${result.path} (${result.size} bytes, sha256: ${result.checksum})`);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error(`Failed to send: ${err.message}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function pullCommand(argv) {
|
|
31
|
+
const { address, port } = parsePeerAddress(argv.peer);
|
|
32
|
+
const apiKey = argv.key || await loadApiKey();
|
|
33
|
+
try {
|
|
34
|
+
const res = await fetch(`http://${address}:${port}/api/v1/transfer/pull`, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: {
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
Authorization: `Bearer ${apiKey}`,
|
|
39
|
+
},
|
|
40
|
+
body: JSON.stringify({ sourcePath: argv.src }),
|
|
41
|
+
});
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
const body = await res.json().catch(() => ({}));
|
|
44
|
+
console.error(`Error: ${body.error?.message ?? res.statusText}`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
await mkdir(dirname(argv.dest), { recursive: true });
|
|
48
|
+
const buffer = Buffer.from(await res.arrayBuffer());
|
|
49
|
+
await writeFile(argv.dest, buffer);
|
|
50
|
+
console.log(`File pulled: ${argv.dest} (${buffer.length} bytes)`);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
console.error(`Failed to pull: ${err.message}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAS;IACzC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,UAAU,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC;QAEnF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,OAAO,IAAI,IAAI,uBAAuB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;YAC9C,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAQ,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,mBAAmB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC9F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAS;IACzC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,UAAU,EAAE,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,OAAO,IAAI,IAAI,uBAAuB,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAQ,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import yargs from 'yargs';
|
|
3
|
+
import { hideBin } from 'yargs/helpers';
|
|
4
|
+
import { initCommand } from './commands/init.js';
|
|
5
|
+
import { startCommand, stopCommand, statusCommand } from './commands/daemon.js';
|
|
6
|
+
import { peersCommand } from './commands/peers.js';
|
|
7
|
+
import { execCommand } from './commands/exec.js';
|
|
8
|
+
import { sendCommand, pullCommand } from './commands/transfer.js';
|
|
9
|
+
import { contextCommand } from './commands/context.js';
|
|
10
|
+
import { keyCommand } from './commands/key.js';
|
|
11
|
+
import { logsCommand } from './commands/logs.js';
|
|
12
|
+
import { connectCommand } from './commands/connect.js';
|
|
13
|
+
import { sessionCommand, sessionStartCommand, sessionStartFleetCommand, sessionStopCommand, sessionStopAllCommand, sessionListCommand, sessionStatusCommand, } from './commands/session.js';
|
|
14
|
+
import { dashboardCommand } from './commands/dashboard.js';
|
|
15
|
+
import { enableCommand, disableCommand, serviceStatusCommand } from './commands/service.js';
|
|
16
|
+
import { mcpAddCommand, mcpRemoveCommand, mcpStatusCommand } from './commands/mcp.js';
|
|
17
|
+
import { pairCommand } from './commands/pair.js';
|
|
18
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
19
|
+
yargs(hideBin(process.argv))
|
|
20
|
+
.scriptName('loopsy')
|
|
21
|
+
.command('init', 'Initialize Loopsy config and generate API key', {}, initCommand)
|
|
22
|
+
.command('connect', 'Interactive wizard to connect to another machine', {}, connectCommand)
|
|
23
|
+
.command('start', 'Start the Loopsy daemon', {}, startCommand)
|
|
24
|
+
.command('stop', 'Stop the Loopsy daemon', {}, stopCommand)
|
|
25
|
+
.command('status', 'Show daemon status', {}, statusCommand)
|
|
26
|
+
.command('peers', 'List known peers', (yargs) => yargs
|
|
27
|
+
.command('add <address> [port]', 'Add a manual peer', {
|
|
28
|
+
address: { type: 'string', demandOption: true },
|
|
29
|
+
port: { type: 'number', default: 19532 },
|
|
30
|
+
})
|
|
31
|
+
.command('remove <nodeId>', 'Remove a peer', {
|
|
32
|
+
nodeId: { type: 'string', demandOption: true },
|
|
33
|
+
}), peersCommand)
|
|
34
|
+
.command('exec <peer> <cmd..>', 'Execute a command on a remote peer', (yargs) => yargs
|
|
35
|
+
.positional('peer', { type: 'string', demandOption: true, describe: 'Peer address (host:port)' })
|
|
36
|
+
.positional('cmd', { type: 'string', array: true, demandOption: true })
|
|
37
|
+
.option('key', { type: 'string', alias: 'k', describe: 'API key for the peer' })
|
|
38
|
+
.option('timeout', { type: 'number', alias: 't', describe: 'Timeout in ms' }), execCommand)
|
|
39
|
+
.command('send <peer> <src> <dest>', 'Push a local file to a remote peer', (yargs) => yargs
|
|
40
|
+
.positional('peer', { type: 'string', demandOption: true })
|
|
41
|
+
.positional('src', { type: 'string', demandOption: true })
|
|
42
|
+
.positional('dest', { type: 'string', demandOption: true })
|
|
43
|
+
.option('key', { type: 'string', alias: 'k' }), sendCommand)
|
|
44
|
+
.command('pull <peer> <src> <dest>', 'Pull a file from a remote peer', (yargs) => yargs
|
|
45
|
+
.positional('peer', { type: 'string', demandOption: true })
|
|
46
|
+
.positional('src', { type: 'string', demandOption: true })
|
|
47
|
+
.positional('dest', { type: 'string', demandOption: true })
|
|
48
|
+
.option('key', { type: 'string', alias: 'k' }), pullCommand)
|
|
49
|
+
.command('context', 'Manage shared context', (yargs) => yargs
|
|
50
|
+
.command('set <key> <value>', 'Set a context value', {
|
|
51
|
+
key: { type: 'string', demandOption: true },
|
|
52
|
+
value: { type: 'string', demandOption: true },
|
|
53
|
+
ttl: { type: 'number', describe: 'TTL in seconds' },
|
|
54
|
+
})
|
|
55
|
+
.command('get <key>', 'Get a context value', {
|
|
56
|
+
key: { type: 'string', demandOption: true },
|
|
57
|
+
})
|
|
58
|
+
.command('list', 'List all context entries')
|
|
59
|
+
.command('delete <key>', 'Delete a context entry', {
|
|
60
|
+
key: { type: 'string', demandOption: true },
|
|
61
|
+
}), contextCommand)
|
|
62
|
+
.command('key', 'API key management', (yargs) => yargs
|
|
63
|
+
.command('generate', 'Generate a new API key')
|
|
64
|
+
.command('show', 'Show current API key'), keyCommand)
|
|
65
|
+
.command('logs', 'View daemon logs', (yargs) => yargs.option('follow', { type: 'boolean', alias: 'f', default: false }), logsCommand)
|
|
66
|
+
.command('session', 'Manage daemon sessions', (yargs) => yargs
|
|
67
|
+
.command('start <name>', 'Start a named session', (y) => y.positional('name', { type: 'string', demandOption: true, describe: 'Session name' }), sessionStartCommand)
|
|
68
|
+
.command('start-fleet', 'Start multiple worker sessions', (y) => y.option('count', { type: 'number', alias: 'c', default: 3, describe: 'Number of sessions' }), sessionStartFleetCommand)
|
|
69
|
+
.command('stop <name>', 'Stop a named session', (y) => y.positional('name', { type: 'string', demandOption: true }), sessionStopCommand)
|
|
70
|
+
.command('stop-all', 'Stop all sessions', {}, sessionStopAllCommand)
|
|
71
|
+
.command('list', 'List all sessions', {}, sessionListCommand)
|
|
72
|
+
.command('status <name>', 'Show status for a session', (y) => y.positional('name', { type: 'string', demandOption: true }), sessionStatusCommand)
|
|
73
|
+
.demandCommand(1), sessionCommand)
|
|
74
|
+
.command('dashboard', 'Start the web dashboard for monitoring and control', (yargs) => yargs.option('port', { type: 'number', alias: 'p', default: 19540, describe: 'Dashboard port' }), dashboardCommand)
|
|
75
|
+
.command('pair [address]', 'Pair with another machine (run without address to wait, or with address to connect)', (yargs) => yargs.positional('address', { type: 'string', describe: 'Peer address (host or host:port)' }), pairCommand)
|
|
76
|
+
.command('enable', 'Register daemon as a system service (auto-start on login)', {}, enableCommand)
|
|
77
|
+
.command('disable', 'Unregister daemon from system service', {}, disableCommand)
|
|
78
|
+
.command('service-status', 'Check system service registration status', {}, serviceStatusCommand)
|
|
79
|
+
.command('mcp', 'Manage MCP server registration with Claude Code', (yargs) => yargs
|
|
80
|
+
.command('add', 'Register MCP server with Claude Code', {}, mcpAddCommand)
|
|
81
|
+
.command('remove', 'Unregister MCP server from Claude Code', {}, mcpRemoveCommand)
|
|
82
|
+
.command('status', 'Check MCP server registration', {}, mcpStatusCommand)
|
|
83
|
+
.demandCommand(1), () => { })
|
|
84
|
+
.command('doctor', 'Run health checks on your Loopsy installation', {}, doctorCommand)
|
|
85
|
+
.demandCommand(1, 'You need at least one command')
|
|
86
|
+
.help()
|
|
87
|
+
.version('1.0.0')
|
|
88
|
+
.parse();
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|