mindspace: close authority boundaries

This commit is contained in:
john
2026-07-27 15:34:35 +08:00
parent dfab78c75a
commit e94052ff24
78 changed files with 11962 additions and 2162 deletions
+82 -12
View File
@@ -1452,12 +1452,27 @@ export function createTkmindProxy({
}
await rememberSessionTarget(session.id, startTarget);
await sessionStore.registerAgentSession(userId, session.id, startTarget);
if (resolvedSessionPolicy?.gooseMode) {
const sessionScopedPolicy =
typeof userAuth.getAgentSessionPolicy ===
'function'
? await userAuth.getAgentSessionPolicy(
userId,
{
toolMode:
resolvedSessionPolicy
?.toolMode ?? 'chat',
sessionId: session.id,
packageId: `cp_${session.id}`,
},
)
: resolvedSessionPolicy;
if (sessionScopedPolicy?.gooseMode) {
const modeRes = await apiFetch(startTarget, apiSecret, '/agent/update_session', {
method: 'POST',
body: JSON.stringify({
session_id: session.id,
goose_mode: resolvedSessionPolicy.gooseMode,
goose_mode:
sessionScopedPolicy.gooseMode,
}),
});
if (!modeRes.ok) {
@@ -1472,7 +1487,7 @@ export function createTkmindProxy({
session.id,
{
workingDir: resolvedWorkingDir,
sessionPolicy: resolvedSessionPolicy,
sessionPolicy: sessionScopedPolicy,
sandboxConstraints: publishLayout?.constraints ?? null,
userMemories,
userContext: publishLayout
@@ -1578,11 +1593,30 @@ export function createTkmindProxy({
});
}
async function getSessionPolicyForToolMode(userId, toolMode = 'chat') {
async function getSessionPolicyForToolMode(
userId,
toolMode = 'chat',
sessionId = null,
) {
const scope = sessionId
? {
sessionId,
packageId: `cp_${sessionId}`,
}
: {};
if (toolMode === 'code' && userAuth.getCodeAgentSessionPolicy) {
return userAuth.getCodeAgentSessionPolicy(userId);
return userAuth.getCodeAgentSessionPolicy(
userId,
scope,
);
}
return userAuth.getAgentSessionPolicy(userId);
return userAuth.getAgentSessionPolicy(
userId,
{
...scope,
toolMode,
},
);
}
async function reconcileSessionPolicyForUser(
@@ -1593,7 +1627,12 @@ export function createTkmindProxy({
if (!userId || !sessionId) return;
const target = await resolveTarget(sessionId);
const workingDir = await userAuth.resolveWorkingDir(userId);
const sessionPolicy = await getSessionPolicyForToolMode(userId, toolMode);
const sessionPolicy =
await getSessionPolicyForToolMode(
userId,
toolMode,
sessionId,
);
const publishLayout = await userAuth.getUserPublishLayout(userId);
const userMemories = await resolveUserMemories(userId, {
sessionId,
@@ -1820,7 +1859,13 @@ export function createTkmindProxy({
if (!policyState.unrestricted) {
body = injectTaskRoutingHint(
body,
await userAuth.getAgentSessionPolicy(userId),
await userAuth.getAgentSessionPolicy(
userId,
{
sessionId,
packageId: `cp_${sessionId}`,
},
),
);
}
body = {
@@ -2017,12 +2062,27 @@ export function createTkmindProxy({
session.id,
startTarget,
);
if (sessionPolicy.gooseMode) {
const sessionScopedPolicy =
await userAuth
.getAgentSessionPolicy(
req.currentUser.id,
{
toolMode:
sessionPolicy.toolMode ??
'chat',
sessionId: session.id,
packageId:
`cp_${session.id}`,
},
);
if (sessionScopedPolicy.gooseMode) {
const modeRes = await apiFetch(startTarget, apiSecret, '/agent/update_session', {
method: 'POST',
body: JSON.stringify({
session_id: session.id,
goose_mode: sessionPolicy.gooseMode,
goose_mode:
sessionScopedPolicy
.gooseMode,
}),
});
if (!modeRes.ok) {
@@ -2039,7 +2099,8 @@ export function createTkmindProxy({
try {
await reconcileAgentSession(api, session.id, {
workingDir,
sessionPolicy,
sessionPolicy:
sessionScopedPolicy,
sandboxConstraints: publishLayout?.constraints ?? null,
userMemories,
userContext: publishLayout
@@ -2100,7 +2161,16 @@ export function createTkmindProxy({
const skipReconcile = req.body?.skip_reconcile === true;
if (!skipReconcile) {
const workingDir = await userAuth.resolveWorkingDir(req.currentUser.id);
const sessionPolicy = await userAuth.getAgentSessionPolicy(req.currentUser.id);
const sessionPolicy =
await userAuth
.getAgentSessionPolicy(
req.currentUser.id,
{
sessionId,
packageId:
`cp_${sessionId}`,
},
);
const publishLayout = await userAuth.getUserPublishLayout(req.currentUser.id);
const userMemories = await resolveUserMemories(req.currentUser.id, {
sessionId,