Skip to content

Commit 9887a1f

Browse files
committed
perf(project): defer owner acl work until query start
1 parent 45b9ccd commit 9887a1f

4 files changed

Lines changed: 21 additions & 18 deletions

File tree

lib/project-connection.js

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,7 @@ function attachConnection(ctx) {
8282
setTimeout(function() { _loop.resumeLoop(); }, 500);
8383
}
8484

85-
// Auto-assign owner if project has none and a user connects (e.g. IPC-added projects)
8685
var projectOwnerId = getProjectOwnerId();
87-
if (!projectOwnerId && ws._clayUser && ws._clayUser.id && !isMate) {
88-
setProjectOwnerId(ws._clayUser.id);
89-
projectOwnerId = ws._clayUser.id;
90-
if (opts.onProjectOwnerChanged) {
91-
opts.onProjectOwnerChanged(slug, projectOwnerId);
92-
}
93-
console.log("[project] Auto-assigned owner for " + slug + ": " + projectOwnerId);
94-
}
9586

9687
// Send cached state
9788
var _userId = ws._clayUser ? ws._clayUser.id : null;

lib/project-sessions.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function formatAskUserAnswerAsMessage(input, answers) {
3939
* sm, sdk, tm, clients,
4040
* send, sendTo, sendToAdmins, sendToSession, sendToSessionOthers,
4141
* opts, usersModule, userPresence, matesModule, pushModule,
42-
* getSessionForWs, getLinuxUserForSession, getOsUserInfoForWs,
42+
* getSessionForWs, getLinuxUserForSession, ensureProjectAccessForSession, getOsUserInfoForWs,
4343
* hydrateImageRefs, onProcessingChanged, broadcastPresence,
4444
* adapter, getProjectList, getProjectCount, getScheduleCount,
4545
* moveScheduleToProject, moveAllSchedulesToProject, getHubSchedules,
@@ -70,6 +70,7 @@ function attachSessions(ctx) {
7070
var pushModule = ctx.pushModule;
7171
var getSessionForWs = ctx.getSessionForWs;
7272
var getLinuxUserForSession = ctx.getLinuxUserForSession;
73+
var ensureProjectAccessForSession = ctx.ensureProjectAccessForSession;
7374
var getOsUserInfoForWs = ctx.getOsUserInfoForWs;
7475
var hydrateImageRefs = ctx.hydrateImageRefs;
7576
var onProcessingChanged = ctx.onProcessingChanged;
@@ -803,7 +804,7 @@ function attachSessions(ctx) {
803804
session.sentToolResults = {};
804805
sendToSession(session.localId, { type: "status", status: "processing" });
805806
if (!session.queryInstance && !session.worker) {
806-
sdk.startQuery(session, answerText, undefined, getLinuxUserForSession(session));
807+
sdk.startQuery(session, answerText, undefined, ensureProjectAccessForSession(session));
807808
} else {
808809
sdk.pushMessage(session, answerText);
809810
}
@@ -932,7 +933,7 @@ function attachSessions(ctx) {
932933
newSession.sentToolResults = {};
933934
sendToSession(newSession.localId, { type: "status", status: "processing" });
934935
newSession.acceptEditsAfterStart = true;
935-
sdk.startQuery(newSession, planPrompt, undefined, getLinuxUserForSession(newSession));
936+
sdk.startQuery(newSession, planPrompt, undefined, ensureProjectAccessForSession(newSession));
936937
} catch (e) {
937938
console.error("[project] Error starting plan execution:", e);
938939
sendTo(ws, { type: "error", text: "Failed to start plan execution: " + (e.message || e) });
@@ -963,7 +964,7 @@ function attachSessions(ctx) {
963964
session.sentToolResults = {};
964965
sendToSession(session.localId, { type: "status", status: "processing" });
965966
if (!session.queryInstance && !session.worker) {
966-
sdk.startQuery(session, feedback, undefined, getLinuxUserForSession(session));
967+
sdk.startQuery(session, feedback, undefined, ensureProjectAccessForSession(session));
967968
} else {
968969
sdk.pushMessage(session, feedback);
969970
}

lib/project-user-message.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var fs = require("fs");
1313
* send, sendTo, sendToSession, sendToSessionOthers,
1414
* clients, opts,
1515
* usersModule, matesModule,
16-
* getSessionForWs, getLinuxUserForSession, getOsUserInfoForWs,
16+
* getSessionForWs, getLinuxUserForSession, ensureProjectAccessForSession, getOsUserInfoForWs,
1717
* hydrateImageRefs, saveImageFile, imagesDir,
1818
* onProcessingChanged, onSessionDone,
1919
* _loop - { handleLoopMessage: fn(ws, msg) }
@@ -49,6 +49,7 @@ function attachUserMessage(ctx) {
4949

5050
var getSessionForWs = ctx.getSessionForWs;
5151
var getLinuxUserForSession = ctx.getLinuxUserForSession;
52+
var ensureProjectAccessForSession = ctx.ensureProjectAccessForSession;
5253
var getOsUserInfoForWs = ctx.getOsUserInfoForWs;
5354

5455
var hydrateImageRefs = ctx.hydrateImageRefs;
@@ -281,7 +282,7 @@ function attachUserMessage(ctx) {
281282
nowSession.isProcessing = true;
282283
onProcessingChanged();
283284
sendToSession(nowSession.localId, { type: "status", status: "processing" });
284-
sdk.startQuery(nowSession, schedText, null, getLinuxUserForSession(nowSession));
285+
sdk.startQuery(nowSession, schedText, null, ensureProjectAccessForSession(nowSession));
285286
sm.broadcastSessionList();
286287
return true;
287288
}
@@ -484,7 +485,7 @@ function attachUserMessage(ctx) {
484485
// No active query (or worker idle between queries): start a new query
485486
session._queryStartTs = Date.now();
486487
console.log("[PERF] project.js: startQuery called, localId=" + session.localId + " t=0ms");
487-
sdk.startQuery(session, finalText, msg.images, getLinuxUserForSession(session));
488+
sdk.startQuery(session, finalText, msg.images, ensureProjectAccessForSession(session));
488489
} else {
489490
sdk.pushMessage(session, finalText, msg.images);
490491
}

lib/project.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var { createNotesManager } = require("./notes");
99
var { fetchLatestVersion, fetchVersion, isNewer } = require("./updater");
1010
var { execFileSync, spawn } = require("child_process");
1111
var usersModule = require("./users");
12-
var { resolveOsUserInfo, fsAsUser } = require("./os-users");
12+
var { resolveOsUserInfo, fsAsUser, grantProjectAccess } = require("./os-users");
1313
var crisisSafety = require("./crisis-safety");
1414
var matesModule = require("./mates");
1515
var sessionSearch = require("./session-search");
@@ -188,6 +188,14 @@ function createProjectContext(opts) {
188188
return user.linuxUser;
189189
}
190190

191+
function ensureProjectAccessForSession(session) {
192+
var linuxUser = getLinuxUserForSession(session);
193+
if (linuxUser) {
194+
grantProjectAccess(cwd, linuxUser);
195+
}
196+
return linuxUser;
197+
}
198+
191199
function getLinuxUserForWs(ws) {
192200
if (!osUsers) return null;
193201
if (!ws._clayUser || !ws._clayUser.linuxUser) return null;
@@ -800,7 +808,7 @@ function createProjectContext(opts) {
800808
session.isProcessing = true;
801809
onProcessingChanged();
802810
sendToSession(session.localId, { type: "status", status: "processing" });
803-
sdk.startQuery(session, text, null, getLinuxUserForSession(session));
811+
sdk.startQuery(session, text, null, ensureProjectAccessForSession(session));
804812
sm.broadcastSessionList();
805813
}, schedDelay),
806814
};
@@ -1134,6 +1142,7 @@ function createProjectContext(opts) {
11341142
pushModule: pushModule,
11351143
getSessionForWs: getSessionForWs,
11361144
getLinuxUserForSession: getLinuxUserForSession,
1145+
ensureProjectAccessForSession: ensureProjectAccessForSession,
11371146
getOsUserInfoForWs: getOsUserInfoForWs,
11381147
hydrateImageRefs: hydrateImageRefs,
11391148
onProcessingChanged: onProcessingChanged,
@@ -1182,6 +1191,7 @@ function createProjectContext(opts) {
11821191
matesModule: matesModule,
11831192
getSessionForWs: getSessionForWs,
11841193
getLinuxUserForSession: getLinuxUserForSession,
1194+
ensureProjectAccessForSession: ensureProjectAccessForSession,
11851195
getOsUserInfoForWs: getOsUserInfoForWs,
11861196
hydrateImageRefs: hydrateImageRefs,
11871197
saveImageFile: saveImageFile,

0 commit comments

Comments
 (0)