kraki 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 +51 -0
  6. package/dist/adapters/copilot.js +331 -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 +266 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +32 -0
  22. package/dist/config.js +102 -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 +15 -0
  28. package/dist/daemon.js +117 -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 +82 -0
  46. package/dist/relay-client.js +490 -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 +232 -0
  53. package/dist/setup.js.map +1 -0
  54. package/package.json +46 -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAe1B,2DAA2D;AAE3D,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAE5C,IAAI,QAA4B,CAAC;QACjC,IAAI,CAAC;YACH,QAAQ,GAAG,QAAQ,CAAC,qCAAqC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACvG,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,2DAA2D;AAE3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAgB,EAChB,KAAa,EACb,WAAmB;IAEnB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;QAE9E,IAAI,EAAE;YAAE,OAAO,MAAM,CAAC;QAEtB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;QAE5C,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,QAAQ,YAAY,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
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,266 @@
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, getConfigDir, 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 reset Delete config and re-run setup
51
+ kraki --help Show this help
52
+ kraki --version Show version
53
+ `);
54
+ }
55
+ // ── Commands ────────────────────────────────────────────
56
+ async function cmdStart() {
57
+ let config = loadConfig();
58
+ if (!config) {
59
+ config = await runSetup();
60
+ }
61
+ if (isDaemonRunning()) {
62
+ const status = getDaemonStatus();
63
+ const action = await select({
64
+ message: `Kraki is already running (PID ${status.pid}). What do you want to do?`,
65
+ theme: {
66
+ prefix: { idle: chalk.blue(' ?'), done: chalk.green(' ✔') },
67
+ icon: { cursor: ' ❯' },
68
+ },
69
+ choices: [
70
+ { name: ' Keep running', value: 'exit' },
71
+ { name: ' Restart Kraki', value: 'restart' },
72
+ { name: ' Clean setup (stop + reset config)', value: 'clean' },
73
+ ],
74
+ });
75
+ if (action === 'exit') {
76
+ console.log(chalk.green(`${chalk.hex('#ea6046')('◈')} Kraki still running (PID ${status.pid})`));
77
+ return;
78
+ }
79
+ stopDaemon();
80
+ console.log(chalk.dim(' Stopped..'));
81
+ if (action === 'clean') {
82
+ const { rmSync } = await import('node:fs');
83
+ const { join } = await import('node:path');
84
+ const { homedir } = await import('node:os');
85
+ try {
86
+ rmSync(join(homedir(), '.kraki'), { recursive: true });
87
+ console.log(chalk.dim(' Cleared ~/.kraki'));
88
+ }
89
+ catch { /* already clean */ }
90
+ config = await runSetup();
91
+ }
92
+ }
93
+ const pid = startDaemon(config);
94
+ console.log('');
95
+ console.log(chalk.green(` 🦑 Kraki started (PID ${pid})`));
96
+ // Show pairing QR code
97
+ const { showPairingQr } = await import('./setup.js');
98
+ await showPairingQr(config);
99
+ // Tips
100
+ console.log(chalk.dim(' Commands:'));
101
+ console.log(chalk.dim(` kraki connect Generate a new connect code`));
102
+ console.log(chalk.dim(` kraki status Show connection status`));
103
+ console.log(chalk.dim(` kraki logs -f Follow logs`));
104
+ console.log(chalk.dim(` kraki stop Stop Kraki`));
105
+ console.log('');
106
+ }
107
+ function cmdStop() {
108
+ if (!isDaemonRunning()) {
109
+ console.log(chalk.yellow('Kraki is not running.'));
110
+ return;
111
+ }
112
+ const stopped = stopDaemon();
113
+ if (stopped) {
114
+ console.log(chalk.green(`${chalk.hex('#ea6046')('◈')} Kraki stopped.`));
115
+ }
116
+ else {
117
+ console.log(chalk.red('Failed to stop.'));
118
+ }
119
+ }
120
+ function cmdStatus() {
121
+ const status = getDaemonStatus();
122
+ const config = loadConfig();
123
+ console.log('');
124
+ console.log(chalk.bold(`${chalk.hex('#ea6046')('◈')} Kraki Status`));
125
+ console.log('');
126
+ if (status.running) {
127
+ console.log(` Status: ${chalk.green('running')} (PID ${status.pid})`);
128
+ }
129
+ else {
130
+ console.log(` Status: ${chalk.yellow('stopped')}`);
131
+ }
132
+ if (config) {
133
+ console.log(` Relay: ${chalk.cyan(config.relay)}`);
134
+ console.log(` Auth: ${config.authMethod}`);
135
+ console.log(` Device: ${config.device.name}`);
136
+ }
137
+ else {
138
+ console.log(chalk.dim(' No config found. Run `kraki` to set up.'));
139
+ }
140
+ console.log('');
141
+ }
142
+ function cmdLogs(follow) {
143
+ const logDir = join(homedir(), '.kraki', 'logs');
144
+ if (!existsSync(logDir)) {
145
+ console.log(chalk.yellow('No log directory found at ~/.kraki/logs/'));
146
+ return;
147
+ }
148
+ const args = follow
149
+ ? ['-f', join(logDir, '*.log')]
150
+ : ['-n', '50', join(logDir, '*.log')];
151
+ const child = spawn('tail', args, {
152
+ stdio: 'inherit',
153
+ shell: true,
154
+ });
155
+ child.on('error', () => {
156
+ console.log(chalk.red('Failed to tail logs.'));
157
+ });
158
+ }
159
+ function cmdConfig() {
160
+ const config = loadConfig();
161
+ if (!config) {
162
+ console.log(chalk.yellow('No config found. Run `kraki` to set up.'));
163
+ return;
164
+ }
165
+ console.log(JSON.stringify(config, null, 2));
166
+ }
167
+ async function cmdConfigReset() {
168
+ const configPath = join(getConfigDir(), 'config.json');
169
+ try {
170
+ unlinkSync(configPath);
171
+ console.log(chalk.dim('Config deleted.'));
172
+ }
173
+ catch {
174
+ // Config may not exist
175
+ }
176
+ await runSetup();
177
+ }
178
+ async function cmdConnect() {
179
+ const config = loadConfig();
180
+ if (!config) {
181
+ console.log(chalk.red('No config found. Run `kraki` to set up first.'));
182
+ return;
183
+ }
184
+ if (!isDaemonRunning()) {
185
+ console.log(chalk.yellow('Kraki is not running. Start it with `kraki` first.'));
186
+ return;
187
+ }
188
+ console.log(chalk.dim('Requesting pairing token from relay...'));
189
+ try {
190
+ // Resolve auth token (same logic as daemon-worker)
191
+ let token;
192
+ if (config.authMethod === 'github') {
193
+ try {
194
+ const { execSync } = await import('node:child_process');
195
+ token = execSync('gh auth token 2>/dev/null', { encoding: 'utf8' }).trim() || undefined;
196
+ }
197
+ catch { /* ignore */ }
198
+ }
199
+ else {
200
+ token = loadChannelKey() ?? undefined;
201
+ }
202
+ const info = await requestPairingToken(config.relay, token);
203
+ const pairingUrl = buildPairingUrl(info);
204
+ const qr = await renderQrToTerminal(pairingUrl);
205
+ console.log(qr);
206
+ }
207
+ catch (err) {
208
+ console.log(chalk.red(`Failed to create pairing token: ${err.message}`));
209
+ }
210
+ }
211
+ // ── Arg parsing ─────────────────────────────────────────
212
+ async function main() {
213
+ const args = process.argv.slice(2);
214
+ const cmd = args[0];
215
+ if (cmd === '--help' || cmd === '-h') {
216
+ printHelp();
217
+ return;
218
+ }
219
+ if (cmd === '--version' || cmd === '-v') {
220
+ console.log(getVersion());
221
+ return;
222
+ }
223
+ if (cmd === 'stop') {
224
+ cmdStop();
225
+ return;
226
+ }
227
+ if (cmd === 'status') {
228
+ cmdStatus();
229
+ return;
230
+ }
231
+ if (cmd === 'connect') {
232
+ await cmdConnect();
233
+ return;
234
+ }
235
+ if (cmd === 'logs') {
236
+ const follow = args.includes('-f') || args.includes('--follow');
237
+ cmdLogs(follow);
238
+ return;
239
+ }
240
+ if (cmd === 'config') {
241
+ if (args[1] === 'reset') {
242
+ await cmdConfigReset();
243
+ return;
244
+ }
245
+ cmdConfig();
246
+ return;
247
+ }
248
+ // Default: start
249
+ if (!cmd) {
250
+ await cmdStart();
251
+ return;
252
+ }
253
+ console.log(chalk.red(`Unknown command: ${cmd}`));
254
+ printHelp();
255
+ process.exit(1);
256
+ }
257
+ main().catch((err) => {
258
+ // User pressed Esc or Ctrl+C during a prompt — exit cleanly
259
+ if (err?.name === 'ExitPromptError' || err?.message?.includes('User force closed')) {
260
+ console.log(chalk.dim('\n Cancelled.'));
261
+ process.exit(0);
262
+ }
263
+ console.error(chalk.red('Fatal error:'), err);
264
+ process.exit(1);
265
+ });
266
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Configuration management for Kraki tentacle.
3
+ *
4
+ * Config is stored at ~/.kraki/config.json (no secrets).
5
+ * Channel keys are stored separately at ~/.kraki/channel.key with 0o600 permissions.
6
+ * Daemon PID is tracked at ~/.kraki/daemon.pid.
7
+ */
8
+ export interface KrakiConfig {
9
+ relay: string;
10
+ authMethod: 'github' | 'channel-key' | 'open';
11
+ device: {
12
+ name: string;
13
+ id?: string;
14
+ };
15
+ }
16
+ export declare function getConfigDir(): string;
17
+ /**
18
+ * Get the stable device ID for this machine.
19
+ * Generated once and persisted at ~/.kraki/device-id.
20
+ * Sent to the head on auth so reconnections don't create ghost devices.
21
+ */
22
+ export declare function getOrCreateDeviceId(): string;
23
+ export declare function configExists(): boolean;
24
+ export declare function loadConfig(): KrakiConfig | null;
25
+ export declare function saveConfig(config: KrakiConfig): void;
26
+ export declare function getChannelKeyPath(): string;
27
+ export declare function saveChannelKey(key: string): void;
28
+ export declare function loadChannelKey(): string | null;
29
+ export declare function getDaemonPidPath(): string;
30
+ export declare function saveDaemonPid(pid: number): void;
31
+ export declare function loadDaemonPid(): number | null;
32
+ export declare function clearDaemonPid(): void;