{"_id":"@elizaos/plugin-bluesky-root","_rev":"4-1509969c12006867287518778e17d65c","name":"@elizaos/plugin-bluesky-root","dist-tags":{"next":"2.0.0-alpha.1","latest":"2.0.0-alpha.1"},"versions":{"2.0.0-alpha.1":{"name":"@elizaos/plugin-bluesky-root","version":"2.0.0-alpha.1","_id":"@elizaos/plugin-bluesky-root@2.0.0-alpha.1","maintainers":[{"name":"shawticus","email":"shawmakesmagic@gmail.com"},{"name":"shakkernerd","email":"shakkerdroid@gmail.com"},{"name":"wtfsayo","email":"hi@sayo.wtf"},{"name":"odilitime","email":"janesmith@airmail.cc"},{"name":"cjft","email":"cjft@trimboli.io"}],"homepage":"https://github.com/elizaos/elizaos#readme","bugs":{"url":"https://github.com/elizaos/elizaos/issues"},"dist":{"shasum":"f79d3e490534c179bb9526807d61c09e3700080d","tarball":"https://registry.npmjs.org/@elizaos/plugin-bluesky-root/-/plugin-bluesky-root-2.0.0-alpha.1.tgz","fileCount":13,"integrity":"sha512-xj2QiS7Szn5ooNx9+uWkXsnTem9I4Ak5xEVahsVntwq2DWc1pefQqvX+EhxPTzjtV5b7voXip6ghp9C3m8KGHA==","signatures":[{"sig":"MEYCIQCvv+A2Vqh8pitbmoYYNee6QssS3dSJAnkmtJk9h9UpZwIhANWHEJt7zlCcm2nsulc+BvrpiRXqgp8iO8lg4BsZt0KL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180731},"main":"typescript/dist/node/index.node.js","type":"module","types":"typescript/dist/index.d.ts","module":"typescript/dist/node/index.node.js","exports":{".":{"bun":{"types":"./typescript/dist/node/index.d.ts","default":"./typescript/dist/node/index.node.js"},"node":{"types":"./typescript/dist/node/index.d.ts","import":"./typescript/dist/node/index.node.js","default":"./typescript/dist/node/index.node.js"},"types":"./typescript/dist/index.d.ts","browser":{"types":"./typescript/dist/browser/index.d.ts","import":"./typescript/dist/browser/index.browser.js","default":"./typescript/dist/browser/index.browser.js"},"default":"./typescript/dist/node/index.node.js","require":"./typescript/dist/cjs/index.node.cjs"},"./node":{"types":"./typescript/dist/node/index.d.ts","import":"./typescript/dist/node/index.node.js","default":"./typescript/dist/node/index.node.js"},"./rust":{"node":{"import":"./rust/pkg/node/elizaos_plugin_bluesky.js","default":"./rust/pkg/node/elizaos_plugin_bluesky.js"},"browser":{"import":"./rust/pkg/web/elizaos_plugin_bluesky.js","default":"./rust/pkg/web/elizaos_plugin_bluesky.js"},"default":"./rust/pkg/node/elizaos_plugin_bluesky.js"},"./browser":{"types":"./typescript/dist/browser/index.d.ts","import":"./typescript/dist/browser/index.browser.js","default":"./typescript/dist/browser/index.browser.js"},"./package.json":"./package.json"},"gitHead":"05d4ca11d769db8c7f54a722ee24b2ce2b951543","scripts":{"dev":"cd typescript && bun run build.ts --watch","lint":"bunx @biomejs/biome check --write ./typescript","test":"bun run test:ts && bun run test:rust && bun run test:python","build":"npm run build:prompts && bun run build:ts && bun run build:rust && bun run build:python","clean":"rm -rf typescript/dist .turbo typescript/node_modules .turbo-tsconfig.json typescript/tsconfig.tsbuildinfo","format":"bunx @biomejs/biome format --write ./typescript","test:ts":"vitest run typescript/__tests__/","build:ts":"cd typescript && bun run build.ts","lint:rust":"cd rust && cargo clippy --all-targets --fix --allow-dirty --allow-staged -- -D warnings && cargo fmt","test:rust":"test -d rust && cd rust && cargo test || echo 'Rust tests skipped'","test:unit":"vitest run typescript/__tests__/unit/","typecheck":"tsc --noEmit -p typescript/tsconfig.json","build:rust":"test -d rust && cd rust && cargo build --release || echo 'Rust build skipped - no rust directory'","lint:check":"bunx @biomejs/biome check ./typescript","test:watch":"vitest","lint:python":"cd python && ruff check --fix . && ruff format .","test:python":"test -d python && cd python && pytest -p no:anchorpy --asyncio-mode=auto || echo 'Python tests skipped'","build:python":"test -d python && cd python && (python3 -m build 2>/dev/null || pyproject-build) || echo 'Python build skipped - no python directory'","format:check":"bunx @biomejs/biome format ./typescript","build:prompts":"node ../../packages/prompts/scripts/generate-plugin-prompts.js ./prompts ./typescript/generated/prompts --target all","build:rust:wasm":"cd rust && wasm-pack build --target web --out-dir pkg/web && wasm-pack build --target nodejs --out-dir pkg/node","lint:python:fix":"cd python && ruff check --fix . && ruff format .","test:integration":"vitest run typescript/__tests__/integration/","typecheck:python":"cd python && python3 -m mypy elizaos_plugin_bluesky"},"_npmUser":{"name":"shawticus","email":"shawmakesmagic@gmail.com"},"repository":{"url":"git+https://github.com/elizaos/elizaos.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v22.20.0+arm64 (darwin)","agentConfig":{"pluginType":"elizaos:client:1.0.0","pluginParameters":{"BLUESKY_HANDLE":{"type":"string","required":true,"sensitive":false,"description":"The BlueSky handle (username) for the agent account."},"BLUESKY_DRY_RUN":{"type":"boolean","default":false,"required":false,"sensitive":false,"description":"Enables or disables dry run mode when interacting with BlueSky; when true, operations are simulated but not executed."},"BLUESKY_ENABLED":{"type":"boolean","default":true,"required":false,"sensitive":false,"description":"Enables or disables the BlueSky plugin."},"BLUESKY_SERVICE":{"type":"string","default":"https://bsky.social","required":false,"sensitive":false,"description":"The BlueSky service URL (PDS instance)."},"BLUESKY_PASSWORD":{"type":"string","required":true,"sensitive":true,"description":"The app password for authentication with BlueSky."},"BLUESKY_ENABLE_DMS":{"type":"boolean","default":true,"required":false,"sensitive":false,"description":"Enable processing of direct messages via the chat.bsky API."},"BLUESKY_POLL_INTERVAL":{"type":"number","default":60,"required":false,"sensitive":false,"description":"Polling interval in seconds for BlueSky operations such as fetching new notifications."},"BLUESKY_ENABLE_POSTING":{"type":"boolean","default":true,"required":false,"sensitive":false,"description":"Enables or disables the ability to post to BlueSky."},"BLUESKY_ACTION_INTERVAL":{"type":"number","default":120,"required":false,"sensitive":false,"description":"Interval in seconds between action-processing cycles."},"BLUESKY_MAX_POST_LENGTH":{"type":"number","default":300,"required":false,"sensitive":false,"description":"Maximum number of characters allowed in a BlueSky post."},"BLUESKY_POST_IMMEDIATELY":{"type":"boolean","default":false,"required":false,"sensitive":false,"description":"If true, posts are published immediately instead of waiting for a schedule."},"BLUESKY_POST_INTERVAL_MAX":{"type":"number","default":3600,"required":false,"sensitive":false,"description":"Maximum interval in seconds between automated posts."},"BLUESKY_POST_INTERVAL_MIN":{"type":"number","default":1800,"required":false,"sensitive":false,"description":"Minimum interval in seconds between automated posts."},"BLUESKY_MAX_ACTIONS_PROCESSING":{"type":"number","default":5,"required":false,"sensitive":false,"description":"Maximum number of BlueSky actions to process in a single batch."},"BLUESKY_ENABLE_ACTION_PROCESSING":{"type":"boolean","default":true,"required":false,"sensitive":false,"description":"Turns on or off automated action processing for BlueSky events."}}},"description":"BlueSky plugin for elizaOS - A comprehensive AT Protocol client for social interactions on BlueSky.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"zod":"^4.3.5","lru-cache":"^11.1.0","@atproto/api":"^0.13.14","@atproto/xrpc":"^0.6.4","@elizaos/core":"2.0.0-alpha.1","@atproto/syntax":"^0.3.2","@atproto/lexicon":"^0.4.11","@atproto/identity":"^0.4.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.11"},"_npmOperationalInternal":{"tmp":"tmp/plugin-bluesky-root_2.0.0-alpha.1_1769033587568_0.19732431092174063","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-21T22:13:07.515Z","modified":"2026-06-16T05:14:01.532Z","2.0.0-alpha.1":"2026-01-21T22:13:07.746Z"},"bugs":{"url":"https://github.com/elizaos/elizaos/issues"},"homepage":"https://github.com/elizaos/elizaos#readme","repository":{"url":"git+https://github.com/elizaos/elizaos.git","type":"git"},"description":"BlueSky plugin for elizaOS - A comprehensive AT Protocol client for social interactions on BlueSky.","maintainers":[{"email":"shawmakesmagic@gmail.com","name":"shawticus"},{"email":"janesmith@airmail.cc","name":"odilitime"}],"readme":"# @elizaos/plugin-bluesky\n\nBlueSky plugin for elizaOS - A comprehensive AT Protocol client for social interactions on BlueSky.\n\n## Overview\n\nThis plugin provides BlueSky integration for elizaOS agents, enabling:\n\n- **Posting**: Create, delete, like, and repost posts\n- **Direct Messaging**: Send and receive direct messages\n- **Notifications**: Monitor and respond to mentions, follows, likes, and reposts\n- **Profile Management**: Access user profiles and timelines\n- **Automated Posting**: Schedule and automate post creation\n\n## Multi-Language Support\n\nThis plugin is implemented in three languages with feature parity:\n\n| Language   | Directory     | Package Name              |\n| ---------- | ------------- | ------------------------- |\n| TypeScript | `typescript/` | `@elizaos/plugin-bluesky` |\n| Python     | `python/`     | `elizaos-plugin-bluesky`  |\n| Rust       | `rust/`       | `elizaos-plugin-bluesky`  |\n\n## Installation\n\n### TypeScript/JavaScript\n\n```bash\nnpm install @elizaos/plugin-bluesky\n# or\nbun add @elizaos/plugin-bluesky\n```\n\n### Python\n\n```bash\npip install elizaos-plugin-bluesky\n```\n\n### Rust\n\nAdd to your `Cargo.toml`:\n\n```toml\n[dependencies]\nelizaos-plugin-bluesky = \"1.0.0\"\n```\n\n## Configuration\n\n### Environment Variables\n\nRequired:\n\n- `BLUESKY_HANDLE`: Your BlueSky handle (e.g., `user.bsky.social`)\n- `BLUESKY_PASSWORD`: Your app password (generate at https://bsky.app/settings/app-passwords)\n\nOptional:\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `BLUESKY_SERVICE` | BlueSky service URL | `https://bsky.social` |\n| `BLUESKY_DRY_RUN` | Simulate operations without executing | `false` |\n| `BLUESKY_POLL_INTERVAL` | Notification polling interval (seconds) | `60` |\n| `BLUESKY_ENABLE_POSTING` | Enable automated posting | `true` |\n| `BLUESKY_ENABLE_DMS` | Enable direct messaging | `true` |\n| `BLUESKY_POST_INTERVAL_MIN` | Minimum post interval (seconds) | `1800` |\n| `BLUESKY_POST_INTERVAL_MAX` | Maximum post interval (seconds) | `3600` |\n| `BLUESKY_ENABLE_ACTION_PROCESSING` | Enable action processing | `true` |\n| `BLUESKY_ACTION_INTERVAL` | Action processing interval (seconds) | `120` |\n| `BLUESKY_POST_IMMEDIATELY` | Post immediately on startup | `false` |\n| `BLUESKY_MAX_ACTIONS_PROCESSING` | Max actions per batch | `5` |\n\n## Quick Start\n\n### TypeScript\n\n```typescript\nimport { blueSkyPlugin } from \"@elizaos/plugin-bluesky\";\n\n// Add to your elizaOS agent\nconst agent = createAgent({\n  plugins: [blueSkyPlugin],\n});\n\n// Or use the client directly\nimport { BlueSkyClient, validateBlueSkyConfig } from \"@elizaos/plugin-bluesky\";\n\nconst client = new BlueSkyClient({\n  service: \"https://bsky.social\",\n  handle: \"your-handle.bsky.social\",\n  password: \"your-app-password\",\n});\n\nawait client.authenticate();\nconst post = await client.sendPost({ content: { text: \"Hello BlueSky!\" } });\n```\n\n### Python\n\n```python\nfrom elizaos_plugin_bluesky import BlueSkyClient, BlueSkyConfig\n\nconfig = BlueSkyConfig.from_env()\nasync with BlueSkyClient(config) as client:\n    await client.authenticate()\n\n    from elizaos_plugin_bluesky import CreatePostRequest, CreatePostContent\n    request = CreatePostRequest(content=CreatePostContent(text=\"Hello from Python!\"))\n    post = await client.send_post(request)\n```\n\n### Rust\n\n```rust\nuse elizaos_plugin_bluesky::{BlueSkyClient, BlueSkyConfig, CreatePostRequest};\n\nlet config = BlueSkyConfig::from_env()?;\nlet client = BlueSkyClient::new(config)?;\n\nclient.authenticate().await?;\nlet post = client.send_post(CreatePostRequest::new(\"Hello from Rust!\")).await?;\n```\n\n## Features\n\n### Posting\n\n```typescript\n// Create a post\nconst post = await client.sendPost({\n  content: { text: \"Hello BlueSky!\" },\n});\n\n// Reply to a post\nconst reply = await client.sendPost({\n  content: { text: \"This is a reply!\" },\n  replyTo: { uri: post.uri, cid: post.cid },\n});\n\n// Like a post\nawait client.likePost(post.uri, post.cid);\n\n// Repost\nawait client.repost(post.uri, post.cid);\n\n// Delete a post\nawait client.deletePost(post.uri);\n```\n\n### Direct Messages\n\n```typescript\n// Get conversations\nconst { conversations } = await client.getConversations();\n\n// Get messages from a conversation\nconst { messages } = await client.getMessages(convoId);\n\n// Send a message\nconst message = await client.sendMessage({\n  convoId: \"conversation-id\",\n  message: { text: \"Hello!\" },\n});\n```\n\n### Notifications\n\n```typescript\n// Get notifications\nconst { notifications } = await client.getNotifications(50);\n\n// Mark as read\nawait client.updateSeenNotifications();\n```\n\n### Timeline\n\n```typescript\n// Get timeline\nconst timeline = await client.getTimeline({ limit: 50 });\n\nfor (const item of timeline.feed) {\n  console.log(`@${item.post.author.handle}: ${item.post.record.text}`);\n}\n```\n\n### Profiles\n\n```typescript\n// Get a profile\nconst profile = await client.getProfile(\"user.bsky.social\");\nconsole.log(`${profile.displayName} - ${profile.followersCount} followers`);\n```\n\n## Events\n\nThe plugin emits the following events for elizaOS integration:\n\n| Event                      | Description                     |\n| -------------------------- | ------------------------------- |\n| `bluesky.mention_received` | Agent was mentioned in a post   |\n| `bluesky.follow_received`  | Agent received a new follower   |\n| `bluesky.like_received`    | Agent's post was liked          |\n| `bluesky.repost_received`  | Agent's post was reposted       |\n| `bluesky.quote_received`   | Agent's post was quoted         |\n| `bluesky.should_respond`   | Trigger for response generation |\n| `bluesky.create_post`      | Trigger for automated posting   |\n\n## Development\n\n### TypeScript\n\n```bash\ncd typescript\nbun install\nbun run build\nnpx vitest\n```\n\n### Python\n\n```bash\ncd python\npip install -e \".[dev]\"\npytest\nmypy elizaos_plugin_bluesky\nruff check .\n```\n\n### Rust\n\n```bash\ncd rust\ncargo build\ncargo test\ncargo clippy\n```\n\n## Architecture\n\n```\nplugin-bluesky/\n├── typescript/           # TypeScript implementation\n│   ├── index.ts         # Main plugin export\n│   ├── client.ts        # BlueSky API client\n│   ├── types/           # Type definitions\n│   ├── services/        # Service implementations\n│   ├── managers/        # Agent manager\n│   └── utils/           # Configuration utilities\n├── python/              # Python implementation\n│   ├── elizaos_plugin_bluesky/\n│   │   ├── __init__.py  # Package exports\n│   │   ├── client.py    # BlueSky API client\n│   │   ├── config.py    # Configuration\n│   │   ├── types.py     # Type definitions\n│   │   └── errors.py    # Error types\n│   └── tests/           # Test suite\n├── rust/                # Rust implementation\n│   ├── src/\n│   │   ├── lib.rs       # Library root\n│   │   ├── client.rs    # BlueSky API client\n│   │   ├── config.rs    # Configuration\n│   │   ├── types.rs     # Type definitions\n│   │   └── error.rs     # Error types\n│   └── tests/           # Integration tests\n└── package.json         # Root package configuration\n```\n\n## License\n\nMIT License - see [LICENSE](./LICENSE) for details.\n\n## Contributing\n\nContributions are welcome! Please ensure your changes maintain feature parity across all three language implementations.\n","readmeFilename":"README.md"}