@testany/hephos 0.3.9 → 0.3.12
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/out/repl/ReplModeInk.d.ts.map +1 -1
- package/out/repl/ReplModeInk.js +221 -4
- package/out/repl/ReplModeInk.js.map +1 -1
- package/out/repl/components/HistoryOverlay.d.ts +22 -0
- package/out/repl/components/HistoryOverlay.d.ts.map +1 -0
- package/out/repl/components/HistoryOverlay.js +82 -0
- package/out/repl/components/HistoryOverlay.js.map +1 -0
- package/out/repl/hooks/useHistory.d.ts +76 -0
- package/out/repl/hooks/useHistory.d.ts.map +1 -0
- package/out/repl/hooks/useHistory.js +562 -0
- package/out/repl/hooks/useHistory.js.map +1 -0
- package/package.json +4 -1
- package/patches/ink-text-input+6.0.0.patch +30 -0
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useHistory - Command history management hook
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - In-memory storage (no persistence across sessions)
|
|
6
|
+
* - Max 500 entries with FIFO eviction
|
|
7
|
+
* - Adjacent deduplication
|
|
8
|
+
* - Sensitive command filtering (keys, tokens, passwords)
|
|
9
|
+
* - Safe exit with savedInput restoration
|
|
10
|
+
* - Mode-separated history (normal vs conversation)
|
|
11
|
+
*/
|
|
12
|
+
import { useState, useCallback } from 'react';
|
|
13
|
+
// Patterns that indicate sensitive content - don't add to history
|
|
14
|
+
const SENSITIVE_PATTERNS = [
|
|
15
|
+
// API keys and tokens
|
|
16
|
+
/api[_-]?key\s*[=:]\s*\S+/i,
|
|
17
|
+
/token\s*[=:]\s*\S+/i,
|
|
18
|
+
/secret\s*[=:]\s*\S+/i,
|
|
19
|
+
/password\s*[=:]\s*\S+/i,
|
|
20
|
+
/bearer\s+\S{20,}/i,
|
|
21
|
+
// Common key formats
|
|
22
|
+
/sk-[a-zA-Z0-9]{20,}/, // OpenAI style
|
|
23
|
+
/AIza[a-zA-Z0-9_-]{35}/, // Google API key
|
|
24
|
+
/ghp_[a-zA-Z0-9]{36}/, // GitHub PAT
|
|
25
|
+
/gho_[a-zA-Z0-9]{36}/, // GitHub OAuth
|
|
26
|
+
/xox[baprs]-[a-zA-Z0-9-]+/, // Slack tokens
|
|
27
|
+
// Environment variable exports with sensitive names
|
|
28
|
+
/export\s+(GEMINI_API_KEY|OPENAI_API_KEY|ANTHROPIC_API_KEY|API_KEY|SECRET|TOKEN|PASSWORD)\s*=/i,
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Check if a command contains sensitive information
|
|
32
|
+
*/
|
|
33
|
+
function isSensitiveCommand(command) {
|
|
34
|
+
return SENSITIVE_PATTERNS.some(pattern => pattern.test(command));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if entry should be added to history
|
|
38
|
+
*/
|
|
39
|
+
function shouldAddToHistory(entry, lastEntry, mode) {
|
|
40
|
+
// Empty or whitespace-only
|
|
41
|
+
if (!entry.trim()) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
// Adjacent duplicate (same text AND same mode)
|
|
45
|
+
if (lastEntry && lastEntry.text === entry && lastEntry.mode === mode) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
// Sensitive content
|
|
49
|
+
if (isSensitiveCommand(entry)) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get indices of entries matching a specific mode
|
|
56
|
+
*/
|
|
57
|
+
function getModeIndices(entries, mode) {
|
|
58
|
+
const indices = [];
|
|
59
|
+
for (let i = 0; i < entries.length; i++) {
|
|
60
|
+
if (entries[i].mode === mode) {
|
|
61
|
+
indices.push(i);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return indices;
|
|
65
|
+
}
|
|
66
|
+
const DEFAULT_MAX_ENTRIES = 500;
|
|
67
|
+
export function useHistory(options = {}) {
|
|
68
|
+
const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
69
|
+
const [state, setState] = useState({
|
|
70
|
+
entries: [],
|
|
71
|
+
isActive: false,
|
|
72
|
+
currentIndex: -1,
|
|
73
|
+
savedInput: '',
|
|
74
|
+
activeMode: null,
|
|
75
|
+
searchMode: false,
|
|
76
|
+
searchQuery: '',
|
|
77
|
+
searchResults: [],
|
|
78
|
+
searchResultIndex: -1,
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* Add a new entry to history with its mode
|
|
82
|
+
*/
|
|
83
|
+
const addEntry = useCallback((entry, mode) => {
|
|
84
|
+
setState(prev => {
|
|
85
|
+
const lastEntry = prev.entries[prev.entries.length - 1];
|
|
86
|
+
if (!shouldAddToHistory(entry, lastEntry, mode)) {
|
|
87
|
+
return prev;
|
|
88
|
+
}
|
|
89
|
+
const newEntries = [...prev.entries, { text: entry, mode }];
|
|
90
|
+
// Enforce max limit (FIFO)
|
|
91
|
+
if (newEntries.length > maxEntries) {
|
|
92
|
+
newEntries.shift();
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
...prev,
|
|
96
|
+
entries: newEntries,
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
}, [maxEntries]);
|
|
100
|
+
/**
|
|
101
|
+
* Navigate to previous (older) history entry within the specified mode
|
|
102
|
+
* Returns the entry text to display, or null if at end
|
|
103
|
+
*/
|
|
104
|
+
const navigateUp = useCallback((currentInput, mode) => {
|
|
105
|
+
let result = null;
|
|
106
|
+
setState(prev => {
|
|
107
|
+
// Get indices of entries matching this mode
|
|
108
|
+
const modeIndices = getModeIndices(prev.entries, mode);
|
|
109
|
+
if (modeIndices.length === 0) {
|
|
110
|
+
return prev;
|
|
111
|
+
}
|
|
112
|
+
// First time entering history mode
|
|
113
|
+
if (!prev.isActive) {
|
|
114
|
+
// Start at the most recent entry for this mode
|
|
115
|
+
const newIndex = modeIndices[modeIndices.length - 1];
|
|
116
|
+
result = prev.entries[newIndex].text;
|
|
117
|
+
return {
|
|
118
|
+
...prev,
|
|
119
|
+
isActive: true,
|
|
120
|
+
currentIndex: newIndex,
|
|
121
|
+
savedInput: currentInput,
|
|
122
|
+
activeMode: mode,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// Already in history mode, find previous entry in this mode
|
|
126
|
+
const currentModeIdx = modeIndices.findIndex(idx => idx === prev.currentIndex);
|
|
127
|
+
if (currentModeIdx > 0) {
|
|
128
|
+
const newIndex = modeIndices[currentModeIdx - 1];
|
|
129
|
+
result = prev.entries[newIndex].text;
|
|
130
|
+
return {
|
|
131
|
+
...prev,
|
|
132
|
+
currentIndex: newIndex,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// At oldest entry for this mode, return current
|
|
136
|
+
if (prev.currentIndex >= 0 && prev.currentIndex < prev.entries.length) {
|
|
137
|
+
result = prev.entries[prev.currentIndex].text;
|
|
138
|
+
}
|
|
139
|
+
return prev;
|
|
140
|
+
});
|
|
141
|
+
return result;
|
|
142
|
+
}, []);
|
|
143
|
+
/**
|
|
144
|
+
* Navigate to next (newer) history entry within the active mode
|
|
145
|
+
* Returns the entry text to display, or savedInput if back to current input
|
|
146
|
+
*/
|
|
147
|
+
const navigateDown = useCallback((mode) => {
|
|
148
|
+
let result = null;
|
|
149
|
+
setState(prev => {
|
|
150
|
+
if (!prev.isActive) {
|
|
151
|
+
return prev;
|
|
152
|
+
}
|
|
153
|
+
// Get indices of entries matching this mode
|
|
154
|
+
const modeIndices = getModeIndices(prev.entries, mode);
|
|
155
|
+
// Find next entry in this mode
|
|
156
|
+
const currentModeIdx = modeIndices.findIndex(idx => idx === prev.currentIndex);
|
|
157
|
+
if (currentModeIdx >= 0 && currentModeIdx < modeIndices.length - 1) {
|
|
158
|
+
const newIndex = modeIndices[currentModeIdx + 1];
|
|
159
|
+
result = prev.entries[newIndex].text;
|
|
160
|
+
return {
|
|
161
|
+
...prev,
|
|
162
|
+
currentIndex: newIndex,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
// At newest entry for this mode, exit history mode and restore saved input
|
|
166
|
+
result = prev.savedInput;
|
|
167
|
+
return {
|
|
168
|
+
...prev,
|
|
169
|
+
isActive: false,
|
|
170
|
+
currentIndex: -1,
|
|
171
|
+
savedInput: '',
|
|
172
|
+
activeMode: null,
|
|
173
|
+
};
|
|
174
|
+
});
|
|
175
|
+
return result;
|
|
176
|
+
}, []);
|
|
177
|
+
/**
|
|
178
|
+
* Exit history mode without accepting
|
|
179
|
+
* Returns savedInput to restore
|
|
180
|
+
*/
|
|
181
|
+
const exitHistory = useCallback(() => {
|
|
182
|
+
let savedInput = '';
|
|
183
|
+
setState(prev => {
|
|
184
|
+
savedInput = prev.savedInput;
|
|
185
|
+
return {
|
|
186
|
+
...prev,
|
|
187
|
+
isActive: false,
|
|
188
|
+
currentIndex: -1,
|
|
189
|
+
savedInput: '',
|
|
190
|
+
activeMode: null,
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
return savedInput;
|
|
194
|
+
}, []);
|
|
195
|
+
/**
|
|
196
|
+
* Accept currently selected history entry
|
|
197
|
+
* Returns the entry text, or null if not in history mode
|
|
198
|
+
*/
|
|
199
|
+
const acceptHistory = useCallback(() => {
|
|
200
|
+
let result = null;
|
|
201
|
+
setState(prev => {
|
|
202
|
+
if (!prev.isActive || prev.currentIndex < 0) {
|
|
203
|
+
return prev;
|
|
204
|
+
}
|
|
205
|
+
result = prev.entries[prev.currentIndex].text;
|
|
206
|
+
return {
|
|
207
|
+
...prev,
|
|
208
|
+
isActive: false,
|
|
209
|
+
currentIndex: -1,
|
|
210
|
+
savedInput: '',
|
|
211
|
+
activeMode: null,
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
return result;
|
|
215
|
+
}, []);
|
|
216
|
+
/**
|
|
217
|
+
* Navigate up with prefix filtering (within mode)
|
|
218
|
+
*/
|
|
219
|
+
const navigateUpFiltered = useCallback((currentInput, prefix, mode) => {
|
|
220
|
+
let result = null;
|
|
221
|
+
setState(prev => {
|
|
222
|
+
// Find entries matching prefix AND mode
|
|
223
|
+
const matchingIndices = [];
|
|
224
|
+
for (let i = 0; i < prev.entries.length; i++) {
|
|
225
|
+
if (prev.entries[i].mode === mode && prev.entries[i].text.startsWith(prefix)) {
|
|
226
|
+
matchingIndices.push(i);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (matchingIndices.length === 0) {
|
|
230
|
+
return prev;
|
|
231
|
+
}
|
|
232
|
+
// First time entering history mode with filter
|
|
233
|
+
if (!prev.isActive) {
|
|
234
|
+
const newIndex = matchingIndices[matchingIndices.length - 1];
|
|
235
|
+
result = prev.entries[newIndex].text;
|
|
236
|
+
return {
|
|
237
|
+
...prev,
|
|
238
|
+
isActive: true,
|
|
239
|
+
currentIndex: newIndex,
|
|
240
|
+
savedInput: currentInput,
|
|
241
|
+
activeMode: mode,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// Find previous matching entry
|
|
245
|
+
const currentMatchIdx = matchingIndices.findIndex(idx => idx === prev.currentIndex);
|
|
246
|
+
if (currentMatchIdx > 0) {
|
|
247
|
+
const newIndex = matchingIndices[currentMatchIdx - 1];
|
|
248
|
+
result = prev.entries[newIndex].text;
|
|
249
|
+
return {
|
|
250
|
+
...prev,
|
|
251
|
+
currentIndex: newIndex,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// At oldest matching entry
|
|
255
|
+
if (prev.currentIndex >= 0 && prev.currentIndex < prev.entries.length) {
|
|
256
|
+
result = prev.entries[prev.currentIndex].text;
|
|
257
|
+
}
|
|
258
|
+
return prev;
|
|
259
|
+
});
|
|
260
|
+
return result;
|
|
261
|
+
}, []);
|
|
262
|
+
/**
|
|
263
|
+
* Navigate down with prefix filtering (within mode)
|
|
264
|
+
*/
|
|
265
|
+
const navigateDownFiltered = useCallback((prefix, mode) => {
|
|
266
|
+
let result = null;
|
|
267
|
+
setState(prev => {
|
|
268
|
+
if (!prev.isActive) {
|
|
269
|
+
return prev;
|
|
270
|
+
}
|
|
271
|
+
// Find entries matching prefix AND mode
|
|
272
|
+
const matchingIndices = [];
|
|
273
|
+
for (let i = 0; i < prev.entries.length; i++) {
|
|
274
|
+
if (prev.entries[i].mode === mode && prev.entries[i].text.startsWith(prefix)) {
|
|
275
|
+
matchingIndices.push(i);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Find next matching entry
|
|
279
|
+
const currentMatchIdx = matchingIndices.findIndex(idx => idx === prev.currentIndex);
|
|
280
|
+
if (currentMatchIdx >= 0 && currentMatchIdx < matchingIndices.length - 1) {
|
|
281
|
+
const newIndex = matchingIndices[currentMatchIdx + 1];
|
|
282
|
+
result = prev.entries[newIndex].text;
|
|
283
|
+
return {
|
|
284
|
+
...prev,
|
|
285
|
+
currentIndex: newIndex,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
// At newest matching entry, exit history mode
|
|
289
|
+
result = prev.savedInput;
|
|
290
|
+
return {
|
|
291
|
+
...prev,
|
|
292
|
+
isActive: false,
|
|
293
|
+
currentIndex: -1,
|
|
294
|
+
savedInput: '',
|
|
295
|
+
activeMode: null,
|
|
296
|
+
};
|
|
297
|
+
});
|
|
298
|
+
return result;
|
|
299
|
+
}, []);
|
|
300
|
+
/**
|
|
301
|
+
* Helper function to find matching entries for a search query (within mode)
|
|
302
|
+
*/
|
|
303
|
+
const findSearchMatches = (entries, query, mode) => {
|
|
304
|
+
if (!query)
|
|
305
|
+
return [];
|
|
306
|
+
const lowerQuery = query.toLowerCase();
|
|
307
|
+
const matches = [];
|
|
308
|
+
for (let i = 0; i < entries.length; i++) {
|
|
309
|
+
if (entries[i].mode === mode && entries[i].text.toLowerCase().includes(lowerQuery)) {
|
|
310
|
+
matches.push(i);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return matches;
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Enter search mode (Ctrl+R) - searches within the specified mode
|
|
317
|
+
*/
|
|
318
|
+
const enterSearchMode = useCallback((currentInput, mode) => {
|
|
319
|
+
setState(prev => {
|
|
320
|
+
// Use current input as initial search query, filter by mode
|
|
321
|
+
const searchResults = findSearchMatches(prev.entries, currentInput, mode);
|
|
322
|
+
const searchResultIndex = searchResults.length > 0 ? searchResults.length - 1 : -1;
|
|
323
|
+
const currentIndex = searchResultIndex >= 0 ? searchResults[searchResultIndex] : -1;
|
|
324
|
+
return {
|
|
325
|
+
...prev,
|
|
326
|
+
isActive: true,
|
|
327
|
+
searchMode: true,
|
|
328
|
+
searchQuery: currentInput,
|
|
329
|
+
searchResults,
|
|
330
|
+
searchResultIndex,
|
|
331
|
+
currentIndex,
|
|
332
|
+
savedInput: currentInput,
|
|
333
|
+
activeMode: mode,
|
|
334
|
+
};
|
|
335
|
+
});
|
|
336
|
+
}, []);
|
|
337
|
+
/**
|
|
338
|
+
* Update search query and find matches (uses activeMode from state)
|
|
339
|
+
* Returns the first matching entry text or null
|
|
340
|
+
*/
|
|
341
|
+
const updateSearchQuery = useCallback((query) => {
|
|
342
|
+
let result = null;
|
|
343
|
+
setState(prev => {
|
|
344
|
+
if (!prev.searchMode || !prev.activeMode)
|
|
345
|
+
return prev;
|
|
346
|
+
const searchResults = findSearchMatches(prev.entries, query, prev.activeMode);
|
|
347
|
+
const searchResultIndex = searchResults.length > 0 ? searchResults.length - 1 : -1;
|
|
348
|
+
const currentIndex = searchResultIndex >= 0 ? searchResults[searchResultIndex] : -1;
|
|
349
|
+
if (currentIndex >= 0) {
|
|
350
|
+
result = prev.entries[currentIndex].text;
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
...prev,
|
|
354
|
+
searchQuery: query,
|
|
355
|
+
searchResults,
|
|
356
|
+
searchResultIndex,
|
|
357
|
+
currentIndex,
|
|
358
|
+
};
|
|
359
|
+
});
|
|
360
|
+
return result;
|
|
361
|
+
}, []);
|
|
362
|
+
/**
|
|
363
|
+
* Search backward (Ctrl+R or ↑ in search mode)
|
|
364
|
+
* Finds the previous matching entry
|
|
365
|
+
*/
|
|
366
|
+
const searchBackward = useCallback(() => {
|
|
367
|
+
let result = null;
|
|
368
|
+
setState(prev => {
|
|
369
|
+
if (!prev.searchMode || prev.searchResults.length === 0) {
|
|
370
|
+
return prev;
|
|
371
|
+
}
|
|
372
|
+
// Move to previous match
|
|
373
|
+
if (prev.searchResultIndex > 0) {
|
|
374
|
+
const newSearchResultIndex = prev.searchResultIndex - 1;
|
|
375
|
+
const newIndex = prev.searchResults[newSearchResultIndex];
|
|
376
|
+
result = prev.entries[newIndex].text;
|
|
377
|
+
return {
|
|
378
|
+
...prev,
|
|
379
|
+
searchResultIndex: newSearchResultIndex,
|
|
380
|
+
currentIndex: newIndex,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
// At oldest match, stay there
|
|
384
|
+
if (prev.currentIndex >= 0 && prev.currentIndex < prev.entries.length) {
|
|
385
|
+
result = prev.entries[prev.currentIndex].text;
|
|
386
|
+
}
|
|
387
|
+
return prev;
|
|
388
|
+
});
|
|
389
|
+
return result;
|
|
390
|
+
}, []);
|
|
391
|
+
/**
|
|
392
|
+
* Search forward (Ctrl+S or ↓ in search mode)
|
|
393
|
+
* Finds the next matching entry
|
|
394
|
+
*/
|
|
395
|
+
const searchForward = useCallback(() => {
|
|
396
|
+
let result = null;
|
|
397
|
+
setState(prev => {
|
|
398
|
+
if (!prev.searchMode || prev.searchResults.length === 0) {
|
|
399
|
+
return prev;
|
|
400
|
+
}
|
|
401
|
+
// Move to next match
|
|
402
|
+
if (prev.searchResultIndex < prev.searchResults.length - 1) {
|
|
403
|
+
const newSearchResultIndex = prev.searchResultIndex + 1;
|
|
404
|
+
const newIndex = prev.searchResults[newSearchResultIndex];
|
|
405
|
+
result = prev.entries[newIndex].text;
|
|
406
|
+
return {
|
|
407
|
+
...prev,
|
|
408
|
+
searchResultIndex: newSearchResultIndex,
|
|
409
|
+
currentIndex: newIndex,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
// At newest match, stay there
|
|
413
|
+
if (prev.currentIndex >= 0 && prev.currentIndex < prev.entries.length) {
|
|
414
|
+
result = prev.entries[prev.currentIndex].text;
|
|
415
|
+
}
|
|
416
|
+
return prev;
|
|
417
|
+
});
|
|
418
|
+
return result;
|
|
419
|
+
}, []);
|
|
420
|
+
/**
|
|
421
|
+
* Exit search mode without accepting
|
|
422
|
+
* Returns savedInput to restore
|
|
423
|
+
*/
|
|
424
|
+
const exitSearchMode = useCallback(() => {
|
|
425
|
+
let savedInput = '';
|
|
426
|
+
setState(prev => {
|
|
427
|
+
savedInput = prev.savedInput;
|
|
428
|
+
return {
|
|
429
|
+
...prev,
|
|
430
|
+
isActive: false,
|
|
431
|
+
searchMode: false,
|
|
432
|
+
searchQuery: '',
|
|
433
|
+
searchResults: [],
|
|
434
|
+
searchResultIndex: -1,
|
|
435
|
+
currentIndex: -1,
|
|
436
|
+
savedInput: '',
|
|
437
|
+
activeMode: null,
|
|
438
|
+
};
|
|
439
|
+
});
|
|
440
|
+
return savedInput;
|
|
441
|
+
}, []);
|
|
442
|
+
/**
|
|
443
|
+
* Accept current search result
|
|
444
|
+
* Returns the selected entry text
|
|
445
|
+
*/
|
|
446
|
+
const acceptSearch = useCallback(() => {
|
|
447
|
+
let result = null;
|
|
448
|
+
setState(prev => {
|
|
449
|
+
if (!prev.searchMode || prev.currentIndex < 0) {
|
|
450
|
+
return prev;
|
|
451
|
+
}
|
|
452
|
+
result = prev.entries[prev.currentIndex].text;
|
|
453
|
+
return {
|
|
454
|
+
...prev,
|
|
455
|
+
isActive: false,
|
|
456
|
+
searchMode: false,
|
|
457
|
+
searchQuery: '',
|
|
458
|
+
searchResults: [],
|
|
459
|
+
searchResultIndex: -1,
|
|
460
|
+
currentIndex: -1,
|
|
461
|
+
savedInput: '',
|
|
462
|
+
activeMode: null,
|
|
463
|
+
};
|
|
464
|
+
});
|
|
465
|
+
return result;
|
|
466
|
+
}, []);
|
|
467
|
+
const DEFAULT_JUMP_STEP = 5;
|
|
468
|
+
/**
|
|
469
|
+
* Jump up multiple entries within a mode (Alt+↑ / PgUp)
|
|
470
|
+
*/
|
|
471
|
+
const jumpUp = useCallback((currentInput, mode, step = DEFAULT_JUMP_STEP) => {
|
|
472
|
+
let result = null;
|
|
473
|
+
setState(prev => {
|
|
474
|
+
const modeIndices = getModeIndices(prev.entries, mode);
|
|
475
|
+
if (modeIndices.length === 0) {
|
|
476
|
+
return prev;
|
|
477
|
+
}
|
|
478
|
+
// First time entering history mode
|
|
479
|
+
if (!prev.isActive) {
|
|
480
|
+
const targetModeIdx = Math.max(0, modeIndices.length - step);
|
|
481
|
+
const newIndex = modeIndices[targetModeIdx];
|
|
482
|
+
result = prev.entries[newIndex].text;
|
|
483
|
+
return {
|
|
484
|
+
...prev,
|
|
485
|
+
isActive: true,
|
|
486
|
+
currentIndex: newIndex,
|
|
487
|
+
savedInput: currentInput,
|
|
488
|
+
activeMode: mode,
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
// Already in history mode, jump back within mode
|
|
492
|
+
const currentModeIdx = modeIndices.findIndex(idx => idx === prev.currentIndex);
|
|
493
|
+
const targetModeIdx = Math.max(0, currentModeIdx - step);
|
|
494
|
+
const newIndex = modeIndices[targetModeIdx];
|
|
495
|
+
result = prev.entries[newIndex].text;
|
|
496
|
+
return {
|
|
497
|
+
...prev,
|
|
498
|
+
currentIndex: newIndex,
|
|
499
|
+
};
|
|
500
|
+
});
|
|
501
|
+
return result;
|
|
502
|
+
}, []);
|
|
503
|
+
/**
|
|
504
|
+
* Jump down multiple entries within a mode (Alt+↓ / PgDn)
|
|
505
|
+
*/
|
|
506
|
+
const jumpDown = useCallback((mode, step = DEFAULT_JUMP_STEP) => {
|
|
507
|
+
let result = null;
|
|
508
|
+
setState(prev => {
|
|
509
|
+
if (!prev.isActive) {
|
|
510
|
+
return prev;
|
|
511
|
+
}
|
|
512
|
+
const modeIndices = getModeIndices(prev.entries, mode);
|
|
513
|
+
const currentModeIdx = modeIndices.findIndex(idx => idx === prev.currentIndex);
|
|
514
|
+
// Jump forward within mode
|
|
515
|
+
const targetModeIdx = currentModeIdx + step;
|
|
516
|
+
if (targetModeIdx >= modeIndices.length) {
|
|
517
|
+
// Exit history mode and restore saved input
|
|
518
|
+
result = prev.savedInput;
|
|
519
|
+
return {
|
|
520
|
+
...prev,
|
|
521
|
+
isActive: false,
|
|
522
|
+
currentIndex: -1,
|
|
523
|
+
savedInput: '',
|
|
524
|
+
activeMode: null,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
const newIndex = modeIndices[targetModeIdx];
|
|
528
|
+
result = prev.entries[newIndex].text;
|
|
529
|
+
return {
|
|
530
|
+
...prev,
|
|
531
|
+
currentIndex: newIndex,
|
|
532
|
+
};
|
|
533
|
+
});
|
|
534
|
+
return result;
|
|
535
|
+
}, []);
|
|
536
|
+
return {
|
|
537
|
+
entries: state.entries,
|
|
538
|
+
isActive: state.isActive,
|
|
539
|
+
currentIndex: state.currentIndex,
|
|
540
|
+
activeMode: state.activeMode,
|
|
541
|
+
searchMode: state.searchMode,
|
|
542
|
+
searchQuery: state.searchQuery,
|
|
543
|
+
addEntry,
|
|
544
|
+
navigateUp,
|
|
545
|
+
navigateDown,
|
|
546
|
+
exitHistory,
|
|
547
|
+
acceptHistory,
|
|
548
|
+
navigateUpFiltered,
|
|
549
|
+
navigateDownFiltered,
|
|
550
|
+
enterSearchMode,
|
|
551
|
+
updateSearchQuery,
|
|
552
|
+
searchBackward,
|
|
553
|
+
searchForward,
|
|
554
|
+
exitSearchMode,
|
|
555
|
+
acceptSearch,
|
|
556
|
+
jumpUp,
|
|
557
|
+
jumpDown,
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
// Export for testing
|
|
561
|
+
export { isSensitiveCommand, shouldAddToHistory, getModeIndices };
|
|
562
|
+
//# sourceMappingURL=useHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHistory.js","sourceRoot":"","sources":["../../../src/repl/hooks/useHistory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAW,MAAM,OAAO,CAAC;AAmEvD,kEAAkE;AAClE,MAAM,kBAAkB,GAAG;IACzB,sBAAsB;IACtB,2BAA2B;IAC3B,qBAAqB;IACrB,sBAAsB;IACtB,wBAAwB;IACxB,mBAAmB;IAEnB,qBAAqB;IACrB,qBAAqB,EAAY,eAAe;IAChD,uBAAuB,EAAU,iBAAiB;IAClD,qBAAqB,EAAY,aAAa;IAC9C,qBAAqB,EAAY,eAAe;IAChD,0BAA0B,EAAO,eAAe;IAEhD,oDAAoD;IACpD,+FAA+F;CAChG,CAAC;AAEF;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAa,EAAE,SAAmC,EAAE,IAAiB;IAC/F,2BAA2B;IAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+CAA+C;IAC/C,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB;IACpB,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,OAAuB,EAAE,IAAiB;IAChE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,MAAM,UAAU,UAAU,CAAC,UAA6B,EAAE;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAE7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe;QAC/C,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,CAAC,CAAC;QAChB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,CAAC,CAAC;KACtB,CAAC,CAAC;IAEH;;OAEG;IACH,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,IAAiB,EAAE,EAAE;QAChE,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAExD,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,2BAA2B;YAC3B,IAAI,UAAU,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBACnC,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YAED,OAAO;gBACL,GAAG,IAAI;gBACP,OAAO,EAAE,UAAU;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB;;;OAGG;IACH,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,YAAoB,EAAE,IAAiB,EAAiB,EAAE;QACxF,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,4CAA4C;YAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEvD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,+CAA+C;gBAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,QAAQ;oBACtB,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/E,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBACjD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,gDAAgD;YAChD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAiB,EAAiB,EAAE;QACpE,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,4CAA4C;YAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEvD,+BAA+B;YAC/B,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/E,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBACjD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,2EAA2E;YAC3E,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,WAAW,GAAG,WAAW,CAAC,GAAW,EAAE;QAC3C,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAkB,EAAE;QACpD,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAC9C,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,kBAAkB,GAAG,WAAW,CAAC,CAAC,YAAoB,EAAE,MAAc,EAAE,IAAiB,EAAiB,EAAE;QAChH,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,wCAAwC;YACxC,MAAM,eAAe,GAAa,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7E,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,+CAA+C;YAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC7D,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,QAAQ;oBACtB,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,+BAA+B;YAC/B,MAAM,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YACpF,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;gBACtD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,MAAc,EAAE,IAAiB,EAAiB,EAAE;QAC5F,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wCAAwC;YACxC,MAAM,eAAe,GAAa,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7E,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,MAAM,eAAe,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YACpF,IAAI,eAAe,IAAI,CAAC,IAAI,eAAe,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,eAAe,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;gBACtD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,8CAA8C;YAC9C,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,iBAAiB,GAAG,CAAC,OAAuB,EAAE,KAAa,EAAE,IAAiB,EAAY,EAAE;QAChG,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,YAAoB,EAAE,IAAiB,EAAE,EAAE;QAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,4DAA4D;YAC5D,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAC1E,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,YAAY,GAAG,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpF,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,YAAY;gBACzB,aAAa;gBACb,iBAAiB;gBACjB,YAAY;gBACZ,UAAU,EAAE,YAAY;gBACxB,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAiB,EAAE;QACrE,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAEtD,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9E,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,YAAY,GAAG,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpF,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAC3C,CAAC;YAED,OAAO;gBACL,GAAG,IAAI;gBACP,WAAW,EAAE,KAAK;gBAClB,aAAa;gBACb,iBAAiB;gBACjB,YAAY;aACb,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAkB,EAAE;QACrD,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,yBAAyB;YACzB,IAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;gBAC1D,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,oBAAoB;oBACvC,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,GAAkB,EAAE;QACpD,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,qBAAqB;YACrB,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;gBAC1D,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,iBAAiB,EAAE,oBAAoB;oBACvC,YAAY,EAAE,QAAQ;iBACvB,CAAC;YACJ,CAAC;YAED,8BAA8B;YAC9B,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,GAAW,EAAE;QAC9C,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,EAAE;gBACjB,iBAAiB,EAAE,CAAC,CAAC;gBACrB,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;OAGG;IACH,MAAM,YAAY,GAAG,WAAW,CAAC,GAAkB,EAAE;QACnD,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAC9C,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,KAAK;gBACf,UAAU,EAAE,KAAK;gBACjB,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,EAAE;gBACjB,iBAAiB,EAAE,CAAC,CAAC;gBACrB,YAAY,EAAE,CAAC,CAAC;gBAChB,UAAU,EAAE,EAAE;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,CAAC,CAAC;IAE5B;;OAEG;IACH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,YAAoB,EAAE,IAAiB,EAAE,OAAe,iBAAiB,EAAiB,EAAE;QACtH,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEvD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;gBAC7D,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;gBAC5C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACrC,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,QAAQ;oBACtB,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,iDAAiD;YACjD,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACrC,OAAO;gBACL,GAAG,IAAI;gBACP,YAAY,EAAE,QAAQ;aACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;OAEG;IACH,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAiB,EAAE,OAAe,iBAAiB,EAAiB,EAAE;QAClG,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC;YAE/E,2BAA2B;YAC3B,MAAM,aAAa,GAAG,cAAc,GAAG,IAAI,CAAC;YAE5C,IAAI,aAAa,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACxC,4CAA4C;gBAC5C,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;gBACzB,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,KAAK;oBACf,YAAY,EAAE,CAAC,CAAC;oBAChB,UAAU,EAAE,EAAE;oBACd,UAAU,EAAE,IAAI;iBACjB,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;YAC5C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACrC,OAAO;gBACL,GAAG,IAAI;gBACP,YAAY,EAAE,QAAQ;aACvB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ;QACR,UAAU;QACV,YAAY;QACZ,WAAW;QACX,aAAa;QACb,kBAAkB;QAClB,oBAAoB;QACpB,eAAe;QACf,iBAAiB;QACjB,cAAc;QACd,aAAa;QACb,cAAc;QACd,YAAY;QACZ,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,qBAAqB;AACrB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testany/hephos",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "Hephos - full CLI+REPL bundle for multi-agent conversation orchestration (depends on agent-chatter core)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./out/cli.js",
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"ink-text-input": "^6.0.0",
|
|
33
33
|
"inquirer": "^9.3.8",
|
|
34
34
|
"inquirer-autocomplete-standalone": "^0.8.1",
|
|
35
|
+
"patch-package": "^8.0.1",
|
|
35
36
|
"react": "^19.2.0"
|
|
36
37
|
},
|
|
37
38
|
"devDependencies": {
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"vitest": "^4.0.9"
|
|
43
44
|
},
|
|
44
45
|
"scripts": {
|
|
46
|
+
"postinstall": "patch-package",
|
|
45
47
|
"build": "tsc",
|
|
46
48
|
"build:watch": "tsc --watch",
|
|
47
49
|
"test": "vitest run",
|
|
@@ -53,6 +55,7 @@
|
|
|
53
55
|
},
|
|
54
56
|
"files": [
|
|
55
57
|
"out/**/*",
|
|
58
|
+
"patches/**/*",
|
|
56
59
|
"LICENSE",
|
|
57
60
|
"README.md"
|
|
58
61
|
],
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
diff --git a/node_modules/ink-text-input/build/index.js b/node_modules/ink-text-input/build/index.js
|
|
2
|
+
index ada7cdc..4aa2969 100644
|
|
3
|
+
--- a/node_modules/ink-text-input/build/index.js
|
|
4
|
+
+++ b/node_modules/ink-text-input/build/index.js
|
|
5
|
+
@@ -72,7 +72,8 @@ function TextInput({ value: originalValue, placeholder = '', focus = true, mask,
|
|
6
|
+
nextCursorOffset++;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
- else if (key.backspace || key.delete) {
|
|
10
|
+
+ else if (key.backspace) {
|
|
11
|
+
+ // Backspace: delete character BEFORE cursor
|
|
12
|
+
if (cursorOffset > 0) {
|
|
13
|
+
nextValue =
|
|
14
|
+
originalValue.slice(0, cursorOffset - 1) +
|
|
15
|
+
@@ -80,6 +81,15 @@ function TextInput({ value: originalValue, placeholder = '', focus = true, mask,
|
|
16
|
+
nextCursorOffset--;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
+ else if (key.delete) {
|
|
20
|
+
+ // Delete (forward delete): delete character AT cursor position (after cursor)
|
|
21
|
+
+ if (cursorOffset < originalValue.length) {
|
|
22
|
+
+ nextValue =
|
|
23
|
+
+ originalValue.slice(0, cursorOffset) +
|
|
24
|
+
+ originalValue.slice(cursorOffset + 1, originalValue.length);
|
|
25
|
+
+ // Cursor position stays the same
|
|
26
|
+
+ }
|
|
27
|
+
+ }
|
|
28
|
+
else {
|
|
29
|
+
nextValue =
|
|
30
|
+
originalValue.slice(0, cursorOffset) +
|