feat(FN-4455): complete Step 5 — migrate memory mode resolution and tests

Fusion-Task-Id: FN-4455
Fusion-Task-Lineage: 735091fa-9d42-4f23-9c5b-3e5889da99a6
This commit is contained in:
Fusion
2026-05-14 13:52:35 -07:00
committed by gsxdsm
parent 40214c7514
commit 49bb2b3858
11 changed files with 15 additions and 43 deletions

View File

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import type { Agent, GlobalSettings, ProjectSettings } from "../types.js";
import type { Agent, GlobalSettings } from "../types.js";
import { resolveAgentMemoryInclusionMode } from "../agent-memory-mode.js";
function makeAgent(mode?: unknown): Agent {
@@ -16,24 +16,14 @@ function makeAgent(mode?: unknown): Agent {
}
describe("resolveAgentMemoryInclusionMode", () => {
it("prefers per-agent override over project and global", () => {
it("prefers per-agent override over global", () => {
const result = resolveAgentMemoryInclusionMode({
agent: makeAgent("off"),
projectSettings: { agentMemoryInclusionMode: "index" } as ProjectSettings,
globalSettings: { agentMemoryInclusionMode: "full" } as GlobalSettings,
});
expect(result).toEqual({ mode: "off", source: "agent" });
});
it("prefers project over global", () => {
const result = resolveAgentMemoryInclusionMode({
agent: makeAgent(),
projectSettings: { agentMemoryInclusionMode: "index" } as ProjectSettings,
globalSettings: { agentMemoryInclusionMode: "off" } as GlobalSettings,
});
expect(result).toEqual({ mode: "index", source: "project" });
});
it("prefers global over default", () => {
const result = resolveAgentMemoryInclusionMode({
agent: makeAgent(),
@@ -50,7 +40,6 @@ describe("resolveAgentMemoryInclusionMode", () => {
it("ignores invalid values and falls through", () => {
const result = resolveAgentMemoryInclusionMode({
agent: makeAgent("bad"),
projectSettings: { agentMemoryInclusionMode: "nope" as never } as ProjectSettings,
globalSettings: { agentMemoryInclusionMode: "index" } as GlobalSettings,
});
expect(result).toEqual({ mode: "index", source: "global" });

View File

@@ -70,7 +70,7 @@ describe("settings key parity", () => {
expect(isGlobalOnlySettingsKey("persistAgentThinkingLogEphemeral")).toBe(true);
expect(isGlobalSettingsKey("researchSettings")).toBe(false);
expect(isGlobalSettingsKey("agentMemoryInclusionMode")).toBe(true);
expect(isProjectSettingsKey("agentMemoryInclusionMode")).toBe(true);
expect(isProjectSettingsKey("agentMemoryInclusionMode")).toBe(false);
});
it("defaults persisted thinking logs to disabled", () => {
@@ -190,7 +190,7 @@ describe("settings key parity", () => {
it("only intentional shared keys appear in both global and project scopes", () => {
const projectKeySet = new Set(PROJECT_SETTINGS_KEYS as readonly string[]);
const overlap = (GLOBAL_SETTINGS_KEYS as readonly string[]).filter((key) => projectKeySet.has(key));
expect(overlap).toEqual(["taskTokenBudget", "githubTrackingDefaultRepo", "agentMemoryInclusionMode"]);
expect(overlap).toEqual(["taskTokenBudget", "githubTrackingDefaultRepo"]);
});
});

View File

@@ -1,10 +1,9 @@
import type { Agent, AgentMemoryInclusionMode, GlobalSettings, ProjectSettings } from "./types.js";
import type { Agent, AgentMemoryInclusionMode, GlobalSettings } from "./types.js";
export type AgentMemoryInclusionModeSource = "agent" | "project" | "global" | "default";
export type AgentMemoryInclusionModeSource = "agent" | "global" | "default";
export interface ResolveAgentMemoryInclusionModeInput {
agent?: Agent | null;
projectSettings?: ProjectSettings | null;
globalSettings?: GlobalSettings | null;
}
@@ -19,7 +18,6 @@ function isAgentMemoryInclusionMode(value: unknown): value is AgentMemoryInclusi
export function resolveAgentMemoryInclusionMode({
agent,
projectSettings,
globalSettings,
}: ResolveAgentMemoryInclusionModeInput): ResolvedAgentMemoryInclusionMode {
const agentMode = agent?.runtimeConfig && typeof agent.runtimeConfig === "object"
@@ -29,11 +27,6 @@ export function resolveAgentMemoryInclusionMode({
return { mode: agentMode, source: "agent" };
}
const projectMode = projectSettings?.agentMemoryInclusionMode;
if (isAgentMemoryInclusionMode(projectMode)) {
return { mode: projectMode, source: "project" };
}
const globalMode = globalSettings?.agentMemoryInclusionMode;
if (isAgentMemoryInclusionMode(globalMode)) {
return { mode: globalMode, source: "global" };

View File

@@ -94,7 +94,6 @@ export async function ensureMemoryFile(rootDir: string): Promise<boolean> {
type MemorySettings = {
memoryEnabled?: boolean;
memoryBackendType?: string;
agentMemoryInclusionMode?: "full" | "index" | "off";
[key: string]: unknown;
};

View File

@@ -298,7 +298,6 @@ export const DEFAULT_PROJECT_SETTINGS = {
taskEvaluationFollowUpPolicy: "off",
taskEvaluationRetention: undefined,
memoryEnabled: true,
agentMemoryInclusionMode: undefined,
memoryBackendType: "qmd",
memoryAutoSummarizeEnabled: false,
memoryAutoSummarizeThresholdChars: 50_000,

View File

@@ -2657,12 +2657,6 @@ export interface ProjectSettings {
* in their prompts and will not read or write to .fusion/memory/ files.
* Default: true (enabled for backward compatibility). */
memoryEnabled?: boolean;
/** Agent memory prompt inclusion mode for this project.
* - "full": inline full curated memory content into prompts
* - "index": include only a compact memory index and fetch details via tools
* - "off": omit agent-memory prompt sections entirely
*/
agentMemoryInclusionMode?: AgentMemoryInclusionMode;
/** Memory backend type for pluggable memory storage.
* Available built-in backends:
* - "qmd": QMD (Quantized Memory Distillation) backend using the qmd CLI tool (default)