ownkey 1.2.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.
Files changed (82) hide show
  1. package/README.md +69 -1
  2. package/dist/ai/anthropic.d.ts +2 -3
  3. package/dist/ai/anthropic.d.ts.map +1 -1
  4. package/dist/ai/anthropic.js +5 -15
  5. package/dist/ai/anthropic.js.map +1 -1
  6. package/dist/ai/gemini.d.ts +3 -3
  7. package/dist/ai/gemini.d.ts.map +1 -1
  8. package/dist/ai/gemini.js +9 -20
  9. package/dist/ai/gemini.js.map +1 -1
  10. package/dist/ai/ollama.d.ts +7 -3
  11. package/dist/ai/ollama.d.ts.map +1 -1
  12. package/dist/ai/ollama.js +27 -17
  13. package/dist/ai/ollama.js.map +1 -1
  14. package/dist/ai/openai.d.ts +2 -3
  15. package/dist/ai/openai.d.ts.map +1 -1
  16. package/dist/ai/openai.js +7 -15
  17. package/dist/ai/openai.js.map +1 -1
  18. package/dist/ai/provider.d.ts +17 -8
  19. package/dist/ai/provider.d.ts.map +1 -1
  20. package/dist/ai/provider.js +16 -0
  21. package/dist/ai/provider.js.map +1 -1
  22. package/dist/bench/cases.d.ts +5 -0
  23. package/dist/bench/cases.d.ts.map +1 -1
  24. package/dist/bench/cases.js +47 -0
  25. package/dist/bench/cases.js.map +1 -1
  26. package/dist/commands/bench.d.ts +2 -1
  27. package/dist/commands/bench.d.ts.map +1 -1
  28. package/dist/commands/bench.js +13 -5
  29. package/dist/commands/bench.js.map +1 -1
  30. package/dist/commands/review.d.ts.map +1 -1
  31. package/dist/commands/review.js +25 -3
  32. package/dist/commands/review.js.map +1 -1
  33. package/dist/core/review/agent.d.ts +58 -0
  34. package/dist/core/review/agent.d.ts.map +1 -0
  35. package/dist/core/review/agent.js +225 -0
  36. package/dist/core/review/agent.js.map +1 -0
  37. package/dist/core/review/report.d.ts +2 -2
  38. package/dist/core/review/report.d.ts.map +1 -1
  39. package/dist/core/review/report.js +4 -2
  40. package/dist/core/review/report.js.map +1 -1
  41. package/dist/core/review/run.d.ts +11 -2
  42. package/dist/core/review/run.d.ts.map +1 -1
  43. package/dist/core/review/run.js +12 -4
  44. package/dist/core/review/run.js.map +1 -1
  45. package/dist/index.js +15 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/types/index.d.ts +2 -0
  48. package/dist/types/index.d.ts.map +1 -1
  49. package/dist/types/index.js.map +1 -1
  50. package/dist/ui/App.d.ts +25 -0
  51. package/dist/ui/App.d.ts.map +1 -0
  52. package/dist/ui/App.js +123 -0
  53. package/dist/ui/App.js.map +1 -0
  54. package/dist/ui/Keeper.d.ts +18 -0
  55. package/dist/ui/Keeper.d.ts.map +1 -0
  56. package/dist/ui/Keeper.js +45 -0
  57. package/dist/ui/Keeper.js.map +1 -0
  58. package/dist/ui/complete.d.ts +22 -0
  59. package/dist/ui/complete.d.ts.map +1 -0
  60. package/dist/ui/complete.js +41 -0
  61. package/dist/ui/complete.js.map +1 -0
  62. package/dist/ui/context.d.ts +11 -0
  63. package/dist/ui/context.d.ts.map +1 -0
  64. package/dist/ui/context.js +37 -0
  65. package/dist/ui/context.js.map +1 -0
  66. package/dist/ui/keeper-term.d.ts +33 -0
  67. package/dist/ui/keeper-term.d.ts.map +1 -0
  68. package/dist/ui/keeper-term.js +104 -0
  69. package/dist/ui/keeper-term.js.map +1 -0
  70. package/dist/ui/keeper.d.ts +60 -0
  71. package/dist/ui/keeper.d.ts.map +1 -0
  72. package/dist/ui/keeper.js +167 -0
  73. package/dist/ui/keeper.js.map +1 -0
  74. package/dist/ui/session.d.ts +6 -0
  75. package/dist/ui/session.d.ts.map +1 -0
  76. package/dist/ui/session.js +139 -0
  77. package/dist/ui/session.js.map +1 -0
  78. package/dist/ui/words.d.ts +6 -0
  79. package/dist/ui/words.d.ts.map +1 -0
  80. package/dist/ui/words.js +46 -0
  81. package/dist/ui/words.js.map +1 -0
  82. package/package.json +16 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type KeeperMood, type KeeperSize } from './keeper.js';
2
+ /** Terminal width and height, kept current as the window is resized. */
3
+ export declare function useTerminalSize(): {
4
+ columns: number;
5
+ rows: number;
6
+ };
7
+ /** A tick counter at Keeper's frame rate, or a still 0 where motion is off. */
8
+ export declare function useKeeperTick(active?: boolean): number;
9
+ export interface KeeperProps {
10
+ mood?: KeeperMood;
11
+ /** Force a size; by default it follows the terminal width */
12
+ size?: KeeperSize;
13
+ /** Stop animating (for example once a prompt is submitted), keeping the last frame */
14
+ still?: boolean;
15
+ }
16
+ /** Keeper as an Ink element: moves with its mood, resizes with the terminal. */
17
+ export declare function Keeper({ mood, size, still }: KeeperProps): import("react").JSX.Element | null;
18
+ //# sourceMappingURL=Keeper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Keeper.d.ts","sourceRoot":"","sources":["../../src/ui/Keeper.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQH,KAAK,UAAU,EACf,KAAK,UAAU,EAClB,MAAM,aAAa,CAAC;AAErB,wEAAwE;AACxE,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAanE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,MAAM,UAAO,GAAG,MAAM,CAUnD;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,EAAE,IAAa,EAAE,IAAI,EAAE,KAAa,EAAE,EAAE,WAAW,sCA+BzE"}
@@ -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,22 @@
1
+ export interface CommandInfo {
2
+ name: string;
3
+ description: string;
4
+ options: Array<{
5
+ flags: string;
6
+ description: string;
7
+ }>;
8
+ }
9
+ export interface Suggestion {
10
+ /** What Tab inserts for the current word */
11
+ value: string;
12
+ label: string;
13
+ description: string;
14
+ }
15
+ export declare const BUILTINS: CommandInfo[];
16
+ /** Long flag of a commander flags string, e.g. "-y, --yes" -> "--yes", "--case <ids>" -> "--case". */
17
+ export declare function longFlag(flags: string): string;
18
+ /** Suggestions for the word being typed at the end of `line`. */
19
+ export declare function suggest(line: string, commands: CommandInfo[]): Suggestion[];
20
+ /** Replace the word being typed with `value`, followed by a space. */
21
+ export declare function applySuggestion(line: string, value: string): string;
22
+ //# sourceMappingURL=complete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/ui/complete.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,UAAU;IACvB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAIjC,CAAC;AAIF,sGAAsG;AACtG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAoB3E;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnE"}
@@ -0,0 +1,41 @@
1
+ export const BUILTINS = [
2
+ { name: 'help', description: 'Show commands and keys', options: [] },
3
+ { name: 'clear', description: 'Clear the screen', options: [] },
4
+ { name: 'exit', description: 'Leave OwnKey (Ctrl+D)', options: [] },
5
+ ];
6
+ const MAX = 6;
7
+ /** Long flag of a commander flags string, e.g. "-y, --yes" -> "--yes", "--case <ids>" -> "--case". */
8
+ export function longFlag(flags) {
9
+ const parts = flags.split(/[ ,|]+/).filter((p) => p.startsWith('-'));
10
+ return parts.find((p) => p.startsWith('--')) ?? parts[0] ?? flags;
11
+ }
12
+ /** Suggestions for the word being typed at the end of `line`. */
13
+ export function suggest(line, commands) {
14
+ const all = [...commands, ...BUILTINS];
15
+ const trimmedStart = line.replace(/^\s+/, '').replace(/^ownkey\s+/, '');
16
+ const words = trimmedStart.split(/\s+/);
17
+ if (words.length <= 1) {
18
+ const w = words[0] ?? '';
19
+ return all
20
+ .filter((c) => c.name.startsWith(w) && c.name !== w)
21
+ .slice(0, MAX)
22
+ .map((c) => ({ value: c.name, label: c.name, description: c.description }));
23
+ }
24
+ const cmd = all.find((c) => c.name === words[0]);
25
+ if (!cmd)
26
+ return [];
27
+ const current = words[words.length - 1];
28
+ if (current !== '' && !current.startsWith('-'))
29
+ return [];
30
+ const used = new Set(words.slice(1, -1));
31
+ return cmd.options
32
+ .map((o) => ({ value: longFlag(o.flags), label: o.flags, description: o.description }))
33
+ .filter((s) => s.value.startsWith(current) && s.value !== current && !used.has(s.value))
34
+ .slice(0, MAX);
35
+ }
36
+ /** Replace the word being typed with `value`, followed by a space. */
37
+ export function applySuggestion(line, value) {
38
+ const i = Math.max(line.lastIndexOf(' '), line.lastIndexOf('\t'));
39
+ return line.slice(0, i + 1) + value + ' ';
40
+ }
41
+ //# sourceMappingURL=complete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/ui/complete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface SessionInfo {
2
+ version: string;
3
+ folder: string;
4
+ branch?: string;
5
+ changed?: number;
6
+ provider?: string;
7
+ model?: string;
8
+ }
9
+ /** What the header shows: where you are, what changed, and which model reviews it. */
10
+ export declare function loadSessionInfo(cwd: string, version: string): Promise<SessionInfo>;
11
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAUD,sFAAsF;AACtF,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBxF"}
@@ -0,0 +1,37 @@
1
+ import { execFileSync } from 'child_process';
2
+ import { basename } from 'path';
3
+ import { configManager } from '../config/manager.js';
4
+ import { AIProviderFactory } from '../ai/factory.js';
5
+ function git(cwd, args) {
6
+ try {
7
+ return execFileSync('git', args, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ /** What the header shows: where you are, what changed, and which model reviews it. */
14
+ export async function loadSessionInfo(cwd, version) {
15
+ const root = git(cwd, ['rev-parse', '--show-toplevel']);
16
+ const info = { version, folder: basename(root ?? cwd) };
17
+ if (root) {
18
+ info.branch = git(root, ['rev-parse', '--abbrev-ref', 'HEAD']) || undefined;
19
+ const status = git(root, ['status', '--porcelain']);
20
+ info.changed = status === undefined ? undefined : status.split('\n').filter(Boolean).length;
21
+ }
22
+ try {
23
+ if (await configManager.exists()) {
24
+ const config = await configManager.load();
25
+ if (config.activeProvider) {
26
+ info.provider = config.activeProvider;
27
+ const p = config.providers[config.activeProvider];
28
+ info.model = p?.model || AIProviderFactory.getRecommendedModel(config.activeProvider);
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ // Unreadable config: the header just shows the setup hint
34
+ }
35
+ return info;
36
+ }
37
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/ui/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAWrD,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACpC,IAAI,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,OAAe;IAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;IACrE,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC;QAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChG,CAAC;IACD,IAAI,CAAC;QACD,IAAI,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;gBACtC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAmC,CAAC;gBACpF,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAC1F,CAAC;QACL,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,0DAA0D;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -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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"}
@@ -0,0 +1,6 @@
1
+ import type { KeeperMood } from './keeper.js';
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;
5
+ export declare function startSession(commands: CommandInfo[], version: string): Promise<void>;
6
+ //# sourceMappingURL=session.d.ts.map