@8gi-foundation/8gent-code 0.20.12 → 0.20.13

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/CHANGELOG.md CHANGED
@@ -9,6 +9,11 @@ versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.20.13] - 2026-10-22
13
+
14
+ ### Fixed
15
+ - tui: the prompt stays live in every view unless a picker owns the keyboard, and Esc always returns (0.20.12 regression) ([#4740](https://github.com/8gi-foundation/8gent-code/pull/4740))
16
+
12
17
  ## [0.20.12] - 2026-10-22
13
18
 
14
19
  ### Added
package/README.md CHANGED
@@ -21,7 +21,7 @@
21
21
 
22
22
  <p align="center">
23
23
  <a href="https://www.apache.org/licenses/LICENSE-2.0"><img src="https://img.shields.io/badge/License-Apache_2.0-E8610A?style=for-the-badge&labelColor=1A1612" alt="Apache 2.0 License" /></a>
24
- <a href="https://8gent.dev"><img src="https://img.shields.io/badge/version-0.20.12-2D8A56?style=for-the-badge&labelColor=1A1612" alt="v0.20.12" /></a>
24
+ <a href="https://8gent.dev"><img src="https://img.shields.io/badge/version-0.20.13-2D8A56?style=for-the-badge&labelColor=1A1612" alt="v0.20.13" /></a>
25
25
  <a href="https://eight-vessel.fly.dev"><img src="https://img.shields.io/badge/daemon-Fly.io_Amsterdam-E8610A?style=for-the-badge&labelColor=1A1612" alt="Daemon" /></a>
26
26
  </p>
27
27
 
package/dist/cli.js CHANGED
@@ -597524,7 +597524,7 @@ function nodeExecPath(execPath = process.execPath, env = process.env, exists = e
597524
597524
 
597525
597525
  // bin/8gent.ts
597526
597526
  refuseIfNested();
597527
- var VERSION5 = "0.20.12";
597527
+ var VERSION5 = "0.20.13";
597528
597528
  var RELAUNCH_EXIT_CODE = 75;
597529
597529
  var MODULE_DIR = path158.dirname(fileURLToPath7(import.meta.url));
597530
597530
  var EXEC_DIR = path158.dirname(process.execPath);
package/dist/node/cli.js CHANGED
@@ -617700,7 +617700,7 @@ function nodeExecPath(execPath = process.execPath, env = process.env, exists = e
617700
617700
 
617701
617701
  // bin/8gent.ts
617702
617702
  refuseIfNested();
617703
- var VERSION5 = "0.20.12";
617703
+ var VERSION5 = "0.20.13";
617704
617704
  var RELAUNCH_EXIT_CODE = 75;
617705
617705
  var MODULE_DIR = path158.dirname(fileURLToPath8(import.meta.url));
617706
617706
  var EXEC_DIR = path158.dirname(process.execPath);
package/dist/node/tui.js CHANGED
@@ -33286,7 +33286,7 @@ var init_permissions = __esm(() => {
33286
33286
  var require_package = __commonJS(function(exports2, module2) {
33287
33287
  module2.exports = {
33288
33288
  name: "@8gi-foundation/8gent-code",
33289
- version: "0.20.12",
33289
+ version: "0.20.13",
33290
33290
  private: false,
33291
33291
  engines: {
33292
33292
  node: ">=22.5"
@@ -630291,6 +630291,25 @@ function settleSetupTranscript(messages) {
630291
630291
  return out;
630292
630292
  }
630293
630293
 
630294
+ // apps/tui/src/lib/prompt-focus.ts
630295
+ var KEYBOARD_VIEWS = new Set([
630296
+ "model-select",
630297
+ "provider-select",
630298
+ "theme-select",
630299
+ "session-picker",
630300
+ "session-tree",
630301
+ "keys"
630302
+ ]);
630303
+ var ESC_RETURNS_LINE = "Esc returns to the prompt";
630304
+ function promptIsLive(s) {
630305
+ if (KEYBOARD_VIEWS.has(s.viewMode))
630306
+ return false;
630307
+ return !s.tabBodyShown && !s.isBubbleNavMode && !s.paletteOpen && !s.djKeys;
630308
+ }
630309
+ function mayAutoOpenProviderPicker(keyedHostedProviders) {
630310
+ return keyedHostedProviders.length !== 1;
630311
+ }
630312
+
630294
630313
  // apps/tui/src/lib/provider-health.ts
630295
630314
  init_text_tool_endpoint();
630296
630315
  init_local_model_server();
@@ -639459,13 +639478,7 @@ function speakOnboardingLine(rawText, preference) {
639459
639478
  })();
639460
639479
  }
639461
639480
  var PLAN_COLUMN_WIDTH = 24;
639462
- var PICKER_VIEWS = new Set([
639463
- "model-select",
639464
- "provider-select",
639465
- "theme-select",
639466
- "session-picker",
639467
- "session-tree"
639468
- ]);
639481
+ var PICKER_VIEWS = KEYBOARD_VIEWS;
639469
639482
  var SESSION_VIEWS = new Set(["session-picker", "session-tree"]);
639470
639483
  var PLAN_EMPTY_LINE = "No plan steps yet. They appear when the 8gent writes a PLAN: with numbered steps while working on a request.";
639471
639484
  var AVENUES_EMPTY_LINE = "No avenues in this session. Nothing produces them yet, so this stays empty rather than showing guesses.";
@@ -640164,6 +640177,7 @@ function App2({
640164
640177
  addSystemMessage(notice);
640165
640178
  setCurrentModel(next);
640166
640179
  }, [modelsLoading, availableModels, modelsOwner, currentProvider, currentModel]);
640180
+ const oneKeyNoModelNotedRef = import_react104.useRef(false);
640167
640181
  import_react104.useEffect(() => {
640168
640182
  if (modelsLoading)
640169
640183
  return;
@@ -640175,6 +640189,13 @@ function App2({
640175
640189
  return;
640176
640190
  if (availableModels.some((m) => !isLikelyEmbeddingModelId(m)))
640177
640191
  return;
640192
+ if (!mayAutoOpenProviderPicker(hostedKeyedProviders())) {
640193
+ if (viewMode === "chat" && !oneKeyNoModelNotedRef.current) {
640194
+ oneKeyNoModelNotedRef.current = true;
640195
+ addSystemMessage(`${currentProvider} listed no chat model. Check the key with /apikeys, or pick one with /provider.`);
640196
+ }
640197
+ return;
640198
+ }
640178
640199
  if (viewMode === "chat")
640179
640200
  setViewMode("provider-select");
640180
640201
  }, [modelsLoading, availableModels, currentModel, viewMode, modelsOwner, currentProvider]);
@@ -644786,8 +644807,14 @@ ${result.commands.map((c) => ` $ ${c}`).join(`
644786
644807
  }, undefined, false, undefined, this),
644787
644808
  PICKER_VIEWS.has(viewMode) && activeTabType === "chat" && /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(Box_default, {
644788
644809
  flexShrink: 0,
644789
- children: renderMainContent()
644790
- }, undefined, false, undefined, this),
644810
+ flexDirection: "column",
644811
+ children: [
644812
+ renderMainContent(),
644813
+ /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(MutedText, {
644814
+ children: ESC_RETURNS_LINE
644815
+ }, undefined, false, undefined, this)
644816
+ ]
644817
+ }, undefined, true, undefined, this),
644791
644818
  approvalPending && /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(InlineApprovalPrompt, {
644792
644819
  target: approvalPending.target,
644793
644820
  reason: approvalPending.reason,
@@ -644803,7 +644830,13 @@ ${result.commands.map((c) => ` $ ${c}`).join(`
644803
644830
  onSubmit: handleSubmit,
644804
644831
  isProcessing,
644805
644832
  placeholder: showOnboarding ? onboardingPlaceholder ?? "Type your answer" : nameQuestionOpen ? "Your name" : undefined,
644806
- focused: (viewMode === "chat" && activeTabType === "chat" || viewMode === "onboarding") && !isBubbleNavMode && !paletteOpen && !djKeys,
644833
+ focused: promptIsLive({
644834
+ viewMode,
644835
+ tabBodyShown: tabBody != null,
644836
+ isBubbleNavMode,
644837
+ paletteOpen,
644838
+ djKeys
644839
+ }),
644807
644840
  typingPaused: djKeys,
644808
644841
  processingStage,
644809
644842
  showAnimations,
package/dist/tui.js CHANGED
@@ -29981,7 +29981,7 @@ var init_permissions = __esm(() => {
29981
29981
  var require_package = __commonJS(function(exports2, module2) {
29982
29982
  module2.exports = {
29983
29983
  name: "@8gi-foundation/8gent-code",
29984
- version: "0.20.12",
29984
+ version: "0.20.13",
29985
29985
  private: false,
29986
29986
  engines: {
29987
29987
  node: ">=22.5"
@@ -607256,6 +607256,25 @@ function settleSetupTranscript(messages) {
607256
607256
  return out;
607257
607257
  }
607258
607258
 
607259
+ // apps/tui/src/lib/prompt-focus.ts
607260
+ var KEYBOARD_VIEWS = new Set([
607261
+ "model-select",
607262
+ "provider-select",
607263
+ "theme-select",
607264
+ "session-picker",
607265
+ "session-tree",
607266
+ "keys"
607267
+ ]);
607268
+ var ESC_RETURNS_LINE = "Esc returns to the prompt";
607269
+ function promptIsLive(s) {
607270
+ if (KEYBOARD_VIEWS.has(s.viewMode))
607271
+ return false;
607272
+ return !s.tabBodyShown && !s.isBubbleNavMode && !s.paletteOpen && !s.djKeys;
607273
+ }
607274
+ function mayAutoOpenProviderPicker(keyedHostedProviders) {
607275
+ return keyedHostedProviders.length !== 1;
607276
+ }
607277
+
607259
607278
  // apps/tui/src/lib/provider-health.ts
607260
607279
  init_text_tool_endpoint();
607261
607280
  init_local_model_server();
@@ -616424,13 +616443,7 @@ function speakOnboardingLine(rawText, preference) {
616424
616443
  })();
616425
616444
  }
616426
616445
  var PLAN_COLUMN_WIDTH = 24;
616427
- var PICKER_VIEWS = new Set([
616428
- "model-select",
616429
- "provider-select",
616430
- "theme-select",
616431
- "session-picker",
616432
- "session-tree"
616433
- ]);
616446
+ var PICKER_VIEWS = KEYBOARD_VIEWS;
616434
616447
  var SESSION_VIEWS = new Set(["session-picker", "session-tree"]);
616435
616448
  var PLAN_EMPTY_LINE = "No plan steps yet. They appear when the 8gent writes a PLAN: with numbered steps while working on a request.";
616436
616449
  var AVENUES_EMPTY_LINE = "No avenues in this session. Nothing produces them yet, so this stays empty rather than showing guesses.";
@@ -617129,6 +617142,7 @@ function App2({
617129
617142
  addSystemMessage(notice);
617130
617143
  setCurrentModel(next);
617131
617144
  }, [modelsLoading, availableModels, modelsOwner, currentProvider, currentModel]);
617145
+ const oneKeyNoModelNotedRef = import_react104.useRef(false);
617132
617146
  import_react104.useEffect(() => {
617133
617147
  if (modelsLoading)
617134
617148
  return;
@@ -617140,6 +617154,13 @@ function App2({
617140
617154
  return;
617141
617155
  if (availableModels.some((m) => !isLikelyEmbeddingModelId(m)))
617142
617156
  return;
617157
+ if (!mayAutoOpenProviderPicker(hostedKeyedProviders())) {
617158
+ if (viewMode === "chat" && !oneKeyNoModelNotedRef.current) {
617159
+ oneKeyNoModelNotedRef.current = true;
617160
+ addSystemMessage(`${currentProvider} listed no chat model. Check the key with /apikeys, or pick one with /provider.`);
617161
+ }
617162
+ return;
617163
+ }
617143
617164
  if (viewMode === "chat")
617144
617165
  setViewMode("provider-select");
617145
617166
  }, [modelsLoading, availableModels, currentModel, viewMode, modelsOwner, currentProvider]);
@@ -621751,8 +621772,14 @@ ${result.commands.map((c) => ` $ ${c}`).join(`
621751
621772
  }, undefined, false, undefined, this),
621752
621773
  PICKER_VIEWS.has(viewMode) && activeTabType === "chat" && /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(Box_default, {
621753
621774
  flexShrink: 0,
621754
- children: renderMainContent()
621755
- }, undefined, false, undefined, this),
621775
+ flexDirection: "column",
621776
+ children: [
621777
+ renderMainContent(),
621778
+ /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(MutedText, {
621779
+ children: ESC_RETURNS_LINE
621780
+ }, undefined, false, undefined, this)
621781
+ ]
621782
+ }, undefined, true, undefined, this),
621756
621783
  approvalPending && /* @__PURE__ */ jsx_dev_runtime67.jsxDEV(InlineApprovalPrompt, {
621757
621784
  target: approvalPending.target,
621758
621785
  reason: approvalPending.reason,
@@ -621768,7 +621795,13 @@ ${result.commands.map((c) => ` $ ${c}`).join(`
621768
621795
  onSubmit: handleSubmit,
621769
621796
  isProcessing,
621770
621797
  placeholder: showOnboarding ? onboardingPlaceholder ?? "Type your answer" : nameQuestionOpen ? "Your name" : undefined,
621771
- focused: (viewMode === "chat" && activeTabType === "chat" || viewMode === "onboarding") && !isBubbleNavMode && !paletteOpen && !djKeys,
621798
+ focused: promptIsLive({
621799
+ viewMode,
621800
+ tabBodyShown: tabBody != null,
621801
+ isBubbleNavMode,
621802
+ paletteOpen,
621803
+ djKeys
621804
+ }),
621772
621805
  typingPaused: djKeys,
621773
621806
  processingStage,
621774
621807
  showAnimations,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@8gi-foundation/8gent-code",
3
- "version": "0.20.12",
3
+ "version": "0.20.13",
4
4
  "private": false,
5
5
  "engines": {
6
6
  "node": ">=22.5"