luckytri 1.0.0 → 1.0.1
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 +192 -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 +192 -216
- package/docs/zh/npm-release.md +33 -33
- package/package.json +109 -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-B9Odvzfz.js +3 -0
- package/public/app/assets/Empty-SkA8PyMo.js +2 -0
- package/public/app/assets/Field-BjLhi8pL.js +1 -0
- package/public/app/assets/HeartPage-CscKqMsr.js +1 -0
- package/public/app/assets/LifePage-BHCmBHlH.js +1 -0
- package/public/app/assets/MemoryPage-Bhs2xa1k.js +1 -0
- package/public/app/assets/NaturePage-CaPIar_5.js +3 -0
- package/public/app/assets/PeoplePage-CuwSSVeX.js +1 -0
- package/public/app/assets/PluginsPage-BhVm1SUi.js +2 -0
- package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
- package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-5yYqyUgR.css} +1 -1
- package/public/app/assets/SystemPage-Chm5fiGP.js +1 -0
- package/public/app/assets/TimePage-BUm4eUzB.js +3 -0
- package/public/app/assets/index-BIAdfObg.js +4 -0
- package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
- package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-DNDLyN9m.js} +1 -1
- package/public/app/assets/media-CKVAvML2.js +1 -0
- package/public/app/index.html +3 -3
- package/public/guide.en.html +32 -99
- package/public/guide.html +21 -86
- package/public/tutorial.en.md +15 -39
- package/public/tutorial.md +15 -39
- package/scripts/backup.js +311 -311
- package/scripts/browser.js +41 -41
- 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 +110 -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 +512 -497
- package/server/i18n/labels.js +649 -653
- package/server/index.js +107 -102
- package/server/knowledge/manager.js +386 -386
- 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 +241 -241
- package/server/storage/backup-cleanup-worker.js +8 -8
- package/server/storage/backup-cleanup.js +414 -414
- package/server/storage/backup-lock.js +76 -76
- package/server/storage/backup-scheduler.js +131 -131
- package/server/storage/store.js +199 -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/docs/zh/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
# 版本记录
|
|
4
4
|
|
|
5
|
+
## 1.0.1 — 2026-10-05
|
|
6
|
+
|
|
7
|
+
- 全局 npm 安装后直接运行 `luckytri`,服务端、WebUI、教程和内置插件一并安装;用户数据独立保存,更新和重装继续使用。
|
|
8
|
+
- 管理台首次进入时设置一个密码,支持登录保持、改密、退出与本机命令重置,不再要求查找随机管理令牌;密码只保存加盐校验摘要。
|
|
9
|
+
- 本机 OneBot 反向客户端无需额外令牌,已有地址和登录可接续;远程使用管理密码或已有令牌,拒绝浏览器跨站接入。
|
|
10
|
+
- 启动命令自动重启仍在运行的旧版本;保留现有配置、数据库、备份与迁移流程。
|
|
11
|
+
- 增加实际 npm 包安装、升级、重装、密码与连接回归,以及 Windows/macOS/Linux CI;补充敏感文件和临时数据库的忽略规则。
|
|
12
|
+
|
|
5
13
|
## 1.0.0 — 2026-10-04
|
|
6
14
|
|
|
7
15
|
插件。核心仍然定义她是谁;插件决定她能接触什么世界。
|
package/docs/zh/connect.md
CHANGED
|
@@ -8,17 +8,17 @@ LuckyTri 通过「通道」与 QQ 相遇。通道只管消息怎么到达、怎
|
|
|
8
8
|
|
|
9
9
|
## 怎么选
|
|
10
10
|
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
| 需要什么
|
|
14
|
-
| 连接方向
|
|
15
|
-
| 登录 QQ
|
|
16
|
-
| 群消息范围 | 全部群消息
|
|
17
|
-
| 名字
|
|
18
|
-
| 跨群认人
|
|
19
|
-
| 回复
|
|
20
|
-
| 主动联系
|
|
21
|
-
| 图片
|
|
11
|
+
| | OneBot 11 | QQ 官方机器人 |
|
|
12
|
+
| ---------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- |
|
|
13
|
+
| 需要什么 | 自备的 OneBot 11 接入端(支持反向 WebSocket 客户端)与一个 QQ 账号 | QQ 开放平台里的机器人:AppID 与 AppSecret |
|
|
14
|
+
| 连接方向 | 接入端连到 LuckyTri 的 `/onebot/v11/ws` | LuckyTri 连到开放平台的 WebSocket 网关 |
|
|
15
|
+
| 登录 QQ | 在接入端里登录 | 不需要 |
|
|
16
|
+
| 群消息范围 | 全部群消息 | 在开放平台开启「接收所有消息」时是全部;否则只有 @ 她的消息 |
|
|
17
|
+
| 名字 | 群名和昵称都能取到 | 官方接口不提供群名,单聊昵称常为空;可以在「对话」里给会话改名 |
|
|
18
|
+
| 跨群认人 | 以 QQ 号为准,跨群、私聊都是同一个人 | 同一个人在不同群里的 openid 不同;平台给出统一身份(`union_openid`)时才能认出是同一个人 |
|
|
19
|
+
| 回复 | 随时回复 | 在被动回复窗口内(群 5 分钟、单聊 60 分钟)按原消息回复,每个气泡递增序号;超出窗口改发主动消息 |
|
|
20
|
+
| 主动联系 | 没有额外限制 | 发主动消息;对方或群关闭了机器人的主动消息时,她会等对方来找她 |
|
|
21
|
+
| 图片 | 通过接入端取图 | 附件地址走同一条视觉链路,只放行官方媒体域名 |
|
|
22
22
|
|
|
23
23
|
没有哪一种更「正确」:想看到全部群消息、愿意自己维护接入端,选 OneBot 11;不想登录 QQ、也不想维护接入端,选官方机器人,并在开放平台开启「接收所有消息」。
|
|
24
24
|
|
|
@@ -26,14 +26,14 @@ LuckyTri 通过「通道」与 QQ 相遇。通道只管消息怎么到达、怎
|
|
|
26
26
|
|
|
27
27
|
LuckyTri 只实现 OneBot 11 的反向 WebSocket 接口,不包含接入端。
|
|
28
28
|
|
|
29
|
-
| 项目
|
|
30
|
-
|
|
|
31
|
-
| 协议
|
|
29
|
+
| 项目 | 填写 |
|
|
30
|
+
| ------------------- | ------------------------------------------------------------- |
|
|
31
|
+
| 协议 | OneBot 11 |
|
|
32
32
|
| 反向 WebSocket 地址 | `ws://127.0.0.1:3210/onebot/v11/ws`(端口以你的 `PORT` 为准) |
|
|
33
|
-
| Token
|
|
34
|
-
| 消息格式
|
|
33
|
+
| Token | 本机无需填写;远程可使用管理密码,旧远程令牌仍兼容 |
|
|
34
|
+
| 消息格式 | 数组 |
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
远程或容器接入请使用 LuckyTri 的可达地址,并先在本机设置管理密码。本机连接可直接沿用原地址和 QQ 登录。
|
|
37
37
|
|
|
38
38
|
## QQ 官方机器人
|
|
39
39
|
|
package/docs/zh/guide.md
CHANGED
|
@@ -1,216 +1,192 @@
|
|
|
1
|
-
<p align="right"><b>中文</b> · <a href="../en/guide.md">English</a></p>
|
|
2
|
-
|
|
3
|
-
# LuckyTri · 从零上手教程
|
|
4
|
-
|
|
5
|
-
LuckyTri 在你的电脑上运行,通过 QQ 与人相遇。QQ 有两种连接方式,二选一:**OneBot 11**(自备接入端,反向 WebSocket)或 **QQ 官方机器人**(QQ 开放平台)。两种方式下她的记忆、心情和行为完全一致,区别只在消息怎么到达。模型 API 由你自行配置。
|
|
6
|
-
|
|
7
|
-
界面右上角可以在「中文」与「English」之间切换,默认中文,选择会记在这个浏览器里。她自己说的话、写的日记和留下的念头不翻译,那是她自己的内容。
|
|
8
|
-
|
|
9
|
-
## 1. 启动
|
|
10
|
-
|
|
11
|
-
需要 Node.js 24.5 或更高版本。普通用户直接全局安装:
|
|
12
|
-
|
|
13
|
-
```powershell
|
|
14
|
-
node --version
|
|
15
|
-
npm install -g luckytri
|
|
16
|
-
luckytri
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
LuckyTri 在后台启动并打开 <http://127.0.0.1:3210>,首次运行自动生成配置。无需下载仓库或构建 WebUI。终端里的 SQLite 实验性提示不表示启动失败,以能否打开 LuckyTri 为准。
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
从源码开发时,在仓库中执行 `npm install`、`npm run setup`、`npm run build`、`npm start`。下文的 `npm run setup/stop/backup/recovery/plugin` 面向源码用户;全局用户使用对应的 `luckytri setup/stop/backup/recovery/plugin`。
|
|
24
|
-
|
|
25
|
-
Windows 日常使用可以双击 `启动LuckyTri.cmd`。服务已在运行时,它只打开 LuckyTri。关闭浏览器不会停止服务;停止时双击 `停止LuckyTri.cmd`,或在项目目录执行 `npm run stop`。这条命令只停止当前项目,不会结束其他 Node 进程。前台运行时也可以在该终端按 `Ctrl+C`。
|
|
26
|
-
|
|
27
|
-
LuckyTri 是「TA 的小世界」,左侧导航分三组、十个入口:
|
|
28
|
-
|
|
29
|
-
| 分组 | 入口 | 里面有什么 |
|
|
30
|
-
| ---- | ---- | ----------------------------------------------------------------------------------------------- |
|
|
31
|
-
| TA | 此刻 | TA 此刻的心情、正在做什么、最近说的话、放在心上和在等的事;今天的时间线、Token 用量和运行状态条 |
|
|
32
|
-
| TA | 内心 | 心灵星图(TA 的自我线索)、放在心上的便签、心情彩带 |
|
|
33
|
-
| TA | 人际 | 人物星系、每个人的详情、TA 在各群的样子 |
|
|
34
|
-
| TA | 一生 | 日记本与那天的 TA、回顾、我的来路与章节、约定与期待、书架 |
|
|
35
|
-
| 日常 | 时间 | TA 实际生活的记录:今日的活动、待办、作品库、持续项目、体验记录 |
|
|
36
|
-
| 日常 | 对话 | 会话列表、实时聊天与「为什么这么说」、反馈、会话设置、模拟消息、回到那一刻(回放) |
|
|
37
|
-
| 日常 | 记忆 | TA 记得的事、资料书架 |
|
|
38
|
-
| 设置 | 天性 | 名字与性格(旁边的光团实时预览)、作息、TA 的日子、每日 Token、高级指令、试聊 |
|
|
39
|
-
| 设置 | 系统 | 连接 QQ、模型库、运行开关 |
|
|
40
|
-
| 设置 | 插件 | 启用、安装和卸下她接触世界的方式。见 [插件](plugins.md) |
|
|
41
|
-
|
|
42
|
-
界面的颜色、天空和动效跟着 TA 的心情与作息变化:开心时暖、低落时灰蓝、睡着后变成夜晚。左下角可以把主题固定成某一种,也可以「减少动画」。右下角的小 TA 戳一下会回应一句,按住是摸摸头,双击或点「聊聊」打开试聊;这些只是界面动画,不会改变 TA 的心智。手机上导航在底部,其余入口在「更多」里。
|
|
43
|
-
|
|
44
|
-
## 2.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
npm run
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
|
181
|
-
|
|
|
182
|
-
|
|
|
183
|
-
|
|
|
184
|
-
|
|
|
185
|
-
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
执行前必须留下本实例近 72 小时内校验通过的自动备份,最新一份损坏时会尝试另一份。新备份清单带有数据库身份,防止另一实例的副本冒充当前实例的恢复保障;旧清单仍可验证和恢复,但需要更新自动备份后才能作为清理保障。备份和清理共用目录锁,运行库、同一文件的硬链接与正在使用的副本不能清理。清理失败时会列出失败文件,并准确统计已释放空间。要长期保留的历史恢复点,请先连同 `.db.json` 清单复制到另一块磁盘。
|
|
194
|
-
|
|
195
|
-
恢复时先停止服务,把当前 `data/friend.db` 及同名 `-wal`、`-shm` 移开,再把选中的备份复制为 `data/friend.db`。设置了 `DB_PATH` 时操作该路径。不要把旧的 WAL 文件和恢复后的数据库放在一起。更稳妥的做法是用 `npm run recovery` 校验并恢复到一个全新的文件,见 `docs/zh/recovery.md`。
|
|
196
|
-
|
|
197
|
-
## 9. 常见问题
|
|
198
|
-
|
|
199
|
-
| 现象 | 先检查 |
|
|
200
|
-
| ------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
201
|
-
| 页面打不开 | Node 是否在运行,地址是否为 `127.0.0.1:3210` |
|
|
202
|
-
| 端口已被占用 | 先 `npm run stop`,不要结束所有 node 进程 |
|
|
203
|
-
| 令牌错误 | 使用 `ADMIN_TOKEN`;改 `.env` 后重启 |
|
|
204
|
-
| OneBot 未连接 | 接入端是否登录,URL、端口、路径和 `ONEBOT_TOKEN` 是否一致 |
|
|
205
|
-
| 官方机器人未连接 | AppID 与 AppSecret 是否正确,机器人是否已开通群聊与单聊消息,网络能否访问 QQ 开放平台 |
|
|
206
|
-
| 官方机器人只收到 @ 的消息 | 在开放平台开启「接收所有消息」;这是平台权限,不是 LuckyTri 的限制 |
|
|
207
|
-
| 连接成功但没有会话 | 在 QQ 再发一条新消息;OneBot 方式下检查消息格式是否为数组 |
|
|
208
|
-
| 群里不回复 | 全局开关、会话开关、模拟模式、密钥;「对话」里是「TA 扫了一眼」还是 TA 细看后选择了不出声 |
|
|
209
|
-
| @ 了也不回 | TA 是否睡着了(「此刻」,界面是夜晚)、每分钟限速、今日 Token 是否用完、模型错误,或 TA 自己的理由 |
|
|
210
|
-
| 模型 401 / 403 | 密钥和权限;环境变量密钥可能覆盖 LuckyTri 里保存的密钥 |
|
|
211
|
-
| 模型 404 | API 地址不要重复拼接 `/chat/completions`,核对模型 ID |
|
|
212
|
-
| 模型不返回 JSON | 换支持 JSON 对象输出的模型,先做连接测试 |
|
|
213
|
-
| 记忆没有出现 | 是否是明确的「记住,我……」,是否被撤销,分寸是否为「要 TA 保密」而当前不在原来的会话 |
|
|
214
|
-
| 界面动得太多 | 左下角「减少动画」;系统开启了减少动态效果时会自动关闭粒子和形变 |
|
|
215
|
-
|
|
216
|
-
不要把 API 密钥、`.env` 或私聊原文发到公开位置。
|
|
1
|
+
<p align="right"><b>中文</b> · <a href="../en/guide.md">English</a></p>
|
|
2
|
+
|
|
3
|
+
# LuckyTri · 从零上手教程
|
|
4
|
+
|
|
5
|
+
LuckyTri 在你的电脑上运行,通过 QQ 与人相遇。QQ 有两种连接方式,二选一:**OneBot 11**(自备接入端,反向 WebSocket)或 **QQ 官方机器人**(QQ 开放平台)。两种方式下她的记忆、心情和行为完全一致,区别只在消息怎么到达。模型 API 由你自行配置。
|
|
6
|
+
|
|
7
|
+
界面右上角可以在「中文」与「English」之间切换,默认中文,选择会记在这个浏览器里。她自己说的话、写的日记和留下的念头不翻译,那是她自己的内容。
|
|
8
|
+
|
|
9
|
+
## 1. 启动
|
|
10
|
+
|
|
11
|
+
需要 Node.js 24.5 或更高版本。普通用户直接全局安装:
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
node --version
|
|
15
|
+
npm install -g luckytri
|
|
16
|
+
luckytri
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
LuckyTri 在后台启动并打开 <http://127.0.0.1:3210>,首次运行自动生成配置。无需下载仓库或构建 WebUI。终端里的 SQLite 实验性提示不表示启动失败,以能否打开 LuckyTri 为准。
|
|
20
|
+
|
|
21
|
+
首次进入管理台时设置一个密码即可。`luckytri --no-browser` 只后台启动,`luckytri start` 前台运行,`luckytri stop` 停止服务。更新使用 `luckytri stop` → `npm install -g luckytri@latest` → `luckytri`,密码、配置与数据会保留。
|
|
22
|
+
|
|
23
|
+
从源码开发时,在仓库中执行 `npm install`、`npm run setup`、`npm run build`、`npm start`。下文的 `npm run setup/stop/backup/recovery/plugin` 面向源码用户;全局用户使用对应的 `luckytri setup/stop/backup/recovery/plugin`。
|
|
24
|
+
|
|
25
|
+
Windows 日常使用可以双击 `启动LuckyTri.cmd`。服务已在运行时,它只打开 LuckyTri。关闭浏览器不会停止服务;停止时双击 `停止LuckyTri.cmd`,或在项目目录执行 `npm run stop`。这条命令只停止当前项目,不会结束其他 Node 进程。前台运行时也可以在该终端按 `Ctrl+C`。
|
|
26
|
+
|
|
27
|
+
LuckyTri 是「TA 的小世界」,左侧导航分三组、十个入口:
|
|
28
|
+
|
|
29
|
+
| 分组 | 入口 | 里面有什么 |
|
|
30
|
+
| ---- | ---- | ----------------------------------------------------------------------------------------------- |
|
|
31
|
+
| TA | 此刻 | TA 此刻的心情、正在做什么、最近说的话、放在心上和在等的事;今天的时间线、Token 用量和运行状态条 |
|
|
32
|
+
| TA | 内心 | 心灵星图(TA 的自我线索)、放在心上的便签、心情彩带 |
|
|
33
|
+
| TA | 人际 | 人物星系、每个人的详情、TA 在各群的样子 |
|
|
34
|
+
| TA | 一生 | 日记本与那天的 TA、回顾、我的来路与章节、约定与期待、书架 |
|
|
35
|
+
| 日常 | 时间 | TA 实际生活的记录:今日的活动、待办、作品库、持续项目、体验记录 |
|
|
36
|
+
| 日常 | 对话 | 会话列表、实时聊天与「为什么这么说」、反馈、会话设置、模拟消息、回到那一刻(回放) |
|
|
37
|
+
| 日常 | 记忆 | TA 记得的事、资料书架 |
|
|
38
|
+
| 设置 | 天性 | 名字与性格(旁边的光团实时预览)、作息、TA 的日子、每日 Token、高级指令、试聊 |
|
|
39
|
+
| 设置 | 系统 | 连接 QQ、模型库、运行开关 |
|
|
40
|
+
| 设置 | 插件 | 启用、安装和卸下她接触世界的方式。见 [插件](plugins.md) |
|
|
41
|
+
|
|
42
|
+
界面的颜色、天空和动效跟着 TA 的心情与作息变化:开心时暖、低落时灰蓝、睡着后变成夜晚。左下角可以把主题固定成某一种,也可以「减少动画」。右下角的小 TA 戳一下会回应一句,按住是摸摸头,双击或点「聊聊」打开试聊;这些只是界面动画,不会改变 TA 的心智。手机上导航在底部,其余入口在「更多」里。
|
|
43
|
+
|
|
44
|
+
## 2. 设置管理密码
|
|
45
|
+
|
|
46
|
+
首次打开管理台时设置一个至少 8 个字符的密码,确认后进入。以后用同一个密码登录,不需要打开 `.env` 查找管理令牌。浏览器登录状态会保留;更新和重装不会重置密码。
|
|
47
|
+
|
|
48
|
+
在「系统 → 运行开关」可以修改密码或退出登录。密码只以加盐校验摘要保存,现有环境配置和模型密钥保留。
|
|
49
|
+
|
|
50
|
+
## 3. 先在模拟模式试聊
|
|
51
|
+
|
|
52
|
+
默认开启模拟模式,消息不会发到 QQ。
|
|
53
|
+
|
|
54
|
+
1. 打开「对话」,点会话列表上方的「+ 添加会话」,填写测试群号和名称。
|
|
55
|
+
2. 在中间的聊天里点「模拟消息」,以一位群友的身份输入一句普通消息并发送。
|
|
56
|
+
3. 点 TA 回复下面的「为什么这么说」查看理由;「TA 扫了一眼」「TA 看了,没出声」会显示成聊天里的分隔条。
|
|
57
|
+
|
|
58
|
+
没有模型密钥时,模拟回复使用本地样例,不调用模型。有密钥后,同一条路径会走真实发言流程,但仍然不发 QQ。模拟消息写进模拟会话,不会改变 TA 的心情、关系和记忆。
|
|
59
|
+
|
|
60
|
+
「模拟消息」只在模拟模式下可用。右下角小 TA 的「聊聊」和「天性」右侧的试聊是另一回事:走真实链路,读取 TA 此刻的心智,天性页还可以带上没保存的草稿,但什么都不写入,也不发 QQ。
|
|
61
|
+
|
|
62
|
+
## 4. 连接模型
|
|
63
|
+
|
|
64
|
+
打开「系统 → 模型库」,点「+ 新增模型」选择一个预设。
|
|
65
|
+
|
|
66
|
+
- API 地址填写服务商的兼容接口根路径。程序会自己拼接 `/chat/completions`,不要把完整路径再写一遍。
|
|
67
|
+
- 模型名称填写服务商接受的模型 ID。
|
|
68
|
+
- API Key 留空表示保留已保存的密钥。
|
|
69
|
+
|
|
70
|
+
预设只填入常见地址和模型名,以服务商控制台里的实际模型为准。发言决策和回复生成需要模型返回 JSON 对象。
|
|
71
|
+
|
|
72
|
+
保存后点「测试此模型连接」。测试不携带群聊原文。更换地址、模型或密钥后需要重新测试。
|
|
73
|
+
|
|
74
|
+
也可以先保持模拟模式,在「天性」里和 TA 试聊,确认 TA 说话的样子后再让 TA 参加真实 QQ。
|
|
75
|
+
|
|
76
|
+
### 图片读取
|
|
77
|
+
|
|
78
|
+
在模型档案里开启「图片理解」,并使用服务商支持视觉的模型。图片从 QQ 地址、本地缓存或图片缓存接口读取,默认接受不超过 32 MiB、8000 万像素的源图,不再把超过 4 MiB 的普通照片和截图直接拒绝。小图经过解码验证后保持原样;大截图先尝试无损压缩,必要时再压缩编码或按比例缩小,照片按方向信息转正,不裁切画面。提交模型的每张图片默认不超过 4 MiB,最长边不超过 8192 像素,像素总量不超过 1600 万;原图不被修改,重复图片仍按原内容识别。
|
|
79
|
+
|
|
80
|
+
下载默认最多等待 30 秒,读取过程中断或图片损坏只影响该图片,不会阻止同一批其他正常图片。AVIF 会转换成通用格式;动态图本轮读取第一帧,不能据此判断完整动画。QQ 缓存接口返回大 Base64 图片不会再受到普通消息 1 MiB 限制,但普通消息仍保持原有上限。
|
|
81
|
+
|
|
82
|
+
需要调整时,可在 `.env` 设置 `VISION_SOURCE_MAX_MB`(4–64,默认 32)、`VISION_MODEL_MAX_MB`(1–4,默认 4)和 `VISION_DOWNLOAD_TIMEOUT_SECONDS`(5–120,默认 30),重启生效。图片能否理解还取决于所选模型的视觉能力和服务商接口是否可用。
|
|
83
|
+
|
|
84
|
+
## 5. 连接 QQ
|
|
85
|
+
|
|
86
|
+
打开「系统 → 连接 QQ」,顶部有两个选项:**OneBot 11** 与 **QQ 官方机器人**,同一时间只使用一个。切换后会断开当前连接;原来方式下的会话仍可查看,但不能再向它们发送消息。两种方式的差别见 `docs/zh/connect.md`,下面是操作步骤。
|
|
87
|
+
|
|
88
|
+
### 方式一:OneBot 11
|
|
89
|
+
|
|
90
|
+
LuckyTri 只实现 OneBot 11 的反向 WebSocket 接口,接入端需要你自行准备和管理。
|
|
91
|
+
|
|
92
|
+
1. 本机连接无需单独令牌,保留已有的接入地址和 QQ 登录。
|
|
93
|
+
2. 在接入端自己的网络设置里添加 OneBot 11 反向 WebSocket 客户端:
|
|
94
|
+
|
|
95
|
+
| 项目 | 本机填写 |
|
|
96
|
+
| ------------- | -------------------------------------------------- |
|
|
97
|
+
| 协议 | OneBot 11 |
|
|
98
|
+
| WebSocket URL | `ws://127.0.0.1:3210/onebot/v11/ws` |
|
|
99
|
+
| Token | 本机无需填写;远程可使用管理密码,旧远程令牌仍兼容 |
|
|
100
|
+
| 消息格式 | 数组 |
|
|
101
|
+
| 启用 | 开启并保存 |
|
|
102
|
+
|
|
103
|
+
3. 在接入端完成 QQ 登录。小号需要已加入目标群;LuckyTri 不保存 QQ 密码。
|
|
104
|
+
|
|
105
|
+
容器或另一台电脑中的 `127.0.0.1` 指向自身。远程接入使用 LuckyTri 的可达地址,并先在本机设置管理密码;对外提供管理台时使用 HTTPS。
|
|
106
|
+
|
|
107
|
+
### 方式二:QQ 官方机器人
|
|
108
|
+
|
|
109
|
+
不需要登录 QQ 账号,也不需要额外的接入端,LuckyTri 自己连接 QQ 开放平台。
|
|
110
|
+
|
|
111
|
+
1. 在 QQ 开放平台创建机器人,记下 **AppID** 与 **AppSecret**,并按平台要求开通群聊与单聊消息、把机器人加入要测试的群或添加为联系人。平台的入口和审核规则会调整,以开放平台当前说明为准。
|
|
112
|
+
2. 在「系统 → 连接 QQ」选择「QQ 官方机器人」,填写 AppID 和 AppSecret,点击保存。也可以在 `.env` 里设置 `QQBOT_APP_ID` 与 `QQBOT_APP_SECRET`。AppSecret 保存后不会再显示。
|
|
113
|
+
3. 状态显示「已连接」后,到群里 @ 她或私聊一句。想让她看到群里的全部消息,需要在开放平台开启「接收所有消息」;没有开启时她只能收到 @ 她的消息,连接页会提示这一点。
|
|
114
|
+
4. 官方接口不提供群名,新会话会以编号显示,可以在「对话」里给会话改名。
|
|
115
|
+
|
|
116
|
+
两种方式都是:已连接只表示传输通了。到目标群发一条消息后,会话会出现在「对话」的会话列表里,新发现的会话默认暂停参与。
|
|
117
|
+
|
|
118
|
+
## 6. 让 TA 参与会话
|
|
119
|
+
|
|
120
|
+
1. 在「系统 → 运行开关」确认允许参与聊天,关闭模拟模式并保存。「此刻」的状态条也能看到这两项。
|
|
121
|
+
2. 在「对话」选中目标群,在右侧「这个会话」里点「开启参与」,或直接拨动列表里的开关。
|
|
122
|
+
3. 在 QQ 里 @ 她,或直接叫 TA 的名字。
|
|
123
|
+
4. 回到「对话」查看消息和「为什么这么说」。
|
|
124
|
+
|
|
125
|
+
开不开口由 TA 自己决定,没有参与概率和冷却。被点名、私聊、引用 TA 或出现危机信号时,TA 一定会细看,然后选择回答、简短反应、说不想聊或不出声;理由显示在「对话」和「此刻 → 今天的 TA」。普通群消息只在 TA 在意时细看——刚聊过、有人问大家、聊到 TA 的兴趣、熟人在说话、攒了不少消息——其余只扫一眼,不调用模型,下次细看时一起读。觉得 TA 太安静,可以在「天性」里提高「主动」。
|
|
126
|
+
|
|
127
|
+
TA 默认 02:00 睡、08:00 醒,在「天性 → 作息」里拖动月亮和太阳修改,或者关闭。睡着时被叫到,会等醒来再看;这时整个界面会变成夜晚。每分钟发言轮数限制仍然保留,用来避免短时间连续发言。
|
|
128
|
+
|
|
129
|
+
在模型里打开「图片理解」后,私聊、@ 或引用里的图片会先由本机读取,再交给模型看画面。主模型不能看图时,在「对话 → 这个会话 → 会话设置」里另选一个打开了图片理解的视觉兼容模型。没有打开图片理解的模型不会收到画面。
|
|
130
|
+
|
|
131
|
+
## 7. TA、记忆和知识
|
|
132
|
+
|
|
133
|
+
「天性」是唯一由你编写的部分:名字、性格、兴趣、边界、底线和作息,每次保存为新的一版。拖动性格刻度时,旁边的光团会跟着变:温柔让颜色变暖、嘴角上扬,活泼让它跳得更快。
|
|
134
|
+
|
|
135
|
+
其余的都从经历里长出来:TA 的自我是「内心」星图里的一颗颗星,TA 对每个人的感觉在「人际」,TA 在各群的样子在「人际」下方的群像里。点开可以看到每次变化的来源,觉得不对可以撤销;撤销过的内容之后不会被写回来。很久没被触及的线索会慢慢淡出,退到星图的「远方」;它们没有被删除,被聊到时会重新想起。TA 独处、写日记、夜里整理、回顾和改写自传的记录,以及 TA 在等的事(别人说的安排、TA 答应的事,可以撤销),都在「一生」。每日 Token 上限、后台份额、夜里整理和回顾间隔在「天性 → TA 的日子」里设置。
|
|
136
|
+
|
|
137
|
+
「记忆」里先选择会话,也可以按人筛选。
|
|
138
|
+
|
|
139
|
+
- TA 对所有会话只有一份记忆:别处知道的事只在相关时想起;私聊里知道的标为「私下知道」,不当众说;被要求保密的只在原来的会话里。可以在每条记忆上调整分寸、锁定或撤销。关于某个人的记忆也会出现在「人际」的人物详情里。
|
|
140
|
+
- 群友说「记住,我……」会直接成为 TA 记得的事(密码、验证码之类不会记)。
|
|
141
|
+
- 资料放进「资料书架」的集合后按当前会话的可见范围检索。群聊不会装入其他私聊集合。
|
|
142
|
+
- 清空「对话」里的上下文不会删除长期记忆。
|
|
143
|
+
|
|
144
|
+
## 8. 备份与停止
|
|
145
|
+
|
|
146
|
+
```powershell
|
|
147
|
+
npm run backup
|
|
148
|
+
npm run stop
|
|
149
|
+
npm start
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
备份写到 `data/backups/`。数据库里有聊天、记忆和保存在库中的密钥,按私密文件保管。`.env` 不在这份备份里。
|
|
153
|
+
|
|
154
|
+
TA 的一切都存在这一个数据库里,所以服务运行时会自动备份:默认每 24 小时在另一个进程里做一份 `luckytri-auto-*.db`,只保留最近 7 份,做完会检查完整性。自动备份里有聊天、记忆、自我、日记和关系,但不带一天以前的模型调用记录(每条动辄几百 KB,会让备份大上十几倍),所以「为什么这么说」只能回看最近一天的。`npm run backup` 仍然是完整备份。可以在 `.env` 里调整:
|
|
155
|
+
|
|
156
|
+
| 变量 | 含义 | 默认 |
|
|
157
|
+
| ----------------------- | ---------------------------- | -------------- |
|
|
158
|
+
| `BACKUP_INTERVAL_HOURS` | 自动备份间隔,`0` 关闭 | `24` |
|
|
159
|
+
| `BACKUP_KEEP` | 保留几份自动备份 | `7` |
|
|
160
|
+
| `BACKUP_TRACE_DAYS` | 备份里保留最近几天的调用记录 | `1` |
|
|
161
|
+
| `BACKUP_DIR` | 备份目录 | `data/backups` |
|
|
162
|
+
|
|
163
|
+
想立刻做一份自动备份:`node scripts/backup.js --auto --force`。自动备份失败会记在启动窗口或 `data/launcher.log`,并隔越来越久才重试。备份和数据库放在同一块磁盘上,防不了磁盘损坏;重要的备份请自己复制到别处。
|
|
164
|
+
|
|
165
|
+
设置 `DB_PATH` 使用另一份数据库时,若未指定 `BACKUP_DIR`,备份默认写到该数据库旁的 `backups` 目录,避免多个实例的副本混在一起。
|
|
166
|
+
|
|
167
|
+
在「系统 → 数据与备份」可以查看每份历史数据库副本的大小,设置每天的整理时间、完整备份保留天数和最多份数,也可以逐份勾选后手动清理。默认每天服务器本地时间 04:30 检查,完整备份超过 14 天或多于 2 份就会列入整理;数量可设为 0,表示定时不保留完整备份。完整备份和迁移快照没有固定硬锁,可以手动选择全部清理。自动备份继续按上面的独立规则轮换,只轮换本实例有身份的副本,最新两份作为恢复点保留;无法确认身份的旧副本、迁移、旧版本和升级前快照仅手动清理。
|
|
168
|
+
|
|
169
|
+
执行前必须留下本实例近 72 小时内校验通过的自动备份,最新一份损坏时会尝试另一份。新备份清单带有数据库身份,防止另一实例的副本冒充当前实例的恢复保障;旧清单仍可验证和恢复,但需要更新自动备份后才能作为清理保障。备份和清理共用目录锁,运行库、同一文件的硬链接与正在使用的副本不能清理。清理失败时会列出失败文件,并准确统计已释放空间。要长期保留的历史恢复点,请先连同 `.db.json` 清单复制到另一块磁盘。
|
|
170
|
+
|
|
171
|
+
恢复时先停止服务,把当前 `data/friend.db` 及同名 `-wal`、`-shm` 移开,再把选中的备份复制为 `data/friend.db`。设置了 `DB_PATH` 时操作该路径。不要把旧的 WAL 文件和恢复后的数据库放在一起。更稳妥的做法是用 `npm run recovery` 校验并恢复到一个全新的文件,见 `docs/zh/recovery.md`。
|
|
172
|
+
|
|
173
|
+
## 9. 常见问题
|
|
174
|
+
|
|
175
|
+
| 现象 | 先检查 |
|
|
176
|
+
| ------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
177
|
+
| 页面打不开 | Node 是否在运行,地址是否为 `127.0.0.1:3210` |
|
|
178
|
+
| 端口已被占用 | 先 `npm run stop`,不要结束所有 node 进程 |
|
|
179
|
+
| 密码错误 | 使用首次设置的管理密码;可在系统运行开关中修改 |
|
|
180
|
+
| OneBot 未连接 | 确认接入端已登录、反向客户端启用、地址端口路径一致;本机无需额外令牌 |
|
|
181
|
+
| 官方机器人未连接 | AppID 与 AppSecret 是否正确,机器人是否已开通群聊与单聊消息,网络能否访问 QQ 开放平台 |
|
|
182
|
+
| 官方机器人只收到 @ 的消息 | 在开放平台开启「接收所有消息」;这是平台权限,不是 LuckyTri 的限制 |
|
|
183
|
+
| 连接成功但没有会话 | 在 QQ 再发一条新消息;OneBot 方式下检查消息格式是否为数组 |
|
|
184
|
+
| 群里不回复 | 全局开关、会话开关、模拟模式、密钥;「对话」里是「TA 扫了一眼」还是 TA 细看后选择了不出声 |
|
|
185
|
+
| @ 了也不回 | TA 是否睡着了(「此刻」,界面是夜晚)、每分钟限速、今日 Token 是否用完、模型错误,或 TA 自己的理由 |
|
|
186
|
+
| 模型 401 / 403 | 密钥和权限;环境变量密钥可能覆盖 LuckyTri 里保存的密钥 |
|
|
187
|
+
| 模型 404 | API 地址不要重复拼接 `/chat/completions`,核对模型 ID |
|
|
188
|
+
| 模型不返回 JSON | 换支持 JSON 对象输出的模型,先做连接测试 |
|
|
189
|
+
| 记忆没有出现 | 是否是明确的「记住,我……」,是否被撤销,分寸是否为「要 TA 保密」而当前不在原来的会话 |
|
|
190
|
+
| 界面动得太多 | 左下角「减少动画」;系统开启了减少动态效果时会自动关闭粒子和形变 |
|
|
191
|
+
|
|
192
|
+
不要把 API 密钥、`.env` 或私聊原文发到公开位置。
|
package/docs/zh/npm-release.md
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
# npm 发布与维护
|
|
2
|
-
|
|
3
|
-
发布复用 LuckyTri 当前 Git 仓库和 `package.json`,包名为 `luckytri`,版本继续由 `server/version.js` 从根 `package.json` 读取。
|
|
4
|
-
|
|
5
|
-
## 结构与启动
|
|
6
|
-
|
|
7
|
-
`server/` 是无需转译的 ESM 服务端,运行依赖为 Express、ws 和 sharp;SQLite 使用 Node.js 内置的 `node:sqlite`,最低 Node.js 24.5。`studio-web/` 使用 Vue 与 Vite,发布前构建到 `public/app/`。教程从中英文 `docs/*/guide.md` 生成到 `public/`。
|
|
8
|
-
|
|
9
|
-
`bin/luckytri.js` 提供全局命令,分派到既有启动、停止、备份、恢复与插件脚本。`scripts/runtime.js` 复用 `scripts/setup.js`
|
|
10
|
-
|
|
11
|
-
数据库、心智、聊天、界面配置继续使用原 SQLite 存储与迁移;知识文件、插件安装与插件数据、日志和备份都在实例目录中。启动锁保留到服务退出,阻止重复打开同一实例。Windows、macOS、Linux 分别使用系统浏览器打开方式;无桌面环境可使用 `--no-browser`。
|
|
12
|
-
|
|
13
|
-
## 包内容边界
|
|
14
|
-
|
|
15
|
-
`package.json.files` 白名单只包含 CLI、服务端、运行脚本、构建后的 WebUI、教程、插件桥接资源、内置天气插件、SDK 和公开文档。`.npmignore` 再排除敏感及本地文件。安装和卸载没有应用生命周期脚本,普通用户无需前端构建工具。
|
|
16
|
-
|
|
17
|
-
`npm run pack:check` 使用 npm 实际生成的最终文件清单,先检查路径,再检查经过批准的源码内容,拒绝配置、秘密文件、数据库、聊天、日志、备份、开发文件和意外新增文件。它还校验 CLI shebang、关键资源、WebUI 资源引用及源代码中的常见秘密格式。不要使用 `--ignore-scripts` 从未经验证的源码直接发布。
|
|
18
|
-
|
|
19
|
-
## 发布流程
|
|
20
|
-
|
|
21
|
-
维护者需要开发依赖和 Playwright 浏览器。Windows 默认使用已安装的 Edge;Linux/macOS 可用 `npx playwright install chromium` 安装测试浏览器。
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
npm ci
|
|
25
|
-
npm run release:check
|
|
26
|
-
npm publish
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
`release:check` 构建完整资源、运行全部后端与 WebUI 测试、检查实际包并验证全局安装。`prepublishOnly` 自动执行构建、后端测试和实际包安装测试;`prepack` 自动构建并检查最终包内容。发新版本前同时更新 `package.json` 与 lockfile,并更新版本记录;已发布的版本不可覆盖。
|
|
30
|
-
|
|
31
|
-
包测试使用临时 npm 全局前缀和模拟数据,检查含空格、中文的任意调用目录、WebUI 浏览器加载、内置插件、数据库备份及恢复检查,再安装测试版本并卸载重装,确认配置、记忆、关系、聊天、知识文件、日志、备份和插件数据保留。测试版本只存在于本机临时压缩包,不发布。测试清单和经过验证的正式压缩包输出到被 Git 忽略的 `workspace/npm-release/`。完成检查后也可直接发布该目录中的正式 `.tgz`,保证上传的是已经检查和安装过的同一份包。
|
|
32
|
-
|
|
33
|
-
首次发布需要 npm 注册与登录。发布命令使用 npm 自己的登录流程,不读取或输出登录凭据文件;如果 npm 要求二次验证,由账号本人完成认证后继续发布。
|
|
1
|
+
# npm 发布与维护
|
|
2
|
+
|
|
3
|
+
发布复用 LuckyTri 当前 Git 仓库和 `package.json`,包名为 `luckytri`,版本继续由 `server/version.js` 从根 `package.json` 读取。
|
|
4
|
+
|
|
5
|
+
## 结构与启动
|
|
6
|
+
|
|
7
|
+
`server/` 是无需转译的 ESM 服务端,运行依赖为 Express、ws 和 sharp;SQLite 使用 Node.js 内置的 `node:sqlite`,最低 Node.js 24.5。`studio-web/` 使用 Vue 与 Vite,发布前构建到 `public/app/`。教程从中英文 `docs/*/guide.md` 生成到 `public/`。
|
|
8
|
+
|
|
9
|
+
`bin/luckytri.js` 提供全局命令,分派到既有启动、停止、备份、恢复与插件脚本。`scripts/runtime.js` 复用 `scripts/setup.js` 的本机环境初始化与管理台首次密码设置,并保留已有配置。`server/paths.js` 将包内资源与实例数据分开;源码默认继续使用仓库的 `.env` 和 `data/`,npm 安装默认使用独立用户目录。相对数据库和备份路径以实例目录为基准,后台进程和自动备份子进程继承相同的绝对路径。服务身份以实例目录确认,更新程序安装位置后仍能定位原实例。
|
|
10
|
+
|
|
11
|
+
数据库、心智、聊天、界面配置继续使用原 SQLite 存储与迁移;知识文件、插件安装与插件数据、日志和备份都在实例目录中。启动锁保留到服务退出,阻止重复打开同一实例。Windows、macOS、Linux 分别使用系统浏览器打开方式;无桌面环境可使用 `--no-browser`。
|
|
12
|
+
|
|
13
|
+
## 包内容边界
|
|
14
|
+
|
|
15
|
+
`package.json.files` 白名单只包含 CLI、服务端、运行脚本、构建后的 WebUI、教程、插件桥接资源、内置天气插件、SDK 和公开文档。`.npmignore` 再排除敏感及本地文件。安装和卸载没有应用生命周期脚本,普通用户无需前端构建工具。
|
|
16
|
+
|
|
17
|
+
`npm run pack:check` 使用 npm 实际生成的最终文件清单,先检查路径,再检查经过批准的源码内容,拒绝配置、秘密文件、数据库、聊天、日志、备份、开发文件和意外新增文件。它还校验 CLI shebang、关键资源、WebUI 资源引用及源代码中的常见秘密格式。不要使用 `--ignore-scripts` 从未经验证的源码直接发布。
|
|
18
|
+
|
|
19
|
+
## 发布流程
|
|
20
|
+
|
|
21
|
+
维护者需要开发依赖和 Playwright 浏览器。Windows 默认使用已安装的 Edge;Linux/macOS 可用 `npx playwright install chromium` 安装测试浏览器。
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm ci
|
|
25
|
+
npm run release:check
|
|
26
|
+
npm publish
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`release:check` 构建完整资源、运行全部后端与 WebUI 测试、检查实际包并验证全局安装。`prepublishOnly` 自动执行构建、后端测试和实际包安装测试;`prepack` 自动构建并检查最终包内容。发新版本前同时更新 `package.json` 与 lockfile,并更新版本记录;已发布的版本不可覆盖。
|
|
30
|
+
|
|
31
|
+
包测试使用临时 npm 全局前缀和模拟数据,检查含空格、中文的任意调用目录、WebUI 浏览器加载、内置插件、数据库备份及恢复检查,再安装测试版本并卸载重装,确认配置、记忆、关系、聊天、知识文件、日志、备份和插件数据保留。测试版本只存在于本机临时压缩包,不发布。测试清单和经过验证的正式压缩包输出到被 Git 忽略的 `workspace/npm-release/`。完成检查后也可直接发布该目录中的正式 `.tgz`,保证上传的是已经检查和安装过的同一份包。
|
|
32
|
+
|
|
33
|
+
首次发布需要 npm 注册与登录。发布命令使用 npm 自己的登录流程,不读取或输出登录凭据文件;如果 npm 要求二次验证,由账号本人完成认证后继续发布。
|