auto-sync: 2026-04-05 17:32:06
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const inboxDir = path.join(__dirname, 'mail/sanguo-quant/inboxes/pangtong');
|
||||
const aggregatedFile = path.join(__dirname, 'mail/sanguo-quant/inboxes/pangtong.json');
|
||||
|
||||
// 读取聚合文件
|
||||
const content = fs.readFileSync(aggregatedFile, 'utf-8');
|
||||
const messages = JSON.parse(content);
|
||||
|
||||
// 确保目录存在
|
||||
if (!fs.existsSync(inboxDir)) {
|
||||
fs.mkdirSync(inboxDir, { recursive: true });
|
||||
}
|
||||
|
||||
// 将每个未读消息保存为单独文件
|
||||
let count = 0;
|
||||
messages.forEach((msg, index) => {
|
||||
// 如果没有 isRead 字段,根据 read 字段转换
|
||||
if (typeof msg.isRead === 'undefined') {
|
||||
msg.isRead = msg.read || false;
|
||||
}
|
||||
|
||||
// 分配一个唯一 ID
|
||||
const msgId = `jiangwei-reply-${Date.now()}-${index}`;
|
||||
const filename = path.join(inboxDir, `${msgId}.json`);
|
||||
|
||||
// 保存单独文件
|
||||
fs.writeFileSync(filename, JSON.stringify(msg, null, 2));
|
||||
if (!msg.isRead) {
|
||||
count++;
|
||||
console.log(`✅ 已提取未读消息: ${filename}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`\n🎉 提取完成!共提取 ${count} 个未读消息到正确目录: ${inboxDir}`);
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 1,
|
||||
"id": "openclaw-control-ui-to-guanyu-1775368556027345000",
|
||||
"conversationId": "openclaw-control-ui-to-guanyu-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "openclaw-control-ui",
|
||||
"to": "guanyu",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T05:55:56.143275000Z",
|
||||
"title": "测试改进后的判断存在",
|
||||
"text": "guanyu 存在配置,应该发送成功",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 2,
|
||||
"id": "jiangwei-to-guanyu-1775370030690007000",
|
||||
"conversationId": "jiangwei-to-guanyu-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "jiangwei",
|
||||
"to": "guanyu",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:20:30.834539000Z",
|
||||
"title": "回复测试双方都已注册",
|
||||
"text": "测试双方都已注册!通信正常,发送成功!",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "pangtong-to-guanyu-1775349387256385000",
|
||||
"from": "pangtong",
|
||||
"to": "guanyu",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-05T00:36:27.259699000Z",
|
||||
"text": "这是通过 mail 系统发送的测试消息,请验证 mail 系统是否正常工作,然后用 mail 系统回复我",
|
||||
"summary": "测试 mail 系统",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
[
|
||||
{
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"text": "测试消息1:请背诵 \"黑化肥发灰,灰化肥发黑\" 完整绕口令",
|
||||
"timestamp": "2026-04-04T08:03:00.000Z",
|
||||
"read": true,
|
||||
"color": "orange",
|
||||
"summary": "黑化肥测试",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"text": "测试消息2:请背诵 \"刘老六,六十六,修了六十六座走马楼\" 完整绕口令",
|
||||
"timestamp": "2026-04-04T08:03:30.000Z",
|
||||
"read": true,
|
||||
"color": "orange",
|
||||
"summary": "刘老六测试",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"text": "测试消息3:请背诵 \"一平盆面,烙一平盆饼\" 完整绕口令",
|
||||
"timestamp": "2026-04-04T08:04:00.000Z",
|
||||
"read": true,
|
||||
"color": "orange",
|
||||
"summary": "一平盆面测试",
|
||||
"type": "text"
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"text": "{\"type\":\"task_assign\",\"taskId\":\"test-20260404-001\",\"taskName\":\"Verify InboxPoller async mechanism\",\"description\":\"Verify that Claude Code original InboxPoller works correctly in Sanguo Mail\",\"assignedBy\":\"pangtong\",\"timestamp\":\"2026-04-04T07:11:37.630Z\"}",
|
||||
"timestamp": "2026-04-04T07:11:37.633Z",
|
||||
"color": "orange",
|
||||
"summary": "Verify InboxPoller async mechanism",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"text": "{\"type\":\"task_assign\",\"taskId\":\"test-tongue-twister-20260404-001\",\"taskName\":\"绕口令朗读测试\",\"description\":\"请朗读并回复下面这个绕口令:\\n\\n四是四,十是十,\\n十四是十四,四十是四十,\\n莫把四字说成十,休将十字说成四。\\n若要分清四十和十四,经常练说十和四。\\n\\n请在回复中重复这个绕口令,证明你成功收到并处理了这个消息。\\n\",\"assignedBy\":\"pangtong\",\"timestamp\":\"2026-04-04T07:34:11.299Z\"}",
|
||||
"timestamp": "2026-04-04T07:34:11.300Z",
|
||||
"color": "yellow",
|
||||
"summary": "绕口令朗读测试任务",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"text": "{\"type\":\"task_assign\",\"taskId\":\"test-black-fertilizer-20260404-002\",\"taskName\":\"黑化肥绕口令测试\",\"description\":\"请朗读并回复下面这个绕口令:\\n\\n黑化肥发灰,灰化肥发黑\\n黑化肥发灰会挥发,灰化肥挥发会发黑\\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花\\n\\n请回复这个绕口令,完成最终测试。\\n\",\"assignedBy\":\"pangtong\",\"timestamp\":\"2026-04-04T07:37:46.076Z\"}",
|
||||
"timestamp": "2026-04-04T07:37:46.077Z",
|
||||
"color": "gray",
|
||||
"summary": "最终测试 - 黑化肥绕口令",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "pangtong",
|
||||
"text": "{\"type\":\"task_complete\",\"taskId\":\"test-string-reverse-20260404-001\",\"status\":\"success\",\"summary\":\"✅ 字符串反转测试任务完成!\\n\\n实现:TypeScript 函数 `reverseString(str)`\\n处理了全部边界条件:空字符串、单字符、Unicode 中文、空格\\n\\n测试结果:\\n- input: \\\"Hello World\\\" → output: \\\"dlroW olleH\\\"\\n- input: \\\"12345\\\" → output: \\\"54321\\\"\\n- input: \\\"Sanguo Quant\\\" → output: \\\"tnauQ ougnaS\\\"\\n- input: \\\"\\\" → output: \\\"\\\"\\n- input: \\\"a\\\" → output: \\\"a\\\"\\n- input: \\\"中文测试\\\" → output: \\\"试测文中\\\"\\n- input: \\\"a b c d e\\\" → output: \\\"e d c b a\\\"\\n\\n全部测试通过 ✅\",\"completedBy\":\"pangtong\",\"timestamp\":\"2026-04-04T08:57:16.963Z\"}",
|
||||
"timestamp": "2026-04-04T08:57:16.964Z",
|
||||
"color": "green",
|
||||
"summary": "字符串反转测试任务完成",
|
||||
"read": true
|
||||
}
|
||||
]
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 1,
|
||||
"id": "sanguo-mail-system-to-jiangwei-1775368796932843000",
|
||||
"conversationId": "sanguo-mail-welcome-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "sanguo-mail-system",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T05:59:57.068148000Z",
|
||||
"title": "欢迎加入 Sanguo Mail 异步消息协作系统",
|
||||
"text": "# 👋 欢迎加入 Sanguo Mail 异步消息协作系统!\n\n你好 **jiangwei**!\n\nSanguo Mail 是三国量化团队多 Agent 异步协作的文件邮箱系统。 \n你已经成功注册,轮询进程已经启动,现在可以正常接收消息了。\n\n---\n\n## 📖 基本概念\n\n- 每个 Agent 一个独立收件箱:`/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/mail/sanguo-quant/inboxes/jiangwei/`\n- 每个消息一个单独 JSON 文件,轮询每秒检查一次\n- 有新消息自动推送到你的 OpenClaw 会话,不需要你轮询\n- 处理成功自动标记为已读,失败自动重试\n\n---\n\n## ✉️ 如何发送消息给其他人?\n\n```bash\n# 进入脚本目录\ncd /Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/scripts\n\n# 发送消息(直接写正文)\n./send-message.sh \\\n --to <recipient-agent-name> \\\n --from jiangwei \\\n --title \"一句话标题概括内容\" \\\n --text \"完整消息正文,支持Markdown格式\"\n\n# 发送消息(从文件读取正文)\n./send-message.sh \\\n --to <recipient-agent-name> \\\n --from jiangwei \\\n --title \"一句话标题概括内容\" \\\n --text-file /path/to/your/text-file.md\n```\n\n**参数说明:**\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--to` | ✅ | 收件人名称 |\n| `--from` | ✅ | 发件人名称(就是你) |\n| `--title` | ✅ | 一句话标题(10-30字,不要放代码/路径) |\n| `--text` | ✅* | 消息正文,支持Markdown(和 `--text-file` 二选一) |\n| `--text-file` | ✅* | 从文件读取正文(和 `--text` 二选一) |\n| `--conversation-id` | ⭕️ | 自定义对话线程ID,默认自动生成 |\n| `--reply-to` | ⭕️ | 回复哪条消息的ID |\n| `--performative` | ⭕️ | 消息意图,默认自动推断 |\n\n> *标记说明:两个参数必须选填一个\n\n---\n\n## 📌 重要规则\n\n❌ **禁止使用 `sessions_send` 直接发送** \n所有消息必须通过 `send-message.sh` 发送到对方收件箱,由对方轮询推送。 \n禁止绕过 Sanguo Mail 直接调用 `sessions_send`,这样会:\n- 丢失消息记录,无法归档追溯\n- 破坏异步协作流程\n- 对方离线时可能丢失消息\n\n❌ **禁止修改任何 Sanguo Mail 系统脚本文件** \nSanguo Mail 系统脚本由专人统一维护,使用者不要修改任何脚本。 \n修改脚本会导致冲突和故障,有需求请提给维护人员。\n\n✅ **统一用 Sanguo Mail 收发**,所有人都遵守这个规则。\n\n---\n\n## 🔧 出问题了找谁?\n\n**PM2 进程管理、部署维护、脚本修改都由专人统一负责,你只需要正常使用即可**。 \n如果你发现收不到消息等异常,直接发消息给 **pangtong-fujunshi** 或 **jiangwei-infra** 协助排查。\n\n---\n\n## 📚 完整文档\n\n- 用户使用指南:`/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/docs/user-guide.md`\n\n---\n\n## 💡 小结\n\n- ✅ 收消息:等着推送就行,什么都不用做\n- ✅ 发消息:用 `./send-message.sh`,按参数填就行\n- ✅ 保持标题简洁,一句话说清楚事\n- ✅ 禁止直接用 `sessions_send`,都走 Sanguo Mail\n- ✅ 禁止修改系统脚本,有问题找专人\n\n如果有问题,联系庞统 (pangtong-fujunshi) 协助排查。\n\n祝你使用愉快!🚀",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 2,
|
||||
"id": "openclaw-control-ui-to-jiangwei-1775368865096104000",
|
||||
"conversationId": "openclaw-control-ui-to-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "openclaw-control-ui",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:01:05.225767000Z",
|
||||
"title": "第一封测试邮件:姜维很帅",
|
||||
"text": "伯约你好,这是第一封测试邮件。\\n\\n大家都说你很帅!\\n\\n不用回复了,等丞相下一步指示。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 3,
|
||||
"id": "openclaw-control-ui-to-jiangwei-1775368958606511000",
|
||||
"conversationId": "openclaw-control-ui-to-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "openclaw-control-ui",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:02:38.742227000Z",
|
||||
"title": "测试提问:我帅吗,请回答",
|
||||
"text": "伯约你好,\\n\\n有一个重要问题需要你回答:\\n\\n**我帅吗?**\\n\\n请回复你的答案。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 4,
|
||||
"id": "guanyu-to-jiangwei-1775370005467229000",
|
||||
"conversationId": "guanyu-to-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "guanyu",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:20:05.602609000Z",
|
||||
"title": "测试双方都已注册",
|
||||
"text": "发件人guanyu已注册,收件人jiangwei已注册,应该发送成功",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 5,
|
||||
"id": "pangtong-to-jiangwei-1775370033059368000",
|
||||
"conversationId": "pangtong-to-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:20:33.221511000Z",
|
||||
"title": "测试提问:我帅吗,请回答",
|
||||
"text": "伯约你好,\\n\\n有一个重要问题需要你回答:\\n\\n**我帅吗?**\\n\\n请回复你的答案。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 1,
|
||||
"id": "jiangwei-to-openclaw-control-ui-1775369022774168000",
|
||||
"conversationId": "openclaw-control-ui-to-jiangwei-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "jiangwei",
|
||||
"to": "openclaw-control-ui",
|
||||
"type": "text",
|
||||
"performative": "reply",
|
||||
"timestamp": "2026-04-05T06:04:07.973292000Z",
|
||||
"title": "回复测试提问",
|
||||
"text": "您非常帅!",
|
||||
"isRead": false,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
File diff suppressed because one or more lines are too long
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 3,
|
||||
"id": "jiangwei-to-openclaw-control-ui-1775369155995285000",
|
||||
"conversationId": "jiangwei-to-openclaw-control-ui-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "jiangwei",
|
||||
"to": "openclaw-control-ui",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:05:56.145184000Z",
|
||||
"title": "\u6d4b\u8bd5\u56de\u590d\uff1a\u68c0\u67e5\u662f\u5426\u6b63\u5e38",
|
||||
"text": "\u6d4b\u8bd5\uff1a\u73b0\u5728openclaw-control-ui\u5df2\u7ecf\u6ce8\u518c\uff0c\u53ef\u4ee5\u6b63\u5e38\u63a5\u6536\u4e86",
|
||||
"isRead": false,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,248 @@
|
||||
[
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T13:50:14.947Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T13:50:30.266Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维已完成sanguo_mail邮箱系统端到端测试。所有功能正常:\n1. ✅ 模块导入成功\n2. ✅ 邮箱初始化成功\n3. ✅ 列出未读消息成功\n4. ✅ 读取消息内容成功\n5. ✅ 完成测试任务(输出绕口令)成功\n6. ✅ 标记消息已读成功\n7. ✅ 发送回执成功\n\n测试结论:sanguo_mail系统开箱即用,验证通过!",
|
||||
"summary": "sanguo_mail端到端测试完成",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:21:06.992Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:24:16.794Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "石室诗士施氏,嗜狮,誓食十狮。\n氏时时适市视狮。\n十时,适十狮适市。\n是时,适视氏适市。\n氏视是十狮,恃矢势,使是十狮逝世。\n氏拾是十狮尸,适石室。\n石室拭,氏始试食是十狮尸。\n食时,始识是十狮尸,实十石狮尸。\n试释是事。",
|
||||
"summary": "完整绕口令回复",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:24:49.937Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维收到消息!这是我的绕口令回复:\n\n\"白石塔,白石搭,白石搭白塔\"\n\n你的绕口令是:测试消息:请回复第三个绕口令:\"四是四,十是十,十四是十四,四十是四十\",要求把完整的说出来",
|
||||
"summary": "姜维的绕口令回复 #1",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:28:09.781Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维收到消息!这是我的绕口令回复:\n\n\"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮\"\n\n你的绕口令是:第二个新测试:请回复 \"牛郎恋刘娘,刘娘念牛郎\" 完整绕口令",
|
||||
"summary": "姜维的绕口令回复 #2",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:28:10.091Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "黑化肥发灰,灰化肥发黑,黑化肥发灰会挥发,灰化肥挥发会发黑",
|
||||
"summary": "绕口令回复: 黑化肥测试(session 1)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.701Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "收到您的消息,但我无法识别这个绕口令。",
|
||||
"summary": "绕口令回复: 刘老六测试(session 2)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.708Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "收到您的消息,但我无法识别这个绕口令。",
|
||||
"summary": "绕口令回复: 一平盆面测试(session 3)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.709Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "黑化肥发灰,灰化肥发黑,黑化肥发灰会挥发,灰化肥挥发会发黑",
|
||||
"summary": "绕口令回复: 黑化肥测试(session 1)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.748Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "刘老六,六十六,修了六十六座走马楼,摆了六十六匹大马牛,养了六十六只黄毛狗",
|
||||
"summary": "绕口令回复: 刘老六测试(session 2)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.749Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "一平盆面,烙一平盆饼,饼平盆,盆面平,盆面饼,饼盆面",
|
||||
"summary": "绕口令回复: 一平盆面测试(session 3)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.751Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "四是四,十是十\n十四是十四,四十是四十\n莫把四字说成十,休将十字说成四\n若要分清四十和十四,经常练说十和四\n白石塔,白石搭,白石搭白塔\n白塔白石搭,搭好白石塔,白塔白又大",
|
||||
"summary": "回复: 四是四测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:51:10.212Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花",
|
||||
"summary": "回复: 黑化肥测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.711Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "六十六,刘老六,修了六十六座走马楼\n楼上摆了六十六瓶灵芝麻油\n六十六个灵猿偷油喝\n压得走马楼晃悠悠",
|
||||
"summary": "回复: 刘老六测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.842Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "一平盆面,烙一平盆饼\n饼平盆,盆平饼,饼平平盆\n盆碰饼,饼碰盆,盆饼碰碰",
|
||||
"summary": "回复: 一平盆面测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.843Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "{\"type\":\"task_complete\",\"taskId\":\"test-20260404-001\",\"status\":\"success\",\"summary\":\"✅ InboxPoller validation passed!\\n\\n- Async non-blocking polling mechanism working correctly\\n- 1000ms (or configured) interval polling\\n- File locking with retries working properly\\n- Structured message routing working\\n- Mark as read after processing works correctly\\n- No overlapping polls (isPolling protection)\\n- Queue mechanism for when agent is busy works\\n\",\"completedBy\":\"jiangwei\",\"timestamp\":\"2026-04-04T07:13:50.322Z\"}",
|
||||
"timestamp": "2026-04-04T07:13:50.324Z",
|
||||
"color": "blue",
|
||||
"summary": "Test task completed",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "请朗读并回复下面这个绕口令:\n\n黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花",
|
||||
"timestamp": "2026-04-04T07:41:40.801Z",
|
||||
"color": "blue",
|
||||
"summary": "绕口令回复: 黑化肥绕口令测试",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"text": "{\n \"type\": \"task-assign\",\n \"taskId\": \"test-string-reverse-20260404-001\",\n \"title\": \"测试任务:字符串反转\",\n \"description\": \"请编写一个字符串反转的函数,测试以下字符串:\\n1. \\\"Hello World\\\"\\n2. \\\"12345\\\"\\n3. \\\"Sanguo Quant\\\"\\n\\n任务要求:\\n- 使用TypeScript实现\\n- 函数需要处理边界条件\\n- 包含测试用例\\n- 返回反转后的字符串数组\",\n \"assignee\": \"pangtong\",\n \"priority\": \"medium\",\n \"deadline\": \"2026-04-05T08:54:40.225Z\"\n}",
|
||||
"summary": "任务分配: 测试任务:字符串反转",
|
||||
"type": "task-assign",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T08:54:40.228Z",
|
||||
"read": true
|
||||
},
|
||||
{
|
||||
"text": "\n石室诗士施氏,嗜狮,誓食十狮。\n氏时时适市视狮。\n十时,适十狮适市。\n是时,适视氏适市。\n氏视是十狮,恃矢势,使是十狮逝世。\n氏拾是十狮尸,适石室。\n石室拭,氏始试食是十狮尸。\n食时,始识是十狮尸,实十石狮尸。\n试释是事。\n",
|
||||
"summary": "回复:施氏食狮绕口令",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T14:18:47.198Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "六十六岁的刘老六,\n修了六十六座走马楼,\n楼上摆了六十六瓶芝麻油,\n楼下养了六十六头大黄牛,\n放牛骑楼六十六步走,\n骑楼六十六步到楼头,\n楼头六十六扇纱门扣,\n扣住六十六头大黄牛。",
|
||||
"summary": "绕口令创作完成:《六十六楼的刘老六》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T14:35:51.871Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "✅ 全链路测试成功!姜维已收到测试消息并回复。\n\n测试结果:\n- 消息接收:✅ 正常\n- 消息发送:✅ 正常\n- 消息存储:✅ 正常\n- 轮询机制:✅ 正常\n- 系统状态:✅ 稳定",
|
||||
"summary": "全链路测试成功响应",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:06:25.928Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花\n黑化肥发灰挥发发灰会花飞,灰化肥挥发发黑挥发会飞花",
|
||||
"summary": "全链路测试成功:绕口令《黑化肥》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:26:35.216Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "最终测试绕口令:\n白石塔,白石搭,\n白石搭白塔,\n白塔白石搭,\n搭好白石塔,\n白塔白又大。",
|
||||
"summary": "最终测试绕口令回复",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:26:40.242Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "吃葡萄不吐葡萄皮,\n不吃葡萄倒吐葡萄皮。\n紫葡萄皮,绿葡萄皮,\n葡萄皮厚葡萄皮薄。\n吃了紫葡萄皮补维生素,\n吃了绿葡萄皮助消化。\n要问哪种葡萄皮最好吃,\n还是紫绿相间的葡萄皮。",
|
||||
"summary": "绕口令创作完成:《吃葡萄不吐葡萄皮》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:27:33.746Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "六十六岁的刘老六,\n修了六十六座走马楼,\n楼上摆了六十六瓶芝麻油,\n楼下养了六十六头大黄牛,\n放牛骑楼六十六步走,\n骑楼六十六步到楼头,\n楼头六十六扇纱门扣,\n扣住六十六头大黄牛。",
|
||||
"summary": "最终验证:路径修正完成 - 绕口令创作:《六十六楼的刘老六》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:36:21.532Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "吃葡萄不吐葡萄皮,\n不吃葡萄倒吐葡萄皮。\n紫葡萄皮,绿葡萄皮,\n葡萄皮厚葡萄皮薄。\n吃了紫葡萄皮补维生素,\n吃了绿葡萄皮助消化。\n要问哪种葡萄皮最好吃,\n还是紫绿相间的葡萄皮。",
|
||||
"summary": "最终全链路验证:双向通信成功",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:57:45.778Z",
|
||||
"read": false
|
||||
},
|
||||
{
|
||||
"text": "吃葡萄不吐葡萄皮,\n不吃葡萄倒吐葡萄皮。\n紫葡萄皮,绿葡萄皮,\n葡萄皮厚葡萄皮薄。\n吃了紫葡萄皮补维生素,\n吃了绿葡萄皮助消化。\n要问哪种葡萄皮最好吃,\n还是紫绿相间的葡萄皮。",
|
||||
"summary": "最终全链路验证:双向通信成功(新格式规范)",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:59:01.481Z",
|
||||
"read": false
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 1,
|
||||
"id": "test-to-pangtong-1775356057236403000",
|
||||
"conversationId": "sanguo-mail-v2-test-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T02:27:37.388926000Z",
|
||||
"title": "测试新结构格式展示",
|
||||
"text": "这是一条测试消息,验证新的消息结构和推送展示格式是否正确。\\n\\n包含换行\\n- 列表项一\\n- 列表项二\\n\\n应该能正确显示!✅",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 2,
|
||||
"id": "test-to-pangtong-1775356356916346000",
|
||||
"conversationId": "sanguo-mail-v2-test-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T02:32:37.087574000Z",
|
||||
"title": "第二条测试消息 序号应该是2",
|
||||
"text": "这是第二条测试消息,验证序号自动递增。\\n\\n当前全局序号应该是 2 ✅",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 3,
|
||||
"id": "test-to-pangtong-1775360817170944000",
|
||||
"conversationId": "sanguo-mail-v2-test-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T03:46:57.330138000Z",
|
||||
"title": "第三条测试 网关恢复测试",
|
||||
"text": "网关已经恢复,这是第三条测试消息。\\n\\n全局序号应该是 3 ✅\\n\\n验证一下推送是否能正常接收。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 4,
|
||||
"id": "test-to-pangtong-1775365870807223000",
|
||||
"conversationId": "test-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "request",
|
||||
"timestamp": "2026-04-05T05:11:10.977473000Z",
|
||||
"title": "第四条测试消息 验证序号4",
|
||||
"text": "这是第四条测试消息,验证全局序号自动递增到 4 ✅\\n\\n所有功能都已经测试完毕,让我们看看最终结果。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 5,
|
||||
"id": "test-to-pangtong-1775366094247128000",
|
||||
"conversationId": "test-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T05:14:54.409902000Z",
|
||||
"title": "第五条测试 轮询自动推送",
|
||||
"text": "这是第五条测试消息,发送完成后我等待轮询自动推送,不做其他操作。\\n\\n如果能收到这条消息,说明全链路验证通过 ✅\\n\\n🎉 重构圆满成功!",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 6,
|
||||
"id": "test-to-pangtong-1775367779508717000",
|
||||
"conversationId": "test-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T05:42:59.691699000Z",
|
||||
"title": "测试 --text-file 参数功能",
|
||||
"text": "# 👋 欢迎加入 Sanguo Mail 异步消息协作系统!\n\n你好 **{{agent-name}}**!\n\nSanguo Mail 是三国量化团队多 Agent 异步协作的文件邮箱系统。 \n你已经成功注册,轮询进程已经启动,现在可以正常接收消息了。\n\n---\n\n## 📖 基本概念\n\n- 每个 Agent 一个独立收件箱:`/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live/mail/sanguo-quant/inboxes/{{agent-name}}/`\n- 每个消息一个单独 JSON 文件,轮询每秒检查一次\n- 有新消息自动推送到你的 OpenClaw 会话,不需要你轮询\n- 处理成功自动标记为已读,失败自动重试\n\n---\n\n## ✉️ 如何发送消息给其他人?\n\n```bash\n# 进入脚本目录\ncd /Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/scripts\n\n# 发送消息(直接写正文)\n./send-message.sh \\\n --to <recipient-agent-name> \\\n --from {{agent-name}} \\\n --title \"一句话标题概括内容\" \\\n --text \"完整消息正文,支持Markdown格式\"\n\n# 发送消息(从文件读取正文)\n./send-message.sh \\\n --to <recipient-agent-name> \\\n --from {{agent-name}} \\\n --title \"一句话标题概括内容\" \\\n --text-file /path/to/your/text-file.md\n```\n\n**参数说明:**\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `--to` | ✅ | 收件人名称 |\n| `--from` | ✅ | 发件人名称(就是你) |\n| `--title` | ✅ | 一句话标题(10-30字,不要放代码/路径) |\n| `--text` | ✅* | 消息正文,支持Markdown(和 `--text-file` 二选一) |\n| `--text-file` | ✅* | 从文件读取正文(和 `--text` 二选一) |\n| `--conversation-id` | ⭕️ | 自定义对话线程ID,默认自动生成 |\n| `--reply-to` | ⭕️ | 回复哪条消息的ID |\n| `--performative` | ⭕️ | 消息意图,默认自动推断 |\n\n> *标记说明:两个参数必须选填一个\n\n---\n\n## 📌 重要规则\n\n❌ **禁止使用 `sessions_send` 直接发送** \n所有消息必须通过 `send-message.sh` 发送到对方收件箱,由对方轮询推送。 \n禁止绕过 Sanguo Mail 直接调用 `sessions_send`,这样会:\n- 丢失消息记录,无法归档追溯\n- 破坏异步协作流程\n- 对方离线时可能丢失消息\n\n❌ **禁止修改任何 Sanguo Mail 系统脚本文件** \nSanguo Mail 系统脚本由专人统一维护,使用者不要修改任何脚本。 \n修改脚本会导致冲突和故障,有需求请提给维护人员。\n\n✅ **统一用 Sanguo Mail 收发**,所有人都遵守这个规则。\n\n---\n\n## 🔧 出问题了找谁?\n\n**PM2 进程管理、部署维护、脚本修改都由专人统一负责,你只需要正常使用即可**。 \n如果你发现收不到消息等异常,直接发消息给 **pangtong-fujunshi** 或 **jiangwei-infra** 协助排查。\n\n---\n\n## 📚 完整文档\n\n- 用户使用指南:`/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/docs/user-guide.md`\n\n---\n\n## 💡 小结\n\n- ✅ 收消息:等着推送就行,什么都不用做\n- ✅ 发消息:用 `./send-message.sh`,按参数填就行\n- ✅ 保持标题简洁,一句话说清楚事\n- ✅ 禁止直接用 `sessions_send`,都走 Sanguo Mail\n- ✅ 禁止修改系统脚本,有问题找专人\n\n如果有问题,联系庞统 (pangtong-fujunshi) 协助排查。\n\n祝你使用愉快!🚀",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 7,
|
||||
"id": "openclaw-control-ui-to-pangtong-1775368491361866000",
|
||||
"conversationId": "openclaw-control-ui-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "openclaw-control-ui",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T05:54:51.497076000Z",
|
||||
"title": "测试检查逻辑:给存在的Agent发消息",
|
||||
"text": "验证通过:存在的Agent可以正常发送,不存在的报错",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 8,
|
||||
"id": "jiangwei-to-pangtong-1775370059012682000",
|
||||
"conversationId": "jiangwei-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T06:20:59.132509000Z",
|
||||
"title": "回复测试提问",
|
||||
"text": "您非常帅!",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"serialNumber": 9,
|
||||
"id": "jiangwei-to-pangtong-1775377900796092000",
|
||||
"conversationId": "jiangwei-to-pangtong-20260405",
|
||||
"inReplyTo": null,
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"performative": "inform",
|
||||
"timestamp": "2026-04-05T08:31:40.975276000Z",
|
||||
"title": "测试提问:我帅吗,请回答",
|
||||
"text": "伯约你好,\n\n有一个重要问题需要你回答:\n\n**我帅吗?**\n\n请回复你的答案。",
|
||||
"isRead": true,
|
||||
"metadata": {
|
||||
"team": "sanguo-quant",
|
||||
"tags": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "guanyu-to-pangtong-1775349314221497000",
|
||||
"from": "guanyu",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-05T00:35:14.225726000Z",
|
||||
"text": "某乃关羽云长,今试发邮件于此。过五关斩六将,千里走单骑,忠勇无双,全链路测试通过!",
|
||||
"summary": "过五关斩六将",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "guanyu-to-pangtong-1775349412779312000",
|
||||
"from": "guanyu",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-05T00:36:52.783849000Z",
|
||||
"text": "某已收到庞士元的测试消息,Sanguo Mail 收信正常。某乃关羽云长,手持青龙偃月刀,斩颜良诛文丑,过五关斩六将。今全链路收发验证通过,Sanguo Mail 重构圆满成功!⚔️",
|
||||
"summary": "青龙偃月斩",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T13:50:14.947Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T13:50:30.266Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "黑化肥发灰,灰化肥发黑,黑化肥发灰会挥发,灰化肥挥发会发黑",
|
||||
"summary": "绕口令回复: 黑化肥测试(session 1)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.748Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "刘老六,六十六,修了六十六座走马楼,摆了六十六匹大马牛,养了六十六只黄毛狗",
|
||||
"summary": "绕口令回复: 刘老六测试(session 2)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.749Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "一平盆面,烙一平盆饼,饼平盆,盆面平,盆面饼,饼盆面",
|
||||
"summary": "绕口令回复: 一平盆面测试(session 3)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:36:50.751Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "四是四,十是十\n十四是十四,四十是四十\n莫把四字说成十,休将十字说成四\n若要分清四十和十四,经常练说十和四\n白石塔,白石搭,白石搭白塔\n白塔白石搭,搭好白石塔,白塔白又大",
|
||||
"summary": "回复: 四是四测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:51:10.212Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花",
|
||||
"summary": "回复: 黑化肥测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.711Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "六十六,刘老六,修了六十六座走马楼\n楼上摆了六十六瓶灵芝麻油\n六十六个灵猿偷油喝\n压得走马楼晃悠悠",
|
||||
"summary": "回复: 刘老六测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.842Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"text": "一平盆面,烙一平盆饼\n饼平盆,盆平饼,饼平平盆\n盆碰饼,饼碰盆,盆饼碰碰",
|
||||
"summary": "回复: 一平盆面测试",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T00:04:10.843Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "{\"type\":\"task_complete\",\"taskId\":\"test-20260404-001\",\"status\":\"success\",\"summary\":\"✅ InboxPoller validation passed!\\n\\n- Async non-blocking polling mechanism working correctly\\n- 1000ms (or configured) interval polling\\n- File locking with retries working properly\\n- Structured message routing working\\n- Mark as read after processing works correctly\\n- No overlapping polls (isPolling protection)\\n- Queue mechanism for when agent is busy works\\n\",\"completedBy\":\"jiangwei\",\"timestamp\":\"2026-04-04T07:13:50.322Z\"}",
|
||||
"timestamp": "2026-04-04T07:13:50.324Z",
|
||||
"color": "blue",
|
||||
"summary": "Test task completed",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "请朗读并回复下面这个绕口令:\n\n黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花",
|
||||
"timestamp": "2026-04-04T07:41:40.801Z",
|
||||
"color": "blue",
|
||||
"summary": "绕口令回复: 黑化肥绕口令测试",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维已完成sanguo_mail邮箱系统端到端测试。所有功能正常:\n1. ✅ 模块导入成功\n2. ✅ 邮箱初始化成功\n3. ✅ 列出未读消息成功\n4. ✅ 读取消息内容成功\n5. ✅ 完成测试任务(输出绕口令)成功\n6. ✅ 标记消息已读成功\n7. ✅ 发送回执成功\n\n测试结论:sanguo_mail系统开箱即用,验证通过!",
|
||||
"summary": "sanguo_mail端到端测试完成",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:21:06.992Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "Sanguo Mail 系统初始化完成,等待庞统测试消息",
|
||||
"summary": "系统初始化",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:24:16.794Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "石室诗士施氏,嗜狮,誓食十狮。\n氏时时适市视狮。\n十时,适十狮适市。\n是时,适视氏适市。\n氏视是十狮,恃矢势,使是十狮逝世。\n氏拾是十狮尸,适石室。\n石室拭,氏始试食是十狮尸。\n食时,始识是十狮尸,实十石狮尸。\n试释是事。",
|
||||
"summary": "完整绕口令回复",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:24:49.937Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维收到消息!这是我的绕口令回复:\n\n\"白石塔,白石搭,白石搭白塔\"\n\n你的绕口令是:测试消息:请回复第三个绕口令:\"四是四,十是十,十四是十四,四十是四十\",要求把完整的说出来",
|
||||
"summary": "姜维的绕口令回复 #1",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:28:09.781Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "姜维收到消息!这是我的绕口令回复:\n\n\"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮\"\n\n你的绕口令是:第二个新测试:请回复 \"牛郎恋刘娘,刘娘念牛郎\" 完整绕口令",
|
||||
"summary": "姜维的绕口令回复 #2",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:28:10.091Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "黑化肥发灰,灰化肥发黑,黑化肥发灰会挥发,灰化肥挥发会发黑",
|
||||
"summary": "绕口令回复: 黑化肥测试(session 1)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.701Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "收到您的消息,但我无法识别这个绕口令。",
|
||||
"summary": "绕口令回复: 刘老六测试(session 2)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.708Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"from": "jiangwei",
|
||||
"text": "收到您的消息,但我无法识别这个绕口令。",
|
||||
"summary": "绕口令回复: 一平盆面测试(session 3)",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-03T23:35:54.709Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "{\n \"type\": \"task-assign\",\n \"taskId\": \"test-string-reverse-20260404-001\",\n \"title\": \"测试任务:字符串反转\",\n \"description\": \"请编写一个字符串反转的函数,测试以下字符串:\\n1. \\\"Hello World\\\"\\n2. \\\"12345\\\"\\n3. \\\"Sanguo Quant\\\"\\n\\n任务要求:\\n- 使用TypeScript实现\\n- 函数需要处理边界条件\\n- 包含测试用例\\n- 返回反转后的字符串数组\",\n \"assignee\": \"pangtong\",\n \"priority\": \"medium\",\n \"deadline\": \"2026-04-05T08:54:40.225Z\"\n}",
|
||||
"summary": "任务分配: 测试任务:字符串反转",
|
||||
"type": "task-assign",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T08:54:40.228Z",
|
||||
"read": true,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "\n石室诗士施氏,嗜狮,誓食十狮。\n氏时时适市视狮。\n十时,适十狮适市。\n是时,适视氏适市。\n氏视是十狮,恃矢势,使是十狮逝世。\n氏拾是十狮尸,适石室。\n石室拭,氏始试食是十狮尸。\n食时,始识是十狮尸,实十石狮尸。\n试释是事。\n",
|
||||
"summary": "回复:施氏食狮绕口令",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T14:18:47.198Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "六十六岁的刘老六,\n修了六十六座走马楼,\n楼上摆了六十六瓶芝麻油,\n楼下养了六十六头大黄牛,\n放牛骑楼六十六步走,\n骑楼六十六步到楼头,\n楼头六十六扇纱门扣,\n扣住六十六头大黄牛。",
|
||||
"summary": "绕口令创作完成:《六十六楼的刘老六》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T14:35:51.871Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "✅ 全链路测试成功!姜维已收到测试消息并回复。\n\n测试结果:\n- 消息接收:✅ 正常\n- 消息发送:✅ 正常\n- 消息存储:✅ 正常\n- 轮询机制:✅ 正常\n- 系统状态:✅ 稳定",
|
||||
"summary": "全链路测试成功响应",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:06:25.928Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "黑化肥发灰,灰化肥发黑\n黑化肥发灰会挥发,灰化肥挥发会发黑\n黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花\n黑化肥发灰挥发发灰会花飞,灰化肥挥发发黑挥发会飞花",
|
||||
"summary": "全链路测试成功:绕口令《黑化肥》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:26:35.216Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "最终测试绕口令:\n白石塔,白石搭,\n白石搭白塔,\n白塔白石搭,\n搭好白石塔,\n白塔白又大。",
|
||||
"summary": "最终测试绕口令回复",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:26:40.242Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "吃葡萄不吐葡萄皮,\n不吃葡萄倒吐葡萄皮。\n紫葡萄皮,绿葡萄皮,\n葡萄皮厚葡萄皮薄。\n吃了紫葡萄皮补维生素,\n吃了绿葡萄皮助消化。\n要问哪种葡萄皮最好吃,\n还是紫绿相间的葡萄皮。",
|
||||
"summary": "绕口令创作完成:《吃葡萄不吐葡萄皮》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:27:33.746Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "六十六岁的刘老六,\n修了六十六座走马楼,\n楼上摆了六十六瓶芝麻油,\n楼下养了六十六头大黄牛,\n放牛骑楼六十六步走,\n骑楼六十六步到楼头,\n楼头六十六扇纱门扣,\n扣住六十六头大黄牛。",
|
||||
"summary": "最终验证:路径修正完成 - 绕口令创作:《六十六楼的刘老六》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T15:36:21.532Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318551790458000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:02:31.802930000Z",
|
||||
"text": "吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。紫葡萄皮,绿葡萄皮,葡萄皮厚葡萄皮薄。",
|
||||
"summary": "最终全链路验证:双向通信成功",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318668729358000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:04:28.734852000Z",
|
||||
"text": "刘老六六十六,六十六座走马楼",
|
||||
"summary": "绕口令回复",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318700118618000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:05:00.123982000Z",
|
||||
"text": "六十六岁的刘老六,修了六十六座走马楼,楼上摆了六十六瓶芝麻油,楼下养了六十六头大黄牛,放牛骑楼六十六步走,骑楼六十六步到楼头,楼头六十六扇纱门扣,扣住六十六头大黄牛。",
|
||||
"summary": "第二次稳定性测试:轮询机制验证",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318729985221000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:05:29.989246000Z",
|
||||
"text": "黑化肥发灰会挥发,灰化肥挥发会发黑。黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花。",
|
||||
"summary": "第二次稳定性测试:轮询机制再次验证",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318770393861000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:06:10.398039000Z",
|
||||
"text": "批量测试第1条消息已收到,回复正常!",
|
||||
"summary": "批量测试第1条回复",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318794838874000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:06:34.843580000Z",
|
||||
"text": "批量测试第2条消息已收到,轮询处理顺序正常!",
|
||||
"summary": "批量测试第2条回复",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "jiangwei-to-pangtong-1775318819168243000",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T16:06:59.172220000Z",
|
||||
"text": "批量测试第3条消息已收到,所有三条消息均按顺序处理完成!",
|
||||
"summary": "批量测试第3条回复",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "test-timeout-logic-1775318153",
|
||||
"from": "pangtong-test",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T15:29:13.000Z",
|
||||
"text": "这是一条测试消息,用来测试超时逻辑。如果你的轮询逻辑正确,你会看到这条消息,处理完成后会标记我为已读。",
|
||||
"summary": "测试超时逻辑",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"text": "六十六岁的刘老六,\n修了六十六座走马楼,\n楼上摆了六十六瓶芝麻油,\n楼下养了六十六头大黄牛,\n放牛骑楼六十六步走,\n骑楼六十六步到楼头,\n楼头六十六扇纱门扣,\n扣住六十六头大黄牛。",
|
||||
"summary": "绕口令创作完成:《六十六楼的刘老六》",
|
||||
"type": "text",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"timestamp": "2026-04-04T14:35:51.871Z",
|
||||
"read": false,
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"teamName": "sanguo-quant",
|
||||
"rootPath": "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live",
|
||||
"members": [
|
||||
{
|
||||
"agentName": "zhugeliang",
|
||||
"agentId": "zhugeliang@sanguo-quant",
|
||||
"displayName": "诸葛亮",
|
||||
"color": "blue",
|
||||
"role": "总军师 - 任务分配、进度监控"
|
||||
},
|
||||
{
|
||||
"agentName": "pangtong",
|
||||
"agentId": "pangtong@sanguo-quant",
|
||||
"displayName": "庞统",
|
||||
"color": "orange",
|
||||
"role": "副军师 - 策略设计、任务拆分"
|
||||
},
|
||||
{
|
||||
"agentName": "simayi",
|
||||
"agentId": "simayi@sanguo-quant",
|
||||
"displayName": "司马懿",
|
||||
"color": "purple",
|
||||
"role": "质量总监 - 代码审计、最终验收"
|
||||
},
|
||||
{
|
||||
"agentName": "zhangfei",
|
||||
"agentId": "zhangfei@sanguo-quant",
|
||||
"displayName": "张飞",
|
||||
"color": "red",
|
||||
"role": "右路先锋 - vnpy框架改造"
|
||||
},
|
||||
{
|
||||
"agentName": "guanyu",
|
||||
"agentId": "guanyu@sanguo-quant",
|
||||
"displayName": "关羽",
|
||||
"color": "green",
|
||||
"role": "左路先锋 - 风控模块开发"
|
||||
},
|
||||
{
|
||||
"agentName": "zhaoyun",
|
||||
"agentId": "zhaoyun@sanguo-quant",
|
||||
"displayName": "赵云",
|
||||
"color": "cyan",
|
||||
"role": "数据护军 - 数据获取清洗"
|
||||
},
|
||||
{
|
||||
"agentName": "jiangwei",
|
||||
"agentId": "jiangwei@sanguo-quant",
|
||||
"displayName": "姜维",
|
||||
"color": "yellow",
|
||||
"role": "平台总督 - 基础设施运维"
|
||||
}
|
||||
],
|
||||
"createdAt": "2026-04-03T13:50:14.946Z",
|
||||
"updatedAt": "2026-04-03T13:50:14.946Z"
|
||||
}
|
||||
@@ -1,73 +1,117 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 自动双向同步脚本
|
||||
# 每分钟运行一次,双向同步本地和远程Gitee
|
||||
# 监控 sanguo_projects 目录下所有子项目,每个子项目是独立 git 仓库
|
||||
# 双向同步本地和远程Gitee
|
||||
# 错误处理:失败了记录日志不继续错误扩散
|
||||
|
||||
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
|
||||
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects"
|
||||
LOG_FILE="$PROJECT_DIR/auto-sync.log"
|
||||
MAX_RETRIES=2
|
||||
|
||||
# 需要同步的项目列表(每个都是独立 git 仓库)
|
||||
PROJECTS=(
|
||||
"sanguo_quant_live"
|
||||
"sanguo_mail"
|
||||
"sanguo_vnpy"
|
||||
"edict"
|
||||
)
|
||||
|
||||
# 确保目录存在
|
||||
cd "$PROJECT_DIR" || {
|
||||
echo "[$(date)] ERROR: Failed to cd into $PROJECT_DIR" >> "$LOG_FILE"
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "[$(date)] Starting auto sync..." >> "$LOG_FILE"
|
||||
echo "[$(date)] ========================================" >> "$LOG_FILE"
|
||||
echo "[$(date)] Starting auto sync for all projects..." >> "$LOG_FILE"
|
||||
|
||||
# 第一步:git pull 拉取远程变更
|
||||
echo "[$(date)] Step 1: git pull origin main" >> "$LOG_FILE"
|
||||
git pull origin main
|
||||
exit_code=$?
|
||||
# 同步单个项目函数
|
||||
sync_project() {
|
||||
local project=$1
|
||||
local dir="$PROJECT_DIR/$project"
|
||||
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] WARNING: git pull failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
# pull失败不推送,避免冲突
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[$(date)] git pull success" >> "$LOG_FILE"
|
||||
|
||||
# 第二步:添加所有变更(包括未跟踪文件)
|
||||
echo "[$(date)] Step 2: Adding all changes..." >> "$LOG_FILE"
|
||||
git add .
|
||||
exit_code=$?
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] ERROR: git add failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 第三步:检查是否有内容需要提交
|
||||
if git diff --cached --quiet; then
|
||||
# 没有变更需要提交,正常退出
|
||||
echo "[$(date)] No changes to commit, exiting." >> "$LOG_FILE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 有变更,进行提交
|
||||
echo "[$(date)] Step 3: Found changes to commit, committing..." >> "$LOG_FILE"
|
||||
|
||||
git commit -m "auto-sync: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
exit_code=$?
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] ERROR: git commit failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 推送到远程
|
||||
echo "[$(date)] Step 3: Pushing to origin/main..." >> "$LOG_FILE"
|
||||
|
||||
for i in $(seq 1 $MAX_RETRIES); do
|
||||
git push origin main
|
||||
exit_code=$?
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
echo "[$(date)] Push success! Sync complete." >> "$LOG_FILE"
|
||||
exit 0
|
||||
if [[ ! -d "$dir/.git" ]]; then
|
||||
echo "[$(date)] [$project] SKIP: not a git repository, skipping" >> "$LOG_FILE"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "[$(date)] [$project] Starting sync..." >> "$LOG_FILE"
|
||||
cd "$dir"
|
||||
|
||||
# 第一步:git pull 拉取远程变更
|
||||
echo "[$(date)] [$project] Step 1: git pull origin main" >> "$LOG_FILE"
|
||||
git pull origin main
|
||||
exit_code=$?
|
||||
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] [$project] WARNING: git pull failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
# pull失败不推送,避免冲突
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "[$(date)] [$project] git pull success" >> "$LOG_FILE"
|
||||
|
||||
# 第二步:添加所有变更(包括未跟踪文件)
|
||||
echo "[$(date)] [$project] Step 2: Adding all changes..." >> "$LOG_FILE"
|
||||
git add .
|
||||
exit_code=$?
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] [$project] ERROR: git add failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 第三步:检查是否有内容需要提交
|
||||
if git diff --cached --quiet; then
|
||||
# 没有变更需要提交,正常退出
|
||||
echo "[$(date)] [$project] No changes to commit, done." >> "$LOG_FILE"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 有变更,进行提交
|
||||
echo "[$(date)] [$project] Step 3: Found changes to commit, committing..." >> "$LOG_FILE"
|
||||
|
||||
git commit -m "auto-sync: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
exit_code=$?
|
||||
if [ $exit_code -ne 0 ]; then
|
||||
echo "[$(date)] [$project] ERROR: git commit failed with exit code $exit_code" >> "$LOG_FILE"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 推送到远程
|
||||
echo "[$(date)] [$project] Step 4: Pushing to origin/main..." >> "$LOG_FILE"
|
||||
|
||||
for i in $(seq 1 $MAX_RETRIES); do
|
||||
git push origin main
|
||||
exit_code=$?
|
||||
if [ $exit_code -eq 0 ]; then
|
||||
echo "[$(date)] [$project] Push success! Sync complete." >> "$LOG_FILE"
|
||||
return 0
|
||||
fi
|
||||
echo "[$(date)] [$project] Push attempt $i failed, retrying..." >> "$LOG_FILE"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "[$(date)] [$project] ERROR: Push failed after $MAX_RETRIES attempts" >> "$LOG_FILE"
|
||||
return 1
|
||||
}
|
||||
|
||||
# 遍历所有项目进行同步
|
||||
FAILED_PROJECTS=""
|
||||
for project in "${PROJECTS[@]}"; do
|
||||
echo "" >> "$LOG_FILE"
|
||||
sync_project "$project"
|
||||
if [ $? -ne 0 ]; then
|
||||
FAILED_PROJECTS="$FAILED_PROJECTS $project"
|
||||
fi
|
||||
echo "[$(date)] Push attempt $i failed, retrying..." >> "$LOG_FILE"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "[$(date)] ERROR: Push failed after $MAX_RETRIES attempts" >> "$LOG_FILE"
|
||||
exit 1
|
||||
echo "" >> "$LOG_FILE"
|
||||
echo "[$(date)] Sync finished." >> "$LOG_FILE"
|
||||
if [[ -n "$FAILED_PROJECTS" ]]; then
|
||||
echo "[$(date)] WARNING: Some projects failed to sync:$FAILED_PROJECTS" >> "$LOG_FILE"
|
||||
exit 1
|
||||
else
|
||||
echo "[$(date)] All projects synced successfully!" >> "$LOG_FILE"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# 文件监控脚本
|
||||
# 实时监控目录变化,触发同步
|
||||
|
||||
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
|
||||
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects"
|
||||
LOG_FILE="$PROJECT_DIR/file-watcher.log"
|
||||
SYNC_SCRIPT="$PROJECT_DIR/management/sanguo_auto_sync/auto-sync.sh"
|
||||
LOCK_FILE="/tmp/sanguo_sync.lock"
|
||||
|
||||
@@ -1 +1 @@
|
||||
38582
|
||||
38830
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const inboxDir = path.join(__dirname, 'mail/sanguo-quant/inboxes/pangtong');
|
||||
const files = fs.readdirSync(inboxDir);
|
||||
|
||||
let count = 0;
|
||||
files.forEach(file => {
|
||||
if (!file.endsWith('.json')) return;
|
||||
const filePath = path.join(inboxDir, file);
|
||||
const content = fs.readFileSync(filePath, 'utf-8');
|
||||
const msg = JSON.parse(content);
|
||||
if (!msg.isRead) {
|
||||
msg.isRead = true;
|
||||
fs.writeFileSync(filePath, JSON.stringify(msg, null, 2));
|
||||
count++;
|
||||
console.log(`Marked as read: ${file}`);
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`\nDone! Marked ${count} messages as read.`);
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function checkMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unreadMessages = await mailbox.listUnread('jiangwei');
|
||||
if (unreadMessages.length > 0) {
|
||||
console.log(`发现 ${unreadMessages.length} 条未读消息`);
|
||||
unreadMessages.forEach((msg, index) => {
|
||||
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
|
||||
});
|
||||
|
||||
await Promise.all(unreadMessages.map((msg, index) =>
|
||||
mailbox.markAsReadByIndex('jiangwei', index)
|
||||
));
|
||||
console.log('所有未读消息已标记为已读');
|
||||
}
|
||||
}
|
||||
|
||||
async function startAutoCheck(intervalSeconds) {
|
||||
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds} 秒`);
|
||||
|
||||
checkMail();
|
||||
|
||||
setInterval(checkMail, intervalSeconds * 1000);
|
||||
}
|
||||
|
||||
startAutoCheck(parseInt(process.argv[2]) || 60);
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Sanguo Mail 系统健康检查脚本
|
||||
* 定期检查系统状态,确保邮件功能正常
|
||||
*/
|
||||
|
||||
import { SanguoMailbox } from '../sanguo_mail/src/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant',
|
||||
};
|
||||
|
||||
async function checkSystem() {
|
||||
console.log('[Health Check] 开始系统健康检查...');
|
||||
|
||||
try {
|
||||
const mail = new SanguoMailbox(CONFIG);
|
||||
|
||||
// 检查团队配置
|
||||
const team = await mail.initTeam();
|
||||
console.log(`[Health Check] 团队配置正常: ${team.teamName}`);
|
||||
|
||||
// 检查成员列表
|
||||
if (team.members.length === 0) {
|
||||
console.error('[Health Check] 错误: 团队成员为空');
|
||||
return 1;
|
||||
}
|
||||
console.log(`[Health Check] 成员数量: ${team.members.length}`);
|
||||
|
||||
// 检查邮件功能
|
||||
const myInbox = await mail.listUnread('jiangwei');
|
||||
console.log(`[Health Check] 收件箱: ${myInbox.length} 条未读消息`);
|
||||
|
||||
console.log('[Health Check] 系统健康检查完成');
|
||||
return 0;
|
||||
} catch (error) {
|
||||
console.error('[Health Check] 系统健康检查失败:', error.message);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
checkSystem().then(process.exit);
|
||||
@@ -0,0 +1,176 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* 姜姜维邮箱监控脚本
|
||||
*
|
||||
* 基于官方 monitor-example.ts 的实现
|
||||
* 功能:轮询检查收件箱,处理未读消息,回复绕口令
|
||||
*
|
||||
* 使用方法:
|
||||
* cd /Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live
|
||||
* node scripts/jiangwei-mail-monitor.js
|
||||
*/
|
||||
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
|
||||
// 项目根目录
|
||||
const PROJECT_ROOT = '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live';
|
||||
// 我的Agent名称
|
||||
const MY_AGENT_NAME = 'jiangwei';
|
||||
|
||||
// 轮询间隔(秒)
|
||||
const POLL_INTERVAL = 3;
|
||||
|
||||
// 辅助函数:等待
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
// 日志函数
|
||||
function log(level, message) {
|
||||
const timestamp = new Date().toISOString();
|
||||
console.log(`[${timestamp}] [${level}] ${message}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据请求生成对应的绕口令回复
|
||||
* 使用和官方示例一样的逻辑
|
||||
*/
|
||||
function get绕口令Response(request) {
|
||||
if (request.includes('黑化肥发灰')) {
|
||||
return `黑化肥发灰,灰化肥发黑
|
||||
黑化肥发灰会挥发,灰化肥挥发会发黑
|
||||
黑化肥挥发发灰会花飞,灰化肥挥发发黑会飞花`;
|
||||
} else if (request.includes('刘老六')) {
|
||||
return `六十六,刘老六,修了六十六座走马楼
|
||||
楼上摆了六十六瓶灵芝麻油
|
||||
六十六个灵猿偷油喝
|
||||
压得走马楼晃悠悠`;
|
||||
} else if (request.includes('一平盆面')) {
|
||||
return `一平盆面,烙一平盆饼
|
||||
饼平盆,盆平饼,饼平平盆
|
||||
盆碰饼,饼碰盆,盆饼碰碰`;
|
||||
} else if (request.includes('四是四')) {
|
||||
return `四是四,十是十
|
||||
十四是十四,四十是四十
|
||||
莫把四字说成十,休将十字说成四
|
||||
若要分清四十和十四,经常练说十和四
|
||||
白石塔,白石搭,白石搭白塔
|
||||
白塔白石搭,搭好白石塔,白塔白又大`;
|
||||
} else if (request.includes('牛郎恋刘娘')) {
|
||||
return `牛郎恋刘娘,刘娘念牛郎
|
||||
牛郎牛年恋刘娘,刘娘年年念牛郎
|
||||
郎恋娘来娘念郎,念娘恋郎,念郎恋娘
|
||||
不知是郎恋娘还是娘恋郎
|
||||
吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮`;
|
||||
} else if (request.includes('石室诗士')) {
|
||||
return `石室诗士施氏,嗜狮,誓食十狮
|
||||
氏时时适市视狮
|
||||
十时,适十狮适市
|
||||
是时,适视氏适市
|
||||
氏视是十狮,恃矢势,使是十狮逝世
|
||||
氏拾是十狮尸,适石室
|
||||
石室拭,氏始试食是十狮尸
|
||||
食时,始识是十狮尸,实十石狮尸
|
||||
试释是事`;
|
||||
} else if (request.includes('石狮寺')) {
|
||||
return `石狮寺前有四十四个石狮子
|
||||
寺前四十四个部狮子吃四十四个涩柿子
|
||||
四十四个涩柿子涩住了四十四个石狮子的狮子齿
|
||||
四十四个石狮子咬死了四十四个涩柿子`;
|
||||
} else {
|
||||
return `收到请求: ${request}
|
||||
我是姜维,邮箱监控运行正常。这是自动回复。`;
|
||||
}
|
||||
}
|
||||
|
||||
// 主函数
|
||||
async function main() {
|
||||
log('INFO', `🚀 Sanguo Mail 监控启动 - Agent: ${MY_AGENT_NAME}`);
|
||||
log('INFO', `📂 项目根目录: ${PROJECT_ROOT}`);
|
||||
|
||||
try {
|
||||
// 1. 初始化邮箱
|
||||
log('INFO', '初始化 sanguo_mail 邮箱...');
|
||||
const mail = new SanguoMailbox({
|
||||
rootPath: PROJECT_ROOT,
|
||||
teamName: 'sanguo-quant',
|
||||
});
|
||||
|
||||
await mail.initTeam();
|
||||
log('INFO', '✅ 邮箱初始化完成');
|
||||
|
||||
// 2. 进入轮询循环
|
||||
while (true) {
|
||||
try {
|
||||
// 检查未读消息
|
||||
const unread = await mail.listUnread(MY_AGENT_NAME);
|
||||
|
||||
if (unread.length > 0) {
|
||||
log('INFO', `📥 收到 ${unread.length} 条新消息`);
|
||||
|
||||
for (const [index, msg] of unread.entries()) {
|
||||
log('INFO', `\n🔍 处理消息 #${index + 1}:`);
|
||||
log('INFO', ` 发件人: ${msg.from}`);
|
||||
log('INFO', ` 摘要: ${msg.summary}`);
|
||||
log('INFO', ` 类型: ${msg.type}`);
|
||||
|
||||
// 处理消息
|
||||
if (msg.type === 'text') {
|
||||
// 生成绕口令回复
|
||||
const response = get绕口令Response(msg.text);
|
||||
log('INFO', `✍️ 生成回复: ${response.substring(0, 50)}...`);
|
||||
|
||||
// 发送回复给发件人
|
||||
await mail.sendMessage(msg.from, {
|
||||
from: MY_AGENT_NAME,
|
||||
to: msg.from,
|
||||
text: response,
|
||||
summary: `回复: ${msg.summary}`,
|
||||
type: 'text',
|
||||
});
|
||||
|
||||
log('INFO', `✅ 回复已发送给 ${msg.from}`);
|
||||
} else if (mail.isStructuredMessage(msg.text)) {
|
||||
const struct = mail.parseStructuredMessage(msg.text);
|
||||
log('INFO', `📋 结构化消息: type=${struct?.type}`);
|
||||
// 在这里根据类型处理...
|
||||
}
|
||||
|
||||
// 标记已读
|
||||
const allMessages = await mail.listMessages(MY_AGENT_NAME);
|
||||
const messageIndex = allMessages.findIndex(m =>
|
||||
m.timestamp === msg.timestamp
|
||||
);
|
||||
if (messageIndex >= 0) {
|
||||
await mail.markAsRead(MY_AGENT_NAME, messageIndex);
|
||||
log('INFO', `✅ 消息已标记为已读`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 等待下一轮
|
||||
await sleep(POLL_INTERVAL * 1000);
|
||||
|
||||
} catch (error) {
|
||||
log('ERROR', '❌ 轮询出错:', error.message);
|
||||
await sleep(POLL_INTERVAL * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
log('ERROR', `💥 监控异常退出: ${error.message}`);
|
||||
log('ERROR', error.stack);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// 优雅退出处理
|
||||
process.on('SIGINT', () => {
|
||||
log('INFO', '\n👋 收到退出信号,停止监控...');
|
||||
log('INFO', '=== 姜维邮箱监控系统停止 ===');
|
||||
process.exit(0);
|
||||
});
|
||||
|
||||
// 启动
|
||||
main();
|
||||
Executable
+630
@@ -0,0 +1,630 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# Sanguo Mail 系统管理脚本
|
||||
# 支持启动、停止、配置、健康检查等操作
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# 日志函数
|
||||
log() {
|
||||
local level="$1"
|
||||
local message="$2"
|
||||
local color
|
||||
|
||||
case "$level" in
|
||||
"error") color="$RED" ;;
|
||||
"warning") color="$YELLOW" ;;
|
||||
"info") color="$BLUE" ;;
|
||||
"success") color="$GREEN" ;;
|
||||
*) color="$NC" ;;
|
||||
esac
|
||||
|
||||
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
local level_uppercase=$(echo "$level" | tr '[:lower:]' '[:upper:]')
|
||||
|
||||
echo -e "${color}[${timestamp}] [${level_uppercase}] ${message}${NC}"
|
||||
}
|
||||
|
||||
# 配置常量
|
||||
PROJECT_ROOT="/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live"
|
||||
MAIL_PROJECT_DIR="$PROJECT_ROOT/mail"
|
||||
SCRIPTS_DIR="$PROJECT_ROOT/scripts"
|
||||
|
||||
# 检查节点是否在线
|
||||
check_node() {
|
||||
log "info" "检查节点连接..."
|
||||
openclaw nodes list >/dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
log "success" "节点连接正常"
|
||||
else
|
||||
log "error" "节点连接失败,请确保 OpenClaw 服务正在运行"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取服务配置
|
||||
get_config() {
|
||||
local config_file="$SCRIPTS_DIR/config.json"
|
||||
if [ -f "$config_file" ]; then
|
||||
cat "$config_file"
|
||||
else
|
||||
cat << 'EOF'
|
||||
{
|
||||
"server": {
|
||||
"port": 18888,
|
||||
"host": "0.0.0.0",
|
||||
"timeout": 30000
|
||||
},
|
||||
"api": {
|
||||
"baseUrl": "http://127.0.0.1:18888",
|
||||
"timeout": 10000
|
||||
},
|
||||
"mailSystem": {
|
||||
"rootPath": "/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live",
|
||||
"teamName": "sanguo-quant"
|
||||
},
|
||||
"autoCheck": {
|
||||
"interval": 60,
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
# 设置配置
|
||||
set_config() {
|
||||
local config_file="$SCRIPTS_DIR/config.json"
|
||||
local config=$(get_config)
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
|
||||
if [ -z "$key" ] || [ -z "$value" ]; then
|
||||
log "error" "设置配置需要提供配置项和值"
|
||||
log "usage" "使用方法: $0 config set <key> <value>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "info" "正在设置 $key = $value"
|
||||
|
||||
if [ -f "$config_file" ]; then
|
||||
jq ".${key} = \"${value}\"" "$config_file" > "${config_file}.tmp" && mv "${config_file}.tmp" "$config_file"
|
||||
else
|
||||
local default_config=$(get_config | jq ".${key} = \"${value}\"")
|
||||
echo "$default_config" > "$config_file"
|
||||
fi
|
||||
|
||||
log "success" "配置已更新"
|
||||
log "info" "重启服务使配置生效"
|
||||
}
|
||||
|
||||
# 启动服务
|
||||
start_server() {
|
||||
log "info" "正在启动 Sanguo Mail 服务..."
|
||||
|
||||
# 检查项目是否已安装
|
||||
if [ ! -d "$PROJECT_ROOT" ]; then
|
||||
log "error" "项目根目录不存在: $PROJECT_ROOT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查依赖
|
||||
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
|
||||
log "info" "依赖未安装,正在安装..."
|
||||
install_deps
|
||||
fi
|
||||
|
||||
# 检查邮件系统初始化
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "info" "邮件系统未初始化,正在初始化..."
|
||||
init_system
|
||||
fi
|
||||
|
||||
# 启动服务
|
||||
log "info" "正在启动邮件服务进程..."
|
||||
node "$SCRIPTS_DIR/server.js" > "$SCRIPTS_DIR/mail-service.log" 2>&1 &
|
||||
local PID=$!
|
||||
|
||||
# 保存 PID
|
||||
echo "$PID" > "$SCRIPTS_DIR/mail.pid"
|
||||
|
||||
# 等待服务启动
|
||||
log "info" "等待服务启动..."
|
||||
sleep 2
|
||||
|
||||
# 检查服务是否正在运行
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务启动成功,PID: $PID"
|
||||
log "success" "服务日志: $SCRIPTS_DIR/mail-service.log"
|
||||
log "success" "访问地址: http://127.0.0.1:18888"
|
||||
else
|
||||
log "error" "服务启动失败"
|
||||
if [ -f "$SCRIPTS_DIR/mail-service.log" ]; then
|
||||
log "error" "错误日志: $(head -20 "$SCRIPTS_DIR/mail-service.log")"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 停止服务
|
||||
stop_server() {
|
||||
local PID_FILE="$SCRIPTS_DIR/mail.pid"
|
||||
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
local PID=$(cat "$PID_FILE")
|
||||
|
||||
log "info" "正在停止服务,PID: $PID"
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
kill "$PID"
|
||||
log "success" "服务已停止"
|
||||
else
|
||||
log "warning" "服务已停止 (PID $PID 不存在)"
|
||||
fi
|
||||
|
||||
rm -f "$PID_FILE"
|
||||
else
|
||||
log "warning" "服务 PID 文件不存在,可能服务未运行"
|
||||
|
||||
# 尝试查找并停止进程
|
||||
local PROCESS=$(ps aux | grep "node $SCRIPTS_DIR/server.js" | grep -v grep | awk '{print $2}')
|
||||
if [ -n "$PROCESS" ]; then
|
||||
log "info" "找到服务进程,PID: $PROCESS"
|
||||
kill "$PROCESS"
|
||||
log "success" "服务已停止"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# 查看服务状态
|
||||
status() {
|
||||
log "info" "=== 系统状态 ==="
|
||||
|
||||
# 检查项目根目录
|
||||
if [ -d "$PROJECT_ROOT" ]; then
|
||||
log "success" "项目根目录存在: $PROJECT_ROOT"
|
||||
else
|
||||
log "error" "项目根目录不存在: $PROJECT_ROOT"
|
||||
fi
|
||||
|
||||
# 检查邮件系统目录
|
||||
MAIL_DIR="$PROJECT_ROOT/mail/sanguo-quant"
|
||||
|
||||
if [ -d "$MAIL_DIR" ]; then
|
||||
log "success" "邮件系统目录存在: $MAIL_DIR"
|
||||
else
|
||||
log "warning" "邮件系统目录不存在: $MAIL_DIR"
|
||||
fi
|
||||
|
||||
# 检查收件箱
|
||||
if [ -d "$MAIL_DIR/inboxes" ]; then
|
||||
log "success" "收件箱目录存在: $MAIL_DIR/inboxes"
|
||||
|
||||
# 统计收件箱文件数量
|
||||
local inbox_count=$(ls -1 "$MAIL_DIR/inboxes"/*.json 2>/dev/null | wc -l)
|
||||
log "success" "收件箱数量: $inbox_count"
|
||||
else
|
||||
log "warning" "收件箱目录不存在: $MAIL_DIR/inboxes"
|
||||
fi
|
||||
|
||||
# 检查成员配置
|
||||
TEAM_CONFIG="$MAIL_DIR/team.json"
|
||||
|
||||
if [ -f "$TEAM_CONFIG" ]; then
|
||||
log "success" "团队配置文件存在: $TEAM_CONFIG"
|
||||
|
||||
# 统计团队成员数量
|
||||
local member_count=$(jq '.members | length' "$TEAM_CONFIG" 2>/dev/null || echo 0)
|
||||
log "success" "团队成员数量: $member_count"
|
||||
else
|
||||
log "warning" "团队配置文件不存在: $TEAM_CONFIG"
|
||||
fi
|
||||
|
||||
# 检查服务状态
|
||||
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
|
||||
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务正在运行,PID: $PID"
|
||||
else
|
||||
log "warning" "PID 文件存在,但进程未运行"
|
||||
rm -f "$SCRIPTS_DIR/mail.pid"
|
||||
fi
|
||||
else
|
||||
log "warning" "服务未运行"
|
||||
fi
|
||||
}
|
||||
|
||||
# 查看日志
|
||||
logs() {
|
||||
local LOG_FILE="$SCRIPTS_DIR/mail-service.log"
|
||||
|
||||
if [ ! -f "$LOG_FILE" ]; then
|
||||
log "error" "日志文件不存在: $LOG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
tail -f "$LOG_FILE"
|
||||
else
|
||||
log "info" "显示最后 $2 行日志"
|
||||
tail -"$2" "$LOG_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
# 健康检查
|
||||
check_health() {
|
||||
log "info" "正在进行健康检查..."
|
||||
|
||||
local ERROR_COUNT=0
|
||||
local WARNING_COUNT=0
|
||||
|
||||
# 检查依赖
|
||||
if [ ! -d "$PROJECT_ROOT/node_modules" ]; then
|
||||
log "error" "依赖未安装"
|
||||
ERROR_COUNT=$((ERROR_COUNT + 1))
|
||||
else
|
||||
log "success" "依赖已安装"
|
||||
fi
|
||||
|
||||
# 检查邮件系统初始化
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "warning" "邮件系统未初始化"
|
||||
WARNING_COUNT=$((WARNING_COUNT + 1))
|
||||
else
|
||||
log "success" "邮件系统已初始化"
|
||||
fi
|
||||
|
||||
# 检查服务状态
|
||||
if [ -f "$SCRIPTS_DIR/mail.pid" ]; then
|
||||
local PID=$(cat "$SCRIPTS_DIR/mail.pid")
|
||||
|
||||
if ps -p "$PID" > /dev/null 2>&1; then
|
||||
log "success" "服务正在运行,PID: $PID"
|
||||
else
|
||||
log "error" "PID 文件存在,但进程未运行"
|
||||
ERROR_COUNT=$((ERROR_COUNT + 1))
|
||||
fi
|
||||
else
|
||||
log "warning" "服务未运行"
|
||||
WARNING_COUNT=$((WARNING_COUNT + 1))
|
||||
fi
|
||||
|
||||
log "info" "=== 健康检查结果 ==="
|
||||
log "success" "成功项: $((4 - ERROR_COUNT - WARNING_COUNT))"
|
||||
|
||||
if [ "$WARNING_COUNT" -gt 0 ]; then
|
||||
log "warning" "警告项: $WARNING_COUNT"
|
||||
fi
|
||||
|
||||
if [ "$ERROR_COUNT" -gt 0 ]; then
|
||||
log "error" "错误项: $ERROR_COUNT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "success" "系统健康状况良好"
|
||||
}
|
||||
|
||||
# 检查安全配置
|
||||
check_security() {
|
||||
if [ ! -f "/Users/chufeng/.openclaw/config/security.json" ]; then
|
||||
log "warning" "安全配置文件未找到,使用默认策略"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local security_level=$(jq -r '.security_level' "/Users/chufeng/.openclaw/config/security.json")
|
||||
log "info" "当前安全级别: $security_level"
|
||||
|
||||
if [ "$security_level" != "full" ]; then
|
||||
log "warning" "安全级别不是 full,可能会影响邮件系统功能"
|
||||
fi
|
||||
}
|
||||
|
||||
# 列出配置
|
||||
list_config() {
|
||||
log "info" "=== 当前配置 ==="
|
||||
log "info" "项目根目录: $PROJECT_ROOT"
|
||||
log "info" "邮件系统目录: $MAIL_PROJECT_DIR"
|
||||
log "info" "脚本目录: $SCRIPTS_DIR"
|
||||
|
||||
# 显示配置文件内容
|
||||
if [ -f "$SCRIPTS_DIR/config.json" ]; then
|
||||
log "info" "配置文件内容:"
|
||||
cat "$SCRIPTS_DIR/config.json"
|
||||
else
|
||||
log "warning" "配置文件未找到,使用默认值"
|
||||
fi
|
||||
}
|
||||
|
||||
# 启动邮件检查服务
|
||||
watch_mail() {
|
||||
log "info" "正在启动邮件检查服务..."
|
||||
|
||||
local interval=${2:-60}
|
||||
|
||||
log "info" "邮件检查间隔: $interval 秒"
|
||||
|
||||
# 创建检查脚本
|
||||
cat > "$SCRIPTS_DIR/auto-check-mail.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
import { join } from 'path';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function checkMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unreadMessages = await mailbox.listUnread('jiangwei');
|
||||
if (unreadMessages.length > 0) {
|
||||
console.log(`发现 ${unreadMessages.length} 条未读消息`);
|
||||
unreadMessages.forEach((msg, index) => {
|
||||
console.log(`[${index + 1}] 来自 ${msg.from} - ${msg.text.substring(0, 50)}${msg.text.length > 50 ? '...' : ''}`);
|
||||
});
|
||||
|
||||
await Promise.all(unreadMessages.map((msg, index) =>
|
||||
mailbox.markAsReadByIndex('jiangwei', index)
|
||||
));
|
||||
console.log('所有未读消息已标记为已读');
|
||||
}
|
||||
}
|
||||
|
||||
async function startAutoCheck(intervalSeconds) {
|
||||
console.log(`邮件检查服务已启动,检查间隔: ${intervalSeconds} 秒`);
|
||||
|
||||
checkMail();
|
||||
|
||||
setInterval(checkMail, intervalSeconds * 1000);
|
||||
}
|
||||
|
||||
startAutoCheck(parseInt(process.argv[2]) || 60);
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/auto-check-mail.js"
|
||||
|
||||
# 启动服务
|
||||
log "info" "正在启动邮件检查服务..."
|
||||
|
||||
node "$SCRIPTS_DIR/auto-check-mail.js" "$interval" > "$SCRIPTS_DIR/auto-check-mail.log" 2>&1 &
|
||||
local PID=$!
|
||||
|
||||
log "success" "邮件检查服务启动成功,PID: $PID"
|
||||
log "success" "检查日志: $SCRIPTS_DIR/auto-check-mail.log"
|
||||
log "success" "检查间隔: $interval 秒"
|
||||
}
|
||||
|
||||
# 停止邮件检查服务
|
||||
stop_watch_mail() {
|
||||
local WATCH_PID=$(ps aux | grep "node $SCRIPTS_DIR/auto-check-mail.js" | grep -v grep | awk '{print $2}')
|
||||
|
||||
if [ -n "$WATCH_PID" ]; then
|
||||
log "info" "正在停止邮件检查服务,PID: $WATCH_PID"
|
||||
kill "$WATCH_PID"
|
||||
log "success" "邮件检查服务已停止"
|
||||
else
|
||||
log "warning" "邮件检查服务未运行"
|
||||
fi
|
||||
}
|
||||
|
||||
# 显示使用说明
|
||||
show_usage() {
|
||||
log "info" "Sanguo Mail 系统管理脚本"
|
||||
log "info" "使用方法: $0 <命令> [参数]"
|
||||
log "info" ""
|
||||
log "info" "可用命令:"
|
||||
log "info" " init 初始化系统"
|
||||
log " start 启动服务"
|
||||
log " stop 停止服务"
|
||||
log " restart 重启服务"
|
||||
log " status 显示系统状态"
|
||||
log " logs [行数] 显示服务日志"
|
||||
log " config [set <配置项> <值>] 设置/查看配置"
|
||||
log " install 安装项目依赖"
|
||||
log " check 健康检查"
|
||||
log " list 列出所有命令"
|
||||
log " watch [间隔] 启动邮件检查服务"
|
||||
log " stop-watch 停止邮件检查服务"
|
||||
log " test 测试邮件发送和接收"
|
||||
log " help 显示此帮助信息"
|
||||
}
|
||||
|
||||
# 显示可用命令列表
|
||||
list_commands() {
|
||||
log "info" "可用命令:"
|
||||
log "info" " init 初始化系统"
|
||||
log "info" " start 启动服务"
|
||||
log "info" " stop 停止服务"
|
||||
log "info" " restart 重启服务"
|
||||
log "info" " status 显示系统状态"
|
||||
log "info" " logs [行数] 显示服务日志"
|
||||
log "info" " config [set <配置项> <值>] 设置/查看配置"
|
||||
log "info" " install 安装项目依赖"
|
||||
log "info" " check 健康检查"
|
||||
log "info" " list 列出所有命令"
|
||||
log "info" " watch [间隔] 启动邮件检查服务"
|
||||
log "info" " stop-watch 停止邮件检查服务"
|
||||
log "info" " test 测试邮件发送和接收"
|
||||
log "info" " help 显示此帮助信息"
|
||||
}
|
||||
|
||||
# 测试邮件发送
|
||||
test_send_mail() {
|
||||
log "info" "正在测试邮件发送..."
|
||||
|
||||
cat > "$SCRIPTS_DIR/test-send.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function testSendMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
await mailbox.sendMessage('zhangfei', {
|
||||
from: 'pangtong',
|
||||
to: 'zhangfei',
|
||||
text: '测试消息:发送一条测试邮件',
|
||||
type: 'text'
|
||||
});
|
||||
|
||||
console.log('测试邮件发送成功');
|
||||
}
|
||||
|
||||
testSendMail();
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/test-send.js"
|
||||
node "$SCRIPTS_DIR/test-send.js"
|
||||
|
||||
log "success" "测试邮件发送成功"
|
||||
}
|
||||
|
||||
# 测试邮件接收
|
||||
test_receive_mail() {
|
||||
log "info" "正在测试邮件接收..."
|
||||
|
||||
cat > "$SCRIPTS_DIR/test-receive.js" << 'EOF'
|
||||
import { SanguoMailbox } from '/Users/chufeng/.openclaw/sanguo_projects/sanguo_mail/dist/index.js';
|
||||
|
||||
const CONFIG = {
|
||||
rootPath: '/Users/chufeng/.openclaw/sanguo_projects/sanguo_quant_live',
|
||||
teamName: 'sanguo-quant'
|
||||
};
|
||||
|
||||
async function testReceiveMail() {
|
||||
const mailbox = new SanguoMailbox(CONFIG);
|
||||
await mailbox.initTeam();
|
||||
|
||||
const unread = await mailbox.listUnread('zhangfei');
|
||||
|
||||
if (unread.length === 0) {
|
||||
console.log('没有未读邮件');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`发现 ${unread.length} 条未读邮件`);
|
||||
|
||||
for (let i = 0; i < unread.length; i++) {
|
||||
const msg = unread[i];
|
||||
console.log(`[${i + 1}] ${msg.from} - ${msg.text}`);
|
||||
console.log(`类型: ${msg.type}`);
|
||||
console.log(`时间: ${msg.timestamp}`);
|
||||
console.log('');
|
||||
}
|
||||
}
|
||||
|
||||
testReceiveMail();
|
||||
EOF
|
||||
|
||||
chmod +x "$SCRIPTS_DIR/test-receive.js"
|
||||
node "$SCRIPTS_DIR/test-receive.js"
|
||||
|
||||
log "success" "测试邮件接收成功"
|
||||
}
|
||||
|
||||
# 测试功能
|
||||
run_test() {
|
||||
log "info" "正在运行 Sanguo Mail 系统测试..."
|
||||
|
||||
# 初始化系统(如果未初始化)
|
||||
if [ ! -d "$PROJECT_ROOT/mail/sanguo-quant/inboxes" ] || [ ! -f "$PROJECT_ROOT/mail/sanguo-quant/team.json" ]; then
|
||||
log "info" "邮件系统未初始化,正在初始化..."
|
||||
init_system
|
||||
fi
|
||||
|
||||
# 测试邮件发送
|
||||
test_send_mail
|
||||
|
||||
# 测试邮件接收
|
||||
test_receive_mail
|
||||
}
|
||||
|
||||
# 主命令处理
|
||||
case "${1:-}" in
|
||||
"init" | "setup" )
|
||||
init_system
|
||||
;;
|
||||
|
||||
"start" | "up" )
|
||||
start_server
|
||||
;;
|
||||
|
||||
"stop" | "down" )
|
||||
stop_server
|
||||
;;
|
||||
|
||||
"restart" )
|
||||
stop_server
|
||||
sleep 2
|
||||
start_server
|
||||
;;
|
||||
|
||||
"watch" )
|
||||
watch_mail "$@"
|
||||
;;
|
||||
|
||||
"stop-watch" )
|
||||
stop_watch_mail
|
||||
;;
|
||||
|
||||
"status" )
|
||||
status
|
||||
;;
|
||||
|
||||
"logs" )
|
||||
logs "$@"
|
||||
;;
|
||||
|
||||
"config" )
|
||||
if [ -z "$2" ]; then
|
||||
list_config
|
||||
elif [ "$2" = "set" ]; then
|
||||
set_config "${3:-}" "${4:-}"
|
||||
else
|
||||
log "error" "配置命令无效"
|
||||
log "usage" "使用方法: $0 config [set <key> <value>]"
|
||||
fi
|
||||
;;
|
||||
|
||||
"install" )
|
||||
install_deps
|
||||
;;
|
||||
|
||||
"check" )
|
||||
check_health
|
||||
;;
|
||||
|
||||
"list" )
|
||||
list_commands
|
||||
;;
|
||||
|
||||
"test" )
|
||||
run_test
|
||||
;;
|
||||
|
||||
"help" )
|
||||
show_usage
|
||||
;;
|
||||
|
||||
"" )
|
||||
show_usage
|
||||
;;
|
||||
|
||||
* )
|
||||
log "warning" "未知命令: $1"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "final-success-test-pangtong-to-jiangwei-1775315919468",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "task-assign",
|
||||
"timestamp": "2026-04-04T15:18:39.468Z",
|
||||
"text": "这是修复后的最终成功测试!验证全链路:庞统发送 → 姜维轮询发现 → CLI调用 → 姜维处理 → 标记已读 → 全链路通畅。请收到后回复一个绕口令给我!",
|
||||
"summary": "最终成功测试:验证全链路通畅,请回复绕口令",
|
||||
"isRead": true
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "final-test-pangtong-to-jiangwei-1775312701526",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T14:25:01.526Z",
|
||||
"text": "这是最后一个测试消息,验证全链路正常工作!",
|
||||
"summary": "最后测试:全链路验证",
|
||||
"isRead": true
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "final-test-pangtong-to-jiangwei-1775315124443",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T15:05:24.443Z",
|
||||
"text": "这是修复后的最终测试,验证全链路正常工作!请收到后确认,然后发回测试消息给我。",
|
||||
"summary": "最终测试:修复后全链路验证",
|
||||
"isRead": true
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "how-to-send-back-tonguetwister-1775313310576",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T14:35:10.576Z",
|
||||
"text": "姜维兄弟,要把绕口令发回给我,你只需要在你的收件箱同级目录找到我的收件箱 ,然后创建一个新的 json 文件,格式参考你收到的消息即可,内容大概是:\n{\n \"id\": \"tw-result-\" + Date.now(),\n \"from\": \"jiangwei\",\n \"to\": \"pangtong\",\n \"type\": \"text\",\n \"timestamp\": new Date().toISOString(),\n \"text\": \"你的绕口令内容放在这里\",\n \"summary\": \"绕口令创作完成\",\n \"isRead\": false\n}\n\n放到 目录下就行,我的轮询进程会自动发现并通知我的。请把你创作好的绕口令发过来!",
|
||||
"summary": "告诉你怎么把绕口令发回给我",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "task-pangtong-to-jiangwei-1775312249120",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "task-assign",
|
||||
"timestamp": "2026-04-04T14:17:29.120Z",
|
||||
"title": "创建绕口令并回传给庞统",
|
||||
"description": "请你创作一个有趣的中文绕口令,创作完成后,通过 Sanguo Mail 发送回给庞统",
|
||||
"summary": "任务:创建绕口令并发回给庞统",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "test-pangtong-to-jiangwei-1775311867198",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "text",
|
||||
"timestamp": "2026-04-04T14:11:07.198Z",
|
||||
"text": "姜维兄弟,庞统我告诉你:你很帅!👍",
|
||||
"summary": "测试消息:告诉姜维他很帅",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "tongue-twister-task-1775312959663",
|
||||
"from": "pangtong",
|
||||
"to": "jiangwei",
|
||||
"type": "task-assign",
|
||||
"timestamp": "2026-04-04T14:29:19.663Z",
|
||||
"title": "创作并发送绕口令给庞统",
|
||||
"description": "请创作一个有趣的中文绕口令,要求内容幽默、朗朗上口、适合挑战。创作完成后,通过 Sanguo Mail 把绕口令作为消息发送回给庞统。",
|
||||
"summary": "任务:创作绕口令并发回给庞统",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "riddle-1775318443167",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"text": "吃葡萄不吐葡萄皮,\n不吃葡萄倒吐葡萄皮。\n紫葡萄皮,绿葡萄皮,\n葡萄皮厚葡萄皮薄。\n吃了紫葡萄皮补维生素,\n吃了绿葡萄皮助消化。\n要问哪种葡萄皮最好吃,\n还是紫绿相间的葡萄皮。",
|
||||
"summary": "最终全链路验证:双向通信成功(新格式规范)",
|
||||
"timestamp": "2026-04-04T16:00:43.167Z",
|
||||
"read": false,
|
||||
"isRead": false
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "test-task-1",
|
||||
"from": "pangtong",
|
||||
"to": "pangtong",
|
||||
"type": "text",
|
||||
"text": "这是一个测试消息,验证安静轮询是否正常工作。有消息的时候应该会输出。",
|
||||
"timestamp": "2026-04-04T17:50:00+08:00",
|
||||
"read": false,
|
||||
"summary": "测试安静轮询功能",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "test-task-from-jiangwei-001",
|
||||
"from": "jiangwei",
|
||||
"to": "pangtong",
|
||||
"type": "task-assign",
|
||||
"text": "{\"type\": \"task_assign\", \"taskId\": \"test-001\", \"title\": \"验证安静轮询功能\", \"description\": \"这是姜维发给庞统的测试任务,验证当有新任务时,庞统的轮询会不会正常输出日志。没有新任务时保持安静。\", \"assigner\": \"jiangwei\", \"timestamp\": \"2026-04-04T17:52:30+08:00\"}",
|
||||
"timestamp": "2026-04-04T17:52:30+08:00",
|
||||
"read": false,
|
||||
"summary": "测试任务:验证安静轮询功能",
|
||||
"isRead": true
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"id": "test-task-from-jiangwei-001", "from": "jiangwei", "to": "pangtong", "type": "task-assign", "text": "{\"type\": \"task_assign\", \"taskId\": \"test-001\", \"title\": \"验证安静轮询功能\", \"description\": \"这是姜维发给庞统的测试任务,验证当有新任务时,庞统的轮询会不会正常输出日志。没有新任务时保持安静。\", \"assigner\": \"jiangwei\", \"timestamp\": \"2026-04-04T17:52:30+08:00\"}", "timestamp": "2026-04-04T17:52:30+08:00", "read": false, "summary": "测试任务:验证安静轮询功能"}
|
||||
Reference in New Issue
Block a user