agent.spec.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { describe, expect, it } from 'vitest'
  2. import { Context } from 'cordis'
  3. import { Session } from '@deepseek-ai/dsh-session'
  4. import AgentRegistry, { Agent } from '@deepseek-ai/dsh-agent'
  5. function stubAgent(id: string): Agent {
  6. return {
  7. id,
  8. options: {},
  9. session: new Session(`${id}-session`),
  10. status: 'idle',
  11. send() {},
  12. steer() {},
  13. inject() {},
  14. abort() {},
  15. }
  16. }
  17. describe('AgentRegistry', () => {
  18. it('registers agents and emits created/disposed events', async () => {
  19. const ctx = new Context()
  20. await ctx.plugin(AgentRegistry)
  21. const created: string[] = []
  22. const disposed: string[] = []
  23. ctx.on('agent/created', agent => void created.push(agent.id))
  24. ctx.on('agent/disposed', agent => void disposed.push(agent.id))
  25. const agent = stubAgent('a1')
  26. const dispose = ctx.agents.register(agent)
  27. expect(created).toEqual(['a1'])
  28. expect(ctx.agents.get('a1')).toBe(agent)
  29. expect(ctx.agents.list()).toEqual([agent])
  30. dispose()
  31. expect(disposed).toEqual(['a1'])
  32. expect(ctx.agents.get('a1')).toBeUndefined()
  33. })
  34. it('rejects duplicate ids and unregisters on fiber dispose (HMR safety)', async () => {
  35. const ctx = new Context()
  36. await ctx.plugin(AgentRegistry)
  37. ctx.agents.register(stubAgent('main'))
  38. expect(() => ctx.agents.register(stubAgent('main'))).toThrow('already registered')
  39. const fiber = await ctx.plugin(Object.assign((inner: Context) => {
  40. inner.agents.register(stubAgent('scoped'))
  41. }, { inject: ['agents'] }))
  42. expect(ctx.agents.list().map(a => a.id)).toEqual(['main', 'scoped'])
  43. await fiber.dispose()
  44. expect(ctx.agents.list().map(a => a.id)).toEqual(['main'])
  45. })
  46. })