@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.
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testany/hephos",
3
- "version": "0.3.9",
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) +