a chat with no chosen directory runs in the caller's own home
The default was DATA_PATH/<email>/general_chat_sessions, a dedicated directory so /chat sessions formed their own Claude project group instead of cluttering the home. It is a sibling of the home, and confineUserTree makes every sibling the platform's at 0700 because the others are attachments and email_accounts. So it was unreachable for a member: the first live member turn started there and every Bash call failed on its own working directory before doing anything. A per-member copy inside each home fixed the symptom and left two rules to remember. The owner chose one rule instead — the account's own home, whoever they are — and accepted the trade knowingly: /chat sessions now share a project group with anything else run from that home, which was the reason the dedicated directory existed. Removed rather than left dangling: getGeneralChatSessionsCwd, ensureGeneralChatSessionsCwd, ensureMemberChatCwd, and general_chat_sessions from USER_DIRS so new accounts stop getting it. Existing directories are untouched and their transcripts stay where they are — Claude groups by cwd, so the owner's old /chat history remains under its own project slug rather than moving. The UI labels move with it: the default group now reads "home" rather than naming a directory that no longer has a role. ChatIdentity keeps carrying both email and home. The pairing was justified in the comment by general_chat_sessions being email-derived, which is now gone — but the distinction it encodes is real (the email says who, the home says where), so the comment explains that instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -123,23 +123,6 @@ export async function provisionClaudeCli(params: { email: string; osUser: string
|
||||
return { ok: true, binPath, wrote: true };
|
||||
}
|
||||
|
||||
/**
|
||||
* A member's own chat-sessions directory, created as them, inside their home.
|
||||
*
|
||||
* The owner's equivalent lives at `DATA_PATH/<email>/general_chat_sessions` — a SIBLING of the home, which
|
||||
* `confineUserTree` deliberately makes the platform's at 0700 because the other siblings are `attachments`
|
||||
* and `email_accounts`. Correct for those, and fatal as a member's cwd: the first live member turn ran there
|
||||
* and every Bash call failed, because the account could not enter its own working directory.
|
||||
*
|
||||
* So a member's goes inside their home instead. Created through `runAs` because the platform cannot mkdir
|
||||
* into a 0700 home it does not own — and `mkdir -p` is idempotent, so this is safe to call per turn.
|
||||
*/
|
||||
export async function ensureMemberChatCwd(params: { osUser: string; home: string }): Promise<string> {
|
||||
const dir = join(params.home, 'general_chat_sessions');
|
||||
await asMember(params.osUser, ['mkdir', '-p', dir]);
|
||||
return dir;
|
||||
}
|
||||
|
||||
export type ClaudeLoginState = {
|
||||
/** The binary is present and executable in their home. */
|
||||
installed: boolean;
|
||||
|
||||
Reference in New Issue
Block a user