session-metadata.test.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { describe, expect, test } from 'bun:test';
  2. import { SessionMetadataStore } from './session-metadata';
  3. describe('SessionMetadataStore', () => {
  4. test('keeps two active orchestrators through metadata overflow', () => {
  5. const store = new SessionMetadataStore({ maxEntries: 3 });
  6. store.setAgent('orchestrator-a', 'orchestrator');
  7. store.setAgent('orchestrator-b', 'orchestrator');
  8. store.setAgent('old-specialist', 'explore');
  9. store.setDirectory('new-session', '/tmp/project');
  10. expect(store.size).toBe(3);
  11. expect(store.getAgent('orchestrator-a')).toBe('orchestrator');
  12. expect(store.getAgent('orchestrator-b')).toBe('orchestrator');
  13. expect(store.hasAgent('old-specialist')).toBe(false);
  14. });
  15. test('makes an idle orchestrator evictable without dropping another active one', () => {
  16. const store = new SessionMetadataStore({ maxEntries: 3 });
  17. store.setAgent('orchestrator-a', 'orchestrator');
  18. store.setAgent('orchestrator-b', 'orchestrator');
  19. store.setAgent('old-specialist', 'explore');
  20. store.markOrchestratorIdle('orchestrator-a');
  21. store.setDirectory('new-session', '/tmp/project');
  22. expect(store.size).toBe(3);
  23. expect(store.hasAgent('orchestrator-a')).toBe(false);
  24. expect(store.getAgent('orchestrator-b')).toBe('orchestrator');
  25. expect(store.hasAgent('old-specialist')).toBe(true);
  26. });
  27. test('bounds agent-only metadata', () => {
  28. const store = new SessionMetadataStore({ maxEntries: 2 });
  29. store.setAgent('agent-a', 'explore');
  30. store.setAgent('agent-b', 'oracle');
  31. store.setAgent('agent-c', 'fixer');
  32. expect(store.size).toBe(2);
  33. expect(store.hasAgent('agent-a')).toBe(false);
  34. expect(store.hasAgent('agent-b')).toBe(true);
  35. expect(store.hasAgent('agent-c')).toBe(true);
  36. });
  37. test('eviction removes directory and agent metadata for one session', () => {
  38. const evicted: string[] = [];
  39. const store = new SessionMetadataStore({
  40. maxEntries: 1,
  41. onEvict: (sessionID) => evicted.push(sessionID),
  42. });
  43. store.setDirectory('old-session', '/tmp/project');
  44. store.setAgent('old-session', 'explore');
  45. store.setDirectory('new-session', '/tmp/project');
  46. expect(store.size).toBe(1);
  47. expect(store.hasDirectory('old-session')).toBe(false);
  48. expect(store.hasAgent('old-session')).toBe(false);
  49. expect(evicted).toEqual(['old-session']);
  50. });
  51. });