tavern-harness 0.1.7 → 0.1.9
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/LICENSE +21 -0
- package/README.md +22 -8
- package/README.zh.md +22 -8
- package/index.html +1 -1
- package/package.json +1 -1
- package/src/components/ChatView.tsx +2 -1
- package/src/core/i18n.ts +3 -0
- package/src/theme/chat.css +1 -2
- package/src/theme/global.css +6 -9
- package/src/theme/views.css +6 -5
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yipeng Wang
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://rannichan.github.io/Tavern-Harness/">
|
|
3
|
+
<img alt="Tavern Harness logo" src="https://raw.githubusercontent.com/Rannichan/Tavern-Harness/main/public/tavern-harness-logo.png" width="128">
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center">
|
|
7
|
+
<a href="https://github.com/Rannichan/Tavern-Harness"><img alt="GitHub Repository" src="https://img.shields.io/badge/github-repository-181717?style=flat-square&logo=github&logoColor=white" /></a>
|
|
8
|
+
<a href="https://discord.gg/kPSWGeaHx"><img alt="Discord" src="https://img.shields.io/badge/discord-community-5865F2?style=flat-square&logo=discord&logoColor=white" /></a>
|
|
9
|
+
<a href="https://rannichan.github.io/Tavern-Harness/wiki.html"><img alt="Wiki" src="https://img.shields.io/badge/wiki-documentation-2563EB?style=flat-square" /></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/tavern-harness"><img alt="npm" src="https://img.shields.io/npm/v/tavern-harness?style=flat-square" /></a>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
1
13
|
# Tavern Harness · An AI-Native Role-Playing Sandbox
|
|
2
14
|
|
|
3
|
-
|
|
15
|
+
<a id="demo"></a>
|
|
16
|
+
## 1 · Gameplay Demos
|
|
17
|
+
|
|
18
|
+
[](https://rannichan.github.io/Tavern-Harness/index.html#demo)
|
|
4
19
|
|
|
5
20
|
<a id="run"></a>
|
|
6
|
-
##
|
|
21
|
+
## 2 · Getting Started
|
|
7
22
|
|
|
8
23
|
### Option 1: One-Command Start (Recommended)
|
|
9
24
|
|
|
@@ -64,7 +79,7 @@ After starting the app, open **Settings → Model Service Provider**:
|
|
|
64
79
|
- Data is tied to the browser, port, and site origin. Switching browsers, opening a private window, or using a different port will not show existing data. This is expected browser security behavior; use the same browser and port each time.
|
|
65
80
|
|
|
66
81
|
<a id="features"></a>
|
|
67
|
-
##
|
|
82
|
+
## 3 · Features
|
|
68
83
|
|
|
69
84
|
### 🍺 The Tavern Keeper Is Always Ready to Help
|
|
70
85
|
|
|
@@ -96,11 +111,6 @@ The app supports **OpenAI-format APIs**. Use a hosted API plan or run a model lo
|
|
|
96
111
|
|
|
97
112
|
The project has no external harness dependency, and its UI is designed for a clean, focused experience.
|
|
98
113
|
|
|
99
|
-
<a id="gameplay"></a>
|
|
100
|
-
## 3 · Gameplay Examples
|
|
101
|
-
|
|
102
|
-
See the [interactive gameplay demos](https://rannichan.github.io/Tavern-Harness/#demo).
|
|
103
|
-
|
|
104
114
|
<a id="feedback"></a>
|
|
105
115
|
## 4 · Community and Feedback
|
|
106
116
|
|
|
@@ -110,3 +120,7 @@ See the [interactive gameplay demos](https://rannichan.github.io/Tavern-Harness/
|
|
|
110
120
|
- 📣 Star or watch the repository to receive updates.
|
|
111
121
|
|
|
112
122
|
> The tavern is open 24 hours a day, and the Keeper is always here to help.
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
This project is licensed under the [MIT License](LICENSE).
|
package/README.zh.md
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://rannichan.github.io/Tavern-Harness/">
|
|
3
|
+
<img alt="Tavern Harness logo" src="https://raw.githubusercontent.com/Rannichan/Tavern-Harness/main/public/tavern-harness-logo.png" width="128">
|
|
4
|
+
</a>
|
|
5
|
+
</p>
|
|
6
|
+
<p align="center">
|
|
7
|
+
<a href="https://github.com/Rannichan/Tavern-Harness"><img alt="GitHub 仓库" src="https://img.shields.io/badge/github-repository-181717?style=flat-square&logo=github&logoColor=white" /></a>
|
|
8
|
+
<a href="https://discord.gg/kPSWGeaHx"><img alt="Discord" src="https://img.shields.io/badge/discord-community-5865F2?style=flat-square&logo=discord&logoColor=white" /></a>
|
|
9
|
+
<a href="https://rannichan.github.io/Tavern-Harness/wiki.html"><img alt="Wiki" src="https://img.shields.io/badge/wiki-documentation-2563EB?style=flat-square" /></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/tavern-harness"><img alt="npm" src="https://img.shields.io/npm/v/tavern-harness?style=flat-square" /></a>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
1
13
|
# Tavern Harness · AI 原生的角色扮演沙盒
|
|
2
14
|
|
|
3
|
-
|
|
15
|
+
<a id="demo"></a>
|
|
16
|
+
## 1 · 玩法演示
|
|
17
|
+
|
|
18
|
+
[](https://rannichan.github.io/Tavern-Harness/index.html#demo)
|
|
4
19
|
|
|
5
20
|
<a id="run"></a>
|
|
6
|
-
##
|
|
21
|
+
## 2 · 如何运行
|
|
7
22
|
|
|
8
23
|
### 方式一:一键启动(推荐)
|
|
9
24
|
|
|
@@ -65,7 +80,7 @@ npm run dev # 开发服务器默认端口 5173,被占用时自动顺延
|
|
|
65
80
|
- 数据与浏览器、端口、站点绑定:换浏览器 / 开隐身窗 / 换端口看不到旧数据——这是浏览器安全机制,属正常现象。请确保每次在同一个端口启动、并在同一个浏览器打开。
|
|
66
81
|
|
|
67
82
|
<a id="features"></a>
|
|
68
|
-
##
|
|
83
|
+
## 3 · 产品特色
|
|
69
84
|
|
|
70
85
|
### 🍺 酒馆老板随时为您服务
|
|
71
86
|
|
|
@@ -97,11 +112,6 @@ npm run dev # 开发服务器默认端口 5173,被占用时自动顺延
|
|
|
97
112
|
|
|
98
113
|
项目不依赖任何外部 harness,UI 也经过了精细打磨,提供简洁干净的体验。
|
|
99
114
|
|
|
100
|
-
<a id="gameplay"></a>
|
|
101
|
-
## 3 · 玩法示例
|
|
102
|
-
|
|
103
|
-
请查看[互动玩法演示](https://rannichan.github.io/Tavern-Harness/#demo)。
|
|
104
|
-
|
|
105
115
|
<a id="feedback"></a>
|
|
106
116
|
## 4 · 交流反馈
|
|
107
117
|
|
|
@@ -111,3 +121,7 @@ npm run dev # 开发服务器默认端口 5173,被占用时自动顺延
|
|
|
111
121
|
- 📣 想第一时间收到更新,点个 Star / Watch 就好
|
|
112
122
|
|
|
113
123
|
> 酒馆24小时营业,老板随时为您服务!
|
|
124
|
+
|
|
125
|
+
## 开源协议
|
|
126
|
+
|
|
127
|
+
本项目采用 [MIT License](LICENSE) 开源协议。
|
package/index.html
CHANGED
package/package.json
CHANGED
|
@@ -239,8 +239,9 @@ function MessageBubble({
|
|
|
239
239
|
const turnStreaming = useStore((s) => s.streaming.sessionId === session.id);
|
|
240
240
|
// System 消息(/new 标记)
|
|
241
241
|
if (msg.role === 'system') {
|
|
242
|
+
const content = msg.content === '开始新话题' ? t('chat.newTopicMarker') : msg.content;
|
|
242
243
|
return (
|
|
243
|
-
<div className="sys-banner fade-up" data-loop={loopIndex ?? undefined}>⟐ {
|
|
244
|
+
<div className="sys-banner fade-up" data-loop={loopIndex ?? undefined}>⟐ {content}</div>
|
|
244
245
|
);
|
|
245
246
|
}
|
|
246
247
|
|
package/src/core/i18n.ts
CHANGED
|
@@ -124,6 +124,7 @@ const MESSAGES: Record<LangKey, Record<string, string>> = {
|
|
|
124
124
|
'chat.hintMagic': '魔法命令: /new · /pass',
|
|
125
125
|
'chat.hintMention': ' · @角色名 点名',
|
|
126
126
|
'chat.cmdNew': '开始新话题(截断上下文)',
|
|
127
|
+
'chat.newTopicMarker': '开始新话题',
|
|
127
128
|
'chat.cmdPass': '跳过本轮发言(群聊中,不修改对话历史)',
|
|
128
129
|
'chat.modelEmpty': '暂无可用模型列表。请先在「设置 → 模型服务 Provider」添加并测试连接。',
|
|
129
130
|
'chat.noActions': '该消息无可用操作',
|
|
@@ -567,6 +568,7 @@ const MESSAGES: Record<LangKey, Record<string, string>> = {
|
|
|
567
568
|
'chat.hintMagic': '魔法指令: /new · /pass',
|
|
568
569
|
'chat.hintMention': ' · @角色名 點名',
|
|
569
570
|
'chat.cmdNew': '開始新話題(截斷上下文)',
|
|
571
|
+
'chat.newTopicMarker': '開始新話題',
|
|
570
572
|
'chat.cmdPass': '跳過本輪發言(群聊中,不修改對話歷史)',
|
|
571
573
|
'chat.modelEmpty': '暫無可用模型清單。請先在「設定 → 模型服務 Provider」新增並測試連線。',
|
|
572
574
|
'chat.noActions': '此訊息沒有可用的操作',
|
|
@@ -999,6 +1001,7 @@ const MESSAGES: Record<LangKey, Record<string, string>> = {
|
|
|
999
1001
|
'chat.hintMagic': 'Magic commands: /new · /pass',
|
|
1000
1002
|
'chat.hintMention': ' · @name to address',
|
|
1001
1003
|
'chat.cmdNew': 'Start a new topic (truncates context)',
|
|
1004
|
+
'chat.newTopicMarker': 'Start a new topic',
|
|
1002
1005
|
'chat.cmdPass': 'Skip this turn (group chat, keeps history)',
|
|
1003
1006
|
'chat.modelEmpty': 'No models available. Add and test a connection under Settings → Model Providers first.',
|
|
1004
1007
|
'chat.noActions': 'No actions available for this message',
|
package/src/theme/chat.css
CHANGED
|
@@ -455,8 +455,7 @@
|
|
|
455
455
|
.composer {
|
|
456
456
|
padding: 8px 22px 12px;
|
|
457
457
|
border-top: 1px solid var(--border);
|
|
458
|
-
background:
|
|
459
|
-
backdrop-filter: blur(16px);
|
|
458
|
+
background: transparent;
|
|
460
459
|
}
|
|
461
460
|
.composer-box {
|
|
462
461
|
position: relative;
|
package/src/theme/global.css
CHANGED
|
@@ -472,9 +472,6 @@ body.resizing .sidebar-resizer {
|
|
|
472
472
|
/* 左边与列表项头像对齐:session-list padding-left 14 + session-item padding-left 10 */
|
|
473
473
|
/* 右边与列表项右边缘对齐:session-list padding-right 14 + session-item padding-right 10 */
|
|
474
474
|
padding: 4px 24px 8px 24px;
|
|
475
|
-
/* 与侧边栏同色背景,彻底挡住下方滚动的列表项 */
|
|
476
|
-
background: color-mix(in srgb, var(--surface) 55%, transparent);
|
|
477
|
-
backdrop-filter: blur(18px);
|
|
478
475
|
border-bottom: 1px solid var(--border-soft);
|
|
479
476
|
}
|
|
480
477
|
/* 新建按钮:粗体文字 + 加号,不高亮 */
|
|
@@ -739,16 +736,17 @@ body.resizing .sidebar-resizer {
|
|
|
739
736
|
min-width: 0;
|
|
740
737
|
height: 100dvh;
|
|
741
738
|
position: relative;
|
|
739
|
+
background: color-mix(in srgb, var(--surface) 55%, transparent);
|
|
740
|
+
backdrop-filter: blur(18px);
|
|
742
741
|
}
|
|
743
742
|
|
|
743
|
+
/* 右侧所有 Tab 共享侧边栏的磨砂背景。 */
|
|
744
|
+
|
|
744
745
|
.chat-scroll {
|
|
745
746
|
flex: 1;
|
|
746
747
|
overflow-y: auto;
|
|
747
748
|
padding: 20px 0 10px;
|
|
748
|
-
|
|
749
|
-
background: color-mix(in srgb, var(--surface) 62%, transparent);
|
|
750
|
-
backdrop-filter: blur(16px);
|
|
751
|
-
-webkit-backdrop-filter: blur(16px);
|
|
749
|
+
background: transparent;
|
|
752
750
|
}
|
|
753
751
|
|
|
754
752
|
.chat-col {
|
|
@@ -767,8 +765,7 @@ body.resizing .sidebar-resizer {
|
|
|
767
765
|
gap: 12px;
|
|
768
766
|
padding: 12px 22px;
|
|
769
767
|
border-bottom: 1px solid var(--border);
|
|
770
|
-
background:
|
|
771
|
-
backdrop-filter: blur(16px);
|
|
768
|
+
background: transparent;
|
|
772
769
|
z-index: 5;
|
|
773
770
|
}
|
|
774
771
|
.avatar {
|
package/src/theme/views.css
CHANGED
|
@@ -80,17 +80,18 @@
|
|
|
80
80
|
padding: 12px 14px;
|
|
81
81
|
max-height: none;
|
|
82
82
|
height: 100%;
|
|
83
|
+
border-top-left-radius: 10px;
|
|
83
84
|
}
|
|
84
|
-
/*
|
|
85
|
+
/* 角色卡:允许 Prompt 输入框扩展,同时让后续字段在正常文档流中下移。 */
|
|
85
86
|
.modal-editor .prompt-field {
|
|
86
|
-
flex:
|
|
87
|
-
min-height: 220px;
|
|
87
|
+
flex: 0 0 auto;
|
|
88
88
|
display: flex;
|
|
89
89
|
flex-direction: column;
|
|
90
90
|
}
|
|
91
91
|
.modal-editor .prompt-field .grow-textarea {
|
|
92
|
-
flex:
|
|
93
|
-
|
|
92
|
+
flex: none;
|
|
93
|
+
height: min(35dvh, 360px);
|
|
94
|
+
min-height: 220px;
|
|
94
95
|
}
|
|
95
96
|
.modal-editor .greeting-grow {
|
|
96
97
|
min-height: 88px;
|