File size: 3,221 Bytes
5c2a829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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);
  });
});