fix: converge workbench session authority
This commit is contained in:
@@ -1,38 +1,28 @@
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
|
||||
import type { ConversationRecord, WorkspaceRecord } from "../src/types/index.ts";
|
||||
import { initialWorkbenchSessionIdFromLocation, resolveWorkbenchActiveConversationId } from "../src/stores/workbench-projection.ts";
|
||||
import { createWorkbenchServerState, reduceWorkbenchServerState, selectActiveConversation, selectActiveMessages, selectTraceAuthorityById } from "../src/stores/workbench-server-state.ts";
|
||||
import type { WorkbenchSessionRecord } from "../src/types/index.ts";
|
||||
import { initialWorkbenchSessionIdFromLocation } from "../src/stores/workbench-projection.ts";
|
||||
import { createWorkbenchServerState, reduceWorkbenchServerState, selectActiveMessages, selectActiveSession, selectTraceAuthorityById } from "../src/stores/workbench-server-state.ts";
|
||||
|
||||
test("R5 active conversation comes only from route or explicit UI selection", () => {
|
||||
assert.equal(resolveWorkbenchActiveConversationId({ switchingConversationId: null, explicitConversationId: "cnv_route" }), "cnv_route");
|
||||
assert.equal(resolveWorkbenchActiveConversationId({ switchingConversationId: "cnv_switching", explicitConversationId: "cnv_route" }), "cnv_switching");
|
||||
assert.equal(resolveWorkbenchActiveConversationId({ switchingConversationId: null, explicitConversationId: null }), null);
|
||||
});
|
||||
|
||||
test("R5 initial route parsing ignores workspace fallback", () => {
|
||||
test("Workbench route parsing accepts only session routes", () => {
|
||||
assert.equal(initialWorkbenchSessionIdFromLocation({ pathname: "/workbench/sessions/ses_route" }), "ses_route");
|
||||
assert.equal(initialWorkbenchSessionIdFromLocation({ pathname: "/workbench/sessions/cnv_route" }), null);
|
||||
assert.equal(initialWorkbenchSessionIdFromLocation({ pathname: "/workspace/sessions/ses_route" }), null);
|
||||
assert.equal(initialWorkbenchSessionIdFromLocation({ pathname: "/workbench" }), null);
|
||||
});
|
||||
|
||||
test("R5 late workspace and trace snapshots update cache without changing active projection", () => {
|
||||
const workspace: WorkspaceRecord = { workspaceId: "wsp_r5", projectId: "prj_hwpod_workbench", selectedConversationId: "cnv_late" };
|
||||
const routeConversation: ConversationRecord = { conversationId: "cnv_route", sessionId: "ses_route", messages: [{ id: "msg_route", messageId: "msg_route", role: "user", title: "用户", text: "route prompt", status: "sent", createdAt: "2026-06-17T00:00:00.000Z", conversationId: "cnv_route" }] };
|
||||
const lateConversation: ConversationRecord = { conversationId: "cnv_late", sessionId: "ses_late", messages: [{ id: "msg_late", messageId: "msg_late", role: "agent", title: "Code Agent", text: "late reply", status: "completed", createdAt: "2026-06-17T00:00:01.000Z", conversationId: "cnv_late", traceId: "trc_late" }] };
|
||||
test("Workbench server-state is keyed only by session and trace", () => {
|
||||
const session: WorkbenchSessionRecord = {
|
||||
sessionId: "ses_route",
|
||||
threadId: "thr_route",
|
||||
messages: [{ id: "msg_route", messageId: "msg_route", role: "user", title: "用户", text: "route prompt", status: "sent", createdAt: "2026-06-18T00:00:00.000Z", sessionId: "ses_route" }]
|
||||
};
|
||||
let state = createWorkbenchServerState();
|
||||
const active = "cnv_route";
|
||||
state = reduceWorkbenchServerState(state, { type: "session.detail", session });
|
||||
state = reduceWorkbenchServerState(state, { type: "trace.snapshot", traceId: "trc_route", trace: { traceId: "trc_route", status: "completed", events: [{ seq: 1, type: "done" }] } });
|
||||
|
||||
state = reduceWorkbenchServerState(state, { type: "workspace.snapshot", projectId: "prj_hwpod_workbench", workspace });
|
||||
state = reduceWorkbenchServerState(state, { type: "conversation.detail", conversation: lateConversation });
|
||||
state = reduceWorkbenchServerState(state, { type: "trace.snapshot", traceId: "trc_late", trace: { traceId: "trc_late", status: "completed", events: [{ seq: 1, type: "late" }] } });
|
||||
|
||||
assert.equal(selectActiveConversation(state, active), null);
|
||||
assert.deepEqual(selectActiveMessages(state, active), []);
|
||||
assert.equal(selectTraceAuthorityById(state).trc_late?.traceId, "trc_late");
|
||||
|
||||
state = reduceWorkbenchServerState(state, { type: "conversation.detail", conversation: routeConversation });
|
||||
assert.equal(selectActiveConversation(state, active)?.conversationId, "cnv_route");
|
||||
assert.deepEqual(selectActiveMessages(state, active).map((message) => message.id), ["msg_route"]);
|
||||
assert.equal(selectActiveSession(state, "ses_route")?.sessionId, "ses_route");
|
||||
assert.deepEqual(selectActiveMessages(state, "ses_route").map((message) => message.id), ["msg_route"]);
|
||||
assert.equal(selectTraceAuthorityById(state).trc_route?.traceId, "trc_route");
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user