| import { describe, expect, it } from "vitest"; |
| import { AgentSelectionRequiredError } from "../agents/agent-scope-config.js"; |
| import type { OpenClawConfig } from "../config/types.js"; |
| import { |
| resolveSessionAgentId, |
| resolveSessionAgentIdStrict, |
| resolveSessionAgentIds, |
| resolveSessionAgentIdsStrict, |
| } from "./agent-scope-runtime.js"; |
|
|
| describe("agent-scope-runtime compatibility", () => { |
| const config = { |
| agents: { |
| ownership: "explicit", |
| defaults: { systemAgent: { agentId: "beta" } }, |
| entries: { main: {}, beta: {} }, |
| }, |
| } satisfies OpenClawConfig; |
|
|
| it("resolves the configured system agent for ownerless shipped calls", () => { |
| expect(resolveSessionAgentIds({ config })).toEqual({ |
| defaultAgentId: "beta", |
| sessionAgentId: "beta", |
| }); |
| expect(resolveSessionAgentId({ config })).toBe("beta"); |
| }); |
|
|
| it("keeps strict resolution ownerless", () => { |
| expect(() => resolveSessionAgentIdsStrict({ config })).toThrow(AgentSelectionRequiredError); |
| expect(() => resolveSessionAgentIdStrict({ config })).toThrow(AgentSelectionRequiredError); |
| }); |
|
|
| it.each([ |
| { |
| name: "explicit agent", |
| params: { config, agentId: "main" }, |
| expected: "main", |
| }, |
| { |
| name: "prepared fallback agent", |
| params: { config, fallbackAgentId: "main" }, |
| expected: "main", |
| }, |
| { |
| name: "agent-scoped session key", |
| params: { config, sessionKey: "agent:main:main" }, |
| expected: "main", |
| }, |
| { |
| name: "persisted fixed-store owner", |
| params: { |
| config: { |
| ...config, |
| session: { store: "/tmp/shared.sqlite" }, |
| agents: { |
| ...config.agents, |
| defaults: { |
| ...config.agents.defaults, |
| sessionStore: { agentId: "main" }, |
| }, |
| }, |
| }, |
| sessionKey: "global", |
| }, |
| expected: "main", |
| }, |
| ])("does not override $name", ({ params, expected }) => { |
| expect(resolveSessionAgentIds(params).sessionAgentId).toBe(expected); |
| }); |
|
|
| it.each([ |
| { |
| name: "conflicting explicit and agent-scoped owners", |
| params: { config, agentId: "beta", sessionKey: "agent:main:main" }, |
| }, |
| { |
| name: "conflicting explicit and persisted owners", |
| params: { |
| config: { |
| ...config, |
| session: { store: "/tmp/shared.sqlite" }, |
| agents: { |
| ...config.agents, |
| defaults: { |
| ...config.agents.defaults, |
| sessionStore: { agentId: "main" }, |
| }, |
| }, |
| }, |
| agentId: "beta", |
| sessionKey: "global", |
| }, |
| }, |
| { |
| name: "retired persisted owner", |
| params: { |
| config: { |
| ...config, |
| session: { store: "/tmp/shared.sqlite" }, |
| agents: { |
| ...config.agents, |
| defaults: { |
| ...config.agents.defaults, |
| sessionStore: { agentId: "retired" }, |
| }, |
| }, |
| }, |
| sessionKey: "global", |
| }, |
| }, |
| ])("preserves $name failures", ({ params }) => { |
| expect(() => resolveSessionAgentIds(params)).toThrow(AgentSelectionRequiredError); |
| }); |
| }); |
|
|