mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 07:02:44 +00:00
refactor(sessions): split access and resolution helpers
This commit is contained in:
@@ -7,10 +7,10 @@ import { callGateway } from "../../gateway/call.js";
|
||||
import { resolveAgentIdFromSessionKey } from "../../routing/session-key.js";
|
||||
import { jsonResult, readStringArrayParam } from "./common.js";
|
||||
import {
|
||||
createSessionVisibilityGuard,
|
||||
createAgentToAgentPolicy,
|
||||
classifySessionKind,
|
||||
deriveChannel,
|
||||
listSpawnedSessionKeys,
|
||||
resolveDisplaySessionKey,
|
||||
resolveEffectiveSessionToolsVisibility,
|
||||
resolveInternalSessionKey,
|
||||
@@ -86,12 +86,14 @@ export function createSessionsListTool(opts?: {
|
||||
const sessions = Array.isArray(list?.sessions) ? list.sessions : [];
|
||||
const storePath = typeof list?.path === "string" ? list.path : undefined;
|
||||
const a2aPolicy = createAgentToAgentPolicy(cfg);
|
||||
const requesterAgentId = resolveAgentIdFromSessionKey(effectiveRequesterKey);
|
||||
const visibilityGuard = await createSessionVisibilityGuard({
|
||||
action: "list",
|
||||
requesterSessionKey: effectiveRequesterKey,
|
||||
visibility,
|
||||
a2aPolicy,
|
||||
});
|
||||
const rows: SessionListRow[] = [];
|
||||
const spawnedKeys =
|
||||
visibility === "tree"
|
||||
? await listSpawnedSessionKeys({ requesterSessionKey: effectiveRequesterKey })
|
||||
: null;
|
||||
const historyTargets: Array<{ row: SessionListRow; resolvedKey: string }> = [];
|
||||
|
||||
for (const entry of sessions) {
|
||||
if (!entry || typeof entry !== "object") {
|
||||
@@ -101,23 +103,9 @@ export function createSessionsListTool(opts?: {
|
||||
if (!key) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const entryAgentId = resolveAgentIdFromSessionKey(key);
|
||||
const crossAgent = entryAgentId !== requesterAgentId;
|
||||
if (crossAgent) {
|
||||
if (visibility !== "all") {
|
||||
continue;
|
||||
}
|
||||
if (!a2aPolicy.isAllowed(requesterAgentId, entryAgentId)) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (visibility === "self" && key !== effectiveRequesterKey) {
|
||||
continue;
|
||||
}
|
||||
if (visibility === "tree" && key !== effectiveRequesterKey && !spawnedKeys?.has(key)) {
|
||||
continue;
|
||||
}
|
||||
const access = visibilityGuard.check(key);
|
||||
if (!access.allowed) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key === "unknown") {
|
||||
@@ -211,25 +199,41 @@ export function createSessionsListTool(opts?: {
|
||||
lastAccountId,
|
||||
transcriptPath,
|
||||
};
|
||||
|
||||
if (messageLimit > 0) {
|
||||
const resolvedKey = resolveInternalSessionKey({
|
||||
key: displayKey,
|
||||
alias,
|
||||
mainKey,
|
||||
});
|
||||
const history = await callGateway<{ messages: Array<unknown> }>({
|
||||
method: "chat.history",
|
||||
params: { sessionKey: resolvedKey, limit: messageLimit },
|
||||
});
|
||||
const rawMessages = Array.isArray(history?.messages) ? history.messages : [];
|
||||
const filtered = stripToolMessages(rawMessages);
|
||||
row.messages = filtered.length > messageLimit ? filtered.slice(-messageLimit) : filtered;
|
||||
historyTargets.push({ row, resolvedKey });
|
||||
}
|
||||
|
||||
rows.push(row);
|
||||
}
|
||||
|
||||
if (messageLimit > 0 && historyTargets.length > 0) {
|
||||
const maxConcurrent = Math.min(4, historyTargets.length);
|
||||
let index = 0;
|
||||
const worker = async () => {
|
||||
while (true) {
|
||||
const next = index;
|
||||
index += 1;
|
||||
if (next >= historyTargets.length) {
|
||||
return;
|
||||
}
|
||||
const target = historyTargets[next];
|
||||
const history = await callGateway<{ messages: Array<unknown> }>({
|
||||
method: "chat.history",
|
||||
params: { sessionKey: target.resolvedKey, limit: messageLimit },
|
||||
});
|
||||
const rawMessages = Array.isArray(history?.messages) ? history.messages : [];
|
||||
const filtered = stripToolMessages(rawMessages);
|
||||
target.row.messages =
|
||||
filtered.length > messageLimit ? filtered.slice(-messageLimit) : filtered;
|
||||
}
|
||||
};
|
||||
await Promise.all(Array.from({ length: maxConcurrent }, () => worker()));
|
||||
}
|
||||
|
||||
return jsonResult({
|
||||
count: rows.length,
|
||||
sessions: rows,
|
||||
|
||||
Reference in New Issue
Block a user