refactor(sessions): split access and resolution helpers

This commit is contained in:
Peter Steinberger
2026-02-16 03:56:39 +01:00
parent 2f621876f1
commit 1a03aad246
7 changed files with 604 additions and 544 deletions

View File

@@ -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,