diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 2c5bac90..a40543c3 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -4,6 +4,7 @@ ### Added +- Added `editorPaddingX` setting for horizontal padding in input editor (0-3, default: 0) - Added `shellCommandPrefix` setting to prepend commands to every bash execution, enabling alias expansion in non-interactive shells (e.g., `"shellCommandPrefix": "shopt -s expand_aliases"`) ([#790](https://github.com/badlogic/pi-mono/pull/790) by [@richardgill](https://github.com/richardgill)) - Added bash-style argument slicing for prompt templates ([#770](https://github.com/badlogic/pi-mono/pull/770) by [@airtonix](https://github.com/airtonix)) - Extension commands can provide argument auto-completions via `getArgumentCompletions` in `pi.registerCommand()` ([#775](https://github.com/badlogic/pi-mono/pull/775) by [@ribelo](https://github.com/ribelo)) diff --git a/packages/coding-agent/src/core/settings-manager.ts b/packages/coding-agent/src/core/settings-manager.ts index 773a3804..cc247c13 100644 --- a/packages/coding-agent/src/core/settings-manager.ts +++ b/packages/coding-agent/src/core/settings-manager.ts @@ -70,6 +70,7 @@ export interface Settings { enabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag) doubleEscapeAction?: "fork" | "tree"; // Action for double-escape with empty editor (default: "tree") thinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels + editorPaddingX?: number; // Horizontal padding for input editor (default: 0) } /** Deep merge settings: project/overrides take precedence, nested objects merge recursively */ @@ -480,4 +481,13 @@ export class SettingsManager { this.globalSettings.doubleEscapeAction = action; this.save(); } + + getEditorPaddingX(): number { + return this.settings.editorPaddingX ?? 0; + } + + setEditorPaddingX(padding: number): void { + this.globalSettings.editorPaddingX = Math.max(0, Math.min(3, Math.floor(padding))); + this.save(); + } } diff --git a/packages/coding-agent/src/modes/interactive/components/settings-selector.ts b/packages/coding-agent/src/modes/interactive/components/settings-selector.ts index e27eef49..2ac563ef 100644 --- a/packages/coding-agent/src/modes/interactive/components/settings-selector.ts +++ b/packages/coding-agent/src/modes/interactive/components/settings-selector.ts @@ -36,6 +36,7 @@ export interface SettingsConfig { hideThinkingBlock: boolean; collapseChangelog: boolean; doubleEscapeAction: "fork" | "tree"; + editorPaddingX: number; } export interface SettingsCallbacks { @@ -52,6 +53,7 @@ export interface SettingsCallbacks { onHideThinkingBlockChange: (hidden: boolean) => void; onCollapseChangelogChange: (collapsed: boolean) => void; onDoubleEscapeActionChange: (action: "fork" | "tree") => void; + onEditorPaddingXChange: (padding: number) => void; onCancel: () => void; } @@ -267,6 +269,16 @@ export class SettingsSelectorComponent extends Container { values: ["true", "false"], }); + // Editor padding toggle (insert after skill-commands) + const skillCommandsIndex = items.findIndex((item) => item.id === "skill-commands"); + items.splice(skillCommandsIndex + 1, 0, { + id: "editor-padding", + label: "Editor padding", + description: "Horizontal padding for input editor (0-3)", + currentValue: String(config.editorPaddingX), + values: ["0", "1", "2", "3"], + }); + // Add borders this.addChild(new DynamicBorder()); @@ -306,6 +318,9 @@ export class SettingsSelectorComponent extends Container { case "double-escape-action": callbacks.onDoubleEscapeActionChange(newValue as "fork" | "tree"); break; + case "editor-padding": + callbacks.onEditorPaddingXChange(parseInt(newValue, 10)); + break; } }, callbacks.onCancel, diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 38f2597d..529b0f53 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -241,7 +241,8 @@ export class InteractiveMode { this.statusContainer = new Container(); this.widgetContainer = new Container(); this.keybindings = KeybindingsManager.create(); - this.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings); + const editorPaddingX = this.settingsManager.getEditorPaddingX(); + this.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, { paddingX: editorPaddingX }); this.editor = this.defaultEditor; this.editorContainer = new Container(); this.editorContainer.addChild(this.editor as Component); @@ -2520,6 +2521,7 @@ export class InteractiveMode { hideThinkingBlock: this.hideThinkingBlock, collapseChangelog: this.settingsManager.getCollapseChangelog(), doubleEscapeAction: this.settingsManager.getDoubleEscapeAction(), + editorPaddingX: this.settingsManager.getEditorPaddingX(), }, { onAutoCompactChange: (enabled) => { @@ -2587,6 +2589,10 @@ export class InteractiveMode { onDoubleEscapeActionChange: (action) => { this.settingsManager.setDoubleEscapeAction(action); }, + onEditorPaddingXChange: (padding) => { + this.settingsManager.setEditorPaddingX(padding); + this.defaultEditor.setPaddingX(padding); + }, onCancel: () => { done(); this.ui.requestRender(); diff --git a/packages/tui/CHANGELOG.md b/packages/tui/CHANGELOG.md index 0a4be46a..6279f6d2 100644 --- a/packages/tui/CHANGELOG.md +++ b/packages/tui/CHANGELOG.md @@ -4,7 +4,7 @@ ### Added -- `EditorOptions` with optional `paddingX` for horizontal content padding ([#791](https://github.com/badlogic/pi-mono/pull/791) by [@ferologics](https://github.com/ferologics)) +- `EditorOptions` with optional `paddingX` for horizontal content padding, plus `getPaddingX()`/`setPaddingX()` methods ([#791](https://github.com/badlogic/pi-mono/pull/791) by [@ferologics](https://github.com/ferologics)) ### Changed diff --git a/packages/tui/src/components/editor.ts b/packages/tui/src/components/editor.ts index c06d5da8..37350bc2 100644 --- a/packages/tui/src/components/editor.ts +++ b/packages/tui/src/components/editor.ts @@ -300,6 +300,18 @@ export class Editor implements Component, Focusable { this.paddingX = Number.isFinite(paddingX) ? Math.max(0, Math.floor(paddingX)) : 0; } + getPaddingX(): number { + return this.paddingX; + } + + setPaddingX(padding: number): void { + const newPadding = Number.isFinite(padding) ? Math.max(0, Math.floor(padding)) : 0; + if (this.paddingX !== newPadding) { + this.paddingX = newPadding; + this.tui.requestRender(); + } + } + setAutocompleteProvider(provider: AutocompleteProvider): void { this.autocompleteProvider = provider; }