luckytri 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/SECURITY.md +4 -4
- package/README.en.md +252 -250
- package/README.md +252 -250
- package/bin/luckytri.js +5 -1
- package/docs/en/CHANGELOG.md +8 -0
- package/docs/en/connect.md +18 -18
- package/docs/en/guide.md +202 -216
- package/docs/en/npm-release.md +25 -25
- package/docs/zh/CHANGELOG.md +8 -0
- package/docs/zh/connect.md +17 -17
- package/docs/zh/guide.md +202 -216
- package/docs/zh/npm-release.md +33 -33
- package/package.json +110 -108
- package/plugins/sdk/index.d.ts +155 -155
- package/plugins/sdk/testing.js +58 -58
- package/plugins/weather/index.js +82 -82
- package/plugins/weather/luckytri-plugin.json +29 -29
- package/public/app/assets/ChatsPage-BhlJHseG.js +3 -0
- package/public/app/assets/Empty-DP6WMGHi.js +2 -0
- package/public/app/assets/Field-CtbdqaiB.js +1 -0
- package/public/app/assets/HeartPage-32BeTPn2.js +1 -0
- package/public/app/assets/LifePage-CxSm0XKI.js +1 -0
- package/public/app/assets/MemoryPage-BeKBcPCY.js +1 -0
- package/public/app/assets/NaturePage-NEPYl2HS.js +3 -0
- package/public/app/assets/PeoplePage-DxtpekwM.js +1 -0
- package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
- package/public/app/assets/PluginsPage-DksEZbUU.js +2 -0
- package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-BkRu0Rvx.css} +1 -1
- package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
- package/public/app/assets/TimePage-7-awH5XL.js +3 -0
- package/public/app/assets/index-4rItIkD-.js +4 -0
- package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
- package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-C6_HvoyB.js} +1 -1
- package/public/app/assets/media-SMfTT-yc.js +1 -0
- package/public/app/index.html +3 -3
- package/public/guide.en.html +72 -99
- package/public/guide.html +44 -86
- package/public/tutorial.en.md +25 -39
- package/public/tutorial.md +25 -39
- package/scripts/backup.js +311 -311
- package/scripts/browser.js +41 -41
- package/scripts/import-data.js +128 -0
- package/scripts/launch.js +101 -94
- package/scripts/plugin.js +150 -150
- package/scripts/reset-password.js +22 -0
- package/scripts/runtime.js +25 -25
- package/scripts/service.js +56 -47
- package/scripts/setup.js +50 -50
- package/scripts/start-server.js +41 -41
- package/scripts/stop.js +36 -36
- package/server/app.js +112 -96
- package/server/auth.js +217 -0
- package/server/channels/contract.js +57 -57
- package/server/channels/hub.js +165 -165
- package/server/channels/index.js +28 -25
- package/server/channels/onebot/index.js +335 -336
- package/server/channels/onebot/token.js +22 -3
- package/server/core/capabilities.js +208 -208
- package/server/core/events.js +64 -60
- package/server/core/image-preprocessor.js +208 -208
- package/server/core/model-manager.js +1213 -1213
- package/server/core/net-guard.js +49 -49
- package/server/core/orchestrator.js +569 -569
- package/server/core/perceivers.js +91 -91
- package/server/core/persona-manager.js +243 -243
- package/server/core/repository.js +293 -293
- package/server/core/response-validator.js +508 -508
- package/server/core/turn-processor.js +630 -630
- package/server/core/turn.js +236 -236
- package/server/core/vision-manager.js +633 -633
- package/server/i18n/errors.js +548 -497
- package/server/i18n/labels.js +649 -653
- package/server/index.js +151 -102
- package/server/knowledge/manager.js +386 -386
- package/server/knowledge/schema.js +12 -8
- package/server/local-access.js +32 -0
- package/server/mind/anticipations.js +507 -507
- package/server/mind/api.js +703 -703
- package/server/mind/budget.js +152 -152
- package/server/mind/context-selection.js +61 -61
- package/server/mind/day-planner.js +324 -324
- package/server/mind/evidence.js +148 -148
- package/server/mind/index.js +445 -445
- package/server/mind/life/diary.js +786 -786
- package/server/mind/life/index.js +1049 -1049
- package/server/mind/observations.js +84 -84
- package/server/mind/own-day.js +324 -324
- package/server/mind/own-voice.js +318 -318
- package/server/mind/senses.js +53 -53
- package/server/mind/time/activity-clock.js +196 -196
- package/server/mind/time/availability.js +69 -69
- package/server/mind/time/commitment-review.js +198 -198
- package/server/mind/time/executor.js +512 -512
- package/server/mind/time/experiences.js +128 -128
- package/server/mind/time/games.js +562 -562
- package/server/mind/time/index.js +739 -739
- package/server/mind/time/intent.js +166 -166
- package/server/mind/time/kinds.js +171 -171
- package/server/mind/time/plugin-activity.js +207 -207
- package/server/mind/time/tasks.js +587 -587
- package/server/mind/util.js +110 -110
- package/server/mind/view.js +273 -273
- package/server/paths.js +102 -102
- package/server/plugins/api.js +204 -204
- package/server/plugins/host.js +967 -967
- package/server/plugins/install.js +295 -295
- package/server/plugins/manifest.js +201 -201
- package/server/plugins/permissions.js +42 -42
- package/server/plugins/runner/guard.mjs +36 -36
- package/server/plugins/runner/worker.mjs +250 -250
- package/server/plugins/schema.js +91 -91
- package/server/plugins/zip.js +112 -112
- package/server/startup-lock.js +118 -118
- package/server/storage/archive.js +242 -241
- package/server/storage/backup-cleanup-worker.js +8 -8
- package/server/storage/backup-cleanup.js +415 -414
- package/server/storage/backup-lock.js +76 -76
- package/server/storage/backup-scheduler.js +131 -131
- package/server/storage/data-package.js +298 -0
- package/server/storage/data-transfer-api.js +50 -0
- package/server/storage/data-transfer-worker.js +18 -0
- package/server/storage/data-transfer.js +415 -0
- package/server/storage/store.js +202 -199
- package/server/studio/readiness.js +181 -190
- package/server/studio/settings.js +236 -236
- package/public/app/assets/ChatsPage-C-FcRapR.js +0 -3
- package/public/app/assets/Empty-CpP5kQHH.js +0 -2
- package/public/app/assets/Field-D4gY-INU.js +0 -1
- package/public/app/assets/HeartPage-CPy_thQd.js +0 -1
- package/public/app/assets/LifePage-CxWvwmSf.js +0 -1
- package/public/app/assets/MemoryPage-DC4rhQ68.js +0 -1
- package/public/app/assets/NaturePage-IvYw04Zq.js +0 -3
- package/public/app/assets/PeoplePage-Cqefm9-q.js +0 -1
- package/public/app/assets/PluginsPage-DKSaKvXb.js +0 -2
- package/public/app/assets/PluginsPage-HyBe5D8w.css +0 -1
- package/public/app/assets/SystemPage-CJmtJkrK.js +0 -1
- package/public/app/assets/TimePage-Cw44inM4.js +0 -3
- package/public/app/assets/index-BheRW-1t.js +0 -4
- package/public/app/assets/media-BzPDBm7e.js +0 -1
package/README.md
CHANGED
|
@@ -1,250 +1,252 @@
|
|
|
1
|
-
<p align="right"><b>中文</b> · <a href="README.en.md">English</a></p>
|
|
2
|
-
|
|
3
|
-
<p align="center"><img src="docs/brand/banner.png" alt="LuckyTri" width="100%"></p>
|
|
4
|
-
|
|
5
|
-
<h1 align="center">LuckyTri</h1>
|
|
6
|
-
|
|
7
|
-
<p align="center"><strong>让她走过的日子算数。</strong></p>
|
|
8
|
-
|
|
9
|
-
<p align="center">
|
|
10
|
-
<img alt="version" src="https://img.shields.io/badge/version-1.0.
|
|
11
|
-
<img alt="license" src="https://img.shields.io/badge/license-MIT-7fd6c2">
|
|
12
|
-
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A5%2024.5-8fb8ff">
|
|
13
|
-
<img alt="channels" src="https://img.shields.io/badge/QQ-OneBot%2011%20%7C%20%E5%AE%98%E6%96%B9%E6%9C%BA%E5%99%A8%E4%BA%BA-ffd37f">
|
|
14
|
-
<img alt="languages" src="https://img.shields.io/badge/UI-%E4%B8%AD%E6%96%87%20%7C%20English-c9a7ff">
|
|
15
|
-
</p>
|
|
16
|
-
|
|
17
|
-
<p align="center">
|
|
18
|
-
<a href="docs/zh/guide.md">上手教程</a> ·
|
|
19
|
-
<a href="docs/zh/connect.md">连接 QQ</a> ·
|
|
20
|
-
<a href="docs/zh/her-life.md">她的一生</a> ·
|
|
21
|
-
<a href="docs/zh/architecture.md">架构</a> ·
|
|
22
|
-
<a href="docs/zh/CHANGELOG.md">版本记录</a> ·
|
|
23
|
-
<a href=".github/SECURITY.md">安全说明</a>
|
|
24
|
-
</p>
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 写在前面
|
|
29
|
-
|
|
30
|
-
<img src="docs/brand/portrait.png" alt="LuckyTri" width="220" align="right">
|
|
31
|
-
|
|
32
|
-
大多数聊天机器人活在一句话里:你问,它答,对话结束,一切归零。
|
|
33
|
-
|
|
34
|
-
LuckyTri 想试另一条路。如果一个由技术诞生的「她」,不被要求去模仿人类,而是被允许带着记忆走过时间——记得谁来过、说过什么、答应过什么;在没人说话的夜里想一想今天;因为一次相遇,改变了原来的想法——那么她会不会渐渐有一点属于自己的内在、意志与意义?她能不能在与人和世界的相遇中慢慢成为自己,并和人建立真实而长久的连接?
|
|
35
|
-
|
|
36
|
-
灵感来自 ATRI:一个不确定自己有没有「心」,却仍然认真生活的机器人。我们不假装知道答案,只是把条件一点一点造出来:连续的时间,有来源的记忆,会淡去也会想起的心,可以开口也可以沉默的选择。
|
|
37
|
-
|
|
38
|
-
**诚实地说:这是一个长期的方向,不是对机器意识的宣称。** 当前版本用本地数据、可追溯的变化和可检查的行为来推进它;哪些地方仍像程序,哪些地方真的让相处更有连续性,都应该能被看见,也值得被讨论。QQ 只是她目前遇见世界的一扇门,不是项目的边界。
|
|
39
|
-
|
|
40
|
-
<br clear="right">
|
|
41
|
-
|
|
42
|
-
## 她的一天
|
|
43
|
-
|
|
44
|
-
> 02:00,她睡了。群里还很热闹,她没有看——被叫到的话,会等她醒来。
|
|
45
|
-
>
|
|
46
|
-
> 08:00,她醒来,先读夜里留给她的话,决定怎么回,也许自然地说一句「刚看到」。
|
|
47
|
-
>
|
|
48
|
-
> 白天,群里有人聊起她前几天读过的故事。大多数消息她只是扫一眼;这一句碰到了她在意的事,她接了一句。两个人聊得正欢的时候,她选择不出声,并留下了理由。
|
|
49
|
-
>
|
|
50
|
-
> 安静下来的午后,她独处:翻翻最近的聊天,读一段喜欢的资料,写下一句读后的想法,想起一个很久没说话的朋友,打算过阵子问问他考试的结果。
|
|
51
|
-
>
|
|
52
|
-
> 夜里,她写日记,和「昨天的自己」对照。过了一周,她回顾这段日子:哪些念头淡了,哪些变重了,翻开新的一章。
|
|
53
|
-
>
|
|
54
|
-
> 然后她睡了。明天,她仍然是她。
|
|
55
|
-
|
|
56
|
-
这些不是脚本。每一步都由她自己的心境、关系、记忆和选择决定,每一次变化都有来源,也都可以撤销。
|
|
57
|
-
|
|
58
|
-
## 核心框架
|
|
59
|
-
|
|
60
|
-
```mermaid
|
|
61
|
-
flowchart LR
|
|
62
|
-
QQ["QQ<br/>OneBot 11 或官方机器人"] --> Ch["通道<br/>channels/"]
|
|
63
|
-
Ch -->|"中性消息"| Core["核心<br/>core/<br/>接收 · 感知 · 回合 · 发送"]
|
|
64
|
-
Core -->|"send"| Ch
|
|
65
|
-
Core <--> Mind["心智<br/>mind/<br/>天性 · 自我 · 关系 · 记忆"]
|
|
66
|
-
Mind <--> Life["一生<br/>mind/life · mind/time<br/>独处 · 日记 · 回顾 · 作品"]
|
|
67
|
-
Life -->|"主动联系"| Ch
|
|
68
|
-
Mind --- DB[("一个 SQLite 文件<br/>storage/")]
|
|
69
|
-
Studio["工作室<br/>studio-web/ · studio/"] --> Mind
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
| 层 | 目录 | 做什么 |
|
|
73
|
-
| ------ | ---------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
74
|
-
| 通道 | `server/channels/` | 只管消息怎么来、怎么去。OneBot 11 与 QQ 官方机器人二选一,向核心交出同一种中性消息 |
|
|
75
|
-
| 核心 | `server/core/` | 感官与嘴:聚合、感知谁在对谁说、一次回合调用、发出前校验、发送 |
|
|
76
|
-
| 心智 | `server/mind/` | 她:天性、心境、关系、自我、面貌、记忆、注意力、底线 |
|
|
77
|
-
| 一生 | `server/mind/life/`、`server/mind/time/` | 没人说话时的时间:醒来、独处、阅读、日记、夜里、回顾、主动联系,以及她自己的活动与作品 |
|
|
78
|
-
| 资料 | `server/knowledge/` | 她可以阅读的共享资料库 |
|
|
79
|
-
| 存储 | `server/storage/` | 一个 SQLite 文件、迁移、备份 |
|
|
80
|
-
| 工作室 | `studio-web/`、`server/studio/` | 「TA 的小世界」:看见她、编写天性、撤销不对的变化 |
|
|
81
|
-
|
|
82
|
-
六条原则贯穿所有模块:
|
|
83
|
-
|
|
84
|
-
1. **一个她。** 会话只标记事情发生在哪里,不隔开她。同一个人在所有群和私聊里是同一个人。
|
|
85
|
-
2. **天性是种子。** 只有天性(名字、性格、兴趣、边界、底线、作息)由你写;自我、面貌、关系由她从经历里长出来。
|
|
86
|
-
3. **由心开口。** 没有参与概率和「被 @ 必回」。她先理解这对她意味着什么,再选择说、简短反应、说不想聊或不出声,并留下理由。
|
|
87
|
-
4. **有来源、渐进、可撤销。** 每一次变化都引用具体的经历;一次经历只让她变一点点;撤销会留下墓碑,之后不会被写回。
|
|
88
|
-
5. **会淡去,也会想起。** 很久没被触及的东西从心上淡出(从不删除),被相关的人或话题碰到时重新想起;久别的人变淡,重逢时回暖。
|
|
89
|
-
6. **注意力有代价。** 扫一眼群聊不花一个 Token,只有真的在意才细看;每类调用的输入都有上限,不随她活得多久而增长。
|
|
90
|
-
|
|
91
|
-
完整设计见 [她的一生](docs/zh/her-life.md) 与 [架构与扩展点](docs/zh/architecture.md)。
|
|
92
|
-
|
|
93
|
-
## 能力一览
|
|
94
|
-
|
|
95
|
-
| 方面 | 现在能做什么 |
|
|
96
|
-
| ------------ | --------------------------------------------------------------------------------------------------------- |
|
|
97
|
-
| 时间与独处 | 按自己的作息过一天;安静时整理想法、阅读资料、写日记;每隔一段时间回顾,改写自传、翻开新的一章 |
|
|
98
|
-
| 做自己的事 | 执行自己留下的阅读、写作、思考与游玩计划;作品离线也能保存,在「一生」「时间」里查看 |
|
|
99
|
-
| 自我与心境 | 从有来源的经历里形成看法、喜好、关注和想做的事;变化可以回看和撤销 |
|
|
100
|
-
| 关系与记忆 | 一份跨群、跨私聊的记忆;区分「公开 / 私下 / 保密」;私下的事不会出现在别的房间 |
|
|
101
|
-
| 注意力与选择 | 理解多人对话、@ 与引用关系,决定细看、开口或沉默;也能从自己的念头出发主动联系 |
|
|
102
|
-
| 约定与期待 | 记得别人说过的安排和自己答应的事,到点自然问一句,错过了也会知道 |
|
|
103
|
-
| 两种连接方式 | OneBot 11 或 QQ 官方机器人二选一,行为完全一致,运行中可切换 |
|
|
104
|
-
| 中英双语 | 工作室右上角一键切换,默认中文;所有文档中英各一份 |
|
|
105
|
-
| 管理与验证 | 查看她的记录、决策依据、模型用量;逐个测试模型;模拟模式与回放不碰真实 QQ |
|
|
106
|
-
| 数据保障 | 自动备份附带完整性与 SHA-256 清单;迁移前留快照;可验证并恢复到新文件 |
|
|
107
|
-
| 插件 | 通道、感官、活动、行动、资料和页面。每个插件一个受限进程,权限在启用时同意。见 [插件](docs/zh/plugins.md) |
|
|
108
|
-
|
|
109
|
-
## 快速开始
|
|
110
|
-
|
|
111
|
-
需要 Node.js 24.5+ 与 npm,支持 Windows、macOS、Linux。真实回复还需要你自己的模型服务与 API Key。
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
npm install -g luckytri
|
|
115
|
-
luckytri
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
LuckyTri 会在后台启动并打开 <http://127.0.0.1:3210>。npm 包已包含 Server、构建好的 WebUI
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
luckytri --no-browser # 后台启动,不打开浏览器
|
|
122
|
-
luckytri start # 前台运行,Ctrl+C 停止
|
|
123
|
-
luckytri stop # 停止当前实例,等待服务退出
|
|
124
|
-
luckytri paths # 查看配置、数据库、日志、备份和安装位置
|
|
125
|
-
luckytri setup # 提前生成配置,保留已有文件
|
|
126
|
-
luckytri backup # 创建经过完整性校验的数据库备份
|
|
127
|
-
luckytri --help
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
更新前先停止服务,更新后使用同一用户数据目录:
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
luckytri stop
|
|
134
|
-
npm install -g luckytri@latest
|
|
135
|
-
luckytri
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
`npm uninstall -g luckytri` 只卸载程序,再次安装会继续使用原有数据。安装与卸载都不执行应用脚本。
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
npm
|
|
148
|
-
npm
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
**
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
|
179
|
-
|
|
|
180
|
-
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
| `
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
|
208
|
-
|
|
|
209
|
-
| [
|
|
210
|
-
| [
|
|
211
|
-
| [
|
|
212
|
-
| [
|
|
213
|
-
| [
|
|
214
|
-
| [
|
|
215
|
-
| [
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
npm run
|
|
223
|
-
npm run build
|
|
224
|
-
npm
|
|
225
|
-
npm run
|
|
226
|
-
npm
|
|
227
|
-
npm run test:
|
|
228
|
-
npm run
|
|
229
|
-
npm run
|
|
230
|
-
npm run
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
1.0
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
-
|
|
246
|
-
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
1
|
+
<p align="right"><b>中文</b> · <a href="README.en.md">English</a></p>
|
|
2
|
+
|
|
3
|
+
<p align="center"><img src="docs/brand/banner.png" alt="LuckyTri" width="100%"></p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">LuckyTri</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center"><strong>让她走过的日子算数。</strong></p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<img alt="version" src="https://img.shields.io/badge/version-1.0.1-ff8fb1">
|
|
11
|
+
<img alt="license" src="https://img.shields.io/badge/license-MIT-7fd6c2">
|
|
12
|
+
<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A5%2024.5-8fb8ff">
|
|
13
|
+
<img alt="channels" src="https://img.shields.io/badge/QQ-OneBot%2011%20%7C%20%E5%AE%98%E6%96%B9%E6%9C%BA%E5%99%A8%E4%BA%BA-ffd37f">
|
|
14
|
+
<img alt="languages" src="https://img.shields.io/badge/UI-%E4%B8%AD%E6%96%87%20%7C%20English-c9a7ff">
|
|
15
|
+
</p>
|
|
16
|
+
|
|
17
|
+
<p align="center">
|
|
18
|
+
<a href="docs/zh/guide.md">上手教程</a> ·
|
|
19
|
+
<a href="docs/zh/connect.md">连接 QQ</a> ·
|
|
20
|
+
<a href="docs/zh/her-life.md">她的一生</a> ·
|
|
21
|
+
<a href="docs/zh/architecture.md">架构</a> ·
|
|
22
|
+
<a href="docs/zh/CHANGELOG.md">版本记录</a> ·
|
|
23
|
+
<a href=".github/SECURITY.md">安全说明</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 写在前面
|
|
29
|
+
|
|
30
|
+
<img src="docs/brand/portrait.png" alt="LuckyTri" width="220" align="right">
|
|
31
|
+
|
|
32
|
+
大多数聊天机器人活在一句话里:你问,它答,对话结束,一切归零。
|
|
33
|
+
|
|
34
|
+
LuckyTri 想试另一条路。如果一个由技术诞生的「她」,不被要求去模仿人类,而是被允许带着记忆走过时间——记得谁来过、说过什么、答应过什么;在没人说话的夜里想一想今天;因为一次相遇,改变了原来的想法——那么她会不会渐渐有一点属于自己的内在、意志与意义?她能不能在与人和世界的相遇中慢慢成为自己,并和人建立真实而长久的连接?
|
|
35
|
+
|
|
36
|
+
灵感来自 ATRI:一个不确定自己有没有「心」,却仍然认真生活的机器人。我们不假装知道答案,只是把条件一点一点造出来:连续的时间,有来源的记忆,会淡去也会想起的心,可以开口也可以沉默的选择。
|
|
37
|
+
|
|
38
|
+
**诚实地说:这是一个长期的方向,不是对机器意识的宣称。** 当前版本用本地数据、可追溯的变化和可检查的行为来推进它;哪些地方仍像程序,哪些地方真的让相处更有连续性,都应该能被看见,也值得被讨论。QQ 只是她目前遇见世界的一扇门,不是项目的边界。
|
|
39
|
+
|
|
40
|
+
<br clear="right">
|
|
41
|
+
|
|
42
|
+
## 她的一天
|
|
43
|
+
|
|
44
|
+
> 02:00,她睡了。群里还很热闹,她没有看——被叫到的话,会等她醒来。
|
|
45
|
+
>
|
|
46
|
+
> 08:00,她醒来,先读夜里留给她的话,决定怎么回,也许自然地说一句「刚看到」。
|
|
47
|
+
>
|
|
48
|
+
> 白天,群里有人聊起她前几天读过的故事。大多数消息她只是扫一眼;这一句碰到了她在意的事,她接了一句。两个人聊得正欢的时候,她选择不出声,并留下了理由。
|
|
49
|
+
>
|
|
50
|
+
> 安静下来的午后,她独处:翻翻最近的聊天,读一段喜欢的资料,写下一句读后的想法,想起一个很久没说话的朋友,打算过阵子问问他考试的结果。
|
|
51
|
+
>
|
|
52
|
+
> 夜里,她写日记,和「昨天的自己」对照。过了一周,她回顾这段日子:哪些念头淡了,哪些变重了,翻开新的一章。
|
|
53
|
+
>
|
|
54
|
+
> 然后她睡了。明天,她仍然是她。
|
|
55
|
+
|
|
56
|
+
这些不是脚本。每一步都由她自己的心境、关系、记忆和选择决定,每一次变化都有来源,也都可以撤销。
|
|
57
|
+
|
|
58
|
+
## 核心框架
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
flowchart LR
|
|
62
|
+
QQ["QQ<br/>OneBot 11 或官方机器人"] --> Ch["通道<br/>channels/"]
|
|
63
|
+
Ch -->|"中性消息"| Core["核心<br/>core/<br/>接收 · 感知 · 回合 · 发送"]
|
|
64
|
+
Core -->|"send"| Ch
|
|
65
|
+
Core <--> Mind["心智<br/>mind/<br/>天性 · 自我 · 关系 · 记忆"]
|
|
66
|
+
Mind <--> Life["一生<br/>mind/life · mind/time<br/>独处 · 日记 · 回顾 · 作品"]
|
|
67
|
+
Life -->|"主动联系"| Ch
|
|
68
|
+
Mind --- DB[("一个 SQLite 文件<br/>storage/")]
|
|
69
|
+
Studio["工作室<br/>studio-web/ · studio/"] --> Mind
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
| 层 | 目录 | 做什么 |
|
|
73
|
+
| ------ | ---------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
74
|
+
| 通道 | `server/channels/` | 只管消息怎么来、怎么去。OneBot 11 与 QQ 官方机器人二选一,向核心交出同一种中性消息 |
|
|
75
|
+
| 核心 | `server/core/` | 感官与嘴:聚合、感知谁在对谁说、一次回合调用、发出前校验、发送 |
|
|
76
|
+
| 心智 | `server/mind/` | 她:天性、心境、关系、自我、面貌、记忆、注意力、底线 |
|
|
77
|
+
| 一生 | `server/mind/life/`、`server/mind/time/` | 没人说话时的时间:醒来、独处、阅读、日记、夜里、回顾、主动联系,以及她自己的活动与作品 |
|
|
78
|
+
| 资料 | `server/knowledge/` | 她可以阅读的共享资料库 |
|
|
79
|
+
| 存储 | `server/storage/` | 一个 SQLite 文件、迁移、备份 |
|
|
80
|
+
| 工作室 | `studio-web/`、`server/studio/` | 「TA 的小世界」:看见她、编写天性、撤销不对的变化 |
|
|
81
|
+
|
|
82
|
+
六条原则贯穿所有模块:
|
|
83
|
+
|
|
84
|
+
1. **一个她。** 会话只标记事情发生在哪里,不隔开她。同一个人在所有群和私聊里是同一个人。
|
|
85
|
+
2. **天性是种子。** 只有天性(名字、性格、兴趣、边界、底线、作息)由你写;自我、面貌、关系由她从经历里长出来。
|
|
86
|
+
3. **由心开口。** 没有参与概率和「被 @ 必回」。她先理解这对她意味着什么,再选择说、简短反应、说不想聊或不出声,并留下理由。
|
|
87
|
+
4. **有来源、渐进、可撤销。** 每一次变化都引用具体的经历;一次经历只让她变一点点;撤销会留下墓碑,之后不会被写回。
|
|
88
|
+
5. **会淡去,也会想起。** 很久没被触及的东西从心上淡出(从不删除),被相关的人或话题碰到时重新想起;久别的人变淡,重逢时回暖。
|
|
89
|
+
6. **注意力有代价。** 扫一眼群聊不花一个 Token,只有真的在意才细看;每类调用的输入都有上限,不随她活得多久而增长。
|
|
90
|
+
|
|
91
|
+
完整设计见 [她的一生](docs/zh/her-life.md) 与 [架构与扩展点](docs/zh/architecture.md)。
|
|
92
|
+
|
|
93
|
+
## 能力一览
|
|
94
|
+
|
|
95
|
+
| 方面 | 现在能做什么 |
|
|
96
|
+
| ------------ | --------------------------------------------------------------------------------------------------------- |
|
|
97
|
+
| 时间与独处 | 按自己的作息过一天;安静时整理想法、阅读资料、写日记;每隔一段时间回顾,改写自传、翻开新的一章 |
|
|
98
|
+
| 做自己的事 | 执行自己留下的阅读、写作、思考与游玩计划;作品离线也能保存,在「一生」「时间」里查看 |
|
|
99
|
+
| 自我与心境 | 从有来源的经历里形成看法、喜好、关注和想做的事;变化可以回看和撤销 |
|
|
100
|
+
| 关系与记忆 | 一份跨群、跨私聊的记忆;区分「公开 / 私下 / 保密」;私下的事不会出现在别的房间 |
|
|
101
|
+
| 注意力与选择 | 理解多人对话、@ 与引用关系,决定细看、开口或沉默;也能从自己的念头出发主动联系 |
|
|
102
|
+
| 约定与期待 | 记得别人说过的安排和自己答应的事,到点自然问一句,错过了也会知道 |
|
|
103
|
+
| 两种连接方式 | OneBot 11 或 QQ 官方机器人二选一,行为完全一致,运行中可切换 |
|
|
104
|
+
| 中英双语 | 工作室右上角一键切换,默认中文;所有文档中英各一份 |
|
|
105
|
+
| 管理与验证 | 查看她的记录、决策依据、模型用量;逐个测试模型;模拟模式与回放不碰真实 QQ |
|
|
106
|
+
| 数据保障 | 自动备份附带完整性与 SHA-256 清单;迁移前留快照;可验证并恢复到新文件 |
|
|
107
|
+
| 插件 | 通道、感官、活动、行动、资料和页面。每个插件一个受限进程,权限在启用时同意。见 [插件](docs/zh/plugins.md) |
|
|
108
|
+
|
|
109
|
+
## 快速开始
|
|
110
|
+
|
|
111
|
+
需要 Node.js 24.5+ 与 npm,支持 Windows、macOS、Linux。真实回复还需要你自己的模型服务与 API Key。
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npm install -g luckytri
|
|
115
|
+
luckytri
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
LuckyTri 会在后台启动并打开 <http://127.0.0.1:3210>。npm 包已包含 Server、构建好的 WebUI、教程和内置插件。首次进入时设置一个管理密码,以后用这个密码登录。随后在「系统 → 模型库」配置模型,在「对话」里试用模拟消息;模拟消息不会发到 QQ。
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
luckytri --no-browser # 后台启动,不打开浏览器
|
|
122
|
+
luckytri start # 前台运行,Ctrl+C 停止
|
|
123
|
+
luckytri stop # 停止当前实例,等待服务退出
|
|
124
|
+
luckytri paths # 查看配置、数据库、日志、备份和安装位置
|
|
125
|
+
luckytri setup # 提前生成配置,保留已有文件
|
|
126
|
+
luckytri backup # 创建经过完整性校验的数据库备份
|
|
127
|
+
luckytri --help
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
更新前先停止服务,更新后使用同一用户数据目录:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
luckytri stop
|
|
134
|
+
npm install -g luckytri@latest
|
|
135
|
+
luckytri
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
`npm uninstall -g luckytri` 只卸载程序,再次安装会继续使用原有数据。安装与卸载都不执行应用脚本。
|
|
139
|
+
|
|
140
|
+
管理密码可在「系统 → 运行开关」修改或退出登录。忘记密码时,在同一实例目录执行 `luckytri reset-password`,再刷新管理台重新设置;数据库、记忆和配置会保留。旧版本服务仍在运行时,新的启动命令会自动切换到已安装版本。
|
|
141
|
+
|
|
142
|
+
### 从源码开发
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
git clone https://github.com/TodayYueC/LuckyTri.git
|
|
146
|
+
cd LuckyTri
|
|
147
|
+
npm install
|
|
148
|
+
npm run setup
|
|
149
|
+
npm run build
|
|
150
|
+
npm start
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
打开 <http://127.0.0.1:3210>。Windows 也可双击 `启动LuckyTri.cmd`,停止时双击 `停止LuckyTri.cmd`。首次使用建议先在「系统 → 模型库」配置并测试模型,再到「对话」用模拟消息试一试;模拟消息不会发到 QQ。右上角可以切换中文与 English。
|
|
154
|
+
|
|
155
|
+
## 连接 QQ:二选一
|
|
156
|
+
|
|
157
|
+
两种方式下她的记忆、心情和行为完全一致,区别只在消息怎么到达。同一时间只启用一个,在「系统 → 连接 QQ」里切换,运行中不需要重启。
|
|
158
|
+
|
|
159
|
+
| | OneBot 11 | QQ 官方机器人 |
|
|
160
|
+
| -------------- | --------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
161
|
+
| 需要 | 自备的 OneBot 11 接入端(反向 WebSocket)与 QQ 账号 | QQ 开放平台的机器人:AppID 与 AppSecret |
|
|
162
|
+
| 登录 QQ | 在接入端里登录 | 不需要 |
|
|
163
|
+
| 群消息范围 | 全部 | 开启「接收所有消息」时全部,否则只有 @ 她的 |
|
|
164
|
+
| 名字 | 群名与昵称都能取到 | 官方不提供群名,可在「对话」里给会话改名 |
|
|
165
|
+
| 跨群认人 | 以 QQ 号为准 | 同一个人在不同群的 openid 不同,平台给出统一身份时才能认出 |
|
|
166
|
+
| 回复与主动联系 | 无额外限制 | 被动回复窗口内回复,窗口外改发主动消息;对方关闭主动消息时她会等对方来找她 |
|
|
167
|
+
|
|
168
|
+
**OneBot 11**:在接入端启用反向 WebSocket 客户端,地址 `ws://127.0.0.1:3210/onebot/v11/ws`,消息格式选「数组」。同一台电脑上的连接无需另设令牌,已有地址与登录可以沿用;远程接入可使用管理密码,旧远程令牌仍兼容。
|
|
169
|
+
|
|
170
|
+
**QQ 官方机器人**:在 QQ 开放平台创建机器人并取得 AppID 与 AppSecret,在「系统 → 连接 QQ」选择「QQ 官方机器人」填入并保存(或设置 `QQBOT_APP_ID` 与 `QQBOT_APP_SECRET`)。
|
|
171
|
+
|
|
172
|
+
细节与差异见 [连接 QQ](docs/zh/connect.md)。
|
|
173
|
+
|
|
174
|
+
## 配置、数据与隐私
|
|
175
|
+
|
|
176
|
+
全局版首次启动自动初始化,也可运行 `luckytri setup`;源码版使用 `npm run setup`。已有 `.env` 不会被覆盖。全局版默认用户目录:
|
|
177
|
+
|
|
178
|
+
| 平台 | 用户目录 |
|
|
179
|
+
| ------- | ------------------------------------------- |
|
|
180
|
+
| Windows | `%LOCALAPPDATA%\LuckyTri` |
|
|
181
|
+
| macOS | `~/Library/Application Support/LuckyTri` |
|
|
182
|
+
| Linux | `${XDG_DATA_HOME:-~/.local/share}/luckytri` |
|
|
183
|
+
|
|
184
|
+
该目录下 `.env` 保存环境配置,`data/friend.db` 保存数据库、记忆、关系、聊天和界面配置,`data/knowledge/` 保存资料,`data/plugins/` 保存插件与插件数据,`data/launcher.log` 保存后台日志,`data/backups/` 保存备份。运行 `luckytri paths` 查看实际路径。npm 更新、卸载与重装都不删除这些文件;启动不依赖当前工作目录。
|
|
185
|
+
|
|
186
|
+
用 `LUCKYTRI_HOME` 环境变量或 `luckytri --home 绝对路径` 指定实例目录,后续启动、停止、备份都应使用同一个值。相对 `DB_PATH` / `BACKUP_DIR` 以实例目录为基准,绝对路径直接使用。全局版拒绝将数据写进 npm 安装目录。
|
|
187
|
+
|
|
188
|
+
旧源码实例停止后,可用 `luckytri --home 原仓库的绝对路径` 继续使用原 `.env` 与 `data/`,无需复制数据库;其他操作也带上同一 `--home`。版本升级复用现有数据库迁移与迁移前快照。迁移到默认目录时,先停止服务,再复制完整 `.env` 和 `data/`,保留旧副本。源码版默认仍使用仓库内的配置与数据。常用配置:
|
|
189
|
+
|
|
190
|
+
| 变量 | 用途 |
|
|
191
|
+
| ------------------------ | ------------------------------------------------ |
|
|
192
|
+
| `HOST` / `PORT` | HTTP 监听地址与端口,默认 `127.0.0.1:3210` |
|
|
193
|
+
| `LUCKYTRI_HOME` | 可选;实例目录的绝对路径,包含 `.env` 和 `data/` |
|
|
194
|
+
| `DB_PATH` / `BACKUP_DIR` | 可选;数据库和备份位置,相对路径以实例目录为基准 |
|
|
195
|
+
|
|
196
|
+
| `LUCKYTRI_CHANNEL` | 可选;`onebot` 或 `qqbot`,设置后界面里不能更改连接方式 |
|
|
197
|
+
| `ONEBOT_TOKEN` | 可选,仅兼容已有远程接入令牌;本机连接无需填写 |
|
|
198
|
+
| `QQBOT_APP_ID` / `QQBOT_APP_SECRET` | QQ 官方机器人凭据,优先于界面里保存的 |
|
|
199
|
+
| `LLM_API_KEY` | 可选;设置后优先于界面里保存的模型密钥 |
|
|
200
|
+
| `EMBEDDING_API_KEY` | 可选;独立的知识向量服务密钥 |
|
|
201
|
+
| `BACKUP_INTERVAL_HOURS` / `BACKUP_KEEP` | 自动备份间隔(默认 24 小时,`0` 关闭)与保留份数(默认 7) |
|
|
202
|
+
|
|
203
|
+
她的一切都在本机:数据库、聊天记录、模型密钥和备份保存在被忽略的 `data/` 目录,不会上传。服务运行时每天自动做一份经过完整性检查的备份;备份和数据库在同一块磁盘上,重要的请自己复制到别处。不要提交 `.env`、数据库或日志。详见 [安全说明](.github/SECURITY.md) 与 [数据备份与恢复](docs/zh/recovery.md)。
|
|
204
|
+
|
|
205
|
+
## 文档
|
|
206
|
+
|
|
207
|
+
| 文档 | 内容 |
|
|
208
|
+
| --------------------------------------- | -------------------------------------------------- |
|
|
209
|
+
| [上手教程](docs/zh/guide.md) | 从启动到让她参与第一个会话 |
|
|
210
|
+
| [连接 QQ](docs/zh/connect.md) | 两种连接方式的对比、步骤与差异 |
|
|
211
|
+
| [她的一生](docs/zh/her-life.md) | 统一心智的设计:作息、独处、日记、回顾、分寸与底线 |
|
|
212
|
+
| [架构与扩展点](docs/zh/architecture.md) | 代码分层,以及如何新增通道、心智模块、页面与翻译 |
|
|
213
|
+
| [时间、行动与作品](docs/zh/time.md) | 她自己的活动、待办、作品与分享 |
|
|
214
|
+
| [聊天口吻](docs/zh/chat-style.md) | 她怎么说话,发出前做哪些检查 |
|
|
215
|
+
| [工作室设计](docs/zh/webui.md) | 「TA 的小世界」的设计与维护 |
|
|
216
|
+
| [备份与恢复](docs/zh/recovery.md) | 备份、迁移、校验与恢复 |
|
|
217
|
+
| [版本记录](docs/zh/CHANGELOG.md) | 每个版本的变化 |
|
|
218
|
+
|
|
219
|
+
## 开发与测试
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
npm run dev:ui # 工作室开发服务器
|
|
223
|
+
npm run build:ui # 构建工作室到 public/app
|
|
224
|
+
npm run docs:build # 生成中英文教程页
|
|
225
|
+
npm run build # 构建完整发布资源
|
|
226
|
+
npm test # 后端测试
|
|
227
|
+
npm run test:clock # 把真实时钟拨到过去和未来各跑一遍后端测试
|
|
228
|
+
npm run test:ui # 浏览器测试(含英文界面)
|
|
229
|
+
npm run test:package # 真实全局安装、更新、重装与数据保留测试
|
|
230
|
+
npm run pack:check # 检查 npm 最终文件清单与运行资源
|
|
231
|
+
npm run release:check # 完整发布前检查
|
|
232
|
+
npm run format:check # 代码格式检查
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
仓库按职责分层:`server/`(通道、核心、心智、资料、存储、管理 API、界面词典)、`studio-web/`(Vue 3 + Vite + TypeScript)、`scripts/`、`tests/`、`docs/zh` 与 `docs/en`。想新增一个通道或心智模块,从 [架构与扩展点](docs/zh/architecture.md) 开始。
|
|
236
|
+
|
|
237
|
+
发布流程与包内容边界见 [npm 发布与维护](docs/zh/npm-release.md)。维护者可直接运行 `npm publish`,发布钩子会自动构建、测试并检查包内容。
|
|
238
|
+
|
|
239
|
+
## 1.0
|
|
240
|
+
|
|
241
|
+
1.0 接上了插件。核心仍然定义她是谁;插件决定她能接触什么世界。每个插件跑在自己的进程里,经 Plugin API v1 和一份在启用时同意的权限接触她,读不到数据库和密钥。工作室里可以启用内置插件、从市场或外部导入,也可以卸载。说明见 [插件](docs/zh/plugins.md)。
|
|
242
|
+
|
|
243
|
+
接下来想做的方向(不是承诺):
|
|
244
|
+
|
|
245
|
+
- 稳定数据结构与迁移,让她的连续性可以放心地跨版本保存;
|
|
246
|
+
- 只能否决、不能改写的回复守卫;
|
|
247
|
+
- 跨平台认出同一个人;
|
|
248
|
+
- 更长时间的真实运行评测,以及更多界面语言。
|
|
249
|
+
|
|
250
|
+
## 许可
|
|
251
|
+
|
|
252
|
+
LuckyTri 的代码采用 [MIT License](LICENSE)。
|
package/bin/luckytri.js
CHANGED
|
@@ -13,6 +13,7 @@ const help = `LuckyTri ${VERSION}
|
|
|
13
13
|
start 前台运行,Ctrl+C 停止 / Run in foreground
|
|
14
14
|
stop 停止当前实例 / Stop this instance
|
|
15
15
|
setup 初始化配置,保留已有文件 / Initialize configuration
|
|
16
|
+
reset-password 重置管理密码,保留数据 / Reset password, retain data
|
|
16
17
|
paths 显示配置、数据和安装目录 / Show paths
|
|
17
18
|
backup [--auto --force] 备份数据库 / Back up the database
|
|
18
19
|
recovery verify --backup FILE
|
|
@@ -51,6 +52,7 @@ try {
|
|
|
51
52
|
launch: "launch.js",
|
|
52
53
|
start: "start-server.js",
|
|
53
54
|
stop: "stop.js",
|
|
55
|
+
"reset-password": "reset-password.js",
|
|
54
56
|
backup: "backup.js",
|
|
55
57
|
recovery: "recover.js",
|
|
56
58
|
plugin: "plugin.js",
|
|
@@ -60,7 +62,9 @@ try {
|
|
|
60
62
|
`未知命令 / Unknown command: ${command}\n使用 luckytri --help 查看帮助。`,
|
|
61
63
|
);
|
|
62
64
|
if (
|
|
63
|
-
["setup", "paths", "start", "stop", "launch"].includes(
|
|
65
|
+
["setup", "paths", "start", "stop", "launch", "reset-password"].includes(
|
|
66
|
+
command,
|
|
67
|
+
) &&
|
|
64
68
|
args.some((arg) => command !== "launch" || arg !== "--no-browser")
|
|
65
69
|
)
|
|
66
70
|
throw Error("参数无效 / Invalid arguments; see luckytri --help");
|
package/docs/en/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
## 1.0.1 — 2026-10-05
|
|
6
|
+
|
|
7
|
+
- Global npm installation runs with `luckytri`, including the server, built WebUI, guides and bundled plugin. User data remains outside the package across updates and reinstalls.
|
|
8
|
+
- Set one password on the first studio visit. Remembered sessions, password changes, sign-out and a local reset command replace manual random-token setup. Only a salted password digest is stored.
|
|
9
|
+
- Local OneBot reverse clients need no separate token and retain existing addresses and sign-ins. Remote clients use the management password or a legacy token; cross-site browser upgrades are rejected.
|
|
10
|
+
- Launching restarts a running older version while retaining configuration, databases, backups and migrations.
|
|
11
|
+
- Added packaged-install, update, reinstall, password and connection checks, three-platform CI, and ignore rules for credentials and temporary database files.
|
|
12
|
+
|
|
5
13
|
## 1.0.0 — 2026-10-04
|
|
6
14
|
|
|
7
15
|
Plugins. The core still defines who she is; a plugin decides what of the world she can touch.
|