Skip to content

Commit 5dcd0b3

Browse files
committed
(fix) False "failed" reporting in some tool trace descriptions fixed
1 parent dac909d commit 5dcd0b3

2 files changed

Lines changed: 25 additions & 4 deletions

File tree

src/architect/routes.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3853,6 +3853,15 @@ function buildArchitectChatSystemPrompt(plan: ArchitectPlanProjection | null, ru
38533853
].filter(Boolean).join("\n");
38543854
}
38553855

3856+
function isEmptyCompletionFallback(fallbackReason: string | null): boolean {
3857+
return fallbackReason === "empty_llm_response" || fallbackReason === "empty_cli_bridge_response";
3858+
}
3859+
3860+
export function formatUserVisibleFallbackReason(fallbackReason: string | null): string {
3861+
if (!fallbackReason || isEmptyCompletionFallback(fallbackReason)) return "";
3862+
return ` Runtime diagnostic: ${fallbackReason}.`;
3863+
}
3864+
38563865
function deterministicArchitectChatReply(
38573866
message: string,
38583867
fallbackReason: string | null,
@@ -3863,7 +3872,7 @@ function deterministicArchitectChatReply(
38633872
): string {
38643873
const project = buildProjectScopePayload();
38653874
const planLabel = chatScope === "plan" && plan ? `${plan.title} (${plan.id})` : "project scope";
3866-
const reason = fallbackReason ? ` LLM fallback reason: ${fallbackReason}.` : "";
3875+
const reason = formatUserVisibleFallbackReason(fallbackReason);
38673876
if (isArchitectRuntimeIdentityQuestion(message)) {
38683877
return [
38693878
"Current execution runtime:",
@@ -3956,8 +3965,8 @@ function mergeArchitectToolTraceEntries(
39563965
return [...byKey.values()].sort((left, right) => left.iteration - right.iteration);
39573966
}
39583967

3959-
function architectPassStatusFromFallback(fallbackReason: string | null): ArchitectPassStatus {
3960-
if (!fallbackReason) return "complete";
3968+
export function architectPassStatusFromFallback(fallbackReason: string | null): ArchitectPassStatus {
3969+
if (!fallbackReason || isEmptyCompletionFallback(fallbackReason)) return "complete";
39613970
if (fallbackReason.includes("_BRIDGE_TIMEOUT") || fallbackReason.toLowerCase().includes("timed out")) return "timed_out";
39623971
return "failed";
39633972
}
@@ -8532,7 +8541,9 @@ ${isArchitectDoomEnabled() ? " registerArchitectTabType({ type: 'doom', tit
85328541
if (tool === 'run_command') {
85338542
const exitCode = typeof data.exitCode === 'number' ? data.exitCode : null;
85348543
if (data.timedOut) return 'Timed out after ' + (data.durationMs || item.duration_ms || 0) + 'ms';
8535-
return exitCode === 0 ? 'Passed' : 'Failed' + (exitCode == null ? '' : ' exit ' + exitCode);
8544+
if (exitCode !== null) return exitCode === 0 ? 'Passed' : 'Failed exit ' + exitCode;
8545+
if (value.success === false || item.status === 'failed') return 'Failed';
8546+
return 'Passed';
85368547
}
85378548
if (tool === 'search_source_code' && typeof data.matchCount === 'number') return String(data.matchCount) + ' matches';
85388549
if (tool === 'list_directory' && Array.isArray(data.entries)) return String(data.entries.length) + ' items';

tests/standalone-architect-routes.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import {
2323
formatArchitectPluginListPayload,
2424
formatArchitectStatusPayload,
2525
buildArchitectProviderReadiness,
26+
formatUserVisibleFallbackReason,
27+
architectPassStatusFromFallback,
2628
handleArchitectRoute,
2729
} from "../src/architect/routes.js";
2830
import * as lifecycle from "../src/instance/lifecycle.js";
@@ -692,6 +694,14 @@ describe("standalone Architect route hardening", () => {
692694
}
693695
});
694696

697+
it("keeps empty native responses out of user-facing fallback copy", () => {
698+
expect(formatUserVisibleFallbackReason("empty_llm_response")).toBe("");
699+
expect(formatUserVisibleFallbackReason("empty_cli_bridge_response")).toBe("");
700+
expect(architectPassStatusFromFallback("empty_llm_response")).toBe("complete");
701+
expect(formatUserVisibleFallbackReason("architect_provider_failed: test")).toBe(" Runtime diagnostic: architect_provider_failed: test.");
702+
expect(architectPassStatusFromFallback("architect_provider_failed: test")).toBe("failed");
703+
});
704+
695705
it("does not let a failed OpenAI models probe skip native chat execution", async () => {
696706
const previousProvider = process.env.DREAMGRAPH_LLM_PROVIDER;
697707
const previousArchitectProvider = process.env.DREAMGRAPH_LLM_ARCHITECT_PROVIDER;

0 commit comments

Comments
 (0)