# 她自己的生活 · 让「发说说/写日记」真的会发生 > 一句话:**给她一个每 2.5 小时响一次的闹钟,响了不跟人说话,只提醒她「现在是你的时间」。** --- ## 为什么需要它 桥接原来的自动唤醒只有三种: | 触发 | 条件 | |---|---| | 有人说话 | 群里 @她 / 管理员发话 / 私聊来信 | | replyCheck | 有人回了她的消息 | | 群聊 proactive | 群冷场太久,她可以主动起头 | **私聊没有第四种。** 所以角色卡里写「你自己想发就发、想写日记就写、想画画就画」——写了也不会发生,除非有人手动喊她一句「现在是你的自由时间」。 她不会自己找事做,不是因为她不想,是因为**没有任何东西叫醒她**。 `own-life.js` 就是那第四种唤醒。 --- ## 它到底做什么 ``` 每 2.5 小时 → 投一条【静默】提示进她的上下文 (不进聊天,QQ 上什么都看不到) 提示内容(白天): 现在是你的时间,没人找你。 想干嘛干嘛:发条说说(先 qzone_my_posts 看一眼今天发过没)、 写日记、画一张、玩会儿手机,也可以什么都不干。 不用回我,也不用汇报。 提示内容(23:30 之后,一天一次): 半夜了,没人打扰。 想干点什么吗——发说说、写日记、画一张,也可以就坐着什么都不干。 这段时间里别给平安发消息,他睡着呢。 ``` 拿到提示之后她干什么,**由她自己决定**——可能发一条说说,可能写两句日记,也可能什么都不干。这才是「她自己的生活」,不是定时发帖机器人。 --- ## 四条设计约束 | 约束 | 做法 | |---|---| | **不打扰** | 凌晨 3:00–8:00 不叫 | | **不刷屏** | 一天最多 6 次;投递失败不计次数 | | **不丢** | 重新投递失败也记不住 → 下次还会再试 | | **断电续得上** | 最后触发时间写进 `state/own-life.json`,重启不会开机补发一堆 | --- ## 装法 ### 方式一:打补丁(推荐) ```bash cd <你的 bridge 仓库> git apply --check -p1 /path/to/patches/03-own-life.patch # 先试,不落地 git apply -p1 /path/to/patches/03-own-life.patch ``` > 需要先打 `patches/01-bridge.patch`、`02-mcp-snowluma-safe.patch`——03 的上下文是基于打过前两个之后的 `src/bridge.js`。 ### 方式二:手动三步 1. 把 `packages/own-life/src/own-life.js` 拷进你的 `src/` 目录; 2. `src/bridge.js` 顶部加: ```js import { createOwnLife } from './own-life.js'; ``` 3. 找 `startSocialLoop()` 函数,在它后面加 `startOwnLife()`: ```js let ownLife = null; function startOwnLife() { try { if (ownLife) ownLife.stop(); const ownerKey = 'private:' + String(cfg.ownerQQ ?? ''); if (!cfg.ownerQQ) { log('[own-life] 没有 ownerQQ,跳过'); return; } ownLife = createOwnLife({ key: ownerKey, statePath: path.join(STATE_DIR, 'own-life.json'), log: (m, ...rest) => log(`[own-life] ${m}${rest.length ? ' ' + rest.join(' ') : ''}`), deliver: async (text) => { if (socialV2.paused) throw new Error('socialV2 已暂停'); if (currentMode !== 'reserved2') throw new Error('当前不是 reserved2 模式'); await deliverPrompt(ownerKey, text, { silent: true, wakeReason: 'own-life' }); }, }); ownLife.start(); } catch (e) { log(`[own-life] 启动失败(不影响桥接): ${e?.message ?? e}`); } } ``` 4. 在 `startSocialLoop();` 那行后面加一行 `startOwnLife();`。 ### 重启后应当看到 ``` [own-life] 已武装 · 每 2.5h 一次 · 安静时段 3:00–8:00 · 半夜 23:30 · 每天最多 6 次 [own-life] 已投递(day)23:26 · 今天第 1 次 ``` **只有这两行才算装上了。** 第一行是武装,第二行是真投递(约 90 秒后会有第一次)。 --- ## 参数 ```js createOwnLife({ intervalMs: 2.5 * 3600e3, // 多久叫一次 quiet: [3, 8], // 这段时间不叫 midnightAt: '23:30', // 半夜那句从几点开始 maxPerDay: 6, // 一天最多几次 enabled: true, // 关掉就彻底不动 textDay, textMidnight, // 两段文案可以换 }); ``` ## 想关掉 - 临时:控制台把桥接切出 reserved2 模式 → 投递会被 `wakeReason` 检查挡掉; - 永久:删掉 `startOwnLife();` 那行,或者 `enabled: false`; - 只想停一会儿:`ownLife.stop()`。 --- ## 自测 ```bash node packages/own-life/test/own-life.test.mjs ``` 20 条断言,覆盖:到点投递 / 不重发 / 安静时段 / 日上限 / 跨天归零 / 半夜一天一次 / 重启不补发 / 投递失败不记账 / enabled=false。