dsh-conversation-aurora 0.2.0 → 0.2.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/README.md CHANGED
@@ -35,7 +35,7 @@
35
35
 
36
36
  **它只在"你干活"的时候出现**:任何工具在跑、或回合进行中,背景才播放;空闲、切会话、窗口隐藏时立刻停掉 `requestAnimationFrame` 并淡出,两侧恢复普通白纸。
37
37
 
38
- **每个会话自动分配不同主题**(按 `data-conversation-session` 哈希)。按过 `Alt+T` 之后会变成全局固定主题;想恢复"每会话自动",删掉 `localStorage` 里的 `dsh.conversation-aurora.theme` 即可。
38
+ **每次开始干活随机换一个主题**(8 个里随机,且不会连着重复)。按过 `Alt+T` 之后会变成全局固定主题;想恢复"每会话自动",删掉 `localStorage` 里的 `dsh.conversation-aurora.theme` 即可。
39
39
 
40
40
  ---
41
41
 
@@ -82,7 +82,7 @@
82
82
 
83
83
  ## 已知限制
84
84
 
85
- 1. **依赖宿主的 DOM 语义属性**:`[data-conversation-content]` / `[data-tool][data-state]` / `[data-chat-running]` / `[data-streaming]` / `[data-conversation-session]`。DSH 大版本升级后如果这些改名,插件会安静地什么都不做(不会报错、不会挡交互)。
85
+ 1. **依赖宿主的 DOM 语义属性**:`[data-conversation-content]` / `[data-tool][data-state]` / `[data-chat-running]` / `[data-streaming]`。DSH 大版本升级后如果这些改名,插件会安静地什么都不做(不会报错、不会挡交互)。
86
86
  2. **没有"背景层"插槽**:DSH 目前没有这个扩展点,所以背景层是挂在对话画布元素内部的(`z-index:-1`)。这是刻意偏离「只能注册进 slot」的地方,随插件停用一起消失。
87
87
  3. **切会话会静默 600ms**:避免把上一轮残留的工具行当成"正在工作",看到几秒特效。
88
88
  4. **减少动态效果**:系统开启后只画一帧静止画面,不跑 `requestAnimationFrame`。
package/client.js CHANGED
@@ -97,15 +97,6 @@ body[data-ds-dark-theme] .dsh-stage__veil{
97
97
  }
98
98
  }
99
99
 
100
- function hashString(text) {
101
- let h = 2166136261;
102
- for (let i = 0; i < text.length; i += 1) {
103
- h ^= text.charCodeAt(i);
104
- h = Math.imul(h, 16777619);
105
- }
106
- return h >>> 0;
107
- }
108
-
109
100
  /** 浅色用墨色 + multiply;深色用亮色 + lighter。 */
110
101
  function stagePalette() {
111
102
  const dark = document.body.hasAttribute('data-ds-dark-theme');
@@ -760,6 +751,7 @@ function themeWarp(g) {
760
751
  let sessionKey = null;
761
752
  let quietUntil = 0;
762
753
  let forcedTheme = readStore(STORAGE.theme, '');
754
+ let activeTheme = '';
763
755
  let stageRaf = 0;
764
756
  let stageTheme = null;
765
757
 
@@ -870,12 +862,17 @@ function themeWarp(g) {
870
862
 
871
863
  /* ---------- 背景播放 ---------- */
872
864
 
873
- function stageThemeId() {
874
- for (let i = 0; i < STAGE_THEMES.length; i += 1) {
875
- if (forcedTheme && STAGE_THEMES[i].id === forcedTheme) return forcedTheme;
876
- }
877
- const key = (host && host.getAttribute('data-conversation-session')) || 'default';
878
- return STAGE_THEMES[hashString(key) % STAGE_THEMES.length].id;
865
+ /**
866
+ * 每次开工重新挑一个主题(随机,且不和上一次重复)。
867
+ * 按 Alt+T 固定过主题时,就一直用它。
868
+ */
869
+ function pickTheme() {
870
+ const ids = [];
871
+ for (let i = 0; i < STAGE_THEMES.length; i += 1) ids.push(STAGE_THEMES[i].id);
872
+ if (forcedTheme && ids.indexOf(forcedTheme) >= 0) return forcedTheme;
873
+ let id = ids[(Math.random() * ids.length) | 0];
874
+ if (ids.length > 1 && id === activeTheme) id = ids[(ids.indexOf(id) + 1) % ids.length];
875
+ return id;
879
876
  }
880
877
 
881
878
  function stopStage() {
@@ -903,7 +900,8 @@ function themeWarp(g) {
903
900
  const pal = stagePalette();
904
901
  ctx.globalCompositeOperation = pal.blend;
905
902
 
906
- const id = stageThemeId();
903
+ const id = activeTheme || pickTheme();
904
+ activeTheme = id;
907
905
  let factory = STAGE_THEMES[0];
908
906
  for (let i = 0; i < STAGE_THEMES.length; i += 1) {
909
907
  if (STAGE_THEMES[i].id === id) factory = STAGE_THEMES[i];
@@ -938,16 +936,21 @@ function themeWarp(g) {
938
936
  return;
939
937
  }
940
938
  stage.dataset.on = '1';
941
- if (!stageRaf) startStage();
939
+ if (!stageRaf) {
940
+ activeTheme = pickTheme();
941
+ startStage();
942
+ }
942
943
  }
943
944
 
944
945
  function cycleTheme() {
945
946
  const ids = [];
946
947
  for (let i = 0; i < STAGE_THEMES.length; i += 1) ids.push(STAGE_THEMES[i].id);
947
- let at = ids.indexOf(forcedTheme);
948
- if (at < 0) at = ids.indexOf(stageThemeId());
948
+ let at = ids.indexOf(activeTheme);
949
+ if (at < 0) at = ids.indexOf(forcedTheme);
950
+ if (at < 0) at = 0;
949
951
  forcedTheme = ids[(at + 1) % ids.length];
950
952
  writeStore(STORAGE.theme, forcedTheme);
953
+ activeTheme = forcedTheme;
951
954
  if (stageRaf || busy) {
952
955
  stopStage();
953
956
  if (busy && !document.hidden) startStage();
package/locale/en.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "meta": {
3
3
  "title": "Conversation Backgrounds",
4
- "description": "Full-canvas animated backgrounds: starfield / code rain / circuit / cat / girl / racer / snow / bubbles. Alt+T next theme, Alt+D light/dark. Plays only while the agent is working."
4
+ "description": "Full-canvas animated backgrounds: starfield / code rain / circuit / cat / girl / racer / snow / bubbles, a new one each time the agent starts working. Alt+T next theme, Alt+D light/dark."
5
5
  }
6
6
  }
package/locale/zh.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "meta": {
3
3
  "title": "对话区动效背景",
4
- "description": "对话区整屏动效背景:星空 / 代码雨 / 电路 / 小猫 / 小女生 / 赛车 / 飘雪 / 肥皂泡。快捷键 Alt+T 换背景、Alt+D 切明暗;只在 Agent 干活时播放。"
4
+ "description": "对话区整屏动效背景:星空 / 代码雨 / 电路 / 小猫 / 小女生 / 赛车 / 飘雪 / 肥皂泡,每次开始干活随机换一个。快捷键 Alt+T 换背景、Alt+D 切明暗;只在 Agent 干活时播放。"
5
5
  }
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-conversation-aurora",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Full-canvas animated backgrounds for the DSH conversation pane: starfield, code rain, circuits, cat, girl, racer, snow, bubbles.",
5
5
  "type": "module",
6
6
  "license": "MIT",