neuro-simulator 0.6.1__py3-none-any.whl → 0.6.2__py3-none-any.whl

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.
Files changed (24) hide show
  1. README.md +40 -45
  2. neuro_simulator/client/assets/index-rmyQl8Tr.css +1 -0
  3. neuro_simulator/client/index.html +10 -10
  4. neuro_simulator/core/application.py +19 -11
  5. neuro_simulator/dashboard/assets/{AgentView-DBq2msN_.js → AgentView-DGut3feB.js} +2 -2
  6. neuro_simulator/dashboard/assets/{ChatBotView-BqQsuJUv.js → ChatBotView-bvwHe8hJ.js} +2 -2
  7. neuro_simulator/dashboard/assets/{ConfigView-CPYMgl_d.js → ConfigView-DLy2_6Tx.js} +2 -2
  8. neuro_simulator/dashboard/assets/{ContextTab-BSROkcd2.js → ContextTab-Cv2a7xRF.js} +1 -1
  9. neuro_simulator/dashboard/assets/{ControlView-BvflkxO-.js → ControlView-BVJk6r1d.js} +1 -1
  10. neuro_simulator/dashboard/assets/{FieldRenderer-DyPAEyOT.js → FieldRenderer-xMOXYQeU.js} +1 -1
  11. neuro_simulator/dashboard/assets/{LogsTab-C-SZhHdN.js → LogsTab-C7r21Vcz.js} +1 -1
  12. neuro_simulator/dashboard/assets/{LogsView-82wOs2Pp.js → LogsView-DF62M8uv.js} +1 -1
  13. neuro_simulator/dashboard/assets/{MemoryTab-p3Q-Wa4e.js → MemoryTab-BMDqRcHX.js} +1 -1
  14. neuro_simulator/dashboard/assets/{ToolsTab-BxbFZhXs.js → ToolsTab-Ds4M2VeQ.js} +1 -1
  15. neuro_simulator/dashboard/assets/{index-CcYt9OR6.css → index-D2ait7Ff.css} +2 -2
  16. neuro_simulator/dashboard/assets/{index-Ba5ZG3QB.js → index-Sav9Djr5.js} +3 -3
  17. neuro_simulator/dashboard/index.html +3 -3
  18. {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.2.dist-info}/METADATA +37 -39
  19. {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.2.dist-info}/RECORD +23 -23
  20. neuro_simulator/client/assets/index-C_kzLmQy.css +0 -1
  21. /neuro_simulator/client/assets/{index-DRLWJPZv.js → index-BHgW05Wx.js} +0 -0
  22. {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.2.dist-info}/WHEEL +0 -0
  23. {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.2.dist-info}/entry_points.txt +0 -0
  24. {neuro_simulator-0.6.1.dist-info → neuro_simulator-0.6.2.dist-info}/licenses/LICENSE +0 -0
@@ -2,11 +2,11 @@
2
2
  <html lang="">
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
- <link rel="icon" href="/favicon.ico">
5
+ <link rel="icon" href="/dashboard/favicon.ico">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <title>𝐯𝐞𝐝𝐚𝐥𝟗𝟖𝟕 𝐒𝐢𝐦𝐮𝐥𝐚𝐭𝐨𝐫</title>
8
- <script type="module" crossorigin src="/assets/index-Ba5ZG3QB.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CcYt9OR6.css">
8
+ <script type="module" crossorigin src="/dashboard/assets/index-Sav9Djr5.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/dashboard/assets/index-D2ait7Ff.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="app"></div>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: neuro_simulator
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Neuro Simulator Server
5
5
  Project-URL: Homepage, https://github.com/Moha-Master/neuro-simulator
6
6
  Project-URL: Repository, https://github.com/Moha-Master/neuro-simulator
@@ -41,14 +41,14 @@ Description-Content-Type: text/markdown
41
41
 
42
42
  *本临时README和所有代码均由AI生成*
43
43
 
44
- Neuro Simulator 是一个模拟 Neuro-sama 直播的项目
45
- 它通过调用 Letta(一个为 LLM 添加自主记忆功能的项目),也可使用自带的有记忆 Agent,配合其他 LLM 服务生成的模拟观众,模拟一场 Neuro-sama 的 Just Chatting 直播
46
- 它能生成实时的虚拟聊天内容,并通过 TTS 合成语音,提供沉浸式的 Twitch vedal987 频道观看体验
44
+ Neuro Simulator 是一个模拟 Neuro-sama 直播的项目。
45
+ 它通过使用自带的有记忆 Agent,~~也可调用 Letta(一个为 LLM 添加自主记忆功能的项目)~~,以及相同构造的 Chatbot Agent 作为虚拟观众,模拟一场 Neuro-sama 的 Just Chatting 直播。
46
+ 它能生成实时的虚拟聊天内容,并通过 TTS 合成语音,提供沉浸式的 Twitch vedal987 频道观看体验。
47
47
 
48
48
  ## 特性
49
49
 
50
- 和其他大佬的类似项目不同,本项目的重点在于尽可能模拟 Neuro-sama Twitch 上的 Tuesday Stream,因此不会有太多的自定义部分
51
- 后续有低成本低性能方法实现 Evil 音色模仿的时候,可能加入 Evil 的 Just Chatting 乃至各种主题的 Twin Stream
50
+ 和其他类似的 AI Vtuber 项目不同,本项目旨在尽可能模拟 Neuro-sama Twitch 上的 Tuesday Stream,因此在 Vtuber 部分不会有太多的自定义部分,也不会考虑引入 Neuro/Evil 以外的 Live2D。
51
+ 后续有低成本低性能方法实现 Evil 音色模仿的时候,可能加入 Evil Neuro。
52
52
 
53
53
  ### 预览
54
54
 
@@ -60,44 +60,44 @@ Neuro Simulator 是一个模拟 Neuro-sama 直播的项目
60
60
 
61
61
  ### 核心亮点
62
62
 
63
- - **多客户端支持**:支持多个客户端连接,实时广播内容
64
- - **配置热重载**:通过 Web 控制面板修改和热重载配置
65
- - **双 Agent 模式**:支持 Letta Agent 和内建 Agent,提供更多自定义选项
66
- - **Agent 记忆管理**:内建 Agent 支持多种记忆类型(初始化记忆、核心记忆、临时记忆、上下文)
63
+ - **多客户端支持**:支持多个客户端连接,实时广播内容。
64
+ - **配置热重载**:通过 Web 控制面板实时修改和热重载配置。
65
+ - ~~**双 Agent 模式**:支持 Letta Agent 和内建 Agent,提供更多自定义选项~~ 对 Letta Agent 的支持暂时下线,后续有缘再见。
67
66
 
68
67
  ## 快速开始
69
68
 
70
- 1. **准备外部服务**:确保你拥有必要的 API 密钥,包括 LLM(Gemini/OpenAI)和 Azure TTS;如果使用 Letta,也请注册好相关的 API
71
- 2. **安装服务端**:
69
+ 1. **准备外部服务**:确保你拥有必要的 API 密钥,包括 LLM(Gemini/OpenAI)和 Azure TTS;~~如果使用 Letta,也请注册好相关的 API 。~~
70
+ 2. **安装服务端**:已上传至 PyPi 作为可用 pip 安装的软件包,你可以用任何一个 pip 安装到全局或 venv 中。
72
71
  ```bash
73
72
  pip install neuro-simulator
74
73
  ```
74
+ 推荐使用 pipx,可以在不更改系统 Python 依赖的情况下直接安装为全局软件。
75
+
75
76
  3. **运行服务端**:
76
77
  ```bash
77
78
  neuro
78
79
  ```
79
- 记得填写好配置目录中的 `config.yaml`
80
- - 不指定 `--dir` 则自动创建和默认使用 `~/.config/neuro-simulator/` 作为工作目录
81
- - 在默认或指定目录及需要的文件不存在时,程序会自动用自带模板复制一份到工作目录下
80
+ 现在无需手动填写 `config.yaml`,程序在启动时会自动创建一份包含默认设置的配置文件,只需在管理面板中填写和为 Agent 分配 API 服务商即可。
81
+ - 不指定 `--dir, -D` 则自动创建和默认使用 `~/.config/neuro-simulator/` 作为工作目录。
82
+ - 程序会在工作目录下自动生成文件夹结构,拷贝需要的文件到目录内,保持程序包本体只读。
82
83
 
83
- 4. **安装客户端**:
84
- ```bash
85
- cd client
86
- npm install
87
- ```
88
- 5. **运行客户端**:
89
- ```bash
90
- npm run dev
91
- ```
92
- 6. **部署控制面板**:
93
- ```bash
94
- cd dashboard_web
95
- python -m http.server 8080
96
- ```
84
+ 程序启动后,如果工作正常,会默认在 `http://127.0.0.1:8000` 提供对外服务,你可以在设置中修改这个端口。
85
+
86
+ 4. **打开管理面板**:现在程序已经内置管理面板,直接在浏览器中打开 `http://127.0.0.1:8000/dashboard/` 即可,内置面板会自动连接到服务端。
87
+
88
+ **配置流程**:
89
+ 1. 在管理面板中打开“配置”页面。
90
+ 2. 在“LLM服务商”中添加一个以上的选项。
91
+ 3. 在“TTS服务商”中添加一个以上的 Azure TTS 服务。
92
+ 4. 在“Neuro”中分配一个 LLM 服务商和一个 TTS 服务商。
93
+ 5. 在“Chatbot”中分配一个 LLM 服务商。
94
+
95
+ 5. **打开客户端**:现在程序已经内置客户端,在浏览器中访问 `<http协议>://<服务端地址>/` 即可。
96
+ 但是这种方式下自动从哔哩哔哩获取最近回放的功能似乎不工作,需要对哔哩哔哩 API 进行反代。如果你安装了 nodejs,则可以使用 npm 运行开发服务器的方式使用客户端。
97
97
 
98
98
  更多更复杂或者更简单的使用方式,请参见三个部分的详细文档
99
99
 
100
- ## 项目结构
100
+ ## 项目结构(稍微过时,待更新)
101
101
 
102
102
  ```
103
103
  Neuro-Simulator/
@@ -117,7 +117,6 @@ Neuro-Simulator/
117
117
 
118
118
  - [服务端 README](server/README.md)
119
119
  - [客户端 README](client/README.md)
120
- - [控制面板 README](dashboard_web/README.md)
121
120
 
122
121
  ## 开发计划和已实现功能
123
122
 
@@ -141,7 +140,7 @@ Neuro-Simulator/
141
140
  - [ ] 模块化热插拔工具
142
141
  - [ ] 连接到 MCP 服务器
143
142
  - [ ] 兼容 Offical [Neuro SDK](https://github.com/VedalAI/neuro-sdk)
144
- - [ ] 拉起和对话 Evil Agent
143
+ - [ ] 拉起 Evil Agent 并进行对话
145
144
  - [ ] Evil Agent 模块,~~卖掉了~~ 待 Neuro Agent 完善、有低成本低性能方法实现 Evil 音色模仿的时候加入
146
145
  - [ ] 对 Neuroverse 更多成员的 AI Agent 复现,进而允许 Neuro Agent 向其发送 DM(语音聊天可能不太现实)
147
146
  - [x] Chatbot 模块
@@ -150,8 +149,8 @@ Neuro-Simulator/
150
149
  - [x] prompt 编辑
151
150
  - [x] 调用 Gemini 和 OpenAI API 格式的LLM
152
151
  - [x] 基于 Neuro Agent 的上一句内容而做出 Reaction
153
- - [ ] ~~在 prompt 中包含直播标题等更多信息~~ 将在更详细的 Chatbot Agent 中实现
154
- - [x] ~~实现更长的上下文~~ 将在更详细的 Chatbot Agent 中实现
152
+ - [ ] ~~在 prompt 中包含直播标题等更多信息~~ 将在更强大的 Chatbot Agent 中实现
153
+ - [x] ~~实现更长的上下文~~ 将在更强大的 Chatbot Agent 中实现
155
154
  - [x] Chatbot Agent
156
155
  - [x] 更好的用户名生成逻辑
157
156
  - [x] 更长的上下文,包括自身输出和 Neuro Agent 内容
@@ -171,7 +170,7 @@ Neuro-Simulator/
171
170
  - [x] TTS 合成和推送
172
171
  - [x] Azure TTS
173
172
  - [ ] 待定 TTS
174
- - [ ] 剔除 Emoji 等特殊字符
173
+ - [X] 剔除 Emoji 等特殊字符
175
174
  - [x] 进行直播和直播环节
176
175
  - [x] Just Chatting 单人直播
177
176
  - [x] Neuro Stream
@@ -191,8 +190,8 @@ Neuro-Simulator/
191
190
  - [x] 直播标题和标签等信息
192
191
  - [ ] 在非直播的空闲时间自动获取真实世界中 Neuro 的近期直播内容,更新完善记忆内容(不是微调训练)
193
192
  - [ ] 对 Ollama 等本地 LLM 的优化
194
- - [ ] 服务端内嵌管理面板
195
- - [ ] Web 控制面板
193
+ - [x] 服务端托管管理面板
194
+ - [x] Web 控制面板
196
195
  - [ ] 使用 PyInquiry 的命令行面板
197
196
  - 客户端
198
197
  - [ ] 仅包含直播区域的客户端,适用于希望使用 OBS 或其他软件推流画面的用户
@@ -237,6 +236,7 @@ Neuro-Simulator/
237
236
  - [ ] 真实的主播首页竖屏模式界面(目前沿用针对竖屏优化过的横屏样式)
238
237
  - [ ] 下滑的更多主播信息
239
238
  - [ ] 其他次级页面
239
+ - [x] 服务端托管客户端
240
240
  - [ ] 更多客户端(若实现原生客户端则弃用 tauri)
241
241
  - [x] 可托管的 Web 静态页面
242
242
  - [x] Windows 客户端
@@ -260,7 +260,6 @@ Neuro-Simulator/
260
260
  - [x] 对话方式展现
261
261
  - [x] 上下文方式展现
262
262
  - [x] 实时更新
263
- - [x] 更好的界面
264
263
  - [ ] 可视化展现 Agent 的详细执行流程
265
264
  - [x] 实时日志查看
266
265
  - [ ] 按照等级进行日志筛选
@@ -270,7 +269,6 @@ Neuro-Simulator/
270
269
  - [ ] 工具管理取决于服务端开发进度
271
270
  - 杂项,有一些可能永远不会实现,有一些可能很快就能完成
272
271
  - [ ] 一键启动器和整合包,适用于不需要分开部署的情况,或者面向普通小白用户
273
- - [ ] 把三个项目模块整合为一个
274
272
  - [ ] 基于静态立绘制作的简易Live2D,能动就行
275
273
  - [x] 目前不会考虑语音输入
276
274
 
@@ -1,4 +1,4 @@
1
- README.md,sha256=32Bfey7Pf2nAKO3ORsLHUoyg8XB6mP0Lh9ftU-uCuH8,6314
1
+ README.md,sha256=7pb9WxHIsbrrzlXps_W5ejL147vIu0ak3VTeDjIcfvU,6058
2
2
  WEBSOCKET_API.md,sha256=LkItXviJL-0DGqX85CSB9LAmcnj2cAnBzETvPIjRY8U,9203
3
3
  requirements.txt,sha256=4QYJ4CX6Q4nt2ShHwMuLZaRSM7wg8au-RX0i_rMVl7k,116
4
4
  neuro_simulator/__init__.py,sha256=-tposzyvg6UckPcfSvtc03UjxBa9oCe_zRvlKf8splk,31
@@ -55,7 +55,7 @@ neuro_simulator/chatbot/tools/post_chat_message.py,sha256=lchGCSQKzPZgb1z__MIDkG
55
55
  neuro_simulator/core/__init__.py,sha256=-ojq25c8XA0CU25b0OxcGjH4IWFEDHR-HXSRSZIuKe8,57
56
56
  neuro_simulator/core/agent_factory.py,sha256=jX7wRyTS7Jd-qfIGj0kGs_0pblx5zUcyVAyRETIUhvw,1359
57
57
  neuro_simulator/core/agent_interface.py,sha256=ZXUCtkQUvsBQ5iCb0gTILJaShn5KmSrEgKhd7PK18HE,2794
58
- neuro_simulator/core/application.py,sha256=xgXLwYzq71AkiFLSn2L_hePuUp9sA0Eknb_DxjEeNDE,30292
58
+ neuro_simulator/core/application.py,sha256=MpvBEl73bcGPYluwGuOep-nBwg_Rd4WyRFmDpfh68YU,30547
59
59
  neuro_simulator/core/config.py,sha256=eH5LdTm7gtLBqV7bbiUulYTW2abKYUmK934x3zOS19w,4766
60
60
  neuro_simulator/core/path_manager.py,sha256=_MK3S5ab30zT9zDISC-noDbVE8Axs5y1A3WgImqD-wI,4284
61
61
  neuro_simulator/services/__init__.py,sha256=s3ZrAHg5TpJakadAAGY1h0wDw_xqN4Je4aJwJyRBmk4,61
@@ -75,15 +75,15 @@ neuro_simulator/client/banner.jpeg,sha256=LFqSS0alXwQPilUnHNZ4qkx63Jbc5VYF0HsJOi
75
75
  neuro_simulator/client/channel_points.png,sha256=Tmy9kmKQWNfK-gPMKVvUYrpEiT3CsPgSx6V1-PJRBhI,11509
76
76
  neuro_simulator/client/error.mp3,sha256=ovZ-JXAHrqYUkjFshP48_3ZQcoRi7gUxO_ZkShoeIyA,24048
77
77
  neuro_simulator/client/favicon.ico,sha256=8mR4U-Ufv6l8_Md9C6yqbv6mZ0WV9DRLSPpms8WKp4g,370418
78
- neuro_simulator/client/index.html,sha256=nlFEBvqmI2WtW_htLeJyY2-o9iYLEeYjTfk6eVOFHqE,22427
78
+ neuro_simulator/client/index.html,sha256=ejUfiKOsmE6812dsREMGHZz8YB6qm2I0wyn-JeRMKqA,22417
79
79
  neuro_simulator/client/neuro_start.mp4,sha256=xCLnNzv4THnzRYwkdV6EiqXc-XtFd867R2ZVLDvNp0Y,8226418
80
80
  neuro_simulator/client/neurosama.png,sha256=FTyEEEu0XwRxicKtmQXQONiRVhYKgTsPqlOO2Ymbp1c,1447110
81
81
  neuro_simulator/client/sc_pink.png,sha256=bmC1Wn8I27nsc9lkQJ8-LeacL6Y-eOZor_JkmXy9Om0,56768
82
82
  neuro_simulator/client/sc_purple.png,sha256=XUs6fB0CHPTzQQ3npS1rje5gcigy-T4uao8k3RxOk50,57224
83
83
  neuro_simulator/client/sub_badge.svg,sha256=-Es6Nz9sd7c3sJ4Mys2q0vSd7AZVC9uE-Sq4ipCsioo,825
84
84
  neuro_simulator/client/user_avatar.jpg,sha256=j2MZCFm0MYmigPPOLsuFqA8PhvQ5SWb0GTpqb9VKqvY,29625
85
- neuro_simulator/client/assets/index-C_kzLmQy.css,sha256=ldHgSwFauTDidMP-jwCYOWpFSFsjJp-3FcqSniVfkFk,27793
86
- neuro_simulator/client/assets/index-DRLWJPZv.js,sha256=5sAhfYAN0xKCbG6iZv20bjA7CaXr4zmqR57wd5ko14o,37340
85
+ neuro_simulator/client/assets/index-BHgW05Wx.js,sha256=5sAhfYAN0xKCbG6iZv20bjA7CaXr4zmqR57wd5ko14o,37340
86
+ neuro_simulator/client/assets/index-rmyQl8Tr.css,sha256=ischTFPWjCjy3-vCQ863InoM-wjMuybtesUP0vaY-XA,27865
87
87
  neuro_simulator/client/assets/inter-cyrillic-400-normal-BLGc9T1a.woff2,sha256=Y20TqrBe2fpJ3xnFf93btvPQhPRjdD7lJXVJ27cSQAU,7712
88
88
  neuro_simulator/client/assets/inter-cyrillic-400-normal-alAqRL36.woff,sha256=GmDEQlTts7GpPN_vX-7Kqig5IarhIL_nICL6SWvtq5Y,9780
89
89
  neuro_simulator/client/assets/inter-cyrillic-ext-400-normal-BE2fNs0E.woff,sha256=RHF2hsw99YHFTevMHQw7zGUUaXtPsetnWZbP0cfZaYA,13336
@@ -104,33 +104,33 @@ neuro_simulator/client/fonts/first-coffee.woff2,sha256=pUBfpDh_6HQ20V9EuKWq2UFLn
104
104
  neuro_simulator/client/fonts/noto-sans-sc.woff2,sha256=KsZkKouZc8g1eQ_5wzOWuGkIcSYzGGsHYZJhyu0hFDg,4182468
105
105
  neuro_simulator/dashboard/favicon.ico,sha256=8mR4U-Ufv6l8_Md9C6yqbv6mZ0WV9DRLSPpms8WKp4g,370418
106
106
  neuro_simulator/dashboard/first-coffee.woff2,sha256=pUBfpDh_6HQ20V9EuKWq2UFLnMi9RPHigLN2rOU9Jps,11496
107
- neuro_simulator/dashboard/index.html,sha256=ClWlZyXnWx8VnCKyxANGG39z3B0ecsfLMCDpSgrmfFI,489
108
- neuro_simulator/dashboard/assets/AgentView-DBq2msN_.js,sha256=Il81G74VymiZ_Jn3p4mjBQjVluEa4f7Dt6hhLEQuBu0,2413
107
+ neuro_simulator/dashboard/index.html,sha256=snikAtIfw4VxfkKJZvu_DrCglINGnr0TuZB6_wO44pI,519
108
+ neuro_simulator/dashboard/assets/AgentView-DGut3feB.js,sha256=QGHJMgIWiRVX8C4Ctd7KNqbeWrxsm5vNfb6l3mjYtoU,2413
109
109
  neuro_simulator/dashboard/assets/AgentView-TDgmx5bK.css,sha256=UjBaTbzD4yiDxAHXC5rSSgY-tDFyBfVYS_O1VNcmoYU,361
110
- neuro_simulator/dashboard/assets/ChatBotView-BqQsuJUv.js,sha256=YdaDcUiIRvT7NQdtRWFZoArLy2DPX-zyVMTZZrS46_c,2246
111
110
  neuro_simulator/dashboard/assets/ChatBotView-Dyd6g14G.css,sha256=61Z9sVqq9scsOWZJaOslumxe8Q0I_leQGY4jxy1Zm9o,367
112
- neuro_simulator/dashboard/assets/ConfigView-CPYMgl_d.js,sha256=bg0E8zHlMPqEQsFXsD3FBGV7aQT5lh1RIfLnQg_mQ2M,2932
111
+ neuro_simulator/dashboard/assets/ChatBotView-bvwHe8hJ.js,sha256=cVgI1zuWiG2VrJB3XijhqzY_mqtAeFruzFM7G3kbMns,2246
112
+ neuro_simulator/dashboard/assets/ConfigView-DLy2_6Tx.js,sha256=AFI2BHIWsie0klvk6913BoVGXon7AWDC1A6uJOQuw1Q,2932
113
113
  neuro_simulator/dashboard/assets/ConfigView-aFribfyR.css,sha256=ubCvxhHoetmZ-Dr1BhA5WzniPouxSTHrVNUF_ernK8E,51
114
- neuro_simulator/dashboard/assets/ContextTab-BSROkcd2.js,sha256=rcKaY2Ya2bckj-ucnwz36VPwJ18VRj3xx91TkIeX2L8,1249
114
+ neuro_simulator/dashboard/assets/ContextTab-Cv2a7xRF.js,sha256=-HdLBJcg1mYePUEQ9jxinbQ12eh0JOpjwPsx1r-U-ro,1249
115
115
  neuro_simulator/dashboard/assets/ContextTab-DyPsixHQ.css,sha256=OuDxYxHQE6vR0K0olHcct5JbfJ8dRZqwsLoM6HUrJdY,306
116
116
  neuro_simulator/dashboard/assets/ControlView-BUCt3umR.css,sha256=Nspx07838NWMuUKrWJCRgwRBdjl-zezVBzUSfdDBsiU,108
117
- neuro_simulator/dashboard/assets/ControlView-BvflkxO-.js,sha256=Kt2cVQ0a8tJ3YCbe4QYVPvQjK_KW8Kqfd41W3xgFCL0,1549
118
- neuro_simulator/dashboard/assets/FieldRenderer-DyPAEyOT.js,sha256=3f0uIZkMMGjNYF18vgfKVF4by9jHJ2VVMlpzXBEVuEQ,7598
119
- neuro_simulator/dashboard/assets/LogsTab-C-SZhHdN.js,sha256=sXEOoH7mEovSuKOzdxLceZGSurTRkUVCg8J_yrpvc_s,542
117
+ neuro_simulator/dashboard/assets/ControlView-BVJk6r1d.js,sha256=cyCqgbcXUkHuF4pu1XqKTH2eSvcoamVPXzWaTN5preI,1549
118
+ neuro_simulator/dashboard/assets/FieldRenderer-xMOXYQeU.js,sha256=MoRbydCMcwkNY_z6cDBSzVSvKN82nnAlImP-rOkMlds,7598
119
+ neuro_simulator/dashboard/assets/LogsTab-C7r21Vcz.js,sha256=YWqd8ziYE3czHE0JCb7VpH6BjItBY_FjwkxweaNRqFk,542
120
120
  neuro_simulator/dashboard/assets/LogsTab-wg3i3S6b.css,sha256=hRDoXwSnuvWe9vt-lh8XbMiJTS-WV-HTHf3-JOmkfuE,254
121
- neuro_simulator/dashboard/assets/LogsView-82wOs2Pp.js,sha256=RLTJXNzKxDID08imN9zdTHYqwNV-5MvvoIWQ5AzXD00,788
122
121
  neuro_simulator/dashboard/assets/LogsView-D2F8f-Mc.css,sha256=69G8eFicz4WLe-f3mnn7YMfo-odPHM7gcRT160oNgGo,254
122
+ neuro_simulator/dashboard/assets/LogsView-DF62M8uv.js,sha256=1TKbQDsSHybCWh9NmrkU6qlmRhQD1H_DDg0l6Vkch40,788
123
+ neuro_simulator/dashboard/assets/MemoryTab-BMDqRcHX.js,sha256=_e9Dl5qzgERWcfZ13wdJqQF6Wa3kVoj0ks77FDsffR4,9508
123
124
  neuro_simulator/dashboard/assets/MemoryTab-DPthi6jg.css,sha256=yZNqQVtHqNjjsKz3eCRmcuuYi4kKQFMTUHiWEHbOeHY,151
124
- neuro_simulator/dashboard/assets/MemoryTab-p3Q-Wa4e.js,sha256=lGoeWPr1EiOymbQhYp4p8qblOznto7J1R5exhp3Dy8w,9508
125
- neuro_simulator/dashboard/assets/ToolsTab-BxbFZhXs.js,sha256=P-0M57p5JNYotkITplN9P5KzC5bTDbHxObbM8pJ7EjU,3694
126
- neuro_simulator/dashboard/assets/index-Ba5ZG3QB.js,sha256=C5lgcP6ubbGwngH5_WKcd5C0agl-sjhyBvICWaGF9ZQ,629137
127
- neuro_simulator/dashboard/assets/index-CcYt9OR6.css,sha256=aw0iyjqWqN0owGgSVd8UFD9vZMd6GI7lc7ey3WYQ05I,804934
125
+ neuro_simulator/dashboard/assets/ToolsTab-Ds4M2VeQ.js,sha256=4JT65ialDsXrg4lJnLbYMGgr4KYc_fXINYPvtvEClkg,3694
126
+ neuro_simulator/dashboard/assets/index-D2ait7Ff.css,sha256=xyeu99AsoNl4m-Yg0RhZEVE_xKwJn_6iZWybW7O7x34,804994
127
+ neuro_simulator/dashboard/assets/index-Sav9Djr5.js,sha256=0fYF175ApirF447oVSIRn4cSKMQ778X7St8iJRXAuhc,629157
128
128
  neuro_simulator/dashboard/assets/materialdesignicons-webfont-B7mPwVP_.ttf,sha256=YeirpaTpgf4iz3yOi82-oAR251xiw38Bv37jM2HWhCg,1307660
129
129
  neuro_simulator/dashboard/assets/materialdesignicons-webfont-CSr8KVlo.eot,sha256=CxgxBNL8XyYZbnc8d72vLgVQn9QlnS0V7O3Kebh-hPk,1307880
130
130
  neuro_simulator/dashboard/assets/materialdesignicons-webfont-Dp5v-WZN.woff2,sha256=Zi_vqPL4qVwYWI0hd0eJwQfGTnccvmWmmvRikcQxGvw,403216
131
131
  neuro_simulator/dashboard/assets/materialdesignicons-webfont-PXm3-2wK.woff,sha256=pZKKDVwvYk5G-Y2bFcL2AEU3f3xZTdeKF1kTLqO0Y-s,587984
132
- neuro_simulator-0.6.1.dist-info/METADATA,sha256=_uIC9ykhARn1EvQ6-DhDymJ0xOhxAYSkZpMJ12UOt7k,11242
133
- neuro_simulator-0.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
- neuro_simulator-0.6.1.dist-info/entry_points.txt,sha256=qVd5ypnRRgU8Cw7rWfZ7o0OXyS9P9hgY-cRoN_mgz9g,51
135
- neuro_simulator-0.6.1.dist-info/licenses/LICENSE,sha256=cPsKhVNOnNSSva44vcCU-SDDFf8iE-EhpGXCiUK9tAM,1072
136
- neuro_simulator-0.6.1.dist-info/RECORD,,
132
+ neuro_simulator-0.6.2.dist-info/METADATA,sha256=cEPboXmzMc3Es39_v-wmgV69_s92PMMutIugIk3fUc4,12375
133
+ neuro_simulator-0.6.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
134
+ neuro_simulator-0.6.2.dist-info/entry_points.txt,sha256=qVd5ypnRRgU8Cw7rWfZ7o0OXyS9P9hgY-cRoN_mgz9g,51
135
+ neuro_simulator-0.6.2.dist-info/licenses/LICENSE,sha256=cPsKhVNOnNSSva44vcCU-SDDFf8iE-EhpGXCiUK9tAM,1072
136
+ neuro_simulator-0.6.2.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- :root{--twitch-purple: #9147FF;--twitch-dark-bg: #F2F2F2;--twitch-chat-bg: #FFFFFF;--twitch-text-color: #18181B;--twitch-secondary-text-color: #6A6A6D;--twitch-border-color: #D3D3D3;--twitch-hover-bg: #EFEFF1;--twitch-button-bg: #EFEFF1;--twitch-button-text-color: #0E0E10;--twitch-button-hover-bg: #DFDFE1;--twitch-primary-button-bg: var(--twitch-purple);--twitch-primary-button-text-color: #FFFFFF;--twitch-primary-button-hover-bg: #772CE8;--twitch-tag-bg: #EFEFF1;--twitch-tag-text-color: #6A6A6D;--twitch-live-red: #EB0400;--twitch-viewer-red: #971311;--sidebar-width: 340px;--header-height: 50px;--neuro-shadow-color: #32003C;--neuro-avatar-display-width-percent: 50%;--fast-transition: background-color .2s, color .2s;--twitch-dark-button-bg: #333333;--twitch-dark-button-hover-bg: #444444;--twitch-dark-button-text-color: #FFFFFF;--sc-pink-bg-color: #f68795;--sc-purple-bg-color: #b97ad5}@font-face{font-family:First Coffee;src:url(../fonts/first-coffee.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:Comic Sans MS;src:url(../fonts/comic.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:Noto Sans SC;src:url(../fonts/noto-sans-sc.woff2) format("woff2");font-weight:400;font-style:normal}@font-face{font-family:Causten;src:url(../fonts/causten.woff2) format("woff2");font-weight:400;font-style:normal}html,body{height:100%;margin:0;padding:0;overflow:hidden}body{font-family:Inter,Arial,sans-serif;display:flex;flex-direction:column;background-color:var(--twitch-dark-bg);color:var(--twitch-text-color)}.twitch-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 10px;border-radius:100px;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:var(--twitch-button-bg);color:var(--twitch-button-text-color);height:32px;box-sizing:border-box;line-height:1}.twitch-button svg{width:1.2em;height:1.2em;fill:currentColor;vertical-align:middle}.twitch-button span{padding-top:2px}.twitch-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg)}.twitch-button.subscribe-button{background-color:var(--twitch-primary-button-bg);color:var(--twitch-primary-button-text-color)}.twitch-button.subscribe-button:hover:not(:disabled){background-color:var(--twitch-primary-button-hover-bg)}.twitch-button.icon-button{width:32px;padding:0;border-radius:50%}.nav-icon-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0;border-radius:50%;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:transparent;color:var(--twitch-button-text-color);width:32px;height:32px;box-sizing:border-box;line-height:1}.nav-icon-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg);border-radius:50%}.nav-icon-button svg{width:20px;height:20px;fill:currentColor;vertical-align:middle}.search-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:transparent;color:var(--twitch-button-text-color);width:32px;height:32px;box-sizing:border-box;line-height:1}.search-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg)}.search-button svg{width:20px;height:20px;fill:currentColor;vertical-align:middle}.chat-toolbar-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0;border-radius:50%;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:transparent;color:var(--twitch-button-text-color);width:32px;height:32px;box-sizing:border-box;line-height:1}.chat-toolbar-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg);border-radius:50%}.chat-toolbar-button svg{width:20px;height:20px;fill:currentColor;vertical-align:middle}.chat-toolbar-button img{width:20px;height:20px;object-fit:contain}.video-overlay-chat-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0;border-radius:50%;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:#0009;color:#fff;width:32px;height:32px;box-sizing:border-box;line-height:1}.video-overlay-chat-button:hover:not(:disabled){background-color:#000c;border-radius:50%}.video-overlay-chat-button svg{width:20px;height:20px;fill:#fff;vertical-align:middle}.mute-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0;border-radius:50%;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:#0009;color:#fff;width:32px;height:32px;box-sizing:border-box;line-height:1}.mute-button:hover:not(:disabled){background-color:#000c;border-radius:50%}.mute-button svg{width:20px;height:20px;fill:#fff;vertical-align:middle}.twitch-button.dark{background-color:var(--twitch-dark-button-bg);color:var(--twitch-dark-button-text-color)}.twitch-button.dark:hover:not(:disabled){background-color:var(--twitch-dark-button-hover-bg)}.twitch-button.dark svg,.twitch-button.dark img{fill:var(--twitch-dark-button-text-color)}.twitch-button img{width:20px;height:20px;object-fit:contain;vertical-align:middle}.chat-toolbar-text-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:0 10px;border-radius:100px;font-size:.9em;font-weight:600;cursor:pointer;border:none;transition:var(--fast-transition);outline:none;background-color:transparent;color:var(--twitch-button-text-color);height:32px;box-sizing:border-box;line-height:1}.chat-toolbar-text-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg)}.chat-toolbar-text-button svg,.chat-toolbar-text-button img{width:1.2em;height:1.2em;fill:currentColor;vertical-align:middle;object-fit:contain}.chat-toolbar-text-button .points-value{padding-top:2px}.chat-toolbar-text-button .channel-points-icon{width:1.2em;height:1.2em;object-fit:contain}#twitch-header{height:var(--header-height);background-color:var(--twitch-chat-bg);display:flex;justify-content:space-between;align-items:center;padding:0 1rem;border-bottom:1px solid var(--twitch-border-color);flex-shrink:0;z-index:100;color:var(--twitch-text-color);gap:1rem}.top-nav-left,.top-nav-right{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.top-nav-center{flex-grow:1;flex-shrink:1;display:flex;justify-content:center;min-width:150px}.twitch-logo-link{display:flex;align-items:center;text-decoration:none;margin-left:.5rem}.twitch-logo-container{margin:0;transform:scaleY(-1);transition:transform .3s ease-out}.twitch-logo-container:hover{transform:scaleY(1)}.twitch-logo-svg .logo-body{fill:var(--twitch-purple)}.twitch-logo-svg .logo-face{fill:var(--twitch-chat-bg)}.twitch-logo-svg .logo-eye-path{fill:var(--twitch-purple)}.nav-links-main{display:flex;gap:1.5rem;margin-left:1.5rem}.nav-link{display:flex;align-items:center;gap:.5rem;text-decoration:none;color:var(--twitch-text-color);font-weight:500;font-size:1.1rem;padding:.25rem .5rem;border-radius:4px;transition:var(--fast-transition)}.nav-link:hover{color:var(--twitch-purple)}.nav-link p{margin:0}.search-container{display:flex;align-items:center;width:100%;max-width:400px;border:1px solid var(--twitch-border-color);border-radius:8px;overflow:hidden;background-color:var(--twitch-button-bg)}.search-input{flex:1 1 0;min-width:50px;padding:.5rem .75rem;border:none;background-color:transparent;color:var(--twitch-text-color);font-size:.95rem;outline:none}.search-input::placeholder{color:var(--twitch-secondary-text-color)}.search-button{flex-shrink:0;display:flex;align-items:center;justify-content:center;padding:0 .5rem}.search-button svg{fill:var(--twitch-text-color)}.top-nav-right{gap:.75rem}.nav-user-avatar-button{background:none;border:none;cursor:pointer;padding:0;border-radius:50%;width:32px;height:32px;overflow:hidden;flex-shrink:0}.user-avatar-wrapper{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.user-avatar-img{width:100%;height:100%;object-fit:cover;border-radius:50%}#main-content-wrapper{flex-grow:1;display:flex;overflow:hidden;position:relative}#stream-and-info-container{flex-grow:1;flex-shrink:1;display:flex;flex-direction:column;overflow-y:auto;min-height:0;scrollbar-width:none}#stream-and-info-container::-webkit-scrollbar{display:none}#stream-display-viewport{flex-grow:1;background-color:#000;display:flex;justify-content:center;align-items:center;overflow:hidden;min-height:0;position:relative}#mute-button{position:absolute;bottom:1rem;left:1rem;z-index:60}#stream-display-area{position:relative;background-color:#000;overflow:hidden;flex-shrink:0;visibility:hidden;opacity:0;transition:opacity .3s ease-in-out;container-type:size;container-name:streamArea}#background-display,#startup-video-overlay{position:absolute;top:0;left:0;width:100%;height:100%}#background-display{z-index:0;pointer-events:none;background:url(../background.webp) center/cover no-repeat}#neuro-static-avatar-container{position:absolute;left:70%;transform:translate(-50%);width:var(--neuro-avatar-display-width-percent);height:auto;overflow:visible;pointer-events:none;z-index:15;visibility:hidden;transition:transform .5s ease-in-out}#neuro-static-avatar-container img{width:100%;height:auto;display:block}.spin-animation{animation:spin-counter-clockwise .75s linear}@keyframes spin-counter-clockwise{0%{transform:translate(-50%) rotate(0)}to{transform:translate(-50%) rotate(-360deg)}}#neuro-static-avatar-container.zoom-in{transform:translate(-50%) scale(1.15)}#neuro-caption{position:absolute;bottom:5%;left:50%;transform:translate(-50%);width:90%;padding:10px 20px;border-radius:10px;text-align:center;font-weight:400;opacity:1;pointer-events:none;z-index:20;color:#fff;transition:none;text-shadow:0 0 4px var(--neuro-shadow-color),0 0 4px var(--neuro-shadow-color),0 0 4px var(--neuro-shadow-color);font-family:First Coffee,Noto Sans SC;font-size:3cqi}#neuro-caption:not(.show){opacity:0}#startup-video-overlay{background-color:#000;z-index:10;display:flex;justify-content:center;align-items:center;opacity:1;transition:none}#startup-video-overlay.hidden{opacity:0;pointer-events:none;visibility:hidden}#startup-video{width:100%;height:100%;object-fit:contain}#show-chat-button{position:absolute;top:1rem;right:1rem;z-index:60;background-color:#0009;border:none;border-radius:50%;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;transition:background-color .2s,opacity .3s ease-in-out,visibility .3s ease-in-out;opacity:0;visibility:hidden;pointer-events:none;width:32px;height:32px;box-sizing:border-box}#show-chat-button:hover{background-color:#000c}#show-chat-button svg{width:20px;height:20px;fill:currentColor}body.chat-collapsed #show-chat-button{opacity:1;visibility:visible;pointer-events:auto}#twitch-chat-overlay{position:absolute;top:0;left:0;width:25%;height:50%;background-color:transparent;color:#fff;padding:10px;overflow-y:auto;z-index:5;font-size:1.5cqi;scrollbar-width:none;font-family:Comic Sans MS,Noto Sans SC;pointer-events:none;-webkit-user-select:none;user-select:none;scroll-behavior:auto}#twitch-chat-overlay::-webkit-scrollbar{display:none}#twitch-chat-overlay *{pointer-events:none;-webkit-user-select:none;user-select:none}#twitch-chat-overlay .chat-line__message{padding:2px 0;margin:0;text-shadow:-1px -1px 0 #00000080,1px -1px 0 #00000080,-1px 1px 0 #00000080,1px 1px 0 #00000080,2px 2px 0 rgba(0,0,0,.5);font-size:1.5cqi}#twitch-chat-overlay .chat-line__username{font-weight:700;margin-right:.25rem;font-size:1.5cqi}#twitch-chat-overlay .text-fragment{font-weight:700;color:#fff;font-size:1.5cqi}#twitch-chat-overlay .chat-author__display-name{font-size:1.5cqi}#twitch-chat-overlay .chat-line__message-container>span:not(.chat-line__username){font-weight:700;color:#fff;text-shadow:-1px -1px 0 #00000080,1px -1px 0 #00000080,-1px 1px 0 #00000080,1px 1px 0 #00000080,2px 2px 0 rgba(0,0,0,.5);font-size:1.5cqi}#stream-display-viewport *:not(.mute-button):not(#show-chat-button){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#stream-info{padding:10px 20px;background-color:var(--twitch-chat-bg);border-bottom:1px solid var(--twitch-border-color)}.stream-info-layout{display:flex;gap:16px;align-items:center}.stream-info-left-column{flex-shrink:0}.streamer-avatar-link{display:block;position:relative}.streamer-avatar-wrapper{position:relative}#streamer-avatar{width:64px;height:64px;border-radius:50%;border:2px solid transparent;transition:border-color .2s}.streamer-avatar-link:hover #streamer-avatar{border-color:var(--twitch-purple)}.live-indicator-wrapper{position:absolute;bottom:-2px;left:50%;transform:translate(-50%);z-index:2}.live-indicator-rect{background-color:var(--twitch-live-red);color:#fff;font-size:.7em;font-weight:600;padding:2px 6px;border-radius:4px;white-space:nowrap;border:2px solid var(--twitch-chat-bg);text-transform:uppercase}.stream-info-right-column{display:flex;flex-direction:column;flex-grow:1;gap:4px;min-width:0}.stream-info-main-row{display:flex;justify-content:space-between;align-items:center}.streamer-info-and-name{display:flex;align-items:center;gap:6px;min-width:0}#streamer-nickname{margin:0;font-size:1.2em;color:var(--twitch-text-color);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.verified-badge svg{width:16px;height:16px;fill:var(--twitch-purple)}.main-action-buttons{display:flex;gap:6px;align-items:center;flex-shrink:0}#stream-info .twitch-button{display:inline-flex;align-items:center;justify-content:center;height:30px;padding:6px 10px;box-sizing:border-box}#stream-info .twitch-button.follow-button,#stream-info .twitch-button.icon-button{width:30px;padding:0}#stream-info .twitch-button:not(.follow-button):not(.icon-button){padding-top:0;padding-bottom:1px}#stream-info .twitch-button svg{width:18px;height:18px}.stream-info-details-row{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.stream-details-left{display:flex;flex-direction:column;gap:6px;min-width:0}#stream-title-full{margin:0;font-size:.9em;font-weight:600;color:var(--twitch-text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.stream-category-and-tags{display:flex;align-items:center;gap:6px;min-width:0}.stream-category{font-size:.9em;color:var(--twitch-purple);text-decoration:none;font-weight:500;transition:color .2s;flex-shrink:0}.stream-category:hover{text-decoration:underline}.stream-tags{display:flex;gap:6px;align-items:center;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none}.stream-tags::-webkit-scrollbar{display:none}.stream-tag{display:inline-flex;align-items:center;padding:3px 8px;border-radius:100px;background-color:var(--twitch-tag-bg);color:var(--twitch-tag-text-color);font-size:.75em;font-weight:600;text-decoration:none;transition:background-color .2s;height:20px;box-sizing:border-box;flex-shrink:0}.stream-tag:hover{background-color:var(--twitch-button-hover-bg)}.stream-details-right{display:flex;align-items:center;gap:12px;flex-shrink:0}.stream-stats-section{display:flex;gap:0px;align-items:center;font-size:.9em;color:var(--twitch-secondary-text-color);justify-content:flex-end}.viewer-count,.stream-duration{display:flex;align-items:center;gap:4px}.viewer-count{color:var(--twitch-viewer-red)}.viewer-count svg{width:18px;height:18px;fill:currentColor}.viewer-count strong{font-weight:600}.stream-duration .duration-text{font-weight:500;color:var(--twitch-text-color);min-width:4.5em;text-align:right}.stream-secondary-actions{display:flex;gap:6px}.stream-secondary-actions .twitch-button{background-color:transparent}.stream-secondary-actions .twitch-button:hover:not(:disabled){background-color:var(--twitch-button-hover-bg)}#chat-sidebar{width:var(--sidebar-width);min-width:var(--sidebar-width);background-color:var(--twitch-chat-bg);flex-shrink:0;display:flex;flex-direction:column;border-left:1px solid var(--twitch-border-color);z-index:50;height:100%;transition:width .3s ease-in-out,min-width .3s ease-in-out}#chat-sidebar.collapsed{width:0;min-width:0;overflow:hidden;visibility:hidden;pointer-events:none}.chat-sidebar-header{height:3.5rem;display:flex;justify-content:space-between;align-items:center;padding:0 1rem;border-bottom:1px solid var(--twitch-border-color);flex-shrink:0;position:relative}.chat-header-left,.chat-header-right{display:flex;align-items:center;gap:.5rem;z-index:1}.chat-sidebar-header .chat-title{position:absolute;left:50%;transform:translate(-50%);margin:0;font-size:1rem;font-weight:600;color:var(--twitch-text-color)}.chat-toggle-button{display:flex;align-items:center;justify-content:center;background:none;border:none;border-radius:50%;padding:0;cursor:pointer;color:var(--twitch-text-color);transition:background-color .2s;width:32px;height:32px;box-sizing:border-box}.chat-toggle-button:hover{background-color:var(--twitch-hover-bg)}.chat-toggle-button svg{width:20px;height:20px;fill:currentColor}#chat-sidebar.collapsed .chat-toggle-button{transform:rotate(180deg)}.messages-display{flex-grow:1;overflow-y:auto;padding:.5rem 1rem;min-height:0;scrollbar-width:thin;scrollbar-color:#B0B0B0 var(--twitch-hover-bg)}.messages-display::-webkit-scrollbar{width:8px}.messages-display::-webkit-scrollbar-track{background:var(--twitch-hover-bg);border-radius:4px}.messages-display::-webkit-scrollbar-thumb{background:#b0b0b0;border-radius:4px}.messages-display::-webkit-scrollbar-thumb:hover{background:#888}.chat-line__message{display:flex;align-items:flex-start;padding:.3rem 0;line-height:1.5;word-wrap:break-word;color:var(--twitch-text-color);border-radius:4px}.chat-line__message:hover{background-color:#ffffff0d}.chat-line__message-container{display:inline}.chat-line__username{font-weight:700;display:inline-block;margin-right:.1rem;cursor:pointer}.chat-author__display-name{font-size:.9rem}.text-fragment{font-size:.9rem;color:var(--twitch-text-color)}.chat-line__message.user-sent-message{background-color:#9147ff1a;border-left:3px solid var(--twitch-purple);padding-left:.75rem}.chat-line__message.system-message{color:var(--twitch-secondary-text-color);font-style:italic;font-size:.85rem;justify-content:center}.chat-line__message.system-message .chat-line__username,.chat-line__message.system-message .text-fragment{font-size:inherit;color:inherit;font-weight:400}.chat-input-area{padding:.75rem 1rem;border-top:1px solid var(--twitch-border-color);flex-shrink:0}.chat-input-and-buttons{display:flex;flex-direction:column;gap:.5rem}.chat-input-textarea-container{display:flex;align-items:center;border:1px solid var(--twitch-border-color);border-radius:4px;background-color:var(--twitch-button-bg);padding:0 .5rem;transition:var(--fast-transition)}.chat-input-textarea-container:focus-within{border-color:var(--twitch-purple);box-shadow:0 0 0 2px #9147ff33}.chat-input-prefix-icons,.chat-input-suffix-icons{display:flex;align-items:center}.chat-input-wrapper{flex-grow:1}.chat-input-element{width:100%;height:2.25rem;padding:0 .5rem;border:none;background-color:transparent;color:var(--twitch-text-color);font-size:.95rem;outline:none}.chat-input-element::placeholder{color:var(--twitch-secondary-text-color)}.chat-input-buttons-container{display:flex;justify-content:space-between;align-items:center}.chat-buttons-left,.chat-buttons-right{display:flex;align-items:center;gap:.5rem}.chat-points-display{display:flex;align-items:center;gap:.25rem;font-size:.85rem;color:var(--twitch-secondary-text-color)}.chat-points-display svg,.chat-points-display .channel-points-icon{width:18px;height:18px;fill:currentColor;object-fit:contain}.chat-points-display .points-value{color:var(--twitch-text-color);font-weight:600}#send-button:disabled{background-color:#b0b0b0;cursor:not-allowed}.chat-toolbar-text-button.selected{background-color:var(--twitch-purple-light);border:1px solid var(--twitch-purple);box-shadow:0 0 5px var(--twitch-purple-light)}#highlight-message-overlay{position:absolute;left:41%;transform:translate(-50%) translateY(-200%);width:24vw;height:auto;z-index:100;transition:transform 1s}#highlight-message-overlay.is-visible{transform:translate(-50%) translateY(0);transition-timing-function:cubic-bezier(.25,1,.5,1)}.sc-background-image{width:100%;height:auto;display:block;border-radius:20px}.sc-content{position:absolute;top:0;left:0;width:100%;height:100%;z-index:2;color:#fff;font-family:Causten}.sc-user{position:absolute;top:20%;left:40%;transform:translate(-50%);font-size:2cqi;text-align:left}.sc-message{position:absolute;top:60%;left:50%;transform:translate(-50%,-50%);width:90%;font-size:2cqi;text-align:center;overflow-wrap:break-word}.settings-modal-container{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;display:flex;justify-content:center;align-items:center}.settings-modal-container.hidden{display:none}.modal-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#0009}.modal-content{position:relative;background-color:var(--twitch-chat-bg);color:var(--twitch-text-color);border-radius:8px;width:90%;max-width:450px;box-shadow:0 4px 20px #0003;display:flex;flex-direction:column}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:1rem 1.5rem;border-bottom:1px solid var(--twitch-border-color)}.modal-header h2{margin:0;font-size:1.25rem}.modal-body{padding:1.5rem;display:flex;flex-direction:column;gap:1.5rem}.setting-item{display:flex;flex-direction:column;gap:.5rem}.setting-item label{font-weight:600;font-size:.9rem}.modal-input{padding:.75rem;border:1px solid var(--twitch-border-color);border-radius:4px;background-color:var(--twitch-button-bg);color:var(--twitch-text-color);font-size:1rem}.modal-input:focus{outline:none;border-color:var(--twitch-purple);box-shadow:0 0 0 2px #9147ff33}.avatar-setting .avatar-preview-container{display:flex;align-items:center;gap:1rem}.avatar-preview{width:60px;height:60px;border-radius:50%;object-fit:cover;border:2px solid var(--twitch-border-color)}.avatar-upload-input{display:none}.modal-footer{padding:1rem 1.5rem;border-top:1px solid var(--twitch-border-color);display:flex;justify-content:flex-end}.setting-description{font-size:.8rem;color:var(--twitch-secondary-text-color);margin:4px 0 0}.turbo-button-icon{display:none}.turbo-button-full{display:inline-flex}@media (max-width: 992px){.turbo-button-full{display:none}.turbo-button-icon{display:inline-flex}}@media (max-width: 767px){body,#main-content-wrapper{flex-direction:column}#stream-and-info-container{width:100%}#chat-sidebar{width:100%;height:40vh;min-height:200px;min-width:unset;border-left:none;border-top:1px solid var(--twitch-border-color)}#chat-sidebar.collapsed{height:0;min-height:0;overflow:hidden;visibility:hidden;pointer-events:none}.nav-links-main,button[aria-label=Prime],button[aria-label=打开通知],button[aria-label=悄悄话],button[aria-label=购买呼币],button[aria-label=免费体验无广告观赏],button#show-chat-button,button[aria-label=通知],button.twitch-button[aria-label=购买呼币],button.twitch-button[aria-label=赠送一次订阅],.stream-details-right,.chat-sidebar-header{display:none!important}*{scrollbar-width:none!important}*::-webkit-scrollbar{display:none!important}*::-webkit-scrollbar-thumb{display:none!important}*::-webkit-scrollbar-track{display:none!important}#streamer-avatar{width:50px;height:50px}}.tooltip{position:absolute;background:#18181b;color:#fff;padding:6px 10px;font-size:12px;border-radius:4px;pointer-events:none;opacity:0;transition:opacity .2s ease;white-space:nowrap;z-index:1000;transform-origin:center bottom;-webkit-user-select:none;user-select:none}.tooltip.show{opacity:1}.tooltip:after{content:"";position:absolute;left:50%;transform:translate(-50%);border-width:6px;border-style:solid;top:100%;border-color:#18181b transparent transparent transparent;transition:border-color .2s ease,top .2s ease}.tooltip.tooltip-arrow-up:after{top:-12px;border-color:transparent transparent #18181b transparent}.hidden{display:none!important}#offline-content-container{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-wrap:wrap;width:100%;min-height:500px;flex-grow:1;background-image:url(../banner.jpeg);background-size:cover;background-position:center;background-repeat:no-repeat;padding:2rem;gap:2rem;box-sizing:border-box}.offline-info-card{display:flex;flex-direction:column;align-items:flex-start;background-color:#fff;padding:1.5rem;border-radius:0;color:#0e0e10;box-shadow:0 4px 10px #0000001a;box-sizing:border-box;flex:0 1 270px}.offline-status-section{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;flex-grow:1;gap:.75rem}.offline-status-badge{background-color:#000;color:#fff;font-size:.9em;font-weight:600;padding:2px 6px;border-radius:4px;white-space:nowrap;text-transform:uppercase}.offline-status-title{font-size:1.6rem;font-weight:600;margin:0}.offline-notification-section{width:100%;margin-left:-10px}.offline-notification-button{background-color:transparent;color:var(--twitch-primary-button-hover-bg);justify-content:flex-start}.offline-notification-button:hover{background-color:var(--twitch-button-hover-bg);color:var(--twitch-button-text-color)}.offline-notification-button svg{fill:currentColor}.offline-video-player{aspect-ratio:16 / 9;flex:0 1 576px;min-width:300px;max-width:576px}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-cyrillic-ext-400-normal-Dc4VJyIJ.woff2) format("woff2"),url(./inter-cyrillic-ext-400-normal-BE2fNs0E.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-cyrillic-400-normal-BLGc9T1a.woff2) format("woff2"),url(./inter-cyrillic-400-normal-alAqRL36.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-greek-ext-400-normal-Bput3-QP.woff2) format("woff2"),url(./inter-greek-ext-400-normal-XIH6-K3k.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-greek-400-normal-DxZsaF_h.woff2) format("woff2"),url(./inter-greek-400-normal-C3I71FoW.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-vietnamese-400-normal-DMkecbls.woff2) format("woff2"),url(./inter-vietnamese-400-normal-Bbgyi5SW.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-latin-ext-400-normal-C1nco2VV.woff2) format("woff2"),url(./inter-latin-ext-400-normal-77YHD8bZ.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(./inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(./inter-latin-400-normal-CyCys3Eg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}