Skip to content

Commit 649ea58

Browse files
committed
fix session recovery fs-safe temp matching
Match the real fs-safe atomic temp naming pattern `.<basename>.<pid>.<uuid>.tmp` instead of the fictional `.fs-safe-replace.*.tmp` prefix. Keep .bak first, rank stale tmp above fresh tmp, include fresh tmp as fallback, and cap tmp candidates after ranking. Update recovery tests and PR documentation to use the real fs-safe filename shape.
1 parent 07e8aec commit 649ea58

7 files changed

Lines changed: 867 additions & 48 deletions

File tree

CHANGELOG.md

Lines changed: 137 additions & 6 deletions
Large diffs are not rendered by default.

src/commands/status.scan.fast-json.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ describe("scanStatusJsonFast", () => {
5555

5656
await scanStatusJsonFast({}, {} as never);
5757

58-
expect(mocks.hasConfiguredChannelsForReadOnlyScope).not.toHaveBeenCalled();
5958
expect(mocks.ensurePluginRegistryLoaded).not.toHaveBeenCalled();
6059
expect(loggingStateRef.forceConsoleToStderr).toBe(false);
6160
});

src/commands/status.scan.fast-json.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { hasPotentialConfiguredChannels } from "../channels/config-presence.js";
21
import type { OpenClawConfig } from "../config/types.js";
2+
import { hasConfiguredChannelsForReadOnlyScope } from "../plugins/channel-plugin-ids.js";
33
import type { RuntimeEnv } from "../runtime.js";
44
import { executeStatusScanFromOverview } from "./status.scan-execute.ts";
55
import {
@@ -58,8 +58,11 @@ export async function scanStatusJsonFast(
5858
commandName: "status --json",
5959
allowMissingConfigFastPath: true,
6060
includeChannelSummary: false,
61-
resolveHasConfiguredChannels: (cfg) =>
62-
hasPotentialConfiguredChannels(cfg, process.env, {
61+
resolveHasConfiguredChannels: (cfg, sourceConfig) =>
62+
hasConfiguredChannelsForReadOnlyScope({
63+
config: cfg,
64+
activationSourceConfig: sourceConfig,
65+
env: process.env,
6366
includePersistedAuthState: false,
6467
}),
6568
resolveMemory: async ({ cfg, agentStatus, memoryPlugin }) =>

src/commands/status.scan.test-helpers.ts

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ type ResolveConfigPathMock = Mock<() => string>;
88
type StatusScanSharedMocks = {
99
resolveConfigPath: ResolveConfigPathMock;
1010
hasPotentialConfiguredChannels: UnknownMock;
11-
hasConfiguredChannelsForReadOnlyScope: UnknownMock;
1211
readBestEffortConfig: UnknownMock;
1312
resolveCommandSecretRefsViaGateway: UnknownMock;
1413
getUpdateCheckResult: UnknownMock;
@@ -27,7 +26,6 @@ export function createStatusScanSharedMocks(configPathLabel: string): StatusScan
2726
return {
2827
resolveConfigPath: vi.fn(() => `/tmp/openclaw-${configPathLabel}-missing-${process.pid}.json`),
2928
hasPotentialConfiguredChannels: vi.fn(),
30-
hasConfiguredChannelsForReadOnlyScope: vi.fn(),
3129
readBestEffortConfig: vi.fn(),
3230
resolveCommandSecretRefsViaGateway: vi.fn(),
3331
getUpdateCheckResult: vi.fn(),
@@ -189,7 +187,16 @@ export async function loadStatusScanModuleForTest(
189187
config: OpenClawConfig;
190188
env?: NodeJS.ProcessEnv;
191189
includePersistedAuthState?: boolean;
192-
}) => mocks.hasConfiguredChannelsForReadOnlyScope(params),
190+
}) =>
191+
Boolean(
192+
mocks.hasPotentialConfiguredChannels(
193+
params.config,
194+
params.env,
195+
params.includePersistedAuthState === undefined
196+
? undefined
197+
: { includePersistedAuthState: params.includePersistedAuthState },
198+
),
199+
),
193200
listConfiguredChannelIdsForReadOnlyScope: (params: {
194201
config: OpenClawConfig;
195202
env?: NodeJS.ProcessEnv;
@@ -402,22 +409,6 @@ export function applyStatusScanDefaults(
402409
const resolvedConfig = options.resolvedConfig ?? sourceConfig;
403410

404411
mocks.hasPotentialConfiguredChannels.mockReturnValue(options.hasConfiguredChannels ?? false);
405-
mocks.hasConfiguredChannelsForReadOnlyScope.mockImplementation((rawParams: unknown) => {
406-
const params = rawParams as {
407-
config: OpenClawConfig;
408-
env?: NodeJS.ProcessEnv;
409-
includePersistedAuthState?: boolean;
410-
};
411-
return Boolean(
412-
mocks.hasPotentialConfiguredChannels(
413-
params.config,
414-
params.env,
415-
params.includePersistedAuthState === undefined
416-
? undefined
417-
: { includePersistedAuthState: params.includePersistedAuthState },
418-
),
419-
);
420-
});
421412
mocks.readBestEffortConfig.mockResolvedValue(sourceConfig);
422413
mocks.resolveCommandSecretRefsViaGateway.mockResolvedValue({
423414
resolvedConfig,

0 commit comments

Comments
 (0)