diff --git a/.changeset/tui-paste-marker-steer-expand.md b/.changeset/tui-paste-marker-steer-expand.md new file mode 100644 index 00000000000..fc862f21b62 --- /dev/null +++ b/.changeset/tui-paste-marker-steer-expand.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Expand collapsed paste placeholders when steering the draft with Ctrl-S. diff --git a/apps/kimi-code/src/tui/controllers/editor-keyboard.ts b/apps/kimi-code/src/tui/controllers/editor-keyboard.ts index e4474e7425f..4284c2d3e50 100644 --- a/apps/kimi-code/src/tui/controllers/editor-keyboard.ts +++ b/apps/kimi-code/src/tui/controllers/editor-keyboard.ts @@ -308,7 +308,7 @@ export class EditorKeyboardController { host.state.appState.isCompacting ) return; - const text = editor.getText().trim(); + const text = (editor.getExpandedText?.() ?? editor.getText()).trim(); const editorIsBash = editor.inputMode === 'bash'; // Bash commands (`! …`) are not steerable: they stay queued so they run diff --git a/apps/kimi-code/test/tui/controllers/editor-keyboard.test.ts b/apps/kimi-code/test/tui/controllers/editor-keyboard.test.ts index 626728e7812..ebd1be0a433 100644 --- a/apps/kimi-code/test/tui/controllers/editor-keyboard.test.ts +++ b/apps/kimi-code/test/tui/controllers/editor-keyboard.test.ts @@ -473,6 +473,7 @@ describe('EditorKeyboardController Shift-Tab plan toggle', () => { describe('EditorKeyboardController Ctrl-S steering', () => { function createCtrlSHarness(options: { editorText: string; + editorExpandedText?: string; queued: Array>; engineV2?: boolean; skillCommandMap?: Map; @@ -488,6 +489,12 @@ describe('EditorKeyboardController Ctrl-S steering', () => { setText: setText as unknown as (...args: never[]) => unknown, inputMode: 'prompt' as unknown as (...args: never[]) => unknown, }; + if (options.editorExpandedText !== undefined) { + const expanded = options.editorExpandedText; + editor['getExpandedText'] = vi.fn(() => expanded) as unknown as ( + ...args: never[] + ) => unknown; + } const host = { state: { editor, @@ -511,10 +518,11 @@ describe('EditorKeyboardController Ctrl-S steering', () => { closeOrCancel: vi.fn(() => false), }, } as unknown as EditorKeyboardHost; - const controller = new EditorKeyboardController( - host, - undefined as unknown as ImageAttachmentStore, - ); + const imageStore = { + get: vi.fn(() => undefined), + retainFileIds: vi.fn(), + } as unknown as ImageAttachmentStore; + const controller = new EditorKeyboardController(host, imageStore); controller.install(); const onCtrlS = editor['onCtrlS']; if (onCtrlS === undefined) throw new Error('onCtrlS handler not installed'); @@ -648,4 +656,20 @@ describe('EditorKeyboardController Ctrl-S steering', () => { expect(setText).not.toHaveBeenCalled(); expect(host.state.queuedMessages).toEqual([]); }); + + it('expands paste markers in the editor draft before steering', () => { + const longText = 'line\n'.repeat(15).trimEnd(); + const { host, setText, steerMessage, onCtrlS } = createCtrlSHarness({ + editorText: '[paste #1 +15 lines]', + editorExpandedText: longText, + queued: [], + }); + + onCtrlS(); + + expect(steerMessage).toHaveBeenCalledWith(host.session, [ + { text: longText, parts: undefined, imageAttachmentIds: undefined }, + ]); + expect(setText).toHaveBeenCalledWith(''); + }); });