Skip to content

Commit 58dc66d

Browse files
committed
Deep research
1 parent 7eada8b commit 58dc66d

File tree

85 files changed

+16192
-7351
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+16192
-7351
lines changed

package-lock.json

Lines changed: 508 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,20 @@
7575
"icon": "$(add)"
7676
},
7777
{
78-
"command": "roo-cline.mcpButtonClicked",
79-
"title": "MCP Servers",
80-
"icon": "$(server)"
78+
"command": "roo-cline.researchButtonClicked",
79+
"title": "Deep Research (β)",
80+
"icon": "$(telescope)"
8181
},
8282
{
8383
"command": "roo-cline.promptsButtonClicked",
8484
"title": "Prompts",
8585
"icon": "$(notebook)"
8686
},
87+
{
88+
"command": "roo-cline.mcpButtonClicked",
89+
"title": "MCP Servers",
90+
"icon": "$(server)"
91+
},
8792
{
8893
"command": "roo-cline.historyButtonClicked",
8994
"title": "History",
@@ -207,34 +212,39 @@
207212
"when": "view == roo-cline.SidebarProvider"
208213
},
209214
{
210-
"command": "roo-cline.promptsButtonClicked",
215+
"command": "roo-cline.researchButtonClicked",
211216
"group": "navigation@2",
212217
"when": "view == roo-cline.SidebarProvider"
213218
},
214219
{
215-
"command": "roo-cline.mcpButtonClicked",
220+
"command": "roo-cline.promptsButtonClicked",
216221
"group": "navigation@3",
217222
"when": "view == roo-cline.SidebarProvider"
218223
},
219224
{
220-
"command": "roo-cline.historyButtonClicked",
225+
"command": "roo-cline.mcpButtonClicked",
221226
"group": "navigation@4",
222227
"when": "view == roo-cline.SidebarProvider"
223228
},
224229
{
225-
"command": "roo-cline.popoutButtonClicked",
230+
"command": "roo-cline.historyButtonClicked",
226231
"group": "navigation@5",
227232
"when": "view == roo-cline.SidebarProvider"
228233
},
229234
{
230-
"command": "roo-cline.settingsButtonClicked",
235+
"command": "roo-cline.popoutButtonClicked",
231236
"group": "navigation@6",
232237
"when": "view == roo-cline.SidebarProvider"
233238
},
234239
{
235-
"command": "roo-cline.helpButtonClicked",
240+
"command": "roo-cline.settingsButtonClicked",
236241
"group": "navigation@7",
237242
"when": "view == roo-cline.SidebarProvider"
243+
},
244+
{
245+
"command": "roo-cline.helpButtonClicked",
246+
"group": "navigation@8",
247+
"when": "view == roo-cline.SidebarProvider"
238248
}
239249
]
240250
},
@@ -308,6 +318,8 @@
308318
"@anthropic-ai/vertex-sdk": "^0.4.1",
309319
"@aws-sdk/client-bedrock-runtime": "^3.706.0",
310320
"@google/generative-ai": "^0.18.0",
321+
"@hookform/resolvers": "^4.0.0",
322+
"@mendable/firecrawl-js": "^1.16.0",
311323
"@mistralai/mistralai": "^1.3.6",
312324
"@modelcontextprotocol/sdk": "^1.0.1",
313325
"@types/clone-deep": "^4.0.4",
@@ -316,6 +328,7 @@
316328
"@types/turndown": "^5.0.5",
317329
"@types/vscode": "^1.95.0",
318330
"@vscode/codicons": "^0.0.36",
331+
"ai": "^4.1.34",
319332
"axios": "^1.7.4",
320333
"cheerio": "^1.0.0",
321334
"chokidar": "^4.0.1",
@@ -329,15 +342,18 @@
329342
"get-folder-size": "^5.0.0",
330343
"globby": "^14.0.2",
331344
"isbinaryfile": "^5.0.2",
345+
"js-tiktoken": "^1.0.18",
332346
"mammoth": "^1.8.0",
333347
"monaco-vscode-textmate-theme-converter": "^0.1.7",
334348
"openai": "^4.78.1",
335349
"os-name": "^6.0.0",
350+
"p-limit": "^6.2.0",
336351
"p-wait-for": "^5.0.2",
337352
"pdf-parse": "^1.1.1",
338353
"pretty-bytes": "^6.1.1",
339354
"puppeteer-chromium-resolver": "^23.0.0",
340355
"puppeteer-core": "^23.4.0",
356+
"react-hook-form": "^7.54.2",
341357
"serialize-error": "^11.0.3",
342358
"simple-git": "^3.27.0",
343359
"sound-play": "^1.1.0",
@@ -346,8 +362,9 @@
346362
"tmp": "^0.2.3",
347363
"tree-sitter-wasms": "^0.1.11",
348364
"turndown": "^7.2.0",
365+
"use-callback-ref": "^1.3.3",
349366
"web-tree-sitter": "^0.22.6",
350-
"zod": "^3.23.8"
367+
"zod": "^3.24.2"
351368
},
352369
"devDependencies": {
353370
"@changesets/cli": "^2.27.10",

src/activate/registerCommands.ts

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,40 @@ export type RegisterCommandOptions = {
1010
}
1111

1212
export const registerCommands = (options: RegisterCommandOptions) => {
13-
const { context, outputChannel } = options
13+
const { context } = options
1414

1515
for (const [command, callback] of Object.entries(getCommandsMap(options))) {
1616
context.subscriptions.push(vscode.commands.registerCommand(command, callback))
1717
}
1818
}
1919

20-
const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOptions) => {
21-
return {
22-
"roo-cline.plusButtonClicked": async () => {
23-
await provider.clearTask()
24-
await provider.postStateToWebview()
25-
await provider.postMessageToWebview({ type: "action", action: "chatButtonClicked" })
26-
},
27-
"roo-cline.mcpButtonClicked": () => {
28-
provider.postMessageToWebview({ type: "action", action: "mcpButtonClicked" })
29-
},
30-
"roo-cline.promptsButtonClicked": () => {
31-
provider.postMessageToWebview({ type: "action", action: "promptsButtonClicked" })
32-
},
33-
"roo-cline.popoutButtonClicked": () => openClineInNewTab({ context, outputChannel }),
34-
"roo-cline.openInNewTab": () => openClineInNewTab({ context, outputChannel }),
35-
"roo-cline.settingsButtonClicked": () => {
36-
provider.postMessageToWebview({ type: "action", action: "settingsButtonClicked" })
37-
},
38-
"roo-cline.historyButtonClicked": () => {
39-
provider.postMessageToWebview({ type: "action", action: "historyButtonClicked" })
40-
},
41-
"roo-cline.helpButtonClicked": () => {
42-
vscode.env.openExternal(vscode.Uri.parse("https://docs.roocode.com"))
43-
},
44-
}
45-
}
20+
const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOptions) => ({
21+
"roo-cline.plusButtonClicked": async () => {
22+
await provider.clearTask()
23+
await provider.postStateToWebview()
24+
await provider.postMessageToWebview({ type: "action", action: "chatButtonClicked" })
25+
},
26+
"roo-cline.researchButtonClicked": () => {
27+
provider.postMessageToWebview({ type: "action", action: "researchButtonClicked" })
28+
},
29+
"roo-cline.promptsButtonClicked": () => {
30+
provider.postMessageToWebview({ type: "action", action: "promptsButtonClicked" })
31+
},
32+
"roo-cline.mcpButtonClicked": () => {
33+
provider.postMessageToWebview({ type: "action", action: "mcpButtonClicked" })
34+
},
35+
"roo-cline.historyButtonClicked": () => {
36+
provider.postMessageToWebview({ type: "action", action: "historyButtonClicked" })
37+
},
38+
"roo-cline.popoutButtonClicked": () => openClineInNewTab({ context, outputChannel }),
39+
"roo-cline.settingsButtonClicked": () => {
40+
provider.postMessageToWebview({ type: "action", action: "settingsButtonClicked" })
41+
},
42+
"roo-cline.helpButtonClicked": () => {
43+
vscode.env.openExternal(vscode.Uri.parse("https://docs.roocode.com"))
44+
},
45+
"roo-cline.openInNewTab": () => openClineInNewTab({ context, outputChannel }),
46+
})
4647

4748
const openClineInNewTab = async ({ context, outputChannel }: Omit<RegisterCommandOptions, "provider">) => {
4849
outputChannel.appendLine("Opening Roo Code in new tab")

src/core/webview/ClineProvider.ts

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,18 @@ import { ApiConfiguration, ApiProvider, ModelInfo } from "../../shared/api"
2020
import { findLast } from "../../shared/array"
2121
import { ApiConfigMeta, ExtensionMessage } from "../../shared/ExtensionMessage"
2222
import { 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"
2430
import { Mode, CustomModePrompts, PromptComponent, defaultModeSlug } from "../../shared/modes"
2531
import { SYSTEM_PROMPT } from "../prompts/system"
2632
import { fileExistsAtPath } from "../../utils/fs"
2733
import { Cline } from "../Cline"
34+
import { DeepResearchService } from "../../services/deep-research/DeepResearchService"
2835
import { openMention } from "../mentions"
2936
import { getNonce } from "./getNonce"
3037
import { getUri } from "./getUri"
@@ -40,11 +47,10 @@ import { CustomSupportPrompts, supportPrompt } from "../../shared/support-prompt
4047
import { ACTION_NAMES } from "../CodeActionProvider"
4148
import { McpServerManager } from "../../services/mcp/McpServerManager"
4249

43-
/*
44-
https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/default/weather-webview/src/providers/WeatherViewProvider.ts
45-
46-
https://github.com/KumarVariable/vscode-extension-sidebar-html/blob/master/src/customSidebarViewProvider.ts
47-
*/
50+
/**
51+
* https://github.com/microsoft/vscode-webview-ui-toolkit-samples/blob/main/default/weather-webview/src/providers/WeatherViewProvider.ts
52+
* https://github.com/KumarVariable/vscode-extension-sidebar-html/blob/master/src/customSidebarViewProvider.ts
53+
*/
4854

4955
type SecretKey =
5056
| "apiKey"
@@ -60,6 +66,8 @@ type SecretKey =
6066
| "mistralApiKey"
6167
| "unboundApiKey"
6268
| "requestyApiKey"
69+
| "firecrawlApiKey"
70+
6371
type GlobalStateKey =
6472
| "apiProvider"
6573
| "apiModelId"
@@ -148,6 +156,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
148156
private view?: vscode.WebviewView | vscode.WebviewPanel
149157
private isViewLaunched = false
150158
private cline?: Cline
159+
private deepResearchService?: DeepResearchService
151160
private workspaceTracker?: WorkspaceTracker
152161
protected mcpHub?: McpHub // Change from private to protected
153162
private latestAnnouncementId = "jan-21-2025-custom-modes" // update to some unique identifier when we add a new announcement
@@ -160,6 +169,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
160169
) {
161170
this.outputChannel.appendLine("ClineProvider instantiated")
162171
ClineProvider.activeInstances.add(this)
172+
163173
this.workspaceTracker = new WorkspaceTracker(this)
164174
this.configManager = new ConfigManager(this.context)
165175
this.customModesManager = new CustomModesManager(this.context, async () => {
@@ -1495,10 +1505,59 @@ export class ClineProvider implements vscode.WebviewViewProvider {
14951505
}
14961506

14971507
await this.customModesManager.deleteCustomMode(message.slug)
1498-
// Switch back to default mode after deletion
1508+
// Switch back to default mode after deletion.
14991509
await this.updateGlobalState("mode", defaultModeSlug)
15001510
await this.postStateToWebview()
15011511
}
1512+
break
1513+
case "research.task": {
1514+
const result = researchTaskPayloadSchema.safeParse(message.payload)
1515+
1516+
if (!result.success) {
1517+
console.warn(
1518+
`[ClineProvider#research.task] Invalid payload: ${JSON.stringify(message.payload)}`,
1519+
)
1520+
break
1521+
}
1522+
1523+
if (result.success && !this.deepResearchService) {
1524+
const { session } = result.data
1525+
this.deepResearchService = new DeepResearchService(session, this)
1526+
this.deepResearchService.input(session.query)
1527+
}
1528+
1529+
break
1530+
}
1531+
case "research.input": {
1532+
const result = researchInputPayloadSchema.safeParse(message.payload)
1533+
1534+
if (!result.success) {
1535+
console.warn(
1536+
`[ClineProvider#research.input] Invalid payload: ${JSON.stringify(message.payload)}`,
1537+
)
1538+
break
1539+
}
1540+
1541+
if (result.success && this.deepResearchService) {
1542+
const { content } = result.data.message
1543+
this.deepResearchService.input(content)
1544+
}
1545+
1546+
break
1547+
}
1548+
case "research.viewReport":
1549+
this.deepResearchService?.viewReport()
1550+
break
1551+
case "research.createTask":
1552+
this.deepResearchService?.createTask()
1553+
break
1554+
case "research.abort":
1555+
this.deepResearchService?.abort()
1556+
break
1557+
case "research.reset":
1558+
this.deepResearchService?.abort()
1559+
this.deepResearchService = undefined
1560+
break
15021561
}
15031562
},
15041563
null,
@@ -1646,6 +1705,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
16461705
requestyModelId,
16471706
requestyModelInfo,
16481707
modelTemperature,
1708+
firecrawlApiKey,
16491709
} = apiConfiguration
16501710
await this.updateGlobalState("apiProvider", apiProvider)
16511711
await this.updateGlobalState("apiModelId", apiModelId)
@@ -1692,6 +1752,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
16921752
await this.updateGlobalState("requestyModelId", requestyModelId)
16931753
await this.updateGlobalState("requestyModelInfo", requestyModelInfo)
16941754
await this.updateGlobalState("modelTemperature", modelTemperature)
1755+
await this.storeSecret("firecrawlApiKey", firecrawlApiKey)
16951756
if (this.cline) {
16961757
this.cline.api = buildApiHandler(apiConfiguration)
16971758
}
@@ -2575,6 +2636,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
25752636
requestyModelInfo,
25762637
modelTemperature,
25772638
maxOpenTabsContext,
2639+
firecrawlApiKey,
25782640
] = await Promise.all([
25792641
this.getGlobalState("apiProvider") as Promise<ApiProvider | undefined>,
25802642
this.getGlobalState("apiModelId") as Promise<string | undefined>,
@@ -2657,6 +2719,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
26572719
this.getGlobalState("requestyModelInfo") as Promise<ModelInfo | undefined>,
26582720
this.getGlobalState("modelTemperature") as Promise<number | undefined>,
26592721
this.getGlobalState("maxOpenTabsContext") as Promise<number | undefined>,
2722+
this.getSecret("firecrawlApiKey") as Promise<string | undefined>,
26602723
])
26612724

26622725
let apiProvider: ApiProvider
@@ -2720,6 +2783,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
27202783
requestyModelId,
27212784
requestyModelInfo,
27222785
modelTemperature,
2786+
firecrawlApiKey,
27232787
},
27242788
lastShownAnnouncementId,
27252789
customInstructions,
@@ -2875,6 +2939,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
28752939
"mistralApiKey",
28762940
"unboundApiKey",
28772941
"requestyApiKey",
2942+
"firecrawlApiKey",
28782943
]
28792944
for (const key of secretKeys) {
28802945
await this.storeSecret(key, undefined)

0 commit comments

Comments
 (0)