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,225 @@
1
+ import { existsSync, readFileSync, statSync } from 'fs';
2
+ import { join, normalize } from 'path';
3
+ import { AIProvider } from '../../ai/provider.js';
4
+ import { readForReview } from './git.js';
5
+ const READ_MAX_LINES = 300;
6
+ const SEARCH_MAX_MATCHES = 40;
7
+ const SEARCH_MAX_FILE_BYTES = 512 * 1024;
8
+ const LIST_MAX = 200;
9
+ const ROUND_MAX_CHARS = 24_000;
10
+ export function agentSystemPrompt(base) {
11
+ return `${base}
12
+
13
+ ## Working as an agent
14
+
15
+ Before you report anything, investigate. You can call read-only tools on the repository to confirm a suspected
16
+ problem: open the definition of a function the change calls, find its other callers, check how a value is
17
+ validated elsewhere, look at tests. Only report issues you have confirmed or that are certain from the code shown.
18
+ Do not report a bug that the surrounding code already handles.
19
+
20
+ Every reply must be exactly one JSON object and nothing else. Either call tools:
21
+
22
+ {"calls": [
23
+ {"tool": "read_file", "path": "src/db.ts", "start": 1, "end": 120},
24
+ {"tool": "search", "pattern": "getUser\\\\(", "path": "src"},
25
+ {"tool": "list_files", "path": "src/routes"}
26
+ ]}
27
+
28
+ or finish with your findings (an empty list is a valid answer):
29
+
30
+ {"findings": [ ...suggestions in the output format above... ]}
31
+
32
+ Tools:
33
+ - read_file: lines of a file with line numbers (at most ${READ_MAX_LINES} lines per call). "start" and "end" are optional.
34
+ - search: regular expression search across the repository, returns "path:line: text" (at most ${SEARCH_MAX_MATCHES} matches). "path" optionally limits it to a folder or file.
35
+ - list_files: files under a folder ("path" optional).
36
+
37
+ Use at most a few calls per reply and only the ones you need. Paths are relative to the repository root.
38
+ Files ignored by .gitignore or .ownkeyignore are not available.`;
39
+ }
40
+ /** Pull the tool calls out of a parsed reply, in any of the shapes models tend to use. */
41
+ export function readCalls(parsed) {
42
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
43
+ return null;
44
+ const list = parsed.calls ?? parsed.tools ?? parsed.tool_calls;
45
+ if (Array.isArray(list))
46
+ return list.filter((c) => c && typeof c === 'object');
47
+ if (typeof parsed.tool === 'string' || typeof parsed.name === 'string')
48
+ return [parsed];
49
+ return null;
50
+ }
51
+ /** Findings from a parsed reply, or null when the reply is not a final answer. */
52
+ export function readFindings(parsed) {
53
+ if (Array.isArray(parsed))
54
+ return parsed;
55
+ if (parsed && typeof parsed === 'object') {
56
+ if (Array.isArray(parsed.findings))
57
+ return parsed.findings;
58
+ if (Array.isArray(parsed.suggestions))
59
+ return parsed.suggestions;
60
+ }
61
+ return null;
62
+ }
63
+ /** Read-only view of the repository the agent may look at: only files the scanner allows. */
64
+ export class RepoTools {
65
+ root;
66
+ scope;
67
+ changed;
68
+ allowed;
69
+ constructor(root, scope, allowedFiles, changed) {
70
+ this.root = root;
71
+ this.scope = scope;
72
+ this.changed = changed;
73
+ this.allowed = [...allowedFiles].map((f) => f.replace(/\\/g, '/')).sort();
74
+ }
75
+ clean(path) {
76
+ const p = normalize(String(path ?? '').trim())
77
+ .replace(/\\/g, '/')
78
+ .replace(/^\.\//, '')
79
+ .replace(/\/+$/, '');
80
+ return p === '.' ? '' : p;
81
+ }
82
+ content(file) {
83
+ // Changed files are read as the version under review (e.g. the staged copy)
84
+ if (this.changed.has(file))
85
+ return readForReview(this.root, this.scope, file);
86
+ return readFileSync(join(this.root, file), 'utf-8');
87
+ }
88
+ readFile(path, start, end) {
89
+ const file = this.clean(path);
90
+ if (!this.allowed.includes(file)) {
91
+ const near = this.allowed.filter((f) => f.endsWith('/' + file.split('/').pop())).slice(0, 3);
92
+ return `Error: ${file || '(no path)'} is not an available file.` + (near.length ? ` Did you mean: ${near.join(', ')}?` : '');
93
+ }
94
+ const lines = this.content(file).split('\n');
95
+ if (lines.length > 1 && lines[lines.length - 1] === '')
96
+ lines.pop();
97
+ const from = Math.max(1, Number(start) || 1);
98
+ const to = Math.min(lines.length, Number(end) || from + READ_MAX_LINES - 1, from + READ_MAX_LINES - 1);
99
+ const body = lines
100
+ .slice(from - 1, to)
101
+ .map((l, i) => `${String(from + i).padStart(5)} ${l}`)
102
+ .join('\n');
103
+ const more = to < lines.length ? `\n... (${lines.length} lines total; ask for start=${to + 1} to read more)` : '';
104
+ return `${file} lines ${from}-${to}:\n${body}${more}`;
105
+ }
106
+ search(pattern, path) {
107
+ const raw = String(pattern ?? '');
108
+ if (!raw)
109
+ return 'Error: search needs a "pattern".';
110
+ let re;
111
+ try {
112
+ re = new RegExp(raw);
113
+ }
114
+ catch {
115
+ re = new RegExp(raw.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
116
+ }
117
+ const prefix = this.clean(path);
118
+ const out = [];
119
+ for (const file of this.allowed) {
120
+ if (prefix && file !== prefix && !file.startsWith(prefix + '/'))
121
+ continue;
122
+ const abs = join(this.root, file);
123
+ if (!this.changed.has(file) && (!existsSync(abs) || statSync(abs).size > SEARCH_MAX_FILE_BYTES))
124
+ continue;
125
+ const lines = this.content(file).split('\n');
126
+ for (let i = 0; i < lines.length; i++) {
127
+ if (re.test(lines[i])) {
128
+ out.push(`${file}:${i + 1}: ${lines[i].trim().slice(0, 200)}`);
129
+ if (out.length >= SEARCH_MAX_MATCHES)
130
+ return out.join('\n') + `\n... (stopped at ${SEARCH_MAX_MATCHES} matches; narrow the pattern or path)`;
131
+ }
132
+ }
133
+ }
134
+ return out.length ? out.join('\n') : `No matches for /${raw}/${prefix ? ` in ${prefix}` : ''}.`;
135
+ }
136
+ listFiles(path) {
137
+ const prefix = this.clean(path);
138
+ const files = this.allowed.filter((f) => !prefix || f.startsWith(prefix + '/'));
139
+ if (!files.length)
140
+ return `No files under ${prefix || 'the repository root'}.`;
141
+ const shown = files.slice(0, LIST_MAX).join('\n');
142
+ return files.length > LIST_MAX ? `${shown}\n... (${files.length} files; list a subfolder)` : shown;
143
+ }
144
+ run(call) {
145
+ const tool = String(call.tool ?? call.name ?? '');
146
+ const args = (call.args && typeof call.args === 'object' ? call.args : call);
147
+ switch (tool) {
148
+ case 'read_file': {
149
+ const label = `read ${this.clean(args.path)}${args.start || args.end ? `:${args.start ?? 1}-${args.end ?? ''}` : ''}`;
150
+ return { step: { tool, label }, output: this.readFile(args.path, args.start, args.end) };
151
+ }
152
+ case 'search': {
153
+ const where = this.clean(args.path);
154
+ return { step: { tool, label: `search /${String(args.pattern ?? '')}/${where ? ` in ${where}` : ''}` }, output: this.search(args.pattern, args.path) };
155
+ }
156
+ case 'list_files':
157
+ return { step: { tool, label: `list ${this.clean(args.path) || '.'}` }, output: this.listFiles(args.path) };
158
+ default:
159
+ return { step: { tool: 'list_files', label: `unknown tool ${tool}` }, output: `Error: unknown tool "${tool}". Use read_file, search or list_files.` };
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Agentic review: the model sees the changed files and the patch, then investigates the repository with
165
+ * read-only tools before it answers. Works with every provider through plain JSON turns, no native tool API.
166
+ */
167
+ export async function runAgentReview(provider, context, tools, options = {}) {
168
+ const maxSteps = options.maxSteps ?? 6;
169
+ const maxCalls = options.maxCallsPerStep ?? 4;
170
+ const system = agentSystemPrompt(provider.getSystemPrompt());
171
+ const messages = [
172
+ {
173
+ role: 'user',
174
+ content: provider.buildUserPrompt(context) +
175
+ '\n\nInvestigate with tools if anything needs confirming, then reply with {"findings": [...]}. Reply with one JSON object only.',
176
+ },
177
+ ];
178
+ const steps = [];
179
+ let nudged = false;
180
+ for (let round = 0;; round++) {
181
+ const reply = await provider.chat(system, messages);
182
+ const parsed = AIProvider.extractJson(reply);
183
+ const findings = readFindings(parsed);
184
+ if (findings)
185
+ return { suggestions: provider.parseSuggestions(JSON.stringify(findings)), steps };
186
+ const calls = readCalls(parsed);
187
+ if (!calls || calls.length === 0) {
188
+ if (nudged)
189
+ return { suggestions: provider.parseSuggestions(reply), steps };
190
+ nudged = true;
191
+ messages.push({ role: 'assistant', content: reply });
192
+ messages.push({ role: 'user', content: 'That was not a valid reply. Reply with exactly one JSON object: {"calls": [...]} or {"findings": [...]}.' });
193
+ continue;
194
+ }
195
+ if (round > maxSteps) {
196
+ throw new Error('The model kept calling tools instead of answering. Try a larger model, or run with --quick for a single-pass review.');
197
+ }
198
+ messages.push({ role: 'assistant', content: reply });
199
+ if (round >= maxSteps) {
200
+ messages.push({ role: 'user', content: 'No more tool calls are available. Reply now with {"findings": [...]} based on what you have seen.' });
201
+ continue;
202
+ }
203
+ const results = [];
204
+ let used = 0;
205
+ for (const call of calls.slice(0, maxCalls)) {
206
+ const { step, output } = tools.run(call);
207
+ steps.push(step);
208
+ options.onStep?.(step);
209
+ const room = ROUND_MAX_CHARS - used;
210
+ if (room <= 200) {
211
+ results.push(`[${step.label}] skipped: output budget for this reply is used up.`);
212
+ continue;
213
+ }
214
+ const clipped = output.length > room ? output.slice(0, room) + '\n... (truncated)' : output;
215
+ used += clipped.length;
216
+ results.push(`[${step.label}]\n${clipped}`);
217
+ }
218
+ if (calls.length > maxCalls)
219
+ results.push(`Only the first ${maxCalls} calls were run.`);
220
+ const left = maxSteps - round - 1;
221
+ results.push(left > 0 ? `${left} tool round(s) left.` : 'That was the last tool round. Reply next with {"findings": [...]}.');
222
+ messages.push({ role: 'user', content: results.join('\n\n') });
223
+ }
224
+ }
225
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/core/review/agent.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,8 @@ export interface Finding extends Suggestion {
4
4
  line: number;
5
5
  }
6
6
  /**
7
- * Best line to anchor a finding on: the first added line of its diff, else the first
8
- * changed line of its file in the review, else line 1.
7
+ * Best line to anchor a finding on: the line the model named, else the first added line
8
+ * of its diff, else the first changed line of its file in the review, else line 1.
9
9
  */
10
10
  export declare function anchorLine(s: Suggestion, changed?: Array<[number, number]>): number;
11
11
  export declare function sortFindings(findings: Finding[]): Finding[];
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/core/review/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAgBnF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAO3D;AAQD,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoCpE;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BzF"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/core/review/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAiBnF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAO3D;AAQD,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoCpE;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BzF"}
@@ -1,9 +1,11 @@
1
1
  const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
2
2
  /**
3
- * Best line to anchor a finding on: the first added line of its diff, else the first
4
- * changed line of its file in the review, else line 1.
3
+ * Best line to anchor a finding on: the line the model named, else the first added line
4
+ * of its diff, else the first changed line of its file in the review, else line 1.
5
5
  */
6
6
  export function anchorLine(s, changed) {
7
+ if (s.line && s.line > 0)
8
+ return s.line;
7
9
  if (s.diff) {
8
10
  let newLine = 0;
9
11
  for (const raw of s.diff.split('\n')) {
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/core/review/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/core/review/report.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type ChangeSet, type ReviewScope } from './git.js';
2
2
  import type { AIProvider } from '../../ai/provider.js';
3
+ import { type AgentStep } from './agent.js';
3
4
  import type { FileMetadata, Suggestion } from '../../types/index.js';
4
5
  export interface ReviewTarget {
5
6
  changes: ChangeSet;
@@ -12,9 +13,17 @@ export interface ReviewTarget {
12
13
  }
13
14
  /** Work out which changed files to review, honouring .gitignore/.ownkeyignore, size and binary rules. */
14
15
  export declare function prepareReview(root: string, scope: ReviewScope, maxFiles?: number): Promise<ReviewTarget>;
16
+ export interface AnalyzeOptions {
17
+ /** Single request with no tools, as in 1.3 and earlier (default false: agentic review) */
18
+ quick?: boolean;
19
+ /** Tool rounds the agent may use (default 6) */
20
+ maxSteps?: number;
21
+ onStep?: (step: AgentStep) => void;
22
+ }
15
23
  /**
16
- * Send the selected files (in full, for context) and the patch (as focus) to the model.
24
+ * Send the selected files (in full, for context) and the patch (as focus) to the model. By default the model
25
+ * then investigates the rest of the repository with read-only tools before answering.
17
26
  * Returns suggestions on the selected files only, with normalized paths.
18
27
  */
19
- export declare function analyzeChanges(root: string, scope: ReviewScope, target: ReviewTarget, provider: AIProvider): Promise<Suggestion[]>;
28
+ export declare function analyzeChanges(root: string, scope: ReviewScope, target: ReviewTarget, provider: AIProvider, options?: AnalyzeOptions): Promise<Suggestion[]>;
20
29
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/core/review/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAA4B,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/F,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACvC;AAED,yGAAyG;AACzG,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAO1G;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgBxI"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/core/review/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAA4B,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/F,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,uDAAuD;IACvD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACvC;AAED,yGAAyG;AACzG,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,SAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAO1G;AAED,MAAM,WAAW,cAAc;IAC3B,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAqBtK"}
@@ -1,6 +1,7 @@
1
1
  import { basename } from 'path';
2
2
  import { FileScanner } from '../scanner.js';
3
3
  import { collectChanges, readForReview } from './git.js';
4
+ import { RepoTools, runAgentReview } from './agent.js';
4
5
  /** Work out which changed files to review, honouring .gitignore/.ownkeyignore, size and binary rules. */
5
6
  export async function prepareReview(root, scope, maxFiles = 25) {
6
7
  const changes = collectChanges(root, scope);
@@ -11,10 +12,11 @@ export async function prepareReview(root, scope, maxFiles = 25) {
11
12
  return { changes, reviewable, selected: reviewable.slice(0, maxFiles), metadata };
12
13
  }
13
14
  /**
14
- * Send the selected files (in full, for context) and the patch (as focus) to the model.
15
+ * Send the selected files (in full, for context) and the patch (as focus) to the model. By default the model
16
+ * then investigates the rest of the repository with read-only tools before answering.
15
17
  * Returns suggestions on the selected files only, with normalized paths.
16
18
  */
17
- export async function analyzeChanges(root, scope, target, provider) {
19
+ export async function analyzeChanges(root, scope, target, provider, options = {}) {
18
20
  const contents = target.selected.map((f) => ({ ...target.metadata.get(f), content: readForReview(root, scope, f) }));
19
21
  const context = {
20
22
  files: contents,
@@ -22,8 +24,14 @@ export async function analyzeChanges(root, scope, target, provider) {
22
24
  reviewPatch: target.changes.patch,
23
25
  };
24
26
  const raw = [];
25
- for await (const s of provider.analyze(context))
26
- raw.push(s);
27
+ if (options.quick) {
28
+ for await (const s of provider.analyze(context))
29
+ raw.push(s);
30
+ }
31
+ else {
32
+ const tools = new RepoTools(root, scope, target.metadata.keys(), new Set(target.changes.files));
33
+ raw.push(...(await runAgentReview(provider, context, tools, { maxSteps: options.maxSteps, onStep: options.onStep })).suggestions);
34
+ }
27
35
  const inScope = new Set(target.selected);
28
36
  return raw
29
37
  .map((s) => ({ ...s, filePath: s.filePath.replace(/\\/g, '/').replace(/^\.\//, '') }))
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/core/review/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAoC,MAAM,UAAU,CAAC;AAc3F,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,KAAkB,EAAE,QAAQ,GAAG,EAAE;IAC/E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;AACtF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAkB,EAAE,MAAoB,EAAE,QAAoB;IAC7G,MAAM,QAAQ,GAAkB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAErI,MAAM,OAAO,GAAgB;QACzB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE;QACjF,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;KACpC,CAAC;IAEF,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,GAAG;SACL,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SACrF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/core/review/run.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -56,6 +56,19 @@ program.hook('preAction', async (thisCommand, actionCommand) => {
56
56
  program.hook('postAction', async () => {
57
57
  await dbClient.disconnect();
58
58
  });
59
- // Parse arguments
60
- await program.parseAsync();
59
+ // A bare `ownkey` at a terminal opens the interactive session, where commands are typed
60
+ // without the prefix. Scripts, CI, pipes and every subcommand behave exactly as before.
61
+ const interactive = process.argv.length <= 2 && !process.env.OWNKEY_NO_UI && !process.env.CI && process.stdin.isTTY && process.stdout.isTTY;
62
+ if (interactive) {
63
+ const { startSession } = await import('./ui/session.js');
64
+ const commands = program.commands.map((c) => ({
65
+ name: c.name(),
66
+ description: c.description(),
67
+ options: c.options.map((o) => ({ flags: o.flags, description: o.description })),
68
+ }));
69
+ await startSession(commands, program.version() ?? '');
70
+ }
71
+ else {
72
+ await program.parseAsync();
73
+ }
61
74
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,8 @@ export interface Suggestion {
72
72
  diff: string;
73
73
  filePath: string;
74
74
  rationale: string;
75
+ /** 1-based line in the file the finding is about, when the model gives one */
76
+ line?: number;
75
77
  tags?: Record<string, any>;
76
78
  }
77
79
  export interface AnalyzeOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAMvC,MAAM,CAAC,MAAM,YAAY,GAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAsKtF,cAAc;AACd,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGvB;IACA;IAHX,YACI,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,WAAY,SAAQ,WAAW;IACxC,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC1C,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,SAAU,SAAQ,WAAW;IACtC,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;CACJ"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAMvC,MAAM,CAAC,MAAM,YAAY,GAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAwKtF,cAAc;AACd,MAAM,OAAO,WAAY,SAAQ,KAAK;IAGvB;IACA;IAHX,YACI,OAAe,EACR,IAAY,EACZ,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,WAAY,SAAQ,WAAW;IACxC,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC9B,CAAC;CACJ;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC1C,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAChC,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,SAAU,SAAQ,WAAW;IACtC,YAAY,OAAe,EAAE,OAAa;QACtC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC5B,CAAC;CACJ"}
@@ -0,0 +1,25 @@
1
+ import { type CommandInfo } from './complete.js';
2
+ import type { SessionInfo } from './context.js';
3
+ import { type KeeperMood } from './keeper.js';
4
+ export interface PromptProps {
5
+ info: SessionInfo;
6
+ commands: CommandInfo[];
7
+ history: string[];
8
+ /** Called once with the submitted line, or null when the user leaves */
9
+ onDone: (line: string | null) => void;
10
+ /** Show the welcome banner above this prompt (the first one in a session) */
11
+ banner?: string;
12
+ /** How the last command went, which Keeper wears at this prompt */
13
+ mood?: KeeperMood;
14
+ }
15
+ export declare function Banner({ version, still }: {
16
+ version: string;
17
+ still?: boolean;
18
+ }): import("react").JSX.Element;
19
+ export declare function Header({ info, mood, keeper }: {
20
+ info: SessionInfo;
21
+ mood?: KeeperMood;
22
+ keeper?: boolean;
23
+ }): import("react").JSX.Element;
24
+ export declare function Prompt({ info, commands, history, onDone, banner, mood }: PromptProps): import("react").JSX.Element;
25
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAA+C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3F,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wEAAwE;IACxE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,CAAC,EAAE,UAAU,CAAC;CACrB;AAID,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,KAAa,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,+BAyCtF;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAa,EAAE,MAAa,EAAE,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,+BAyBxH;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,+BAuHpF"}
package/dist/ui/App.js ADDED
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, Text, useApp, useInput } from 'ink';
4
+ import { applySuggestion, suggest } from './complete.js';
5
+ import { Keeper, useTerminalSize } from './Keeper.js';
6
+ import { KEEPER_BREAKPOINTS, keeperShown, keeperSize } from './keeper.js';
7
+ const ORANGE = '#ff5a1f';
8
+ export function Banner({ version, still = false }) {
9
+ const { columns, rows } = useTerminalSize();
10
+ const size = keeperShown() ? keeperSize(columns, rows) : 'none';
11
+ const title = (_jsxs(Text, { children: [_jsx(Text, { color: ORANGE, bold: true, children: "OwnKey" }), _jsxs(Text, { dimColor: true, children: [" ", version] })] }));
12
+ const tagline = _jsx(Text, { children: "Local-first AI code review on your own keys." });
13
+ const hint = _jsx(Text, { dimColor: true, children: "Type any command without the ownkey prefix. Tab completes, \u2191\u2193 history, help lists everything." });
14
+ if (size === 'full' || size === 'compact') {
15
+ return (_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsx(Keeper, { size: size, still: still }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, justifyContent: "center", flexShrink: 1, children: [title, tagline, _jsx(Text, { children: " " }), hint] })] }));
16
+ }
17
+ return (_jsxs(Box, { borderStyle: "round", borderColor: ORANGE, paddingX: 1, flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [size === 'inline' ? (_jsx(Box, { marginRight: 1, children: _jsx(Keeper, { size: "inline", still: still }) })) : null, title] }), tagline, hint] }));
18
+ }
19
+ export function Header({ info, mood = 'idle', keeper = true }) {
20
+ const { columns } = useTerminalSize();
21
+ const where = [info.folder, info.branch, info.changed === undefined ? undefined : info.changed === 0 ? 'clean' : `${info.changed} changed`]
22
+ .filter(Boolean)
23
+ .join(' · ');
24
+ return (_jsxs(Box, { flexDirection: "row", children: [keeper && keeperShown() && columns >= KEEPER_BREAKPOINTS.compact ? (_jsx(Box, { marginRight: 1, children: _jsx(Keeper, { size: "inline", mood: mood }) })) : null, _jsxs(Text, { children: [_jsx(Text, { bold: true, children: where }), _jsx(Text, { dimColor: true, children: " \u00B7 " }), info.provider ? (_jsxs(Text, { color: "cyan", children: [info.provider, " / ", info.model] })) : (_jsx(Text, { color: "yellow", children: "No model yet. Type config to set one up." }))] })] }));
25
+ }
26
+ export function Prompt({ info, commands, history, onDone, banner, mood }) {
27
+ const { exit } = useApp();
28
+ const { columns } = useTerminalSize();
29
+ const [value, setValue] = useState('');
30
+ const [cursor, setCursor] = useState(0);
31
+ const [histIndex, setHistIndex] = useState(history.length);
32
+ const [selected, setSelected] = useState(0);
33
+ const [finished, setFinished] = useState(false);
34
+ const suggestions = suggest(value.slice(0, cursor), commands);
35
+ const sel = Math.min(selected, Math.max(0, suggestions.length - 1));
36
+ // Exit only after the final frame (prompt line alone, no header or menu) has rendered,
37
+ // so scrollback keeps a clean record of each command.
38
+ useEffect(() => {
39
+ if (finished)
40
+ exit();
41
+ }, [finished, exit]);
42
+ const finish = (line) => {
43
+ onDone(line);
44
+ setFinished(true);
45
+ };
46
+ const set = (v, c = v.length) => {
47
+ setValue(v);
48
+ setCursor(c);
49
+ setSelected(0);
50
+ };
51
+ useInput((input, key) => {
52
+ if (finished)
53
+ return;
54
+ if (key.ctrl && input === 'c') {
55
+ if (value)
56
+ set('');
57
+ else
58
+ finish(null);
59
+ return;
60
+ }
61
+ if (key.ctrl && input === 'd') {
62
+ if (!value)
63
+ finish(null);
64
+ return;
65
+ }
66
+ if (key.return) {
67
+ finish(value);
68
+ return;
69
+ }
70
+ if (key.tab) {
71
+ if (suggestions.length)
72
+ set(applySuggestion(value, suggestions[sel].value));
73
+ return;
74
+ }
75
+ if (key.escape) {
76
+ set('');
77
+ return;
78
+ }
79
+ if (key.upArrow || key.downArrow) {
80
+ // With a suggestion list open, arrows pick from it; otherwise they walk history
81
+ if (suggestions.length > 1 && value) {
82
+ const n = suggestions.length;
83
+ setSelected((sel + (key.upArrow ? n - 1 : 1)) % n);
84
+ return;
85
+ }
86
+ const next = Math.max(0, Math.min(history.length, histIndex + (key.upArrow ? -1 : 1)));
87
+ setHistIndex(next);
88
+ set(history[next] ?? '');
89
+ return;
90
+ }
91
+ if (key.leftArrow)
92
+ return setCursor(Math.max(0, cursor - 1));
93
+ if (key.rightArrow)
94
+ return setCursor(Math.min(value.length, cursor + 1));
95
+ if (key.ctrl && input === 'a')
96
+ return setCursor(0);
97
+ if (key.ctrl && input === 'e')
98
+ return setCursor(value.length);
99
+ if (key.ctrl && input === 'u')
100
+ return set(value.slice(cursor), 0);
101
+ if (key.backspace || key.delete) {
102
+ if (cursor > 0)
103
+ set(value.slice(0, cursor - 1) + value.slice(cursor), cursor - 1);
104
+ return;
105
+ }
106
+ if (input && !key.ctrl && !key.meta) {
107
+ // A paste (or fast typing) can arrive with its Enter in the same chunk
108
+ const nl = input.search(/[\r\n]/);
109
+ const text = nl === -1 ? input : input.slice(0, nl);
110
+ const next = value.slice(0, cursor) + text + value.slice(cursor);
111
+ set(next, cursor + text.length);
112
+ if (nl !== -1)
113
+ finish(next);
114
+ }
115
+ });
116
+ // Narrow terminals get a tighter label column; descriptions truncate rather than wrap
117
+ const labelWidth = columns < 60 ? Math.min(14, Math.max(...suggestions.map((x) => x.label.length), 4) + 2) : 22;
118
+ const before = value.slice(0, cursor);
119
+ const at = value[cursor] ?? ' ';
120
+ const after = value.slice(cursor + 1);
121
+ return (_jsxs(Box, { flexDirection: "column", children: [banner ? _jsx(Banner, { version: banner, still: finished }) : null, !finished ? _jsx(Header, { info: info, mood: mood, keeper: !banner }) : null, _jsxs(Text, { children: [_jsxs(Text, { color: ORANGE, bold: true, children: ["\u203A", ' '] }), _jsx(Text, { children: before }), finished ? _jsx(Text, { children: at === ' ' ? '' : at }) : _jsx(Text, { inverse: true, children: at }), _jsx(Text, { children: after })] }), !finished && suggestions.length > 0 ? (_jsx(Box, { flexDirection: "column", marginLeft: 2, children: suggestions.map((s, i) => (_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: i === sel ? ORANGE : undefined, bold: i === sel, children: s.label.padEnd(labelWidth) }), _jsx(Text, { dimColor: true, children: s.description })] }, s.label))) })) : null, !finished ? (_jsx(Text, { dimColor: true, wrap: "truncate-end", children: ' Tab complete · ↑↓ history · help · Ctrl+D exit' })) : null] }));
122
+ }
123
+ //# sourceMappingURL=App.js.map