test-session-query.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /** Minimal concrete Session query for Agent Team continuation tests. */
  2. import { SessionLogOffset } from '@deepseek-ai/dsh-session'
  3. import type { SessionEvent, SessionHeader, SessionId } from '@deepseek-ai/dsh-session'
  4. import SessionQueryEngine from '@deepseek-ai/dsh-session-query'
  5. import type { SessionObservation, SessionObservationOptions } from '@deepseek-ai/dsh-session-query'
  6. /** Undisposable immutable cut over one session's header and events. */
  7. function cut(
  8. source: 'live' | 'prepared',
  9. header: SessionHeader,
  10. events: readonly SessionEvent[],
  11. ): SessionObservation {
  12. const lease = (): SessionObservation => ({
  13. source,
  14. header,
  15. inheritedEventCount: SessionLogOffset(0),
  16. events,
  17. cursor: events.at(-1)?.seq ?? -1,
  18. retain: lease,
  19. [Symbol.dispose]: () => {},
  20. })
  21. return lease()
  22. }
  23. /** Session query implementation whose search faces are outside these tests. */
  24. export class TestSessionQuery extends SessionQueryEngine {
  25. static override inject = ['sessions', 'sessionPersistence']
  26. /** Live-preferred observation backed directly by a short-lived persistence read handle. */
  27. override async observeSession(
  28. sessionId: SessionId,
  29. options: SessionObservationOptions = {},
  30. ): Promise<SessionObservation> {
  31. const live = this.ctx.sessions.get(sessionId)
  32. if (live !== undefined) return cut('live', live.header, live.snapshotEvents())
  33. const handle = await this.ctx.sessionPersistence.open(
  34. sessionId,
  35. 'read',
  36. options.signal === undefined ? {} : { signal: options.signal },
  37. )
  38. try {
  39. return cut(
  40. 'prepared',
  41. handle.header,
  42. (await handle.read(
  43. 0, undefined, options.signal === undefined ? {} : { signal: options.signal },
  44. )).events,
  45. )
  46. } finally {
  47. await handle.close()
  48. }
  49. }
  50. override searchSessions(): Promise<never> {
  51. return Promise.reject(new Error('session search is not configured in this test'))
  52. }
  53. override searchEvents(): Promise<never> {
  54. return Promise.reject(new Error('event search is not configured in this test'))
  55. }
  56. }