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.
- package/LICENSE +21 -0
- package/dist/adapters/base.d.ts +107 -0
- package/dist/adapters/base.js +32 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/copilot.d.ts +51 -0
- package/dist/adapters/copilot.js +331 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/banner-data.json +1 -0
- package/dist/banner.d.ts +7 -0
- package/dist/banner.js +187 -0
- package/dist/banner.js.map +1 -0
- package/dist/checks.d.ts +26 -0
- package/dist/checks.js +74 -0
- package/dist/checks.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.js +266 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon-worker.d.ts +21 -0
- package/dist/daemon-worker.js +127 -0
- package/dist/daemon-worker.js.map +1 -0
- package/dist/daemon.d.ts +15 -0
- package/dist/daemon.js +117 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/key-manager.d.ts +28 -0
- package/dist/key-manager.js +61 -0
- package/dist/key-manager.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.js +30 -0
- package/dist/logger.js.map +1 -0
- package/dist/pair.d.ts +32 -0
- package/dist/pair.js +131 -0
- package/dist/pair.js.map +1 -0
- package/dist/parse-permission.d.ts +25 -0
- package/dist/parse-permission.js +67 -0
- package/dist/parse-permission.js.map +1 -0
- package/dist/relay-client.d.ts +82 -0
- package/dist/relay-client.js +490 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/session-manager.d.ts +85 -0
- package/dist/session-manager.js +218 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/setup.d.ts +13 -0
- package/dist/setup.js +232 -0
- package/dist/setup.js.map +1 -0
- 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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,IAAI,GACR,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEhC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAClC,MAAM,KAAK,GAAG,OAAO,CAAC;AACtB,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE7E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAIjB,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,EAAE,KAAK,GAAG;gBAAE,SAAS;YACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD,qBAAqB;IACrB,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,sCAAsC;IACtC,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAa,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,qCAAqC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,gFAAgF;IAChF,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAE/C,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,uDAAuD;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACrD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,8BAA8B;IAEpF,gBAAgB;IAChB,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,CAAC,KAAK,QAAQ,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBACrD,uDAAuD;gBACvD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACxE,oBAAoB;gBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/B,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;wBACZ,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC3E,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,UAAU,IAAI,cAAc,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzE,uDAAuD;gBACvD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACxE,sBAAsB;gBACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;oBAClC,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;oBAC1B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;wBACZ,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC;IAEF,sBAAsB;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC,IAAI,cAAc,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;YAC3E,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC,EAAE,cAAc,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,EAAE,CAAC;QACT,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,cAAc,GAAG,cAAc,CAAC;IAChC,MAAM,EAAE,CAAC;IACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,cAAc;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;oBACZ,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC;gBAC1B,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;oBACZ,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/checks.d.ts
ADDED
|
@@ -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,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
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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;
|