feat(statusline): include memfs metadata in command payload (#1389)
Co-authored-by: Letta Code <noreply@letta.com>
This commit is contained in:
@@ -2493,6 +2493,12 @@ export default function App({
|
|||||||
// Configurable status line hook
|
// Configurable status line hook
|
||||||
const sessionStatsSnapshot = sessionStatsRef.current.getSnapshot();
|
const sessionStatsSnapshot = sessionStatsRef.current.getSnapshot();
|
||||||
const contextWindowSize = llmConfigRef.current?.context_window;
|
const contextWindowSize = llmConfigRef.current?.context_window;
|
||||||
|
const reflectionSettings = getReflectionSettings();
|
||||||
|
const memfsEnabled = settingsManager.isMemfsEnabled(agentId);
|
||||||
|
const memfsDirectory =
|
||||||
|
memfsEnabled && agentId && agentId !== "loading"
|
||||||
|
? getMemoryFilesystemRoot(agentId)
|
||||||
|
: null;
|
||||||
const statusLine = useConfigurableStatusLine({
|
const statusLine = useConfigurableStatusLine({
|
||||||
modelId: llmConfigRef.current?.model ?? null,
|
modelId: llmConfigRef.current?.model ?? null,
|
||||||
modelDisplayName: currentModelDisplay,
|
modelDisplayName: currentModelDisplay,
|
||||||
@@ -2511,6 +2517,12 @@ export default function App({
|
|||||||
totalOutputTokens: sessionStatsSnapshot.usage.completionTokens,
|
totalOutputTokens: sessionStatsSnapshot.usage.completionTokens,
|
||||||
contextWindowSize,
|
contextWindowSize,
|
||||||
usedContextTokens: contextTrackerRef.current.lastContextTokens,
|
usedContextTokens: contextTrackerRef.current.lastContextTokens,
|
||||||
|
stepCount: sessionStatsSnapshot.usage.stepCount,
|
||||||
|
turnCount: contextTrackerRef.current.currentTurnId,
|
||||||
|
reflectionMode: reflectionSettings.trigger,
|
||||||
|
reflectionStepCount: reflectionSettings.stepCount,
|
||||||
|
memfsEnabled,
|
||||||
|
memfsDirectory,
|
||||||
permissionMode: uiPermissionMode,
|
permissionMode: uiPermissionMode,
|
||||||
networkPhase,
|
networkPhase,
|
||||||
terminalWidth: chromeColumns,
|
terminalWidth: chromeColumns,
|
||||||
@@ -7625,6 +7637,19 @@ export default function App({
|
|||||||
contextWindowSize: llmConfigRef.current?.context_window,
|
contextWindowSize: llmConfigRef.current?.context_window,
|
||||||
usedContextTokens:
|
usedContextTokens:
|
||||||
contextTrackerRef.current.lastContextTokens,
|
contextTrackerRef.current.lastContextTokens,
|
||||||
|
stepCount: stats.usage.stepCount,
|
||||||
|
turnCount: contextTrackerRef.current.currentTurnId,
|
||||||
|
reflectionMode: getReflectionSettings().trigger,
|
||||||
|
reflectionStepCount: getReflectionSettings().stepCount,
|
||||||
|
memfsEnabled:
|
||||||
|
agentId !== "loading"
|
||||||
|
? settingsManager.isMemfsEnabled(agentId)
|
||||||
|
: false,
|
||||||
|
memfsDirectory:
|
||||||
|
agentId !== "loading" &&
|
||||||
|
settingsManager.isMemfsEnabled(agentId)
|
||||||
|
? getMemoryFilesystemRoot(agentId)
|
||||||
|
: null,
|
||||||
permissionMode: uiPermissionMode,
|
permissionMode: uiPermissionMode,
|
||||||
networkPhase,
|
networkPhase,
|
||||||
terminalWidth: chromeColumns,
|
terminalWidth: chromeColumns,
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ export interface StatusLinePayloadBuildInput {
|
|||||||
totalOutputTokens?: number;
|
totalOutputTokens?: number;
|
||||||
contextWindowSize?: number;
|
contextWindowSize?: number;
|
||||||
usedContextTokens?: number;
|
usedContextTokens?: number;
|
||||||
|
stepCount?: number;
|
||||||
|
turnCount?: number;
|
||||||
|
reflectionMode?: "off" | "step-count" | "compaction-event" | null;
|
||||||
|
reflectionStepCount?: number;
|
||||||
|
memfsEnabled?: boolean;
|
||||||
|
memfsDirectory?: string | null;
|
||||||
permissionMode?: string;
|
permissionMode?: string;
|
||||||
networkPhase?: "upload" | "download" | "error" | null;
|
networkPhase?: "upload" | "download" | "error" | null;
|
||||||
terminalWidth?: number;
|
terminalWidth?: number;
|
||||||
@@ -82,6 +88,16 @@ export interface StatusLinePayload {
|
|||||||
id: string | null;
|
id: string | null;
|
||||||
name: string | null;
|
name: string | null;
|
||||||
};
|
};
|
||||||
|
step_count: number;
|
||||||
|
turn_count: number;
|
||||||
|
reflection: {
|
||||||
|
mode: "off" | "step-count" | "compaction-event" | null;
|
||||||
|
step_count: number;
|
||||||
|
};
|
||||||
|
memfs: {
|
||||||
|
enabled: boolean;
|
||||||
|
memory_dir: string | null;
|
||||||
|
};
|
||||||
permission_mode: string | null;
|
permission_mode: string | null;
|
||||||
network_phase: "upload" | "download" | "error" | null;
|
network_phase: "upload" | "download" | "error" | null;
|
||||||
terminal_width: number | null;
|
terminal_width: number | null;
|
||||||
@@ -128,6 +144,12 @@ export function buildStatusLinePayload(
|
|||||||
0,
|
0,
|
||||||
Math.floor(input.usedContextTokens ?? 0),
|
Math.floor(input.usedContextTokens ?? 0),
|
||||||
);
|
);
|
||||||
|
const stepCount = Math.max(0, Math.floor(input.stepCount ?? 0));
|
||||||
|
const turnCount = Math.max(0, Math.floor(input.turnCount ?? 0));
|
||||||
|
const reflectionStepCount = Math.max(
|
||||||
|
0,
|
||||||
|
Math.floor(input.reflectionStepCount ?? 0),
|
||||||
|
);
|
||||||
|
|
||||||
const percentages =
|
const percentages =
|
||||||
contextWindowSize > 0
|
contextWindowSize > 0
|
||||||
@@ -175,6 +197,16 @@ export function buildStatusLinePayload(
|
|||||||
id: input.agentId ?? null,
|
id: input.agentId ?? null,
|
||||||
name: input.agentName ?? null,
|
name: input.agentName ?? null,
|
||||||
},
|
},
|
||||||
|
step_count: stepCount,
|
||||||
|
turn_count: turnCount,
|
||||||
|
reflection: {
|
||||||
|
mode: input.reflectionMode ?? null,
|
||||||
|
step_count: reflectionStepCount,
|
||||||
|
},
|
||||||
|
memfs: {
|
||||||
|
enabled: input.memfsEnabled ?? false,
|
||||||
|
memory_dir: input.memfsDirectory ?? null,
|
||||||
|
},
|
||||||
permission_mode: input.permissionMode ?? null,
|
permission_mode: input.permissionMode ?? null,
|
||||||
network_phase: input.networkPhase ?? null,
|
network_phase: input.networkPhase ?? null,
|
||||||
terminal_width: input.terminalWidth ?? null,
|
terminal_width: input.terminalWidth ?? null,
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ export const STATUSLINE_NATIVE_FIELDS: StatusLineFieldSpec[] = [
|
|||||||
{ path: "model.display_name" },
|
{ path: "model.display_name" },
|
||||||
{ path: "agent.id" },
|
{ path: "agent.id" },
|
||||||
{ path: "agent.name" },
|
{ path: "agent.name" },
|
||||||
|
{ path: "step_count" },
|
||||||
|
{ path: "turn_count" },
|
||||||
|
{ path: "reflection.mode" },
|
||||||
|
{ path: "reflection.step_count" },
|
||||||
|
{ path: "memfs.enabled" },
|
||||||
|
{ path: "memfs.memory_dir" },
|
||||||
{ path: "cost.total_duration_ms" },
|
{ path: "cost.total_duration_ms" },
|
||||||
{ path: "cost.total_api_duration_ms" },
|
{ path: "cost.total_api_duration_ms" },
|
||||||
{ path: "context_window.context_window_size" },
|
{ path: "context_window.context_window_size" },
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ export interface StatusLineInputs {
|
|||||||
totalOutputTokens?: number;
|
totalOutputTokens?: number;
|
||||||
contextWindowSize?: number;
|
contextWindowSize?: number;
|
||||||
usedContextTokens?: number;
|
usedContextTokens?: number;
|
||||||
|
stepCount?: number;
|
||||||
|
turnCount?: number;
|
||||||
|
reflectionMode?: "off" | "step-count" | "compaction-event" | null;
|
||||||
|
reflectionStepCount?: number;
|
||||||
|
memfsEnabled?: boolean;
|
||||||
|
memfsDirectory?: string | null;
|
||||||
permissionMode?: string;
|
permissionMode?: string;
|
||||||
networkPhase?: "upload" | "download" | "error" | null;
|
networkPhase?: "upload" | "download" | "error" | null;
|
||||||
terminalWidth?: number;
|
terminalWidth?: number;
|
||||||
@@ -79,6 +85,12 @@ function toPayloadInput(inputs: StatusLineInputs): StatusLinePayloadBuildInput {
|
|||||||
totalOutputTokens: inputs.totalOutputTokens,
|
totalOutputTokens: inputs.totalOutputTokens,
|
||||||
contextWindowSize: inputs.contextWindowSize,
|
contextWindowSize: inputs.contextWindowSize,
|
||||||
usedContextTokens: inputs.usedContextTokens,
|
usedContextTokens: inputs.usedContextTokens,
|
||||||
|
stepCount: inputs.stepCount,
|
||||||
|
turnCount: inputs.turnCount,
|
||||||
|
reflectionMode: inputs.reflectionMode,
|
||||||
|
reflectionStepCount: inputs.reflectionStepCount,
|
||||||
|
memfsEnabled: inputs.memfsEnabled,
|
||||||
|
memfsDirectory: inputs.memfsDirectory,
|
||||||
permissionMode: inputs.permissionMode,
|
permissionMode: inputs.permissionMode,
|
||||||
networkPhase: inputs.networkPhase,
|
networkPhase: inputs.networkPhase,
|
||||||
terminalWidth: inputs.terminalWidth,
|
terminalWidth: inputs.terminalWidth,
|
||||||
|
|||||||
@@ -19,6 +19,12 @@ describe("statusLinePayload", () => {
|
|||||||
totalOutputTokens: 450,
|
totalOutputTokens: 450,
|
||||||
contextWindowSize: 200_000,
|
contextWindowSize: 200_000,
|
||||||
usedContextTokens: 40_000,
|
usedContextTokens: 40_000,
|
||||||
|
stepCount: 7,
|
||||||
|
turnCount: 3,
|
||||||
|
reflectionMode: "step-count",
|
||||||
|
reflectionStepCount: 10,
|
||||||
|
memfsEnabled: true,
|
||||||
|
memfsDirectory: "/Users/test/.letta/agents/agent-123/memory",
|
||||||
permissionMode: "default",
|
permissionMode: "default",
|
||||||
networkPhase: "download",
|
networkPhase: "download",
|
||||||
terminalWidth: 120,
|
terminalWidth: 120,
|
||||||
@@ -31,6 +37,14 @@ describe("statusLinePayload", () => {
|
|||||||
expect(payload.model.display_name).toBe("Sonnet");
|
expect(payload.model.display_name).toBe("Sonnet");
|
||||||
expect(payload.context_window.used_percentage).toBe(20);
|
expect(payload.context_window.used_percentage).toBe(20);
|
||||||
expect(payload.context_window.remaining_percentage).toBe(80);
|
expect(payload.context_window.remaining_percentage).toBe(80);
|
||||||
|
expect(payload.step_count).toBe(7);
|
||||||
|
expect(payload.turn_count).toBe(3);
|
||||||
|
expect(payload.reflection.mode).toBe("step-count");
|
||||||
|
expect(payload.reflection.step_count).toBe(10);
|
||||||
|
expect(payload.memfs.enabled).toBe(true);
|
||||||
|
expect(payload.memfs.memory_dir).toBe(
|
||||||
|
"/Users/test/.letta/agents/agent-123/memory",
|
||||||
|
);
|
||||||
expect(payload.permission_mode).toBe("default");
|
expect(payload.permission_mode).toBe("default");
|
||||||
expect(payload.network_phase).toBe("download");
|
expect(payload.network_phase).toBe("download");
|
||||||
expect(payload.terminal_width).toBe(120);
|
expect(payload.terminal_width).toBe(120);
|
||||||
@@ -45,6 +59,12 @@ describe("statusLinePayload", () => {
|
|||||||
expect(payload.transcript_path).toBeNull();
|
expect(payload.transcript_path).toBeNull();
|
||||||
expect(payload.output_style.name).toBeNull();
|
expect(payload.output_style.name).toBeNull();
|
||||||
expect(payload.vim).toBeNull();
|
expect(payload.vim).toBeNull();
|
||||||
|
expect(payload.step_count).toBe(0);
|
||||||
|
expect(payload.turn_count).toBe(0);
|
||||||
|
expect(payload.reflection.mode).toBeNull();
|
||||||
|
expect(payload.reflection.step_count).toBe(0);
|
||||||
|
expect(payload.memfs.enabled).toBe(false);
|
||||||
|
expect(payload.memfs.memory_dir).toBeNull();
|
||||||
expect(payload.cost.total_cost_usd).toBeNull();
|
expect(payload.cost.total_cost_usd).toBeNull();
|
||||||
expect(payload.context_window.current_usage).toBeNull();
|
expect(payload.context_window.current_usage).toBeNull();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user