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