feat(chats): add managed projectless chat sessions
Create projectless chat sessions under a managed, date-scoped Chats directory and clean abandoned or deleted session folders. Add Chats to sidebar state, startup cache, shared context, and Electron Mini Chat while keeping VS Code project-only. Resolve managed chat directories to one server-side memory owner and document the runtime contracts.
This commit is contained in:
@@ -24,7 +24,8 @@ const normalize = (value) => {
|
||||
};
|
||||
|
||||
export const createMemoryProjectResolver = (dependencies) => {
|
||||
const { listProjectPaths, resolvePrimaryWorktreeRoot } = dependencies;
|
||||
const { listProjectPaths, resolvePrimaryWorktreeRoot, managedProjectRoots = [] } = dependencies;
|
||||
const managedRoots = managedProjectRoots.map(normalize).filter(Boolean);
|
||||
|
||||
return async (directory) => {
|
||||
const resolved = normalize(directory);
|
||||
@@ -32,6 +33,14 @@ export const createMemoryProjectResolver = (dependencies) => {
|
||||
return '';
|
||||
}
|
||||
|
||||
const managedRoot = managedRoots.find((root) => {
|
||||
const relative = path.relative(root, resolved);
|
||||
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
|
||||
});
|
||||
if (managedRoot) {
|
||||
return createProjectIdFromPath(managedRoot);
|
||||
}
|
||||
|
||||
let configured = [];
|
||||
try {
|
||||
configured = ((await listProjectPaths()) || []).map(normalize).filter(Boolean);
|
||||
|
||||
@@ -51,6 +51,15 @@ describe('resolving a session directory to its project', () => {
|
||||
expect(await resolve('/tmp/loose')).toBe(createProjectIdFromPath('/tmp/loose'));
|
||||
});
|
||||
|
||||
test('managed chat session directories share the Chats root store', async () => {
|
||||
const chatsRoot = '/Users/x/.config/openchamber/chats';
|
||||
const resolve = createResolver({ managedProjectRoots: [chatsRoot] });
|
||||
|
||||
expect(await resolve(`${chatsRoot}/2026-08-21/session-a`)).toBe(createProjectIdFromPath(chatsRoot));
|
||||
expect(await resolve(`${chatsRoot}/2026-08-21/session-b`)).toBe(createProjectIdFromPath(chatsRoot));
|
||||
expect(await resolve('/Users/x/.config/openchamber/chats-other/session-a')).not.toBe(createProjectIdFromPath(chatsRoot));
|
||||
});
|
||||
|
||||
test('no directory resolves to nothing rather than to some default project', async () => {
|
||||
const resolve = createResolver();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user