@qduc/term2 0.1.6 → 0.1.7
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/agent.lite-mode.test.d.ts +2 -0
- package/dist/agent.lite-mode.test.d.ts.map +1 -0
- package/dist/agent.lite-mode.test.js +39 -0
- package/dist/agent.lite-mode.test.js.map +1 -0
- package/dist/components/TextInput.d.ts.map +1 -1
- package/dist/components/TextInput.js +2 -1
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/debug_ask_mentor.d.ts +2 -0
- package/dist/debug_ask_mentor.d.ts.map +1 -0
- package/dist/debug_ask_mentor.js +73 -0
- package/dist/debug_ask_mentor.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +2 -1
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
- package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.js +39 -0
- package/dist/lib/openai-strict-tool-schema.js.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.js +26 -0
- package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
- package/dist/modes/companion/command-index.d.ts +26 -0
- package/dist/modes/companion/command-index.d.ts.map +1 -0
- package/dist/modes/companion/command-index.js +50 -0
- package/dist/modes/companion/command-index.js.map +1 -0
- package/dist/modes/companion/command-index.test.d.ts +2 -0
- package/dist/modes/companion/command-index.test.d.ts.map +1 -0
- package/dist/modes/companion/command-index.test.js +86 -0
- package/dist/modes/companion/command-index.test.js.map +1 -0
- package/dist/modes/companion/companion-app.d.ts +12 -0
- package/dist/modes/companion/companion-app.d.ts.map +1 -0
- package/dist/modes/companion/companion-app.js +297 -0
- package/dist/modes/companion/companion-app.js.map +1 -0
- package/dist/modes/companion/companion-session.d.ts +63 -0
- package/dist/modes/companion/companion-session.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.js +146 -0
- package/dist/modes/companion/companion-session.js.map +1 -0
- package/dist/modes/companion/companion-session.test.d.ts +2 -0
- package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.test.js +28 -0
- package/dist/modes/companion/companion-session.test.js.map +1 -0
- package/dist/modes/companion/components/status-bar.d.ts +13 -0
- package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
- package/dist/modes/companion/components/status-bar.js +26 -0
- package/dist/modes/companion/components/status-bar.js.map +1 -0
- package/dist/modes/companion/context-buffer.d.ts +65 -0
- package/dist/modes/companion/context-buffer.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.js +156 -0
- package/dist/modes/companion/context-buffer.js.map +1 -0
- package/dist/modes/companion/context-buffer.test.d.ts +2 -0
- package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.test.js +154 -0
- package/dist/modes/companion/context-buffer.test.js.map +1 -0
- package/dist/modes/companion/event-detector.d.ts +46 -0
- package/dist/modes/companion/event-detector.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.js +169 -0
- package/dist/modes/companion/event-detector.js.map +1 -0
- package/dist/modes/companion/event-detector.test.d.ts +2 -0
- package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.test.js +121 -0
- package/dist/modes/companion/event-detector.test.js.map +1 -0
- package/dist/modes/companion/index.d.ts +33 -0
- package/dist/modes/companion/index.d.ts.map +1 -0
- package/dist/modes/companion/index.js +21 -0
- package/dist/modes/companion/index.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.d.ts +3 -0
- package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.js +31 -0
- package/dist/modes/companion/input-key-mapper.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.js +26 -0
- package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
- package/dist/modes/companion/input-parser.d.ts +53 -0
- package/dist/modes/companion/input-parser.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.js +114 -0
- package/dist/modes/companion/input-parser.js.map +1 -0
- package/dist/modes/companion/input-parser.test.d.ts +2 -0
- package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.test.js +123 -0
- package/dist/modes/companion/input-parser.test.js.map +1 -0
- package/dist/modes/companion/mode-manager.d.ts +41 -0
- package/dist/modes/companion/mode-manager.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.js +56 -0
- package/dist/modes/companion/mode-manager.js.map +1 -0
- package/dist/modes/companion/mode-manager.test.d.ts +2 -0
- package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.test.js +65 -0
- package/dist/modes/companion/mode-manager.test.js.map +1 -0
- package/dist/modes/companion/output-classifier.d.ts +15 -0
- package/dist/modes/companion/output-classifier.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.js +77 -0
- package/dist/modes/companion/output-classifier.js.map +1 -0
- package/dist/modes/companion/output-classifier.test.d.ts +2 -0
- package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.test.js +133 -0
- package/dist/modes/companion/output-classifier.test.js.map +1 -0
- package/dist/modes/companion/pty-wrapper.d.ts +46 -0
- package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
- package/dist/modes/companion/pty-wrapper.js +143 -0
- package/dist/modes/companion/pty-wrapper.js.map +1 -0
- package/dist/modes/companion/safety-classifier.d.ts +31 -0
- package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.js +140 -0
- package/dist/modes/companion/safety-classifier.js.map +1 -0
- package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
- package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.test.js +151 -0
- package/dist/modes/companion/safety-classifier.test.js.map +1 -0
- package/dist/modes/companion/summarizer.d.ts +24 -0
- package/dist/modes/companion/summarizer.d.ts.map +1 -0
- package/dist/modes/companion/summarizer.js +132 -0
- package/dist/modes/companion/summarizer.js.map +1 -0
- package/dist/modes/companion/terminal-history.d.ts +27 -0
- package/dist/modes/companion/terminal-history.d.ts.map +1 -0
- package/dist/modes/companion/terminal-history.js +142 -0
- package/dist/modes/companion/terminal-history.js.map +1 -0
- package/dist/prompts/simple-mentor.md +8 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -1
- package/dist/providers/github-copilot/model.js +25 -108
- package/dist/providers/github-copilot/model.js.map +1 -1
- package/dist/providers/github-copilot/model.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.test.js +63 -0
- package/dist/providers/github-copilot/model.test.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +0 -5
- package/dist/providers/github-copilot/provider.d.ts.map +1 -1
- package/dist/providers/github-copilot/provider.js +2 -7
- package/dist/providers/github-copilot/provider.js.map +1 -1
- package/dist/providers/openai-compatible/model.js +3 -3
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +70 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/model.js +3 -3
- package/dist/providers/openrouter/model.js.map +1 -1
- package/dist/providers/openrouter/utils.d.ts +1 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -1
- package/dist/providers/openrouter/utils.js +3 -0
- package/dist/providers/openrouter/utils.js.map +1 -1
- package/dist/providers/openrouter.test.js +64 -0
- package/dist/providers/openrouter.test.js.map +1 -1
- package/dist/services/check_mock.d.ts +2 -0
- package/dist/services/check_mock.d.ts.map +1 -0
- package/dist/services/check_mock.js +22 -0
- package/dist/services/check_mock.js.map +1 -0
- package/dist/services/conversation-service.test.d.ts +2 -0
- package/dist/services/conversation-service.test.d.ts.map +1 -0
- package/dist/services/conversation-service.test.js +149 -183
- package/dist/services/conversation-service.test.js.map +1 -0
- package/dist/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.js +1 -1
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/ask-mentor.test.js +9 -3
- package/dist/tools/ask-mentor.test.js.map +1 -1
- package/dist/tools/find-files.d.ts +2 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +2 -4
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +7 -19
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +1 -5
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +2 -4
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +7 -13
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +1 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +1 -0
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search.d.ts +4 -4
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +5 -14
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +2 -2
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +2 -4
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
- package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
- package/dist/tools/tool-parameter-schema.test.js +88 -0
- package/dist/tools/tool-parameter-schema.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +3 -3
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +3 -2
- package/dist/tools/web-fetch.js.map +1 -1
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.devnull.test.d.ts +2 -0
- package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.js +13 -0
- package/dist/utils/command-safety.devnull.test.js.map +1 -0
- package/dist/utils/command-safety.js +10 -364
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/extract-command-messages.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.test.js +58 -51
- package/dist/utils/extract-command-messages.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/app.model-command-feedback.test.d.ts +0 -2
- package/dist/app.model-command-feedback.test.d.ts.map +0 -1
- package/dist/app.model-command-feedback.test.js +0 -19
- package/dist/app.model-command-feedback.test.js.map +0 -1
- package/dist/components/MentorMode.test.d.ts +0 -2
- package/dist/components/MentorMode.test.d.ts.map +0 -1
- package/dist/components/MentorMode.test.js.map +0 -1
- package/dist/components/StatusBar.test.d.ts +0 -2
- package/dist/components/StatusBar.test.d.ts.map +0 -1
- package/dist/components/StatusBar.test.js +0 -19
- package/dist/components/StatusBar.test.js.map +0 -1
- package/dist/debug-schema.d.ts +0 -2
- package/dist/debug-schema.d.ts.map +0 -1
- package/dist/debug-schema.js +0 -22
- package/dist/debug-schema.js.map +0 -1
- package/dist/hooks/use-model-selection.test.d.ts +0 -2
- package/dist/hooks/use-model-selection.test.d.ts.map +0 -1
- package/dist/hooks/use-model-selection.test.js +0 -28
- package/dist/hooks/use-model-selection.test.js.map +0 -1
- package/dist/hooks/use-path-completion.test.d.ts +0 -2
- package/dist/hooks/use-path-completion.test.d.ts.map +0 -1
- package/dist/hooks/use-path-completion.test.js +0 -29
- package/dist/hooks/use-path-completion.test.js.map +0 -1
- package/dist/lib/mentor-client.d.ts +0 -41
- package/dist/lib/mentor-client.d.ts.map +0 -1
- package/dist/lib/mentor-client.js +0 -146
- package/dist/lib/mentor-client.js.map +0 -1
- package/dist/lib/mentor-client.test.d.ts +0 -2
- package/dist/lib/mentor-client.test.d.ts.map +0 -1
- package/dist/lib/mentor-client.test.js +0 -440
- package/dist/lib/mentor-client.test.js.map +0 -1
- package/dist/lib/retry-strategy.d.ts +0 -43
- package/dist/lib/retry-strategy.d.ts.map +0 -1
- package/dist/lib/retry-strategy.js +0 -93
- package/dist/lib/retry-strategy.js.map +0 -1
- package/dist/lib/retry-strategy.test.d.ts +0 -2
- package/dist/lib/retry-strategy.test.d.ts.map +0 -1
- package/dist/lib/retry-strategy.test.js +0 -200
- package/dist/lib/retry-strategy.test.js.map +0 -1
- package/dist/prompts/default.md.bak +0 -77
- package/dist/providers/github-copilot/model-direct.d.ts +0 -34
- package/dist/providers/github-copilot/model-direct.d.ts.map +0 -1
- package/dist/providers/github-copilot/model-direct.js +0 -443
- package/dist/providers/github-copilot/model-direct.js.map +0 -1
- package/dist/providers/openrouter/merge-messages.test.d.ts +0 -2
- package/dist/providers/openrouter/merge-messages.test.d.ts.map +0 -1
- package/dist/providers/openrouter/merge-messages.test.js +0 -83
- package/dist/providers/openrouter/merge-messages.test.js.map +0 -1
- package/dist/providers/openrouter.history.test.d.ts +0 -2
- package/dist/providers/openrouter.history.test.d.ts.map +0 -1
- package/dist/providers/openrouter.history.test.js +0 -533
- package/dist/providers/openrouter.history.test.js.map +0 -1
- package/dist/reproduce_issue.test.d.ts +0 -2
- package/dist/reproduce_issue.test.d.ts.map +0 -1
- package/dist/reproduce_issue.test.js +0 -31
- package/dist/reproduce_issue.test.js.map +0 -1
- package/dist/services/conversation-result-builder.d.ts +0 -41
- package/dist/services/conversation-result-builder.d.ts.map +0 -1
- package/dist/services/conversation-result-builder.js +0 -110
- package/dist/services/conversation-result-builder.js.map +0 -1
- package/dist/services/conversation-result-builder.test.d.ts +0 -2
- package/dist/services/conversation-result-builder.test.d.ts.map +0 -1
- package/dist/services/conversation-result-builder.test.js +0 -76
- package/dist/services/conversation-result-builder.test.js.map +0 -1
- package/dist/services/conversation-session.usage.test.d.ts +0 -2
- package/dist/services/conversation-session.usage.test.d.ts.map +0 -1
- package/dist/services/conversation-session.usage.test.js +0 -59
- package/dist/services/conversation-session.usage.test.js.map +0 -1
- package/dist/services/stream-event-processor.d.ts +0 -32
- package/dist/services/stream-event-processor.d.ts.map +0 -1
- package/dist/services/stream-event-processor.js +0 -344
- package/dist/services/stream-event-processor.js.map +0 -1
- package/dist/services/stream-event-processor.test.d.ts +0 -2
- package/dist/services/stream-event-processor.test.d.ts.map +0 -1
- package/dist/services/stream-event-processor.test.js +0 -117
- package/dist/services/stream-event-processor.test.js.map +0 -1
- package/dist/test-search-tool.d.ts +0 -2
- package/dist/test-search-tool.d.ts.map +0 -1
- package/dist/test-search-tool.js +0 -36
- package/dist/test-search-tool.js.map +0 -1
- package/dist/types/messages.d.ts +0 -29
- package/dist/types/messages.d.ts.map +0 -1
- package/dist/types/messages.js +0 -2
- package/dist/types/messages.js.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.repro.test.js +0 -31
- package/dist/utils/extract-command-messages.repro.test.js.map +0 -1
- package/dist/utils/message-utils.d.ts +0 -17
- package/dist/utils/message-utils.d.ts.map +0 -1
- package/dist/utils/message-utils.js +0 -52
- package/dist/utils/message-utils.js.map +0 -1
- package/dist/utils/message-utils.test.d.ts +0 -2
- package/dist/utils/message-utils.test.d.ts.map +0 -1
- package/dist/utils/message-utils.test.js +0 -48
- package/dist/utils/message-utils.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parser.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { parseCompanionInput, isShellPrompt, extractCommandFromPromptLine, CommandOutputBuffer, } from './input-parser.js';
|
|
3
|
+
// parseCompanionInput tests
|
|
4
|
+
test('parseCompanionInput detects ?? query with content', t => {
|
|
5
|
+
const result = parseCompanionInput('?? why did this fail');
|
|
6
|
+
t.is(result.type, 'query');
|
|
7
|
+
t.is(result.content, 'why did this fail');
|
|
8
|
+
});
|
|
9
|
+
test('parseCompanionInput detects bare ?? query', t => {
|
|
10
|
+
const result = parseCompanionInput('??');
|
|
11
|
+
t.is(result.type, 'query');
|
|
12
|
+
t.is(result.content, '');
|
|
13
|
+
});
|
|
14
|
+
test('parseCompanionInput detects ?? with extra spaces', t => {
|
|
15
|
+
const result = parseCompanionInput('?? how do I fix this ');
|
|
16
|
+
t.is(result.type, 'query');
|
|
17
|
+
t.is(result.content, 'how do I fix this');
|
|
18
|
+
});
|
|
19
|
+
test('parseCompanionInput detects !auto command', t => {
|
|
20
|
+
const result = parseCompanionInput('!auto fix the tests');
|
|
21
|
+
t.is(result.type, 'auto');
|
|
22
|
+
t.is(result.content, 'fix the tests');
|
|
23
|
+
});
|
|
24
|
+
test('parseCompanionInput detects bare !auto', t => {
|
|
25
|
+
const result = parseCompanionInput('!auto');
|
|
26
|
+
t.is(result.type, 'auto');
|
|
27
|
+
t.is(result.content, '');
|
|
28
|
+
});
|
|
29
|
+
test('parseCompanionInput returns normal for regular input', t => {
|
|
30
|
+
const result = parseCompanionInput('npm test');
|
|
31
|
+
t.is(result.type, 'normal');
|
|
32
|
+
t.is(result.content, 'npm test');
|
|
33
|
+
});
|
|
34
|
+
test('parseCompanionInput handles whitespace-only input', t => {
|
|
35
|
+
const result = parseCompanionInput(' ');
|
|
36
|
+
t.is(result.type, 'normal');
|
|
37
|
+
t.is(result.content, '');
|
|
38
|
+
});
|
|
39
|
+
test('parseCompanionInput does not detect ?? in middle of string', t => {
|
|
40
|
+
const result = parseCompanionInput('echo "?? test"');
|
|
41
|
+
t.is(result.type, 'normal');
|
|
42
|
+
t.is(result.content, 'echo "?? test"');
|
|
43
|
+
});
|
|
44
|
+
// isShellPrompt tests
|
|
45
|
+
test('isShellPrompt detects bash prompt ending with $', t => {
|
|
46
|
+
t.true(isShellPrompt('user@host:~/project$ '));
|
|
47
|
+
t.true(isShellPrompt('$ '));
|
|
48
|
+
t.true(isShellPrompt('[~/project]$ '));
|
|
49
|
+
});
|
|
50
|
+
test('isShellPrompt detects zsh prompt ending with %', t => {
|
|
51
|
+
t.true(isShellPrompt('% '));
|
|
52
|
+
t.true(isShellPrompt('user@host % '));
|
|
53
|
+
});
|
|
54
|
+
test('isShellPrompt detects prompt ending with >', t => {
|
|
55
|
+
t.true(isShellPrompt('> '));
|
|
56
|
+
t.true(isShellPrompt('PS1> '));
|
|
57
|
+
});
|
|
58
|
+
test('isShellPrompt detects oh-my-zsh prompt', t => {
|
|
59
|
+
t.true(isShellPrompt('❯ '));
|
|
60
|
+
t.true(isShellPrompt('~/project ❯ '));
|
|
61
|
+
});
|
|
62
|
+
test('isShellPrompt returns false for regular output', t => {
|
|
63
|
+
t.false(isShellPrompt('npm test'));
|
|
64
|
+
t.false(isShellPrompt('error: file not found'));
|
|
65
|
+
t.false(isShellPrompt(''));
|
|
66
|
+
});
|
|
67
|
+
// extractCommandFromPromptLine tests
|
|
68
|
+
test('extractCommandFromPromptLine extracts command after $', t => {
|
|
69
|
+
const result = extractCommandFromPromptLine('user@host:~$ npm test');
|
|
70
|
+
t.is(result, 'npm test');
|
|
71
|
+
});
|
|
72
|
+
test('extractCommandFromPromptLine extracts command after %', t => {
|
|
73
|
+
const result = extractCommandFromPromptLine('% git status');
|
|
74
|
+
t.is(result, 'git status');
|
|
75
|
+
});
|
|
76
|
+
test('extractCommandFromPromptLine returns null for prompt only', t => {
|
|
77
|
+
const result = extractCommandFromPromptLine('user@host:~$ ');
|
|
78
|
+
t.is(result, null);
|
|
79
|
+
});
|
|
80
|
+
test('extractCommandFromPromptLine returns null for non-prompt line', t => {
|
|
81
|
+
const result = extractCommandFromPromptLine('npm test output');
|
|
82
|
+
t.is(result, null);
|
|
83
|
+
});
|
|
84
|
+
// CommandOutputBuffer tests
|
|
85
|
+
test('CommandOutputBuffer starts not waiting for output', t => {
|
|
86
|
+
const buffer = new CommandOutputBuffer();
|
|
87
|
+
t.false(buffer.isWaitingForOutput);
|
|
88
|
+
});
|
|
89
|
+
test('CommandOutputBuffer tracks current command', t => {
|
|
90
|
+
const buffer = new CommandOutputBuffer();
|
|
91
|
+
buffer.startCommand('npm test');
|
|
92
|
+
t.true(buffer.isWaitingForOutput);
|
|
93
|
+
});
|
|
94
|
+
test('CommandOutputBuffer returns null when no command boundary', t => {
|
|
95
|
+
const buffer = new CommandOutputBuffer();
|
|
96
|
+
buffer.startCommand('npm test');
|
|
97
|
+
const result = buffer.processData('test output\nmore output');
|
|
98
|
+
t.is(result, null);
|
|
99
|
+
});
|
|
100
|
+
test('CommandOutputBuffer detects command completion', t => {
|
|
101
|
+
const buffer = new CommandOutputBuffer();
|
|
102
|
+
buffer.startCommand('npm test');
|
|
103
|
+
buffer.processData('PASS test.js\n');
|
|
104
|
+
const result = buffer.processData('user@host:~$ ');
|
|
105
|
+
t.not(result, null);
|
|
106
|
+
t.is(result?.command, 'npm test');
|
|
107
|
+
t.true(result?.output.includes('PASS test.js'));
|
|
108
|
+
});
|
|
109
|
+
test('CommandOutputBuffer resets after command completion', t => {
|
|
110
|
+
const buffer = new CommandOutputBuffer();
|
|
111
|
+
buffer.startCommand('npm test');
|
|
112
|
+
buffer.processData('output\nuser@host:~$ ');
|
|
113
|
+
t.false(buffer.isWaitingForOutput);
|
|
114
|
+
});
|
|
115
|
+
test('CommandOutputBuffer.clear resets state', t => {
|
|
116
|
+
const buffer = new CommandOutputBuffer();
|
|
117
|
+
buffer.startCommand('npm test');
|
|
118
|
+
buffer.processData('output');
|
|
119
|
+
buffer.clear();
|
|
120
|
+
t.false(buffer.isWaitingForOutput);
|
|
121
|
+
t.is(buffer.promptLine, '');
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=input-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parser.test.js","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export type CompanionMode = 'watch' | 'auto';
|
|
3
|
+
export interface ModeManagerEvents {
|
|
4
|
+
modeChange: (mode: CompanionMode, previousMode: CompanionMode) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Mode manager for companion mode.
|
|
8
|
+
* Handles transitions between Watch and Auto modes.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ModeManager extends EventEmitter {
|
|
11
|
+
#private;
|
|
12
|
+
/**
|
|
13
|
+
* Get the current mode.
|
|
14
|
+
*/
|
|
15
|
+
get mode(): CompanionMode;
|
|
16
|
+
/**
|
|
17
|
+
* Check if in watch mode.
|
|
18
|
+
*/
|
|
19
|
+
get isWatchMode(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if in auto mode.
|
|
22
|
+
*/
|
|
23
|
+
get isAutoMode(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Set the mode.
|
|
26
|
+
*/
|
|
27
|
+
setMode(mode: CompanionMode): void;
|
|
28
|
+
/**
|
|
29
|
+
* Enter watch mode.
|
|
30
|
+
*/
|
|
31
|
+
enterWatchMode(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Enter auto mode.
|
|
34
|
+
*/
|
|
35
|
+
enterAutoMode(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Reset to default mode (watch).
|
|
38
|
+
*/
|
|
39
|
+
reset(): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=mode-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-manager.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1E;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;;IAGzC;;OAEG;IACH,IAAI,IAAI,IAAI,aAAa,CAExB;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAUlC;;OAEG;IACH,cAAc,IAAI,IAAI;IAItB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* Mode manager for companion mode.
|
|
4
|
+
* Handles transitions between Watch and Auto modes.
|
|
5
|
+
*/
|
|
6
|
+
export class ModeManager extends EventEmitter {
|
|
7
|
+
#currentMode = 'watch';
|
|
8
|
+
/**
|
|
9
|
+
* Get the current mode.
|
|
10
|
+
*/
|
|
11
|
+
get mode() {
|
|
12
|
+
return this.#currentMode;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if in watch mode.
|
|
16
|
+
*/
|
|
17
|
+
get isWatchMode() {
|
|
18
|
+
return this.#currentMode === 'watch';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if in auto mode.
|
|
22
|
+
*/
|
|
23
|
+
get isAutoMode() {
|
|
24
|
+
return this.#currentMode === 'auto';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set the mode.
|
|
28
|
+
*/
|
|
29
|
+
setMode(mode) {
|
|
30
|
+
if (mode === this.#currentMode) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const previousMode = this.#currentMode;
|
|
34
|
+
this.#currentMode = mode;
|
|
35
|
+
this.emit('modeChange', mode, previousMode);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Enter watch mode.
|
|
39
|
+
*/
|
|
40
|
+
enterWatchMode() {
|
|
41
|
+
this.setMode('watch');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Enter auto mode.
|
|
45
|
+
*/
|
|
46
|
+
enterAutoMode() {
|
|
47
|
+
this.setMode('auto');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reset to default mode (watch).
|
|
51
|
+
*/
|
|
52
|
+
reset() {
|
|
53
|
+
this.#currentMode = 'watch';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=mode-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-manager.js","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AAQpC;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACzC,YAAY,GAAkB,OAAO,CAAC;IAEtC;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,YAAY,KAAK,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAmB;QACvB,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAChC,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-manager.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { ModeManager } from './mode-manager.js';
|
|
3
|
+
test('starts in watch mode by default', t => {
|
|
4
|
+
const manager = new ModeManager();
|
|
5
|
+
t.is(manager.mode, 'watch');
|
|
6
|
+
t.true(manager.isWatchMode);
|
|
7
|
+
t.false(manager.isAutoMode);
|
|
8
|
+
});
|
|
9
|
+
test('setMode changes the current mode', t => {
|
|
10
|
+
const manager = new ModeManager();
|
|
11
|
+
manager.setMode('auto');
|
|
12
|
+
t.is(manager.mode, 'auto');
|
|
13
|
+
t.false(manager.isWatchMode);
|
|
14
|
+
t.true(manager.isAutoMode);
|
|
15
|
+
});
|
|
16
|
+
test('enterWatchMode sets mode to watch', t => {
|
|
17
|
+
const manager = new ModeManager();
|
|
18
|
+
manager.setMode('auto');
|
|
19
|
+
manager.enterWatchMode();
|
|
20
|
+
t.is(manager.mode, 'watch');
|
|
21
|
+
});
|
|
22
|
+
test('enterAutoMode sets mode to auto', t => {
|
|
23
|
+
const manager = new ModeManager();
|
|
24
|
+
manager.enterAutoMode();
|
|
25
|
+
t.is(manager.mode, 'auto');
|
|
26
|
+
});
|
|
27
|
+
test('emits modeChange event on mode change', t => {
|
|
28
|
+
const manager = new ModeManager();
|
|
29
|
+
const events = [];
|
|
30
|
+
manager.on('modeChange', (mode, previousMode) => {
|
|
31
|
+
events.push({ mode, previousMode });
|
|
32
|
+
});
|
|
33
|
+
manager.setMode('auto');
|
|
34
|
+
manager.setMode('watch');
|
|
35
|
+
t.is(events.length, 2);
|
|
36
|
+
t.deepEqual(events[0], { mode: 'auto', previousMode: 'watch' });
|
|
37
|
+
t.deepEqual(events[1], { mode: 'watch', previousMode: 'auto' });
|
|
38
|
+
});
|
|
39
|
+
test('does not emit modeChange when mode is the same', t => {
|
|
40
|
+
const manager = new ModeManager();
|
|
41
|
+
let eventCount = 0;
|
|
42
|
+
manager.on('modeChange', () => {
|
|
43
|
+
eventCount++;
|
|
44
|
+
});
|
|
45
|
+
manager.setMode('watch'); // Same as current
|
|
46
|
+
t.is(eventCount, 0);
|
|
47
|
+
});
|
|
48
|
+
test('reset returns to watch mode', t => {
|
|
49
|
+
const manager = new ModeManager();
|
|
50
|
+
manager.setMode('auto');
|
|
51
|
+
manager.reset();
|
|
52
|
+
t.is(manager.mode, 'watch');
|
|
53
|
+
});
|
|
54
|
+
test('reset does not emit event', t => {
|
|
55
|
+
const manager = new ModeManager();
|
|
56
|
+
let eventCount = 0;
|
|
57
|
+
manager.setMode('auto');
|
|
58
|
+
manager.on('modeChange', () => {
|
|
59
|
+
eventCount++;
|
|
60
|
+
});
|
|
61
|
+
manager.reset();
|
|
62
|
+
// reset() directly sets the mode without emitting
|
|
63
|
+
t.is(eventCount, 0);
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=mode-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-manager.test.js","sourceRoot":"","sources":["../../../source/modes/companion/mode-manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAElE,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE;IACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,EAAE;IAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,CAAC,cAAc,EAAE,CAAC;IAEzB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,OAAO,CAAC,aAAa,EAAE,CAAC;IAExB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE;IAC9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAyD,EAAE,CAAC;IAExE,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,CAAC,CAAC,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,UAAU,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;IAE5C,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE;IACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,UAAU,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,kDAAkD;IAClD,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { CommandEntry } from './context-buffer.js';
|
|
2
|
+
export type OutputType = 'test_results' | 'build_output' | 'git_output' | 'npm_output' | 'error_output' | 'general';
|
|
3
|
+
/**
|
|
4
|
+
* Classify the type of command output for better summarization.
|
|
5
|
+
*/
|
|
6
|
+
export declare function classifyOutputType(entry: CommandEntry): OutputType;
|
|
7
|
+
/**
|
|
8
|
+
* Check if output should be summarized (vs returned as-is).
|
|
9
|
+
*/
|
|
10
|
+
export declare function shouldSummarize(entry: CommandEntry): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Get summarization prompt for the output type.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getSummarizationPrompt(outputType: OutputType): string;
|
|
15
|
+
//# sourceMappingURL=output-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-classifier.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,UAAU,GAChB,cAAc,GACd,cAAc,GACd,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,SAAS,CAAC;AAEhB;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,CAqClE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAe5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAmCrE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify the type of command output for better summarization.
|
|
3
|
+
*/
|
|
4
|
+
export function classifyOutputType(entry) {
|
|
5
|
+
const cmd = entry.command.toLowerCase().trim();
|
|
6
|
+
// Test commands
|
|
7
|
+
if (/^(npm test|yarn test|pnpm test|jest|vitest|ava|mocha|pytest|go test|cargo test)/.test(cmd)) {
|
|
8
|
+
return 'test_results';
|
|
9
|
+
}
|
|
10
|
+
// Build commands
|
|
11
|
+
if (/^(npm run build|yarn build|pnpm build|tsc|webpack|vite build|cargo build|go build|make)/.test(cmd)) {
|
|
12
|
+
return 'build_output';
|
|
13
|
+
}
|
|
14
|
+
// Git commands
|
|
15
|
+
if (/^git\s/.test(cmd)) {
|
|
16
|
+
return 'git_output';
|
|
17
|
+
}
|
|
18
|
+
// NPM commands
|
|
19
|
+
if (/^(npm|yarn|pnpm)\s/.test(cmd)) {
|
|
20
|
+
return 'npm_output';
|
|
21
|
+
}
|
|
22
|
+
// Error indication
|
|
23
|
+
if (entry.exitCode !== 0) {
|
|
24
|
+
return 'error_output';
|
|
25
|
+
}
|
|
26
|
+
return 'general';
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if output should be summarized (vs returned as-is).
|
|
30
|
+
*/
|
|
31
|
+
export function shouldSummarize(entry) {
|
|
32
|
+
// Small output: return as-is
|
|
33
|
+
if (entry.outputLines < 50) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// Known simple commands: return as-is
|
|
37
|
+
const simpleCommands = /^(cd|pwd|echo|which|true|false|ls|cat|head|tail|wc|date|whoami|hostname)(\s|$)/;
|
|
38
|
+
if (simpleCommands.test(entry.command.toLowerCase())) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// Everything else: summarize
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get summarization prompt for the output type.
|
|
46
|
+
*/
|
|
47
|
+
export function getSummarizationPrompt(outputType) {
|
|
48
|
+
const prompts = {
|
|
49
|
+
test_results: `Summarize test results:
|
|
50
|
+
- Total passed/failed/skipped
|
|
51
|
+
- Names of failing tests
|
|
52
|
+
- First error message for each failure
|
|
53
|
+
- Key stack trace lines (file:line only)`,
|
|
54
|
+
build_output: `Summarize build output:
|
|
55
|
+
- Success or failure
|
|
56
|
+
- Error messages with file:line references
|
|
57
|
+
- Warning count (if any)`,
|
|
58
|
+
git_output: `Summarize git output:
|
|
59
|
+
- Operation performed
|
|
60
|
+
- Files affected (count or list if few)
|
|
61
|
+
- Any conflicts or errors`,
|
|
62
|
+
npm_output: `Summarize npm/package manager output:
|
|
63
|
+
- Operation (install/add/remove)
|
|
64
|
+
- Packages affected
|
|
65
|
+
- Any warnings or errors`,
|
|
66
|
+
error_output: `Extract only errors and warnings:
|
|
67
|
+
- Error messages with context
|
|
68
|
+
- File:line references
|
|
69
|
+
- Omit successful operations`,
|
|
70
|
+
general: `Summarize concisely in under 100 words:
|
|
71
|
+
- Success or failure
|
|
72
|
+
- Key results or errors
|
|
73
|
+
- Actionable next steps (if any)`,
|
|
74
|
+
};
|
|
75
|
+
return prompts[outputType];
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=output-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-classifier.js","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAE/C,gBAAgB;IAChB,IACI,iFAAiF,CAAC,IAAI,CAClF,GAAG,CACN,EACH,CAAC;QACC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IACI,yFAAyF,CAAC,IAAI,CAC1F,GAAG,CACN,EACH,CAAC;QACC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,eAAe;IACf,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,eAAe;IACf,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,mBAAmB;IACnB,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB;IAC/C,6BAA6B;IAC7B,IAAI,KAAK,CAAC,WAAW,GAAG,EAAE,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,sCAAsC;IACtC,MAAM,cAAc,GAChB,gFAAgF,CAAC;IACrF,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,6BAA6B;IAC7B,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,UAAsB;IACzD,MAAM,OAAO,GAA+B;QACxC,YAAY,EAAE;;;;yCAImB;QAEjC,YAAY,EAAE;;;yBAGG;QAEjB,UAAU,EAAE;;;0BAGM;QAElB,UAAU,EAAE;;;yBAGK;QAEjB,YAAY,EAAE;;;6BAGO;QAErB,OAAO,EAAE;;;iCAGgB;KAC5B,CAAC;IAEF,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-classifier.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { classifyOutputType, shouldSummarize, getSummarizationPrompt, } from './output-classifier.js';
|
|
3
|
+
// Helper to create a test entry
|
|
4
|
+
function createEntry(command, output = '', exitCode = 0) {
|
|
5
|
+
return {
|
|
6
|
+
command,
|
|
7
|
+
output,
|
|
8
|
+
exitCode,
|
|
9
|
+
timestamp: Date.now(),
|
|
10
|
+
outputLines: output.split('\n').length,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// classifyOutputType tests
|
|
14
|
+
test('classifies npm test as test_results', t => {
|
|
15
|
+
const entry = createEntry('npm test', 'PASS');
|
|
16
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
17
|
+
});
|
|
18
|
+
test('classifies yarn test as test_results', t => {
|
|
19
|
+
const entry = createEntry('yarn test', 'PASS');
|
|
20
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
21
|
+
});
|
|
22
|
+
test('classifies jest as test_results', t => {
|
|
23
|
+
const entry = createEntry('jest --coverage', 'PASS');
|
|
24
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
25
|
+
});
|
|
26
|
+
test('classifies vitest as test_results', t => {
|
|
27
|
+
const entry = createEntry('vitest run', 'PASS');
|
|
28
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
29
|
+
});
|
|
30
|
+
test('classifies ava as test_results', t => {
|
|
31
|
+
const entry = createEntry('ava', 'PASS');
|
|
32
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
33
|
+
});
|
|
34
|
+
test('classifies npm run build as build_output', t => {
|
|
35
|
+
const entry = createEntry('npm run build', 'Building...');
|
|
36
|
+
t.is(classifyOutputType(entry), 'build_output');
|
|
37
|
+
});
|
|
38
|
+
test('classifies tsc as build_output', t => {
|
|
39
|
+
const entry = createEntry('tsc', 'Compiling...');
|
|
40
|
+
t.is(classifyOutputType(entry), 'build_output');
|
|
41
|
+
});
|
|
42
|
+
test('classifies webpack as build_output', t => {
|
|
43
|
+
const entry = createEntry('webpack --mode production', 'Building...');
|
|
44
|
+
t.is(classifyOutputType(entry), 'build_output');
|
|
45
|
+
});
|
|
46
|
+
test('classifies git commands as git_output', t => {
|
|
47
|
+
const entry = createEntry('git status', 'On branch main');
|
|
48
|
+
t.is(classifyOutputType(entry), 'git_output');
|
|
49
|
+
});
|
|
50
|
+
test('classifies git diff as git_output', t => {
|
|
51
|
+
const entry = createEntry('git diff HEAD~1', '+new line');
|
|
52
|
+
t.is(classifyOutputType(entry), 'git_output');
|
|
53
|
+
});
|
|
54
|
+
test('classifies npm install as npm_output', t => {
|
|
55
|
+
const entry = createEntry('npm install lodash', 'installed');
|
|
56
|
+
t.is(classifyOutputType(entry), 'npm_output');
|
|
57
|
+
});
|
|
58
|
+
test('classifies yarn add as npm_output', t => {
|
|
59
|
+
const entry = createEntry('yarn add lodash', 'installed');
|
|
60
|
+
t.is(classifyOutputType(entry), 'npm_output');
|
|
61
|
+
});
|
|
62
|
+
test('classifies pnpm as npm_output', t => {
|
|
63
|
+
const entry = createEntry('pnpm install', 'installed');
|
|
64
|
+
t.is(classifyOutputType(entry), 'npm_output');
|
|
65
|
+
});
|
|
66
|
+
test('classifies failed command as error_output', t => {
|
|
67
|
+
const entry = createEntry('unknown', 'error', 1);
|
|
68
|
+
t.is(classifyOutputType(entry), 'error_output');
|
|
69
|
+
});
|
|
70
|
+
test('classifies unknown success as general', t => {
|
|
71
|
+
const entry = createEntry('echo hello', 'hello', 0);
|
|
72
|
+
t.is(classifyOutputType(entry), 'general');
|
|
73
|
+
});
|
|
74
|
+
test('classification is case insensitive', t => {
|
|
75
|
+
const entry = createEntry('NPM TEST', 'PASS');
|
|
76
|
+
t.is(classifyOutputType(entry), 'test_results');
|
|
77
|
+
});
|
|
78
|
+
// shouldSummarize tests
|
|
79
|
+
test('shouldSummarize returns false for small output', t => {
|
|
80
|
+
const entry = createEntry('cmd', 'small output', 0);
|
|
81
|
+
t.false(shouldSummarize(entry));
|
|
82
|
+
});
|
|
83
|
+
test('shouldSummarize returns false for simple commands', t => {
|
|
84
|
+
const entry = createEntry('cd /path', '\n'.repeat(100), 0);
|
|
85
|
+
entry.outputLines = 100;
|
|
86
|
+
t.false(shouldSummarize(entry));
|
|
87
|
+
});
|
|
88
|
+
test('shouldSummarize returns false for pwd', t => {
|
|
89
|
+
const entry = createEntry('pwd', '\n'.repeat(100), 0);
|
|
90
|
+
entry.outputLines = 100;
|
|
91
|
+
t.false(shouldSummarize(entry));
|
|
92
|
+
});
|
|
93
|
+
test('shouldSummarize returns false for echo', t => {
|
|
94
|
+
const entry = createEntry('echo hello', '\n'.repeat(100), 0);
|
|
95
|
+
entry.outputLines = 100;
|
|
96
|
+
t.false(shouldSummarize(entry));
|
|
97
|
+
});
|
|
98
|
+
test('shouldSummarize returns true for large output', t => {
|
|
99
|
+
const entry = createEntry('npm test', '\n'.repeat(100), 0);
|
|
100
|
+
entry.outputLines = 100;
|
|
101
|
+
t.true(shouldSummarize(entry));
|
|
102
|
+
});
|
|
103
|
+
test('shouldSummarize threshold is 50 lines', t => {
|
|
104
|
+
const entry49 = createEntry('npm test', '\n'.repeat(49), 0);
|
|
105
|
+
entry49.outputLines = 49;
|
|
106
|
+
const entry50 = createEntry('npm test', '\n'.repeat(50), 0);
|
|
107
|
+
entry50.outputLines = 50;
|
|
108
|
+
t.false(shouldSummarize(entry49));
|
|
109
|
+
t.true(shouldSummarize(entry50));
|
|
110
|
+
});
|
|
111
|
+
// getSummarizationPrompt tests
|
|
112
|
+
test('getSummarizationPrompt returns prompt for test_results', t => {
|
|
113
|
+
const prompt = getSummarizationPrompt('test_results');
|
|
114
|
+
t.true(prompt.includes('test results'));
|
|
115
|
+
});
|
|
116
|
+
test('getSummarizationPrompt returns prompt for build_output', t => {
|
|
117
|
+
const prompt = getSummarizationPrompt('build_output');
|
|
118
|
+
t.true(prompt.includes('build'));
|
|
119
|
+
});
|
|
120
|
+
test('getSummarizationPrompt returns prompt for git_output', t => {
|
|
121
|
+
const prompt = getSummarizationPrompt('git_output');
|
|
122
|
+
t.true(prompt.includes('git'));
|
|
123
|
+
});
|
|
124
|
+
test('getSummarizationPrompt returns prompt for error_output', t => {
|
|
125
|
+
const prompt = getSummarizationPrompt('error_output');
|
|
126
|
+
t.true(prompt.includes('error'));
|
|
127
|
+
});
|
|
128
|
+
test('getSummarizationPrompt returns prompt for general', t => {
|
|
129
|
+
const prompt = getSummarizationPrompt('general');
|
|
130
|
+
t.truthy(prompt);
|
|
131
|
+
t.true(prompt.includes('Summarize'));
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=output-classifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-classifier.test.js","sourceRoot":"","sources":["../../../source/modes/companion/output-classifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import type { ILoggingService } from '../../services/service-interfaces.js';
|
|
3
|
+
export interface PTYWrapperOptions {
|
|
4
|
+
logger: ILoggingService;
|
|
5
|
+
shell?: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
}
|
|
9
|
+
export interface PTYWrapperEvents {
|
|
10
|
+
output: (data: string) => void;
|
|
11
|
+
exit: (exitCode: number, signal?: number) => void;
|
|
12
|
+
error: (error: Error) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* PTY Wrapper for companion mode.
|
|
16
|
+
* Spawns user's shell in a PTY, intercepting I/O for context building.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PTYWrapper extends EventEmitter {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(options: PTYWrapperOptions);
|
|
21
|
+
/**
|
|
22
|
+
* Start the PTY with the user's shell.
|
|
23
|
+
*/
|
|
24
|
+
start(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Write data to the PTY.
|
|
27
|
+
*/
|
|
28
|
+
write(data: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Resize the PTY.
|
|
31
|
+
*/
|
|
32
|
+
resize(cols: number, rows: number): void;
|
|
33
|
+
/**
|
|
34
|
+
* Stop the PTY.
|
|
35
|
+
*/
|
|
36
|
+
stop(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Check if PTY is running.
|
|
39
|
+
*/
|
|
40
|
+
get isRunning(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get the PTY process ID.
|
|
43
|
+
*/
|
|
44
|
+
get pid(): number | undefined;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=pty-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-wrapper.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/pty-wrapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAID;;;GAGG;AACH,qBAAa,UAAW,SAAQ,YAAY;;gBAS5B,OAAO,EAAE,iBAAiB;IAQtC;;OAEG;IACH,KAAK,IAAI,IAAI;IA4Db;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQzB;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQxC;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,MAAM,GAAG,SAAS,CAE5B;CA0BJ"}
|