loader-composition.spec.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * Real-composition proof: a cordis.yml loaded by the vendored Loader applies
  3. * spill-local configuration and completes its fiber-owned startup cleanup.
  4. */
  5. import { mkdir, mkdtemp, rm, utimes, writeFile } from 'node:fs/promises'
  6. import { existsSync } from 'node:fs'
  7. import { tmpdir } from 'node:os'
  8. import { join } from 'node:path'
  9. import { pathToFileURL } from 'node:url'
  10. import { afterEach, describe, expect, it } from 'vitest'
  11. import { Context } from '@deepseek-ai/cordis'
  12. import Loader from '@deepseek-ai/cordis-plugin-loader'
  13. import Include from '@deepseek-ai/cordis-plugin-include'
  14. import LocalSpillStore, { sessionDir } from '@deepseek-ai/dsh-spill-local'
  15. const DAY_MS = 24 * 60 * 60 * 1000
  16. let root: string | undefined
  17. let context: Context | undefined
  18. afterEach(async () => {
  19. await context?.fiber.dispose()
  20. context = undefined
  21. if (root !== undefined) await rm(root, { recursive: true, force: true })
  22. root = undefined
  23. })
  24. describe('spill-local real Loader composition through cordis.yml', () => {
  25. it('loads cleanupPeriodDays and prunes only expired session contents', async () => {
  26. root = await mkdtemp(join(tmpdir(), 'dsh-spill-loader-'))
  27. const oldDir = sessionDir(root, 'old-session')
  28. const freshDir = sessionDir(root, 'fresh-session')
  29. await mkdir(oldDir, { recursive: true })
  30. await mkdir(freshDir, { recursive: true })
  31. const old = join(oldDir, 'old.txt')
  32. const fresh = join(freshDir, 'fresh.txt')
  33. await writeFile(old, 'old')
  34. await writeFile(fresh, 'fresh')
  35. const now = Date.now()
  36. await utimes(old, (now - 40 * DAY_MS) / 1000, (now - 40 * DAY_MS) / 1000)
  37. await utimes(fresh, (now - DAY_MS) / 1000, (now - DAY_MS) / 1000)
  38. const configPath = join(root, 'cordis.yml')
  39. await writeFile(configPath, [
  40. "- name: '@deepseek-ai/dsh-spill-local'",
  41. ' config:',
  42. ` root: ${JSON.stringify(root)}`,
  43. ' cleanupPeriodDays: 30',
  44. '',
  45. ].join('\n'))
  46. context = new Context()
  47. context.baseUrl = pathToFileURL(root).href + '/'
  48. await context.plugin(Loader)
  49. context.loader.builtins.include = Include
  50. context.loader.internal = {
  51. version: 'v2',
  52. async import(specifier: string) {
  53. if (specifier !== '@deepseek-ai/dsh-spill-local') throw new Error(`unexpected Loader import: ${specifier}`)
  54. return LocalSpillStore
  55. },
  56. } as unknown as NonNullable<typeof context.loader.internal>
  57. await context.loader.create({
  58. name: 'cordis:include',
  59. config: { path: pathToFileURL(configPath).href },
  60. })
  61. await context.loader.await()
  62. await context.fiber.dispose()
  63. context = undefined
  64. expect(existsSync(old)).toBe(false)
  65. expect(existsSync(oldDir)).toBe(false)
  66. expect(existsSync(fresh)).toBe(true)
  67. expect(existsSync(freshDir)).toBe(true)
  68. expect(existsSync(root)).toBe(true)
  69. }, 30_000)
  70. })