
























@@ -708,7 +708,7 @@ describe("talk.session unified handlers", () => {
708708sessionKey: "session:main",
709709ttlMs: 5000,
710710},
711-client: { connId: "conn-1" } as never,
711+client: { connId: "conn-1", connect: { scopes: ["operator.admin"] } } as never,
712712isWebchatConnect: () => false,
713713respond: createRespond as never,
714714context: {
@@ -807,6 +807,64 @@ describe("talk.session unified handlers", () => {
807807expect(mockCallArg(broadcastToConnIds, 2, 3)).toEqual({ dropIfSlow: true });
808808});
809809810+it("passes managed-room spawnedBy visibility scope to session resolution", async () => {
811+const createRespond = vi.fn();
812+await talkHandlers["talk.session.create"]({
813+req: { type: "req", id: "1", method: "talk.session.create" },
814+params: {
815+mode: "stt-tts",
816+transport: "managed-room",
817+sessionKey: "agent:worker:subagent:child",
818+spawnedBy: "agent:main:parent",
819+},
820+client: { connId: "conn-1", connect: { scopes: ["operator.write"] } } as never,
821+isWebchatConnect: () => false,
822+respond: createRespond as never,
823+context: {
824+getRuntimeConfig: () => ({}) as OpenClawConfig,
825+} as never,
826+});
827+828+expectRespondOk(createRespond, {
829+transport: "managed-room",
830+brain: "agent-consult",
831+});
832+expect(mocks.resolveSessionKeyFromResolveParams).toHaveBeenCalledWith({
833+cfg: {},
834+p: {
835+key: "agent:worker:subagent:child",
836+spawnedBy: "agent:main:parent",
837+includeGlobal: true,
838+includeUnknown: true,
839+},
840+});
841+});
842+843+it("rejects unscoped managed-room session keys without admin scope", async () => {
844+const createRespond = vi.fn();
845+await talkHandlers["talk.session.create"]({
846+req: { type: "req", id: "1", method: "talk.session.create" },
847+params: {
848+mode: "stt-tts",
849+transport: "managed-room",
850+sessionKey: "agent:worker:main",
851+},
852+client: { connId: "conn-1", connect: { scopes: ["operator.write"] } } as never,
853+isWebchatConnect: () => false,
854+respond: createRespond as never,
855+context: {
856+getRuntimeConfig: () => ({}) as OpenClawConfig,
857+} as never,
858+});
859+860+expectRespondError(createRespond, {
861+code: ErrorCodes.INVALID_REQUEST,
862+message:
863+"talk.session.create managed-room sessionKey requires spawnedBy or gateway scope: operator.admin",
864+});
865+expect(mocks.resolveSessionKeyFromResolveParams).not.toHaveBeenCalled();
866+});
867+810868it("requires managed-room ownership before turn control", async () => {
811869const broadcastToConnIds = vi.fn();
812870const createRespond = vi.fn();
@@ -817,7 +875,7 @@ describe("talk.session unified handlers", () => {
817875transport: "managed-room",
818876sessionKey: "session:main",
819877},
820-client: { connId: "creator" } as never,
878+client: { connId: "creator", connect: { scopes: ["operator.admin"] } } as never,
821879isWebchatConnect: () => false,
822880respond: createRespond as never,
823881context: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。