mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-04 15:20:21 +00:00
Allow ACP sessions.patch lineage fields on ACP session keys (#40995)
Merged via squash.
Prepared head SHA: c1191edc08
Co-authored-by: xaeon2026 <264572156+xaeon2026@users.noreply.github.com>
Co-authored-by: mbelinky <132747814+mbelinky@users.noreply.github.com>
Reviewed-by: @mbelinky
This commit is contained in:
@@ -252,6 +252,29 @@ describe("gateway sessions patch", () => {
|
||||
expect(entry.spawnDepth).toBe(2);
|
||||
});
|
||||
|
||||
test("sets spawnedBy for ACP sessions", async () => {
|
||||
const entry = expectPatchOk(
|
||||
await runPatch({
|
||||
storeKey: "agent:main:acp:child",
|
||||
patch: {
|
||||
key: "agent:main:acp:child",
|
||||
spawnedBy: "agent:main:main",
|
||||
},
|
||||
}),
|
||||
);
|
||||
expect(entry.spawnedBy).toBe("agent:main:main");
|
||||
});
|
||||
|
||||
test("sets spawnDepth for ACP sessions", async () => {
|
||||
const entry = expectPatchOk(
|
||||
await runPatch({
|
||||
storeKey: "agent:main:acp:child",
|
||||
patch: { key: "agent:main:acp:child", spawnDepth: 2 },
|
||||
}),
|
||||
);
|
||||
expect(entry.spawnDepth).toBe(2);
|
||||
});
|
||||
|
||||
test("rejects spawnDepth on non-subagent sessions", async () => {
|
||||
const result = await runPatch({
|
||||
patch: { key: MAIN_SESSION_KEY, spawnDepth: 1 },
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
import type { OpenClawConfig } from "../config/config.js";
|
||||
import type { SessionEntry } from "../config/sessions.js";
|
||||
import {
|
||||
isAcpSessionKey,
|
||||
isSubagentSessionKey,
|
||||
normalizeAgentId,
|
||||
parseAgentSessionKey,
|
||||
@@ -62,6 +63,10 @@ function normalizeExecAsk(raw: string): "off" | "on-miss" | "always" | undefined
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function supportsSpawnLineage(storeKey: string): boolean {
|
||||
return isSubagentSessionKey(storeKey) || isAcpSessionKey(storeKey);
|
||||
}
|
||||
|
||||
export async function applySessionsPatchToStore(params: {
|
||||
cfg: OpenClawConfig;
|
||||
store: Record<string, SessionEntry>;
|
||||
@@ -97,8 +102,8 @@ export async function applySessionsPatchToStore(params: {
|
||||
if (!trimmed) {
|
||||
return invalid("invalid spawnedBy: empty");
|
||||
}
|
||||
if (!isSubagentSessionKey(storeKey)) {
|
||||
return invalid("spawnedBy is only supported for subagent:* sessions");
|
||||
if (!supportsSpawnLineage(storeKey)) {
|
||||
return invalid("spawnedBy is only supported for subagent:* or acp:* sessions");
|
||||
}
|
||||
if (existing?.spawnedBy && existing.spawnedBy !== trimmed) {
|
||||
return invalid("spawnedBy cannot be changed once set");
|
||||
@@ -114,8 +119,8 @@ export async function applySessionsPatchToStore(params: {
|
||||
return invalid("spawnDepth cannot be cleared once set");
|
||||
}
|
||||
} else if (raw !== undefined) {
|
||||
if (!isSubagentSessionKey(storeKey)) {
|
||||
return invalid("spawnDepth is only supported for subagent:* sessions");
|
||||
if (!supportsSpawnLineage(storeKey)) {
|
||||
return invalid("spawnDepth is only supported for subagent:* or acp:* sessions");
|
||||
}
|
||||
const numeric = Number(raw);
|
||||
if (!Number.isInteger(numeric) || numeric < 0) {
|
||||
|
||||
Reference in New Issue
Block a user