{"_id":"@aidex/media","_rev":"8-807987c309b1437c0aa690cf20a001b3","name":"@aidex/media","dist-tags":{"latest":"1.2.0"},"versions":{"0.1.0-alpha":{"name":"@aidex/media","version":"0.1.0-alpha","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@0.1.0-alpha","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"a01904a4263e97a26d963083b76ebe120cfd5d53","tarball":"https://registry.npmjs.org/@aidex/media/-/media-0.1.0-alpha.tgz","fileCount":255,"integrity":"sha512-aXqsfNdeg3UJ/o+Uysa3440H4FZ4ZdaOxp8maM5TbQgWRxAKc6+EGOhhHDHDLw4pCrnqgQFJ3TCGKV1B04a1rw==","signatures":[{"sig":"MEQCIGVjDYFMwMyuJKWGo9DMT5UtglZiqdxu5HIQpyEimQRpAiBLseC9h4aLK/dZqIG7fchu4X2wRZuw2TMU4OBPlOA6Lw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323352},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"0.1.0-alpha","@aidex/core":"0.1.0-alpha","@aidex/catalog":"0.1.0-alpha","@aidex/engines":"0.1.0-alpha","@aidex/prompts":"0.1.0-alpha","@aidex/workflow":"0.1.0-alpha","@aidex/observability":"0.1.0-alpha"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_0.1.0-alpha_1785768609850_0.6414743221899113","host":"s3://npm-registry-packages-npm-production"}},"0.2.0-alpha":{"name":"@aidex/media","version":"0.2.0-alpha","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@0.2.0-alpha","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"9b232461c29f2efbf00cfdc7fa9bdee2a5aab180","tarball":"https://registry.npmjs.org/@aidex/media/-/media-0.2.0-alpha.tgz","fileCount":133,"integrity":"sha512-kRZAVbe/b/SabZVdUwAZFS/p2UKkA/oDRjq9BNo9oW7u3yby6RmZ+olwmCkwW2U8gBFYV3hUWGgvyNifKO1VuQ==","signatures":[{"sig":"MEYCIQCDHwgTL8+K5lB/f1YAeJaIW0INFOEjJRhtzbdOwwVleAIhAM9WrfVVGNvsg6GA3tsxh1Tf296v4HnbjQau0UCKeTbK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":622002},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"0.2.0-alpha","@aidex/core":"0.2.0-alpha","@aidex/catalog":"0.2.0-alpha","@aidex/engines":"0.2.0-alpha","@aidex/prompts":"0.2.0-alpha","@aidex/workflow":"0.2.0-alpha","@aidex/observability":"0.2.0-alpha"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_0.2.0-alpha_1785772051836_0.9933671757896827","host":"s3://npm-registry-packages-npm-production"}},"0.2.1-alpha":{"name":"@aidex/media","version":"0.2.1-alpha","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@0.2.1-alpha","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"34ecab7bc635887138bc8470a0e74713e52e1edd","tarball":"https://registry.npmjs.org/@aidex/media/-/media-0.2.1-alpha.tgz","fileCount":134,"integrity":"sha512-7qPBMd61/PMd5rRZ5u7jsmGIOb6aBGmxfWT4DtQxJcsA2p7xb7wwfQE7xEurEm79Yq7pYPooAtf7hfxYLVmKcQ==","signatures":[{"sig":"MEUCIF/7Lko3+mq8RCbmuKcyWwFdXD3j1zwfXrkQw+rfCwvHAiEAmLedSTNi2n0XDQ7UYpzos44GTXpCngRIS/oAds7SXs0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715665},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"0.2.1-alpha","@aidex/core":"0.2.1-alpha","@aidex/catalog":"0.2.1-alpha","@aidex/engines":"0.2.1-alpha","@aidex/prompts":"0.2.1-alpha","@aidex/workflow":"0.2.1-alpha","@aidex/observability":"0.2.1-alpha"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_0.2.1-alpha_1785778176708_0.1030188131058305","host":"s3://npm-registry-packages-npm-production"}},"0.3.0-alpha":{"name":"@aidex/media","version":"0.3.0-alpha","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@0.3.0-alpha","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"fd45dd0be01da2ef2d9a535e370345622838e2f9","tarball":"https://registry.npmjs.org/@aidex/media/-/media-0.3.0-alpha.tgz","fileCount":9,"integrity":"sha512-a1KXLDZQLAkv0Vf8tJxw4sXpDREPw9g8MTquBdXI9wrBXtOFnjgG8YohhPxjz4armf+gXAYlb/gNGhcUf21u+w==","signatures":[{"sig":"MEUCIFaWTGfy6Bkr6gpBNZQdcsdajTLfSTVyTBz6U/1niGUKAiEA8IK2gcSZ4z9UwiXl5JsfUoNvIBrsUBb7Y5Sug9ghzn0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":600966},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.19.0","pnpm":">=9"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"0.3.0-alpha","@aidex/core":"0.3.0-alpha","@aidex/catalog":"0.3.0-alpha","@aidex/engines":"0.3.0-alpha","@aidex/prompts":"0.3.0-alpha","@aidex/workflow":"0.3.0-alpha","@aidex/observability":"0.3.0-alpha"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_0.3.0-alpha_1786213618317_0.6213408520169676","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@aidex/media","version":"1.0.0","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@1.0.0","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"9e16d73ad887c188e16a6e0c3c8b7d684f6c11b4","tarball":"https://registry.npmjs.org/@aidex/media/-/media-1.0.0.tgz","fileCount":10,"integrity":"sha512-yCLpdWI0IuAEX1iMwktrLbhLw4Cyiu6Y65RHuDjvYgFVH78h2XEP+B2sVGxXQN8G2xdmfxVhctGNraoz7943hQ==","signatures":[{"sig":"MEQCIFUDoER3cgHlmeS14TiWHxNT0rK6FMM3B6U9HxGzjdguAiBDKFzZ3LPy/y/7aJVNU8rurFuEmpeI0GaMPH8DAzZ7zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":601330},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.19.0","pnpm":">=9"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"1.0.0","@aidex/core":"1.0.0","@aidex/catalog":"1.0.0","@aidex/engines":"1.0.0","@aidex/prompts":"1.0.0","@aidex/workflow":"1.0.0","@aidex/observability":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_1.0.0_1786431589649_0.5060222083160868","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aidex/media","version":"1.0.1","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","_id":"@aidex/media@1.0.1","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"21c3bb73f43578ba40d863201f00243b99214f11","tarball":"https://registry.npmjs.org/@aidex/media/-/media-1.0.1.tgz","fileCount":10,"integrity":"sha512-dBGCM2M8EblR/SdN+EyPIEcYpezaj4+LeIfXFgK9+IGdn5+GjIcMhV32Ugtc8Ush595DsCop40XiyjMmtpLkpg==","signatures":[{"sig":"MEUCIGd493+Da/ike8YQSdiHpwD5TuinO9TdW72y62atkKITAiEAs7GQug2cGsoNiA36yHgCqY5a41vCi8Jvo7aqetn2dew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":601330},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.19.0","pnpm":">=9"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"@aidex/sdk":"1.0.1","@aidex/core":"1.0.1","@aidex/catalog":"1.0.1","@aidex/engines":"1.0.1","@aidex/prompts":"1.0.1","@aidex/workflow":"1.0.1","@aidex/observability":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_1.0.1_1786432228794_0.8856661058156121","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aidex/media","version":"1.1.0","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"author":{"name":"Sudheer Babu","email":"isudheerbabu.dev@gmail.com"},"license":"MIT","_id":"@aidex/media@1.1.0","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","bugs":{"url":"https://github.com/getaidex/aidex/issues"},"dist":{"shasum":"6c3a6372180a31a4b12c6e82caef22b91eaa63db","tarball":"https://registry.npmjs.org/@aidex/media/-/media-1.1.0.tgz","fileCount":134,"integrity":"sha512-1K/YAWxE529chVWIO7P8CMOhrJm0pMjbIOhEFvJgoyhZBAmnX4yLnUc8s1PBkUbhoaYeVVB752LOEJqyLvD44w==","signatures":[{"sig":"MEUCIQCyIQFUr5gYs+nHsSaAZhbz8q5cxsKREtEGHhhwAVJp1AIgW4iAeZOjcU0Pu6X6Mz7ZirVTH8hSdzc8v/PtO1wTxpE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715632},"main":"./dist/index.cjs","type":"module","_from":"file:aidex-media-1.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20.19.0","pnpm":">=9"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"_resolved":"/tmp/0e5891cf512d4901fb883ddf2b4589ac/aidex-media-1.1.0.tgz","_integrity":"sha512-1K/YAWxE529chVWIO7P8CMOhrJm0pMjbIOhEFvJgoyhZBAmnX4yLnUc8s1PBkUbhoaYeVVB752LOEJqyLvD44w==","repository":{"url":"git+https://github.com/getaidex/aidex.git","type":"git","directory":"packages/media"},"_npmVersion":"10.9.8","description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@aidex/sdk":"1.1.0","@aidex/core":"1.1.0","@aidex/catalog":"1.1.0","@aidex/engines":"1.1.0","@aidex/prompts":"1.1.0","@aidex/workflow":"1.1.0","@aidex/observability":"1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/media_1.1.0_1787417557314_0.1163811361002498","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aidex/media","version":"1.2.0","description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"license":"MIT","author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","repository":{"type":"git","url":"git+https://github.com/getaidex/aidex.git","directory":"packages/media"},"bugs":{"url":"https://github.com/getaidex/aidex/issues"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"sideEffects":false,"publishConfig":{"access":"public"},"dependencies":{"@aidex/catalog":"1.2.0","@aidex/core":"1.2.0","@aidex/engines":"1.2.0","@aidex/prompts":"1.2.0","@aidex/sdk":"1.2.0","@aidex/workflow":"1.2.0","@aidex/observability":"1.2.0"},"engines":{"node":">=20.19.0","pnpm":">=9"},"scripts":{"build":"tsc -b && tsup","typecheck":"tsc -b --noEmit"},"_nodeVersion":"24.13.0","_id":"@aidex/media@1.2.0","dist":{"integrity":"sha512-eRAK1mb0WU41Vqy1LfFmHq1+IslXvBPLuNYR8Hppv9R4MDkWF1iO37Ux8k4rAy/FHdnNiQSzrIGy2Cn77/MsGA==","shasum":"3375bdd7661171675b8aad4387695d53523ab904","tarball":"https://registry.npmjs.org/@aidex/media/-/media-1.2.0.tgz","fileCount":134,"unpackedSize":715632,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCnBobg5ZJolexjr5FS5dYemR4IdqSkyiyY/SbgFR0jugIhAILYtcYfFAJc+cJHMK82jv4D52I6F88SXDAAx+nBy+Tp"}]},"_npmUser":{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"},"directories":{},"maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/media_1.2.0_1787491740481_0.42539651132419243"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-03T14:50:09.636Z","modified":"2026-08-23T13:29:00.852Z","0.1.0-alpha":"2026-08-03T14:50:10.015Z","0.2.0-alpha":"2026-08-03T15:47:31.998Z","0.2.1-alpha":"2026-08-03T17:29:36.965Z","0.3.0-alpha":"2026-08-08T18:26:58.458Z","1.0.0":"2026-08-11T06:59:49.783Z","1.0.1":"2026-08-11T07:10:28.950Z","1.1.0":"2026-08-22T16:52:37.500Z","1.2.0":"2026-08-23T13:29:00.631Z"},"bugs":{"url":"https://github.com/getaidex/aidex/issues"},"author":"Sudheer Babu <isudheerbabu.dev@gmail.com>","license":"MIT","homepage":"https://github.com/getaidex/aidex/tree/main/packages/media#readme","keywords":["ai","media","image","video","audio","feature-pack","transcription","generation"],"repository":{"type":"git","url":"git+https://github.com/getaidex/aidex.git","directory":"packages/media"},"description":"Aidex Media — an Aidex Feature Pack: engine identifiers and typed request/response contracts for image, video, and audio generation, editing, and transcription.","maintainers":[{"name":"sudheerbabu","email":"isudheerbabu.dev@gmail.com"}],"readme":"# @aidex/media\n\n## Installation\n\n```sh\npnpm add @aidex/media\n```\n\n```sh\nnpm install @aidex/media\n```\n\nAn **Aidex Feature Pack** — image, video, and audio generation, editing,\nand transcription, built to the reference architecture `@aidex/document`,\n`@aidex/content`, and `@aidex/design` established.\n\n## What this is\n\nA Feature Pack is a domain-specific capability layer built *on* the Aidex\nplatform, consumed the same way any external developer would consume it —\nnever granted special access to `packages/core` or any other platform\npackage. `@aidex/media` covers cross-media operations: generating,\nediting, and producing variants of images; generating, editing,\nstoryboarding, and thumbnailing video; generating, transcribing, and\nsummarizing audio; and converting/transforming any media asset generally.\n\n## Status\n\n| Phase | What it added | State |\n| --- | --- | --- |\n| 1 | Engine ids + typed request/response contracts + catalog metadata | Done |\n| 2 | Executable engines returning deterministic placeholder results | Done |\n| 3 | AI integration — prompt → provider → structured result | Done |\n| 4 | Reusable multi-engine workflows | Done |\n\nAll 13 engines are AI-backed: each resolves its own registered prompt,\ncalls `context.provider.generate()`, and parses the response into its\nResult type. `MEDIA_ENGINE_METADATA` versions are `1.0.0` across all 13\nentries. 3 workflows compose existing engines via `@aidex/workflow`'s real\n`Workflow`/`WorkflowStep`/`WorkflowExecutor` contract:\n`media.workflow.image-enhancement`, `media.workflow.video-preparation`,\n`media.workflow.audio-processing`. No new engines, no new prompts, no new\nproviders, no application-specific logic, no vendor SDKs, no external\nAPIs.\n\n## Dependencies\n\n`@aidex/catalog` (for the `EngineMetadata` type `MEDIA_ENGINE_METADATA` is\ntyped against), `@aidex/core` (for `ExecutionContext`/`Provider`/`Strategy`),\n`@aidex/engines` (for the `Engine` interface), `@aidex/prompts` (for\n`PromptRegistry`), `@aidex/observability` (for the optional\n`ObservabilityBus` every Strategy can record events to), and `@aidex/workflow`\n(for `Workflow`/`WorkflowStep`/`WorkflowExecutor`, added this phase). No\nprovider SDK — this package stays provider-agnostic, same as every other\nFeature Pack.\n\n## Folder structure\n\n```\npackages/media/\n  src/\n    index.ts\n    identifiers.ts          MediaEngineId\n    types/\n      media.types.ts        MediaBrief, MediaSource, MediaAssetResult, Asset*\n      image.types.ts        Image* request/result types\n      video.types.ts        Video* request/result types\n      audio.types.ts        Audio* request/result types\n    engines/\n      metadata.ts           MEDIA_ENGINE_METADATA (+ its test)\n```\n\nTypes are grouped by media kind here, not one file per engine the way\n`@aidex/document`/`@aidex/content`/`@aidex/design` do — a deliberate,\nexplicitly-requested structure for this pack, since several engines\nwithin the same kind (e.g. all 4 image operations) genuinely share value\ntypes (`ImageOutputFormat`, `MediaSource`) more than they'd gain from\nbeing split across separate files.\n\n## Engine identifiers\n\n```ts\nimport { MediaEngineId } from '@aidex/media';\n\nMediaEngineId.ImageGenerate;    // 'media.image.generate'\nMediaEngineId.ImageEdit;        // 'media.image.edit'\nMediaEngineId.ImageVariant;     // 'media.image.variant'\nMediaEngineId.ImageOptimize;    // 'media.image.optimize'\nMediaEngineId.VideoGenerate;    // 'media.video.generate'\nMediaEngineId.VideoEdit;        // 'media.video.edit'\nMediaEngineId.VideoStoryboard;  // 'media.video.storyboard'\nMediaEngineId.VideoThumbnail;   // 'media.video.thumbnail'\nMediaEngineId.AudioGenerate;    // 'media.audio.generate'\nMediaEngineId.AudioTranscribe;  // 'media.audio.transcribe'\nMediaEngineId.AudioSummarize;   // 'media.audio.summarize'\nMediaEngineId.AssetConvert;     // 'media.asset.convert'\nMediaEngineId.AssetTransform;   // 'media.asset.transform'\n```\n\n## Types\n\n### The shared base — deliberately one field\n\n```ts\ninterface MediaBrief {\n  brief: string; // required — a description of intent\n}\n```\n\nUnlike `@aidex/design`'s `DesignBrief` (used by all 14 requests),\n`MediaBrief` is extended by only **8 of the 13** requests here. The other\n5 — `image.optimize`, `video.thumbnail`, `audio.transcribe`,\n`audio.summarize`, `asset.convert` — are purely technical, parameter-driven\noperations (a target format, a timestamp, a language hint) fully\ndescribed by their own explicit fields. Forcing a \"creative brief\" onto\n\"convert this file to mp4\" would be artificial, the same reasoning\n`@aidex/content` used to justify *not* giving `content.rewrite` and\n`content.generate` a shared base at all.\n\n```ts\ninterface MediaSource { url: string; mimeType: string; }\ninterface MediaAssetResult { assetUrl: string; mimeType: string; }\n```\n\n### Per-engine contracts\n\n| Engine id | Request | Result | Extends `MediaBrief`? |\n| --- | --- | --- | --- |\n| `media.image.generate` | `ImageGenerateRequest` | `ImageGenerateResult` | ✅ |\n| `media.image.edit` | `ImageEditRequest` | `ImageEditResult` | ✅ |\n| `media.image.variant` | `ImageVariantRequest` | `ImageVariantResult` | ✅ |\n| `media.image.optimize` | `ImageOptimizeRequest` | `ImageOptimizeResult` | — |\n| `media.video.generate` | `VideoGenerateRequest` | `VideoGenerateResult` | ✅ |\n| `media.video.edit` | `VideoEditRequest` | `VideoEditResult` | ✅ |\n| `media.video.storyboard` | `VideoStoryboardRequest` | `VideoStoryboardResult` | ✅ |\n| `media.video.thumbnail` | `VideoThumbnailRequest` | `VideoThumbnailResult` | — |\n| `media.audio.generate` | `AudioGenerateRequest` | `AudioGenerateResult` | ✅ |\n| `media.audio.transcribe` | `AudioTranscribeRequest` | `AudioTranscribeResult` | — |\n| `media.audio.summarize` | `AudioSummarizeRequest` | `AudioSummarizeResult` | — |\n| `media.asset.convert` | `AssetConvertRequest` | `AssetConvertResult` | — |\n| `media.asset.transform` | `AssetTransformRequest` | `AssetTransformResult` | ✅ |\n\nMost results are `MediaAssetResult` (one output file). Three aren't,\nbecause they genuinely aren't \"one file\":\n\n```ts\nImageVariantResult      // { variants: MediaAssetResult[] }\nVideoStoryboardResult   // { scenes: StoryboardScene[] }\nAudioTranscribeResult   // { text: string, detectedLanguage? }\nAudioSummarizeResult    // { summary: string }\n```\n\n```ts\nimport type { ImageEditRequest, ImageEditResult } from '@aidex/media';\n\nconst request: ImageEditRequest = {\n  brief: 'Remove the background and replace it with a soft gradient',\n  source: { url: 'https://example.com/photo.png', mimeType: 'image/png' },\n  outputFormat: 'png',\n};\n\n// Once a future phase implements the engine:\n// const result: ImageEditResult = await engine.execute({ input: request, ... });\n```\n\n## Engine Catalog metadata\n\n```ts\nimport { EngineCatalog } from '@aidex/catalog';\nimport { MEDIA_ENGINE_METADATA } from '@aidex/media';\n\nconst catalog = new EngineCatalog();\nfor (const metadata of MEDIA_ENGINE_METADATA) catalog.register(metadata);\n\ncatalog.findByCategory('summarization');\n// document.summarize, content.summarize, media.audio.summarize —\n// cross-pack discovery, not just same-pack bookkeeping\n\ncatalog.findByCategory('generation');\n// content.generate, content.blog, ..., design.generate,\n// media.image.generate, media.video.generate, media.audio.generate\n```\n\nEvery entry's `version` is `'0.1.0'` — honestly reflecting that no\n`Engine` class exists yet, matching `@aidex/design`'s own Phase 1\nconvention exactly (not `@aidex/document`'s/`@aidex/content`'s, whose\nmetadata was written *after* their engines were real). `metadata.test.ts`\nchecks structural correctness instead of a drift guard, since there's no\nreal engine to drift from yet.\n\n## Feature Package Manifest\n\n`MEDIA_FEATURE_PACKAGE` (a `FeaturePackage` from `@aidex/sdk`) bundles\nevery engine, prompt, and catalog-metadata entry this package ships, ready\nfor `AIBuilder.use(MEDIA_FEATURE_PACKAGE)`:\n\n```ts\nimport { AIBuilder } from '@aidex/sdk';\nimport { MEDIA_FEATURE_PACKAGE } from '@aidex/media';\n\nconst ai = new AIBuilder().provider(myProvider).use(MEDIA_FEATURE_PACKAGE).build();\n```\n\nEvery engine in this manifest is a **singleton** — constructed once, at\nmodule load, and shared across every `EngineRegistry` that registers it.\nEngine implementations must stay stateless: all execution state belongs\non `ExecutionContext`, never on the engine instance itself.\n\n`workflows` (`ImageEnhancementWorkflow`, `VideoPreparationWorkflow`,\n`AudioProcessingWorkflow`) is pass-through only — `AIBuilder.use()` never\nregisters, adapts, or executes them. Call each workflow's own\n`.run(input, provider, options)` directly.\n\n## Design decisions\n\n**`MediaBrief` stays genuinely minimal — one field, not four.**\n`@aidex/design`'s `DesignBrief` also carries `targetAudience`/`style`/\n`outputFormat` because *every* one of its 14 requests is an inherently\nstyle-driven creative artifact. Media isn't uniformly that: `audio\n.transcribe` has no meaningful \"style,\" and `outputFormat` varies too\nmuch by kind (`png` vs `mp4` vs `mp3`) to live in one generic base\nwithout losing type safety. Each kind's own `*OutputFormat` union\n(`ImageOutputFormat`, `VideoOutputFormat`, `AudioOutputFormat`) is more\nhonest than a shared `string`.\n\n**8 of 13 requests extend `MediaBrief`; 5 deliberately don't.** The 5 —\n`image.optimize`, `video.thumbnail`, `audio.transcribe`,\n`audio.summarize`, `asset.convert` — are fully specified by explicit\nparameters (a source, a target format, a timestamp, a language, a max\nlength). Extending `MediaBrief` onto them would add a required field with\nnothing meaningful to say.\n\n**`audio.summarize` mirrors `document.summarize`/`content.summarize`\nfield-for-field** (`source`, `maxLength?`) rather than inventing a new\nconvention for an identical idea — the same reasoning\n`@aidex/content`'s `ContentSummarizeRequest`/`ContentTranslateRequest`\nalready established for reusing `@aidex/document`'s shape when the same\nconcept genuinely recurs.\n\n**Types grouped by media kind, not one file per engine.** This is the one\nexplicit structural deviation from `@aidex/document`'s/`@aidex/content`'s/\n`@aidex/design`'s file layout, requested for this pack specifically — see\n\"Folder structure\" above.\n\n**Categories deliberately reuse the existing cross-pack vocabulary.**\n`generation`, `transformation`, and `summarization` aren't new categories\ninvented for this pack — they're the exact strings `@aidex/document`,\n`@aidex/content`, and `@aidex/design` already use, verified live (see\n\"Verification\" in the delivery report) to prove `findByCategory()`\nactually groups across all four packs, not just within `@aidex/media`.\n\n**`assertHasValidSource` narrows `input` to `Record<string, unknown> &\n{ source: MediaSource }`, not just `{ source: MediaSource }`.** Several\nengines (e.g. `image.edit`, `asset.transform`) call\n`assertHasNonEmptyStringField` (narrowing to `Record<string, unknown>`)\n*then* `assertHasValidSource` on the same `input`. If the second\nassertion's type didn't preserve the `Record<string, unknown>`\nintersection, the earlier narrowing would be lost and subsequent field\nreads (`input.brief`) would stop type-checking. The convention this pack\nfollows throughout: always call `assertHasNonEmptyStringField` (when\nneeded) *before* `assertHasValidSource`, never after.\n\n**`readEnum<T extends string>` is new to this pack.** Image, video, and\naudio each have their own closed `outputFormat` union; a single generic\nreader parameterized by the valid set replaced three near-identical\nhand-written readers.\n\n**`mediaAssetFromDescription` — the same known limitation @aidex/design's\n`assetFromDescription` documents, ported for media.** `Provider.generate()`\nis text-only across this entire platform; there is no image/video/audio\nrendering capability, and Phase 3 explicitly forbids adding one (no\nexternal APIs, no vendor SDKs). For every engine whose Result is a\n`MediaAssetResult` (9 of 13: everything that generates, edits, extracts,\nconverts, or transforms a binary asset), \"AI-backed\" means the provider\nproduces a genuine structured specification — composition, edit\ninstructions, scene direction — encoded as a `data:text/plain,` URI\n(RFC 2397), not real bytes and not a `placeholder://` string that resolves\nto nothing. `mimeType` stays deterministically computed (never\nAI-invented) — only `assetUrl` carries the provider's actual output.\n\n**`audio.transcribe`/`audio.summarize` have their own, distinct known\nlimitation, documented separately.** These aren't binary-asset engines —\nthey analyze an *existing* asset the provider was never given the bytes\nof, only a `source.url`/`mimeType`. Since there's no external ASR API to\ncall (forbidden anyway), their prompts ask explicitly for a\nclearly-labeled, best-effort placeholder rather than letting the provider\nimply it \"listened\" to audio it never received. See\n`audioTranscribePrompt.ts`/`audioSummarizePrompt.ts` for the full\nrationale — a different justification from `mediaAssetFromDescription`'s,\nso documented separately rather than folded into the same note.\n\n**`video.storyboard` needs neither trick.** Its Result (`scenes: readonly\nStoryboardScene[]`) is genuinely textual content the provider can\nauthentically produce — no binary asset, no inaccessible source to\npretend to analyze — so it parses straight from JSON like any other\nFeature Pack's plain-text Strategy.\n\n**Strategy/prompt file names stay unprefixed** (`ImageGenerateStrategy.ts`,\nnot `MediaImageGenerateStrategy.ts`), matching Phase 1/2's own unprefixed\nengine naming — a deliberate, consistent deviation from\n`@aidex/design`'s `Design`-prefixed convention, since this pack's Phase 1\nfolder structure (types grouped by media kind) was already established as\nits own convention rather than the document/content/design norm.\n\n**`buildSourceNote` is new to this pack** (`strategies/buildSourceNote.ts`)\n— 9 of 13 strategies take a `source` and need to mention it in their\nprompt; extracted once rather than repeated 9 times, in the same spirit as\n`@aidex/design`'s `buildGuidanceNote` but scoped to the one field media's\nrequests actually share structurally (media has no single shared\n`targetAudience`/`style` concept the way `DesignBrief` does).\n\n**Only 2 of 3 workflows are genuinely data-dependent pipelines, and that's\nan honest reflection of the underlying engines' contracts, not a\nshortcut.** `media.workflow.image-enhancement`'s `VariantStep` calls\n`media.image.variant` with the *optimized* asset's `assetUrl`/`mimeType`\nas its `source` — real composition, mirroring `@aidex/design`'s\n`BrandKitWorkflow` flowing `design.brand`'s output into its later steps.\n`media.workflow.video-preparation` and `media.workflow.audio-processing`\ncompose two engines that both read from the shared workflow input\nindependently, because their underlying engines' Phase 1 contracts don't\nsupport piping one's output into the other (`video.thumbnail` extracts\nfrom a video `source`, unrelated to `video.storyboard`'s planning text;\n`audio.summarize` takes a `source`, not free text, so a transcript can't\nflow in). Reshaping those contracts to fit a workflow's convenience would\nviolate Phase 4's own \"do not duplicate engine logic inside workflows\"\nconstraint from the other direction — it still means composing exactly\nwhat `@aidex/media` already ships, not fabricating a dependency the engines\ndon't support. Both workflows still deliver real value: one call, shared\nlifecycle events, cancellation, and error propagation instead of two\nunrelated ones. See each workflow's own doc comment for the specific\nrationale.\n\n**Workflow file names also stay unprefixed** (`ImageEnhancementWorkflow.ts`,\nnot `MediaImageEnhancementWorkflow.ts`), consistent with Phase 1–3's own\nunprefixed convention for this pack.\n\n## Why this follows the reference architecture\n\n- **Standalone.** No dependency on any Aidex platform package beyond\n  `@aidex/catalog`'s pure metadata type.\n- **Consumes, never modifies, the platform.** Nothing in this package\n  changes `@aidex/core`, `@aidex/sdk`, `@aidex/providers`, `@aidex/plugins`,\n  `@aidex/workflow`, `@aidex/prompts`, `@aidex/tools`, `@aidex/observability`,\n  `@aidex/evaluation`, `@aidex/catalog`, `@aidex/document`, `@aidex/content`,\n  or `@aidex/design`.\n- **Contracts and discoverability before implementation.** Ids, types,\n  and catalog metadata are defined and stable before a single line of AI\n  logic exists — the same discipline every prior Feature Pack followed\n  from its own Phase 1.\n","readmeFilename":""}