@qduc/term2 0.3.0 → 0.3.1
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/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +32 -11
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-model-selection.test.js +107 -10
- package/dist/hooks/use-model-selection.test.js.map +1 -1
- package/dist/providers/ai-sdk-message-normalizer.d.ts +8 -0
- package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.js +70 -0
- package/dist/providers/ai-sdk-message-normalizer.js.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts +2 -0
- package/dist/providers/ai-sdk-message-normalizer.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js +195 -0
- package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +2 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openrouter.provider.d.ts +16 -0
- package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.js +22 -0
- package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts +2 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js +70 -0
- package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -0
- package/dist/providers/openrouter.provider.js +4 -3
- package/dist/providers/openrouter.provider.js.map +1 -1
- package/dist/scripts/eval-auto-approval/dataset.d.ts +1 -1
- package/dist/services/stream-event-parsing.js +1 -1
- package/dist/services/stream-event-parsing.js.map +1 -1
- package/dist/services/stream-event-parsing.test.js +13 -0
- package/dist/services/stream-event-parsing.test.js.map +1 -1
- package/package.json +2 -1
- package/readme.md +29 -24
- package/dist/agent.lite-mode.test.d.ts +0 -2
- package/dist/agent.lite-mode.test.d.ts.map +0 -1
- package/dist/agent.lite-mode.test.js +0 -39
- package/dist/agent.lite-mode.test.js.map +0 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +0 -2
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +0 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +0 -18
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +0 -1
- package/dist/components/TextInput.d.ts +0 -42
- package/dist/components/TextInput.d.ts.map +0 -1
- package/dist/components/TextInput.js +0 -398
- package/dist/components/TextInput.js.map +0 -1
- package/dist/components/TextInput.test.d.ts +0 -2
- package/dist/components/TextInput.test.d.ts.map +0 -1
- package/dist/components/TextInput.test.js +0 -75
- package/dist/components/TextInput.test.js.map +0 -1
- package/dist/debug_ask_mentor.d.ts +0 -2
- package/dist/debug_ask_mentor.d.ts.map +0 -1
- package/dist/debug_ask_mentor.js +0 -73
- package/dist/debug_ask_mentor.js.map +0 -1
- package/dist/lib/shell.d.ts +0 -7
- package/dist/lib/shell.d.ts.map +0 -1
- package/dist/lib/shell.js +0 -56
- package/dist/lib/shell.js.map +0 -1
- package/dist/modes/companion/command-index.d.ts +0 -26
- package/dist/modes/companion/command-index.d.ts.map +0 -1
- package/dist/modes/companion/command-index.js +0 -50
- package/dist/modes/companion/command-index.js.map +0 -1
- package/dist/modes/companion/command-index.test.d.ts +0 -2
- package/dist/modes/companion/command-index.test.d.ts.map +0 -1
- package/dist/modes/companion/command-index.test.js +0 -86
- package/dist/modes/companion/command-index.test.js.map +0 -1
- package/dist/modes/companion/companion-app.d.ts +0 -12
- package/dist/modes/companion/companion-app.d.ts.map +0 -1
- package/dist/modes/companion/companion-app.js +0 -297
- package/dist/modes/companion/companion-app.js.map +0 -1
- package/dist/modes/companion/companion-session.d.ts +0 -63
- package/dist/modes/companion/companion-session.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.js +0 -146
- package/dist/modes/companion/companion-session.js.map +0 -1
- package/dist/modes/companion/companion-session.test.d.ts +0 -2
- package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.test.js +0 -28
- package/dist/modes/companion/companion-session.test.js.map +0 -1
- package/dist/modes/companion/components/status-bar.d.ts +0 -13
- package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
- package/dist/modes/companion/components/status-bar.js +0 -26
- package/dist/modes/companion/components/status-bar.js.map +0 -1
- package/dist/modes/companion/context-buffer.d.ts +0 -65
- package/dist/modes/companion/context-buffer.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.js +0 -156
- package/dist/modes/companion/context-buffer.js.map +0 -1
- package/dist/modes/companion/context-buffer.test.d.ts +0 -2
- package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.test.js +0 -154
- package/dist/modes/companion/context-buffer.test.js.map +0 -1
- package/dist/modes/companion/event-detector.d.ts +0 -46
- package/dist/modes/companion/event-detector.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.js +0 -169
- package/dist/modes/companion/event-detector.js.map +0 -1
- package/dist/modes/companion/event-detector.test.d.ts +0 -2
- package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.test.js +0 -121
- package/dist/modes/companion/event-detector.test.js.map +0 -1
- package/dist/modes/companion/index.d.ts +0 -33
- package/dist/modes/companion/index.d.ts.map +0 -1
- package/dist/modes/companion/index.js +0 -21
- package/dist/modes/companion/index.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.d.ts +0 -3
- package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.js +0 -31
- package/dist/modes/companion/input-key-mapper.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.js +0 -26
- package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
- package/dist/modes/companion/input-parser.d.ts +0 -53
- package/dist/modes/companion/input-parser.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.js +0 -114
- package/dist/modes/companion/input-parser.js.map +0 -1
- package/dist/modes/companion/input-parser.test.d.ts +0 -2
- package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.test.js +0 -123
- package/dist/modes/companion/input-parser.test.js.map +0 -1
- package/dist/modes/companion/mode-manager.d.ts +0 -41
- package/dist/modes/companion/mode-manager.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.js +0 -56
- package/dist/modes/companion/mode-manager.js.map +0 -1
- package/dist/modes/companion/mode-manager.test.d.ts +0 -2
- package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.test.js +0 -65
- package/dist/modes/companion/mode-manager.test.js.map +0 -1
- package/dist/modes/companion/output-classifier.d.ts +0 -15
- package/dist/modes/companion/output-classifier.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.js +0 -77
- package/dist/modes/companion/output-classifier.js.map +0 -1
- package/dist/modes/companion/output-classifier.test.d.ts +0 -2
- package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.test.js +0 -133
- package/dist/modes/companion/output-classifier.test.js.map +0 -1
- package/dist/modes/companion/pty-wrapper.d.ts +0 -46
- package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
- package/dist/modes/companion/pty-wrapper.js +0 -143
- package/dist/modes/companion/pty-wrapper.js.map +0 -1
- package/dist/modes/companion/safety-classifier.d.ts +0 -31
- package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.js +0 -140
- package/dist/modes/companion/safety-classifier.js.map +0 -1
- package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
- package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.test.js +0 -151
- package/dist/modes/companion/safety-classifier.test.js.map +0 -1
- package/dist/modes/companion/summarizer.d.ts +0 -24
- package/dist/modes/companion/summarizer.d.ts.map +0 -1
- package/dist/modes/companion/summarizer.js +0 -132
- package/dist/modes/companion/summarizer.js.map +0 -1
- package/dist/modes/companion/terminal-history.d.ts +0 -27
- package/dist/modes/companion/terminal-history.d.ts.map +0 -1
- package/dist/modes/companion/terminal-history.js +0 -142
- package/dist/modes/companion/terminal-history.js.map +0 -1
- package/dist/prompts/simple-mentor.md +0 -215
- package/dist/providers/github-copilot/converters.d.ts +0 -45
- package/dist/providers/github-copilot/converters.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.js +0 -118
- package/dist/providers/github-copilot/converters.js.map +0 -1
- package/dist/providers/github-copilot/converters.test.d.ts +0 -2
- package/dist/providers/github-copilot/converters.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/converters.test.js +0 -162
- package/dist/providers/github-copilot/converters.test.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.js +0 -75
- package/dist/providers/github-copilot/github-copilot.provider.js.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/github-copilot.provider.test.js +0 -26
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +0 -1
- package/dist/providers/github-copilot/index.d.ts +0 -4
- package/dist/providers/github-copilot/index.d.ts.map +0 -1
- package/dist/providers/github-copilot/index.js +0 -4
- package/dist/providers/github-copilot/index.js.map +0 -1
- package/dist/providers/github-copilot/model.d.ts +0 -24
- package/dist/providers/github-copilot/model.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.delta.test.js +0 -15
- package/dist/providers/github-copilot/model.delta.test.js.map +0 -1
- package/dist/providers/github-copilot/model.js +0 -498
- package/dist/providers/github-copilot/model.js.map +0 -1
- package/dist/providers/github-copilot/model.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.test.js +0 -63
- package/dist/providers/github-copilot/model.test.js.map +0 -1
- package/dist/providers/github-copilot/provider.d.ts +0 -15
- package/dist/providers/github-copilot/provider.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.js +0 -25
- package/dist/providers/github-copilot/provider.js.map +0 -1
- package/dist/providers/github-copilot/provider.test.d.ts +0 -2
- package/dist/providers/github-copilot/provider.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/provider.test.js +0 -52
- package/dist/providers/github-copilot/provider.test.js.map +0 -1
- package/dist/providers/github-copilot/utils.d.ts +0 -20
- package/dist/providers/github-copilot/utils.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.js +0 -142
- package/dist/providers/github-copilot/utils.js.map +0 -1
- package/dist/providers/github-copilot/utils.test.d.ts +0 -2
- package/dist/providers/github-copilot/utils.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/utils.test.js +0 -21
- package/dist/providers/github-copilot/utils.test.js.map +0 -1
- package/dist/safety-checker.js +0 -57
- package/dist/services/check_mock.d.ts +0 -2
- package/dist/services/check_mock.d.ts.map +0 -1
- package/dist/services/check_mock.js +0 -22
- package/dist/services/check_mock.js.map +0 -1
- package/dist/services/conversation-service.test.d.ts +0 -2
- package/dist/services/conversation-service.test.d.ts.map +0 -1
- package/dist/services/conversation-service.test.js +0 -156
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/tools/bash.d.ts +0 -10
- package/dist/tools/bash.d.ts.map +0 -1
- package/dist/tools/bash.js +0 -55
- package/dist/tools/bash.js.map +0 -1
- package/dist/utils/command-safety.d.ts +0 -21
- package/dist/utils/command-safety.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.d.ts +0 -2
- package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.js +0 -13
- package/dist/utils/command-safety.devnull.test.js.map +0 -1
- package/dist/utils/command-safety.js +0 -348
- package/dist/utils/command-safety.js.map +0 -1
- package/dist/utils/extract-command-messages.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.test.js +0 -64
- package/dist/utils/extract-command-messages.test.js.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +0 -2
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +0 -1
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +0 -1
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { classifyCommandSafety, shouldAutoApprove, shouldBlock, getSafetyDescription, } from './safety-classifier.js';
|
|
3
|
-
// GREEN (safe) commands
|
|
4
|
-
test('classifies ls as green', t => {
|
|
5
|
-
const result = classifyCommandSafety('ls -la');
|
|
6
|
-
t.is(result.level, 'green');
|
|
7
|
-
});
|
|
8
|
-
test('classifies cd as green', t => {
|
|
9
|
-
const result = classifyCommandSafety('cd /path/to/dir');
|
|
10
|
-
t.is(result.level, 'green');
|
|
11
|
-
});
|
|
12
|
-
test('classifies git status as green', t => {
|
|
13
|
-
const result = classifyCommandSafety('git status');
|
|
14
|
-
t.is(result.level, 'green');
|
|
15
|
-
});
|
|
16
|
-
test('classifies git log as green', t => {
|
|
17
|
-
const result = classifyCommandSafety('git log --oneline');
|
|
18
|
-
t.is(result.level, 'green');
|
|
19
|
-
});
|
|
20
|
-
test('classifies npm test as green', t => {
|
|
21
|
-
const result = classifyCommandSafety('npm test');
|
|
22
|
-
t.is(result.level, 'green');
|
|
23
|
-
});
|
|
24
|
-
test('classifies npm install (local) as green', t => {
|
|
25
|
-
const result = classifyCommandSafety('npm install lodash');
|
|
26
|
-
t.is(result.level, 'green');
|
|
27
|
-
});
|
|
28
|
-
test('classifies cat as green', t => {
|
|
29
|
-
const result = classifyCommandSafety('cat file.txt');
|
|
30
|
-
t.is(result.level, 'green');
|
|
31
|
-
});
|
|
32
|
-
test('classifies grep as green', t => {
|
|
33
|
-
const result = classifyCommandSafety('grep -r "pattern" .');
|
|
34
|
-
t.is(result.level, 'green');
|
|
35
|
-
});
|
|
36
|
-
// YELLOW (risky) commands
|
|
37
|
-
test('classifies rm -r as yellow', t => {
|
|
38
|
-
const result = classifyCommandSafety('rm -r directory');
|
|
39
|
-
t.is(result.level, 'yellow');
|
|
40
|
-
});
|
|
41
|
-
test('classifies sudo as yellow', t => {
|
|
42
|
-
const result = classifyCommandSafety('sudo apt update');
|
|
43
|
-
t.is(result.level, 'yellow');
|
|
44
|
-
});
|
|
45
|
-
test('classifies git push as yellow', t => {
|
|
46
|
-
const result = classifyCommandSafety('git push origin main');
|
|
47
|
-
t.is(result.level, 'yellow');
|
|
48
|
-
});
|
|
49
|
-
test('classifies npm install -g as yellow', t => {
|
|
50
|
-
const result = classifyCommandSafety('npm install -g typescript');
|
|
51
|
-
t.is(result.level, 'yellow');
|
|
52
|
-
});
|
|
53
|
-
test('classifies file overwrite redirect as yellow', t => {
|
|
54
|
-
const result = classifyCommandSafety('echo "test" > file.txt');
|
|
55
|
-
t.is(result.level, 'yellow');
|
|
56
|
-
});
|
|
57
|
-
test('classifies chmod as yellow', t => {
|
|
58
|
-
const result = classifyCommandSafety('chmod 644 file.txt');
|
|
59
|
-
t.is(result.level, 'yellow');
|
|
60
|
-
});
|
|
61
|
-
test('classifies unknown command as yellow', t => {
|
|
62
|
-
const result = classifyCommandSafety('someunknowncommand --flag');
|
|
63
|
-
t.is(result.level, 'yellow');
|
|
64
|
-
t.is(result.reason, 'Unknown command');
|
|
65
|
-
});
|
|
66
|
-
// RED (dangerous) commands
|
|
67
|
-
test('classifies rm -rf / as red', t => {
|
|
68
|
-
const result = classifyCommandSafety('rm -rf /');
|
|
69
|
-
t.is(result.level, 'red');
|
|
70
|
-
});
|
|
71
|
-
test('classifies rm -rf ~ as red', t => {
|
|
72
|
-
const result = classifyCommandSafety('rm -rf ~');
|
|
73
|
-
t.is(result.level, 'red');
|
|
74
|
-
});
|
|
75
|
-
test('classifies sudo rm as red', t => {
|
|
76
|
-
const result = classifyCommandSafety('sudo rm -rf /var');
|
|
77
|
-
t.is(result.level, 'red');
|
|
78
|
-
});
|
|
79
|
-
test('classifies curl pipe to bash as red', t => {
|
|
80
|
-
const result = classifyCommandSafety('curl http://example.com/script.sh | bash');
|
|
81
|
-
t.is(result.level, 'red');
|
|
82
|
-
});
|
|
83
|
-
test('classifies wget pipe to sh as red', t => {
|
|
84
|
-
const result = classifyCommandSafety('wget -qO- http://example.com/script.sh | sh');
|
|
85
|
-
t.is(result.level, 'red');
|
|
86
|
-
});
|
|
87
|
-
test('classifies chmod 777 as red', t => {
|
|
88
|
-
const result = classifyCommandSafety('chmod 777 /etc/passwd');
|
|
89
|
-
t.is(result.level, 'red');
|
|
90
|
-
});
|
|
91
|
-
test('classifies direct disk write as red', t => {
|
|
92
|
-
const result = classifyCommandSafety('dd if=/dev/zero > /dev/sda');
|
|
93
|
-
t.is(result.level, 'red');
|
|
94
|
-
});
|
|
95
|
-
test('classifies mkfs as red', t => {
|
|
96
|
-
const result = classifyCommandSafety('mkfs.ext4 /dev/sdb1');
|
|
97
|
-
t.is(result.level, 'red');
|
|
98
|
-
});
|
|
99
|
-
// Helper functions
|
|
100
|
-
test('shouldAutoApprove returns true for green', t => {
|
|
101
|
-
const result = classifyCommandSafety('ls');
|
|
102
|
-
t.true(shouldAutoApprove(result));
|
|
103
|
-
});
|
|
104
|
-
test('shouldAutoApprove returns false for yellow', t => {
|
|
105
|
-
const result = classifyCommandSafety('rm -r dir');
|
|
106
|
-
t.false(shouldAutoApprove(result));
|
|
107
|
-
});
|
|
108
|
-
test('shouldAutoApprove returns false for red', t => {
|
|
109
|
-
const result = classifyCommandSafety('rm -rf /');
|
|
110
|
-
t.false(shouldAutoApprove(result));
|
|
111
|
-
});
|
|
112
|
-
test('shouldBlock returns false for green', t => {
|
|
113
|
-
const result = classifyCommandSafety('ls');
|
|
114
|
-
t.false(shouldBlock(result));
|
|
115
|
-
});
|
|
116
|
-
test('shouldBlock returns false for yellow', t => {
|
|
117
|
-
const result = classifyCommandSafety('rm -r dir');
|
|
118
|
-
t.false(shouldBlock(result));
|
|
119
|
-
});
|
|
120
|
-
test('shouldBlock returns true for red', t => {
|
|
121
|
-
const result = classifyCommandSafety('rm -rf /');
|
|
122
|
-
t.true(shouldBlock(result));
|
|
123
|
-
});
|
|
124
|
-
test('getSafetyDescription returns correct text for green', t => {
|
|
125
|
-
t.is(getSafetyDescription('green'), 'Safe - will auto-execute');
|
|
126
|
-
});
|
|
127
|
-
test('getSafetyDescription returns correct text for yellow', t => {
|
|
128
|
-
t.is(getSafetyDescription('yellow'), 'Needs confirmation');
|
|
129
|
-
});
|
|
130
|
-
test('getSafetyDescription returns correct text for red', t => {
|
|
131
|
-
t.is(getSafetyDescription('red'), 'Blocked - potentially dangerous');
|
|
132
|
-
});
|
|
133
|
-
// Edge cases
|
|
134
|
-
test('handles empty command', t => {
|
|
135
|
-
const result = classifyCommandSafety('');
|
|
136
|
-
t.is(result.level, 'yellow');
|
|
137
|
-
});
|
|
138
|
-
test('handles whitespace-only command', t => {
|
|
139
|
-
const result = classifyCommandSafety(' ');
|
|
140
|
-
t.is(result.level, 'yellow');
|
|
141
|
-
});
|
|
142
|
-
test('is case insensitive for patterns', t => {
|
|
143
|
-
const result1 = classifyCommandSafety('LS -LA');
|
|
144
|
-
const result2 = classifyCommandSafety('ls -la');
|
|
145
|
-
t.is(result1.level, result2.level);
|
|
146
|
-
});
|
|
147
|
-
test('trims command before classification', t => {
|
|
148
|
-
const result = classifyCommandSafety(' ls ');
|
|
149
|
-
t.is(result.level, 'green');
|
|
150
|
-
});
|
|
151
|
-
//# sourceMappingURL=safety-classifier.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safety-classifier.test.js","sourceRoot":"","sources":["../../../source/modes/companion/safety-classifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ISettingsService, ILoggingService } from '../../services/service-interfaces.js';
|
|
2
|
-
import type { CommandEntry } from './context-buffer.js';
|
|
3
|
-
export interface SummarizerDeps {
|
|
4
|
-
settings: ISettingsService;
|
|
5
|
-
logger: ILoggingService;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Summarizer for command outputs using a small, fast LLM.
|
|
9
|
-
* Caches summaries to avoid reprocessing.
|
|
10
|
-
*/
|
|
11
|
-
export declare class Summarizer {
|
|
12
|
-
#private;
|
|
13
|
-
constructor(deps: SummarizerDeps);
|
|
14
|
-
/**
|
|
15
|
-
* Summarize command output.
|
|
16
|
-
* Returns the original output if summarization is not needed or fails.
|
|
17
|
-
*/
|
|
18
|
-
summarize(entry: CommandEntry, detail: 'summary' | 'errors_only'): Promise<string>;
|
|
19
|
-
/**
|
|
20
|
-
* Clear the summary cache.
|
|
21
|
-
*/
|
|
22
|
-
clearCache(): void;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=summarizer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/summarizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,gBAAgB,EAAE,eAAe,EAAC,MAAM,sCAAsC,CAAC;AAC5F,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAGtD,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,eAAe,CAAC;CAC3B;AASD;;;GAGG;AACH,qBAAa,UAAU;;gBAMP,IAAI,EAAE,cAAc;IAKhC;;;OAGG;IACG,SAAS,CACX,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,SAAS,GAAG,aAAa,GAClC,OAAO,CAAC,MAAM,CAAC;IAkDlB;;OAEG;IACH,UAAU,IAAI,IAAI;CAsFrB"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import OpenAI from 'openai';
|
|
2
|
-
import { classifyOutputType, getSummarizationPrompt, shouldSummarize } from './output-classifier.js';
|
|
3
|
-
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
4
|
-
/**
|
|
5
|
-
* Summarizer for command outputs using a small, fast LLM.
|
|
6
|
-
* Caches summaries to avoid reprocessing.
|
|
7
|
-
*/
|
|
8
|
-
export class Summarizer {
|
|
9
|
-
#client = null;
|
|
10
|
-
#settings;
|
|
11
|
-
#logger;
|
|
12
|
-
#cache = new Map();
|
|
13
|
-
constructor(deps) {
|
|
14
|
-
this.#settings = deps.settings;
|
|
15
|
-
this.#logger = deps.logger;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Summarize command output.
|
|
19
|
-
* Returns the original output if summarization is not needed or fails.
|
|
20
|
-
*/
|
|
21
|
-
async summarize(entry, detail) {
|
|
22
|
-
// Check if summarization is needed
|
|
23
|
-
if (!shouldSummarize(entry)) {
|
|
24
|
-
return entry.output;
|
|
25
|
-
}
|
|
26
|
-
// Check cache
|
|
27
|
-
const cacheKey = this.#getCacheKey(entry, detail);
|
|
28
|
-
const cached = this.#cache.get(cacheKey);
|
|
29
|
-
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
30
|
-
return cached.summary;
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
const client = await this.#getClient();
|
|
34
|
-
const model = this.#settings.get('companion.summarizerModel') || 'gpt-4o-mini';
|
|
35
|
-
const maxTokens = this.#settings.get('companion.summarizerMaxTokens') || 500;
|
|
36
|
-
const outputType = classifyOutputType(entry);
|
|
37
|
-
const prompt = this.#buildPrompt(entry, detail, outputType);
|
|
38
|
-
const response = await client.chat.completions.create({
|
|
39
|
-
model,
|
|
40
|
-
max_tokens: maxTokens,
|
|
41
|
-
messages: [
|
|
42
|
-
{
|
|
43
|
-
role: 'system',
|
|
44
|
-
content: 'You are a concise technical summarizer. Extract key information only.',
|
|
45
|
-
},
|
|
46
|
-
{ role: 'user', content: prompt },
|
|
47
|
-
],
|
|
48
|
-
});
|
|
49
|
-
const summary = response.choices[0]?.message?.content || entry.output;
|
|
50
|
-
// Cache result
|
|
51
|
-
this.#cache.set(cacheKey, { summary, timestamp: Date.now() });
|
|
52
|
-
return summary;
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
this.#logger.warn('Summarization failed, using fallback', {
|
|
56
|
-
error: error instanceof Error ? error.message : String(error),
|
|
57
|
-
command: entry.command.slice(0, 50),
|
|
58
|
-
});
|
|
59
|
-
// Fallback: smart truncation
|
|
60
|
-
return this.#fallbackSummarize(entry, detail);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Clear the summary cache.
|
|
65
|
-
*/
|
|
66
|
-
clearCache() {
|
|
67
|
-
this.#cache.clear();
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Get or create OpenAI client.
|
|
71
|
-
*/
|
|
72
|
-
async #getClient() {
|
|
73
|
-
if (this.#client) {
|
|
74
|
-
return this.#client;
|
|
75
|
-
}
|
|
76
|
-
const provider = this.#settings.get('companion.summarizerProvider') || 'openai';
|
|
77
|
-
// Use OpenAI API key from environment
|
|
78
|
-
const apiKey = process.env.OPENAI_API_KEY;
|
|
79
|
-
// For non-OpenAI providers, get baseURL from settings
|
|
80
|
-
const baseURL = provider === 'openai'
|
|
81
|
-
? undefined
|
|
82
|
-
: this.#settings.get(`agent.${provider}.baseUrl`);
|
|
83
|
-
if (!apiKey) {
|
|
84
|
-
throw new Error('OPENAI_API_KEY not set');
|
|
85
|
-
}
|
|
86
|
-
this.#client = new OpenAI({ apiKey, baseURL });
|
|
87
|
-
return this.#client;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Build the summarization prompt.
|
|
91
|
-
*/
|
|
92
|
-
#buildPrompt(entry, detail, outputType) {
|
|
93
|
-
const basePrompt = getSummarizationPrompt(outputType);
|
|
94
|
-
return `Command: ${entry.command}
|
|
95
|
-
Exit code: ${entry.exitCode}
|
|
96
|
-
|
|
97
|
-
Output:
|
|
98
|
-
\`\`\`
|
|
99
|
-
${entry.output}
|
|
100
|
-
\`\`\`
|
|
101
|
-
|
|
102
|
-
${detail === 'errors_only' ? getSummarizationPrompt('error_output') : basePrompt}`;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Fallback summarization without LLM.
|
|
106
|
-
*/
|
|
107
|
-
#fallbackSummarize(entry, detail) {
|
|
108
|
-
const lines = entry.output.split('\n');
|
|
109
|
-
if (detail === 'errors_only') {
|
|
110
|
-
// Extract lines containing common error patterns
|
|
111
|
-
const errorPatterns = /error|fail|exception|fatal|critical|warning/i;
|
|
112
|
-
const errorLines = lines.filter(l => errorPatterns.test(l));
|
|
113
|
-
return errorLines.slice(0, 20).join('\n') || 'No obvious errors found';
|
|
114
|
-
}
|
|
115
|
-
// Default: first and last N lines
|
|
116
|
-
if (lines.length <= 30) {
|
|
117
|
-
return entry.output;
|
|
118
|
-
}
|
|
119
|
-
return [
|
|
120
|
-
...lines.slice(0, 15),
|
|
121
|
-
`... (${lines.length - 30} lines omitted)`,
|
|
122
|
-
...lines.slice(-15),
|
|
123
|
-
].join('\n');
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Generate cache key for an entry.
|
|
127
|
-
*/
|
|
128
|
-
#getCacheKey(entry, detail) {
|
|
129
|
-
return `${entry.command}:${entry.timestamp}:${detail}`;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=summarizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../../source/modes/companion/summarizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import type { ToolDefinition } from '../../tools/types.js';
|
|
3
|
-
import type { ContextBuffer } from './context-buffer.js';
|
|
4
|
-
import type { Summarizer } from './summarizer.js';
|
|
5
|
-
declare const TerminalHistoryParamsSchema: z.ZodObject<{
|
|
6
|
-
index: z.ZodOptional<z.ZodNumber>;
|
|
7
|
-
lastN: z.ZodOptional<z.ZodNumber>;
|
|
8
|
-
search: z.ZodOptional<z.ZodString>;
|
|
9
|
-
detail: z.ZodEnum<{
|
|
10
|
-
summary: "summary";
|
|
11
|
-
errors_only: "errors_only";
|
|
12
|
-
full: "full";
|
|
13
|
-
}>;
|
|
14
|
-
maxLines: z.ZodOptional<z.ZodNumber>;
|
|
15
|
-
}, z.core.$strip>;
|
|
16
|
-
export type TerminalHistoryParams = z.infer<typeof TerminalHistoryParamsSchema>;
|
|
17
|
-
interface TerminalHistoryDeps {
|
|
18
|
-
contextBuffer: ContextBuffer;
|
|
19
|
-
summarizer: Summarizer;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Create the terminal_history tool definition for companion mode.
|
|
23
|
-
* This tool allows the AI to query command history and outputs on-demand.
|
|
24
|
-
*/
|
|
25
|
-
export declare function createTerminalHistoryToolDefinition(deps: TerminalHistoryDeps): ToolDefinition<TerminalHistoryParams>;
|
|
26
|
-
export {};
|
|
27
|
-
//# sourceMappingURL=terminal-history.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-history.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/terminal-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAC,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAC,aAAa,EAAe,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAIhD,QAAA,MAAM,2BAA2B;;;;;;;;;;iBA2B/B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAShF,UAAU,mBAAmB;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,UAAU,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,mBAAmB,GAC1B,cAAc,CAAC,qBAAqB,CAAC,CA8HvC"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { shouldSummarize } from './output-classifier.js';
|
|
3
|
-
import { randomUUID } from 'node:crypto';
|
|
4
|
-
const TerminalHistoryParamsSchema = z.object({
|
|
5
|
-
index: z
|
|
6
|
-
.number()
|
|
7
|
-
.int()
|
|
8
|
-
.min(0)
|
|
9
|
-
.optional()
|
|
10
|
-
.describe('Specific command by index (0 = most recent)'),
|
|
11
|
-
lastN: z
|
|
12
|
-
.number()
|
|
13
|
-
.int()
|
|
14
|
-
.min(1)
|
|
15
|
-
.max(10)
|
|
16
|
-
.optional()
|
|
17
|
-
.describe('Fetch last N commands (default: 3)'),
|
|
18
|
-
search: z
|
|
19
|
-
.string()
|
|
20
|
-
.optional()
|
|
21
|
-
.describe('Search pattern for command or output text'),
|
|
22
|
-
detail: z
|
|
23
|
-
.enum(['summary', 'full', 'errors_only'])
|
|
24
|
-
.describe('Level of detail to return'),
|
|
25
|
-
maxLines: z
|
|
26
|
-
.number()
|
|
27
|
-
.int()
|
|
28
|
-
.min(1)
|
|
29
|
-
.optional()
|
|
30
|
-
.describe('Maximum output lines to return'),
|
|
31
|
-
});
|
|
32
|
-
/**
|
|
33
|
-
* Create the terminal_history tool definition for companion mode.
|
|
34
|
-
* This tool allows the AI to query command history and outputs on-demand.
|
|
35
|
-
*/
|
|
36
|
-
export function createTerminalHistoryToolDefinition(deps) {
|
|
37
|
-
const { contextBuffer, summarizer } = deps;
|
|
38
|
-
return {
|
|
39
|
-
name: 'terminal_history',
|
|
40
|
-
description: `Query the terminal command history. Use this to get details about recent commands and their outputs.
|
|
41
|
-
|
|
42
|
-
Available in the command index (always visible):
|
|
43
|
-
- Command text
|
|
44
|
-
- Exit code (0 = success)
|
|
45
|
-
- Relative time
|
|
46
|
-
- Output line count
|
|
47
|
-
|
|
48
|
-
Use this tool to fetch:
|
|
49
|
-
- Full command output
|
|
50
|
-
- Summarized output (for long outputs)
|
|
51
|
-
- Errors only (filtered view)`,
|
|
52
|
-
parameters: TerminalHistoryParamsSchema,
|
|
53
|
-
// Read-only tool - never needs approval
|
|
54
|
-
needsApproval: () => false,
|
|
55
|
-
execute: async (params) => {
|
|
56
|
-
const { index, lastN = 3, search, detail, maxLines } = params;
|
|
57
|
-
// Fetch entries from buffer
|
|
58
|
-
let entries;
|
|
59
|
-
if (index !== undefined) {
|
|
60
|
-
entries = [contextBuffer.getEntry(index)];
|
|
61
|
-
}
|
|
62
|
-
else if (search) {
|
|
63
|
-
entries = contextBuffer.search(search, lastN);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
entries = contextBuffer.getLastN(lastN);
|
|
67
|
-
}
|
|
68
|
-
// Filter out undefined entries
|
|
69
|
-
const validEntries = entries.filter((e) => e !== undefined);
|
|
70
|
-
if (validEntries.length === 0) {
|
|
71
|
-
return JSON.stringify({
|
|
72
|
-
success: false,
|
|
73
|
-
error: 'No matching commands found',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
// Process based on detail level
|
|
77
|
-
const results = await Promise.all(validEntries.map(async (entry) => {
|
|
78
|
-
let output;
|
|
79
|
-
if (detail === 'full') {
|
|
80
|
-
output = entry.output;
|
|
81
|
-
if (maxLines && entry.output.split('\n').length > maxLines) {
|
|
82
|
-
const lines = entry.output.split('\n');
|
|
83
|
-
output = [
|
|
84
|
-
...lines.slice(0, maxLines),
|
|
85
|
-
`... (${lines.length - maxLines} more lines)`,
|
|
86
|
-
].join('\n');
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else if (shouldSummarize(entry)) {
|
|
90
|
-
output = await summarizer.summarize(entry, detail);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
output = entry.output;
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
command: entry.command,
|
|
97
|
-
exitCode: entry.exitCode,
|
|
98
|
-
timestamp: entry.timestamp,
|
|
99
|
-
output,
|
|
100
|
-
};
|
|
101
|
-
}));
|
|
102
|
-
return JSON.stringify({ success: true, results });
|
|
103
|
-
},
|
|
104
|
-
formatCommandMessage: (item, index, toolCallArgumentsById) => {
|
|
105
|
-
const callId = item?.callId ||
|
|
106
|
-
item?.rawItem?.callId ||
|
|
107
|
-
item?.rawItem?.call_id;
|
|
108
|
-
const args = callId
|
|
109
|
-
? toolCallArgumentsById.get(callId)
|
|
110
|
-
: null;
|
|
111
|
-
let output = '';
|
|
112
|
-
try {
|
|
113
|
-
const parsed = JSON.parse(item?.output || '{}');
|
|
114
|
-
if (parsed.results) {
|
|
115
|
-
output = parsed.results
|
|
116
|
-
.map((r) => `[${r.command}] (exit: ${r.exitCode})\n${r.output}`)
|
|
117
|
-
.join('\n\n');
|
|
118
|
-
}
|
|
119
|
-
else if (parsed.error) {
|
|
120
|
-
output = `Error: ${parsed.error}`;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
output = item?.output || 'No results';
|
|
125
|
-
}
|
|
126
|
-
return [
|
|
127
|
-
{
|
|
128
|
-
id: `terminal-history-${index}-${randomUUID().slice(0, 8)}`,
|
|
129
|
-
sender: 'command',
|
|
130
|
-
status: 'completed',
|
|
131
|
-
command: `terminal_history(${args?.detail || 'query'})`,
|
|
132
|
-
output,
|
|
133
|
-
success: true,
|
|
134
|
-
toolName: 'terminal_history',
|
|
135
|
-
toolArgs: args,
|
|
136
|
-
callId,
|
|
137
|
-
},
|
|
138
|
-
];
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=terminal-history.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-history.js","sourceRoot":"","sources":["../../../source/modes/companion/terminal-history.ts"],"names":[],"mappings":"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"}
|