{"_id":"@aphrody/x","_rev":"9-36671603cc4d0f924daa7d1432994de8","name":"@aphrody/x","dist-tags":{"latest":"1.2.5"},"versions":{"1.0.7":{"name":"@aphrody/x","version":"1.0.7","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.0.7","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"77a0cf469b096d1d12b65ceea48c88c991fe67b5","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.0.7.tgz","fileCount":36,"integrity":"sha512-CWJ9pzx04fI+1qXzHGhpowO1Dp6Kdt9hfZ43OmeS3DHgFlnmw5DFxB6uGK60FDKAv8XpQwGGHy/T9MpCaU652g==","signatures":[{"sig":"MEUCICzY8QyJsd0QZa48RxSYPWLsmO5FFzgr5rehBawMH5vvAiEA+y/6OT3uV+v6fHzSB2faNGBVbgFfmWsqTu1EPgwykWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":216733},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":"./src/index.ts"},"gitHead":"7409bb65fef1c022208151a69304547bf9a4e516","scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_npmVersion":"9.2.0","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie GraphQL + REST, bxc-aligned catalog sync and surface recon.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.0.7_1780527296845_0.9345211392344053","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@aphrody/x","version":"1.0.8","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.0.8","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"077e1597c1b5d2ccf6b9985eabe6d3570199f371","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.0.8.tgz","fileCount":62,"integrity":"sha512-uSRLEizIKHCG6NZ5vnsCSF8I7tdfnhXF+7rhZkjFp0ZpzXjbCRGMaBVGFjwHDdCTj1ton8CdOVbKlFBXkVi/Ag==","signatures":[{"sig":"MEUCIQC5wgXJA6K3dtDDAxk2ihmffHCDdVNhWjP5kJH6MienCAIgA7+Gx4XQBJasYTCU+b2DPWFsdESfv4yHTMOXKO1mOEU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":417126},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"077e1597c1b5d2ccf6b9985eabe6d3570199f371","exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-uSRLEizIKHCG6NZ5vnsCSF8I7tdfnhXF+7rhZkjFp0ZpzXjbCRGMaBVGFjwHDdCTj1ton8CdOVbKlFBXkVi/Ag==","_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.0.8_1780586727946_0.23482842105748158","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@aphrody/x","version":"1.0.10","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.0.10","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"a1462f8e55cb1d127467281ee525b2c42483f0dc","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.0.10.tgz","fileCount":62,"integrity":"sha512-J7FCZHo2/0ygoPpbh/Wt+vyUxj3E/O6ibqUbbJeWQ1r+cws1204EaZO3sFkPjjnv5fHLSifaLmdkrVfi/WS98A==","signatures":[{"sig":"MEUCIQDcVCZBfSzJp1+FBXXMNONULl+nYDdsMjioSdRlVBW+UwIgD9PKIP4p77pmNUWIf0kS7Rd2e5XngxBgckk6xcAGc0E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":418214},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"a1462f8e55cb1d127467281ee525b2c42483f0dc","exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-J7FCZHo2/0ygoPpbh/Wt+vyUxj3E/O6ibqUbbJeWQ1r+cws1204EaZO3sFkPjjnv5fHLSifaLmdkrVfi/WS98A==","_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.0.10_1786525424953_0.28175992797113714","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aphrody/x","version":"1.1.0","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.1.0","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"61acedb77c26849c28dc5eb6500a75a7edc3b9cc","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.1.0.tgz","fileCount":67,"integrity":"sha512-K/Sjq3tih5AJ3tcMMsoHS6e/bLOjXahNHu7iri8bAXY43NZ5Yk21BHEtRHGqR4e7SNRvyMXmiQwCRV3j5X6/zA==","signatures":[{"sig":"MEYCIQDnzlOXmQNUwRDsBtq/9ue1TS8duaUzzjws7K1s+9RjsQIhAOk655zQrnWS+ZD3/7p+M8N9BE0E4cN4sLrecBuSAr4I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":540670},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"61acedb77c26849c28dc5eb6500a75a7edc3b9cc","exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-K/Sjq3tih5AJ3tcMMsoHS6e/bLOjXahNHu7iri8bAXY43NZ5Yk21BHEtRHGqR4e7SNRvyMXmiQwCRV3j5X6/zA==","_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.1.0_1788311212068_0.8225800460071913","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aphrody/x","version":"1.2.0","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.2.0","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"93b5f70bf0244949625e86c3d97bab70da6e5efe","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.2.0.tgz","fileCount":40,"integrity":"sha512-kXEGxQdQLYmYtklRKt5gsFYx+L1BY8TL6qJj/jI0FLPbL7F1djwDzFI1UjZcB0lVxTBmPMqYZUOyP7XpGzuZyA==","signatures":[{"sig":"MEUCIBDvJt8BGtlcaxF5f63pAGUWWE47JYAlO1KlhYX4cYxeAiEAvP0d1N1KdHG0vnMHJAgEArhVRkmjjTzu+VgJX3O7Bz0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303010},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"93b5f70bf0244949625e86c3d97bab70da6e5efe","engines":{"bun":">=1.3.14"},"exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-kXEGxQdQLYmYtklRKt5gsFYx+L1BY8TL6qJj/jI0FLPbL7F1djwDzFI1UjZcB0lVxTBmPMqYZUOyP7XpGzuZyA==","_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.2.0_1788431551641_0.2613620302739901","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aphrody/x","version":"1.2.1","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.2.1","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"dist":{"shasum":"c13eddde8c2b377a49b8ec97095f047d29197208","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.2.1.tgz","fileCount":40,"integrity":"sha512-sMdkkGdmu9GihQNou8lm7AXWQiNB9RAnB8GPyu2h15ZAoKvj0nkzg2ytaGEgmmwxJ9XICmfQbz0DhWk6SDoqkA==","signatures":[{"sig":"MEQCIHIQYiSe4LsrXsrjEyCGoL/7tOeGv7rKi4d66FJbB6HTAiBGhwX9LUL/YFvo5ljFiJS8l1BLtbktwhXEe+of4ulOHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303363},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"c13eddde8c2b377a49b8ec97095f047d29197208","engines":{"bun":">=1.3.14"},"exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-sMdkkGdmu9GihQNou8lm7AXWQiNB9RAnB8GPyu2h15ZAoKvj0nkzg2ytaGEgmmwxJ9XICmfQbz0DhWk6SDoqkA==","_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.2.1_1788681507674_0.007923114724081914","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@aphrody/x","version":"1.2.3","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.2.3","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"bugs":{"url":"https://github.com/aphrody-code/x/issues"},"dist":{"shasum":"de8457a02e45fb0e380555afb19aab1e85a6a2aa","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.2.3.tgz","fileCount":33,"integrity":"sha512-vHHIJpqhW6rf0UEmzayOSYsnxJ462zvkfsgBTi7ckC6UcjHM1okVHnYdxZuM8G5GGzVuUMi9FynkA/yaurXQmg==","signatures":[{"sig":"MEUCIQC55/SSEiBaDpwMYm4nJYaa8U80A/yldPALMIncYQuqzgIgBqCOMDaL2MklD11b1oBP7qbVs/12xJSbkPMKoP8G8Bc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288858},"main":"./src/index.ts","type":"module","types":"./src/index.ts","shasum":"de8457a02e45fb0e380555afb19aab1e85a6a2aa","engines":{"bun":">=1.3.14"},"exports":{".":"./src/index.ts"},"scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-vHHIJpqhW6rf0UEmzayOSYsnxJ462zvkfsgBTi7ckC6UcjHM1okVHnYdxZuM8G5GGzVuUMi9FynkA/yaurXQmg==","repository":{"url":"https://github.com/aphrody-code/x.git","type":"git"},"_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.2.3_1788770712823_0.07713515288908135","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@aphrody/x","version":"1.2.4","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"license":"Apache-2.0","_id":"@aphrody/x@1.2.4","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"homepage":"https://github.com/aphrody-code/x#readme","bugs":{"url":"https://github.com/aphrody-code/x/issues"},"dist":{"shasum":"670f4bb7d320536a673fb3b686eea67fee9f67c0","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.2.4.tgz","fileCount":33,"integrity":"sha512-opzTwvtapGj8NSAMdgD1+kwtw0Lf9yiSzrIbhLq5cdMDEwxSBGAcNHF5cHT++MJkYdVJ+pweMlMb3fBrJ8R5WQ==","signatures":[{"sig":"MEUCID5j/c19TuL85y6l0H77jZNIWBLgb66WU3Q5dP1tXVieAiEAg7vmfUIVWahssx2vN9SyjW55mvdSVXIxV4Kt1i6+8NQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280228},"main":"./src/index.ts","type":"module","types":"./src/index.ts","engines":{"bun":">=1.3.14"},"exports":{".":"./src/index.ts"},"gitHead":"b586f114f810d55b9e1b2aea63c0cd1378f76a8c","scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"repository":{"url":"git+https://github.com/aphrody-code/x.git","type":"git"},"_npmVersion":"9.2.0","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/x_1.2.4_1789022207131_0.613135608584267","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"_id":"@aphrody/x@1.2.5","bugs":{"url":"https://github.com/aphrody-code/x/issues"},"dist":{"shasum":"ce6662bedc5c2fd058e6759b45197b8ef7cb53f5","tarball":"https://registry.npmjs.org/@aphrody/x/-/x-1.2.5.tgz","fileCount":32,"integrity":"sha512-3d8SSU2VhXzU6oaNGiRz3yeckl+SJDrSXKB8Ek12i/7SEYVcar18GiMmesDUN6ldcPRLtEgfTcFtTHVxsBnyHg==","signatures":[{"sig":"MEYCIQCDJEi7qPgCnUhKsLNtOEQ/1QFNrG58aCdwOHO6e/KFMgIhAPLwXfybWhCDv1KjLXrEvJsOHFJNNsfw3MOP+iFN0pLM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDFJHM9O8YLS5qtfnuOmytBHh1cmYDJx5UUVhhs/9VSjAIgMLaTyVm6ESZp0vO0+b7L17AzI0h8/UavHoMWOdzgLLA="}],"unpackedSize":266735},"main":"./src/index.ts","name":"@aphrody/x","type":"module","types":"./src/index.ts","shasum":"ce6662bedc5c2fd058e6759b45197b8ef7cb53f5","engines":{"bun":">=1.4.2"},"exports":{".":"./src/index.ts"},"license":"Apache-2.0","scripts":{"lint":"oxlint","test":"bun test","build":"tsc","recon":"bun ../../scripts/x-premium-recon.ts --profile max","coverage":"bun ../../scripts/x-coverage.ts","typecheck":"tsc --noEmit","catalog:sync":"bun ../../scripts/sync-x-catalog.ts"},"version":"1.2.5","_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"_integrity":"sha512-3d8SSU2VhXzU6oaNGiRz3yeckl+SJDrSXKB8Ek12i/7SEYVcar18GiMmesDUN6ldcPRLtEgfTcFtTHVxsBnyHg==","repository":{"url":"https://github.com/aphrody-code/x.git","type":"git"},"_npmVersion":"10.8.3","description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","directories":{},"maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.6.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.3.14","typescript":"^6.0.3"},"peerDependencies":{"@aphrody/bxc":"^0.9.14"},"peerDependenciesMeta":{"@aphrody/bxc":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/x_1.2.5_1789648724571_0.8518004522149927"}}},"time":{"created":"2026-06-03T22:54:56.611Z","modified":"2026-09-17T12:38:44.846Z","1.0.7":"2026-06-03T22:54:57.007Z","1.0.8":"2026-06-04T15:25:28.092Z","1.0.10":"2026-08-12T09:03:45.113Z","1.1.0":"2026-09-02T01:06:52.287Z","1.2.0":"2026-09-03T10:32:31.804Z","1.2.1":"2026-09-06T07:58:27.832Z","1.2.3":"2026-09-07T08:45:12.974Z","1.2.4":"2026-09-10T06:36:47.291Z","1.2.5":"2026-09-17T12:38:44.665Z"},"bugs":{"url":"https://github.com/aphrody-code/x/issues"},"license":"Apache-2.0","keywords":["aphrody","bun","x","twitter","client","graphql","headless","bxc"],"repository":{"url":"https://github.com/aphrody-code/x.git","type":"git"},"description":"Headless X (Twitter) client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no API key. Includes local For You algo (x-algorithm port), full stealth, store, and deep synergy with @aphrody/xai for Grok + native X agents (via XTools).","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"readme":"# @aphrody/x\n\nHeadless **X (Twitter)** client in pure TypeScript for Bun. Cookie-auth GraphQL + REST, no official API key required. Stealth, local state (SQLite store + FTS), catalog sync, and deep integration with `@aphrody/xai` for agentic Grok flows.\n\n**Zero keys, fully native**: Uses real browser cookies (`auth_token` + `ct0`), query ID catalog synced from live X bundles, and the production stealth profiles from bxc.\n\n**Table of Contents**\n\n- [Key Features](#key-features)\n- [Auth (cookie-based, no X API key)](#auth-cookie-based-no-x-api-key)\n- [Usage](#usage)\n  - [Basic](#basic)\n  - [Ranking with local For You algo (no ML model needed)](#ranking-with-local-for-you-algo-no-ml-model-needed)\n  - [With X + Grok (agentic, via @aphrody/xai)](#with-x--grok-agentic-via-aphrodyxai)\n- [CLI (`bxc x`)](#cli-bxc-x)\n- [Advanced / Internal](#advanced--internal)\n- [MCP](#mcp)\n- [Installation & Build](#installation--build)\n- [Relation to bxc + xai](#relation-to-bxc--xai)\n- [License](#license)\n\n## Key Features\n\n- **Core operations**: `whoami`, `profile` (userByScreenName), `tweets` (user timeline), `search` (Latest/Top), `news` (Explore tabs / trending).\n- **Advanced**: X Pro / Gryphon decks (radar, columns, sync), Radar keyword search, premium upsells, media upload, archive import/export, local SQLite store with edges/FTS search/digest.\n- **Algo (For You ranking)**: Local X For You style re-ranking (`rankPosts`, `rankTweets`, `toPostCandidate`/`tweetToPostCandidate`) ported/adapted from [xai-org/x-algorithm](https://github.com/xai-org/x-algorithm). Filters (dupe, self, blocked, muted, age), weighted scoring (engagement proxy + in-network/history/freshness bonuses), author diversity attenuation. Mirrors the Rust `x-algorithm` crate.\n- **X + Grok synergy** (with `@aphrody/xai`): Use native `XTools` + tool defs (`x_search`, `x_profile`, `x_whoami`, `x_tweets`, `x_news`) to fulfill Grok tool calls locally with the real XClient (stealth + store). See [packages/xai/README.md](../xai/README.md) for agentic examples.\n- **Autonomous follow purge**: `purgeFollowing()` empties the whole following list, accounts that don't follow back first, with a three-brake rate governor (randomised pacing + rolling 15 min / 24 h budgets + `x-rate-limit-*` headers) and a resumable on-disk journal. See [Autonomous follow purge](#autonomous-follow-purge).\n- **Autonomous post purge**: `purgeTweets()` deletes your own tweets, replies and media below a like threshold, least-liked first, walking all three timelines. Shares the rate governor and resumable journal with the follow purge. See [Autonomous post purge](#autonomous-post-purge).\n- **Stealth & perf**: Integrates bxc profiles (static/http/fast/stealth/max), cookie injection, HAR, etc. Pure TS (parallel Rust FFI in bxc for speed).\n\nSee `src/core/client.ts`, `src/algo.ts`, `src/tools` (in xai), `src/services/*`, `src/db/*`.\n\n## Auth (cookie-based, no X API key)\n\nUses `auth_token=...; ct0=...` (from logged-in X web session).\n\nResolution (via `XSession`):\n\n1. Explicit cookie string.\n2. Session file (`~/.config/x-cli/session.json` or env).\n3. `X_AUTH_TOKEN` / `X_CT0` env.\n\n```ts\nimport { XClient, XSession } from \"@aphrody/x\";\n\nconst session = XSession.loadOrEnv(); // or fromCookieString(\"auth_token=...; ct0=...\")\nconst client = new XClient(session);\n```\n\n**Cookie management**: Use bxc CLI `bxc cookies ...` or the tools in `src/cookies` (in root bxc).\n\n## Usage\n\n### Basic\n\n```ts\nimport { XClient, XSession } from \"@aphrody/x\";\n\nconst session = XSession.loadOrEnv();\nconst client = new XClient(session);\n\nconst user = await client.whoami();\nconsole.log(user);\n\nconst profile = await client.userByScreenName(\"aphrody_code\");\nconst tweets = await client.userTweets(profile.id, 20);\n\nconst search = await client.search(\"bun runtime\", 10); // Latest by default\nconst news = await client.getNews(5);\n```\n\n### Ranking with local For You algo (no ML model needed)\n\n```ts\nimport { rankTweets, tweetToPostCandidate } from \"@aphrody/x\";\n\nconst results = await client.search(\"bxc browser engine\");\nconst candidates = results.tweets.map(t => tweetToPostCandidate(t, /* inNetwork? */ false));\nconst ranked = rankTweets(results.tweets, {\n  viewer_id: user.id,\n  followed_author_ids: [...],\n  recent_engagement_author_ids: [...],\n  muted_keywords: [\"spam\"],\n  now_unix: Math.floor(Date.now()/1000),\n}, 10);\n\nconsole.log(ranked[0].post.text, ranked[0].score, ranked[0].reasons);\n```\n\nSee `src/algo.ts` for `rankPosts`, filters, scoring (engagement + in_network + diversity), and conversions.\n\n### With X + Grok (agentic, via @aphrody/xai)\n\nSee the full examples and `XTools` in [packages/xai/README.md](../xai/README.md). Grok can decide to call native X tools; fulfillment uses this package's XClient (no extra keys).\n\nRunnable end-to-end example: [packages/xai/examples/grok-x-agent.ts](../xai/examples/grok-x-agent.ts).\n\nExample pattern (in Grok tool handler):\n\n```ts\nconst xTools = new XTools(session); // or injected mock in tests\nif (tool.name === \"x_search\") {\n  const res = await xTools.search(args);\n  chat.append({ role: \"tool\", tool_call_id: tool.id, content: JSON.stringify(res) });\n}\n```\n\n`XTools` exposes: `search`, `profile`, `whoami`, `tweets`, `news` + corresponding tool defs for easy inclusion in `createChat({ tools: [...] })`.\n\n## CLI (`bxc x`)\n\n```bash\nbxc x whoami\nbxc x profile elonmusk\nbxc x tweets elonmusk --count 20\nbxc x search \"bun runtime\" --count 10\nbxc x news --count 5\nbxc x rank \"query\"   # or foryou (uses local algo + X data)\nbxc x unfollow       # plan the follow purge (dry-run, no mutation)\nbxc x unfollow --yes # execute it\nbxc x purge-tweets                  # plan the post purge (dry-run)\nbxc x purge-tweets --yes --max-likes 1000   # delete everything under 1000 likes\n```\n\nSee root CLI for `bxc x rank` / `foryou` (local X For You re-ranking).\n\n## Autonomous follow purge\n\nEmpties the authenticated account's following list, **accounts that don't follow\nback first**, then mutuals. Built for lists in the thousands, where the binding\nconstraint is the rate limit rather than the work itself.\n\n```ts\nimport { XClient, XSession, purgeFollowing } from \"@aphrody/x\";\n\nconst client = new XClient(XSession.loadOrEnv());\n\n// Plan only — reads the graph, mutates nothing.\nconst plan = await purgeFollowing(client, { onLog: console.error });\nconsole.log(plan.non_mutual_total, \"non-mutuals /\", plan.following_total, \"abonnements\");\n\n// Execute. Stop it whenever; the next call resumes from the journal.\nconst run = await purgeFollowing(client, { dryRun: false, onLog: console.error });\n```\n\n### Three brakes on every mutation\n\n`POST friendships/destroy.json` is throttled and bursts are a known automation\nsignature, so `RateGovernor` clears three independent budgets before each call:\n\n| Brake | Default | Purpose |\n| --- | --- | --- |\n| Randomised delay | 4–11 s | breaks up the machine-gun cadence |\n| Rolling 15 min window | 45 | stays under the per-window ceiling |\n| Rolling 24 h | 400 | stays under the unofficial ~500/day ceiling |\n\nOn top of that it reads `x-rate-limit-remaining` / `x-rate-limit-reset` from\nevery response (captured by `XClient.request`) and waits out the reset once the\nremaining count drops to the reserve. A 429 or API code 88 triggers a full\nback-off and a retry of the *same* target — a throttle is not a strike against\nthe account being removed.\n\n### Autonomy and resumption\n\nA 4 000-account list at 400/day spans ten days, so the run persists a journal\nafter **every** mutation to `~/.aphrody/x-unfollow-<handle>.json` (mode 0600,\natomic rename):\n\n- Stop it at any point — Ctrl-C, `AbortSignal`, budget exhaustion, a dead\n  session — and call it again to continue from the exact same position.\n- The follow graph is read once and reused; `refresh: true` re-reads it.\n- Rolling budgets survive restarts, so relaunching in a loop can't burst.\n- Left running, it sleeps through window and day boundaries by itself until the\n  queue is empty. `once: true` returns instead of sleeping (used by the MCP tool).\n\n### Error handling\n\n| Situation | Behaviour |\n| --- | --- |\n| Suspended / deleted / already unfollowed (34, 50, 63, 108, 162, 404) | recorded as `skipped`, never retried |\n| Rate limit (88, 429) | back off to the reset, retry the same target |\n| Persistent rate limit (6 consecutive waits) | stop the run, keep the target queued |\n| Transient (5xx, network) | exponential backoff, up to `maxRetries` (3), then `failed` |\n| Auth (32, 89, 99, 215, 401, 403) | abort immediately — a rotated cookie must not be burned through the queue |\n\n### Options\n\n`dryRun` (default `true`), `limit`, `nonMutualOnly`, `refresh`, `once`,\n`statePath`, `persist`, `perWindow`, `perDay`, `minDelayMs`, `maxDelayMs`,\n`reserve`, `maxRetries`, `maxRateLimitWaits`, `maxPages`, `pageSize`, `signal`,\n`onLog`, `onProgress`, plus `now` / `sleep` / `random` for deterministic tests.\n\nBuilding blocks are exported separately: `captureFollowGraph`, `collectFollowing`,\n`collectFollowers`, `buildQueue`, `loadState`, `saveState`, `estimateEta`,\n`RateGovernor`.\n\n## Autonomous post purge\n\nDeletes your own tweets, replies and media posts below a like threshold —\n**least-liked first**, so stopping early always means the deadest posts are the\nones already gone.\n\n```ts\nimport { XClient, XSession, purgeTweets } from \"@aphrody/x\";\n\nconst client = new XClient(XSession.loadOrEnv());\n\n// Plan only — walks the timelines, deletes nothing.\nconst plan = await purgeTweets(client, { maxLikes: 1000, onLog: console.error });\nconsole.log(plan.queued, \"posts sous le seuil /\", plan.posts_total, \"au total\");\n\n// Execute. Stop it whenever; the next call resumes from the journal.\nawait purgeTweets(client, { maxLikes: 1000, dryRun: false, onLog: console.error });\n```\n\n### Three timelines, one archive\n\nNone of X's user timelines is a superset of the others: `UserTweets` drops\nreplies, `UserMedia` only carries media. All three are walked and deduped by id,\nwhich is what makes \"everything under N likes\" actually true rather than\n\"everything under N likes that happened to be on one tab\".\n\n### What gets deleted\n\n| Kind | In scope by default | Mutation |\n| --- | --- | --- |\n| `tweet` | yes | `DeleteTweet` |\n| `reply` | yes | `DeleteTweet` |\n| `media` | yes | `DeleteTweet` |\n| `retweet` | **no** | `DeleteRetweet` |\n\nRetweets are off by default because a retweet's like count belongs to someone\nelse's post — the \"under N likes\" rule says nothing about it. Turn them on with\n`includeRetweets: true` and they are queued on scope alone, regardless of count.\n\nDetecting them is not obvious: on a user timeline X attributes a retweet to the\n**retweeter**, so `author_id` is your own id and an author check never fires.\n`classifyPost` therefore also matches the legacy `RT @handle:` prefix. Getting\nthis wrong is not cosmetic — a misclassified retweet is treated as your own post\nand deleted by a purge that was told to leave retweets alone.\n\nThe same attribution decides the mutation: a payload attributed to you carries\nyour own retweet status, which `DeleteTweet` removes; one carrying the original\ntweet needs `DeleteRetweet`.\n\nA reply carrying an image classifies as `reply`, not `media`: the reply nature\nis the more specific fact, and both are in scope anyway.\n\n`maxLikes` is a strict floor — a post sitting at exactly 1000 likes is **kept**.\n`protectIds` spares specific posts (pinned post, keepsakes).\n\n### Shared with the follow purge\n\nPacing (three brakes: randomised delay, rolling 15 min and 24 h budgets, plus\nthe `x-rate-limit-*` headers), the error taxonomy, and the mutation loop all\nlive in `purge-engine.ts`, so a fix in one purge is a fix in both. See\n[Autonomous follow purge](#autonomous-follow-purge) for the details.\n\nReads are protected too: building the queue means walking hundreds of pages, so\n`readWithBackoff` waits out a mid-walk 429 and retries the same page instead of\nthrowing away everything already fetched.\n\nTruncation is always reported. A walk stopped early — by `maxPages` or by an\nabort signal — sets `complete: false`, so a partial archive can never be mistaken\nfor full coverage and silently purged as if it were.\n\n### Options\n\n`dryRun` (default `true`), `maxLikes` (default 1000), `kinds`,\n`includeRetweets`, `protectIds`, `limit`, `refresh`, `once`, `statePath`,\n`persist`, plus every pacing knob and `signal` / `onLog` / `onProgress`.\n\nBuilding blocks are exported separately: `captureArchive`, `collectTimeline`,\n`buildTweetQueue`, `classifyPost`, `loadTweetState`, `saveTweetState`.\n\n## Advanced / Internal\n\n- **Store & state**: SQLite with tweet/user/community edges, FTS5 search, digest, archive import.\n- **Catalog & recon**: Dynamic query IDs from X JS bundles (`sync-x-catalog.ts`), surface recon, premium graph.\n- **X Pro / Radar**: Decks, columns, radar search (see `src/services/x-pro-deck.ts`, `src/config/radar-surface.ts` and `packages/x/docs/X_PRO.md`).\n\n## MCP\n\n- `bxc_x_client` (profile, tweets, search, news, whoami, rank/foryou via algo)\n- `bxc_x_unfollow_purge` (autonomous follow purge — plan-only unless `confirm: true`)\n- `bxc_x_purge_tweets` (autonomous post purge — plan-only unless `confirm: true`)\n- `bxc_xpro_deck` (decks + radar)\n- Plus synergy via `bxc_grok_*` tools (Grok can trigger native X fulfillment).\n\n## Installation & Build\n\n```bash\nbun add @aphrody/x\n# or in workspace: bun install (monorepo)\n```\n\nMain entry: `src/index.ts` (re-exports core, services, algo, etc.).\n\n## Relation to bxc + xai\n\nThis is the pure-TS headless X client powering bxc's `bxc x` CLI, recon, and MCP. Pairs with `@aphrody/xai` for Grok + native X agent loops (keyless SuperGrok OIDC + cookie X = zero external keys, fully local/stealth).\n\nSee:\n- Root `README.md` and `CLAUDE.md`\n- `packages/xai/README.md` (high-level Grok Chat + XTools)\n- `src/cli/x.ts`, `src/mcp/server.ts`\n- `packages/x/docs/` (X_PRO.md, COVERAGE.md, etc.)\n- Examples in `examples/`\n\n**Production notes**: Cookie sessions expire/rotate; use stealth profiles; prefer local algo + store over repeated live calls. All verified in unit tests (no live required for core + algo).\n\n## Testing\n\nSee `index.test.ts` for units (catalog, store, archive, algo/ranking, ingest/RAG, synergy with xai via mocks) and `unfollow.test.ts` / `purge-tweets.test.ts` for the purge engines (queue ordering, rate governor budgets, error taxonomy, read backoff, journal resume — all on an injected clock, no live calls). Integration tests skip without session.\n\nRun: `bun test packages/x`\n\nFor cross with xai (Grok + native X tools), see `packages/xai/index.test.ts` (e.g., full tool loop tests).\n\n## License\n\nApache-2.0 (see root).\n\nContribute via the bxc monorepo (catalog sync, new surfaces, more algo features, etc.).\n","readmeFilename":"README.md"}