@gajae-code/coding-agent 0.12.0 → 0.12.1

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 (223) hide show
  1. package/CHANGELOG.md +82 -1
  2. package/dist/types/async/job-manager.d.ts +17 -3
  3. package/dist/types/config/settings-schema.d.ts +54 -0
  4. package/dist/types/exa/mcp-client.d.ts +10 -1
  5. package/dist/types/exec/bash-executor.d.ts +45 -12
  6. package/dist/types/extensibility/extensions/types.d.ts +16 -2
  7. package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
  8. package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
  9. package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
  10. package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
  11. package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
  12. package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
  13. package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
  14. package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
  15. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +18 -0
  16. package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
  17. package/dist/types/gjc-runtime/team-runtime.d.ts +25 -0
  18. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
  19. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +10 -0
  20. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
  21. package/dist/types/modes/acp/acp-agent.d.ts +2 -19
  22. package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
  23. package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
  24. package/dist/types/modes/components/session-observer-overlay.d.ts +18 -0
  25. package/dist/types/modes/components/settings-selector.d.ts +9 -0
  26. package/dist/types/modes/components/status-line/gh.d.ts +5 -0
  27. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
  28. package/dist/types/reminders/star-reminder.d.ts +3 -13
  29. package/dist/types/runtime-mcp/manager.d.ts +1 -0
  30. package/dist/types/sdk/acp/adapter.d.ts +3 -1
  31. package/dist/types/sdk/broker/transport.d.ts +2 -0
  32. package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
  33. package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
  34. package/dist/types/sdk/bus/config.d.ts +6 -2
  35. package/dist/types/sdk/bus/index.d.ts +29 -0
  36. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +8 -1
  37. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  38. package/dist/types/sdk/bus/reconciliation-store.d.ts +7 -3
  39. package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
  40. package/dist/types/sdk/bus/rich-render.d.ts +2 -0
  41. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
  42. package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
  43. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
  44. package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
  45. package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
  46. package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
  47. package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
  48. package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
  49. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  50. package/dist/types/sdk/prompt-status.d.ts +23 -3
  51. package/dist/types/sdk/session.d.ts +6 -0
  52. package/dist/types/session/agent-session.d.ts +38 -2
  53. package/dist/types/session/artifacts.d.ts +8 -0
  54. package/dist/types/session/blob-store.d.ts +57 -4
  55. package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
  56. package/dist/types/session/session-manager.d.ts +23 -6
  57. package/dist/types/session/session-storage.d.ts +4 -0
  58. package/dist/types/session/streaming-output.d.ts +36 -7
  59. package/dist/types/setup/credential-import.d.ts +12 -0
  60. package/dist/types/skill-state/active-state.d.ts +12 -0
  61. package/dist/types/skill-state/workflow-hud.d.ts +6 -0
  62. package/dist/types/task/executor.d.ts +3 -2
  63. package/dist/types/task/index.d.ts +3 -1
  64. package/dist/types/task/provider-retry-status.d.ts +8 -0
  65. package/dist/types/task/receipt.d.ts +7 -1
  66. package/dist/types/task/types.d.ts +23 -0
  67. package/dist/types/tools/ask-answer-registry.d.ts +2 -2
  68. package/dist/types/tools/bash-interactive.d.ts +4 -1
  69. package/dist/types/tools/bash.d.ts +3 -1
  70. package/dist/types/tools/image-gen.d.ts +4 -0
  71. package/dist/types/tools/index.d.ts +4 -0
  72. package/dist/types/tools/output-meta.d.ts +23 -2
  73. package/dist/types/tools/path-utils.d.ts +1 -0
  74. package/dist/types/tools/read.d.ts +0 -6
  75. package/dist/types/tools/review.d.ts +5 -7
  76. package/dist/types/tools/subagent.d.ts +2 -0
  77. package/dist/types/utils/gh.d.ts +13 -0
  78. package/dist/types/utils/image-resize.d.ts +1 -0
  79. package/dist/types/web/search/providers/kimi.d.ts +2 -0
  80. package/dist/types/web/search/providers/searxng.d.ts +7 -0
  81. package/dist/types/web/search/providers/xai.d.ts +2 -0
  82. package/package.json +10 -8
  83. package/scripts/acp-conformance-agent.ts +218 -0
  84. package/scripts/capture-gjc-bundle-settings.ts +306 -0
  85. package/scripts/generate-sdk-operation-inventory.ts +3 -0
  86. package/scripts/resident-memory-bench.ts +1341 -0
  87. package/scripts/run-acp-conformance.ts +285 -0
  88. package/src/async/job-manager.ts +78 -20
  89. package/src/cli/fast-help.ts +1 -1
  90. package/src/cli/plugin-cli.ts +176 -18
  91. package/src/commands/team.ts +19 -1
  92. package/src/config/file-lock.ts +11 -2
  93. package/src/config/settings-schema.ts +51 -0
  94. package/src/coordinator-mcp/question-gate-codec.ts +1 -1
  95. package/src/coordinator-mcp/server.ts +5 -12
  96. package/src/defaults/gjc/skills/deep-interview/SKILL.md +1 -0
  97. package/src/defaults/gjc/skills/ralplan/SKILL.md +19 -16
  98. package/src/defaults/gjc/skills/team/SKILL.md +2 -0
  99. package/src/defaults/gjc/skills/ultragoal/SKILL.md +37 -24
  100. package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
  101. package/src/defaults/gjc-defaults.ts +4 -4
  102. package/src/exa/mcp-client.ts +12 -3
  103. package/src/exec/bash-executor.ts +144 -27
  104. package/src/extensibility/extensions/runner.ts +15 -0
  105. package/src/extensibility/extensions/types.ts +18 -1
  106. package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
  107. package/src/extensibility/gjc-plugins/index.ts +19 -2
  108. package/src/extensibility/gjc-plugins/installer.ts +189 -50
  109. package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
  110. package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
  111. package/src/extensibility/gjc-plugins/observability.ts +3 -3
  112. package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
  113. package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
  114. package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
  115. package/src/extensibility/gjc-plugins/schema.ts +84 -12
  116. package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
  117. package/src/extensibility/gjc-plugins/types.ts +141 -0
  118. package/src/extensibility/gjc-plugins/validation.ts +9 -0
  119. package/src/gjc-runtime/launch-tmux.ts +25 -6
  120. package/src/gjc-runtime/managed-owner-admission.ts +1 -1
  121. package/src/gjc-runtime/ralplan-runtime.ts +411 -17
  122. package/src/gjc-runtime/team-launch.ts +8 -0
  123. package/src/gjc-runtime/team-runtime.ts +140 -32
  124. package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
  125. package/src/gjc-runtime/tmux-owner-isolation.ts +10 -0
  126. package/src/gjc-runtime/tmux-sessions.ts +58 -13
  127. package/src/gjc-runtime/ultragoal-runtime.ts +401 -611
  128. package/src/gjc-runtime/workflow-manifest.generated.json +8 -99
  129. package/src/gjc-runtime/workflow-manifest.ts +4 -68
  130. package/src/internal-urls/docs-index.generated.ts +15 -15
  131. package/src/modes/DESIGN.md +51 -0
  132. package/src/modes/acp/acp-agent.ts +298 -186
  133. package/src/modes/components/gjc-bundle-settings.ts +508 -0
  134. package/src/modes/components/notifications-settings-editor.ts +12 -1
  135. package/src/modes/components/oauth-selector.ts +68 -30
  136. package/src/modes/components/session-observer-overlay.ts +305 -86
  137. package/src/modes/components/settings-selector.ts +56 -5
  138. package/src/modes/components/status-line/gh.ts +16 -0
  139. package/src/modes/components/tool-status-header.ts +3 -14
  140. package/src/modes/components/transcript-viewer-overlay.ts +99 -24
  141. package/src/modes/controllers/command-controller.ts +4 -0
  142. package/src/modes/controllers/extension-ui-controller.ts +7 -0
  143. package/src/modes/controllers/selector-controller.ts +45 -0
  144. package/src/modes/runtime-init.ts +3 -0
  145. package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
  146. package/src/prompts/system/eager-todo.md +8 -4
  147. package/src/prompts/system/system-prompt.md +11 -4
  148. package/src/prompts/tools/bash.md +5 -5
  149. package/src/prompts/tools/search-tool-bm25.md +5 -0
  150. package/src/prompts/tools/task.md +1 -1
  151. package/src/reminders/star-reminder.ts +4 -42
  152. package/src/runtime-mcp/manager.ts +19 -4
  153. package/src/sdk/acp/adapter.ts +22 -6
  154. package/src/sdk/broker/transport.ts +35 -3
  155. package/src/sdk/bus/attachment-registry.ts +5 -1
  156. package/src/sdk/bus/chat-daemon-cli.ts +4 -39
  157. package/src/sdk/bus/chat-daemon-control.ts +6 -3
  158. package/src/sdk/bus/config.ts +18 -2
  159. package/src/sdk/bus/index.ts +661 -126
  160. package/src/sdk/bus/kind-aware-reconciliation.ts +148 -73
  161. package/src/sdk/bus/lifecycle-commands.ts +4 -1
  162. package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
  163. package/src/sdk/bus/reconciliation-store.ts +95 -16
  164. package/src/sdk/bus/rich-draft.ts +1 -1
  165. package/src/sdk/bus/rich-render.ts +2 -2
  166. package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
  167. package/src/sdk/bus/telegram-cli.ts +33 -8
  168. package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
  169. package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
  170. package/src/sdk/bus/telegram-daemon.ts +916 -23
  171. package/src/sdk/bus/telegram-reference.ts +40 -3
  172. package/src/sdk/bus/threaded-render.ts +48 -3
  173. package/src/sdk/bus/topic-registry.ts +20 -0
  174. package/src/sdk/host/query/revision-store.ts +36 -2
  175. package/src/sdk/host/reverse-leases.ts +44 -7
  176. package/src/sdk/prompt-status.ts +16 -3
  177. package/src/sdk/protocol/operation-inventory.generated.json +22 -0
  178. package/src/sdk/session.ts +88 -9
  179. package/src/session/agent-session.ts +822 -172
  180. package/src/session/artifacts.ts +22 -0
  181. package/src/session/auth-broker-config.ts +10 -3
  182. package/src/session/blob-store.ts +915 -24
  183. package/src/session/internal/managed-session-scope.ts +44 -6
  184. package/src/session/internal/managed-session-storage.ts +48 -6
  185. package/src/session/session-manager.ts +1614 -435
  186. package/src/session/session-storage.ts +9 -1
  187. package/src/session/streaming-output.ts +238 -68
  188. package/src/setup/credential-import.ts +75 -13
  189. package/src/skill-state/active-state.ts +32 -0
  190. package/src/skill-state/workflow-hud.ts +17 -0
  191. package/src/skill-state/workflow-mutation-guard.ts +496 -2
  192. package/src/task/executor.ts +122 -39
  193. package/src/task/index.ts +23 -14
  194. package/src/task/provider-retry-status.ts +16 -0
  195. package/src/task/receipt.ts +23 -7
  196. package/src/task/render.ts +6 -2
  197. package/src/task/types.ts +108 -0
  198. package/src/tools/ask-answer-registry.ts +12 -6
  199. package/src/tools/ask.ts +86 -55
  200. package/src/tools/ast-edit.ts +1 -0
  201. package/src/tools/ast-grep.ts +1 -0
  202. package/src/tools/bash-interactive.ts +8 -3
  203. package/src/tools/bash.ts +503 -60
  204. package/src/tools/find.ts +1 -0
  205. package/src/tools/image-gen.ts +29 -5
  206. package/src/tools/index.ts +4 -0
  207. package/src/tools/output-meta.ts +108 -14
  208. package/src/tools/path-utils.ts +3 -2
  209. package/src/tools/read.ts +18 -0
  210. package/src/tools/review.ts +5 -7
  211. package/src/tools/search.ts +1 -0
  212. package/src/tools/subagent-render.ts +6 -2
  213. package/src/tools/subagent.ts +6 -0
  214. package/src/tools/telegram-send.ts +6 -3
  215. package/src/utils/gh.ts +39 -0
  216. package/src/utils/image-resize.ts +3 -0
  217. package/src/web/search/providers/anthropic.ts +4 -4
  218. package/src/web/search/providers/kimi.ts +15 -5
  219. package/src/web/search/providers/searxng.ts +47 -4
  220. package/src/web/search/providers/xai.ts +7 -2
  221. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
  222. package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
  223. package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
@@ -1,6 +1,6 @@
1
1
  import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
2
2
  import type { OAuthProviderInfo } from "@gajae-code/ai/utils/oauth/types";
3
- import { Container, matchesKey, Spacer, TruncatedText } from "@gajae-code/tui";
3
+ import { Container, fuzzyFilter, Input, matchesKey, Spacer, TruncatedText } from "@gajae-code/tui";
4
4
  import { recordProviderAuthHealth } from "../../config/provider-auth-health";
5
5
  import { compareRankedProviders, type ProviderAuthState } from "../../config/provider-ranking";
6
6
  import { theme } from "../../modes/theme/theme";
@@ -17,6 +17,8 @@ export class OAuthSelectorComponent extends Container {
17
17
  #listContainer: Container;
18
18
  #allProviders: OAuthProviderInfo[] = [];
19
19
  #sortedProviders: OAuthProviderInfo[] = [];
20
+ #filteredProviders: OAuthProviderInfo[] = [];
21
+ #searchInput: Input;
20
22
  #selectedIndex: number = 0;
21
23
  #mode: "login" | "logout";
22
24
  #authStorage: AuthStorage;
@@ -57,6 +59,14 @@ export class OAuthSelectorComponent extends Container {
57
59
  const title = mode === "login" ? "Select provider to login:" : "Select provider to logout:";
58
60
  this.addChild(new TruncatedText(theme.bold(title)));
59
61
  this.addChild(new Spacer(1));
62
+ // Filter box: the provider list is long enough that arrow-key-only
63
+ // navigation buries entries below the visible window.
64
+ this.#searchInput = new Input();
65
+ this.#searchInput.onSubmit = () => {
66
+ this.#selectCurrentProvider();
67
+ };
68
+ this.addChild(this.#searchInput);
69
+ this.addChild(new Spacer(1));
60
70
  // Create list container
61
71
  this.#listContainer = new Container();
62
72
  this.addChild(this.#listContainer);
@@ -166,7 +176,7 @@ export class OAuthSelectorComponent extends Container {
166
176
  return this.#authStorage.hasAuth(providerId) ? theme.fg("success", ` ${theme.status.success} logged in`) : "";
167
177
  }
168
178
  #updateList(): void {
169
- const selectedProviderId = this.#sortedProviders[this.#selectedIndex]?.id;
179
+ const selectedProviderId = this.#filteredProviders[this.#selectedIndex]?.id;
170
180
  const rankedProviders = this.#allProviders.map(provider => ({
171
181
  provider,
172
182
  id: provider.id,
@@ -175,16 +185,23 @@ export class OAuthSelectorComponent extends Container {
175
185
  }));
176
186
  rankedProviders.sort(compareRankedProviders);
177
187
  this.#sortedProviders = rankedProviders.map(({ provider }) => provider);
188
+ // Filter after ranking so an empty query preserves the curated order and a
189
+ // query still surfaces matches in that same order of preference.
190
+ this.#filteredProviders = fuzzyFilter(
191
+ this.#sortedProviders,
192
+ this.#searchInput.getValue(),
193
+ provider => `${provider.name} ${provider.id}`,
194
+ );
178
195
  if (selectedProviderId !== undefined) {
179
- const selectedIndex = this.#sortedProviders.findIndex(provider => provider.id === selectedProviderId);
196
+ const selectedIndex = this.#filteredProviders.findIndex(provider => provider.id === selectedProviderId);
180
197
  if (selectedIndex >= 0) this.#selectedIndex = selectedIndex;
181
198
  }
182
- if (this.#selectedIndex >= this.#sortedProviders.length) {
183
- this.#selectedIndex = Math.max(0, this.#sortedProviders.length - 1);
199
+ if (this.#selectedIndex >= this.#filteredProviders.length) {
200
+ this.#selectedIndex = Math.max(0, this.#filteredProviders.length - 1);
184
201
  }
185
202
  this.#listContainer.clear();
186
203
 
187
- const total = this.#sortedProviders.length;
204
+ const total = this.#filteredProviders.length;
188
205
  const maxVisible = OAUTH_SELECTOR_MAX_VISIBLE;
189
206
  const startIndex =
190
207
  total <= maxVisible
@@ -193,7 +210,7 @@ export class OAuthSelectorComponent extends Container {
193
210
  const endIndex = Math.min(startIndex + maxVisible, total);
194
211
 
195
212
  for (let i = startIndex; i < endIndex; i++) {
196
- const provider = this.#sortedProviders[i];
213
+ const provider = this.#filteredProviders[i];
197
214
  if (!provider) continue;
198
215
  const isSelected = i === this.#selectedIndex;
199
216
  const isAvailable = provider.available;
@@ -219,8 +236,11 @@ export class OAuthSelectorComponent extends Container {
219
236
 
220
237
  // Show "no providers" if empty
221
238
  if (total === 0) {
222
- const message =
223
- this.#mode === "login" ? "No OAuth providers available" : "No OAuth providers logged in. Use /login first.";
239
+ const message = this.#searchInput.getValue().trim()
240
+ ? "No providers match the filter"
241
+ : this.#mode === "login"
242
+ ? "No OAuth providers available"
243
+ : "No OAuth providers logged in. Use /login first.";
224
244
  this.#listContainer.addChild(new TruncatedText(theme.fg("muted", ` ${message}`), 0, 0));
225
245
  }
226
246
  if (this.#statusMessage) {
@@ -243,60 +263,78 @@ export class OAuthSelectorComponent extends Container {
243
263
  }
244
264
  }
245
265
  }
266
+ #selectCurrentProvider(): void {
267
+ const selectedProvider = this.#filteredProviders[this.#selectedIndex];
268
+ if (selectedProvider?.available) {
269
+ this.#statusMessage = undefined;
270
+ this.stopValidation();
271
+ this.#onSelectCallback(selectedProvider.id);
272
+ } else if (selectedProvider) {
273
+ this.#statusMessage = "Provider unavailable in this environment.";
274
+ this.#updateList();
275
+ }
276
+ }
246
277
  handleInput(keyData: string): void {
247
278
  // Up arrow
248
279
  if (matchesKey(keyData, "up")) {
249
- if (this.#sortedProviders.length > 0) {
280
+ if (this.#filteredProviders.length > 0) {
250
281
  this.#selectedIndex =
251
- this.#selectedIndex === 0 ? this.#sortedProviders.length - 1 : this.#selectedIndex - 1;
282
+ this.#selectedIndex === 0 ? this.#filteredProviders.length - 1 : this.#selectedIndex - 1;
252
283
  }
253
284
  this.#statusMessage = undefined;
254
285
  this.#updateList();
286
+ return;
255
287
  }
256
288
  // Down arrow
257
- else if (matchesKey(keyData, "down")) {
258
- if (this.#sortedProviders.length > 0) {
289
+ if (matchesKey(keyData, "down")) {
290
+ if (this.#filteredProviders.length > 0) {
259
291
  this.#selectedIndex =
260
- this.#selectedIndex === this.#sortedProviders.length - 1 ? 0 : this.#selectedIndex + 1;
292
+ this.#selectedIndex === this.#filteredProviders.length - 1 ? 0 : this.#selectedIndex + 1;
261
293
  }
262
294
  this.#statusMessage = undefined;
263
295
  this.#updateList();
296
+ return;
264
297
  }
265
298
  // Page up - jump up by one visible page
266
- else if (matchesKey(keyData, "pageUp")) {
267
- if (this.#sortedProviders.length > 0) {
299
+ if (matchesKey(keyData, "pageUp")) {
300
+ if (this.#filteredProviders.length > 0) {
268
301
  this.#selectedIndex = Math.max(0, this.#selectedIndex - OAUTH_SELECTOR_MAX_VISIBLE);
269
302
  }
270
303
  this.#statusMessage = undefined;
271
304
  this.#updateList();
305
+ return;
272
306
  }
273
307
  // Page down - jump down by one visible page
274
- else if (matchesKey(keyData, "pageDown")) {
275
- if (this.#sortedProviders.length > 0) {
308
+ if (matchesKey(keyData, "pageDown")) {
309
+ if (this.#filteredProviders.length > 0) {
276
310
  this.#selectedIndex = Math.min(
277
- this.#sortedProviders.length - 1,
311
+ this.#filteredProviders.length - 1,
278
312
  this.#selectedIndex + OAUTH_SELECTOR_MAX_VISIBLE,
279
313
  );
280
314
  }
281
315
  this.#statusMessage = undefined;
282
316
  this.#updateList();
317
+ return;
283
318
  }
284
319
  // Enter
285
- else if (matchesKey(keyData, "enter") || matchesKey(keyData, "return") || keyData === "\n") {
286
- const selectedProvider = this.#sortedProviders[this.#selectedIndex];
287
- if (selectedProvider?.available) {
288
- this.#statusMessage = undefined;
289
- this.stopValidation();
290
- this.#onSelectCallback(selectedProvider.id);
291
- } else if (selectedProvider) {
292
- this.#statusMessage = "Provider unavailable in this environment.";
293
- this.#updateList();
294
- }
320
+ if (matchesKey(keyData, "enter") || matchesKey(keyData, "return") || keyData === "\n") {
321
+ this.#selectCurrentProvider();
322
+ return;
295
323
  }
296
324
  // Escape or Ctrl+C
297
- else if (matchesSelectCancel(keyData)) {
325
+ if (matchesSelectCancel(keyData)) {
298
326
  this.stopValidation();
299
327
  this.#onCancelCallback();
328
+ return;
329
+ }
330
+ // Everything else edits the filter. A changed query invalidates the current
331
+ // position, so selection restarts at the best match.
332
+ const previousQuery = this.#searchInput.getValue();
333
+ this.#searchInput.handleInput(keyData);
334
+ if (this.#searchInput.getValue() !== previousQuery) {
335
+ this.#selectedIndex = 0;
336
+ this.#statusMessage = undefined;
337
+ this.#updateList();
300
338
  }
301
339
  }
302
340
  }