Unverified 提交 75b4b7c2 authored 作者: Will Chen's avatar Will Chen 提交者: GitHub

Handle mentioned apps via smart context (#1412)

<!-- CURSOR_SUMMARY --> > [!NOTE] > Send mentioned apps (names + files) to the engine through dyad_options, omit inline other-apps prefix when engine is enabled, and adjust e2e to snapshot request payload. > > - **Engine/Backend**: > - Pass mentioned apps to engine via `providerOptions['dyad-engine'].dyadMentionedApps` and forward as `dyad_options.mentioned_apps` in `llm_engine_provider`. > - Gate inline other-apps context: only include `otherCodebasePrefix` when `isEngineEnabled` is false. > - Enhance `extractMentionedAppsCodebases` to return `files` alongside `codebaseInfo`. > - **Tests**: > - e2e: change `mention app (with pro)` snapshot to `snapshotServerDump("request")` and update snapshot to assert request payload contents. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 7ddddf6c16c53cd36b4c7e4ec6a57da0616d1bb0. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
上级 29d8421c
......@@ -17,5 +17,5 @@ test("mention app (with pro)", async ({ po }) => {
await po.goToAppsTab();
await po.sendPrompt("[dump] @app:minimal-with-ai-rules hi");
await po.snapshotServerDump("all-messages");
await po.snapshotServerDump("request");
});
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -630,18 +630,21 @@ This conversation includes one or more image attachments. When the user uploads
},
] as const);
const otherCodebasePrefix = otherAppsCodebaseInfo
? ([
{
role: "user",
content: createOtherAppsCodebasePrompt(otherAppsCodebaseInfo),
},
{
role: "assistant",
content: "OK.",
},
] as const)
: [];
// If engine is enabled, we will send the other apps codebase info to the engine
// and process it with smart context.
const otherCodebasePrefix =
otherAppsCodebaseInfo && !isEngineEnabled
? ([
{
role: "user",
content: createOtherAppsCodebasePrompt(otherAppsCodebaseInfo),
},
{
role: "assistant",
content: "OK.",
},
] as const)
: [];
const limitedHistoryChatMessages = limitedMessageHistory.map((msg) => ({
role: msg.role as "user" | "assistant" | "system",
......@@ -720,6 +723,12 @@ This conversation includes one or more image attachments. When the user uploads
"dyad-engine": {
dyadRequestId,
dyadDisableFiles,
dyadMentionedApps: mentionedAppsCodebases.map(
({ files, appName }) => ({
appName,
files,
}),
),
},
"dyad-gateway": getExtraProviderOptions(
modelClient.builtinProviderId,
......
......@@ -142,6 +142,10 @@ export function createDyadEngine(
if ("dyadDisableFiles" in parsedBody) {
delete parsedBody.dyadDisableFiles;
}
const dyadMentionedApps = parsedBody.dyadMentionedApps;
if ("dyadMentionedApps" in parsedBody) {
delete parsedBody.dyadMentionedApps;
}
// Track and modify requestId with attempt number
let modifiedRequestId = requestId;
......@@ -161,6 +165,9 @@ export function createDyadEngine(
smart_context_mode: options.dyadOptions.smartContextMode,
enable_web_search: options.dyadOptions.enableWebSearch,
};
if (dyadMentionedApps?.length) {
parsedBody.dyad_options.mentioned_apps = dyadMentionedApps;
}
}
// Return modified request with files included and requestId in headers
......
import { db } from "../../db";
import { getDyadAppPath } from "../../paths/paths";
import { extractCodebase } from "../../utils/codebase";
import { CodebaseFile, extractCodebase } from "../../utils/codebase";
import { validateChatContext } from "../utils/context_paths_utils";
import log from "electron-log";
......@@ -10,7 +10,7 @@ const logger = log.scope("mention_apps");
export async function extractMentionedAppsCodebases(
mentionedAppNames: string[],
excludeCurrentAppId?: number,
): Promise<{ appName: string; codebaseInfo: string }[]> {
): Promise<{ appName: string; codebaseInfo: string; files: CodebaseFile[] }[]> {
if (mentionedAppNames.length === 0) {
return [];
}
......@@ -25,14 +25,18 @@ export async function extractMentionedAppsCodebases(
) && app.id !== excludeCurrentAppId,
);
const results: { appName: string; codebaseInfo: string }[] = [];
const results: {
appName: string;
codebaseInfo: string;
files: CodebaseFile[];
}[] = [];
for (const app of mentionedApps) {
try {
const appPath = getDyadAppPath(app.path);
const chatContext = validateChatContext(app.chatContext);
const { formattedOutput } = await extractCodebase({
const { formattedOutput, files } = await extractCodebase({
appPath,
chatContext,
});
......@@ -40,6 +44,7 @@ export async function extractMentionedAppsCodebases(
results.push({
appName: app.name,
codebaseInfo: formattedOutput,
files,
});
logger.log(`Extracted codebase for mentioned app: ${app.name}`);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论