@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.
Files changed (119) hide show
  1. package/dist/capture/jsonl-rewriter.d.ts +1 -1
  2. package/dist/capture/jsonl-rewriter.js +3 -3
  3. package/dist/capture/transcript-repair.d.ts +2 -2
  4. package/dist/capture/transcript-repair.js +2 -2
  5. package/dist/commands/claw.d.ts +13 -0
  6. package/dist/commands/claw.js +253 -0
  7. package/dist/commands/dashboard.js +617 -83
  8. package/dist/commands/doctor.d.ts +3 -3
  9. package/dist/commands/doctor.js +6 -79
  10. package/dist/commands/gemini.d.ts +19 -0
  11. package/dist/commands/gemini.js +193 -0
  12. package/dist/commands/init.js +2 -25
  13. package/dist/commands/run.d.ts +0 -1
  14. package/dist/commands/run.js +147 -241
  15. package/dist/commands/scan.d.ts +21 -0
  16. package/dist/commands/scan.js +386 -0
  17. package/dist/commands/swarm-dashboard.js +156 -28
  18. package/dist/commands/swarm.d.ts +1 -1
  19. package/dist/commands/swarm.js +1 -1
  20. package/dist/commands/test-claude.d.ts +2 -2
  21. package/dist/commands/test-claude.js +3 -3
  22. package/dist/deploy/index.d.ts +0 -2
  23. package/dist/deploy/index.js +0 -2
  24. package/dist/deploy/settings.d.ts +2 -2
  25. package/dist/deploy/settings.js +42 -4
  26. package/dist/deploy/skills.js +1 -2
  27. package/dist/index.js +79 -19
  28. package/dist/lib/usage-parser.js +4 -3
  29. package/dist/utils/proxy-url.d.ts +12 -1
  30. package/dist/utils/proxy-url.js +16 -1
  31. package/dist/utils/templates.js +1 -1
  32. package/package.json +4 -6
  33. package/templates/CLAUDE.md +49 -107
  34. package/dist/agent/daemon.d.ts +0 -130
  35. package/dist/agent/daemon.js +0 -606
  36. package/dist/agent/health-check.d.ts +0 -35
  37. package/dist/agent/health-check.js +0 -243
  38. package/dist/agent/pty-runner.d.ts +0 -53
  39. package/dist/agent/pty-runner.js +0 -190
  40. package/dist/commands/agent.d.ts +0 -50
  41. package/dist/commands/agent.js +0 -544
  42. package/dist/commands/setup-remote.d.ts +0 -20
  43. package/dist/commands/setup-remote.js +0 -582
  44. package/dist/commands/synk.d.ts +0 -7
  45. package/dist/commands/synk.js +0 -339
  46. package/dist/synk/api.d.ts +0 -22
  47. package/dist/synk/api.js +0 -133
  48. package/dist/synk/auth.d.ts +0 -7
  49. package/dist/synk/auth.js +0 -30
  50. package/dist/synk/config.d.ts +0 -18
  51. package/dist/synk/config.js +0 -37
  52. package/dist/synk/daemon/control-client.d.ts +0 -11
  53. package/dist/synk/daemon/control-client.js +0 -101
  54. package/dist/synk/daemon/control-server.d.ts +0 -24
  55. package/dist/synk/daemon/control-server.js +0 -91
  56. package/dist/synk/daemon/run.d.ts +0 -14
  57. package/dist/synk/daemon/run.js +0 -338
  58. package/dist/synk/encryption.d.ts +0 -17
  59. package/dist/synk/encryption.js +0 -133
  60. package/dist/synk/index.d.ts +0 -13
  61. package/dist/synk/index.js +0 -36
  62. package/dist/synk/machine-client.d.ts +0 -42
  63. package/dist/synk/machine-client.js +0 -218
  64. package/dist/synk/persistence.d.ts +0 -51
  65. package/dist/synk/persistence.js +0 -211
  66. package/dist/synk/qr.d.ts +0 -5
  67. package/dist/synk/qr.js +0 -33
  68. package/dist/synk/session-bridge.d.ts +0 -58
  69. package/dist/synk/session-bridge.js +0 -171
  70. package/dist/synk/session-client.d.ts +0 -46
  71. package/dist/synk/session-client.js +0 -240
  72. package/dist/synk/types.d.ts +0 -574
  73. package/dist/synk/types.js +0 -74
  74. package/dist/utils/verify-remote-terminal.d.ts +0 -10
  75. package/dist/utils/verify-remote-terminal.js +0 -415
  76. package/templates/README.md +0 -378
  77. package/templates/claude-plugins/PHASE2_COMPLETION.md +0 -346
  78. package/templates/claude-plugins/PLUGIN_PROPOSALS.md +0 -1776
  79. package/templates/claude-plugins/README.md +0 -587
  80. package/templates/claude-plugins/agents/code-reviewer.json +0 -14
  81. package/templates/claude-plugins/agents/debug-detective.json +0 -15
  82. package/templates/claude-plugins/agents/git-companion.json +0 -14
  83. package/templates/claude-plugins/blog-manager/.claude-plugin/plugin.json +0 -8
  84. package/templates/claude-plugins/blog-manager/commands/blog.md +0 -691
  85. package/templates/claude-plugins/golden-loop-monitor/.claude-plugin/plugin.json +0 -8
  86. package/templates/claude-plugins/golden-loop-monitor/commands/loop-status.md +0 -434
  87. package/templates/claude-plugins/learning-tracker/.claude-plugin/plugin.json +0 -8
  88. package/templates/claude-plugins/learning-tracker/commands/my-patterns.md +0 -282
  89. package/templates/claude-plugins/memory-lens/.claude-plugin/plugin.json +0 -8
  90. package/templates/claude-plugins/memory-lens/commands/memory-search.md +0 -181
  91. package/templates/claude-plugins/pattern-coach/.claude-plugin/plugin.json +0 -8
  92. package/templates/claude-plugins/pattern-coach/commands/forge.md +0 -365
  93. package/templates/claude-plugins/project-schema-validator/.claude-plugin/plugin.json +0 -8
  94. package/templates/claude-plugins/project-schema-validator/commands/validate-schema.md +0 -582
  95. package/templates/commands/continue.md +0 -47
  96. package/templates/cursor-rules/ekkos-memory.md +0 -127
  97. package/templates/ekkos-manifest.json +0 -223
  98. package/templates/helpers/json-parse.cjs +0 -101
  99. package/templates/plan-template.md +0 -306
  100. package/templates/shared/hooks-enabled.json +0 -22
  101. package/templates/shared/session-words.json +0 -45
  102. package/templates/skills/ekkOS_Deep_Recall/Skill.md +0 -282
  103. package/templates/skills/ekkOS_Learn/Skill.md +0 -265
  104. package/templates/skills/ekkOS_Memory_First/Skill.md +0 -206
  105. package/templates/skills/ekkOS_Plan_Assist/Skill.md +0 -302
  106. package/templates/skills/ekkOS_Preferences/Skill.md +0 -247
  107. package/templates/skills/ekkOS_Reflect/Skill.md +0 -257
  108. package/templates/skills/ekkOS_Safety/Skill.md +0 -265
  109. package/templates/skills/ekkOS_Schema/Skill.md +0 -251
  110. package/templates/skills/ekkOS_Summary/Skill.md +0 -257
  111. package/templates/spec-template.md +0 -159
  112. package/templates/windsurf-rules/ekkos-memory.md +0 -127
  113. package/templates/windsurf-skills/README.md +0 -58
  114. package/templates/windsurf-skills/ekkos-continue/SKILL.md +0 -81
  115. package/templates/windsurf-skills/ekkos-golden-loop/SKILL.md +0 -225
  116. package/templates/windsurf-skills/ekkos-insights/SKILL.md +0 -138
  117. package/templates/windsurf-skills/ekkos-recall/SKILL.md +0 -96
  118. package/templates/windsurf-skills/ekkos-safety/SKILL.md +0 -89
  119. package/templates/windsurf-skills/ekkos-vault/SKILL.md +0 -86
@@ -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
- }
@@ -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;
@@ -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
- }
@@ -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 {};
@@ -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>;