@markusylisiurunen/tau 0.3.40 → 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 (125) hide show
  1. package/README.md +29 -33
  2. package/dist/core/cli.js +2 -2
  3. package/dist/core/cli.js.map +1 -1
  4. package/dist/core/commands/registry.js +22 -20
  5. package/dist/core/commands/registry.js.map +1 -1
  6. package/dist/core/config/builtin_themes.js +936 -998
  7. package/dist/core/config/builtin_themes.js.map +1 -1
  8. package/dist/core/personas.js +8 -53
  9. package/dist/core/personas.js.map +1 -1
  10. package/dist/core/session/direct_bash.js +8 -8
  11. package/dist/core/session/direct_bash.js.map +1 -1
  12. package/dist/core/session/runner.js +6 -1
  13. package/dist/core/session/runner.js.map +1 -1
  14. package/dist/core/tools/bash.js +80 -63
  15. package/dist/core/tools/bash.js.map +1 -1
  16. package/dist/core/tools/code_mode.js +33 -12
  17. package/dist/core/tools/code_mode.js.map +1 -1
  18. package/dist/core/tools/edit.js +72 -84
  19. package/dist/core/tools/edit.js.map +1 -1
  20. package/dist/core/tools/goal.js +97 -16
  21. package/dist/core/tools/goal.js.map +1 -1
  22. package/dist/core/tools/history.js +3 -3
  23. package/dist/core/tools/history.js.map +1 -1
  24. package/dist/core/tools/interrupt_agent.js +56 -37
  25. package/dist/core/tools/interrupt_agent.js.map +1 -1
  26. package/dist/core/tools/list_agents.js +28 -13
  27. package/dist/core/tools/list_agents.js.map +1 -1
  28. package/dist/core/tools/nook.js +3 -3
  29. package/dist/core/tools/nook.js.map +1 -1
  30. package/dist/core/tools/presentation.js +226 -0
  31. package/dist/core/tools/presentation.js.map +1 -0
  32. package/dist/core/tools/registry.js.map +1 -1
  33. package/dist/core/tools/send_input_to_agent.js +57 -47
  34. package/dist/core/tools/send_input_to_agent.js.map +1 -1
  35. package/dist/core/tools/spawn_agent.js +81 -52
  36. package/dist/core/tools/spawn_agent.js.map +1 -1
  37. package/dist/core/tools/subagent_ui.js +14 -38
  38. package/dist/core/tools/subagent_ui.js.map +1 -1
  39. package/dist/core/tools/view_image.js +45 -45
  40. package/dist/core/tools/view_image.js.map +1 -1
  41. package/dist/core/tools/wait_for_agents.js +94 -56
  42. package/dist/core/tools/wait_for_agents.js.map +1 -1
  43. package/dist/core/tools/web.js +3 -3
  44. package/dist/core/tools/web.js.map +1 -1
  45. package/dist/core/tools/write.js +41 -39
  46. package/dist/core/tools/write.js.map +1 -1
  47. package/dist/core/utils/gemini_speech.js +1 -1
  48. package/dist/core/utils/gemini_speech.js.map +1 -1
  49. package/dist/core/utils/subagent_utils.js +3 -3
  50. package/dist/core/utils/subagent_utils.js.map +1 -1
  51. package/dist/core/version.js +1 -1
  52. package/dist/execution/cloudflare_sandbox_execution_environment.js +1 -1
  53. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
  54. package/dist/host/client_tool_broker.js +29 -31
  55. package/dist/host/client_tool_broker.js.map +1 -1
  56. package/dist/host/local_session_host.js +10 -4
  57. package/dist/host/local_session_host.js.map +1 -1
  58. package/dist/main.js +6 -6
  59. package/dist/main.js.map +1 -1
  60. package/dist/tui/chat_controller/diff_review_service.js +1 -1
  61. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  62. package/dist/tui/chat_controller/history_labels.js +13 -0
  63. package/dist/tui/chat_controller/history_labels.js.map +1 -1
  64. package/dist/tui/chat_view.js +24 -50
  65. package/dist/tui/chat_view.js.map +1 -1
  66. package/dist/tui/session_chat_app.js +3 -4
  67. package/dist/tui/session_chat_app.js.map +1 -1
  68. package/dist/tui/session_chat_controller.js +80 -111
  69. package/dist/tui/session_chat_controller.js.map +1 -1
  70. package/dist/tui/terminal_appearance.js +44 -25
  71. package/dist/tui/terminal_appearance.js.map +1 -1
  72. package/dist/tui/ui/autocomplete_item.js +2 -0
  73. package/dist/tui/ui/autocomplete_item.js.map +1 -0
  74. package/dist/tui/ui/chat_container.js +1 -14
  75. package/dist/tui/ui/chat_container.js.map +1 -1
  76. package/dist/tui/ui/chat_message_model.js +4 -12
  77. package/dist/tui/ui/chat_message_model.js.map +1 -1
  78. package/dist/tui/ui/components/autocomplete_list.js +138 -0
  79. package/dist/tui/ui/components/autocomplete_list.js.map +1 -0
  80. package/dist/tui/ui/components/editor.js +33 -40
  81. package/dist/tui/ui/components/editor.js.map +1 -1
  82. package/dist/tui/ui/components/one_line_segments.js +0 -67
  83. package/dist/tui/ui/components/one_line_segments.js.map +1 -1
  84. package/dist/tui/ui/custom_editor.js +15 -11
  85. package/dist/tui/ui/custom_editor.js.map +1 -1
  86. package/dist/tui/ui/diff_review_message.js +1 -11
  87. package/dist/tui/ui/diff_review_message.js.map +1 -1
  88. package/dist/tui/ui/footer.js +63 -13
  89. package/dist/tui/ui/footer.js.map +1 -1
  90. package/dist/tui/ui/rewind_picker.js +17 -47
  91. package/dist/tui/ui/rewind_picker.js.map +1 -1
  92. package/dist/tui/ui/slash_autocomplete.js +43 -64
  93. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  94. package/dist/tui/ui/subagent_editor_pane.js +3 -3
  95. package/dist/tui/ui/theme/index.js +1 -1
  96. package/dist/tui/ui/theme/index.js.map +1 -1
  97. package/dist/tui/ui/theme/palette.js +245 -8
  98. package/dist/tui/ui/theme/palette.js.map +1 -1
  99. package/dist/tui/ui/theme/theme.js +3 -30
  100. package/dist/tui/ui/theme/theme.js.map +1 -1
  101. package/dist/tui/ui/tool_card.js +137 -0
  102. package/dist/tui/ui/tool_card.js.map +1 -0
  103. package/dist/tui/ui/user_message.js +3 -6
  104. package/dist/tui/ui/user_message.js.map +1 -1
  105. package/package.json +2 -2
  106. package/dist/core/utils/tool_preview.js +0 -73
  107. package/dist/core/utils/tool_preview.js.map +0 -1
  108. package/dist/tui/chat_controller/command_hints.js +0 -35
  109. package/dist/tui/chat_controller/command_hints.js.map +0 -1
  110. package/dist/tui/ui/bash_execution.js +0 -129
  111. package/dist/tui/ui/bash_execution.js.map +0 -1
  112. package/dist/tui/ui/components/dynamic_border.js +0 -11
  113. package/dist/tui/ui/components/dynamic_border.js.map +0 -1
  114. package/dist/tui/ui/components/header_box.js +0 -107
  115. package/dist/tui/ui/components/header_box.js.map +0 -1
  116. package/dist/tui/ui/components/header_line.js +0 -60
  117. package/dist/tui/ui/components/header_line.js.map +0 -1
  118. package/dist/tui/ui/components/padded_container.js +0 -24
  119. package/dist/tui/ui/components/padded_container.js.map +0 -1
  120. package/dist/tui/ui/file_execution.js +0 -176
  121. package/dist/tui/ui/file_execution.js.map +0 -1
  122. package/dist/tui/ui/tool_output.js +0 -163
  123. package/dist/tui/ui/tool_output.js.map +0 -1
  124. package/dist/tui/ui/tool_ui_registry.js +0 -786
  125. 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