@@ -20,11 +20,18 @@ import { ApiConfiguration, ApiProvider, ModelInfo } from "../../shared/api"
2020import { findLast } from "../../shared/array"
2121import { ApiConfigMeta , ExtensionMessage } from "../../shared/ExtensionMessage"
2222import { HistoryItem } from "../../shared/HistoryItem"
23- import { checkoutDiffPayloadSchema , checkoutRestorePayloadSchema , WebviewMessage } from "../../shared/WebviewMessage"
23+ import {
24+ checkoutDiffPayloadSchema ,
25+ checkoutRestorePayloadSchema ,
26+ researchTaskPayloadSchema ,
27+ researchInputPayloadSchema ,
28+ WebviewMessage ,
29+ } from "../../shared/WebviewMessage"
2430import { Mode , CustomModePrompts , PromptComponent , defaultModeSlug } from "../../shared/modes"
2531import { SYSTEM_PROMPT } from "../prompts/system"
2632import { fileExistsAtPath } from "../../utils/fs"
2733import { Cline } from "../Cline"
34+ import { DeepResearchService } from "../../services/deep-research/DeepResearchService"
2835import { openMention } from "../mentions"
2936import { getNonce } from "./getNonce"
3037import { getUri } from "./getUri"
@@ -60,6 +67,8 @@ type SecretKey =
6067 | "mistralApiKey"
6168 | "unboundApiKey"
6269 | "requestyApiKey"
70+ | "firecrawlApiKey"
71+
6372type GlobalStateKey =
6473 | "apiProvider"
6574 | "apiModelId"
@@ -148,6 +157,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
148157 private view ?: vscode . WebviewView | vscode . WebviewPanel
149158 private isViewLaunched = false
150159 private cline ?: Cline
160+ private deepResearchService ?: DeepResearchService
151161 private workspaceTracker ?: WorkspaceTracker
152162 protected mcpHub ?: McpHub // Change from private to protected
153163 private latestAnnouncementId = "jan-21-2025-custom-modes" // update to some unique identifier when we add a new announcement
@@ -1513,6 +1523,55 @@ export class ClineProvider implements vscode.WebviewViewProvider {
15131523 await this . updateGlobalState ( "mode" , defaultModeSlug )
15141524 await this . postStateToWebview ( )
15151525 }
1526+ break
1527+ case "research.task" : {
1528+ const result = researchTaskPayloadSchema . safeParse ( message . payload )
1529+
1530+ if ( ! result . success ) {
1531+ console . warn (
1532+ `[ClineProvider#research.task] Invalid payload: ${ JSON . stringify ( message . payload ) } ` ,
1533+ )
1534+ break
1535+ }
1536+
1537+ if ( result . success && ! this . deepResearchService ) {
1538+ const { session } = result . data
1539+ this . deepResearchService = new DeepResearchService ( session , this )
1540+ this . deepResearchService . input ( session . query )
1541+ }
1542+
1543+ break
1544+ }
1545+ case "research.input" : {
1546+ const result = researchInputPayloadSchema . safeParse ( message . payload )
1547+
1548+ if ( ! result . success ) {
1549+ console . warn (
1550+ `[ClineProvider#research.input] Invalid payload: ${ JSON . stringify ( message . payload ) } ` ,
1551+ )
1552+ break
1553+ }
1554+
1555+ if ( result . success && this . deepResearchService ) {
1556+ const { content } = result . data . message
1557+ this . deepResearchService . input ( content )
1558+ }
1559+
1560+ break
1561+ }
1562+ case "research.viewReport" :
1563+ this . deepResearchService ?. viewReport ( )
1564+ break
1565+ case "research.createTask" :
1566+ this . deepResearchService ?. createTask ( )
1567+ break
1568+ case "research.abort" :
1569+ this . deepResearchService ?. abort ( )
1570+ break
1571+ case "research.reset" :
1572+ this . deepResearchService ?. abort ( )
1573+ this . deepResearchService = undefined
1574+ break
15161575 }
15171576 } ,
15181577 null ,
@@ -1660,6 +1719,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
16601719 requestyModelId,
16611720 requestyModelInfo,
16621721 modelTemperature,
1722+ firecrawlApiKey,
16631723 } = apiConfiguration
16641724 await Promise . all ( [
16651725 this . updateGlobalState ( "apiProvider" , apiProvider ) ,
@@ -1707,6 +1767,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
17071767 this . updateGlobalState ( "requestyModelId" , requestyModelId ) ,
17081768 this . updateGlobalState ( "requestyModelInfo" , requestyModelInfo ) ,
17091769 this . updateGlobalState ( "modelTemperature" , modelTemperature ) ,
1770+ this . storeSecret ( "firecrawlApiKey" , firecrawlApiKey ) ,
17101771 ] )
17111772 if ( this . cline ) {
17121773 this . cline . api = buildApiHandler ( apiConfiguration )
@@ -2591,6 +2652,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
25912652 requestyModelInfo ,
25922653 modelTemperature ,
25932654 maxOpenTabsContext ,
2655+ firecrawlApiKey ,
25942656 ] = await Promise . all ( [
25952657 this . getGlobalState ( "apiProvider" ) as Promise < ApiProvider | undefined > ,
25962658 this . getGlobalState ( "apiModelId" ) as Promise < string | undefined > ,
@@ -2673,6 +2735,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
26732735 this . getGlobalState ( "requestyModelInfo" ) as Promise < ModelInfo | undefined > ,
26742736 this . getGlobalState ( "modelTemperature" ) as Promise < number | undefined > ,
26752737 this . getGlobalState ( "maxOpenTabsContext" ) as Promise < number | undefined > ,
2738+ this . getSecret ( "firecrawlApiKey" ) as Promise < string | undefined > ,
26762739 ] )
26772740
26782741 let apiProvider : ApiProvider
@@ -2736,6 +2799,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
27362799 requestyModelId,
27372800 requestyModelInfo,
27382801 modelTemperature,
2802+ firecrawlApiKey,
27392803 } ,
27402804 lastShownAnnouncementId,
27412805 customInstructions,
@@ -2892,6 +2956,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
28922956 "mistralApiKey" ,
28932957 "unboundApiKey" ,
28942958 "requestyApiKey" ,
2959+ "firecrawlApiKey" ,
28952960 ]
28962961 for ( const key of secretKeys ) {
28972962 await this . storeSecret ( key , undefined )
0 commit comments