@kraki/tentacle 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/base.d.ts +107 -0
  3. package/dist/adapters/base.js +32 -0
  4. package/dist/adapters/base.js.map +1 -0
  5. package/dist/adapters/copilot.d.ts +57 -0
  6. package/dist/adapters/copilot.js +489 -0
  7. package/dist/adapters/copilot.js.map +1 -0
  8. package/dist/adapters/index.d.ts +5 -0
  9. package/dist/adapters/index.js +4 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/banner-data.json +1 -0
  12. package/dist/banner.d.ts +7 -0
  13. package/dist/banner.js +187 -0
  14. package/dist/banner.js.map +1 -0
  15. package/dist/checks.d.ts +26 -0
  16. package/dist/checks.js +74 -0
  17. package/dist/checks.js.map +1 -0
  18. package/dist/cli.d.ts +15 -0
  19. package/dist/cli.js +306 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +38 -0
  22. package/dist/config.js +113 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/daemon-worker.d.ts +21 -0
  25. package/dist/daemon-worker.js +127 -0
  26. package/dist/daemon-worker.js.map +1 -0
  27. package/dist/daemon.d.ts +24 -0
  28. package/dist/daemon.js +163 -0
  29. package/dist/daemon.js.map +1 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.js +11 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/key-manager.d.ts +28 -0
  34. package/dist/key-manager.js +61 -0
  35. package/dist/key-manager.js.map +1 -0
  36. package/dist/logger.d.ts +8 -0
  37. package/dist/logger.js +30 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/pair.d.ts +32 -0
  40. package/dist/pair.js +131 -0
  41. package/dist/pair.js.map +1 -0
  42. package/dist/parse-permission.d.ts +25 -0
  43. package/dist/parse-permission.js +67 -0
  44. package/dist/parse-permission.js.map +1 -0
  45. package/dist/relay-client.d.ts +90 -0
  46. package/dist/relay-client.js +525 -0
  47. package/dist/relay-client.js.map +1 -0
  48. package/dist/session-manager.d.ts +85 -0
  49. package/dist/session-manager.js +218 -0
  50. package/dist/session-manager.js.map +1 -0
  51. package/dist/setup.d.ts +13 -0
  52. package/dist/setup.js +234 -0
  53. package/dist/setup.js.map +1 -0
  54. package/package.json +48 -0
package/dist/banner.js ADDED
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Animated ASCII banner for Kraki CLI.
3
+ * Renders a colored octopus logo with radial reveal + title animation.
4
+ */
5
+ import chalk from 'chalk';
6
+ import { createRequire } from 'node:module';
7
+ const require = createRequire(import.meta.url);
8
+ const data = require('./banner-data.json');
9
+ const SCRAMBLE = '!@#$%^&*=+<>~/';
10
+ const TITLE = 'KRAKI';
11
+ const TITLE_COLORS = ['#00c9a7', '#00b4d8', '#06b6d4', '#0891b2', '#ea6046'];
12
+ function sleep(ms) {
13
+ return new Promise((r) => setTimeout(r, ms));
14
+ }
15
+ export async function printAnimatedBanner() {
16
+ const { lines, colors, h, w } = data;
17
+ const cx = w / 2;
18
+ const cy = h / 2;
19
+ const cells = [];
20
+ for (let y = 0; y < h; y++) {
21
+ const colorMap = new Map(colors[y].map((c) => [c[0], c]));
22
+ for (let x = 0; x < w; x++) {
23
+ const ch = lines[y][x];
24
+ if (ch === ' ')
25
+ continue;
26
+ const c = colorMap.get(x);
27
+ if (!c)
28
+ continue;
29
+ const dist = Math.sqrt((x - cx) ** 2 + ((y - cy) * 2) ** 2);
30
+ cells.push({ x, y, ch, r: c[1], g: c[2], b: c[3], dist });
31
+ }
32
+ }
33
+ const maxDist = Math.max(...cells.map((c) => c.dist));
34
+ // Build frame buffer
35
+ const buffer = [];
36
+ for (let y = 0; y < h; y++) {
37
+ buffer.push(new Array(w).fill(' '));
38
+ }
39
+ // Group cells into frames by distance
40
+ const totalFrames = 20;
41
+ const frames = Array.from({ length: totalFrames }, () => []);
42
+ for (const cell of cells) {
43
+ const frame = Math.min(Math.floor((cell.dist / maxDist) * totalFrames), totalFrames - 1);
44
+ frames[frame].push(cell);
45
+ }
46
+ // Hide cursor, clear screen, move to top
47
+ process.stdout.write('\x1B[?25l\x1B[2J\x1B[H');
48
+ const leftPad = ' ';
49
+ console.log('');
50
+ // Print empty lines to reserve space
51
+ for (let y = 0; y < h; y++) {
52
+ console.log('');
53
+ }
54
+ // Title + tagline placement: bottom-right, overlapping logo with 1 char padding
55
+ const titleRow = h - 2;
56
+ const taglineRow = h - 1;
57
+ const tagline = 'E2E encrypted AI agent relay';
58
+ // Both lines start right of center of the logo, +8 more right
59
+ const textStart = Math.floor(w / 2) + 7;
60
+ // Total text chars to animate (title spaced + tagline)
61
+ const titleSpaced = TITLE.split('').map((c, i) => ({ ch: c, color: TITLE_COLORS[i] }));
62
+ const totalTextChars = TITLE.length + tagline.length;
63
+ let textCharsShown = 0;
64
+ const textStartFrame = Math.floor(totalFrames * 0.4); // start at 40%, end with logo
65
+ // Redraw helper
66
+ const redraw = () => {
67
+ process.stdout.write(`\x1B[${h}A`);
68
+ for (let y = 0; y < h; y++) {
69
+ const logoChars = [...buffer[y]];
70
+ let suffix = '';
71
+ if (y === titleRow && textCharsShown > 0) {
72
+ const shown = Math.min(textCharsShown, TITLE.length);
73
+ // Clear logo chars from textStart-1 onward on this row
74
+ for (let c = Math.max(0, textStart - 1); c < w; c++)
75
+ logoChars[c] = ' ';
76
+ // Place title chars
77
+ for (let i = 0; i < shown; i++) {
78
+ const col = textStart + i * 2;
79
+ if (col < w) {
80
+ logoChars[col] = chalk.hex(titleSpaced[i].color).bold(titleSpaced[i].ch);
81
+ }
82
+ else {
83
+ suffix += chalk.hex(titleSpaced[i].color).bold(titleSpaced[i].ch) + ' ';
84
+ }
85
+ }
86
+ }
87
+ if (y === taglineRow && textCharsShown > TITLE.length) {
88
+ const tagShown = Math.min(textCharsShown - TITLE.length, tagline.length);
89
+ // Clear logo chars from textStart-1 onward on this row
90
+ for (let c = Math.max(0, textStart - 1); c < w; c++)
91
+ logoChars[c] = ' ';
92
+ // Place tagline chars
93
+ for (let i = 0; i < tagShown; i++) {
94
+ const col = textStart + i;
95
+ if (col < w) {
96
+ logoChars[col] = chalk.dim(tagline[i]);
97
+ }
98
+ else {
99
+ suffix += chalk.dim(tagline[i]);
100
+ }
101
+ }
102
+ }
103
+ process.stdout.write(leftPad + logoChars.join('') + suffix + '\x1B[K\n');
104
+ }
105
+ };
106
+ // Animate logo frames
107
+ for (let f = 0; f < totalFrames; f++) {
108
+ for (const cell of frames[f]) {
109
+ const sc = SCRAMBLE[Math.floor(Math.random() * SCRAMBLE.length)];
110
+ buffer[cell.y][cell.x] = chalk.rgb(cell.r, cell.g, cell.b)(sc);
111
+ }
112
+ if (f > 0) {
113
+ for (const cell of frames[f - 1]) {
114
+ buffer[cell.y][cell.x] = chalk.rgb(cell.r, cell.g, cell.b)(cell.ch);
115
+ }
116
+ }
117
+ // Reveal text chars proportionally so they finish with the logo
118
+ if (f >= textStartFrame) {
119
+ const progress = (f - textStartFrame) / (totalFrames - 1 - textStartFrame);
120
+ textCharsShown = Math.min(Math.floor(progress * totalTextChars), totalTextChars);
121
+ }
122
+ redraw();
123
+ await sleep(50);
124
+ }
125
+ // Resolve final frame
126
+ for (const cell of frames[totalFrames - 1]) {
127
+ buffer[cell.y][cell.x] = chalk.rgb(cell.r, cell.g, cell.b)(cell.ch);
128
+ }
129
+ textCharsShown = totalTextChars;
130
+ redraw();
131
+ console.log('');
132
+ // Show cursor
133
+ process.stdout.write('\x1B[?25h');
134
+ }
135
+ /** Static (non-animated) banner for quick display */
136
+ export function printStaticBanner() {
137
+ const { lines, colors, h, w } = data;
138
+ const titleRow = h - 2;
139
+ const taglineRow = h - 1;
140
+ const tagline = 'E2E encrypted AI agent relay';
141
+ const textStart = Math.floor(w / 2) + 7;
142
+ console.log('');
143
+ for (let y = 0; y < h; y++) {
144
+ const colorMap = new Map(colors[y].map((c) => [c[0], c]));
145
+ const chars = [];
146
+ for (let x = 0; x < lines[y].length; x++) {
147
+ const ch = lines[y][x];
148
+ const c = colorMap.get(x);
149
+ if (ch === ' ' || !c) {
150
+ chars.push(' ');
151
+ }
152
+ else {
153
+ chars.push(chalk.rgb(c[1], c[2], c[3])(ch));
154
+ }
155
+ }
156
+ let suffix = '';
157
+ if (y === titleRow) {
158
+ for (let c = Math.max(0, textStart - 1); c < w; c++)
159
+ chars[c] = ' ';
160
+ for (let i = 0; i < TITLE.length; i++) {
161
+ const col = textStart + i * 2;
162
+ if (col < w) {
163
+ chars[col] = chalk.hex(TITLE_COLORS[i]).bold(TITLE[i]);
164
+ }
165
+ else {
166
+ suffix += chalk.hex(TITLE_COLORS[i]).bold(TITLE[i]) + ' ';
167
+ }
168
+ }
169
+ }
170
+ if (y === taglineRow) {
171
+ for (let c = Math.max(0, textStart - 1); c < w; c++)
172
+ chars[c] = ' ';
173
+ for (let i = 0; i < tagline.length; i++) {
174
+ const col = textStart + i;
175
+ if (col < w) {
176
+ chars[col] = chalk.dim(tagline[i]);
177
+ }
178
+ else {
179
+ suffix += chalk.dim(tagline[i]);
180
+ }
181
+ }
182
+ }
183
+ console.log(' ' + chars.join('') + suffix);
184
+ }
185
+ console.log('');
186
+ }
187
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../src/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Environment checks for Kraki tentacle setup.
3
+ *
4
+ * Validates that required CLI tools are installed and authenticated.
5
+ * Provides a retry mechanism for interactive setup flows.
6
+ */
7
+ export interface CliCheckResult {
8
+ found: boolean;
9
+ version?: string;
10
+ }
11
+ export interface AuthCheckResult {
12
+ authenticated: boolean;
13
+ username?: string;
14
+ token?: string;
15
+ }
16
+ export declare function checkGhCli(): CliCheckResult;
17
+ export declare function checkGhAuth(): AuthCheckResult;
18
+ export declare function checkCopilotCli(): CliCheckResult;
19
+ /**
20
+ * Run a check function with interactive retry.
21
+ * After 2 failures, prints a terminal-restart hint and exits.
22
+ */
23
+ export declare function withRetry<T extends {
24
+ found?: boolean;
25
+ authenticated?: boolean;
26
+ }>(checkFn: () => T, label: string, installHint: string): Promise<T>;
package/dist/checks.js ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Environment checks for Kraki tentacle setup.
3
+ *
4
+ * Validates that required CLI tools are installed and authenticated.
5
+ * Provides a retry mechanism for interactive setup flows.
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ import { confirm } from '@inquirer/prompts';
9
+ import chalk from 'chalk';
10
+ // ── Individual checks ───────────────────────────────────
11
+ export function checkGhCli() {
12
+ try {
13
+ const output = execSync('gh --version 2>/dev/null', { encoding: 'utf8' }).trim();
14
+ const match = output.match(/gh version ([\d.]+)/);
15
+ return { found: true, version: match?.[1] ?? output.split('\n')[0] };
16
+ }
17
+ catch {
18
+ return { found: false };
19
+ }
20
+ }
21
+ export function checkGhAuth() {
22
+ try {
23
+ const token = execSync('gh auth token 2>/dev/null', { encoding: 'utf8' }).trim();
24
+ if (!token)
25
+ return { authenticated: false };
26
+ let username;
27
+ try {
28
+ username = execSync('gh api user --jq .login 2>/dev/null', { encoding: 'utf8' }).trim() || undefined;
29
+ }
30
+ catch {
31
+ // Token exists but can't fetch username — still consider authenticated
32
+ }
33
+ return { authenticated: true, username, token };
34
+ }
35
+ catch {
36
+ return { authenticated: false };
37
+ }
38
+ }
39
+ export function checkCopilotCli() {
40
+ try {
41
+ const output = execSync('copilot --version 2>/dev/null', { encoding: 'utf8' }).trim();
42
+ return { found: true, version: output.split('\n')[0] };
43
+ }
44
+ catch {
45
+ return { found: false };
46
+ }
47
+ }
48
+ // ── Retry wrapper ───────────────────────────────────────
49
+ /**
50
+ * Run a check function with interactive retry.
51
+ * After 2 failures, prints a terminal-restart hint and exits.
52
+ */
53
+ export async function withRetry(checkFn, label, installHint) {
54
+ let failures = 0;
55
+ while (true) {
56
+ const result = checkFn();
57
+ const ok = ('found' in result ? result.found : result.authenticated) ?? false;
58
+ if (ok)
59
+ return result;
60
+ failures++;
61
+ console.log(chalk.yellow(`\n⚠ ${label} not found.`));
62
+ console.log(chalk.dim(` ${installHint}`));
63
+ if (failures >= 2) {
64
+ console.log(chalk.red(`\n✖ Still not detected after ${failures} attempts.`));
65
+ console.log(chalk.dim(' Try opening a new terminal window and running kraki again.'));
66
+ process.exit(1);
67
+ }
68
+ const retry = await confirm({ message: 'Retry?', default: true });
69
+ if (!retry) {
70
+ process.exit(1);
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Kraki CLI entry point.
4
+ *
5
+ * Usage:
6
+ * kraki Start Kraki (runs setup first if needed)
7
+ * kraki stop Stop Kraki
8
+ * kraki status Show status
9
+ * kraki logs [-f] Tail log files
10
+ * kraki config Print current config
11
+ * kraki config reset Delete config and re-run setup
12
+ * kraki --help Show help
13
+ * kraki --version Show version
14
+ */
15
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,306 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Kraki CLI entry point.
4
+ *
5
+ * Usage:
6
+ * kraki Start Kraki (runs setup first if needed)
7
+ * kraki stop Stop Kraki
8
+ * kraki status Show status
9
+ * kraki logs [-f] Tail log files
10
+ * kraki config Print current config
11
+ * kraki config reset Delete config and re-run setup
12
+ * kraki --help Show help
13
+ * kraki --version Show version
14
+ */
15
+ import chalk from 'chalk';
16
+ import { join } from 'node:path';
17
+ import { homedir } from 'node:os';
18
+ import { spawn } from 'node:child_process';
19
+ import { readFileSync, existsSync, unlinkSync } from 'node:fs';
20
+ import { fileURLToPath } from 'node:url';
21
+ import { dirname } from 'node:path';
22
+ import { select } from '@inquirer/prompts';
23
+ import { loadConfig, saveConfig, getConfigDir, getLogVerbosity, loadChannelKey } from './config.js';
24
+ import { isDaemonRunning, getDaemonStatus, startDaemon, stopDaemon } from './daemon.js';
25
+ import { runSetup } from './setup.js';
26
+ import { requestPairingToken, buildPairingUrl, renderQrToTerminal } from './pair.js';
27
+ import { printStaticBanner } from './banner.js';
28
+ const __dirname = dirname(fileURLToPath(import.meta.url));
29
+ // ── Version ─────────────────────────────────────────────
30
+ function getVersion() {
31
+ try {
32
+ const pkgPath = join(__dirname, '..', 'package.json');
33
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
34
+ return pkg.version ?? '0.0.0';
35
+ }
36
+ catch {
37
+ return '0.0.0';
38
+ }
39
+ }
40
+ // ── Help ────────────────────────────────────────────────
41
+ function printHelp() {
42
+ printStaticBanner();
43
+ console.log(`${chalk.bold('Usage:')}
44
+ kraki Start Kraki (runs setup first if needed)
45
+ kraki stop Stop Kraki
46
+ kraki status Show status and connection info
47
+ kraki connect Generate QR code to connect a mobile device
48
+ kraki logs [-f] Tail log files (-f to follow)
49
+ kraki config Print current config
50
+ kraki config log Show current log verbosity
51
+ kraki config log <normal|verbose>
52
+ Set log verbosity for future daemon starts
53
+ kraki config reset Delete config and re-run setup
54
+ kraki --help Show this help
55
+ kraki --version Show version
56
+ `);
57
+ }
58
+ // ── Commands ────────────────────────────────────────────
59
+ async function cmdStart() {
60
+ let config = loadConfig();
61
+ if (!config) {
62
+ config = await runSetup();
63
+ }
64
+ if (isDaemonRunning()) {
65
+ const status = getDaemonStatus();
66
+ const action = await select({
67
+ message: `Kraki is already running (PID ${status.pid}). What do you want to do?`,
68
+ theme: {
69
+ prefix: { idle: chalk.blue(' ?'), done: chalk.green(' ✔') },
70
+ icon: { cursor: ' ❯' },
71
+ },
72
+ choices: [
73
+ { name: ' Keep running', value: 'exit' },
74
+ { name: ' Restart Kraki', value: 'restart' },
75
+ { name: ' Clean setup (stop + reset config)', value: 'clean' },
76
+ ],
77
+ });
78
+ if (action === 'exit') {
79
+ console.log(chalk.green(`${chalk.hex('#ea6046')('◈')} Kraki still running (PID ${status.pid})`));
80
+ return;
81
+ }
82
+ stopDaemon();
83
+ console.log(chalk.dim(' Stopped..'));
84
+ if (action === 'clean') {
85
+ const { rmSync } = await import('node:fs');
86
+ const { join } = await import('node:path');
87
+ const { homedir } = await import('node:os');
88
+ try {
89
+ rmSync(join(homedir(), '.kraki'), { recursive: true });
90
+ console.log(chalk.dim(' Cleared ~/.kraki'));
91
+ }
92
+ catch { /* already clean */ }
93
+ config = await runSetup();
94
+ }
95
+ }
96
+ let pid;
97
+ try {
98
+ pid = await startDaemon(config);
99
+ }
100
+ catch (err) {
101
+ console.log('');
102
+ console.log(chalk.red(` Failed to start Kraki: ${err.message}`));
103
+ console.log('');
104
+ return;
105
+ }
106
+ console.log('');
107
+ console.log(chalk.green(` 🦑 Kraki started (PID ${pid})`));
108
+ // Show pairing QR code
109
+ const { showPairingQr } = await import('./setup.js');
110
+ await showPairingQr(config);
111
+ // Tips
112
+ console.log(chalk.dim(' Commands:'));
113
+ console.log(chalk.dim(` kraki connect Generate a new connect code`));
114
+ console.log(chalk.dim(` kraki status Show connection status`));
115
+ console.log(chalk.dim(` kraki logs -f Follow logs`));
116
+ console.log(chalk.dim(` kraki stop Stop Kraki`));
117
+ console.log('');
118
+ }
119
+ function cmdStop() {
120
+ if (!isDaemonRunning()) {
121
+ console.log(chalk.yellow('Kraki is not running.'));
122
+ return;
123
+ }
124
+ const stopped = stopDaemon();
125
+ if (stopped) {
126
+ console.log(chalk.green(`${chalk.hex('#ea6046')('◈')} Kraki stopped.`));
127
+ }
128
+ else {
129
+ console.log(chalk.red('Failed to stop.'));
130
+ }
131
+ }
132
+ function cmdStatus() {
133
+ const status = getDaemonStatus();
134
+ const config = loadConfig();
135
+ console.log('');
136
+ console.log(chalk.bold(`${chalk.hex('#ea6046')('◈')} Kraki Status`));
137
+ console.log('');
138
+ if (status.running) {
139
+ console.log(` Status: ${chalk.green('running')} (PID ${status.pid})`);
140
+ }
141
+ else {
142
+ console.log(` Status: ${chalk.yellow('stopped')}`);
143
+ }
144
+ if (config) {
145
+ console.log(` Relay: ${chalk.cyan(config.relay)}`);
146
+ console.log(` Auth: ${config.authMethod}`);
147
+ console.log(` Device: ${config.device.name}`);
148
+ console.log(` Logs: ${getLogVerbosity(config)}`);
149
+ }
150
+ else {
151
+ console.log(chalk.dim(' No config found. Run `kraki` to set up.'));
152
+ }
153
+ console.log('');
154
+ }
155
+ function cmdLogs(follow) {
156
+ const logDir = join(homedir(), '.kraki', 'logs');
157
+ if (!existsSync(logDir)) {
158
+ console.log(chalk.yellow('No log directory found at ~/.kraki/logs/'));
159
+ return;
160
+ }
161
+ const args = follow
162
+ ? ['-f', join(logDir, '*.log')]
163
+ : ['-n', '50', join(logDir, '*.log')];
164
+ const child = spawn('tail', args, {
165
+ stdio: 'inherit',
166
+ shell: true,
167
+ });
168
+ child.on('error', () => {
169
+ console.log(chalk.red('Failed to tail logs.'));
170
+ });
171
+ }
172
+ function cmdConfig() {
173
+ const config = loadConfig();
174
+ if (!config) {
175
+ console.log(chalk.yellow('No config found. Run `kraki` to set up.'));
176
+ return;
177
+ }
178
+ console.log(JSON.stringify(config, null, 2));
179
+ }
180
+ function cmdConfigLog(verbosity) {
181
+ const config = loadConfig();
182
+ if (!config) {
183
+ console.log(chalk.yellow('No config found. Run `kraki` to set up.'));
184
+ return;
185
+ }
186
+ if (!verbosity) {
187
+ console.log(`Log verbosity: ${getLogVerbosity(config)}`);
188
+ return;
189
+ }
190
+ if (verbosity !== 'normal' && verbosity !== 'verbose') {
191
+ console.log(chalk.red(`Invalid log verbosity: ${verbosity}`));
192
+ console.log(chalk.dim('Use `kraki config log normal` or `kraki config log verbose`.'));
193
+ process.exit(1);
194
+ return;
195
+ }
196
+ saveConfig({
197
+ ...config,
198
+ logging: { verbosity },
199
+ });
200
+ console.log(chalk.green(`Log verbosity set to ${verbosity}.`));
201
+ console.log(chalk.dim('Restart Kraki to apply the new log level.'));
202
+ }
203
+ async function cmdConfigReset() {
204
+ const configPath = join(getConfigDir(), 'config.json');
205
+ try {
206
+ unlinkSync(configPath);
207
+ console.log(chalk.dim('Config deleted.'));
208
+ }
209
+ catch {
210
+ // Config may not exist
211
+ }
212
+ await runSetup();
213
+ }
214
+ async function cmdConnect() {
215
+ const config = loadConfig();
216
+ if (!config) {
217
+ console.log(chalk.red('No config found. Run `kraki` to set up first.'));
218
+ return;
219
+ }
220
+ if (!isDaemonRunning()) {
221
+ console.log(chalk.yellow('Kraki is not running. Start it with `kraki` first.'));
222
+ return;
223
+ }
224
+ console.log(chalk.dim('Requesting pairing token from relay...'));
225
+ try {
226
+ // Resolve auth token (same logic as daemon-worker)
227
+ let token;
228
+ if (config.authMethod === 'github') {
229
+ try {
230
+ const { execSync } = await import('node:child_process');
231
+ token = execSync('gh auth token 2>/dev/null', { encoding: 'utf8' }).trim() || undefined;
232
+ }
233
+ catch { /* ignore */ }
234
+ }
235
+ else {
236
+ token = loadChannelKey() ?? undefined;
237
+ }
238
+ const info = await requestPairingToken(config.relay, token);
239
+ const pairingUrl = buildPairingUrl(info);
240
+ const qr = await renderQrToTerminal(pairingUrl);
241
+ console.log(qr);
242
+ }
243
+ catch (err) {
244
+ console.log(chalk.red(`Failed to create pairing token: ${err.message}`));
245
+ }
246
+ }
247
+ // ── Arg parsing ─────────────────────────────────────────
248
+ async function main() {
249
+ const args = process.argv.slice(2);
250
+ const cmd = args[0];
251
+ if (cmd === '--help' || cmd === '-h') {
252
+ printHelp();
253
+ return;
254
+ }
255
+ if (cmd === '--version' || cmd === '-v') {
256
+ console.log(getVersion());
257
+ return;
258
+ }
259
+ if (cmd === 'stop') {
260
+ cmdStop();
261
+ return;
262
+ }
263
+ if (cmd === 'status') {
264
+ cmdStatus();
265
+ return;
266
+ }
267
+ if (cmd === 'connect') {
268
+ await cmdConnect();
269
+ return;
270
+ }
271
+ if (cmd === 'logs') {
272
+ const follow = args.includes('-f') || args.includes('--follow');
273
+ cmdLogs(follow);
274
+ return;
275
+ }
276
+ if (cmd === 'config') {
277
+ if (args[1] === 'reset') {
278
+ await cmdConfigReset();
279
+ return;
280
+ }
281
+ if (args[1] === 'log') {
282
+ cmdConfigLog(args[2]);
283
+ return;
284
+ }
285
+ cmdConfig();
286
+ return;
287
+ }
288
+ // Default: start
289
+ if (!cmd) {
290
+ await cmdStart();
291
+ return;
292
+ }
293
+ console.log(chalk.red(`Unknown command: ${cmd}`));
294
+ printHelp();
295
+ process.exit(1);
296
+ }
297
+ main().catch((err) => {
298
+ // User pressed Esc or Ctrl+C during a prompt — exit cleanly
299
+ if (err?.name === 'ExitPromptError' || err?.message?.includes('User force closed')) {
300
+ console.log(chalk.dim('\n Cancelled.'));
301
+ process.exit(0);
302
+ }
303
+ console.error(chalk.red('Fatal error:'), err);
304
+ process.exit(1);
305
+ });
306
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}