mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
Machine-produced by `pnpm run rescope-vendor --apply` plus the regeneration it prints: `pnpm install` for the lockfile, `pnpm run gen-third-party-notices`, `verify-translation-pairing --write` for the touched bilingual pairs, `gen-doc-graphs`, and one typert snapshot whose ids embed character offsets. `pnpm run rescope-vendor --check` verifies the result. Renames nine vendored packages (cordis, cosmokit, schemastery and the six @cordisjs plugins) and every reference that resolves them: manifest names and dependency keys, module specifiers including declare-module merges, cordis.yml plugin names, tsconfig paths, every Markdown fence, and `docs/` prose. Directory names, upstream versions, and dependency ranges are unchanged, so vendor/README.md still reads as an upstream snapshot; its manifest table gains an upstream-name column so THIRD_PARTY_NOTICES keeps MIT attribution pointed at each fork's origin. The tutorial tier follows the rename end to end: its yaml fences named plugins the Loader can no longer resolve, its `ts ignore-check` fences disagreed with the compiled fences beside them, and its prose quoted both. The contracts that told readers to keep upstream names — the root convention and the vendoring cookbook's tree comment and manifest invariant — now say to rescope instead. Two rules read `@deepseek-ai/` as "another workspace plugin": the client bundle purity gate now names the vendored libraries a browser bundle inlines, and the files where a bare `cordis` is an agent-preset id keep that product data.
61 lines
2.6 KiB
TypeScript
61 lines
2.6 KiB
TypeScript
import { Context } from '@deepseek-ai/cordis'
|
|
import { existsSync } from 'node:fs'
|
|
import { mkdtemp, rm } from 'node:fs/promises'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import { describe, expect, it } from 'vitest'
|
|
import LocalAttachmentStore, {
|
|
DEFAULT_MAX_IMAGE_BYTES,
|
|
DEFAULT_MAX_IMAGE_PIXELS,
|
|
DEFAULT_MAX_IMAGES_PER_MESSAGE,
|
|
DEFAULT_MAX_MESSAGE_IMAGE_BYTES,
|
|
} from '../src/index.ts'
|
|
|
|
describe('local attachment service', () => {
|
|
it('resolves every omitted admission limit explicitly', () => {
|
|
const service = new LocalAttachmentStore(new Context(), {})
|
|
expect(service.imageLimits).toEqual({
|
|
maxImageBytes: DEFAULT_MAX_IMAGE_BYTES,
|
|
maxImagesPerMessage: DEFAULT_MAX_IMAGES_PER_MESSAGE,
|
|
maxMessageImageBytes: DEFAULT_MAX_MESSAGE_IMAGE_BYTES,
|
|
maxImagePixels: DEFAULT_MAX_IMAGE_PIXELS,
|
|
mediaTypes: ['image/png', 'image/jpeg', 'image/webp', 'image/gif'],
|
|
})
|
|
})
|
|
|
|
it('saves and reads through the service boundary', async () => {
|
|
const dshHome = await mkdtemp(join(tmpdir(), 'dsh-attachment-service-'))
|
|
try {
|
|
const service = new LocalAttachmentStore(new Context(), { dshHome })
|
|
const data = Uint8Array.from(Buffer.from(
|
|
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=',
|
|
'base64',
|
|
))
|
|
const ref = await service.saveImage({ data, mediaType: 'image/png' })
|
|
await expect(service.readImage(ref)).resolves.toEqual({ ref, data })
|
|
} finally {
|
|
await rm(dshHome, { recursive: true, force: true })
|
|
}
|
|
})
|
|
|
|
it('validates without persisting: a rejected image leaves no storage root behind', async () => {
|
|
const dshHome = await mkdtemp(join(tmpdir(), 'dsh-attachment-validate-'))
|
|
try {
|
|
const service = new LocalAttachmentStore(new Context(), { dshHome })
|
|
await expect(service.validateImage({ data: Uint8Array.of(1, 2, 3), mediaType: 'image/png' }))
|
|
.rejects.toThrow(/Unsupported or malformed image data/)
|
|
const valid = Uint8Array.from(Buffer.from(
|
|
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=',
|
|
'base64',
|
|
))
|
|
const limited = new LocalAttachmentStore(new Context(), { dshHome, maxImageBytes: 1 })
|
|
await expect(limited.validateImage({ data: valid, mediaType: 'image/png' }))
|
|
.rejects.toMatchObject({ code: 'IMAGE_TOO_LARGE' })
|
|
await expect(service.validateImage({ data: valid, mediaType: 'image/png' })).resolves.toBeUndefined()
|
|
expect(existsSync(service.root)).toBe(false)
|
|
} finally {
|
|
await rm(dshHome, { recursive: true, force: true })
|
|
}
|
|
})
|
|
})
|