@markusylisiurunen/tau 0.3.39 → 0.3.41
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 +34 -38
- package/dist/core/agent/agent_runtime.js +0 -22
- package/dist/core/agent/agent_runtime.js.map +1 -1
- package/dist/core/cli.js +2 -2
- package/dist/core/cli.js.map +1 -1
- package/dist/core/commands/registry.js +22 -20
- package/dist/core/commands/registry.js.map +1 -1
- package/dist/core/config/builtin_themes.js +936 -998
- package/dist/core/config/builtin_themes.js.map +1 -1
- package/dist/core/history/migrations.js +57 -0
- package/dist/core/history/migrations.js.map +1 -0
- package/dist/core/history/setup.js +18 -0
- package/dist/core/history/setup.js.map +1 -1
- package/dist/core/personas.js +8 -53
- package/dist/core/personas.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +0 -6
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/session/direct_bash.js +8 -8
- package/dist/core/session/direct_bash.js.map +1 -1
- package/dist/core/session/runner.js +6 -1
- package/dist/core/session/runner.js.map +1 -1
- package/dist/core/static/code_mode/history/documentation.md +3 -3
- package/dist/core/static/code_mode/nook/documentation.md +6 -4
- package/dist/core/static/code_mode/web/documentation.md +3 -3
- package/dist/core/tools/bash.js +80 -63
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/code_mode.js +45 -12
- package/dist/core/tools/code_mode.js.map +1 -1
- package/dist/core/tools/edit.js +72 -84
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/goal.js +97 -16
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/history.js +13 -15
- package/dist/core/tools/history.js.map +1 -1
- package/dist/core/tools/interrupt_agent.js +56 -37
- package/dist/core/tools/interrupt_agent.js.map +1 -1
- package/dist/core/tools/list_agents.js +28 -13
- package/dist/core/tools/list_agents.js.map +1 -1
- package/dist/core/tools/nook.js +15 -15
- package/dist/core/tools/nook.js.map +1 -1
- package/dist/core/tools/presentation.js +226 -0
- package/dist/core/tools/presentation.js.map +1 -0
- package/dist/core/tools/registry.js.map +1 -1
- package/dist/core/tools/send_input_to_agent.js +57 -47
- package/dist/core/tools/send_input_to_agent.js.map +1 -1
- package/dist/core/tools/spawn_agent.js +81 -52
- package/dist/core/tools/spawn_agent.js.map +1 -1
- package/dist/core/tools/subagent_ui.js +14 -38
- package/dist/core/tools/subagent_ui.js.map +1 -1
- package/dist/core/tools/view_image.js +45 -45
- package/dist/core/tools/view_image.js.map +1 -1
- package/dist/core/tools/wait_for_agents.js +94 -56
- package/dist/core/tools/wait_for_agents.js.map +1 -1
- package/dist/core/tools/web.js +11 -13
- package/dist/core/tools/web.js.map +1 -1
- package/dist/core/tools/write.js +41 -39
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/utils/gemini_speech.js +1 -1
- package/dist/core/utils/gemini_speech.js.map +1 -1
- package/dist/core/utils/subagent_utils.js +3 -3
- package/dist/core/utils/subagent_utils.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/execution/cloudflare_sandbox_execution_environment.js +1 -1
- package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
- package/dist/history/worker/index.js +149 -192
- package/dist/history/worker/index.js.map +1 -1
- package/dist/host/client_tool_broker.js +29 -31
- package/dist/host/client_tool_broker.js.map +1 -1
- package/dist/host/local_session_host.js +11 -5
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/main.js +6 -6
- package/dist/main.js.map +1 -1
- package/dist/tui/chat_controller/diff_review_service.js +1 -1
- package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
- package/dist/tui/chat_controller/history_labels.js +13 -0
- package/dist/tui/chat_controller/history_labels.js.map +1 -1
- package/dist/tui/chat_view.js +24 -50
- package/dist/tui/chat_view.js.map +1 -1
- package/dist/tui/session_chat_app.js +3 -4
- package/dist/tui/session_chat_app.js.map +1 -1
- package/dist/tui/session_chat_controller.js +80 -111
- package/dist/tui/session_chat_controller.js.map +1 -1
- package/dist/tui/terminal_appearance.js +44 -25
- package/dist/tui/terminal_appearance.js.map +1 -1
- package/dist/tui/ui/autocomplete_item.js +2 -0
- package/dist/tui/ui/autocomplete_item.js.map +1 -0
- package/dist/tui/ui/chat_container.js +1 -14
- package/dist/tui/ui/chat_container.js.map +1 -1
- package/dist/tui/ui/chat_message_model.js +4 -12
- package/dist/tui/ui/chat_message_model.js.map +1 -1
- package/dist/tui/ui/components/autocomplete_list.js +138 -0
- package/dist/tui/ui/components/autocomplete_list.js.map +1 -0
- package/dist/tui/ui/components/editor.js +33 -40
- package/dist/tui/ui/components/editor.js.map +1 -1
- package/dist/tui/ui/components/one_line_segments.js +0 -67
- package/dist/tui/ui/components/one_line_segments.js.map +1 -1
- package/dist/tui/ui/custom_editor.js +15 -11
- package/dist/tui/ui/custom_editor.js.map +1 -1
- package/dist/tui/ui/diff_review_message.js +1 -11
- package/dist/tui/ui/diff_review_message.js.map +1 -1
- package/dist/tui/ui/footer.js +63 -13
- package/dist/tui/ui/footer.js.map +1 -1
- package/dist/tui/ui/rewind_picker.js +17 -47
- package/dist/tui/ui/rewind_picker.js.map +1 -1
- package/dist/tui/ui/slash_autocomplete.js +43 -64
- package/dist/tui/ui/slash_autocomplete.js.map +1 -1
- package/dist/tui/ui/subagent_editor_pane.js +3 -3
- package/dist/tui/ui/theme/index.js +1 -1
- package/dist/tui/ui/theme/index.js.map +1 -1
- package/dist/tui/ui/theme/palette.js +245 -8
- package/dist/tui/ui/theme/palette.js.map +1 -1
- package/dist/tui/ui/theme/theme.js +3 -30
- package/dist/tui/ui/theme/theme.js.map +1 -1
- package/dist/tui/ui/tool_card.js +137 -0
- package/dist/tui/ui/tool_card.js.map +1 -0
- package/dist/tui/ui/user_message.js +3 -6
- package/dist/tui/ui/user_message.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/utils/tool_preview.js +0 -73
- package/dist/core/utils/tool_preview.js.map +0 -1
- package/dist/tui/chat_controller/command_hints.js +0 -35
- package/dist/tui/chat_controller/command_hints.js.map +0 -1
- package/dist/tui/ui/bash_execution.js +0 -129
- package/dist/tui/ui/bash_execution.js.map +0 -1
- package/dist/tui/ui/components/dynamic_border.js +0 -11
- package/dist/tui/ui/components/dynamic_border.js.map +0 -1
- package/dist/tui/ui/components/header_box.js +0 -107
- package/dist/tui/ui/components/header_box.js.map +0 -1
- package/dist/tui/ui/components/header_line.js +0 -60
- package/dist/tui/ui/components/header_line.js.map +0 -1
- package/dist/tui/ui/components/padded_container.js +0 -24
- package/dist/tui/ui/components/padded_container.js.map +0 -1
- package/dist/tui/ui/file_execution.js +0 -176
- package/dist/tui/ui/file_execution.js.map +0 -1
- package/dist/tui/ui/tool_output.js +0 -163
- package/dist/tui/ui/tool_output.js.map +0 -1
- package/dist/tui/ui/tool_ui_registry.js +0 -786
- package/dist/tui/ui/tool_ui_registry.js.map +0 -1
|
@@ -3,13 +3,13 @@ import { AssistantMessageComponent } from "./assistant_message.js";
|
|
|
3
3
|
import { DiffReviewMessageComponent } from "./diff_review_message.js";
|
|
4
4
|
import { SessionDividerComponent } from "./session_divider.js";
|
|
5
5
|
import { SystemMessageComponent } from "./system_message.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ToolCardComponent } from "./tool_card.js";
|
|
7
7
|
import { UserMessageComponent } from "./user_message.js";
|
|
8
8
|
export function isAssistantMessageModel(model) {
|
|
9
9
|
return model.type === "assistant" || model.type === "assistant_partial";
|
|
10
10
|
}
|
|
11
11
|
export function renderChatMessage(model, options) {
|
|
12
|
-
const { theme, thoughtsVisible
|
|
12
|
+
const { theme, thoughtsVisible } = options;
|
|
13
13
|
switch (model.type) {
|
|
14
14
|
case "app_intro": {
|
|
15
15
|
const component = new AppIntroComponent(theme, {
|
|
@@ -107,22 +107,14 @@ export function renderChatMessage(model, options) {
|
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
109
|
case "tool": {
|
|
110
|
-
const
|
|
111
|
-
theme,
|
|
112
|
-
compact: compactToolUi,
|
|
113
|
-
});
|
|
114
|
-
const component = renderToolOutput(view, compactToolUi);
|
|
110
|
+
const component = new ToolCardComponent({ model: model.tool, theme });
|
|
115
111
|
return {
|
|
116
112
|
component,
|
|
117
113
|
isAssistant: false,
|
|
118
114
|
update: (nextModel, nextOptions) => {
|
|
119
115
|
if (nextModel.type !== "tool")
|
|
120
116
|
return false;
|
|
121
|
-
|
|
122
|
-
theme: nextOptions.theme,
|
|
123
|
-
compact: nextOptions.compactToolUi,
|
|
124
|
-
});
|
|
125
|
-
component.update(buildToolOutputProps(nextView, nextOptions.compactToolUi));
|
|
117
|
+
component.update({ model: nextModel.tool, theme: nextOptions.theme });
|
|
126
118
|
return true;
|
|
127
119
|
},
|
|
128
120
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_message_model.js","sourceRoot":"","sources":["../../../src/tui/ui/chat_message_model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAA8B,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAA+B,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAA4B,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"chat_message_model.js","sourceRoot":"","sources":["../../../src/tui/ui/chat_message_model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { getKeybindings, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
|
|
2
|
+
import stripAnsi from "strip-ansi";
|
|
3
|
+
const DEFAULT_PRIMARY_COLUMN_WIDTH = 32;
|
|
4
|
+
const PRIMARY_COLUMN_GAP = 2;
|
|
5
|
+
const MIN_DESCRIPTION_WIDTH = 10;
|
|
6
|
+
function normalizeToSingleLine(text) {
|
|
7
|
+
return text.replace(/[\r\n]+/g, " ").trim();
|
|
8
|
+
}
|
|
9
|
+
function clamp(value, min, max) {
|
|
10
|
+
return Math.max(min, Math.min(value, max));
|
|
11
|
+
}
|
|
12
|
+
export class AutocompleteList {
|
|
13
|
+
maxVisible;
|
|
14
|
+
theme;
|
|
15
|
+
layout;
|
|
16
|
+
items;
|
|
17
|
+
selectedIndex = 0;
|
|
18
|
+
onSelect;
|
|
19
|
+
onCancel;
|
|
20
|
+
constructor(items, maxVisible, theme, layout = {}) {
|
|
21
|
+
this.maxVisible = maxVisible;
|
|
22
|
+
this.theme = theme;
|
|
23
|
+
this.layout = layout;
|
|
24
|
+
this.items = items;
|
|
25
|
+
}
|
|
26
|
+
setSelectedIndex(index) {
|
|
27
|
+
this.selectedIndex = Math.max(0, Math.min(index, this.items.length - 1));
|
|
28
|
+
}
|
|
29
|
+
getSelectedItem() {
|
|
30
|
+
return this.items[this.selectedIndex] ?? null;
|
|
31
|
+
}
|
|
32
|
+
handleInput(data) {
|
|
33
|
+
const keybindings = getKeybindings();
|
|
34
|
+
if (keybindings.matches(data, "tui.select.up")) {
|
|
35
|
+
this.selectedIndex =
|
|
36
|
+
this.selectedIndex === 0 ? this.items.length - 1 : this.selectedIndex - 1;
|
|
37
|
+
}
|
|
38
|
+
else if (keybindings.matches(data, "tui.select.down")) {
|
|
39
|
+
this.selectedIndex =
|
|
40
|
+
this.selectedIndex === this.items.length - 1 ? 0 : this.selectedIndex + 1;
|
|
41
|
+
}
|
|
42
|
+
else if (keybindings.matches(data, "tui.select.confirm")) {
|
|
43
|
+
const selected = this.getSelectedItem();
|
|
44
|
+
if (selected)
|
|
45
|
+
this.onSelect?.(selected);
|
|
46
|
+
}
|
|
47
|
+
else if (keybindings.matches(data, "tui.select.cancel")) {
|
|
48
|
+
this.onCancel?.();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
invalidate() { }
|
|
52
|
+
render(width) {
|
|
53
|
+
if (width <= 0)
|
|
54
|
+
return [""];
|
|
55
|
+
if (this.items.length === 0) {
|
|
56
|
+
return [this.theme.noMatch(" No matching commands")];
|
|
57
|
+
}
|
|
58
|
+
const primaryColumnWidth = this.getPrimaryColumnWidth();
|
|
59
|
+
const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.items.length - this.maxVisible));
|
|
60
|
+
const endIndex = Math.min(startIndex + this.maxVisible, this.items.length);
|
|
61
|
+
const lines = [];
|
|
62
|
+
for (let index = startIndex; index < endIndex; index++) {
|
|
63
|
+
const item = this.items[index];
|
|
64
|
+
if (!item)
|
|
65
|
+
continue;
|
|
66
|
+
lines.push(this.renderItem(item, index === this.selectedIndex, width, primaryColumnWidth));
|
|
67
|
+
}
|
|
68
|
+
if (startIndex > 0 || endIndex < this.items.length) {
|
|
69
|
+
const scrollText = ` (${this.selectedIndex + 1}/${this.items.length})`;
|
|
70
|
+
lines.push(this.theme.scrollInfo(truncateToWidth(scrollText, Math.max(0, width - 2), "")));
|
|
71
|
+
}
|
|
72
|
+
return lines;
|
|
73
|
+
}
|
|
74
|
+
renderItem(item, selected, width, primaryColumnWidth) {
|
|
75
|
+
const prefix = " ";
|
|
76
|
+
const prefixWidth = 1;
|
|
77
|
+
const description = item.description ? normalizeToSingleLine(item.description) : undefined;
|
|
78
|
+
let line;
|
|
79
|
+
let lineWidth;
|
|
80
|
+
if (description && width > (this.layout.descriptionBreakpoint ?? 40)) {
|
|
81
|
+
const effectivePrimaryColumnWidth = Math.max(1, Math.min(primaryColumnWidth, width - prefixWidth - 4));
|
|
82
|
+
const maxPrimaryWidth = Math.max(1, effectivePrimaryColumnWidth - PRIMARY_COLUMN_GAP);
|
|
83
|
+
const primary = this.truncatePrimary(item, selected, maxPrimaryWidth, effectivePrimaryColumnWidth);
|
|
84
|
+
const spacing = " ".repeat(Math.max(1, effectivePrimaryColumnWidth - visibleWidth(primary)));
|
|
85
|
+
const remainingWidth = width - prefixWidth - visibleWidth(primary) - spacing.length - 1;
|
|
86
|
+
if (remainingWidth > (this.layout.minDescriptionWidth ?? MIN_DESCRIPTION_WIDTH)) {
|
|
87
|
+
const truncatedDescription = stripAnsi(truncateToWidth(description, remainingWidth, ""));
|
|
88
|
+
line = selected
|
|
89
|
+
? `${prefix}${primary}${spacing}${truncatedDescription}`
|
|
90
|
+
: `${prefix}${this.stylePrimary(primary)}${this.styleDescription(spacing + truncatedDescription)}`;
|
|
91
|
+
lineWidth =
|
|
92
|
+
prefixWidth + visibleWidth(primary) + spacing.length + visibleWidth(truncatedDescription);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const primaryOnly = this.truncatePrimary(item, selected, width - prefixWidth - 1, width);
|
|
96
|
+
line = `${prefix}${selected ? primaryOnly : this.stylePrimary(primaryOnly)}`;
|
|
97
|
+
lineWidth = prefixWidth + visibleWidth(primaryOnly);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const primaryOnly = this.truncatePrimary(item, selected, width - prefixWidth - 1, width);
|
|
102
|
+
line = `${prefix}${selected ? primaryOnly : this.stylePrimary(primaryOnly)}`;
|
|
103
|
+
lineWidth = prefixWidth + visibleWidth(primaryOnly);
|
|
104
|
+
}
|
|
105
|
+
if (!selected)
|
|
106
|
+
return line;
|
|
107
|
+
const padded = `${line}${" ".repeat(Math.max(0, width - lineWidth))}`;
|
|
108
|
+
return this.theme.selectedBackground(this.theme.selectedForeground(padded));
|
|
109
|
+
}
|
|
110
|
+
stylePrimary(text) {
|
|
111
|
+
return this.layout.primaryTone === "muted" ? this.theme.description(text) : text;
|
|
112
|
+
}
|
|
113
|
+
styleDescription(text) {
|
|
114
|
+
return (this.layout.descriptionTone ?? "muted") === "muted"
|
|
115
|
+
? this.theme.description(text)
|
|
116
|
+
: text;
|
|
117
|
+
}
|
|
118
|
+
getPrimaryColumnWidth() {
|
|
119
|
+
const rawMin = this.layout.minPrimaryColumnWidth ??
|
|
120
|
+
this.layout.maxPrimaryColumnWidth ??
|
|
121
|
+
DEFAULT_PRIMARY_COLUMN_WIDTH;
|
|
122
|
+
const rawMax = this.layout.maxPrimaryColumnWidth ??
|
|
123
|
+
this.layout.minPrimaryColumnWidth ??
|
|
124
|
+
DEFAULT_PRIMARY_COLUMN_WIDTH;
|
|
125
|
+
const min = Math.max(1, Math.min(rawMin, rawMax));
|
|
126
|
+
const max = Math.max(1, Math.max(rawMin, rawMax));
|
|
127
|
+
const widest = this.items.reduce((current, item) => Math.max(current, visibleWidth(item.label || item.value) + PRIMARY_COLUMN_GAP), 0);
|
|
128
|
+
return clamp(widest, min, max);
|
|
129
|
+
}
|
|
130
|
+
truncatePrimary(item, selected, maxWidth, columnWidth) {
|
|
131
|
+
const text = item.label || item.value;
|
|
132
|
+
const truncated = this.layout.truncatePrimary
|
|
133
|
+
? this.layout.truncatePrimary({ text, maxWidth, columnWidth, item, isSelected: selected })
|
|
134
|
+
: truncateToWidth(text, maxWidth, "");
|
|
135
|
+
return stripAnsi(truncateToWidth(truncated, maxWidth, ""));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=autocomplete_list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete_list.js","sourceRoot":"","sources":["../../../../src/tui/ui/components/autocomplete_list.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAGd,eAAe,EACf,YAAY,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AACxC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAiBjC,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,OAAO,gBAAgB;IASR,UAAU;IACV,KAAK;IACL,MAAM;IAVR,KAAK,CAAe;IAC7B,aAAa,GAAG,CAAC,CAAC;IAEnB,QAAQ,CAA8B;IACtC,QAAQ,CAAc;IAE7B,YACE,KAAmB,EACF,UAAkB,EAClB,KAA4B,EAC5B,MAAM,GAAkC,EAAE;0BAF1C,UAAU;qBACV,KAAK;sBACL,MAAM;QAEvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;IAChD,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,aAAa;gBAChB,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,aAAa;gBAChB,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,UAAU,KAAU,CAAC;IAErB,MAAM,CAAC,KAAa;QAClB,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,IAAI,CAAC,GAAG,CACN,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EACpD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CACpC,CACF,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,IAAI,KAAK,GAAG,UAAU,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAChB,IAAgB,EAChB,QAAiB,EACjB,KAAa,EACb,kBAA0B;QAE1B,MAAM,MAAM,GAAG,GAAG,CAAC;QACnB,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3F,IAAI,IAAY,CAAC;QACjB,IAAI,SAAiB,CAAC;QAEtB,IAAI,WAAW,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC,EAAE,CAAC;YACrE,MAAM,2BAA2B,GAAG,IAAI,CAAC,GAAG,CAC1C,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CACtD,CAAC;YACF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,GAAG,kBAAkB,CAAC,CAAC;YACtF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAClC,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,2BAA2B,CAC5B,CAAC;YACF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,2BAA2B,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7F,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAExF,IAAI,cAAc,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,EAAE,CAAC;gBAChF,MAAM,oBAAoB,GAAG,SAAS,CAAC,eAAe,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBACzF,IAAI,GAAG,QAAQ;oBACb,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,oBAAoB,EAAE;oBACxD,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,oBAAoB,CAAC,EAAE,CAAC;gBACrG,SAAS;oBACP,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,CAAC;YAC9F,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBACzF,IAAI,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7E,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACzF,IAAI,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7E,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnF,CAAC;IAEO,gBAAgB,CAAC,IAAY;QACnC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC,KAAK,OAAO;YACzD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAEO,qBAAqB;QAC3B,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACjC,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACjC,4BAA4B,CAAC;QAC/B,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACjC,IAAI,CAAC,MAAM,CAAC,qBAAqB;YACjC,4BAA4B,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC9B,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAChB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,kBAAkB,CAAC,EAChF,CAAC,CACF,CAAC;QACF,OAAO,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAEO,eAAe,CACrB,IAAgB,EAChB,QAAiB,EACjB,QAAgB,EAChB,WAAmB;QAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;YAC3C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;YAC1F,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,SAAS,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { decodeKittyPrintable, getKeybindings, matchesKey,
|
|
1
|
+
import { decodeKittyPrintable, getKeybindings, matchesKey, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
|
|
2
|
+
import { AutocompleteList } from "./autocomplete_list.js";
|
|
2
3
|
import { UndoStack } from "./undo_stack.js";
|
|
3
4
|
const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
4
5
|
const PASTE_MARKER_REGEX = /\[paste #(\d+)( (\+\d+ lines|\d+ chars))?\]/g;
|
|
@@ -10,12 +11,13 @@ const APC_PATTERN = "\\x1b_[^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)";
|
|
|
10
11
|
const CSI_REGEX = new RegExp(CSI_PATTERN, "g");
|
|
11
12
|
const OSC_REGEX = new RegExp(OSC_PATTERN, "g");
|
|
12
13
|
const APC_REGEX = new RegExp(APC_PATTERN, "g");
|
|
13
|
-
const
|
|
14
|
+
const AUTOCOMPLETE_LIST_LAYOUT = {
|
|
14
15
|
minPrimaryColumnWidth: 12,
|
|
15
16
|
maxPrimaryColumnWidth: 32,
|
|
16
17
|
truncatePrimary: ({ text, maxWidth }) => truncateToWidth(text, maxWidth, "…"),
|
|
17
18
|
};
|
|
18
19
|
const ATTACHMENT_AUTOCOMPLETE_DEBOUNCE_MS = 20;
|
|
20
|
+
const AUTOCOMPLETE_MAX_VISIBLE = 8;
|
|
19
21
|
function isWhitespaceChar(char) {
|
|
20
22
|
return /\s/.test(char);
|
|
21
23
|
}
|
|
@@ -404,8 +406,9 @@ export class Editor {
|
|
|
404
406
|
this.state.lines = result.lines;
|
|
405
407
|
this.state.cursorLine = result.cursorLine;
|
|
406
408
|
this.state.cursorCol = result.cursorCol;
|
|
407
|
-
const shouldRetrigger =
|
|
408
|
-
this.
|
|
409
|
+
const shouldRetrigger = selected.autocompleteAction === "navigate" ||
|
|
410
|
+
(this.autocompletePrefix.startsWith("@") &&
|
|
411
|
+
this.shouldRetriggerMentionAutocomplete(result.lines, result.cursorLine, result.cursorCol));
|
|
409
412
|
this.cancelAutocomplete();
|
|
410
413
|
if (this.onChange)
|
|
411
414
|
this.onChange(this.getText());
|
|
@@ -424,13 +427,17 @@ export class Editor {
|
|
|
424
427
|
this.state.lines = result.lines;
|
|
425
428
|
this.state.cursorLine = result.cursorLine;
|
|
426
429
|
this.state.cursorCol = result.cursorCol;
|
|
427
|
-
|
|
430
|
+
const autocompleteAction = selected.autocompleteAction;
|
|
431
|
+
const shouldSubmit = autocompleteAction === "submit" ||
|
|
432
|
+
(autocompleteAction !== "navigate" && this.autocompletePrefix.startsWith("/"));
|
|
433
|
+
if (shouldSubmit) {
|
|
428
434
|
this.cancelAutocomplete();
|
|
429
435
|
// Fall through to submit
|
|
430
436
|
}
|
|
431
437
|
else {
|
|
432
|
-
const shouldRetrigger =
|
|
433
|
-
this.
|
|
438
|
+
const shouldRetrigger = autocompleteAction === "navigate" ||
|
|
439
|
+
(this.autocompletePrefix.startsWith("@") &&
|
|
440
|
+
this.shouldRetriggerMentionAutocomplete(result.lines, result.cursorLine, result.cursorCol));
|
|
434
441
|
this.cancelAutocomplete();
|
|
435
442
|
if (this.onChange)
|
|
436
443
|
this.onChange(this.getText());
|
|
@@ -862,21 +869,7 @@ export class Editor {
|
|
|
862
869
|
if (this.onChange) {
|
|
863
870
|
this.onChange(this.getText());
|
|
864
871
|
}
|
|
865
|
-
|
|
866
|
-
if (this.autocompleteState) {
|
|
867
|
-
this.updateAutocomplete();
|
|
868
|
-
}
|
|
869
|
-
else {
|
|
870
|
-
// If autocomplete was cancelled (no matches), re-trigger if we're in a completable context
|
|
871
|
-
const currentLine = this.state.lines[this.state.cursorLine] || "";
|
|
872
|
-
const textBeforeCursor = currentLine.slice(0, this.state.cursorCol);
|
|
873
|
-
if (this.isInSlashCommandContext(textBeforeCursor)) {
|
|
874
|
-
this.tryTriggerAutocomplete();
|
|
875
|
-
}
|
|
876
|
-
else if (this.isMentionAutocompleteContext(textBeforeCursor)) {
|
|
877
|
-
this.tryTriggerAutocomplete();
|
|
878
|
-
}
|
|
879
|
-
}
|
|
872
|
+
this.refreshAutocompleteAfterEdit();
|
|
880
873
|
}
|
|
881
874
|
moveToLineStart() {
|
|
882
875
|
this.lastAction = null;
|
|
@@ -909,6 +902,7 @@ export class Editor {
|
|
|
909
902
|
if (this.onChange) {
|
|
910
903
|
this.onChange(this.getText());
|
|
911
904
|
}
|
|
905
|
+
this.refreshAutocompleteAfterEdit();
|
|
912
906
|
}
|
|
913
907
|
deleteToEndOfLine() {
|
|
914
908
|
this.historyIndex = -1; // Exit history browsing mode
|
|
@@ -929,6 +923,7 @@ export class Editor {
|
|
|
929
923
|
if (this.onChange) {
|
|
930
924
|
this.onChange(this.getText());
|
|
931
925
|
}
|
|
926
|
+
this.refreshAutocompleteAfterEdit();
|
|
932
927
|
}
|
|
933
928
|
deleteWordBackwards() {
|
|
934
929
|
this.historyIndex = -1; // Exit history browsing mode
|
|
@@ -958,6 +953,7 @@ export class Editor {
|
|
|
958
953
|
if (this.onChange) {
|
|
959
954
|
this.onChange(this.getText());
|
|
960
955
|
}
|
|
956
|
+
this.refreshAutocompleteAfterEdit();
|
|
961
957
|
}
|
|
962
958
|
handleForwardDelete() {
|
|
963
959
|
this.historyIndex = -1; // Exit history browsing mode
|
|
@@ -985,20 +981,7 @@ export class Editor {
|
|
|
985
981
|
if (this.onChange) {
|
|
986
982
|
this.onChange(this.getText());
|
|
987
983
|
}
|
|
988
|
-
|
|
989
|
-
if (this.autocompleteState) {
|
|
990
|
-
this.updateAutocomplete();
|
|
991
|
-
}
|
|
992
|
-
else {
|
|
993
|
-
const currentLine = this.state.lines[this.state.cursorLine] || "";
|
|
994
|
-
const textBeforeCursor = currentLine.slice(0, this.state.cursorCol);
|
|
995
|
-
if (this.isInSlashCommandContext(textBeforeCursor)) {
|
|
996
|
-
this.tryTriggerAutocomplete();
|
|
997
|
-
}
|
|
998
|
-
else if (this.isMentionAutocompleteContext(textBeforeCursor)) {
|
|
999
|
-
this.tryTriggerAutocomplete();
|
|
1000
|
-
}
|
|
1001
|
-
}
|
|
984
|
+
this.refreshAutocompleteAfterEdit();
|
|
1002
985
|
}
|
|
1003
986
|
/**
|
|
1004
987
|
* Build a mapping from visual lines to logical positions.
|
|
@@ -1271,7 +1254,7 @@ export class Editor {
|
|
|
1271
1254
|
return firstPrefixIndex;
|
|
1272
1255
|
}
|
|
1273
1256
|
createAutocompleteList(_prefix, items) {
|
|
1274
|
-
return new
|
|
1257
|
+
return new AutocompleteList(items, AUTOCOMPLETE_MAX_VISIBLE, this.theme.selectList, AUTOCOMPLETE_LIST_LAYOUT);
|
|
1275
1258
|
}
|
|
1276
1259
|
tryTriggerAutocomplete(explicitTab = false) {
|
|
1277
1260
|
this.requestAutocomplete({ force: false, explicitTab });
|
|
@@ -1413,6 +1396,18 @@ export class Editor {
|
|
|
1413
1396
|
isShowingAutocomplete() {
|
|
1414
1397
|
return this.autocompleteState !== null;
|
|
1415
1398
|
}
|
|
1399
|
+
refreshAutocompleteAfterEdit() {
|
|
1400
|
+
if (this.autocompleteState) {
|
|
1401
|
+
this.updateAutocomplete();
|
|
1402
|
+
return;
|
|
1403
|
+
}
|
|
1404
|
+
const currentLine = this.state.lines[this.state.cursorLine] || "";
|
|
1405
|
+
const textBeforeCursor = currentLine.slice(0, this.state.cursorCol);
|
|
1406
|
+
if (this.isInSlashCommandContext(textBeforeCursor) ||
|
|
1407
|
+
this.isMentionAutocompleteContext(textBeforeCursor)) {
|
|
1408
|
+
this.tryTriggerAutocomplete();
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1416
1411
|
updateAutocomplete() {
|
|
1417
1412
|
if (!this.autocompleteState || !this.autocompleteProvider)
|
|
1418
1413
|
return;
|
|
@@ -1431,9 +1426,7 @@ export class Editor {
|
|
|
1431
1426
|
if (this.onChange) {
|
|
1432
1427
|
this.onChange(this.getText());
|
|
1433
1428
|
}
|
|
1434
|
-
|
|
1435
|
-
this.updateAutocomplete();
|
|
1436
|
-
}
|
|
1429
|
+
this.refreshAutocompleteAfterEdit();
|
|
1437
1430
|
}
|
|
1438
1431
|
}
|
|
1439
1432
|
//# sourceMappingURL=editor.js.map
|