Skip to content

Commit 714d651

Browse files
committed
update api
1 parent d4c708c commit 714d651

3 files changed

Lines changed: 77 additions & 1 deletion

File tree

src/extension/chatSessions/vscode-node/chatSessions.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { ClaudeChatSessionItemProvider } from './claudeChatSessionItemProvider';
2222
import { ClaudeChatSessionParticipant } from './claudeChatSessionParticipant';
2323
import { OpenCodeChatSessionContentProvider } from './opencodeChatSessionContentProvider';
2424
import { OpenCodeChatSessionItemProvider, OpenCodeSessionDataStore } from './opencodeChatSessionItemProvider';
25+
import { OpenCodeChatSessionParticipant } from './opencodeChatSessionParticipant';
2526

2627
export class ChatSessionsContrib extends Disposable implements IExtensionContribution {
2728
readonly id = 'chatSessions';
@@ -77,6 +78,13 @@ export class ChatSessionsContrib extends Disposable implements IExtensionContrib
7778
opencodeAgentManager,
7879
opencodeSessionStore
7980
);
80-
this._register(vscode.chat.registerChatSessionContentProvider('opencode', opencodeChatSessionContentProvider));
81+
const opencodeChatSessionParticipant = opencodeInstaService.createInstance(
82+
OpenCodeChatSessionParticipant,
83+
'opencode',
84+
opencodeAgentManager,
85+
opencodeSessionItemProvider
86+
);
87+
const opencodeParticipant = vscode.chat.createChatParticipant('opencode', opencodeChatSessionParticipant.createHandler());
88+
this._register(vscode.chat.registerChatSessionContentProvider('opencode', opencodeChatSessionContentProvider, opencodeParticipant));
8189
}
8290
}

src/extension/chatSessions/vscode-node/opencodeChatSessionItemProvider.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ export class OpenCodeChatSessionItemProvider extends Disposable implements vscod
146146
private readonly _onDidChangeChatSessionItems = this._register(new Emitter<void>());
147147
public readonly onDidChangeChatSessionItems = this._onDidChangeChatSessionItems.event;
148148

149+
private readonly _onDidCommitChatSessionItem = this._register(new Emitter<{ original: vscode.ChatSessionItem; modified: vscode.ChatSessionItem }>());
150+
public readonly onDidCommitChatSessionItem = this._onDidCommitChatSessionItem.event;
151+
149152
constructor(
150153
private readonly sessionStore: OpenCodeSessionDataStore,
151154
@IOpenCodeSessionService private readonly opencodeSessionService: IOpenCodeSessionService,
@@ -162,6 +165,13 @@ export class OpenCodeChatSessionItemProvider extends Disposable implements vscod
162165
this._onDidChangeChatSessionItems.fire();
163166
}
164167

168+
/**
169+
* Swaps an original session item with a modified one
170+
*/
171+
public swap(original: vscode.ChatSessionItem, modified: vscode.ChatSessionItem): void {
172+
this._onDidCommitChatSessionItem.fire({ original, modified });
173+
}
174+
165175
/**
166176
* Provides the list of chat session items for the VS Code UI
167177
*/
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as vscode from 'vscode';
7+
import { ChatExtendedRequestHandler } from 'vscode';
8+
import { localize } from '../../../util/vs/nls';
9+
import { OpenCodeAgentManager } from '../../agents/opencode/node/opencodeAgentManager';
10+
import { OpenCodeChatSessionItemProvider } from './opencodeChatSessionItemProvider';
11+
12+
export class OpenCodeChatSessionParticipant {
13+
constructor(
14+
private readonly sessionType: string,
15+
private readonly opencodeAgentManager: OpenCodeAgentManager,
16+
private readonly sessionItemProvider: OpenCodeChatSessionItemProvider,
17+
) { }
18+
19+
createHandler(): ChatExtendedRequestHandler {
20+
return this.handleRequest.bind(this);
21+
}
22+
23+
private async handleRequest(request: vscode.ChatRequest, context: vscode.ChatContext, stream: vscode.ChatResponseStream, token: vscode.CancellationToken): Promise<vscode.ChatResult | void> {
24+
const create = async () => {
25+
const result = await this.opencodeAgentManager.handleRequest(undefined, request, context, stream, token);
26+
const opencodeSessionId = result.sessionId;
27+
if (!opencodeSessionId) {
28+
stream.warning(localize('opencode.failedToCreateSession', "Failed to create a new OpenCode session."));
29+
return undefined;
30+
}
31+
return opencodeSessionId;
32+
};
33+
34+
const { chatSessionContext } = context;
35+
if (chatSessionContext) {
36+
if (chatSessionContext.isUntitled) {
37+
/* New, empty session */
38+
const opencodeSessionId = await create();
39+
if (opencodeSessionId) {
40+
// Tell UI to replace with opencode-backed session
41+
this.sessionItemProvider.swap(chatSessionContext.chatSessionItem, { id: opencodeSessionId, label: request.prompt ?? 'OpenCode' });
42+
}
43+
return {};
44+
}
45+
46+
/* Existing session */
47+
const { id } = chatSessionContext.chatSessionItem;
48+
await this.opencodeAgentManager.handleRequest(id, request, context, stream, token);
49+
return {};
50+
}
51+
52+
/* Via @opencode */
53+
// TODO: Think about how this should work
54+
stream.markdown(localize('opencode.viaAtOpencode', "Start a new OpenCode session"));
55+
stream.button({ command: `workbench.action.chat.openNewSessionEditor.${this.sessionType}`, title: localize('opencode.startNewSession', "Start Session") });
56+
return {};
57+
}
58+
}

0 commit comments

Comments
 (0)