Skip to content

Commit 7620202

Browse files
authored
* don't filter responses with errors * use list error rendering and not status message * on error, don't cancel but undo till request
1 parent 29081ed commit 7620202

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -752,18 +752,15 @@ export class InlineChatController implements IEditorContribution {
752752

753753
let newPosition: Position | undefined;
754754

755-
if (response.response.value.length === 0) {
755+
if (response.result?.errorDetails) {
756+
//
757+
await this._session.undoChangesUntil(response.requestId);
758+
759+
} else if (response.response.value.length === 0) {
756760
// empty -> show message
757761
const status = localize('empty', "No results, please refine your input and try again");
758762
this._ui.value.zone.widget.updateStatus(status, { classes: ['warn'] });
759763

760-
} else if (response.result?.errorDetails) {
761-
// error -> show error
762-
if (!response.isCanceled) {
763-
this._ui.value.zone.widget.updateStatus(response.result.errorDetails.message, { classes: ['error'] });
764-
}
765-
this._strategy?.cancel();
766-
767764
} else {
768765
// real response -> complex...
769766
this._ui.value.zone.widget.updateStatus('');

src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ export class InlineChatWidget {
148148
// filter welcome messages
149149
return false;
150150
}
151-
if (isResponseVM(item) && item.isComplete) {
151+
if (isResponseVM(item) && item.isComplete && !item.errorDetails) {
152152
// filter responses that
153153
// - are just text edits(prevents the "Made Edits")
154154
// - are all empty

src/vs/workbench/contrib/inlineChat/test/browser/inlineChatController.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,4 +859,54 @@ suite('InteractiveChatController', function () {
859859
assert.strictEqual(model.getValue(), 'Existing');
860860

861861
});
862+
863+
test('Undo on error (2 rounds)', async function () {
864+
865+
return runWithFakedTimers({}, async () => {
866+
867+
868+
store.add(chatAgentService.registerDynamicAgent({ id: 'testEditorAgent', ...agentData, }, {
869+
async invoke(request, progress, history, token) {
870+
871+
progress({
872+
kind: 'textEdit',
873+
uri: model.uri,
874+
edits: [{
875+
range: new Range(1, 1, 1, 1),
876+
text: request.message
877+
}]
878+
});
879+
880+
if (request.message === 'two') {
881+
await timeout(100); // give edit a chance
882+
return {
883+
errorDetails: { message: 'FAILED' }
884+
};
885+
}
886+
return {};
887+
},
888+
}));
889+
890+
model.setValue('');
891+
892+
// ROUND 1
893+
894+
ctrl = instaService.createInstance(TestController, editor);
895+
const p = ctrl.awaitStates([...TestController.INIT_SEQUENCE, State.SHOW_REQUEST, State.WAIT_FOR_INPUT]);
896+
ctrl.run({ autoSend: true, message: 'one' });
897+
assert.strictEqual(await p, undefined);
898+
assert.strictEqual(model.getValue(), 'one');
899+
900+
901+
// ROUND 2
902+
903+
const p2 = ctrl.awaitStates([State.SHOW_REQUEST, State.WAIT_FOR_INPUT]);
904+
const values = new Set<string>();
905+
store.add(model.onDidChangeContent(() => values.add(model.getValue())));
906+
ctrl.chatWidget.acceptInput('two'); // WILL Trigger a failure
907+
assert.strictEqual(await p2, undefined);
908+
assert.strictEqual(model.getValue(), 'one'); // undone
909+
assert.ok(values.has('twoone')); // we had but the change got undone
910+
});
911+
});
862912
});

0 commit comments

Comments
 (0)