ASSA: the antisocial social agent extension
ASSA允许您通过丰富的UI组件获取时间线摘要,并与X(以前的推特)上的人进行对话。专为 鹅 以及其他MCP兼容的AI代理。
什么是ASSA?
ASSA通过将您的活动从算法驱动的网站和应用程序转移到您的个人代理中来重新利用您的社交生活,在那里您可以控制流量并决定如何参与。享受:
- 摘要 在不打开任何社交应用程序的情况下告诉你发生了什么。让您的代理过滤垃圾邮件、广告和仇恨言论!
- 对话 在您的代理界面中,无需打开X应用程序或网站。
特性
- 🔐 通过Arcade进行安全授权:通过与代理共享密码(或意外提交密码,哎呀!)来访问您的社交帐户
- 📊 交互界面:与化身、文本一起显示的提及。马上回答!
- 🔁 你掌控全局:未经您的明确批准,不得发布任何内容
安装
先决条件
- 鹅 (或另一种MCP兼容代理)
- Arcade.dev API密钥
设置
- 获取您的Arcade API密钥 在 arcade.dev
- 克隆并安装:
git clone https://github.com/nearestnabors/assa
cd assa
bun install
bun run build- 添加到Goose应用程序(推荐使用——Goose CLI无法显示交互式UI!)
- 在Goose的侧栏中,转到 扩展
- 选择“+添加自定义扩展名”
- 添加命令:
node PATH TO ASSA FOLDER/dist/index.js - 添加环境变量
ARCADE_USER_ID(您注册Arcade时使用的电子邮件)和ARCADE_API_KEY(得到你的 [此处为Arcade API密钥]() - 选择“添加扩展名”
如何使用
检查X活动
Check my X mentions from the last 24 hours获取时间线摘要
Show me a digest of my X timeline from the past 24 hours注: 时间线摘要要求Chrome运行远程调试。看 时间线摘要设置 在......下面
发布推文
Post a tweet: "Just shipped a new feature! 🚀"回复某人
Reply to @anthropic_devs saying I'll share slides after the talk时间线摘要设置
时间线摘要功能使用您现有的浏览器会话和Playwright访问您的“关注”时间线。这是免费的(没有API费用),并使用您的登录状态。(API会更健壮,但X只向那些能够支付高昂费用的工业开发人员提供时间线API功能。因此,我们是爱好者。)
先决条件
- 谷歌浏览器 安装
- 登录到X 在Chrome浏览器中
使用远程调试启动Chrome
在使用时间线摘要之前,请使用远程调试端口启动Chrome:
雨衣:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222窗户:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222Linux:
google-chrome --remote-debugging-port=9222然后确保您已在该浏览器窗口中登录到X。(我在启动时保持一个打开并最小化。)
鹅食谱
ASSA包括一个时间表摘要的配方:
| 配方 | 说明 |
|---|---|
x-news-digest.yaml | 以下时间线的每日摘要(需要带远程调试的Chrome) |
导入配方
选项1:生成深度链接
goose recipe deeplink recipes/x-news-digest.yaml这将输出a goose://recipe?config=... URL。将其粘贴到浏览器中以导入Goose Desktop。
选项2:导入Goose桌面
- 打开 鹅桌面
- 点击 食谱 在侧边栏中
- 点击 导入配方 或浏览文件
- 选择
recipes/x-news-digest.yaml从 配方文件 输入框
选项3:通过CLI运行
goose run --recipe recipes/x-news-digest.yaml安排食谱
进口后,在 食谱 屏幕:
- 点击食谱旁边的时钟图标
- 在中选择频率和时间 添加日程 模态
- 点击 保存
注: 需要运行Chrome --remote-debugging-port=9222.
工具
| 工具 | 说明 |
|---|---|
x_auth_status | 检查身份验证,必要时显示连接按钮 |
x_conversations | 将未回复的提及显示为对话收件箱 |
x_dismiss_conversation | 取消对话(在新活动中重新出现) |
x_draft_tweet | 创建带有预览的草稿 |
x_post_tweet | 批准后的职位 |
x_timeline_digest | 提取并总结您的以下时间线(过去24小时) |
x_show_tweet | 将一条推文显示为带有回复选项的富卡 |
发展
# Run in development mode (auto-reload)
bun dev
# Type check
bun typecheck
# Lint check
bun check
# Run tests
bun test
# Run tests in watch mode
bun test:watch
# Build for production
bun run build测试
ASSA使用 Bun的内置测试运行器 具有与Jest兼容的语法。
运行测试
# Run all tests
bun test
# Run tests in watch mode (re-runs on file changes)
bun test:watch
# Run a specific test file
bun test src/__tests__/utils/time.test.ts
# Run tests matching a pattern
bun test --grep "snowflake"测试结构
测试位于 src/__tests__/ 镜像源结构:
src/
├── __tests__/
│ ├── state/
│ │ └── manager.test.ts # State management tests
│ ├── tools/
│ │ └── dismiss-conversation.test.ts
│ └── utils/
│ └── time.test.ts # Time utility tests
├── state/
│ └── manager.ts
├── tools/
│ └── ...
└── utils/
└── time.ts写作测试
创建 .test.ts 文件在适当的 __tests__ 子目录:
import { describe, expect, test } from "bun:test";
import { myFunction } from "../../utils/my-module.js";
describe("myFunction", () => {
test("does something expected", () => {
const result = myFunction("input");
expect(result).toBe("expected output");
});
});嘲讽
使用 mock.module() 模拟Node.js模块:
import { mock } from "bun:test";
// Mock before importing the module that uses it
mock.module("node:os", () => ({
homedir: () => "/tmp/test-home",
}));
// Now import your module
import { myFunction } from "../../state/manager.js";测试隔离
在测试有状态模块时,使用唯一的ID并在测试之间进行清理:
import { beforeEach } from "bun:test";
let testCounter = 0;
function uniqueId(prefix: string): string {
return `${prefix}_${Date.now()}_${++testCounter}`;
}
beforeEach(() => {
clearState(); // Reset shared state
});获取Arcade API密钥
- 首选 arcade.dev
- 创建账户
- 导航到API键
- 创建新密钥
- 将其添加到您的
.env文件
建筑
Goose (MCP Client)
│
│ MCP Protocol
▼
ASSA MCP Server
│
│ HTTPS
▼
Arcade.dev
│
│ OAuth + API
▼
X路线图
完成
- \[x\] 迁移到React组件
- \[x\] 自定义CSS设计系统(9个调色板,语义标记)
- \[x\] 通过Playwright浏览器自动化实现时间线摘要
- \[x\] 鹅定期消化的食谱
后续步骤
- \[\]缩小“回复UI”:
- \[\]在每张卡片的左下角添加小的“取消”和“回复”图标 - \[\]点击“回复”将图标替换为输入区域和回复按钮 - \[\]单击外部关闭UI并带回图标
未来
- \[\]添加
X.GetMutedUsers到Arcade过滤对话中的静音帐户 - \[\]在Arcade中添加媒体扩展,以在推文中显示图像
- \[\]VIP帐户功能(跟踪特定用户)
- \[\]如果推文是回复,请在评论上方以风格化的引用显示原始推文
- \[\]如果某条推文引用了另一条推文,请在评论下方显示引用的推文
已知限制
- 无DM支持 --Arcade的X集成不包括DM访问
- 7天限制 --X搜索只能追溯到7天前
学分
使用:
