@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.
Files changed (138) hide show
  1. package/README.md +34 -38
  2. package/dist/core/agent/agent_runtime.js +0 -22
  3. package/dist/core/agent/agent_runtime.js.map +1 -1
  4. package/dist/core/cli.js +2 -2
  5. package/dist/core/cli.js.map +1 -1
  6. package/dist/core/commands/registry.js +22 -20
  7. package/dist/core/commands/registry.js.map +1 -1
  8. package/dist/core/config/builtin_themes.js +936 -998
  9. package/dist/core/config/builtin_themes.js.map +1 -1
  10. package/dist/core/history/migrations.js +57 -0
  11. package/dist/core/history/migrations.js.map +1 -0
  12. package/dist/core/history/setup.js +18 -0
  13. package/dist/core/history/setup.js.map +1 -1
  14. package/dist/core/personas.js +8 -53
  15. package/dist/core/personas.js.map +1 -1
  16. package/dist/core/runtime/chat_runtime.js +0 -6
  17. package/dist/core/runtime/chat_runtime.js.map +1 -1
  18. package/dist/core/session/direct_bash.js +8 -8
  19. package/dist/core/session/direct_bash.js.map +1 -1
  20. package/dist/core/session/runner.js +6 -1
  21. package/dist/core/session/runner.js.map +1 -1
  22. package/dist/core/static/code_mode/history/documentation.md +3 -3
  23. package/dist/core/static/code_mode/nook/documentation.md +6 -4
  24. package/dist/core/static/code_mode/web/documentation.md +3 -3
  25. package/dist/core/tools/bash.js +80 -63
  26. package/dist/core/tools/bash.js.map +1 -1
  27. package/dist/core/tools/code_mode.js +45 -12
  28. package/dist/core/tools/code_mode.js.map +1 -1
  29. package/dist/core/tools/edit.js +72 -84
  30. package/dist/core/tools/edit.js.map +1 -1
  31. package/dist/core/tools/goal.js +97 -16
  32. package/dist/core/tools/goal.js.map +1 -1
  33. package/dist/core/tools/history.js +13 -15
  34. package/dist/core/tools/history.js.map +1 -1
  35. package/dist/core/tools/interrupt_agent.js +56 -37
  36. package/dist/core/tools/interrupt_agent.js.map +1 -1
  37. package/dist/core/tools/list_agents.js +28 -13
  38. package/dist/core/tools/list_agents.js.map +1 -1
  39. package/dist/core/tools/nook.js +15 -15
  40. package/dist/core/tools/nook.js.map +1 -1
  41. package/dist/core/tools/presentation.js +226 -0
  42. package/dist/core/tools/presentation.js.map +1 -0
  43. package/dist/core/tools/registry.js.map +1 -1
  44. package/dist/core/tools/send_input_to_agent.js +57 -47
  45. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  46. package/dist/core/tools/spawn_agent.js +81 -52
  47. package/dist/core/tools/spawn_agent.js.map +1 -1
  48. package/dist/core/tools/subagent_ui.js +14 -38
  49. package/dist/core/tools/subagent_ui.js.map +1 -1
  50. package/dist/core/tools/view_image.js +45 -45
  51. package/dist/core/tools/view_image.js.map +1 -1
  52. package/dist/core/tools/wait_for_agents.js +94 -56
  53. package/dist/core/tools/wait_for_agents.js.map +1 -1
  54. package/dist/core/tools/web.js +11 -13
  55. package/dist/core/tools/web.js.map +1 -1
  56. package/dist/core/tools/write.js +41 -39
  57. package/dist/core/tools/write.js.map +1 -1
  58. package/dist/core/utils/gemini_speech.js +1 -1
  59. package/dist/core/utils/gemini_speech.js.map +1 -1
  60. package/dist/core/utils/subagent_utils.js +3 -3
  61. package/dist/core/utils/subagent_utils.js.map +1 -1
  62. package/dist/core/version.js +1 -1
  63. package/dist/execution/cloudflare_sandbox_execution_environment.js +1 -1
  64. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
  65. package/dist/history/worker/index.js +149 -192
  66. package/dist/history/worker/index.js.map +1 -1
  67. package/dist/host/client_tool_broker.js +29 -31
  68. package/dist/host/client_tool_broker.js.map +1 -1
  69. package/dist/host/local_session_host.js +11 -5
  70. package/dist/host/local_session_host.js.map +1 -1
  71. package/dist/main.js +6 -6
  72. package/dist/main.js.map +1 -1
  73. package/dist/tui/chat_controller/diff_review_service.js +1 -1
  74. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  75. package/dist/tui/chat_controller/history_labels.js +13 -0
  76. package/dist/tui/chat_controller/history_labels.js.map +1 -1
  77. package/dist/tui/chat_view.js +24 -50
  78. package/dist/tui/chat_view.js.map +1 -1
  79. package/dist/tui/session_chat_app.js +3 -4
  80. package/dist/tui/session_chat_app.js.map +1 -1
  81. package/dist/tui/session_chat_controller.js +80 -111
  82. package/dist/tui/session_chat_controller.js.map +1 -1
  83. package/dist/tui/terminal_appearance.js +44 -25
  84. package/dist/tui/terminal_appearance.js.map +1 -1
  85. package/dist/tui/ui/autocomplete_item.js +2 -0
  86. package/dist/tui/ui/autocomplete_item.js.map +1 -0
  87. package/dist/tui/ui/chat_container.js +1 -14
  88. package/dist/tui/ui/chat_container.js.map +1 -1
  89. package/dist/tui/ui/chat_message_model.js +4 -12
  90. package/dist/tui/ui/chat_message_model.js.map +1 -1
  91. package/dist/tui/ui/components/autocomplete_list.js +138 -0
  92. package/dist/tui/ui/components/autocomplete_list.js.map +1 -0
  93. package/dist/tui/ui/components/editor.js +33 -40
  94. package/dist/tui/ui/components/editor.js.map +1 -1
  95. package/dist/tui/ui/components/one_line_segments.js +0 -67
  96. package/dist/tui/ui/components/one_line_segments.js.map +1 -1
  97. package/dist/tui/ui/custom_editor.js +15 -11
  98. package/dist/tui/ui/custom_editor.js.map +1 -1
  99. package/dist/tui/ui/diff_review_message.js +1 -11
  100. package/dist/tui/ui/diff_review_message.js.map +1 -1
  101. package/dist/tui/ui/footer.js +63 -13
  102. package/dist/tui/ui/footer.js.map +1 -1
  103. package/dist/tui/ui/rewind_picker.js +17 -47
  104. package/dist/tui/ui/rewind_picker.js.map +1 -1
  105. package/dist/tui/ui/slash_autocomplete.js +43 -64
  106. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  107. package/dist/tui/ui/subagent_editor_pane.js +3 -3
  108. package/dist/tui/ui/theme/index.js +1 -1
  109. package/dist/tui/ui/theme/index.js.map +1 -1
  110. package/dist/tui/ui/theme/palette.js +245 -8
  111. package/dist/tui/ui/theme/palette.js.map +1 -1
  112. package/dist/tui/ui/theme/theme.js +3 -30
  113. package/dist/tui/ui/theme/theme.js.map +1 -1
  114. package/dist/tui/ui/tool_card.js +137 -0
  115. package/dist/tui/ui/tool_card.js.map +1 -0
  116. package/dist/tui/ui/user_message.js +3 -6
  117. package/dist/tui/ui/user_message.js.map +1 -1
  118. package/package.json +2 -2
  119. package/dist/core/utils/tool_preview.js +0 -73
  120. package/dist/core/utils/tool_preview.js.map +0 -1
  121. package/dist/tui/chat_controller/command_hints.js +0 -35
  122. package/dist/tui/chat_controller/command_hints.js.map +0 -1
  123. package/dist/tui/ui/bash_execution.js +0 -129
  124. package/dist/tui/ui/bash_execution.js.map +0 -1
  125. package/dist/tui/ui/components/dynamic_border.js +0 -11
  126. package/dist/tui/ui/components/dynamic_border.js.map +0 -1
  127. package/dist/tui/ui/components/header_box.js +0 -107
  128. package/dist/tui/ui/components/header_box.js.map +0 -1
  129. package/dist/tui/ui/components/header_line.js +0 -60
  130. package/dist/tui/ui/components/header_line.js.map +0 -1
  131. package/dist/tui/ui/components/padded_container.js +0 -24
  132. package/dist/tui/ui/components/padded_container.js.map +0 -1
  133. package/dist/tui/ui/file_execution.js +0 -176
  134. package/dist/tui/ui/file_execution.js.map +0 -1
  135. package/dist/tui/ui/tool_output.js +0 -163
  136. package/dist/tui/ui/tool_output.js.map +0 -1
  137. package/dist/tui/ui/tool_ui_registry.js +0 -786
  138. 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 { buildToolOutputProps, renderToolOutput } from "./tool_output.js";
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, compactToolUi, toolUiRegistry } = options;
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 view = toolUiRegistry.renderModel(model.tool, {
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
- const nextView = nextOptions.toolUiRegistry.renderModel(nextModel.tool, {
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":"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"}
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":"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"}
@@ -1,4 +1,5 @@
1
- import { decodeKittyPrintable, getKeybindings, matchesKey, SelectList, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
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 SELECT_LIST_LAYOUT = {
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 = this.autocompletePrefix.startsWith("@") &&
408
- this.shouldRetriggerMentionAutocomplete(result.lines, result.cursorLine, result.cursorCol);
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
- if (this.autocompletePrefix.startsWith("/")) {
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 = this.autocompletePrefix.startsWith("@") &&
433
- this.shouldRetriggerMentionAutocomplete(result.lines, result.cursorLine, result.cursorCol);
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
- // Update or re-trigger autocomplete after backspace
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
- // Update or re-trigger autocomplete after forward delete
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 SelectList(items, 5, this.theme.selectList, SELECT_LIST_LAYOUT);
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
- if (this.autocompleteState) {
1435
- this.updateAutocomplete();
1436
- }
1429
+ this.refreshAutocompleteAfterEdit();
1437
1430
  }
1438
1431
  }
1439
1432
  //# sourceMappingURL=editor.js.map