@ekkos/cli 1.3.2 → 1.3.5
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/capture/jsonl-rewriter.d.ts +1 -1
- package/dist/capture/jsonl-rewriter.js +3 -3
- package/dist/capture/transcript-repair.d.ts +2 -2
- package/dist/capture/transcript-repair.js +2 -2
- package/dist/commands/claw.d.ts +13 -0
- package/dist/commands/claw.js +253 -0
- package/dist/commands/dashboard.js +617 -83
- package/dist/commands/doctor.d.ts +3 -3
- package/dist/commands/doctor.js +6 -79
- package/dist/commands/gemini.d.ts +19 -0
- package/dist/commands/gemini.js +193 -0
- package/dist/commands/init.js +2 -25
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/run.js +147 -241
- package/dist/commands/scan.d.ts +21 -0
- package/dist/commands/scan.js +386 -0
- package/dist/commands/swarm-dashboard.js +156 -28
- package/dist/commands/swarm.d.ts +1 -1
- package/dist/commands/swarm.js +1 -1
- package/dist/commands/test-claude.d.ts +2 -2
- package/dist/commands/test-claude.js +3 -3
- package/dist/deploy/index.d.ts +0 -2
- package/dist/deploy/index.js +0 -2
- package/dist/deploy/settings.d.ts +2 -2
- package/dist/deploy/settings.js +42 -4
- package/dist/deploy/skills.js +1 -2
- package/dist/index.js +79 -19
- package/dist/lib/usage-parser.js +4 -3
- package/dist/utils/proxy-url.d.ts +12 -1
- package/dist/utils/proxy-url.js +16 -1
- package/dist/utils/templates.js +1 -1
- package/package.json +4 -6
- package/templates/CLAUDE.md +49 -107
- package/dist/agent/daemon.d.ts +0 -130
- package/dist/agent/daemon.js +0 -606
- package/dist/agent/health-check.d.ts +0 -35
- package/dist/agent/health-check.js +0 -243
- package/dist/agent/pty-runner.d.ts +0 -53
- package/dist/agent/pty-runner.js +0 -190
- package/dist/commands/agent.d.ts +0 -50
- package/dist/commands/agent.js +0 -544
- package/dist/commands/setup-remote.d.ts +0 -20
- package/dist/commands/setup-remote.js +0 -582
- package/dist/commands/synk.d.ts +0 -7
- package/dist/commands/synk.js +0 -339
- package/dist/synk/api.d.ts +0 -22
- package/dist/synk/api.js +0 -133
- package/dist/synk/auth.d.ts +0 -7
- package/dist/synk/auth.js +0 -30
- package/dist/synk/config.d.ts +0 -18
- package/dist/synk/config.js +0 -37
- package/dist/synk/daemon/control-client.d.ts +0 -11
- package/dist/synk/daemon/control-client.js +0 -101
- package/dist/synk/daemon/control-server.d.ts +0 -24
- package/dist/synk/daemon/control-server.js +0 -91
- package/dist/synk/daemon/run.d.ts +0 -14
- package/dist/synk/daemon/run.js +0 -338
- package/dist/synk/encryption.d.ts +0 -17
- package/dist/synk/encryption.js +0 -133
- package/dist/synk/index.d.ts +0 -13
- package/dist/synk/index.js +0 -36
- package/dist/synk/machine-client.d.ts +0 -42
- package/dist/synk/machine-client.js +0 -218
- package/dist/synk/persistence.d.ts +0 -51
- package/dist/synk/persistence.js +0 -211
- package/dist/synk/qr.d.ts +0 -5
- package/dist/synk/qr.js +0 -33
- package/dist/synk/session-bridge.d.ts +0 -58
- package/dist/synk/session-bridge.js +0 -171
- package/dist/synk/session-client.d.ts +0 -46
- package/dist/synk/session-client.js +0 -240
- package/dist/synk/types.d.ts +0 -574
- package/dist/synk/types.js +0 -74
- package/dist/utils/verify-remote-terminal.d.ts +0 -10
- package/dist/utils/verify-remote-terminal.js +0 -415
- package/templates/README.md +0 -378
- package/templates/claude-plugins/PHASE2_COMPLETION.md +0 -346
- package/templates/claude-plugins/PLUGIN_PROPOSALS.md +0 -1776
- package/templates/claude-plugins/README.md +0 -587
- package/templates/claude-plugins/agents/code-reviewer.json +0 -14
- package/templates/claude-plugins/agents/debug-detective.json +0 -15
- package/templates/claude-plugins/agents/git-companion.json +0 -14
- package/templates/claude-plugins/blog-manager/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/blog-manager/commands/blog.md +0 -691
- package/templates/claude-plugins/golden-loop-monitor/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/golden-loop-monitor/commands/loop-status.md +0 -434
- package/templates/claude-plugins/learning-tracker/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/learning-tracker/commands/my-patterns.md +0 -282
- package/templates/claude-plugins/memory-lens/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/memory-lens/commands/memory-search.md +0 -181
- package/templates/claude-plugins/pattern-coach/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/pattern-coach/commands/forge.md +0 -365
- package/templates/claude-plugins/project-schema-validator/.claude-plugin/plugin.json +0 -8
- package/templates/claude-plugins/project-schema-validator/commands/validate-schema.md +0 -582
- package/templates/commands/continue.md +0 -47
- package/templates/cursor-rules/ekkos-memory.md +0 -127
- package/templates/ekkos-manifest.json +0 -223
- package/templates/helpers/json-parse.cjs +0 -101
- package/templates/plan-template.md +0 -306
- package/templates/shared/hooks-enabled.json +0 -22
- package/templates/shared/session-words.json +0 -45
- package/templates/skills/ekkOS_Deep_Recall/Skill.md +0 -282
- package/templates/skills/ekkOS_Learn/Skill.md +0 -265
- package/templates/skills/ekkOS_Memory_First/Skill.md +0 -206
- package/templates/skills/ekkOS_Plan_Assist/Skill.md +0 -302
- package/templates/skills/ekkOS_Preferences/Skill.md +0 -247
- package/templates/skills/ekkOS_Reflect/Skill.md +0 -257
- package/templates/skills/ekkOS_Safety/Skill.md +0 -265
- package/templates/skills/ekkOS_Schema/Skill.md +0 -251
- package/templates/skills/ekkOS_Summary/Skill.md +0 -257
- package/templates/spec-template.md +0 -159
- package/templates/windsurf-rules/ekkos-memory.md +0 -127
- package/templates/windsurf-skills/README.md +0 -58
- package/templates/windsurf-skills/ekkos-continue/SKILL.md +0 -81
- package/templates/windsurf-skills/ekkos-golden-loop/SKILL.md +0 -225
- package/templates/windsurf-skills/ekkos-insights/SKILL.md +0 -138
- package/templates/windsurf-skills/ekkos-recall/SKILL.md +0 -96
- package/templates/windsurf-skills/ekkos-safety/SKILL.md +0 -89
- package/templates/windsurf-skills/ekkos-vault/SKILL.md +0 -86
package/dist/commands/synk.js
DELETED
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* ekkOS_synk commands — remote session sync for Claude Code
|
|
4
|
-
*
|
|
5
|
-
* Provides: ekkos synk auth, connect, disconnect, sessions, daemon start/stop/status, doctor
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
-
};
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.registerSynkCommands = registerSynkCommands;
|
|
45
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
-
function registerSynkCommands(program) {
|
|
47
|
-
const synkCmd = program
|
|
48
|
-
.command('synk')
|
|
49
|
-
.description('Remote session sync — control Claude Code from anywhere');
|
|
50
|
-
// ── Auth ──
|
|
51
|
-
synkCmd
|
|
52
|
-
.command('auth')
|
|
53
|
-
.description('Authenticate with synk-server and display QR code for mobile pairing')
|
|
54
|
-
.option('-f, --force', 'Force re-authentication')
|
|
55
|
-
.action(async (options) => {
|
|
56
|
-
const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
|
|
57
|
-
const { readCredentials } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
58
|
-
const { getRandomBytes, encodeBase64 } = await Promise.resolve().then(() => __importStar(require('../synk/encryption')));
|
|
59
|
-
const { authGetToken, generateAppUrl } = await Promise.resolve().then(() => __importStar(require('../synk/auth')));
|
|
60
|
-
const { displayQRCode } = await Promise.resolve().then(() => __importStar(require('../synk/qr')));
|
|
61
|
-
synkConfig.ensureDirectories();
|
|
62
|
-
let credentials = await readCredentials();
|
|
63
|
-
if (credentials && !options.force) {
|
|
64
|
-
console.log(chalk_1.default.green(' Already authenticated with synk-server.'));
|
|
65
|
-
console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
|
|
66
|
-
console.log(chalk_1.default.gray(` Use --force to re-authenticate.`));
|
|
67
|
-
// Still show QR code for mobile pairing
|
|
68
|
-
if (credentials.encryption.type === 'legacy') {
|
|
69
|
-
const url = generateAppUrl(credentials.encryption.secret);
|
|
70
|
-
displayQRCode(url);
|
|
71
|
-
}
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
console.log('');
|
|
75
|
-
console.log(chalk_1.default.cyan.bold(' ekkOS_synk') + chalk_1.default.gray(' — Setting up remote session sync'));
|
|
76
|
-
console.log('');
|
|
77
|
-
// Generate new secret key
|
|
78
|
-
const secret = getRandomBytes(32);
|
|
79
|
-
try {
|
|
80
|
-
const token = await authGetToken(secret);
|
|
81
|
-
const { writeCredentialsLegacy } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
82
|
-
await writeCredentialsLegacy({ secret, token });
|
|
83
|
-
console.log(chalk_1.default.green(' Authenticated successfully!'));
|
|
84
|
-
console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
|
|
85
|
-
console.log(chalk_1.default.gray(` Credentials saved to: ${synkConfig.credentialsFile}`));
|
|
86
|
-
// Show QR code for mobile pairing
|
|
87
|
-
const url = generateAppUrl(secret);
|
|
88
|
-
displayQRCode(url);
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
console.error(chalk_1.default.red(` Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
// ── Status (default when running `ekkos synk`) ──
|
|
96
|
-
synkCmd
|
|
97
|
-
.command('status', { isDefault: true })
|
|
98
|
-
.description('Show synk connection status')
|
|
99
|
-
.action(async () => {
|
|
100
|
-
const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
|
|
101
|
-
const { readCredentials, readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
102
|
-
console.log('');
|
|
103
|
-
console.log(chalk_1.default.cyan.bold(' ekkOS_synk') + chalk_1.default.gray(' — Remote Session Sync'));
|
|
104
|
-
console.log('');
|
|
105
|
-
// Check credentials
|
|
106
|
-
const credentials = await readCredentials();
|
|
107
|
-
if (!credentials) {
|
|
108
|
-
console.log(chalk_1.default.yellow(' Not authenticated.'));
|
|
109
|
-
console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk auth'));
|
|
110
|
-
console.log('');
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
console.log(` ${chalk_1.default.green('●')} Authenticated`);
|
|
114
|
-
console.log(chalk_1.default.gray(` Server: ${synkConfig.serverUrl}`));
|
|
115
|
-
// Check daemon
|
|
116
|
-
const daemonState = await readDaemonState();
|
|
117
|
-
if (daemonState) {
|
|
118
|
-
try {
|
|
119
|
-
process.kill(daemonState.pid, 0);
|
|
120
|
-
console.log(` ${chalk_1.default.green('●')} Daemon running`);
|
|
121
|
-
console.log(chalk_1.default.gray(` PID: ${daemonState.pid} | Port: ${daemonState.httpPort}`));
|
|
122
|
-
console.log(chalk_1.default.gray(` Started: ${daemonState.startTime}`));
|
|
123
|
-
if (daemonState.lastHeartbeat) {
|
|
124
|
-
console.log(chalk_1.default.gray(` Last heartbeat: ${daemonState.lastHeartbeat}`));
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
console.log(` ${chalk_1.default.red('●')} Daemon not running (stale state)`);
|
|
129
|
-
console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk daemon start'));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
console.log(` ${chalk_1.default.gray('○')} Daemon not running`);
|
|
134
|
-
console.log(chalk_1.default.gray(' Run: ') + chalk_1.default.white('ekkos synk daemon start'));
|
|
135
|
-
}
|
|
136
|
-
console.log('');
|
|
137
|
-
});
|
|
138
|
-
// ── Connect ──
|
|
139
|
-
synkCmd
|
|
140
|
-
.command('connect')
|
|
141
|
-
.description('Start daemon and connect to synk-server')
|
|
142
|
-
.action(async () => {
|
|
143
|
-
const { readCredentials } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
144
|
-
const credentials = await readCredentials();
|
|
145
|
-
if (!credentials) {
|
|
146
|
-
console.log(chalk_1.default.yellow(' Not authenticated. Run: ') + chalk_1.default.white('ekkos synk auth'));
|
|
147
|
-
process.exit(1);
|
|
148
|
-
}
|
|
149
|
-
console.log(chalk_1.default.cyan(' Starting synk daemon...'));
|
|
150
|
-
// Spawn daemon in detached mode
|
|
151
|
-
const { spawn } = await Promise.resolve().then(() => __importStar(require('node:child_process')));
|
|
152
|
-
const child = spawn(process.execPath, [process.argv[1], 'synk', 'daemon', 'start-sync'], {
|
|
153
|
-
detached: true,
|
|
154
|
-
stdio: 'ignore',
|
|
155
|
-
});
|
|
156
|
-
child.unref();
|
|
157
|
-
// Wait a moment and check if it started
|
|
158
|
-
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
159
|
-
const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
160
|
-
const state = await readDaemonState();
|
|
161
|
-
if (state) {
|
|
162
|
-
console.log(chalk_1.default.green(' Daemon started successfully!'));
|
|
163
|
-
console.log(chalk_1.default.gray(` PID: ${state.pid} | Port: ${state.httpPort}`));
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
console.log(chalk_1.default.yellow(' Daemon may still be starting. Check: ') + chalk_1.default.white('ekkos synk status'));
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
// ── Disconnect ──
|
|
170
|
-
synkCmd
|
|
171
|
-
.command('disconnect')
|
|
172
|
-
.description('Stop the synk daemon')
|
|
173
|
-
.action(async () => {
|
|
174
|
-
const { stopDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
|
|
175
|
-
console.log(chalk_1.default.cyan(' Stopping synk daemon...'));
|
|
176
|
-
await stopDaemon();
|
|
177
|
-
console.log(chalk_1.default.green(' Daemon stopped.'));
|
|
178
|
-
});
|
|
179
|
-
// ── Sessions ──
|
|
180
|
-
synkCmd
|
|
181
|
-
.command('sessions')
|
|
182
|
-
.description('List active synk sessions')
|
|
183
|
-
.option('-j, --json', 'Output as JSON')
|
|
184
|
-
.action(async (options) => {
|
|
185
|
-
const { listDaemonSessions } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
|
|
186
|
-
const sessions = await listDaemonSessions();
|
|
187
|
-
if (options.json) {
|
|
188
|
-
console.log(JSON.stringify(sessions, null, 2));
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
console.log('');
|
|
192
|
-
console.log(chalk_1.default.cyan.bold(' Synk Sessions'));
|
|
193
|
-
console.log('');
|
|
194
|
-
if (sessions.length === 0) {
|
|
195
|
-
console.log(chalk_1.default.gray(' No active sessions.'));
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
for (const session of sessions) {
|
|
199
|
-
console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(session.synkSessionId || 'unknown')}`);
|
|
200
|
-
console.log(chalk_1.default.gray(` PID: ${session.pid} | Started by: ${session.startedBy}`));
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
console.log('');
|
|
204
|
-
});
|
|
205
|
-
// ── Daemon subcommand ──
|
|
206
|
-
const daemonCmd = synkCmd
|
|
207
|
-
.command('daemon')
|
|
208
|
-
.description('Manage the synk background daemon');
|
|
209
|
-
daemonCmd
|
|
210
|
-
.command('start')
|
|
211
|
-
.description('Start the synk daemon')
|
|
212
|
-
.option('-v, --verbose', 'Show verbose output')
|
|
213
|
-
.action(async (options) => {
|
|
214
|
-
const { checkIfDaemonRunning } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
|
|
215
|
-
const running = await checkIfDaemonRunning();
|
|
216
|
-
if (running) {
|
|
217
|
-
console.log(chalk_1.default.yellow(' Daemon is already running.'));
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
console.log(chalk_1.default.cyan(' Starting synk daemon...'));
|
|
221
|
-
const { spawn } = await Promise.resolve().then(() => __importStar(require('node:child_process')));
|
|
222
|
-
const child = spawn(process.execPath, [process.argv[1], 'synk', 'daemon', 'start-sync'], {
|
|
223
|
-
detached: true,
|
|
224
|
-
stdio: options.verbose ? 'inherit' : 'ignore',
|
|
225
|
-
});
|
|
226
|
-
child.unref();
|
|
227
|
-
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
228
|
-
const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
229
|
-
const state = await readDaemonState();
|
|
230
|
-
if (state) {
|
|
231
|
-
console.log(chalk_1.default.green(' Daemon started.'));
|
|
232
|
-
console.log(chalk_1.default.gray(` PID: ${state.pid} | Port: ${state.httpPort}`));
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
console.log(chalk_1.default.yellow(' Daemon may still be starting...'));
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
// Internal: start-sync runs the daemon in the foreground (called by detached process)
|
|
239
|
-
daemonCmd
|
|
240
|
-
.command('start-sync')
|
|
241
|
-
.description('Run daemon in foreground (internal)')
|
|
242
|
-
.action(async () => {
|
|
243
|
-
const { startDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/run')));
|
|
244
|
-
await startDaemon();
|
|
245
|
-
});
|
|
246
|
-
daemonCmd
|
|
247
|
-
.command('stop')
|
|
248
|
-
.description('Stop the synk daemon')
|
|
249
|
-
.action(async () => {
|
|
250
|
-
const { stopDaemon } = await Promise.resolve().then(() => __importStar(require('../synk/daemon/control-client')));
|
|
251
|
-
console.log(chalk_1.default.cyan(' Stopping synk daemon...'));
|
|
252
|
-
await stopDaemon();
|
|
253
|
-
console.log(chalk_1.default.green(' Daemon stopped.'));
|
|
254
|
-
});
|
|
255
|
-
daemonCmd
|
|
256
|
-
.command('status')
|
|
257
|
-
.description('Show daemon status')
|
|
258
|
-
.option('-j, --json', 'Output as JSON')
|
|
259
|
-
.action(async (options) => {
|
|
260
|
-
const { readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
261
|
-
const state = await readDaemonState();
|
|
262
|
-
if (options.json) {
|
|
263
|
-
console.log(JSON.stringify(state, null, 2));
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
if (!state) {
|
|
267
|
-
console.log(chalk_1.default.gray(' Daemon is not running.'));
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
try {
|
|
271
|
-
process.kill(state.pid, 0);
|
|
272
|
-
console.log(` ${chalk_1.default.green('●')} Daemon running`);
|
|
273
|
-
console.log(chalk_1.default.gray(` PID: ${state.pid}`));
|
|
274
|
-
console.log(chalk_1.default.gray(` Port: ${state.httpPort}`));
|
|
275
|
-
console.log(chalk_1.default.gray(` Started: ${state.startTime}`));
|
|
276
|
-
console.log(chalk_1.default.gray(` Version: ${state.startedWithCliVersion}`));
|
|
277
|
-
if (state.lastHeartbeat) {
|
|
278
|
-
console.log(chalk_1.default.gray(` Last heartbeat: ${state.lastHeartbeat}`));
|
|
279
|
-
}
|
|
280
|
-
if (state.daemonLogPath) {
|
|
281
|
-
console.log(chalk_1.default.gray(` Log: ${state.daemonLogPath}`));
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
catch {
|
|
285
|
-
console.log(` ${chalk_1.default.red('●')} Daemon not running (stale state file)`);
|
|
286
|
-
console.log(chalk_1.default.gray(' Cleaning up...'));
|
|
287
|
-
const { clearDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
288
|
-
await clearDaemonState();
|
|
289
|
-
console.log(chalk_1.default.gray(' Done.'));
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
// ── Doctor ──
|
|
293
|
-
synkCmd
|
|
294
|
-
.command('doctor')
|
|
295
|
-
.description('Diagnose synk connectivity and configuration')
|
|
296
|
-
.action(async () => {
|
|
297
|
-
const { synkConfig } = await Promise.resolve().then(() => __importStar(require('../synk/config')));
|
|
298
|
-
const { readCredentials, readDaemonState } = await Promise.resolve().then(() => __importStar(require('../synk/persistence')));
|
|
299
|
-
const axios = (await Promise.resolve().then(() => __importStar(require('axios')))).default;
|
|
300
|
-
console.log('');
|
|
301
|
-
console.log(chalk_1.default.cyan.bold(' ekkOS_synk Doctor'));
|
|
302
|
-
console.log('');
|
|
303
|
-
// Check config
|
|
304
|
-
console.log(chalk_1.default.gray(' Server URL: ') + synkConfig.serverUrl);
|
|
305
|
-
console.log(chalk_1.default.gray(' Data dir: ') + synkConfig.synkHomeDir);
|
|
306
|
-
// Check credentials
|
|
307
|
-
const credentials = await readCredentials();
|
|
308
|
-
if (credentials) {
|
|
309
|
-
console.log(` ${chalk_1.default.green('✓')} Credentials found`);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
console.log(` ${chalk_1.default.red('✗')} No credentials — run "ekkos synk auth"`);
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
// Check server connectivity
|
|
316
|
-
try {
|
|
317
|
-
const response = await axios.get(synkConfig.serverUrl, { timeout: 5000 });
|
|
318
|
-
console.log(` ${chalk_1.default.green('✓')} Server reachable`);
|
|
319
|
-
}
|
|
320
|
-
catch (error) {
|
|
321
|
-
console.log(` ${chalk_1.default.red('✗')} Server unreachable: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
322
|
-
}
|
|
323
|
-
// Check daemon
|
|
324
|
-
const daemonState = await readDaemonState();
|
|
325
|
-
if (daemonState) {
|
|
326
|
-
try {
|
|
327
|
-
process.kill(daemonState.pid, 0);
|
|
328
|
-
console.log(` ${chalk_1.default.green('✓')} Daemon running (PID ${daemonState.pid})`);
|
|
329
|
-
}
|
|
330
|
-
catch {
|
|
331
|
-
console.log(` ${chalk_1.default.yellow('!')} Stale daemon state (PID ${daemonState.pid} not running)`);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
console.log(` ${chalk_1.default.gray('○')} Daemon not running`);
|
|
336
|
-
}
|
|
337
|
-
console.log('');
|
|
338
|
-
});
|
|
339
|
-
}
|
package/dist/synk/api.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* API client for ekkOS_synk server
|
|
3
|
-
*/
|
|
4
|
-
import type { AgentState, Metadata, Session, Machine, MachineMetadata, DaemonState } from './types';
|
|
5
|
-
import type { Credentials } from './persistence';
|
|
6
|
-
export declare class ApiClient {
|
|
7
|
-
private readonly credential;
|
|
8
|
-
static create(credential: Credentials): Promise<ApiClient>;
|
|
9
|
-
private constructor();
|
|
10
|
-
/** Create a new session or load existing one with the given tag */
|
|
11
|
-
getOrCreateSession(opts: {
|
|
12
|
-
tag: string;
|
|
13
|
-
metadata: Metadata;
|
|
14
|
-
state: AgentState | null;
|
|
15
|
-
}): Promise<Session | null>;
|
|
16
|
-
/** Register or update machine with the server */
|
|
17
|
-
getOrCreateMachine(opts: {
|
|
18
|
-
machineId: string;
|
|
19
|
-
metadata: MachineMetadata;
|
|
20
|
-
daemonState?: DaemonState;
|
|
21
|
-
}): Promise<Machine>;
|
|
22
|
-
}
|
package/dist/synk/api.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* API client for ekkOS_synk server
|
|
4
|
-
*/
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.ApiClient = void 0;
|
|
10
|
-
const axios_1 = __importDefault(require("axios"));
|
|
11
|
-
const encryption_1 = require("./encryption");
|
|
12
|
-
const config_1 = require("./config");
|
|
13
|
-
class ApiClient {
|
|
14
|
-
static async create(credential) {
|
|
15
|
-
return new ApiClient(credential);
|
|
16
|
-
}
|
|
17
|
-
constructor(credential) {
|
|
18
|
-
this.credential = credential;
|
|
19
|
-
}
|
|
20
|
-
/** Create a new session or load existing one with the given tag */
|
|
21
|
-
async getOrCreateSession(opts) {
|
|
22
|
-
let dataEncryptionKey = null;
|
|
23
|
-
let encryptionKey;
|
|
24
|
-
let encryptionVariant;
|
|
25
|
-
if (this.credential.encryption.type === 'dataKey') {
|
|
26
|
-
encryptionKey = (0, encryption_1.getRandomBytes)(32);
|
|
27
|
-
encryptionVariant = 'dataKey';
|
|
28
|
-
const encryptedDataKey = (0, encryption_1.libsodiumEncryptForPublicKey)(encryptionKey, this.credential.encryption.publicKey);
|
|
29
|
-
dataEncryptionKey = new Uint8Array(encryptedDataKey.length + 1);
|
|
30
|
-
dataEncryptionKey.set([0], 0);
|
|
31
|
-
dataEncryptionKey.set(encryptedDataKey, 1);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
encryptionKey = this.credential.encryption.secret;
|
|
35
|
-
encryptionVariant = 'legacy';
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
const response = await axios_1.default.post(`${config_1.synkConfig.serverUrl}/v1/sessions`, {
|
|
39
|
-
tag: opts.tag,
|
|
40
|
-
metadata: (0, encryption_1.encodeBase64)((0, encryption_1.encrypt)(encryptionKey, encryptionVariant, opts.metadata)),
|
|
41
|
-
agentState: opts.state ? (0, encryption_1.encodeBase64)((0, encryption_1.encrypt)(encryptionKey, encryptionVariant, opts.state)) : null,
|
|
42
|
-
dataEncryptionKey: dataEncryptionKey ? (0, encryption_1.encodeBase64)(dataEncryptionKey) : null,
|
|
43
|
-
}, {
|
|
44
|
-
headers: {
|
|
45
|
-
'Authorization': `Bearer ${this.credential.token}`,
|
|
46
|
-
'Content-Type': 'application/json',
|
|
47
|
-
},
|
|
48
|
-
timeout: 60000,
|
|
49
|
-
});
|
|
50
|
-
const raw = response.data.session;
|
|
51
|
-
return {
|
|
52
|
-
id: raw.id,
|
|
53
|
-
seq: raw.seq,
|
|
54
|
-
metadata: (0, encryption_1.decrypt)(encryptionKey, encryptionVariant, (0, encryption_1.decodeBase64)(raw.metadata)),
|
|
55
|
-
metadataVersion: raw.metadataVersion,
|
|
56
|
-
agentState: raw.agentState ? (0, encryption_1.decrypt)(encryptionKey, encryptionVariant, (0, encryption_1.decodeBase64)(raw.agentState)) : null,
|
|
57
|
-
agentStateVersion: raw.agentStateVersion,
|
|
58
|
-
encryptionKey,
|
|
59
|
-
encryptionVariant,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
if (axios_1.default.isAxiosError(error)) {
|
|
64
|
-
const status = error.response?.status;
|
|
65
|
-
if (status === 404 || (status && status >= 500) || error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND') {
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
throw new Error(`Failed to create session: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/** Register or update machine with the server */
|
|
73
|
-
async getOrCreateMachine(opts) {
|
|
74
|
-
let dataEncryptionKey = null;
|
|
75
|
-
let encryptionKey;
|
|
76
|
-
let encryptionVariant;
|
|
77
|
-
if (this.credential.encryption.type === 'dataKey') {
|
|
78
|
-
encryptionVariant = 'dataKey';
|
|
79
|
-
encryptionKey = this.credential.encryption.machineKey;
|
|
80
|
-
const encryptedDataKey = (0, encryption_1.libsodiumEncryptForPublicKey)(this.credential.encryption.machineKey, this.credential.encryption.publicKey);
|
|
81
|
-
dataEncryptionKey = new Uint8Array(encryptedDataKey.length + 1);
|
|
82
|
-
dataEncryptionKey.set([0], 0);
|
|
83
|
-
dataEncryptionKey.set(encryptedDataKey, 1);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
encryptionKey = this.credential.encryption.secret;
|
|
87
|
-
encryptionVariant = 'legacy';
|
|
88
|
-
}
|
|
89
|
-
const createMinimalMachine = () => ({
|
|
90
|
-
id: opts.machineId,
|
|
91
|
-
encryptionKey,
|
|
92
|
-
encryptionVariant,
|
|
93
|
-
metadata: opts.metadata,
|
|
94
|
-
metadataVersion: 0,
|
|
95
|
-
daemonState: opts.daemonState || null,
|
|
96
|
-
daemonStateVersion: 0,
|
|
97
|
-
});
|
|
98
|
-
try {
|
|
99
|
-
const response = await axios_1.default.post(`${config_1.synkConfig.serverUrl}/v1/machines`, {
|
|
100
|
-
id: opts.machineId,
|
|
101
|
-
metadata: (0, encryption_1.encodeBase64)((0, encryption_1.encrypt)(encryptionKey, encryptionVariant, opts.metadata)),
|
|
102
|
-
daemonState: opts.daemonState ? (0, encryption_1.encodeBase64)((0, encryption_1.encrypt)(encryptionKey, encryptionVariant, opts.daemonState)) : undefined,
|
|
103
|
-
dataEncryptionKey: dataEncryptionKey ? (0, encryption_1.encodeBase64)(dataEncryptionKey) : undefined,
|
|
104
|
-
}, {
|
|
105
|
-
headers: {
|
|
106
|
-
'Authorization': `Bearer ${this.credential.token}`,
|
|
107
|
-
'Content-Type': 'application/json',
|
|
108
|
-
},
|
|
109
|
-
timeout: 60000,
|
|
110
|
-
});
|
|
111
|
-
const raw = response.data.machine;
|
|
112
|
-
return {
|
|
113
|
-
id: raw.id,
|
|
114
|
-
encryptionKey,
|
|
115
|
-
encryptionVariant,
|
|
116
|
-
metadata: raw.metadata ? (0, encryption_1.decrypt)(encryptionKey, encryptionVariant, (0, encryption_1.decodeBase64)(raw.metadata)) : opts.metadata,
|
|
117
|
-
metadataVersion: raw.metadataVersion || 0,
|
|
118
|
-
daemonState: raw.daemonState ? (0, encryption_1.decrypt)(encryptionKey, encryptionVariant, (0, encryption_1.decodeBase64)(raw.daemonState)) : null,
|
|
119
|
-
daemonStateVersion: raw.daemonStateVersion || 0,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
if (axios_1.default.isAxiosError(error)) {
|
|
124
|
-
const status = error.response?.status;
|
|
125
|
-
if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND' || status === 404 || (status && status >= 500)) {
|
|
126
|
-
return createMinimalMachine();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return createMinimalMachine();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
exports.ApiClient = ApiClient;
|
package/dist/synk/auth.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Authentication for ekkOS_synk server
|
|
3
|
-
*/
|
|
4
|
-
/** Authenticate with synk-server and obtain a bearer token */
|
|
5
|
-
export declare function authGetToken(secret: Uint8Array): Promise<string>;
|
|
6
|
-
/** Generate a deep link URL for mobile app pairing */
|
|
7
|
-
export declare function generateAppUrl(secret: Uint8Array): string;
|
package/dist/synk/auth.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Authentication for ekkOS_synk server
|
|
4
|
-
*/
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.authGetToken = authGetToken;
|
|
10
|
-
exports.generateAppUrl = generateAppUrl;
|
|
11
|
-
const axios_1 = __importDefault(require("axios"));
|
|
12
|
-
const encryption_1 = require("./encryption");
|
|
13
|
-
const config_1 = require("./config");
|
|
14
|
-
/** Authenticate with synk-server and obtain a bearer token */
|
|
15
|
-
async function authGetToken(secret) {
|
|
16
|
-
const { challenge, publicKey, signature } = (0, encryption_1.authChallenge)(secret);
|
|
17
|
-
const response = await axios_1.default.post(`${config_1.synkConfig.serverUrl}/v1/auth`, {
|
|
18
|
-
challenge: (0, encryption_1.encodeBase64)(challenge),
|
|
19
|
-
publicKey: (0, encryption_1.encodeBase64)(publicKey),
|
|
20
|
-
signature: (0, encryption_1.encodeBase64)(signature),
|
|
21
|
-
});
|
|
22
|
-
if (!response.data.success || !response.data.token) {
|
|
23
|
-
throw new Error('Authentication failed');
|
|
24
|
-
}
|
|
25
|
-
return response.data.token;
|
|
26
|
-
}
|
|
27
|
-
/** Generate a deep link URL for mobile app pairing */
|
|
28
|
-
function generateAppUrl(secret) {
|
|
29
|
-
return `ekkos-synk://${(0, encryption_1.encodeBase64Url)(secret)}`;
|
|
30
|
-
}
|
package/dist/synk/config.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration for ekkOS_synk — remote session sync
|
|
3
|
-
*/
|
|
4
|
-
declare class SynkConfig {
|
|
5
|
-
readonly serverUrl: string;
|
|
6
|
-
readonly synkHomeDir: string;
|
|
7
|
-
readonly logsDir: string;
|
|
8
|
-
readonly settingsFile: string;
|
|
9
|
-
readonly credentialsFile: string;
|
|
10
|
-
readonly daemonStateFile: string;
|
|
11
|
-
readonly daemonLockFile: string;
|
|
12
|
-
readonly isDaemonProcess: boolean;
|
|
13
|
-
readonly disableCaffeinate: boolean;
|
|
14
|
-
constructor();
|
|
15
|
-
ensureDirectories(): void;
|
|
16
|
-
}
|
|
17
|
-
export declare const synkConfig: SynkConfig;
|
|
18
|
-
export {};
|
package/dist/synk/config.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Configuration for ekkOS_synk — remote session sync
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.synkConfig = void 0;
|
|
7
|
-
const node_fs_1 = require("node:fs");
|
|
8
|
-
const node_os_1 = require("node:os");
|
|
9
|
-
const node_path_1 = require("node:path");
|
|
10
|
-
class SynkConfig {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.serverUrl = process.env.SYNK_SERVER_URL || 'https://synk.ekkos.dev';
|
|
13
|
-
const args = process.argv.slice(2);
|
|
14
|
-
this.isDaemonProcess = args.length >= 3 && args[0] === 'synk' && args[1] === 'daemon' && args[2] === 'start-sync';
|
|
15
|
-
if (process.env.SYNK_HOME_DIR) {
|
|
16
|
-
this.synkHomeDir = process.env.SYNK_HOME_DIR.replace(/^~/, (0, node_os_1.homedir)());
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
this.synkHomeDir = (0, node_path_1.join)((0, node_os_1.homedir)(), '.ekkos', 'synk');
|
|
20
|
-
}
|
|
21
|
-
this.logsDir = (0, node_path_1.join)(this.synkHomeDir, 'logs');
|
|
22
|
-
this.settingsFile = (0, node_path_1.join)(this.synkHomeDir, 'settings.json');
|
|
23
|
-
this.credentialsFile = (0, node_path_1.join)(this.synkHomeDir, 'credentials.json');
|
|
24
|
-
this.daemonStateFile = (0, node_path_1.join)(this.synkHomeDir, 'daemon.state.json');
|
|
25
|
-
this.daemonLockFile = (0, node_path_1.join)(this.synkHomeDir, 'daemon.state.json.lock');
|
|
26
|
-
this.disableCaffeinate = ['true', '1', 'yes'].includes(process.env.SYNK_DISABLE_CAFFEINATE?.toLowerCase() || '');
|
|
27
|
-
}
|
|
28
|
-
ensureDirectories() {
|
|
29
|
-
if (!(0, node_fs_1.existsSync)(this.synkHomeDir)) {
|
|
30
|
-
(0, node_fs_1.mkdirSync)(this.synkHomeDir, { recursive: true });
|
|
31
|
-
}
|
|
32
|
-
if (!(0, node_fs_1.existsSync)(this.logsDir)) {
|
|
33
|
-
(0, node_fs_1.mkdirSync)(this.logsDir, { recursive: true });
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
exports.synkConfig = new SynkConfig();
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP client for communicating with a running synk daemon
|
|
3
|
-
*/
|
|
4
|
-
import type { Metadata } from '../types';
|
|
5
|
-
export declare function notifyDaemonSessionStarted(sessionId: string, metadata: Metadata): Promise<any>;
|
|
6
|
-
export declare function listDaemonSessions(): Promise<any[]>;
|
|
7
|
-
export declare function stopDaemonSession(sessionId: string): Promise<boolean>;
|
|
8
|
-
export declare function spawnDaemonSession(directory: string, sessionId?: string): Promise<any>;
|
|
9
|
-
export declare function stopDaemonHttp(): Promise<void>;
|
|
10
|
-
export declare function checkIfDaemonRunning(): Promise<boolean>;
|
|
11
|
-
export declare function stopDaemon(): Promise<void>;
|