
























@@ -19,6 +19,11 @@ vi.mock("../../plugins/hook-runner-global.js", () => ({
1919getGlobalHookRunner: vi.fn(() => null),
2020}));
212122+vi.mock("../../plugin-sdk/anthropic-cli.js", () => ({
23+CLAUDE_CLI_BACKEND_ID: "claude-cli",
24+isClaudeCliProvider: (providerId: string) => providerId === "claude-cli",
25+}));
26+2227vi.mock("../../tts/tts.js", () => ({
2328buildTtsSystemPromptHint: vi.fn(() => undefined),
2429}));
@@ -668,4 +673,128 @@ describe("shouldSkipLocalCliCredentialEpoch", () => {
668673fs.rmSync(dir, { recursive: true, force: true });
669674}
670675});
676+677+it("drops the claude-cli sessionId when the on-disk transcript is missing (#77011)", async () => {
678+const { dir, sessionFile } = createSessionFile();
679+try {
680+cliBackendsTesting.setDepsForTest({
681+resolvePluginSetupCliBackend: () => undefined,
682+resolveRuntimeCliBackends: () => [
683+{
684+id: "claude-cli",
685+pluginId: "anthropic",
686+bundleMcp: false,
687+config: {
688+command: "claude",
689+args: ["--print"],
690+resumeArgs: ["--resume", "{sessionId}"],
691+output: "jsonl",
692+input: "stdin",
693+sessionMode: "existing",
694+},
695+},
696+],
697+});
698+const transcriptCheck = vi.fn(async () => false);
699+setCliRunnerPrepareTestDeps({
700+claudeCliSessionTranscriptHasContent: transcriptCheck,
701+});
702+703+const context = await prepareCliRunContext({
704+sessionId: "session-test",
705+sessionKey: "agent:main:telegram:direct:peer",
706+ sessionFile,
707+workspaceDir: dir,
708+prompt: "follow-up",
709+provider: "claude-cli",
710+model: "opus",
711+timeoutMs: 1_000,
712+runId: "run-77011-missing",
713+cliSessionBinding: { sessionId: "stale-claude-sid" },
714+cliSessionId: "stale-claude-sid",
715+config: createCliBackendConfig({ systemPromptOverride: null }),
716+});
717+718+expect(transcriptCheck).toHaveBeenCalledWith({ sessionId: "stale-claude-sid" });
719+expect(context.reusableCliSession).toEqual({ invalidatedReason: "missing-transcript" });
720+} finally {
721+fs.rmSync(dir, { recursive: true, force: true });
722+}
723+});
724+725+it("keeps the claude-cli sessionId when the on-disk transcript is present", async () => {
726+const { dir, sessionFile } = createSessionFile();
727+try {
728+cliBackendsTesting.setDepsForTest({
729+resolvePluginSetupCliBackend: () => undefined,
730+resolveRuntimeCliBackends: () => [
731+{
732+id: "claude-cli",
733+pluginId: "anthropic",
734+bundleMcp: false,
735+config: {
736+command: "claude",
737+args: ["--print"],
738+resumeArgs: ["--resume", "{sessionId}"],
739+output: "jsonl",
740+input: "stdin",
741+sessionMode: "existing",
742+},
743+},
744+],
745+});
746+const transcriptCheck = vi.fn(async () => true);
747+setCliRunnerPrepareTestDeps({
748+claudeCliSessionTranscriptHasContent: transcriptCheck,
749+});
750+751+const context = await prepareCliRunContext({
752+sessionId: "session-test",
753+sessionKey: "agent:main:telegram:direct:peer",
754+ sessionFile,
755+workspaceDir: dir,
756+prompt: "follow-up",
757+provider: "claude-cli",
758+model: "opus",
759+timeoutMs: 1_000,
760+runId: "run-77011-present",
761+cliSessionBinding: { sessionId: "live-claude-sid" },
762+cliSessionId: "live-claude-sid",
763+config: createCliBackendConfig({ systemPromptOverride: null }),
764+});
765+766+expect(transcriptCheck).toHaveBeenCalledWith({ sessionId: "live-claude-sid" });
767+expect(context.reusableCliSession).toEqual({ sessionId: "live-claude-sid" });
768+} finally {
769+fs.rmSync(dir, { recursive: true, force: true });
770+}
771+});
772+773+it("does not probe the transcript for non-claude-cli providers", async () => {
774+const { dir, sessionFile } = createSessionFile();
775+try {
776+const transcriptCheck = vi.fn(async () => false);
777+setCliRunnerPrepareTestDeps({
778+claudeCliSessionTranscriptHasContent: transcriptCheck,
779+});
780+781+const context = await prepareCliRunContext({
782+sessionId: "session-test",
783+ sessionFile,
784+workspaceDir: dir,
785+prompt: "latest ask",
786+provider: "test-cli",
787+model: "test-model",
788+timeoutMs: 1_000,
789+runId: "run-77011-other-provider",
790+cliSessionBinding: { sessionId: "test-cli-sid" },
791+config: createCliBackendConfig({ systemPromptOverride: null }),
792+});
793+794+expect(transcriptCheck).not.toHaveBeenCalled();
795+expect(context.reusableCliSession).toEqual({ sessionId: "test-cli-sid" });
796+} finally {
797+fs.rmSync(dir, { recursive: true, force: true });
798+}
799+});
671800});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。