ownkey 1.3.0 → 1.4.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/README.md +53 -1
- package/dist/ai/anthropic.d.ts +2 -3
- package/dist/ai/anthropic.d.ts.map +1 -1
- package/dist/ai/anthropic.js +5 -15
- package/dist/ai/anthropic.js.map +1 -1
- package/dist/ai/gemini.d.ts +3 -3
- package/dist/ai/gemini.d.ts.map +1 -1
- package/dist/ai/gemini.js +9 -20
- package/dist/ai/gemini.js.map +1 -1
- package/dist/ai/ollama.d.ts +7 -3
- package/dist/ai/ollama.d.ts.map +1 -1
- package/dist/ai/ollama.js +27 -17
- package/dist/ai/ollama.js.map +1 -1
- package/dist/ai/openai.d.ts +2 -3
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +7 -15
- package/dist/ai/openai.js.map +1 -1
- package/dist/ai/provider.d.ts +17 -8
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +16 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/bench/cases.d.ts +5 -0
- package/dist/bench/cases.d.ts.map +1 -1
- package/dist/bench/cases.js +47 -0
- package/dist/bench/cases.js.map +1 -1
- package/dist/commands/bench.d.ts +2 -1
- package/dist/commands/bench.d.ts.map +1 -1
- package/dist/commands/bench.js +13 -5
- package/dist/commands/bench.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +25 -3
- package/dist/commands/review.js.map +1 -1
- package/dist/core/review/agent.d.ts +58 -0
- package/dist/core/review/agent.d.ts.map +1 -0
- package/dist/core/review/agent.js +225 -0
- package/dist/core/review/agent.js.map +1 -0
- package/dist/core/review/report.d.ts +2 -2
- package/dist/core/review/report.d.ts.map +1 -1
- package/dist/core/review/report.js +4 -2
- package/dist/core/review/report.js.map +1 -1
- package/dist/core/review/run.d.ts +11 -2
- package/dist/core/review/run.d.ts.map +1 -1
- package/dist/core/review/run.js +12 -4
- package/dist/core/review/run.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/App.d.ts +11 -3
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +20 -6
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/Keeper.d.ts +18 -0
- package/dist/ui/Keeper.d.ts.map +1 -0
- package/dist/ui/Keeper.js +45 -0
- package/dist/ui/Keeper.js.map +1 -0
- package/dist/ui/keeper-term.d.ts +33 -0
- package/dist/ui/keeper-term.d.ts.map +1 -0
- package/dist/ui/keeper-term.js +104 -0
- package/dist/ui/keeper-term.js.map +1 -0
- package/dist/ui/keeper.d.ts +60 -0
- package/dist/ui/keeper.d.ts.map +1 -0
- package/dist/ui/keeper.js +167 -0
- package/dist/ui/keeper.js.map +1 -0
- package/dist/ui/session.d.ts +3 -0
- package/dist/ui/session.d.ts.map +1 -1
- package/dist/ui/session.js +32 -7
- package/dist/ui/session.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { Box, Text, useStdout } from 'ink';
|
|
4
|
+
import { KEEPER_FPS, KEEPER_ORANGE, keeperAnimates, keeperFrame, keeperSegments, keeperShown, keeperSize, } from './keeper.js';
|
|
5
|
+
/** Terminal width and height, kept current as the window is resized. */
|
|
6
|
+
export function useTerminalSize() {
|
|
7
|
+
const { stdout } = useStdout();
|
|
8
|
+
const read = () => ({ columns: stdout?.columns || 80, rows: stdout?.rows || 24 });
|
|
9
|
+
const [size, setSize] = useState(read);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (!stdout)
|
|
12
|
+
return;
|
|
13
|
+
const onResize = () => setSize(read());
|
|
14
|
+
stdout.on('resize', onResize);
|
|
15
|
+
return () => {
|
|
16
|
+
stdout.off('resize', onResize);
|
|
17
|
+
};
|
|
18
|
+
}, [stdout]);
|
|
19
|
+
return size;
|
|
20
|
+
}
|
|
21
|
+
/** A tick counter at Keeper's frame rate, or a still 0 where motion is off. */
|
|
22
|
+
export function useKeeperTick(active = true) {
|
|
23
|
+
const { stdout } = useStdout();
|
|
24
|
+
const [tick, setTick] = useState(0);
|
|
25
|
+
const moving = active && keeperAnimates(stdout ?? process.stdout);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (!moving)
|
|
28
|
+
return;
|
|
29
|
+
const id = setInterval(() => setTick((t) => t + 1), 1000 / KEEPER_FPS);
|
|
30
|
+
return () => clearInterval(id);
|
|
31
|
+
}, [moving]);
|
|
32
|
+
return tick;
|
|
33
|
+
}
|
|
34
|
+
/** Keeper as an Ink element: moves with its mood, resizes with the terminal. */
|
|
35
|
+
export function Keeper({ mood = 'idle', size, still = false }) {
|
|
36
|
+
const { columns, rows } = useTerminalSize();
|
|
37
|
+
const tick = useKeeperTick(!still);
|
|
38
|
+
if (!keeperShown())
|
|
39
|
+
return null;
|
|
40
|
+
const lines = keeperFrame(mood, size ?? keeperSize(columns, rows), tick);
|
|
41
|
+
if (!lines.length)
|
|
42
|
+
return null;
|
|
43
|
+
return (_jsx(Box, { flexDirection: "column", flexShrink: 0, children: lines.map((line, i) => (_jsx(Text, { children: keeperSegments(line).map((seg, j) => seg.part === 'body' ? (_jsx(Text, { color: KEEPER_ORANGE, children: seg.text }, j)) : seg.part === 'eye' ? (_jsx(Text, { bold: true, children: seg.text }, j)) : seg.part === 'mark' ? (_jsx(Text, { color: "red", bold: true, children: seg.text }, j)) : (_jsx(Text, { children: seg.text }, j))) }, i))) }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=Keeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Keeper.js","sourceRoot":"","sources":["../../src/ui/Keeper.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { keeperCaption, type KeeperMood } from './keeper.js';
|
|
2
|
+
type Stream = NodeJS.WriteStream;
|
|
3
|
+
/** Colour one frame line for a plain (non-Ink) terminal. */
|
|
4
|
+
export declare function paintKeeperLine(line: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Keeper's pose with words beside it, sized to the terminal. Returns plain lines
|
|
7
|
+
* (already coloured) so callers decide where they go.
|
|
8
|
+
*/
|
|
9
|
+
export declare function keeperPose(mood: KeeperMood, title: string, detail?: string[], columns?: number): string[];
|
|
10
|
+
/**
|
|
11
|
+
* A live status line with Keeper working at its head. Steps print above it and stay
|
|
12
|
+
* in scrollback; the live line redraws in place. Off a TTY (CI, pipes) it degrades to
|
|
13
|
+
* the plain lines it would otherwise print, with no escape codes.
|
|
14
|
+
*/
|
|
15
|
+
export declare class KeeperStatus {
|
|
16
|
+
private readonly stream;
|
|
17
|
+
private tick;
|
|
18
|
+
private label;
|
|
19
|
+
private steps;
|
|
20
|
+
private timer;
|
|
21
|
+
private readonly live;
|
|
22
|
+
constructor(stream?: Stream);
|
|
23
|
+
start(label: string): void;
|
|
24
|
+
/** Print a finished step above the live line. */
|
|
25
|
+
step(text: string): void;
|
|
26
|
+
/** Stop animating and clear the live line. */
|
|
27
|
+
stop(): void;
|
|
28
|
+
private restore;
|
|
29
|
+
private clear;
|
|
30
|
+
private draw;
|
|
31
|
+
}
|
|
32
|
+
export { keeperCaption };
|
|
33
|
+
//# sourceMappingURL=keeper-term.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper-term.d.ts","sourceRoot":"","sources":["../../src/ui/keeper-term.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,aAAa,EAKb,KAAK,UAAU,EAClB,MAAM,aAAa,CAAC;AAErB,KAAK,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;AAEjC,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,EAAE,OAAO,SAAyB,GAAG,MAAM,EAAE,CAgB7H;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAOT,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;gBAEF,MAAM,GAAE,MAAuB;IAI5D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB1B,iDAAiD;IACjD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWxB,8CAA8C;IAC9C,IAAI,IAAI,IAAI;IASZ,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;CAUf;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { KEEPER_FPS, KEEPER_ORANGE, keeperAnimates, keeperCaption, keeperFrame, keeperSegments, keeperShown, keeperSize, } from './keeper.js';
|
|
3
|
+
/** Colour one frame line for a plain (non-Ink) terminal. */
|
|
4
|
+
export function paintKeeperLine(line) {
|
|
5
|
+
return keeperSegments(line)
|
|
6
|
+
.map(({ text, part }) => part === 'body' ? chalk.hex(KEEPER_ORANGE)(text) : part === 'eye' ? chalk.bold(text) : part === 'mark' ? chalk.red.bold(text) : text)
|
|
7
|
+
.join('');
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Keeper's pose with words beside it, sized to the terminal. Returns plain lines
|
|
11
|
+
* (already coloured) so callers decide where they go.
|
|
12
|
+
*/
|
|
13
|
+
export function keeperPose(mood, title, detail = [], columns = process.stdout.columns) {
|
|
14
|
+
const size = keeperSize(columns);
|
|
15
|
+
if (!keeperShown() || size === 'none')
|
|
16
|
+
return [title, ...detail];
|
|
17
|
+
const frame = keeperFrame(mood, size);
|
|
18
|
+
if (size === 'inline')
|
|
19
|
+
return [`${paintKeeperLine(frame[0])} ${title}`, ...detail.map((d) => ` ${d}`)];
|
|
20
|
+
const text = [title, ...detail];
|
|
21
|
+
// Words sit level with the eye
|
|
22
|
+
const eyeRow = Math.max(0, frame.findIndex((l) => /[◉◎◠×]/.test(l)));
|
|
23
|
+
const width = frame[0].length;
|
|
24
|
+
const rows = Math.max(frame.length, eyeRow + text.length);
|
|
25
|
+
const out = [];
|
|
26
|
+
for (let i = 0; i < rows; i++) {
|
|
27
|
+
const art = i < frame.length ? paintKeeperLine(frame[i]) : ' '.repeat(width);
|
|
28
|
+
out.push(`${art} ${text[i - eyeRow] ?? ''}`.trimEnd());
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A live status line with Keeper working at its head. Steps print above it and stay
|
|
34
|
+
* in scrollback; the live line redraws in place. Off a TTY (CI, pipes) it degrades to
|
|
35
|
+
* the plain lines it would otherwise print, with no escape codes.
|
|
36
|
+
*/
|
|
37
|
+
export class KeeperStatus {
|
|
38
|
+
stream;
|
|
39
|
+
tick = 0;
|
|
40
|
+
label = '';
|
|
41
|
+
steps = 0;
|
|
42
|
+
timer;
|
|
43
|
+
live;
|
|
44
|
+
constructor(stream = process.stdout) {
|
|
45
|
+
this.stream = stream;
|
|
46
|
+
this.live = keeperAnimates(stream) && keeperSize(stream.columns) !== 'none';
|
|
47
|
+
}
|
|
48
|
+
start(label) {
|
|
49
|
+
this.label = label;
|
|
50
|
+
if (!this.live) {
|
|
51
|
+
this.stream.write(chalk.gray(` ${label}\n`));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.stream.write('\x1b[?25l');
|
|
55
|
+
this.draw();
|
|
56
|
+
this.timer = setInterval(() => {
|
|
57
|
+
this.tick++;
|
|
58
|
+
this.draw();
|
|
59
|
+
}, 1000 / KEEPER_FPS);
|
|
60
|
+
this.timer.unref?.();
|
|
61
|
+
// Leave the terminal tidy if the process is interrupted mid-review
|
|
62
|
+
process.once('exit', () => this.restore());
|
|
63
|
+
}
|
|
64
|
+
/** Print a finished step above the live line. */
|
|
65
|
+
step(text) {
|
|
66
|
+
if (!this.live) {
|
|
67
|
+
this.stream.write(chalk.gray(` ↳ ${text}\n`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.clear();
|
|
71
|
+
this.stream.write(chalk.gray(` ↳ ${text}\n`));
|
|
72
|
+
this.steps++;
|
|
73
|
+
this.draw();
|
|
74
|
+
}
|
|
75
|
+
/** Stop animating and clear the live line. */
|
|
76
|
+
stop() {
|
|
77
|
+
if (this.timer)
|
|
78
|
+
clearInterval(this.timer);
|
|
79
|
+
this.timer = undefined;
|
|
80
|
+
if (this.live) {
|
|
81
|
+
this.clear();
|
|
82
|
+
this.restore();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
restore() {
|
|
86
|
+
if (this.live)
|
|
87
|
+
this.stream.write('\x1b[?25h');
|
|
88
|
+
}
|
|
89
|
+
clear() {
|
|
90
|
+
this.stream.write('\r\x1b[2K');
|
|
91
|
+
}
|
|
92
|
+
draw() {
|
|
93
|
+
const cols = this.stream.columns || 80;
|
|
94
|
+
const head = paintKeeperLine(keeperFrame('thinking', 'inline', this.tick)[0]);
|
|
95
|
+
const room = Math.max(8, cols - 14);
|
|
96
|
+
const full = this.steps ? `${this.label} · ${this.steps} lookup${this.steps === 1 ? '' : 's'}` : this.label;
|
|
97
|
+
const label = full.length > room ? full.slice(0, room - 1) + '…' : full;
|
|
98
|
+
const dots = '.'.repeat(1 + (Math.floor(this.tick / 3) % 3));
|
|
99
|
+
this.clear();
|
|
100
|
+
this.stream.write(` ${head} ${chalk.gray(label + dots)}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export { keeperCaption };
|
|
104
|
+
//# sourceMappingURL=keeper-term.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper-term.js","sourceRoot":"","sources":["../../src/ui/keeper-term.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeper, the OwnKey mascot: a living key whose bow is one inspecting eye.
|
|
3
|
+
*
|
|
4
|
+
* Pure frame data, no terminal I/O, so the Ink session, the plain review output,
|
|
5
|
+
* and the tests all draw the same character. Keeper reacts to what OwnKey is doing
|
|
6
|
+
* (its mood) and redraws to fit the terminal it is in (its size).
|
|
7
|
+
*/
|
|
8
|
+
export type KeeperMood = 'idle' | 'thinking' | 'found' | 'clean' | 'error';
|
|
9
|
+
export type KeeperSize = 'full' | 'compact' | 'inline' | 'none';
|
|
10
|
+
export declare const KEEPER_ORANGE = "#ff5a1f";
|
|
11
|
+
/** Smallest terminal width that fits each size beside its text. */
|
|
12
|
+
export declare const KEEPER_BREAKPOINTS: {
|
|
13
|
+
readonly full: 72;
|
|
14
|
+
readonly compact: 44;
|
|
15
|
+
readonly inline: 24;
|
|
16
|
+
};
|
|
17
|
+
/** Pick the largest Keeper that still leaves room for text at this terminal width. */
|
|
18
|
+
export declare function keeperSize(columns: number | undefined, rows?: number): KeeperSize;
|
|
19
|
+
/**
|
|
20
|
+
* The eye for a mood at an animation tick. Thinking glances left, centre, right;
|
|
21
|
+
* idle blinks now and then; the rest hold an expression.
|
|
22
|
+
*/
|
|
23
|
+
type Eye = {
|
|
24
|
+
pos: -1 | 0 | 1;
|
|
25
|
+
glyph: string;
|
|
26
|
+
pair?: boolean;
|
|
27
|
+
};
|
|
28
|
+
export declare function keeperEye(mood: KeeperMood, tick?: number): Eye;
|
|
29
|
+
/** A short spoken line for a mood, shown beside larger Keepers. */
|
|
30
|
+
export declare function keeperCaption(mood: KeeperMood): string;
|
|
31
|
+
/**
|
|
32
|
+
* The frame for a mood, size, and tick, as plain lines of equal width.
|
|
33
|
+
* Callers colour it; the shapes carry the character without colour.
|
|
34
|
+
*/
|
|
35
|
+
export declare function keeperFrame(mood: KeeperMood, size: KeeperSize, tick?: number): string[];
|
|
36
|
+
/** Ticks per second the animations are written for. */
|
|
37
|
+
export declare const KEEPER_FPS = 8;
|
|
38
|
+
/** Whether this terminal should see Keeper move: a TTY, not CI, and motion not turned off. */
|
|
39
|
+
export declare function keeperAnimates(stream?: {
|
|
40
|
+
isTTY?: boolean;
|
|
41
|
+
}, env?: NodeJS.ProcessEnv): boolean;
|
|
42
|
+
/** Whether to draw Keeper at all. */
|
|
43
|
+
export declare function keeperShown(env?: NodeJS.ProcessEnv): boolean;
|
|
44
|
+
export type KeeperPart = 'body' | 'eye' | 'mark' | 'space';
|
|
45
|
+
/**
|
|
46
|
+
* Split a frame line into runs a renderer can colour: the key in orange, the eye in
|
|
47
|
+
* the terminal's own foreground so it reads on light and dark themes, the alarm in red.
|
|
48
|
+
*/
|
|
49
|
+
export declare function keeperSegments(line: string): {
|
|
50
|
+
text: string;
|
|
51
|
+
part: KeeperPart;
|
|
52
|
+
}[];
|
|
53
|
+
/**
|
|
54
|
+
* A command run inside the interactive session can tell Keeper how it went (a review
|
|
55
|
+
* with findings exits 0 but should not get a smile). The session passes a file path in
|
|
56
|
+
* OWNKEY_SESSION_STATE; commands write their mood there.
|
|
57
|
+
*/
|
|
58
|
+
export declare function reportKeeperMood(mood: KeeperMood, env?: NodeJS.ProcessEnv): void;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=keeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.d.ts","sourceRoot":"","sources":["../../src/ui/keeper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAC3E,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEhE,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,mEAAmE;AACnE,eAAO,MAAM,kBAAkB;;;;CAAiD,CAAC;AAEjF,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAMjF;AAED;;;GAGG;AACH,KAAK,GAAG,GAAG;IAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAI9D,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,SAAI,GAAG,GAAG,CAiBzD;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAatD;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,SAAI,GAAG,MAAM,EAAE,CAqClF;AAQD,uDAAuD;AACvD,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,MAAM,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAmB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAK1H;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAEzE;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAI3D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,EAAE,CAYjF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAS7F"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keeper, the OwnKey mascot: a living key whose bow is one inspecting eye.
|
|
3
|
+
*
|
|
4
|
+
* Pure frame data, no terminal I/O, so the Ink session, the plain review output,
|
|
5
|
+
* and the tests all draw the same character. Keeper reacts to what OwnKey is doing
|
|
6
|
+
* (its mood) and redraws to fit the terminal it is in (its size).
|
|
7
|
+
*/
|
|
8
|
+
import { writeFileSync } from 'fs';
|
|
9
|
+
export const KEEPER_ORANGE = '#ff5a1f';
|
|
10
|
+
/** Smallest terminal width that fits each size beside its text. */
|
|
11
|
+
export const KEEPER_BREAKPOINTS = { full: 72, compact: 44, inline: 24 };
|
|
12
|
+
/** Pick the largest Keeper that still leaves room for text at this terminal width. */
|
|
13
|
+
export function keeperSize(columns, rows) {
|
|
14
|
+
const cols = columns && columns > 0 ? columns : 80;
|
|
15
|
+
if (cols >= KEEPER_BREAKPOINTS.full && (rows === undefined || rows >= 16))
|
|
16
|
+
return 'full';
|
|
17
|
+
if (cols >= KEEPER_BREAKPOINTS.compact)
|
|
18
|
+
return 'compact';
|
|
19
|
+
if (cols >= KEEPER_BREAKPOINTS.inline)
|
|
20
|
+
return 'inline';
|
|
21
|
+
return 'none';
|
|
22
|
+
}
|
|
23
|
+
const THINKING_PATH = [0, -1, -1, 0, 1, 1, 0, 0];
|
|
24
|
+
export function keeperEye(mood, tick = 0) {
|
|
25
|
+
switch (mood) {
|
|
26
|
+
case 'thinking':
|
|
27
|
+
return { pos: THINKING_PATH[tick % THINKING_PATH.length], glyph: '◉' };
|
|
28
|
+
case 'found':
|
|
29
|
+
return { pos: 0, glyph: tick % 6 === 5 ? '◉' : '◎' };
|
|
30
|
+
case 'clean':
|
|
31
|
+
return { pos: 0, glyph: '◠', pair: true };
|
|
32
|
+
case 'error':
|
|
33
|
+
return { pos: 0, glyph: '×' };
|
|
34
|
+
default:
|
|
35
|
+
// A blink every 16 ticks, and an occasional glance to the side
|
|
36
|
+
if (tick % 16 === 15)
|
|
37
|
+
return { pos: 0, glyph: '─' };
|
|
38
|
+
if (tick % 32 === 8)
|
|
39
|
+
return { pos: -1, glyph: '◉' };
|
|
40
|
+
if (tick % 32 === 24)
|
|
41
|
+
return { pos: 1, glyph: '◉' };
|
|
42
|
+
return { pos: 0, glyph: '◉' };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** A short spoken line for a mood, shown beside larger Keepers. */
|
|
46
|
+
export function keeperCaption(mood) {
|
|
47
|
+
switch (mood) {
|
|
48
|
+
case 'thinking':
|
|
49
|
+
return 'looking into it';
|
|
50
|
+
case 'found':
|
|
51
|
+
return 'found something';
|
|
52
|
+
case 'clean':
|
|
53
|
+
return 'all clear';
|
|
54
|
+
case 'error':
|
|
55
|
+
return 'that went wrong';
|
|
56
|
+
default:
|
|
57
|
+
return 'ready when you are';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Five cells inside the bow, with the eye placed by position. */
|
|
61
|
+
function eyeRow(eye, width) {
|
|
62
|
+
const face = eye.pair ? `${eye.glyph} ${eye.glyph}` : eye.glyph;
|
|
63
|
+
const room = width - face.length;
|
|
64
|
+
const centre = Math.floor(room / 2);
|
|
65
|
+
const left = Math.max(0, Math.min(room, centre + eye.pos * Math.max(1, centre - 1)));
|
|
66
|
+
return ' '.repeat(left) + face + ' '.repeat(room - left);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The frame for a mood, size, and tick, as plain lines of equal width.
|
|
70
|
+
* Callers colour it; the shapes carry the character without colour.
|
|
71
|
+
*/
|
|
72
|
+
export function keeperFrame(mood, size, tick = 0) {
|
|
73
|
+
const eye = keeperEye(mood, tick);
|
|
74
|
+
// A blinking alarm mark beside the bow when it finds something
|
|
75
|
+
const mark = mood === 'found' && tick % 2 === 0 ? '!' : ' ';
|
|
76
|
+
// A gentle bob while it works: the whole key rises a row every other beat
|
|
77
|
+
const bob = mood === 'thinking' && tick % 4 >= 2;
|
|
78
|
+
if (size === 'none')
|
|
79
|
+
return [];
|
|
80
|
+
if (size === 'inline') {
|
|
81
|
+
const glyph = eye.pair ? '◠' : eye.glyph;
|
|
82
|
+
const inner = eye.pos < 0 ? `${glyph} ` : eye.pos > 0 ? ` ${glyph}` : ` ${glyph} `;
|
|
83
|
+
return [`(${inner})━┳┳╸`];
|
|
84
|
+
}
|
|
85
|
+
if (size === 'compact') {
|
|
86
|
+
const lines = [
|
|
87
|
+
` ╭─────╮ ${mark}`,
|
|
88
|
+
` │${eyeRow(eye, 5)}│ `,
|
|
89
|
+
` ╰──┬──╯ `,
|
|
90
|
+
` ├┐ `,
|
|
91
|
+
` ╵ `,
|
|
92
|
+
];
|
|
93
|
+
return bob ? bobbed(lines) : lines;
|
|
94
|
+
}
|
|
95
|
+
const lines = [
|
|
96
|
+
` ▄▄▀▀▀▀▀▄▄ ${mark}`,
|
|
97
|
+
` █▀ ▀█ `,
|
|
98
|
+
` █${eyeRow(eye, 9)}█ `,
|
|
99
|
+
` ▀█▄ ▄█▀ `,
|
|
100
|
+
` ▀▀███▀▀ `,
|
|
101
|
+
` █▙▄ `,
|
|
102
|
+
` █ `,
|
|
103
|
+
` █▛▀ `,
|
|
104
|
+
];
|
|
105
|
+
return bob ? bobbed(lines) : lines;
|
|
106
|
+
}
|
|
107
|
+
/** Shift the key up one row (padding below) so it bobs without changing height. */
|
|
108
|
+
function bobbed(lines) {
|
|
109
|
+
const blank = ' '.repeat(lines[0].length);
|
|
110
|
+
return [...lines.slice(1), blank];
|
|
111
|
+
}
|
|
112
|
+
/** Ticks per second the animations are written for. */
|
|
113
|
+
export const KEEPER_FPS = 8;
|
|
114
|
+
/** Whether this terminal should see Keeper move: a TTY, not CI, and motion not turned off. */
|
|
115
|
+
export function keeperAnimates(stream = process.stdout, env = process.env) {
|
|
116
|
+
if (!stream.isTTY)
|
|
117
|
+
return false;
|
|
118
|
+
if (env.CI || env.OWNKEY_REDUCED_MOTION || env.OWNKEY_NO_MASCOT)
|
|
119
|
+
return false;
|
|
120
|
+
if (env.TERM === 'dumb')
|
|
121
|
+
return false;
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
/** Whether to draw Keeper at all. */
|
|
125
|
+
export function keeperShown(env = process.env) {
|
|
126
|
+
return !env.OWNKEY_NO_MASCOT;
|
|
127
|
+
}
|
|
128
|
+
const EYE_GLYPHS = new Set(['◉', '◎', '◠', '×', '─']);
|
|
129
|
+
/**
|
|
130
|
+
* Split a frame line into runs a renderer can colour: the key in orange, the eye in
|
|
131
|
+
* the terminal's own foreground so it reads on light and dark themes, the alarm in red.
|
|
132
|
+
*/
|
|
133
|
+
export function keeperSegments(line) {
|
|
134
|
+
const out = [];
|
|
135
|
+
for (const ch of line) {
|
|
136
|
+
// The compact bow's frame uses ─ too; only a lone ─ between spaces is a blink
|
|
137
|
+
const part = ch === ' ' ? 'space' : ch === '!' ? 'mark' : EYE_GLYPHS.has(ch) ? 'eye' : 'body';
|
|
138
|
+
const last = out[out.length - 1];
|
|
139
|
+
if (last && last.part === part)
|
|
140
|
+
last.text += ch;
|
|
141
|
+
else
|
|
142
|
+
out.push({ text: ch, part });
|
|
143
|
+
}
|
|
144
|
+
// The frame's own ─ runs (the compact bow) are several cells long; a blink is one
|
|
145
|
+
for (const seg of out)
|
|
146
|
+
if (seg.part === 'eye' && /^─{2,}$/.test(seg.text))
|
|
147
|
+
seg.part = 'body';
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* A command run inside the interactive session can tell Keeper how it went (a review
|
|
152
|
+
* with findings exits 0 but should not get a smile). The session passes a file path in
|
|
153
|
+
* OWNKEY_SESSION_STATE; commands write their mood there.
|
|
154
|
+
*/
|
|
155
|
+
export function reportKeeperMood(mood, env = process.env) {
|
|
156
|
+
const file = env.OWNKEY_SESSION_STATE;
|
|
157
|
+
if (!file)
|
|
158
|
+
return;
|
|
159
|
+
try {
|
|
160
|
+
// Synchronous: the process may exit right after
|
|
161
|
+
writeFileSync(file, JSON.stringify({ mood }), 'utf-8');
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Cosmetic only
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=keeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.js","sourceRoot":"","sources":["../../src/ui/keeper.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/session.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { KeeperMood } from './keeper.js';
|
|
1
2
|
import { type CommandInfo } from './complete.js';
|
|
3
|
+
/** Exit codes: review uses 1 for findings at --fail-on, and 2 for an error. */
|
|
4
|
+
export declare function moodFor(command: string, code: number): KeeperMood;
|
|
2
5
|
export declare function startSession(commands: CommandInfo[], version: string): Promise<void>;
|
|
3
6
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/ui/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAuE3D,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAIjE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD1F"}
|
package/dist/ui/session.js
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { render } from 'ink';
|
|
3
3
|
import { spawn } from 'child_process';
|
|
4
|
-
import { mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
5
|
-
import { homedir } from 'os';
|
|
4
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs';
|
|
5
|
+
import { homedir, tmpdir } from 'os';
|
|
6
6
|
import { join } from 'path';
|
|
7
7
|
import chalk from 'chalk';
|
|
8
|
-
import {
|
|
8
|
+
import { Prompt } from './App.js';
|
|
9
9
|
import { BUILTINS } from './complete.js';
|
|
10
10
|
import { loadSessionInfo } from './context.js';
|
|
11
11
|
import { splitWords } from './words.js';
|
|
12
12
|
const HISTORY_FILE = join(homedir(), '.ownkey', 'history');
|
|
13
13
|
const HISTORY_MAX = 500;
|
|
14
|
+
const STATE_FILE = join(tmpdir(), `ownkey-session-${process.pid}.json`);
|
|
15
|
+
/** The mood a command reported for Keeper, if it reported one; clears it for the next. */
|
|
16
|
+
function takeReportedMood() {
|
|
17
|
+
try {
|
|
18
|
+
const { mood } = JSON.parse(readFileSync(STATE_FILE, 'utf-8'));
|
|
19
|
+
rmSync(STATE_FILE, { force: true });
|
|
20
|
+
return mood;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
14
26
|
function loadHistory() {
|
|
15
27
|
try {
|
|
16
28
|
return readFileSync(HISTORY_FILE, 'utf-8').split('\n').filter(Boolean).slice(-HISTORY_MAX);
|
|
@@ -43,7 +55,7 @@ function runCommand(args) {
|
|
|
43
55
|
process.on('SIGINT', ignore);
|
|
44
56
|
const child = spawn(process.execPath, [...process.execArgv, process.argv[1], ...args], {
|
|
45
57
|
stdio: 'inherit',
|
|
46
|
-
env: { ...process.env, OWNKEY_NO_UI: '1' },
|
|
58
|
+
env: { ...process.env, OWNKEY_NO_UI: '1', OWNKEY_SESSION_STATE: STATE_FILE },
|
|
47
59
|
});
|
|
48
60
|
const done = (code) => {
|
|
49
61
|
process.off('SIGINT', ignore);
|
|
@@ -61,14 +73,25 @@ function printHelp(commands) {
|
|
|
61
73
|
console.log(chalk.gray('\n Add --help to any command for its options, e.g. review --help'));
|
|
62
74
|
console.log(chalk.gray(' Keys: Tab complete, ↑↓ history or suggestions, ←→ move, Ctrl+U clear line, Esc clear, Ctrl+D exit\n'));
|
|
63
75
|
}
|
|
76
|
+
/** Exit codes: review uses 1 for findings at --fail-on, and 2 for an error. */
|
|
77
|
+
export function moodFor(command, code) {
|
|
78
|
+
if (code === 0)
|
|
79
|
+
return 'clean';
|
|
80
|
+
if (code === 1 && (command === 'review' || command === 'bench'))
|
|
81
|
+
return 'found';
|
|
82
|
+
return 'error';
|
|
83
|
+
}
|
|
64
84
|
export async function startSession(commands, version) {
|
|
65
85
|
const history = loadHistory();
|
|
66
86
|
const known = new Set(commands.map((c) => c.name));
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
let banner = version;
|
|
88
|
+
// Keeper wears the outcome of the last command at the next prompt
|
|
89
|
+
let mood = 'idle';
|
|
69
90
|
for (;;) {
|
|
70
91
|
const info = await loadSessionInfo(process.cwd(), version);
|
|
71
|
-
const line = await ask({ info, commands, history });
|
|
92
|
+
const line = await ask({ info, commands, history, banner, mood });
|
|
93
|
+
banner = undefined;
|
|
94
|
+
mood = 'idle';
|
|
72
95
|
if (line === null)
|
|
73
96
|
break;
|
|
74
97
|
const trimmed = line.trim();
|
|
@@ -106,9 +129,11 @@ export async function startSession(commands, version) {
|
|
|
106
129
|
}
|
|
107
130
|
const started = Date.now();
|
|
108
131
|
const code = await runCommand(args);
|
|
132
|
+
mood = takeReportedMood() ?? moodFor(name, code);
|
|
109
133
|
const secs = ((Date.now() - started) / 1000).toFixed(1);
|
|
110
134
|
console.log(code === 0 ? chalk.gray(` ✓ done in ${secs}s\n`) : chalk.red(` ✗ exited with code ${code} after ${secs}s\n`));
|
|
111
135
|
}
|
|
136
|
+
rmSync(STATE_FILE, { force: true });
|
|
112
137
|
console.log(chalk.gray(' Bye.'));
|
|
113
138
|
}
|
|
114
139
|
//# sourceMappingURL=session.js.map
|
package/dist/ui/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/ui/session.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ownkey",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Local-first AI code reviewer CLI: review git changes, gate PRs with SARIF, and apply verified fixes using your own OpenAI, Anthropic, Gemini, or Ollama keys",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|