{"_id":"@purposeinplay/payload-ai-translate","_rev":"32-7aa2be2e603f48795d5c7de6e3c409c0","name":"@purposeinplay/payload-ai-translate","dist-tags":{"latest":"0.3.12"},"versions":{"0.1.0":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.0","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.0","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"3259c62c6cd150c02145671c3a0c407c907def23","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.0.tgz","fileCount":301,"integrity":"sha512-5x+iVVql86rFyVdenxnHZpvJIv6VYEu50x5jf5p9zz1gtKbhMJ8AWXNbQEaXGVgrrhiUXII4vhDuyt0pA2rhaQ==","signatures":[{"sig":"MEYCIQD7/4U1qBA3cG5a5uMl37KKFB65pi65WExGiqKbsh/LQQIhAIfV62ebH/C2xX0en+anvECXH402MJTfo1qjiH7pP9dN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1905786},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.0.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},"_resolved":"/private/var/folders/18/sdgv8jtd4_g4twmhtv73jcbr0000gn/T/4550a9dbe4f9783bb876bca6c09b7fb5/purposeinplay-payload-ai-translate-0.1.0.tgz","_integrity":"sha512-5x+iVVql86rFyVdenxnHZpvJIv6VYEu50x5jf5p9zz1gtKbhMJ8AWXNbQEaXGVgrrhiUXII4vhDuyt0pA2rhaQ==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.9.7","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.0_1781606560612_0.8241430058805503","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.1","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.1","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"72edee154aac6f3f95f5db088fed5d36fd667dd0","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.1.tgz","fileCount":301,"integrity":"sha512-5z0Gu4X5V2rnBJcOO0ZMeBJ2+V0KdlBah9KiMluceLyQ822zhvXBFSOZSqAm+T1NxpEPd6oKALIEYVA+ummOhA==","signatures":[{"sig":"MEQCIA9GLFN7LQ65x6VUh2OsxrdA7BSa14febuM4WNxSNWioAiAouYiNixvSLHTKMC2Mc1j/HAqYK/ZQ2xwPhoEBwsrVyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1911861},"main":"./src/exports/index.ts","type":"module","types":"./src/exports/index.ts","exports":{".":{"types":"./src/exports/index.ts","import":"./src/exports/index.ts","default":"./src/exports/index.ts"},"./views":{"types":"./src/exports/views.ts","import":"./src/exports/views.ts","default":"./src/exports/views.ts"},"./client":{"types":"./src/exports/client.ts","import":"./src/exports/client.ts","default":"./src/exports/client.ts"},"./providers":{"types":"./src/exports/providers.ts","import":"./src/exports/providers.ts","default":"./src/exports/providers.ts"},"./components":{"types":"./src/exports/components.ts","import":"./src/exports/components.ts","default":"./src/exports/components.ts"},"./views-client":{"types":"./src/exports/views-client.ts","import":"./src/exports/views-client.ts","default":"./src/exports/views-client.ts"}},"gitHead":"12ad03ec8634e28b6c5d99cfada03ce5577bb142","scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"main":"./dist/exports/index.js","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}}},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.1_1781707051681_0.620714156209365","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.2","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.2","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"baa4452967f4f272ef5c0a60cc3df97827b7ab59","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.2.tgz","fileCount":301,"integrity":"sha512-FCzHZGpiFId7zknijrd6gtMjPcHfBr0HG4fZC3kNfOHxmdLHCNBKiSSHNRNkqDtbAsqwgeNlNWvgp72I4ReiBQ==","signatures":[{"sig":"MEUCIHCAW/Sh2CyaFuXeg1AFX+NR4go+X2qBRG0gtfH3RhYyAiEAz4Yh1xLpV2YAc50cuZ4rK5WjHMLGx6S68H7J/BydCrI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1911861},"main":"./src/exports/index.ts","type":"module","types":"./src/exports/index.ts","exports":{".":{"types":"./src/exports/index.ts","import":"./src/exports/index.ts","default":"./src/exports/index.ts"},"./views":{"types":"./src/exports/views.ts","import":"./src/exports/views.ts","default":"./src/exports/views.ts"},"./client":{"types":"./src/exports/client.ts","import":"./src/exports/client.ts","default":"./src/exports/client.ts"},"./providers":{"types":"./src/exports/providers.ts","import":"./src/exports/providers.ts","default":"./src/exports/providers.ts"},"./components":{"types":"./src/exports/components.ts","import":"./src/exports/components.ts","default":"./src/exports/components.ts"},"./views-client":{"types":"./src/exports/views-client.ts","import":"./src/exports/views-client.ts","default":"./src/exports/views-client.ts"}},"gitHead":"12ad03ec8634e28b6c5d99cfada03ce5577bb142","scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"main":"./dist/exports/index.js","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}}},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.0","devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.2_1781709639901_0.5949468198982768","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.3","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.3","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"5d0d5b49f0b756cc0d71d67822ecd4b551d60c1e","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.3.tgz","fileCount":301,"integrity":"sha512-N4lSUxfLtxllHLx6t8nk0Ja+aleNf7Oe7VB7e/0LAREQt80cGS5s8/V83oetdkign5pT/uZhZYhVy0XK5bpWcQ==","signatures":[{"sig":"MEUCIHEO5pMEL5KGlP2WNKnt14LnLGK0hTYmVL1nMTwYVaWAAiEAzva1WxVOBqi2CxL1tbMjWmHJApUApYrziH8vTKRUS6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1910684},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.3.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/1af225ec258f7d19b69e49cdbf7f133d/purposeinplay-payload-ai-translate-0.1.3.tgz","_integrity":"sha512-N4lSUxfLtxllHLx6t8nk0Ja+aleNf7Oe7VB7e/0LAREQt80cGS5s8/V83oetdkign5pT/uZhZYhVy0XK5bpWcQ==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.3_1781709949909_0.41028101595846356","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.4","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.4","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"83b5afade472370cb005edc539004a673d6c05fe","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.4.tgz","fileCount":301,"integrity":"sha512-3owMI+DOb+EdF2qHEGDIHZ9emi12dP+rpr8fl22m1lB27mXFtK5IxwgnyVgaurcyC94kMc4IHqWXhVrhkUdkBA==","signatures":[{"sig":"MEUCIQDASnSKDvDPv3PPetowwrpkww++T83nc35Le6g+WGiUFAIgSf5gcfpPP1GcqloXmsGv2wsn1JlOBmj5t62u4epGmOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1912594},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.4.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},"_resolved":"/private/var/folders/18/sdgv8jtd4_g4twmhtv73jcbr0000gn/T/0b273a0c8bc454055fd0ac677082bd34/purposeinplay-payload-ai-translate-0.1.4.tgz","_integrity":"sha512-3owMI+DOb+EdF2qHEGDIHZ9emi12dP+rpr8fl22m1lB27mXFtK5IxwgnyVgaurcyC94kMc4IHqWXhVrhkUdkBA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.9.7","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.4_1781875965694_0.5793583737907271","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.5","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.5","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"e335eabd98e9d41139a7304914985ea32b3909fe","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.5.tgz","fileCount":301,"integrity":"sha512-Si03fVymE4eQMX/8VPs8tTPIj3JUiJDpmGYwDwT4Z1IBgAAPD83pjzfdn5hL4c7X1vgCTsed5iX4EAVkk5v4mg==","signatures":[{"sig":"MEQCICdAlVckUyrL1lAksrX3ot8f2no7HsOsnYzWnGCGoT5XAiBLR1CX24K0XIcpfpY0YnAoMTQaUKpZ14z2fbJv85X/YA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1920505},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.5.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/fbab1fb3909d5863419a5f0b76603d9e/purposeinplay-payload-ai-translate-0.1.5.tgz","_integrity":"sha512-Si03fVymE4eQMX/8VPs8tTPIj3JUiJDpmGYwDwT4Z1IBgAAPD83pjzfdn5hL4c7X1vgCTsed5iX4EAVkk5v4mg==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.5_1782481876898_0.47947343391429387","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.6","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.6","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"7746c4a37f279560b15ee521c468a71fbefe892b","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.6.tgz","fileCount":301,"integrity":"sha512-XivsCWwwIgfSaVK3ZEYhCMiUJyF+WQVEJ3YolSljs9om1rWVbQBUvLpOJcOEX1RqRmgv7fQwU7rbEKn/S7z8Tw==","signatures":[{"sig":"MEYCIQDtSbvzmr3rnMtfuFrYKz3PwJ+6uXhvdiG9pnBX21sJqQIhAMgRKxQsnsAfODbtzNv0wGM4JdtO4bbJuFl5x5TGzc6C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1928658},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.6.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/ea7757af9151f855498c0d4ca420e75e/purposeinplay-payload-ai-translate-0.1.6.tgz","_integrity":"sha512-XivsCWwwIgfSaVK3ZEYhCMiUJyF+WQVEJ3YolSljs9om1rWVbQBUvLpOJcOEX1RqRmgv7fQwU7rbEKn/S7z8Tw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.6_1782890909291_0.5151356988076878","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@purposeinplay/payload-ai-translate","version":"0.1.7","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.1.7","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"fb201d803538d0ba9473ad807a66f0c8f07fce7a","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.1.7.tgz","fileCount":301,"integrity":"sha512-NmvHByaOXwuL2PKyvp5HrQBNzUKKJxFIdSiFvEMLKIUYk7EoWsgE2+dF1c8dN6ghtpKsMEhc55pO3idKc1R4+g==","signatures":[{"sig":"MEUCIHWssxBBO7Yrlw92NlNLLUeNEmFbrGFIsbX1KxiOBvqeAiEAnfzgocGxjjdk6fmybmIys4bU/alA67qOAaMwPplDGic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1946449},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.1.7.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/db2df129cc1c0e542a0e5dbf27f97ce2/purposeinplay-payload-ai-translate-0.1.7.tgz","_integrity":"sha512-NmvHByaOXwuL2PKyvp5HrQBNzUKKJxFIdSiFvEMLKIUYk7EoWsgE2+dF1c8dN6ghtpKsMEhc55pO3idKc1R4+g==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.1.7_1782973292077_0.6053117303796369","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.0","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.0","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"ea9abb62b8cb0f5c45a6ed9bac659c034d95a549","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.0.tgz","fileCount":329,"integrity":"sha512-PuXABTbC1rwSXc3G1iNcQUaef1JxSrWpDDWbRGxbL7E7EMgLgP4Td6jQEz7O/VGlHvUIU0zU2m3nFH1JTghI7g==","signatures":[{"sig":"MEQCIGjB2ni6WHqjIaPAMj0dYr9/ymXmFTT7J+ipuNDnBPsnAiAMkE/ZM4J/7s5q710dU6q7Cd7IKptLv9NtpTcXw0F8JA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2167105},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.0.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/7364d19daaa72bf04fb0d5f8ddf8457e/purposeinplay-payload-ai-translate-0.2.0.tgz","_integrity":"sha512-PuXABTbC1rwSXc3G1iNcQUaef1JxSrWpDDWbRGxbL7E7EMgLgP4Td6jQEz7O/VGlHvUIU0zU2m3nFH1JTghI7g==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.0_1783438068208_0.8560604440405104","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.1","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.1","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"1bdb553cae7edd52cf7254de030adbc8ddf447f0","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.1.tgz","fileCount":329,"integrity":"sha512-OW6U5yzUAry6azNmF9sZ0d1wMHJOrt189bt0QSGHdPSd29KP72L3rqsoU9esHz5lThdG+6W+IvrRR1+1yI9pyg==","signatures":[{"sig":"MEUCIHJ0631fAeAQJh9GnYfIs55YDVzbDobO2S6nMiFR3q5JAiEAywARy9j9fKP2jf0+aqY0EMkkcmSRA2EK2ZP7Xlv/VLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2189380},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.1.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},"_resolved":"/private/var/folders/ny/gt19pbz175jbb9ls7btb3jp80000gn/T/12101e1b7e03fc31f5bff1701ca0055f/purposeinplay-payload-ai-translate-0.2.1.tgz","_integrity":"sha512-OW6U5yzUAry6azNmF9sZ0d1wMHJOrt189bt0QSGHdPSd29KP72L3rqsoU9esHz5lThdG+6W+IvrRR1+1yI9pyg==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"11.6.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"24.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.1_1783514040552_0.45035515281196425","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.2","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.2","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"e9f4812b7e3951dec14251fbf5f5d2124b0422d8","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.2.tgz","fileCount":333,"integrity":"sha512-/M7+tAiDct63dCbnJUckaxSpZMJw8rIB2ndSng5aoFNt7A/CkYW4kHYT0W99RR1R7ZPtKQz40WQSRU5XQc6r7w==","signatures":[{"sig":"MEUCIQDIhVTy3PUJf0SZONn4GAt3PDWB4DhlcDMMbR2dYjqREwIgQZ/aFgMlvM6HG7njY0jhexFYHr7JxxrKiHCjoY/crVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2225846},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.2.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/26d79cf8db3ee3a2a6785ce5b967ad35/purposeinplay-payload-ai-translate-0.2.2.tgz","_integrity":"sha512-/M7+tAiDct63dCbnJUckaxSpZMJw8rIB2ndSng5aoFNt7A/CkYW4kHYT0W99RR1R7ZPtKQz40WQSRU5XQc6r7w==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.2_1783607681469_0.034876409881554604","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.3","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.3","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"ac447b0a72e8c525e027512be50aa9270c2fc7b4","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.3.tgz","fileCount":403,"integrity":"sha512-AsMPw9qsqOxqgFB5OKZfPLj0GvLXEuKHsck12eQZyG8DNniuCQ6J23R8V6ZvBks530ExYNp97AroqPiQeo8giw==","signatures":[{"sig":"MEYCIQDfpxp0QnhubjywcgvcuS8SBjBzdGsx1+ZXGQnF3e5/wAIhAJa0YOmaz0flY81HCPnxNiQxqLmpt3BTrBBMDgBsO/Xw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3053107},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.3.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/9b67d02a42bfb8ca6d18805d3289e957/purposeinplay-payload-ai-translate-0.2.3.tgz","_integrity":"sha512-AsMPw9qsqOxqgFB5OKZfPLj0GvLXEuKHsck12eQZyG8DNniuCQ6J23R8V6ZvBks530ExYNp97AroqPiQeo8giw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.3_1784188408836_0.46988365523105036","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.4","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.4","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"01eee76316ecd055d56b8612a2dae5d1d20f2b7a","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.4.tgz","fileCount":403,"integrity":"sha512-SJdrScCz362FnNO/WwfbNxmMhgHLeqL1JNM42j4ZkXxEWreLYjPvSLpVKXbyfylxPVa0TOiskYLHLsm2vAQ93A==","signatures":[{"sig":"MEUCIC5LBkxNe8/1RTPEL7KWMcg/laf9ReJZlKcjYqG/4m1bAiEAlmhuJDpV7NDjcbd/R6JjBcwJNJuN0+vyJ3ZYel7+eT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3067053},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.4.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/61341560b92017c6a39b29fe32121e6e/purposeinplay-payload-ai-translate-0.2.4.tgz","_integrity":"sha512-SJdrScCz362FnNO/WwfbNxmMhgHLeqL1JNM42j4ZkXxEWreLYjPvSLpVKXbyfylxPVa0TOiskYLHLsm2vAQ93A==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.4_1784210720096_0.3412422043911487","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.5","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.5","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"9ddbae050b38a00b6c67a33879ee5998c36b54af","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.5.tgz","fileCount":405,"integrity":"sha512-EyCinamIdpGhZIZ/21YHdxYZ5mW0cZPsCgrq/xCmD733Isgvxpq51NkZUmr5FrLDlJ9DA9oB6crIclw+jMOIdA==","signatures":[{"sig":"MEUCIBQR+JPBPbxx7YUiAuHe5urOzbgO1Zfl4vSBQj06nS3pAiEA8WpkuAcnfmWThfCCLyEWPokvu1UiB35kBXgtyB8XfGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3070426},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.5.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/933aadb3297a7f6505f549e25bf43ca1/purposeinplay-payload-ai-translate-0.2.5.tgz","_integrity":"sha512-EyCinamIdpGhZIZ/21YHdxYZ5mW0cZPsCgrq/xCmD733Isgvxpq51NkZUmr5FrLDlJ9DA9oB6crIclw+jMOIdA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.5_1784285132916_0.31286118107268557","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.6","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.6","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"3753fc40c268395af1edc7b700c9b5751a1c249f","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.6.tgz","fileCount":405,"integrity":"sha512-Zn55LxXmhfoBw7x/1eySNbzv4JQyq6HhZ6SOfy5RMaST4ZAJC3NZMGBzxTJoVKr6FEepza8wZqBcrpEquHjHAw==","signatures":[{"sig":"MEUCIQDGJ6Uyvdw/BBbMAEHYTSvig0wD8J8AOOt/UZxbIdTmmgIgS54Ca1sRBhQup6M8pQ3bpG8zokB8wmdAhc+iT+Ri0Jc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3107960},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.6.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/e77c91bb6164444b6bb409303a1eb0c2/purposeinplay-payload-ai-translate-0.2.6.tgz","_integrity":"sha512-Zn55LxXmhfoBw7x/1eySNbzv4JQyq6HhZ6SOfy5RMaST4ZAJC3NZMGBzxTJoVKr6FEepza8wZqBcrpEquHjHAw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.6_1784704845033_0.55195193977182","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.7","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.7","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"bbe7bfcdbdfb65b3873d1ae17ec40b7ce01068e6","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.7.tgz","fileCount":405,"integrity":"sha512-VKpISaRnkYRsxymG11IPr+ewFg0vvxFnLm8nynRpahsvMDou8qfInVYucxiNLvuX0BG2+HUgdCfs5eqn+UFWgw==","signatures":[{"sig":"MEQCIC7YBQ9Y0ueRNfIGmVTm/uDjfCua4kQDahkqixDtpsG5AiAHqERlxlQOQoz3sNU5/YQrWbQl9goVpf31IRYcKwEvJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3116089},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.7.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/9885a4468b5d663c529bdfbc55622bde/purposeinplay-payload-ai-translate-0.2.7.tgz","_integrity":"sha512-VKpISaRnkYRsxymG11IPr+ewFg0vvxFnLm8nynRpahsvMDou8qfInVYucxiNLvuX0BG2+HUgdCfs5eqn+UFWgw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.7_1784885934394_0.06005258239128919","host":"s3://npm-registry-packages-npm-production"}},"0.2.8":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.8","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.8","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"75d8c8a561a2ddb5ee33c218e73d0f0e7bb0d9ee","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.8.tgz","fileCount":405,"integrity":"sha512-rEcnv+Y/zTgOMH3hdZKwwZ7bLFCuzS70UaLF9wg8iCo2mkPIOEedcD42PibFU3jiwbK47UkMLhgpRsyTvAoZIQ==","signatures":[{"sig":"MEQCIHInacD5EWVMTPjkoJFLeOLsag3jPz9wo6iHkpIznAKkAiAwmBQgR5o339VTtOvABIy3iUqXCb4tM08MhniQTSlP1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3131571},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.8.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/34256ff82f3425b06506c8b73e1ee796/purposeinplay-payload-ai-translate-0.2.8.tgz","_integrity":"sha512-rEcnv+Y/zTgOMH3hdZKwwZ7bLFCuzS70UaLF9wg8iCo2mkPIOEedcD42PibFU3jiwbK47UkMLhgpRsyTvAoZIQ==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.8_1785160550375_0.7902011864932355","host":"s3://npm-registry-packages-npm-production"}},"0.2.9":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.9","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.9","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"4aded4866736e9e3f4aa62c11fb8b3c4412918ec","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.9.tgz","fileCount":407,"integrity":"sha512-BUtcu+daIgLPT2ciuv7S9vXWUVR62x016NKspTWyt4w9fU9shRL5IeGLYfK6nQaoTsLViZiqoc4H90EzlV/F0Q==","signatures":[{"sig":"MEUCIFfS2J0XyRSML66cEXpkLxP5SM6vi3BamyWj0Bj/gf3qAiEApf/UIKHgTTwz8NN2gBtmqJPLEkW/cfzfeijg6SxkJjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3156072},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.9.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/d7f59f900aedda2628f605b55493d76f/purposeinplay-payload-ai-translate-0.2.9.tgz","_integrity":"sha512-BUtcu+daIgLPT2ciuv7S9vXWUVR62x016NKspTWyt4w9fU9shRL5IeGLYfK6nQaoTsLViZiqoc4H90EzlV/F0Q==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.9_1785233126388_0.7929340023871279","host":"s3://npm-registry-packages-npm-production"}},"0.2.10":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.10","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.10","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"196e51923a25ff1d0d12bc4ce33b17a4c3add708","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.10.tgz","fileCount":409,"integrity":"sha512-yXsdAq891/OdFtNaEAd2sq+wBVmpmxd/138J8xoggogUiUT10ELbeAWjFjQ5Rjw52wfoLz1/t900LmLXp31Jig==","signatures":[{"sig":"MEYCIQCGJsKUSSgnhl2g15bFbkIOsDqBA4FACOWdXzIYJvwpiAIhAJZ5xIohVBkG7smxDq172Rpbl3lU7s9+jTs39xrGvPJL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3167161},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.10.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/062a7d283507511d72e45d5df71421b9/purposeinplay-payload-ai-translate-0.2.10.tgz","_integrity":"sha512-yXsdAq891/OdFtNaEAd2sq+wBVmpmxd/138J8xoggogUiUT10ELbeAWjFjQ5Rjw52wfoLz1/t900LmLXp31Jig==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.10_1785312531996_0.6127758705518132","host":"s3://npm-registry-packages-npm-production"}},"0.2.11":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.11","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.11","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"ba13f921173b632496836240b0576e6e8d1a80c6","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.11.tgz","fileCount":409,"integrity":"sha512-XxBfN/O9Pr8wrNpt02fIYCmXgNrWCr6lfNpy3YtS+C/HbEmBc4YDqGDQbtXnyYuYYnLNFFjriro26x4KiB/WSA==","signatures":[{"sig":"MEQCIG5gXqX5o2oEYHz2hUuPaUS30VjTNVADzqR+54h3C6eQAiBBPH9cds+Aer7b0JICvxHSt93wPHNu8ssk3sHv3Zxfew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3174273},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.11.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/bf88366c6d24cac32c9fd0aaf28abe28/purposeinplay-payload-ai-translate-0.2.11.tgz","_integrity":"sha512-XxBfN/O9Pr8wrNpt02fIYCmXgNrWCr6lfNpy3YtS+C/HbEmBc4YDqGDQbtXnyYuYYnLNFFjriro26x4KiB/WSA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.11_1785492501129_0.9689889508513121","host":"s3://npm-registry-packages-npm-production"}},"0.2.12":{"name":"@purposeinplay/payload-ai-translate","version":"0.2.12","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.2.12","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"1b5595f0f4c266080239f1f56527870d6632c998","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.2.12.tgz","fileCount":409,"integrity":"sha512-R5sQ8ztWI4BbNCzaAQbP5nQpEKdx7jW5lvhjCa8/zYHAxznT6yrJJ3yrEtaIhCKkHN5bxQhISlag4oapgNC0xg==","signatures":[{"sig":"MEUCIQCxCcQ7YnW281NhDGvWMX5VLbp8YM4gzEXKVDu+oFdbSAIgE3uMq4AKqC2z1tBCr3XPd2/phObG3Z77bvXBnLimuLQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3203753},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.2.12.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/a3912c560c59c4a3323980423cd1792c/purposeinplay-payload-ai-translate-0.2.12.tgz","_integrity":"sha512-R5sQ8ztWI4BbNCzaAQbP5nQpEKdx7jW5lvhjCa8/zYHAxznT6yrJJ3yrEtaIhCKkHN5bxQhISlag4oapgNC0xg==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.2.12_1785825471141_0.4347039388097058","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.0","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.0","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"a3c2bcd4f4f8b3bb9b21c05c8e55bc6ba45633e9","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.0.tgz","fileCount":411,"integrity":"sha512-KTDAK65ISL2lUCuEV1Qjll7bUtgg6e1WD+YgdBM+MZG3HQNtqhHz28fvNYiTMYRdES8essbXd8mpkJ8hKlcXRw==","signatures":[{"sig":"MEUCIQD8QxX1ftp6U3dAx0lQj+gtyG666BD2ufB93ODDxyCLOwIgGxQ7Loy8lQos+mfoj2XVBijFtOaGGFITKFQ2wCqFE4A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3230966},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.0.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/4747ec7df49feee7a093662043c5da99/purposeinplay-payload-ai-translate-0.3.0.tgz","_integrity":"sha512-KTDAK65ISL2lUCuEV1Qjll7bUtgg6e1WD+YgdBM+MZG3HQNtqhHz28fvNYiTMYRdES8essbXd8mpkJ8hKlcXRw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.0_1786445673933_0.313839049504842","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.2","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.2","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"1ca8e0875f16c7252b784f772234b0e3108b3879","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.2.tgz","fileCount":415,"integrity":"sha512-LeAUO98Id7xo8q+LaJcdEGJLzHLYqyfSr/6gsRVn/0IiytZbx5a972dTpy6h66S4U/lt0Yo43tTmZ/1ElKfHOA==","signatures":[{"sig":"MEYCIQDZimCYef23JD5OKFG2u4dcGJx097Euu2L7RlU+wtZnvQIhAOBRd65L3rCO4Gl0XYpWWKcYOQZFWvMINnCsk7oU3KYc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3266265},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.2.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/0a9c3382cf8b8ef5b4f4bba6d43b4077/purposeinplay-payload-ai-translate-0.3.2.tgz","_integrity":"sha512-LeAUO98Id7xo8q+LaJcdEGJLzHLYqyfSr/6gsRVn/0IiytZbx5a972dTpy6h66S4U/lt0Yo43tTmZ/1ElKfHOA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.2_1787230766045_0.6801680222495472","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.3","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.3","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"686a432dd247bf1313595f6a26a7d86923bdfb9d","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.3.tgz","fileCount":419,"integrity":"sha512-F2HOxLBuuA/sAkTnoJQXsbatXm7Y9039Bv4UfTnJ7BgazlcnZEBz/zGhq1qzBLdS0vqseZd5exj3K10aw82xmA==","signatures":[{"sig":"MEUCIC4HgjQywS9VWcsfkWPnmwHdARN5PGsChLqCqLxCz6OSAiEAmlVsGYpCYnaLVYdLu8cmaXdY6SqrvmsVTyVwlATcKHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3283671},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.3.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/70511b824bbe350ba386d34aae58de20/purposeinplay-payload-ai-translate-0.3.3.tgz","_integrity":"sha512-F2HOxLBuuA/sAkTnoJQXsbatXm7Y9039Bv4UfTnJ7BgazlcnZEBz/zGhq1qzBLdS0vqseZd5exj3K10aw82xmA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.3_1787241194986_0.7850896029785557","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.4","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.4","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"aaca99b159fed5c6d3c03bbfc60c640619b9ad3d","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.4.tgz","fileCount":419,"integrity":"sha512-DyCy9uzsR6/tBw5lrGLzMp5HlWz4ABj1gdIhJ87NSHFuffxUeUCRyY3ktCwpqtpJjJgm0EHhWokrMpPvzbKJDA==","signatures":[{"sig":"MEUCIAX1x0QlkeBnnFaTPG0zmDswsHpo7O/L2kyVAhGZOH53AiEAztjg9H1eAxcuWjDPa7HwOgV4lvYAy6e15woFBfHo1go=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3315696},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.4.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/3ee002ed93e0e9fec3dcb2b7d6c8166d/purposeinplay-payload-ai-translate-0.3.4.tgz","_integrity":"sha512-DyCy9uzsR6/tBw5lrGLzMp5HlWz4ABj1gdIhJ87NSHFuffxUeUCRyY3ktCwpqtpJjJgm0EHhWokrMpPvzbKJDA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.4_1788346305816_0.9112794672383318","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.6","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.6","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"8080ca738335039aa3ec38ee8255475a4c192ae1","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.6.tgz","fileCount":419,"integrity":"sha512-+lNhSJNhBc5vMMWH2t2hPZt7R3CF+6ujCQaZurcIl1k6LNC1twdn4QuVo6RRb6W5+H9UFqkTM9JKYO/vLnai/w==","signatures":[{"sig":"MEUCIGHBEmtJ6Px54HnJfK0UQ/viMl4UtFQyHO51ZQneJOa6AiEAkwT8v3nsemi5edIqnw/wX1NtjFI2WFcHBhuCKLn7fNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3374401},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.6.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/4542a89f6fa1e9853a543be89e577c6b/purposeinplay-payload-ai-translate-0.3.6.tgz","_integrity":"sha512-+lNhSJNhBc5vMMWH2t2hPZt7R3CF+6ujCQaZurcIl1k6LNC1twdn4QuVo6RRb6W5+H9UFqkTM9JKYO/vLnai/w==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.0.0 || ^4.0.0","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@payloadcms/db-postgres":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.6_1788508105012_0.42277364294949504","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.7","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.7","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"47f409a16c3da4b9836177bf7e2167f041edb284","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.7.tgz","fileCount":457,"integrity":"sha512-JANqAdoUUOsFKuK1poh4HOUfLxHvKgFHk1CHIsGs5NWAdKxahNpc4A+m1EGPldM9pVfRrrIngWTsHrPQCTi8ww==","signatures":[{"sig":"MEQCIHiiVPvPygiTZyroQOxDpwyZYvTUND2jVBxxWTQu9EssAiBT7cxPiggNjeIJuTGAhUSr6B3PN+YnXXeNnXb+i+6mAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3617727},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.7.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/ebe6b86eceb6cfc328b26e43dc34cab7/purposeinplay-payload-ai-translate-0.3.7.tgz","_integrity":"sha512-JANqAdoUUOsFKuK1poh4HOUfLxHvKgFHk1CHIsGs5NWAdKxahNpc4A+m1EGPldM9pVfRrrIngWTsHrPQCTi8ww==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.7_1788517060197_0.7282601352570175","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.8","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.8","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"9c5559e62120f88f85eb3488eda23312a5e774e7","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.8.tgz","fileCount":457,"integrity":"sha512-1KwoXKyYLisoWDV2FoBp5ht+Kgdn2lAi5g4N/KxjX0oPli3ojRu+jEIfjEWfpvTNXGZFVEX9X2AFDp5bJh4/GA==","signatures":[{"sig":"MEUCIB8E6k1MqecXHov+KAPoLbCVh6KX0bLj2KMYeI9GBUrSAiEAmse7tbB78iwlnSVezSvL1czYSG6vlnccEbySDKt5prE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3617780},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.8.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/c345ad7704421c0f479b1542fb641fb3/purposeinplay-payload-ai-translate-0.3.8.tgz","_integrity":"sha512-1KwoXKyYLisoWDV2FoBp5ht+Kgdn2lAi5g4N/KxjX0oPli3ojRu+jEIfjEWfpvTNXGZFVEX9X2AFDp5bJh4/GA==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.8_1788524945895_0.8115362553312411","host":"s3://npm-registry-packages-npm-production"}},"0.3.9":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.9","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.9","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"96d0f5b4eec6ee8ef316843db90e8e6689e83ca6","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.9.tgz","fileCount":465,"integrity":"sha512-v10RyQMpAS+KzF8may/L1GCvy8xGIChKbUSZSe1dcI0ztKS1EbWWobjeODX+uMiihfueRtYodRT/+d2N9pR7dw==","signatures":[{"sig":"MEUCIEMWbYXBBvoFJPOcVNLUN84lb/FHxHqVvB0waR9T3nLRAiEAuy11Xj38+v6WcQpcQt9BDKKEWMhpDyLsb34s7vmnnUo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3836551},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.9.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/6b3b12f17937372bec65e1340d174f04/purposeinplay-payload-ai-translate-0.3.9.tgz","_integrity":"sha512-v10RyQMpAS+KzF8may/L1GCvy8xGIChKbUSZSe1dcI0ztKS1EbWWobjeODX+uMiihfueRtYodRT/+d2N9pR7dw==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.9_1789041673909_0.6837783152323169","host":"s3://npm-registry-packages-npm-production"}},"0.3.10":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.10","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.10","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"509ac5fddc878399cb3d17258411410c444970e4","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.10.tgz","fileCount":467,"integrity":"sha512-uGVlHYaed4toQH2dlVSbs02vZW4mSUeF6j9F0HjbpeZsKB3wd+O3Igwvirnv92pehk42CXz1AtDcSawXMd4Bjg==","signatures":[{"sig":"MEUCIAexV+x6JipMzGwQlzLet1GJ3l7L5/a1HMHh1WLIhYD9AiEAm0yiWNJnEKWa7tZdwwzzHfWJ3yh1dx/jp5aFwKCV04o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICdnNaeWXamzOrY7P44Qdul8owHBzM4WwkBa/M+txPBJAiEApvLYSVRVGYK77UIYa5V0l2xpushZ0Y0Itm5Z/9ASdhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3873605},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.10.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","check":"biome check . && pnpm typecheck && pnpm build && pnpm test","clean":"rm -rf dist *.tsbuildinfo","format":"biome format --write .","release":"pnpm build && changeset publish","build:swc":"swc ./src -d ./dist --config-file ./.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","changeset":"changeset","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ./scripts/fix-dist-extensions.mjs dist && node ./scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit","version-packages":"changeset version"},"_npmUser":{"name":"vladsuciu","email":"suciu.vlad@gmail.com"},"_resolved":"/tmp/4cbfc4484d76f5cb7776c1c04eb20e16/purposeinplay-payload-ai-translate-0.3.10.tgz","_integrity":"sha512-uGVlHYaed4toQH2dlVSbs02vZW4mSUeF6j9F0HjbpeZsKB3wd+O3Igwvirnv92pehk42CXz1AtDcSawXMd4Bjg==","repository":{"url":"git+https://github.com/purposeinplay/payload-ai-translate.git","type":"git"},"_npmVersion":"10.8.2","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.0.0","react":"^19.0.0","vitest":"^4.1.2","payload":"^3.0.0","@swc/cli":"^0.7.7","@swc/core":"^1.10.1","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@biomejs/biome":"^2.2.0","@payloadcms/ui":"^3.0.0","@changesets/cli":"^2.27.9","@payloadcms/next":"^3.85.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.10_1789122455039_0.4902228213729112","host":"s3://npm-registry-packages-npm-production"}},"0.3.11":{"name":"@purposeinplay/payload-ai-translate","version":"0.3.11","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"license":"MIT","_id":"@purposeinplay/payload-ai-translate@0.3.11","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"vlad@purposeinplay.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"a8b427ce3119b0874ad8bca49dc01c4c808eaf58","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.11.tgz","fileCount":469,"integrity":"sha512-G2o90rp98/t6tH7JmTBUh6sfDdKIUBx/XH5jLssUME/EQ+vPmyBLGDJj8XIa2dkFqHonko97m7YnwveqcffxFA==","signatures":[{"sig":"MEQCIG7KRQFfOftpB2cxP3ekLMyDoD3SG4bRZX3n6xN4Pa8WAiASMYFa+MpFrzmNfglUx/7ZLK0xu38IDRSNaNrbj+MxdQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCK3U42hEGu0fQJDS4CF/sxX8rbCRAU3wCj6R6/uEnGXAIgYiSp6OtiTzB2hC3mQxE4GM66Vk9FrnDELWo26agyX8o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3930690},"main":"./dist/exports/index.js","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.11.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"scripts":{"test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","clean":"rm -rf dist *.tsbuildinfo","build:swc":"swc ./src -d ./dist --config-file ../../.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ../../scripts/fix-dist-extensions.mjs dist && node ../../scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit"},"_npmUser":{"name":"vladsuciu","email":"vlad@purposeinplay.com"},"_resolved":"/tmp/f7d998223022c818b10ef36577b7f0de/purposeinplay-payload-ai-translate-0.3.11.tgz","_integrity":"sha512-G2o90rp98/t6tH7JmTBUh6sfDdKIUBx/XH5jLssUME/EQ+vPmyBLGDJj8XIa2dkFqHonko97m7YnwveqcffxFA==","repository":{"url":"git+https://github.com/purposeinplay/payload-plugins.git","type":"git","directory":"packages/payload-ai-translate"},"_npmVersion":"10.9.8","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.3.5","react":"^19.0.0","vitest":"^4.1.11","payload":"^3.89.0","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@payloadcms/ui":"^3.89.0","@payloadcms/next":"^3.89.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.89.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/payload-ai-translate_0.3.11_1789651795937_0.519300398987514","host":"s3://npm-registry-packages-npm-production"}},"0.3.12":{"_id":"@purposeinplay/payload-ai-translate@0.3.12","bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"dist":{"shasum":"d600b1fe8019d0565608fa2e212d859087bb36d1","tarball":"https://registry.npmjs.org/@purposeinplay/payload-ai-translate/-/payload-ai-translate-0.3.12.tgz","fileCount":473,"integrity":"sha512-9GFIaZZaHtIVJ/xEEROAx2rUMB1MpjRva6SgKJo2DYCP4KkUSNkYYwomLIcXrjBlAlnyKYaHI2/ZoDx7E9slpA==","signatures":[{"sig":"MEYCIQCs5Z68GxncrmCnmiVgGObugflhKc1LG0QhmbvhaKTm6wIhAJvNOEE4An04UCTr4gehab+pJQy+AIyaZAC2ZXgrZCP4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFSMNMM4WzKtzQV65LO9TYVli2/RX7pLNeo71RXtHWoWAiBTqWDphx9hIBwwDfn6jwOJYQrg4bahnt6zQWGXbh71ag=="}],"unpackedSize":3949392},"main":"./dist/exports/index.js","name":"@purposeinplay/payload-ai-translate","type":"module","_from":"file:purposeinplay-payload-ai-translate-0.3.12.tgz","types":"./dist/exports/index.d.ts","exports":{".":{"types":"./dist/exports/index.d.ts","import":"./dist/exports/index.js","default":"./dist/exports/index.js"},"./views":{"types":"./dist/exports/views.d.ts","import":"./dist/exports/views.js","default":"./dist/exports/views.js"},"./client":{"types":"./dist/exports/client.d.ts","import":"./dist/exports/client.js","default":"./dist/exports/client.js"},"./providers":{"types":"./dist/exports/providers.d.ts","import":"./dist/exports/providers.js","default":"./dist/exports/providers.js"},"./components":{"types":"./dist/exports/components.d.ts","import":"./dist/exports/components.js","default":"./dist/exports/components.js"},"./views-client":{"types":"./dist/exports/views-client.d.ts","import":"./dist/exports/views-client.js","default":"./dist/exports/views-client.js"}},"license":"MIT","scripts":{"test":"vitest run","build":"pnpm run clean && pnpm run build:types && pnpm run build:swc && pnpm run build:fix-esm","clean":"rm -rf dist *.tsbuildinfo","build:swc":"swc ./src -d ./dist --config-file ../../.swcrc --strip-leading-paths --ignore \"**/__tests__/**\"","typecheck":"tsc -p tsconfig.json --noEmit && pnpm typecheck:tests","build:types":"tsc -p tsconfig.build.json --emitDeclarationOnly --outDir dist","build:fix-esm":"node ../../scripts/fix-dist-extensions.mjs dist && node ../../scripts/check-dist-esm.mjs dist","diagrams:build":"node docs/diagrams/build.cjs && node docs/diagrams/render-svg.cjs && node docs/diagrams/check.cjs","diagrams:check":"node docs/diagrams/verify.cjs","typecheck:tests":"tsc -p tsconfig.test.json --noEmit"},"version":"0.3.12","_npmUser":{"name":"vladsuciu","email":"vlad@purposeinplay.com"},"homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"_resolved":"/tmp/947c9a36e79b9b79d584bee3a8942f24/purposeinplay-payload-ai-translate-0.3.12.tgz","_integrity":"sha512-9GFIaZZaHtIVJ/xEEROAx2rUMB1MpjRva6SgKJo2DYCP4KkUSNkYYwomLIcXrjBlAlnyKYaHI2/ZoDx7E9slpA==","repository":{"url":"git+https://github.com/purposeinplay/payload-plugins.git","type":"git","directory":"packages/payload-ai-translate"},"_npmVersion":"10.9.8","description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","directories":{},"maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"vlad@purposeinplay.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ai":"^6.0.174","zod":"^4.4.3","next":"^16.3.5","react":"^19.0.0","vitest":"^4.1.11","payload":"^3.89.0","happy-dom":"^20.10.6","react-dom":"^19.0.0","typescript":"^5.6.3","@types/node":"^22.0.0","drizzle-orm":"^0.45.0","@types/react":"^19.0.0","@ai-sdk/google":"^3.0.67","@ai-sdk/openai":"^3.0.58","@payloadcms/ui":"^3.89.0","@payloadcms/next":"^3.89.0","@types/react-dom":"^19.2.3","@ai-sdk/anthropic":"^3.0.74","@payloadcms/db-postgres":"^3.89.0","@ai-sdk/openai-compatible":"^2.0.45"},"peerDependencies":{"ai":"^6.0.0","zod":"^3.25.76 || ^4.1.8","next":"^15.0.0 || ^16.0.0","react":"^18.0.0 || ^19.0.0","payload":"^3.0.0","react-dom":"^18.0.0 || ^19.0.0","drizzle-orm":"^0.45.0","@ai-sdk/google":"^3.0.0","@ai-sdk/openai":"^3.0.0","@payloadcms/ui":"^3.0.0","@payloadcms/next":"^3.0.0","@ai-sdk/anthropic":"^3.0.0","@ai-sdk/openai-compatible":"^2.0.0","@purposeinplay/payload-totp":">=0.5.1"},"peerDependenciesMeta":{"drizzle-orm":{"optional":true},"@ai-sdk/google":{"optional":true},"@ai-sdk/openai":{"optional":true},"@payloadcms/ui":{"optional":true},"@payloadcms/next":{"optional":true},"@ai-sdk/anthropic":{"optional":true},"@ai-sdk/openai-compatible":{"optional":true},"@purposeinplay/payload-totp":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/payload-ai-translate_0.3.12_1790161479552_0.40375657714344504"}}},"time":{"created":"2026-06-16T10:42:40.382Z","modified":"2026-09-23T11:04:39.901Z","0.1.0":"2026-06-16T10:42:40.799Z","0.1.1":"2026-06-17T14:37:31.837Z","0.1.2":"2026-06-17T15:20:40.110Z","0.1.3":"2026-06-17T15:25:50.170Z","0.1.4":"2026-06-19T13:32:45.875Z","0.1.5":"2026-06-26T13:51:17.069Z","0.1.6":"2026-07-01T07:28:29.498Z","0.1.7":"2026-07-02T06:21:32.275Z","0.2.0":"2026-07-07T15:27:48.417Z","0.2.1":"2026-07-08T12:34:00.712Z","0.2.2":"2026-07-09T14:34:41.693Z","0.2.3":"2026-07-16T07:53:29.005Z","0.2.4":"2026-07-16T14:05:20.268Z","0.2.5":"2026-07-17T10:45:33.101Z","0.2.6":"2026-07-22T07:20:45.269Z","0.2.7":"2026-07-24T09:38:54.545Z","0.2.8":"2026-07-27T13:55:50.557Z","0.2.9":"2026-07-28T10:05:26.589Z","0.2.10":"2026-07-29T08:08:52.196Z","0.2.11":"2026-07-31T10:08:21.301Z","0.2.12":"2026-08-04T06:37:51.399Z","0.3.0":"2026-08-11T10:54:34.103Z","0.3.2":"2026-08-20T12:59:26.222Z","0.3.3":"2026-08-20T15:53:15.178Z","0.3.4":"2026-09-02T10:51:46.009Z","0.3.6":"2026-09-04T07:48:25.213Z","0.3.7":"2026-09-04T10:17:40.412Z","0.3.8":"2026-09-04T12:29:06.084Z","0.3.9":"2026-09-10T12:01:14.081Z","0.3.10":"2026-09-11T10:27:35.147Z","0.3.11":"2026-09-17T13:29:56.081Z","0.3.12":"2026-09-23T11:04:39.701Z"},"bugs":{"url":"https://github.com/purposeinplay/payload-ai-translate/issues"},"license":"MIT","homepage":"https://github.com/purposeinplay/payload-ai-translate#readme","keywords":["payload","payloadcms","plugin","translation","i18n","ai","openai","anthropic","gemini"],"repository":{"url":"git+https://github.com/purposeinplay/payload-plugins.git","type":"git","directory":"packages/payload-ai-translate"},"description":"AI translation plugin for Payload CMS 3 — multi-provider (OpenAI, Anthropic, Gemini, custom), bulk translation, Lexical-aware, with an admin Translation Hub.","maintainers":[{"name":"rickywin","email":"richard.ispan@purposeinplay.com"},{"name":"ovidiupip","email":"ovidiu.grosu@purposeinplay.com"},{"name":"vladsuciu","email":"vlad@purposeinplay.com"},{"name":"miruna16","email":"miruna.badea@purposeinplay.com"},{"name":"adrians-pip","email":"adrian.ster@purposeinplay.com"},{"name":"alexpip","email":"alex.popa@purposeinplay.com"}],"readme":"# AI Translate Plugin\n\nAutomatic LLM translation of localized Payload CMS 3.x content. Translation can be triggered on save, on publish, manually via the admin UI, or programmatically via the Node.js API.\n\nThis is the reference doc — every config knob, type, endpoint, and provider. New to the plugin? Start with [INTEGRATION.md](./docs/INTEGRATION.md). Upgrading an existing install? Read [UPGRADING.md](./docs/UPGRADING.md) first. Running it in production? [OPERATIONS.md](./docs/OPERATIONS.md). Want to understand how it works under the hood? See [ARCHITECTURE.md](./docs/ARCHITECTURE.md) and the [lifecycle diagrams](./docs/diagrams/README.md) (GitHub-rendered Mermaid + the full Excalidraw system map). Looking for copy-pasteable solutions? See [USAGE.md](./docs/USAGE.md).\n\n---\n\n## Installation\n\n```bash\npnpm add @purposeinplay/payload-ai-translate\n```\n\nThe `providers` entrypoint hard-imports all four AI SDK adapters at module load. Install all of them as peer deps:\n\n```bash\npnpm add @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/google @ai-sdk/openai-compatible ai\n```\n\n---\n\n## Quick start\n\n```ts\n// payload.config.ts\nimport { buildConfig } from 'payload'\nimport { aiTranslatePlugin } from '@purposeinplay/payload-ai-translate'\nimport { createAnthropicProvider } from '@purposeinplay/payload-ai-translate/providers'\n\nexport default buildConfig({\n  localization: {\n    locales: ['en', 'de', 'es', 'fr'],\n    defaultLocale: 'en',\n    fallback: true,\n  },\n  // Keep aiTranslatePlugin LAST in this array: it appends the Translations tab\n  // by rewriting each tracked collection's `fields`, and a plugin after it that\n  // also rewrites `fields` can misplace or drop that tab silently.\n  plugins: [\n    aiTranslatePlugin({\n      collections: ['posts'],\n      sourceLocale: 'en',\n      targetLocales: ['de', 'es', 'fr'],\n      provider: createAnthropicProvider({\n        apiKey: process.env.ANTHROPIC_API_KEY!,\n      }),\n      costLimits: {\n        perCallCharLimit: 10_000,\n        perDocCharCeiling: 50_000,\n        bulkConfirmUsdThreshold: 1.0,\n      },\n    }),\n  ],\n})\n```\n\nThis wires:\n- A **Translations tab** inside every `posts` document — status per language, the Translate CTA, per-field detail, and the Review Drawer\n- A `translation-settings` global with the runtime kill switches\n- `POST /api/posts/ai-translate`, `/estimate`, `/cancel`, `/doc-status`, and the rest of the per-document endpoint set\n- A live progress stream at `GET /api/posts/ai-translate/progress`\n\n> **Plugin order matters.** Register `aiTranslatePlugin` **after** every field-injecting plugin (`seoPlugin`, form builder, …). The Translations tab wraps the surface's existing fields into a tab set at registration time, so fields injected later land *outside* the wrap.\n\nFor automation, the Translation Hub, audit-log integration, and cost tracking, see [INTEGRATION.md](./docs/INTEGRATION.md).\n\n---\n\n## Configuration reference\n\n### `AITranslatePluginConfig`\n\n| Field | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `collections` | `string[]` | No | `[]` | Collection slugs to enable translation on. |\n| `globals` | `string[]` | No | `[]` | Global slugs to enable translation on. |\n| `sourceLocale` | `string` | Yes | — | The locale to translate from. Must match a locale in `localization.locales`. |\n| `targetLocales` | `string[]` | Yes | — | Locales to translate into. `sourceLocale` is silently filtered if it appears here. |\n| `provider` | `TranslationProvider` | Yes | — | Default provider. See [Providers](#providers). |\n| `providers` | `Record<string, TranslationProvider>` | No | — | Optional named providers for runtime switching. See [Runtime provider switching](#runtime-provider-switching). |\n| `costLimits` | `CostLimits` | Yes | — | Hard limits that guard against runaway spend. |\n| `excludeFields` | `string[]` | No | `[]` | Field paths or globs to skip. E.g. `['slug', 'meta.*', '**.internalNote']`. |\n| `excludeUrlFields` | `boolean` | No | `true` | When `true`, appends `**.url` to `excludeFields` so URL strings never reach the LLM. |\n| `concurrency` | `Partial<ConcurrencyLimits>` | No | see below | Parallelism controls. |\n| `retry` | `Partial<RetryConfig>` | No | see below | Retry behavior on provider errors. |\n| `access` | `{ translate?: AccessFn; maxRequestsPerMinute?: number }` | No | `admin`/`editor` role, 60 req/min | Authorization for the whole `/ai-translate/*` namespace, plus a per-user rate limit on the two endpoints that call the provider. The engine overrides Payload's own access control, so this is the entire boundary — see [Access control](#access-control). |\n| `onEvent` | `(event: TranslationEvent) => void \\| Promise<void>` | No | — | Receive translation lifecycle events. |\n| `onAlert` | `(alert: TranslationAlert) => void \\| Promise<void>` | No | — | Receive operational alerts. |\n| `lexicalNodes` | `LexicalNodeRegistration[]` | No | `[]` | Register custom Lexical node types for extraction. |\n| `enabled` | `boolean` | No | `true` | Disable the plugin without removing it from config. |\n| `automation` | `AutomationConfig` | No | — | Hook-based automatic translation. See [Automation](#automation). |\n| `perFieldButton` | `boolean` | No | `false` | **Deprecated and ignored** — logs a warning at boot. Per-field re-translate lives in the Translations tab. |\n| `quality` | `QualityConfig` | No | — | Sampling, canary, and output validation. |\n| `preserveManualEdits` | `boolean` | No | `false` | Fingerprint every write (auto-registered `ai-translate-meta` collection) so hand-edited translations are detected and never overwritten (\"Protected\"). Also enables per-leaf unresolved tracking + the Review Drawer's retry bypass. |\n| `manualEditCollectionSlug` | `string` | No | `'ai-translate-meta'` | Override the sidecar slug used by `preserveManualEdits`. |\n| `providerOutage` | `{ threshold?: number; dedupeMs?: number }` | No | `{ threshold: 3, dedupeMs: 900000 }` | Emit one deduplicated `translation.provider-outage` alert after N consecutive transient provider failures; a success resets the streak. |\n| `excludeTechnicalFields` | `boolean` | No | `true` | Never send fields whose *name* reads technical (`*_href`, `*_url`, `*_key`, `icon`, `slug`, camelCase variants) or whose whole value is shaped like a URL / absolute path / asset key (`/terms`, `promo/hero.svg`). These used to burn tokens and come back as soft-skip noise. Set `false` for pre-2026-07 behavior. |\n| `syncBlockNames` | `boolean` | No | `true` | Mirror each block's `blockName` from the source locale into every locale. A `blockName`-only source edit fires a **structural sync** — no LLM call, no token spend — that propagates the name while leaving translations and manual edits untouched. Set `false` to let each locale keep its own. |\n| `adminRoles` | `string[]` | No | `['admin']` | Role names that count as \"admin\" for the plugin's field-level gates (`_aiTranslateOptOut`, `_aiTranslateAutoLocales`) and admin-only endpoints. Matched case-insensitively against a `roles` array **or** a singular `role` select. `[]` means everyone (not recommended). Independent of `access.translate`. |\n| `usageTracking` | `UsageTrackingConfig` | No | `{ enabled: false }` | Persist a row per translation job. See [`UsageTrackingConfig`](#usagetrackingconfig). |\n| `alertsCollectionSlug` | `string` | No | `'translation-alerts'` | Override the alerts collection slug. Registered alongside `usageTracking.enabled`. |\n| `persistJobs` | `boolean` | No | `false` | Mirror the in-memory progress store to an auto-registered `ai-translate-jobs` collection and route async work through Payload's job queue. Not a full work-queue — see [Persist async work](./docs/USAGE.md#persist-async-translation-work-across-restarts). |\n| `jobsCollectionSlug` | `string` | No | `'ai-translate-jobs'` | Override the sidecar slug used by `persistJobs`. |\n| `bulk` | `BulkTranslateConfig` | No | — | Enables the bulk-translate engine and the Translation Hub's fleet-wide runs. Presence of the key turns it on. See [`BulkTranslateConfig`](#bulktranslateconfig). |\n| `settings` | `TranslationSettingsConfig` | No | — | Override defaults for the auto-registered `translation-settings` global. See [`translation-settings`](#translation-settings-global). |\n\n### `CostLimits`\n\nThe first three fields are required.\n\n| Field | Type | Required | Default | Description |\n|---|---|---|---|---|\n| `perCallCharLimit` | `number` | Yes | — | Maximum characters in a single provider call. Requests over this throw `CostGuardError` with code `'PER_CALL_LIMIT'`. |\n| `perDocCharCeiling` | `number` | Yes | — | Maximum total characters extracted from one document. Document is aborted with a `'translation.cost-guard-abort'` alert. |\n| `bulkConfirmUsdThreshold` | `number` | Yes | — | USD threshold above which the admin UI requires explicit confirmation before starting bulk translation. |\n| `perCallItemLimit` | `number` | No | `250` | Maximum translation **units** per provider call, independent of the character cap. Some models' structured-output mode stalls when the response array grows past ~800–1000 entries — HTTP 200 returns fast, the body never finishes streaming. Short strings (nav labels, JSON keys) pack many units into a small character count, so the char cap doesn't catch it. Measured: a 250-item batch succeeded 100% of the time on the provider that motivated this; a 500-item batch on the same provider timed out roughly 3 attempts in 4. Raise it only for larger-context models you've verified. |\n| `providerCallTimeoutMs` | `number` | No | `120000` | Hard plugin-level deadline for one provider call. A backstop for the same failure mode: when the provider's own timeout doesn't fire, the plugin used to `await` forever, freezing the run's heartbeat and stranding the job as `running`. The call is now raced against this deadline and throws a `transient.provider` timeout on expiry. Set it **longer** than your provider's own timeout so it only fires when that fails. |\n\n### `ConcurrencyLimits`\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `perDocument` | `number` | `3` | Maximum target locales translated in parallel for a single doc. |\n| `perProvider` | `number` | `5` | Requests-per-minute **ceiling** (token-bucket) across all in-flight translations. The limiter starts here, halves on every rate-limit / edge refusal (floor 1 RPM) and recovers towards it on sustained success — see [Rate limiting](#rate-limiting--perprovider-is-a-ceiling-not-a-guarantee). |\n\n### `RetryConfig`\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `attempts` | `number` | `2` | Retry attempts after the initial failure. `2` = up to 3 total attempts. |\n| `backoffMs` | `number` | `1000` | Base delay in ms. Doubles per attempt. |\n\n### `AutomationConfig`\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `trigger` | `'on-change' \\| 'on-publish'` | `'on-change'` | When to fire automatic translation. Use `'on-publish'` for collections with drafts. |\n| `mode` | `'async' \\| 'inline'` | `'async'` | `async` queues with coalescing; `inline` fire-and-forgets. Save returns immediately in both. |\n| `targetPolicy` | `TargetPolicy` | `'mirror'` | `'mirror'` overwrites existing translations; `'preserve'` skips fields with non-empty target content. |\n| `diffOnly` | `boolean` | `true` | Only retranslate fields whose content hash changed since the previous version. |\n| `coalescingWindowMs` | `number` | `12000` | `async` mode only — saves within this window collapse into one job. |\n\n### `QualityConfig`\n\n| Field | Type | Description |\n|---|---|---|\n| `validation` | `ValidationConfig` | Tune length bounds and refusal/injection patterns. |\n| `sampling` | `SamplingConfig` | Sample a percentage of translations for review. |\n| `canaryLocale` | `string` | Translate this locale on every job but don't write the result. Emitted via `onEvent` with `canary: true`. |\n\n### `ValidationConfig`\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `minLengthRatio` | `number` | `0.3` | Minimum output/input length ratio. CJK locales (ja/ko/zh) typically need `0.15`. |\n| `maxLengthRatio` | `number` | `3.0` | Maximum output/input length ratio. |\n| `minSourceLength` | `number` | `10` | Source strings shorter than this bypass length validation. |\n| `extraRefusalPatterns` | `RegExp[]` | `[]` | Additional patterns to detect LLM refusals in output. |\n| `extraInjectionPatterns` | `RegExp[]` | `[]` | Additional patterns to detect prompt injection in output. |\n\n### `SamplingConfig`\n\n| Field | Type | Description |\n|---|---|---|\n| `rate` | `number` | `0`–`1`. `0.1` samples 10% of translations. |\n| `onSample` | `(sample: TranslationSample) => void \\| Promise<void>` | Callback per sampled translation. |\n\n### `UsageTrackingConfig`\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `enabled` | `boolean` | `false` | Master switch. When `true`, the plugin auto-registers a collection that persists one row per translation job. |\n| `collectionSlug` | `string` | `'translation-usage'` | Override the auto-registered collection slug. |\n| `access` | `{ read?: Access }` | admin-only | Override the default admin-gated read access. |\n\nWhen enabled, run `pnpm payload migrate:create` to generate the schema migration. Commit and deploy. See the [Auto-registered surfaces](#auto-registered-surfaces) section for the full schema.\n\n### `BulkTranslateConfig`\n\nPassing a `bulk` block turns on the bulk-translate engine: fleet-wide runs from the Translation Hub, backed by Payload's job queue. Presence of the key is the switch — `enabled: false` opts out at the runtime layer without removing the config.\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `enabled` | `boolean` | `true` when `bulk` is present | Runtime opt-out. The real cost guards are `dailyUsdCap` + `requireTotp`, not this flag. |\n| `excludeCollections` | `string[]` | `[]` | Slugs to keep out of bulk runs even though they're in `collections`. Recommended for `users` where bios carry personal content. |\n| `dailyUsdCap` | `number` | `50` | Ceiling on aggregate **estimated** USD per **UTC day**. Charged for bulk runs at enqueue/retry and, inside the engine, for every manual (`per-doc-retry`) and automation (`coalesce`) run — one budget for all paths. Read it as an admission check, not a spend meter: the estimate is charged when a run is *attempted*, before the provider is called and before per-locale hash-skip drops unchanged fields, and it is never reconciled against what was actually spent or refunded when a run fails. A re-translate of an up-to-date document therefore charges its full estimate and spends ~$0. Two enqueue-side undercounts in the other direction: the batch estimator stops enumerating at 500 documents per collection, and `mode: 'canary'` estimates $0 (its units are charged individually at the engine instead). A run with nothing billable — a structural-only sync, or a provider whose estimator returns no USD figure — is not charged and not refused. `BULK_TRANSLATE_DAILY_USD_CAP` overrides the option when set to a valid number. `0` is a kill switch: every run with a non-zero estimate is refused. Programmatic callers of `translateDocument` / `translateGlobal` get a `DailyCapError` (`code: 'DAILY_CAP'`) on refusal — narrow it with `isDailyCapError` and map it with `dailyCapRefusalHttp`, both exported from the package root. |\n| `requireTotp` | `boolean` | `false` | Require a TOTP code on the enqueue endpoint. Friction, not the security boundary — the daily cap is the enforcement. Set it explicitly; there is no auto-detection. Needs `@purposeinplay/payload-totp` >= 0.5.1 installed (declared as an optional peer). With the flag on but no TOTP plugin resolvable, **enqueue proceeds without a code** (fail-open, Decision #13 v2) while batch revert refuses — the plugin warns about exactly that at boot. |\n| `canaryDefaultSize` | `number` | `10` | Sample size for `mode: 'canary'` runs without an explicit limit. Random-stratified across configured collections. |\n| `onBatchComplete` | `(e: BulkTranslateBatchEvent) => void \\| Promise<void>` | — | Fires on every terminal batch transition. Best-effort: exceptions are caught and logged, never block completion. |\n| `onBatchFailed` | `(e: BulkTranslateBatchEvent) => void \\| Promise<void>` | — | Fires only when a batch ends `failed` (zero successes), so you can page differently. |\n| `onCapExceeded` | `(info) => void \\| Promise<void>` | — | Fires when the daily cap rejects a request **because the budget is gone** — never for a storage outage or a missing estimate, which are not budget decisions and would page on-call with numbers that aren't real — `{ todaySpentUsd, capUsd, rejectedEstimateUsd, requestPath }` where `requestPath` is `'bulk-endpoint' \\| 'per-doc-retry' \\| 'coalesce'`. Page on this before the cap silently locks out a day's work. |\n| `unitsCollectionSlug` | `string` | `'bulk-translate-units'` | Slug override for the units collection. |\n| `janitorIntervalMs` | `number` | `300000` | Interval between janitor sweeps that reclaim stuck `running` units. `0` disables the periodic sweep (the boot sweep still runs). The janitor only resets rows older than `max(10min, 2 × p99 LLM latency)`, so slow translations are never interrupted. **Do not set below `30000`** — the sweep walks the units table. |\n| `janitorProcess` | `'auto' \\| 'always'` | `'auto'` | Which processes run the *periodic* sweep. `'auto'` skips the interval only in a process we can prove doesn't run jobs (`jobs.autoRun` is an explicit empty array **and** this isn't a `payload jobs:run` worker) — so a web server stops sweeping once jobs move to a dedicated worker. Any ambiguous case keeps the interval; reclamation is never silently disabled. `'always'` is the escape hatch. |\n\n**The janitor must have a driver.** Payload's queue has no job lease and no\nreaper, so this plugin's janitor is the only reclamation there is — and its\ndefault drivers (a boot sweep plus a `setInterval`) do not reach a dedicated\n`payload jobs:run` worker (one-shot CLI; the interval is `unref()`'d) or a\nCloudflare Worker (`setInterval` does not survive a request-scoped isolate).\nThe plugin awaits its boot sweep in a `jobs:run` process, and exports two\nentry points for the rest:\n\n```ts\nimport { queueJanitor, runJanitorOnce } from '@purposeinplay/payload-ai-translate'\n\nawait runJanitorOnce(payload)  // awaited sweep — worker loops, scheduled()\nawait queueJanitor(payload)    // enqueue task `bulk-translate-janitor` instead\n```\n\nBoth are idempotent and cheap when nothing is stale. The task carries no\nPayload `schedule` on purpose: declaring one turns `jobs.scheduling` on for\nthe host and needs a `payload_jobs_stats` table not every consumer has. See\n[USAGE — Make sure the bulk janitor actually runs](./docs/USAGE.md#make-sure-the-bulk-janitor-actually-runs).\n\nRegistering `bulk` also:\n\n- auto-registers four sidecar collections — `bulk-translate-batches`, `bulk-translate-units`, `translation-daily-spend`, `translation-rate-limits`;\n- registers three Payload tasks — `bulk-translate-coordinator`, `bulk-translate-doc`, `bulk-translate-janitor`;\n- mounts the `/api/translation-hub/bulk-translate/*` endpoints;\n- wraps your `onInit` to run `ensureBulkTranslateSchema` (idempotent `CREATE UNIQUE INDEX IF NOT EXISTS` backing the dedup invariant) and `migrateBatchStatusVocabulary`.\n\n### Bulk throughput and per-document serialization\n\n**Enqueue ordering is locale-major.** Bulk enumerates one job per `(collection, documentId, locale)`. Within each enumeration page the coordinator emits them as\n\n```\nfor (locale of scope.locales)\n  for (doc of page)          →   (l1,d1) (l1,d2) … (l1,dN) (l2,d1) …\n```\n\nnot document-major (`(d1,l1) (d1,l2) …`). This is deliberate and load-bearing.\n\nPayload's runner selects the first `limit` eligible jobs by `createdAt` and runs them together, and the plugin admits at most **one locale per document** at a time (below). Under document-major ordering a window of 100 jobs held only `floor(100 / locales)` distinct documents — 7 for a 13-locale batch — so 7 units ran and ~93 deferred to the FIFO tail in the same order, tick after tick. A measured 1,157-unit run took 19 h 45 m. Locale-major ordering puts `min(limit, page size)` **distinct** documents in that same window, restoring the throughput of a single-locale batch: ~13× for a 13-locale run.\n\nThe page is the ordering unit, not the batch — enumeration trampolines per page, and the default page size (100) already exceeds a typical runner window. Nothing else changes: `preRunSnapshot` is captured by the worker per locale, and revert restores each unit into its own `snapshotLocale`, so both are independent of enqueue order.\n\n**Per-document serialization.** Payload's runner executes a tick's jobs with `Promise.all`, so sibling locales of one document would otherwise run at once, and their writes must be serialized (a per-locale `payload.update()` rewrites the document's whole `<table>_locales` row set). Three guards, in order of strength:\n\n1. **The per-document unit claim** (Postgres). A short transaction takes `SELECT … FOR UPDATE` over the document's non-terminal unit rows and admits exactly one locale; the rest defer and re-queue. This is a real lock — an earlier autocommit `NOT EXISTS` variant was write-skew-prone under READ COMMITTED and did leak in production. The transaction spans two statements and commits before any translation, so it does not hold a pool connection.\n2. **Payload job concurrency** (every adapter). The worker task declares `concurrency: { key, exclusive: true }` keyed on the document, but **only when the host sets `jobs.enableConcurrencyControl: true`** — declaring it while that flag is off makes Payload throw at boot. Turning the flag on adds an indexed field to the jobs collection, i.e. a migration on most adapters, so it's the host's call:\n\n   ```ts\n   // payload.config.ts\n   jobs: {\n     enableConcurrencyControl: true,   // opt in — adds an indexed field (migration)\n     tasks: [],\n   }\n   ```\n\n3. **The in-process document write lock**, which covers sibling units picked up by one jobs-runner invocation.\n\nOn `@payloadcms/db-d1-sqlite` the claim degrades to a single conditional `NOT EXISTS` UPDATE. That is **best-effort, not a lock**: D1 has no advisory locks, no `SELECT … FOR UPDATE` and no interactive transactions, so it narrows the race window without closing it. On D1, guard 2 is the real cross-process guard — enable `enableConcurrencyControl`.\n\n> **D1 consumers: keep the jobs-runner `limit` at or below ~80.**\n>\n> Locale-major ordering means a window of 100 jobs holds 100 *distinct* documents, therefore 100 distinct concurrency keys. Payload's job-selection query excludes running keys with a `NOT IN (…)` list of bound parameters, and D1 caps a statement at 100 bound parameters — so a full window of distinct documents overflows the cap and the selection query fails. Either run with `limit` ≤ ~80 (`payload jobs:run --limit 80`, or `jobs.autoRun[].limit`), or leave `enableConcurrencyControl` off on D1 and rely on the plugin claim plus the in-process write lock, accepting that the cross-isolate case stays best-effort. Postgres hosts are unaffected.\n\n---\n\n## Automation\n\nAutomation wires translation into Payload's `afterChange` hook so content is translated on every qualifying save without manual action.\n\n### Triggers\n\n- **`on-change`** — fires after every save. If the collection has drafts, every autosave fires translation. The plugin emits a startup warning when this combination is detected.\n- **`on-publish`** — fires only when `_status` transitions to `'published'`. Requires `versions.drafts: true`.\n\n### Modes\n\n| | `async` (default) | `inline` |\n|---|---|---|\n| Save response time | Not blocked | Not blocked |\n| Coalescing | Yes (12s window default) | No |\n| Use case | High-frequency edits, autosaves | One-translation-per-publish, low autosave noise |\n| Error visibility | `onEvent` / `onAlert` | `onEvent` / `onAlert` (errors during inline never reach the save response — fire-and-forget) |\n\n### `diffOnly`\n\nWhen `true` (default), the hook passes `previousDoc` to `translateDocument`. Fields whose content hash matches the previous version are not retranslated. The diff is per field path, including paths inside arrays/blocks, so a typo fix in one block doesn't retranslate an entire page.\n\nThe first publish of a new doc has identical `previousDoc`/`doc` (autosave already mirrored) — the plugin detects this and force-translates everything. You don't need to handle the empty-diff edge case.\n\n### Target policy\n\n- **`'mirror'`** (default) — overwrite whatever's in the target locale. Source publishes are authoritative.\n- **`'preserve'`** — skip fields whose target value is non-empty. Useful when editors hand-edit translations and you want manual edits left alone.\n\n---\n\n## Programmatic API\n\nAll exports are from `@purposeinplay/payload-ai-translate`.\n\n### `translateDocument(payload, options)`\n\nReads the source document, extracts translatable content, fans out to the LLM per locale, and writes results back.\n\n```ts\nimport { translateDocument } from '@purposeinplay/payload-ai-translate'\n\nconst result = await translateDocument(payload, {\n  collection: 'posts',\n  id: 'abc123',\n})\n```\n\n**`TranslateDocumentOptions`**\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `collection` | `string` | Yes | Collection slug. |\n| `id` | `string \\| number` | Yes | Document ID. |\n| `targetLocales` | `string[]` | No | Override plugin config. |\n| `targetPolicy` | `TargetPolicy` | No | Override `automation.targetPolicy` or default `'mirror'`. |\n| `fields` | `string[]` | No | Restrict translation to specific paths. |\n| `previousDoc` | `Record<string, unknown>` | No | When provided, only fields that differ are translated. |\n| `scope` | `{ topFields: string[] }` | No | Restrict the run to specific localized top-level field groups. Validated against the schema — unknown names are an error. Multi-group docs auto-chunk per group server-side either way. |\n| `force` | `boolean` | No | Bypass the fingerprint skip AND the manual-edit protect guard — every field re-translates and overwrites, then re-baselines. |\n| `signal` | `AbortSignal` | No | Abort in-flight translation. |\n| `writeMode` | `'full' \\| 'minimal'` | No (`'full'`) | `'full'` writes all top-level localized fields together (passes Payload's required-field validation on a fresh target row); `'minimal'` writes only translated fields (caller accepts validation risk). |\n| `jobId` | `string` | No | Reuse an existing progress-store job (used internally by hooks). |\n| `req` | `PayloadRequest` | No | Originating request — used for audit-log attribution. The plugin always uses a fresh transactionID per locale write regardless. |\n| `draft` | `boolean` | No (`true`) | Read latest draft when versioning is enabled. |\n\n**`TranslateDocumentResult`**\n\n```ts\n{\n  jobId?: string\n  documentId: string | number\n  collection: string\n  sourceLocale: string\n  succeeded: FieldLocaleResult[]\n  failed: FieldLocaleResult[]\n  usage: TranslationUsage\n}\n```\n\n`FieldLocaleResult.status`: `'success' | 'failed' | 'skipped'`. **`'skipped'`** means verbatim-echo (the LLM returned the source unchanged — typical for brand names, code identifiers, URLs); the target field is left untouched.\n\nThrows when:\n- Plugin not configured\n- Document not found\n- Collection not in Payload config\n- `perDocCharCeiling` exceeded\n\n### `translateGlobal(payload, options)`\n\nGlobals counterpart of `translateDocument`. Same shape minus `id`.\n\n```ts\nimport { translateGlobal } from '@purposeinplay/payload-ai-translate'\n\nawait translateGlobal(payload, {\n  global: 'site-config',\n  targetLocales: ['de', 'fr'],\n})\n```\n\n**`TranslateGlobalOptions`**\n\n| Field | Type | Required | Description |\n|---|---|---|---|\n| `global` | `string` | Yes | Global slug. |\n| `targetLocales` | `string[]` | No | Override plugin config. |\n| `targetPolicy` | `TargetPolicy` | No | Override default `'mirror'`. |\n| `fields` | `string[]` | No | Restrict to paths. |\n| `previousDoc` | `Record<string, unknown>` | No | Diff-only equivalent for globals. |\n| `signal` | `AbortSignal` | No | Abort. |\n| `writeMode` | `'full' \\| 'minimal'` | No (`'full'`) | See `translateDocument`. |\n| `jobId` | `string` | No | Reuse a progress-store job. |\n| `req` | `PayloadRequest` | No | For audit-log attribution. |\n\n### Exported utilities\n\n```ts\nimport { isFieldEmpty, diffFields } from '@purposeinplay/payload-ai-translate'\n\nisFieldEmpty('', 'text')                       // true\nisFieldEmpty('Hi', 'text')                     // false\nisFieldEmpty([], 'array')                      // true\nisFieldEmpty(null, 'richText')                 // true\n\ndiffFields(prevDoc, currDoc, ['title', 'body']) // ['title']  (paths that changed)\n```\n\n---\n\n## Providers\n\nAll built-in providers live at `@purposeinplay/payload-ai-translate/providers`. They share an internal AI-SDK-based adapter, so option shapes are uniform: `apiKey` (required), `model` (with provider-specific default), `temperature`, `maxTokens`, `baseURL`.\n\n**Response-container repair.** Structured output is only schema-enforced server-side on some endpoints; on OpenAI-compatible endpoints (OpenRouter included) the shape is merely *prompted*, and models drift. Two container deviations each used to discard a whole batch of perfectly good translations and leave the locale on its source text: a bare top-level array with no `items` wrapper, and the exactly-correct object wrapped in a markdown code fence.\n\nThe adapter now repairs the **container** — never the content — through the AI SDK's own repair hook, so a repaired call stays on the normal success path with real usage and telemetry. Truncated JSON, prose, and wrong-shaped payloads still fail with unchanged diagnostics. A repaired response is marked `repaired` on `TranslateResponse` and logged as `translation.response.container-repaired`, so a model drifting out of shape is visible rather than a silent success.\n\n### Anthropic\n\n```ts\nimport { createAnthropicProvider } from '@purposeinplay/payload-ai-translate/providers'\n\ncreateAnthropicProvider({\n  apiKey: process.env.ANTHROPIC_API_KEY!,\n  model: 'claude-sonnet-4-6',  // default\n  temperature: 0.3,            // default\n  maxTokens: 4096,             // default\n})\n```\n\nCost estimates available for `claude-opus-4-6`, `claude-sonnet-4-6`, `claude-haiku-4-5`.\n\n### OpenAI\n\n```ts\nimport { createOpenAIProvider } from '@purposeinplay/payload-ai-translate/providers'\n\ncreateOpenAIProvider({\n  apiKey: process.env.OPENAI_API_KEY!,\n  model: 'gpt-4o',  // default\n  temperature: 0.3,\n  baseURL: undefined,  // override for Azure OpenAI\n})\n```\n\nCost estimates available for `gpt-4o`, `gpt-4o-mini`, `gpt-4.1`, `gpt-4.1-mini`, `gpt-4.1-nano`.\n\n### Google Gemini\n\n```ts\nimport { createGeminiProvider } from '@purposeinplay/payload-ai-translate/providers'\n\ncreateGeminiProvider({\n  apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY!,\n  model: 'gemini-2.5-flash',  // default\n  temperature: 0.3,\n})\n```\n\nCost estimates available for `gemini-2.5-pro`, `gemini-2.5-flash`, `gemini-2.0-flash`.\n\n### Custom (OpenAI-compatible API)\n\nFor Grok, Kimi, Together, self-hosted, or any provider that implements the OpenAI chat completions API:\n\n```ts\nimport { createCustomProvider } from '@purposeinplay/payload-ai-translate/providers'\n\ncreateCustomProvider({\n  apiKey: process.env.XAI_API_KEY!,\n  baseURL: 'https://api.x.ai/v1',\n  model: 'grok-3-mini',\n  pricing: { input: 0.3 / 1_000_000, output: 0.5 / 1_000_000 },  // optional\n})\n```\n\nWithout `pricing`, `estimatedCostUsd` is `undefined` (not an error) — the plugin still translates. Per-document, automation and programmatic runs proceed with a logged warning and no daily-cap charge. Bulk **enqueue** is the exception: it refuses with `cost_unavailable` rather than start a whole batch at an unknown cost.\n\n### Mock (for testing/dev)\n\n```ts\nimport { createMockProvider } from '@purposeinplay/payload-ai-translate/providers'\n\ncreateMockProvider()\n```\n\nPrepends `[{locale}]` to each input string. No network calls, no costs, deterministic. Use in CI and local dev to exercise wiring without spending tokens.\n\n### Runtime provider switching\n\nWhen you pass a `providers` map, the plugin auto-registers a `translation-settings` global so admins can switch providers without redeploying:\n\n```ts\naiTranslatePlugin({\n  // …\n  provider: createMockProvider(),  // fallback when no admin choice exists\n  providers: {\n    'anthropic-sonnet': createAnthropicProvider({ apiKey, model: 'claude-sonnet-4-6' }),\n    'anthropic-haiku': createAnthropicProvider({ apiKey, model: 'claude-haiku-4-5' }),\n    'openai-mini': createOpenAIProvider({ apiKey: oaKey, model: 'gpt-4o-mini' }),\n  },\n})\n```\n\nEach map key becomes an option in the admin's \"Active provider\" dropdown. The default `provider` is always available as a fallback.\n\n### Implementing your own provider\n\n```ts\nimport type { TranslationProvider } from '@purposeinplay/payload-ai-translate'\n\nconst myProvider: TranslationProvider = {\n  async translate(request) {\n    // request.items: text units to translate\n    // request.sourceLocale, request.targetLocale, request.context\n    // return: { items, usage, model, latencyMs }\n  },\n  // estimate is optional — without it, cost previews are unavailable\n  async estimate(request) {\n    return { inputTokens: 0, estimatedCostUsd: 0 }\n  },\n}\n```\n\nThe `items` array in the response must preserve the same `id` values as the request — the plugin matches translated text back to field positions by id.\n\n---\n\n## Auto-registered surfaces\n\nWhat the plugin adds to your Payload config, and what turns each one on:\n\n| Surface | Kind | Registered when | Purpose |\n|---|---|---|---|\n| `translation-settings` | global | `targetLocales` non-empty (unless `settings.enabled: false`) | Runtime control panel — kill switches, per-surface overrides, active provider. |\n| `translation-usage` | collection | `usageTracking.enabled: true` | One row per run: tokens, cost, per-locale outcomes, the field receipt. |\n| `translation-alerts` | collection | `usageTracking.enabled: true` | Cost-guard aborts, persistent failures, provider outages — so the Hub can show them in-app. |\n| `ai-translate-meta` | collection | `preserveManualEdits: true` | Per-`(collection, doc, locale, field)` fingerprints. `lastWrittenHash` = the value the plugin last wrote (backs \"Protected\"); `lastSourceHash` = the **translatable text** of the source it translated (backs \"Out of date\" and the hash-skip) — see [Hash semantics](#hash-semantics-and-the-source-baseline). |\n| `ai-translate-unresolved` | collection | `preserveManualEdits: true` | Per-leaf problem book — the flag → retry/acknowledge → clear loop behind the Review Drawer. |\n| `ai-translate-jobs` | collection | `persistJobs: true` | Mirrors the in-memory progress store so in-flight runs survive a restart *visibly*. |\n| `bulk-translate-batches` | collection | `bulk` present | One row per bulk run. |\n| `bulk-translate-units` | collection | `bulk` present | One row per `(collection, document, locale)` work item. |\n| `translation-daily-spend` | collection | `bulk` present | UTC-day spend counter backing `dailyUsdCap`. |\n| `translation-rate-limits` | collection | `bulk` present | A DB-backed token bucket, **registered but not consulted**. The live per-provider RPM limit is an in-process limiter built from `concurrency.perProvider`; `acquireToken` and `getBucketStatus` are exported and called from nowhere. Editing rows in this collection, or setting the two `TRANSLATION_RATE_LIMIT_*` variables, changes nothing about throughput today. Kept registered because dropping a collection is a migration for every consumer — the decision to wire it up or remove it is open. |\n\nEvery one of these is a real Payload collection, so **each needs a migration**. Only the bulk engine's own index/vocabulary bootstrap self-heals at boot.\n\nThe plugin also injects fields into every tracked collection and global: `_aiTranslateTabRouter` and `_aiTranslateReviewPanel` (UI-only, no storage), plus `_aiTranslateOptOut` (checkbox) and `_aiTranslateAutoLocales` (select, hasMany) which **do** persist — those two are admin-editable and read-only for everyone else, gated by `adminRoles`.\n\n### `translation-usage` (collection)\n\nRegistered when `usageTracking.enabled: true`.\n\n| Field | Type | Description |\n|---|---|---|\n| `kind` | `'collection' \\| 'global'` | What was translated. |\n| `jobId` | `string` | Matches the SSE jobId. |\n| `slug` | `string` | Collection or global slug. |\n| `documentId` | `string \\| null` | Null for globals. |\n| `status` | `'succeeded' \\| 'failed' \\| 'aborted'` | Job-level outcome. Skipped fields don't make a job fail; `aborted` = the cost guard stopped the run before writing anything (a safety stop, not a failure). |\n| `sourceLocale` | `string` | |\n| `succeededCount` | `number` | Per-locale successes. |\n| `failedCount` | `number` | Per-locale real failures (excludes skipped). |\n| `inputTokens` / `outputTokens` | `number` | Provider-reported. |\n| `estimatedCostUsd` | `number \\| null` | Null for providers without pricing. |\n| `model` | `string` | Provider model id. |\n| `durationMs` | `number` | Wall-clock total. |\n| `error` | `string \\| null` | Short error text on failure. |\n| `targetLocales` | `array` | Per-locale outcome rows: `locale`, `status`, `error`, `errorCode`, `failedFields[]`, `hashRecordPartial`. |\n| `fieldsTranslated` / `fieldsHashSkipped` / `fieldsPreserved` / `fieldsSoftSkipped` / `fieldsNonTranslatable` | `number` | The run receipt breakdown — what actually happened per field. |\n| `softSkippedFields` | `array` | Per-field skip entries: `path`, `locale`, `reasonCode`, `sourceValue`, `acknowledged`, `acknowledgedNote`, `acknowledgedBy`. Feeds the Review Drawer. |\n| `preservedFields` | `array` | Fields the manual-edit guard refused to overwrite (`path`, `locale`). |\n| `triggeredByUserId` / `triggeredByEmail` | `string` | Who caused the run — the \"By\" column everywhere. |\n| `createdAt` / `updatedAt` | `Date` | |\n\nReads are admin-gated by default. Override with `usageTracking.access.read`.\n\n**Migration**: run `pnpm payload migrate:create` after first enabling. The plugin doesn't ship migrations for its Payload-registered collections — your schema management owns them.\n\n> **Upgrading?** Releases regularly ADD columns to `translation-usage` (e.g. the\n> per-field receipt counts, `softSkippedFields.acknowledged*`, `triggeredBy*`,\n> the `aborted` status) and register new sidecar collections\n> (`ai-translate-meta`, `ai-translate-unresolved`, `translation-alerts`,\n> `ai-translate-jobs`, bulk batches/units). After every plugin upgrade, run\n> `pnpm payload migrate:create` and review the generated migration before\n> deploying — the release notes call out schema-affecting versions. (The bulk\n> job-queue tables self-migrate idempotently at boot; the Payload collections\n> above do not.)\n\n> **`select` fields need a CONDITIONAL migration.** `migrate:create` reads your\n> migration *snapshot*, not the live database, and for a Payload `select` the\n> two routinely disagree: how a `select` is stored changed across Payload and\n> plugin versions, so an installation created before 0.3.4 has a real\n> `enum_…` type while a newer one has a plain `varchar` that already accepts\n> any string. Both shapes are in production. When a release adds an option to\n> an existing `select` — `bulk_translate_units.failure_code` gained\n> `permanent.write` and `transient.storage` in 0.3.9 — the generated\n> `ALTER TYPE \"public\".\"enum_bulk_translate_units_failure_code\" ADD VALUE …`\n> fails at deploy with `type \"…\" does not exist` on any host whose column is a\n> varchar. Check the live schema first (`\\d+ bulk_translate_units`), then wrap\n> the statement so it is correct in both shapes and idempotent on re-run:\n>\n> ```ts\n> await db.execute(sql`\n>   DO $$\n>   BEGIN\n>     IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'enum_bulk_translate_units_failure_code') THEN\n>       ALTER TYPE \"public\".\"enum_bulk_translate_units_failure_code\" ADD VALUE IF NOT EXISTS 'permanent.write';\n>       ALTER TYPE \"public\".\"enum_bulk_translate_units_failure_code\" ADD VALUE IF NOT EXISTS 'transient.storage';\n>     END IF;\n>   END $$;\n> `);\n> ```\n>\n> Leave `down` empty — PostgreSQL cannot remove an enum value.\n\n### `translation-settings` (global)\n\nRegistered whenever `targetLocales` is non-empty — **not** only when the `providers` map is passed. Pass `settings: { enabled: false }` to suppress it.\n\nThis global is the runtime control panel: every value is read on each job, so admin changes take effect on the **next** translation, never mid-job.\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `activeProvider` | select | — | Options come from the `providers` map keys. Only meaningful when that map is configured; otherwise the config's `provider` always runs. |\n| `enabledTargetLocales` | select (hasMany) | all configured | Which of `targetLocales` actually fan out. |\n| `globalAutoTranslateEnabled` | checkbox | `true` | 🛑 **Kill switch — automation.** Unchecked, the `afterChange` hook does nothing on every save. Manual and bulk are unaffected. |\n| `globalManualTranslateEnabled` | checkbox | `true` | 🛑 **Kill switch — manual translate.** Unchecked, the Translate dialog hides and the endpoint returns 403. Automation and bulk are unaffected. |\n| `globalBulkTranslateEnabled` | checkbox | `true` | 🛑 **Kill switch — new bulk runs.** Unchecked, enqueue is rejected and the Hub's trigger renders disabled. **In-flight runs continue** — this does not cancel running work. |\n| `perCollection[]` | array | `[]` | Per-surface overrides. A missing row inherits the site-wide values above. |\n\nEach `perCollection` row carries:\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `slug` | select | — | The collection or global this row configures. |\n| `enabled` | checkbox | `true` | Kill switch for this surface — disables automation **and** manual translate. |\n| `autoOnPublish` | checkbox | `true` | Automation only. Uncheck to make this surface manual-only. No effect when `enabled` is off. |\n| `targetLocalesOverride` | select (hasMany) | `[]` = inherit | **Empty means inherit**, not \"none\". A locale must be enabled site-wide *and* here to fan out. Clearing the list does not opt the surface out — uncheck `enabled` for that. |\n| `translateSlug` | checkbox | `false` | Include the `slug` field in runs for this surface. Requires `localized: true` on the slug field, otherwise it's a no-op. Applies to automation *and* manual. |\n| `excludedFieldPaths` | text (hasMany) | `[]` | Fields excluded for this surface, rendered as a checkbox list driven by the row's `slug`. Applies to automation *and* manual — unlike the two flags above. Stale paths (after a field rename) are harmless: the filter is a set-membership check. |\n\nThe three kill switches compose *inside* each other rather than overriding: per-surface config still applies within a global switch that's on, and flipping a global switch back on resumes whatever per-surface config was already in place.\n\n---\n\n## REST endpoints\n\nAll endpoints are auto-registered on every configured collection and global at `/api/<slug>`.\n\n### `POST /ai-translate`\n\nTranslates the doc (or global). Request body fields are all optional; defaults come from plugin config.\n\n```json\n{\n  \"id\": \"doc-id\",                       // collections only — required for collections\n  \"targetLocales\": [\"fr\", \"de\"],         // optional\n  \"fields\": [\"title\", \"body\"],           // optional\n  \"writeMode\": \"full\",                   // optional ('full' | 'minimal')\n  \"async\": true,                         // optional — enqueue and return { jobId } immediately; poll doc-status/progress\n  \"force\": false,                        // optional — bypass skip + protect guards (overwrites hand-edits)\n  \"scope\": { \"topFields\": [\"hero\"] },  // optional — translate only these top-level groups (validated)\n  \"confirmCost\": true                    // optional — acknowledge a 402 cost-confirmation response and run anyway\n}\n```\n\nUse `async: true` behind proxies/load balancers — the synchronous mode can outlive\na gateway timeout on large documents. The admin UI always uses async + polling.\n\nResponse:\n\n```json\n{\n  \"jobId\": \"j_abc123\",\n  \"documentId\": \"doc-id\",\n  \"collection\": \"posts\",\n  \"sourceLocale\": \"en\",\n  \"succeeded\": [\n    { \"fieldPath\": \"title\", \"locale\": \"fr\", \"status\": \"success\", \"characterCount\": 42, \"durationMs\": 310 }\n  ],\n  \"failed\": [],\n  \"usage\": { \"inputTokens\": 120, \"outputTokens\": 135, \"estimatedCostUsd\": 0.00034, \"model\": \"claude-sonnet-4-6\" }\n}\n```\n\n### `POST /ai-translate/estimate`\n\nToken + cost preview without making a translation call. Same body as `/ai-translate`.\n\n```json\n{\n  \"inputTokens\": 120,\n  \"estimatedCostUsd\": 0.00034,\n  \"billableCharacters\": 480,\n  \"skippedCharacters\": 0\n}\n```\n\n`billableCharacters` / `skippedCharacters` lets you see how much will actually be translated vs. how much is excluded (URLs, exact-match exclude paths, empty fields).\n\n### `POST /ai-translate/cancel`\n\nRequests cancellation of the document's running job (`{ \"id\": \"doc-id\" }` for collections). Honored at the next per-group chunk boundary — languages and groups already written stay saved; the job ends as `cancelled` with its per-group breakdown intact. Works cross-instance via the shared jobs mirror.\n\n### `GET /ai-translate/review`\n\nThe Review Drawer's data source: everything a human still needs to look at for one document, merged from the per-leaf unresolved book (incl. self-heal detections), the latest run's failed fields, and unacknowledged attention-grade soft-skips — deduped per (locale, path) with breadcrumb labels and current source/target text.\n\nQuery params: `?id=` (collections), `?locale=` (scope the read to one language), `?runId=` (scope to one run's receipt — the Hub's \"This run (N) | Everything (M)\" toggle). The response includes `targetLocales` (the surface's full configured list) so the drawer can render a chip for every language.\n\n### `GET /ai-translate/doc-status` · `POST /ai-translate/status-batch`\n\n`doc-status` is the per-document status projection (per-language state, stale groups, active job) — derived through the one canonical `resolveLocaleStatus`. `status-batch` (root-level) answers the same question for many documents in ONE request: `{ docs: [{ slug, documentId }] }` → a live verdict per doc. The Hub's \"Now\" column uses it.\n\n### `POST /ai-translate/skips/acknowledge`\n\nMark-as-OK: `{ id?, locale, paths, note? }`. Persists the acknowledgment durably (with `acknowledgedBy` from the session and the optional note) so detection never re-flags a deliberate keep. A later source change re-opens the question by design.\n\n### `POST /ai-translate/keep-current`\n\n`{ id?, locale, paths }`. The resolution path for an **Out of date** entry when the editor has looked and decided the existing translation is still fine — no AI call, no change to the translation. Staleness isn't a stored flag: `doc-status` recomputes it each render by comparing the current source hash against the `lastSourceHash` from the last run. So the only way to clear it is to make that comparison match again — either re-translate, or re-baseline against the current source while keeping the existing target, which is what this does. Only meaningful with `preserveManualEdits: true` (that's what maintains the hash book).\n\n#### Hash semantics and the source baseline\n\n`lastSourceHash` fingerprints the **translatable projection** of a top-level field — the ordered list of `(leafPath, text)` pairs the unit extractor yields for it, sorted by path, stored as `p1:<sha256>`. Both the write (`recordHashesAfterWrite`) and the read (`applyHashSkip`, `computeStaleForLocale`, the Hub preflight) call the same function over the same field set, which is the whole point: the fingerprint has to mean \"the text we translated\", not \"the object we happened to read\".\n\nConsequences worth knowing:\n\n- Adding a non-translatable key to a shared block does **not** make every document using it out of date. TASKS-25582 appended one relationship field to a `visibility` group; Payload returns it as `\"rule\": null`, and the old raw-object fingerprint moved on 436 documents across five collections with zero text change.\n- Neither do `null` vs absent, key order, relationship population depth, block `id` values, `blockName`, or lexical node-shape drift across a Payload upgrade.\n- Changing a **non-translatable value** (a reward amount, an href) still moves it — the projection keeps those leaves so the mirror can propagate them.\n- Reordering rich-text blocks or array items still moves it. That is a content change.\n\n**Old rows migrate themselves, on read.** Nothing to run.\n\n- A pre-0.3.9 raw-object hash is recognised by the absence of the `p1:` marker, compared the old way, and rewritten in the new format the first time a run proves both sides unchanged.\n- An **orphaned** baseline — one that matches nothing under any algorithm, because the recorder fingerprinted an in-memory shape the database never held — is rescued by version history. If the source-locale snapshot at `lastWrittenAt` projects to the same text the source has now, and the target passes its own gate, the field is skipped and the row re-baselined instead of being re-translated. On the 2026-09-02 production copy 1376 of 4419 rows (31%) were in that state, re-billing $18.80 on every 13-locale \"changed\" pass. The rescue needs document versions to be enabled and retained; where they are not, the row simply keeps behaving as it does today.\n\n`lastWrittenHash` is unchanged — it fingerprints the whole target value, because the manual-edit guard compares values, not text.\n\n### `GET /ai-translate/locks` · `POST /ai-translate/locks/unlock`\n\nThe **Protected edits** inventory and its unlock verb. A \"lock\" is a field the manual-edit guard preserved because the target value diverged from the plugin's last write — the machine will keep refusing to touch it, run after run.\n\nThe inventory derives per `(document, locale)` from the newest usage row whose run covered that locale, so a hand-edit only appears once a run has observed it. That's the same observation window the per-document tab reports, which is why the two always agree.\n\n**Unlock deletes** the field's meta-hash rows rather than re-hashing the current value. No stored hash → no divergence → the field reads Out of date and the next run re-translates and re-baselines it. That's deliberate: the intent is \"hand this field back to the machine\", not \"bless the manual edit\".\n\nBoth are open to any authenticated panel user — not admin-only. The per-document Translations tab points editors here to resolve protected fields on their own content, and an admin gate made that instruction a dead end.\n\n### `POST /ai-translate/policy`\n\n`{ id?, optOut?, autoLocales? }`. Admin-gated via `adminRoles`. Updates the two per-document policy fields (`_aiTranslateOptOut`, `_aiTranslateAutoLocales`) from the Translations tab. The write carries the re-entry flag so a policy toggle never fires an auto-translate, and it's draft-aware: on collections with drafts it saves as a draft, taking effect on the next publish — which is exactly when the policy is consulted.\n\n### `POST /ai-translate/alerts/dismiss`\n\nAdmin-gated. Dismisses a blocking alert (cost-guard abort, persistent failure, provider outage) from the document's alert zone.\n\n### `GET /ai-translate/client-config` (root-level)\n\nThe JSON-safe subset of plugin config the admin client needs at render time — target locales, effective exclude patterns, kill-switch state. It exists because Payload's admin client strips function references from `config.custom` during client serialization, so `useConfig()` can't read the plugin's config directly. Any authenticated user; the response carries no secrets.\n\n### `GET /translation-hub/editor-overview` (root-level)\n\nOne request backing the editor's Hub Overview: the \"needs your attention\" work queue (failed locales plus pending attention-grade skip reviews), the read-only \"running now\" list, and a 14-day activity feed. Editor-or-admin auth, and **sanitized** — no cost, token, or model data.\n\n### `GET /translation-hub/usage-summary` (root-level)\n\nServer-side aggregation for the Hub's Overview and Audit KPIs. Replaces the earlier `/translation-usage?limit=1000` pattern, which silently truncated past 1000 rows.\n\n### Translation Hub endpoints (root-level)\n\nRegistered when `bulk` is configured, all under `/api/translation-hub/bulk-translate`:\n\n| Method | Path | What it does |\n|---|---|---|\n| `POST` | `/` | Enqueue a run. Admin-only, TOTP-gated when `requireTotp`, rejected past `dailyUsdCap`. |\n| `GET` | `/` | List runs. |\n| `GET` | `/active` | Currently queued/running runs. |\n| `GET` | `/preflight` | Cost estimate + scope checks before enqueueing. `documents.perCollection[].changed` is a real per-document diff, computed with the same projection hashes the run's hash-skip uses. The scan runs against an 8s wall-clock budget rather than a scope-size ceiling; when it runs out, `documents.scan.partial` is `true`, `scannedDocs` / `totalDocs` say how far it got, and a collection it never reached carries `changed: null`. |\n| `GET` | `/:id/status` | One run's live status and per-unit breakdown. |\n| `GET` | `/:id/failures` | The run's failed units. |\n| `GET` | `/:id/review` | Batch-scoped Review Drawer feed — same item anatomy as the per-document `review`, each item tagged with its owning document. |\n| `POST` | `/:id/cancel` | Stop a run. Units already written stay written. |\n| `POST` | `/:id/retry-failed` (alias `/:id/retry`) | Re-queue the failed units. |\n| `POST` | `/:id/revert` | Roll back the run's writes. 24-hour window, admin + TOTP. |\n| `POST` | `/:id/force-reset` | Break a wedged run out of a non-terminal state. |\n\nBulk is **admin-only** across the board — enqueue, cancel, retry, revert. Editors translate per-document from the Translations tab; fleet-wide runs are an admin operation.\n\n### `GET /ai-translate/progress` (SSE)\n\nLive progress stream for a translation job. Subscribed via Server-Sent Events.\n\nTwo modes:\n\n- `?jobId=X` — follow a specific job.\n- `?docId=X` — follow any active job for this doc, or wait until one starts. The in-edit progress bar uses this mode so the bar appears instantly when a job begins.\n\nEach event has shape:\n\n```json\n{\n  \"jobId\": \"j_abc123\",\n  \"completed\": [\"de\", \"es\"],\n  \"failed\": [{ \"locale\": \"fr\", \"reason\": \"1 field(s) failed\" }],\n  \"total\": 9,\n  \"status\": \"running\"\n}\n```\n\n`status` is one of `'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled'`.\n\n> Note: many proxy/load-balancer chains buffer or kill SSE. The admin UI does NOT\n> rely on this stream — it polls `doc-status` (2.5s) instead. Prefer polling for\n> anything that must work behind an arbitrary gateway.\n\n### Access control\n\nThe `/ai-translate/*` namespace requires the `admin` or `editor` role throughout. On top of that, `access.translate` is your own rule for the endpoints that **spend money or change state** — translate, estimate, cancel, unlock, skips/acknowledge and keep-current. Reads (doc-status, review, status-batch, progress, lock inventory) are decided by the role check alone and never reach your callback; see below for why:\n\n```ts\naiTranslatePlugin({\n  // …\n  access: {\n    translate: ({ req }) => {\n      const roles = [\n        ...(Array.isArray(req.user?.roles) ? req.user.roles : []),\n        ...(typeof req.user?.role === 'string' ? [req.user.role] : []),\n      ].map((r) => r.toLowerCase())\n      return roles.includes('editor') || roles.includes('admin')\n    },\n  },\n})\n```\n\n**The default is the `admin` or `editor` role**, read from a `roles` array or a singular `role` select, case-insensitively. Two things follow:\n\n- If your project names those roles differently, write `access.translate` or your editors get a 403. The plugin logs a boot warning whenever the option is unset, naming the default.\n- Until 0.3.6 the default was \"any authenticated user\" and it covered only two endpoints. The document-scoped endpoints checked for a session alone and then read admin-only collections with access control overridden, so any logged-in user could read another document's spend and model data, its verbatim source and target strings, and every locked field in the site.\n\n**Your callback is consulted only for verbs that spend money or change state.** Reads — status, review, progress, lock inventory — are decided by the role check alone and never reach it. That is deliberate: a consumer is entitled to implement `access.translate` as a rate limiter (wild does, 30 requests per 60 seconds per user), and the Translations tab polls `doc-status` every 2.5 seconds during a run, so a second document started inside that window would saturate the bucket and 403 every later poll. The role requirement still applies to reads, so a member with no role cannot reach them.\n\nThe callback receives `kind` alongside `req` — `'spend'` for the provider-calling endpoints, `'mutate'` for state changes like unlock, acknowledge and cancel — so you can rule on each verb deliberately:\n\n```ts\nimport { readUserRoles } from '@purposeinplay/payload-ai-translate'\n\naccess: {\n  translate: ({ req, kind }) => {\n    const roles = readUserRoles(req.user)\n    if (kind === 'spend') return roles.includes('admin')\n    return roles.includes('editor') || roles.includes('admin')\n  },\n}\n```\n\nTwo things are enforced independently of this gate:\n\n- **Cost, model and duration are admin-only** in the `doc-status` response, matching the usage collection's own access control.\n- **Unlock requires update access to the target document**, run through that collection's own `access.update`. It deletes the bookkeeping that stops the next run from overwriting a human's edits, so it is a write against that document by proxy.\n\n`access.maxRequestsPerMinute` (default 60, `0` disables) bounds per-user requests to the two endpoints that call the provider. The counter is per process, so on a multi-instance deployment the effective ceiling is that number times the instance count — it bounds a runaway client, while `bulk.dailyUsdCap` remains the real spend boundary.\n\nNote that `adminRoles` (the plugin's own gates) reads the same two role shapes. Your own `access.translate` callback is your code, so it has to handle whichever shape your Users collection uses.\n\n---\n\n## Admin UI\n\nEverything translation-related lives in two places: a **Translations tab** inside each document, and the **Translation Hub** views. Nothing renders outside them.\n\n### The Translations tab (per document)\n\nPlugin-registered on every tracked collection and global — you wire nothing. It appends as a field tab to the surface's existing tabs (`Hero | Content | SEO | Translations`); a flat surface gets wrapped into a `Content | Translations` pair. Switching tabs never leaves the form, and the active tab syncs to `#translations` in the URL so it's deep-linkable.\n\nIt contains:\n\n- **Action bar** — the primary Translate CTA, language scoping, an ambient cost estimate, and last-run metadata. The CTA always opens one confirmation dialog naming languages, field counts, and cost.\n- **Per-language status rows** — one per target locale, each with its state badge, a Translate/Retry action, and expandable per-field detail (failed fields, soft skips with reasons and source values, protected manual edits, out-of-date fields). Field paths resolve to breadcrumb labels from the field config — \"Hero › Terms Link\", never `content.0.content.hero.terms_href`.\n- **Quick-select pills** — *Everything not up to date / Not translated yet / Out of date / Failed / All* set the run scope; clicking a language row toggles it in or out.\n- **Force re-translate** — an always-visible guarded toggle beside the CTA (\"Also replace manual edits\"). The confirmation names every hand-edited field it would overwrite. Force lives nowhere else.\n- **Alert zone** — blocking alerts (cost-guard abort, persistent failure, provider outage), dismissable by admins.\n- **Policy zone** (collapsed) — the per-document opt-out and locale narrowing. Live inputs for admins, read-only for editors.\n\nManual translation from the tab runs in async mode (`202` + jobId, progress driven by `doc-status` polling). The earlier synchronous POST held the response open for a whole multi-language run, so any proxy timeout returned a 504 to the editor while the server kept translating.\n\n### Per-language states\n\nThe vocabulary editors see. One canonical resolver (`resolveLocaleStatus`) derives all of them; labels live in one place, so every surface agrees.\n\n| State | Label | Meaning |\n|---|---|---|\n| `synced` | Up to date | Every field for this language matches the current source and passed checks. |\n| `stale` | Out of date | The source changed since this language was last translated. |\n| `failed` | Failed | Some fields couldn't be translated on the last run. |\n| `needs-review` | Needs review | Some fields came back unchanged or need a human to confirm. |\n| `preserved` | Protected | A human edited this by hand; the machine won't overwrite it without Force or an unlock. |\n| `never-ran` | Not translated yet | No run has ever covered this language. |\n| `reverted` | Reverted | The last translation for this language was rolled back. |\n\nTwo **tiers** answer these questions at different costs. `verified` re-hashes live documents on the request (the Translations tab, the Review Drawer). `recorded` consults only persisted rows — cheaper, used by Hub list views, but blind to source edits since the last run. The recorded tier reports *problems only*: a clean result reads \"No open issues\", never \"Up to date\", because without hashing it cannot honestly claim sync.\n\n### The Review Drawer\n\nOne non-modal, resizable drawer, reused across the Content tab, the Translations tab, and the Bulk Runs Hub. It persists across tab switches and opens from the in-form flag badge.\n\nIt merges everything still needing a human for one document: the per-leaf unresolved book (including self-heal detections), the latest run's failed fields, and unacknowledged attention-grade soft skips — deduped per `(locale, path)`, with breadcrumb labels and the current source/target text.\n\nEach entry resolves one of three ways: **Retry** (re-translate), **Keep current** (re-baseline the hash, no AI call), or **Mark as OK** (acknowledge a deliberate keep). Entries in a running job show \"Translating…\"; every other Retry is disabled with a tooltip, because a document runs one job at a time.\n\n**Soft skips are triaged server-side** into `attention` (the model refused, or sentence-shaped prose came back untranslated) and `benign` (URLs, icon keys, brand terms correctly kept as-is — collapsed into a \"kept in the original language on purpose\" count). **Needs review fires only on attention-grade skips**, so a language whose skips are all benign reads Up to date.\n\n### Translation Hub views\n\nTwo server-rendered admin views. **These are not auto-registered** — you wire them into `admin.components.views` yourself. See [INTEGRATION.md](./docs/INTEGRATION.md#step-7--wire-the-translation-hub-views).\n\n- **Translation Hub** (`/admin/translation`) — tabs for Overview, Configuration, Protected edits, Audit & Cost, and Advanced. The admin Overview carries bulk runs and cost; the editor Overview is a sanitized work queue with no cost, token, or model data.\n- **Bulk Translate Runs** (`/admin/translation-runs`) — the run list with inline drill-down into batches and units. Admin-only.\n\nA `TranslationNavGroup` component gives you a collapsible \"Translation\" sidebar group linking just those two. Every other registered surface (meta hashes, jobs, batches, units, spend, rate limits, usage, settings) stays reachable by direct URL for debugging but is deliberately kept out of the sidebar — their polished form lives inside the Hub's tabs.\n\n### Deprecated surfaces\n\n| Removed | Replacement |\n|---|---|\n| Sidebar \"Translate…\" button, translate modal | The Translations tab's action bar |\n| `perFieldButton: true` | Per-field re-translate in the tab's expanded language rows. **The option is ignored** and logs a warning at boot. |\n| Floating review navigator, docked sidebar panel | The single Review Drawer |\n\n`TranslateButton`, `TranslateModal` and `FieldTranslateButton` were **removed in 0.3.6** — deprecated in 0.2.0, kept \"one release\", and shipped for sixteen without anything injecting them. **Run `payload generate:importmap` after upgrading**: an import-map entry still naming one of them stops the admin panel from loading. `ReviewSidebarPanel` and `DockedReviewPanel` remain exported as aliases of `ReviewDrawerHost`. Also drop any hand-rolled per-document status panels.\n\n---\n\n## Events and alerts\n\n### `onEvent`\n\n| Type | When | Additional fields |\n|---|---|---|\n| `'translation.started'` | Before LLM calls | `targetLocales` |\n| `'translation.field'` | After each individual field translation | `fields` (single entry) |\n| `'translation.succeeded'` | All locales completed with no real failures (skipped is OK) | `fields`, `usage` |\n| `'translation.failed'` | At least one locale had a real failure | `fields`, `usage`, `error` |\n\nAll events include `documentId`, `collection`, `sourceLocale`, `targetLocales`, `timestamp`. `canary: true` marks an event emitted from the canary locale.\n\nEvents also carry `skippedFields[]` — the per-field soft skips. A document-level `translation.succeeded` can still carry skips: soft skips don't drive document status to failed, but the editor needs","readmeFilename":"README.md"}