@qduc/term2 0.1.2 → 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.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 +20 -0
- package/dist/components/ApprovalPrompt.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +2 -7
- package/dist/components/InputBox.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/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.map +1 -1
- package/dist/hooks/use-settings-completion.js +3 -0
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-completion.test.js +6 -0
- package/dist/hooks/use-settings-completion.test.js.map +1 -1
- package/dist/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +35 -15
- 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 +5 -2
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +12 -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.d.ts.map +1 -1
- package/dist/tools/find-files.js +2 -0
- package/dist/tools/find-files.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 -0
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +10 -9
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +24 -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.d.ts.map +1 -1
- package/dist/tools/shell.js +2 -0
- 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 +13 -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,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
|
|
@@ -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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as pty from 'node-pty';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
const MAX_RESTART_ATTEMPTS = 3;
|
|
4
|
+
/**
|
|
5
|
+
* PTY Wrapper for companion mode.
|
|
6
|
+
* Spawns user's shell in a PTY, intercepting I/O for context building.
|
|
7
|
+
*/
|
|
8
|
+
export class PTYWrapper extends EventEmitter {
|
|
9
|
+
#pty = null;
|
|
10
|
+
#logger;
|
|
11
|
+
#shell;
|
|
12
|
+
#cwd;
|
|
13
|
+
#env;
|
|
14
|
+
#restartAttempts = 0;
|
|
15
|
+
#isStarted = false;
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super();
|
|
18
|
+
this.#logger = options.logger;
|
|
19
|
+
this.#shell = options.shell || process.env.SHELL || '/bin/bash';
|
|
20
|
+
this.#cwd = options.cwd || process.cwd();
|
|
21
|
+
this.#env = options.env || process.env;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Start the PTY with the user's shell.
|
|
25
|
+
*/
|
|
26
|
+
start() {
|
|
27
|
+
if (this.#isStarted) {
|
|
28
|
+
this.#logger.warn('PTY already started');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const cols = process.stdout.columns || 80;
|
|
33
|
+
const rows = process.stdout.rows || 24;
|
|
34
|
+
this.#pty = pty.spawn(this.#shell, [], {
|
|
35
|
+
name: 'xterm-256color',
|
|
36
|
+
cols,
|
|
37
|
+
rows,
|
|
38
|
+
cwd: this.#cwd,
|
|
39
|
+
// Filter out undefined env values for type safety
|
|
40
|
+
env: Object.fromEntries(Object.entries(this.#env)
|
|
41
|
+
.filter((entry) => entry[1] !== undefined)),
|
|
42
|
+
});
|
|
43
|
+
this.#isStarted = true;
|
|
44
|
+
this.#restartAttempts = 0;
|
|
45
|
+
this.#logger.info('PTY started', {
|
|
46
|
+
shell: this.#shell,
|
|
47
|
+
cwd: this.#cwd,
|
|
48
|
+
cols,
|
|
49
|
+
rows,
|
|
50
|
+
pid: this.#pty.pid,
|
|
51
|
+
});
|
|
52
|
+
// Handle output from PTY
|
|
53
|
+
this.#pty.onData((data) => {
|
|
54
|
+
this.emit('output', data);
|
|
55
|
+
});
|
|
56
|
+
// Handle PTY exit
|
|
57
|
+
this.#pty.onExit(({ exitCode, signal }) => {
|
|
58
|
+
this.#isStarted = false;
|
|
59
|
+
this.#logger.info('PTY exited', { exitCode, signal });
|
|
60
|
+
this.emit('exit', exitCode, signal);
|
|
61
|
+
// Attempt restart if unexpected exit
|
|
62
|
+
if (exitCode !== 0) {
|
|
63
|
+
this.#handleUnexpectedExit(exitCode, signal);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
69
|
+
this.#logger.error('Failed to spawn PTY', {
|
|
70
|
+
error: errorMessage,
|
|
71
|
+
shell: this.#shell,
|
|
72
|
+
});
|
|
73
|
+
this.emit('error', new Error(`Could not start shell: ${this.#shell}`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Write data to the PTY.
|
|
78
|
+
*/
|
|
79
|
+
write(data) {
|
|
80
|
+
if (!this.#pty) {
|
|
81
|
+
this.#logger.warn('Cannot write to PTY: not started');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this.#pty.write(data);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resize the PTY.
|
|
88
|
+
*/
|
|
89
|
+
resize(cols, rows) {
|
|
90
|
+
if (!this.#pty) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.#pty.resize(cols, rows);
|
|
94
|
+
this.#logger.debug('PTY resized', { cols, rows });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Stop the PTY.
|
|
98
|
+
*/
|
|
99
|
+
stop() {
|
|
100
|
+
if (!this.#pty) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.#pty.kill();
|
|
104
|
+
this.#pty = null;
|
|
105
|
+
this.#isStarted = false;
|
|
106
|
+
this.#logger.info('PTY stopped');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if PTY is running.
|
|
110
|
+
*/
|
|
111
|
+
get isRunning() {
|
|
112
|
+
return this.#isStarted && this.#pty !== null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get the PTY process ID.
|
|
116
|
+
*/
|
|
117
|
+
get pid() {
|
|
118
|
+
return this.#pty?.pid;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle unexpected PTY exit with restart logic.
|
|
122
|
+
*/
|
|
123
|
+
#handleUnexpectedExit(exitCode, signal) {
|
|
124
|
+
if (this.#restartAttempts >= MAX_RESTART_ATTEMPTS) {
|
|
125
|
+
this.#logger.error('PTY crashed repeatedly, giving up', {
|
|
126
|
+
attempts: this.#restartAttempts,
|
|
127
|
+
});
|
|
128
|
+
this.emit('error', new Error('Shell crashed repeatedly'));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.#restartAttempts++;
|
|
132
|
+
this.#logger.warn('PTY exited unexpectedly, attempting restart', {
|
|
133
|
+
exitCode,
|
|
134
|
+
signal,
|
|
135
|
+
attempt: this.#restartAttempts,
|
|
136
|
+
});
|
|
137
|
+
// Wait a bit before restarting
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
this.start();
|
|
140
|
+
}, 500);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=pty-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-wrapper.js","sourceRoot":"","sources":["../../../source/modes/companion/pty-wrapper.ts"],"names":[],"mappings":"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"}
|