feat(FN-4393): complete Step 1 — add memory inclusion mode settings and resolver

Fusion-Task-Id: FN-4393
Fusion-Task-Lineage: 3615215d-9caa-4402-9258-a5a5de137dd6
This commit is contained in:
Fusion
2026-05-13 22:56:52 -07:00
committed by gsxdsm
parent db618bd380
commit 283fcea6ee
7 changed files with 132 additions and 2 deletions

View File

@@ -0,0 +1,58 @@
import { describe, expect, it } from "vitest";
import type { Agent, GlobalSettings, ProjectSettings } from "../types.js";
import { resolveAgentMemoryInclusionMode } from "../agent-memory-mode.js";
function makeAgent(mode?: unknown): Agent {
return {
id: "agent-1",
name: "Agent 1",
role: "executor",
state: "idle",
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
metadata: {},
runtimeConfig: mode === undefined ? {} : { agentMemoryInclusionMode: mode },
};
}
describe("resolveAgentMemoryInclusionMode", () => {
it("prefers per-agent override over project and 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(),
globalSettings: { agentMemoryInclusionMode: "off" } as GlobalSettings,
});
expect(result).toEqual({ mode: "off", source: "global" });
});
it("falls back to full default", () => {
const result = resolveAgentMemoryInclusionMode({ agent: makeAgent() });
expect(result).toEqual({ mode: "full", source: "default" });
});
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

@@ -69,6 +69,8 @@ describe("settings key parity", () => {
expect(isProjectSettingsKey("persistAgentThinkingLogEphemeral")).toBe(false);
expect(isGlobalOnlySettingsKey("persistAgentThinkingLogEphemeral")).toBe(true);
expect(isGlobalSettingsKey("researchSettings")).toBe(false);
expect(isGlobalSettingsKey("agentMemoryInclusionMode")).toBe(true);
expect(isProjectSettingsKey("agentMemoryInclusionMode")).toBe(true);
});
it("defaults persisted thinking logs to disabled", () => {
@@ -162,7 +164,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(["githubTrackingDefaultRepo"]);
expect(overlap).toEqual(["githubTrackingDefaultRepo", "agentMemoryInclusionMode"]);
});
});