@travisennis/acai 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -17
- package/bin/acai-wrapper.js +26 -0
- package/dist/agent/index.d.ts +15 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +202 -174
- package/dist/api/exa/index.js +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -7
- package/dist/commands/add-directory-command.d.ts +1 -1
- package/dist/commands/add-directory-command.d.ts.map +1 -1
- package/dist/commands/add-directory-command.js +1 -32
- package/dist/commands/application-log-command.d.ts +1 -1
- package/dist/commands/application-log-command.d.ts.map +1 -1
- package/dist/commands/application-log-command.js +2 -38
- package/dist/commands/clear-command.d.ts +1 -1
- package/dist/commands/clear-command.d.ts.map +1 -1
- package/dist/commands/clear-command.js +1 -5
- package/dist/commands/compact-command.d.ts.map +1 -1
- package/dist/commands/compact-command.js +0 -9
- package/dist/commands/context-command.d.ts +1 -1
- package/dist/commands/context-command.d.ts.map +1 -1
- package/dist/commands/context-command.js +13 -72
- package/dist/commands/copy-command.d.ts.map +1 -1
- package/dist/commands/copy-command.js +0 -19
- package/dist/commands/edit-command.d.ts +1 -1
- package/dist/commands/edit-command.d.ts.map +1 -1
- package/dist/commands/edit-command.js +3 -49
- package/dist/commands/edit-prompt-command.d.ts +1 -1
- package/dist/commands/edit-prompt-command.d.ts.map +1 -1
- package/dist/commands/edit-prompt-command.js +1 -26
- package/dist/commands/exit-command.d.ts +1 -4
- package/dist/commands/exit-command.d.ts.map +1 -1
- package/dist/commands/exit-command.js +2 -18
- package/dist/commands/files-command.d.ts +1 -1
- package/dist/commands/files-command.d.ts.map +1 -1
- package/dist/commands/files-command.js +1 -54
- package/dist/commands/generate-rules-command.d.ts +1 -1
- package/dist/commands/generate-rules-command.d.ts.map +1 -1
- package/dist/commands/generate-rules-command.js +18 -60
- package/dist/commands/handoff-command.d.ts.map +1 -1
- package/dist/commands/handoff-command.js +0 -11
- package/dist/commands/health-command.d.ts +1 -1
- package/dist/commands/health-command.d.ts.map +1 -1
- package/dist/commands/health-command.js +8 -103
- package/dist/commands/help-command.d.ts +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +6 -14
- package/dist/commands/history-command.d.ts +1 -1
- package/dist/commands/history-command.d.ts.map +1 -1
- package/dist/commands/history-command.js +30 -106
- package/dist/commands/init-command.d.ts +1 -1
- package/dist/commands/init-command.d.ts.map +1 -1
- package/dist/commands/init-command.js +4 -23
- package/dist/commands/last-log-command.d.ts +1 -1
- package/dist/commands/last-log-command.d.ts.map +1 -1
- package/dist/commands/last-log-command.js +1 -28
- package/dist/commands/list-directories-command.d.ts +1 -1
- package/dist/commands/list-directories-command.d.ts.map +1 -1
- package/dist/commands/list-directories-command.js +1 -14
- package/dist/commands/list-tools-command.d.ts.map +1 -1
- package/dist/commands/list-tools-command.js +55 -78
- package/dist/commands/manager.d.ts +1 -8
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +7 -42
- package/dist/commands/model-command.d.ts +0 -22
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +5 -126
- package/dist/commands/paste-command.d.ts +1 -1
- package/dist/commands/paste-command.d.ts.map +1 -1
- package/dist/commands/paste-command.js +1 -79
- package/dist/commands/pickup-command.d.ts.map +1 -1
- package/dist/commands/pickup-command.js +3 -55
- package/dist/commands/prompt-command.d.ts +19 -1
- package/dist/commands/prompt-command.d.ts.map +1 -1
- package/dist/commands/prompt-command.js +172 -194
- package/dist/commands/remove-directory-command.d.ts +1 -1
- package/dist/commands/remove-directory-command.d.ts.map +1 -1
- package/dist/commands/remove-directory-command.js +1 -33
- package/dist/commands/reset-command.d.ts +1 -1
- package/dist/commands/reset-command.d.ts.map +1 -1
- package/dist/commands/reset-command.js +3 -11
- package/dist/commands/rules-command.d.ts +1 -1
- package/dist/commands/rules-command.d.ts.map +1 -1
- package/dist/commands/rules-command.js +1 -63
- package/dist/commands/save-command.d.ts +1 -1
- package/dist/commands/save-command.d.ts.map +1 -1
- package/dist/commands/save-command.js +1 -8
- package/dist/commands/shell-command.d.ts.map +1 -1
- package/dist/commands/shell-command.js +1 -48
- package/dist/commands/types.d.ts +0 -3
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/usage-command.d.ts +1 -1
- package/dist/commands/usage-command.d.ts.map +1 -1
- package/dist/commands/usage-command.js +5 -16
- package/dist/config.d.ts +17 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +86 -53
- package/dist/execution/index.d.ts +17 -2
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +62 -20
- package/dist/formatting.d.ts +19 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +54 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +212 -153
- package/dist/messages.d.ts +3 -0
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +67 -3
- package/dist/models/anthropic-provider.d.ts.map +1 -1
- package/dist/models/anthropic-provider.js +0 -7
- package/dist/models/deepseek-provider.d.ts.map +1 -1
- package/dist/models/deepseek-provider.js +0 -2
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +0 -3
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/groq-provider.js +0 -1
- package/dist/models/openai-provider.d.ts.map +1 -1
- package/dist/models/openai-provider.js +0 -4
- package/dist/models/openrouter-provider.d.ts +10 -9
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +82 -88
- package/dist/models/providers.d.ts +4 -14
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/providers.js +1 -57
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +0 -2
- package/dist/prompts.d.ts +9 -4
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +427 -99
- package/dist/repl/project-status-line.d.ts +1 -0
- package/dist/repl/project-status-line.d.ts.map +1 -1
- package/dist/repl/project-status-line.js +57 -27
- package/dist/repl-new.d.ts +0 -2
- package/dist/repl-new.d.ts.map +1 -1
- package/dist/repl-new.js +34 -54
- package/dist/skills.d.ts +20 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +192 -0
- package/dist/terminal/control.d.ts +55 -0
- package/dist/terminal/control.d.ts.map +1 -0
- package/dist/terminal/control.js +109 -0
- package/dist/terminal/default-theme.d.ts +1 -1
- package/dist/terminal/default-theme.d.ts.map +1 -1
- package/dist/terminal/default-theme.js +24 -28
- package/dist/terminal/formatting.d.ts +23 -25
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +35 -52
- package/dist/terminal/highlight/index.d.ts.map +1 -1
- package/dist/terminal/highlight/index.js +3 -6
- package/dist/terminal/highlight/theme.d.ts.map +1 -1
- package/dist/terminal/highlight/theme.js +2 -6
- package/dist/terminal/index.d.ts +2 -101
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +2 -464
- package/dist/terminal/markdown.js +7 -5
- package/dist/terminal/strip-ansi.js +4 -4
- package/dist/terminal/table/cell.d.ts +114 -0
- package/dist/terminal/table/cell.d.ts.map +1 -0
- package/dist/terminal/table/cell.js +407 -0
- package/dist/terminal/table/debug.d.ts +15 -0
- package/dist/terminal/table/debug.d.ts.map +1 -0
- package/dist/terminal/table/debug.js +32 -0
- package/dist/terminal/table/index.d.ts +3 -0
- package/dist/terminal/table/index.d.ts.map +1 -0
- package/dist/terminal/table/index.js +2 -0
- package/dist/terminal/table/layout-manager.d.ts +27 -0
- package/dist/terminal/table/layout-manager.d.ts.map +1 -0
- package/dist/terminal/table/layout-manager.js +257 -0
- package/dist/terminal/table/table.d.ts +9 -0
- package/dist/terminal/table/table.d.ts.map +1 -0
- package/dist/terminal/table/table.js +97 -0
- package/dist/terminal/table/utils.d.ts +63 -0
- package/dist/terminal/table/utils.d.ts.map +1 -0
- package/dist/terminal/table/utils.js +326 -0
- package/dist/tokens/threshold.d.ts +6 -21
- package/dist/tokens/threshold.d.ts.map +1 -1
- package/dist/tokens/threshold.js +13 -31
- package/dist/tools/advanced-edit-file.d.ts.map +1 -1
- package/dist/tools/advanced-edit-file.js +5 -1
- package/dist/tools/agent.d.ts.map +1 -1
- package/dist/tools/agent.js +19 -5
- package/dist/tools/bash.d.ts +3 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +204 -42
- package/dist/tools/batch.d.ts +34 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +174 -0
- package/dist/tools/code-interpreter.d.ts.map +1 -1
- package/dist/tools/code-interpreter.js +25 -9
- package/dist/tools/delete-file.d.ts.map +1 -1
- package/dist/tools/delete-file.js +9 -2
- package/dist/tools/directory-tree.d.ts +0 -6
- package/dist/tools/directory-tree.d.ts.map +1 -1
- package/dist/tools/directory-tree.js +29 -18
- package/dist/tools/dynamic-tool-loader.d.ts +0 -4
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +2 -2
- package/dist/tools/edit-file.d.ts.map +1 -1
- package/dist/tools/edit-file.js +16 -3
- package/dist/tools/glob.d.ts.map +1 -1
- package/dist/tools/glob.js +24 -13
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +40 -25
- package/dist/tools/index.d.ts +17 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +43 -1
- package/dist/tools/llm-edit-fixer.d.ts +0 -1
- package/dist/tools/llm-edit-fixer.d.ts.map +1 -1
- package/dist/tools/llm-edit-fixer.js +14 -28
- package/dist/tools/move-file.d.ts.map +1 -1
- package/dist/tools/move-file.js +8 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +32 -23
- package/dist/tools/read-multiple-files.d.ts.map +1 -1
- package/dist/tools/read-multiple-files.js +102 -45
- package/dist/tools/save-file.d.ts +4 -4
- package/dist/tools/save-file.d.ts.map +1 -1
- package/dist/tools/save-file.js +20 -2
- package/dist/tools/think.d.ts.map +1 -1
- package/dist/tools/think.js +7 -1
- package/dist/tools/types.d.ts +5 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +24 -9
- package/dist/tui/components/assistant-message.js +1 -1
- package/dist/tui/components/box.d.ts +20 -0
- package/dist/tui/components/box.d.ts.map +1 -0
- package/dist/tui/components/box.js +81 -0
- package/dist/tui/components/editor.d.ts +60 -5
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +577 -115
- package/dist/tui/components/footer.d.ts +0 -12
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +19 -7
- package/dist/tui/components/header.d.ts +21 -0
- package/dist/tui/components/header.d.ts.map +1 -0
- package/dist/tui/components/header.js +63 -0
- package/dist/tui/components/loader.d.ts +5 -1
- package/dist/tui/components/loader.d.ts.map +1 -1
- package/dist/tui/components/loader.js +2 -2
- package/dist/tui/components/markdown.d.ts +26 -23
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +107 -54
- package/dist/tui/components/modal.d.ts +0 -11
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +0 -29
- package/dist/tui/components/progress-bar.d.ts +19 -0
- package/dist/tui/components/progress-bar.d.ts.map +1 -0
- package/dist/tui/components/progress-bar.js +78 -0
- package/dist/tui/components/prompt-status.d.ts +2 -1
- package/dist/tui/components/prompt-status.d.ts.map +1 -1
- package/dist/tui/components/prompt-status.js +7 -2
- package/dist/tui/components/select-list.d.ts +27 -1
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +93 -29
- package/dist/tui/components/spacer.d.ts +1 -1
- package/dist/tui/components/spacer.d.ts.map +1 -1
- package/dist/tui/components/spacer.js +2 -2
- package/dist/tui/components/table.d.ts +27 -0
- package/dist/tui/components/table.d.ts.map +1 -0
- package/dist/tui/components/table.js +125 -0
- package/dist/tui/components/thinking-block.d.ts.map +1 -1
- package/dist/tui/components/thinking-block.js +4 -1
- package/dist/tui/components/tool-execution.d.ts +8 -4
- package/dist/tui/components/tool-execution.d.ts.map +1 -1
- package/dist/tui/components/tool-execution.js +88 -80
- package/dist/tui/components/user-message.d.ts.map +1 -1
- package/dist/tui/components/user-message.js +6 -4
- package/dist/tui/index.d.ts +9 -5
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +5 -1
- package/dist/tui/terminal.d.ts +2 -1
- package/dist/tui/terminal.d.ts.map +1 -1
- package/dist/tui/terminal.js +28 -38
- package/dist/tui/tui.d.ts +2 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +53 -33
- package/dist/tui/utils.d.ts +5 -0
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +81 -1
- package/dist/{tools/bash-utils.d.ts → utils/bash.d.ts} +3 -3
- package/dist/utils/bash.d.ts.map +1 -0
- package/dist/{tools/bash-utils.js → utils/bash.js} +22 -11
- package/dist/utils/{filesystem.d.ts → filesystem/operations.d.ts} +1 -1
- package/dist/utils/filesystem/operations.d.ts.map +1 -0
- package/dist/{tools/filesystem-utils.d.ts → utils/filesystem/security.d.ts} +3 -2
- package/dist/utils/filesystem/security.d.ts.map +1 -0
- package/dist/{tools/filesystem-utils.js → utils/filesystem/security.js} +62 -4
- package/dist/utils/funcs.d.ts +6 -0
- package/dist/utils/funcs.d.ts.map +1 -0
- package/dist/utils/funcs.js +6 -0
- package/dist/{tools/git-utils.d.ts → utils/git.d.ts} +1 -1
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/{tools/git-utils.js → utils/git.js} +0 -6
- package/dist/utils/glob.js +1 -1
- package/dist/utils/{zod-utils.d.ts → zod.d.ts} +1 -1
- package/dist/utils/zod.d.ts.map +1 -0
- package/package.json +17 -17
- package/dist/agent/manual-loop.d.ts +0 -41
- package/dist/agent/manual-loop.d.ts.map +0 -1
- package/dist/agent/manual-loop.js +0 -278
- package/dist/repl/display-tool-messages.d.ts +0 -4
- package/dist/repl/display-tool-messages.d.ts.map +0 -1
- package/dist/repl/display-tool-messages.js +0 -58
- package/dist/repl/display-tool-use.d.ts +0 -14
- package/dist/repl/display-tool-use.d.ts.map +0 -1
- package/dist/repl/display-tool-use.js +0 -63
- package/dist/repl/get-prompt-header.d.ts +0 -8
- package/dist/repl/get-prompt-header.d.ts.map +0 -1
- package/dist/repl/get-prompt-header.js +0 -9
- package/dist/repl/prompt.d.ts +0 -21
- package/dist/repl/prompt.d.ts.map +0 -1
- package/dist/repl/prompt.js +0 -244
- package/dist/repl.d.ts +0 -29
- package/dist/repl.d.ts.map +0 -1
- package/dist/repl.js +0 -218
- package/dist/terminal/checkbox-prompt.d.ts +0 -36
- package/dist/terminal/checkbox-prompt.d.ts.map +0 -1
- package/dist/terminal/checkbox-prompt.js +0 -368
- package/dist/terminal/editor-prompt.d.ts +0 -10
- package/dist/terminal/editor-prompt.d.ts.map +0 -1
- package/dist/terminal/editor-prompt.js +0 -61
- package/dist/terminal/errors.d.ts +0 -19
- package/dist/terminal/errors.d.ts.map +0 -1
- package/dist/terminal/errors.js +0 -37
- package/dist/terminal/input-prompt.d.ts +0 -17
- package/dist/terminal/input-prompt.d.ts.map +0 -1
- package/dist/terminal/input-prompt.js +0 -181
- package/dist/terminal/search-prompt.d.ts +0 -20
- package/dist/terminal/search-prompt.d.ts.map +0 -1
- package/dist/terminal/search-prompt.js +0 -280
- package/dist/terminal/types.d.ts +0 -35
- package/dist/terminal/types.d.ts.map +0 -1
- package/dist/terminal/types.js +0 -1
- package/dist/tools/bash-utils.d.ts.map +0 -1
- package/dist/tools/filesystem-utils.d.ts.map +0 -1
- package/dist/tools/git-utils.d.ts.map +0 -1
- package/dist/utils/filesystem.d.ts.map +0 -1
- package/dist/utils/zod-utils.d.ts.map +0 -1
- /package/dist/utils/{filesystem.js → filesystem/operations.js} +0 -0
- /package/dist/utils/{zod-utils.js → zod.js} +0 -0
|
@@ -25,6 +25,9 @@ export class ThinkingBlockComponent extends Container {
|
|
|
25
25
|
const content = message.content;
|
|
26
26
|
// Assistant text messages with no background - trim the text
|
|
27
27
|
// Set paddingY=0 to avoid extra spacing before tool executions
|
|
28
|
-
this.contentContainer.addChild(new Markdown(style.dim(content.trim()),
|
|
28
|
+
this.contentContainer.addChild(new Markdown(style.dim(content.trim()), {
|
|
29
|
+
paddingX: 1,
|
|
30
|
+
paddingY: 0,
|
|
31
|
+
}));
|
|
29
32
|
}
|
|
30
33
|
}
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import type { ToolEvent } from "../../agent/index.ts";
|
|
2
|
-
import { Container } from "../index.ts";
|
|
2
|
+
import { Container, type TUI } from "../index.ts";
|
|
3
3
|
export declare class ToolExecutionComponent extends Container {
|
|
4
|
+
private tui;
|
|
4
5
|
private contentContainer;
|
|
6
|
+
private loaderComponent;
|
|
5
7
|
private toolName;
|
|
6
8
|
private events;
|
|
7
|
-
constructor(
|
|
8
|
-
update(
|
|
9
|
+
constructor(tui: TUI, events: ToolEvent[]);
|
|
10
|
+
update(events: ToolEvent[]): void;
|
|
9
11
|
private renderDisplay;
|
|
10
|
-
private
|
|
12
|
+
private getToolCallStartComponent;
|
|
13
|
+
private handleToolStartMessage;
|
|
11
14
|
private handleToolInitMessage;
|
|
12
15
|
private handleToolUpdateMessage;
|
|
13
16
|
private handleToolCompletionMessage;
|
|
14
17
|
private handleToolErrorMessage;
|
|
15
18
|
private processEventsInOrder;
|
|
19
|
+
private getEventIndex;
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=tool-execution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../source/tui/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,
|
|
1
|
+
{"version":3,"file":"tool-execution.d.ts","sourceRoot":"","sources":["../../../source/tui/components/tool-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EACL,SAAS,EAKT,KAAK,GAAG,EACT,MAAM,aAAa,CAAC;AAUrB,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;gBAEhB,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE;IAczC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE;IAS1B,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,yBAAyB;IA0DjC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,oBAAoB;IA+B5B,OAAO,CAAC,aAAa;CAkBtB"}
|
|
@@ -1,117 +1,118 @@
|
|
|
1
1
|
import { capitalize } from "../../formatting.js";
|
|
2
2
|
import style from "../../terminal/style.js";
|
|
3
|
-
import { Container, Spacer, Text } from "../index.js";
|
|
3
|
+
import { Container, Loader, Markdown, Spacer, Text, } from "../index.js";
|
|
4
|
+
const bgColor = {
|
|
5
|
+
r: 52,
|
|
6
|
+
g: 53,
|
|
7
|
+
b: 65,
|
|
8
|
+
};
|
|
4
9
|
export class ToolExecutionComponent extends Container {
|
|
10
|
+
tui;
|
|
5
11
|
contentContainer;
|
|
12
|
+
loaderComponent;
|
|
6
13
|
toolName;
|
|
7
14
|
events;
|
|
8
|
-
constructor(
|
|
15
|
+
constructor(tui, events) {
|
|
9
16
|
super();
|
|
10
|
-
this.
|
|
11
|
-
this.
|
|
17
|
+
this.tui = tui;
|
|
18
|
+
this.loaderComponent = null;
|
|
19
|
+
this.toolName = events[0].name;
|
|
20
|
+
this.events = events;
|
|
12
21
|
// Container for text/thinking content
|
|
13
22
|
this.contentContainer = new Container();
|
|
14
23
|
this.addChild(this.contentContainer);
|
|
15
24
|
this.renderDisplay();
|
|
16
25
|
}
|
|
17
|
-
update(
|
|
18
|
-
this.events
|
|
26
|
+
update(events) {
|
|
27
|
+
this.events = events;
|
|
28
|
+
// Clear content container
|
|
29
|
+
this.contentContainer.clear();
|
|
19
30
|
this.renderDisplay();
|
|
20
31
|
}
|
|
21
32
|
renderDisplay() {
|
|
22
|
-
// Clear content container
|
|
23
|
-
this.contentContainer.clear();
|
|
24
|
-
const lines = [];
|
|
25
33
|
// Build display from complete event history with proper ordering
|
|
26
34
|
const processedEvents = this.processEventsInOrder();
|
|
35
|
+
const currentStatus = processedEvents.at(-1)?.type ?? "tool-call-start";
|
|
36
|
+
this.contentContainer.addChild(new Spacer(1));
|
|
37
|
+
this.contentContainer.addChild(new Spacer(1, bgColor));
|
|
27
38
|
for (let i = 0; i < processedEvents.length; i++) {
|
|
28
39
|
const event = processedEvents[i];
|
|
29
40
|
const eventType = event.type;
|
|
30
41
|
switch (eventType) {
|
|
31
42
|
case "tool-call-start":
|
|
32
|
-
|
|
43
|
+
this.getToolCallStartComponent(event, currentStatus);
|
|
44
|
+
break;
|
|
45
|
+
case "tool-call-init":
|
|
46
|
+
this.contentContainer.addChild(new Text(`→ ${this.handleToolInitMessage(event.msg)}`, 1, 0, bgColor));
|
|
33
47
|
break;
|
|
34
48
|
case "tool-call-update":
|
|
35
|
-
|
|
49
|
+
this.contentContainer.addChild(new Markdown(this.handleToolUpdateMessage(event.msg), {
|
|
50
|
+
paddingX: 3,
|
|
51
|
+
customBgRgb: bgColor,
|
|
52
|
+
}));
|
|
36
53
|
break;
|
|
37
54
|
case "tool-call-end":
|
|
38
|
-
|
|
55
|
+
this.contentContainer.addChild(new Text(`└ ${this.handleToolCompletionMessage(event.msg)}`, 1, 0, bgColor));
|
|
39
56
|
break;
|
|
40
57
|
case "tool-call-error":
|
|
41
|
-
|
|
58
|
+
this.contentContainer.addChild(new Text(`└ ${this.handleToolErrorMessage(event.msg)}`, 1, 0, bgColor));
|
|
42
59
|
break;
|
|
43
60
|
default: {
|
|
44
61
|
eventType;
|
|
45
62
|
}
|
|
46
63
|
}
|
|
47
64
|
}
|
|
48
|
-
|
|
49
|
-
const currentStatus = this.events[this.events.length - 1].type;
|
|
50
|
-
const indicator = this.getIndicator(currentStatus);
|
|
51
|
-
const displayLines = [];
|
|
52
|
-
for (let i = 0; i < lines.length; i++) {
|
|
53
|
-
let line = lines[i];
|
|
54
|
-
if (i === 0) {
|
|
55
|
-
line = `${indicator} ${line}`;
|
|
56
|
-
}
|
|
57
|
-
displayLines.push(line);
|
|
58
|
-
}
|
|
65
|
+
this.contentContainer.addChild(new Spacer(1, bgColor));
|
|
59
66
|
this.contentContainer.addChild(new Spacer(1));
|
|
60
|
-
this.contentContainer.addChild(new Text(displayLines.join("\n"), 1, 1, {
|
|
61
|
-
r: 52,
|
|
62
|
-
g: 53,
|
|
63
|
-
b: 65,
|
|
64
|
-
}));
|
|
65
67
|
}
|
|
66
|
-
|
|
67
|
-
switch (
|
|
68
|
+
getToolCallStartComponent(event, currentStatus) {
|
|
69
|
+
switch (currentStatus) {
|
|
68
70
|
case "tool-call-start":
|
|
69
|
-
|
|
71
|
+
this.contentContainer.addChild(new Text(`${style.blue.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
|
|
72
|
+
break;
|
|
73
|
+
case "tool-call-init":
|
|
70
74
|
case "tool-call-update":
|
|
71
|
-
|
|
75
|
+
if (!this.loaderComponent) {
|
|
76
|
+
this.loaderComponent = new Loader(this.tui, this.handleToolStartMessage(event), bgColor);
|
|
77
|
+
this.contentContainer.addChild(this.loaderComponent);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.loaderComponent.setMessage(this.handleToolStartMessage(event));
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
72
83
|
case "tool-call-end":
|
|
73
|
-
|
|
84
|
+
if (this.loaderComponent) {
|
|
85
|
+
this.loaderComponent.stop();
|
|
86
|
+
this.loaderComponent = null;
|
|
87
|
+
}
|
|
88
|
+
this.contentContainer.addChild(new Text(`${style.green.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
|
|
89
|
+
break;
|
|
74
90
|
case "tool-call-error":
|
|
75
|
-
|
|
91
|
+
if (this.loaderComponent) {
|
|
92
|
+
this.loaderComponent.stop();
|
|
93
|
+
this.loaderComponent = null;
|
|
94
|
+
}
|
|
95
|
+
this.contentContainer.addChild(new Text(`${style.red.bold("●")} ${this.handleToolStartMessage(event)}`, 1, 0, bgColor));
|
|
96
|
+
break;
|
|
76
97
|
default:
|
|
77
|
-
|
|
98
|
+
currentStatus;
|
|
78
99
|
}
|
|
79
|
-
return style.blue.bold("●");
|
|
80
100
|
}
|
|
81
|
-
|
|
101
|
+
handleToolStartMessage(event) {
|
|
82
102
|
const message = event.msg;
|
|
83
103
|
let result = `${style.bold(capitalize(this.toolName))} `;
|
|
84
104
|
result += message.trim() ? `${style.bold(message)} ` : "";
|
|
85
105
|
result += style.dim(JSON.stringify(event.args).slice(0, 50));
|
|
86
106
|
return result;
|
|
87
107
|
}
|
|
108
|
+
handleToolInitMessage(message) {
|
|
109
|
+
return style.bold(message);
|
|
110
|
+
}
|
|
88
111
|
handleToolUpdateMessage(message) {
|
|
89
|
-
|
|
90
|
-
let result = "";
|
|
91
|
-
if (newlineIndex === -1) {
|
|
92
|
-
result += style.bold(message);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const firstLine = message.slice(0, newlineIndex);
|
|
96
|
-
// const remainingLines = message.slice(newlineIndex + 1);
|
|
97
|
-
result += style.bold(firstLine);
|
|
98
|
-
// if (remainingLines.trim()) {
|
|
99
|
-
// terminal.display(remainingLines);
|
|
100
|
-
// }
|
|
101
|
-
}
|
|
102
|
-
return result;
|
|
112
|
+
return message;
|
|
103
113
|
}
|
|
104
114
|
handleToolCompletionMessage(message) {
|
|
105
|
-
|
|
106
|
-
let result = "";
|
|
107
|
-
if (newlineIndex === -1) {
|
|
108
|
-
result += style.bold(message);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
const firstLine = message.slice(0, newlineIndex);
|
|
112
|
-
result += style.bold(firstLine);
|
|
113
|
-
}
|
|
114
|
-
return result;
|
|
115
|
+
return style.bold(message);
|
|
115
116
|
}
|
|
116
117
|
handleToolErrorMessage(message) {
|
|
117
118
|
return style.bold.red(message);
|
|
@@ -119,8 +120,11 @@ export class ToolExecutionComponent extends Container {
|
|
|
119
120
|
processEventsInOrder() {
|
|
120
121
|
const events = [...this.events];
|
|
121
122
|
const processed = [];
|
|
122
|
-
// Ensure we have a tool-call-start event
|
|
123
|
-
|
|
123
|
+
// Ensure we have a tool-call-start event for this specific tool call
|
|
124
|
+
// Events are grouped by toolCallId, so we need to check for start events
|
|
125
|
+
// that match the current tool call's ID
|
|
126
|
+
const toolCallId = events[0]?.toolCallId;
|
|
127
|
+
const hasStartEvent = events.some((event) => event.type === "tool-call-start" && event.toolCallId === toolCallId);
|
|
124
128
|
if (!hasStartEvent && events.length > 0) {
|
|
125
129
|
// Create synthetic start event using the first event's name
|
|
126
130
|
const firstEvent = events[0];
|
|
@@ -132,22 +136,26 @@ export class ToolExecutionComponent extends Container {
|
|
|
132
136
|
args: firstEvent.args,
|
|
133
137
|
});
|
|
134
138
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const updateEvents = events.filter((event) => event.type === "tool-call-update");
|
|
138
|
-
const endEvents = events.filter((event) => event.type === "tool-call-end");
|
|
139
|
-
const errorEvents = events.filter((event) => event.type === "tool-call-error");
|
|
140
|
-
// Add start events first
|
|
141
|
-
processed.push(...startEvents);
|
|
142
|
-
// Add update events
|
|
143
|
-
processed.push(...updateEvents);
|
|
144
|
-
// Add end or error events (only one should be present)
|
|
145
|
-
if (endEvents.length > 0) {
|
|
146
|
-
processed.push(...endEvents);
|
|
147
|
-
}
|
|
148
|
-
else if (errorEvents.length > 0) {
|
|
149
|
-
processed.push(...errorEvents);
|
|
150
|
-
}
|
|
139
|
+
processed.push(...events);
|
|
140
|
+
processed.sort((a, b) => this.getEventIndex(a) - this.getEventIndex(b));
|
|
151
141
|
return processed;
|
|
152
142
|
}
|
|
143
|
+
getEventIndex(event) {
|
|
144
|
+
const eventType = event.type;
|
|
145
|
+
switch (eventType) {
|
|
146
|
+
case "tool-call-start":
|
|
147
|
+
return 0;
|
|
148
|
+
case "tool-call-init":
|
|
149
|
+
return 1;
|
|
150
|
+
case "tool-call-update":
|
|
151
|
+
return 2;
|
|
152
|
+
case "tool-call-end":
|
|
153
|
+
case "tool-call-error":
|
|
154
|
+
return 3;
|
|
155
|
+
default: {
|
|
156
|
+
eventType;
|
|
157
|
+
return -1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
153
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../source/tui/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAW;gBAEf,IAAI,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../source/tui/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAW;gBAEf,IAAI,EAAE,MAAM;CAiBzB"}
|
|
@@ -10,10 +10,12 @@ export class UserMessageComponent extends Container {
|
|
|
10
10
|
super();
|
|
11
11
|
this.addChild(new Spacer(1));
|
|
12
12
|
// User messages with dark gray background
|
|
13
|
-
this.markdown = new Markdown(text,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
this.markdown = new Markdown(text, {
|
|
14
|
+
customBgRgb: {
|
|
15
|
+
r: 52,
|
|
16
|
+
g: 53,
|
|
17
|
+
b: 65,
|
|
18
|
+
},
|
|
17
19
|
});
|
|
18
20
|
this.addChild(this.markdown);
|
|
19
21
|
this.addChild(new Spacer(1));
|
package/dist/tui/index.d.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
export { type AutocompleteItem,
|
|
2
|
-
export {
|
|
1
|
+
export { type AutocompleteItem, CombinedAutocompleteProvider, type SlashCommand, } from "./autocomplete.ts";
|
|
2
|
+
export { BoxComponent } from "./components/box.ts";
|
|
3
|
+
export { Editor } from "./components/editor.ts";
|
|
4
|
+
export { HeaderComponent } from "./components/header.ts";
|
|
3
5
|
export { Input } from "./components/input.ts";
|
|
4
6
|
export { Loader } from "./components/loader.ts";
|
|
5
7
|
export { Markdown } from "./components/markdown.ts";
|
|
6
|
-
export { Modal,
|
|
7
|
-
export {
|
|
8
|
+
export { Modal, ModalText } from "./components/modal.ts";
|
|
9
|
+
export { ProgressBarComponent } from "./components/progress-bar.ts";
|
|
10
|
+
export { SelectList } from "./components/select-list.ts";
|
|
8
11
|
export { Spacer } from "./components/spacer.ts";
|
|
12
|
+
export { TableComponent } from "./components/table.ts";
|
|
9
13
|
export { Text } from "./components/text.ts";
|
|
10
14
|
export { UserMessageComponent } from "./components/user-message.ts";
|
|
11
|
-
export { ProcessTerminal
|
|
15
|
+
export { ProcessTerminal } from "./terminal.ts";
|
|
12
16
|
export { type Component, Container, TUI } from "./tui.ts";
|
|
13
17
|
export { visibleWidth } from "./utils.ts";
|
|
14
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/tui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EACrB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/tui/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,gBAAgB,EACrB,4BAA4B,EAC5B,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/tui/index.js
CHANGED
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
// Autocomplete support
|
|
3
3
|
export { CombinedAutocompleteProvider, } from "./autocomplete.js";
|
|
4
4
|
// Components
|
|
5
|
+
export { BoxComponent } from "./components/box.js";
|
|
5
6
|
export { Editor } from "./components/editor.js";
|
|
7
|
+
export { HeaderComponent } from "./components/header.js";
|
|
6
8
|
export { Input } from "./components/input.js";
|
|
7
9
|
export { Loader } from "./components/loader.js";
|
|
8
10
|
export { Markdown } from "./components/markdown.js";
|
|
9
|
-
export { Modal,
|
|
11
|
+
export { Modal, ModalText } from "./components/modal.js";
|
|
12
|
+
export { ProgressBarComponent } from "./components/progress-bar.js";
|
|
10
13
|
export { SelectList } from "./components/select-list.js";
|
|
11
14
|
export { Spacer } from "./components/spacer.js";
|
|
15
|
+
export { TableComponent } from "./components/table.js";
|
|
12
16
|
export { Text } from "./components/text.js";
|
|
13
17
|
export { UserMessageComponent } from "./components/user-message.js";
|
|
14
18
|
// Terminal interface and implementations
|
package/dist/tui/terminal.d.ts
CHANGED
|
@@ -19,9 +19,10 @@ export interface Terminal {
|
|
|
19
19
|
*/
|
|
20
20
|
export declare class ProcessTerminal implements Terminal {
|
|
21
21
|
private wasRaw;
|
|
22
|
+
private sigintHandler?;
|
|
22
23
|
private inputHandler?;
|
|
23
24
|
private resizeHandler?;
|
|
24
|
-
private
|
|
25
|
+
private stopped;
|
|
25
26
|
start(onInput: (data: string) => void, onResize: () => void): void;
|
|
26
27
|
stop(): void;
|
|
27
28
|
write(data: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../source/tui/terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAGnE,IAAI,IAAI,IAAI,CAAC;IAGb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,IAAI,OAAO,IAAI,MAAM,CAAC;IACtB,IAAI,IAAI,IAAI,MAAM,CAAC;IAGnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,IAAI,CAAC;IAGnB,SAAS,IAAI,IAAI,CAAC;IAClB,eAAe,IAAI,IAAI,CAAC;IACxB,WAAW,IAAI,IAAI,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../source/tui/terminal.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IAEvB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAGnE,IAAI,IAAI,IAAI,CAAC;IAGb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,IAAI,OAAO,IAAI,MAAM,CAAC;IACtB,IAAI,IAAI,IAAI,MAAM,CAAC;IAGnB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,IAAI,IAAI,CAAC;IAGnB,SAAS,IAAI,IAAI,CAAC;IAClB,eAAe,IAAI,IAAI,CAAC;IACxB,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,YAAY,CAAC,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAa;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAiClE,IAAI,IAAI,IAAI;IA6BZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW3B,UAAU,IAAI,IAAI;IAIlB,UAAU,IAAI,IAAI;IAIlB,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;CAGpB"}
|
package/dist/tui/terminal.js
CHANGED
|
@@ -1,50 +1,44 @@
|
|
|
1
|
-
import readline from "node:readline";
|
|
2
1
|
/**
|
|
3
2
|
* Real terminal using process.stdin/stdout
|
|
4
3
|
*/
|
|
5
4
|
export class ProcessTerminal {
|
|
6
5
|
wasRaw = false;
|
|
6
|
+
sigintHandler;
|
|
7
7
|
inputHandler;
|
|
8
8
|
resizeHandler;
|
|
9
|
-
|
|
9
|
+
stopped = false;
|
|
10
10
|
start(onInput, onResize) {
|
|
11
11
|
this.inputHandler = onInput;
|
|
12
12
|
this.resizeHandler = onResize;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// Check if we're in a TTY environment
|
|
16
|
-
const isTty = process.stdin.isTTY && process.stdout.isTTY;
|
|
17
|
-
if (isTty) {
|
|
18
|
-
// Create readline interface for reliable input handling
|
|
19
|
-
this.rl = readline.createInterface({
|
|
20
|
-
input: process.stdin,
|
|
21
|
-
output: process.stdout,
|
|
22
|
-
terminal: true,
|
|
23
|
-
});
|
|
24
|
-
// Enable raw mode for character-by-character input
|
|
25
|
-
if (process.stdin.setRawMode) {
|
|
26
|
-
process.stdin.setRawMode(true);
|
|
27
|
-
}
|
|
28
|
-
process.stdin.setEncoding("utf8");
|
|
29
|
-
process.stdin.resume();
|
|
30
|
-
// Enable bracketed paste mode - terminal will wrap pastes in \x1b[200~ ... \x1b[201~
|
|
31
|
-
process.stdout.write("\x1b[?2004h");
|
|
32
|
-
// Set up input handler
|
|
33
|
-
process.stdin.on("data", this.inputHandler);
|
|
34
|
-
process.stdout.on("resize", this.resizeHandler);
|
|
13
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
14
|
+
throw new Error("Terminal requires TTY environment");
|
|
35
15
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
process.stdin.setEncoding("utf8");
|
|
41
|
-
if (process.stdin.isPaused()) {
|
|
42
|
-
process.stdin.resume();
|
|
43
|
-
}
|
|
44
|
-
process.stdin.on("data", this.inputHandler);
|
|
16
|
+
// Save previous state and enable raw mode
|
|
17
|
+
this.wasRaw = process.stdin.isRaw ?? false;
|
|
18
|
+
if (process.stdin.setRawMode) {
|
|
19
|
+
process.stdin.setRawMode(true);
|
|
45
20
|
}
|
|
21
|
+
process.stdin.setEncoding("utf8");
|
|
22
|
+
process.stdin.resume();
|
|
23
|
+
// Enable bracketed paste mode - terminal will wrap pastes in \x1b[200~ ... \x1b[201~
|
|
24
|
+
process.stdout.write("\x1b[?2004h");
|
|
25
|
+
// Set up event handlers with proper binding and type conversion
|
|
26
|
+
process.stdin.on("data", (data) => {
|
|
27
|
+
this.inputHandler?.(typeof data === "string" ? data : data.toString("utf8"));
|
|
28
|
+
});
|
|
29
|
+
process.stdout.on("resize", () => {
|
|
30
|
+
this.resizeHandler?.();
|
|
31
|
+
});
|
|
32
|
+
this.sigintHandler = () => this.stop();
|
|
33
|
+
process.on("SIGINT", this.sigintHandler);
|
|
46
34
|
}
|
|
47
35
|
stop() {
|
|
36
|
+
if (this.stopped)
|
|
37
|
+
return;
|
|
38
|
+
this.stopped = true;
|
|
39
|
+
if (this.sigintHandler) {
|
|
40
|
+
process.off("SIGINT", this.sigintHandler);
|
|
41
|
+
}
|
|
48
42
|
// Disable bracketed paste mode
|
|
49
43
|
process.stdout.write("\x1b[?2004l");
|
|
50
44
|
// Remove event handlers
|
|
@@ -56,11 +50,7 @@ export class ProcessTerminal {
|
|
|
56
50
|
process.stdout.removeListener("resize", this.resizeHandler);
|
|
57
51
|
this.resizeHandler = undefined;
|
|
58
52
|
}
|
|
59
|
-
|
|
60
|
-
if (this.rl) {
|
|
61
|
-
this.rl.close();
|
|
62
|
-
this.rl = undefined;
|
|
63
|
-
}
|
|
53
|
+
process.stdin.pause();
|
|
64
54
|
// Restore raw mode state
|
|
65
55
|
if (process.stdin.setRawMode) {
|
|
66
56
|
process.stdin.setRawMode(this.wasRaw);
|
package/dist/tui/tui.d.ts
CHANGED
|
@@ -43,6 +43,8 @@ export declare class TUI extends Container {
|
|
|
43
43
|
private terminal;
|
|
44
44
|
private focusedComponent;
|
|
45
45
|
private renderRequested;
|
|
46
|
+
private isRendering;
|
|
47
|
+
private renderAgain;
|
|
46
48
|
private activeModal;
|
|
47
49
|
constructor(terminal: Terminal);
|
|
48
50
|
setFocus(component: Component | null): void;
|
package/dist/tui/tui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../source/tui/tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAM;IAE3B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAOhC;AAED;;GAEG;AAGH,qBAAa,GAAI,SAAQ,SAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAsB;gBAE7B,QAAQ,EAAE,QAAQ;IAK9B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAI3C,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAKZ,aAAa,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../source/tui/tui.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC;;OAEG;IACH,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC/C;AAED,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,qBAAa,SAAU,YAAW,SAAS;IACzC,QAAQ,EAAE,SAAS,EAAE,CAAM;IAE3B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIpC,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAOvC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAOhC;AAED;;GAEG;AAGH,qBAAa,GAAI,SAAQ,SAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAsB;gBAE7B,QAAQ,EAAE,QAAQ;IAK9B,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAI3C,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAKZ,aAAa,IAAI,IAAI;IAarB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,QAAQ;IAgGhB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAK7B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB"}
|
package/dist/tui/tui.js
CHANGED
|
@@ -38,6 +38,8 @@ export class TUI extends Container {
|
|
|
38
38
|
terminal;
|
|
39
39
|
focusedComponent = null;
|
|
40
40
|
renderRequested = false;
|
|
41
|
+
isRendering = false;
|
|
42
|
+
renderAgain = false;
|
|
41
43
|
activeModal = null;
|
|
42
44
|
constructor(terminal) {
|
|
43
45
|
super();
|
|
@@ -56,10 +58,14 @@ export class TUI extends Container {
|
|
|
56
58
|
this.terminal.stop();
|
|
57
59
|
}
|
|
58
60
|
requestRender() {
|
|
61
|
+
if (this.isRendering) {
|
|
62
|
+
this.renderAgain = true;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
59
65
|
if (this.renderRequested)
|
|
60
66
|
return;
|
|
61
67
|
this.renderRequested = true;
|
|
62
|
-
|
|
68
|
+
setImmediate(() => {
|
|
63
69
|
this.renderRequested = false;
|
|
64
70
|
this.doRender();
|
|
65
71
|
});
|
|
@@ -67,7 +73,7 @@ export class TUI extends Container {
|
|
|
67
73
|
handleInput(data) {
|
|
68
74
|
// Handle Ctrl+C globally - exit the application
|
|
69
75
|
if (data.charCodeAt(0) === 3) {
|
|
70
|
-
console.
|
|
76
|
+
console.info("\nCtrl+C pressed - exiting...");
|
|
71
77
|
this.stop();
|
|
72
78
|
process.exit(0);
|
|
73
79
|
}
|
|
@@ -87,42 +93,56 @@ export class TUI extends Container {
|
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
doRender() {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
// Always do full re-render for simplicity and reliability
|
|
94
|
-
// This ensures that previous content is properly cleared
|
|
95
|
-
let buffer = "\x1b[?2026h"; // Begin synchronized output
|
|
96
|
-
buffer += "\x1b[3J\x1b[2J\x1b[H"; // Clear scrollback, screen, and home
|
|
97
|
-
for (let i = 0; i < newLines.length; i++) {
|
|
98
|
-
if (i > 0)
|
|
99
|
-
buffer += "\r\n";
|
|
100
|
-
buffer += newLines[i];
|
|
96
|
+
if (this.isRendering) {
|
|
97
|
+
this.renderAgain = true;
|
|
98
|
+
return;
|
|
101
99
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
// Render
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
100
|
+
this.isRendering = true;
|
|
101
|
+
try {
|
|
102
|
+
const width = this.terminal.columns;
|
|
103
|
+
// Render all components to get new lines
|
|
104
|
+
const newLines = this.render(width);
|
|
105
|
+
// Always do full re-render for simplicity and reliability
|
|
106
|
+
// This ensures that previous content is properly cleared
|
|
107
|
+
let buffer = "\x1b[?2026h"; // Begin synchronized output
|
|
108
|
+
buffer += "\x1b[3J\x1b[2J\x1b[H"; // Clear scrollback, screen, and home
|
|
109
|
+
for (let i = 0; i < newLines.length; i++) {
|
|
110
|
+
if (i > 0)
|
|
111
|
+
buffer += "\r\n";
|
|
112
|
+
buffer += newLines[i];
|
|
114
113
|
}
|
|
115
|
-
// Render modal
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
// Render modal on top if active
|
|
115
|
+
if (this.activeModal) {
|
|
116
|
+
const modalLines = this.activeModal.render(width);
|
|
117
|
+
// Render backdrop first if modal has backdrop
|
|
118
|
+
if (this.activeModal.backdrop) {
|
|
119
|
+
const backdropLine = style.bgRgb(0, 0, 0)(" ".repeat(width));
|
|
120
|
+
const { columns } = getTerminalSize(); // 24
|
|
121
|
+
for (let i = 0; i < columns; i++) {
|
|
122
|
+
// Cover entire terminal
|
|
123
|
+
buffer += `\x1b[${i + 1};1H`;
|
|
124
|
+
buffer += backdropLine;
|
|
125
|
+
}
|
|
121
126
|
}
|
|
127
|
+
// Render modal content
|
|
128
|
+
for (let i = 0; i < modalLines.length; i++) {
|
|
129
|
+
if (modalLines[i]) {
|
|
130
|
+
// Position cursor and overwrite existing content
|
|
131
|
+
buffer += `\x1b[${i + 1};1H`;
|
|
132
|
+
buffer += modalLines[i];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
buffer += "\x1b[?2026l"; // End synchronized output
|
|
137
|
+
this.terminal.write(buffer);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
this.isRendering = false;
|
|
141
|
+
if (this.renderAgain) {
|
|
142
|
+
this.renderAgain = false;
|
|
143
|
+
this.requestRender();
|
|
122
144
|
}
|
|
123
145
|
}
|
|
124
|
-
buffer += "\x1b[?2026l"; // End synchronized output
|
|
125
|
-
this.terminal.write(buffer);
|
|
126
146
|
}
|
|
127
147
|
// private positionCursor(
|
|
128
148
|
// componentCursorPos: [number, number] | null,
|
package/dist/tui/utils.d.ts
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* - Tabs (replaced with 3 spaces for consistent width)
|
|
8
8
|
*/
|
|
9
9
|
export declare function visibleWidth(str: string): number;
|
|
10
|
+
/**
|
|
11
|
+
* Truncate text to fit within a maximum visible width, preserving ANSI codes.
|
|
12
|
+
* Adds ellipsis if truncation occurs.
|
|
13
|
+
*/
|
|
14
|
+
export declare function truncateToWidth(text: string, maxWidth: number, ellipsis?: string): string;
|
|
10
15
|
/**
|
|
11
16
|
* Apply background color to a line, padding to full width.
|
|
12
17
|
*
|
package/dist/tui/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tui/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tui/utils.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AA4BD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,SAAQ,GACf,MAAM,CA+DR;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,CASR"}
|