apex-code 0.4.0 → 0.5.0
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 +23 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -7
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +8 -30
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +2 -2
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +4 -4
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -4
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +4 -4
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +11 -8
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +4 -5
- package/dist/core/tools/write.js.map +1 -1
- package/dist/extensions/llama/ui.d.ts.map +1 -1
- package/dist/extensions/llama/ui.js +3 -2
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +0 -10
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/autocomplete-source.d.ts +8 -0
- package/dist/modes/interactive/components/autocomplete-source.d.ts.map +1 -0
- package/dist/modes/interactive/components/autocomplete-source.js +23 -0
- package/dist/modes/interactive/components/autocomplete-source.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +6 -4
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/composer-dock.d.ts +12 -0
- package/dist/modes/interactive/components/composer-dock.d.ts.map +1 -0
- package/dist/modes/interactive/components/composer-dock.js +24 -0
- package/dist/modes/interactive/components/composer-dock.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +11 -9
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +9 -9
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +9 -5
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +11 -10
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +6 -6
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +8 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +21 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +34 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +27 -23
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +14 -18
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +7 -6
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/permission-preview.d.ts.map +1 -1
- package/dist/modes/interactive/components/permission-preview.js +3 -3
- package/dist/modes/interactive/components/permission-preview.js.map +1 -1
- package/dist/modes/interactive/components/prompt-input.d.ts +12 -0
- package/dist/modes/interactive/components/prompt-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/prompt-input.js +18 -0
- package/dist/modes/interactive/components/prompt-input.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +4 -3
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +26 -19
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +39 -6
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js +8 -6
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +10 -5
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -11
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -38
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-panel.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-panel.js +7 -2
- package/dist/modes/interactive/components/tool-panel.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +9 -5
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +11 -11
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +2 -2
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +6 -3
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +7 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +64 -64
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +49 -23
- package/dist/modes/print-mode.js.map +1 -1
- package/docs/json.md +36 -0
- package/docs/settings.md +1 -1
- package/npm-shrinkwrap.json +5 -5
- package/package.json +2 -2
- package/dist/modes/interactive/components/message-spine.d.ts +0 -14
- package/dist/modes/interactive/components/message-spine.d.ts.map +0 -1
- package/dist/modes/interactive/components/message-spine.js +0 -19
- package/dist/modes/interactive/components/message-spine.js.map +0 -1
|
@@ -44,10 +44,12 @@ import { ensureTool } from "../../utils/tools-manager.js";
|
|
|
44
44
|
import { checkForNewApexCodeVersion } from "../../utils/version-check.js";
|
|
45
45
|
import { ArminComponent } from "./components/armin.js";
|
|
46
46
|
import { AssistantMessageComponent } from "./components/assistant-message.js";
|
|
47
|
+
import { describeWithSource } from "./components/autocomplete-source.js";
|
|
47
48
|
import { BashExecutionComponent } from "./components/bash-execution.js";
|
|
48
49
|
import { BorderedLoader } from "./components/bordered-loader.js";
|
|
49
50
|
import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
|
|
50
51
|
import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
|
|
52
|
+
import { ComposerDock } from "./components/composer-dock.js";
|
|
51
53
|
import { CustomEditor } from "./components/custom-editor.js";
|
|
52
54
|
import { CustomEntryComponent } from "./components/custom-entry.js";
|
|
53
55
|
import { CustomMessageComponent } from "./components/custom-message.js";
|
|
@@ -59,7 +61,7 @@ import { ExtensionInputComponent } from "./components/extension-input.js";
|
|
|
59
61
|
import { ExtensionSelectorComponent } from "./components/extension-selector.js";
|
|
60
62
|
import { FirstUseHints } from "./components/first-use-hints.js";
|
|
61
63
|
import { FooterComponent, formatTokens } from "./components/footer.js";
|
|
62
|
-
import { formatKeyText, keyDisplayText, keyHint, keyText, rawKeyHint } from "./components/keybinding-hints.js";
|
|
64
|
+
import { formatKeyText, hintRow, keyDisplayText, keyHint, keyText, rawKeyHint } from "./components/keybinding-hints.js";
|
|
63
65
|
import { LoginDialogComponent } from "./components/login-dialog.js";
|
|
64
66
|
import { createMermaidMarkdownTransformer } from "./components/mermaid.js";
|
|
65
67
|
import { ModelSelectorComponent } from "./components/model-selector.js";
|
|
@@ -368,6 +370,13 @@ export class InteractiveMode {
|
|
|
368
370
|
autoCompactionEscapeHandler;
|
|
369
371
|
// Auto-retry state
|
|
370
372
|
retryEscapeHandler;
|
|
373
|
+
/**
|
|
374
|
+
* The failed attempt an auto-retry would supersede. `component` is set while its error is
|
|
375
|
+
* still on screen, and a retry removes it from the chat.
|
|
376
|
+
*/
|
|
377
|
+
retriedAttempt;
|
|
378
|
+
/** Set when the user presses Escape during a retry wait, which is the only way to cancel one. */
|
|
379
|
+
retryCancelled = false;
|
|
371
380
|
// Messages queued while compaction is running
|
|
372
381
|
compactionQueuedMessages = [];
|
|
373
382
|
// Shutdown state
|
|
@@ -472,7 +481,7 @@ export class InteractiveMode {
|
|
|
472
481
|
autocompleteFooter: () => this.buildAutocompleteFooter(),
|
|
473
482
|
});
|
|
474
483
|
this.editor = this.defaultEditor;
|
|
475
|
-
this.editorContainer = new
|
|
484
|
+
this.editorContainer = new ComposerDock(() => this.editor);
|
|
476
485
|
this.editorContainer.addChild(this.editor);
|
|
477
486
|
this.footerDataProvider = new FooterDataProvider(this.sessionManager.getCwd());
|
|
478
487
|
this.footer = new FooterComponent(this.session, this.footerDataProvider, this.settingsManager);
|
|
@@ -491,32 +500,6 @@ export class InteractiveMode {
|
|
|
491
500
|
initialThemeSetting: options.initialThemeSetting,
|
|
492
501
|
});
|
|
493
502
|
}
|
|
494
|
-
getAutocompleteSourceTag(sourceInfo) {
|
|
495
|
-
if (!sourceInfo) {
|
|
496
|
-
return undefined;
|
|
497
|
-
}
|
|
498
|
-
const scopePrefix = sourceInfo.scope === "user" ? "u" : sourceInfo.scope === "project" ? "p" : "t";
|
|
499
|
-
const source = sourceInfo.source.trim();
|
|
500
|
-
if (source === "auto" || source === "local" || source === "cli") {
|
|
501
|
-
return scopePrefix;
|
|
502
|
-
}
|
|
503
|
-
if (source.startsWith("npm:")) {
|
|
504
|
-
return `${scopePrefix}:${source}`;
|
|
505
|
-
}
|
|
506
|
-
const gitSource = parseGitUrl(source);
|
|
507
|
-
if (gitSource) {
|
|
508
|
-
const ref = gitSource.ref ? `@${gitSource.ref}` : "";
|
|
509
|
-
return `${scopePrefix}:git:${gitSource.host}/${gitSource.path}${ref}`;
|
|
510
|
-
}
|
|
511
|
-
return scopePrefix;
|
|
512
|
-
}
|
|
513
|
-
prefixAutocompleteDescription(description, sourceInfo) {
|
|
514
|
-
const sourceTag = this.getAutocompleteSourceTag(sourceInfo);
|
|
515
|
-
if (!sourceTag) {
|
|
516
|
-
return description;
|
|
517
|
-
}
|
|
518
|
-
return description ? `[${sourceTag}] ${description}` : `[${sourceTag}]`;
|
|
519
|
-
}
|
|
520
503
|
getBuiltInCommandConflictDiagnostics(extensionRunner) {
|
|
521
504
|
const builtinNames = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));
|
|
522
505
|
return extensionRunner
|
|
@@ -595,7 +578,7 @@ export class InteractiveMode {
|
|
|
595
578
|
// Convert prompt templates to SlashCommand format for autocomplete
|
|
596
579
|
const templateCommands = this.session.promptTemplates.map((cmd) => ({
|
|
597
580
|
name: cmd.name,
|
|
598
|
-
description:
|
|
581
|
+
description: describeWithSource(cmd.description, cmd.sourceInfo),
|
|
599
582
|
...(cmd.argumentHint && { argumentHint: cmd.argumentHint }),
|
|
600
583
|
}));
|
|
601
584
|
// Convert extension commands to SlashCommand format
|
|
@@ -605,7 +588,7 @@ export class InteractiveMode {
|
|
|
605
588
|
.filter((cmd) => !builtinCommandNames.has(cmd.name))
|
|
606
589
|
.map((cmd) => ({
|
|
607
590
|
name: cmd.invocationName,
|
|
608
|
-
description:
|
|
591
|
+
description: describeWithSource(cmd.description, cmd.sourceInfo),
|
|
609
592
|
getArgumentCompletions: cmd.getArgumentCompletions,
|
|
610
593
|
}));
|
|
611
594
|
// Build skill commands from session.skills (if enabled)
|
|
@@ -617,7 +600,7 @@ export class InteractiveMode {
|
|
|
617
600
|
this.skillCommands.set(commandName, skill.filePath);
|
|
618
601
|
skillCommandList.push({
|
|
619
602
|
name: commandName,
|
|
620
|
-
description:
|
|
603
|
+
description: describeWithSource(skill.description, skill.sourceInfo),
|
|
621
604
|
});
|
|
622
605
|
}
|
|
623
606
|
}
|
|
@@ -661,7 +644,7 @@ export class InteractiveMode {
|
|
|
661
644
|
this.chatContainer.addChild(new Text(condensedText, 1, 0));
|
|
662
645
|
}
|
|
663
646
|
else {
|
|
664
|
-
this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's
|
|
647
|
+
this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's new")), 1, 0));
|
|
665
648
|
this.chatContainer.addChild(new Spacer(1));
|
|
666
649
|
this.chatContainer.addChild(new Markdown(this.changelogMarkdown.trim(), 1, 0, this.getMarkdownThemeWithSettings()));
|
|
667
650
|
this.chatContainer.addChild(new Spacer(1));
|
|
@@ -806,25 +789,25 @@ export class InteractiveMode {
|
|
|
806
789
|
// The full cheatsheet is verbose-only. The default screen leads with the
|
|
807
790
|
// mark and the runtime facts that actually differ between launches.
|
|
808
791
|
const expandedInstructions = [
|
|
809
|
-
hint("app.interrupt", "
|
|
810
|
-
hint("app.clear", "
|
|
811
|
-
rawKeyHint(`${keyText("app.clear")} twice`, "
|
|
812
|
-
hint("app.exit", "
|
|
813
|
-
hint("app.suspend", "
|
|
814
|
-
keyHint("tui.editor.deleteToLineEnd", "
|
|
815
|
-
hint("app.thinking.cycle", "
|
|
816
|
-
rawKeyHint(`${keyText("app.model.cycleForward")}/${keyText("app.model.cycleBackward")}`, "
|
|
817
|
-
hint("app.model.select", "
|
|
818
|
-
hint("app.tools.expand", "
|
|
819
|
-
hint("app.thinking.toggle", "
|
|
820
|
-
hint("app.editor.external", "
|
|
821
|
-
rawKeyHint("/", "
|
|
822
|
-
rawKeyHint("!", "
|
|
823
|
-
rawKeyHint("!!", "
|
|
824
|
-
hint("app.message.followUp", "
|
|
825
|
-
hint("app.message.dequeue", "
|
|
826
|
-
hint("app.clipboard.pasteImage", "
|
|
827
|
-
rawKeyHint("drop files", "
|
|
792
|
+
hint("app.interrupt", "interrupt"),
|
|
793
|
+
hint("app.clear", "clear"),
|
|
794
|
+
rawKeyHint(`${keyText("app.clear")} twice`, "exit"),
|
|
795
|
+
hint("app.exit", "exit (empty)"),
|
|
796
|
+
hint("app.suspend", "suspend"),
|
|
797
|
+
keyHint("tui.editor.deleteToLineEnd", "delete to end"),
|
|
798
|
+
hint("app.thinking.cycle", "cycle thinking level"),
|
|
799
|
+
rawKeyHint(`${keyText("app.model.cycleForward")}/${keyText("app.model.cycleBackward")}`, "cycle models"),
|
|
800
|
+
hint("app.model.select", "select model"),
|
|
801
|
+
hint("app.tools.expand", "expand tools"),
|
|
802
|
+
hint("app.thinking.toggle", "expand thinking"),
|
|
803
|
+
hint("app.editor.external", "external editor"),
|
|
804
|
+
rawKeyHint("/", "commands"),
|
|
805
|
+
rawKeyHint("!", "run bash"),
|
|
806
|
+
rawKeyHint("!!", "run bash (no context)"),
|
|
807
|
+
hint("app.message.followUp", "queue follow-up"),
|
|
808
|
+
hint("app.message.dequeue", "edit all queued messages"),
|
|
809
|
+
hint("app.clipboard.pasteImage", "paste image (with text fallback)"),
|
|
810
|
+
rawKeyHint("drop files", "attach"),
|
|
828
811
|
].join("\n");
|
|
829
812
|
this.builtInHeader = new ApexSplashHeader(this.version, () => this.session.state.model?.id, () => this.session.sessionManager.getCwd(), this.options.verbose ? expandedInstructions : undefined, {
|
|
830
813
|
topPadding: true,
|
|
@@ -1553,13 +1536,12 @@ export class InteractiveMode {
|
|
|
1553
1536
|
*/
|
|
1554
1537
|
/** Live keybindings under the autocomplete dropdown. */
|
|
1555
1538
|
buildAutocompleteFooter() {
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
].join(separator);
|
|
1539
|
+
return hintRow([
|
|
1540
|
+
[["tui.select.up", "tui.select.down"], "move"],
|
|
1541
|
+
["tui.select.confirm", "select"],
|
|
1542
|
+
["tui.input.tab", "complete"],
|
|
1543
|
+
["tui.select.cancel", "dismiss"],
|
|
1544
|
+
], { ascii: this.settingsManager.getSymbolPreset() === "ascii" });
|
|
1563
1545
|
}
|
|
1564
1546
|
buildStartupShortcuts() {
|
|
1565
1547
|
const entry = (sigil, label) => `${theme.fg("accent", sigil)} ${theme.fg("muted", label)}`;
|
|
@@ -2895,6 +2877,7 @@ export class InteractiveMode {
|
|
|
2895
2877
|
this.ui.requestRender();
|
|
2896
2878
|
}
|
|
2897
2879
|
else if (event.message.role === "assistant") {
|
|
2880
|
+
this.retriedAttempt = undefined;
|
|
2898
2881
|
this.streamingComponent = new AssistantMessageComponent(undefined, this.isThinkingHidden(), this.getMarkdownThemeWithSettings(), this.hiddenThinkingLabel, this.outputPad, this.getMarkdownTransformers());
|
|
2899
2882
|
this.streamingMessage = event.message;
|
|
2900
2883
|
this.chatContainer.addChild(this.streamingComponent);
|
|
@@ -2949,6 +2932,9 @@ export class InteractiveMode {
|
|
|
2949
2932
|
if (!errorMessage) {
|
|
2950
2933
|
errorMessage = this.streamingMessage.errorMessage || "Error";
|
|
2951
2934
|
}
|
|
2935
|
+
if (this.streamingMessage.stopReason === "error" && this.pendingTools.size === 0) {
|
|
2936
|
+
this.retriedAttempt = { error: errorMessage, component: this.streamingComponent };
|
|
2937
|
+
}
|
|
2952
2938
|
for (const [, component] of this.pendingTools.entries()) {
|
|
2953
2939
|
component.updateResult({
|
|
2954
2940
|
content: [{ type: "text", text: errorMessage }],
|
|
@@ -3084,9 +3070,16 @@ export class InteractiveMode {
|
|
|
3084
3070
|
break;
|
|
3085
3071
|
}
|
|
3086
3072
|
case "auto_retry_start": {
|
|
3073
|
+
// The session drops the failed attempt from agent state; the chat drops it too, and
|
|
3074
|
+
// the retry indicator carries the attempt count instead.
|
|
3075
|
+
if (this.retriedAttempt?.component) {
|
|
3076
|
+
this.chatContainer.removeChild(this.retriedAttempt.component);
|
|
3077
|
+
this.retriedAttempt = { error: this.retriedAttempt.error };
|
|
3078
|
+
}
|
|
3087
3079
|
// Set up escape to abort retry
|
|
3088
3080
|
this.retryEscapeHandler = this.defaultEditor.onEscape;
|
|
3089
3081
|
this.defaultEditor.onEscape = () => {
|
|
3082
|
+
this.retryCancelled = true;
|
|
3090
3083
|
this.session.abortRetry();
|
|
3091
3084
|
};
|
|
3092
3085
|
this.showStatusIndicator(new RetryStatusIndicator(this.ui, event.attempt, event.maxAttempts, event.delayMs));
|
|
@@ -3102,8 +3095,16 @@ export class InteractiveMode {
|
|
|
3102
3095
|
this.clearStatusIndicator("retry");
|
|
3103
3096
|
// Show error only on final failure (success shows normal response)
|
|
3104
3097
|
if (!event.success) {
|
|
3105
|
-
|
|
3098
|
+
const lastAttempt = this.retriedAttempt;
|
|
3099
|
+
if (lastAttempt?.component)
|
|
3100
|
+
this.chatContainer.removeChild(lastAttempt.component);
|
|
3101
|
+
const outcome = this.retryCancelled
|
|
3102
|
+
? "retry cancelled"
|
|
3103
|
+
: `gave up after ${event.attempt} ${event.attempt === 1 ? "retry" : "retries"}`;
|
|
3104
|
+
this.showError(`${lastAttempt?.error ?? event.finalError ?? "Unknown error"} (${outcome})`);
|
|
3106
3105
|
}
|
|
3106
|
+
this.retriedAttempt = undefined;
|
|
3107
|
+
this.retryCancelled = false;
|
|
3107
3108
|
this.ui.requestRender();
|
|
3108
3109
|
break;
|
|
3109
3110
|
}
|
|
@@ -5364,12 +5365,11 @@ export class InteractiveMode {
|
|
|
5364
5365
|
}
|
|
5365
5366
|
this.resetExtensionUI();
|
|
5366
5367
|
const reloadBox = new Container();
|
|
5367
|
-
|
|
5368
|
-
reloadBox.addChild(new DynamicBorder(borderColor));
|
|
5368
|
+
reloadBox.addChild(new DynamicBorder());
|
|
5369
5369
|
reloadBox.addChild(new Spacer(1));
|
|
5370
|
-
reloadBox.addChild(new Text(theme.fg("muted", "Reloading keybindings, extensions, skills, prompts, themes, and context files..."),
|
|
5370
|
+
reloadBox.addChild(new Text(theme.fg("muted", "Reloading keybindings, extensions, skills, prompts, themes, and context files..."), 0, 0));
|
|
5371
5371
|
reloadBox.addChild(new Spacer(1));
|
|
5372
|
-
reloadBox.addChild(new DynamicBorder(
|
|
5372
|
+
reloadBox.addChild(new DynamicBorder());
|
|
5373
5373
|
const previousEditor = this.editor;
|
|
5374
5374
|
this.editorContainer.clear();
|
|
5375
5375
|
this.editorContainer.addChild(reloadBox);
|
|
@@ -5723,7 +5723,7 @@ export class InteractiveMode {
|
|
|
5723
5723
|
: "No changelog entries found.";
|
|
5724
5724
|
this.chatContainer.addChild(new Spacer(1));
|
|
5725
5725
|
this.chatContainer.addChild(new DynamicBorder());
|
|
5726
|
-
this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's
|
|
5726
|
+
this.chatContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's new")), 1, 0));
|
|
5727
5727
|
this.chatContainer.addChild(new Spacer(1));
|
|
5728
5728
|
this.chatContainer.addChild(new Markdown(changelogMarkdown, 1, 1, this.getMarkdownThemeWithSettings()));
|
|
5729
5729
|
this.chatContainer.addChild(new DynamicBorder());
|