@qduc/term2 0.1.1 → 0.1.3
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.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +9 -5
- package/dist/agent.js.map +1 -1
- 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/app.d.ts.map +1 -1
- package/dist/app.js +3 -1
- package/dist/app.js.map +1 -1
- package/dist/components/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/ApprovalPrompt.js +26 -6
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/BottomArea.js +1 -1
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/ChatMessage.js +1 -1
- package/dist/components/ChatMessage.js.map +1 -1
- package/dist/components/CommandMessage.js +7 -7
- package/dist/components/CommandMessage.js.map +1 -1
- package/dist/components/ErrorBoundary.js +2 -2
- package/dist/components/ErrorBoundary.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +10 -0
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +4 -2
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +102 -18
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/LiveResponse.d.ts +1 -1
- package/dist/components/LiveResponse.js +1 -1
- package/dist/components/MarkdownRenderer.js +13 -14
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/ModelSelectionMenu.js +11 -11
- package/dist/components/ModelSelectionMenu.js.map +1 -1
- package/dist/components/PathSelectionMenu.js +3 -3
- package/dist/components/PathSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.d.ts +1 -0
- package/dist/components/SettingsSelectionMenu.d.ts.map +1 -1
- package/dist/components/SettingsSelectionMenu.js +127 -14
- package/dist/components/SettingsSelectionMenu.js.map +1 -1
- package/dist/components/SettingsSelectionMenu.test.d.ts +2 -0
- package/dist/components/SettingsSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/SettingsSelectionMenu.test.js +40 -0
- package/dist/components/SettingsSelectionMenu.test.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts +12 -0
- package/dist/components/SettingsValueSelectionMenu.d.ts.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.js +63 -0
- package/dist/components/SettingsValueSelectionMenu.js.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.test.d.ts +2 -0
- package/dist/components/SettingsValueSelectionMenu.test.d.ts.map +1 -0
- package/dist/components/SettingsValueSelectionMenu.test.js +38 -0
- package/dist/components/SettingsValueSelectionMenu.test.js.map +1 -0
- package/dist/components/SlashCommandMenu.js +2 -2
- package/dist/components/SlashCommandMenu.js.map +1 -1
- 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/context/InputContext.d.ts +1 -1
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.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/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +7 -3
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +70 -10
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +17 -10
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts +23 -0
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -0
- package/dist/hooks/use-settings-value-completion.js +214 -0
- package/dist/hooks/use-settings-value-completion.js.map +1 -0
- package/dist/hooks/use-settings-value-completion.test.d.ts +2 -0
- package/dist/hooks/use-settings-value-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-settings-value-completion.test.js +65 -0
- package/dist/hooks/use-settings-value-completion.test.js.map +1 -0
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.flex-tier.test.d.ts +2 -0
- package/dist/lib/openai-agent-client.flex-tier.test.d.ts.map +1 -0
- package/dist/lib/openai-agent-client.flex-tier.test.js +70 -0
- package/dist/lib/openai-agent-client.flex-tier.test.js.map +1 -0
- package/dist/lib/openai-agent-client.js +71 -36
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +1 -1
- package/dist/lib/tool-invoke.test.js.map +1 -1
- 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/openai-compatible/model.d.ts.map +1 -1
- package/dist/providers/openai-compatible/model.js +13 -2
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +2 -2
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/reasoning-content.test.js +2 -2
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter.test.js +30 -21
- 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/services/conversation-store.test.js +12 -11
- package/dist/services/conversation-store.test.js.map +1 -1
- package/dist/services/settings-service.d.ts +8 -2
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +24 -0
- package/dist/services/settings-service.js.map +1 -1
- package/dist/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.d.ts.map +1 -1
- package/dist/tools/ask-mentor.js +1 -0
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/find-files.d.ts +2 -2
- package/dist/tools/find-files.js +2 -2
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +15 -0
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.js +1 -1
- 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 +14 -11
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +37 -19
- 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 +129 -1
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +18 -0
- package/dist/tools/search-replace.test.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 +4 -0
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +2 -2
- package/dist/tools/shell.js +2 -2
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/types.d.ts +2 -2
- package/dist/tools/types.d.ts.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/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +18 -4
- package/dist/utils/settings-command.js.map +1 -1
- package/package.json +2 -2
- 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/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/prompts/default.md.bak +0 -77
- 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/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/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/{README.md → readme.md} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-key-mapper.js","sourceRoot":"","sources":["../../../source/modes/companion/input-key-mapper.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AACnC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AACrC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AACtC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAErC,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,GAAQ;IACvD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACjB,OAAO,oBAAoB,CAAC;IAChC,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,eAAe,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-key-mapper.test.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/input-key-mapper.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { getPtyInputSequence } from './input-key-mapper.js';
|
|
3
|
+
function makeKey(overrides = {}) {
|
|
4
|
+
return overrides;
|
|
5
|
+
}
|
|
6
|
+
test('getPtyInputSequence returns input when provided', t => {
|
|
7
|
+
const key = makeKey({ upArrow: true });
|
|
8
|
+
t.is(getPtyInputSequence('a', key), 'a');
|
|
9
|
+
});
|
|
10
|
+
test('getPtyInputSequence prefers special key mappings over input', t => {
|
|
11
|
+
t.is(getPtyInputSequence('\b', makeKey({ backspace: true })), '\x08');
|
|
12
|
+
});
|
|
13
|
+
test('getPtyInputSequence maps arrow keys when input is empty', t => {
|
|
14
|
+
t.is(getPtyInputSequence('', makeKey({ upArrow: true })), '\x1b[A');
|
|
15
|
+
t.is(getPtyInputSequence('', makeKey({ downArrow: true })), '\x1b[B');
|
|
16
|
+
t.is(getPtyInputSequence('', makeKey({ rightArrow: true })), '\x1b[C');
|
|
17
|
+
t.is(getPtyInputSequence('', makeKey({ leftArrow: true })), '\x1b[D');
|
|
18
|
+
});
|
|
19
|
+
test('getPtyInputSequence maps delete and backspace when input is empty', t => {
|
|
20
|
+
t.is(getPtyInputSequence('', makeKey({ delete: true })), '\x1b[3~');
|
|
21
|
+
t.is(getPtyInputSequence('', makeKey({ backspace: true })), '\x08');
|
|
22
|
+
});
|
|
23
|
+
test('getPtyInputSequence returns null when no input or mapping', t => {
|
|
24
|
+
t.is(getPtyInputSequence('', makeKey()), null);
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=input-key-mapper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-key-mapper.test.js","sourceRoot":"","sources":["../../../source/modes/companion/input-key-mapper.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AAEvB,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAE1D,SAAS,OAAO,CAAC,YAA0B,EAAE;IACzC,OAAO,SAAgB,CAAC;AAC5B,CAAC;AAED,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;IACrC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACpE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,CAAC,CAAC,EAAE;IAChE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,UAAU,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,CAAC,CAAC,EAAE;IAC1E,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,CAAC,CAAC,EAAE;IAClE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input parser for companion mode.
|
|
3
|
+
* Detects special commands like ?? and !auto in user input.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParsedInput {
|
|
6
|
+
type: 'query' | 'auto' | 'normal';
|
|
7
|
+
content: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse input line to detect ?? queries and !auto commands.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseCompanionInput(input: string): ParsedInput;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a line looks like a shell prompt.
|
|
15
|
+
* Used to detect when a command has completed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isShellPrompt(line: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Extract command from prompt line.
|
|
20
|
+
* Tries to separate the prompt from the actual command.
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractCommandFromPromptLine(line: string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Buffer for accumulating PTY output and detecting command boundaries.
|
|
25
|
+
*/
|
|
26
|
+
export declare class CommandOutputBuffer {
|
|
27
|
+
#private;
|
|
28
|
+
/**
|
|
29
|
+
* Process incoming PTY data.
|
|
30
|
+
* Returns completed command+output when a command boundary is detected.
|
|
31
|
+
*/
|
|
32
|
+
processData(data: string): {
|
|
33
|
+
command: string;
|
|
34
|
+
output: string;
|
|
35
|
+
} | null;
|
|
36
|
+
/**
|
|
37
|
+
* Mark start of a new command.
|
|
38
|
+
*/
|
|
39
|
+
startCommand(command: string): void;
|
|
40
|
+
/**
|
|
41
|
+
* Get the current prompt line.
|
|
42
|
+
*/
|
|
43
|
+
get promptLine(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Check if currently waiting for command output.
|
|
46
|
+
*/
|
|
47
|
+
get isWaitingForOutput(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Clear the buffer.
|
|
50
|
+
*/
|
|
51
|
+
clear(): void;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=input-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parser.d.ts","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAiB9D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAanD;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYxE;AAED;;GAEG;AACH,qBAAa,mBAAmB;;IAK5B;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI;IA0BR;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;CAKhB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input parser for companion mode.
|
|
3
|
+
* Detects special commands like ?? and !auto in user input.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Parse input line to detect ?? queries and !auto commands.
|
|
7
|
+
*/
|
|
8
|
+
export function parseCompanionInput(input) {
|
|
9
|
+
const trimmed = input.trim();
|
|
10
|
+
// Detect ?? query
|
|
11
|
+
if (trimmed.startsWith('??')) {
|
|
12
|
+
const query = trimmed.slice(2).trim();
|
|
13
|
+
return { type: 'query', content: query };
|
|
14
|
+
}
|
|
15
|
+
// Detect !auto command
|
|
16
|
+
if (trimmed.startsWith('!auto')) {
|
|
17
|
+
const task = trimmed.slice(5).trim();
|
|
18
|
+
return { type: 'auto', content: task };
|
|
19
|
+
}
|
|
20
|
+
// Normal input
|
|
21
|
+
return { type: 'normal', content: trimmed };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check if a line looks like a shell prompt.
|
|
25
|
+
* Used to detect when a command has completed.
|
|
26
|
+
*/
|
|
27
|
+
export function isShellPrompt(line) {
|
|
28
|
+
// Common shell prompt patterns
|
|
29
|
+
const promptPatterns = [
|
|
30
|
+
/\$\s*$/, // bash/sh: ends with $
|
|
31
|
+
/%\s*$/, // zsh: ends with %
|
|
32
|
+
/>\s*$/, // some shells: ends with >
|
|
33
|
+
/❯\s*$/, // oh-my-zsh/powerlevel: ends with ❯
|
|
34
|
+
/→\s*$/, // some prompts: ends with →
|
|
35
|
+
/^\[.+\]\s*[$%>❯→]\s*$/, // bracketed: [path]$
|
|
36
|
+
/^.+@.+:.+[$%>❯→]\s*$/, // user@host:path$
|
|
37
|
+
];
|
|
38
|
+
return promptPatterns.some(pattern => pattern.test(line));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Extract command from prompt line.
|
|
42
|
+
* Tries to separate the prompt from the actual command.
|
|
43
|
+
*/
|
|
44
|
+
export function extractCommandFromPromptLine(line) {
|
|
45
|
+
// Look for common prompt endings followed by command
|
|
46
|
+
const promptEndings = ['$ ', '% ', '> ', '❯ ', '→ '];
|
|
47
|
+
for (const ending of promptEndings) {
|
|
48
|
+
const idx = line.lastIndexOf(ending);
|
|
49
|
+
if (idx !== -1 && idx < line.length - 2) {
|
|
50
|
+
return line.slice(idx + ending.length).trim();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Buffer for accumulating PTY output and detecting command boundaries.
|
|
57
|
+
*/
|
|
58
|
+
export class CommandOutputBuffer {
|
|
59
|
+
#currentCommand = null;
|
|
60
|
+
#outputBuffer = '';
|
|
61
|
+
#promptLine = '';
|
|
62
|
+
/**
|
|
63
|
+
* Process incoming PTY data.
|
|
64
|
+
* Returns completed command+output when a command boundary is detected.
|
|
65
|
+
*/
|
|
66
|
+
processData(data) {
|
|
67
|
+
// Accumulate output
|
|
68
|
+
this.#outputBuffer += data;
|
|
69
|
+
// Check for command boundary (new prompt)
|
|
70
|
+
const lines = this.#outputBuffer.split('\n');
|
|
71
|
+
const lastLine = lines[lines.length - 1] ?? '';
|
|
72
|
+
if (isShellPrompt(lastLine) && this.#currentCommand) {
|
|
73
|
+
// Command completed
|
|
74
|
+
const result = {
|
|
75
|
+
command: this.#currentCommand,
|
|
76
|
+
output: this.#outputBuffer.slice(0, -lastLine.length).trim(),
|
|
77
|
+
};
|
|
78
|
+
// Reset for next command
|
|
79
|
+
this.#currentCommand = null;
|
|
80
|
+
this.#outputBuffer = lastLine;
|
|
81
|
+
this.#promptLine = lastLine;
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Mark start of a new command.
|
|
88
|
+
*/
|
|
89
|
+
startCommand(command) {
|
|
90
|
+
this.#currentCommand = command;
|
|
91
|
+
this.#outputBuffer = '';
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get the current prompt line.
|
|
95
|
+
*/
|
|
96
|
+
get promptLine() {
|
|
97
|
+
return this.#promptLine;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if currently waiting for command output.
|
|
101
|
+
*/
|
|
102
|
+
get isWaitingForOutput() {
|
|
103
|
+
return this.#currentCommand !== null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Clear the buffer.
|
|
107
|
+
*/
|
|
108
|
+
clear() {
|
|
109
|
+
this.#currentCommand = null;
|
|
110
|
+
this.#outputBuffer = '';
|
|
111
|
+
this.#promptLine = '';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=input-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-parser.js","sourceRoot":"","sources":["../../../source/modes/companion/input-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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
|