










@@ -9,6 +9,8 @@ const runtime = vi.hoisted(() => ({
99const resolveControlUiLinksMock = vi.hoisted(() =>
1010vi.fn((_opts?: unknown) => ({ httpUrl: "http://127.0.0.1:18789" })),
1111);
12+const isSystemdUnavailableDetailMock = vi.hoisted(() => vi.fn(() => false));
13+const renderSystemdUnavailableHintsMock = vi.hoisted(() => vi.fn<() => string[]>(() => []));
12141315vi.mock("../../runtime.js", () => ({
1416defaultRuntime: runtime,
@@ -46,8 +48,8 @@ vi.mock("../../daemon/restart-logs.js", () => ({
4648}));
47494850vi.mock("../../daemon/systemd-hints.js", () => ({
49-isSystemdUnavailableDetail: () => false,
50-renderSystemdUnavailableHints: () => [],
51+isSystemdUnavailableDetail: isSystemdUnavailableDetailMock,
52+renderSystemdUnavailableHints: renderSystemdUnavailableHintsMock,
5153}));
52545355vi.mock("../../infra/wsl.js", () => ({
@@ -87,6 +89,8 @@ describe("printDaemonStatus", () => {
8789runtime.log.mockReset();
8890runtime.error.mockReset();
8991resolveControlUiLinksMock.mockClear();
92+isSystemdUnavailableDetailMock.mockReset().mockReturnValue(false);
93+renderSystemdUnavailableHintsMock.mockReset().mockReturnValue([]);
9094});
91959296it("prints stale gateway pid guidance when runtime does not own the listener", () => {
@@ -506,4 +510,43 @@ describe("printDaemonStatus", () => {
506510expectMockLineContains(runtime.log, "ai.openclaw.gateway.rescue");
507511expect(runtime.error).not.toHaveBeenCalled();
508512});
513+514+it("does not print systemd user-service hints when a gateway responds", () => {
515+const platform = vi.spyOn(process, "platform", "get").mockReturnValue("linux");
516+isSystemdUnavailableDetailMock.mockReturnValue(true);
517+renderSystemdUnavailableHintsMock.mockReturnValue(["run loginctl enable-linger"]);
518+519+try {
520+printDaemonStatus(
521+{
522+service: {
523+label: "systemd user",
524+loaded: false,
525+loadedText: "not loaded",
526+notLoadedText: "not loaded",
527+runtime: { status: "unknown", detail: "systemd user services unavailable" },
528+},
529+rpc: {
530+ok: true,
531+url: "ws://127.0.0.1:18789",
532+server: { version: "2026.5.12" },
533+},
534+port: {
535+port: 18789,
536+status: "busy",
537+listeners: [],
538+hints: [],
539+},
540+extraServices: [],
541+},
542+{ json: false },
543+);
544+} finally {
545+platform.mockRestore();
546+}
547+548+const errors = runtime.error.mock.calls.map(([line]) => line).join("\n");
549+expect(errors).not.toContain("systemd user services unavailable");
550+expect(errors).not.toContain("run loginctl enable-linger");
551+});
509552});
이 콘텐츠는 인셔셔RSS(RSS 리더)가 자동으로 집계한 것으로 읽기 참고용입니다. 원문 출처 — 저작권은 원저작자에게 있습니다.