@kolisachint/hoocode-agent 0.4.106 → 0.4.108
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/CHANGELOG.md +4 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -4
- package/dist/cli/args.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -3
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/extension-mcp-servers.d.ts +1 -1
- package/dist/core/extension-mcp-servers.d.ts.map +1 -1
- package/dist/core/extension-mcp-servers.js +1 -1
- package/dist/core/extension-mcp-servers.js.map +1 -1
- package/dist/core/extensions/plugins/index.d.ts.map +1 -1
- package/dist/core/extensions/plugins/index.js +1 -1
- package/dist/core/extensions/plugins/index.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -3
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mode-prompts.d.ts +1 -1
- package/dist/core/mode-prompts.d.ts.map +1 -1
- package/dist/core/mode-prompts.js +1 -1
- package/dist/core/mode-prompts.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +2 -97
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +4 -65
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +2 -3
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +2 -2
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/{browser-continue.d.ts → browser/browser-continue.d.ts} +1 -1
- package/dist/core/tools/browser/browser-continue.d.ts.map +1 -0
- package/dist/core/tools/{browser-continue.js → browser/browser-continue.js} +2 -2
- package/dist/core/tools/browser/browser-continue.js.map +1 -0
- package/dist/core/tools/{browser-run.d.ts → browser/browser-run.d.ts} +2 -2
- package/dist/core/tools/browser/browser-run.d.ts.map +1 -0
- package/dist/core/tools/{browser-run.js → browser/browser-run.js} +2 -2
- package/dist/core/tools/browser/browser-run.js.map +1 -0
- package/dist/core/tools/browser/browsertools-shared.d.ts.map +1 -0
- package/dist/core/tools/{browsertools-shared.js → browser/browsertools-shared.js} +1 -1
- package/dist/core/tools/browser/browsertools-shared.js.map +1 -0
- package/dist/core/tools/browser/index.d.ts +8 -0
- package/dist/core/tools/browser/index.d.ts.map +1 -0
- package/dist/core/tools/browser/index.js +8 -0
- package/dist/core/tools/browser/index.js.map +1 -0
- package/dist/core/tools/{docedit.d.ts → doc/docedit.d.ts} +2 -2
- package/dist/core/tools/doc/docedit.d.ts.map +1 -0
- package/dist/core/tools/{docedit.js → doc/docedit.js} +7 -7
- package/dist/core/tools/doc/docedit.js.map +1 -0
- package/dist/core/tools/{docgrep.d.ts → doc/docgrep.d.ts} +2 -2
- package/dist/core/tools/doc/docgrep.d.ts.map +1 -0
- package/dist/core/tools/{docgrep.js → doc/docgrep.js} +6 -6
- package/dist/core/tools/doc/docgrep.js.map +1 -0
- package/dist/core/tools/{docpeek.d.ts → doc/docpeek.d.ts} +2 -2
- package/dist/core/tools/{docpeek.js.map → doc/docpeek.d.ts.map} +1 -1
- package/dist/core/tools/{docpeek.js → doc/docpeek.js} +6 -6
- package/dist/core/tools/doc/docpeek.js.map +1 -0
- package/dist/core/tools/{docread.d.ts → doc/docread.d.ts} +2 -2
- package/dist/core/tools/doc/docread.d.ts.map +1 -0
- package/dist/core/tools/{docread.js → doc/docread.js} +6 -6
- package/dist/core/tools/doc/docread.js.map +1 -0
- package/dist/core/tools/{docscan.d.ts → doc/docscan.d.ts} +2 -2
- package/dist/core/tools/doc/docscan.d.ts.map +1 -0
- package/dist/core/tools/{docscan.js → doc/docscan.js} +6 -6
- package/dist/core/tools/doc/docscan.js.map +1 -0
- package/dist/core/tools/{docwrite.d.ts → doc/docwrite.d.ts} +1 -1
- package/dist/core/tools/doc/docwrite.d.ts.map +1 -0
- package/dist/core/tools/{docwrite.js → doc/docwrite.js} +6 -6
- package/dist/core/tools/doc/docwrite.js.map +1 -0
- package/dist/core/tools/doc/index.d.ts +11 -0
- package/dist/core/tools/doc/index.d.ts.map +1 -0
- package/dist/core/tools/doc/index.js +11 -0
- package/dist/core/tools/doc/index.js.map +1 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +42 -28
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +61 -199
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +1 -1
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/extensions/core/ask-options.d.ts +10 -0
- package/dist/extensions/core/ask-options.d.ts.map +1 -0
- package/dist/extensions/core/ask-options.js +83 -0
- package/dist/extensions/core/ask-options.js.map +1 -0
- package/dist/extensions/core/config.d.ts +80 -0
- package/dist/extensions/core/config.d.ts.map +1 -0
- package/dist/extensions/core/config.js +110 -0
- package/dist/extensions/core/config.js.map +1 -0
- package/dist/extensions/core/cost.d.ts +11 -0
- package/dist/extensions/core/cost.d.ts.map +1 -0
- package/dist/extensions/core/cost.js +64 -0
- package/dist/extensions/core/cost.js.map +1 -0
- package/dist/extensions/core/hoo-core.d.ts +16 -179
- package/dist/extensions/core/hoo-core.d.ts.map +1 -1
- package/dist/extensions/core/hoo-core.js +27 -1663
- package/dist/extensions/core/hoo-core.js.map +1 -1
- package/dist/extensions/core/loop.d.ts +15 -0
- package/dist/extensions/core/loop.d.ts.map +1 -0
- package/dist/extensions/core/loop.js +235 -0
- package/dist/extensions/core/loop.js.map +1 -0
- package/dist/extensions/core/marketplace.d.ts +17 -0
- package/dist/extensions/core/marketplace.d.ts.map +1 -0
- package/dist/extensions/core/marketplace.js +167 -0
- package/dist/extensions/core/marketplace.js.map +1 -0
- package/dist/extensions/core/mcp-loader.d.ts +26 -0
- package/dist/extensions/core/mcp-loader.d.ts.map +1 -0
- package/dist/extensions/core/mcp-loader.js +391 -0
- package/dist/extensions/core/mcp-loader.js.map +1 -0
- package/dist/extensions/core/modes.d.ts +56 -0
- package/dist/extensions/core/modes.d.ts.map +1 -0
- package/dist/extensions/core/modes.js +268 -0
- package/dist/extensions/core/modes.js.map +1 -0
- package/dist/extensions/core/permission-gate.d.ts +10 -0
- package/dist/extensions/core/permission-gate.d.ts.map +1 -0
- package/dist/extensions/core/permission-gate.js +167 -0
- package/dist/extensions/core/permission-gate.js.map +1 -0
- package/dist/extensions/core/scaffold.d.ts +9 -0
- package/dist/extensions/core/scaffold.d.ts.map +1 -0
- package/dist/extensions/core/scaffold.js +146 -0
- package/dist/extensions/core/scaffold.js.map +1 -0
- package/dist/extensions/core/thinking-escalation.d.ts +18 -0
- package/dist/extensions/core/thinking-escalation.d.ts.map +1 -0
- package/dist/extensions/core/thinking-escalation.js +70 -0
- package/dist/extensions/core/thinking-escalation.js.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/bash-execution-controller.d.ts +34 -0
- package/dist/modes/interactive/bash-execution-controller.d.ts.map +1 -0
- package/dist/modes/interactive/bash-execution-controller.js +98 -0
- package/dist/modes/interactive/bash-execution-controller.js.map +1 -0
- package/dist/modes/interactive/command-executor.d.ts +0 -5
- package/dist/modes/interactive/command-executor.d.ts.map +1 -1
- package/dist/modes/interactive/command-executor.js +0 -7
- package/dist/modes/interactive/command-executor.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +0 -2
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -2
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/extension-chrome.d.ts +56 -0
- package/dist/modes/interactive/extension-chrome.d.ts.map +1 -0
- package/dist/modes/interactive/extension-chrome.js +172 -0
- package/dist/modes/interactive/extension-chrome.js.map +1 -0
- package/dist/modes/interactive/extension-dialogs.d.ts +82 -0
- package/dist/modes/interactive/extension-dialogs.d.ts.map +1 -0
- package/dist/modes/interactive/extension-dialogs.js +259 -0
- package/dist/modes/interactive/extension-dialogs.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +16 -206
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +359 -2370
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/login-controller.d.ts +50 -0
- package/dist/modes/interactive/login-controller.d.ts.map +1 -0
- package/dist/modes/interactive/login-controller.js +352 -0
- package/dist/modes/interactive/login-controller.js.map +1 -0
- package/dist/modes/interactive/message-queue-controller.d.ts +49 -0
- package/dist/modes/interactive/message-queue-controller.d.ts.map +1 -0
- package/dist/modes/interactive/message-queue-controller.js +184 -0
- package/dist/modes/interactive/message-queue-controller.js.map +1 -0
- package/dist/modes/interactive/model-controller.d.ts +43 -0
- package/dist/modes/interactive/model-controller.d.ts.map +1 -0
- package/dist/modes/interactive/model-controller.js +184 -0
- package/dist/modes/interactive/model-controller.js.map +1 -0
- package/dist/modes/interactive/resource-display.d.ts +59 -0
- package/dist/modes/interactive/resource-display.d.ts.map +1 -0
- package/dist/modes/interactive/resource-display.js +499 -0
- package/dist/modes/interactive/resource-display.js.map +1 -0
- package/dist/modes/interactive/startup-checks.d.ts +17 -0
- package/dist/modes/interactive/startup-checks.d.ts.map +1 -0
- package/dist/modes/interactive/startup-checks.js +102 -0
- package/dist/modes/interactive/startup-checks.js.map +1 -0
- package/dist/modes/interactive/team-focus.d.ts +56 -0
- package/dist/modes/interactive/team-focus.d.ts.map +1 -0
- package/dist/modes/interactive/team-focus.js +167 -0
- package/dist/modes/interactive/team-focus.js.map +1 -0
- package/dist/modes/interactive/voice/voice-controller.d.ts +66 -0
- package/dist/modes/interactive/voice/voice-controller.d.ts.map +1 -0
- package/dist/modes/interactive/voice/voice-controller.js +312 -0
- package/dist/modes/interactive/voice/voice-controller.js.map +1 -0
- package/dist/modes/interactive/voice/voice-panel.d.ts.map +1 -0
- package/dist/modes/interactive/voice/voice-panel.js.map +1 -0
- package/dist/modes/interactive/voice/voice-transcribe.d.ts.map +1 -0
- package/dist/modes/interactive/voice/voice-transcribe.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +1 -2
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +1 -2
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/resources-cli.d.ts.map +1 -1
- package/dist/resources-cli.js +1 -1
- package/dist/resources-cli.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +2 -2
- package/dist/utils/version-check.js.map +1 -1
- package/docs/project-local-resources.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +4 -4
- package/dist/core/compaction/branch-summarization.d.ts +0 -88
- package/dist/core/compaction/branch-summarization.d.ts.map +0 -1
- package/dist/core/compaction/branch-summarization.js +0 -243
- package/dist/core/compaction/branch-summarization.js.map +0 -1
- package/dist/core/compaction/compaction.d.ts +0 -123
- package/dist/core/compaction/compaction.d.ts.map +0 -1
- package/dist/core/compaction/compaction.js +0 -635
- package/dist/core/compaction/compaction.js.map +0 -1
- package/dist/core/compaction/index.d.ts +0 -7
- package/dist/core/compaction/index.d.ts.map +0 -1
- package/dist/core/compaction/index.js +0 -7
- package/dist/core/compaction/index.js.map +0 -1
- package/dist/core/compaction/utils.d.ts +0 -38
- package/dist/core/compaction/utils.d.ts.map +0 -1
- package/dist/core/compaction/utils.js +0 -156
- package/dist/core/compaction/utils.js.map +0 -1
- package/dist/core/messages.d.ts +0 -124
- package/dist/core/messages.d.ts.map +0 -1
- package/dist/core/messages.js +0 -221
- package/dist/core/messages.js.map +0 -1
- package/dist/core/tools/browser-continue.d.ts.map +0 -1
- package/dist/core/tools/browser-continue.js.map +0 -1
- package/dist/core/tools/browser-run.d.ts.map +0 -1
- package/dist/core/tools/browser-run.js.map +0 -1
- package/dist/core/tools/browsertools-shared.d.ts.map +0 -1
- package/dist/core/tools/browsertools-shared.js.map +0 -1
- package/dist/core/tools/docedit.d.ts.map +0 -1
- package/dist/core/tools/docedit.js.map +0 -1
- package/dist/core/tools/docgrep.d.ts.map +0 -1
- package/dist/core/tools/docgrep.js.map +0 -1
- package/dist/core/tools/docpeek.d.ts.map +0 -1
- package/dist/core/tools/docread.d.ts.map +0 -1
- package/dist/core/tools/docread.js.map +0 -1
- package/dist/core/tools/docscan.d.ts.map +0 -1
- package/dist/core/tools/docscan.js.map +0 -1
- package/dist/core/tools/docwrite.d.ts.map +0 -1
- package/dist/core/tools/docwrite.js.map +0 -1
- package/dist/core/tools/output-compression.d.ts +0 -53
- package/dist/core/tools/output-compression.d.ts.map +0 -1
- package/dist/core/tools/output-compression.js +0 -392
- package/dist/core/tools/output-compression.js.map +0 -1
- package/dist/modes/interactive/components/armin.d.ts +0 -34
- package/dist/modes/interactive/components/armin.d.ts.map +0 -1
- package/dist/modes/interactive/components/armin.js +0 -333
- package/dist/modes/interactive/components/armin.js.map +0 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +0 -23
- package/dist/modes/interactive/components/daxnuts.d.ts.map +0 -1
- package/dist/modes/interactive/components/daxnuts.js +0 -140
- package/dist/modes/interactive/components/daxnuts.js.map +0 -1
- package/dist/modes/interactive/components/voice-panel.d.ts.map +0 -1
- package/dist/modes/interactive/components/voice-panel.js.map +0 -1
- package/dist/modes/interactive/voice-transcribe.d.ts.map +0 -1
- package/dist/modes/interactive/voice-transcribe.js.map +0 -1
- /package/dist/core/tools/{browsertools-shared.d.ts → browser/browsertools-shared.d.ts} +0 -0
- /package/dist/modes/interactive/{components → voice}/voice-panel.d.ts +0 -0
- /package/dist/modes/interactive/{components → voice}/voice-panel.js +0 -0
- /package/dist/modes/interactive/{voice-transcribe.d.ts → voice/voice-transcribe.d.ts} +0 -0
- /package/dist/modes/interactive/{voice-transcribe.js → voice/voice-transcribe.js} +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension dialog primitives: the selector, options pane, confirm, text
|
|
3
|
+
* input, multi-line editor, and custom-component dialogs that swap into the
|
|
4
|
+
* editor slot (or an overlay) and restore the prompt editor when done.
|
|
5
|
+
* Extracted from interactive-mode.ts; consumed by the ExtensionUIContext.
|
|
6
|
+
*/
|
|
7
|
+
import { AskOptionsComponent } from "./components/ask-options.js";
|
|
8
|
+
import { ExtensionEditorComponent } from "./components/extension-editor.js";
|
|
9
|
+
import { ExtensionInputComponent } from "./components/extension-input.js";
|
|
10
|
+
import { ExtensionSelectorComponent } from "./components/extension-selector.js";
|
|
11
|
+
import { theme } from "./theme/theme.js";
|
|
12
|
+
export class ExtensionDialogs {
|
|
13
|
+
deps;
|
|
14
|
+
selector = undefined;
|
|
15
|
+
input = undefined;
|
|
16
|
+
askOptionsPane = undefined;
|
|
17
|
+
editorDialog = undefined;
|
|
18
|
+
constructor(deps) {
|
|
19
|
+
this.deps = deps;
|
|
20
|
+
}
|
|
21
|
+
/** True while the options pane is on screen (used to queue team approvals). */
|
|
22
|
+
isAskOptionsOpen() {
|
|
23
|
+
return this.askOptionsPane !== undefined;
|
|
24
|
+
}
|
|
25
|
+
/** Hide whatever dialog is open and restore the prompt editor. */
|
|
26
|
+
reset() {
|
|
27
|
+
if (this.selector) {
|
|
28
|
+
this.hideSelector();
|
|
29
|
+
}
|
|
30
|
+
if (this.input) {
|
|
31
|
+
this.hideInput();
|
|
32
|
+
}
|
|
33
|
+
if (this.askOptionsPane) {
|
|
34
|
+
this.hideAskOptions();
|
|
35
|
+
}
|
|
36
|
+
if (this.editorDialog) {
|
|
37
|
+
this.hideEditor();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
restoreEditor() {
|
|
41
|
+
const editor = this.deps.getEditor();
|
|
42
|
+
this.deps.editorContainer.clear();
|
|
43
|
+
this.deps.editorContainer.addChild(editor);
|
|
44
|
+
this.deps.ui.setFocus(editor);
|
|
45
|
+
this.deps.ui.requestRender();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Show a selector for extensions.
|
|
49
|
+
*/
|
|
50
|
+
showSelector(title, options, opts) {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
if (opts?.signal?.aborted) {
|
|
53
|
+
resolve(undefined);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const onAbort = () => {
|
|
57
|
+
this.hideSelector();
|
|
58
|
+
resolve(undefined);
|
|
59
|
+
};
|
|
60
|
+
opts?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
61
|
+
this.selector = new ExtensionSelectorComponent(title, options, (option) => {
|
|
62
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
63
|
+
this.hideSelector();
|
|
64
|
+
resolve(option);
|
|
65
|
+
}, () => {
|
|
66
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
67
|
+
this.hideSelector();
|
|
68
|
+
resolve(undefined);
|
|
69
|
+
}, { tui: this.deps.ui, timeout: opts?.timeout });
|
|
70
|
+
this.deps.editorContainer.clear();
|
|
71
|
+
this.deps.editorContainer.addChild(this.selector);
|
|
72
|
+
this.deps.ui.setFocus(this.selector);
|
|
73
|
+
this.deps.ui.requestRender();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Hide the extension selector.
|
|
78
|
+
*/
|
|
79
|
+
hideSelector() {
|
|
80
|
+
this.selector?.dispose();
|
|
81
|
+
this.selector = undefined;
|
|
82
|
+
this.restoreEditor();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Show the options pane — the agent asking the user one or more questions.
|
|
86
|
+
* Resolves with one answer per question, or undefined if skipped/aborted.
|
|
87
|
+
*/
|
|
88
|
+
showAskOptions(questions, opts) {
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
if (!questions.length || opts?.signal?.aborted) {
|
|
91
|
+
resolve(undefined);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const onAbort = () => {
|
|
95
|
+
this.hideAskOptions();
|
|
96
|
+
resolve(undefined);
|
|
97
|
+
};
|
|
98
|
+
opts?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
99
|
+
this.askOptionsPane = new AskOptionsComponent(questions, (answers) => {
|
|
100
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
101
|
+
this.hideAskOptions();
|
|
102
|
+
resolve(answers);
|
|
103
|
+
}, () => {
|
|
104
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
105
|
+
this.hideAskOptions();
|
|
106
|
+
resolve(undefined);
|
|
107
|
+
});
|
|
108
|
+
this.deps.editorContainer.clear();
|
|
109
|
+
this.deps.editorContainer.addChild(this.askOptionsPane);
|
|
110
|
+
this.deps.ui.setFocus(this.askOptionsPane);
|
|
111
|
+
this.deps.ui.requestRender();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Hide the options pane and restore the editor.
|
|
116
|
+
*/
|
|
117
|
+
hideAskOptions() {
|
|
118
|
+
if (!this.askOptionsPane)
|
|
119
|
+
return;
|
|
120
|
+
this.askOptionsPane = undefined;
|
|
121
|
+
this.restoreEditor();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Show a confirmation dialog for extensions.
|
|
125
|
+
*/
|
|
126
|
+
async confirm(title, message, opts) {
|
|
127
|
+
const result = await this.showSelector(`${title}\n${message}`, ["Yes", "No"], opts);
|
|
128
|
+
return result === "Yes";
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Show a text input for extensions.
|
|
132
|
+
*/
|
|
133
|
+
showInput(title, placeholder, opts) {
|
|
134
|
+
return new Promise((resolve) => {
|
|
135
|
+
if (opts?.signal?.aborted) {
|
|
136
|
+
resolve(undefined);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const onAbort = () => {
|
|
140
|
+
this.hideInput();
|
|
141
|
+
resolve(undefined);
|
|
142
|
+
};
|
|
143
|
+
opts?.signal?.addEventListener("abort", onAbort, { once: true });
|
|
144
|
+
this.input = new ExtensionInputComponent(title, placeholder, (value) => {
|
|
145
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
146
|
+
this.hideInput();
|
|
147
|
+
resolve(value);
|
|
148
|
+
}, () => {
|
|
149
|
+
opts?.signal?.removeEventListener("abort", onAbort);
|
|
150
|
+
this.hideInput();
|
|
151
|
+
resolve(undefined);
|
|
152
|
+
}, { tui: this.deps.ui, timeout: opts?.timeout });
|
|
153
|
+
this.deps.editorContainer.clear();
|
|
154
|
+
this.deps.editorContainer.addChild(this.input);
|
|
155
|
+
this.deps.ui.setFocus(this.input);
|
|
156
|
+
this.deps.ui.requestRender();
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Hide the extension input.
|
|
161
|
+
*/
|
|
162
|
+
hideInput() {
|
|
163
|
+
this.input?.dispose();
|
|
164
|
+
this.input = undefined;
|
|
165
|
+
this.restoreEditor();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Show a multi-line editor for extensions (with Ctrl+G support).
|
|
169
|
+
*/
|
|
170
|
+
showEditor(title, prefill) {
|
|
171
|
+
return new Promise((resolve) => {
|
|
172
|
+
this.editorDialog = new ExtensionEditorComponent(this.deps.ui, this.deps.keybindings, title, prefill, (value) => {
|
|
173
|
+
this.hideEditor();
|
|
174
|
+
resolve(value);
|
|
175
|
+
}, () => {
|
|
176
|
+
this.hideEditor();
|
|
177
|
+
resolve(undefined);
|
|
178
|
+
});
|
|
179
|
+
this.deps.editorContainer.clear();
|
|
180
|
+
this.deps.editorContainer.addChild(this.editorDialog);
|
|
181
|
+
this.deps.ui.setFocus(this.editorDialog);
|
|
182
|
+
this.deps.ui.requestRender();
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Hide the extension editor.
|
|
187
|
+
*/
|
|
188
|
+
hideEditor() {
|
|
189
|
+
this.editorDialog = undefined;
|
|
190
|
+
this.restoreEditor();
|
|
191
|
+
}
|
|
192
|
+
/** Show a custom component with keyboard focus. Overlay mode renders on top of existing content. */
|
|
193
|
+
async showCustom(factory, options) {
|
|
194
|
+
const savedText = this.deps.getEditor().getText();
|
|
195
|
+
const isOverlay = options?.overlay ?? false;
|
|
196
|
+
const restoreEditorWithText = () => {
|
|
197
|
+
this.restoreEditor();
|
|
198
|
+
this.deps.getEditor().setText(savedText);
|
|
199
|
+
};
|
|
200
|
+
return new Promise((resolve, reject) => {
|
|
201
|
+
let component;
|
|
202
|
+
let closed = false;
|
|
203
|
+
const close = (result) => {
|
|
204
|
+
if (closed)
|
|
205
|
+
return;
|
|
206
|
+
closed = true;
|
|
207
|
+
if (isOverlay)
|
|
208
|
+
this.deps.ui.hideOverlay();
|
|
209
|
+
else
|
|
210
|
+
restoreEditorWithText();
|
|
211
|
+
// Note: both branches above already call requestRender
|
|
212
|
+
resolve(result);
|
|
213
|
+
try {
|
|
214
|
+
component?.dispose?.();
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
/* ignore dispose errors */
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
Promise.resolve(factory(this.deps.ui, theme, this.deps.keybindings, close))
|
|
221
|
+
.then((c) => {
|
|
222
|
+
if (closed)
|
|
223
|
+
return;
|
|
224
|
+
component = c;
|
|
225
|
+
if (isOverlay) {
|
|
226
|
+
// Resolve overlay options - can be static or dynamic function
|
|
227
|
+
const resolveOptions = () => {
|
|
228
|
+
if (options?.overlayOptions) {
|
|
229
|
+
const opts = typeof options.overlayOptions === "function"
|
|
230
|
+
? options.overlayOptions()
|
|
231
|
+
: options.overlayOptions;
|
|
232
|
+
return opts;
|
|
233
|
+
}
|
|
234
|
+
// Fallback: use component's width property if available
|
|
235
|
+
const w = component.width;
|
|
236
|
+
return w ? { width: w } : undefined;
|
|
237
|
+
};
|
|
238
|
+
const handle = this.deps.ui.showOverlay(component, resolveOptions());
|
|
239
|
+
// Expose handle to caller for visibility control
|
|
240
|
+
options?.onHandle?.(handle);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
this.deps.editorContainer.clear();
|
|
244
|
+
this.deps.editorContainer.addChild(component);
|
|
245
|
+
this.deps.ui.setFocus(component);
|
|
246
|
+
this.deps.ui.requestRender();
|
|
247
|
+
}
|
|
248
|
+
})
|
|
249
|
+
.catch((err) => {
|
|
250
|
+
if (closed)
|
|
251
|
+
return;
|
|
252
|
+
if (!isOverlay)
|
|
253
|
+
restoreEditorWithText();
|
|
254
|
+
reject(err);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=extension-dialogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-dialogs.js","sourceRoot":"","sources":["../../../src/modes/interactive/extension-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension dialog primitives: the selector, options pane, confirm, text\n * input, multi-line editor, and custom-component dialogs that swap into the\n * editor slot (or an overlay) and restore the prompt editor when done.\n * Extracted from interactive-mode.ts; consumed by the ExtensionUIContext.\n */\n\nimport type { Component, Container, OverlayHandle, OverlayOptions, TUI } from \"@kolisachint/hoocode-tui\";\nimport type { AskQuestion, ExtensionUIDialogOptions } from \"../../core/extensions/index.js\";\nimport type { KeybindingsManager } from \"../../core/keybindings.js\";\nimport { AskOptionsComponent } from \"./components/ask-options.js\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.js\";\nimport { ExtensionInputComponent } from \"./components/extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport { type Theme, theme } from \"./theme/theme.js\";\n\n/** The slice of the interactive mode the dialogs render into. */\nexport interface ExtensionDialogsDeps {\n\tui: TUI;\n\teditorContainer: Container;\n\tkeybindings: KeybindingsManager;\n\t/** The prompt editor (read at call time; the editor can be swapped). */\n\tgetEditor(): Component & { getText(): string; setText(text: string): void };\n}\n\nexport class ExtensionDialogs {\n\tprivate selector: ExtensionSelectorComponent | undefined = undefined;\n\tprivate input: ExtensionInputComponent | undefined = undefined;\n\tprivate askOptionsPane: AskOptionsComponent | undefined = undefined;\n\tprivate editorDialog: ExtensionEditorComponent | undefined = undefined;\n\n\tconstructor(private readonly deps: ExtensionDialogsDeps) {}\n\n\t/** True while the options pane is on screen (used to queue team approvals). */\n\tisAskOptionsOpen(): boolean {\n\t\treturn this.askOptionsPane !== undefined;\n\t}\n\n\t/** Hide whatever dialog is open and restore the prompt editor. */\n\treset(): void {\n\t\tif (this.selector) {\n\t\t\tthis.hideSelector();\n\t\t}\n\t\tif (this.input) {\n\t\t\tthis.hideInput();\n\t\t}\n\t\tif (this.askOptionsPane) {\n\t\t\tthis.hideAskOptions();\n\t\t}\n\t\tif (this.editorDialog) {\n\t\t\tthis.hideEditor();\n\t\t}\n\t}\n\n\tprivate restoreEditor(): void {\n\t\tconst editor = this.deps.getEditor();\n\t\tthis.deps.editorContainer.clear();\n\t\tthis.deps.editorContainer.addChild(editor);\n\t\tthis.deps.ui.setFocus(editor);\n\t\tthis.deps.ui.requestRender();\n\t}\n\n\t/**\n\t * Show a selector for extensions.\n\t */\n\tshowSelector(title: string, options: string[], opts?: ExtensionUIDialogOptions): Promise<string | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (opts?.signal?.aborted) {\n\t\t\t\tresolve(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tthis.hideSelector();\n\t\t\t\tresolve(undefined);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tthis.selector = new ExtensionSelectorComponent(\n\t\t\t\ttitle,\n\t\t\t\toptions,\n\t\t\t\t(option) => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideSelector();\n\t\t\t\t\tresolve(option);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideSelector();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ tui: this.deps.ui, timeout: opts?.timeout },\n\t\t\t);\n\n\t\t\tthis.deps.editorContainer.clear();\n\t\t\tthis.deps.editorContainer.addChild(this.selector);\n\t\t\tthis.deps.ui.setFocus(this.selector);\n\t\t\tthis.deps.ui.requestRender();\n\t\t});\n\t}\n\n\t/**\n\t * Hide the extension selector.\n\t */\n\thideSelector(): void {\n\t\tthis.selector?.dispose();\n\t\tthis.selector = undefined;\n\t\tthis.restoreEditor();\n\t}\n\n\t/**\n\t * Show the options pane — the agent asking the user one or more questions.\n\t * Resolves with one answer per question, or undefined if skipped/aborted.\n\t */\n\tshowAskOptions(questions: AskQuestion[], opts?: ExtensionUIDialogOptions): Promise<string[] | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (!questions.length || opts?.signal?.aborted) {\n\t\t\t\tresolve(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tthis.hideAskOptions();\n\t\t\t\tresolve(undefined);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tthis.askOptionsPane = new AskOptionsComponent(\n\t\t\t\tquestions,\n\t\t\t\t(answers) => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideAskOptions();\n\t\t\t\t\tresolve(answers);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideAskOptions();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.deps.editorContainer.clear();\n\t\t\tthis.deps.editorContainer.addChild(this.askOptionsPane);\n\t\t\tthis.deps.ui.setFocus(this.askOptionsPane);\n\t\t\tthis.deps.ui.requestRender();\n\t\t});\n\t}\n\n\t/**\n\t * Hide the options pane and restore the editor.\n\t */\n\thideAskOptions(): void {\n\t\tif (!this.askOptionsPane) return;\n\t\tthis.askOptionsPane = undefined;\n\t\tthis.restoreEditor();\n\t}\n\n\t/**\n\t * Show a confirmation dialog for extensions.\n\t */\n\tasync confirm(title: string, message: string, opts?: ExtensionUIDialogOptions): Promise<boolean> {\n\t\tconst result = await this.showSelector(`${title}\\n${message}`, [\"Yes\", \"No\"], opts);\n\t\treturn result === \"Yes\";\n\t}\n\n\t/**\n\t * Show a text input for extensions.\n\t */\n\tshowInput(title: string, placeholder?: string, opts?: ExtensionUIDialogOptions): Promise<string | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (opts?.signal?.aborted) {\n\t\t\t\tresolve(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tthis.hideInput();\n\t\t\t\tresolve(undefined);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tthis.input = new ExtensionInputComponent(\n\t\t\t\ttitle,\n\t\t\t\tplaceholder,\n\t\t\t\t(value) => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideInput();\n\t\t\t\t\tresolve(value);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.hideInput();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t\t{ tui: this.deps.ui, timeout: opts?.timeout },\n\t\t\t);\n\n\t\t\tthis.deps.editorContainer.clear();\n\t\t\tthis.deps.editorContainer.addChild(this.input);\n\t\t\tthis.deps.ui.setFocus(this.input);\n\t\t\tthis.deps.ui.requestRender();\n\t\t});\n\t}\n\n\t/**\n\t * Hide the extension input.\n\t */\n\thideInput(): void {\n\t\tthis.input?.dispose();\n\t\tthis.input = undefined;\n\t\tthis.restoreEditor();\n\t}\n\n\t/**\n\t * Show a multi-line editor for extensions (with Ctrl+G support).\n\t */\n\tshowEditor(title: string, prefill?: string): Promise<string | undefined> {\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.editorDialog = new ExtensionEditorComponent(\n\t\t\t\tthis.deps.ui,\n\t\t\t\tthis.deps.keybindings,\n\t\t\t\ttitle,\n\t\t\t\tprefill,\n\t\t\t\t(value) => {\n\t\t\t\t\tthis.hideEditor();\n\t\t\t\t\tresolve(value);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tthis.hideEditor();\n\t\t\t\t\tresolve(undefined);\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.deps.editorContainer.clear();\n\t\t\tthis.deps.editorContainer.addChild(this.editorDialog);\n\t\t\tthis.deps.ui.setFocus(this.editorDialog);\n\t\t\tthis.deps.ui.requestRender();\n\t\t});\n\t}\n\n\t/**\n\t * Hide the extension editor.\n\t */\n\thideEditor(): void {\n\t\tthis.editorDialog = undefined;\n\t\tthis.restoreEditor();\n\t}\n\n\t/** Show a custom component with keyboard focus. Overlay mode renders on top of existing content. */\n\tasync showCustom<T>(\n\t\tfactory: (\n\t\t\ttui: TUI,\n\t\t\ttheme: Theme,\n\t\t\tkeybindings: KeybindingsManager,\n\t\t\tdone: (result: T) => void,\n\t\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\t\toptions?: {\n\t\t\toverlay?: boolean;\n\t\t\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\t\t\tonHandle?: (handle: OverlayHandle) => void;\n\t\t},\n\t): Promise<T> {\n\t\tconst savedText = this.deps.getEditor().getText();\n\t\tconst isOverlay = options?.overlay ?? false;\n\n\t\tconst restoreEditorWithText = () => {\n\t\t\tthis.restoreEditor();\n\t\t\tthis.deps.getEditor().setText(savedText);\n\t\t};\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet component: Component & { dispose?(): void };\n\t\t\tlet closed = false;\n\n\t\t\tconst close = (result: T) => {\n\t\t\t\tif (closed) return;\n\t\t\t\tclosed = true;\n\t\t\t\tif (isOverlay) this.deps.ui.hideOverlay();\n\t\t\t\telse restoreEditorWithText();\n\t\t\t\t// Note: both branches above already call requestRender\n\t\t\t\tresolve(result);\n\t\t\t\ttry {\n\t\t\t\t\tcomponent?.dispose?.();\n\t\t\t\t} catch {\n\t\t\t\t\t/* ignore dispose errors */\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tPromise.resolve(factory(this.deps.ui, theme, this.deps.keybindings, close))\n\t\t\t\t.then((c) => {\n\t\t\t\t\tif (closed) return;\n\t\t\t\t\tcomponent = c;\n\t\t\t\t\tif (isOverlay) {\n\t\t\t\t\t\t// Resolve overlay options - can be static or dynamic function\n\t\t\t\t\t\tconst resolveOptions = (): OverlayOptions | undefined => {\n\t\t\t\t\t\t\tif (options?.overlayOptions) {\n\t\t\t\t\t\t\t\tconst opts =\n\t\t\t\t\t\t\t\t\ttypeof options.overlayOptions === \"function\"\n\t\t\t\t\t\t\t\t\t\t? options.overlayOptions()\n\t\t\t\t\t\t\t\t\t\t: options.overlayOptions;\n\t\t\t\t\t\t\t\treturn opts;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Fallback: use component's width property if available\n\t\t\t\t\t\t\tconst w = (component as { width?: number }).width;\n\t\t\t\t\t\t\treturn w ? { width: w } : undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst handle = this.deps.ui.showOverlay(component, resolveOptions());\n\t\t\t\t\t\t// Expose handle to caller for visibility control\n\t\t\t\t\t\toptions?.onHandle?.(handle);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.deps.editorContainer.clear();\n\t\t\t\t\t\tthis.deps.editorContainer.addChild(component);\n\t\t\t\t\t\tthis.deps.ui.setFocus(component);\n\t\t\t\t\t\tthis.deps.ui.requestRender();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tif (closed) return;\n\t\t\t\t\tif (!isOverlay) restoreEditorWithText();\n\t\t\t\t\treject(err);\n\t\t\t\t});\n\t\t});\n\t}\n}\n"]}
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
* Interactive mode for the coding agent.
|
|
3
3
|
* Handles TUI rendering and user interaction, delegating business logic to AgentSession.
|
|
4
4
|
*/
|
|
5
|
-
import {
|
|
5
|
+
import type { ImageContent } from "@kolisachint/hoocode-ai";
|
|
6
6
|
import type { AgentSessionRuntime } from "../../core/agent-session-runtime.js";
|
|
7
7
|
import type { TeamViewConnection } from "../../core/team-view.js";
|
|
8
|
-
export declare function isApiKeyLoginProvider(providerId: string, oauthProviderIds: ReadonlySet<string>, builtInProviderIds?: ReadonlySet<string>): boolean;
|
|
9
8
|
/**
|
|
10
9
|
* Options for InteractiveMode initialization.
|
|
11
10
|
*/
|
|
@@ -33,15 +32,7 @@ export declare class InteractiveMode {
|
|
|
33
32
|
private defaultEditor;
|
|
34
33
|
private editor;
|
|
35
34
|
private editorComponentFactory;
|
|
36
|
-
private
|
|
37
|
-
private voiceDaemon;
|
|
38
|
-
private voiceDaemonUnsupported;
|
|
39
|
-
/** True while the voicetools binary is being resolved/downloaded before a session starts. */
|
|
40
|
-
private voiceStarting;
|
|
41
|
-
/** True while a capture (daemon or legacy) is in flight. */
|
|
42
|
-
private voiceActive;
|
|
43
|
-
/** The live multi-line status panel for the current capture (undefined when idle). */
|
|
44
|
-
private voicePanel;
|
|
35
|
+
private voice;
|
|
45
36
|
private autocompleteProvider;
|
|
46
37
|
private autocompleteProviderWrappers;
|
|
47
38
|
private fdPath;
|
|
@@ -63,7 +54,6 @@ export declare class InteractiveMode {
|
|
|
63
54
|
private lastEscapeTime;
|
|
64
55
|
private changelogMarkdown;
|
|
65
56
|
private startupNoticesShown;
|
|
66
|
-
private anthropicSubscriptionWarningShown;
|
|
67
57
|
private lastStatusSpacer;
|
|
68
58
|
private lastStatusText;
|
|
69
59
|
private streamingComponent;
|
|
@@ -76,32 +66,25 @@ export declare class InteractiveMode {
|
|
|
76
66
|
private taskStoreUnsubscribe?;
|
|
77
67
|
private signalCleanupHandlers;
|
|
78
68
|
private isBashMode;
|
|
79
|
-
private bashComponent;
|
|
80
|
-
private pendingBashComponents;
|
|
81
69
|
private autoCompactionLoader;
|
|
82
70
|
private autoCompactionEscapeHandler?;
|
|
83
71
|
private retryLoader;
|
|
84
72
|
private retryCountdown;
|
|
85
73
|
private retryEscapeHandler?;
|
|
86
|
-
private compactionQueuedMessages;
|
|
87
74
|
private shutdownRequested;
|
|
88
|
-
private
|
|
89
|
-
private extensionInput;
|
|
90
|
-
private askOptions;
|
|
91
|
-
private extensionEditor;
|
|
75
|
+
private dialogs;
|
|
92
76
|
private extensionTerminalInputUnsubscribers;
|
|
93
|
-
private
|
|
94
|
-
private extensionWidgetsBelow;
|
|
77
|
+
private chrome;
|
|
95
78
|
private widgetContainerAbove;
|
|
96
79
|
private widgetContainerBelow;
|
|
97
80
|
private taskPanel;
|
|
98
|
-
private
|
|
99
|
-
private
|
|
100
|
-
private
|
|
101
|
-
private
|
|
81
|
+
private teamFocus;
|
|
82
|
+
private bashExecution;
|
|
83
|
+
private messageQueue;
|
|
84
|
+
private modelController;
|
|
85
|
+
private loginController;
|
|
102
86
|
private headerContainer;
|
|
103
87
|
private builtInHeader;
|
|
104
|
-
private customHeader;
|
|
105
88
|
private get session();
|
|
106
89
|
private _commandExecutor?;
|
|
107
90
|
/**
|
|
@@ -131,37 +114,9 @@ export declare class InteractiveMode {
|
|
|
131
114
|
* Initializes the UI, shows warnings, processes initial messages, and starts the interactive loop.
|
|
132
115
|
*/
|
|
133
116
|
run(): Promise<void>;
|
|
134
|
-
private checkForPackageUpdates;
|
|
135
|
-
private checkTmuxKeyboardSetup;
|
|
136
|
-
/**
|
|
137
|
-
* Get changelog entries to display on startup.
|
|
138
|
-
* Only shows new entries since last seen version, skips for resumed sessions.
|
|
139
|
-
*/
|
|
140
|
-
private getChangelogForDisplay;
|
|
141
|
-
private reportInstallTelemetry;
|
|
142
117
|
private getMarkdownThemeWithSettings;
|
|
143
|
-
private formatDisplayPath;
|
|
144
|
-
private formatExtensionDisplayPath;
|
|
145
|
-
private formatContextPath;
|
|
146
118
|
private getStartupExpansionState;
|
|
147
|
-
/**
|
|
148
|
-
* Get a short path relative to the package root for display.
|
|
149
|
-
*/
|
|
150
|
-
private getShortPath;
|
|
151
|
-
private getCompactPathLabel;
|
|
152
|
-
private getCompactPackageSourceLabel;
|
|
153
|
-
private getCompactExtensionLabel;
|
|
154
|
-
private getCompactDisplayPathSegments;
|
|
155
|
-
private getCompactNonPackageExtensionLabel;
|
|
156
|
-
private getCompactExtensionLabels;
|
|
157
|
-
private getDisplaySourceInfo;
|
|
158
|
-
private getScopeGroup;
|
|
159
|
-
private isPackageSource;
|
|
160
|
-
private buildScopeGroups;
|
|
161
|
-
private formatScopeGroups;
|
|
162
|
-
private findSourceInfoForPath;
|
|
163
|
-
private formatPathWithSource;
|
|
164
|
-
private formatDiagnostics;
|
|
119
|
+
/** Render the startup/reload resource listing (see resource-display.ts). */
|
|
165
120
|
private showLoadedResources;
|
|
166
121
|
private bindCurrentSessionExtensions;
|
|
167
122
|
private applyRuntimeSettings;
|
|
@@ -186,67 +141,14 @@ export declare class InteractiveMode {
|
|
|
186
141
|
private setWorkingVisible;
|
|
187
142
|
private setWorkingIndicator;
|
|
188
143
|
private setHiddenThinkingLabel;
|
|
189
|
-
/**
|
|
190
|
-
* Set an extension widget (string array or custom component).
|
|
191
|
-
*/
|
|
192
|
-
private setExtensionWidget;
|
|
193
|
-
private clearExtensionWidgets;
|
|
194
144
|
private resetExtensionUI;
|
|
195
|
-
private static readonly MAX_WIDGET_LINES;
|
|
196
|
-
/**
|
|
197
|
-
* Render all extension widgets to the widget container.
|
|
198
|
-
*/
|
|
199
|
-
private renderWidgets;
|
|
200
|
-
private renderWidgetContainer;
|
|
201
|
-
/**
|
|
202
|
-
* Set a custom footer component, or restore the built-in footer.
|
|
203
|
-
*/
|
|
204
|
-
private setExtensionFooter;
|
|
205
|
-
/**
|
|
206
|
-
* Set a custom header component, or restore the built-in header.
|
|
207
|
-
*/
|
|
208
|
-
private setExtensionHeader;
|
|
209
145
|
private addExtensionTerminalInputListener;
|
|
210
146
|
private clearExtensionTerminalInputListeners;
|
|
211
147
|
/**
|
|
212
148
|
* Create the ExtensionUIContext for extensions.
|
|
213
149
|
*/
|
|
214
150
|
private createExtensionUIContext;
|
|
215
|
-
/**
|
|
216
|
-
* Show a selector for extensions.
|
|
217
|
-
*/
|
|
218
|
-
private showExtensionSelector;
|
|
219
|
-
/**
|
|
220
|
-
* Hide the extension selector.
|
|
221
|
-
*/
|
|
222
|
-
private hideExtensionSelector;
|
|
223
|
-
/**
|
|
224
|
-
* Show the options pane — the agent asking the user one or more questions.
|
|
225
|
-
* Resolves with one answer per question, or undefined if skipped/aborted.
|
|
226
|
-
*/
|
|
227
|
-
private showAskOptions;
|
|
228
|
-
/**
|
|
229
|
-
* Hide the options pane and restore the editor.
|
|
230
|
-
*/
|
|
231
|
-
private hideAskOptions;
|
|
232
|
-
private showExtensionConfirm;
|
|
233
151
|
private promptForMissingSessionCwd;
|
|
234
|
-
/**
|
|
235
|
-
* Show a text input for extensions.
|
|
236
|
-
*/
|
|
237
|
-
private showExtensionInput;
|
|
238
|
-
/**
|
|
239
|
-
* Hide the extension input.
|
|
240
|
-
*/
|
|
241
|
-
private hideExtensionInput;
|
|
242
|
-
/**
|
|
243
|
-
* Show a multi-line editor for extensions (with Ctrl+G support).
|
|
244
|
-
*/
|
|
245
|
-
private showExtensionEditor;
|
|
246
|
-
/**
|
|
247
|
-
* Hide the extension editor.
|
|
248
|
-
*/
|
|
249
|
-
private hideExtensionEditor;
|
|
250
152
|
/**
|
|
251
153
|
* Set a custom editor component from an extension.
|
|
252
154
|
* Pass undefined to restore the default editor.
|
|
@@ -256,7 +158,6 @@ export declare class InteractiveMode {
|
|
|
256
158
|
* Show a notification for extensions.
|
|
257
159
|
*/
|
|
258
160
|
private showExtensionNotify;
|
|
259
|
-
private showExtensionCustom;
|
|
260
161
|
/**
|
|
261
162
|
* Show an extension error in the UI.
|
|
262
163
|
*/
|
|
@@ -265,29 +166,16 @@ export declare class InteractiveMode {
|
|
|
265
166
|
private handleClipboardImagePaste;
|
|
266
167
|
/**
|
|
267
168
|
* Wire a hooteams connection into the TUI. Called by main.ts when `--team`
|
|
268
|
-
* is set, before run().
|
|
269
|
-
* the attach side panel (a) on the task panel's teams view, and approval
|
|
270
|
-
* gates: task_paused events (and gates already pending on the server)
|
|
271
|
-
* surface inline in the attach panel when it shows the paused role,
|
|
272
|
-
* otherwise in the options pane; the answer goes back over
|
|
273
|
-
* POST /tasks/:id/resume.
|
|
169
|
+
* is set, before run(). See TeamFocusController for the feature itself.
|
|
274
170
|
*/
|
|
275
171
|
attachTeamClient(client: TeamViewConnection): void;
|
|
276
|
-
private presentTeamApproval;
|
|
277
|
-
/** Move keyboard focus to the task panel's team roster. */
|
|
278
|
-
private enterTeamFocus;
|
|
279
|
-
/** Leave team focus: detach any side panel and return focus to the editor. */
|
|
280
|
-
private exitTeamFocus;
|
|
281
172
|
/**
|
|
282
|
-
*
|
|
283
|
-
*
|
|
284
|
-
*
|
|
173
|
+
* Built-in slash commands dispatched by the editor submit handler.
|
|
174
|
+
* `withArgs` commands also match "/name <args>" and receive the full text.
|
|
175
|
+
* Each handler keeps its own editor-clearing order (before vs after the
|
|
176
|
+
* await) — some commands must show their UI before the prompt is wiped.
|
|
285
177
|
*/
|
|
286
|
-
private
|
|
287
|
-
/** Open the attach side panel for a role (a in team focus). */
|
|
288
|
-
private showTeamAttach;
|
|
289
|
-
/** Detach the side panel; the role keeps running. Safe to call when closed. */
|
|
290
|
-
private closeTeamAttach;
|
|
178
|
+
private createBuiltInSlashCommands;
|
|
291
179
|
private setupEditorSubmitHandler;
|
|
292
180
|
private subscribeToAgent;
|
|
293
181
|
private handleEvent;
|
|
@@ -299,43 +187,6 @@ export declare class InteractiveMode {
|
|
|
299
187
|
* If multiple status messages are emitted back-to-back (without anything else being added to the chat),
|
|
300
188
|
* we update the previous status line instead of appending new ones to avoid log spam.
|
|
301
189
|
*/
|
|
302
|
-
/**
|
|
303
|
-
* Toggle voice-to-text capture.
|
|
304
|
-
*
|
|
305
|
-
* Prefers a persistent `voicetools serve` daemon: the first press probes for
|
|
306
|
-
* support and (if found) loads models once, showing a "warming up" spinner;
|
|
307
|
-
* every later press reuses the already-warm daemon and jumps straight to
|
|
308
|
-
* Listening. Binaries without `serve` support fall back to spawning
|
|
309
|
-
* `voicetools transcribe` per press, same as before. Pressing the shortcut
|
|
310
|
-
* again while listening (or while still warming up) cancels.
|
|
311
|
-
*/
|
|
312
|
-
private toggleVoiceTranscribe;
|
|
313
|
-
/**
|
|
314
|
-
* Build the (stable, reused-across-captures) handlers for the daemon.
|
|
315
|
-
*
|
|
316
|
-
* Every handler bails out once `voiceActive` is false: CANCEL is a soft
|
|
317
|
-
* request (unlike the legacy path's `proc.kill()`, it doesn't sever the
|
|
318
|
-
* pipe), so the daemon can still have a trailing PARTIAL/FINAL/DONE for the
|
|
319
|
-
* just-cancelled capture in flight when the user presses cancel. Without
|
|
320
|
-
* this guard that stale text would land in the editor after the panel had
|
|
321
|
-
* already collapsed.
|
|
322
|
-
*
|
|
323
|
-
* v0.1.4 serve streams `PARTIAL <full growing hypothesis>` (live preview,
|
|
324
|
-
* never committed) and ends with a single `FINAL <complete text>` (the one
|
|
325
|
-
* commit to the editor). `SEGMENT` is still handled for the legacy
|
|
326
|
-
* transcribe path and any binary that streams committed chunks directly.
|
|
327
|
-
*/
|
|
328
|
-
private buildVoiceDaemonHandlers;
|
|
329
|
-
/** Inject decoded text into the editor via bracketed paste (with a trailing space). */
|
|
330
|
-
private commitVoiceText;
|
|
331
|
-
private beginDaemonVoiceCapture;
|
|
332
|
-
private beginLegacyVoiceCapture;
|
|
333
|
-
private resolveVoiceBin;
|
|
334
|
-
/** Create (or reuse) the voice panel and mount it in the status container. */
|
|
335
|
-
private showVoicePanel;
|
|
336
|
-
private showVoiceWarming;
|
|
337
|
-
/** Collapse the voice panel back to nothing (idle) and stop its animation. */
|
|
338
|
-
private resetVoiceUI;
|
|
339
190
|
private showStatus;
|
|
340
191
|
private addMessageToChat;
|
|
341
192
|
/**
|
|
@@ -367,7 +218,6 @@ export declare class InteractiveMode {
|
|
|
367
218
|
private updateEditorBorderColor;
|
|
368
219
|
private updateEditorPromptPrefix;
|
|
369
220
|
private cycleThinkingLevel;
|
|
370
|
-
private cycleModel;
|
|
371
221
|
private toggleToolOutputExpansion;
|
|
372
222
|
private setToolsExpanded;
|
|
373
223
|
private toggleThinkingBlockVisibility;
|
|
@@ -377,57 +227,17 @@ export declare class InteractiveMode {
|
|
|
377
227
|
showWarning(warningMessage: string): void;
|
|
378
228
|
showNewVersionNotification(newVersion: string): void;
|
|
379
229
|
showPackageUpdateNotification(packages: string[]): void;
|
|
380
|
-
/**
|
|
381
|
-
* Get all queued messages (read-only).
|
|
382
|
-
* Combines session queue and compaction queue.
|
|
383
|
-
*/
|
|
384
|
-
private getAllQueuedMessages;
|
|
385
|
-
/**
|
|
386
|
-
* Clear all queued messages and return their contents.
|
|
387
|
-
* Clears both session queue and compaction queue.
|
|
388
|
-
*/
|
|
389
|
-
private clearAllQueues;
|
|
390
|
-
private updatePendingMessagesDisplay;
|
|
391
|
-
private restoreQueuedMessagesToEditor;
|
|
392
|
-
private queueCompactionMessage;
|
|
393
|
-
private isExtensionCommand;
|
|
394
|
-
private flushCompactionQueue;
|
|
395
|
-
/** Move pending bash components from pending area to chat */
|
|
396
|
-
private flushPendingBashComponents;
|
|
397
230
|
/**
|
|
398
231
|
* Shows a selector component in place of the editor.
|
|
399
232
|
* @param create Factory that receives a `done` callback and returns the component and focus target
|
|
400
233
|
*/
|
|
401
234
|
private showSelector;
|
|
402
235
|
private showSettingsSelector;
|
|
403
|
-
private findExactModelMatch;
|
|
404
|
-
private getModelCandidates;
|
|
405
|
-
private updateAvailableProviderCount;
|
|
406
|
-
private maybeWarnAboutAnthropicSubscriptionAuth;
|
|
407
|
-
private showModelSelector;
|
|
408
|
-
private showModelsSelector;
|
|
409
236
|
private showUserMessageSelector;
|
|
410
237
|
private showTreeSelector;
|
|
411
238
|
private showSessionSelector;
|
|
412
239
|
private handleResumeSession;
|
|
413
|
-
private getLoginProviderOptions;
|
|
414
|
-
private getLogoutProviderOptions;
|
|
415
|
-
private showLoginAuthTypeSelector;
|
|
416
|
-
private showLoginProviderSelector;
|
|
417
|
-
private showOAuthSelector;
|
|
418
|
-
private completeProviderAuthentication;
|
|
419
|
-
private showBedrockSetupDialog;
|
|
420
|
-
private showApiKeyLoginDialog;
|
|
421
|
-
private showOAuthLoginSelect;
|
|
422
|
-
private showLoginDialog;
|
|
423
240
|
private handleReloadCommand;
|
|
424
|
-
/**
|
|
425
|
-
* Get capitalized display string for an app keybinding action.
|
|
426
|
-
*/
|
|
427
|
-
private getAppKeyDisplay;
|
|
428
|
-
private handleDaxnuts;
|
|
429
|
-
private checkDaxnutsEasterEgg;
|
|
430
|
-
private handleBashCommand;
|
|
431
241
|
private handleCompactCommand;
|
|
432
242
|
stop(): void;
|
|
433
243
|
}
|