# Tasks: enterprise-audio-engine-server **Change ID**: enterprise-audio-engine-server **Package**: `@suaveplan/audio-engine-server` **Target path**: `packages/media/audio/audio-engine-server` **Prerequisite packages on Verdaccio**: `@suaveplan/audio-core`, `@suaveplan/audio-timeline`, `@suaveplan/audio-transport`, `@suaveplan/audio-codecs`, `@suaveplan/streams`, `@suaveplan/error`, `@suaveplan/types` --- ## 1. Scaffold - [ ] Create directory `packages/media/audio/audio-engine-server/` with `src/`, `tests/`, `src/__benchmarks__/`, and all feature subdirectories per the layout in `proposal.md`. - [ ] Write `package.json` at version `0.1.0` with `"type": "module"`, `"sideEffects": false`, full `exports` map, deps: `@suaveplan/audio-core workspace:^`, `@suaveplan/audio-timeline workspace:^`, `@suaveplan/audio-transport workspace:^`, `@suaveplan/audio-codecs workspace:^`, `@suaveplan/streams workspace:^`, `@suaveplan/error workspace:^`, `@suaveplan/types workspace:^`, `@suaveplan/opentelemetry workspace:^`, `zod catalog:forms`. - [ ] Write `tsconfig.json` extending `@suaveplan/typescript-config/library.json`. - [ ] Write `vitest.config.ts` using `createTestConfig()` from `@suaveplan/testing/config`. - [ ] Add `lint`, `typecheck`, `test`, `test:coverage`, `build`, `docs:check` scripts. --- ## 2. Types + errors - [ ] Write `src/error-codes.ts` — `defineCodes("AUDIO_ENGINE_SERVER", [...])` producing `AUDIO_ENGINE_SERVER.*` code strings; export `AudioEngineServerErrorCode`, `AUDIO_ENGINE_SERVER_ERROR_METADATA`, `registerAudioEngineServerErrorCodes()`, and an `AudioEngineServerError` class extending `AudioError` from `@suaveplan/audio-core`. - [ ] Write Zod schemas: `FileSourceOptionsSchema`, `FileSinkOptionsSchema`, `ServerAdapterOptionsSchema`. --- ## 3. FileSourceAdapter - [ ] Implement `FileSourceAdapter` with injectable `FsLike`: - `load(path)` — read file, detect format, decode to `AudioDocument` - `createReadStream(path)` — return `ReadableStream` - `loadMany(paths)` — parallel load with `Promise.all` - [ ] Write `file-source.test.ts` and `file-source.md` (≥200 words). --- ## 4. FileSinkAdapter - [ ] Implement `FileSinkAdapter` with injectable `FsLike`: - `save(doc, path, format)` — encode and write file - `createWriteStream(path)` — return `WritableStream` - `saveMany(docs, pathFormat)` — parallel save - [ ] Write `file-sink.test.ts` and `file-sink.md` (≥200 words). --- ## 5. ServerTimelineAdapter - [ ] Implement `ServerTimelineAdapter` implementing `TimelineAdapter`: - All timeline state methods (setTracks, addTrack, removeTrack, updateTrack) - Transport controls (play, pause, stop, seek) - `play()` renders via `audio-core.streamPlan()` → codec encoder → file sink - `getCurrentTime()` returns render progress - [ ] Write `server-adapter.test.ts` and `server-adapter.md` (≥200 words). - [ ] Wire OTel: spans, counters, histograms. --- ## 6. Benchmarks - [ ] Write `src/__benchmarks__/io.bench.ts` — load 100MB WAV, save 100MB FLAC. --- ## 7. Tests - [ ] Write `tests/integration.test.ts` — full load → edit → save round-trip. - [ ] Write `tests/property.test.ts` (fast-check) — load then save → file exists, round-trip preserves sample count. --- ## 8. Docs + verify + publish - [ ] All co-located `.md` files (≥200 words each). - [ ] Write `README.md` at package root. - [ ] `bunx turbo lint typecheck test --filter=@suaveplan/audio-engine-server` — green. - [ ] `bunx turbo test:coverage --filter=@suaveplan/audio-engine-server` — 100%. - [ ] `bun scripts/publish.ts --package @suaveplan/audio-engine-server`. - [ ] Fold `specs/audio-engine-server/spec.md` into `openspec/specs/audio-engine-server/spec.md`. - [ ] Archive to `openspec/archive/2026-05-14-enterprise-audio-engine-server/`.